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