FairRoot/PandaRoot
Functions | Variables
createdircPix.C File Reference

Go to the source code of this file.

Functions

int createdircPix (Int_t fGeomType=1, Int_t fFocusingSystem=6, Int_t iter=0, TString geomPath=".", Double_t par1=-100, Double_t par2=-100, Double_t par3=-100, Double_t par4=-100, Double_t par5=-100, Double_t par6=-100, Double_t par7=-100, Double_t par8=-100)
 

Variables

const Double_t pi = 4.*atan(1.)
 

Function Documentation

int createdircPix ( Int_t  fGeomType = 1,
Int_t  fFocusingSystem = 6,
Int_t  iter = 0,
TString  geomPath = ".",
Double_t  par1 = -100,
Double_t  par2 = -100,
Double_t  par3 = -100,
Double_t  par4 = -100,
Double_t  par5 = -100,
Double_t  par6 = -100,
Double_t  par7 = -100,
Double_t  par8 = -100 
)

Definition at line 29 of file createdircPix.C.

References PndGeoDrc::barBoxZDown(), PndGeoDrc::barBoxZUp(), PndGeoDrc::barHalfThick(), PndGeoDrc::barhGap(), PndGeoDrc::barNum(), PndGeoDrc::BarWidth(), PndGeoDrc::BBoxGap(), PndGeoDrc::BBoxNum(), PndGeoDrc::boxGap(), PndGeoDrc::boxThick(), CAMath::Cos(), cos(), Double_t, dx, dy, eps(), PndGeoDrc::EVbackAngle(), PndGeoDrc::EVdrop(), PndGeoDrc::EVlen(), PndGeoDrc::EVoffset(), fabs(), fGeoFile, fi, geobuild, geoFace, geoLoad, gGeoMan, gGeoManager, PndGeoDrc::GlueLayer(), PndGeoDrc::GreaseLayer(), i, m, PndGeoDrc::McpActiveArea(), PndGeoDrc::McpGap(), PndGeoDrc::McpSize(), Media, nmed, par, par1, phi0, pi, PndGeoDrc::PipehAngle(), PndGeoDrc::PixelSize(), PndGeoDrc::PrismAngle(), PndGeoDrc::PrismDrop(), PndGeoDrc::PrismhLength(), PndGeoDrc::PrismOffset(), r1, r2, PndGeoDrc::radius(), rot1, shape, CAMath::Sin(), sin(), t, t1, t2, t3, top, tr, TString, v1, v2, vLocalMother, z, and zpos.

