FairRoot/PandaRoot
PndMdtGeoConstructorFast.cxx
Go to the documentation of this file.
1 
2 #include <iostream>
3 
4 #include "TClonesArray.h"
5 #include "TLorentzVector.h"
6 #include "TMath.h"
7 #include "TParticle.h"
8 #include "TGeoArb8.h"
9 #include "TGeoTrd2.h"
10 #include "TGeoCompositeShape.h"
11 #include "TGeoMatrix.h"
12 #include "TGeoManager.h"
13 #include "TVirtualMC.h"
14 
15 #include "FairVolume.h"
16 #include "FairGeoMedia.h"
17 #include "FairGeoInterface.h"
18 #include "FairGeoLoader.h"
19 #include "FairGeoBuilder.h"
20 #include "FairRuntimeDb.h"
21 #include "FairRun.h"
22 #include "FairModule.h"
23 
24 #include "PndDetectorList.h"
25 #include "PndStack.h"
26 #include "PndMdt.h"
28 
29 
30 using namespace std;
31 
32 
33 // ----- Public method ConstructGeometryFast -----------------------------
35 {
36  TString vname = "cave";
37  vname = vname.Strip();
38  TGeoVolume* vcave = gGeoManager->FindVolumeFast(vname.Data());
39 
40  //General definitions
41  TGeoVolume* mdt = new TGeoVolumeAssembly("Mdt");
42  new TGeoVolumeAssembly("MdtMag"); //TGeoVolume* mdtMag = // FIXME [R.K. 03/2017] unused variable?
43  TGeoVolume* mdtBarrel = new TGeoVolumeAssembly("MdtBarrel");
44  TGeoVolume* mdtBL00 = new TGeoVolumeAssembly("MdtBarrelLayer00");
45  TGeoVolume* mdtBL01 = new TGeoVolumeAssembly("MdtBarrelLayer01");
46  TGeoVolume* mdtBL02 = new TGeoVolumeAssembly("MdtBarrelLayer02");
47  TGeoVolume* mdtBL03 = new TGeoVolumeAssembly("MdtBarrelLayer03");
48  TGeoVolume* mdtBL04 = new TGeoVolumeAssembly("MdtBarrelLayer04");
49  TGeoVolume* mdtBL05 = new TGeoVolumeAssembly("MdtBarrelLayer05");
50  TGeoVolume* mdtBL06 = new TGeoVolumeAssembly("MdtBarrelLayer06");
51  TGeoVolume* mdtBL07 = new TGeoVolumeAssembly("MdtBarrelLayer07");
52  TGeoVolume* mdtBL08 = new TGeoVolumeAssembly("MdtBarrelLayer08");
53  TGeoVolume* mdtBL09 = new TGeoVolumeAssembly("MdtBarrelLayer09");
54  TGeoVolume* mdtBL10 = new TGeoVolumeAssembly("MdtBarrelLayer10");
55  TGeoVolume* mdtBL11 = new TGeoVolumeAssembly("MdtBarrelLayer11");
56  TGeoVolume* mdtBL12 = new TGeoVolumeAssembly("MdtBarrelLayer12");
57  TGeoVolume* mdtEndcap = new TGeoVolumeAssembly("MdtEndcap");
58  TGeoVolume* mdtEL00 = new TGeoVolumeAssembly("MdtEndcapLayer00");
59  TGeoVolume* mdtEL01 = new TGeoVolumeAssembly("MdtEndcapLayer01");
60  TGeoVolume* mdtEL02 = new TGeoVolumeAssembly("MdtEndcapLayer02");
61  TGeoVolume* mdtEL03 = new TGeoVolumeAssembly("MdtEndcapLayer03");
62  TGeoVolume* mdtEL04 = new TGeoVolumeAssembly("MdtEndcapLayer04");
63  new TGeoVolumeAssembly("MdtEndcapLayer05"); //TGeoVolume* mdtEL05 = //FIXME [R.K. 03/2017] unused variable?
64 
65  //Additional definitions
66  Text_t buffer[30];
67  Text_t longbuffer[250];
68  Double_t mpx, mpy, mpz;
69  Double_t mx0, my0, mz0;
70  Double_t my;
71  int k;
72  Double_t dx1, dx2, dy1, dy2, dz;
73  TGeoRotation tRot, tRotSlice;
74  //Double_t angle; //[R.K. 01/2017] unused variable?
75 
76  FairGeoLoader*geoLoad = FairGeoLoader::Instance();
77  FairGeoInterface *geoFace = geoLoad->getGeoInterface();
78  FairGeoMedia *Media = geoFace->getMedia();
79  FairGeoBuilder *geobuild=geoLoad->getGeoBuilder();
80  FairGeoMedium *medmdtArCO2 = Media->getMedium("MDTMixture");
81  geobuild->createMedium(medmdtArCO2);// Int_t kMedmdtArCO2= //[R.K.03/2017] unused variable
82 
83  //creating the holes
84  new TGeoBBox("hbox1",((Double_t)PndMdt_H01_LengthX)/10.0,((Double_t)PndMdt_H01_LengthZ)/10.0,((Double_t)PndMdt_SVThickness+1.)/10.0,0);
85  new TGeoBBox("hbox2",((Double_t)PndMdt_H02_H)/10.0,10.0+((Double_t)PndMdt_SVThickness)/10.0,((Double_t)PndMdt_H02_V)/10.0,0);
86  new TGeoBBox("hbox3",((Double_t)PndMdt_H03_H)/10.0,10.0+((Double_t)PndMdt_SVThickness)/10.0,((Double_t)PndMdt_H03_V)/10.0,0);
87  new TGeoBBox("hbox4",((Double_t)PndMdt_H04_H)/10.0,10.0+((Double_t)PndMdt_SVThickness)/10.0,((Double_t)PndMdt_H04_V)/10.0,0);
88  new TGeoBBox("hbox5",((Double_t)PndMdt_H05_H)/10.0,10.0+((Double_t)PndMdt_SVThickness)/10.0,((Double_t)PndMdt_H05_V)/10.0,0);
89  new TGeoBBox("hbox6",((Double_t)PndMdt_H06_H)/10.0,10.0+((Double_t)PndMdt_SVThickness)/10.0,((Double_t)PndMdt_H06_V)/10.0,0);
90 
91  //MdtBarrel
92  tRot.RotateX(90.0);
93  mpy = ((Double_t)PndMdt_Barrel_Length)/2.0; // subtract dead space in yoke
94  mpz = (Double_t)PndMdt_SVThickness;
96  for(int i=0; i<13; i++)
97  {
98  switch(i)
99  {
100  case 0:
101  my0 = (Double_t)PndMdt_SV100;
102  break;
103  case 1:
104  my0 = (Double_t)PndMdt_SV101;
105  break;
106  case 2:
107  my0 = (Double_t)PndMdt_SV102;
108  break;
109  case 3:
110  my0 = (Double_t)PndMdt_SV103;
111  break;
112  case 4:
113  my0 = (Double_t)PndMdt_SV104;
114  break;
115  case 5:
116  my0 = (Double_t)PndMdt_SV105;
117  break;
118  case 6:
119  my0 = (Double_t)PndMdt_SV106;
120  break;
121  case 7:
122  my0 = (Double_t)PndMdt_SV107;
123  break;
124  case 8:
125  my0 = (Double_t)PndMdt_SV108;
126  break;
127  case 9:
128  my0 = (Double_t)PndMdt_SV109;
129  break;
130  case 10:
131  my0 = (Double_t)PndMdt_SV110;
132  break;
133  case 11:
134  my0 = (Double_t)PndMdt_SV111;
135  break;
136  case 12:
137  my0 = (Double_t)PndMdt_SV112;
138  break;
139  };
140  my = my0;
141  mpx = (my - mpz)*(TMath::Tan(TMath::ACos(-1.0)/8.0));
142  if (!mdtMagnet) mpx = mpx - 55.; // STE: If realistic magnet, planes are a bit smaller because of the yoke structure (edges)
143  sprintf(buffer,"box%i",i);
144  TGeoBBox* box = new TGeoBBox(buffer,mpx/10.0,mpy/10.0,mpz/10.0,0);
145  TGeoTranslation* tgt = new TGeoTranslation(0.0,mz0/10.0,0.0);
146  tgt->SetName("tgt");
147  tgt->RegisterYourself();
148  sprintf(buffer,"box%i:tgt-hbox1",i);
149  TGeoCompositeShape* tgcs = new TGeoCompositeShape("tgcs",buffer);
150  for(int j=0; j<8; j++)
151  {
152  if(j==0 || j==4)
153  {
154  k=j+2;
155  mx0 = my*TMath::Cos(((Double_t)k)*TMath::ACos(-1.0)/4.0);
156  my0 = my*TMath::Sin(((Double_t)k)*TMath::ACos(-1.0)/4.0);
157  //sprintf(buffer,"muon%i",8*i+j);
158  sprintf(buffer,"MDT%is%il%ib%iw%i", 1, j, i, 0, 0);
159  TGeoVolume* volume = new TGeoVolume(buffer,tgcs,gGeoManager->GetMedium("MDTMixture"));
160  AddSensitiveVolume(volume);
161  volume->SetLineColor(1);
162  // mdtBarrel->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
163  switch(i)
164  {
165  case 0:
166  mdtBL00->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
167  break;
168  case 1:
169  mdtBL01->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
170  break;
171  case 2:
172  mdtBL02->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
173  break;
174  case 3:
175  mdtBL03->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
176  break;
177  case 4:
178  mdtBL04->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
179  break;
180  case 5:
181  mdtBL05->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
182  break;
183  case 6:
184  mdtBL06->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
185  break;
186  case 7:
187  mdtBL07->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
188  break;
189  case 8:
190  mdtBL08->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
191  break;
192  case 9:
193  mdtBL09->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
194  break;
195  case 10:
196  mdtBL10->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
197  break;
198  case 11:
199  mdtBL11->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
200  break;
201  case 12:
202  mdtBL12->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
203  break;
204  };
205  }
206  else
207  {
208  if(j==2 || j==6) k=j-2;
209  else k=j;
210  mx0 = my*TMath::Cos(((Double_t)k)*TMath::ACos(-1.0)/4.0);
211  my0 = my*TMath::Sin(((Double_t)k)*TMath::ACos(-1.0)/4.0);
212  //sprintf(buffer,"muon%i",8*i+j);
213  sprintf(buffer,"MDT%is%il%ib%iw%i", 1, j, i, 0, 0);
214  TGeoVolume* volume = new TGeoVolume(buffer,box,gGeoManager->GetMedium("MDTMixture"));
215  AddSensitiveVolume(volume);
216  volume->SetLineColor(1);
217  // mdtBarrel->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
218  switch(i)
219  {
220  case 0:
221  mdtBL00->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
222  break;
223  case 1:
224  mdtBL01->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
225  break;
226  case 2:
227  mdtBL02->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
228  break;
229  case 3:
230  mdtBL03->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
231  break;
232  case 4:
233  mdtBL04->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
234  break;
235  case 5:
236  mdtBL05->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
237  break;
238  case 6:
239  mdtBL06->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
240  break;
241  case 7:
242  mdtBL07->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
243  break;
244  case 8:
245  mdtBL08->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
246  break;
247  case 9:
248  mdtBL09->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
249  break;
250  case 10:
251  mdtBL10->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
252  break;
253  case 11:
254  mdtBL11->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
255  break;
256  case 12:
257  mdtBL12->AddNode(volume,8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
258  break;
259  };
260  };
261  tRot.RotateZ(-45.0);
262  };
263  };
264 
265  mdtBarrel->AddNode(mdtBL00,1);
266  mdtBarrel->AddNode(mdtBL01,1);
267  mdtBarrel->AddNode(mdtBL02,1);
268  mdtBarrel->AddNode(mdtBL03,1);
269  mdtBarrel->AddNode(mdtBL04,1);
270  mdtBarrel->AddNode(mdtBL05,1);
271  mdtBarrel->AddNode(mdtBL06,1);
272  mdtBarrel->AddNode(mdtBL07,1);
273  mdtBarrel->AddNode(mdtBL08,1);
274  mdtBarrel->AddNode(mdtBL09,1);
275  mdtBarrel->AddNode(mdtBL10,1);
276  mdtBarrel->AddNode(mdtBL11,1);
277  mdtBarrel->AddNode(mdtBL12,1);
278  mdt->AddNode(mdtBarrel,1);
279 
280  //MdtEndcap
281  if (fEndcap=="Fast" || fEndcap=="fast")
282  {
283  TGeoRotation tgrl;
284  tgrl.RotateY(0.0);
285  TGeoRotation* tgr0 = new TGeoRotation(tgrl);
286  tgr0->SetName("tgr0");
287  tgr0->RegisterYourself();
288  tgrl.RotateY(45.0);
289  TGeoRotation* tgr1 = new TGeoRotation(tgrl);
290  tgr1->SetName("tgr1");
291  tgr1->RegisterYourself();
292  tgrl.RotateY(45.0);
293  TGeoRotation* tgr2 = new TGeoRotation(tgrl);
294  tgr2->SetName("tgr2");
295  tgr2->RegisterYourself();
296  tgrl.RotateY(45.0);
297  TGeoRotation* tgr3 = new TGeoRotation(tgrl);
298  tgr3->SetName("tgr3");
299  tgr3->RegisterYourself();
300  tgrl.RotateY(45.0);
301  TGeoRotation* tgr4 = new TGeoRotation(tgrl);
302  tgr4->SetName("tgr4");
303  tgr4->RegisterYourself();
304  tgrl.RotateY(45.0);
305  TGeoRotation* tgr5 = new TGeoRotation(tgrl);
306  tgr5->SetName("tgr5");
307  tgr5->RegisterYourself();
308  tgrl.RotateY(45.0);
309  TGeoRotation* tgr6 = new TGeoRotation(tgrl);
310  tgr6->SetName("tgr6");
311  tgr6->RegisterYourself();
312  tgrl.RotateY(45.0);
313  TGeoRotation* tgr7 = new TGeoRotation(tgrl);
314  tgr7->SetName("tgr7");
315  tgr7->RegisterYourself();
316 
317  dx2 = 0.0;
318  dy1 = (Double_t)PndMdt_SVThickness;
319  dy2 = (Double_t)PndMdt_SVThickness;
320 
321  for(int i=0; i<5; i++)
322  {
323  switch(i)
324  {
325  case 0:
326  mz0 = (Double_t)PndMdt_SV200;
327  break;
328  case 1:
329  mz0 = (Double_t)PndMdt_SV201;
330  break;
331  case 2:
332  mz0 = (Double_t)PndMdt_SV202;
333  break;
334  case 3:
335  mz0 = (Double_t)PndMdt_SV203;
336  break;
337  case 4:
338  mz0 = (Double_t)PndMdt_SV204;
339  break;
340  };
341  if(i==0)
342  {
343  dx1 = ((Double_t)(PndMdt_SV100-15))*(TMath::Tan(TMath::ACos(-1.0)/8.0));
344  my = ((Double_t)(PndMdt_SV100-15))/2.0;
345  dz = ((Double_t)(PndMdt_SV100-15))/2.0;
346  TGeoTranslation* tgt1 = new TGeoTranslation(0.0,0.0,my/(-10.0));
347  tgt1->SetName("tgt1");
348  tgt1->RegisterYourself();
349  new TGeoTrd2("trd1",dx1/10.0,dx2/10.0,dy1/10.0,dy2/10.0,dz/10.0);
350  } else {
351  dx1 = ((Double_t)PndMdt_Endcap_Height)*(TMath::Tan(TMath::ACos(-1.0)/8.0));
352  my = ((Double_t)PndMdt_Endcap_Height)/2.0;
353  dz = ((Double_t)PndMdt_Endcap_Height)/2.0;
354  TGeoTranslation* tgt2 = new TGeoTranslation(0.0,0.0,my/(-10.0));
355  tgt2->SetName("tgt2");
356  tgt2->RegisterYourself();
357  new TGeoTrd2("trd2",dx1/10.0,dx2/10.0,dy1/10.0,dy2/10.0,dz/10.0);
358  };
359  for(int j=0; j<8; j++)
360  {
361  sprintf(buffer,"tgcs%i",(8*i)+j);
362  if(i==0) sprintf(longbuffer,"trd1:tgt1-hbox%i:tgr%i",i+2,j);
363  else sprintf(longbuffer,"trd2:tgt2-hbox%i:tgr%i",i+2,j);
364  TGeoCompositeShape* tgcs = new TGeoCompositeShape(buffer,longbuffer);
365  //sprintf(buffer,"muon%i",200+8*i+j);
366  sprintf(buffer,"MDT%is%il%ib%iw%i", 2, j, i, 0, 0);
367  TGeoVolume* volume = new TGeoVolume(buffer,tgcs,gGeoManager->GetMedium("MDTMixture"));
368  AddSensitiveVolume(volume);
369  volume->SetLineColor(1);
370  // mdtEndcap->AddNode(volume,200+8*i+j,new TGeoCombiTrans(0.0,0.0,mz0/10.0,new TGeoRotation(tRot)));
371  switch(i)
372  {
373  case 0:
374  mdtEL00->AddNode(volume,200+8*i+j,new TGeoCombiTrans(0.0,0.0,mz0/10.0,new TGeoRotation(tRot)));
375  break;
376  case 1:
377  mdtEL01->AddNode(volume,200+8*i+j,new TGeoCombiTrans(0.0,0.0,mz0/10.0,new TGeoRotation(tRot)));
378  break;
379  case 2:
380  mdtEL02->AddNode(volume,200+8*i+j,new TGeoCombiTrans(0.0,0.0,mz0/10.0,new TGeoRotation(tRot)));
381  break;
382  case 3:
383  mdtEL03->AddNode(volume,200+8*i+j,new TGeoCombiTrans(0.0,0.0,mz0/10.0,new TGeoRotation(tRot)));
384  break;
385  case 4:
386  mdtEL04->AddNode(volume,200+8*i+j,new TGeoCombiTrans(0.0,0.0,mz0/10.0,new TGeoRotation(tRot)));
387  break;
388  };
389  tRot.RotateZ(-45.0);
390  };
391  };
392 
393  mdtEndcap->AddNode(mdtEL00,1);
394  mdtEndcap->AddNode(mdtEL01,1);
395  mdtEndcap->AddNode(mdtEL02,1);
396  mdtEndcap->AddNode(mdtEL03,1);
397  mdtEndcap->AddNode(mdtEL04,1);
398  mdt->AddNode(mdtEndcap,1);
399  }
400 
401  vcave->AddNode(mdt,1);
402 
403 // if(mdtMF) PndMdtMuonFilter();
404 
405  return;
406 }
407 // ----------------------------------------------------------------------------
408 
#define PndMdt_H05_H
#define PndMdt_SV201
#define PndMdt_SV100
#define PndMdt_SVThickness
Definition: PndMdtForward.h:23
#define PndMdt_SV111
FairGeoLoader * geoLoad
Int_t i
Definition: run_full.C:25
FairGeoMedia * Media
#define PndMdt_H02_H
#define PndMdt_Barrel_Displacement
static T Sin(const T &x)
Definition: PndCAMath.h:42
#define PndMdt_SV108
float Tan(float x)
Definition: PndCAMath.h:165
#define PndMdt_SV106
#define PndMdt_H03_H
#define PndMdt_SV107
#define PndMdt_H02_V
TGeoManager * gGeoManager
static T Cos(const T &x)
Definition: PndCAMath.h:43
#define PndMdt_H06_V
#define PndMdt_Barrel_Length
#define PndMdt_H05_V
FairGeoBuilder * geobuild
Double_t
#define PndMdt_SV112
#define PndMdt_H01_LengthZ
#define PndMdt_SV101
#define PndMdt_H01_LengthX
#define PndMdt_SV204
#define PndMdt_SV202
#define PndMdt_H04_H
void ConstructGeometryFast()
#define PndMdt_Endcap_Height
#define PndMdt_SV104
Definition: PndMdt.h:20
ClassImp(PndAnaContFact)
#define PndMdt_SV110
#define PndMdt_SV203
#define PndMdt_SV109
#define PndMdt_SV103
#define PndMdt_SV105
FairGeoInterface * geoFace
#define PndMdt_SV200
#define PndMdt_H06_H
#define PndMdt_SV102
#define PndMdt_H04_V
#define PndMdt_H03_V