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