FairRoot/PandaRoot
PndGeoHypGeTripleCluster.cxx
Go to the documentation of this file.
1 // ******** Implementation of class to build HypGe Triple Cluster Geometry *************
2 // by steinen@kph.uni-mainz.de
4 //#include "PndGeoHypGeCrystal.h"
5 #include <iostream>
6 
7 using namespace std;
8 
10 
11 // ----- Default constructor -------------------------------------------
13 {
14  // Constructor
15 }
16 
17 PndGeoHypGeTripleCluster::PndGeoHypGeTripleCluster(TGeoMedium *ExtGe, TGeoMedium *ExtAl,Int_t ExtClusterNumber)
18 {
19  MakeTop = true;
20 
21  Ge = ExtGe;
22  Al = ExtAl;
23  ClusterNumber= ExtClusterNumber;
24  StartClusterNumber = ExtClusterNumber;
25 
26  NumberOfCryostatEdges =12;
27  NumberOfDifferentZValues = 4;
28  NumberOfXYInput = (NumberOfDifferentZValues*2-1)*2;
29  NumberOfFrontArb8 = 5;
30  NumberOfTopArb8 = NumberOfFrontArb8;
31 
32  //read coordinates from file
33  char* InputTitleBuffer;
34  ZValuesInputArray = new Double_t[NumberOfDifferentZValues];
35  CoordinatesInputArray = new Double_t[NumberOfCryostatEdges*NumberOfXYInput];
36  string Filename = getenv("VMCWORKDIR");
37  Filename +="/hypGe/geometry/PndGeoHypGeTripleClusterParfile.txt";
38 
39  ParametersInputFile.open(Filename.data());
40  FillZValues(NumberOfDifferentZValues);
41  FillInputArray(NumberOfCryostatEdges,NumberOfXYInput);
42  ParametersInputFile.close();
43 
44  CryostatFrontThickness= ZValuesInputArray[1]-ZValuesInputArray[0];
45  CryostatLowerArb8Heigt = ZValuesInputArray[2]-ZValuesInputArray[1];
46  CryostatMiddleArb8Heigt= ZValuesInputArray[3]-ZValuesInputArray[2];
47  //CryostatUpperArb8Heigt= ZValuesInputArray[4]-ZValuesInputArray[3];
48  CryostatTopThickness=0.5;
49 }
50 
51 // ------- destructor --------------
53 {
54  cout << "Destrucor called" << endl;
55  delete Crystal1;
56  delete Crystal2;
57  delete Crystal3;
58  delete Crystal1Rotation;
59  delete Crystal2Rotation;
60  delete Crystal3Rotation;
61 };
62 
63 // --------------- build the crystals --------------------------
64 void PndGeoHypGeTripleCluster::BuildCrystals(Int_t *CrystalNumber)
65 {
66  //create 3 crystal objects. The copy number of a crystal is composed of the number of the cluster and a running number for every placed crystal like e.g.: cluster 4, crystal 9: 409 ; cluster 11, crystal 32: 1132
67  Crystal1Number = *CrystalNumber;
68  *CrystalNumber+=1;
69  Crystal2Number = *CrystalNumber;
70  *CrystalNumber+=1;
71  Crystal3Number = *CrystalNumber;
72  *CrystalNumber+=1;
73  Crystal1 = new PndGeoHypGeCrystal(Ge,Al,100*ClusterNumber+Crystal1Number);
74  Crystal2 = new PndGeoHypGeCrystal(Ge,Al,100*ClusterNumber+Crystal2Number);
75  Crystal3 = new PndGeoHypGeCrystal(Ge,Al,100*ClusterNumber+Crystal3Number);
76 
77  //set positions of the 3 crystals
78 
79  TripleCrystalXOffset = 3.5441;
80  TripleCrystalYOffset = 3.0694;
81  TripleCrystalZOffset = 0.7343;
82 
83  Crystal1Rotation = new TGeoRotation("Crystal1Rotation", -90,4.62,90); //angles measured in CAD drawing
84  Crystal1Rotation ->RegisterYourself();
85  Crystal2Rotation = new TGeoRotation("Crystal2Rotation", 30,4.62,-30);
86  Crystal2Rotation ->RegisterYourself();
87  Crystal3Rotation = new TGeoRotation("Crystal2Rotation", 150,+4.62,-30);
88  Crystal3Rotation ->RegisterYourself();
89 
90 
91  Crystal1Position = new TGeoCombiTrans(TripleCrystalXOffset,0,-TripleCrystalZOffset,Crystal1Rotation);
92  Crystal1Position->RegisterYourself();
93  Crystal2Position = new TGeoCombiTrans(-TripleCrystalXOffset/2,TripleCrystalYOffset,-TripleCrystalZOffset,Crystal2Rotation);
94  Crystal2Position->RegisterYourself();
95  Crystal3Position = new TGeoCombiTrans(-TripleCrystalXOffset/2,-TripleCrystalYOffset,-TripleCrystalZOffset,Crystal3Rotation);
96  Crystal3Position->RegisterYourself();
97 
98 
99 
100 
101 
102 
103  Crystal1->PlaceCrystal(ClusterAssembly,Crystal1Position);
104  Crystal2->PlaceCrystal(ClusterAssembly,Crystal2Position);
105  Crystal3->PlaceCrystal(ClusterAssembly,Crystal3Position);
106 }
107 // --------------- build the cryostat --------------------------
109 {
110  // the cryostat is a combination front, side and top parts. The front and the top is build of 5 TGeoArb8. The side parts are split into 12 lower and 12 middle. All are TGeoArb8. This parts are all combined to a TGeoCompositeShape
111 
112  string CompositeShapeExpression;
113 //the front of the cryostat
114 
115  CryostatFrontArb8XY_1 = new Double_t[16];
116  BuildTArb8FrontArray(CryostatFrontArb8XY_1, 2,3,4,1, NumberOfXYInput);
117  CryostatFrontArb8XY_2 = new Double_t[16];
118  BuildTArb8FrontArray(CryostatFrontArb8XY_2, 5,6,7,4, NumberOfXYInput);
119  CryostatFrontArb8XY_3 = new Double_t[16];
120  BuildTArb8FrontArray(CryostatFrontArb8XY_3, 4,7,8,1, NumberOfXYInput);
121  CryostatFrontArb8XY_4 = new Double_t[16];
122  BuildTArb8FrontArray(CryostatFrontArb8XY_4, 8,9,12,1, NumberOfXYInput);
123  CryostatFrontArb8XY_5 = new Double_t[16];
124  BuildTArb8FrontArray(CryostatFrontArb8XY_5, 9,10,11,12, NumberOfXYInput);
125 
126  CryostatFrontArb8_1 = new TGeoArb8 ("CryostatTripleFrontArb8_1",CryostatFrontThickness/2,CryostatFrontArb8XY_1);
127  CryostatFrontArb8_2 = new TGeoArb8 ("CryostatTripleFrontArb8_2",CryostatFrontThickness/2,CryostatFrontArb8XY_2);
128  CryostatFrontArb8_3 = new TGeoArb8 ("CryostatTripleFrontArb8_3",CryostatFrontThickness/2,CryostatFrontArb8XY_3);
129  CryostatFrontArb8_4 = new TGeoArb8 ("CryostatTripleFrontArb8_4",CryostatFrontThickness/2,CryostatFrontArb8XY_4);
130  CryostatFrontArb8_5 = new TGeoArb8 ("CryostatTripleFrontArb8_5",CryostatFrontThickness/2,CryostatFrontArb8XY_5);
131 
132  CryostatFrontTranslation = new TGeoTranslation("CryostatTripleFrontTranslation",0,0,CryostatFrontThickness/2);
133  CryostatFrontTranslation->RegisterYourself();
134 
135  for (Int_t i = 1; i < NumberOfFrontArb8+1; i++)
136  {
137  char buffer[100];
138  sprintf(buffer, "CryostatTripleFrontArb8_%d : CryostatTripleFrontTranslation",i);
139  CompositeShapeExpression += buffer;
140  //if (i<NumberOfFrontArb8) //uncomment if last part of composite shape
141  {
142  CompositeShapeExpression += "+";
143  }
144  }
145 
146 //the lower part of the cryostat
147 
148  CryostatLowerArb8XY_1 = new Double_t[16];
149  BuildTArb8Array(CryostatLowerArb8XY_1, 1,2,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
150  CryostatLowerArb8XY_2 = new Double_t[16];
151  BuildTArb8Array(CryostatLowerArb8XY_2, 2,3,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
152  CryostatLowerArb8XY_3 = new Double_t[16];
153  BuildTArb8Array(CryostatLowerArb8XY_3, 3,4,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
154  CryostatLowerArb8XY_4 = new Double_t[16];
155  BuildTArb8Array(CryostatLowerArb8XY_4, 4,5,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
156  CryostatLowerArb8XY_5 = new Double_t[16];
157  BuildTArb8Array(CryostatLowerArb8XY_5, 5,6,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
158  CryostatLowerArb8XY_6 = new Double_t[16];
159  BuildTArb8Array(CryostatLowerArb8XY_6, 6,7,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
160  CryostatLowerArb8XY_7 = new Double_t[16];
161  BuildTArb8Array(CryostatLowerArb8XY_7, 7,8,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
162  CryostatLowerArb8XY_8 = new Double_t[16];
163  BuildTArb8Array(CryostatLowerArb8XY_8, 8,9,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
164  CryostatLowerArb8XY_9 = new Double_t[16];
165  BuildTArb8Array(CryostatLowerArb8XY_9, 9,10,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
166  CryostatLowerArb8XY_10 = new Double_t[16];
167  BuildTArb8Array(CryostatLowerArb8XY_10, 10,11,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
168  CryostatLowerArb8XY_11 = new Double_t[16];
169  BuildTArb8Array(CryostatLowerArb8XY_11, 11,12,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
170  CryostatLowerArb8XY_12 = new Double_t[16];
171  BuildTArb8Array(CryostatLowerArb8XY_12, 12,1,1,2, NumberOfDifferentZValues-1, NumberOfXYInput);
172 
173 
174  CryostatLowerArb8_1 = new TGeoArb8 ("CryostatTripleLowerArb8_1",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_1);
175  CryostatLowerArb8_2 = new TGeoArb8 ("CryostatTripleLowerArb8_2",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_2);
176  CryostatLowerArb8_3 = new TGeoArb8 ("CryostatTripleLowerArb8_3",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_3);
177  CryostatLowerArb8_4 = new TGeoArb8 ("CryostatTripleLowerArb8_4",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_4);
178  CryostatLowerArb8_5 = new TGeoArb8 ("CryostatTripleLowerArb8_5",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_5);
179  CryostatLowerArb8_6 = new TGeoArb8 ("CryostatTripleLowerArb8_6",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_6);
180  CryostatLowerArb8_7 = new TGeoArb8 ("CryostatTripleLowerArb8_7",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_7);
181  CryostatLowerArb8_8 = new TGeoArb8 ("CryostatTripleLowerArb8_8",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_8);
182  CryostatLowerArb8_9 = new TGeoArb8 ("CryostatTripleLowerArb8_9",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_9);
183  CryostatLowerArb8_10 = new TGeoArb8 ("CryostatTripleLowerArb8_10",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_10);
184  CryostatLowerArb8_11 = new TGeoArb8 ("CryostatTripleLowerArb8_11",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_11);
185  CryostatLowerArb8_12 = new TGeoArb8 ("CryostatTripleLowerArb8_12",CryostatLowerArb8Heigt/2,CryostatLowerArb8XY_12);
186 
187  CryostatLowerTranslation = new TGeoTranslation("CryostatTripleLowerTranslation",0,0,CryostatFrontThickness+CryostatLowerArb8Heigt/2);
188  CryostatLowerTranslation->RegisterYourself();
189 
190  for (Int_t i = 1; i < NumberOfCryostatEdges+1; i++)
191  {
192  char buffer[100];
193  sprintf(buffer, "CryostatTripleLowerArb8_%d : CryostatTripleLowerTranslation",i);
194  CompositeShapeExpression += buffer;
195  //if (i<NumberOfCryostatEdges) //uncomment if last part of composite shape
196  {
197  CompositeShapeExpression += "+";
198  }
199  }
200 
201 //the middle part of the cryostat
202 
203  CryostatMiddleArb8XY_1 = new Double_t[16];
204  BuildTArb8Array(CryostatMiddleArb8XY_1, 1,2,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
205  CryostatMiddleArb8XY_2 = new Double_t[16];
206  BuildTArb8Array(CryostatMiddleArb8XY_2, 2,3,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
207  CryostatMiddleArb8XY_3 = new Double_t[16];
208  BuildTArb8Array(CryostatMiddleArb8XY_3, 3,4,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
209  CryostatMiddleArb8XY_4 = new Double_t[16];
210  BuildTArb8Array(CryostatMiddleArb8XY_4, 4,5,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
211  CryostatMiddleArb8XY_5 = new Double_t[16];
212  BuildTArb8Array(CryostatMiddleArb8XY_5, 5,6,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
213  CryostatMiddleArb8XY_6 = new Double_t[16];
214  BuildTArb8Array(CryostatMiddleArb8XY_6, 6,7,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
215  CryostatMiddleArb8XY_7 = new Double_t[16];
216  BuildTArb8Array(CryostatMiddleArb8XY_7, 7,8,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
217  CryostatMiddleArb8XY_8 = new Double_t[16];
218  BuildTArb8Array(CryostatMiddleArb8XY_8, 8,9,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
219  CryostatMiddleArb8XY_9 = new Double_t[16];
220  BuildTArb8Array(CryostatMiddleArb8XY_9, 9,10,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
221  CryostatMiddleArb8XY_10 = new Double_t[16];
222  BuildTArb8Array(CryostatMiddleArb8XY_10, 10,11,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
223  CryostatMiddleArb8XY_11 = new Double_t[16];
224  BuildTArb8Array(CryostatMiddleArb8XY_11, 11,12,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
225  CryostatMiddleArb8XY_12 = new Double_t[16];
226  BuildTArb8Array(CryostatMiddleArb8XY_12, 12,1,2,3, NumberOfDifferentZValues-1, NumberOfXYInput);
227 
228 
229  CryostatMiddleArb8_1 = new TGeoArb8 ("CryostatTripleMiddleArb8_1",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_1);
230  CryostatMiddleArb8_2 = new TGeoArb8 ("CryostatTripleMiddleArb8_2",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_2);
231  CryostatMiddleArb8_3 = new TGeoArb8 ("CryostatTripleMiddleArb8_3",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_3);
232  CryostatMiddleArb8_4 = new TGeoArb8 ("CryostatTripleMiddleArb8_4",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_4);
233  CryostatMiddleArb8_5 = new TGeoArb8 ("CryostatTripleMiddleArb8_5",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_5);
234  CryostatMiddleArb8_6 = new TGeoArb8 ("CryostatTripleMiddleArb8_6",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_6);
235  CryostatMiddleArb8_7 = new TGeoArb8 ("CryostatTripleMiddleArb8_7",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_7);
236  CryostatMiddleArb8_8 = new TGeoArb8 ("CryostatTripleMiddleArb8_8",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_8);
237  CryostatMiddleArb8_9 = new TGeoArb8 ("CryostatTripleMiddleArb8_9",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_9);
238  CryostatMiddleArb8_10 = new TGeoArb8 ("CryostatTripleMiddleArb8_10",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_10);
239  CryostatMiddleArb8_11 = new TGeoArb8 ("CryostatTripleMiddleArb8_11",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_11);
240  CryostatMiddleArb8_12 = new TGeoArb8 ("CryostatTripleMiddleArb8_12",CryostatMiddleArb8Heigt/2,CryostatMiddleArb8XY_12);
241 
242  CryostatMiddleTranslation = new TGeoTranslation("CryostatTripleMiddleTranslation",0,0,CryostatFrontThickness +CryostatLowerArb8Heigt+CryostatMiddleArb8Heigt/2);
243  CryostatMiddleTranslation->RegisterYourself();
244 
245  for (Int_t i = 1; i < NumberOfCryostatEdges+1; i++)
246  {
247  char buffer[100];
248  sprintf(buffer, "CryostatTripleMiddleArb8_%d : CryostatTripleMiddleTranslation",i);
249  CompositeShapeExpression += buffer;
250  if (i< NumberOfCryostatEdges)
251  {
252  CompositeShapeExpression += "+";
253  }
254  if (i==NumberOfCryostatEdges && MakeTop )
255  {
256  CompositeShapeExpression += "+";
257  }
258  }
259 
260 //the top of the cryostat
261 
262  CryostatTopArb8XY_1 = new Double_t[16];
263  BuildTArb8TopArray(CryostatTopArb8XY_1, 2,3,4,1, NumberOfDifferentZValues-1, NumberOfXYInput);
264  CryostatTopArb8XY_2 = new Double_t[16];
265  BuildTArb8TopArray(CryostatTopArb8XY_2, 5,6,7,4, NumberOfDifferentZValues-1, NumberOfXYInput);
266  CryostatTopArb8XY_3 = new Double_t[16];
267  BuildTArb8TopArray(CryostatTopArb8XY_3, 4,7,8,1, NumberOfDifferentZValues-1, NumberOfXYInput);
268  CryostatTopArb8XY_4 = new Double_t[16];
269  BuildTArb8TopArray(CryostatTopArb8XY_4, 8,9,12,1, NumberOfDifferentZValues-1, NumberOfXYInput);
270  CryostatTopArb8XY_5 = new Double_t[16];
271  BuildTArb8TopArray(CryostatTopArb8XY_5, 9,10,11,12, NumberOfDifferentZValues-1, NumberOfXYInput);
272 
273  CryostatTopArb8_1 = new TGeoArb8 ("CryostatTripleTopArb8_1",CryostatTopThickness/2,CryostatTopArb8XY_1);
274  CryostatTopArb8_2 = new TGeoArb8 ("CryostatTripleTopArb8_2",CryostatTopThickness/2,CryostatTopArb8XY_2);
275  CryostatTopArb8_3 = new TGeoArb8 ("CryostatTripleTopArb8_3",CryostatTopThickness/2,CryostatTopArb8XY_3);
276  CryostatTopArb8_4 = new TGeoArb8 ("CryostatTripleTopArb8_4",CryostatTopThickness/2,CryostatTopArb8XY_4);
277  CryostatTopArb8_5 = new TGeoArb8 ("CryostatTripleTopArb8_5",CryostatTopThickness/2,CryostatTopArb8XY_5);
278 
279  CryostatTopTranslation = new TGeoTranslation("CryostatTripleTopTranslation",0,0,CryostatFrontThickness +CryostatLowerArb8Heigt+CryostatMiddleArb8Heigt+CryostatUpperArb8Heigt+CryostatTopThickness/2);
280  CryostatTopTranslation->RegisterYourself();
281 
282 
283  if (MakeTop)
284  {
285  for (Int_t i = 1; i < NumberOfTopArb8+1; i++)
286  {
287  char buffer[100];
288  sprintf(buffer, "CryostatTripleTopArb8_%d : CryostatTripleTopTranslation",i);
289  CompositeShapeExpression += buffer;
290  if (i<NumberOfTopArb8) //uncomment if last part of composite shape
291  {
292  CompositeShapeExpression += "+";
293  }
294  }
295  }
296 
297  //cout << CompositeShapeExpression << endl;
298 
299 
300  //combine the cryostat
301  CryostatShape = new TGeoCompositeShape("CryostatShape",CompositeShapeExpression.data() );
302  Cryostat = new TGeoVolume("Cryostat",CryostatShape,Al);
303  Cryostat->SetLineColor(kGreen);
304  Cryostat->SetFillColor(kGreen);
305  //bring the Cryostat in the right position
306  CryostatCombiTrans = new TGeoCombiTrans("CryostatCombiTrans",0,0,0,new TGeoRotation("CryostatRotation",0,180,0));
307  CryostatCombiTrans->RegisterYourself();
308 
309  ClusterAssembly->AddNode(Cryostat,ClusterNumber,CryostatCombiTrans);
310 };
311 
312 // --------------- Prints the nodes of a cluster -----------------
314 {
315  if (nLevels == 0)
316  {
317  cout << "Nothing to Print, use higher number to go deeper in the tree." << endl;
318  }
319  if (nLevels > 0)
320  {
321  cout << "Printing the content of the cluster assembly." << endl;
322  cout <<endl << "Number of Nodes in cluster assembly: " << ClusterAssembly->GetNdaughters() << endl;
323  ClusterAssembly->PrintNodes();
324  }
325  if (nLevels > 1)
326  {
327  cout << "Printing the content of the crystal assemblies." << endl;
328  cout <<endl<< "Number of Nodes in crystal assembly 1: " << Crystal1->GetNdaughters() << endl;
329  Crystal1->PrintNodes();
330  cout <<endl<< "Number of Nodes in crystal assembly 2: " << Crystal2->GetNdaughters() << endl;
331  Crystal2->PrintNodes();
332  cout <<endl << "Number of Nodes in crystal assembly 3: " << Crystal3->GetNdaughters() << endl;
333  Crystal3->PrintNodes();
334  }
335 }
Int_t i
Definition: run_full.C:25
void BuildCrystals(Int_t *CrystalNumber)
Double_t
ClassImp(PndAnaContFact)