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