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