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