29  {
30 
31  { // initialization
32  gROOT->Macro("$VMCWORKDIR/gconfig/rootlogon.C");
33 
34  TString vmcWorkdir = getenv("VMCWORKDIR");
35 
36  // Load this libraries
37  gSystem->Load("libGeoBase");
38  gSystem->Load("libParBase");
39  gSystem->Load("libBase");
40  gSystem->Load("libPndData");
41  gSystem->Load("libPassive");
42 
43  TString fGeoFile= vmcWorkdir + Form("/geometry/dirc_g%d_l%d_pix.root",fGeomType, fFocusingSystem);
44  if(iter!=0) fGeoFile= geomPath + Form("/dirc_%d.root",iter);
45 
46  // variable to achieve the DIRC basic parameters
47  PndGeoDrc* fGeo = new PndGeoDrc();
48 
49  // units = cm
50 
51  Double_t eps = 0.01; // epsilon
52  Double_t mirr_hthick = 0.02;
53  Double_t PDbaseLayer = 0.2; // [cm] thickness of the carbon at the back of the EV
54 
55  Double_t radius = fGeo->radius(); // 47.6 radius in middle of the barbox (x and y)
56  Double_t hthick = fGeo->barHalfThick(); // 1.7/2. half thickness of the bars
57  Double_t barwidth = fGeo->BarWidth(); // 3.2 width of the radiator bar
58  Double_t barnum = fGeo->barNum(); // 6 number of bars per barbox
59  Double_t bbnum = fGeo->BBoxNum(); //16. total number of sides = barboxes
60  Double_t bbGapAngle = fGeo->BBoxGap(); //1.5 gap btw the neighboring barboxes (at the middle height)
61  Double_t pipehAngle = fGeo->PipehAngle(); //3.6 [degrees] half of the angular space needed for the target pipe
62  Double_t barWin_hthick = 0.1/2.; // [cm]=15um thickness of the 'glas' window at the readout end of the barbox;
63  Double_t phi0 = (180.-2.*pipehAngle)/bbnum + pipehAngle;
64  Double_t dphi = (180.-2.*pipehAngle)/bbnum*2.;
65  Double_t dphi_rad = dphi/180.*pi;
66 
67  Double_t bbox_zdown = fGeo->barBoxZDown(); // 130. bar box z downstream
68  Double_t bbox_zup = fGeo->barBoxZUp(); // -120. bar box z upstream
69  Double_t bbox_hlen = 0.5*(bbox_zdown - bbox_zup); // 125. bar box half length
70  Double_t bbox_shift = bbox_zup + bbox_hlen; // 5. bar box shift
71  Double_t barhgap = fGeo->barhGap(); // 0.01 half gap between bars
72  Double_t boxgap = fGeo->boxGap(); // 0.1 gap between bars and the bar box
73  Double_t boxthick = fGeo->boxThick(); // 0.05 thickness of the bar box
74  Double_t gluehthick = fGeo->GlueLayer();// = 0.0005;//[cm] // glue layer, connects two halfs into one long radiator bar
75  Double_t len1,len2, len = 0.; // length of the lenses block. see further
76  Double_t fdz_mirr1 = 0.;
77  Double_t fdz_mirr2 = 0.;
78  Double_t fdz_lens3 = 0.;
79  Double_t fdz_lens2 = 0.;
80  Double_t fdz_lens1 = 0.;
81 
82  //parameters for MCPs:
83  Double_t MCPsize = fGeo->McpSize();//5.76; //[cm] width=height of an MCP
84  Double_t MCPactiveArea = fGeo->McpActiveArea();//5.3; //[cm] width=height of the active area of an MCP
85  Double_t MCPgap = fGeo->McpGap(); //[cm] gap between MCPs
86  Double_t PixelSize = fGeo->PixelSize();//0.65; //[cm] size of a pixel
87  Int_t Npix = 8; // number of mcps in a row/column
88  const Int_t NpixTotal = Npix*Npix; // total number of pixels for 1 mcp
89  Double_t PixelGap = (MCPactiveArea - Double_t(Npix)*PixelSize)/(Double_t(Npix)-1.);
90  Double_t PDwindowThick = 0.1; //[cm]
91  Double_t PhCathodeThick = 0.0001; //[cm] = 1 um
92  Double_t PDsensitiveThick = 0.01; //[cm]
93  Double_t PDgreaseLayer = fGeo->GreaseLayer(); //= 0.1; //[cm]
94  Double_t hgap = 0.5*(MCPsize - MCPactiveArea + MCPgap); // gap btw MCPs
95  Double_t step = MCPactiveArea + 2.*hgap; // step in which to locate MCPs = 6 for Mcp1, Mcp2; = 5.88 for Mcp2a. This is total size of one MCP with gaps in between
96 
97  // EV parameters
98  Double_t sob_len = (par6==-100)? fGeo->EVlen() : par6; // 30. in current version
99  Double_t sob_shift = -bbox_hlen + bbox_shift - sob_len; // -150.
100  Double_t sob_angleB = (par7==-100)? fGeo->EVbackAngle() : par7; //90. [degrees] angle of the EV (usually it is 90)
101  if(fGeomType==2) sob_angleB = 90;
102  Double_t EVdrop = (par3==-100)? fGeo->EVdrop() : par3; // drop of the EV - inner radius
103  if(fGeomType!=3) EVdrop += boxgap+boxthick;
104  Double_t EVoffset = (par4==-100)? fGeo->EVoffset() : par4; // offset of the EV - outer radius
105  Double_t EVgreaseLayer = 0.0015/2.; //[cm] grease layer half thickness btw the bar window and the EV
106 
107  Double_t bbSideGap = 0.5*( ((barwidth+2.*barhgap)*barnum) - (2.*radius*sin((dphi-bbGapAngle)/180.*pi/2.)+2.*barhgap) );
108  Double_t bbX = 2.*radius*sin((dphi-bbGapAngle)/180.*pi/2.)+2.*barhgap;
109 
110  Double_t barBoxWidth = 0.5*barnum*(barwidth+2.*barhgap)+bbSideGap+boxthick;
111  Double_t barBoxHeight = hthick+boxgap+boxthick;
112 
113  Double_t sob_angle = atan((5.*step + PixelSize + 2*hgap-2*hthick -EVoffset-EVdrop)/sob_len)/pi*180.;// [degrees] opening angle of the EV
114  Double_t sob_Rout = radius-hthick + 5*step -2*hgap-EVdrop + PixelSize/2.;
115 
116  Double_t radiusCornerIn = (radius-hthick-EVdrop-PixelSize/2.)/cos(dphi/2./180.*pi);
117  Double_t radiusCornerOut = sob_Rout/cos(dphi_rad/2.);
118  Double_t radiusMiddleSmall = radius-hthick-EVdrop-PixelSize/2.;
119 
120  // cout<<"radius = "<<radius<<"rad corner in = "<< radiusCornerIn<<", rad corner out = "<< radiusCornerOut<<endl; cout<<"pixel gap = "<< PixelGap<<endl;
121  // cout<<"sob_angle = "<<sob_angle<<endl;
122  cout<<"sob_Rout = "<<sob_Rout<<endl;
123  // cout<<"bbAngle = "<<bbAngle<<", bbX = "<<bbX<<endl;
124  // cout<<"dphi = "<<dphi<<", phi0 = "<<phi0<<endl;
125  //----------------------------------------------------------
126 
127  // prizm:
128  Double_t phlength = fGeo->PrismhLength(); //4.5 [cm] half length of the prizm
129  Double_t pdrop = fGeo->PrismDrop(); //0.5 [cm] drop of the prizm - inner side
130  Double_t pangle = fGeo->PrismAngle(); //30. [degrees] angle of the edge
131  Double_t poffset = fGeo->PrismOffset(); //1.[cm] prizm offset - outer side
132  Double_t pheight = 2.*phlength * tan(pangle/180.*pi); // [cm] half heigth of the prism
133  Double_t sob_Rprizm = radius + hthick + poffset + pheight + EVoffset + (sob_len-2.*phlength)*tan(60./180.*pi);
134  //----------------------------------------------------------
135 
136  // Rotations:
137  TGeoRotation rot1;
138  rot1.RotateZ(90.);
139 
140  TFile* fi = new TFile(fGeoFile,"RECREATE");
141  cout<<"Output file = "<<fGeoFile<<endl;
142 
143  Double_t par[10];
144  Double_t aa;
145  Double_t z, density, radl, absl, w;
146  Int_t nel, numed, nz;
147 
148  FairGeoLoader* geoLoad = new FairGeoLoader("TGeo","FairGeoLoader");
149  FairGeoInterface *geoFace = geoLoad->getGeoInterface();
150  geoFace->setMediaFile(vmcWorkdir +"/geometry/media_pnd.geo");
151  geoFace->readMedia();
152 
153  FairGeoMedia *Media = geoFace->getMedia();
154  FairGeoBuilder *geobuild=geoLoad->getGeoBuilder();
155 
156  FairGeoMedium *DrcAir = Media->getMedium("air");
157  FairGeoMedium *DrcAirNoSens = Media->getMedium("DIRCairNoSens");
158  FairGeoMedium *DrcEpotek301_2 = Media->getMedium("Epotek301_2");
159  FairGeoMedium *DrcOpticalGrease = Media->getMedium("OpticalGrease");
160  FairGeoMedium *DrcCarbonFiber = Media->getMedium("DIRCcarbonFiber");
161  FairGeoMedium *DrcFusedSil = Media->getMedium("FusedSil");
162  FairGeoMedium *DrcMirror = Media->getMedium("Mirror");
163  FairGeoMedium *DrcMarcol82_7 = Media->getMedium("Marcol82_7");
164  FairGeoMedium *DrcNLAK33A = Media->getMedium("NLAK33A");
165  FairGeoMedium *DrcBK7G18 = Media->getMedium("BK7G18");
166  FairGeoMedium *DrcPBF2 = Media->getMedium("PBF2");
167  FairGeoMedium *DrcPhotocathode= Media->getMedium("Photocathode");
168 
169  Int_t nmed=geobuild->createMedium(DrcAir);
170  nmed=geobuild->createMedium(DrcAirNoSens);
171  nmed=geobuild->createMedium(DrcEpotek301_2);
172  nmed=geobuild->createMedium(DrcOpticalGrease);
173  nmed=geobuild->createMedium(DrcCarbonFiber);
174  nmed=geobuild->createMedium(DrcFusedSil);
175  nmed=geobuild->createMedium(DrcMirror);
176  nmed=geobuild->createMedium(DrcMarcol82_7);
177  nmed=geobuild->createMedium(DrcNLAK33A);
178  nmed=geobuild->createMedium(DrcBK7G18);
179  nmed=geobuild->createMedium(DrcPBF2);
180  nmed=geobuild->createMedium(DrcPhotocathode);
181 
182  }
183 
184  TGeoVolume *CylLensWide1, *CylLensWide2, *Lens1, *Lens2, *Lens3, *Lens4;
185  { // focusing systems
186  if(fFocusingSystem == 0){ // no focusing
187  Double_t flen = 0.;
188  }
189 
190  if(fFocusingSystem == 1){ // L E N S E S (airgap, thin nlak33)
191  Double_t hlens1 = 0.3;
192  Double_t hlens2 = 0.1;
193  Double_t hlens3 = 0.5;
194  Double_t hlens4 = 0.1;
195  Double_t rlens1 = 14;
196  Double_t rlens2 = 5;
197  Double_t llens = barwidth/2.;
198  len1 = (hlens1+hlens2)/2.;
199  len2 = (hlens3+hlens4)/2.;
200  len = len1+len2;
201 
202  //lens1
203  TGeoSphere* lSphUp = new TGeoSphere("SphUp",0 ,rlens1, 0. ,180.,0.,360.);
204  TGeoBBox* lCylBox = new TGeoBBox("LensBox", llens, barBoxHeight, len1);
205 
206  TGeoTranslation t1("trans", 0., 0., rlens1+hlens2-len1);
207  TGeoRotation r1("rot",90., 90. ,0. );
208  TGeoHMatrix tr = t1*r1;
209  TGeoHMatrix *transf = new TGeoHMatrix(tr);
210  transf->SetName("transf");
211  transf->RegisterYourself();
212 
213  TGeoCompositeShape *cslens1 = new TGeoCompositeShape("cslens1","SphUp:transf * LensBox");
214  TGeoVolume *Lens1 = new TGeoVolume("DrcLENS1Sensor",cslens1, gGeoManager->GetMedium("FusedSil"));
215  Lens1->SetLineColor(kRed+2);
216  Lens1->SetTransparency(40);
217 
218  fdz_lens1 = -bbox_hlen + 3*barWin_hthick - len1/2. + rlens1;
219 
220  //lens2
221  TGeoTranslation t2("trans", 0., 0., rlens1+hlens2-len1);
222  TGeoHMatrix tr2 = t2*r1;
223  TGeoHMatrix *transf2 = new TGeoHMatrix(tr2);
224  transf2->SetName("transf2");
225  transf2->RegisterYourself();
226 
227  TGeoCompositeShape *cslens2 = new TGeoCompositeShape("cslens2", "LensBox - SphUp:transf2");
228  TGeoVolume* Lens2 = new TGeoVolume("DrcLENS2Sensor", cslens2, gGeoManager->GetMedium("NLAK33A"));
229  Lens2->SetLineColor(kRed);
230  Lens2->SetTransparency(40);
231 
232  //lens3
233  TGeoSphere* lSphUp2 = new TGeoSphere("SphUp2",0 ,rlens2, 0. ,180.,0.,360.);
234  TGeoBBox* lCylBox2 = new TGeoBBox("LensBox2", llens, barBoxHeight, len2);
235 
236  TGeoTranslation t3("trans3", 0., 0., rlens2+hlens4-len2);
237  TGeoHMatrix tr3 = t3*r1;
238  TGeoHMatrix *transf3 = new TGeoHMatrix(tr3);
239  transf3->SetName("transf3");
240  transf3->RegisterYourself();
241 
242  TGeoCompositeShape *cslens3 = new TGeoCompositeShape("cslens3","SphUp2:transf3 * LensBox2");
243  TGeoVolume *Lens3 = new TGeoVolume("DrcLENS3Sensor",cslens3, gGeoManager->GetMedium("NLAK33A"));
244  Lens3->SetLineColor(kRed);
245  Lens3->SetTransparency(40);
246 
247  //lens4
248  TGeoTranslation t4("trans", 0., 0., rlens2+hlens4-len2);
249  TGeoHMatrix tr4 = t4*r1;
250  TGeoHMatrix *transf4 = new TGeoHMatrix(tr4);
251  transf4->SetName("transf4");
252  transf4->RegisterYourself();
253 
254  TGeoCompositeShape *cslens4 = new TGeoCompositeShape("cslens4", "LensBox2 - SphUp2:transf4");
255  TGeoVolume* Lens4 = new TGeoVolume("DrcLENS4Sensor", cslens4, gGeoManager->GetMedium("DIRCairNoSens"));
256  Lens4->SetLineColor(kBlue+2);
257  Lens4->SetTransparency(40);
258 
259  }
260 
261  if(fFocusingSystem == 2){ // Mirrors at front
262  // Put some mirrors at the downstream end with a focal plane at the PD.
263 
264  double zpos=120.;
265 
266  // The bar is produced with "bbox_hlen-fabs(len)/2.-mirr_hthick"
267  len = -130. + zpos + 1.;
268  //len = -247.0; // negative to make space at downstream end of bar.
269 
270  Double_t len1 = 1.5; // 1st block
271 
272  Double_t mirror_angle = 0.0;// 0.0 is pointing upstream, -90.0 is pointing to the beam axis
273  Double_t focal_length = 2. * bbox_hlen + sob_len - fabs(len) + len1;
274  Double_t mirror_radius = 2. * focal_length;
275 
276  cout<<" mirror radius: "<<mirror_radius<<endl;
277 
278 
279  // no angle for the moment
280  // block
281  TGeoSphere* logicSphere = new TGeoSphere("S",0.,mirror_radius, 0. ,180.,0.,360.);
282  TGeoBBox* lBox = new TGeoBBox("B", barwidth/2., hthick, fabs(len1)/2.);
283 
284  Double_t t = mirror_radius - len1/2.;
285 
286  TGeoTranslation *tr1 = new TGeoTranslation("tr1", 0.,0., t);
287  tr1->RegisterYourself();
288  TGeoCompositeShape *cs = new TGeoCompositeShape("cs","S*(B:tr1)");
289 
290  TGeoVolume *block1 = new TGeoVolume("DrcBlock1",cs, gGeoManager->GetMedium("FusedSil"));
291  block1->SetLineColor(kRed);
292  block1->SetTransparency(40);
293 
294 
295  Double_t shift1 = len1-mirror_radius; // Now the start of block1 is at zero
296  shift1 += bbox_hlen-fabs(len)-2.*mirr_hthick;
297 
298  /*
299  barContainer->AddNode(block1, 1, new TGeoCombiTrans(0., 0., shift1, new TGeoRotation (0)));
300  */ fdz_mirr1 = shift1;
301 
302 
303  Double_t gap = 0;
304  Double_t len2 = fabs(len) - len1 - gap;
305 
306  // no angle for the moment
307  // block
308  TGeoSphere* logicSphere2 = new TGeoSphere("S2",0,mirror_radius, 0. ,180.,0.,360.);
309  TGeoBBox* lBox2 = new TGeoBBox("B2", barwidth/2., hthick, fabs(len2)/2.);
310 
311  // make radius part of block
312  Double_t t2 = mirror_radius + len2/2 - 1;
313 
314  TGeoTranslation *tr2 = new TGeoTranslation("tr2", 0.,0., t2);
315  tr2->RegisterYourself();
316  TGeoCompositeShape *cs2 = new TGeoCompositeShape("cs2","(B2:tr2)-S2");
317 
318  TGeoVolume *block2 = new TGeoVolume("DrcBlock2",cs2, gGeoManager->GetMedium("Mirror"));
319  block2->SetLineColor(kGreen);
320  block2->SetTransparency(40);
321 
322 
323  Double_t shift2 = -mirror_radius; // Now the start of the block is at zero
324  shift2 += bbox_hlen-fabs(len)-2*mirr_hthick; // at end of bar
325  shift2 += len1 + gap;
326 
327  fdz_mirr2 = shift2;
328 
329  /*
330  barContainer->AddNode(block2,
331  1,
332  new TGeoCombiTrans(0.,
333  0.,
334  shift2,
335  // bbox_hlen-mirror_radius-2*mirr_hthick-len2+len1+1,
336  //bbox_hlen-mirror_radius-len2+0.1,
337  new TGeoRotation (0)
338  )
339  );
340  */
341 
342 
343  Double_t flen = 0.;
344  }
345 
346  if(fFocusingSystem == 3){ // cylindrical lens w/o airgap
347 
348  Double_t hlens1 = 0.3; //[cm] thickness in the middle of the first (focising) (FusedSil) lens
349  Double_t hlens2 = 0.1; //[cm] thickness in the middle of the second (defocusing) (FusedSil) lens
350  Double_t rlens = 7.35; // [cm]
351  Double_t llens = barwidth/2.;
352  len = (hlens1+hlens2)/2.;
353 
354  //lens1
355  TGeoEltu* lCylinder = new TGeoEltu("Cyl", rlens, rlens, llens+1);
356  TGeoBBox* lCylBox = new TGeoBBox("LensBox", llens, barBoxHeight, len);
357  TGeoTranslation t1("trans", 0., 0., rlens+hlens2-len);
358  TGeoRotation r1("rot",90., 90. ,0. );
359  TGeoHMatrix tr = t1*r1;
360  TGeoHMatrix *transf = new TGeoHMatrix(tr);
361  transf->SetName("transf");
362  transf->RegisterYourself();
363  TGeoCompositeShape *cslens1 = new TGeoCompositeShape("cslens1","Cyl:transf * LensBox");
364  TGeoVolume *CylLens1 = new TGeoVolume("DrcLENS1Sensor", cslens1, gGeoManager->GetMedium("NLAK33A"));
365  CylLens1->SetLineColor(kRed+2);
366  CylLens1->SetTransparency(40);
367 
368  fdz_lens1 = -bbox_hlen - barWin_hthick; // + 3*barWin_hthick - len/2. + rlens;
369 
370  //lens2
371  TGeoTranslation t2("trans", 0., 0., rlens+hlens2-len);
372  TGeoHMatrix tr2 = t2*r1;
373  TGeoHMatrix *transf2 = new TGeoHMatrix(tr2);
374  transf2->SetName("transf2");
375  transf2->RegisterYourself();
376 
377  TGeoCompositeShape *cslens2 = new TGeoCompositeShape("cslens2", "LensBox - Cyl:transf2");
378  TGeoVolume* CylLens2 = new TGeoVolume("DrcLENS2Sensor", cslens2, gGeoManager->GetMedium("FusedSil"));
379  CylLens2->SetLineColor(kRed+2);
380  CylLens2->SetTransparency(40);
381 
382  }
383 
384  if(fFocusingSystem == 31){ // cylindrical lens w/o airgap
385 
386  Double_t hlens1 = 0.3; //[cm] thickness in the middle of the first (focising) (FusedSil) lens
387  Double_t hlens2 = 0.1; //[cm] thickness in the middle of the second (defocusing) (FusedSil) lens
388  Double_t rlens = 7.35; // [cm]
389  Double_t llens = barBoxWidth;
390  len = (hlens1+hlens2)/2.;
391 
392  //lens1
393  TGeoEltu* lCylinder = new TGeoEltu("Cyl", rlens, rlens, llens+1);
394  TGeoBBox* lCylBox = new TGeoBBox("LensBox", llens, barBoxHeight, len);
395  TGeoTranslation t1("trans", 0., 0., rlens+hlens2-len);
396  TGeoRotation r1("rot",90., 90. ,0. );
397  TGeoHMatrix tr = t1*r1;
398  TGeoHMatrix *transf = new TGeoHMatrix(tr);
399  transf->SetName("transf");
400  transf->RegisterYourself();
401  TGeoCompositeShape *cslens1 = new TGeoCompositeShape("cslens1","Cyl:transf * LensBox");
402  TGeoVolume *CylLensWide1 = new TGeoVolume("DrcLENS1Sensor", cslens1, gGeoManager->GetMedium("NLAK33A"));
403  CylLensWide1->SetLineColor(kRed+2);
404  CylLensWide1->SetTransparency(40);
405 
406  fdz_lens1 = -bbox_hlen - barWin_hthick; // + 3*barWin_hthick - len/2. + rlens;
407 
408  //lens2
409  TGeoTranslation t2("trans", 0., 0., rlens+hlens2-len);
410  TGeoHMatrix tr2 = t2*r1;
411  TGeoHMatrix *transf2 = new TGeoHMatrix(tr2);
412  transf2->SetName("transf2");
413  transf2->RegisterYourself();
414 
415  TGeoCompositeShape *cslens2 = new TGeoCompositeShape("cslens2", "LensBox - Cyl:transf2");
416  TGeoVolume* CylLensWide2 = new TGeoVolume("DrcLENS2Sensor", cslens2, gGeoManager->GetMedium("FusedSil"));
417  CylLensWide2->SetLineColor(kRed+2);
418  CylLensWide2->SetTransparency(40);
419 
420  fdz_lens2 = fdz_lens1 + hlens2;
421  }
422 
423  if(fFocusingSystem == 4){ // combined spherical lense
424 
425  Double_t hlens1 = 0.4; //[cm] thickness in the middle of the first (focising) (FusedSil) lens
426  Double_t hlens2 = 0.1; //[cm] thickness in the middle of the second (defocusing) (FusedSil) lens
427  Double_t rlens = 7.35; // [cm]
428  Double_t llens = barwidth/2.; //(bbX/barnum)/2.-bargap;
429  len = (hlens1+hlens2)/2.;
430 
431  //lens1
432  TGeoSphere* lSphUp = new TGeoSphere("SphUp",0 ,rlens, 0. ,180.,0.,360.);
433  TGeoBBox* lCylBox = new TGeoBBox("LensBox", llens, barBoxHeight, len);
434 
435  TGeoTranslation t1("trans", 0., 0., rlens+hlens2-len);
436  TGeoRotation r1("rot",90., 90. ,0. );
437  TGeoHMatrix tr = t1*r1;
438  TGeoHMatrix *transf = new TGeoHMatrix(tr);
439  transf->SetName("transf");
440  transf->RegisterYourself();
441 
442  TGeoCompositeShape *cslens1 = new TGeoCompositeShape("cslens1","SphUp:transf * LensBox");
443  TGeoVolume *CylLens1 = new TGeoVolume("DrcLENS1Sensor",cslens1, gGeoManager->GetMedium("NLAK33A"));
444  CylLens1->SetLineColor(kRed+2);
445  CylLens1->SetTransparency(40);
446  // CylLens1->SetLineColor(kCyan+1);
447  // CylLens1->SetTransparency(60);
448 
449  fdz_lens1 = -bbox_hlen + 3*barWin_hthick - len/2. + rlens;
450 
451  //lens2
452  TGeoTranslation t2("trans", 0., 0., rlens+hlens2-len);
453  TGeoHMatrix tr2 = t2*r1;
454  TGeoHMatrix *transf2 = new TGeoHMatrix(tr2);
455  transf2->SetName("transf2");
456  transf2->RegisterYourself();
457 
458  TGeoCompositeShape *cslens2 = new TGeoCompositeShape("cslens2", "LensBox - SphUp:transf2");
459  TGeoVolume* CylLens2 = new TGeoVolume("DrcLENS2Sensor", cslens2, gGeoManager->GetMedium("FusedSil"));//FusedSil //BK7G18 //PBF2
460  CylLens2->SetLineColor(kRed+2);
461  CylLens2->SetTransparency(40);
462  // CylLens2->SetLineColor(kCyan+-3);
463  // CylLens2->SetTransparency(60);
464  }
465 
466  if(fFocusingSystem == 5){ // combined spherical lense
467 
468  Double_t hlens1 = 0.3; //[cm] thickness in the middle of the first (focising) (FusedSil) lens
469  Double_t hlens2 = 0.1; //[cm] thickness in the middle of the second (defocusing) (FusedSil) lens
470  Double_t rlens1 = 7.2; // [cm] //vertical
471  Double_t rlens2 = 7.2; // [cm] //horizontal
472  Double_t llens = barwidth/2.; //(bbX/barnum)/2.-bargap;
473  len = (hlens1+hlens2)/2.;
474 
475  //lens1
476  TGeoEltu* lCylinder1 = new TGeoEltu("Cyl1", rlens1, rlens1, llens+1);
477  TGeoBBox* lCylBox = new TGeoBBox("LensBox", llens, barBoxHeight, len);
478 
479  TGeoTranslation t1("trans", 0., 0., rlens1+hlens2-len);
480  TGeoRotation r1("rot",90., 90. ,0. );
481  TGeoHMatrix tr = t1*r1;
482  TGeoHMatrix *transf = new TGeoHMatrix(tr);
483  transf->SetName("transf");
484  transf->RegisterYourself();
485 
486  TGeoCompositeShape *cslens1 = new TGeoCompositeShape("cslens1","Cyl1:transf * LensBox");
487  TGeoVolume *CylLens1 = new TGeoVolume("DrcLENS1Sensor",cslens1, gGeoManager->GetMedium("NLAK33A"));
488  CylLens1->SetLineColor(kRed+2);
489  CylLens1->SetTransparency(40);
490 
491  fdz_lens1 = -bbox_hlen + 3*barWin_hthick - len/2. + rlens1;
492 
493  //lens2
494  TGeoCompositeShape *cslens2 = new TGeoCompositeShape("cslens2", "LensBox - Cyl1:transf");
495  TGeoVolume* CylLens2 = new TGeoVolume("DrcLENS2Sensor", cslens2, gGeoManager->GetMedium("FusedSil"));
496  CylLens2->SetLineColor(kRed+2);
497  CylLens2->SetTransparency(40);
498 
499  TGeoEltu* lCylinder2 = new TGeoEltu("Cyl2", rlens1, rlens2, llens+1);
500  //lens3
501  TGeoTranslation t2("trans", 0., 0., rlens2+hlens2-len);
502  TGeoRotation r2("rot", 0., 90. ,0. );
503  TGeoHMatrix tr2 = t2*r2;
504  TGeoHMatrix *transf2 = new TGeoHMatrix(tr2);
505  transf2->SetName("transf2");
506  transf2->RegisterYourself();
507 
508  TGeoCompositeShape *cslens3 = new TGeoCompositeShape("cslens3","Cyl2:transf2 * LensBox");
509  TGeoVolume *CylLens3 = new TGeoVolume("DrcLENS3Sensor",cslens3, gGeoManager->GetMedium("NLAK33A"));
510  CylLens3->SetLineColor(kRed+2);
511  CylLens3->SetTransparency(40);
512 
513  //lens4
514  TGeoCompositeShape *cslens4 = new TGeoCompositeShape("cslens4", "LensBox - Cyl2:transf2");
515  TGeoVolume* CylLens4 = new TGeoVolume("DrcLENS4Sensor", cslens4, gGeoManager->GetMedium("FusedSil"));
516  CylLens4->SetLineColor(kRed+2);
517  CylLens4->SetTransparency(40);
518  len = 2.*len;
519  }
520 
521  if(fFocusingSystem == 6){ // combined spherical lense
522 
523  Double_t hlens1 = 0.3; //[cm] thickness in the middle of the first component of the first lens
524  Double_t hlens2 = 0.1; //[cm] thickness in the middle of the second component of the first lens
525  Double_t hlens3 = 0.5; //[cm] thickness in the middle of the first component
526  Double_t hlens4 = 0.1; //[cm] thickness in the middle of the second component
527  Double_t rlens1 = 30; // [cm]
528  Double_t rlens2 = 7; // [cm]
529 
530  rlens1 = (par1==-100)? rlens1: par1;
531  rlens2 = (par2==-100)? rlens2: par2;
532 
533  barWin_hthick=0;
534  Double_t llens = barwidth/2.;
535  len1 = (hlens1+hlens2)/2.;
536  len2 = (hlens3+hlens4)/2.;
537  len = len1+len2;
538 
539  //lens1
540  TGeoSphere* lSphUp = new TGeoSphere("SphUp",0 ,rlens1, 0. ,180.,0.,360.);
541  TGeoBBox* lCylBox = new TGeoBBox("LensBox", llens, barBoxHeight, len1);
542 
543  TGeoTranslation t1("trans", 0., 0., rlens1+hlens2-len1);
544  TGeoRotation r1("rot",90., 90. ,0. );
545  TGeoHMatrix tr = t1*r1;
546  TGeoHMatrix *transf = new TGeoHMatrix(tr);
547  transf->SetName("transf");
548  transf->RegisterYourself();
549 
550  TGeoCompositeShape *cslens1 = new TGeoCompositeShape("cslens1","SphUp:transf * LensBox");
551  TGeoVolume *Lens1 = new TGeoVolume("DrcLENS1Sensor",cslens1, gGeoManager->GetMedium("FusedSil"));//FusedSil //NLAK33A //DIRCairNoSens
552  Lens1->SetLineColor(kRed+2);
553  Lens1->SetTransparency(40);
554 
555  fdz_lens1 = -bbox_hlen + 3*barWin_hthick - len1/2. + rlens1;
556 
557  //lens2
558  TGeoTranslation t2("trans", 0., 0., rlens1+hlens2-len1);
559  TGeoHMatrix tr2 = t2*r1;
560  TGeoHMatrix *transf2 = new TGeoHMatrix(tr2);
561  transf2->SetName("transf2");
562  transf2->RegisterYourself();
563 
564  TGeoCompositeShape *cslens2 = new TGeoCompositeShape("cslens2", "LensBox - SphUp:transf2");
565  TGeoVolume* Lens2 = new TGeoVolume("DrcLENS2Sensor", cslens2, gGeoManager->GetMedium("PBF2"));//FusedSil //BK7G18 //PBF2 //NLAK33A
566  Lens2->SetLineColor(kRed);
567  Lens2->SetTransparency(40);
568 
569  //lens3
570  TGeoSphere* lSphUp2 = new TGeoSphere("SphUp2",0 ,rlens2, 0. ,180.,0.,360.);
571  TGeoBBox* lCylBox2 = new TGeoBBox("LensBox2", llens, barBoxHeight, len2);
572 
573  TGeoTranslation t3("trans3", 0., 0., rlens2+hlens4-len2);
574  TGeoHMatrix tr3 = t3*r1;
575  TGeoHMatrix *transf3 = new TGeoHMatrix(tr3);
576  transf3->SetName("transf3");
577  transf3->RegisterYourself();
578 
579  TGeoCompositeShape *cslens3 = new TGeoCompositeShape("cslens3","SphUp2:transf3 * LensBox2");
580  TGeoVolume *Lens3 = new TGeoVolume("DrcLENS3Sensor",cslens3, gGeoManager->GetMedium("PBF2")); //NLAK33A //BK7G18
581  Lens3->SetLineColor(kRed);
582  Lens3->SetTransparency(40);
583 
584  //lens4
585  TGeoTranslation t4("trans", 0., 0., rlens2+hlens4-len2);
586  TGeoHMatrix tr4 = t4*r1;
587  TGeoHMatrix *transf4 = new TGeoHMatrix(tr4);
588  transf4->SetName("transf4");
589  transf4->RegisterYourself();
590 
591  TGeoCompositeShape *cslens4 = new TGeoCompositeShape("cslens4", "LensBox2 - SphUp2:transf4");
592  TGeoVolume* Lens4 = new TGeoVolume("DrcLENS4Sensor", cslens4, gGeoManager->GetMedium("FusedSil"));//FusedSil //BK7G18 //PBF2 //DIRCairNoSens
593  Lens4->SetLineColor(kBlue+2);
594  Lens4->SetTransparency(40);
595 
596  }
597 
598  // {
599  // TGeoVolume *top = gGeoManager->MakeBox("DIRC",gGeoManager->GetMedium("air"),100,100,100);
600  // top->AddNode(Lens1, 1, new TGeoCombiTrans(0, 0, +len2, new TGeoRotation(0)));
601  // top->AddNode(Lens2, 2, new TGeoCombiTrans(0, 0, +len2, new TGeoRotation(0)));
602  // top->AddNode(Lens3, 3, new TGeoCombiTrans(0, 0, -len1, new TGeoRotation(0)));
603  // top->AddNode(Lens4, 4, new TGeoCombiTrans(0, 0, -len1, new TGeoRotation(0)));
604 
605  // //gGeoManager->SetTopVolume(top);
606  // //gGeoManager->CloseGeometry();
607  // gGeoManager->SetNsegments(1000);
608  // //top->CheckOverlaps(0.0001, "");
609  // //gGeoManager->CheckOverlaps(0.00001,"");
610  // //top->Write();
611  // //fi->Close();
612  // top->Draw("ogl");
613  // return;
614  // }
615 
616  }
617 
618  // create top volume:
619  TGeoManager* gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
620  gGeoManager->SetNsegments(100);
621 
622  TGeoBBox* lTop = new TGeoBBox(500,500,300);
623  TGeoVolume* top = new TGeoVolume("DIRC", lTop, gGeoManager->GetMedium("air"));
624  gGeoManager->SetTopVolume(top);
625 
626  // create pre-top volume:
627  TGeoVolume* vLocalMother;
628 
629  double sum = len + barWin_hthick + EVgreaseLayer;
630  double mirrorgap = 0.0;
631  double mirrorblock = mirr_hthick/2.+mirrorgap/2.;
632 
633  TGeoPcon* shape;
634  if(fGeomType != 1){
635  shape = new TGeoPcon("BarrelDIRCShape", 0, 360., 4);
636  shape->DefineSection(0, bbox_zdown+2*mirrorblock, 35., 60.);
637  shape->DefineSection(1, bbox_zup, 35., 60.);
638  shape->DefineSection(2, bbox_zup - sob_len +20., radiusMiddleSmall-1, sob_Rout+poffset+pheight+EVoffset+1.);
639  shape->DefineSection(3, bbox_zup - sob_len - PDbaseLayer - 2*sum, radiusMiddleSmall-1, sob_Rout+poffset+pheight+EVoffset+1.);
640  }else{
641  shape = new TGeoPcon("BarrelDIRCShape", 0, 360., 6);
642  shape->DefineSection(0, bbox_zdown+2*mirrorblock, 35., 60.);
643  shape->DefineSection(1, bbox_zup, 35., 60.);
644  shape->DefineSection(2, bbox_zup-2.*sum, 35., 60.);
645  shape->DefineSection(3, bbox_zup - 2.*sum -0.01, radiusMiddleSmall-0.01, sob_Rout+poffset+pheight+EVoffset+1.);
646  shape->DefineSection(4, bbox_zup - sob_len, radiusMiddleSmall-0.01, sob_Rout+poffset+pheight+EVoffset+1.);
647  shape->DefineSection(5, bbox_zup - sob_len - 2*PDbaseLayer - 2*sum, radiusMiddleSmall-0.01, sob_Rout+poffset+pheight+EVoffset+1.);
648  }
649  vLocalMother = new TGeoVolume("BarrelDIRC", shape, gGeoManager->GetMedium("DIRCairNoSens"));
650  top->AddNode(vLocalMother, 0,0);
651 
652 
653  Double_t entransewidth =len+barWin_hthick+EVgreaseLayer ;
654  cout<<"entrance width = "<<entransewidth<<endl;
655  double aw = bbox_hlen+entransewidth;
656 
657  TGeoBBox *lEntranceBox = new TGeoBBox("lEntranceBox", barBoxWidth, barBoxHeight, entransewidth);
658  TGeoVolume *entrancebox = new TGeoVolume("DrcEntranceBox", lEntranceBox, gGeoManager->GetMedium("DIRCairNoSens"));
659  entrancebox->SetLineColor(19); // gray
660 
661  //create BarBox
662  TGeoBBox *lBarBox = new TGeoBBox("lBarBox", barBoxWidth, hthick+boxgap+boxthick, bbox_hlen);
663  TGeoVolume *barbox = new TGeoVolume("DrcBarBox", lBarBox,gGeoManager->GetMedium("DIRCcarbonFiber"));
664  barbox->SetLineColor(30);
665 
666  TGeoBBox *lBarAirBox = new TGeoBBox("lBarAirBox", barBoxWidth - 0.1, hthick + 0.1, bbox_hlen);
667  TGeoVolume *barairbox = new TGeoVolume("DrcBarAirBox", lBarAirBox,gGeoManager->GetMedium("DIRCairNoSens"));
668  barairbox->SetLineColor(31);
669  barbox->AddNode(barairbox, 1, new TGeoCombiTrans(0, 0, 0, new TGeoRotation(0)));
670 
671  //create layers of grease at the readout end of the bar boxes, between the windows and the EV:
672  TGeoBBox* lEVgrease = new TGeoBBox("lEVgrease", barBoxWidth, barBoxHeight, EVgreaseLayer);
673  TGeoVolume* evgrease = new TGeoVolume("DrcEVgrease", lEVgrease, gGeoManager->GetMedium("OpticalGrease"));
674  evgrease->SetLineColor(kSpring);
675 
676  //create windows at the readout end of the bar boxes:
677  TGeoBBox* lBarWin = new TGeoBBox("lBarWin", barBoxWidth, barBoxHeight, barWin_hthick);
678  TGeoVolume* barwin = new TGeoVolume("DrcBarboxWindowSensor", lBarWin, gGeoManager->GetMedium("FusedSil"));
679  barwin->SetLineColor(kBlue-4);
680 
681  // create logic mirror:
682  TGeoBBox* lMirror = new TGeoBBox("lMirror", barBoxWidth, barBoxHeight, mirr_hthick/2.);
683  TGeoVolume *mirrorbox = new TGeoVolume("DrcMirr", lMirror, gGeoManager->GetMedium("Mirror"));
684  mirrorbox->SetLineColor(5);
685 
686 
687  // // entrancebox->AddNode(mirrorbox , 1, new TGeoCombiTrans(0, 0, aw+mirrorblock-mirr_hthick/2., new TGeoRotation(0)));
688 
689  if(fFocusingSystem == 31){
690  entrancebox->AddNode(CylLensWide1, 1, new TGeoCombiTrans(0, 0, barWin_hthick + EVgreaseLayer, new TGeoRotation(0)));
691  entrancebox->AddNode(CylLensWide2, 1, new TGeoCombiTrans(0, 0, barWin_hthick + EVgreaseLayer, new TGeoRotation(0)));
692  }
693  if( barWin_hthick != 0) entrancebox->AddNode(barwin, 1, new TGeoCombiTrans(0, 0, entransewidth - 2*len - barWin_hthick, new TGeoRotation(0)));
694  entrancebox->AddNode(evgrease, 1, new TGeoCombiTrans(0, 0, entransewidth - 2*len - 2*barWin_hthick - EVgreaseLayer, new TGeoRotation(0)));
695 
696  // put barboxes into right positions:
697  Double_t dx, dy, phi_curr;
698  for(Int_t m = 0; m < bbnum; m ++){
699  phi_curr = (90. - phi0 - dphi*m)/180.*pi;
700  if(m > bbnum/2-1){ phi_curr = (90. - phi0 - dphi*m - 2.*pipehAngle)/180.*pi; }
701  dx = radius * cos(phi_curr);
702  dy = radius * sin(phi_curr);
703 
704  TGeoRotation rotbbox;
705  rotbbox.RotateZ( -phi0 - m*dphi - (TMath::Floor(2.*m/bbnum))*(2.*pipehAngle));
706 
707  vLocalMother->AddNode(mirrorbox, m+1, new TGeoCombiTrans(dx, dy, bbox_zdown + mirrorblock, new TGeoRotation(rotbbox)));
708  vLocalMother->AddNode(barbox, m+1, new TGeoCombiTrans(dx, dy, bbox_zdown - bbox_hlen, new TGeoRotation(rotbbox)));
709  vLocalMother->AddNode(entrancebox, m+1, new TGeoCombiTrans(dx, dy, bbox_zup - entransewidth, new TGeoRotation(rotbbox)));
710  }
711 
712  TGeoBBox *lBar = new TGeoBBox("lBar", barwidth/2., hthick, bbox_hlen);
713  TGeoVolume *bar = new TGeoVolume("DrcBarSensor",lBar, gGeoManager->GetMedium("FusedSil"));
714  bar->SetLineColor(kCyan-9);
715  bar->SetTransparency(60);
716 
717  // create glue layer inside the bar (connects two halves):
718  TGeoBBox* lBarGlue = new TGeoBBox("lBarGlue", barwidth/2., hthick, gluehthick);
719  TGeoVolume *barglue = new TGeoVolume("DrcBarGlueSensor", lBarGlue, gGeoManager->GetMedium("Epotek301_2"));
720  barglue->SetLineColor(kSpring-5);
721  bar->AddNode(barglue, 1, new TGeoCombiTrans(0., 0., 0., new TGeoRotation (0)));
722 
723  for(Int_t j=0; j<barnum; j++){
724  dx = - (bbX/2.) - bbSideGap + (barwidth+2.*barhgap)/2. + j * (barwidth+2.*barhgap);
725  dy = 0;
726  if(fFocusingSystem == 1){ // lens
727  entrancebox->AddNode(Lens1, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer + len2, new TGeoRotation(0)));
728  entrancebox->AddNode(Lens2, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer + len2, new TGeoRotation(0)));
729  entrancebox->AddNode(Lens3, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer - len1, new TGeoRotation(0)));
730  entrancebox->AddNode(Lens4, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer - len1, new TGeoRotation(0)));
731  }
732  if(fFocusingSystem == 2){ // mirror
733  entrancebox->AddNode(block1, 1+j, new TGeoCombiTrans(dx, dy, fdz_mirr1, new TGeoRotation (0)));
734  entrancebox->AddNode(block2, 1+j, new TGeoCombiTrans(dx, dy, fdz_mirr2, new TGeoRotation (0)));
735  }
736  if(fFocusingSystem == 3 || fFocusingSystem == 4){
737  entrancebox->AddNode(CylLens1, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer , new TGeoRotation(0)));
738  entrancebox->AddNode(CylLens2, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer , new TGeoRotation(0)));
739  }
740  if(fFocusingSystem == 5){
741  entrancebox->AddNode(CylLens1, 1+j, new TGeoCombiTrans(dx, dy, -mirrorblock+aw-2*bbox_hlen - len/2. , new TGeoRotation(0)));
742  entrancebox->AddNode(CylLens2, 1+j, new TGeoCombiTrans(dx, dy, -mirrorblock+aw-2*bbox_hlen - len/2. , new TGeoRotation(0)));
743  entrancebox->AddNode(CylLens3, 1+j, new TGeoCombiTrans(dx, dy, -mirrorblock+aw-2*bbox_hlen - 3*len/2. , new TGeoRotation(0)));
744  entrancebox->AddNode(CylLens4, 1+j, new TGeoCombiTrans(dx, dy, -mirrorblock+aw-2*bbox_hlen - 3*len/2. , new TGeoRotation(0)));
745  }
746  if(fFocusingSystem == 6){
747  entrancebox->AddNode(Lens1, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer + len2, new TGeoRotation(0)));
748  entrancebox->AddNode(Lens2, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer + len2, new TGeoRotation(0)));
749  entrancebox->AddNode(Lens3, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer - len1, new TGeoRotation(0)));
750  entrancebox->AddNode(Lens4, 1+j, new TGeoCombiTrans(dx, dy, barWin_hthick + EVgreaseLayer - len1, new TGeoRotation(0)));
751  }
752 
753  barairbox->AddNode(bar, 1+j, new TGeoCombiTrans(dx, dy, 0, new TGeoRotation(0)));
754  }
755 
756  { // Expansion volume:
757 
758  TGeoPgon* logicEV1, * logicEV2, *logicEV3, * logicEV4;
759  TGeoPgon* logicEV1s, * logicEV2s, *logicEV3s, * logicEV4s;
760  TGeoPgon* logicEV1b, * logicEV2b, *logicEV3b, * logicEV4b;
761 
762  Double_t cosFactor1 = cos(pipehAngle/180.*pi)/cos(dphi/180.*pi/2.);
763  Double_t dR = (radius+hthick+boxgap+boxthick)/cos(dphi/2./180.*pi) - (radius-hthick);
764  Double_t zEV = (5*step -2*hgap)*cos(sob_angleB*pi/180.);
765  Double_t hEV = (5*step -2*hgap)*sin(sob_angleB*pi/180.);
766  Double_t maxrz, evLocShift;
767 
768  Double_t
769  minrad = radiusMiddleSmall,
770  viscorrection = 0.000001, //fix visualization
771  mcptot = MCPsize + MCPgap,
772  alpharad = TMath::ATan(mcptot/sob_len),
773  steprad=0, stepz=0, currz = 0.;
774  Int_t totalnumbering = 1;
775  // PhotoDetector Basic material - Carbon. It is placed on the back side of the EV to simulate the support structure of the MCPs, the photons are to hit it in gaps between MCPs:
776  TGeoVolume *pdbase;
777 
778 
779  { // create one MCP
780  //create pixel plates: one for each MCP:
781  TGeoBBox* logicPD = new TGeoBBox("logicPD", MCPactiveArea/2., MCPactiveArea/2., PDsensitiveThick/2.);
782  TGeoVolume *pixelholder = new TGeoVolume("DrcPDSensor", logicPD, gGeoManager->GetMedium("FusedSil"));
783  pixelholder->SetLineColor(kGreen+1);
784 
785  // create photo cathodes for each MCP
786  TGeoBBox* logicPhCathode = new TGeoBBox("logicPhCathode", MCPactiveArea/2., MCPactiveArea/2., PhCathodeThick/2.);
787  TGeoVolume *phcathode = new TGeoVolume("DrcPhCathodeSensor", logicPhCathode, gGeoManager->GetMedium("Photocathode"));//("FusedSil"));
788  phcathode->SetLineColor(kGray+1);
789 
790  // create Windows for each MCP
791  TGeoBBox* logicWindow = new TGeoBBox("logicWindow", MCPsize/2., MCPsize/2., PDwindowThick/2.);
792  TGeoVolume *window = new TGeoVolume("DrcPDwindowSensor", logicWindow, gGeoManager->GetMedium("FusedSil"));
793  window->SetLineColor(kBlue-4);
794 
795  // create grease layers between MCP window and the EV back side
796  TGeoBBox* logicMCPgrease = new TGeoBBox("logicMCPgrease", MCPsize/2., MCPsize/2., PDgreaseLayer/2.);
797  TGeoVolume *mcpgrease = new TGeoVolume("DrcMcpGreaseSensor", logicMCPgrease, gGeoManager->GetMedium("OpticalGrease"));
798  mcpgrease->SetLineColor(kSpring);
799 
800 
801  TGeoBBox *logicMCP = new TGeoBBox("logicMCP", MCPsize/2.+MCPgap/2., MCPsize/2.+MCPgap/2., (PDsensitiveThick+PhCathodeThick+PDwindowThick+PDgreaseLayer)/2.);
802  TGeoVolume *oneMCP = new TGeoVolume("DrcMCP", logicMCP, gGeoManager->GetMedium("DIRCcarbonFiber"));
803  oneMCP->SetLineColor(kBlue);
804 
805  oneMCP->AddNode(mcpgrease, 0, new TGeoCombiTrans(0, 0, (PDwindowThick+PhCathodeThick+PDsensitiveThick)/2., new TGeoRotation(0)));
806  oneMCP->AddNode(window, 0, new TGeoCombiTrans(0, 0, (PhCathodeThick+PDsensitiveThick-PDgreaseLayer)/2., new TGeoRotation(0)));
807  oneMCP->AddNode(phcathode, 0, new TGeoCombiTrans(0, 0, (PDsensitiveThick-PDgreaseLayer-PDwindowThick)/2., new TGeoRotation(0)));
808  oneMCP->AddNode(pixelholder, 0, new TGeoCombiTrans(0, 0, (-PDgreaseLayer-PDwindowThick-PhCathodeThick)/2., new TGeoRotation(0)));
809  }
810 
811  double btilt=(par5==-100)? 0 : par5*pi/180.;
812 
813  switch(fGeomType){
814  case 1:
815  {
816  double fixvisual = 0.000001;
817  if(sob_angleB == 90.){
818  logicEV1 = new TGeoPgon("logicEV1", 90 + pipehAngle, 180 - 2.*pipehAngle, bbnum/2, 2);
819  logicEV1->DefineSection(0, 0., radiusMiddleSmall+sob_len*tan(btilt), sob_Rout+sob_len*tan(btilt));
820  logicEV1->DefineSection(1, sob_len, radiusMiddleSmall, (radius+hthick+boxgap+boxthick+EVoffset));
821  logicEV2 = new TGeoPgon("logicEV2", -90 + pipehAngle, 180 - 2.*pipehAngle, bbnum/2, 2);
822  logicEV2->DefineSection(0, 0., radiusMiddleSmall+sob_len*tan(btilt), sob_Rout+sob_len*tan(btilt));
823  logicEV2->DefineSection(1, sob_len, radiusMiddleSmall, (radius+hthick+boxgap+boxthick+EVoffset));
824  logicEV3 = new TGeoPgon("logicEV3", 90 - pipehAngle-0.02, 2*pipehAngle+0.04, 1, 2);
825  logicEV3->DefineSection(0, 0., (radiusMiddleSmall+sob_len*tan(btilt))*cosFactor1, (sob_Rout+sob_len*tan(btilt))*cosFactor1);
826  logicEV3->DefineSection(1, sob_len, (radiusMiddleSmall)*cosFactor1, (radius+hthick+boxgap+boxthick+EVoffset)*cosFactor1);
827  logicEV4 = new TGeoPgon("logicEV4", -90 - pipehAngle-0.02, 2*pipehAngle+0.04, 1, 2);
828  logicEV4->DefineSection(0, 0., (radiusMiddleSmall+sob_len*tan(btilt))*cosFactor1, (sob_Rout+sob_len*tan(btilt))*cosFactor1);
829  logicEV4->DefineSection(1, sob_len, (radiusMiddleSmall)*cosFactor1, (radius+hthick+boxgap+boxthick+EVoffset)*cosFactor1);
830  }else{
831  logicEV1 = new TGeoPgon("logicEV1", 90.+(phi0-dphi/2.), 180.-2.*(phi0-dphi/2.), bbnum/2, 3);
832  logicEV1->DefineSection(0, 0., radiusMiddleSmall+sob_len*tan(btilt), radiusMiddleSmall+sob_len*tan(btilt)+fixvisual);
833  logicEV1->DefineSection(1, zEV, radiusMiddleSmall+(sob_len-zEV)*tan(btilt), radiusMiddleSmall+hEV+sob_len*tan(btilt));
834  logicEV1->DefineSection(2, sob_len, radiusMiddleSmall, (radius+hthick+boxgap+boxthick+EVoffset));
835  logicEV2 = new TGeoPgon("logicEV2", -90.+(phi0-dphi/2.), 180.-2.*(phi0-dphi/2.), bbnum/2, 3);
836  logicEV2->DefineSection(0, 0., radiusMiddleSmall+sob_len*tan(btilt), radiusMiddleSmall+sob_len*tan(btilt)+fixvisual);
837  logicEV2->DefineSection(1, zEV, radiusMiddleSmall+(sob_len-zEV)*tan(btilt), radiusMiddleSmall+hEV+sob_len*tan(btilt));
838  logicEV2->DefineSection(2, sob_len, radiusMiddleSmall, (radius+hthick+boxgap+boxthick+EVoffset));
839  logicEV3 = new TGeoPgon("logicEV3", 90.-(phi0-dphi/2.),2.*(phi0-dphi/2.), 1, 3);
840  logicEV3->DefineSection(0, 0., (radiusMiddleSmall+sob_len*tan(btilt))*cosFactor1, (radiusMiddleSmall+sob_len*tan(btilt)+fixvisual)*cosFactor1);
841  logicEV3->DefineSection(1, zEV, (radiusMiddleSmall+(sob_len-zEV)*tan(btilt))*cosFactor1, (radiusMiddleSmall+hEV+sob_len*tan(btilt))*cosFactor1);
842  logicEV3->DefineSection(2, sob_len, (radiusMiddleSmall)*cosFactor1, (radius+hthick+boxgap+boxthick+EVoffset)*cosFactor1);
843  logicEV4 = new TGeoPgon("logicEV4", -90.-(phi0-dphi/2.), 2.*(phi0-dphi/2.), 1, 3);
844  logicEV4->DefineSection(0, 0., (radiusMiddleSmall+sob_len*tan(btilt))*cosFactor1, (radiusMiddleSmall+sob_len*tan(btilt)+fixvisual)*cosFactor1);
845  logicEV4->DefineSection(1, zEV, (radiusMiddleSmall+(sob_len-zEV)*tan(btilt))*cosFactor1, (radiusMiddleSmall+sob_len*tan(btilt)+hEV)*cosFactor1);
846  logicEV4->DefineSection(2, sob_len, (radiusMiddleSmall)*cosFactor1, (radius+hthick+boxgap+boxthick+EVoffset)*cosFactor1);
847 
848  }
849  TGeoCompositeShape *logicEV = new TGeoCompositeShape("logicEV","logicEV1 + logicEV3 + logicEV2 + logicEV4 ");
850  TGeoVolume* baseEV = new TGeoVolume("DrcEVSensor", logicEV, gGeoManager->GetMedium("Marcol82_7"));
851 
852  TGeoPgon *logicPDbase1, *logicPDbase2, *logicPDbase3, *logicPDbase4;
853 
854  if(sob_angleB == 90.){
855  logicPDbase1 = new TGeoPgon("logicPDbase1", 90.+(phi0-dphi/2.), 180.-2.*(phi0-dphi/2.), bbnum/2, 2);
856  logicPDbase2 = new TGeoPgon("logicPDbase2", -90.+(phi0-dphi/2.), 180.-2.*(phi0-dphi/2.), bbnum/2, 2);
857  logicPDbase3 = new TGeoPgon("logicPDbase3", 90.-(phi0-dphi/2.), 2.*(phi0-dphi/2.) , 1, 2);
858  logicPDbase4 = new TGeoPgon("logicPDbase4", -90.-(phi0-dphi/2.), 2.*(phi0-dphi/2.) , 1, 2);
859  logicPDbase1->DefineSection(0, 0., radiusMiddleSmall+sob_len*tan(btilt)-hgap, sob_Rout+sob_len*tan(btilt)+hgap);
860  logicPDbase1->DefineSection(1, PDbaseLayer, radiusMiddleSmall+sob_len*tan(btilt)-hgap, sob_Rout+sob_len*tan(btilt)+hgap);
861  logicPDbase2->DefineSection(0, 0., radiusMiddleSmall+sob_len*tan(btilt)-hgap, sob_Rout+sob_len*tan(btilt)+hgap);
862  logicPDbase2->DefineSection(1, PDbaseLayer, radiusMiddleSmall+sob_len*tan(btilt)-hgap, sob_Rout+sob_len*tan(btilt)+hgap);
863  logicPDbase3->DefineSection(0, 0., (radiusMiddleSmall+sob_len*tan(btilt))*cosFactor1-hgap, (sob_Rout+hgap+sob_len*tan(btilt))*cosFactor1);
864  logicPDbase3->DefineSection(1, PDbaseLayer, (radiusMiddleSmall+sob_len*tan(btilt))*cosFactor1-hgap, (sob_Rout+hgap+sob_len*tan(btilt))*cosFactor1);
865  logicPDbase4->DefineSection(0, 0., (radiusMiddleSmall+sob_len*tan(btilt))*cosFactor1-hgap, (sob_Rout+hgap+sob_len*tan(btilt))*cosFactor1);
866  logicPDbase4->DefineSection(1, PDbaseLayer, (radiusMiddleSmall+sob_len*tan(btilt))*cosFactor1-hgap, (sob_Rout+hgap+sob_len*tan(btilt))*cosFactor1);
867  }else{
868  logicPDbase1 = new TGeoPgon("logicPDbase1", 90.+(phi0-dphi/2.), 180.-2.*(phi0-dphi/2.), bbnum/2, 4);
869  logicPDbase2 = new TGeoPgon("logicPDbase2", -90.+(phi0-dphi/2.), 180.-2.*(phi0-dphi/2.), bbnum/2, 4);
870  logicPDbase3 = new TGeoPgon("logicPDbase3", 90.-(phi0-dphi/2.), 2.*(phi0-dphi/2.) , 1, 4);
871  logicPDbase4 = new TGeoPgon("logicPDbase4", -90.-(phi0-dphi/2.), 2.*(phi0-dphi/2.) , 1, 4);
872  double cba = cos(sob_angleB*pi/180.);
873  double sba = sin(sob_angleB*pi/180.);
874  double addt = radiusMiddleSmall+sob_len*tan(btilt);
875  logicPDbase1->DefineSection(0, PDbaseLayer-PDbaseLayer*sba -hgap/tan(sob_angleB*pi/180.),
876  addt-hgap+PDbaseLayer*cba,
877  addt-hgap+PDbaseLayer*cba+fixvisual);
878  logicPDbase1->DefineSection(1, PDbaseLayer-hgap/tan(sob_angleB*pi/180.),
879  addt-hgap,
880  addt-hgap+PDbaseLayer/cba);
881 
882  logicPDbase1->DefineSection(2, PDbaseLayer-PDbaseLayer*sba -hgap/tan(sob_angleB*pi/180.) + zEV,
883  addt + hEV-hgap + PDbaseLayer*cba - PDbaseLayer/cba,
884  addt + hEV+hgap + PDbaseLayer*cba );
885  logicPDbase1->DefineSection(3, PDbaseLayer+hgap/tan(sob_angleB*pi/180.) + zEV , addt+ hEV+hgap, addt+ hEV+hgap+fixvisual);
886 
887 
888  logicPDbase2->DefineSection(0, PDbaseLayer-PDbaseLayer*sba -hgap/tan(sob_angleB*pi/180.),
889  addt-hgap+PDbaseLayer*cba,
890  addt-hgap+PDbaseLayer*cba+fixvisual);
891  logicPDbase2->DefineSection(1, PDbaseLayer-hgap/tan(sob_angleB*pi/180.),
892  addt-hgap,
893  addt-hgap+PDbaseLayer/cba);
894 
895  logicPDbase2->DefineSection(2, PDbaseLayer-PDbaseLayer*sba -hgap/tan(sob_angleB*pi/180.) + zEV,
896  addt + hEV-hgap + PDbaseLayer*cba - PDbaseLayer/cba,
897  addt + hEV+hgap + PDbaseLayer*cba );
898  logicPDbase2->DefineSection(3, PDbaseLayer+hgap/tan(sob_angleB*pi/180.) + zEV , addt+ hEV+hgap, addt+ hEV+hgap+fixvisual);
899 
900 
901  logicPDbase3->DefineSection(0, PDbaseLayer-PDbaseLayer*sba -hgap/tan(sob_angleB*pi/180.),
902  (addt-hgap+PDbaseLayer*cba)*cosFactor1,
903  (addt-hgap+PDbaseLayer*cba)*cosFactor1+fixvisual);
904  logicPDbase3->DefineSection(1, PDbaseLayer-hgap/tan(sob_angleB*pi/180.),
905  (addt-hgap)*cosFactor1,
906  (addt-hgap+PDbaseLayer/cba)*cosFactor1);
907 
908  logicPDbase3->DefineSection(2, PDbaseLayer-PDbaseLayer*sba -hgap/tan(sob_angleB*pi/180.) + zEV,
909  (addt + hEV-hgap + PDbaseLayer*cba - PDbaseLayer/cba)*cosFactor1,
910  (addt + hEV+hgap + PDbaseLayer*cba)*cosFactor1);
911  logicPDbase3->DefineSection(3, PDbaseLayer+hgap/tan(sob_angleB*pi/180.) + zEV ,
912  (addt+ hEV+hgap)*cosFactor1,
913  (addt+ hEV+hgap)*cosFactor1+fixvisual);
914 
915  logicPDbase4->DefineSection(0, PDbaseLayer-PDbaseLayer*sba -hgap/tan(sob_angleB*pi/180.),
916  (addt-hgap+PDbaseLayer*cba)*cosFactor1,
917  (addt-hgap+PDbaseLayer*cba)*cosFactor1+fixvisual);
918  logicPDbase4->DefineSection(1, PDbaseLayer-hgap/tan(sob_angleB*pi/180.),
919  (addt-hgap)*cosFactor1,
920  (addt-hgap+PDbaseLayer/cba)*cosFactor1);
921 
922  logicPDbase4->DefineSection(2, PDbaseLayer-PDbaseLayer*sba -hgap/tan(sob_angleB*pi/180.) + zEV,
923  (addt + hEV-hgap + PDbaseLayer*cba - PDbaseLayer/cba)*cosFactor1,
924  (addt + hEV+hgap + PDbaseLayer*cba)*cosFactor1);
925  logicPDbase4->DefineSection(3, PDbaseLayer+hgap/tan(sob_angleB*pi/180.) + zEV ,
926  (addt+ hEV+hgap)*cosFactor1,
927  (addt+ hEV+hgap)*cosFactor1+fixvisual);
928 
929  }
930 
931  TGeoCompositeShape *logicPDbase = new TGeoCompositeShape("logicPDbase","logicPDbase1 + logicPDbase2 + logicPDbase3 + logicPDbase4");
932  pdbase = new TGeoVolume("DrcPDbase", logicPDbase, gGeoManager->GetMedium("DIRCcarbonFiber"));
933  pdbase->SetLineColor(kGreen-6);
934  //if(sob_angleB == 90.){
935  vLocalMother->AddNode(pdbase, 1, new TGeoCombiTrans(0., 0., sob_shift-2*sum-PDbaseLayer, new TGeoRotation(0)));
936  //}
937 
938  vLocalMother->AddNode(baseEV, 1, new TGeoCombiTrans(0.,0.,sob_shift - 2*sum, new TGeoRotation(0)));
939  // sob_angleB = 90;
940  { // PD plane
941  Double_t sectorWidth = 0.;
942  Int_t nmcp = 0;
943  TVector3 location;
944  Double_t phi_curr1 = 0.;
945  Double_t pdthickness = (PDsensitiveThick+PhCathodeThick+PDwindowThick+PDgreaseLayer)/2.;
946  for(Int_t m = 0; m < bbnum; m ++){
947  phi_curr1 = (90. - phi0 - dphi*m)/180.*pi;
948  if(m > bbnum/2-1){ phi_curr1 = (90. - phi0 - dphi*m - 2.*pipehAngle)/180.*pi; }
949  if(sob_angleB != 90.){
950  stepz = MCPactiveArea*cos(sob_angleB*pi/180.)/2. - pdthickness*sin(sob_angleB*pi/180.);
951  steprad = -MCPactiveArea*(1-sin(sob_angleB*pi/180.))/2. + pdthickness*cos(sob_angleB*pi/180.);
952  }else{
953  stepz = -pdthickness;
954  }
955  TGeoRotation rot_sector;
956  rot_sector.RotateX(90-sob_angleB);
957  rot_sector.RotateZ( -phi0 - m*dphi - (TMath::Floor(2.*m/bbnum))*(2.*pipehAngle));
958  // placement of MCPs in one sector
959  for(Int_t nrow=0; nrow < Int_t((sob_Rout+2*hgap-radiusMiddleSmall)/step); nrow++){
960  sectorWidth = 2.* (radiusMiddleSmall + step*nrow) * tan(dphi_rad/2.);
961  nmcp = Int_t(sectorWidth/step);
962  xpos = (radiusMiddleSmall + 0.5*MCPactiveArea + step*(nrow))+sob_len*tan(btilt)+PixelSize/2.;
963  for(Int_t ny=0; ny<nmcp; ny++){
964  ypos = ((-Int_t(nmcp/2.) - 0.5*(nmcp%2))*step + (0.5+ny)*step);
965  if(nrow < 3){
966  location.SetXYZ(xpos+steprad + pow(-1,ny+1)*PixelSize/2.,ypos,stepz);
967  }
968  if(nrow >= 3){
969  if(fabs(ny - nmcp/2. +0.5) < 1){
970  location.SetXYZ(xpos+steprad + PixelSize/2.,ypos,stepz);
971  }
972  if(fabs(ny - nmcp/2. +0.5) > 1){
973  location.SetXYZ(xpos+steprad - PixelSize/2.,ypos,stepz);
974  }
975  }
976  location.RotateZ(phi_curr1);
977  pdbase->AddNode(oneMCP, totalnumbering, new TGeoCombiTrans(location.X(), location.Y(), PDbaseLayer + location.Z(), new TGeoRotation(rot_sector)));
978  totalnumbering = totalnumbering + 1;
979  }
980  if(sob_angleB != 90.){
981  stepz += mcptot*cos(sob_angleB*pi/180.);
982  steprad += -mcptot*(1-sin(sob_angleB*pi/180.));
983  }
984  }
985  }
986 
987  if(sob_angleB != 90.){
988  stepz = MCPactiveArea*cos(sob_angleB*pi/180.)/2. - pdthickness*sin(sob_angleB*pi/180.);
989  steprad = -MCPactiveArea*(1-sin(sob_angleB*pi/180.))/2. + pdthickness*cos(sob_angleB*pi/180.);
990  }
991  for(Int_t nrow=0; nrow < Int_t((sob_Rout+2*hgap-radiusMiddleSmall)/step); nrow++){
992  for(Int_t nadd = 0; nadd<2; nadd++){
993  TGeoRotation rot_sector;
994  if(nadd==1) rot_sector.RotateX(270+sob_angleB);
995  else rot_sector.RotateX(90-sob_angleB);
996  xpos = ((radiusMiddleSmall+sob_len*tan(btilt))*cosFactor1 + 0.5*MCPactiveArea + step*(nrow));
997  location.SetXYZ(xpos+steprad,0.,stepz);
998  location.RotateZ(pi/2.+pi*nadd);
999  if(sob_angleB == 90.) pdbase->AddNode(oneMCP, totalnumbering, new TGeoCombiTrans(location.X(), location.Y(), PDbaseLayer + location.Z(), new TGeoRotation(rot_sector)));
1000  totalnumbering = totalnumbering + 1;
1001  }
1002  if(sob_angleB != 90.){
1003  stepz += mcptot*cos(sob_angleB*pi/180.);
1004  steprad += -mcptot*(1-sin(sob_angleB*pi/180.));
1005  }
1006  }
1007  }
1008 
1009  }
1010  break;
1011  case 2:
1012  {
1013  { // EV
1014  logicEV1 = new TGeoPgon("logicEV1", 90 + pipehAngle, 180 - 2.*pipehAngle, bbnum/2, 7);
1015  logicEV2 = new TGeoPgon("logicEV2", -90 + pipehAngle, 180 - 2.*pipehAngle, bbnum/2, 7);
1016  logicEV3 = new TGeoPgon("logicEV3", 90 - pipehAngle-0.02, 2*pipehAngle+0.04, 1, 7); //fix visualization
1017  logicEV4 = new TGeoPgon("logicEV4", -90 - pipehAngle-0.02, 2*pipehAngle+0.04, 1, 7);
1018 
1019  for(int i=0; i<6; i++){
1020  steprad = mcptot*TMath::Cos((i+1)*alpharad);
1021  stepz = mcptot*TMath::Sin((i+1)*alpharad);
1022  if(i!=0) viscorrection = 0;
1023  logicEV1->DefineSection(i, currz ,radiusMiddleSmall, minrad+viscorrection);
1024  logicEV2->DefineSection(i, currz ,radiusMiddleSmall, minrad+viscorrection);
1025  logicEV3->DefineSection(i, currz ,radiusMiddleSmall*cosFactor1, (minrad+viscorrection)*cosFactor1);
1026  logicEV4->DefineSection(i, currz ,radiusMiddleSmall*cosFactor1, (minrad+viscorrection)*cosFactor1);
1027  minrad += steprad;
1028  currz += stepz;
1029  if(i==4) maxrz = currz;
1030  }
1031 
1032  logicEV1->DefineSection(6, sob_len, radiusMiddleSmall, (radius+hthick+boxgap+boxthick+EVoffset));
1033  logicEV2->DefineSection(6, sob_len, radiusMiddleSmall, (radius+hthick+boxgap+boxthick+EVoffset));
1034  logicEV3->DefineSection(6, sob_len, radiusMiddleSmall*cosFactor1, (radius+hthick+boxgap+boxthick+EVoffset)*cosFactor1);
1035  logicEV4->DefineSection(6, sob_len, radiusMiddleSmall*cosFactor1, (radius+hthick+boxgap+boxthick+EVoffset)*cosFactor1);
1036 
1037 
1038  //small volume to constract EVcover
1039  minrad = radiusMiddleSmall;
1040  currz = 0.;
1041 
1042  logicEV1s = new TGeoPgon("logicEV1s", 90 + pipehAngle, 180 - 2.*pipehAngle, bbnum/2, 7);
1043  logicEV2s = new TGeoPgon("logicEV2s", -90 + pipehAngle, 180 - 2.*pipehAngle, bbnum/2, 7);
1044  logicEV3s = new TGeoPgon("logicEV3s", 90 - pipehAngle-0.02, 2*pipehAngle+0.04, 1, 7); //fix visualization
1045  logicEV4s = new TGeoPgon("logicEV4s", -90 - pipehAngle-0.02, 2*pipehAngle+0.04, 1, 7);
1046 
1047  Double_t airgap = 0.05, airdz=airgap/tan(pi/2.-alpharad);
1048  for(int i=0; i<6; i++){
1049  steprad = mcptot*TMath::Cos((i+1)*alpharad);
1050  stepz = mcptot*TMath::Sin((i+1)*alpharad);
1051  if(i!=0) {viscorrection = 0; airgap = 0; airdz=0;}
1052  logicEV1s->DefineSection(i, currz-airdz ,radiusMiddleSmall-airgap, minrad+viscorrection-airgap);
1053  logicEV2s->DefineSection(i, currz-airdz ,radiusMiddleSmall-airgap, minrad+viscorrection-airgap);
1054  logicEV3s->DefineSection(i, currz-airdz ,(radiusMiddleSmall-airgap)*cosFactor1, (minrad+viscorrection-airgap)*cosFactor1);
1055  logicEV4s->DefineSection(i, currz-airdz ,(radiusMiddleSmall-airgap)*cosFactor1, (minrad+viscorrection-airgap)*cosFactor1);
1056  minrad += steprad;
1057  currz += stepz;
1058  if(i==4) maxrz = currz;
1059 
1060  }
1061  airgap = 0.05;
1062  logicEV1s->DefineSection(6, sob_len, radiusMiddleSmall-airgap, (radius+hthick+boxgap+boxthick+EVoffset+airgap));
1063  logicEV2s->DefineSection(6, sob_len, radiusMiddleSmall-airgap, (radius+hthick+boxgap+boxthick+EVoffset+airgap));
1064  logicEV3s->DefineSection(6, sob_len, (radiusMiddleSmall-airgap)*cosFactor1, (radius+hthick+boxgap+boxthick+EVoffset+airgap)*cosFactor1);
1065  logicEV4s->DefineSection(6, sob_len, (radiusMiddleSmall-airgap)*cosFactor1, (radius+hthick+boxgap+boxthick+EVoffset+airgap)*cosFactor1);
1066 
1067  //big volume to construct EVcover
1068  minrad = radiusMiddleSmall;
1069  mcptot = MCPsize + MCPgap;
1070  alpharad = TMath::ATan(mcptot/sob_len);
1071  currz = 0.;
1072 
1073  logicEV1b = new TGeoPgon("logicEV1b", 90 + pipehAngle, 180 - 2.*pipehAngle, bbnum/2, 8);
1074  logicEV2b = new TGeoPgon("logicEV2b", -90 + pipehAngle, 180 - 2.*pipehAngle, bbnum/2, 8);
1075  logicEV3b = new TGeoPgon("logicEV3b", 90 - pipehAngle-0.02, 2*pipehAngle+0.04, 1, 8);
1076  logicEV4b = new TGeoPgon("logicEV4b", -90 - pipehAngle-0.02, 2*pipehAngle+0.04, 1, 8);
1077 
1078  Double_t tga,
1079  mcpcoverthick = 1,
1080  coverthick = 0.1;
1081  for(int i=0; i<6; i++){
1082  steprad = mcptot*TMath::Cos((i+1)*alpharad);
1083  stepz = mcptot*TMath::Sin((i+1)*alpharad);
1084 
1085  logicEV1b->DefineSection(i, currz-mcpcoverthick ,radiusMiddleSmall-coverthick, minrad+mcpcoverthick);
1086  logicEV2b->DefineSection(i, currz-mcpcoverthick ,radiusMiddleSmall-coverthick, minrad+mcpcoverthick);
1087  logicEV3b->DefineSection(i, currz-mcpcoverthick ,(radiusMiddleSmall-coverthick)*cosFactor1, (minrad+mcpcoverthick)*cosFactor1);
1088  logicEV4b->DefineSection(i, currz-mcpcoverthick ,(radiusMiddleSmall-coverthick)*cosFactor1, (minrad+mcpcoverthick)*cosFactor1);
1089  if(i==5) {
1090  tga = (sob_len - currz)/(minrad - (radius+hthick+boxgap+boxthick+EVoffset));
1091  double tshift = mcpcoverthick*tga - coverthick;
1092  logicEV1b->DefineSection(6, currz-tshift ,radiusMiddleSmall-coverthick, minrad+mcpcoverthick);
1093  logicEV2b->DefineSection(6, currz-tshift ,radiusMiddleSmall-coverthick, minrad+mcpcoverthick);
1094  logicEV3b->DefineSection(6, currz-tshift ,(radiusMiddleSmall-coverthick)*cosFactor1, (minrad+mcpcoverthick)*cosFactor1);
1095  logicEV4b->DefineSection(6, currz-tshift ,(radiusMiddleSmall-coverthick)*cosFactor1, (minrad+mcpcoverthick)*cosFactor1);
1096  }
1097  minrad += steprad;
1098  currz += stepz;
1099  if(i==4) maxrz = currz;
1100 
1101  }
1102 
1103  logicEV1b->DefineSection(7, sob_len-0.01, radiusMiddleSmall-coverthick, (radius+hthick+boxgap+boxthick+EVoffset)+coverthick/tga);
1104  logicEV2b->DefineSection(7, sob_len-0.01, radiusMiddleSmall-coverthick, (radius+hthick+boxgap+boxthick+EVoffset)+coverthick/tga);
1105  logicEV3b->DefineSection(7, sob_len-0.01, (radiusMiddleSmall-coverthick)*cosFactor1, ((radius+hthick+boxgap+boxthick+EVoffset)+coverthick/tga)*cosFactor1);
1106  logicEV4b->DefineSection(7, sob_len-0.01, (radiusMiddleSmall-coverthick)*cosFactor1, ((radius+hthick+boxgap+boxthick+EVoffset)+coverthick/tga)*cosFactor1);
1107 
1108  TGeoCompositeShape *logicEV = new TGeoCompositeShape("logicEV","logicEV1 + logicEV3 + logicEV2 + logicEV4");
1109  TGeoVolume* baseEV = new TGeoVolume("DrcEVSensor", logicEV, gGeoManager->GetMedium("Marcol82_7"));
1110 
1111  TGeoCompositeShape *logicEVs = new TGeoCompositeShape("logicEVs","logicEV1s + logicEV3s + logicEV2s + logicEV4s"); //
1112  TGeoCompositeShape *logicEVb = new TGeoCompositeShape("logicEVb","logicEV1b + logicEV3b + logicEV2b + logicEV4b"); //
1113 
1114  TGeoCompositeShape *logicEVcover = new TGeoCompositeShape("logicEVcover","logicEVb - logicEVs");
1115  pdbase = new TGeoVolume("DrcPDbase", logicEVcover, gGeoManager->GetMedium("DIRCcarbonFiber")); //DrcEVcover
1116  pdbase->SetLineColor(kTeal-8);
1117  vLocalMother->AddNode(pdbase, 1, new TGeoCombiTrans(0., 0., sob_shift-2*sum, new TGeoRotation(0)));
1118  }
1119 
1120  vLocalMother->AddNode(baseEV, 1, new TGeoCombiTrans(0.,0.,sob_shift - 2*sum, new TGeoRotation(0)));
1121 
1122  { // PD plane
1123  Double_t sectorWidth = 0.;
1124  Int_t nmcp = 0;
1125  TVector3 location;
1126  Double_t phi_curr1 = 0.;
1127  for(Int_t m = 0; m < bbnum; m ++){
1128  phi_curr1 = (90. - phi0 - dphi*m)/180.*pi;
1129  if(m > bbnum/2-1){ phi_curr1 = (90. - phi0 - dphi*m - 2.*pipehAngle)/180.*pi; }
1130 
1131  stepz = mcptot*TMath::Sin(alpharad)/2.;
1132  steprad = mcptot*(1-TMath::Cos(alpharad))/2.;
1133 
1134  // placement of MCPs in one sector
1135  for(Int_t nrow=0; nrow < Int_t((sob_Rout+2*hgap-radiusMiddleSmall)/step); nrow++){
1136 
1137  TGeoRotation rot_sector;
1138  rot_sector.RotateX((nrow+1)*alpharad*180./pi);
1139  rot_sector.RotateZ( -phi0 - m*dphi - (TMath::Floor(2.*m/bbnum))*(2.*pipehAngle));
1140 
1141  sectorWidth = 2.* (radiusMiddleSmall + step*nrow) * tan(dphi_rad/2.);
1142  nmcp = Int_t(sectorWidth/step);
1143  xpos = (radiusMiddleSmall + 0.5*mcptot + step*(nrow));
1144  for(Int_t ny=0; ny<nmcp; ny++){
1145  ypos = ((-Int_t(nmcp/2.) - 0.5*(nmcp%2))*step + (0.5+ny)*step);
1146  location.SetXYZ(xpos-steprad + (logicMCP->GetDZ())*(TMath::Cos(pi/2. - (nrow+1)*alpharad)) ,ypos,0.);
1147  location.RotateZ(phi_curr1);
1148 
1149  pdbase->AddNode(oneMCP, totalnumbering, new TGeoCombiTrans(location.X(), location.Y(),stepz - (logicMCP->GetDZ())*(TMath::Sin(pi/2. - (nrow+1)*alpharad))
1150  , new TGeoRotation(rot_sector)));
1151  totalnumbering = totalnumbering + 1;
1152  }
1153 
1154  stepz += mcptot*TMath::Sin((nrow+1)*alpharad)/2. + mcptot*TMath::Sin((nrow+2)*alpharad)/2.;
1155  steprad += mcptot*(1-TMath::Cos((nrow+1)*alpharad))/2. + mcptot*(1-TMath::Cos((nrow+2)*alpharad))/2.;
1156 
1157  }
1158  }
1159  }
1160  }
1161  break;
1162  case 3:
1163  {
1164  { //EV radius+hthick+boxgap+boxthick+EVoffset
1165 
1166  double sp = 2*(barBoxHeight+EVdrop/2.+EVoffset/2.);
1167  double evh = 5*step - 2*hgap;
1168  double evb = evh*sin(sob_angleB*pi/180.);
1169  double dz1 = (sob_len - evh*cos(sob_angleB*pi/180.))/2.;
1170  double dz2 = evh*cos(sob_angleB*pi/180.)/2.;
1171  double evwidth = 3*step/2. - hgap;
1172 
1173  TGeoTrap *Trd0 = new TGeoTrap("Trd0",sob_len/2., atan((evh-sp)/(2.*sob_len))*180./pi, 270, evh/2., evwidth, evwidth, 0, sp/2., evwidth, evwidth, 0);
1174  TGeoTrap *Trd1 = new TGeoTrap("Trd1",dz1, atan((evb-sp)/(4.*dz1))*180./pi, 270., evb/2., evwidth, evwidth, 0, sp/2., evwidth, evwidth, 0);
1175  TGeoTrap *Trd2 = new TGeoTrap("Trd2",dz2, -atan((evb)/(4.*dz2))*180./pi, 270., 0.000001, evwidth, evwidth, 0, evb/2., evwidth, evwidth, 0);
1176 
1177  evLocShift = (Trd1->GetH1()+Trd1->GetH2())/2. - barBoxHeight;
1178  TGeoTranslation * evtr1 = new TGeoTranslation("evtr1",0,0,dz2);
1179  evtr1->RegisterYourself();
1180  TGeoTranslation * evtr2 = new TGeoTranslation("evtr2",0,-sp/4.,-dz1);
1181  evtr2->RegisterYourself();
1182  TGeoCompositeShape *Trd = new TGeoCompositeShape("logicEVcover","Trd1:evtr1 + Trd2:evtr2");
1183 
1184  if(sob_angleB==90) baseEV = new TGeoVolume("DrcEVSensor",Trd0,gGeoManager->GetMedium("FusedSil"));
1185  else baseEV = new TGeoVolume("DrcEVSensor",Trd,gGeoManager->GetMedium("FusedSil"));
1186 
1187  baseEV->SetLineColor(kCyan-9);
1188  baseEV->SetTransparency(0);
1189  }
1190 
1191  TGeoBBox* logicPDbase = new TGeoBBox("logicPDbase", 3*step/2., 5*step/2., PDbaseLayer/2.);
1192  Double_t pdLocShift = logicPDbase->GetDY() - barBoxHeight - hgap;
1193  pdbase = new TGeoVolume("DrcPDbase", logicPDbase, gGeoManager->GetMedium("DIRCcarbonFiber"));
1194  pdbase->SetLineColor(kGreen-6);
1195  pdbase->SetTransparency(40);
1196 
1197  { //PD plane
1198  Double_t xcurr = 0., ycurr = 0.;
1199  for(Int_t i=0; i<5; i++){ // loop over y
1200  for(Int_t j=0; j<3; j++){ // loop over x
1201  xcurr = -0.5*(3.*step) + 0.5*step+j*step;
1202  ycurr = -(2.*hthick+EVdrop+EVoffset+sob_len*tan(sob_angle*pi/180.))/2. + 0.5*step+i*step + hgap;
1203 
1204  pdbase->AddNode(oneMCP, totalnumbering, new TGeoCombiTrans(xcurr, ycurr, PDbaseLayer/2.-(PDsensitiveThick+PhCathodeThick+PDwindowThick+PDgreaseLayer)/2., new TGeoRotation(0)));
1205  totalnumbering = totalnumbering + 1;
1206  }
1207  }
1208  Double_t evcorr90 = -logicPDbase->GetDZ();
1209  if(sob_angleB!=90) {
1210  pdLocShift += - (logicPDbase->GetDY()- hgap)*(1-cos((90-sob_angleB)*pi/180.))+logicPDbase->GetDZ()*cos(sob_angleB*pi/180.);
1211  evcorr90 = (logicPDbase->GetDY() - hgap)*sin((90-sob_angleB)*pi/180.) -logicPDbase->GetDZ()*sin(sob_angleB*pi/180.);
1212  }
1213  for(Int_t m = 0; m < bbnum; m ++){
1214  phi_curr = (90. - phi0 - dphi*m)/180.*pi;
1215  if(m > bbnum/2-1){ phi_curr = (90. - phi0 - dphi*m - 2.*pipehAngle)/180.*pi; }
1216  dx = (radius-EVdrop) * cos(phi_curr);
1217  dy = (radius-EVdrop) * sin(phi_curr);
1218 
1219  TGeoRotation rotbbox,rotpbox;
1220  rotbbox.RotateZ( -phi0 - m*dphi - (TMath::Floor(2.*m/bbnum))*(2.*pipehAngle));
1221  rotpbox.RotateX(90-sob_angleB);
1222  rotpbox.RotateZ( -phi0 - m*dphi - (TMath::Floor(2.*m/bbnum))*(2.*pipehAngle));
1223 
1224  vLocalMother->AddNode(baseEV, m+1, new TGeoCombiTrans(dx + evLocShift*cos(phi_curr), dy + evLocShift*sin(phi_curr), bbox_zup - 2*entransewidth - sob_len/2. , new TGeoRotation(rotbbox)));
1225  vLocalMother->AddNode(pdbase, m+1, new TGeoCombiTrans(dx + pdLocShift*cos(phi_curr), dy + pdLocShift*sin(phi_curr), sob_shift-2*sum+evcorr90, new TGeoRotation(rotpbox)));
1226  }
1227 
1228  }
1229  }
1230  break;
1231  }
1232 
1233  baseEV->SetLineColor(kMagenta+2);
1234  baseEV->SetTransparency(50);
1235  }
1236 
1237  pdbase->SetTransparency(50);
1238 
1239  // gGeoManager->SetTopVisible();
1240  // pdbase->Draw("ogl"); return;
1241 
1242  if(fGeomType==5){
1243  TGeoBBox* lTop = new TGeoBBox(500,500,300);
1244  top = new TGeoVolume("DIRC", lTop, gGeoManager->GetMedium("air"));
1245  gGeoManager->SetTopVolume(top);
1246  TGeoBBox* l1 = new TGeoBBox(400,400,200);
1247  v1 = new TGeoVolume("v1", l1, gGeoManager->GetMedium("air"));
1248  TGeoSphere* l2 = new TGeoSphere("l2",0 ,30, 0. ,180.,0.,360.);
1249  v2 = new TGeoVolume("v2", l2, gGeoManager->GetMedium("FusedSil"));
1250  v2->AddNode(Lens1, 0,new TGeoCombiTrans(0, 0, len2, new TGeoRotation(0)));
1251  v2->AddNode(Lens2, 0,new TGeoCombiTrans(0, 0, len2, new TGeoRotation(0)));
1252  v2->AddNode(Lens3, 0,new TGeoCombiTrans(0, 0, -len1, new TGeoRotation(0)));
1253  v2->AddNode(Lens4, 0,new TGeoCombiTrans(0, 0, -len1, new TGeoRotation(0)));
1254  v1->AddNode(v2, 0,0);
1255  top->AddNode(v1, 0,0);
1256 
1257  }
1258 
1259  gGeoManager->CloseGeometry();
1260  top->CheckOverlaps(0.0001, "");
1261  gGeoManager->CheckOverlaps(0.00001,""); // [cm]
1262  gGeoManager->SetNsegments(100);
1263  // gGeoManager->CheckGeometryFull();
1264  gGeoManager->SetVisLevel(4);
1265 
1266  top->Write();
1267  fi->Close();
1268  if(!gROOT->IsBatch()) top->Draw("ogl");
1269 
1270  TObjArray *listOfOverlaps = gGeoManager->GetListOfOverlaps();
1271  cout<<listOfOverlaps->GetEntries()<<endl;
1272  listOfOverlaps->Print();
1273  return 0;
1274 }
friend F32vec4 cos(const F32vec4 &a)
Definition: P4_F32vec4.h:112
Double_t EVbackAngle()
Definition: PndGeoDrc.h:148
double dy
Double_t GreaseLayer()
Definition: PndGeoDrc.h:88
Int_t t2
Definition: hist-t7.C:106
Double_t BBoxNum()
Definition: PndGeoDrc.h:136
FairGeoLoader * geoLoad
Int_t i
Definition: run_full.C:25
FairGeoMedia * Media
__m128 m
Definition: P4_F32vec4.h:28
TGeoManager * gGeoMan
friend F32vec4 sin(const F32vec4 &a)
Definition: P4_F32vec4.h:111
Double_t EVlen()
Definition: PndGeoDrc.h:127
Double_t BarWidth()
Definition: PndGeoDrc.h:100
static T Sin(const T &x)
Definition: PndCAMath.h:42
Double_t par[3]
#define pi
Definition: createSTT.C:60
double r1
Double_t BBoxGap()
Definition: PndGeoDrc.h:130
Double_t EVdrop()
Definition: PndGeoDrc.h:142
Double_t boxGap()
Definition: PndGeoDrc.h:116
TGeoManager * gGeoManager
static T Cos(const T &x)
Definition: PndCAMath.h:43
Double_t barBoxZDown()
Definition: PndGeoDrc.h:104
Double_t EVoffset()
Definition: PndGeoDrc.h:145
TGeoVolume * top
TGeoRotation * rot1
Int_t t1
Definition: hist-t7.C:106
Double_t PipehAngle()
Definition: PndGeoDrc.h:139
Double_t PrismAngle()
Definition: PndGeoDrc.h:160
Double_t barBoxZUp()
Definition: PndGeoDrc.h:108
FairGeoBuilder * geobuild
TGeoShape * shape
TFile * fi
Double_t PrismDrop()
Definition: PndGeoDrc.h:154
Double_t
Double_t phi0
Definition: checkhelixhit.C:60
double eps(TVector3 v1, TVector3 v2)
Double_t McpActiveArea()
Definition: PndGeoDrc.h:166
const Double_t zpos
Double_t McpSize()
Definition: PndGeoDrc.h:163
vLocalMother
Double_t z
Int_t t3
Definition: hist-t7.C:106
friend F32vec4 fabs(const F32vec4 &a)
Definition: P4_F32vec4.h:47
Double_t boxThick()
Definition: PndGeoDrc.h:120
Double_t barhGap()
Definition: PndGeoDrc.h:112
double dx
Double_t barHalfThick()
Definition: PndGeoDrc.h:96
Double_t PrismOffset()
Definition: PndGeoDrc.h:151
Double_t PrismhLength()
Definition: PndGeoDrc.h:157
TVector3 v1
Definition: bump_analys.C:40
TVector3 v2
Definition: bump_analys.C:40
TTree * t
Definition: bump_analys.C:13
FairGeoInterface * geoFace
Double_t par1[3]
Definition: reco_analys2.C:51
Double_t GlueLayer()
Definition: PndGeoDrc.h:84
TString fGeoFile
Double_t barNum()
Definition: PndGeoDrc.h:124
Double_t McpGap()
Definition: PndGeoDrc.h:169
Double_t PixelSize()
Definition: PndGeoDrc.h:175
double r2
Double_t radius()
Definition: PndGeoDrc.h:92

Variable Documentation

const Double_t pi = 4.*atan(1.)

Definition at line 27 of file createdircPix.C.