]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ZDC/AliZDC.cxx
Make default version without cross-bars
[u/mrichter/AliRoot.git] / ZDC / AliZDC.cxx
1 ///////////////////////////////////////////////////////////////////////////////
2 //                                                                           //
3 //  Zero Degree Calorimeter                                                  //
4 //  This class contains the basic functions for the Time Of Flight           //
5 //  detector. Functions specific to one particular geometry are              //
6 //  contained in the derived classes                                         //
7 //                                                                           //
8 //Begin_Html
9 /*
10 <img src="picts/AliZDCClass.gif">
11 </pre>
12 <br clear=left>
13 <font size=+2 color=red>
14 <p>The responsible person for this module is
15 <a href="mailto:Eugenio.Scomparin@cern.ch">Eugenio Scomparin</a>.
16 </font>
17 <pre>
18 */
19 //End_Html
20 //                                                                           //
21 //                                                                           //
22 ///////////////////////////////////////////////////////////////////////////////
23
24 #include <TBRIK.h>
25 #include <TNode.h>
26
27 #include "AliZDC.h"
28 #include "AliRun.h"
29 #include "AliCallf77.h"
30 #include "AliConst.h"
31 #include "AliMC.h"
32
33 #ifndef WIN32
34 # define zdc_init       zdc_init_
35 # define zdc_step       zdc_step_
36 # define zdc_setbeam    zdc_setbeam_
37 # define zdc_sethijing  zdc_sethijing_
38 # define zdc_setvenus   zdc_setvenus_
39 # define zdc_setkine    zdc_setkine_
40 #else
41 # define zdc_step       ZDC_STEP
42 # define zdc_setbeam    ZDC_SETBEAM
43 # define zdc_sethijing  ZDC_SETHIJING
44 # define zdc_setvenus   ZDC_SETVENUS
45 # define zdc_setkine    ZDC_SETKINE
46 #endif
47
48 extern "C" void type_of_call zdc_init();
49 extern "C" void type_of_call zdc_step();
50 extern "C" void type_of_call zdc_setbeam(Int_t beam, Float_t fx, Float_t fy,
51                                          Float_t sx, Float_t sy, Float_t div,
52                                          Float_t angle, Int_t cross);
53 extern "C" void type_of_call zdc_sethijing(Int_t hij, Int_t hijf, Int_t hijsp,
54                                            DEFCHARD DEFCHARL);
55 extern "C" void type_of_call zdc_setvenus(Int_t hiv, Int_t hivf, Int_t hivsp,
56                                           DEFCHARD DEFCHARL);
57 extern "C" void type_of_call zdc_setkine(Int_t code, Float_t pmom, Float_t cx,
58                                          Float_t cy, Float_t cz, Int_t type,
59                                          Int_t fermi);
60  
61 ClassImp(AliZDC)
62  
63 //_____________________________________________________________________________
64 AliZDC::AliZDC()
65 {
66   //
67   // Default constructor for the Zero Degree Calorimeter base class
68   //
69   fIshunt   = 0;
70 }
71  
72 //_____________________________________________________________________________
73 AliZDC::AliZDC(const char *name, const char *title)
74   : AliDetector(name,title)
75 {
76   //
77   // Standard constructor for the Zero Degree Calorimeter base class
78   //
79
80   //
81   // Allocate the array of hits
82   fHits   = new TClonesArray("AliZDChit",  405);
83   
84   fIshunt     =  1;
85 }
86  
87 //_____________________________________________________________________________
88 void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits)
89 {
90   //
91   // Add a Zero Degree Calorimeter hit
92   //
93   TClonesArray &lhits = *fHits;
94   new(lhits[fNhits++]) AliZDChit(fIshunt,track,vol,hits);
95 }
96  
97 //_____________________________________________________________________________
98 void AliZDC::BuildGeometry()
99 {
100   //
101   // Build the ROOT TNode geometry for event display 
102   // in the Zero Degree Calorimeter
103   // This routine is dummy for the moment
104   //
105
106   //  TNode *Node, *Top;
107   //  TBRIK *brik;
108   //  const int kColorZDC  = kRed;
109   
110   //
111   // Top=gAlice->GetGeometry()->GetNode("alice");
112   
113   // ZDC
114   /*
115     brik = new TBRIK("S_ZDC","ZDC box","void",300,300,5);
116     Top->cd();
117     Node = new TNode("ZDC","ZDC","S_ZDC",0,0,600,"");
118     Node->SetLineColor(kColorZDC);
119     fNodes->Add(Node);
120   */
121 }
122
123 //_____________________________________________________________________________
124 Int_t AliZDC::DistancetoPrimitive(Int_t , Int_t )
125 {
126   //
127   // Distance from the mouse to the Zero Degree Calorimeter
128   // Dummy routine
129   //
130   return 9999;
131 }
132  
133 //_____________________________________________________________________________
134 void AliZDC::SetBeam(Int_t beam, Float_t fx, Float_t fy, Float_t sx,
135                      Float_t sy, Float_t div, Float_t angle, Int_t cross)
136 {
137   //
138   // Set beam characteristic
139   // This routine has to be revised as it is disconnected from the
140   // actual generation in this version of AliRoot
141   //
142
143   // beam  : 1 = gaussian beam
144   //       : 2 = uniform beam
145   // fx    : x-coordinate of beam offset
146   // fy    : y-coordinate of beam offset
147   // sx    : sigma-x of the beam (gaussian or uniform)
148   // sy    : sigma-y of the beam (gaussian or uniform)
149   // div   : divergency of the beam (32*10**-6 rad for LHC)
150   // angle : beam crossing angle (100*10**-6 rad for LHC)
151   // cross : 1 = horizontal beam crossing
152   //       : 2 = vertical beam crossing
153   zdc_setbeam(beam,fx,fy,sx,sy,div,angle,cross);
154 }
155
156 //_____________________________________________________________________________
157 void AliZDC::SetHijing(Int_t hij, Int_t hijf, Int_t hijsp, const char *file)
158 {
159   //
160   // Set the parameter for the HIJING generation
161   // This routine has to be revised as it is disconnected from the
162   // actual generation in this version of AliRoot
163   //
164
165   // HIJ  : 1 = read HIJING event file
166   //      : 2 =  "     "      "    "    + debug
167   // HIJF : event number of the first event to be read from file
168   // HIJSP: 0 = read all particles
169   //      : 1 = remove spectator nucleons
170   zdc_sethijing(hij,hijf,hijsp, PASSCHARD(file) PASSCHARL(file));
171 }
172
173 //_____________________________________________________________________________
174 void AliZDC::SetVenus(Int_t hiv, Int_t hivf, Int_t hivsp, const char *file)
175 {
176   //
177   // Set the parameter for the VENUS generation
178   // This routine has to be revised as it is disconnected from the
179   // actual generation in this version of AliRoot
180   //
181
182   // HIV  : 1 = read VENUS event file
183   //      : 2 =  "     "      "    "    + debug
184   // HIVF : event number of the first event to be read from file
185   // HIVSP: 0 = read all particles
186   //      : 1 = remove spectator nucleons
187   zdc_setvenus(hiv,hivf,hivsp, PASSCHARD(file) PASSCHARL(file));
188 }
189
190 //_____________________________________________________________________________
191 void AliZDC::SetKine(Int_t code, Float_t pmom, Float_t cx, Float_t cy,
192                      Float_t cz, Int_t type, Int_t fermi)
193 {
194   //
195   // Set the parameter for the event generation
196   // This routine has to be revised as it is disconnected from the
197   // actual generation in this version of AliRoot
198   //
199
200   // code     : GEANT code of the test particle
201   // pmom     : absolute value of particle momentum
202   // cx,cy,cz : director cosines of the track (if type)
203   // type     :  0 = take director cosines from cx,cy,cz
204   //          : <>0 = pseudorapidity of the test particle
205   // fermi    : 0 = no Fermi motion for the spectator nucleons
206   //          : 1 = Fermi motion for the spectator nucleons
207   zdc_setkine(code,pmom,cx,cy,cz,type,fermi);
208 }
209  
210 //_____________________________________________________________________________
211 void AliZDC::StepManager()
212 {
213   //
214   // Routine called at every step in the Zero Degree Calorimeter
215   // This is a simple interface to the FORTRAN routine
216   // A step manager should be written
217   //
218   zdc_step();
219 }
220
221  
222 ClassImp(AliZDCv1)
223  
224
225 ///////////////////////////////////////////////////////////////////////////////
226 //                                                                           //
227 //  Zero Degree Calorimeter version 1                                        //
228 //                                                                           //
229 //Begin_Html
230 /*
231 <img src="picts/AliZDCv1Class.gif">
232 */
233 //End_Html
234 //                                                                           //
235 //                                                                           //
236 ///////////////////////////////////////////////////////////////////////////////
237
238 //_____________________________________________________________________________
239 AliZDCv1::AliZDCv1() : AliZDC()
240 {
241   //
242   // Default constructor for Zero Degree Calorimeter
243   //
244 }
245  
246 //_____________________________________________________________________________
247 AliZDCv1::AliZDCv1(const char *name, const char *title)
248   : AliZDC(name,title)
249 {
250   //
251   // Standard constructor for Zero Degree Calorimeter 
252   //
253 }
254  
255 //_____________________________________________________________________________
256 void AliZDCv1::CreateGeometry()
257 {
258   //
259   // Create the geometry for the Zero Degree Calorimeter version 1
260   // -- Author :    E Scomparin
261   //
262   //Begin_Html
263   /*
264     <img src="picts/AliZDCv1.gif">
265   */
266   //End_Html
267   //Begin_Html
268   /*
269     <img src="picts/AliZDCv1Tree.gif">
270   */
271   //End_Html
272
273   // The following variables were illegaly initialized in zdc_init.
274   // These variables should become data members of this class
275   // once zdc_init has been converted
276   //* Initialize COMMON block ZDC_CGEOM
277   //*
278   
279   const Int_t NZPTX=4;
280   const Int_t NZPTY=1;
281   const Int_t NZNTX=2;
282   const Int_t NZNTY=2;
283   
284   Float_t HDZN[3]  = {4.0,4.0,50.0};
285   Float_t HDZP[3]  = {10.0,6.0,75.0};
286   // Coordinates of the center of the ZDC front face in the MRS
287   Float_t ZNPOS[3] = {-0.5,0.,11613.};
288   Float_t ZPPOS[3] = {-21.0,0.,11563.};
289   Float_t FIZN[3]  = {0.,0.01825,50.0};
290   Float_t FIZP[3]  = {0.,0.01825,75.0};
291   Float_t GRZN[3]  = {0.025,0.025,50.0};
292   Float_t GRZP[3]  = {0.040,0.040,75.0};
293   Int_t NCEN[3]    = {11,11,0};
294   Int_t NCEP[3]    = {10,10,0};
295   
296   Float_t angle;
297   Float_t zq, conpar[9], tubpar[3];
298   Int_t im1, im2;
299   Float_t zd1, zd2;
300   
301   
302   Int_t *idtmed = fIdtmed->GetArray()-799;
303   
304   // -- Mother of the ZDC 
305   conpar[0] = 0.;
306   conpar[1] = 360.;
307   conpar[2] = 2.;
308   conpar[3] = 1920.;
309   conpar[4] = 0.;
310   conpar[5] = 55.;
311   conpar[6] = 13060.;
312   conpar[7] = 0.;
313   conpar[8] = 55.;
314   gMC->Gsvolu("ZDC ", "PCON", idtmed[891], conpar, 9);
315   gMC->Gspos("ZDC ", 1, "ALIC", 0., 0., 0., 0, "ONLY");
316   // -- FIRST SECTION OF THE BEAM PIPE (from compensator dipole to 
317   //    beginning of D1) 
318   
319   zd1 = 1920.;
320   
321   tubpar[0] = 2.3;
322   tubpar[1] = 2.5;
323   tubpar[2] = 1961.75;
324   gMC->Gsvolu("P001", "TUBE", idtmed[851], tubpar, 3);
325   gMC->Gspos("P001", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
326   
327   //-- SECOND SECTION OF THE BEAM PIPE (FROM THE END OF D1 TO THE BEGINNING OF
328   //    D2) 
329   
330   zd1 = 6316.+472.5;
331   
332   tubpar[0] = 7.3/2.;
333   tubpar[1] = 7.7/2.;
334   tubpar[2] = 90.*0.5;
335   gMC->Gsvolu("P002", "TUBE", idtmed[851], tubpar, 3);
336   gMC->Gspos("P002", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
337   
338   zd1 += tubpar[2] * 2.;
339   
340   tubpar[0] = 7.3/2.;
341   tubpar[1] = 7.7/2.;
342   tubpar[2] = 10.*0.5;
343   gMC->Gsvolu("P003", "TUBE", idtmed[851], tubpar, 3);
344   gMC->Gspos("P003", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
345   
346   zd1 += tubpar[2] * 2.;
347   
348   conpar[0] = 3.16/2.;
349   conpar[1] = 7.3/2.;
350   conpar[2] = 7.7/2.;
351   conpar[3] = 9.8/2.;
352   conpar[4] = 10.0/2.;
353   gMC->Gsvolu("P004", "CONE", idtmed[851], conpar, 5);
354   gMC->Gspos("P004", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
355   
356   zd1 += conpar[0] * 2.;
357   
358   tubpar[0] = 9.8/2.;
359   tubpar[1] = 10.0/2;
360   tubpar[2] = 490./2.;
361   gMC->Gsvolu("P005", "TUBE", idtmed[851], tubpar, 3);
362   gMC->Gspos("P005", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
363   
364   zd1 += tubpar[2] * 2.;
365   
366   conpar[0] = 30./2.;
367   conpar[1] = 9.8/2.;
368   conpar[2] = 10.0/2.;
369   conpar[3] = 20.4/2.;
370   conpar[4] = 20.6/2.;
371   gMC->Gsvolu("P006", "CONE", idtmed[851], conpar, 5);
372   gMC->Gspos("P006", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
373   
374   zd1 += conpar[0] * 2.;
375   
376   tubpar[0] = 20.4/2.;
377   tubpar[1] = 20.6/2.;
378   tubpar[2] = 150./2.;
379   gMC->Gsvolu("P007", "TUBE", idtmed[851], tubpar, 3);
380   gMC->Gspos("P007", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
381   
382   zd1 += tubpar[2] * 2.;
383   
384   conpar[0] = 13.6/2.;
385   conpar[1] = 20.4/2.;
386   conpar[2] = 20.6/2.;
387   conpar[3] = 25.2/2.;
388   conpar[4] = 25.4/2.;
389   gMC->Gsvolu("P008", "CONE", idtmed[851], conpar, 5);
390   gMC->Gspos("P008", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
391   
392   zd1 += conpar[0] * 2.;
393   
394   tubpar[0] = 25.2/2.;
395   tubpar[1] = 25.4/2.;
396   tubpar[2] = 205.8/2.;
397   gMC->Gsvolu("P009", "TUBE", idtmed[851], tubpar, 3);
398   gMC->Gspos("P009", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
399   
400   zd1 += tubpar[2] * 2.;
401   
402   tubpar[0] = 43.8/2.;
403   tubpar[1] = 44.0/2.;
404   tubpar[2] = 500./2.;
405   gMC->Gsvolu("P010", "TUBE", idtmed[851], tubpar, 3);
406   gMC->Gspos("P010", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
407   
408   zd1 += tubpar[2] * 2.;
409   
410   tubpar[0] = 31.8/2.;
411   tubpar[1] = 32.0/2.;
412   tubpar[2] = 757.5/2.;
413   gMC->Gsvolu("P011", "TUBE", idtmed[851], tubpar, 3);
414   gMC->Gspos("P011", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
415   
416   zd1 += tubpar[2] * 2.;
417   
418   conpar[0] = 22.7/2.;
419   conpar[1] = 31.8/2.;
420   conpar[2] = 32.0/2.;
421   conpar[3] = 39.8/2.;
422   conpar[4] = 40.0/2.;
423   gMC->Gsvolu("P012", "CONE", idtmed[851], conpar, 5);
424   gMC->Gspos("P012", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
425   
426   zd1 += conpar[0] * 2.;
427   
428   tubpar[0] = 39.8/2.;
429   tubpar[1] = 40.0/2.;
430   tubpar[2] = 100./2.;
431   gMC->Gsvolu("P013", "TUBE", idtmed[851], tubpar, 3);
432   gMC->Gspos("P013", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
433   
434   zd1 += tubpar[2] * 2.;
435   
436   tubpar[0] = 39.8/2.;
437   tubpar[1] = 40.0/2.;
438   tubpar[2] = 600./2.;
439   gMC->Gsvolu("P014", "TUBE", idtmed[851], tubpar, 3);
440   gMC->Gspos("P014", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
441   
442   zd1 += tubpar[2] * 2.;
443   
444   conpar[0] = 28.4/2.;
445   conpar[1] = 39.8/2.;
446   conpar[2] = 40.0/2.;
447   conpar[3] = 49.8/2.;
448   conpar[4] = 50.0/2.;
449   gMC->Gsvolu("P015", "CONE", idtmed[851], conpar, 5);
450   gMC->Gspos("P015", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
451   
452   zd1 += conpar[0] * 2.;
453   
454   tubpar[0] = 49.8/2.;
455   tubpar[1] = 50.0/2.;
456   tubpar[2] = 100./2.;
457   gMC->Gsvolu("P016", "TUBE", idtmed[851], tubpar, 3);
458   gMC->Gspos("P016", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
459   
460   zd1 += tubpar[2] * 2.;
461   
462   tubpar[0] = 49.8/2.;
463   tubpar[1] = 50.0/2.;
464   tubpar[2] = 600./2.;
465   gMC->Gsvolu("P017", "TUBE", idtmed[851], tubpar, 3);
466   gMC->Gspos("P017", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
467   
468   zd1 += tubpar[2] * 2.;
469   
470   conpar[0] = 28.4/2.;
471   conpar[1] = 49.8/2.;
472   conpar[2] = 50.0/2.;
473   conpar[3] = 59.8/2.;
474   conpar[4] = 60.0/2.;
475   gMC->Gsvolu("P018", "CONE", idtmed[851], conpar, 5);
476   gMC->Gspos("P018", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
477   
478   zd1 += conpar[0] * 2.;
479   
480   tubpar[0] = 59.8/2.;
481   tubpar[1] = 60.0/2.;
482   tubpar[2] = 50./2.;
483   gMC->Gsvolu("P019", "TUBE", idtmed[851], tubpar, 3);
484   gMC->Gspos("P019", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
485   
486   zd1 += tubpar[2] * 2.;
487   
488   tubpar[0] = 59.8/2.;
489   tubpar[1] = 60.0/2.;
490   tubpar[2] = 800./2.;
491   gMC->Gsvolu("P020", "TUBE", idtmed[851], tubpar, 3);
492   gMC->Gspos("P020", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
493   
494   zd1 += tubpar[2] * 2.;
495   
496   tubpar[0] = 0.;
497   tubpar[1] = 60.0/2.;
498   tubpar[2] = 0.2/2.;
499   gMC->Gsvolu("P021", "TUBE", idtmed[851], tubpar, 3);
500   gMC->Gspos("P021", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
501   
502   zd1 += tubpar[2] * 2.;
503   
504   tubpar[0] = 0.;
505   tubpar[1] = 4.4/2.;
506   tubpar[2] = 0.2/2.;
507   gMC->Gsvolu("Q021", "TUBE", idtmed[889], tubpar, 3);
508   tubpar[0] = 0.;
509   tubpar[1] = 7.0/2.;
510   tubpar[2] = 0.2/2.;
511   gMC->Gsvolu("R021", "TUBE", idtmed[889], tubpar, 3);
512   // -- POSITION Q021 INSIDE P021 
513   gMC->Gspos("Q021", 1, "P021", -7.7, 0., 0., 0, "ONLY");
514   // -- POSITION R020 INSIDE P020 
515   gMC->Gspos("R021", 1, "P021", 7.7, 0., 0., 0, "ONLY");
516   
517   // -- BEAM PIPES BETWEEN END OF CONICAL PIPE AND BEGINNING OF D2 
518   tubpar[0] = 4.0/2.;
519   tubpar[1] = 4.4/2.;
520   tubpar[2] = 645.*0.5;
521   gMC->Gsvolu("P022", "TUBE", idtmed[851], tubpar, 3);
522   tubpar[0] = 7.0/2.;
523   tubpar[1] = 7.4/2.;
524   tubpar[2] = 645.*0.5;
525   gMC->Gsvolu("P023", "TUBE", idtmed[851], tubpar, 3);
526   
527   // -- ROTATE PIPES 
528   AliMatrix(im1, 90.-0.071, 0., 90., 90., .071, 180.);
529   angle = .071*kDegrad;
530   gMC->Gspos("P022", 1, "ZDC ", TMath::Sin(angle) * 322.5 - 9.7 + 
531                TMath::Sin(angle) * 472.5, 0., tubpar[2] + zd1, im1, "ONLY");
532   AliMatrix(im2, 90.+0.071, 0., 90., 90., .071, 0.);
533   gMC->Gspos("P023", 1, "ZDC ", 9.7 - TMath::Sin(angle) * 322.5, 0., 
534                tubpar[2] + zd1, im2, "ONLY");
535   
536   // --  END OF BEAM PIPE VOLUME DEFINITION. MAGNET DEFINITION FOLLOWS 
537   //     (LHC OPTICS 6) 
538   
539   // -- COMPENSATOR DIPOLE (MCBWA) 
540   //     GAP (VACUUM WITH MAGNETIC FIELD) 
541   
542   tubpar[0] = 0.;
543   tubpar[1] = 4.5;
544   tubpar[2] = 190./2.;
545   gMC->Gsvolu("MCBW", "TUBE", idtmed[890], tubpar, 3);
546   gMC->Gspos("MCBW", 1, "ZDC ", 0., 0., tubpar[2] + 1920., 0, "ONLY");
547   
548   // --  YOKE (IRON WITHOUT MAGNETIC FIELD) 
549   
550   tubpar[0] = 4.5;
551   tubpar[1] = 55.;
552   tubpar[2] = 190./2.;
553   gMC->Gsvolu("YMCB", "TUBE", idtmed[851], tubpar, 3);
554   gMC->Gspos("YMCB", 1, "ZDC ", 0., 0., tubpar[2] + 1920., 0, "ONLY");
555   
556   // -- INNER TRIPLET 
557   
558   zq = 2300.;
559   
560   // -- DEFINE MQXL AND MQX QUADRUPOLE ELEMENT 
561   
562   //     MQXL 
563   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
564   
565   tubpar[0] = 0.;
566   tubpar[1] = 3.5;
567   tubpar[2] = 630./2.;
568   gMC->Gsvolu("MQXL", "TUBE", idtmed[890], tubpar, 3);
569   
570   // --  YOKE 
571   
572   tubpar[0] = 3.5;
573   tubpar[1] = 22.;
574   tubpar[2] = 630./2.;
575   gMC->Gsvolu("YMQL", "TUBE", idtmed[851], tubpar, 3);
576   
577   gMC->Gspos("MQXL", 1, "ZDC ", 0., 0., tubpar[2] + zq, 0, "ONLY");
578   gMC->Gspos("YMQL", 1, "ZDC ", 0., 0., tubpar[2] + zq, 0, "ONLY");
579   
580   gMC->Gspos("MQXL", 2, "ZDC ", 0., 0., tubpar[2] + zq + 2430., 0, "ONLY");
581   gMC->Gspos("YMQL", 2, "ZDC ", 0., 0., tubpar[2] + zq + 2430., 0, "ONLY");
582   
583   // --  MQX 
584   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
585   
586   tubpar[0] = 0.;
587   tubpar[1] = 3.5;
588   tubpar[2] = 550./2.;
589   gMC->Gsvolu("MQX ", "TUBE", idtmed[890], tubpar, 3);
590   
591   // --  YOKE 
592   
593   tubpar[0] = 3.5;
594   tubpar[1] = 22.;
595   tubpar[2] = 550./2.;
596   gMC->Gsvolu("YMQ ", "TUBE", idtmed[851], tubpar, 3);
597   
598   gMC->Gspos("MQX ", 1, "ZDC ", 0., 0., tubpar[2] + zq + 880.,  0, "ONLY");
599   gMC->Gspos("YMQ ", 1, "ZDC ", 0., 0., tubpar[2] + zq + 880.,  0, "ONLY");
600   
601   gMC->Gspos("MQX ", 2, "ZDC ", 0., 0., tubpar[2] + zq + 1530., 0, "ONLY");
602   gMC->Gspos("YMQ ", 2, "ZDC ", 0., 0., tubpar[2] + zq + 1530., 0, "ONLY");
603   
604   // -- SEPARATOR DIPOLE D1 
605   
606   zd1 = 5843.5;
607   
608   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
609   
610   tubpar[0] = 0.;
611   tubpar[1] = 4.5;
612   tubpar[2] = 945/2.;
613   gMC->Gsvolu("D1  ", "TUBE", idtmed[890], tubpar, 3);
614   
615   // --  YOKE 
616   
617   tubpar[0] = 0.;
618   tubpar[1] = 55.;
619   tubpar[2] = 945/2.;
620   gMC->Gsvolu("YD1 ", "TUBE", idtmed[851], tubpar, 3);
621   
622   gMC->Gspos("YD1 ", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
623   gMC->Gspos("D1  ", 1, "YD1 ", 0., 0., 0., 0, "ONLY");
624   
625   // -- DIPOLE D2 
626   
627   zd2 = 12113.2;
628   
629   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
630   
631   tubpar[0] = 0.;
632   tubpar[1] = 4.5;
633   tubpar[2] = 945./2.;
634   gMC->Gsvolu("D2  ", "TUBE", idtmed[890], tubpar, 3);
635   
636   // --  YOKE 
637   
638   tubpar[0] = 0.;
639   tubpar[1] = 55.;
640   tubpar[2] = 945./2.;
641   gMC->Gsvolu("YD2 ", "TUBE", idtmed[851], tubpar, 3);
642   
643   gMC->Gspos("YD2 ", 1, "ZDC ", 0., 0., tubpar[2] + zd2, 0, "ONLY");
644   
645   gMC->Gspos("D2  ", 1, "YD2 ", -9.7, 0., 0., 0, "ONLY");
646   gMC->Gspos("D2  ", 2, "YD2 ",  9.7, 0., 0., 0, "ONLY");
647   
648   // -- END OF MAGNET DEFINITION 
649   
650   // ----------------- Hadronic calorimeters -------------------- * 
651   
652   // Neutron calorimeter 
653   
654   gMC->Gsvolu("ZNEU", "BOX ", idtmed[800], HDZN, 3); // Passive material  
655   gMC->Gsvolu("ZNFI", "TUBE", idtmed[802], FIZN, 3); // Active material
656   gMC->Gsvolu("ZNGR", "BOX ", idtmed[889], GRZN, 3); // Empty grooves 
657   
658   // Divide ZNEU in towers 
659   // (for hits purposes) 
660   
661   gMC->Gsdvn("ZNTX", "ZNEU", NZNTX, 1); // x-tower 
662   gMC->Gsdvn("ZN1 ", "ZNTX", NZNTY, 2); // y-tower
663   
664   // Divide ZNEU in minitowers 
665   // (NCEN(1)= NUMBER OF FIBERS PER TOWER ALONG X-AXIS, 
666   //  NCEN(2)= NUMBER OF FIBERS PER TOWER ALONG Y-AXIS) 
667   // (one fiber per minitower) 
668   
669   gMC->Gsdvn("ZNSL", "ZN1 ", NCEN[1], 2); // Slices 
670   gMC->Gsdvn("ZNST", "ZNSL", NCEN[0], 1); // Sticks
671   
672   // --- Position the empty grooves in the sticks 
673   gMC->Gspos("ZNGR", 1, "ZNST", 0., 0., 0., 0, "ONLY");
674   // --- Position the fibers in the grooves 
675   gMC->Gspos("ZNFI", 1, "ZNGR", 0., 0., 0., 0, "ONLY");
676   // --- Position the neutron calorimeter in ZDC 
677   gMC->Gspos("ZNEU", 1, "ZDC ", ZNPOS[0], ZNPOS[1], ZNPOS[2] + HDZN[2], 0, "ONLY");
678   
679   // Proton calorimeter 
680   
681   gMC->Gsvolu("ZPRO", "BOX ", idtmed[801], HDZP, 3); // Passive material
682   gMC->Gsvolu("ZPFI", "TUBE", idtmed[802], FIZP, 3); // Active material 
683   gMC->Gsvolu("ZPGR", "BOX ", idtmed[889], GRZP, 3); // Empty grooves
684   
685   // Divide ZPRO in towers 
686   // (for hits purposes) 
687   
688   gMC->Gsdvn("ZPTX", "ZPRO", NZPTX, 1); // x-tower 
689   gMC->Gsdvn("ZP1 ", "ZPTX", NZPTY, 2); // y-tower
690   
691   
692   // Divide ZPRO in minitowers 
693   // (NCEP[0]= NUMBER OF FIBERS ALONG X-AXIS PER MINITOWER, 
694   //  NCEP[1]= NUMBER OF FIBERS ALONG Y-AXIS PER MINITOWER) 
695   // (one fiber per minitower) 
696   
697   gMC->Gsdvn("ZPSL", "ZP1 ", NCEP[1], 2); // Slices 
698   gMC->Gsdvn("ZPST", "ZPSL", NCEP[0], 1); // Sticks
699   
700   // --- Position the empty grooves in the sticks 
701   gMC->Gspos("ZPGR", 1, "ZPST", 0., 0., 0., 0, "ONLY");
702   // --- Position the fibers in the grooves 
703   gMC->Gspos("ZPFI", 1, "ZPGR", 0., 0., 0., 0, "ONLY");
704   // --- Position the proton calorimeter in ZDC 
705   gMC->Gspos("ZPRO", 1, "ZDC ", ZPPOS[0], ZPPOS[1], ZPPOS[2] + HDZP[2], 0, "ONLY");
706   
707 }
708  
709 //_____________________________________________________________________________
710 void AliZDCv1::DrawModule()
711 {
712   //
713   // Draw a shaded view of the Zero Degree Calorimeter version 1
714   //
715
716   // Set everything unseen
717   gMC->Gsatt("*", "seen", -1);
718   // 
719   // Set ALIC mother transparent
720   gMC->Gsatt("ALIC","SEEN",0);
721   //
722   // Set the volumes visible
723   gMC->Gsatt("ZDC","SEEN",0);
724   gMC->Gsatt("P001","SEEN",1);
725   gMC->Gsatt("P002","SEEN",1);
726   gMC->Gsatt("P003","SEEN",1);
727   gMC->Gsatt("P004","SEEN",1);
728   gMC->Gsatt("P005","SEEN",1);
729   gMC->Gsatt("P006","SEEN",1);
730   gMC->Gsatt("P007","SEEN",1);
731   gMC->Gsatt("P008","SEEN",1);
732   gMC->Gsatt("P009","SEEN",1);
733   gMC->Gsatt("P010","SEEN",1);
734   gMC->Gsatt("P011","SEEN",1);
735   gMC->Gsatt("P012","SEEN",1);
736   gMC->Gsatt("P013","SEEN",1);
737   gMC->Gsatt("P014","SEEN",1);
738   gMC->Gsatt("P015","SEEN",1);
739   gMC->Gsatt("P016","SEEN",1);
740   gMC->Gsatt("P017","SEEN",1);
741   gMC->Gsatt("P018","SEEN",1);
742   gMC->Gsatt("P019","SEEN",1);
743   gMC->Gsatt("P020","SEEN",1);
744   gMC->Gsatt("P021","SEEN",1);
745   gMC->Gsatt("Q021","SEEN",1);
746   gMC->Gsatt("R021","SEEN",1);
747   gMC->Gsatt("P022","SEEN",1);
748   gMC->Gsatt("P023","SEEN",1);
749   gMC->Gsatt("D1  ","SEEN",1);
750   gMC->Gsatt("YD1 ","SEEN",1);
751   gMC->Gsatt("D2  ","SEEN",1);
752   gMC->Gsatt("YD2 ","SEEN",1);
753   gMC->Gsatt("MCBW","SEEN",1);
754   gMC->Gsatt("YMCB","SEEN",1);
755   gMC->Gsatt("MQXL","SEEN",1);
756   gMC->Gsatt("YMQL","SEEN",1);
757   gMC->Gsatt("MQX","SEEN",1);
758   gMC->Gsatt("YMQ","SEEN",1);
759   gMC->Gsatt("D1","SEEN",1);
760   gMC->Gsatt("YD1","SEEN",1);
761   gMC->Gsatt("D2","SEEN",1);
762   gMC->Gsatt("YD2","SEEN",1);
763   gMC->Gsatt("ZNEU","SEEN",0);
764   gMC->Gsatt("ZNFI","SEEN",0);
765   gMC->Gsatt("ZNGR","SEEN",0);
766   gMC->Gsatt("ZNTX","SEEN",0);
767   gMC->Gsatt("ZN1 ","COLO",2); 
768   gMC->Gsatt("ZN1 ","SEEN",1);
769   gMC->Gsatt("ZNSL","SEEN",0);
770   gMC->Gsatt("ZNST","SEEN",0);
771   gMC->Gsatt("ZPRO","SEEN",0);
772   gMC->Gsatt("ZPFI","SEEN",0);
773   gMC->Gsatt("ZPGR","SEEN",0);
774   gMC->Gsatt("ZPTX","SEEN",0);
775   gMC->Gsatt("ZP1 ","SEEN",1);
776   gMC->Gsatt("ZPSL","SEEN",0);
777   gMC->Gsatt("ZPST","SEEN",0);
778   
779   //
780   gMC->Gdopt("hide", "on");
781   gMC->Gdopt("shad", "on");
782   gMC->Gsatt("*", "fill", 7);
783   gMC->SetClipBox(".");
784   gMC->SetClipBox("*", 0, 100, -100, 100, 12000, 16000);
785   gMC->DefaultRange();
786   gMC->Gdraw("alic", 40, 30, 0, 488, 220, .07, .07);
787   gMC->Gdhead(1111, "Zero Degree Calorimeter Version 1");
788   gMC->Gdman(18, 4, "MAN");
789 }
790
791 //_____________________________________________________________________________
792 void AliZDCv1::CreateMaterials()
793 {
794   //
795   // Create Materials for the Zero Degree Calorimeter
796   //
797   // Origin    : E. Scomparin 
798   
799   Int_t *idtmed = fIdtmed->GetArray()-799;
800   
801   Float_t dens, ubuf[1], wmat[2];
802   Int_t isvol_active;
803   Float_t a[2];
804   Int_t i;
805   Float_t z[2], epsil=0.001, stmin=0.01;
806   Int_t isvol;
807   Float_t fieldm = gAlice->Field()->Max();
808   Int_t inofld;
809   Float_t deemax=-1;
810   Float_t tmaxfd=gAlice->Field()->Max();
811   Int_t isxfld = gAlice->Field()->Integ();
812   Float_t stemax;
813   
814   // --- Store in UBUF r0 for nuclear radius calculation R=r0*A**1/3 
815   
816   // --- Tungsten 
817   ubuf[0] = 1.11;
818   AliMaterial(1, "TUNG", 183.85, 74., 19.3, .35, 10.3, ubuf, 1);
819   
820   // --- Brass (CuZn) 
821   dens = 8.48;
822   a[0] = 63.546;
823   a[1] = 65.39;
824   z[0] = 29.;
825   z[1] = 30.;
826   wmat[0] = .63;
827   wmat[1] = .37;
828   AliMixture(2, "BRASS               ", a, z, dens, 2, wmat);
829   
830   // --- SiO2 
831   dens = 2.64;
832   a[0] = 28.086;
833   a[1] = 15.9994;
834   z[0] = 14.;
835   z[1] = 8.;
836   wmat[0] = 1.;
837   wmat[1] = 2.;
838   AliMixture(3, "SIO2                ", a, z, dens, -2, wmat);
839   
840   // --- Lead 
841   ubuf[0] = 1.12;
842   AliMaterial(4, "LEAD", 207.19, 82., 11.35, .56, 18.5, ubuf, 1);
843   
844   // --- Copper 
845   ubuf[0] = 1.1;
846   AliMaterial(5, "COPP", 63.54, 29., 8.96, 1.4, 0., ubuf, 1);
847   
848   // --- Tantalum 
849   ubuf[0] = 1.1;
850   AliMaterial(6, "TANT", 180.95, 73., 16.65, .4, 11.9, ubuf, 1);
851   
852   // Steel still to be added 
853   
854   // --- Iron 
855   ubuf[0] = 1.1;
856   AliMaterial(52, "IRON", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
857   
858   // --- Vacuum (no magnetic field) 
859   AliMaterial(90, "VOID", 1e-16, 1e-16, 1e-16, 1e16, 1e16, ubuf,0);
860   
861   // --- Vacuum (magnetic field) 
862   AliMaterial(91, "VOIM", 1e-16, 1e-16, 1e-16, 1e16, 1e16, ubuf,0);
863   
864   // --- Air non magnetic 
865   AliMaterial(92, "Air    $", 14.61, 7.3, .001205, 30420., 67500., ubuf, 0);
866   
867   // ---  Definition of tracking media: 
868   
869   // --- Tungsten = 801 ; 
870   // --- Brass = 802 ; 
871   // --- Fibers (SiO2) = 803 ; 
872   // --- Lead = 804 ; 
873   // --- Copper = 805 ; 
874   // --- Tantalum = 806 ; 
875   // --- Steel = 851 ; 
876   // --- Iron = 852 ; 
877   // --- Vacuum (no field) = 890 
878   // --- Vacuum (with field) = 891 
879   // --- Air   (no field) = 892 
880   
881   
882   // --- Tracking media parameters 
883   epsil  = .01;
884   stemax = 1.;
885   isvol  = 0;
886   isvol_active = 1;
887   inofld = 0;
888   fieldm = 0.;
889   
890   AliMedium(1, "ZW", 1, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
891   AliMedium(2, "ZBRASS", 2, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
892   AliMedium(3, "ZSIO2", 3, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
893   AliMedium(4, "ZLEAD", 4, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
894   AliMedium(5, "ZCOPP", 5, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
895   AliMedium(6, "ZTANT", 6, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
896   AliMedium(52, "ZIRON", 52, isvol, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
897   AliMedium(90, "ZVOID", 90, isvol, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
898   AliMedium(92, "Air", 92, 0, inofld, fieldm, tmaxfd, stemax,deemax, epsil, stmin);
899   
900   fieldm = 45.;
901   //    AliMedium(91, "ZVOIM", 91, isvol, isxfld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
902   AliMedium(91, "ZVOIM", 91, isvol, isxfld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
903   
904   // Thresholds for showering in the ZDCs 
905   
906   i = 801;
907   gMC->Gstpar(idtmed[i-1], "CUTGAM", .01);
908   gMC->Gstpar(idtmed[i-1], "CUTELE", .01);
909   gMC->Gstpar(idtmed[i-1], "CUTNEU", .1);
910   gMC->Gstpar(idtmed[i-1], "CUTHAD", .1);
911   i = 802;
912   gMC->Gstpar(idtmed[i-1], "CUTGAM", .01);
913   gMC->Gstpar(idtmed[i-1], "CUTELE", .01);
914   gMC->Gstpar(idtmed[i-1], "CUTNEU", .1);
915   gMC->Gstpar(idtmed[i-1], "CUTHAD", .1);
916   
917   // Avoid too detailed showering along the beam line 
918   
919   i = 852;
920   gMC->Gstpar(idtmed[i-1], "CUTGAM", .1);
921   gMC->Gstpar(idtmed[i-1], "CUTELE", .1);
922   gMC->Gstpar(idtmed[i-1], "CUTNEU", 1.);
923   gMC->Gstpar(idtmed[i-1], "CUTHAD", 1.);
924   
925   // Avoid interaction in fibers (only energy loss allowed) 
926   i = 803;
927   gMC->Gstpar(idtmed[i-1], "DCAY", 0.);
928   gMC->Gstpar(idtmed[i-1], "MULS", 0.);
929   gMC->Gstpar(idtmed[i-1], "PFIS", 0.);
930   gMC->Gstpar(idtmed[i-1], "MUNU", 0.);
931   gMC->Gstpar(idtmed[i-1], "LOSS", 1.);
932   gMC->Gstpar(idtmed[i-1], "PHOT", 0.);
933   gMC->Gstpar(idtmed[i-1], "COMP", 0.);
934   gMC->Gstpar(idtmed[i-1], "PAIR", 0.);
935   gMC->Gstpar(idtmed[i-1], "BREM", 0.);
936   gMC->Gstpar(idtmed[i-1], "DRAY", 0.);
937   gMC->Gstpar(idtmed[i-1], "ANNI", 0.);
938   gMC->Gstpar(idtmed[i-1], "HADR", 0.);
939 }
940
941 ClassImp(AliZDChit)
942   
943 //_____________________________________________________________________________
944 AliZDChit::AliZDChit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits):
945   AliHit(shunt, track)
946 {
947   //
948   // Add a Zero Degree Calorimeter hit
949   //
950   Int_t i;
951   for (i=0;i<4;i++) fVolume[i] = vol[i];
952   fX=hits[0];
953   fY=hits[1];
954   fZ=hits[2];
955   fEnergy=hits[3];
956 }