Minor changes
[u/mrichter/AliRoot.git] / ZDC / AliZDCv3.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 ///////////////////////////////////////////////////////////////////////
18 //                                                                   //
19 //              AliZDCv3 --- new ZDC geometry                        //
20 //          with both ZDC arms geometry implemented                  //
21 //                                                                   //  
22 ///////////////////////////////////////////////////////////////////////
23
24 // --- Standard libraries
25 #include "stdio.h"
26
27 // --- ROOT system
28 #include <TMath.h>
29 #include <TRandom.h>
30 #include <TSystem.h>
31 #include <TTree.h>
32 #include <TVirtualMC.h>
33 #include <TGeoManager.h>
34 #include <TGeoMatrix.h>
35 #include <TGeoCone.h>
36 #include <TGeoShape.h>
37 #include <TGeoCompositeShape.h>
38 #include <TParticle.h>
39
40 // --- AliRoot classes
41 #include "AliLog.h"
42 #include "AliConst.h"
43 #include "AliMagF.h"
44 #include "AliRun.h"
45 #include "AliZDCv3.h"
46 #include "AliMC.h"
47  
48 class  AliZDCHit;
49 class  AliPDG;
50 class  AliDetector;
51  
52  
53 ClassImp(AliZDCv3)
54
55 //_____________________________________________________________________________
56 AliZDCv3::AliZDCv3() : 
57   AliZDC(),
58   fMedSensF1(0),
59   fMedSensF2(0),
60   fMedSensZP(0),
61   fMedSensZN(0),
62   fMedSensZEM(0),
63   fMedSensGR(0),
64   fMedSensPI(0),
65   fMedSensTDI(0),
66   fNalfan(0),
67   fNalfap(0),
68   fNben(0),  
69   fNbep(0),
70   fZEMLength(0),
71   fpLostITC(0), 
72   fpLostD1C(0), 
73   fpDetectedC(0),
74   fnDetectedC(0),
75   fnLumiC(0),
76   fpLostITA(0), 
77   fpLostD1A(0), 
78   fpLostTDI(0), 
79   fpDetectedA(0),
80   fnDetectedA(0),
81   fnLumiA(0),
82   fnTrou(0)
83 {
84   //
85   // Default constructor for Zero Degree Calorimeter
86   //
87   
88 }
89  
90 //_____________________________________________________________________________
91 AliZDCv3::AliZDCv3(const char *name, const char *title) : 
92   AliZDC(name,title),
93   fMedSensF1(0),
94   fMedSensF2(0),
95   fMedSensZP(0),
96   fMedSensZN(0),
97   fMedSensZEM(0),
98   fMedSensGR(0),
99   fMedSensPI(0),
100   fMedSensTDI(0),
101   fNalfan(90),
102   fNalfap(90),
103   fNben(18),  
104   fNbep(28), 
105   fZEMLength(0),
106   fpLostITC(0), 
107   fpLostD1C(0), 
108   fpDetectedC(0),
109   fnDetectedC(0),
110   fnLumiC(0),
111   fpLostITA(0), 
112   fpLostD1A(0), 
113   fpLostTDI(0), 
114   fpDetectedA(0),
115   fnDetectedA(0),  
116   fnLumiA(0),
117   fnTrou(0)
118 {
119   //
120   // Standard constructor for Zero Degree Calorimeter 
121   //
122   //
123   // Check that DIPO, ABSO, DIPO and SHIL is there (otherwise tracking is wrong!!!)
124   
125   AliModule* pipe=gAlice->GetModule("PIPE");
126   AliModule* abso=gAlice->GetModule("ABSO");
127   AliModule* dipo=gAlice->GetModule("DIPO");
128   AliModule* shil=gAlice->GetModule("SHIL");
129   if((!pipe) || (!abso) || (!dipo) || (!shil)) {
130     Error("Constructor","ZDC needs PIPE, ABSO, DIPO and SHIL!!!\n");
131     exit(1);
132   } 
133   //
134   Int_t ip,jp,kp;
135   for(ip=0; ip<4; ip++){
136      for(kp=0; kp<fNalfap; kp++){
137         for(jp=0; jp<fNbep; jp++){
138            fTablep[ip][kp][jp] = 0;
139         } 
140      }
141   }
142   Int_t in,jn,kn;
143   for(in=0; in<4; in++){
144      for(kn=0; kn<fNalfan; kn++){
145         for(jn=0; jn<fNben; jn++){
146            fTablen[in][kn][jn] = 0;
147         } 
148      }
149   }
150   //
151   // Parameters for hadronic calorimeters geometry
152   // Positions updated after post-installation measurements
153   fDimZN[0] = 3.52;
154   fDimZN[1] = 3.52;
155   fDimZN[2] = 50.;  
156   fDimZP[0] = 11.2;
157   fDimZP[1] = 6.;
158   fDimZP[2] = 75.;    
159   fPosZNC[0] = 0.;
160   fPosZNC[1] = 1.2;
161   fPosZNC[2] = -11397.3; 
162   fPosZPC[0] = 24.35;
163   fPosZPC[1] = 0.;
164   fPosZPC[2] = -11389.3; 
165   fPosZNA[0] = 0.;
166   fPosZNA[1] = 1.2;
167   fPosZNA[2] = 11395.8;  
168   fPosZPA[0] = 24.35;
169   fPosZPA[1] = 0.;
170   fPosZPA[2] = 11387.8; 
171   fFibZN[0] = 0.;
172   fFibZN[1] = 0.01825;
173   fFibZN[2] = 50.;
174   fFibZP[0] = 0.;
175   fFibZP[1] = 0.0275;
176   fFibZP[2] = 75.;
177   // Parameters for EM calorimeter geometry
178   fPosZEM[0] = 8.5;
179   fPosZEM[1] = 0.;
180   fPosZEM[2] = 735.;
181   Float_t kDimZEMPb  = 0.15*(TMath::Sqrt(2.));  // z-dimension of the Pb slice
182   Float_t kDimZEMAir = 0.001;                   // scotch
183   Float_t kFibRadZEM = 0.0315;                  // External fiber radius (including cladding)
184   Int_t   kDivZEM[3] = {92, 0, 20};             // Divisions for EM detector
185   Float_t kDimZEM0 = 2*kDivZEM[2]*(kDimZEMPb+kDimZEMAir+kFibRadZEM*(TMath::Sqrt(2.)));
186   fZEMLength = kDimZEM0;
187   
188 }
189  
190 //_____________________________________________________________________________
191 void AliZDCv3::CreateGeometry()
192 {
193   //
194   // Create the geometry for the Zero Degree Calorimeter version 2
195   //* Initialize COMMON block ZDC_CGEOM
196   //*
197
198   CreateBeamLine();
199   CreateZDC();
200 }
201   
202 //_____________________________________________________________________________
203 void AliZDCv3::CreateBeamLine()
204 {
205   //
206   // Create the beam line elements
207   //
208   
209   Double_t zd1, zd2, zCorrDip, zInnTrip, zD1, zD2;
210   Double_t conpar[9], tubpar[3], tubspar[5], boxpar[3];
211
212   //-- rotation matrices for the legs
213   Int_t irotpipe1, irotpipe2;
214   gMC->Matrix(irotpipe1,90.-1.0027,0.,90.,90.,1.0027,180.);      
215   gMC->Matrix(irotpipe2,90.+1.0027,0.,90.,90.,1.0027,0.);
216
217   //
218   Int_t *idtmed = fIdtmed->GetArray();
219   
220   ////////////////////////////////////////////////////////////////
221   //                                                            //
222   //                SIDE C - RB26 (dimuon side)                 //
223   //                                                            //
224   ///////////////////////////////////////////////////////////////
225   
226   
227   // -- Mother of the ZDCs (Vacuum PCON)
228   zd1 = 1921.6;
229   
230   conpar[0] = 0.;
231   conpar[1] = 360.;
232   conpar[2] = 2.;
233   conpar[3] = -13500.;
234   conpar[4] = 0.;
235   conpar[5] = 55.;
236   conpar[6] = -zd1;
237   conpar[7] = 0.;
238   conpar[8] = 55.;
239   gMC->Gsvolu("ZDCC", "PCON", idtmed[10], conpar, 9);
240   gMC->Gspos("ZDCC", 1, "ALIC", 0., 0., 0., 0, "ONLY");
241   
242
243   // -- BEAM PIPE from compensator dipole to the beginning of D1) 
244   tubpar[0] = 6.3/2.;
245   tubpar[1] = 6.7/2.;
246   // From beginning of ZDC volumes to beginning of D1
247   tubpar[2] = (5838.3-zd1)/2.;
248   gMC->Gsvolu("QT01", "TUBE", idtmed[7], tubpar, 3);
249   gMC->Gspos("QT01", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
250   // Ch.debug
251   //printf("    QT01 TUBE pipe from z = %1.2f to z= %1.2f (D1 beg.)\n",-zd1,-2*tubpar[2]-zd1);
252   
253   //-- BEAM PIPE from the end of D1 to the beginning of D2) 
254   
255   //-- FROM MAGNETIC BEGINNING OF D1 TO MAGNETIC END OF D1
256   //--  Cylindrical pipe (r = 3.47) + conical flare  
257   // -> Beginning of D1
258   zd1 += 2.*tubpar[2];
259   
260   tubpar[0] = 6.94/2.;
261   tubpar[1] = 7.34/2.;
262   tubpar[2] = (6909.8-zd1)/2.;
263   gMC->Gsvolu("QT02", "TUBE", idtmed[7], tubpar, 3);
264   gMC->Gspos("QT02", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
265   // Ch.debug
266   //printf("    QT02 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
267
268   zd1 += 2.*tubpar[2];
269   
270   tubpar[0] = 9./2.;
271   tubpar[1] = 9.6/2.;
272   tubpar[2] = (7022.8-zd1)/2.;
273   gMC->Gsvolu("QT03", "TUBE", idtmed[7], tubpar, 3);
274   gMC->Gspos("QT03", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
275   // Ch.debug
276   //printf("    QT03 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
277
278   zd1 += 2.*tubpar[2];
279   
280   conpar[0] = 39.2/2.;
281   conpar[1] = 18./2.;
282   conpar[2] = 18.6/2.;
283   conpar[3] = 9./2.;
284   conpar[4] = 9.6/2.;
285   gMC->Gsvolu("QC01", "CONE", idtmed[7], conpar, 5);
286   gMC->Gspos("QC01", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
287   // Ch.debug
288   //printf("    QC01 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
289   
290   zd1 += conpar[0] * 2.;
291   
292   // ******************************************************
293   // N.B.-> according to last vacuum layout 
294   // private communication by D. Macina, mail 27/1/2009
295   // ****************************************************** 
296   // 2nd section of VCTCQ+VAMTF+TCTVB+VAMTF+TCLIA+VAMTF+1st part of VCTCP
297   Float_t totLength1 = 160.8 + 78. + 148. + 78. + 148. + 78. + 9.3;
298   //
299   tubpar[0] = 18.6/2.;
300   tubpar[1] = 7.6/2.;
301   tubpar[2] = totLength1/2.;
302   gMC->Gsvolu("QE01", "ELTU", idtmed[7], tubpar, 3);  
303
304   tubpar[0] = 18.0/2.;
305   tubpar[1] = 7.0/2.;
306   tubpar[2] = totLength1/2.;
307   gMC->Gsvolu("QE02", "ELTU", idtmed[10], tubpar, 3);  
308   gMC->Gspos("QE02", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY"); 
309   gMC->Gspos("QE02", 1, "QE01", 0., 0., 0., 0, "ONLY");  
310   // Ch.debug
311   //printf("    QE02 ELTU from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
312   
313   zd1 += tubpar[2] * 2.;
314   
315   // 2nd part of VCTCP
316   conpar[0] = 31.5/2.;
317   conpar[1] = 21.27/2.;
318   conpar[2] = 21.87/2.;
319   conpar[3] = 18.0/2.;
320   conpar[4] = 18.6/2.;
321   gMC->Gsvolu("QC02", "CONE", idtmed[7], conpar, 5);
322   gMC->Gspos("QC02", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
323   // Ch.debug
324   //printf("    QC02 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
325   
326   zd1 += conpar[0] * 2.;
327
328   // 3rd section of VCTCP+VCDWC+VMLGB   
329   Float_t totLenght2 = 9.2 + 530.5+40.;
330   tubpar[0] = 21.2/2.;
331   tubpar[1] = 21.9/2.;
332   tubpar[2] = totLenght2/2.;
333   gMC->Gsvolu("QT04", "TUBE", idtmed[7], tubpar, 3);
334   gMC->Gspos("QT04", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
335   // Ch.debug
336   //printf("    QT04 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
337   
338   zd1 += tubpar[2] * 2.;
339   
340   // First part of VCTCD
341   // skewed transition cone from ID=212.7 mm to ID=797 mm
342   conpar[0] = 121./2.;
343   conpar[1] = 79.7/2.;
344   conpar[2] = 81.3/2.;
345   conpar[3] = 21.27/2.;
346   conpar[4] = 21.87/2.;
347   gMC->Gsvolu("QC03", "CONE", idtmed[7], conpar, 5);
348   gMC->Gspos("QC03", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
349   // Ch.debug
350   //printf("    QC03 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
351   
352   zd1 += 2.*conpar[0];
353   
354   // VCDGB + 1st part of VCTCH
355   tubpar[0] = 79.7/2.;
356   tubpar[1] = 81.3/2.;
357   tubpar[2] = (5*475.2+97.)/2.;
358   gMC->Gsvolu("QT05", "TUBE", idtmed[7], tubpar, 3);
359   gMC->Gspos("QT05", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
360   // Ch.debug
361   //printf("    QT05 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
362   
363   zd1 += 2.*tubpar[2];
364      
365   // 2nd part of VCTCH
366   // Transition from ID=797 mm to ID=196 mm:
367   // in order to simulate the thin window opened in the transition cone
368   // we divide the transition cone in three cones:
369   // (1) 8 mm thick (2) 3 mm thick (3) the third 8 mm thick
370   
371   // (1) 8 mm thick
372   conpar[0] = 9.09/2.; // 15 degree
373   conpar[1] = 74.82868/2.;
374   conpar[2] = 76.42868/2.; // thickness 8 mm 
375   conpar[3] = 79.7/2.;
376   conpar[4] = 81.3/2.; // thickness 8 mm  
377   gMC->Gsvolu("QC04", "CONE", idtmed[7], conpar, 5);
378   gMC->Gspos("QC04", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
379   // Ch.debug
380   //printf("    QC04 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
381
382   zd1 += 2.*conpar[0];  
383
384   // (2) 3 mm thick
385   conpar[0] = 96.2/2.; // 15 degree
386   conpar[1] = 23.19588/2.;
387   conpar[2] = 23.79588/2.; // thickness 3 mm 
388   conpar[3] = 74.82868/2.;
389   conpar[4] = 75.42868/2.; // thickness 3 mm  
390   gMC->Gsvolu("QC05", "CONE", idtmed[7], conpar, 5);
391   gMC->Gspos("QC05", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");  
392   // Ch.debug
393   //printf("    QC05 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
394
395   zd1 += 2.*conpar[0];
396   
397   // (3) 8 mm thick
398   conpar[0] = 6.71/2.; // 15 degree
399   conpar[1] = 19.6/2.;
400   conpar[2] = 21.2/2.;// thickness 8 mm 
401   conpar[3] = 23.19588/2.;
402   conpar[4] = 24.79588/2.;// thickness 8 mm 
403   gMC->Gsvolu("QC06", "CONE", idtmed[7], conpar, 5);
404   gMC->Gspos("QC06", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
405   // Ch.debug
406   //printf("    QC06 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
407
408   zd1 += 2.*conpar[0];
409   
410   // VMZAR (5 volumes)  
411   tubpar[0] = 20.2/2.;
412   tubpar[1] = 20.6/2.;
413   tubpar[2] = 2.15/2.;
414   gMC->Gsvolu("QT06", "TUBE", idtmed[7], tubpar, 3);
415   gMC->Gspos("QT06", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
416   // Ch.debug
417   //printf("    QT06 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
418
419   zd1 += 2.*tubpar[2];
420   
421   conpar[0] = 6.9/2.;
422   conpar[1] = 23.9/2.;
423   conpar[2] = 24.3/2.;
424   conpar[3] = 20.2/2.;
425   conpar[4] = 20.6/2.;
426   gMC->Gsvolu("QC07", "CONE", idtmed[7], conpar, 5);
427   gMC->Gspos("QC07", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
428   // Ch.debug
429   //printf("    QC07 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
430
431   zd1 += 2.*conpar[0];
432
433   tubpar[0] = 23.9/2.;
434   tubpar[1] = 25.5/2.;
435   tubpar[2] = 17.0/2.;
436   gMC->Gsvolu("QT07", "TUBE", idtmed[7], tubpar, 3);
437   gMC->Gspos("QT07", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
438   // Ch.debug
439   //printf("    QT07 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
440  
441   zd1 += 2.*tubpar[2];
442   
443   conpar[0] = 6.9/2.;
444   conpar[1] = 20.2/2.;
445   conpar[2] = 20.6/2.;
446   conpar[3] = 23.9/2.;
447   conpar[4] = 24.3/2.;
448   gMC->Gsvolu("QC08", "CONE", idtmed[7], conpar, 5);
449   gMC->Gspos("QC08", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
450   // Ch.debug
451   //printf("    QC08 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
452
453   zd1 += 2.*conpar[0];
454   
455   tubpar[0] = 20.2/2.;
456   tubpar[1] = 20.6/2.;
457   tubpar[2] = 2.15/2.;
458   gMC->Gsvolu("QT08", "TUBE", idtmed[7], tubpar, 3);
459   gMC->Gspos("QT08", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
460   // Ch.debug
461   //printf("    QT08 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
462
463   zd1 += 2.*tubpar[2];
464   
465   // Flange (ID=196 mm)(last part of VMZAR and first part of VCTYB)
466   tubpar[0] = 19.6/2.;
467   tubpar[1] = 25.3/2.;
468   tubpar[2] = 4.9/2.;
469   gMC->Gsvolu("QT09", "TUBE", idtmed[7], tubpar, 3);
470   gMC->Gspos("QT09", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
471   // Ch.debug
472   //printf("    QT09 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
473  
474   zd1 += 2.*tubpar[2];
475   // Ch.debug
476   //printf("    Beginning of VCTYB volume @ z = %1.2f \n",-zd1);
477   
478   // simulation of the trousers (VCTYB)     
479   tubpar[0] = 19.6/2.;
480   tubpar[1] = 20.0/2.;
481   tubpar[2] = 3.9/2.;
482   gMC->Gsvolu("QT10", "TUBE", idtmed[7], tubpar, 3);
483   gMC->Gspos("QT10", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
484   // Ch.debug
485   //printf("    QT10 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
486
487   zd1 += 2.*tubpar[2];
488
489   // transition cone from ID=196. to ID=216.6
490   conpar[0] = 32.55/2.;
491   conpar[1] = 21.66/2.;
492   conpar[2] = 22.06/2.;
493   conpar[3] = 19.6/2.;
494   conpar[4] = 20.0/2.;
495   gMC->Gsvolu("QC09", "CONE", idtmed[7], conpar, 5);
496   gMC->Gspos("QC09", 1, "ZDCC", 0., 0., -conpar[0]-zd1, 0, "ONLY");
497   // Ch.debug
498   //printf("    QC09 CONE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-zd1);
499
500   zd1 += 2.*conpar[0]; 
501   
502   // tube  
503   tubpar[0] = 21.66/2.;
504   tubpar[1] = 22.06/2.;
505   tubpar[2] = 28.6/2.;
506   gMC->Gsvolu("QT11", "TUBE", idtmed[7], tubpar, 3);
507   gMC->Gspos("QT11", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
508   // Ch.debug
509   //printf("    QT11 TUBE pipe from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
510
511   zd1 += 2.*tubpar[2];
512   // Ch.debug
513   //printf("    Beginning of recombination chamber @ z = %f \n",-zd1);
514
515   // --------------------------------------------------------
516   // RECOMBINATION CHAMBER IMPLEMENTED USING TGeo CLASSES!!!!
517   // author: Chiara (August 2008)
518   // --------------------------------------------------------
519   // TRANSFORMATION MATRICES
520   // Combi transformation: 
521   Double_t dx = -3.970000;
522   Double_t dy = 0.000000;
523   Double_t dz = 0.0;
524   // Rotation: 
525   Double_t thx = 84.989100;   Double_t phx = 180.000000;
526   Double_t thy = 90.000000;   Double_t phy = 90.000000;
527   Double_t thz = 185.010900;  Double_t phz = 0.000000;
528   TGeoRotation *rotMatrix1c = new TGeoRotation("c",thx,phx,thy,phy,thz,phz);
529   // Combi transformation: 
530   dx = -3.970000;
531   dy = 0.000000;
532   dz = 0.0;
533   TGeoCombiTrans *rotMatrix2c = new TGeoCombiTrans("ZDCC_c1", dx,dy,dz,rotMatrix1c);
534   rotMatrix2c->RegisterYourself();
535   // Combi transformation: 
536   dx = 3.970000;
537   dy = 0.000000;
538   dz = 0.0;
539   // Rotation: 
540   thx = 95.010900;   phx = 180.000000;
541   thy = 90.000000;   phy = 90.000000;
542   thz = 180.-5.010900;    phz = 0.000000;
543   TGeoRotation *rotMatrix3c = new TGeoRotation("",thx,phx,thy,phy,thz,phz);
544   TGeoCombiTrans *rotMatrix4c = new TGeoCombiTrans("ZDCC_c2", dx,dy,dz,rotMatrix3c);
545   rotMatrix4c->RegisterYourself();
546
547   // VOLUMES DEFINITION
548   // Volume: ZDCC
549   TGeoVolume *pZDCC = gGeoManager->GetVolume("ZDCC");
550   
551   conpar[0] = (90.1-0.95-0.26-0.0085)/2.;
552   conpar[1] = 0.0/2.;
553   conpar[2] = 21.6/2.;
554   conpar[3] = 0.0/2.;
555   conpar[4] = 5.8/2.;
556   new TGeoCone("QCLext", conpar[0],conpar[1],conpar[2],conpar[3],conpar[4]);
557   
558   conpar[0] = (90.1-0.95-0.26-0.0085)/2.;
559   conpar[1] = 0.0/2.;
560   conpar[2] = 21.2/2.;
561   conpar[3] = 0.0/2.;
562   conpar[4] = 5.4/2.;
563   new TGeoCone("QCLint", conpar[0],conpar[1],conpar[2],conpar[3],conpar[4]);
564
565   // Outer trousers
566   TGeoCompositeShape *pOutTrousersC = new TGeoCompositeShape("outTrousersC", "QCLext:ZDCC_c1+QCLext:ZDCC_c2");
567   
568   // Volume: QCLext
569   TGeoMedium *medZDCFe = gGeoManager->GetMedium("ZDC_ZIRON");
570   TGeoVolume *pQCLext = new TGeoVolume("QCLext",pOutTrousersC, medZDCFe);
571   pQCLext->SetLineColor(kGreen);
572   pQCLext->SetVisLeaves(kTRUE);
573   //
574   TGeoTranslation *tr1c = new TGeoTranslation(0., 0., (Double_t) -conpar[0]-0.95-zd1);
575   //printf("    Recombination chamber from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-0.95-zd1);
576   //
577   pZDCC->AddNode(pQCLext, 1, tr1c);
578   // Inner trousers
579   TGeoCompositeShape *pIntTrousersC = new TGeoCompositeShape("intTrousersC", "QCLint:ZDCC_c1+QCLint:ZDCC_c2");
580   // Volume: QCLint
581   TGeoMedium *medZDCvoid = gGeoManager->GetMedium("ZDC_ZVOID");
582   TGeoVolume *pQCLint = new TGeoVolume("QCLint",pIntTrousersC, medZDCvoid);
583   pQCLint->SetLineColor(kTeal);
584   pQCLint->SetVisLeaves(kTRUE);
585   pQCLext->AddNode(pQCLint, 1);
586     
587   zd1 += 90.1;
588   Double_t offset = 0.5;
589   zd1 = zd1+offset;
590   
591   //  second section : 2 tubes (ID = 54. OD = 58.)  
592   tubpar[0] = 5.4/2.;
593   tubpar[1] = 5.8/2.;
594   tubpar[2] = 40.0/2.;
595   gMC->Gsvolu("QT12", "TUBE", idtmed[7], tubpar, 3);
596   gMC->Gspos("QT12", 1, "ZDCC", -15.8/2., 0., -tubpar[2]-zd1, 0, "ONLY");
597   gMC->Gspos("QT12", 2, "ZDCC",  15.8/2., 0., -tubpar[2]-zd1, 0, "ONLY");  
598   // Ch.debug
599   //printf("    QT12 TUBE from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);
600   
601   zd1 += 2.*tubpar[2];
602   
603   // transition x2zdc to recombination chamber : skewed cone  
604   conpar[0] = (10.-0.2-offset)/2.;
605   conpar[1] = 5.4/2.;
606   conpar[2] = 5.8/2.;
607   conpar[3] = 6.3/2.;
608   conpar[4] = 7.0/2.;
609   gMC->Gsvolu("QC10", "CONE", idtmed[7], conpar, 5); 
610   gMC->Gspos("QC10", 1, "ZDCC", -7.9-0.175, 0., -conpar[0]-0.1-zd1, irotpipe1, "ONLY");
611   gMC->Gspos("QC10", 2, "ZDCC", 7.9+0.175, 0., -conpar[0]-0.1-zd1, irotpipe2, "ONLY");
612   //printf("    QC10 CONE from z = %1.2f to z= %1.2f\n",-zd1,-2*conpar[0]-0.2-zd1);
613
614   zd1 += 2.*conpar[0]+0.2;
615   
616   // 2 tubes (ID = 63 mm OD=70 mm)      
617   tubpar[0] = 6.3/2.;
618   tubpar[1] = 7.0/2.;
619   tubpar[2] = 639.8/2.;
620   gMC->Gsvolu("QT13", "TUBE", idtmed[7], tubpar, 3);
621   gMC->Gspos("QT13", 1, "ZDCC", -16.5/2., 0., -tubpar[2]-zd1, 0, "ONLY");
622   gMC->Gspos("QT13", 2, "ZDCC",  16.5/2., 0., -tubpar[2]-zd1, 0, "ONLY");
623   //printf("    QT13 TUBE from z = %1.2f to z= %1.2f\n",-zd1,-2*tubpar[2]-zd1);  
624
625   zd1 += 2.*tubpar[2];
626   //printf("    END OF SIDE C BEAM PIPE DEFINITION @ z = %f\n",-zd1);
627
628            
629   // -- Luminometer (Cu box) in front of ZN - side C
630   boxpar[0] = 8.0/2.;
631   boxpar[1] = 8.0/2.;
632   boxpar[2] = 15./2.;
633   gMC->Gsvolu("QLUC", "BOX ", idtmed[6], boxpar, 3);
634   gMC->Gspos("QLUC", 1, "ZDCC", 0., 0.,  fPosZNC[2]+66.+boxpar[2], 0, "ONLY");
635   //printf("    QLUC LUMINOMETER from z = %1.2f to z= %1.2f\n",  fPosZNC[2]+66., fPosZNC[2]+66.+2*boxpar[2]);
636                  
637   // --  END OF BEAM PIPE VOLUME DEFINITION FOR SIDE C (RB26 SIDE) 
638   // ----------------------------------------------------------------
639
640   ////////////////////////////////////////////////////////////////
641   //                                                            //
642   //                SIDE A - RB24                               //
643   //                                                            //
644   ///////////////////////////////////////////////////////////////
645
646   // Rotation Matrices definition
647   Int_t irotpipe3, irotpipe4, irotpipe5;
648   //-- rotation matrices for the tilted cone after the TDI to recenter vacuum chamber      
649   gMC->Matrix(irotpipe3,90.-1.8934,0.,90.,90.,1.8934,180.);    
650   //-- rotation matrices for the tilted tube before and after the TDI 
651   gMC->Matrix(irotpipe4,90.-3.8,0.,90.,90.,3.8,180.);       
652   //-- rotation matrix for the tilted cone after the TDI
653   gMC->Matrix(irotpipe5,90.+9.8,0.,90.,90.,9.8,0.);     
654
655   // -- Mother of the ZDCs (Vacuum PCON)                
656   zd2 = 1910.22;// zd2 initial value
657   
658   conpar[0] = 0.;
659   conpar[1] = 360.;
660   conpar[2] = 2.;
661   conpar[3] = zd2;
662   conpar[4] = 0.;
663   conpar[5] = 55.;
664   conpar[6] = 13500.;
665   conpar[7] = 0.;
666   conpar[8] = 55.;
667   gMC->Gsvolu("ZDCA", "PCON", idtmed[10], conpar, 9);
668   gMC->Gspos("ZDCA", 1, "ALIC", 0., 0., 0., 0, "ONLY");
669   
670   // To avoid overlaps 1 micron are left between certain volumes!
671   Double_t dxNoOverlap = 0.0;
672   //zd2 += dxNoOverlap;  
673   
674   // BEAM PIPE from 19.10 m to inner triplet beginning (22.965 m)  
675   tubpar[0] = 6.0/2.;
676   tubpar[1] = 6.4/2.;
677   tubpar[2] = 386.28/2. - dxNoOverlap; 
678   gMC->Gsvolu("QA01", "TUBE", idtmed[7], tubpar, 3);
679   gMC->Gspos("QA01", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
680   // Ch.debug
681   //printf("    QA01 TUBE centred in %f from z = %1.2f to z= %1.2f (IT begin)\n",tubpar[2]+zd2,zd2,2*tubpar[2]+zd2);
682   
683   zd2 += 2.*tubpar[2];  
684
685   // -- FIRST SECTION OF THE BEAM PIPE (from beginning of inner triplet to
686   //    beginning of D1)  
687   tubpar[0] = 6.3/2.;
688   tubpar[1] = 6.7/2.;
689   tubpar[2] = 3541.8/2. - dxNoOverlap;
690   gMC->Gsvolu("QA02", "TUBE", idtmed[7], tubpar, 3);
691   gMC->Gspos("QA02", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
692   // Ch.debug
693   //printf("    QA02 TUBE from z = %1.2f to z= %1.2f (D1 begin)\n",zd2,2*tubpar[2]+zd2);
694   
695   zd2 += 2.*tubpar[2]; 
696   
697     
698   // -- SECOND SECTION OF THE BEAM PIPE (from the beginning of D1 to the beginning of D2)
699   //
700   //  FROM (MAGNETIC) BEGINNING OF D1 TO THE (MAGNETIC) END OF D1 + 126.5 cm
701   //  CYLINDRICAL PIPE of diameter increasing from 6.75 cm up to 8.0 cm
702   //  from magnetic end :
703   //  1) 80.1 cm still with ID = 6.75 radial beam screen
704   //  2) 2.5 cm conical section from ID = 6.75 to ID = 8.0 cm
705   //  3) 43.9 cm straight section (tube) with ID = 8.0 cm
706
707   tubpar[0] = 6.75/2.;
708   tubpar[1] = 7.15/2.;
709   tubpar[2] = (945.0+80.1)/2.;
710   gMC->Gsvolu("QA03", "TUBE", idtmed[7], tubpar, 3);
711   gMC->Gspos("QA03", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
712   // Ch.debug
713   //printf("    QA03 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
714   
715   zd2 += 2.*tubpar[2];
716
717   // Transition Cone from ID=67.5 mm  to ID=80 mm
718   conpar[0] = 2.5/2.;
719   conpar[1] = 6.75/2.;
720   conpar[2] = 7.15/2.;
721   conpar[3] = 8.0/2.;
722   conpar[4] = 8.4/2.;
723   gMC->Gsvolu("QA04", "CONE", idtmed[7], conpar, 5);
724   gMC->Gspos("QA04", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
725   //printf("    QA04 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
726
727   zd2 += 2.*conpar[0];
728   
729   tubpar[0] = 8.0/2.;
730   tubpar[1] = 8.4/2.;
731   tubpar[2] = (43.9+20.+28.5+28.5)/2.;
732   gMC->Gsvolu("QA05", "TUBE", idtmed[7], tubpar, 3);
733   gMC->Gspos("QA05", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
734   // Ch.debug
735   //printf("    QA05 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
736   
737   zd2 += 2.*tubpar[2];
738
739   // Second section of VAEHI (transition cone from ID=80mm to ID=98mm)
740   conpar[0] = 4.0/2.;
741   conpar[1] = 8.0/2.;
742   conpar[2] = 8.4/2.;
743   conpar[3] = 9.8/2.;
744   conpar[4] = 10.2/2.;
745   gMC->Gsvolu("QAV1", "CONE", idtmed[7], conpar, 5);
746   gMC->Gspos("QAV1", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
747   //printf("    QAV1 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
748
749   zd2 += 2.*conpar[0];
750   
751   //Third section of VAEHI (transition cone from ID=98mm to ID=90mm)
752   conpar[0] = 1.0/2.;
753   conpar[1] = 9.8/2.;
754   conpar[2] = 10.2/2.;
755   conpar[3] = 9.0/2.;
756   conpar[4] = 9.4/2.;
757   gMC->Gsvolu("QAV2", "CONE", idtmed[7], conpar, 5);
758   gMC->Gspos("QAV2", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
759   //printf("    QAV2 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
760
761   zd2 += 2.*conpar[0];
762  
763   // Fourth section of VAEHI (tube ID=90mm)    
764   tubpar[0] = 9.0/2.;
765   tubpar[1] = 9.4/2.;
766   tubpar[2] = 31.0/2.;
767   gMC->Gsvolu("QAV3", "TUBE", idtmed[7], tubpar, 3);
768   gMC->Gspos("QAV3", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
769   // Ch.debug
770   //printf("    QAV3 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
771   
772   zd2 += 2.*tubpar[2]; 
773
774   //---------------------------- TCDD beginning ----------------------------------    
775   // space for the insertion of the collimator TCDD (2 m)
776   // TCDD ZONE - 1st volume
777   conpar[0] = 1.3/2.;
778   conpar[1] = 9.0/2.;
779   conpar[2] = 13.0/2.;
780   conpar[3] = 9.6/2.;
781   conpar[4] = 13.0/2.;
782   gMC->Gsvolu("Q01T", "CONE", idtmed[7], conpar, 5);
783   gMC->Gspos("Q01T", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
784   //printf("    Q01T CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
785
786   zd2 += 2.*conpar[0];  
787
788   // TCDD ZONE - 2nd volume    
789   tubpar[0] = 9.6/2.;
790   tubpar[1] = 10.0/2.;
791   tubpar[2] = 1.0/2.;
792   gMC->Gsvolu("Q02T", "TUBE", idtmed[7], tubpar, 3);
793   gMC->Gspos("Q02T", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
794   // Ch.debug
795   //printf("    Q02T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
796   
797   zd2 += 2.*tubpar[2]; 
798
799   // TCDD ZONE - third volume
800   conpar[0] = 9.04/2.;
801   conpar[1] = 9.6/2.;
802   conpar[2] = 10.0/2.;
803   conpar[3] = 13.8/2.;
804   conpar[4] = 14.2/2.;
805   gMC->Gsvolu("Q03T", "CONE", idtmed[7], conpar, 5);
806   gMC->Gspos("Q03T", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
807   //printf("    Q03T CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
808
809   zd2 += 2.*conpar[0];  
810
811   // TCDD ZONE - 4th volume    
812   tubpar[0] = 13.8/2.;
813   tubpar[1] = 14.2/2.;
814   tubpar[2] = 38.6/2.;
815   gMC->Gsvolu("Q04T", "TUBE", idtmed[7], tubpar, 3);
816   gMC->Gspos("Q04T", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
817   // Ch.debug
818   //printf("    Q04T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
819   
820   zd2 += 2.*tubpar[2]; 
821
822   // TCDD ZONE - 5th volume    
823   tubpar[0] = 21.0/2.;
824   tubpar[1] = 21.4/2.;
825   tubpar[2] = 100.12/2.;
826   gMC->Gsvolu("Q05T", "TUBE", idtmed[7], tubpar, 3);
827   gMC->Gspos("Q05T", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
828   // Ch.debug
829   //printf("    Q05T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
830
831   zd2 += 2.*tubpar[2]; 
832  
833   // TCDD ZONE - 6th volume    
834   tubpar[0] = 13.8/2.;
835   tubpar[1] = 14.2/2.;
836   tubpar[2] = 38.6/2.;
837   gMC->Gsvolu("Q06T", "TUBE", idtmed[7], tubpar, 3);
838   gMC->Gspos("Q06T", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
839   // Ch.debug
840   //printf("    Q06T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
841   
842   zd2 += 2.*tubpar[2];
843
844   // TCDD ZONE - 7th volume
845   conpar[0] = 11.34/2.;
846   conpar[1] = 13.8/2.;
847   conpar[2] = 14.2/2.;
848   conpar[3] = 18.0/2.;
849   conpar[4] = 18.4/2.;
850   gMC->Gsvolu("Q07T", "CONE", idtmed[7], conpar, 5);
851   gMC->Gspos("Q07T", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
852   //printf("    Q07T CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
853
854   zd2 += 2.*conpar[0];
855
856   // Upper section : one single phi segment of a tube 
857   //  5 parameters for tubs: inner radius = 0.,
858   //    outer radius = 7. cm, half length = 50 cm
859   //    phi1 = 0., phi2 = 180. 
860   tubspar[0] = 0.0/2.;
861   tubspar[1] = 14.0/2.;
862   tubspar[2] = 100.0/2.;
863   tubspar[3] = 0.;
864   tubspar[4] = 180.;  
865   gMC->Gsvolu("Q08T", "TUBS", idtmed[7], tubspar, 5);
866   // Ch.debug
867   //printf("    upper part : one single phi segment of a tube (Q08T)\n");  
868   
869   // rectangular beam pipe inside TCDD upper section (Vacuum)  
870   boxpar[0] = 7.0/2.;
871   boxpar[1] = 2.2/2.;
872   boxpar[2] = 100./2.;
873   gMC->Gsvolu("Q09T", "BOX ", idtmed[10], boxpar, 3);
874   // positioning vacuum box in the upper section of TCDD
875   gMC->Gspos("Q09T", 1, "Q08T", 0., 1.1,  0., 0, "ONLY");
876   
877   // lower section : one single phi segment of a tube       
878   tubspar[0] = 0.0/2.;
879   tubspar[1] = 14.0/2.;
880   tubspar[2] = 100.0/2.;
881   tubspar[3] = 180.;
882   tubspar[4] = 360.;  
883   gMC->Gsvolu("Q10T", "TUBS", idtmed[7], tubspar, 5);
884   // rectangular beam pipe inside TCDD lower section (Vacuum)  
885   boxpar[0] = 7.0/2.;
886   boxpar[1] = 2.2/2.;
887   boxpar[2] = 100./2.;
888   gMC->Gsvolu("Q11T", "BOX ", idtmed[10], boxpar, 3);
889   // positioning vacuum box in the lower section of TCDD
890   gMC->Gspos("Q11T", 1, "Q10T", 0., -1.1,  0., 0, "ONLY");  
891   
892   // positioning  TCDD elements in ZDCA, (inside TCDD volume)
893   gMC->Gspos("Q08T", 1, "ZDCA", 0., 2., -100.+zd2, 0, "ONLY");  
894   gMC->Gspos("Q10T", 1, "ZDCA", 0., -2., -100.+zd2, 0, "ONLY");  
895     
896   // RF screen 
897   boxpar[0] = 0.2/2.;
898   boxpar[1] = 4.0/2.;
899   boxpar[2] = 100./2.;
900   gMC->Gsvolu("Q12T", "BOX ", idtmed[7], boxpar, 3);  
901   // positioning RF screen at both sides of TCDD
902   gMC->Gspos("Q12T", 1, "ZDCA", tubspar[1]+boxpar[0], 0., -100.+zd2, 0, "ONLY");  
903   gMC->Gspos("Q12T", 2, "ZDCA", -tubspar[1]-boxpar[0], 0., -100.+zd2, 0, "ONLY");      
904   //---------------------------- TCDD end ---------------------------------------    
905
906   // The following elliptical tube 180 mm x 70 mm
907   // (obtained positioning the void QA09 in QA08)
908   // represents VMTSA (780 mm) + space reserved to the TCTVB (1480 mm)+ 
909   //            VMTSA (780 mm) + first part of VCTCP (93 mm)
910
911   tubpar[0] = 18.4/2.;
912   tubpar[1] = 7.4/2.;
913   tubpar[2] = 313.3/2.;
914   gMC->Gsvolu("QA06", "ELTU", idtmed[7], tubpar, 3);  
915   //printf("    QA06 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
916
917   tubpar[0] = 18.0/2.;
918   tubpar[1] = 7.0/2.;
919   tubpar[2] = 313.3/2.;
920   gMC->Gsvolu("QA07", "ELTU", idtmed[10], tubpar, 3);  
921   //printf("    QA07 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
922   gMC->Gspos("QA06", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY"); 
923   gMC->Gspos("QA07", 1, "QA06", 0., 0., 0., 0, "ONLY");  
924
925   zd2 += 2.*tubpar[2];
926       
927   // VCTCP second part: transition cone from ID=180 to ID=212.7 
928   conpar[0] = 31.5/2.;
929   conpar[1] = 18.0/2.;
930   conpar[2] = 18.6/2.;
931   conpar[3] = 21.27/2.;
932   conpar[4] = 21.87/2.;
933   gMC->Gsvolu("QA08", "CONE", idtmed[7], conpar, 5);
934   gMC->Gspos("QA08", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
935   // Ch.debug  
936   //printf("    QA08 CONE from z = %Third part of VCTCR: tube (ID=196 mm) f to z = %f\n",zd2,2*conpar[0]+zd2);
937
938   zd2 += 2.*conpar[0];
939   
940   // Tube ID 212.7 mm
941   // Represents VCTCP third part (92 mm) + VCDWB (765 mm) + VMBGA (400 mm) +
942   //            VCDWE (300 mm) + VMBGA (400 mm)
943   tubpar[0] = 21.27/2.;
944   tubpar[1] = 21.87/2.;
945   tubpar[2] = 195.7/2.;
946   gMC->Gsvolu("QA09", "TUBE", idtmed[7], tubpar, 3);
947   gMC->Gspos("QA09", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
948   //printf("    QA09 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
949
950   zd2 += 2.*tubpar[2];
951
952   // skewed transition piece (ID=212.7 mm to 332 mm) (before TDI)   
953   conpar[0] = (50.0-0.73-1.13)/2.;
954   conpar[1] = 21.27/2.;
955   conpar[2] = 21.87/2.;
956   conpar[3] = 33.2/2.;
957   conpar[4] = 33.8/2.;
958   gMC->Gsvolu("QA10", "CONE", idtmed[7], conpar, 5);
959   gMC->Gspos("QA10", 1, "ZDCA", -1.66, 0., conpar[0]+0.73+zd2, irotpipe4, "ONLY");
960   // Ch.debug  
961   //printf("    QA10 skewed CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+0.73+1.13+zd2);
962
963   zd2 += 2.*conpar[0]+0.73+1.13;
964       
965   // Vacuum chamber containing TDI  
966   tubpar[0] = 0.;
967   tubpar[1] = 54.6/2.;
968   tubpar[2] = 540.0/2.;
969   gMC->Gsvolu("Q13TM", "TUBE", idtmed[10], tubpar, 3);
970   gMC->Gspos("Q13TM", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
971   tubpar[0] = 54.0/2.;
972   tubpar[1] = 54.6/2.;
973   tubpar[2] = 540.0/2.;
974   gMC->Gsvolu("Q13T", "TUBE", idtmed[7], tubpar, 3);
975   gMC->Gspos("Q13T", 1, "Q13TM", 0., 0., 0., 0, "ONLY");
976   // Ch.debug
977   //printf("    Q13T TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
978
979   zd2 += 2.*tubpar[2];
980   
981   //---------------- INSERT TDI INSIDE Q13T -----------------------------------    
982   boxpar[0] = 11.0/2.;
983   boxpar[1] = 9.0/2.;
984   boxpar[2] = 540.0/2.;
985   gMC->Gsvolu("QTD1", "BOX ", idtmed[7], boxpar, 3);
986   gMC->Gspos("QTD1", 1, "Q13TM", -3.8, 10.5,  0., 0, "ONLY");
987   boxpar[0] = 11.0/2.;
988   boxpar[1] = 9.0/2.;
989   boxpar[2] = 540.0/2.;
990   gMC->Gsvolu("QTD2", "BOX ", idtmed[7], boxpar, 3);
991   gMC->Gspos("QTD2", 1, "Q13TM", -3.8, -10.5,  0., 0, "ONLY");  
992   boxpar[0] = 5.1/2.;
993   boxpar[1] = 0.2/2.;
994   boxpar[2] = 540.0/2.;
995   gMC->Gsvolu("QTD3", "BOX ", idtmed[7], boxpar, 3);
996   gMC->Gspos("QTD3", 1, "Q13TM", -3.8+5.5+boxpar[0], 6.1,  0., 0, "ONLY");  
997   gMC->Gspos("QTD3", 2, "Q13TM", -3.8+5.5+boxpar[0], -6.1,  0., 0, "ONLY"); 
998   gMC->Gspos("QTD3", 3, "Q13TM", -3.8-5.5-boxpar[0], 6.1,  0., 0, "ONLY");  
999   gMC->Gspos("QTD3", 4, "Q13TM", -3.8-5.5-boxpar[0], -6.1,  0., 0, "ONLY");  
1000   //
1001   tubspar[0] = 12.0/2.;
1002   tubspar[1] = 12.4/2.;
1003   tubspar[2] = 540.0/2.;
1004   tubspar[3] = 90.;
1005   tubspar[4] = 270.;  
1006   gMC->Gsvolu("QTD4", "TUBS", idtmed[7], tubspar, 5);
1007   gMC->Gspos("QTD4", 1, "Q13TM", -3.8-10.6, 0.,  0., 0, "ONLY");
1008   tubspar[0] = 12.0/2.;
1009   tubspar[1] = 12.4/2.;
1010   tubspar[2] = 540.0/2.;
1011   tubspar[3] = -90.;
1012   tubspar[4] = 90.;  
1013   gMC->Gsvolu("QTD5", "TUBS", idtmed[7], tubspar, 5);
1014   gMC->Gspos("QTD5", 1, "Q13TM", -3.8+10.6, 0.,  0., 0, "ONLY"); 
1015   //---------------- END DEFINING TDI INSIDE Q13T -------------------------------
1016   
1017   // VCTCG skewed transition piece (ID=332 mm to 212.7 mm) (after TDI)
1018   conpar[0] = (50.0-2.92-1.89)/2.;
1019   conpar[1] = 33.2/2.;
1020   conpar[2] = 33.8/2.;
1021   conpar[3] = 21.27/2.;
1022   conpar[4] = 21.87/2.;
1023   gMC->Gsvolu("QA11", "CONE", idtmed[7], conpar, 5);
1024   gMC->Gspos("QA11", 1, "ZDCA", 4.32-3.8, 0., conpar[0]+2.92+zd2, irotpipe5, "ONLY");
1025   // Ch.debug  
1026   //printf("    QA11 skewed CONE from z = %f to z =%f\n",zd2,2*conpar[0]+2.92+1.89+zd2);
1027
1028   zd2 += 2.*conpar[0]+2.92+1.89;
1029   
1030   // The following tube ID 212.7 mm  
1031   // represents VMBGA (400 mm) + VCDWE (300 mm) + VMBGA (400 mm) +
1032   //            BTVTS (600 mm) + VMLGB (400 mm)  
1033   tubpar[0] = 21.27/2.;
1034   tubpar[1] = 21.87/2.;
1035   tubpar[2] = 210.0/2.;
1036   gMC->Gsvolu("QA12", "TUBE", idtmed[7], tubpar, 3);
1037   gMC->Gspos("QA12", 1, "ZDCA", 4., 0., tubpar[2]+zd2, 0, "ONLY");
1038   // Ch.debug
1039   //printf("    QA12 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1040
1041   zd2 += 2.*tubpar[2];  
1042   
1043   // First part of VCTCC
1044   // skewed transition cone from ID=212.7 mm to ID=797 mm
1045   conpar[0] = (121.0-0.37-1.35)/2.;
1046   conpar[1] = 21.27/2.;
1047   conpar[2] = 21.87/2.;
1048   conpar[3] = 79.7/2.;
1049   conpar[4] = 81.3/2.;
1050   gMC->Gsvolu("QA13", "CONE", idtmed[7], conpar, 5);
1051   gMC->Gspos("QA13", 1, "ZDCA", 4.-2., 0., conpar[0]+0.37+zd2, irotpipe3, "ONLY");
1052   // Ch.debug  
1053   //printf("    QA13 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+0.37+1.35+zd2);
1054
1055   zd2 += 2.*conpar[0]+0.37+1.35;
1056   
1057   // The following tube ID 797 mm  --- (volume QA16)
1058   // represents the second part of VCTCC (4272 mm) + 
1059   //            4 x VCDGA (4 x 4272 mm) + 
1060   //            the first part of VCTCR (850 mm)
1061   tubpar[0] = 79.7/2.;
1062   tubpar[1] = 81.3/2.;
1063   tubpar[2] = 2221./2.;
1064   gMC->Gsvolu("QA14", "TUBE", idtmed[7], tubpar, 3);
1065   gMC->Gspos("QA14", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1066   // Ch.debug  
1067   //printf("    QA14 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1068
1069   zd2 += 2.*tubpar[2];
1070         
1071   // Second part of VCTCR
1072   // Transition from ID=797 mm to ID=196 mm:
1073   // in order to simulate the thin window opened in the transition cone
1074   // we divide the transition cone in three cones:
1075   // (1) 8 mm thick (2) 3 mm thick (3) the third 8 mm thick
1076   
1077   // (1) 8 mm thick
1078   conpar[0] = 9.09/2.; // 15 degree
1079   conpar[1] = 79.7/2.;
1080   conpar[2] = 81.3/2.; // thickness 8 mm  
1081   conpar[3] = 74.82868/2.;
1082   conpar[4] = 76.42868/2.; // thickness 8 mm 
1083   gMC->Gsvolu("QA15", "CONE", idtmed[7], conpar, 5);
1084   gMC->Gspos("QA15", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
1085   //printf("    QA15 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
1086
1087   zd2 += 2.*conpar[0];  
1088
1089   // (2) 3 mm thick
1090   conpar[0] = 96.2/2.; // 15 degree
1091   conpar[1] = 74.82868/2.;
1092   conpar[2] = 75.42868/2.; // thickness 3 mm  
1093   conpar[3] = 23.19588/2.;
1094   conpar[4] = 23.79588/2.; // thickness 3 mm 
1095   gMC->Gsvolu("QA16", "CONE", idtmed[7], conpar, 5);
1096   gMC->Gspos("QA16", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");  
1097   //printf("    QA16 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
1098
1099   zd2 += 2.*conpar[0];
1100   
1101   // (3) 8 mm thick
1102   conpar[0] = 6.71/2.; // 15 degree
1103   conpar[1] = 23.19588/2.;
1104   conpar[2] = 24.79588/2.;// thickness 8 mm 
1105   conpar[3] = 19.6/2.;
1106   conpar[4] = 21.2/2.;// thickness 8 mm 
1107   gMC->Gsvolu("QA17", "CONE", idtmed[7], conpar, 5);
1108   gMC->Gspos("QA17", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
1109   //printf("    QA19 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
1110
1111   zd2 += 2.*conpar[0];
1112  
1113   // Third part of VCTCR: tube (ID=196 mm)  
1114   tubpar[0] = 19.6/2.;
1115   tubpar[1] = 21.2/2.;
1116   tubpar[2] = 9.55/2.;
1117   gMC->Gsvolu("QA18", "TUBE", idtmed[7], tubpar, 3);
1118   gMC->Gspos("QA18", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1119   // Ch.debug  
1120   //printf("    QA18 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1121
1122   zd2 += 2.*tubpar[2];  
1123   
1124   // Flange (ID=196 mm) (last part of VCTCR and first part of VMZAR)
1125   tubpar[0] = 19.6/2.;
1126   tubpar[1] = 25.3/2.;
1127   tubpar[2] = 4.9/2.;
1128   gMC->Gsvolu("QF01", "TUBE", idtmed[7], tubpar, 3);
1129   gMC->Gspos("QF01", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1130   // Ch.debug  
1131   //printf("    QF01  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1132
1133   zd2 += 2.*tubpar[2];
1134   
1135   // VMZAR (5 volumes)  
1136   tubpar[0] = 20.2/2.;
1137   tubpar[1] = 20.6/2.;
1138   tubpar[2] = 2.15/2.;
1139   gMC->Gsvolu("QA19", "TUBE", idtmed[7], tubpar, 3);
1140   gMC->Gspos("QA19", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1141   // Ch.debug  
1142   //printf("    QA19  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1143
1144   zd2 += 2.*tubpar[2];
1145   
1146   conpar[0] = 6.9/2.;
1147   conpar[1] = 20.2/2.;
1148   conpar[2] = 20.6/2.;
1149   conpar[3] = 23.9/2.;
1150   conpar[4] = 24.3/2.;
1151   gMC->Gsvolu("QA20", "CONE", idtmed[7], conpar, 5);
1152   gMC->Gspos("QA20", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
1153   // Ch.debug  
1154   //printf("    QA20 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
1155
1156   zd2 += 2.*conpar[0];
1157
1158   tubpar[0] = 23.9/2.;
1159   tubpar[1] = 25.5/2.;
1160   tubpar[2] = 17.0/2.;
1161   gMC->Gsvolu("QA21", "TUBE", idtmed[7], tubpar, 3);
1162   gMC->Gspos("QA21", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1163   // Ch.debug  
1164   //printf("    QA21  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1165
1166   zd2 += 2.*tubpar[2];
1167   
1168   conpar[0] = 6.9/2.;
1169   conpar[1] = 23.9/2.;
1170   conpar[2] = 24.3/2.;
1171   conpar[3] = 20.2/2.;
1172   conpar[4] = 20.6/2.;
1173   gMC->Gsvolu("QA22", "CONE", idtmed[7], conpar, 5);
1174   gMC->Gspos("QA22", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
1175   // Ch.debug  
1176   //printf("    QA22 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
1177
1178   zd2 += 2.*conpar[0];
1179   
1180   tubpar[0] = 20.2/2.;
1181   tubpar[1] = 20.6/2.;
1182   tubpar[2] = 2.15/2.;
1183   gMC->Gsvolu("QA23", "TUBE", idtmed[7], tubpar, 3);
1184   gMC->Gspos("QA23", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1185   // Ch.debug  
1186   //printf("    QA23  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1187
1188   zd2 += 2.*tubpar[2];
1189   
1190   // Flange (ID=196 mm)(last part of VMZAR and first part of VCTYD)
1191   tubpar[0] = 19.6/2.;
1192   tubpar[1] = 25.3/2.;
1193   tubpar[2] = 4.9/2.;
1194   gMC->Gsvolu("QF02", "TUBE", idtmed[7], tubpar, 3);
1195   gMC->Gspos("QF02", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1196   // Ch.debug  
1197   //printf("    QF02 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1198
1199   zd2 += 2.*tubpar[2];
1200   
1201   // simulation of the trousers (VCTYB)     
1202   tubpar[0] = 19.6/2.;
1203   tubpar[1] = 20.0/2.;
1204   tubpar[2] = 3.9/2.;
1205   gMC->Gsvolu("QA24", "TUBE", idtmed[7], tubpar, 3);
1206   gMC->Gspos("QA24", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1207   // Ch.debug
1208   //printf("    QA24  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1209
1210   zd2 += 2.*tubpar[2];
1211
1212   // transition cone from ID=196. to ID=216.6
1213   conpar[0] = 32.55/2.;
1214   conpar[1] = 19.6/2.;
1215   conpar[2] = 20.0/2.;
1216   conpar[3] = 21.66/2.;
1217   conpar[4] = 22.06/2.;
1218   gMC->Gsvolu("QA25", "CONE", idtmed[7], conpar, 5);
1219   gMC->Gspos("QA25", 1, "ZDCA", 0., 0., conpar[0]+zd2, 0, "ONLY");
1220   // Ch.debug  
1221   //printf("    QA25 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+zd2);
1222
1223   zd2 += 2.*conpar[0]; 
1224   
1225   // tube  
1226   tubpar[0] = 21.66/2.;
1227   tubpar[1] = 22.06/2.;
1228   tubpar[2] = 28.6/2.;
1229   gMC->Gsvolu("QA26", "TUBE", idtmed[7], tubpar, 3);
1230   gMC->Gspos("QA26", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1231   // Ch.debug 
1232   //printf("    QA26  TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1233
1234   zd2 += 2.*tubpar[2];
1235
1236   // --------------------------------------------------------
1237   // RECOMBINATION CHAMBER IMPLEMENTED USING TGeo CLASSES!!!!
1238   // author: Chiara (June 2008)
1239   // --------------------------------------------------------
1240   // TRANSFORMATION MATRICES
1241   // Combi transformation: 
1242   dx = -3.970000;
1243   dy = 0.000000;
1244   dz = 0.0;
1245   // Rotation: 
1246   thx = 84.989100;   phx = 0.000000;
1247   thy = 90.000000;   phy = 90.000000;
1248   thz = 5.010900;    phz = 180.000000;
1249   TGeoRotation *rotMatrix1 = new TGeoRotation("",thx,phx,thy,phy,thz,phz);
1250   // Combi transformation: 
1251   dx = -3.970000;
1252   dy = 0.000000;
1253   dz = 0.0;
1254   TGeoCombiTrans *rotMatrix2 = new TGeoCombiTrans("ZDC_c1", dx,dy,dz,rotMatrix1);
1255   rotMatrix2->RegisterYourself();
1256   // Combi transformation: 
1257   dx = 3.970000;
1258   dy = 0.000000;
1259   dz = 0.0;
1260   // Rotation: 
1261   thx = 95.010900;   phx = 0.000000;
1262   thy = 90.000000;   phy = 90.000000;
1263   thz = 5.010900;    phz = 0.000000;
1264   TGeoRotation *rotMatrix3 = new TGeoRotation("",thx,phx,thy,phy,thz,phz);
1265   TGeoCombiTrans *rotMatrix4 = new TGeoCombiTrans("ZDC_c2", dx,dy,dz,rotMatrix3);
1266   rotMatrix4->RegisterYourself();
1267   
1268   
1269   // VOLUMES DEFINITION
1270   // Volume: ZDCA
1271   TGeoVolume *pZDCA = gGeoManager->GetVolume("ZDCA");
1272   
1273   conpar[0] = (90.1-0.95-0.26)/2.;
1274   conpar[1] = 0.0/2.;
1275   conpar[2] = 21.6/2.;
1276   conpar[3] = 0.0/2.;
1277   conpar[4] = 5.8/2.;
1278   new TGeoCone("QALext", conpar[0],conpar[1],conpar[2],conpar[3],conpar[4]);
1279   
1280   conpar[0] = (90.1-0.95-0.26)/2.;
1281   conpar[1] = 0.0/2.;
1282   conpar[2] = 21.2/2.;
1283   conpar[3] = 0.0/2.;
1284   conpar[4] = 5.4/2.;
1285   new TGeoCone("QALint", conpar[0],conpar[1],conpar[2],conpar[3],conpar[4]);
1286
1287   // Outer trousers
1288   TGeoCompositeShape *pOutTrousers = new TGeoCompositeShape("outTrousers", "QALext:ZDC_c1+QALext:ZDC_c2");
1289   
1290   // Volume: QALext
1291   //TGeoMedium *medZDCFe = gGeoManager->GetMedium("ZDC_ZIRON");
1292   TGeoVolume *pQALext = new TGeoVolume("QALext",pOutTrousers, medZDCFe);
1293   pQALext->SetLineColor(kBlue);
1294   pQALext->SetVisLeaves(kTRUE);
1295   //
1296   TGeoTranslation *tr1 = new TGeoTranslation(0., 0., (Double_t) conpar[0]+0.95+zd2);
1297   pZDCA->AddNode(pQALext, 1, tr1);
1298   // Inner trousers
1299   TGeoCompositeShape *pIntTrousers = new TGeoCompositeShape("intTrousers", "QALint:ZDC_c1+QALint:ZDC_c2");
1300   // Volume: QALint
1301   //TGeoMedium *medZDCvoid = gGeoManager->GetMedium("ZDC_ZVOID");
1302   TGeoVolume *pQALint = new TGeoVolume("QALint",pIntTrousers, medZDCvoid);
1303   pQALint->SetLineColor(kAzure);
1304   pQALint->SetVisLeaves(kTRUE);
1305   pQALext->AddNode(pQALint, 1);
1306     
1307   zd2 += 90.1;
1308   
1309   //  second section : 2 tubes (ID = 54. OD = 58.)  
1310   tubpar[0] = 5.4/2.;
1311   tubpar[1] = 5.8/2.;
1312   tubpar[2] = 40.0/2.;
1313   gMC->Gsvolu("QA27", "TUBE", idtmed[7], tubpar, 3);
1314   gMC->Gspos("QA27", 1, "ZDCA", -15.8/2., 0., tubpar[2]+zd2, 0, "ONLY");
1315   gMC->Gspos("QA27", 2, "ZDCA",  15.8/2., 0., tubpar[2]+zd2, 0, "ONLY");  
1316   // Ch.debug
1317   //printf("    QA27 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);
1318   
1319   zd2 += 2.*tubpar[2];
1320  
1321   // transition x2zdc to recombination chamber : skewed cone  
1322   conpar[0] = (10.-1.)/2.;
1323   conpar[1] = 5.4/2.;
1324   conpar[2] = 5.8/2.;
1325   conpar[3] = 6.3/2.;
1326   conpar[4] = 7.0/2.;
1327   gMC->Gsvolu("QA28", "CONE", idtmed[7], conpar, 5); 
1328   gMC->Gspos("QA28", 1, "ZDCA", -7.9-0.175, 0., conpar[0]+0.5+zd2, irotpipe1, "ONLY");
1329   gMC->Gspos("QA28", 2, "ZDCA", 7.9+0.175, 0., conpar[0]+0.5+zd2, irotpipe2, "ONLY");
1330   //printf("    QA28 CONE from z = %1.2f to z= %1.2f\n",zd2,2*conpar[0]+0.2+zd2);
1331
1332   zd2 += 2.*conpar[0]+1.;
1333   
1334   // 2 tubes (ID = 63 mm OD=70 mm)      
1335   tubpar[0] = 6.3/2.;
1336   tubpar[1] = 7.0/2.;
1337   tubpar[2] = (342.5+498.3)/2.;
1338   gMC->Gsvolu("QA29", "TUBE", idtmed[7], tubpar, 3);
1339   gMC->Gspos("QA29", 1, "ZDCA", -16.5/2., 0., tubpar[2]+zd2, 0, "ONLY");
1340   gMC->Gspos("QA29", 2, "ZDCA",  16.5/2., 0., tubpar[2]+zd2, 0, "ONLY");
1341   //printf("    QA29 TUBE from z = %1.2f to z= %1.2f\n",zd2,2*tubpar[2]+zd2);  
1342
1343   zd2 += 2.*tubpar[2];
1344            
1345   // -- Luminometer (Cu box) in front of ZN - side A
1346   boxpar[0] = 8.0/2.;
1347   boxpar[1] = 8.0/2.;
1348   boxpar[2] = 15./2.;
1349   gMC->Gsvolu("QLUA", "BOX ", idtmed[6], boxpar, 3);
1350   gMC->Gspos("QLUA", 1, "ZDCA", 0., 0.,  fPosZNA[2]-66.-boxpar[2], 0, "ONLY");
1351   //printf("    QLUA LUMINOMETER from z = %1.2f to z= %1.2f\n\n",  fPosZNA[2]-66., fPosZNA[2]-66.-2*boxpar[2]);
1352
1353   //printf("    END OF BEAM PIPE VOLUME DEFINITION AT z = %f\n",zd2);
1354   
1355
1356   // ----------------------------------------------------------------
1357   // --  MAGNET DEFINITION  -> LHC OPTICS 6.5  
1358   // ----------------------------------------------------------------      
1359   // ***************************************************************  
1360   //            SIDE C - RB26  (dimuon side) 
1361   // ***************************************************************   
1362   // --  COMPENSATOR DIPOLE (MBXW)
1363   zCorrDip = 1972.5;   
1364   
1365   // --  GAP (VACUUM WITH MAGNETIC FIELD)
1366   tubpar[0] = 0.;
1367   tubpar[1] = 3.14;
1368   tubpar[2] = 153./2.;
1369   gMC->Gsvolu("MBXW", "TUBE", idtmed[11], tubpar, 3);
1370
1371   // --  YOKE 
1372   tubpar[0] = 4.5;
1373   tubpar[1] = 55.;
1374   tubpar[2] = 153./2.;
1375   gMC->Gsvolu("YMBX", "TUBE", idtmed[7], tubpar, 3);
1376
1377   gMC->Gspos("MBXW", 1, "ZDCC", 0., 0., -tubpar[2]-zCorrDip, 0, "ONLY");
1378   gMC->Gspos("YMBX", 1, "ZDCC", 0., 0., -tubpar[2]-zCorrDip, 0, "ONLY");
1379   
1380   
1381   // -- INNER TRIPLET 
1382   zInnTrip = 2296.5; 
1383
1384   // -- DEFINE MQXL AND MQX QUADRUPOLE ELEMENT 
1385   // --  MQXL 
1386   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1387   tubpar[0] = 0.;
1388   tubpar[1] = 3.14;
1389   tubpar[2] = 637./2.;
1390   gMC->Gsvolu("MQXL", "TUBE", idtmed[11], tubpar, 3);
1391     
1392   // --  YOKE 
1393   tubpar[0] = 3.5;
1394   tubpar[1] = 22.;
1395   tubpar[2] = 637./2.;
1396   gMC->Gsvolu("YMQL", "TUBE", idtmed[7], tubpar, 3);
1397   
1398   gMC->Gspos("MQXL", 1, "ZDCC", 0., 0., -tubpar[2]-zInnTrip, 0, "ONLY");
1399   gMC->Gspos("YMQL", 1, "ZDCC", 0., 0., -tubpar[2]-zInnTrip, 0, "ONLY");
1400   
1401   gMC->Gspos("MQXL", 2, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-2400., 0, "ONLY");
1402   gMC->Gspos("YMQL", 2, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-2400., 0, "ONLY");
1403   
1404   // --  MQX 
1405   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1406   tubpar[0] = 0.;
1407   tubpar[1] = 3.14;
1408   tubpar[2] = 550./2.;
1409   gMC->Gsvolu("MQX ", "TUBE", idtmed[11], tubpar, 3);
1410   
1411   // --  YOKE 
1412   tubpar[0] = 3.5;
1413   tubpar[1] = 22.;
1414   tubpar[2] = 550./2.;
1415   gMC->Gsvolu("YMQ ", "TUBE", idtmed[7], tubpar, 3);
1416   
1417   gMC->Gspos("MQX ", 1, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-908.5,  0, "ONLY");
1418   gMC->Gspos("YMQ ", 1, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-908.5,  0, "ONLY");
1419   
1420   gMC->Gspos("MQX ", 2, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-1558.5, 0, "ONLY");
1421   gMC->Gspos("YMQ ", 2, "ZDCC", 0., 0., -tubpar[2]-zInnTrip-1558.5, 0, "ONLY");
1422   
1423   // -- SEPARATOR DIPOLE D1 
1424   zD1 = 5838.3001;
1425   
1426   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1427   tubpar[0] = 0.;
1428   tubpar[1] = 3.46;
1429   tubpar[2] = 945./2.;
1430   gMC->Gsvolu("MD1 ", "TUBE", idtmed[11], tubpar, 3);
1431   
1432   // --  Insert horizontal Cu plates inside D1 
1433   // --   (to simulate the vacuum chamber)
1434   boxpar[0] = TMath::Sqrt(tubpar[1]*tubpar[1]-(2.98+0.2)*(2.98+0.2)) - 0.05;
1435   boxpar[1] = 0.2/2.;
1436   boxpar[2] = 945./2.;
1437   gMC->Gsvolu("MD1V", "BOX ", idtmed[6], boxpar, 3);
1438   gMC->Gspos("MD1V", 1, "MD1 ", 0., 2.98+boxpar[1], 0., 0, "ONLY");
1439   gMC->Gspos("MD1V", 2, "MD1 ", 0., -2.98-boxpar[1], 0., 0, "ONLY");
1440     
1441   // --  YOKE 
1442   tubpar[0] = 3.68;
1443   tubpar[1] = 110./2.;
1444   tubpar[2] = 945./2.;
1445   gMC->Gsvolu("YD1 ", "TUBE", idtmed[7], tubpar, 3);
1446   
1447   gMC->Gspos("YD1 ", 1, "ZDCC", 0., 0., -tubpar[2]-zD1, 0, "ONLY");
1448   gMC->Gspos("MD1 ", 1, "ZDCC", 0., 0., -tubpar[2]-zD1, 0, "ONLY");
1449   // Ch debug
1450   //printf("    MD1 from z = %1.2f to z= %1.2f cm\n",-zD1, -zD1-2*tubpar[2]); 
1451   
1452   // -- DIPOLE D2 
1453   zD2 = 12167.8;
1454   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1455   tubpar[0] = 0.;
1456   tubpar[1] = 7.5/2.;
1457   tubpar[2] = 945./2.;
1458   gMC->Gsvolu("MD2 ", "TUBE", idtmed[11], tubpar, 3);
1459   
1460   // --  YOKE 
1461   tubpar[0] = 0.;
1462   tubpar[1] = 55.;
1463   tubpar[2] = 945./2.;
1464   gMC->Gsvolu("YD2 ", "TUBE", idtmed[7], tubpar, 3);
1465   
1466   gMC->Gspos("YD2 ", 1, "ZDCC", 0., 0., -tubpar[2]-zD2, 0, "ONLY");
1467   // Ch debug
1468   //printf("    YD2 from z = %1.2f to z= %1.2f cm\n",-zD2, -zD2-2*tubpar[2]); 
1469   
1470   gMC->Gspos("MD2 ", 1, "YD2 ", -9.4, 0., 0., 0, "ONLY");
1471   gMC->Gspos("MD2 ", 2, "YD2 ",  9.4, 0., 0., 0, "ONLY");
1472   
1473   // ***************************************************************  
1474   //            SIDE A - RB24 
1475   // ***************************************************************
1476   
1477   // COMPENSATOR DIPOLE (MCBWA) (2nd compensator)
1478   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1479   tubpar[0] = 0.;
1480   tubpar[1] = 3.;  
1481   tubpar[2] = 153./2.;
1482   gMC->Gsvolu("MCBW", "TUBE", idtmed[11], tubpar, 3);  
1483   gMC->Gspos("MCBW", 1, "ZDCA", 0., 0., tubpar[2]+zCorrDip, 0, "ONLY");
1484     
1485    // --  YOKE 
1486   tubpar[0] = 4.5;
1487   tubpar[1] = 55.;
1488   tubpar[2] = 153./2.;
1489   gMC->Gsvolu("YMCB", "TUBE", idtmed[7], tubpar, 3);
1490   gMC->Gspos("YMCB", 1, "ZDCA", 0., 0., tubpar[2]+zCorrDip, 0, "ONLY");  
1491   
1492    // -- INNER TRIPLET 
1493   // -- DEFINE MQX1 AND MQX2 QUADRUPOLE ELEMENT 
1494   // --  MQX1 
1495   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1496   tubpar[0] = 0.;
1497   tubpar[1] = 3.14;
1498   tubpar[2] = 637./2.;
1499   gMC->Gsvolu("MQX1", "TUBE", idtmed[11], tubpar, 3);
1500   gMC->Gsvolu("MQX4", "TUBE", idtmed[11], tubpar, 3);
1501     
1502   // --  YOKE 
1503   tubpar[0] = 3.5;
1504   tubpar[1] = 22.;
1505   tubpar[2] = 637./2.;
1506   gMC->Gsvolu("YMQ1", "TUBE", idtmed[7], tubpar, 3);
1507
1508   // -- Q1
1509   gMC->Gspos("MQX1", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip, 0, "ONLY");
1510   gMC->Gspos("YMQ1", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip, 0, "ONLY");
1511
1512    // -- BEAM SCREEN FOR Q1
1513    tubpar[0] = 4.78/2.;
1514    tubpar[1] = 5.18/2.;
1515    tubpar[2] = 637./2.;
1516    gMC->Gsvolu("QBS1", "TUBE", idtmed[6], tubpar, 3);
1517    gMC->Gspos("QBS1", 1, "MQX1", 0., 0., 0., 0, "ONLY");
1518    // INSERT VERTICAL PLATE INSIDE Q1
1519    boxpar[0] = 0.2/2.0;
1520    boxpar[1] = TMath::Sqrt(tubpar[0]*tubpar[0]-(1.9+0.2)*(1.9+0.2));
1521    boxpar[2] =637./2.;
1522    gMC->Gsvolu("QBS2", "BOX ", idtmed[6], boxpar, 3);
1523    gMC->Gspos("QBS2", 1, "MQX1", 1.9+boxpar[0], 0., 0., 0, "ONLY");
1524    gMC->Gspos("QBS2", 2, "MQX1", -1.9-boxpar[0], 0., 0., 0, "ONLY");
1525
1526    // -- Q3   
1527    gMC->Gspos("MQX4", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip+2400., 0, "ONLY");
1528    gMC->Gspos("YMQ1", 2, "ZDCA", 0., 0., tubpar[2]+zInnTrip+2400., 0, "ONLY");
1529
1530    // -- BEAM SCREEN FOR Q3
1531    tubpar[0] = 5.79/2.;
1532    tubpar[1] = 6.14/2.;
1533    tubpar[2] = 637./2.;
1534    gMC->Gsvolu("QBS3", "TUBE", idtmed[6], tubpar, 3);
1535    gMC->Gspos("QBS3", 1, "MQX4", 0., 0., 0., 0, "ONLY");
1536    // INSERT VERTICAL PLATE INSIDE Q3
1537    boxpar[0] = 0.2/2.0;
1538    boxpar[1] = TMath::Sqrt(tubpar[0]*tubpar[0]-(2.405+0.2)*(2.405+0.2));
1539    boxpar[2] =637./2.;
1540    gMC->Gsvolu("QBS4", "BOX ", idtmed[6], boxpar, 3);
1541    gMC->Gspos("QBS4", 1, "MQX4", 2.405+boxpar[0], 0., 0., 0, "ONLY");
1542    gMC->Gspos("QBS4", 2, "MQX4", -2.405-boxpar[0], 0., 0., 0, "ONLY");
1543     
1544   
1545   
1546   // --  MQX2
1547   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1548   tubpar[0] = 0.;
1549   tubpar[1] = 3.14;
1550   tubpar[2] = 550./2.;
1551   gMC->Gsvolu("MQX2", "TUBE", idtmed[11], tubpar, 3);
1552   gMC->Gsvolu("MQX3", "TUBE", idtmed[11], tubpar, 3);
1553   
1554   // --  YOKE 
1555   tubpar[0] = 3.5;
1556   tubpar[1] = 22.;
1557   tubpar[2] = 550./2.;
1558   gMC->Gsvolu("YMQ2", "TUBE", idtmed[7], tubpar, 3);
1559
1560    // -- BEAM SCREEN FOR Q2
1561    tubpar[0] = 5.79/2.;
1562    tubpar[1] = 6.14/2.;
1563    tubpar[2] = 550./2.;
1564    gMC->Gsvolu("QBS5", "TUBE", idtmed[6], tubpar, 3);
1565    //    VERTICAL PLATE INSIDE Q2
1566    boxpar[0] = 0.2/2.0;
1567    boxpar[1] = TMath::Sqrt(tubpar[0]*tubpar[0]-(2.405+0.2)*(2.405+0.2));
1568    boxpar[2] =550./2.;
1569    gMC->Gsvolu("QBS6", "BOX ", idtmed[6], boxpar, 3);
1570
1571   // -- Q2A
1572   gMC->Gspos("MQX2", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip+908.5,  0, "ONLY");
1573   gMC->Gspos("QBS5", 1, "MQX2", 0., 0., 0., 0, "ONLY");  
1574   gMC->Gspos("QBS6", 1, "MQX2", 2.405+boxpar[0], 0., 0., 0, "ONLY");
1575   gMC->Gspos("QBS6", 2, "MQX2", -2.405-boxpar[0], 0., 0., 0, "ONLY");  
1576   gMC->Gspos("YMQ2", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip+908.5,  0, "ONLY");
1577
1578   
1579   // -- Q2B
1580   gMC->Gspos("MQX3", 1, "ZDCA", 0., 0., tubpar[2]+zInnTrip+1558.5, 0, "ONLY");
1581   gMC->Gspos("QBS5", 2, "MQX3", 0., 0., 0., 0, "ONLY");  
1582   gMC->Gspos("QBS6", 3, "MQX3", 2.405+boxpar[0], 0., 0., 0, "ONLY");
1583   gMC->Gspos("QBS6", 4, "MQX3", -2.405-boxpar[0], 0., 0., 0, "ONLY");
1584   gMC->Gspos("YMQ2", 2, "ZDCA", 0., 0., tubpar[2]+zInnTrip+1558.5, 0, "ONLY");
1585
1586   // -- SEPARATOR DIPOLE D1 
1587   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1588   tubpar[0] = 0.;
1589   tubpar[1] = 6.75/2.;//3.375
1590   tubpar[2] = 945./2.;
1591   gMC->Gsvolu("MD1L", "TUBE", idtmed[11], tubpar, 3);
1592
1593   // --  The beam screen tube is provided by the beam pipe in D1 (QA03 volume)
1594   // --  Insert the beam screen horizontal Cu plates inside D1  
1595   // --   (to simulate the vacuum chamber)
1596   boxpar[0] = TMath::Sqrt(tubpar[1]*tubpar[1]-(2.885+0.2)*(2.885+0.2));
1597   boxpar[1] = 0.2/2.;
1598   boxpar[2] =945./2.;  
1599   gMC->Gsvolu("QBS7", "BOX ", idtmed[6], boxpar, 3);
1600   gMC->Gspos("QBS7", 1, "MD1L", 0., 2.885+boxpar[1],0., 0, "ONLY");
1601   gMC->Gspos("QBS7", 2, "MD1L", 0., -2.885-boxpar[1],0., 0, "ONLY");  
1602     
1603   // --  YOKE 
1604   tubpar[0] = 3.68;
1605   tubpar[1] = 110./2;
1606   tubpar[2] = 945./2.;
1607   gMC->Gsvolu("YD1L", "TUBE", idtmed[7], tubpar, 3);
1608   
1609   gMC->Gspos("YD1L", 1, "ZDCA", 0., 0., tubpar[2]+zD1, 0, "ONLY");  
1610   gMC->Gspos("MD1L", 1, "ZDCA", 0., 0., tubpar[2]+zD1, 0, "ONLY");  
1611   
1612   // -- DIPOLE D2 
1613   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1614   tubpar[0] = 0.;
1615   tubpar[1] = 7.5/2.; // this has to be checked
1616   tubpar[2] = 945./2.;
1617   gMC->Gsvolu("MD2L", "TUBE", idtmed[11], tubpar, 3);
1618   
1619   // --  YOKE 
1620   tubpar[0] = 0.;
1621   tubpar[1] = 55.;
1622   tubpar[2] = 945./2.;
1623   gMC->Gsvolu("YD2L", "TUBE", idtmed[7], tubpar, 3);
1624   
1625   gMC->Gspos("YD2L", 1, "ZDCA", 0., 0., tubpar[2]+zD2, 0, "ONLY");
1626   
1627   gMC->Gspos("MD2L", 1, "YD2L", -9.4, 0., 0., 0, "ONLY");
1628   gMC->Gspos("MD2L", 2, "YD2L",  9.4, 0., 0., 0, "ONLY");
1629   
1630   // -- END OF MAGNET DEFINITION     
1631 }
1632   
1633 //_____________________________________________________________________________
1634 void AliZDCv3::CreateZDC()
1635 {
1636  //
1637  // Create the various ZDCs (ZN + ZP)
1638  //
1639   
1640   Float_t dimPb[6], dimVoid[6];
1641   
1642   Int_t *idtmed = fIdtmed->GetArray();
1643
1644   // Parameters for hadronic calorimeters geometry
1645   // NB -> parameters used ONLY in CreateZDC()
1646   Float_t fGrvZN[3] = {0.03, 0.03, 50.};  // Grooves for neutron detector
1647   Float_t fGrvZP[3] = {0.04, 0.04, 75.};  // Grooves for proton detector
1648   Int_t   fDivZN[3] = {11, 11, 0};        // Division for neutron detector
1649   Int_t   fDivZP[3] = {7, 15, 0};         // Division for proton detector
1650   Int_t   fTowZN[2] = {2, 2};             // Tower for neutron detector
1651   Int_t   fTowZP[2] = {4, 1};             // Tower for proton detector
1652
1653   // Parameters for EM calorimeter geometry
1654   // NB -> parameters used ONLY in CreateZDC()
1655   Float_t kDimZEMPb  = 0.15*(TMath::Sqrt(2.));  // z-dimension of the Pb slice
1656   Float_t kFibRadZEM = 0.0315;                  // External fiber radius (including cladding)
1657   Int_t   fDivZEM[3] = {92, 0, 20};             // Divisions for EM detector
1658   Float_t fDimZEM[6] = {fZEMLength, 3.5, 3.5, 45., 0., 0.}; // Dimensions of EM detector
1659   Float_t fFibZEM2 = fDimZEM[2]/TMath::Sin(fDimZEM[3]*kDegrad)-kFibRadZEM;
1660   Float_t fFibZEM[3] = {0., 0.0275, fFibZEM2};  // Fibers for EM calorimeter
1661
1662   
1663   //-- Create calorimeters geometry
1664   
1665   // -------------------------------------------------------------------------------
1666   //--> Neutron calorimeter (ZN) 
1667   
1668   gMC->Gsvolu("ZNEU", "BOX ", idtmed[1], fDimZN, 3); // Passive material  
1669   gMC->Gsvolu("ZNF1", "TUBE", idtmed[3], fFibZN, 3); // Active material
1670   gMC->Gsvolu("ZNF2", "TUBE", idtmed[4], fFibZN, 3); 
1671   gMC->Gsvolu("ZNF3", "TUBE", idtmed[4], fFibZN, 3); 
1672   gMC->Gsvolu("ZNF4", "TUBE", idtmed[3], fFibZN, 3); 
1673   gMC->Gsvolu("ZNG1", "BOX ", idtmed[12], fGrvZN, 3); // Empty grooves 
1674   gMC->Gsvolu("ZNG2", "BOX ", idtmed[12], fGrvZN, 3); 
1675   gMC->Gsvolu("ZNG3", "BOX ", idtmed[12], fGrvZN, 3); 
1676   gMC->Gsvolu("ZNG4", "BOX ", idtmed[12], fGrvZN, 3); 
1677   
1678   // Divide ZNEU in towers (for hits purposes) 
1679   
1680   gMC->Gsdvn("ZNTX", "ZNEU", fTowZN[0], 1); // x-tower 
1681   gMC->Gsdvn("ZN1 ", "ZNTX", fTowZN[1], 2); // y-tower
1682   
1683   //-- Divide ZN1 in minitowers 
1684   //  fDivZN[0]= NUMBER OF FIBERS PER TOWER ALONG X-AXIS, 
1685   //  fDivZN[1]= NUMBER OF FIBERS PER TOWER ALONG Y-AXIS
1686   //  (4 fibres per minitower) 
1687   
1688   gMC->Gsdvn("ZNSL", "ZN1 ", fDivZN[1], 2); // Slices 
1689   gMC->Gsdvn("ZNST", "ZNSL", fDivZN[0], 1); // Sticks
1690   
1691   // --- Position the empty grooves in the sticks (4 grooves per stick)
1692   Float_t dx = fDimZN[0] / fDivZN[0] / 4.;
1693   Float_t dy = fDimZN[1] / fDivZN[1] / 4.;
1694   
1695   gMC->Gspos("ZNG1", 1, "ZNST", 0.-dx, 0.+dy, 0., 0, "ONLY");
1696   gMC->Gspos("ZNG2", 1, "ZNST", 0.+dx, 0.+dy, 0., 0, "ONLY");
1697   gMC->Gspos("ZNG3", 1, "ZNST", 0.-dx, 0.-dy, 0., 0, "ONLY");
1698   gMC->Gspos("ZNG4", 1, "ZNST", 0.+dx, 0.-dy, 0., 0, "ONLY");
1699   
1700   // --- Position the fibers in the grooves 
1701   gMC->Gspos("ZNF1", 1, "ZNG1", 0., 0., 0., 0, "ONLY");
1702   gMC->Gspos("ZNF2", 1, "ZNG2", 0., 0., 0., 0, "ONLY");
1703   gMC->Gspos("ZNF3", 1, "ZNG3", 0., 0., 0., 0, "ONLY");
1704   gMC->Gspos("ZNF4", 1, "ZNG4", 0., 0., 0., 0, "ONLY");
1705   
1706   // --- Position the neutron calorimeter in ZDC 
1707   // -- Rotation of ZDCs
1708   Int_t irotzdc;
1709   gMC->Matrix(irotzdc, 90., 180., 90., 90., 180., 0.);
1710   //
1711   gMC->Gspos("ZNEU", 1, "ZDCC", fPosZNC[0], fPosZNC[1], fPosZNC[2]-fDimZN[2], irotzdc, "ONLY");
1712   //Ch debug
1713   //printf("\n ZN -> %f < z < %f cm\n",fPosZN[2],fPosZN[2]-2*fDimZN[2]);
1714
1715   // --- Position the neutron calorimeter in ZDC2 (left line) 
1716   // -- No Rotation of ZDCs
1717   gMC->Gspos("ZNEU", 2, "ZDCA", fPosZNA[0], fPosZNA[1], fPosZNA[2]+fDimZN[2], 0, "ONLY");
1718   //Ch debug
1719   //printf("\n ZN left -> %f < z < %f cm\n",fPosZNl[2],fPosZNl[2]+2*fDimZN[2]);
1720
1721
1722   // -------------------------------------------------------------------------------
1723   //--> Proton calorimeter (ZP)  
1724   
1725   gMC->Gsvolu("ZPRO", "BOX ", idtmed[2], fDimZP, 3); // Passive material
1726   gMC->Gsvolu("ZPF1", "TUBE", idtmed[3], fFibZP, 3); // Active material
1727   gMC->Gsvolu("ZPF2", "TUBE", idtmed[4], fFibZP, 3); 
1728   gMC->Gsvolu("ZPF3", "TUBE", idtmed[4], fFibZP, 3); 
1729   gMC->Gsvolu("ZPF4", "TUBE", idtmed[3], fFibZP, 3); 
1730   gMC->Gsvolu("ZPG1", "BOX ", idtmed[12], fGrvZP, 3); // Empty grooves 
1731   gMC->Gsvolu("ZPG2", "BOX ", idtmed[12], fGrvZP, 3); 
1732   gMC->Gsvolu("ZPG3", "BOX ", idtmed[12], fGrvZP, 3); 
1733   gMC->Gsvolu("ZPG4", "BOX ", idtmed[12], fGrvZP, 3); 
1734     
1735   //-- Divide ZPRO in towers(for hits purposes) 
1736   
1737   gMC->Gsdvn("ZPTX", "ZPRO", fTowZP[0], 1); // x-tower 
1738   gMC->Gsdvn("ZP1 ", "ZPTX", fTowZP[1], 2); // y-tower
1739   
1740   
1741   //-- Divide ZP1 in minitowers 
1742   //  fDivZP[0]= NUMBER OF FIBERS ALONG X-AXIS PER MINITOWER, 
1743   //  fDivZP[1]= NUMBER OF FIBERS ALONG Y-AXIS PER MINITOWER
1744   //  (4 fiber per minitower) 
1745   
1746   gMC->Gsdvn("ZPSL", "ZP1 ", fDivZP[1], 2); // Slices 
1747   gMC->Gsdvn("ZPST", "ZPSL", fDivZP[0], 1); // Sticks
1748   
1749   // --- Position the empty grooves in the sticks (4 grooves per stick)
1750   dx = fDimZP[0] / fTowZP[0] / fDivZP[0] / 2.;
1751   dy = fDimZP[1] / fTowZP[1] / fDivZP[1] / 2.;
1752   
1753   gMC->Gspos("ZPG1", 1, "ZPST", 0.-dx, 0.+dy, 0., 0, "ONLY");
1754   gMC->Gspos("ZPG2", 1, "ZPST", 0.+dx, 0.+dy, 0., 0, "ONLY");
1755   gMC->Gspos("ZPG3", 1, "ZPST", 0.-dx, 0.-dy, 0., 0, "ONLY");
1756   gMC->Gspos("ZPG4", 1, "ZPST", 0.+dx, 0.-dy, 0., 0, "ONLY");
1757   
1758   // --- Position the fibers in the grooves 
1759   gMC->Gspos("ZPF1", 1, "ZPG1", 0., 0., 0., 0, "ONLY");
1760   gMC->Gspos("ZPF2", 1, "ZPG2", 0., 0., 0., 0, "ONLY");
1761   gMC->Gspos("ZPF3", 1, "ZPG3", 0., 0., 0., 0, "ONLY");
1762   gMC->Gspos("ZPF4", 1, "ZPG4", 0., 0., 0., 0, "ONLY");
1763   
1764
1765   // --- Position the proton calorimeter in ZDCC
1766   gMC->Gspos("ZPRO", 1, "ZDCC", fPosZPC[0], fPosZPC[1], fPosZPC[2]-fDimZP[2], irotzdc, "ONLY");
1767   //Ch debug
1768   //printf("\n ZP -> %f < z < %f cm\n",fPosZP[2],fPosZP[2]-2*fDimZP[2]);
1769   
1770   // --- Position the proton calorimeter in ZDCA
1771   // --- No rotation 
1772   gMC->Gspos("ZPRO", 2, "ZDCA", fPosZPA[0], fPosZPA[1], fPosZPA[2]+fDimZP[2], 0, "ONLY");
1773   //Ch debug
1774   //printf("\n ZP left -> %f < z < %f cm\n",fPosZPl[2],fPosZPl[2]+2*fDimZP[2]);  
1775     
1776   
1777   // -------------------------------------------------------------------------------
1778   // -> EM calorimeter (ZEM)  
1779   
1780   gMC->Gsvolu("ZEM ", "PARA", idtmed[10], fDimZEM, 6);
1781
1782   Int_t irot1, irot2;
1783   gMC->Matrix(irot1,0.,0.,90.,90.,-90.,0.);                    // Rotation matrix 1  
1784   gMC->Matrix(irot2,180.,0.,90.,fDimZEM[3]+90.,90.,fDimZEM[3]);// Rotation matrix 2
1785   //printf("irot1 = %d, irot2 = %d \n", irot1, irot2);
1786   
1787   gMC->Gsvolu("ZEMF", "TUBE", idtmed[3], fFibZEM, 3);   // Active material
1788
1789   gMC->Gsdvn("ZETR", "ZEM ", fDivZEM[2], 1);            // Tranches 
1790   
1791   dimPb[0] = kDimZEMPb;                                 // Lead slices 
1792   dimPb[1] = fDimZEM[2];
1793   dimPb[2] = fDimZEM[1];
1794   //dimPb[3] = fDimZEM[3]; //controllare
1795   dimPb[3] = 90.-fDimZEM[3]; //originale
1796   dimPb[4] = 0.;
1797   dimPb[5] = 0.;
1798   gMC->Gsvolu("ZEL0", "PARA", idtmed[5], dimPb, 6);
1799   gMC->Gsvolu("ZEL1", "PARA", idtmed[5], dimPb, 6);
1800   gMC->Gsvolu("ZEL2", "PARA", idtmed[5], dimPb, 6);
1801   
1802   // --- Position the lead slices in the tranche 
1803   Float_t zTran = fDimZEM[0]/fDivZEM[2]; 
1804   Float_t zTrPb = -zTran+kDimZEMPb;
1805   gMC->Gspos("ZEL0", 1, "ZETR", zTrPb, 0., 0., 0, "ONLY");
1806   gMC->Gspos("ZEL1", 1, "ZETR", kDimZEMPb, 0., 0., 0, "ONLY");
1807   
1808   // --- Vacuum zone (to be filled with fibres)
1809   dimVoid[0] = (zTran-2*kDimZEMPb)/2.;
1810   dimVoid[1] = fDimZEM[2];
1811   dimVoid[2] = fDimZEM[1];
1812   dimVoid[3] = 90.-fDimZEM[3];
1813   dimVoid[4] = 0.;
1814   dimVoid[5] = 0.;
1815   gMC->Gsvolu("ZEV0", "PARA", idtmed[10], dimVoid,6);
1816   gMC->Gsvolu("ZEV1", "PARA", idtmed[10], dimVoid,6);
1817   
1818   // --- Divide the vacuum slice into sticks along x axis
1819   gMC->Gsdvn("ZES0", "ZEV0", fDivZEM[0], 3); 
1820   gMC->Gsdvn("ZES1", "ZEV1", fDivZEM[0], 3); 
1821   
1822   // --- Positioning the fibers into the sticks
1823   gMC->Gspos("ZEMF", 1,"ZES0", 0., 0., 0., irot2, "ONLY");
1824   gMC->Gspos("ZEMF", 1,"ZES1", 0., 0., 0., irot2, "ONLY");
1825   
1826   // --- Positioning the vacuum slice into the tranche
1827   //Float_t displFib = fDimZEM[1]/fDivZEM[0];
1828   gMC->Gspos("ZEV0", 1,"ZETR", -dimVoid[0], 0., 0., 0, "ONLY");
1829   gMC->Gspos("ZEV1", 1,"ZETR", -dimVoid[0]+zTran, 0., 0., 0, "ONLY");
1830
1831   // --- Positioning the ZEM into the ZDC - rotation for 90 degrees  
1832   // NB -> ZEM is positioned in ALIC (instead of in ZDC) volume
1833   gMC->Gspos("ZEM ", 1,"ALIC", -fPosZEM[0], fPosZEM[1], fPosZEM[2]+fDimZEM[0], irot1, "ONLY");
1834   
1835   // Second EM ZDC (same side w.r.t. IP, just on the other side w.r.t. beam pipe)
1836   gMC->Gspos("ZEM ", 2,"ALIC", fPosZEM[0], fPosZEM[1], fPosZEM[2]+fDimZEM[0], irot1, "ONLY");
1837   
1838   // --- Adding last slice at the end of the EM calorimeter 
1839   Float_t zLastSlice = fPosZEM[2]+kDimZEMPb+2*fDimZEM[0];
1840   gMC->Gspos("ZEL2", 1,"ALIC", fPosZEM[0], fPosZEM[1], zLastSlice, irot1, "ONLY");
1841   //Ch debug
1842   //printf("\n ZEM lenght = %f cm\n",2*fZEMLength);
1843   //printf("\n ZEM -> %f < z < %f cm\n",fPosZEM[2],fPosZEM[2]+2*fZEMLength+zLastSlice+kDimZEMPb);
1844   
1845 }
1846  
1847 //_____________________________________________________________________________
1848 void AliZDCv3::DrawModule() const
1849 {
1850   //
1851   // Draw a shaded view of the Zero Degree Calorimeter version 1
1852   //
1853
1854   // Set everything unseen
1855   gMC->Gsatt("*", "seen", -1);
1856   // 
1857   // Set ALIC mother transparent
1858   gMC->Gsatt("ALIC","SEEN",0);
1859   //
1860   // Set the volumes visible
1861   gMC->Gsatt("ZDCC","SEEN",0);
1862   gMC->Gsatt("QT01","SEEN",1);
1863   gMC->Gsatt("QT02","SEEN",1);
1864   gMC->Gsatt("QT03","SEEN",1);
1865   gMC->Gsatt("QT04","SEEN",1);
1866   gMC->Gsatt("QT05","SEEN",1);
1867   gMC->Gsatt("QT06","SEEN",1);
1868   gMC->Gsatt("QT07","SEEN",1);
1869   gMC->Gsatt("QT08","SEEN",1);
1870   gMC->Gsatt("QT09","SEEN",1);
1871   gMC->Gsatt("QT10","SEEN",1);
1872   gMC->Gsatt("QT11","SEEN",1);
1873   gMC->Gsatt("QT12","SEEN",1);
1874   gMC->Gsatt("QT13","SEEN",1);
1875   gMC->Gsatt("QC01","SEEN",1);
1876   gMC->Gsatt("QC02","SEEN",1);
1877   gMC->Gsatt("QC03","SEEN",1);
1878   gMC->Gsatt("QC04","SEEN",1);
1879   gMC->Gsatt("QC05","SEEN",1);
1880   gMC->Gsatt("QC06","SEEN",1);
1881   gMC->Gsatt("QC07","SEEN",1);
1882   gMC->Gsatt("QC08","SEEN",1);
1883   gMC->Gsatt("QC09","SEEN",1);
1884   gMC->Gsatt("QC10","SEEN",1);
1885   gMC->Gsatt("MQXL","SEEN",1);
1886   gMC->Gsatt("YMQL","SEEN",1);
1887   gMC->Gsatt("MQX ","SEEN",1);
1888   gMC->Gsatt("YMQ ","SEEN",1);
1889   gMC->Gsatt("ZQYX","SEEN",1);
1890   gMC->Gsatt("MD1 ","SEEN",1);
1891   gMC->Gsatt("MD1V","SEEN",1);
1892   gMC->Gsatt("YD1 ","SEEN",1);
1893   gMC->Gsatt("MD2 ","SEEN",1);
1894   gMC->Gsatt("YD2 ","SEEN",1);
1895   gMC->Gsatt("ZNEU","SEEN",0);
1896   gMC->Gsatt("ZNF1","SEEN",0);
1897   gMC->Gsatt("ZNF2","SEEN",0);
1898   gMC->Gsatt("ZNF3","SEEN",0);
1899   gMC->Gsatt("ZNF4","SEEN",0);
1900   gMC->Gsatt("ZNG1","SEEN",0);
1901   gMC->Gsatt("ZNG2","SEEN",0);
1902   gMC->Gsatt("ZNG3","SEEN",0);
1903   gMC->Gsatt("ZNG4","SEEN",0);
1904   gMC->Gsatt("ZNTX","SEEN",0);
1905   gMC->Gsatt("ZN1 ","COLO",4); 
1906   gMC->Gsatt("ZN1 ","SEEN",1);
1907   gMC->Gsatt("ZNSL","SEEN",0);
1908   gMC->Gsatt("ZNST","SEEN",0);
1909   gMC->Gsatt("ZPRO","SEEN",0);
1910   gMC->Gsatt("ZPF1","SEEN",0);
1911   gMC->Gsatt("ZPF2","SEEN",0);
1912   gMC->Gsatt("ZPF3","SEEN",0);
1913   gMC->Gsatt("ZPF4","SEEN",0);
1914   gMC->Gsatt("ZPG1","SEEN",0);
1915   gMC->Gsatt("ZPG2","SEEN",0);
1916   gMC->Gsatt("ZPG3","SEEN",0);
1917   gMC->Gsatt("ZPG4","SEEN",0);
1918   gMC->Gsatt("ZPTX","SEEN",0);
1919   gMC->Gsatt("ZP1 ","COLO",6); 
1920   gMC->Gsatt("ZP1 ","SEEN",1);
1921   gMC->Gsatt("ZPSL","SEEN",0);
1922   gMC->Gsatt("ZPST","SEEN",0);
1923   gMC->Gsatt("ZEM ","COLO",7); 
1924   gMC->Gsatt("ZEM ","SEEN",1);
1925   gMC->Gsatt("ZEMF","SEEN",0);
1926   gMC->Gsatt("ZETR","SEEN",0);
1927   gMC->Gsatt("ZEL0","SEEN",0);
1928   gMC->Gsatt("ZEL1","SEEN",0);
1929   gMC->Gsatt("ZEL2","SEEN",0);
1930   gMC->Gsatt("ZEV0","SEEN",0);
1931   gMC->Gsatt("ZEV1","SEEN",0);
1932   gMC->Gsatt("ZES0","SEEN",0);
1933   gMC->Gsatt("ZES1","SEEN",0);
1934   //
1935   gMC->Gdopt("hide", "on");
1936   gMC->Gdopt("shad", "on");
1937   gMC->Gsatt("*", "fill", 7);
1938   gMC->SetClipBox(".");
1939   gMC->SetClipBox("*", 0, 100, -100, 100, 12000, 16000);
1940   gMC->DefaultRange();
1941   gMC->Gdraw("alic", 40, 30, 0, 488, 220, .07, .07);
1942   gMC->Gdhead(1111, "Zero Degree Calorimeter Version 3");
1943   gMC->Gdman(18, 4, "MAN");
1944 }
1945
1946 //_____________________________________________________________________________
1947 void AliZDCv3::CreateMaterials()
1948 {
1949   //
1950   // Create Materials for the Zero Degree Calorimeter
1951   //
1952   Float_t dens, ubuf[1], wmat[3], a[3], z[3];
1953
1954   // --- W alloy -> ZN passive material
1955   dens = 17.6;
1956   a[0] = 183.85;
1957   a[1] = 55.85;
1958   a[2] = 58.71;
1959   z[0] = 74.;
1960   z[1] = 26.;
1961   z[2] = 28.;
1962   wmat[0] = .93;
1963   wmat[1] = .03;
1964   wmat[2] = .04;
1965   AliMixture(1, "WALL", a, z, dens, 3, wmat);
1966
1967   // --- Brass (CuZn)  -> ZP passive material
1968   dens = 8.48;
1969   a[0] = 63.546;
1970   a[1] = 65.39;
1971   z[0] = 29.;
1972   z[1] = 30.;
1973   wmat[0] = .63;
1974   wmat[1] = .37;
1975   AliMixture(2, "BRASS", a, z, dens, 2, wmat);
1976   
1977   // --- SiO2 
1978   dens = 2.64;
1979   a[0] = 28.086;
1980   a[1] = 15.9994;
1981   z[0] = 14.;
1982   z[1] = 8.;
1983   wmat[0] = 1.;
1984   wmat[1] = 2.;
1985   AliMixture(3, "SIO2", a, z, dens, -2, wmat);  
1986   
1987   // --- Lead 
1988   ubuf[0] = 1.12;
1989   AliMaterial(5, "LEAD", 207.19, 82., 11.35, .56, 18.5, ubuf, 1);
1990
1991   // --- Copper (energy loss taken into account)
1992   ubuf[0] = 1.10;
1993   AliMaterial(6, "COPP0", 63.54, 29., 8.96, 1.4, 0., ubuf, 1);
1994   
1995   // --- Iron (energy loss taken into account)
1996   ubuf[0] = 1.1;
1997   AliMaterial(7, "IRON0", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
1998   
1999   // --- Iron (no energy loss)
2000   ubuf[0] = 1.1;
2001   AliMaterial(8, "IRON1", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
2002     
2003   // ---------------------------------------------------------  
2004   Float_t aResGas[3]={1.008,12.0107,15.9994};
2005   Float_t zResGas[3]={1.,6.,8.};
2006   Float_t wResGas[3]={0.28,0.28,0.44};
2007   Float_t dResGas = 3.2E-14;
2008
2009   // --- Vacuum (no magnetic field) 
2010   AliMixture(10, "VOID", aResGas, zResGas, dResGas, 3, wResGas);
2011   
2012   // --- Vacuum (with magnetic field) 
2013   AliMixture(11, "VOIM", aResGas, zResGas, dResGas, 3, wResGas);
2014   
2015   // --- Air (no magnetic field)
2016   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
2017   Float_t zAir[4]={6.,7.,8.,18.};
2018   Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
2019   Float_t dAir = 1.20479E-3;
2020   //
2021   AliMixture(12, "Air    $", aAir, zAir, dAir, 4, wAir);
2022   
2023   // ---  Definition of tracking media: 
2024   
2025   // --- Tantalum = 1 ; 
2026   // --- Brass = 2 ; 
2027   // --- Fibers (SiO2) = 3 ; 
2028   // --- Fibers (SiO2) = 4 ; 
2029   // --- Lead = 5 ; 
2030   // --- Copper (with energy loss)= 6 ;
2031   // --- Copper (with energy loss)= 13 ; 
2032   // --- Iron (with energy loss) = 7 ; 
2033   // --- Iron (without energy loss) = 8 ; 
2034   // --- Vacuum (no field) = 10 
2035   // --- Vacuum (with field) = 11 
2036   // --- Air (no field) = 12 
2037   
2038   // **************************************************** 
2039   //     Tracking media parameters
2040   //
2041   Float_t epsil  = 0.01;   // Tracking precision, 
2042   Float_t stmin  = 0.01;   // Min. value 4 max. step (cm)
2043   Float_t stemax = 1.;     // Max. step permitted (cm) 
2044   Float_t tmaxfd = 0.;     // Maximum angle due to field (degrees) 
2045   Float_t deemax = -1.;    // Maximum fractional energy loss
2046   Float_t nofieldm = 0.;   // Max. field value (no field)
2047   Float_t fieldm = 45.;    // Max. field value (with field)
2048   Int_t isvol = 0;         // ISVOL =0 -> not sensitive volume
2049   Int_t isvolActive = 1;   // ISVOL =1 -> sensitive volume
2050   Int_t inofld = 0;        // IFIELD=0 -> no magnetic field
2051   Int_t ifield =2;         // IFIELD=2 -> magnetic field defined in AliMagFC.h
2052   // *****************************************************
2053   
2054   AliMedium(1, "ZTANT", 1, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2055   AliMedium(2, "ZBRASS",2, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2056   AliMedium(3, "ZSIO2", 3, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2057   AliMedium(4, "ZQUAR", 3, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2058   AliMedium(5, "ZLEAD", 5, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2059   AliMedium(6, "ZCOPP", 6, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2060   AliMedium(7, "ZIRON", 7, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2061   AliMedium(8, "ZIRONN",8, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2062   AliMedium(10,"ZVOID",10, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2063   AliMedium(12,"ZAIR", 12, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2064   //
2065   AliMedium(11,"ZVOIM",11, isvol, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
2066
2067
2068
2069
2070 //_____________________________________________________________________________
2071 void AliZDCv3::AddAlignableVolumes() const
2072 {
2073  //
2074  // Create entries for alignable volumes associating the symbolic volume
2075  // name with the corresponding volume path. Needs to be syncronized with
2076  // eventual changes in the geometry.
2077  //
2078  TString volpath1 = "ALIC_1/ZDCC_1/ZNEU_1";
2079  TString volpath2 = "ALIC_1/ZDCC_1/ZPRO_1";
2080  TString volpath3 = "ALIC_1/ZDCA_1/ZNEU_2";
2081  TString volpath4 = "ALIC_1/ZDCA_1/ZPRO_2";
2082
2083  TString symname1="ZDC/NeutronZDC_C";
2084  TString symname2="ZDC/ProtonZDC_C";
2085  TString symname3="ZDC/NeutronZDC_A";
2086  TString symname4="ZDC/ProtonZDC_A";
2087
2088  if(!gGeoManager->SetAlignableEntry(symname1.Data(),volpath1.Data()))
2089      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname1.Data(),volpath1.Data()));
2090
2091  if(!gGeoManager->SetAlignableEntry(symname2.Data(),volpath2.Data()))
2092      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname2.Data(),volpath2.Data()));
2093
2094  if(!gGeoManager->SetAlignableEntry(symname3.Data(),volpath3.Data()))
2095      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname1.Data(),volpath1.Data()));
2096
2097  if(!gGeoManager->SetAlignableEntry(symname4.Data(),volpath4.Data()))
2098      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname2.Data(),volpath2.Data()));
2099
2100 }
2101
2102
2103 //_____________________________________________________________________________
2104 void AliZDCv3::Init()
2105 {
2106  InitTables();
2107   Int_t *idtmed = fIdtmed->GetArray();  
2108   Int_t i;
2109   // Thresholds for showering in the ZDCs 
2110   i = 1; //tantalum
2111   gMC->Gstpar(idtmed[i], "CUTGAM", .001);
2112   gMC->Gstpar(idtmed[i], "CUTELE", .001);
2113   gMC->Gstpar(idtmed[i], "CUTNEU", .01);
2114   gMC->Gstpar(idtmed[i], "CUTHAD", .01);
2115   i = 2; //brass
2116   gMC->Gstpar(idtmed[i], "CUTGAM", .001);
2117   gMC->Gstpar(idtmed[i], "CUTELE", .001);
2118   gMC->Gstpar(idtmed[i], "CUTNEU", .01);
2119   gMC->Gstpar(idtmed[i], "CUTHAD", .01);
2120   i = 5; //lead
2121   gMC->Gstpar(idtmed[i], "CUTGAM", .001);
2122   gMC->Gstpar(idtmed[i], "CUTELE", .001);
2123   gMC->Gstpar(idtmed[i], "CUTNEU", .01);
2124   gMC->Gstpar(idtmed[i], "CUTHAD", .01);
2125   
2126   // Avoid too detailed showering in TDI 
2127   i = 6; //copper
2128   gMC->Gstpar(idtmed[i], "CUTGAM", .1);
2129   gMC->Gstpar(idtmed[i], "CUTELE", .1);
2130   gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
2131   gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
2132   
2133   // Avoid too detailed showering along the beam line 
2134   i = 7; //iron with energy loss (ZIRON)
2135   gMC->Gstpar(idtmed[i], "CUTGAM", .1);
2136   gMC->Gstpar(idtmed[i], "CUTELE", .1);
2137   gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
2138   gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
2139   
2140   // Avoid too detailed showering along the beam line 
2141   i = 8; //iron with energy loss (ZIRONN)
2142   gMC->Gstpar(idtmed[i], "CUTGAM", .1);
2143   gMC->Gstpar(idtmed[i], "CUTELE", .1);
2144   gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
2145   gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
2146   
2147   // Avoid interaction in fibers (only energy loss allowed) 
2148   i = 3; //fibers (ZSI02)
2149   gMC->Gstpar(idtmed[i], "DCAY", 0.);
2150   gMC->Gstpar(idtmed[i], "MULS", 0.);
2151   gMC->Gstpar(idtmed[i], "PFIS", 0.);
2152   gMC->Gstpar(idtmed[i], "MUNU", 0.);
2153   gMC->Gstpar(idtmed[i], "LOSS", 1.);
2154   gMC->Gstpar(idtmed[i], "PHOT", 0.);
2155   gMC->Gstpar(idtmed[i], "COMP", 0.);
2156   gMC->Gstpar(idtmed[i], "PAIR", 0.);
2157   gMC->Gstpar(idtmed[i], "BREM", 0.);
2158   gMC->Gstpar(idtmed[i], "DRAY", 0.);
2159   gMC->Gstpar(idtmed[i], "ANNI", 0.);
2160   gMC->Gstpar(idtmed[i], "HADR", 0.);
2161   i = 4; //fibers (ZQUAR)
2162   gMC->Gstpar(idtmed[i], "DCAY", 0.);
2163   gMC->Gstpar(idtmed[i], "MULS", 0.);
2164   gMC->Gstpar(idtmed[i], "PFIS", 0.);
2165   gMC->Gstpar(idtmed[i], "MUNU", 0.);
2166   gMC->Gstpar(idtmed[i], "LOSS", 1.);
2167   gMC->Gstpar(idtmed[i], "PHOT", 0.);
2168   gMC->Gstpar(idtmed[i], "COMP", 0.);
2169   gMC->Gstpar(idtmed[i], "PAIR", 0.);
2170   gMC->Gstpar(idtmed[i], "BREM", 0.);
2171   gMC->Gstpar(idtmed[i], "DRAY", 0.);
2172   gMC->Gstpar(idtmed[i], "ANNI", 0.);
2173   gMC->Gstpar(idtmed[i], "HADR", 0.);
2174   
2175   // Avoid interaction in void 
2176   i = 11; //void with field
2177   gMC->Gstpar(idtmed[i], "DCAY", 0.);
2178   gMC->Gstpar(idtmed[i], "MULS", 0.);
2179   gMC->Gstpar(idtmed[i], "PFIS", 0.);
2180   gMC->Gstpar(idtmed[i], "MUNU", 0.);
2181   gMC->Gstpar(idtmed[i], "LOSS", 0.);
2182   gMC->Gstpar(idtmed[i], "PHOT", 0.);
2183   gMC->Gstpar(idtmed[i], "COMP", 0.);
2184   gMC->Gstpar(idtmed[i], "PAIR", 0.);
2185   gMC->Gstpar(idtmed[i], "BREM", 0.);
2186   gMC->Gstpar(idtmed[i], "DRAY", 0.);
2187   gMC->Gstpar(idtmed[i], "ANNI", 0.);
2188   gMC->Gstpar(idtmed[i], "HADR", 0.);
2189
2190   //
2191   fMedSensZN  = idtmed[1];  // Sensitive volume: ZN passive material
2192   fMedSensZP  = idtmed[2];  // Sensitive volume: ZP passive material
2193   fMedSensF1  = idtmed[3];  // Sensitive volume: fibres type 1
2194   fMedSensF2  = idtmed[4];  // Sensitive volume: fibres type 2
2195   fMedSensZEM = idtmed[5];  // Sensitive volume: ZEM passive material
2196   fMedSensTDI = idtmed[6];  // Sensitive volume: TDI Cu shield
2197   fMedSensPI  = idtmed[7];  // Sensitive volume: beam pipes
2198   fMedSensGR  = idtmed[12]; // Sensitive volume: air into the grooves
2199 }
2200
2201 //_____________________________________________________________________________
2202 void AliZDCv3::InitTables()
2203 {
2204  //
2205  // Read light tables for Cerenkov light production parameterization 
2206  //
2207
2208   Int_t k, j;
2209
2210   char *lightfName1,*lightfName2,*lightfName3,*lightfName4,
2211        *lightfName5,*lightfName6,*lightfName7,*lightfName8;
2212   FILE *fp1, *fp2, *fp3, *fp4, *fp5, *fp6, *fp7, *fp8;
2213
2214   //  --- Reading light tables for ZN 
2215   lightfName1 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362207s");
2216   if((fp1 = fopen(lightfName1,"r")) == NULL){
2217      printf("Cannot open file fp1 \n");
2218      return;
2219   }
2220   lightfName2 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362208s");
2221   if((fp2 = fopen(lightfName2,"r")) == NULL){
2222      printf("Cannot open file fp2 \n");
2223      return;
2224   }  
2225   lightfName3 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362209s");
2226   if((fp3 = fopen(lightfName3,"r")) == NULL){
2227      printf("Cannot open file fp3 \n");
2228      return;
2229   }
2230   lightfName4 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362210s");
2231   if((fp4 = fopen(lightfName4,"r")) == NULL){
2232      printf("Cannot open file fp4 \n");
2233      return;
2234   }
2235   
2236   for(k=0; k<fNalfan; k++){
2237      for(j=0; j<fNben; j++){
2238        fscanf(fp1,"%f",&fTablen[0][k][j]);
2239        fscanf(fp2,"%f",&fTablen[1][k][j]);
2240        fscanf(fp3,"%f",&fTablen[2][k][j]);
2241        fscanf(fp4,"%f",&fTablen[3][k][j]);
2242      } 
2243   }
2244   fclose(fp1);
2245   fclose(fp2);
2246   fclose(fp3);
2247   fclose(fp4);
2248   
2249   //  --- Reading light tables for ZP and ZEM
2250   lightfName5 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552207s");
2251   if((fp5 = fopen(lightfName5,"r")) == NULL){
2252      printf("Cannot open file fp5 \n");
2253      return;
2254   }
2255   lightfName6 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552208s");
2256   if((fp6 = fopen(lightfName6,"r")) == NULL){
2257      printf("Cannot open file fp6 \n");
2258      return;
2259   }
2260   lightfName7 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552209s");
2261   if((fp7 = fopen(lightfName7,"r")) == NULL){
2262      printf("Cannot open file fp7 \n");
2263      return;
2264   }
2265   lightfName8 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552210s");
2266   if((fp8 = fopen(lightfName8,"r")) == NULL){
2267      printf("Cannot open file fp8 \n");
2268      return;
2269   }
2270   
2271   for(k=0; k<fNalfap; k++){
2272      for(j=0; j<fNbep; j++){
2273        fscanf(fp5,"%f",&fTablep[0][k][j]);
2274        fscanf(fp6,"%f",&fTablep[1][k][j]);
2275        fscanf(fp7,"%f",&fTablep[2][k][j]);
2276        fscanf(fp8,"%f",&fTablep[3][k][j]);
2277      } 
2278   }
2279   fclose(fp5);
2280   fclose(fp6);
2281   fclose(fp7);
2282   fclose(fp8);
2283 }
2284 //_____________________________________________________________________________
2285 void AliZDCv3::StepManager()
2286 {
2287   //
2288   // Routine called at every step in the Zero Degree Calorimeters
2289   //
2290   Int_t   j, vol[2]={0,0}, ibeta=0, ialfa=0, ibe=0, nphe=0;
2291   Float_t hits[12], x[3], xdet[3], um[3], ud[3];
2292   Float_t m=0., ekin=0., destep=0., be=0., out=0.;
2293   // Parametrization for light guide uniformity
2294   // NEW!!! Light guide tilted @ 51 degrees
2295   Float_t guiPar[4]={0.31,-0.0006305,0.01337,0.8895};
2296   Double_t s[3], p[3];
2297   const char *knamed;
2298   //
2299   for(j=0;j<12;j++) hits[j]=-999.;
2300   //
2301   // --- This part is for no shower developement in beam pipe and TDI
2302   // If particle interacts with beam pipe or TDI -> return
2303   if((gMC->CurrentMedium() == fMedSensPI) || (gMC->CurrentMedium() == fMedSensTDI)){ 
2304     // If option NoShower is set -> StopTrack
2305     Int_t ipr = 0; 
2306     if(fNoShower==1){
2307       gMC->TrackPosition(s[0],s[1],s[2]);
2308       if(gMC->CurrentMedium() == fMedSensPI){
2309         knamed = gMC->CurrentVolName();
2310         if(!strncmp(knamed,"YMQ",3)){
2311           if(s[2]<0) fpLostITC += 1;
2312           else fpLostITA += 1;
2313           ipr=1;
2314         }
2315         else if(!strncmp(knamed,"YD1",3)){
2316           if(s[2]<0) fpLostD1C += 1;
2317           else fpLostD1A += 1;
2318           ipr=1;
2319         }
2320         else if(!strncmp(knamed,"QAL",3)) fnTrou++;
2321       }
2322       else if(gMC->CurrentMedium() == fMedSensTDI){ 
2323         knamed = gMC->CurrentVolName();
2324         if(!strncmp(knamed,"MD1",3)){
2325           if(s[2]<0) fpLostD1C += 1;
2326           else  fpLostD1A += 1;
2327           ipr=1;
2328         }
2329         else if(!strncmp(knamed,"QTD",3)) fpLostTDI += 1;
2330         else if(!strncmp(knamed,"QLU",3)){
2331           if(s[2]<0) fnLumiC ++;
2332           else fnLumiA++;
2333           ipr=1;
2334         }
2335       }
2336       //
2337       //gMC->TrackMomentum(p[0], p[1], p[2], p[3]);
2338       //printf("\t Particle: mass = %1.3f, E = %1.3f GeV, pz = %1.2f GeV -> stopped in volume %s\n", 
2339       //     gMC->TrackMass(), p[3], p[2], gMC->CurrentVolName());
2340       //
2341       if(ipr!=0){
2342         printf("\n\t **********************************\n");
2343         printf("\t ********** Side C **********\n");
2344         printf("\t # of spectators in IT = %d\n",fpLostITC);
2345         printf("\t # of spectators in D1 = %d\n",fpLostD1C);
2346         printf("\t # of spectators in luminometer = %d\n",fnLumiC);
2347         printf("\t ********** Side A **********\n");
2348         printf("\t # of spectators in IT = %d\n",fpLostITA);
2349         printf("\t # of spectators in D1 = %d\n",fpLostD1A);
2350         printf("\t # of spectators in TDI = %d\n",fpLostTDI);
2351         printf("\t # of spectators in luminometer = %d\n",fnLumiA);
2352         printf("\t # of spectators in trousers = %d\n",fnTrou);
2353         printf("\t **********************************\n");
2354       }
2355       gMC->StopTrack();
2356     }
2357     return;
2358   }
2359   
2360
2361   if((gMC->CurrentMedium() == fMedSensZN) || (gMC->CurrentMedium() == fMedSensZP) ||
2362      (gMC->CurrentMedium() == fMedSensGR) || (gMC->CurrentMedium() == fMedSensF1) ||
2363      (gMC->CurrentMedium() == fMedSensF2) || (gMC->CurrentMedium() == fMedSensZEM)){
2364
2365     
2366   //Particle coordinates 
2367     gMC->TrackPosition(s[0],s[1],s[2]);
2368     for(j=0; j<=2; j++) x[j] = s[j];
2369     hits[0] = x[0];
2370     hits[1] = x[1];
2371     hits[2] = x[2];
2372
2373   // Determine in which ZDC the particle is
2374     knamed = gMC->CurrentVolName();
2375     if(!strncmp(knamed,"ZN",2)){
2376           if(x[2]<0.) vol[0]=1; // ZNC (dimuon side)
2377           else if(x[2]>0.) vol[0]=4; //ZNA
2378     }
2379     else if(!strncmp(knamed,"ZP",2)){ 
2380           if(x[2]<0.) vol[0]=2; //ZPC (dimuon side)
2381           else if(x[2]>0.) vol[0]=5; //ZPA  
2382     }
2383     else if(!strncmp(knamed,"ZE",2)) vol[0]=3; //ZEM
2384   
2385   // Determine in which quadrant the particle is
2386     if(vol[0]==1){      //Quadrant in ZNC
2387       // Calculating particle coordinates inside ZNC
2388       xdet[0] = x[0]-fPosZNC[0];
2389       xdet[1] = x[1]-fPosZNC[1];
2390       // Calculating quadrant in ZN
2391       if(xdet[0]<=0.){
2392         if(xdet[1]<=0.) vol[1]=1;
2393         else vol[1]=3;
2394       }
2395       else if(xdet[0]>0.){
2396         if(xdet[1]<=0.) vol[1]=2;
2397         else vol[1]=4;
2398       }
2399     }
2400     
2401     else if(vol[0]==2){ //Quadrant in ZPC
2402       // Calculating particle coordinates inside ZPC
2403       xdet[0] = x[0]-fPosZPC[0];
2404       xdet[1] = x[1]-fPosZPC[1];
2405       if(xdet[0]>=fDimZP[0])  xdet[0]=fDimZP[0]-0.01;
2406       if(xdet[0]<=-fDimZP[0]) xdet[0]=-fDimZP[0]+0.01;
2407       // Calculating tower in ZP
2408       Float_t xqZP = xdet[0]/(fDimZP[0]/2.);
2409       for(int i=1; i<=4; i++){
2410          if(xqZP>=(i-3) && xqZP<(i-2)){
2411            vol[1] = i;
2412            break;
2413          }
2414       }
2415     }
2416     //
2417     // Quadrant in ZEM: vol[1] = 1 -> particle in 1st ZEM (placed at x = 8.5 cm)
2418     //                  vol[1] = 2 -> particle in 2nd ZEM (placed at x = -8.5 cm)
2419     else if(vol[0] == 3){       
2420       if(x[0]>0.){
2421         vol[1] = 1;
2422         // Particle x-coordinate inside ZEM1
2423         xdet[0] = x[0]-fPosZEM[0];
2424       }
2425       else{
2426         vol[1] = 2;
2427         // Particle x-coordinate inside ZEM2
2428         xdet[0] = x[0]+fPosZEM[0];
2429       }
2430       xdet[1] = x[1]-fPosZEM[1];
2431     }
2432     //
2433     else if(vol[0]==4){ //Quadrant in ZNA
2434       // Calculating particle coordinates inside ZNA
2435       xdet[0] = x[0]-fPosZNA[0];
2436       xdet[1] = x[1]-fPosZNA[1];
2437       // Calculating quadrant in ZNA
2438       if(xdet[0]>=0.){
2439         if(xdet[1]<=0.) vol[1]=1;
2440         else vol[1]=3;
2441       }
2442       else if(xdet[0]<0.){
2443         if(xdet[1]<=0.) vol[1]=2;
2444         else vol[1]=4;
2445       }
2446     }    
2447     //
2448     else if(vol[0]==5){ //Quadrant in ZPA
2449       // Calculating particle coordinates inside ZPA
2450       xdet[0] = x[0]-fPosZPA[0];
2451       xdet[1] = x[1]-fPosZPA[1];
2452       if(xdet[0]>=fDimZP[0])  xdet[0]=fDimZP[0]-0.01;
2453       if(xdet[0]<=-fDimZP[0]) xdet[0]=-fDimZP[0]+0.01;
2454       // Calculating tower in ZP
2455       Float_t xqZP = -xdet[0]/(fDimZP[0]/2.);
2456       for(int i=1; i<=4; i++){
2457          if(xqZP>=(i-3) && xqZP<(i-2)){
2458            vol[1] = i;
2459            break;
2460          }
2461       }
2462     }    
2463     if((vol[1]!=1) && (vol[1]!=2) && (vol[1]!=3) && (vol[1]!=4))
2464       AliError(Form("AliZDCv3 -> WRONG tower for det %d: tow %d with xdet=(%f, %f)\n",
2465                 vol[0], vol[1], xdet[0], xdet[1]));
2466     // Ch. debug
2467     //printf("\t *** det %d vol %d xdet(%f, %f)\n",vol[0], vol[1], xdet[0], xdet[1]);
2468     
2469     
2470   // Store impact point and kinetic energy of the ENTERING particle
2471     
2472       if(gMC->IsTrackEntering()){
2473         //Particle energy
2474         gMC->TrackMomentum(p[0],p[1],p[2],p[3]);
2475         hits[3] = p[3];
2476         // Impact point on ZDC
2477         // X takes into account the LHC x-axis sign
2478         // which is opposite to positive x on detcetor front face
2479         // for side A detectors (ZNA and ZPA)  
2480         if(vol[0]==4 || vol[0]==5) hits[4] = -xdet[0];
2481         else hits[4] = -xdet[0];
2482         hits[5] = xdet[1];
2483         hits[6] = 0;
2484         hits[7] = 0;
2485         hits[8] = 0;
2486         hits[9] = 0;
2487         //
2488         Int_t curTrackN = gAlice->GetMCApp()->GetCurrentTrackNumber();
2489         TParticle *part = (gAlice->GetMCApp())->Particle(curTrackN);
2490         hits[10] = part->GetPdgCode();
2491         //printf("\t PDGCode = %d\n", part->GetPdgCode());
2492         //
2493         hits[11] = 1.0e09*gMC->TrackTime();
2494         //printf("\t TrackTime = %f\n", hits[11]);
2495
2496         AddHit(curTrackN, vol, hits);
2497         
2498         if(fNoShower==1){
2499           //printf("\t VolName %s -> det %d quad %d - x = %f, y = %f, z = %f\n", 
2500             //knamed, vol[0], vol[1], x[0], x[1], x[2]);
2501           if(vol[0]==1){
2502             fnDetectedC += 1;
2503             printf("      # of particles in ZNC = %d\n\n",fnDetectedC);
2504           }
2505           else if(vol[0]==2){
2506             fpDetectedC += 1;
2507             printf("      # of particles in ZPC = %d\n\n",fpDetectedC);
2508           }
2509           else if(vol[0]==4){
2510             fnDetectedA += 1;
2511             printf("      # of particles in ZNA = %d\n\n",fnDetectedA);     
2512           }
2513           else if(vol[0]==5){
2514             fpDetectedA += 1;
2515             printf("      # of particles in ZPA = %d\n\n",fpDetectedA);      
2516           }
2517           //
2518           //printf("\t Particle: mass = %1.3f, E = %1.3f GeV, pz = %1.2f GeV -> stopped in volume %s\n", 
2519           //   gMC->TrackMass(), p[3], p[2], gMC->CurrentVolName());
2520           //
2521           gMC->StopTrack();
2522           return;
2523         }
2524       }
2525              
2526       // Charged particles -> Energy loss
2527       if((destep=gMC->Edep())){
2528          if(gMC->IsTrackStop()){
2529            gMC->TrackMomentum(p[0],p[1],p[2],p[3]);
2530            m = gMC->TrackMass();
2531            ekin = p[3]-m;
2532            hits[9] = ekin;
2533            hits[7] = 0.;
2534            hits[8] = 0.;
2535            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2536            }
2537          else{
2538            hits[9] = destep;
2539            hits[7] = 0.;
2540            hits[8] = 0.;
2541            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2542            }
2543       }
2544   }
2545  
2546
2547   // *** Light production in fibres 
2548   if((gMC->CurrentMedium() == fMedSensF1) || (gMC->CurrentMedium() == fMedSensF2)){
2549
2550      //Select charged particles
2551      if((destep=gMC->Edep())){
2552
2553        // Particle velocity
2554        Float_t beta = 0.;
2555        gMC->TrackMomentum(p[0],p[1],p[2],p[3]);
2556        Float_t ptot=TMath::Sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
2557        if(p[3] > 0.00001) beta =  ptot/p[3];
2558        else return;
2559        if(beta<0.67)return;
2560        else if((beta>=0.67) && (beta<=0.75)) ibeta = 0;
2561        else if((beta>0.75)  && (beta<=0.85)) ibeta = 1;
2562        else if((beta>0.85)  && (beta<=0.95)) ibeta = 2;
2563        else if(beta>0.95) ibeta = 3;
2564  
2565        // Angle between particle trajectory and fibre axis
2566        // 1 -> Momentum directions
2567        um[0] = p[0]/ptot;
2568        um[1] = p[1]/ptot;
2569        um[2] = p[2]/ptot;
2570        gMC->Gmtod(um,ud,2);
2571        // 2 -> Angle < limit angle
2572        Double_t alfar = TMath::ACos(ud[2]);
2573        Double_t alfa = alfar*kRaddeg;
2574        if(alfa>=110.) return;
2575        //
2576        ialfa = Int_t(1.+alfa/2.);
2577  
2578        // Distance between particle trajectory and fibre axis
2579        gMC->TrackPosition(s[0],s[1],s[2]);
2580        for(j=0; j<=2; j++){
2581           x[j] = s[j];
2582        }
2583        gMC->Gmtod(x,xdet,1);
2584        if(TMath::Abs(ud[0])>0.00001){
2585          Float_t dcoeff = ud[1]/ud[0];
2586          be = TMath::Abs((xdet[1]-dcoeff*xdet[0])/TMath::Sqrt(dcoeff*dcoeff+1.));
2587        }
2588        else{
2589          be = TMath::Abs(ud[0]);
2590        }
2591  
2592        ibe = Int_t(be*1000.+1);
2593        //if((vol[0]==1))      radius = fFibZN[1];
2594        //else if((vol[0]==2)) radius = fFibZP[1];
2595  
2596        //Looking into the light tables 
2597        Float_t charge = gMC->TrackCharge();
2598        
2599        if(vol[0]==1 || vol[0]==4) {     // (1)  ZN fibres
2600          if(ibe>fNben) ibe=fNben;
2601          out =  charge*charge*fTablen[ibeta][ialfa][ibe];
2602          nphe = gRandom->Poisson(out);
2603          // Ch. debug
2604          //if(ibeta==3) printf("\t %f \t %f \t %f\n",alfa, be, out);
2605          //printf("\t ibeta = %d, ialfa = %d, ibe = %d -> nphe = %d\n\n",ibeta,ialfa,ibe,nphe);
2606          if(gMC->CurrentMedium() == fMedSensF1){
2607            hits[7] = nphe;      //fLightPMQ
2608            hits[8] = 0;
2609            hits[9] = 0;
2610            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2611          }
2612          else{
2613            hits[7] = 0;
2614            hits[8] = nphe;      //fLightPMC
2615            hits[9] = 0;
2616            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2617          }
2618        } 
2619        else if(vol[0]==2 || vol[0]==5) {// (2) ZP fibres
2620          if(ibe>fNbep) ibe=fNbep;
2621          out =  charge*charge*fTablep[ibeta][ialfa][ibe];
2622          nphe = gRandom->Poisson(out);
2623          if(gMC->CurrentMedium() == fMedSensF1){
2624            hits[7] = nphe;      //fLightPMQ
2625            hits[8] = 0;
2626            hits[9] = 0;
2627            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2628          }
2629          else{
2630            hits[7] = 0;
2631            hits[8] = nphe;      //fLightPMC
2632            hits[9] = 0;
2633            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2634          }
2635        } 
2636        else if((vol[0]==3)) {   // (3) ZEM fibres
2637          if(ibe>fNbep) ibe=fNbep;
2638          out =  charge*charge*fTablep[ibeta][ialfa][ibe];
2639          gMC->TrackPosition(s[0],s[1],s[2]);
2640          Float_t xalic[3];
2641          for(j=0; j<3; j++){
2642             xalic[j] = s[j];
2643          }
2644          // z-coordinate from ZEM front face 
2645          // NB-> fPosZEM[2]+fZEMLength = -1000.+2*10.3 = 979.69 cm
2646          Float_t z = -xalic[2]+fPosZEM[2]+2*fZEMLength-xalic[1];
2647          //z = xalic[2]-fPosZEM[2]-fZEMLength-xalic[1]*(TMath::Tan(45.*kDegrad));
2648          //printf("     fPosZEM[2]+2*fZEMLength = %f", fPosZEM[2]+2*fZEMLength);
2649          Float_t guiEff = guiPar[0]*(guiPar[1]*z*z+guiPar[2]*z+guiPar[3]);
2650          out = out*guiEff;
2651          nphe = gRandom->Poisson(out);
2652          //printf("     out*guiEff = %f nphe = %d", out, nphe);
2653          if(vol[1] == 1){
2654            hits[7] = 0;         
2655            hits[8] = nphe;      //fLightPMC (ZEM1)
2656            hits[9] = 0;
2657            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2658          }
2659          else{
2660            hits[7] = nphe;      //fLightPMQ (ZEM2)
2661            hits[8] = 0;         
2662            hits[9] = 0;
2663            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2664          }
2665        }
2666      }
2667    }
2668 }