Add undulated version 3 for the PIPE. By S.Chattopadhyay.
[u/mrichter/AliRoot.git] / STRUCT / AliPIPEv3.cxx
1 ///////////////////////////////////////////////////////////////////////////////
2 //                                                                           //
3 //  Beam pipe class                                                          //
4 //                                                                           //
5 //Begin_Html
6 /*
7 <img src="gif/AliPIPEClass.gif">
8 */
9 //End_Html
10 //                                                                           //
11 ///////////////////////////////////////////////////////////////////////////////
12
13 #include "AliPIPEv3.h"
14 #include "AliRun.h"
15 #include "AliMC.h"
16  
17 ClassImp(AliPIPEv3)
18  
19 //_____________________________________________________________________________
20 AliPIPEv3::AliPIPEv3()
21 {
22   //
23   // Default constructor for beam pipe
24   //
25 }
26  
27 //_____________________________________________________________________________
28 AliPIPEv3::AliPIPEv3(const char *name, const char *title)
29        : AliPIPE(name,title)
30 {
31   //
32   // Standard constructor for beam pipe
33   //
34 }
35  
36 //_____________________________________________________________________________
37 void AliPIPEv3::CreateGeometry()
38 {
39   //
40   // Create Beam Pipe geometry
41   //
42   //Begin_Html
43   /*
44     <img src="gif/AliPIPE.gif">
45   */
46   //End_Html
47   //Begin_Html
48   /*
49     <img src="gif/AliPIPETree.gif">
50   */
51   //End_Html
52
53   AliMC* pMC = AliMC::GetMC();
54   
55   Float_t tpar[3], dzmo, zpos;
56   Float_t bepar[3], alpar[3],sspar[3],flange[3],vacpar[3];
57   Float_t bellow[3];
58 //  Float_t undul[3];
59 //  const Double_t z_flange = 150;
60 //for undulated structure
61   char cn18[][5]={"CN01","CN02","CN03","CN04","CN05","CN06","CN07","CN08"};
62   char cn48[][5]={"CN21","CN22","CN23","CN24","CN25","CN26","CN27","CN28"};
63 //  char undul[][5]={'BELO','UNDL'};
64   Float_t zundul;
65   Float_t rundul;
66   Float_t pitch;
67   Float_t thick;
68
69   
70   Int_t *idtmed = gAlice->Idtmed();
71 //     the mother of all beam pipes
72
73   tpar[0] = 0.;
74   tpar[1] = 10.;
75   tpar[2] = 1400. / 2;
76   dzmo = tpar[2];
77   pMC->Gsvolu("QQMO", "TUBE", idtmed[2015], tpar, 3);
78
79 //      All beam pipe details as per the provisonal drawings given by Lars
80 //      Leistam on 31.5.99 
81     
82 //     Beryllium  beam pipe, length 56.6 cm, centered at vertex 
83   
84   bepar[0]=0.0;
85   bepar[1]=3.0;
86   bepar[2]=28.3;
87   zpos=0.0;
88   vacpar[0]=0.0;
89   vacpar[1]=2.9;
90   vacpar[2]=bepar[2];
91   //
92   pMC->Gsvolu("QQBE", "TUBE", idtmed[2004], bepar, 3);
93   pMC->Gsvolu("VAC1", "TUBE", idtmed[2015], vacpar, 3);
94   pMC->Gspos("VAC1", 1, "QQBE", 0., 0., 0., 0, "ONLY");
95   pMC->Gspos("QQBE", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
96   
97   // now beam pipes only in negative z-part for use in PMD.
98  
99   // SS Flange 4 cm thick, 5.8 cm ID, 6.3 cm OD
100   flange[0]=0.0;
101   flange[1]=3.15;
102   flange[2]=2.0;
103   zpos = zpos -bepar[2] - flange[2];
104   vacpar[0]=0.0;
105   vacpar[1]=2.9;
106   vacpar[2]=flange[2];
107   //
108   pMC->Gsvolu("QFL1", "TUBE", idtmed[2018], flange, 3);
109   pMC->Gsvolu("VAC2", "TUBE", idtmed[2015], vacpar, 3);
110   pMC->Gspos("VAC2", 1, "QFL1", 0., 0., 0., 0, "ONLY");
111   pMC->Gspos("QFL1", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
112   
113   // Aluminium alloy beam pipe, 1mm thick, 230 cm long
114   alpar[0]=0.0;
115   alpar[1]=3.0;
116   alpar[2]=115.;
117   zpos = zpos - flange[2] - alpar[2];
118
119   vacpar[0]=0.0;
120   vacpar[1]=2.9;
121   vacpar[2]=alpar[2];
122   pMC->Gsvolu("QQAL", "TUBE", idtmed[2003], alpar, 3);
123   pMC->Gsvolu("VAC3", "TUBE", idtmed[2015], vacpar, 3);
124   pMC->Gspos("VAC3", 1, "QQAL", 0., 0., 0., 0, "ONLY");
125   pMC->Gspos("QQAL", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
126
127  
128   // SS tube 2.0 cm long, 0.8 mm thick, 5.96 cm OD
129
130   sspar[0]=0.0;
131   sspar[1]=2.98;
132   sspar[2]=1.0;
133   zpos = zpos - alpar[2] - sspar[2];
134
135   vacpar[0]=0.0;
136   vacpar[1]=2.9;
137   vacpar[2]=sspar[2];
138   pMC->Gsvolu("QSS1", "TUBE", idtmed[2018], sspar, 3);
139   pMC->Gsvolu("VAC4", "TUBE", idtmed[2015], vacpar, 3);
140   pMC->Gspos("VAC4", 1, "QSS1", 0., 0., 0., 0, "ONLY");
141   pMC->Gspos("QSS1", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
142
143
144  // SS Flange 3 cm thick 7.4 cm OD, 5.8 cm ID
145    
146   flange[0]=0.0;
147   flange[1]=3.7;
148   flange[2]=1.5;
149   zpos = zpos - sspar[2] - flange[2];
150
151   vacpar[0]=0.0;
152   vacpar[1]=2.9;
153   vacpar[2]=flange[2];
154   pMC->Gsvolu("QFL2", "TUBE", idtmed[2018], flange, 3);
155   pMC->Gsvolu("VAC5", "TUBE", idtmed[2015], vacpar, 3);
156   pMC->Gspos("VAC5", 1, "QFL2", 0., 0., 0., 0, "ONLY");
157   pMC->Gspos("QFL2", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
158
159
160   // SS tube 4.0 cm long, 0.8 mm thick, 5.96 cm OD
161
162   sspar[0]=0.0;
163   sspar[1]=2.98;
164   sspar[2]=2.0;
165   zpos = zpos - flange[2] - sspar[2];
166
167   vacpar[0]=0.0;
168   vacpar[1]=2.9;
169   vacpar[2]=sspar[2];
170   pMC->Gsvolu("QSS2", "TUBE", idtmed[2018], sspar, 3);
171   pMC->Gsvolu("VAC6", "TUBE", idtmed[2015], vacpar, 3);
172   pMC->Gspos("VAC6", 1, "QSS2", 0., 0., 0., 0, "ONLY");
173   pMC->Gspos("QSS2", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
174
175
176   // *************
177   // SS Bellow 8.4 cm long, 6.5 cm ID, 7.5 cm OD
178   // 0.8 mm thick material, 0.3 cm pitch.
179   // zundul=4.2, rundul=6.5, thick=0.08
180   // **************
181   pitch=0.3;
182   thick=0.08;
183   zundul=4.2;
184   rundul=6.5;
185   Undulation("BELO",pitch,thick,zundul,rundul,cn18);
186 //
187   bellow[2]=zundul;
188   zpos = zpos - sspar[2] - bellow[2];
189   pMC->Gspos("BELO", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
190
191   // SS tube 20.0 cm long, 0.8 mm thick, 5.96 cm OD
192
193   sspar[0]=0.0;
194   sspar[1]=2.98;
195   sspar[2]=10.0;
196   zpos = zpos - bellow[2] - sspar[2];
197
198   vacpar[0]=0.0;
199   vacpar[1]=2.9;
200   vacpar[2]=sspar[2];
201   pMC->Gsvolu("QSS3", "TUBE", idtmed[2018], sspar, 3);
202   pMC->Gsvolu("VAC7", "TUBE", idtmed[2015], vacpar, 3);
203   pMC->Gspos("VAC7", 1, "QSS3", 0., 0., 0., 0, "ONLY");
204   pMC->Gspos("QSS3", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
205
206   // *************
207   // SS Bellow 8.4 cm long, 6.5 cm ID, 7.5 cm OD
208   // 0.8 mm thick material, 0.3 cm pitch.
209   // **************
210 //  
211   zpos = zpos - sspar[2] - bellow[2];
212   pMC->Gspos("BELO", 2, "QQMO", 0., 0., zpos, 0, "ONLY");
213
214   // SS tube 4.7 cm long, 0.8 mm thick, 
215
216   sspar[0]=0.0;
217   sspar[1]=2.98;
218   sspar[2]=4.7/2.;
219   zpos = zpos - bellow[2] - sspar[2];
220
221   vacpar[0]=0.0;
222   vacpar[1]=2.9;
223   vacpar[2]=sspar[2];
224   pMC->Gsvolu("QSS4", "TUBE", idtmed[2018], sspar, 3);
225   pMC->Gsvolu("VAC8", "TUBE", idtmed[2015], vacpar, 3);
226   pMC->Gspos("VAC8", 1, "QSS4", 0., 0., 0., 0, "ONLY");
227   pMC->Gspos("QSS4", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
228
229   // SS Flange 2.2 cm thick, ID=5.8 cm, OD=9.8 cm
230
231   flange[0]=0.0;
232   flange[1]=4.9;
233   flange[2]=1.1;
234   zpos = zpos - sspar[2] - flange[2];
235
236   vacpar[0]=0.0;
237   vacpar[1]=2.9;
238   vacpar[2]=flange[2];
239   pMC->Gsvolu("QFL3", "TUBE", idtmed[2018], flange, 3);
240   pMC->Gsvolu("VAC9", "TUBE", idtmed[2015], vacpar, 3);
241   pMC->Gspos("VAC9", 1, "QFL3", 0., 0., 0., 0, "ONLY");
242   pMC->Gspos("QFL3", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
243
244 //Total of 3150 mm from vertex on the negative side upto this point.
245
246 // SS tube 20.0 cm long, 0.15 cm thick, 5.8 cm ID, to support vac. pump
247
248   sspar[0]=0.0;
249   sspar[1]=3.05;
250   sspar[2]=10.0;
251   zpos = zpos - flange[2] - sspar[2];
252
253   vacpar[0]=0.0;
254   vacpar[1]=2.9;
255   vacpar[2]=sspar[2];
256   pMC->Gsvolu("QSS5", "TUBE", idtmed[2018], sspar, 3);
257   pMC->Gsvolu("VA10", "TUBE", idtmed[2015], vacpar, 3);
258   pMC->Gspos("VA10", 1, "QSS5", 0., 0., 0., 0, "ONLY");
259   pMC->Gspos("QSS5", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
260
261 // 
262   // last item, undulated SS beam pipe, pitch=0.25, length= 342.0 cm
263   // material thickness 0.015 cm, ID=6.0 cm,
264   // zundul=171.0, thick=0.015, rundul=3.0
265   pitch=0.25;
266   thick=0.015;
267   zundul=171;
268   rundul=3.0;
269   Undulation("UNDL",pitch,thick,zundul,rundul,cn48);
270   //
271   zpos = zpos - sspar[2] - zundul;
272   pMC->Gspos("UNDL", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
273 //
274   pMC->Gspos("QQMO", 1, "ALIC", 0., 0., 0.1, 0, "ONLY");
275
276 //      total of 6770 mm length upto this point, end of undulated beam
277 //      pipe section.
278
279 //      SS flange 22*2 mm thick
280
281
282   flange[0]=0.0;
283   flange[1]=6.3;
284   flange[2]=2.2;
285   zpos = zpos  - zundul - flange[2];
286
287   vacpar[0]=0.0;
288   vacpar[1]=2.9;
289   vacpar[2]=flange[2];
290   pMC->Gsvolu("QFL4", "TUBE", idtmed[2018], flange, 3);
291   pMC->Gsvolu("VC11", "TUBE", idtmed[2015], vacpar, 3);
292   pMC->Gspos("VC11", 1, "QFL4", 0., 0., 0., 0, "ONLY");
293   pMC->Gspos("QFL4", 1, "QQMO", 0., 0., zpos, 0, "ONLY");
294
295 }
296
297 //_____________________________________________________________________________
298 void AliPIPEv3::DrawModule()
299 {  
300   //
301   // Draw a shaded view of the Beam Pipe
302   //
303
304   AliMC* pMC = AliMC::GetMC();
305
306   // Set everything unseen
307   pMC->Gsatt("*", "seen", -1);
308   // 
309   // Set ALIC mother transparent
310   pMC->Gsatt("ALIC","SEEN",0);
311   //
312   // Set the volumes visible
313   pMC->Gsatt("QQMO","seen",1);
314   pMC->Gsatt("QQBE","seen",1);
315   pMC->Gsatt("QFL1","seen",1);
316   pMC->Gsatt("QQAL","seen",1);
317   pMC->Gsatt("QSS1","seen",1);
318   pMC->Gsatt("QFL2","seen",1);
319   pMC->Gsatt("QSS2","seen",1);
320   pMC->Gsatt("QSS3","seen",1);
321   pMC->Gsatt("QSS4","seen",1);
322   pMC->Gsatt("QFL3","seen",1);
323   pMC->Gsatt("QSS5","seen",1);
324   pMC->Gsatt("BELO","seen",1);
325   pMC->Gsatt("UNDL","seen",1);
326   //
327   pMC->Gdopt("hide", "on");
328   pMC->Gdopt("shad", "on");
329   pMC->Gsatt("*", "fill", 7);
330   pMC->SetClipBox(".");
331   pMC->SetClipBox("*", 0, 3000, -3000, 3000, -6000, 6000);
332   pMC->DefaultRange();
333   pMC->Gdraw("alic", 40, 30, 0, 3, 5, .04, .04);
334   pMC->Gdhead(1111, "Beam Pipe");
335   pMC->Gdman(16, 6, "MAN");
336   pMC->Gdopt("hide","off");
337 }
338
339 //_____________________________________________________________________________
340 void AliPIPEv3::CreateMaterials()
341 {
342   //
343   // Create materials for beam pipe
344   //
345
346   Int_t   ISXFLD = gAlice->Field()->Integ();
347   Float_t SXMGMX = gAlice->Field()->Max();
348   
349   Float_t asteel[4] = { 55.847,51.9961,58.6934,28.0855 };
350   Float_t zsteel[4] = { 26.,24.,28.,14. };
351   Float_t wsteel[4] = { .715,.18,.1,.005 };
352   
353   Float_t epsil, stmin, tmaxfd, deemax, stemax;
354   
355   //     STEEL 
356   
357   
358   // --- Define the various materials for GEANT --- 
359   AliMaterial(5, "BERILLIUM$", 9.01, 4., 1.848, 35.3, 36.7);
360   AliMaterial(4, "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 18.5);
361   AliMaterial(16, "VACUUM$ ", 1e-16, 1e-16, 1e-16, 1e16, 1e16);
362   AliMaterial(15, "AIR$      ", 14.61, 7.3, .001205, 30423.24, 67500);
363   AliMixture(19, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
364   
365   // **************** 
366   //     Defines tracking media parameters. 
367   //     Les valeurs sont commentees pour laisser le defaut 
368   //     a GEANT (version 3-21, page CONS200), f.m. 
369   epsil  = .001;  // Tracking precision, 
370   stemax = -1.;   // Maximum displacement for multiple scat 
371   tmaxfd = -20.;  // Maximum angle due to field deflection 
372   deemax = -.3;   // Maximum fractional energy loss, DLS 
373   stmin  = -.8;
374   
375   //    Air 
376   
377   AliMedium(2015, "AIR_L3_US", 15, 0, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin);
378   
379   //    Beryllium 
380   
381   AliMedium(2005, "BE_L3_US", 5, 0, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin);
382
383   
384     //    Aluminium 
385   
386   AliMedium(2004, "AL_L3_US", 4, 0, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin);
387
388   //   Vacuum
389
390   AliMedium(2016, "VA_L3_US", 16, 0, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin);
391   
392   //    Steel 
393   
394   AliMedium(2019, "ST_L3_US", 19, 0, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin);
395 }
396 //
397 void AliPIPEv3::Undulation(char *undul, Float_t pitch, Float_t thick,
398                         Float_t zundul, Float_t rundul, char (*cone)[5])
399 {
400   //
401   // RUNDUL   : Internal radius of the undulated chamber
402   // THICK    : material thickness
403   // PITCH    : one-QUARTER wave of undulation (cm)
404   // ZUNDUL   : half length (cm)
405   //
406   // The undulated structure is desgned as a superposition of eight CONES
407   // of suitable sizes, where the inner/outer radius of the cone increases,
408   // then decreases, each half of the wave is assumed to be a semicircle,
409   // which allows to calculate the thickness and the radii of the cone, by
410   // dividing the semicircle into 4 parts of equal arc length.
411   // Thus apear the constants 0.293 and 0.707.
412   //
413
414   const Float_t const1 = .293;
415   const Float_t const2 = .707;
416
417   AliMC* pMC = AliMC::GetMC();
418
419   // Local variables
420   Int_t j, nwave;
421   Float_t dcone1[5], dcone2[5], dcone3[5], dcone4[5], dcone5[5],
422     dcone6[5], dcone7[5], dcone8[5];
423   Float_t xc, yc, zc, dundul[3];
424   Int_t *idtmed = gAlice->Idtmed();
425
426   // Function Body
427
428   dcone1[0] = const1 * pitch / 2;
429   dcone1[1] = rundul;
430   dcone1[2] = dcone1[1] + thick;
431   dcone1[3] = dcone1[1] + const2 * pitch;
432   dcone1[4] = dcone1[3] + thick;
433
434   dcone2[0] = const2 * pitch / 2;
435   dcone2[1] = dcone1[3];
436   dcone2[2] = dcone1[4];
437   dcone2[3] = dcone2[1] + const1 * pitch;
438   dcone2[4] = dcone2[3] + thick;
439
440   dcone3[0] = dcone2[0];
441   dcone3[1] = dcone2[3];
442   dcone3[2] = dcone2[4];
443   dcone3[3] = dcone2[1];
444   dcone3[4] = dcone2[2];
445
446   dcone4[0] = dcone1[0];
447   dcone4[1] = dcone1[3];
448   dcone4[2] = dcone1[4];
449   dcone4[3] = dcone1[1];
450   dcone4[4] = dcone1[2];
451
452   dcone5[0] = dcone1[0];
453   dcone5[1] = dcone1[1] - thick;
454   dcone5[2] = dcone1[1];
455   dcone5[3] = dcone5[1] - const2 * pitch;
456   dcone5[4] = dcone5[3] + thick;
457
458   dcone6[0] = dcone2[0];
459   dcone6[1] = dcone5[3];
460   dcone6[2] = dcone5[4];
461   dcone6[3] = dcone6[1] - const1 * pitch;
462   dcone6[4] = dcone6[3] + thick;
463   dcone7[0] = dcone6[0];
464   dcone7[1] = dcone6[3];
465   dcone7[2] = dcone6[4];
466   dcone7[3] = dcone5[3];
467   dcone7[4] = dcone5[4];
468
469   dcone8[0] = dcone5[0];
470   dcone8[1] = dcone7[3];
471   dcone8[2] = dcone7[4];
472   dcone8[3] = dcone5[1];
473   dcone8[4] = dcone5[2];
474
475   pMC->Gsvolu(cone[0], "CONE", idtmed[2015], dcone1, 5);
476   pMC->Gsvolu(cone[1], "CONE", idtmed[2015], dcone2, 5);
477   pMC->Gsvolu(cone[2], "CONE", idtmed[2015], dcone3, 5);
478   pMC->Gsvolu(cone[3], "CONE", idtmed[2015], dcone4, 5);
479   pMC->Gsvolu(cone[4], "CONE", idtmed[2015], dcone5, 5);
480   pMC->Gsvolu(cone[5], "CONE", idtmed[2015], dcone6, 5);
481   pMC->Gsvolu(cone[6], "CONE", idtmed[2015], dcone7, 5);
482   pMC->Gsvolu(cone[7], "CONE", idtmed[2015], dcone8, 5);
483   pMC->Gsatt(cone[0], "SEEN", 0);
484   pMC->Gsatt(cone[1], "SEEN", 0);
485   pMC->Gsatt(cone[2], "SEEN", 0);
486   pMC->Gsatt(cone[3], "SEEN", 0);
487   pMC->Gsatt(cone[4], "SEEN", 0);
488   pMC->Gsatt(cone[5], "SEEN", 0);
489   pMC->Gsatt(cone[6], "SEEN", 0);
490   pMC->Gsatt(cone[7], "SEEN", 0);
491
492   // DEFINE AN IMAGINARY TUBE VOLUME FOR UNDULATED CHAMBER, FILL WITH VACUUM
493
494   nwave = Int_t (zundul / (pitch * 2) + .1);
495   dundul[2] = pitch * 2 * nwave;
496   dundul[1] = rundul + pitch + thick * 2;
497   //
498   dundul[0] = 1e-4;
499   pMC->Gsvolu(undul, "TUBE", idtmed[2015], dundul, 3);
500
501   xc = 0;
502   yc = 0;
503   zc = -dundul[2] + dcone1[0];
504   for (j = 1; j <= nwave; ++j) {
505     pMC->Gspos(cone[0], j, undul, xc, yc, zc, 0, "ONLY");
506     zc = zc + dcone1[0] + dcone2[0];
507     pMC->Gspos(cone[1], j, undul, xc, yc, zc, 0, "ONLY");
508     zc = zc + dcone2[0] + dcone3[0];
509     pMC->Gspos(cone[2], j, undul, xc, yc, zc, 0, "ONLY");
510     zc = zc + dcone3[0] + dcone4[0];
511     pMC->Gspos(cone[3], j, undul, xc, yc, zc, 0, "ONLY");
512     zc = zc + dcone4[0] + dcone5[0];
513     pMC->Gspos(cone[4], j, undul, xc, yc, zc, 0, "ONLY");
514     zc = zc + dcone5[0] + dcone6[0];
515     pMC->Gspos(cone[5], j, undul, xc, yc, zc, 0, "ONLY");
516     zc = zc + dcone6[0] + dcone7[0];
517     pMC->Gspos(cone[6], j, undul, xc, yc, zc, 0, "ONLY");
518     zc = zc + dcone7[0] + dcone8[0];
519     pMC->Gspos(cone[7], j, undul, xc, yc, zc, 0, "ONLY");
520     zc = zc + dcone8[0] + dcone1[0];
521   }
522 }