Put headers before libraries in the make.
[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="gif/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="gif/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="gif/AliZDCv1.gif">
265   */
266   //End_Html
267   //Begin_Html
268   /*
269     <img src="gif/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   AliMC* pMC = AliMC::GetMC();
280   
281   const Int_t NZPTX=4;
282   const Int_t NZPTY=1;
283   const Int_t NZNTX=2;
284   const Int_t NZNTY=2;
285   
286   Float_t HDZN[3]  = {4.0,4.0,50.0};
287   Float_t HDZP[3]  = {10.0,6.0,75.0};
288   // Coordinates of the center of the ZDC front face in the MRS
289   Float_t ZNPOS[3] = {-0.5,0.,11613.};
290   Float_t ZPPOS[3] = {-21.0,0.,11563.};
291   Float_t FIZN[3]  = {0.,0.01825,50.0};
292   Float_t FIZP[3]  = {0.,0.01825,75.0};
293   Float_t GRZN[3]  = {0.025,0.025,50.0};
294   Float_t GRZP[3]  = {0.040,0.040,75.0};
295   Int_t NCEN[3]    = {11,11,0};
296   Int_t NCEP[3]    = {10,10,0};
297   
298   Float_t angle;
299   Float_t zq, conpar[9], tubpar[3];
300   Int_t im1, im2;
301   Float_t zd1, zd2;
302   
303   
304   Int_t *idtmed = gAlice->Idtmed();
305   
306   // -- Mother of the ZDC 
307   conpar[0] = 0.;
308   conpar[1] = 360.;
309   conpar[2] = 2.;
310   conpar[3] = 1920.;
311   conpar[4] = 0.;
312   conpar[5] = 55.;
313   conpar[6] = 13060.;
314   conpar[7] = 0.;
315   conpar[8] = 55.;
316   pMC->Gsvolu("ZDC ", "PCON", idtmed[891], conpar, 9);
317   pMC->Gspos("ZDC ", 1, "ALIC", 0., 0., 0., 0, "ONLY");
318   // -- FIRST SECTION OF THE BEAM PIPE (from compensator dipole to 
319   //    beginning of D1) 
320   
321   zd1 = 1920.;
322   
323   tubpar[0] = 2.3;
324   tubpar[1] = 2.5;
325   tubpar[2] = 1961.75;
326   pMC->Gsvolu("P001", "TUBE", idtmed[851], tubpar, 3);
327   pMC->Gspos("P001", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
328   
329   //-- SECOND SECTION OF THE BEAM PIPE (FROM THE END OF D1 TO THE BEGINNING OF
330   //    D2) 
331   
332   zd1 = 6316.+472.5;
333   
334   tubpar[0] = 7.3/2.;
335   tubpar[1] = 7.7/2.;
336   tubpar[2] = 90.*0.5;
337   pMC->Gsvolu("P002", "TUBE", idtmed[851], tubpar, 3);
338   pMC->Gspos("P002", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
339   
340   zd1 += tubpar[2] * 2.;
341   
342   tubpar[0] = 7.3/2.;
343   tubpar[1] = 7.7/2.;
344   tubpar[2] = 10.*0.5;
345   pMC->Gsvolu("P003", "TUBE", idtmed[851], tubpar, 3);
346   pMC->Gspos("P003", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
347   
348   zd1 += tubpar[2] * 2.;
349   
350   conpar[0] = 3.16/2.;
351   conpar[1] = 7.3/2.;
352   conpar[2] = 7.7/2.;
353   conpar[3] = 9.8/2.;
354   conpar[4] = 10.0/2.;
355   pMC->Gsvolu("P004", "CONE", idtmed[851], conpar, 5);
356   pMC->Gspos("P004", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
357   
358   zd1 += conpar[0] * 2.;
359   
360   tubpar[0] = 9.8/2.;
361   tubpar[1] = 10.0/2;
362   tubpar[2] = 490./2.;
363   pMC->Gsvolu("P005", "TUBE", idtmed[851], tubpar, 3);
364   pMC->Gspos("P005", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
365   
366   zd1 += tubpar[2] * 2.;
367   
368   conpar[0] = 30./2.;
369   conpar[1] = 9.8/2.;
370   conpar[2] = 10.0/2.;
371   conpar[3] = 20.4/2.;
372   conpar[4] = 20.6/2.;
373   pMC->Gsvolu("P006", "CONE", idtmed[851], conpar, 5);
374   pMC->Gspos("P006", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
375   
376   zd1 += conpar[0] * 2.;
377   
378   tubpar[0] = 20.4/2.;
379   tubpar[1] = 20.6/2.;
380   tubpar[2] = 150./2.;
381   pMC->Gsvolu("P007", "TUBE", idtmed[851], tubpar, 3);
382   pMC->Gspos("P007", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
383   
384   zd1 += tubpar[2] * 2.;
385   
386   conpar[0] = 13.6/2.;
387   conpar[1] = 20.4/2.;
388   conpar[2] = 20.6/2.;
389   conpar[3] = 25.2/2.;
390   conpar[4] = 25.4/2.;
391   pMC->Gsvolu("P008", "CONE", idtmed[851], conpar, 5);
392   pMC->Gspos("P008", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
393   
394   zd1 += conpar[0] * 2.;
395   
396   tubpar[0] = 25.2/2.;
397   tubpar[1] = 25.4/2.;
398   tubpar[2] = 205.8/2.;
399   pMC->Gsvolu("P009", "TUBE", idtmed[851], tubpar, 3);
400   pMC->Gspos("P009", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
401   
402   zd1 += tubpar[2] * 2.;
403   
404   tubpar[0] = 43.8/2.;
405   tubpar[1] = 44.0/2.;
406   tubpar[2] = 500./2.;
407   pMC->Gsvolu("P010", "TUBE", idtmed[851], tubpar, 3);
408   pMC->Gspos("P010", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
409   
410   zd1 += tubpar[2] * 2.;
411   
412   tubpar[0] = 31.8/2.;
413   tubpar[1] = 32.0/2.;
414   tubpar[2] = 757.5/2.;
415   pMC->Gsvolu("P011", "TUBE", idtmed[851], tubpar, 3);
416   pMC->Gspos("P011", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
417   
418   zd1 += tubpar[2] * 2.;
419   
420   conpar[0] = 22.7/2.;
421   conpar[1] = 31.8/2.;
422   conpar[2] = 32.0/2.;
423   conpar[3] = 39.8/2.;
424   conpar[4] = 40.0/2.;
425   pMC->Gsvolu("P012", "CONE", idtmed[851], conpar, 5);
426   pMC->Gspos("P012", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
427   
428   zd1 += conpar[0] * 2.;
429   
430   tubpar[0] = 39.8/2.;
431   tubpar[1] = 40.0/2.;
432   tubpar[2] = 100./2.;
433   pMC->Gsvolu("P013", "TUBE", idtmed[851], tubpar, 3);
434   pMC->Gspos("P013", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
435   
436   zd1 += tubpar[2] * 2.;
437   
438   tubpar[0] = 39.8/2.;
439   tubpar[1] = 40.0/2.;
440   tubpar[2] = 600./2.;
441   pMC->Gsvolu("P014", "TUBE", idtmed[851], tubpar, 3);
442   pMC->Gspos("P014", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
443   
444   zd1 += tubpar[2] * 2.;
445   
446   conpar[0] = 28.4/2.;
447   conpar[1] = 39.8/2.;
448   conpar[2] = 40.0/2.;
449   conpar[3] = 49.8/2.;
450   conpar[4] = 50.0/2.;
451   pMC->Gsvolu("P015", "CONE", idtmed[851], conpar, 5);
452   pMC->Gspos("P015", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
453   
454   zd1 += conpar[0] * 2.;
455   
456   tubpar[0] = 49.8/2.;
457   tubpar[1] = 50.0/2.;
458   tubpar[2] = 100./2.;
459   pMC->Gsvolu("P016", "TUBE", idtmed[851], tubpar, 3);
460   pMC->Gspos("P016", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
461   
462   zd1 += tubpar[2] * 2.;
463   
464   tubpar[0] = 49.8/2.;
465   tubpar[1] = 50.0/2.;
466   tubpar[2] = 600./2.;
467   pMC->Gsvolu("P017", "TUBE", idtmed[851], tubpar, 3);
468   pMC->Gspos("P017", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
469   
470   zd1 += tubpar[2] * 2.;
471   
472   conpar[0] = 28.4/2.;
473   conpar[1] = 49.8/2.;
474   conpar[2] = 50.0/2.;
475   conpar[3] = 59.8/2.;
476   conpar[4] = 60.0/2.;
477   pMC->Gsvolu("P018", "CONE", idtmed[851], conpar, 5);
478   pMC->Gspos("P018", 1, "ZDC ", 0., 0., conpar[0] + zd1, 0, "ONLY");
479   
480   zd1 += conpar[0] * 2.;
481   
482   tubpar[0] = 59.8/2.;
483   tubpar[1] = 60.0/2.;
484   tubpar[2] = 50./2.;
485   pMC->Gsvolu("P019", "TUBE", idtmed[851], tubpar, 3);
486   pMC->Gspos("P019", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
487   
488   zd1 += tubpar[2] * 2.;
489   
490   tubpar[0] = 59.8/2.;
491   tubpar[1] = 60.0/2.;
492   tubpar[2] = 800./2.;
493   pMC->Gsvolu("P020", "TUBE", idtmed[851], tubpar, 3);
494   pMC->Gspos("P020", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
495   
496   zd1 += tubpar[2] * 2.;
497   
498   tubpar[0] = 0.;
499   tubpar[1] = 60.0/2.;
500   tubpar[2] = 0.2/2.;
501   pMC->Gsvolu("P021", "TUBE", idtmed[851], tubpar, 3);
502   pMC->Gspos("P021", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
503   
504   zd1 += tubpar[2] * 2.;
505   
506   tubpar[0] = 0.;
507   tubpar[1] = 4.4/2.;
508   tubpar[2] = 0.2/2.;
509   pMC->Gsvolu("Q021", "TUBE", idtmed[889], tubpar, 3);
510   tubpar[0] = 0.;
511   tubpar[1] = 7.0/2.;
512   tubpar[2] = 0.2/2.;
513   pMC->Gsvolu("R021", "TUBE", idtmed[889], tubpar, 3);
514   // -- POSITION Q021 INSIDE P021 
515   pMC->Gspos("Q021", 1, "P021", -7.7, 0., 0., 0, "ONLY");
516   // -- POSITION R020 INSIDE P020 
517   pMC->Gspos("R021", 1, "P021", 7.7, 0., 0., 0, "ONLY");
518   
519   // -- BEAM PIPES BETWEEN END OF CONICAL PIPE AND BEGINNING OF D2 
520   tubpar[0] = 4.0/2.;
521   tubpar[1] = 4.4/2.;
522   tubpar[2] = 645.*0.5;
523   pMC->Gsvolu("P022", "TUBE", idtmed[851], tubpar, 3);
524   tubpar[0] = 7.0/2.;
525   tubpar[1] = 7.4/2.;
526   tubpar[2] = 645.*0.5;
527   pMC->Gsvolu("P023", "TUBE", idtmed[851], tubpar, 3);
528   
529   // -- ROTATE PIPES 
530   AliMatrix(im1, 90.-0.071, 0., 90., 90., .071, 180.);
531   angle = .071*kDegrad;
532   pMC->Gspos("P022", 1, "ZDC ", TMath::Sin(angle) * 322.5 - 9.7 + 
533                TMath::Sin(angle) * 472.5, 0., tubpar[2] + zd1, im1, "ONLY");
534   AliMatrix(im2, 90.+0.071, 0., 90., 90., .071, 0.);
535   pMC->Gspos("P023", 1, "ZDC ", 9.7 - TMath::Sin(angle) * 322.5, 0., 
536                tubpar[2] + zd1, im2, "ONLY");
537   
538   // --  END OF BEAM PIPE VOLUME DEFINITION. MAGNET DEFINITION FOLLOWS 
539   //     (LHC OPTICS 6) 
540   
541   // -- COMPENSATOR DIPOLE (MCBWA) 
542   //     GAP (VACUUM WITH MAGNETIC FIELD) 
543   
544   tubpar[0] = 0.;
545   tubpar[1] = 4.5;
546   tubpar[2] = 190./2.;
547   pMC->Gsvolu("MCBW", "TUBE", idtmed[890], tubpar, 3);
548   pMC->Gspos("MCBW", 1, "ZDC ", 0., 0., tubpar[2] + 1920., 0, "ONLY");
549   
550   // --  YOKE (IRON WITHOUT MAGNETIC FIELD) 
551   
552   tubpar[0] = 4.5;
553   tubpar[1] = 55.;
554   tubpar[2] = 190./2.;
555   pMC->Gsvolu("YMCB", "TUBE", idtmed[851], tubpar, 3);
556   pMC->Gspos("YMCB", 1, "ZDC ", 0., 0., tubpar[2] + 1920., 0, "ONLY");
557   
558   // -- INNER TRIPLET 
559   
560   zq = 2300.;
561   
562   // -- DEFINE MQXL AND MQX QUADRUPOLE ELEMENT 
563   
564   //     MQXL 
565   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
566   
567   tubpar[0] = 0.;
568   tubpar[1] = 3.5;
569   tubpar[2] = 630./2.;
570   pMC->Gsvolu("MQXL", "TUBE", idtmed[890], tubpar, 3);
571   
572   // --  YOKE 
573   
574   tubpar[0] = 3.5;
575   tubpar[1] = 22.;
576   tubpar[2] = 630./2.;
577   pMC->Gsvolu("YMQL", "TUBE", idtmed[851], tubpar, 3);
578   
579   pMC->Gspos("MQXL", 1, "ZDC ", 0., 0., tubpar[2] + zq, 0, "ONLY");
580   pMC->Gspos("YMQL", 1, "ZDC ", 0., 0., tubpar[2] + zq, 0, "ONLY");
581   
582   pMC->Gspos("MQXL", 2, "ZDC ", 0., 0., tubpar[2] + zq + 2430., 0, "ONLY");
583   pMC->Gspos("YMQL", 2, "ZDC ", 0., 0., tubpar[2] + zq + 2430., 0, "ONLY");
584   
585   // --  MQX 
586   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
587   
588   tubpar[0] = 0.;
589   tubpar[1] = 3.5;
590   tubpar[2] = 550./2.;
591   pMC->Gsvolu("MQX ", "TUBE", idtmed[890], tubpar, 3);
592   
593   // --  YOKE 
594   
595   tubpar[0] = 3.5;
596   tubpar[1] = 22.;
597   tubpar[2] = 550./2.;
598   pMC->Gsvolu("YMQ ", "TUBE", idtmed[851], tubpar, 3);
599   
600   pMC->Gspos("MQX ", 1, "ZDC ", 0., 0., tubpar[2] + zq + 880.,  0, "ONLY");
601   pMC->Gspos("YMQ ", 1, "ZDC ", 0., 0., tubpar[2] + zq + 880.,  0, "ONLY");
602   
603   pMC->Gspos("MQX ", 2, "ZDC ", 0., 0., tubpar[2] + zq + 1530., 0, "ONLY");
604   pMC->Gspos("YMQ ", 2, "ZDC ", 0., 0., tubpar[2] + zq + 1530., 0, "ONLY");
605   
606   // -- SEPARATOR DIPOLE D1 
607   
608   zd1 = 5843.5;
609   
610   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
611   
612   tubpar[0] = 0.;
613   tubpar[1] = 4.5;
614   tubpar[2] = 945/2.;
615   pMC->Gsvolu("D1  ", "TUBE", idtmed[890], tubpar, 3);
616   
617   // --  YOKE 
618   
619   tubpar[0] = 0.;
620   tubpar[1] = 55.;
621   tubpar[2] = 945/2.;
622   pMC->Gsvolu("YD1 ", "TUBE", idtmed[851], tubpar, 3);
623   
624   pMC->Gspos("YD1 ", 1, "ZDC ", 0., 0., tubpar[2] + zd1, 0, "ONLY");
625   pMC->Gspos("D1  ", 1, "YD1 ", 0., 0., 0., 0, "ONLY");
626   
627   // -- DIPOLE D2 
628   
629   zd2 = 12113.2;
630   
631   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
632   
633   tubpar[0] = 0.;
634   tubpar[1] = 4.5;
635   tubpar[2] = 945./2.;
636   pMC->Gsvolu("D2  ", "TUBE", idtmed[890], tubpar, 3);
637   
638   // --  YOKE 
639   
640   tubpar[0] = 0.;
641   tubpar[1] = 55.;
642   tubpar[2] = 945./2.;
643   pMC->Gsvolu("YD2 ", "TUBE", idtmed[851], tubpar, 3);
644   
645   pMC->Gspos("YD2 ", 1, "ZDC ", 0., 0., tubpar[2] + zd2, 0, "ONLY");
646   
647   pMC->Gspos("D2  ", 1, "YD2 ", -9.7, 0., 0., 0, "ONLY");
648   pMC->Gspos("D2  ", 2, "YD2 ",  9.7, 0., 0., 0, "ONLY");
649   
650   // -- END OF MAGNET DEFINITION 
651   
652   // ----------------- Hadronic calorimeters -------------------- * 
653   
654   // Neutron calorimeter 
655   
656   pMC->Gsvolu("ZNEU", "BOX ", idtmed[800], HDZN, 3); // Passive material  
657   pMC->Gsvolu("ZNFI", "TUBE", idtmed[802], FIZN, 3); // Active material
658   pMC->Gsvolu("ZNGR", "BOX ", idtmed[889], GRZN, 3); // Empty grooves 
659   
660   // Divide ZNEU in towers 
661   // (for hits purposes) 
662   
663   pMC->Gsdvn("ZNTX", "ZNEU", NZNTX, 1); // x-tower 
664   pMC->Gsdvn("ZN1 ", "ZNTX", NZNTY, 2); // y-tower
665   
666   // Divide ZNEU in minitowers 
667   // (NCEN(1)= NUMBER OF FIBERS PER TOWER ALONG X-AXIS, 
668   //  NCEN(2)= NUMBER OF FIBERS PER TOWER ALONG Y-AXIS) 
669   // (one fiber per minitower) 
670   
671   pMC->Gsdvn("ZNSL", "ZN1 ", NCEN[1], 2); // Slices 
672   pMC->Gsdvn("ZNST", "ZNSL", NCEN[0], 1); // Sticks
673   
674   // --- Position the empty grooves in the sticks 
675   pMC->Gspos("ZNGR", 1, "ZNST", 0., 0., 0., 0, "ONLY");
676   // --- Position the fibers in the grooves 
677   pMC->Gspos("ZNFI", 1, "ZNGR", 0., 0., 0., 0, "ONLY");
678   // --- Position the neutron calorimeter in ZDC 
679   pMC->Gspos("ZNEU", 1, "ZDC ", ZNPOS[0], ZNPOS[1], ZNPOS[2] + HDZN[2], 0, "ONLY");
680   
681   // Proton calorimeter 
682   
683   pMC->Gsvolu("ZPRO", "BOX ", idtmed[801], HDZP, 3); // Passive material
684   pMC->Gsvolu("ZPFI", "TUBE", idtmed[802], FIZP, 3); // Active material 
685   pMC->Gsvolu("ZPGR", "BOX ", idtmed[889], GRZP, 3); // Empty grooves
686   
687   // Divide ZPRO in towers 
688   // (for hits purposes) 
689   
690   pMC->Gsdvn("ZPTX", "ZPRO", NZPTX, 1); // x-tower 
691   pMC->Gsdvn("ZP1 ", "ZPTX", NZPTY, 2); // y-tower
692   
693   
694   // Divide ZPRO in minitowers 
695   // (NCEP[0]= NUMBER OF FIBERS ALONG X-AXIS PER MINITOWER, 
696   //  NCEP[1]= NUMBER OF FIBERS ALONG Y-AXIS PER MINITOWER) 
697   // (one fiber per minitower) 
698   
699   pMC->Gsdvn("ZPSL", "ZP1 ", NCEP[1], 2); // Slices 
700   pMC->Gsdvn("ZPST", "ZPSL", NCEP[0], 1); // Sticks
701   
702   // --- Position the empty grooves in the sticks 
703   pMC->Gspos("ZPGR", 1, "ZPST", 0., 0., 0., 0, "ONLY");
704   // --- Position the fibers in the grooves 
705   pMC->Gspos("ZPFI", 1, "ZPGR", 0., 0., 0., 0, "ONLY");
706   // --- Position the proton calorimeter in ZDC 
707   pMC->Gspos("ZPRO", 1, "ZDC ", ZPPOS[0], ZPPOS[1], ZPPOS[2] + HDZP[2], 0, "ONLY");
708   
709 }
710  
711 //_____________________________________________________________________________
712 void AliZDCv1::DrawModule()
713 {
714   //
715   // Draw a shaded view of the Zero Degree Calorimeter version 1
716   //
717
718   AliMC* pMC = AliMC::GetMC();
719   
720   // Set everything unseen
721   pMC->Gsatt("*", "seen", -1);
722   // 
723   // Set ALIC mother transparent
724   pMC->Gsatt("ALIC","SEEN",0);
725   //
726   // Set the volumes visible
727   pMC->Gsatt("ZDC","SEEN",0);
728   pMC->Gsatt("P001","SEEN",1);
729   pMC->Gsatt("P002","SEEN",1);
730   pMC->Gsatt("P003","SEEN",1);
731   pMC->Gsatt("P004","SEEN",1);
732   pMC->Gsatt("P005","SEEN",1);
733   pMC->Gsatt("P006","SEEN",1);
734   pMC->Gsatt("P007","SEEN",1);
735   pMC->Gsatt("P008","SEEN",1);
736   pMC->Gsatt("P009","SEEN",1);
737   pMC->Gsatt("P010","SEEN",1);
738   pMC->Gsatt("P011","SEEN",1);
739   pMC->Gsatt("P012","SEEN",1);
740   pMC->Gsatt("P013","SEEN",1);
741   pMC->Gsatt("P014","SEEN",1);
742   pMC->Gsatt("P015","SEEN",1);
743   pMC->Gsatt("P016","SEEN",1);
744   pMC->Gsatt("P017","SEEN",1);
745   pMC->Gsatt("P018","SEEN",1);
746   pMC->Gsatt("P019","SEEN",1);
747   pMC->Gsatt("P020","SEEN",1);
748   pMC->Gsatt("P021","SEEN",1);
749   pMC->Gsatt("Q021","SEEN",1);
750   pMC->Gsatt("R021","SEEN",1);
751   pMC->Gsatt("P022","SEEN",1);
752   pMC->Gsatt("P023","SEEN",1);
753   pMC->Gsatt("D1  ","SEEN",1);
754   pMC->Gsatt("YD1 ","SEEN",1);
755   pMC->Gsatt("D2  ","SEEN",1);
756   pMC->Gsatt("YD2 ","SEEN",1);
757   pMC->Gsatt("MCBW","SEEN",1);
758   pMC->Gsatt("YMCB","SEEN",1);
759   pMC->Gsatt("MQXL","SEEN",1);
760   pMC->Gsatt("YMQL","SEEN",1);
761   pMC->Gsatt("MQX","SEEN",1);
762   pMC->Gsatt("YMQ","SEEN",1);
763   pMC->Gsatt("D1","SEEN",1);
764   pMC->Gsatt("YD1","SEEN",1);
765   pMC->Gsatt("D2","SEEN",1);
766   pMC->Gsatt("YD2","SEEN",1);
767   pMC->Gsatt("ZNEU","SEEN",0);
768   pMC->Gsatt("ZNFI","SEEN",0);
769   pMC->Gsatt("ZNGR","SEEN",0);
770   pMC->Gsatt("ZNTX","SEEN",0);
771   pMC->Gsatt("ZN1 ","COLO",2); 
772   pMC->Gsatt("ZN1 ","SEEN",1);
773   pMC->Gsatt("ZNSL","SEEN",0);
774   pMC->Gsatt("ZNST","SEEN",0);
775   pMC->Gsatt("ZPRO","SEEN",0);
776   pMC->Gsatt("ZPFI","SEEN",0);
777   pMC->Gsatt("ZPGR","SEEN",0);
778   pMC->Gsatt("ZPTX","SEEN",0);
779   pMC->Gsatt("ZP1 ","SEEN",1);
780   pMC->Gsatt("ZPSL","SEEN",0);
781   pMC->Gsatt("ZPST","SEEN",0);
782   
783   //
784   pMC->Gdopt("hide", "on");
785   pMC->Gdopt("shad", "on");
786   pMC->Gsatt("*", "fill", 7);
787   pMC->SetClipBox(".");
788   pMC->SetClipBox("*", 0, 100, -100, 100, 12000, 16000);
789   pMC->DefaultRange();
790   pMC->Gdraw("alic", 40, 30, 0, 488, 220, .07, .07);
791   pMC->Gdhead(1111, "Zero Degree Calorimeter Version 1");
792   pMC->Gdman(18, 4, "MAN");
793 }
794
795 //_____________________________________________________________________________
796 void AliZDCv1::CreateMaterials()
797 {
798   //
799   // Create Materials for the Zero Degree Calorimeter
800   //
801   // Origin    : E. Scomparin 
802   
803   AliMC* pMC = AliMC::GetMC();
804   
805   Int_t *idtmed = gAlice->Idtmed();
806   
807   Float_t dens, ubuf[1], wmat[2];
808   Int_t isvol_active;
809   Float_t a[2];
810   Int_t i;
811   Float_t z[2], epsil=0.001, stmin=0.01;
812   Int_t isvol;
813   Float_t fieldm = gAlice->Field()->Max();
814   Int_t inofld;
815   Float_t deemax=-1;
816   Float_t tmaxfd=gAlice->Field()->Max();
817   Int_t isxfld = gAlice->Field()->Integ();
818   Float_t stemax;
819   
820   // --- Store in UBUF r0 for nuclear radius calculation R=r0*A**1/3 
821   
822   // --- Tungsten 
823   ubuf[0] = 1.11;
824   AliMaterial(1, "TUNG", 183.85, 74., 19.3, .35, 10.3, ubuf, 1);
825   
826   // --- Brass (CuZn) 
827   dens = 8.48;
828   a[0] = 63.546;
829   a[1] = 65.39;
830   z[0] = 29.;
831   z[1] = 30.;
832   wmat[0] = .63;
833   wmat[1] = .37;
834   AliMixture(2, "BRASS               ", a, z, dens, 2, wmat);
835   
836   // --- SiO2 
837   dens = 2.64;
838   a[0] = 28.086;
839   a[1] = 15.9994;
840   z[0] = 14.;
841   z[1] = 8.;
842   wmat[0] = 1.;
843   wmat[1] = 2.;
844   AliMixture(3, "SIO2                ", a, z, dens, -2, wmat);
845   
846   // --- Lead 
847   ubuf[0] = 1.12;
848   AliMaterial(4, "LEAD", 207.19, 82., 11.35, .56, 18.5, ubuf, 1);
849   
850   // --- Copper 
851   ubuf[0] = 1.1;
852   AliMaterial(5, "COPP", 63.54, 29., 8.96, 1.4, 0., ubuf, 1);
853   
854   // --- Tantalum 
855   ubuf[0] = 1.1;
856   AliMaterial(6, "TANT", 180.95, 73., 16.65, .4, 11.9, ubuf, 1);
857   
858   // Steel still to be added 
859   
860   // --- Iron 
861   ubuf[0] = 1.1;
862   AliMaterial(52, "IRON", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
863   
864   // --- Vacuum (no magnetic field) 
865   AliMaterial(90, "VOID", 1e-16, 1e-16, 1e-16, 1e16, 1e16, ubuf,0);
866   
867   // --- Vacuum (magnetic field) 
868   AliMaterial(91, "VOIM", 1e-16, 1e-16, 1e-16, 1e16, 1e16, ubuf,0);
869   
870   // --- Air non magnetic 
871   AliMaterial(92, "Air    $", 14.61, 7.3, .001205, 30420., 67500., ubuf, 0);
872   
873   // ---  Definition of tracking media: 
874   
875   // --- Tungsten = 801 ; 
876   // --- Brass = 802 ; 
877   // --- Fibers (SiO2) = 803 ; 
878   // --- Lead = 804 ; 
879   // --- Copper = 805 ; 
880   // --- Tantalum = 806 ; 
881   // --- Steel = 851 ; 
882   // --- Iron = 852 ; 
883   // --- Vacuum (no field) = 890 
884   // --- Vacuum (with field) = 891 
885   // --- Air   (no field) = 892 
886   
887   
888   // --- Tracking media parameters 
889   epsil  = .01;
890   stemax = 1.;
891   isvol  = 0;
892   isvol_active = 1;
893   inofld = 0;
894   fieldm = 0.;
895   
896   AliMedium(801, "ZW", 1, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
897   AliMedium(802, "ZBRASS", 2, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
898   AliMedium(803, "ZSIO2", 3, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
899   AliMedium(804, "ZLEAD", 4, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
900   AliMedium(805, "ZCOPP", 5, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
901   AliMedium(806, "ZTANT", 6, isvol_active, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
902   AliMedium(852, "ZIRON", 52, isvol, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
903   AliMedium(890, "ZVOID", 90, isvol, inofld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
904   AliMedium(892, "Air", 92, 0, inofld, fieldm, tmaxfd, stemax,deemax, epsil, stmin);
905   
906   fieldm = 45.;
907   //    AliMedium(891, "ZVOIM", 91, isvol, isxfld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
908   AliMedium(891, "ZVOIM", 91, isvol, isxfld, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
909   
910   // Thresholds for showering in the ZDCs 
911   
912   i = 801;
913   pMC->Gstpar(idtmed[i-1], "CUTGAM", .01);
914   pMC->Gstpar(idtmed[i-1], "CUTELE", .01);
915   pMC->Gstpar(idtmed[i-1], "CUTNEU", .1);
916   pMC->Gstpar(idtmed[i-1], "CUTHAD", .1);
917   i = 802;
918   pMC->Gstpar(idtmed[i-1], "CUTGAM", .01);
919   pMC->Gstpar(idtmed[i-1], "CUTELE", .01);
920   pMC->Gstpar(idtmed[i-1], "CUTNEU", .1);
921   pMC->Gstpar(idtmed[i-1], "CUTHAD", .1);
922   
923   // Avoid too detailed showering along the beam line 
924   
925   i = 852;
926   pMC->Gstpar(idtmed[i-1], "CUTGAM", .1);
927   pMC->Gstpar(idtmed[i-1], "CUTELE", .1);
928   pMC->Gstpar(idtmed[i-1], "CUTNEU", 1.);
929   pMC->Gstpar(idtmed[i-1], "CUTHAD", 1.);
930   
931   // Avoid interaction in fibers (only energy loss allowed) 
932   i = 803;
933   pMC->Gstpar(idtmed[i-1], "DCAY", 0.);
934   pMC->Gstpar(idtmed[i-1], "MULS", 0.);
935   pMC->Gstpar(idtmed[i-1], "PFIS", 0.);
936   pMC->Gstpar(idtmed[i-1], "MUNU", 0.);
937   pMC->Gstpar(idtmed[i-1], "LOSS", 1.);
938   pMC->Gstpar(idtmed[i-1], "PHOT", 0.);
939   pMC->Gstpar(idtmed[i-1], "COMP", 0.);
940   pMC->Gstpar(idtmed[i-1], "PAIR", 0.);
941   pMC->Gstpar(idtmed[i-1], "BREM", 0.);
942   pMC->Gstpar(idtmed[i-1], "DRAY", 0.);
943   pMC->Gstpar(idtmed[i-1], "ANNI", 0.);
944   pMC->Gstpar(idtmed[i-1], "HADR", 0.);
945 }
946
947 ClassImp(AliZDChit)
948   
949 //_____________________________________________________________________________
950 AliZDChit::AliZDChit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits):
951   AliHit(shunt, track)
952 {
953   //
954   // Add a Zero Degree Calorimeter hit
955   //
956   Int_t i;
957   for (i=0;i<4;i++) fVolume[i] = vol[i];
958   fX=hits[0];
959   fY=hits[1];
960   fZ=hits[2];
961   fEnergy=hits[3];
962 }