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