More volume overlaps corrected
[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[0]-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   // Flange:  first support for the trousers
1184   boxpar[0] = 25.3/2.;
1185   boxpar[1] = 25.3/2.;
1186   boxpar[2] = 2.5/2.;
1187   gMC->Gsvolu("QF03", "BOX ", idtmed[7], boxpar, 3);
1188   tubpar[0] = 0.0/2.;
1189   tubpar[1] = 22.06/2.;
1190   tubpar[2] = 2.5/2.;
1191   gMC->Gsvolu("QFV1", "TUBE", idtmed[10], tubpar, 3);
1192   gMC->Gspos("QFV1", 1, "QF03", 0., 0., 0., 0, "MANY");
1193   gMC->Gspos("QF03", 1, "ZDCA", 0., 0., 14.3+zd2, 0, "MANY");  
1194   
1195   // tube  
1196   tubpar[0] = 21.66/2.;
1197   tubpar[1] = 22.06/2.;
1198   tubpar[2] = 28.6/2.;
1199   gMC->Gsvolu("QA35", "TUBE", idtmed[7], tubpar, 3);
1200   gMC->Gspos("QA35", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");
1201   // Ch.debug 
1202   //printf("\n  QA35  TUBE from z = %f to z= %f\n",zd2,2*tubpar[2]+zd2);
1203
1204   zd2 += 2.*tubpar[2];
1205
1206   // legs of the trousers
1207   conpar[0] = (90.1-0.95-0.26)/2.;
1208   conpar[1] = 0.0/2.;
1209   conpar[2] = 21.6/2.;
1210   conpar[3] = 0.0/2.;
1211   conpar[4] = 5.8/2.;
1212   gMC->Gsvolu("QAL1", "CONE", idtmed[7], conpar, 5);
1213   gMC->Gsvolu("QAL2", "CONE", idtmed[7], conpar, 5); 
1214   gMC->Gspos("QAL1", 1, "ZDCA", -3.45-0.52, 0., conpar[0]+0.95+zd2, irotpipe5, "MANY");
1215   gMC->Gspos("QAL2", 1, "ZDCA", 3.45+0.52, 0., conpar[0]+0.95+zd2, irotpipe6, "MANY");
1216   
1217   conpar[0] = (90.1-0.95-0.26)/2.;
1218   conpar[1] = 0.0/2.;
1219   conpar[2] = 21.2/2.;
1220   conpar[3] = 0.0/2.;
1221   conpar[4] = 5.4/2.;
1222   gMC->Gsvolu("QAL3", "CONE", idtmed[10], conpar, 5);
1223   gMC->Gsvolu("QAL4", "CONE", idtmed[10], conpar, 5); 
1224   gMC->Gspos("QAL3", 1, "ZDCA", -3.45-0.52, 0., conpar[0]+0.95+zd2, irotpipe5, "ONLY");
1225   gMC->Gspos("QAL4", 1, "ZDCA", 3.45+0.52, 0., conpar[0]+0.95+zd2, irotpipe6, "ONLY");    
1226     
1227   zd2 += 90.1;
1228   
1229   //  second section : 2 tubes (ID = 54. OD = 58.)  
1230   tubpar[0] = 5.4/2.;
1231   tubpar[1] = 5.8/2.;
1232   tubpar[2] = 40.0/2.;
1233   gMC->Gsvolu("QA36", "TUBE", idtmed[7], tubpar, 3);
1234   gMC->Gspos("QA36", 1, "ZDCA", -15.8/2., 0., tubpar[2]+zd2, 0, "ONLY");
1235   gMC->Gspos("QA36", 2, "ZDCA",  15.8/2., 0., tubpar[2]+zd2, 0, "ONLY");  
1236   // Ch.debug
1237   //printf("    QA36 TUBE from z = %f to z= %f\n",zd2,2*tubpar[2]+zd2);
1238   
1239   zd2 += 2.*tubpar[2];
1240   
1241   // transition x2zdc to recombination chamber : skewed cone  
1242   conpar[0] = (10.-0.2)/2.;
1243   conpar[1] = 5.4/2.;
1244   conpar[2] = 5.8/2.;
1245   conpar[3] = 6.3/2.;
1246   conpar[4] = 7.0/2.;
1247   gMC->Gsvolu("QA37", "CONE", idtmed[7], conpar, 5); 
1248   gMC->Gspos("QA37", 1, "ZDCA", -7.9-0.175, 0., conpar[0]+0.1+zd2, irotpipe7, "ONLY");
1249   gMC->Gspos("QA37", 2, "ZDCA", 7.9+0.175, 0., conpar[0]+0.1+zd2, irotpipe8, "ONLY");
1250   //printf("    QA37 CONE from z = %f to z= %f\n",zd2,2*conpar[0]+0.2+zd2);
1251
1252   zd2 += 2.*conpar[0]+0.2;
1253   
1254   // Flange: second support for the trousers
1255   boxpar[0] = 25.9/2.;
1256   boxpar[1] = 9.4/2.;
1257   boxpar[2] = 1./2.;
1258   gMC->Gsvolu("QF04", "BOX ", idtmed[7], boxpar, 3);
1259   boxpar[0] = 16.5/2.;
1260   boxpar[1] = 7./2.;
1261   boxpar[2] = 1./2.;
1262   gMC->Gsvolu("QFV2", "BOX ", idtmed[10], boxpar, 3);
1263   gMC->Gspos("QFV2", 1, "QF04", 0., 0., 0., 0, "MANY");
1264   tubspar[0] = 0.0/2.;
1265   tubspar[1] = 7./2.;
1266   tubspar[2] = 1./2.;
1267   tubspar[3] = 90.;
1268   tubspar[4] = 270.;  
1269   gMC->Gsvolu("QFV3", "TUBS", idtmed[10], tubspar, 5);
1270   gMC->Gspos("QFV3", 1, "QF04", -16.5/2., 0.,  0., 0, "MANY"); 
1271   tubspar[0] = 0.0/2.;
1272   tubspar[1] = 7./2.;
1273   tubspar[2] = 1./2.;
1274   tubspar[3] = -90.;
1275   tubspar[4] = 90.;  
1276   gMC->Gsvolu("QFV4", "TUBS", idtmed[10], tubspar, 5);
1277   gMC->Gspos("QFV4", 1, "QF04", 16.5/2., 0.,  0., 0, "MANY");
1278   gMC->Gspos("QF04", 1, "ZDCA", 0., 0.,  18.5+zd2, 0, "MANY");
1279   
1280   // 2 tubes (ID = 63 mm OD=70 mm)      
1281   tubpar[0] = 6.3/2.;
1282   tubpar[1] = 7.0/2.;
1283   tubpar[2] = 512.9/2.;
1284   gMC->Gsvolu("QA38", "TUBE", idtmed[7], tubpar, 3);
1285   gMC->Gspos("QA38", 1, "ZDCA", -16.5/2., 0., tubpar[2]+zd2, 0, "ONLY");
1286   gMC->Gspos("QA38", 2, "ZDCA",  16.5/2., 0., tubpar[2]+zd2, 0, "ONLY");
1287   //printf("    QA38 TUBE from z = %f to z= %f\n",zd2,2*tubpar[2]+zd2);  
1288
1289   zd2 += 2.*tubpar[2];
1290   //printf("\n  END OF BEAM PIPE VOLUME DEFINITION AT z= %f\n",zd2);
1291            
1292   // -- Luminometer (Cu box) in front of ZN - side A
1293   boxpar[0] = 8.0/2.;
1294   boxpar[1] = 8.0/2.;
1295   boxpar[2] = 15./2.;
1296   gMC->Gsvolu("QLUA", "BOX ", idtmed[7], boxpar, 3);
1297   gMC->Gspos("QLUA", 1, "ZDCA", 0., 0.,  fPosZNA[2]-66.-boxpar[2], 0, "ONLY");
1298   //printf("\n  QLUC LUMINOMETER from z = %f to z= %f\n\n",  fPosZNA[2]-66., fPosZNA[2]-66.-2*boxpar[2]);
1299   
1300
1301   // ----------------------------------------------------------------
1302   // --  MAGNET DEFINITION  -> LHC OPTICS 6.5  
1303   // ----------------------------------------------------------------      
1304   // ***************************************************************  
1305   //            SIDE C - RB26  (dimuon side) 
1306   // ***************************************************************   
1307   // --  COMPENSATOR DIPOLE (MBXW)
1308   //zc = 1921.6;   
1309   zc = 1972.5;   
1310   
1311   // --  GAP (VACUUM WITH MAGNETIC FIELD)
1312   tubpar[0] = 0.;
1313   tubpar[1] = 4.5;
1314   //tubpar[2] = 170./2.;
1315   tubpar[2] = 153./2.;
1316   gMC->Gsvolu("MBXW", "TUBE", idtmed[11], tubpar, 3);
1317
1318   // --  YOKE 
1319   tubpar[0] = 4.5;
1320   tubpar[1] = 55.;
1321   //tubpar[2] = 170./2.;
1322   tubpar[2] = 153./2.;
1323   gMC->Gsvolu("YMBX", "TUBE", idtmed[7], tubpar, 3);
1324
1325   gMC->Gspos("MBXW", 1, "ZDCC", 0., 0., -tubpar[2]-zc, 0, "ONLY");
1326   gMC->Gspos("YMBX", 1, "ZDCC", 0., 0., -tubpar[2]-zc, 0, "ONLY");
1327   
1328   
1329   // -- INNER TRIPLET 
1330   zq = 2296.5; 
1331
1332   // -- DEFINE MQXL AND MQX QUADRUPOLE ELEMENT 
1333   // --  MQXL 
1334   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1335   tubpar[0] = 0.;
1336   tubpar[1] = 3.5;
1337   tubpar[2] = 637./2.;
1338   gMC->Gsvolu("MQXL", "TUBE", idtmed[11], tubpar, 3);
1339     
1340   // --  YOKE 
1341   tubpar[0] = 3.5;
1342   tubpar[1] = 22.;
1343   tubpar[2] = 637./2.;
1344   gMC->Gsvolu("YMQL", "TUBE", idtmed[7], tubpar, 3);
1345   
1346   gMC->Gspos("MQXL", 1, "ZDCC", 0., 0., -tubpar[2]-zq, 0, "ONLY");
1347   gMC->Gspos("YMQL", 1, "ZDCC", 0., 0., -tubpar[2]-zq, 0, "ONLY");
1348   
1349   gMC->Gspos("MQXL", 2, "ZDCC", 0., 0., -tubpar[2]-zq-2400., 0, "ONLY");
1350   gMC->Gspos("YMQL", 2, "ZDCC", 0., 0., -tubpar[2]-zq-2400., 0, "ONLY");
1351   
1352   // --  MQX 
1353   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1354   tubpar[0] = 0.;
1355   tubpar[1] = 3.5;
1356   tubpar[2] = 550./2.;
1357   gMC->Gsvolu("MQX ", "TUBE", idtmed[11], tubpar, 3);
1358   
1359   // --  YOKE 
1360   tubpar[0] = 3.5;
1361   tubpar[1] = 22.;
1362   tubpar[2] = 550./2.;
1363   gMC->Gsvolu("YMQ ", "TUBE", idtmed[7], tubpar, 3);
1364   
1365   gMC->Gspos("MQX ", 1, "ZDCC", 0., 0., -tubpar[2]-zq-908.5,  0, "ONLY");
1366   gMC->Gspos("YMQ ", 1, "ZDCC", 0., 0., -tubpar[2]-zq-908.5,  0, "ONLY");
1367   
1368   gMC->Gspos("MQX ", 2, "ZDCC", 0., 0., -tubpar[2]-zq-1558.5, 0, "ONLY");
1369   gMC->Gspos("YMQ ", 2, "ZDCC", 0., 0., -tubpar[2]-zq-1558.5, 0, "ONLY");
1370   
1371   // -- SEPARATOR DIPOLE D1 
1372   zd1 = 5838.3;
1373   
1374   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1375   tubpar[0] = 0.;
1376   tubpar[1] = 6.94/2.;
1377   tubpar[2] = 945./2.;
1378   gMC->Gsvolu("MD1 ", "TUBE", idtmed[11], tubpar, 3);
1379   
1380   // --  Insert horizontal Cu plates inside D1 
1381   // --   (to simulate the vacuum chamber)
1382   boxpar[0] = TMath::Sqrt(tubpar[1]*tubpar[1]-(2.98+0.2)*(2.98+0.2)) - 0.05;
1383   boxpar[1] = 0.2/2.;
1384   boxpar[2] =945./2.;
1385   gMC->Gsvolu("MD1V", "BOX ", idtmed[6], boxpar, 3);
1386   gMC->Gspos("MD1V", 1, "MD1 ", 0., 2.98+boxpar[1], 0., 0, "ONLY");
1387   gMC->Gspos("MD1V", 2, "MD1 ", 0., -2.98-boxpar[1], 0., 0, "ONLY");
1388     
1389   // --  YOKE 
1390   tubpar[0] = 0.;
1391   tubpar[1] = 110./2;
1392   tubpar[2] = 945./2.;
1393   gMC->Gsvolu("YD1 ", "TUBE", idtmed[7], tubpar, 3);
1394   
1395   gMC->Gspos("YD1 ", 1, "ZDCC", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
1396   gMC->Gspos("MD1 ", 1, "YD1 ", 0., 0., 0., 0, "ONLY");
1397   // Ch debug
1398   //printf("\t **** D1 positioned! It goes from z = %1.2f to z = %1.2f cm\n",-zd1, -zd1-2*tubpar[2]); 
1399   
1400   // -- DIPOLE D2 
1401   // --- LHC optics v6.4
1402   zd2 = 12167.8;
1403   
1404   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1405   tubpar[0] = 0.;
1406   tubpar[1] = 7.5/2.;
1407   tubpar[2] = 945./2.;
1408   gMC->Gsvolu("MD2 ", "TUBE", idtmed[11], tubpar, 3);
1409   
1410   // --  YOKE 
1411   tubpar[0] = 0.;
1412   tubpar[1] = 55.;
1413   tubpar[2] = 945./2.;
1414   gMC->Gsvolu("YD2 ", "TUBE", idtmed[7], tubpar, 3);
1415   
1416   gMC->Gspos("YD2 ", 1, "ZDCC", 0., 0., -tubpar[2]-zd2, 0, "ONLY");
1417   
1418   gMC->Gspos("MD2 ", 1, "YD2 ", -9.4, 0., 0., 0, "ONLY");
1419   gMC->Gspos("MD2 ", 2, "YD2 ",  9.4, 0., 0., 0, "ONLY");
1420   
1421   // ***************************************************************  
1422   //            SIDE A - RB24 
1423   // ***************************************************************
1424   
1425   // COMPENSATOR DIPOLE (MCBWA) (2nd compensator)
1426   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1427   tubpar[0] = 0.;
1428   tubpar[1] = 4.5;
1429   tubpar[2] = 153./2.;
1430   gMC->Gsvolu("MCBW", "TUBE", idtmed[11], tubpar, 3);  
1431   gMC->Gspos("MCBW", 1, "ZDCA", 0., 0., tubpar[2]+1972.5, 0, "ONLY");
1432     
1433    // --  YOKE 
1434   tubpar[0] = 4.5;
1435   tubpar[1] = 55.;
1436   tubpar[2] = 153./2.;
1437   gMC->Gsvolu("YMCB", "TUBE", idtmed[7], tubpar, 3);
1438   gMC->Gspos("YMCB", 1, "ZDCA", 0., 0., tubpar[2]+1972.5, 0, "ONLY");  
1439   
1440   
1441    // -- INNER TRIPLET 
1442   zql = 2296.5; 
1443
1444   // -- DEFINE MQX1 AND MQX2 QUADRUPOLE ELEMENT 
1445   // --  MQX1 
1446   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1447   tubpar[0] = 0.;
1448   tubpar[1] = 3.5;
1449   tubpar[2] = 637./2.;
1450   gMC->Gsvolu("MQX1", "TUBE", idtmed[11], tubpar, 3);
1451     
1452   // --  YOKE 
1453   tubpar[0] = 3.5;
1454   tubpar[1] = 22.;
1455   tubpar[2] = 637./2.;
1456   gMC->Gsvolu("YMQ1", "TUBE", idtmed[7], tubpar, 3);
1457
1458    // -- BEAM SCREEN FOR Q1
1459    tubpar[0] = 4.78/2.;
1460    tubpar[1] = 5.18/2.;
1461    tubpar[2] = 637./2.;
1462    gMC->Gsvolu("QBS1", "TUBE", idtmed[6], tubpar, 3);
1463    gMC->Gspos("QBS1", 1, "ZDCA", 0., 0., tubpar[2]+zql, 0, "ONLY");
1464    // INSERT VERTICAL PLATE INSIDE Q1
1465    boxpar[0] = 0.2/2.0;
1466    boxpar[1] = TMath::Sqrt(tubpar[0]*tubpar[0]-(1.9+0.2)*(1.9+0.2));
1467    boxpar[2] =637./2.;
1468    gMC->Gsvolu("QBS2", "BOX ", idtmed[6], boxpar, 3);
1469    gMC->Gspos("QBS2", 1, "ZDCA", 1.9+boxpar[0], 0., boxpar[2]+zql, 0, "ONLY");
1470    gMC->Gspos("QBS2", 2, "ZDCA", -1.9-boxpar[0], 0., boxpar[2]+zql, 0, "ONLY");
1471
1472    // -- BEAM SCREEN FOR Q3
1473    tubpar[0] = 5.79/2.;
1474    tubpar[1] = 6.14/2.;
1475    tubpar[2] = 637./2.;
1476    gMC->Gsvolu("QBS3", "TUBE", idtmed[6], tubpar, 3);
1477    gMC->Gspos("QBS3", 1, "ZDCA", 0., 0., tubpar[2]+zql+2400., 0, "ONLY");
1478    // INSERT VERTICAL PLATE INSIDE Q3
1479    boxpar[0] = 0.2/2.0;
1480    boxpar[1] = TMath::Sqrt(tubpar[0]*tubpar[0]-(2.405+0.2)*(2.405+0.2));
1481    boxpar[2] =637./2.;
1482    gMC->Gsvolu("QBS4", "BOX ", idtmed[6], boxpar, 3);
1483    gMC->Gspos("QBS4", 1, "ZDCA", 2.405+boxpar[0], 0., boxpar[2]+zql+2400., 0, "ONLY");
1484    gMC->Gspos("QBS4", 2, "ZDCA", -2.405-boxpar[0], 0., boxpar[2]+zql+2400., 0, "ONLY");
1485   
1486   // -- Q1
1487   gMC->Gspos("MQX1", 1, "ZDCA", 0., 0., tubpar[2]+zql, 0, "MANY");
1488   gMC->Gspos("YMQ1", 1, "ZDCA", 0., 0., tubpar[2]+zql, 0, "ONLY");
1489   
1490   // -- Q3
1491   gMC->Gspos("MQX1", 2, "ZDCA", 0., 0., tubpar[2]+zql+2400., 0, "MANY");
1492   gMC->Gspos("YMQ1", 2, "ZDCA", 0., 0., tubpar[2]+zql+2400., 0, "ONLY");  
1493   
1494   
1495   // --  MQX2
1496   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1497   tubpar[0] = 0.;
1498   tubpar[1] = 3.5;
1499   tubpar[2] = 550./2.;
1500   gMC->Gsvolu("MQX2", "TUBE", idtmed[11], tubpar, 3);
1501   
1502   // --  YOKE 
1503   tubpar[0] = 3.5;
1504   tubpar[1] = 22.;
1505   tubpar[2] = 550./2.;
1506   gMC->Gsvolu("YMQ2", "TUBE", idtmed[7], tubpar, 3);
1507   
1508
1509    // -- BEAM SCREEN FOR Q2
1510    tubpar[0] = 5.79/2.;
1511    tubpar[1] = 6.14/2.;
1512    tubpar[2] = 550./2.;
1513    gMC->Gsvolu("QBS5", "TUBE", idtmed[6], tubpar, 3);
1514    //    VERTICAL PLATE INSIDE Q2
1515    boxpar[0] = 0.2/2.0;
1516    boxpar[1] = TMath::Sqrt(tubpar[0]*tubpar[0]-(2.405+0.2)*(2.405+0.2));
1517    boxpar[2] =550./2.;
1518    gMC->Gsvolu("QBS6", "BOX ", idtmed[6], boxpar, 3);
1519
1520   // -- Q2A
1521   gMC->Gspos("MQX2", 1, "ZDCA", 0., 0., tubpar[2]+zql+908.5,  0, "MANY");
1522   gMC->Gspos("QBS5", 1, "ZDCA", 0., 0., tubpar[2]+zql+908.5, 0, "ONLY");  
1523   gMC->Gspos("QBS6", 1, "ZDCA", 2.405+boxpar[0], 0., boxpar[2]+zql+908.5, 0, "ONLY");
1524   gMC->Gspos("QBS6", 2, "ZDCA", -2.405-boxpar[0], 0., boxpar[2]+zql+908.5, 0, "ONLY");  
1525   gMC->Gspos("YMQ2", 1, "ZDCA", 0., 0., tubpar[2]+zql+908.5,  0, "ONLY");
1526
1527   
1528   // -- Q2B
1529   gMC->Gspos("MQX2", 2, "ZDCA", 0., 0., tubpar[2]+zql+1558.5, 0, "MANY");
1530   gMC->Gspos("QBS5", 2, "ZDCA", 0., 0., tubpar[2]+zql+1558.5, 0, "ONLY");  
1531   gMC->Gspos("QBS6", 3, "ZDCA", 2.405+boxpar[0], 0., boxpar[2]+zql+1558.5, 0, "ONLY");
1532   gMC->Gspos("QBS6", 4, "ZDCA", -2.405-boxpar[0], 0., boxpar[2]+zql+1558.5, 0, "ONLY");
1533   gMC->Gspos("YMQ2", 2, "ZDCA", 0., 0., tubpar[2]+zql+1558.5, 0, "ONLY");
1534
1535     // -- SEPARATOR DIPOLE D1 
1536   zd2 = 5838.3;
1537   
1538   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1539   tubpar[0] = 0.;
1540   tubpar[1] = 6.75/2.;
1541   tubpar[2] = 945./2.;
1542   gMC->Gsvolu("MD1L", "TUBE", idtmed[11], tubpar, 3);
1543   
1544   // --  The beam screen tube is provided by the beam pipe in D1 (QA03 volume)
1545   // --  Insert the beam screen horizontal Cu plates inside D1  
1546   // --   (to simulate the vacuum chamber)
1547   boxpar[0] = TMath::Sqrt(tubpar[1]*tubpar[1]-(2.885+0.2)*(2.885+0.2));
1548   boxpar[1] = 0.2/2.;
1549   boxpar[2] =(945.+80.1)/2.;
1550   gMC->Gsvolu("QBS7", "BOX ", idtmed[6], boxpar, 3);
1551   gMC->Gspos("QBS7", 1, "ZDCA", 0., 2.885+boxpar[1],boxpar[2]+zd2, 0, "ONLY");
1552   gMC->Gspos("QBS7", 2, "ZDCA", 0., -2.885-boxpar[1],boxpar[2]+zd2, 0, "ONLY");
1553     
1554   // --  YOKE 
1555   tubpar[0] = 7.34/2.; // to be checked
1556   tubpar[1] = 110./2;
1557   tubpar[2] = 945./2.;
1558   gMC->Gsvolu("YD1L", "TUBE", idtmed[7], tubpar, 3);
1559   
1560   gMC->Gspos("YD1L", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "ONLY");  
1561   gMC->Gspos("MD1L", 1, "ZDCA", 0., 0., tubpar[2]+zd2, 0, "MANY");
1562
1563   
1564   // -- DIPOLE D2 
1565   // --- LHC optics v6.5
1566   zd2l = 12167.8;
1567   
1568   // --  GAP (VACUUM WITH MAGNETIC FIELD) 
1569   tubpar[0] = 0.;
1570   tubpar[1] = 7.5/2.; // this has to be checked
1571   tubpar[2] = 945./2.;
1572   gMC->Gsvolu("MD2L", "TUBE", idtmed[11], tubpar, 3);
1573   
1574   // --  YOKE 
1575   tubpar[0] = 0.;
1576   tubpar[1] = 55.;
1577   tubpar[2] = 945./2.;
1578   gMC->Gsvolu("YD2L", "TUBE", idtmed[7], tubpar, 3);
1579   
1580   gMC->Gspos("YD2L", 1, "ZDCA", 0., 0., tubpar[2]+zd2l, 0, "ONLY");
1581   
1582   gMC->Gspos("MD2L", 1, "YD2L", -9.4, 0., 0., 0, "ONLY");
1583   gMC->Gspos("MD2L", 2, "YD2L",  9.4, 0., 0., 0, "ONLY");
1584   
1585   // -- END OF MAGNET DEFINITION     
1586 }
1587   
1588 //_____________________________________________________________________________
1589 void AliZDCv3::CreateZDC()
1590 {
1591  //
1592  // Create the various ZDCs (ZN + ZP)
1593  //
1594   
1595   Float_t dimPb[6], dimVoid[6];
1596   
1597   Int_t *idtmed = fIdtmed->GetArray();
1598
1599   // Parameters for hadronic calorimeters geometry
1600   // NB -> parameters used ONLY in CreateZDC()
1601   Float_t fGrvZN[3] = {0.03, 0.03, 50.};  // Grooves for neutron detector
1602   Float_t fGrvZP[3] = {0.04, 0.04, 75.};  // Grooves for proton detector
1603   Int_t   fDivZN[3] = {11, 11, 0};        // Division for neutron detector
1604   Int_t   fDivZP[3] = {7, 15, 0};         // Division for proton detector
1605   Int_t   fTowZN[2] = {2, 2};             // Tower for neutron detector
1606   Int_t   fTowZP[2] = {4, 1};             // Tower for proton detector
1607
1608   // Parameters for EM calorimeter geometry
1609   // NB -> parameters used ONLY in CreateZDC()
1610   Float_t kDimZEMPb  = 0.15*(TMath::Sqrt(2.));  // z-dimension of the Pb slice
1611   Float_t kFibRadZEM = 0.0315;                  // External fiber radius (including cladding)
1612   Int_t   fDivZEM[3] = {92, 0, 20};             // Divisions for EM detector
1613   Float_t fDimZEM[6] = {fZEMLength, 3.5, 3.5, 45., 0., 0.}; // Dimensions of EM detector
1614   Float_t fFibZEM2 = fDimZEM[2]/TMath::Sin(fDimZEM[3]*kDegrad)-kFibRadZEM;
1615   Float_t fFibZEM[3] = {0., 0.0275, fFibZEM2};  // Fibers for EM calorimeter
1616
1617   
1618   //-- Create calorimeters geometry
1619   
1620   // -------------------------------------------------------------------------------
1621   //--> Neutron calorimeter (ZN) 
1622   
1623   gMC->Gsvolu("ZNEU", "BOX ", idtmed[1], fDimZN, 3); // Passive material  
1624   gMC->Gsvolu("ZNF1", "TUBE", idtmed[3], fFibZN, 3); // Active material
1625   gMC->Gsvolu("ZNF2", "TUBE", idtmed[4], fFibZN, 3); 
1626   gMC->Gsvolu("ZNF3", "TUBE", idtmed[4], fFibZN, 3); 
1627   gMC->Gsvolu("ZNF4", "TUBE", idtmed[3], fFibZN, 3); 
1628   gMC->Gsvolu("ZNG1", "BOX ", idtmed[12], fGrvZN, 3); // Empty grooves 
1629   gMC->Gsvolu("ZNG2", "BOX ", idtmed[12], fGrvZN, 3); 
1630   gMC->Gsvolu("ZNG3", "BOX ", idtmed[12], fGrvZN, 3); 
1631   gMC->Gsvolu("ZNG4", "BOX ", idtmed[12], fGrvZN, 3); 
1632   
1633   // Divide ZNEU in towers (for hits purposes) 
1634   
1635   gMC->Gsdvn("ZNTX", "ZNEU", fTowZN[0], 1); // x-tower 
1636   gMC->Gsdvn("ZN1 ", "ZNTX", fTowZN[1], 2); // y-tower
1637   
1638   //-- Divide ZN1 in minitowers 
1639   //  fDivZN[0]= NUMBER OF FIBERS PER TOWER ALONG X-AXIS, 
1640   //  fDivZN[1]= NUMBER OF FIBERS PER TOWER ALONG Y-AXIS
1641   //  (4 fibres per minitower) 
1642   
1643   gMC->Gsdvn("ZNSL", "ZN1 ", fDivZN[1], 2); // Slices 
1644   gMC->Gsdvn("ZNST", "ZNSL", fDivZN[0], 1); // Sticks
1645   
1646   // --- Position the empty grooves in the sticks (4 grooves per stick)
1647   Float_t dx = fDimZN[0] / fDivZN[0] / 4.;
1648   Float_t dy = fDimZN[1] / fDivZN[1] / 4.;
1649   
1650   gMC->Gspos("ZNG1", 1, "ZNST", 0.-dx, 0.+dy, 0., 0, "ONLY");
1651   gMC->Gspos("ZNG2", 1, "ZNST", 0.+dx, 0.+dy, 0., 0, "ONLY");
1652   gMC->Gspos("ZNG3", 1, "ZNST", 0.-dx, 0.-dy, 0., 0, "ONLY");
1653   gMC->Gspos("ZNG4", 1, "ZNST", 0.+dx, 0.-dy, 0., 0, "ONLY");
1654   
1655   // --- Position the fibers in the grooves 
1656   gMC->Gspos("ZNF1", 1, "ZNG1", 0., 0., 0., 0, "ONLY");
1657   gMC->Gspos("ZNF2", 1, "ZNG2", 0., 0., 0., 0, "ONLY");
1658   gMC->Gspos("ZNF3", 1, "ZNG3", 0., 0., 0., 0, "ONLY");
1659   gMC->Gspos("ZNF4", 1, "ZNG4", 0., 0., 0., 0, "ONLY");
1660   
1661   // --- Position the neutron calorimeter in ZDC 
1662   // -- Rotation of ZDCs
1663   Int_t irotzdc;
1664   gMC->Matrix(irotzdc, 90., 180., 90., 90., 180., 0.);
1665   //
1666   gMC->Gspos("ZNEU", 1, "ZDCC", fPosZNC[0], fPosZNC[1], fPosZNC[2]-fDimZN[2], irotzdc, "ONLY");
1667   //Ch debug
1668   //printf("\n ZN -> %f < z < %f cm\n",fPosZN[2],fPosZN[2]-2*fDimZN[2]);
1669
1670   // --- Position the neutron calorimeter in ZDC2 (left line) 
1671   // -- No Rotation of ZDCs
1672   gMC->Gspos("ZNEU", 2, "ZDCA", fPosZNA[0], fPosZNA[1], fPosZNA[2]+fDimZN[2], 0, "ONLY");
1673   //Ch debug
1674   //printf("\n ZN left -> %f < z < %f cm\n",fPosZNl[2],fPosZNl[2]+2*fDimZN[2]);
1675
1676
1677   // -------------------------------------------------------------------------------
1678   //--> Proton calorimeter (ZP)  
1679   
1680   gMC->Gsvolu("ZPRO", "BOX ", idtmed[2], fDimZP, 3); // Passive material
1681   gMC->Gsvolu("ZPF1", "TUBE", idtmed[3], fFibZP, 3); // Active material
1682   gMC->Gsvolu("ZPF2", "TUBE", idtmed[4], fFibZP, 3); 
1683   gMC->Gsvolu("ZPF3", "TUBE", idtmed[4], fFibZP, 3); 
1684   gMC->Gsvolu("ZPF4", "TUBE", idtmed[3], fFibZP, 3); 
1685   gMC->Gsvolu("ZPG1", "BOX ", idtmed[12], fGrvZP, 3); // Empty grooves 
1686   gMC->Gsvolu("ZPG2", "BOX ", idtmed[12], fGrvZP, 3); 
1687   gMC->Gsvolu("ZPG3", "BOX ", idtmed[12], fGrvZP, 3); 
1688   gMC->Gsvolu("ZPG4", "BOX ", idtmed[12], fGrvZP, 3); 
1689     
1690   //-- Divide ZPRO in towers(for hits purposes) 
1691   
1692   gMC->Gsdvn("ZPTX", "ZPRO", fTowZP[0], 1); // x-tower 
1693   gMC->Gsdvn("ZP1 ", "ZPTX", fTowZP[1], 2); // y-tower
1694   
1695   
1696   //-- Divide ZP1 in minitowers 
1697   //  fDivZP[0]= NUMBER OF FIBERS ALONG X-AXIS PER MINITOWER, 
1698   //  fDivZP[1]= NUMBER OF FIBERS ALONG Y-AXIS PER MINITOWER
1699   //  (4 fiber per minitower) 
1700   
1701   gMC->Gsdvn("ZPSL", "ZP1 ", fDivZP[1], 2); // Slices 
1702   gMC->Gsdvn("ZPST", "ZPSL", fDivZP[0], 1); // Sticks
1703   
1704   // --- Position the empty grooves in the sticks (4 grooves per stick)
1705   dx = fDimZP[0] / fTowZP[0] / fDivZP[0] / 2.;
1706   dy = fDimZP[1] / fTowZP[1] / fDivZP[1] / 2.;
1707   
1708   gMC->Gspos("ZPG1", 1, "ZPST", 0.-dx, 0.+dy, 0., 0, "ONLY");
1709   gMC->Gspos("ZPG2", 1, "ZPST", 0.+dx, 0.+dy, 0., 0, "ONLY");
1710   gMC->Gspos("ZPG3", 1, "ZPST", 0.-dx, 0.-dy, 0., 0, "ONLY");
1711   gMC->Gspos("ZPG4", 1, "ZPST", 0.+dx, 0.-dy, 0., 0, "ONLY");
1712   
1713   // --- Position the fibers in the grooves 
1714   gMC->Gspos("ZPF1", 1, "ZPG1", 0., 0., 0., 0, "ONLY");
1715   gMC->Gspos("ZPF2", 1, "ZPG2", 0., 0., 0., 0, "ONLY");
1716   gMC->Gspos("ZPF3", 1, "ZPG3", 0., 0., 0., 0, "ONLY");
1717   gMC->Gspos("ZPF4", 1, "ZPG4", 0., 0., 0., 0, "ONLY");
1718   
1719
1720   // --- Position the proton calorimeter in ZDCC
1721   gMC->Gspos("ZPRO", 1, "ZDCC", fPosZPC[0], fPosZPC[1], fPosZPC[2]-fDimZP[2], irotzdc, "ONLY");
1722   //Ch debug
1723   //printf("\n ZP -> %f < z < %f cm\n",fPosZP[2],fPosZP[2]-2*fDimZP[2]);
1724   
1725   // --- Position the proton calorimeter in ZDCA
1726   // --- No rotation 
1727   gMC->Gspos("ZPRO", 2, "ZDCA", fPosZPA[0], fPosZPA[1], fPosZPA[2]+fDimZP[2], 0, "ONLY");
1728   //Ch debug
1729   //printf("\n ZP left -> %f < z < %f cm\n",fPosZPl[2],fPosZPl[2]+2*fDimZP[2]);  
1730     
1731   
1732   // -------------------------------------------------------------------------------
1733   // -> EM calorimeter (ZEM)  
1734   
1735   gMC->Gsvolu("ZEM ", "PARA", idtmed[10], fDimZEM, 6);
1736
1737   Int_t irot1, irot2;
1738   gMC->Matrix(irot1,0.,0.,90.,90.,-90.,0.);                    // Rotation matrix 1  
1739   gMC->Matrix(irot2,180.,0.,90.,fDimZEM[3]+90.,90.,fDimZEM[3]);// Rotation matrix 2
1740   //printf("irot1 = %d, irot2 = %d \n", irot1, irot2);
1741   
1742   gMC->Gsvolu("ZEMF", "TUBE", idtmed[3], fFibZEM, 3);   // Active material
1743
1744   gMC->Gsdvn("ZETR", "ZEM ", fDivZEM[2], 1);            // Tranches 
1745   
1746   dimPb[0] = kDimZEMPb;                                 // Lead slices 
1747   dimPb[1] = fDimZEM[2];
1748   dimPb[2] = fDimZEM[1];
1749   //dimPb[3] = fDimZEM[3]; //controllare
1750   dimPb[3] = 90.-fDimZEM[3]; //originale
1751   dimPb[4] = 0.;
1752   dimPb[5] = 0.;
1753   gMC->Gsvolu("ZEL0", "PARA", idtmed[5], dimPb, 6);
1754   gMC->Gsvolu("ZEL1", "PARA", idtmed[5], dimPb, 6);
1755   gMC->Gsvolu("ZEL2", "PARA", idtmed[5], dimPb, 6);
1756   
1757   // --- Position the lead slices in the tranche 
1758   Float_t zTran = fDimZEM[0]/fDivZEM[2]; 
1759   Float_t zTrPb = -zTran+kDimZEMPb;
1760   gMC->Gspos("ZEL0", 1, "ZETR", zTrPb, 0., 0., 0, "ONLY");
1761   gMC->Gspos("ZEL1", 1, "ZETR", kDimZEMPb, 0., 0., 0, "ONLY");
1762   
1763   // --- Vacuum zone (to be filled with fibres)
1764   dimVoid[0] = (zTran-2*kDimZEMPb)/2.;
1765   dimVoid[1] = fDimZEM[2];
1766   dimVoid[2] = fDimZEM[1];
1767   dimVoid[3] = 90.-fDimZEM[3];
1768   dimVoid[4] = 0.;
1769   dimVoid[5] = 0.;
1770   gMC->Gsvolu("ZEV0", "PARA", idtmed[10], dimVoid,6);
1771   gMC->Gsvolu("ZEV1", "PARA", idtmed[10], dimVoid,6);
1772   
1773   // --- Divide the vacuum slice into sticks along x axis
1774   gMC->Gsdvn("ZES0", "ZEV0", fDivZEM[0], 3); 
1775   gMC->Gsdvn("ZES1", "ZEV1", fDivZEM[0], 3); 
1776   
1777   // --- Positioning the fibers into the sticks
1778   gMC->Gspos("ZEMF", 1,"ZES0", 0., 0., 0., irot2, "ONLY");
1779   gMC->Gspos("ZEMF", 1,"ZES1", 0., 0., 0., irot2, "ONLY");
1780   
1781   // --- Positioning the vacuum slice into the tranche
1782   Float_t displFib = fDimZEM[1]/fDivZEM[0];
1783   gMC->Gspos("ZEV0", 1,"ZETR", -dimVoid[0], 0., 0., 0, "ONLY");
1784   gMC->Gspos("ZEV1", 1,"ZETR", -dimVoid[0]+zTran, 0., 0., 0, "ONLY");
1785
1786   // --- Positioning the ZEM into the ZDC - rotation for 90 degrees  
1787   // NB -> ZEM is positioned in ALIC (instead of in ZDC) volume
1788   gMC->Gspos("ZEM ", 1,"ALIC", -fPosZEM[0], fPosZEM[1], fPosZEM[2]+fDimZEM[0], irot1, "ONLY");
1789   
1790   // Second EM ZDC (same side w.r.t. IP, just on the other side w.r.t. beam pipe)
1791   gMC->Gspos("ZEM ", 2,"ALIC", fPosZEM[0], fPosZEM[1], fPosZEM[2]+fDimZEM[0], irot1, "ONLY");
1792   
1793   // --- Adding last slice at the end of the EM calorimeter 
1794   Float_t zLastSlice = fPosZEM[2]+kDimZEMPb+2*fDimZEM[0];
1795   gMC->Gspos("ZEL2", 1,"ALIC", fPosZEM[0], fPosZEM[1], zLastSlice, irot1, "ONLY");
1796   //Ch debug
1797   //printf("\n ZEM lenght = %f cm\n",2*fZEMLength);
1798   //printf("\n ZEM -> %f < z < %f cm\n",fPosZEM[2],fPosZEM[2]+2*fZEMLength+zLastSlice+kDimZEMPb);
1799   
1800 }
1801  
1802 //_____________________________________________________________________________
1803 void AliZDCv3::DrawModule() const
1804 {
1805   //
1806   // Draw a shaded view of the Zero Degree Calorimeter version 1
1807   //
1808
1809   // Set everything unseen
1810   gMC->Gsatt("*", "seen", -1);
1811   // 
1812   // Set ALIC mother transparent
1813   gMC->Gsatt("ALIC","SEEN",0);
1814   //
1815   // Set the volumes visible
1816   gMC->Gsatt("ZDCC","SEEN",0);
1817   gMC->Gsatt("QT01","SEEN",1);
1818   gMC->Gsatt("QT02","SEEN",1);
1819   gMC->Gsatt("QT03","SEEN",1);
1820   gMC->Gsatt("QT04","SEEN",1);
1821   gMC->Gsatt("QT05","SEEN",1);
1822   gMC->Gsatt("QT06","SEEN",1);
1823   gMC->Gsatt("QT07","SEEN",1);
1824   gMC->Gsatt("QT08","SEEN",1);
1825   gMC->Gsatt("QT09","SEEN",1);
1826   gMC->Gsatt("QT10","SEEN",1);
1827   gMC->Gsatt("QT11","SEEN",1);
1828   gMC->Gsatt("QT12","SEEN",1);
1829   gMC->Gsatt("QT13","SEEN",1);
1830   gMC->Gsatt("QT14","SEEN",1);
1831   gMC->Gsatt("QT15","SEEN",1);
1832   gMC->Gsatt("QT16","SEEN",1);
1833   gMC->Gsatt("QT17","SEEN",1);
1834   gMC->Gsatt("QT18","SEEN",1);
1835   gMC->Gsatt("QC01","SEEN",1);
1836   gMC->Gsatt("QC02","SEEN",1);
1837   gMC->Gsatt("QC03","SEEN",1);
1838   gMC->Gsatt("QC04","SEEN",1);
1839   gMC->Gsatt("QC05","SEEN",1);
1840   gMC->Gsatt("QTD1","SEEN",1);
1841   gMC->Gsatt("QTD2","SEEN",1);
1842   gMC->Gsatt("QTD3","SEEN",1);
1843   gMC->Gsatt("MQXL","SEEN",1);
1844   gMC->Gsatt("YMQL","SEEN",1);
1845   gMC->Gsatt("MQX ","SEEN",1);
1846   gMC->Gsatt("YMQ ","SEEN",1);
1847   gMC->Gsatt("ZQYX","SEEN",1);
1848   gMC->Gsatt("MD1 ","SEEN",1);
1849   gMC->Gsatt("MD1V","SEEN",1);
1850   gMC->Gsatt("YD1 ","SEEN",1);
1851   gMC->Gsatt("MD2 ","SEEN",1);
1852   gMC->Gsatt("YD2 ","SEEN",1);
1853   gMC->Gsatt("ZNEU","SEEN",0);
1854   gMC->Gsatt("ZNF1","SEEN",0);
1855   gMC->Gsatt("ZNF2","SEEN",0);
1856   gMC->Gsatt("ZNF3","SEEN",0);
1857   gMC->Gsatt("ZNF4","SEEN",0);
1858   gMC->Gsatt("ZNG1","SEEN",0);
1859   gMC->Gsatt("ZNG2","SEEN",0);
1860   gMC->Gsatt("ZNG3","SEEN",0);
1861   gMC->Gsatt("ZNG4","SEEN",0);
1862   gMC->Gsatt("ZNTX","SEEN",0);
1863   gMC->Gsatt("ZN1 ","COLO",4); 
1864   gMC->Gsatt("ZN1 ","SEEN",1);
1865   gMC->Gsatt("ZNSL","SEEN",0);
1866   gMC->Gsatt("ZNST","SEEN",0);
1867   gMC->Gsatt("ZPRO","SEEN",0);
1868   gMC->Gsatt("ZPF1","SEEN",0);
1869   gMC->Gsatt("ZPF2","SEEN",0);
1870   gMC->Gsatt("ZPF3","SEEN",0);
1871   gMC->Gsatt("ZPF4","SEEN",0);
1872   gMC->Gsatt("ZPG1","SEEN",0);
1873   gMC->Gsatt("ZPG2","SEEN",0);
1874   gMC->Gsatt("ZPG3","SEEN",0);
1875   gMC->Gsatt("ZPG4","SEEN",0);
1876   gMC->Gsatt("ZPTX","SEEN",0);
1877   gMC->Gsatt("ZP1 ","COLO",6); 
1878   gMC->Gsatt("ZP1 ","SEEN",1);
1879   gMC->Gsatt("ZPSL","SEEN",0);
1880   gMC->Gsatt("ZPST","SEEN",0);
1881   gMC->Gsatt("ZEM ","COLO",7); 
1882   gMC->Gsatt("ZEM ","SEEN",1);
1883   gMC->Gsatt("ZEMF","SEEN",0);
1884   gMC->Gsatt("ZETR","SEEN",0);
1885   gMC->Gsatt("ZEL0","SEEN",0);
1886   gMC->Gsatt("ZEL1","SEEN",0);
1887   gMC->Gsatt("ZEL2","SEEN",0);
1888   gMC->Gsatt("ZEV0","SEEN",0);
1889   gMC->Gsatt("ZEV1","SEEN",0);
1890   gMC->Gsatt("ZES0","SEEN",0);
1891   gMC->Gsatt("ZES1","SEEN",0);
1892   
1893   //
1894   gMC->Gdopt("hide", "on");
1895   gMC->Gdopt("shad", "on");
1896   gMC->Gsatt("*", "fill", 7);
1897   gMC->SetClipBox(".");
1898   gMC->SetClipBox("*", 0, 100, -100, 100, 12000, 16000);
1899   gMC->DefaultRange();
1900   gMC->Gdraw("alic", 40, 30, 0, 488, 220, .07, .07);
1901   gMC->Gdhead(1111, "Zero Degree Calorimeter Version 3");
1902   gMC->Gdman(18, 4, "MAN");
1903 }
1904
1905 //_____________________________________________________________________________
1906 void AliZDCv3::CreateMaterials()
1907 {
1908   //
1909   // Create Materials for the Zero Degree Calorimeter
1910   //
1911   
1912   Float_t dens, ubuf[1], wmat[2], a[2], z[2];
1913
1914   // --- Store in UBUF r0 for nuclear radius calculation R=r0*A**1/3 
1915
1916   // --- Tantalum -> ZN passive material
1917   ubuf[0] = 1.1;
1918   AliMaterial(1, "TANT", 180.95, 73., 16.65, .4, 11.9, ubuf, 1);
1919   
1920   // --- Brass (CuZn)  -> ZP passive material
1921   dens = 8.48;
1922   a[0] = 63.546;
1923   a[1] = 65.39;
1924   z[0] = 29.;
1925   z[1] = 30.;
1926   wmat[0] = .63;
1927   wmat[1] = .37;
1928   AliMixture(2, "BRASS", a, z, dens, 2, wmat);
1929   
1930   // --- SiO2 
1931   dens = 2.64;
1932   a[0] = 28.086;
1933   a[1] = 15.9994;
1934   z[0] = 14.;
1935   z[1] = 8.;
1936   wmat[0] = 1.;
1937   wmat[1] = 2.;
1938   AliMixture(3, "SIO2", a, z, dens, -2, wmat);  
1939   
1940   // --- Lead 
1941   ubuf[0] = 1.12;
1942   AliMaterial(5, "LEAD", 207.19, 82., 11.35, .56, 18.5, ubuf, 1);
1943
1944   // --- Copper (energy loss taken into account)
1945   ubuf[0] = 1.10;
1946   AliMaterial(6, "COPP0", 63.54, 29., 8.96, 1.4, 0., ubuf, 1);
1947   
1948   // --- Iron (energy loss taken into account)
1949   ubuf[0] = 1.1;
1950   AliMaterial(7, "IRON0", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
1951   
1952   // --- Iron (no energy loss)
1953   ubuf[0] = 1.1;
1954   AliMaterial(8,  "IRON1", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
1955   AliMaterial(13, "IRON2", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
1956     
1957   // ---------------------------------------------------------  
1958   Float_t aResGas[3]={1.008,12.0107,15.9994};
1959   Float_t zResGas[3]={1.,6.,8.};
1960   Float_t wResGas[3]={0.28,0.28,0.44};
1961   Float_t dResGas = 3.2E-14;
1962
1963   // --- Vacuum (no magnetic field) 
1964   AliMixture(10, "VOID", aResGas, zResGas, dResGas, 3, wResGas);
1965   
1966   // --- Vacuum (with magnetic field) 
1967   AliMixture(11, "VOIM", aResGas, zResGas, dResGas, 3, wResGas);
1968   
1969   // --- Air (no magnetic field)
1970   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1971   Float_t zAir[4]={6.,7.,8.,18.};
1972   Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1973   Float_t dAir = 1.20479E-3;
1974   //
1975   AliMixture(12, "Air    $", aAir, zAir, dAir, 4, wAir);
1976   
1977   // ---  Definition of tracking media: 
1978   
1979   // --- Tantalum = 1 ; 
1980   // --- Brass = 2 ; 
1981   // --- Fibers (SiO2) = 3 ; 
1982   // --- Fibers (SiO2) = 4 ; 
1983   // --- Lead = 5 ; 
1984   // --- Copper (with energy loss)= 6 ;
1985   // --- Copper (with energy loss)= 13 ; 
1986   // --- Iron (with energy loss) = 7 ; 
1987   // --- Iron (without energy loss) = 8 ; 
1988   // --- Vacuum (no field) = 10 
1989   // --- Vacuum (with field) = 11 
1990   // --- Air (no field) = 12 
1991   
1992   // **************************************************** 
1993   //     Tracking media parameters
1994   //
1995   Float_t epsil  = 0.01;   // Tracking precision, 
1996   Float_t stmin  = 0.01;   // Min. value 4 max. step (cm)
1997   Float_t stemax = 1.;     // Max. step permitted (cm) 
1998   Float_t tmaxfd = 0.;     // Maximum angle due to field (degrees) 
1999   Float_t deemax = -1.;    // Maximum fractional energy loss
2000   Float_t nofieldm = 0.;   // Max. field value (no field)
2001   Float_t fieldm = 45.;    // Max. field value (with field)
2002   Int_t isvol = 0;         // ISVOL =0 -> not sensitive volume
2003   Int_t isvolActive = 1;   // ISVOL =1 -> sensitive volume
2004   Int_t inofld = 0;        // IFIELD=0 -> no magnetic field
2005   Int_t ifield =2;         // IFIELD=2 -> magnetic field defined in AliMagFC.h
2006   // *****************************************************
2007   
2008   AliMedium(1, "ZTANT", 1, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2009   AliMedium(2, "ZBRASS",2, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2010   AliMedium(3, "ZSIO2", 3, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2011   AliMedium(4, "ZQUAR", 3, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2012   AliMedium(5, "ZLEAD", 5, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2013   AliMedium(6, "ZCOPP", 6, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2014   AliMedium(7, "ZIRON", 7, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2015   AliMedium(8, "ZIRONN",8, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2016   AliMedium(10,"ZVOID",10, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2017   AliMedium(12,"ZAIR", 12, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
2018   //
2019   AliMedium(11,"ZVOIM",11, isvol, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
2020   AliMedium(13,"ZIRONE",13, isvol, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin);  
2021
2022
2023
2024 //_____________________________________________________________________________
2025 void AliZDCv3::AddAlignableVolumes() const
2026 {
2027  //
2028  // Create entries for alignable volumes associating the symbolic volume
2029  // name with the corresponding volume path. Needs to be syncronized with
2030  // eventual changes in the geometry.
2031  //
2032  TString volpath1 = "ALIC_1/ZDCC_1/ZNEU_1";
2033  TString volpath2 = "ALIC_1/ZDCC_1/ZPRO_1";
2034  TString volpath3 = "ALIC_1/ZDCA_1/ZNEU_2";
2035  TString volpath4 = "ALIC_1/ZDCA_1/ZPRO_2";
2036
2037  TString symname1="ZDC/NeutronZDC_C";
2038  TString symname2="ZDC/ProtonZDC_C";
2039  TString symname3="ZDC/NeutronZDC_A";
2040  TString symname4="ZDC/ProtonZDC_A";
2041
2042  if(!gGeoManager->SetAlignableEntry(symname1.Data(),volpath1.Data()))
2043      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname1.Data(),volpath1.Data()));
2044
2045  if(!gGeoManager->SetAlignableEntry(symname2.Data(),volpath2.Data()))
2046      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname2.Data(),volpath2.Data()));
2047
2048  if(!gGeoManager->SetAlignableEntry(symname3.Data(),volpath3.Data()))
2049      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname1.Data(),volpath1.Data()));
2050
2051  if(!gGeoManager->SetAlignableEntry(symname4.Data(),volpath4.Data()))
2052      AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",   symname2.Data(),volpath2.Data()));
2053
2054 }
2055
2056
2057 //_____________________________________________________________________________
2058 void AliZDCv3::Init()
2059 {
2060  InitTables();
2061   Int_t *idtmed = fIdtmed->GetArray();  
2062   Int_t i;
2063   // Thresholds for showering in the ZDCs 
2064   i = 1; //tantalum
2065   gMC->Gstpar(idtmed[i], "CUTGAM", .001);
2066   gMC->Gstpar(idtmed[i], "CUTELE", .001);
2067   gMC->Gstpar(idtmed[i], "CUTNEU", .01);
2068   gMC->Gstpar(idtmed[i], "CUTHAD", .01);
2069   i = 2; //brass
2070   gMC->Gstpar(idtmed[i], "CUTGAM", .001);
2071   gMC->Gstpar(idtmed[i], "CUTELE", .001);
2072   gMC->Gstpar(idtmed[i], "CUTNEU", .01);
2073   gMC->Gstpar(idtmed[i], "CUTHAD", .01);
2074   i = 5; //lead
2075   gMC->Gstpar(idtmed[i], "CUTGAM", .001);
2076   gMC->Gstpar(idtmed[i], "CUTELE", .001);
2077   gMC->Gstpar(idtmed[i], "CUTNEU", .01);
2078   gMC->Gstpar(idtmed[i], "CUTHAD", .01);
2079   
2080   // Avoid too detailed showering in TDI 
2081   i = 6; //copper
2082   gMC->Gstpar(idtmed[i], "CUTGAM", .1);
2083   gMC->Gstpar(idtmed[i], "CUTELE", .1);
2084   gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
2085   gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
2086   
2087   // Avoid too detailed showering along the beam line 
2088   i = 7; //iron with energy loss (ZIRON)
2089   gMC->Gstpar(idtmed[i], "CUTGAM", .1);
2090   gMC->Gstpar(idtmed[i], "CUTELE", .1);
2091   gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
2092   gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
2093   
2094   // Avoid too detailed showering along the beam line 
2095   i = 8; //iron with energy loss (ZIRONN)
2096   gMC->Gstpar(idtmed[i], "CUTGAM", .1);
2097   gMC->Gstpar(idtmed[i], "CUTELE", .1);
2098   gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
2099   gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
2100   
2101   // Avoid too detailed showering along the beam line 
2102   i = 13; //iron with energy loss (ZIRONN)
2103   gMC->Gstpar(idtmed[i], "CUTGAM", 1.);
2104   gMC->Gstpar(idtmed[i], "CUTELE", 1.);
2105   gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
2106   gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
2107   
2108   // Avoid interaction in fibers (only energy loss allowed) 
2109   i = 3; //fibers (ZSI02)
2110   gMC->Gstpar(idtmed[i], "DCAY", 0.);
2111   gMC->Gstpar(idtmed[i], "MULS", 0.);
2112   gMC->Gstpar(idtmed[i], "PFIS", 0.);
2113   gMC->Gstpar(idtmed[i], "MUNU", 0.);
2114   gMC->Gstpar(idtmed[i], "LOSS", 1.);
2115   gMC->Gstpar(idtmed[i], "PHOT", 0.);
2116   gMC->Gstpar(idtmed[i], "COMP", 0.);
2117   gMC->Gstpar(idtmed[i], "PAIR", 0.);
2118   gMC->Gstpar(idtmed[i], "BREM", 0.);
2119   gMC->Gstpar(idtmed[i], "DRAY", 0.);
2120   gMC->Gstpar(idtmed[i], "ANNI", 0.);
2121   gMC->Gstpar(idtmed[i], "HADR", 0.);
2122   i = 4; //fibers (ZQUAR)
2123   gMC->Gstpar(idtmed[i], "DCAY", 0.);
2124   gMC->Gstpar(idtmed[i], "MULS", 0.);
2125   gMC->Gstpar(idtmed[i], "PFIS", 0.);
2126   gMC->Gstpar(idtmed[i], "MUNU", 0.);
2127   gMC->Gstpar(idtmed[i], "LOSS", 1.);
2128   gMC->Gstpar(idtmed[i], "PHOT", 0.);
2129   gMC->Gstpar(idtmed[i], "COMP", 0.);
2130   gMC->Gstpar(idtmed[i], "PAIR", 0.);
2131   gMC->Gstpar(idtmed[i], "BREM", 0.);
2132   gMC->Gstpar(idtmed[i], "DRAY", 0.);
2133   gMC->Gstpar(idtmed[i], "ANNI", 0.);
2134   gMC->Gstpar(idtmed[i], "HADR", 0.);
2135   
2136   // Avoid interaction in void 
2137   i = 11; //void with field
2138   gMC->Gstpar(idtmed[i], "DCAY", 0.);
2139   gMC->Gstpar(idtmed[i], "MULS", 0.);
2140   gMC->Gstpar(idtmed[i], "PFIS", 0.);
2141   gMC->Gstpar(idtmed[i], "MUNU", 0.);
2142   gMC->Gstpar(idtmed[i], "LOSS", 0.);
2143   gMC->Gstpar(idtmed[i], "PHOT", 0.);
2144   gMC->Gstpar(idtmed[i], "COMP", 0.);
2145   gMC->Gstpar(idtmed[i], "PAIR", 0.);
2146   gMC->Gstpar(idtmed[i], "BREM", 0.);
2147   gMC->Gstpar(idtmed[i], "DRAY", 0.);
2148   gMC->Gstpar(idtmed[i], "ANNI", 0.);
2149   gMC->Gstpar(idtmed[i], "HADR", 0.);
2150
2151   //
2152   fMedSensZN  = idtmed[1];  // Sensitive volume: ZN passive material
2153   fMedSensZP  = idtmed[2];  // Sensitive volume: ZP passive material
2154   fMedSensF1  = idtmed[3];  // Sensitive volume: fibres type 1
2155   fMedSensF2  = idtmed[4];  // Sensitive volume: fibres type 2
2156   fMedSensZEM = idtmed[5];  // Sensitive volume: ZEM passive material
2157   fMedSensTDI = idtmed[6];  // Sensitive volume: TDI Cu shield
2158   fMedSensPI  = idtmed[7];  // Sensitive volume: beam pipes
2159   fMedSensGR  = idtmed[12]; // Sensitive volume: air into the grooves
2160 }
2161
2162 //_____________________________________________________________________________
2163 void AliZDCv3::InitTables()
2164 {
2165  //
2166  // Read light tables for Cerenkov light production parameterization 
2167  //
2168
2169   Int_t k, j;
2170
2171   char *lightfName1,*lightfName2,*lightfName3,*lightfName4,
2172        *lightfName5,*lightfName6,*lightfName7,*lightfName8;
2173   FILE *fp1, *fp2, *fp3, *fp4, *fp5, *fp6, *fp7, *fp8;
2174
2175   //  --- Reading light tables for ZN 
2176   lightfName1 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362207s");
2177   if((fp1 = fopen(lightfName1,"r")) == NULL){
2178      printf("Cannot open file fp1 \n");
2179      return;
2180   }
2181   lightfName2 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362208s");
2182   if((fp2 = fopen(lightfName2,"r")) == NULL){
2183      printf("Cannot open file fp2 \n");
2184      return;
2185   }  
2186   lightfName3 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362209s");
2187   if((fp3 = fopen(lightfName3,"r")) == NULL){
2188      printf("Cannot open file fp3 \n");
2189      return;
2190   }
2191   lightfName4 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362210s");
2192   if((fp4 = fopen(lightfName4,"r")) == NULL){
2193      printf("Cannot open file fp4 \n");
2194      return;
2195   }
2196   
2197   for(k=0; k<fNalfan; k++){
2198      for(j=0; j<fNben; j++){
2199        fscanf(fp1,"%f",&fTablen[0][k][j]);
2200        fscanf(fp2,"%f",&fTablen[1][k][j]);
2201        fscanf(fp3,"%f",&fTablen[2][k][j]);
2202        fscanf(fp4,"%f",&fTablen[3][k][j]);
2203      } 
2204   }
2205   fclose(fp1);
2206   fclose(fp2);
2207   fclose(fp3);
2208   fclose(fp4);
2209   
2210   //  --- Reading light tables for ZP and ZEM
2211   lightfName5 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552207s");
2212   if((fp5 = fopen(lightfName5,"r")) == NULL){
2213      printf("Cannot open file fp5 \n");
2214      return;
2215   }
2216   lightfName6 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552208s");
2217   if((fp6 = fopen(lightfName6,"r")) == NULL){
2218      printf("Cannot open file fp6 \n");
2219      return;
2220   }
2221   lightfName7 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552209s");
2222   if((fp7 = fopen(lightfName7,"r")) == NULL){
2223      printf("Cannot open file fp7 \n");
2224      return;
2225   }
2226   lightfName8 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552210s");
2227   if((fp8 = fopen(lightfName8,"r")) == NULL){
2228      printf("Cannot open file fp8 \n");
2229      return;
2230   }
2231   
2232   for(k=0; k<fNalfap; k++){
2233      for(j=0; j<fNbep; j++){
2234        fscanf(fp5,"%f",&fTablep[0][k][j]);
2235        fscanf(fp6,"%f",&fTablep[1][k][j]);
2236        fscanf(fp7,"%f",&fTablep[2][k][j]);
2237        fscanf(fp8,"%f",&fTablep[3][k][j]);
2238      } 
2239   }
2240   fclose(fp5);
2241   fclose(fp6);
2242   fclose(fp7);
2243   fclose(fp8);
2244 }
2245 //_____________________________________________________________________________
2246 void AliZDCv3::StepManager()
2247 {
2248   //
2249   // Routine called at every step in the Zero Degree Calorimeters
2250   //
2251   Int_t   j, vol[2]={0,0}, ibeta=0, ialfa=0, ibe=0, nphe=0;
2252   Float_t hits[11], x[3], xdet[3], um[3], ud[3];
2253   Float_t m=0., ekin=0., destep=0., be=0., out=0.;
2254   // Parametrization for light guide uniformity
2255   // NEW!!! Light guide tilted @ 51 degrees
2256   Float_t guiPar[4]={0.31,-0.0006305,0.01337,0.8895};
2257   Double_t s[3], p[3];
2258   const char *knamed;
2259   //
2260   for(j=0;j<11;j++) hits[j]=-999.;
2261   //
2262   // --- This part is for no shower developement in beam pipe and TDI
2263   // If particle interacts with beam pipe or TDI -> return
2264   if((gMC->CurrentMedium() == fMedSensPI) || (gMC->CurrentMedium() == fMedSensTDI)){ 
2265      // If option NoShower is set -> StopTrack
2266     if(fNoShower==1){
2267       gMC->TrackPosition(s[0],s[1],s[2]);
2268       if(gMC->CurrentMedium() == fMedSensPI){
2269         knamed = gMC->CurrentVolName();
2270         if(!strncmp(knamed,"YMQ",3)){
2271           if(s[2]<0) fpLostITC += 1;
2272           else fpLostITA += 1;
2273         }
2274         else if(!strncmp(knamed,"YD1",3)){
2275           if(s[2]<0) fpLostD1C += 1;
2276           else fpLostD1A += 1;
2277         }
2278         else if(!strncmp(knamed,"QAL",3)) fnTrou++;
2279       }
2280       else if(gMC->CurrentMedium() == fMedSensTDI){ 
2281         knamed = gMC->CurrentVolName();
2282         if(!strncmp(knamed,"MD1",3)){
2283           if(s[2]<0) fpLostD1C += 1;
2284           else  fpLostD1A += 1;
2285         }
2286         else if(!strncmp(knamed,"QTD",3)) fpLostTDI += 1;
2287         else if(!strncmp(knamed,"QLU",3)){
2288           if(s[2]<0) fnLumiC ++;
2289           else fnLumiA++;
2290         }
2291       }
2292       //
2293       //gMC->TrackMomentum(p[0], p[1], p[2], p[3]);
2294       //printf("\t Particle: mass = %1.3f, E = %1.3f GeV, pz = %1.2f GeV -> stopped in volume %s\n", 
2295       //     gMC->TrackMass(), p[3], p[2], gMC->CurrentVolName());
2296       //
2297       printf("\n\t **********************************\n");
2298       printf("\t ********** Side C **********\n");
2299       printf("\t # of spectators in IT = %d\n",fpLostITC);
2300       printf("\t # of spectators in D1 = %d\n",fpLostD1C);
2301       printf("\t # of spectators in luminometer = %d\n",fnLumiC);
2302       printf("\t ********** Side A **********\n");
2303       printf("\t # of spectators in IT = %d\n",fpLostITA);
2304       printf("\t # of spectators in D1 = %d\n",fpLostD1A);
2305       printf("\t # of spectators in TDI = %d\n",fpLostTDI);
2306       printf("\t # of spectators in luminometer = %d\n",fnLumiA);
2307       printf("\t # of spectators in trousers = %d\n",fnTrou);
2308       printf("\t **********************************\n");
2309       gMC->StopTrack();
2310     }
2311     return;
2312   }
2313   
2314
2315   if((gMC->CurrentMedium() == fMedSensZN) || (gMC->CurrentMedium() == fMedSensZP) ||
2316      (gMC->CurrentMedium() == fMedSensGR) || (gMC->CurrentMedium() == fMedSensF1) ||
2317      (gMC->CurrentMedium() == fMedSensF2) || (gMC->CurrentMedium() == fMedSensZEM)){
2318
2319     
2320   //Particle coordinates 
2321     gMC->TrackPosition(s[0],s[1],s[2]);
2322     for(j=0; j<=2; j++) x[j] = s[j];
2323     hits[0] = x[0];
2324     hits[1] = x[1];
2325     hits[2] = x[2];
2326
2327   // Determine in which ZDC the particle is
2328     knamed = gMC->CurrentVolName();
2329     if(!strncmp(knamed,"ZN",2)){
2330           if(x[2]<0.) vol[0]=1; // ZNC (dimuon side)
2331           else if(x[2]>0.) vol[0]=4; //ZNA
2332     }
2333     else if(!strncmp(knamed,"ZP",2)){ 
2334           if(x[2]<0.) vol[0]=2; //ZPC (dimuon side)
2335           else if(x[2]>0.) vol[0]=5; //ZPA  
2336     }
2337     else if(!strncmp(knamed,"ZE",2)) vol[0]=3; //ZEM
2338   
2339   // Determine in which quadrant the particle is
2340     if(vol[0]==1){      //Quadrant in ZNC
2341       // Calculating particle coordinates inside ZNC
2342       xdet[0] = x[0]-fPosZNC[0];
2343       xdet[1] = x[1]-fPosZNC[1];
2344       // Calculating quadrant in ZN
2345       if(xdet[0]<=0.){
2346         if(xdet[1]<=0.) vol[1]=1;
2347         else vol[1]=3;
2348       }
2349       else if(xdet[0]>0.){
2350         if(xdet[1]<=0.) vol[1]=2;
2351         else vol[1]=4;
2352       }
2353       if((vol[1]!=1) && (vol[1]!=2) && (vol[1]!=3) && (vol[1]!=4))
2354         printf("\n      ZDC StepManager->ERROR in ZN!!! vol[1] = %d, xdet[0] = %f,"
2355         "xdet[1] = %f\n",vol[1], xdet[0], xdet[1]);
2356     }
2357     
2358     else if(vol[0]==2){ //Quadrant in ZPC
2359       // Calculating particle coordinates inside ZPC
2360       xdet[0] = x[0]-fPosZPA[0];
2361       xdet[1] = x[1]-fPosZPA[1];
2362       if(xdet[0]>=fDimZP[0])  xdet[0]=fDimZP[0]-0.01;
2363       if(xdet[0]<=-fDimZP[0]) xdet[0]=-fDimZP[0]+0.01;
2364       // Calculating tower in ZP
2365       Float_t xqZP = xdet[0]/(fDimZP[0]/2.);
2366       for(int i=1; i<=4; i++){
2367          if(xqZP>=(i-3) && xqZP<(i-2)){
2368            vol[1] = i;
2369            break;
2370          }
2371       }
2372       if((vol[1]!=1) && (vol[1]!=2) && (vol[1]!=3) && (vol[1]!=4))
2373         printf("        ZDC StepManager->ERROR in ZP!!! vol[1] = %d, xdet[0] = %f,"
2374         "xdet[1] = %f\n",vol[1], xdet[0], xdet[1]);
2375     }
2376     //
2377     // Quadrant in ZEM: vol[1] = 1 -> particle in 1st ZEM (placed at x = 8.5 cm)
2378     //                  vol[1] = 2 -> particle in 2nd ZEM (placed at x = -8.5 cm)
2379     else if(vol[0] == 3){       
2380       if(x[0]>0.){
2381         vol[1] = 1;
2382         // Particle x-coordinate inside ZEM1
2383         xdet[0] = x[0]-fPosZEM[0];
2384       }
2385       else{
2386         vol[1] = 2;
2387         // Particle x-coordinate inside ZEM2
2388         xdet[0] = x[0]+fPosZEM[0];
2389       }
2390       xdet[1] = x[1]-fPosZEM[1];
2391     }
2392     //
2393     else if(vol[0]==4){ //Quadrant in ZNA
2394       // Calculating particle coordinates inside ZNA
2395       xdet[0] = x[0]-fPosZNA[0];
2396       xdet[1] = x[1]-fPosZNA[1];
2397       // Calculating quadrant in ZNA
2398       if(xdet[0]>=0.){
2399         if(xdet[1]<=0.) vol[1]=1;
2400         else vol[1]=3;
2401       }
2402       else if(xdet[0]<0.){
2403         if(xdet[1]<=0.) vol[1]=2;
2404         else vol[1]=4;
2405       }
2406       if((vol[1]!=1) && (vol[1]!=2) && (vol[1]!=3) && (vol[1]!=4))
2407         printf("\n      ZDC StepManager->ERROR in ZNA!!! vol[1] = %d, xdet[0] = %f,"
2408         "xdet[1] = %f\n",vol[1], xdet[0], xdet[1]);
2409     }    
2410     //
2411     else if(vol[0]==5){ //Quadrant in ZPA
2412       // Calculating particle coordinates inside ZPA
2413       xdet[0] = x[0]-fPosZPC[0];
2414       xdet[1] = x[1]-fPosZPC[1];
2415       if(xdet[0]>=fDimZP[0])  xdet[0]=fDimZP[0]-0.01;
2416       if(xdet[0]<=-fDimZP[0]) xdet[0]=-fDimZP[0]+0.01;
2417       // Calculating tower in ZP
2418       Float_t xqZP = -xdet[0]/(fDimZP[0]/2.);
2419       for(int i=1; i<=4; i++){
2420          if(xqZP>=(i-3) && xqZP<(i-2)){
2421            vol[1] = i;
2422            break;
2423          }
2424       }
2425       if((vol[1]!=1) && (vol[1]!=2) && (vol[1]!=3) && (vol[1]!=4))
2426         printf("        ZDC StepManager->ERROR in ZPA!!! vol[1] = %d, xdet[0] = %f,"
2427         "xdet[1] = %f\n",vol[1], xdet[0], xdet[1]);
2428     }    
2429     
2430     
2431   // Store impact point and kinetic energy of the ENTERING particle
2432     
2433       if(gMC->IsTrackEntering()){
2434         //Particle energy
2435         gMC->TrackMomentum(p[0],p[1],p[2],p[3]);
2436         hits[3] = p[3];
2437         // Impact point on ZDC  
2438         hits[4] = xdet[0];
2439         hits[5] = xdet[1];
2440         hits[6] = 0;
2441         hits[7] = 0;
2442         hits[8] = 0;
2443         hits[9] = 0;
2444         //
2445         Int_t curTrackN = gAlice->GetMCApp()->GetCurrentTrackNumber();
2446         TParticle *part = (gAlice->GetMCApp())->Particle(curTrackN);
2447         hits[10] = part->GetPdgCode();
2448         //printf("\t PDGCode = %d\n", part->GetPdgCode());
2449
2450         AddHit(curTrackN, vol, hits);
2451         
2452         if(fNoShower==1){
2453           //printf("\t VolName %s -> det %d quad %d - x = %f, y = %f, z = %f\n", 
2454             //knamed, vol[0], vol[1], x[0], x[1], x[2]);
2455           if(vol[0]==1){
2456             fnDetectedC += 1;
2457             printf("\n    # of particles in ZNC = %d\n\n",fnDetectedC);
2458           }
2459           else if(vol[0]==2){
2460             fpDetectedC += 1;
2461             printf("\n    # of particles in ZPC = %d\n\n",fpDetectedC);
2462           }
2463           else if(vol[0]==4){
2464             fnDetectedA += 1;
2465             printf("\n    # of particles in ZNA = %d\n\n",fnDetectedA);     
2466           }
2467           else if(vol[0]==5){
2468             fpDetectedA += 1;
2469             printf("\n    # of particles in ZPA = %d\n\n",fpDetectedA);      
2470           }
2471           //
2472           //printf("\t Particle: mass = %1.3f, E = %1.3f GeV, pz = %1.2f GeV -> stopped in volume %s\n", 
2473           //   gMC->TrackMass(), p[3], p[2], gMC->CurrentVolName());
2474           //
2475           gMC->StopTrack();
2476           return;
2477         }
2478       }
2479              
2480       // Charged particles -> Energy loss
2481       if((destep=gMC->Edep())){
2482          if(gMC->IsTrackStop()){
2483            gMC->TrackMomentum(p[0],p[1],p[2],p[3]);
2484            m = gMC->TrackMass();
2485            ekin = p[3]-m;
2486            hits[9] = ekin;
2487            hits[7] = 0.;
2488            hits[8] = 0.;
2489            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2490            }
2491          else{
2492            hits[9] = destep;
2493            hits[7] = 0.;
2494            hits[8] = 0.;
2495            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2496            }
2497       }
2498   }
2499  
2500
2501   // *** Light production in fibres 
2502   if((gMC->CurrentMedium() == fMedSensF1) || (gMC->CurrentMedium() == fMedSensF2)){
2503
2504      //Select charged particles
2505      if((destep=gMC->Edep())){
2506
2507        // Particle velocity
2508        Float_t beta = 0.;
2509        gMC->TrackMomentum(p[0],p[1],p[2],p[3]);
2510        Float_t ptot=TMath::Sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
2511        if(p[3] > 0.00001) beta =  ptot/p[3];
2512        else return;
2513        if(beta<0.67)return;
2514        else if((beta>=0.67) && (beta<=0.75)) ibeta = 0;
2515        else if((beta>0.75)  && (beta<=0.85)) ibeta = 1;
2516        else if((beta>0.85)  && (beta<=0.95)) ibeta = 2;
2517        else if(beta>0.95) ibeta = 3;
2518  
2519        // Angle between particle trajectory and fibre axis
2520        // 1 -> Momentum directions
2521        um[0] = p[0]/ptot;
2522        um[1] = p[1]/ptot;
2523        um[2] = p[2]/ptot;
2524        gMC->Gmtod(um,ud,2);
2525        // 2 -> Angle < limit angle
2526        Double_t alfar = TMath::ACos(ud[2]);
2527        Double_t alfa = alfar*kRaddeg;
2528        if(alfa>=110.) return;
2529        //
2530        ialfa = Int_t(1.+alfa/2.);
2531  
2532        // Distance between particle trajectory and fibre axis
2533        gMC->TrackPosition(s[0],s[1],s[2]);
2534        for(j=0; j<=2; j++){
2535           x[j] = s[j];
2536        }
2537        gMC->Gmtod(x,xdet,1);
2538        if(TMath::Abs(ud[0])>0.00001){
2539          Float_t dcoeff = ud[1]/ud[0];
2540          be = TMath::Abs((xdet[1]-dcoeff*xdet[0])/TMath::Sqrt(dcoeff*dcoeff+1.));
2541        }
2542        else{
2543          be = TMath::Abs(ud[0]);
2544        }
2545  
2546        ibe = Int_t(be*1000.+1);
2547        //if((vol[0]==1))      radius = fFibZN[1];
2548        //else if((vol[0]==2)) radius = fFibZP[1];
2549  
2550        //Looking into the light tables 
2551        Float_t charge = gMC->TrackCharge();
2552        
2553        if(vol[0]==1 || vol[0]==4) {     // (1)  ZN fibres
2554          if(ibe>fNben) ibe=fNben;
2555          out =  charge*charge*fTablen[ibeta][ialfa][ibe];
2556          nphe = gRandom->Poisson(out);
2557          // Ch. debug
2558          //if(ibeta==3) printf("\t %f \t %f \t %f\n",alfa, be, out);
2559          //printf("\t ibeta = %d, ialfa = %d, ibe = %d -> nphe = %d\n\n",ibeta,ialfa,ibe,nphe);
2560          if(gMC->CurrentMedium() == fMedSensF1){
2561            hits[7] = nphe;      //fLightPMQ
2562            hits[8] = 0;
2563            hits[9] = 0;
2564            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2565          }
2566          else{
2567            hits[7] = 0;
2568            hits[8] = nphe;      //fLightPMC
2569            hits[9] = 0;
2570            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2571          }
2572        } 
2573        else if(vol[0]==2 || vol[0]==5) {// (2) ZP fibres
2574          if(ibe>fNbep) ibe=fNbep;
2575          out =  charge*charge*fTablep[ibeta][ialfa][ibe];
2576          nphe = gRandom->Poisson(out);
2577          if(gMC->CurrentMedium() == fMedSensF1){
2578            hits[7] = nphe;      //fLightPMQ
2579            hits[8] = 0;
2580            hits[9] = 0;
2581            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2582          }
2583          else{
2584            hits[7] = 0;
2585            hits[8] = nphe;      //fLightPMC
2586            hits[9] = 0;
2587            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2588          }
2589        } 
2590        else if((vol[0]==3)) {   // (3) ZEM fibres
2591          if(ibe>fNbep) ibe=fNbep;
2592          out =  charge*charge*fTablep[ibeta][ialfa][ibe];
2593          gMC->TrackPosition(s[0],s[1],s[2]);
2594          Float_t xalic[3];
2595          for(j=0; j<3; j++){
2596             xalic[j] = s[j];
2597          }
2598          // z-coordinate from ZEM front face 
2599          // NB-> fPosZEM[2]+fZEMLength = -1000.+2*10.3 = 979.69 cm
2600          Float_t z = -xalic[2]+fPosZEM[2]+2*fZEMLength-xalic[1];
2601 //       z = xalic[2]-fPosZEM[2]-fZEMLength-xalic[1]*(TMath::Tan(45.*kDegrad));
2602 //         printf("\n   fPosZEM[2]+2*fZEMLength = %f", fPosZEM[2]+2*fZEMLength);
2603          Float_t guiEff = guiPar[0]*(guiPar[1]*z*z+guiPar[2]*z+guiPar[3]);
2604          out = out*guiEff;
2605          nphe = gRandom->Poisson(out);
2606 //         printf("     out*guiEff = %f nphe = %d", out, nphe);
2607          if(vol[1] == 1){
2608            hits[7] = 0;         
2609            hits[8] = nphe;      //fLightPMC (ZEM1)
2610            hits[9] = 0;
2611            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2612          }
2613          else{
2614            hits[7] = nphe;      //fLightPMQ (ZEM2)
2615            hits[8] = 0;         
2616            hits[9] = 0;
2617            AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
2618          }
2619        }
2620      }
2621    }
2622 }