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