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