FairRoot/PandaRoot
modifyRootFscGeometryFile.C
Go to the documentation of this file.
1 {
2 // Macro to create Fsc geometry file
3 // of the FSC detector for PANDA
4 // in root format
5 // with mechanical structure from CAD drawings
6 // fsc_cad2root_mech_support.root - obtained using CAD2RootConverter
7 //03.10.2016 Dmitry Morozov
8 
9  // Fsc geometry parameters
10  // in cm
11  //-----------------------------
12  Double_t beamlineangle = -TMath::DegToRad()*0.0; //in rad
13  const Double_t zpos = 760.0;
14  const Int_t numcellsx = 54;
15  const Int_t numcellsy = 28;
16  const Double_t tyvekbundle = 0.025;
17  const Double_t paperbundle = 0.025;
19  const Double_t Absorb_xsize = 5.5;
20  const Double_t Absorb_ysize = 5.5;
21  const Double_t Air_thickness = 0.0;
22  const Double_t Pb_thickness = 0.0275;
23  const Double_t Sci_thickness = 0.15;
24  const Double_t Sci_xsize = 5.5;
25  const Double_t Sci_ysize = 5.5;
26  const Int_t EMCnumlayers = 380;
27  const Int_t numfibers = 6;
28  const Double_t fiber_r = 0.06;
29  const Double_t fiber_hole_r = 0.07;
30 
31  const Int_t nClsSuperModuleX = 2;
32  const Int_t nClsSuperModuleY = 2;
33 
34  Double_t cellxsize = TMath::Max(Absorb_xsize,Sci_xsize);
35  Double_t cellysize = TMath::Max(Absorb_ysize,Sci_ysize);
36  Double_t suprModXsize = 2.*cellxsize + 2.*crystalspace + Air_thickness;
37  Double_t suprModYsize = 2.*cellysize + 2.*crystalspace + Air_thickness;
38  Double_t xsize = suprModXsize*numcellsx/nClsSuperModuleX;
39  Double_t ysize = suprModYsize*numcellsy/nClsSuperModuleY;
40 
41  Double_t cell_thickness = 2.0*Air_thickness+Pb_thickness+Sci_thickness;
42  Double_t thickness = cell_thickness*EMCnumlayers + 2.*crystalspace;
44 
47  //position of the hole means - coordinate of its center
48  Double_t hole_xpos = 2.0*cellxsize; //Must be left to the beam line (check??)
50 
51 
52  //--------------------------------------------------------------------
53  // gROOT->Macro("$VMCWORKDIR/gconfig/rootlogon.C");
54 
55  // Load this example libraries
56  gSystem->Load("libGeoBase");
57  gSystem->Load("libParBase");
58  gSystem->Load("libBase");
59  gSystem->Load("libPndData");
60  gSystem->Load("libPassive");
61  TString outfile= "new_module5_fsc.root";
62 // TString outfile= "emc_module5_fsc.root";
63  TFile* fi = new TFile(outfile,"RECREATE");
64 
65  FairGeoLoader* geoLoad = new FairGeoLoader("TGeo","FairGeoLoader");
66  FairGeoInterface *geoFace = geoLoad->getGeoInterface();
67 // geoFace->setMediaFile("../../../geometry/media_pnd.geo");
68  geoFace->setMediaFile("$VMCWORKDIR/geometry/media_pnd.geo");
69 // geoFace->setMediaFile("/home/freez/fairsoft_may16p1/pandaroot/geometry/media_pnd.geo");
70  geoFace->readMedia();
71  geoFace->print();
72 
73  FairGeoMedia *Media = geoFace->getMedia();
74  FairGeoBuilder *geobuild=geoLoad->getGeoBuilder();
75 
76  FairGeoMedium *MediumAir = Media->getMedium("air");
77  FairGeoMedium *MediumTyvek = Media->getMedium("tyvek");
78  FairGeoMedium *MediumCarbon = Media->getMedium("carbon");
79  FairGeoMedium *MediumLead = Media->getMedium("lead");
80  FairGeoMedium *MediumScint = Media->getMedium("FscScint");
81  FairGeoMedium *MediumFiber = Media->getMedium("FscFiber");
82 
83  Int_t nmed=geobuild->createMedium(MediumAir);
84  nmed=geobuild->createMedium(MediumTyvek);
85  nmed=geobuild->createMedium(MediumCarbon);
86  nmed=geobuild->createMedium(MediumLead);
87  nmed=geobuild->createMedium(MediumScint);
88  nmed=geobuild->createMedium(MediumFiber);
89 
90  TGeoManager* gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
91 
92  //building main container
93 
94  TGeoVolume *top = new TGeoVolumeAssembly("Emc5");
95 
96  gGeoMan->SetTopVolume(top);
97 // TSrting name = "FscTopShape";
98 //
99 // TGeoShape* TopShape = new TGeoBBox(name,xsize/2.,ysize/2.,thickness/2.);
100 // TGeoVolume *TopVolume = new TGeoVolumeAssembly("FscBox");
101 
102  // Building paper volume to place everything inside it
103  TString name = "FscSuperModuleShape";
104  TGeoShape* SuperModuleShape = new TGeoBBox(name,suprModXsize/2.,suprModYsize/2.,thickness/2.);
105  name = "FscSuperModuleVolume";
106  TString medium = "carbon";
107  TGeoVolume* SuperModuleVolume = new TGeoVolume(name, SuperModuleShape, gGeoMan->GetMedium(medium));
108  SuperModuleVolume->SetLineColor(2);
109 
110  //Building tyvek volume inside paper volume
111  name = "FscTyvekShape";
112  TGeoShape* TyvekShape = new TGeoBBox(name,suprModXsize/2. - paperbundle,suprModYsize/2. - paperbundle,thickness/2. - paperbundle);
113  name = "FscTyvekVolume";
114  medium = "tyvek";
115  TGeoVolume* TyvekVolume = new TGeoVolume(name, TyvekShape, gGeoMan->GetMedium(medium));
116  TyvekVolume->SetLineColor(3);
117  SuperModuleVolume->AddNode(TyvekVolume,0);
118 
119  //Building module volume - 4 of them are inside tyvek volume
120  name = "FscModuleShape";
121  TGeoShape* ModuleShape = new TGeoBBox(name,cellxsize/2.,cellysize/2.,holder_thickness/2.);
122  name = "FscModuleVolume";
123  medium = "air";
124  TGeoVolume* ModuleVolume = new TGeoVolume(name, ModuleShape, gGeoMan->GetMedium(medium));
125  ModuleVolume->SetLineColor(2);
126  TGeoCombiTrans* iCombTrans = NULL;
127  TGeoRotation rot;
128  Int_t iCopy = 0;
130 
131  for (int ix = 1; ix <= nClsSuperModuleX; ix++)
132  {
133  for (int iy = 1; iy <= nClsSuperModuleY; iy++)
134  {
135  x = -cellxsize + 2.*(cellxsize/(Double_t)nClsSuperModuleX)*(ix - 0.5);
136  y = -cellxsize + 2.*(cellxsize/(Double_t)nClsSuperModuleY)*(iy - 0.5);
137  cout<<"===Inside supermodule"<<endl;
138  cout <<"x="<<x<<" y="<<y<<endl;
139  cout <<"ix="<<ix<<" iy="<<iy<<endl;
140 
141  iCombTrans = new TGeoCombiTrans(x,y,0, new TGeoRotation(rot));
142  name = "FscModuleVolume";
143  name+=iCopy;
144  iCombTrans->SetName(name);
145  iCombTrans->RegisterYourself();
146  TyvekVolume->AddNode(ModuleVolume,iCopy,iCombTrans);
147  iCopy++;
148  }
149  }
150 
151  //Building and placing holder (for Scint+Lead layer) volumes inside module volume
152  name = "FscLayerHolderShape";
153  TGeoShape* LayerHolderShape = new TGeoBBox(name, cellxsize/2. - crystalspace, cellysize/2. - crystalspace, cell_thickness/2.);
154  name = "FscLayerHolderVolume";
155  medium = "Air";
156  // TGeoVolume* LayerHolderVolume = new TGeoVolume(name, LayerHolderShape, gGeoMan->GetMedium(medium));
157 
158  TGeoVolume* LayerHolderVolume = new TGeoVolumeAssembly(name);
159 
160 
161  //Building and placing Lead + Scint layer inside holder Volume
162  name = "FscLeadShape";
163  TGeoShape* LeadShape = new TGeoBBox(name, cellxsize/2. - crystalspace, cellysize/2. - crystalspace, Pb_thickness/2.);
164  name = "FscLeadVolume";
165  medium = "lead";
166  TGeoVolume* LeadVolume = new TGeoVolume(name, LeadShape, gGeoMan->GetMedium(medium));
167  LeadVolume->SetLineColor(4);
168  iCombTrans = new TGeoCombiTrans(0,0,-cell_thickness/2.+Pb_thickness/2., new TGeoRotation(rot));
169  LayerHolderVolume->AddNode(LeadVolume,0,iCombTrans);
170 
171  name = "FscSciShape";
172  TGeoShape* SciShape = new TGeoBBox(name, cellxsize/2. - crystalspace, cellysize/2. - crystalspace, Sci_thickness/2.);
173  name = "FscSciVolume";
174  medium = "FscScint";
175  TGeoVolume* SciVolume = new TGeoVolume(name, SciShape, gGeoMan->GetMedium(medium));
176  SciVolume->SetLineColor(5);
177  iCombTrans = new TGeoCombiTrans(0,0,cell_thickness/2.-Sci_thickness/2., new TGeoRotation(rot));
178  LayerHolderVolume->AddNode(SciVolume,0,iCombTrans);
179 
180 
182 // TGeoCombiTrans* iCombTrans = NULL;
183 // TGeoRotation rot;
184  for(int iz = 1; iz <= EMCnumlayers; iz++)
185  {
186  z = -holder_thickness/2. + 0.5 * cell_thickness *(2.*iz - 1.);
187  iCombTrans = new TGeoCombiTrans(0,0,z, new TGeoRotation(rot));
188  name = "FscLayerHolder";
189  name += iz-1;
190  ModuleVolume->AddNode(LayerHolderVolume,iz-1,iCombTrans);
191  }
192 
193 
194  //Building and placing Fibers inside FscModule Volume
195  //Holes for fibers Bottom right corner is (ix = 1, iy = 1)
196  name = "FscFibHoleSHape";
197 // TGeoShape* FiberHoleShape = new TGeoTube(name, 0., fiber_hole_r, (thickness-crystalspace)/2.);
198  TGeoShape* FiberHoleShape = new TGeoTube(name, 0., fiber_hole_r, (holder_thickness)/2.);
199  name = "FscFibHoleVolume";
200  medium = "air";
201  TGeoVolume* FiberHoleVolume = new TGeoVolume(name, FiberHoleShape, gGeoMan->GetMedium(medium));
202  for(int ix = 1; ix<= numfibers; ix++)
203  {
204  for(int iy = 1; iy<= numfibers; iy++)
205  {
206  x = -Absorb_xsize/2. + (Absorb_xsize/(Double_t)numfibers)*(ix - 0.5);
207  y = -Absorb_ysize/2. + (Absorb_ysize/(Double_t)numfibers)*(iy - 0.5);
208 // iCombTrans = new TGeoCombiTrans(x,y,crystalspace, new TGeoRotation(rot));
209  iCombTrans = new TGeoCombiTrans(x,y,0, new TGeoRotation(rot));
210  name = "FscFibHoleVolume";
211  name+=iCopy;
212  iCombTrans->SetName(name);
213  iCombTrans->RegisterYourself();
214 // ModuleVolume->AddNode(FiberHoleVolume,iCopy,iCombTrans);
215 // ModuleVolume->AddNodeOverlap(FiberHoleVolume,iCopy,iCombTrans);
216  ModuleVolume->AddNodeOverlap(FiberHoleVolume,iCopy,iCombTrans);
217 // TyvekVolume->AddNode(FiberHoleVolume,iCopy,iCombTrans);
218  iCopy++;
219  }
220  }
221  //FIbers itself inside holes
222  name = "FscFiberShape";
223 // TGeoShape* FiberShape = new TGeoTube(name, 0., fiber_r, (thickness-crystalspace)/2.);
224  TGeoShape* FiberShape = new TGeoTube(name, 0., fiber_r, (holder_thickness)/2.);
225  name = "FscFiberVolume";
226  medium = "FscFiber";
227  TGeoVolume* FiberVolume = new TGeoVolume(name, FiberShape, gGeoMan->GetMedium(medium));
228  FiberVolume->SetLineColor(5);
229  iCombTrans = new TGeoCombiTrans(0,0,0, new TGeoRotation(rot));
230  FiberHoleVolume->AddNode(FiberVolume,0,iCombTrans);
231 
232 
233  iCopy =0;
234  Int_t CopyCode=0;
235  // placing SuperModules inside top FSC
236  // Bottom right corner is (ix = 1, iy = 1)
237  for(int ix = 1; ix<= numcellsx/nClsSuperModuleX; ix++)
238  {
239  for(int iy = 1; iy<= numcellsy/nClsSuperModuleY; iy++)
240  {
241  x = 0.5 * suprModXsize * (2. * ix - numcellsx/nClsSuperModuleX - 1.);
242  y = 0.5 * suprModYsize * (2. * iy - numcellsy/nClsSuperModuleY - 1.);
243  cout<<"======Supermodules"<<endl;
244  cout <<"x="<<x<<" y="<<y<<endl;
245  cout <<"ix="<<ix<<" iy="<<iy<<endl;
246  if(TMath::Abs(x-hole_xpos)<hole_xsize/2. && TMath::Abs(y-hole_ypos)<hole_ysize/2.) continue;
247  iCombTrans = new TGeoCombiTrans(x,y,0., new TGeoRotation(rot));
248  name = "FscSuperModuleVolume";
249  name+=iCopy;
250  CopyCode = 100*ix+iy;
251 
252  iCombTrans->SetName(name);
253  iCombTrans->RegisterYourself();
254 // top->AddNode(ModuleVolume,iCopy,iCombTrans);
255  top->AddNode(SuperModuleVolume,CopyCode,iCombTrans);
256  iCopy++;
257 
258  }
259  }
260 
261 
262 
263  //Adding mechanical support structure ==================================================================
264 // TString FileName = "/home/freez/fairsoft_may16p1/pandaroot/macro/emc/dedicated/fsc_cad2root_mech_support_addnodeoverlap.root";
265 // TString FileName = "/home/freez/fairsoft_may16p1/pandaroot/macro/emc/dedicated/fsc_cad2root_mech_support.root";
266 // TString FileName = "/home/freez/fairsoft_may16p1/pandaroot/macro/emc/dedicated/fsc_cad2root_mech_support_reduced_overlaps.root";
267 // TString FileName = "/home/freez/fairsoft_may16p1/pandaroot/macro/emc/dedicated/fsc_cad2root_mech_support_reduced_overlaps2.root";
268 // TString FileName = "/home/freez/fairsoft_may16p1/pandaroot/macro/emc/dedicated/fsc_cad2root_mech_support_reduced_overlaps3.root";
269  TString FileName = "fsc_cad2root_mech_support.root";
270  TFile *fb = new TFile(FileName);
271  TGeoVolume *MechFsc=(TGeoVolume *)fb->Get("topNode");
272  fb->Close();
273  MechFsc->Print();
274  MechFsc->PrintNodes();
275 
276  TGeoNode *n=MechFsc->GetNode(0);
277 // gGeoMan->AddVolume(MechFsc);
278 
279  n->Print();
280 
281  TGeoVolume* MFscVol = n->GetVolume();
282 
283  MFscVol->Print();
284 
285  MFscVol->PrintNodes();
286 //==========================================================================================================
287 
288 
289 
290  TGeoRotation rotMechFsc;
291  rotMechFsc.RotateX(-90.);
292  rotMechFsc.RotateY(180.);
293  //DAM version
294 // top->AddNode(MFscVol,0, new TGeoCombiTrans(11.0, 5.5, -38.9, new TGeoRotation(rotMechFsc)));
295  //Slava Moiseev version
296  top->AddNode(MFscVol,0, new TGeoCombiTrans(11.0, 4.8, -38.9, new TGeoRotation(rotMechFsc)));
297 // top->AddNode(MFscVol,0, new TGeoCombiTrans(0, -18.55, 16.6, new TGeoRotation(rotMechFsc)));
298 
299 
300 
301  gGeoMan->CloseGeometry();
302  fi->cd();
303  top->Write();
304  fi->Close();
305  //gGeoMan->Export(outfile);//
306 // gGeoManager->SetVisLevel(5);
307  top->Draw("ogl");//
308 
309 }
Double_t cell_thickness
const Int_t numcellsy
Double_t cellysize
TGeoCombiTrans * iCombTrans
TGeoShape * SuperModuleShape
FairGeoLoader * geoLoad
Double_t xsize
FairGeoMedium * MediumFiber
const Double_t fiber_hole_r
const Double_t Sci_thickness
const Int_t nClsSuperModuleX
TGeoShape * TyvekShape
const Int_t numcellsx
TGeoShape * FiberShape
Double_t crystalspace
Double_t hole_ypos
FairGeoMedium * MediumAir
const Int_t nClsSuperModuleY
TGeoRotation rot
TGeoVolume * MFscVol
FairGeoMedium * MediumCarbon
const Double_t Pb_thickness
TString outfile
TString FileName
TGeoVolume * LayerHolderVolume
const Double_t Sci_xsize
Double_t thickness
Double_t suprModYsize
TGeoShape * SciShape
FairGeoBuilder * geobuild
const Double_t paperbundle
Int_t CopyCode
FairGeoInterface * geoFace
TGeoVolume * ModuleVolume
const Double_t Absorb_xsize
static T Abs(const T &x)
Definition: PndCAMath.h:39
TGeoShape * ModuleShape
const Double_t Air_thickness
TGeoVolume * top
TGeoShape * LayerHolderShape
const Double_t zpos
TGeoVolume * TyvekVolume
Double_t holder_thickness
Double_t y
Double_t z
const Double_t fiber_r
Double_t
TGeoVolume * LeadVolume
FairGeoMedium * MediumTyvek
FairGeoMedium * MediumLead
TGeoVolume * MechFsc
TString medium
TGeoVolume * FiberVolume
const Double_t Absorb_ysize
const Double_t tyvekbundle
TGeoRotation rotMechFsc
TGeoVolume * SuperModuleVolume
TString name
const Double_t Sci_ysize
Double_t ysize
static T Max(const T &x, const T &y)
Definition: PndCAMath.h:36
const Int_t numfibers
Double_t cellxsize
TGeoShape * FiberHoleShape
Double_t x
TFile * fi
TFile * fb
Double_t suprModXsize
const Int_t EMCnumlayers
FairGeoMedia * Media
Double_t hole_xsize
TGeoShape * LeadShape
FairGeoMedium * MediumScint
TGeoManager * gGeoMan
TGeoVolume * FiberHoleVolume
Double_t hole_xpos
Double_t hole_ysize
TGeoNode * n
TGeoVolume * SciVolume