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