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