]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ZDC/AliZDCv2.cxx
Remove High Voltage STATus values from preprocessor configuration
[u/mrichter/AliRoot.git] / ZDC / AliZDCv2.cxx
CommitLineData
4663d63d 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
4663d63d 16
8cc32cbc 17///////////////////////////////////////////////////////////////////////
18// //
03ab2c93 19// AliZDCv2 --- new ZDC geometry //
8cc32cbc 20// with the EM ZDC at about 10 m from IP //
21// Just one set of ZDC is inserted //
22// (on the same side of the dimuon arm realtive to IP) //
03ab2c93 23// Compensator in ZDC geometry (Nov. 2004) //
8cc32cbc 24// //
25///////////////////////////////////////////////////////////////////////
4663d63d 26
27// --- Standard libraries
28#include "stdio.h"
29
30// --- ROOT system
31#include <TBRIK.h>
4663d63d 32#include <TMath.h>
88cb7938 33#include <TNode.h>
4663d63d 34#include <TRandom.h>
35#include <TSystem.h>
36#include <TTree.h>
88cb7938 37#include <TVirtualMC.h>
a1a21b39 38#include <TGeoManager.h>
4663d63d 39
40// --- AliRoot classes
88cb7938 41#include "AliConst.h"
4663d63d 42#include "AliMagF.h"
88cb7938 43#include "AliRun.h"
88cb7938 44#include "AliZDCv2.h"
5d12ce38 45#include "AliMC.h"
4663d63d 46
8a2624cc 47class AliZDCHit;
48class AliPDG;
49class AliDetector;
4663d63d 50
51ClassImp(AliZDCv2)
4663d63d 52
53//_____________________________________________________________________________
2a101713 54AliZDCv2::AliZDCv2() :
55 AliZDC(),
56 fMedSensF1(0),
57 fMedSensF2(0),
58 fMedSensZP(0),
59 fMedSensZN(0),
60 fMedSensZEM(0),
61 fMedSensGR(0),
62 fMedSensPI(0),
29c8f0dc 63 fMedSensTDI(0),
2a101713 64 fNalfan(0),
65 fNalfap(0),
66 fNben(0),
67 fNbep(0),
68 fZEMLength(0),
69 fpLostIT(0),
70 fpLostD1(0),
29c8f0dc 71 fpLostTDI(0),
2a101713 72 fpDetected(0),
73 fnDetected(0)
4663d63d 74{
75 //
76 // Default constructor for Zero Degree Calorimeter
77 //
78
4663d63d 79}
80
81//_____________________________________________________________________________
82AliZDCv2::AliZDCv2(const char *name, const char *title)
2a101713 83 : AliZDC(name,title),
84 fMedSensF1(0),
85 fMedSensF2(0),
86 fMedSensZP(0),
87 fMedSensZN(0),
88 fMedSensZEM(0),
89 fMedSensGR(0),
90 fMedSensPI(0),
29c8f0dc 91 fMedSensTDI(0),
2a101713 92 fNalfan(90),
93 fNalfap(90),
94 fNben(18),
95 fNbep(28),
64d8b611 96 fZEMLength(0),
2a101713 97 fpLostIT(0),
98 fpLostD1(0),
29c8f0dc 99 fpLostTDI(0),
2a101713 100 fpDetected(0),
101 fnDetected(0)
102
29c8f0dc 103
4663d63d 104{
105 //
106 // Standard constructor for Zero Degree Calorimeter
107 //
108 //
109 // Check that DIPO, ABSO, DIPO and SHIL is there (otherwise tracking is wrong!!!)
110
c6937a87 111 AliModule* pipe=gAlice->GetModule("PIPE");
112 AliModule* abso=gAlice->GetModule("ABSO");
113 AliModule* dipo=gAlice->GetModule("DIPO");
114 AliModule* shil=gAlice->GetModule("SHIL");
115 if((!pipe) || (!abso) || (!dipo) || (!shil)) {
4663d63d 116 Error("Constructor","ZDC needs PIPE, ABSO, DIPO and SHIL!!!\n");
117 exit(1);
118 }
119
120 fMedSensF1 = 0;
121 fMedSensF2 = 0;
122 fMedSensZN = 0;
123 fMedSensZP = 0;
124 fMedSensZEM = 0;
125 fMedSensGR = 0;
4700b983 126 fMedSensPI = 0;
127 fMedSensTDI = 0;
4663d63d 128
129
130 // Parameters for light tables
131 fNalfan = 90; // Number of Alfa (neutrons)
132 fNalfap = 90; // Number of Alfa (protons)
133 fNben = 18; // Number of beta (neutrons)
134 fNbep = 28; // Number of beta (protons)
135 Int_t ip,jp,kp;
136 for(ip=0; ip<4; ip++){
137 for(kp=0; kp<fNalfap; kp++){
138 for(jp=0; jp<fNbep; jp++){
139 fTablep[ip][kp][jp] = 0;
140 }
141 }
142 }
143 Int_t in,jn,kn;
144 for(in=0; in<4; in++){
145 for(kn=0; kn<fNalfan; kn++){
146 for(jn=0; jn<fNben; jn++){
147 fTablen[in][kn][jn] = 0;
148 }
149 }
150 }
151
152 // Parameters for hadronic calorimeters geometry
410749b4 153 fDimZN[0] = 3.52;
154 fDimZN[1] = 3.52;
155 fDimZN[2] = 50.;
4663d63d 156 fDimZP[0] = 11.2;
157 fDimZP[1] = 6.;
158 fDimZP[2] = 75.;
159 fPosZN[0] = 0.;
8cc32cbc 160 fPosZN[1] = 1.2;
bc7e1cd6 161 fPosZN[2] = -11650.;
162 fPosZP[0] = 23.9;
4663d63d 163 fPosZP[1] = 0.;
bc7e1cd6 164 fPosZP[2] = -11600.;
4663d63d 165 fFibZN[0] = 0.;
166 fFibZN[1] = 0.01825;
167 fFibZN[2] = 50.;
168 fFibZP[0] = 0.;
169 fFibZP[1] = 0.0275;
170 fFibZP[2] = 75.;
171
172 // Parameters for EM calorimeter geometry
173 fPosZEM[0] = 8.5;
174 fPosZEM[1] = 0.;
59ec6db4 175 fPosZEM[2] = 735.;
9eeb903e 176
177 Float_t kDimZEMPb = 0.15*(TMath::Sqrt(2.)); // z-dimension of the Pb slice
178 Float_t kDimZEMAir = 0.001; // scotch
179 Float_t kFibRadZEM = 0.0315; // External fiber radius (including cladding)
180 Int_t kDivZEM[3] = {92, 0, 20}; // Divisions for EM detector
181 Float_t kDimZEM0 = 2*kDivZEM[2]*(kDimZEMPb+kDimZEMAir+kFibRadZEM*(TMath::Sqrt(2.)));
182 fZEMLength = kDimZEM0;
29c8f0dc 183
4663d63d 184}
185
186//_____________________________________________________________________________
187void AliZDCv2::CreateGeometry()
188{
189 //
b2a1dc96 190 // Create the geometry for the Zero Degree Calorimeter version 2
4663d63d 191 //* Initialize COMMON block ZDC_CGEOM
192 //*
193
194 CreateBeamLine();
195 CreateZDC();
196}
197
198//_____________________________________________________________________________
199void AliZDCv2::CreateBeamLine()
200{
c6937a87 201 //
202 // Create the beam line elements
203 //
4663d63d 204
03ab2c93 205 Float_t zc, zq, zd1, zd2;
4663d63d 206 Float_t conpar[9], tubpar[3], tubspar[5], boxpar[3];
207 Int_t im1, im2;
208
209 Int_t *idtmed = fIdtmed->GetArray();
210
211 // -- Mother of the ZDCs (Vacuum PCON)
03ab2c93 212 // zd1 = 2092.; // (Without compensator in ZDC geometry)
213 zd1 = 1921.6;
b2a1dc96 214
4663d63d 215 conpar[0] = 0.;
216 conpar[1] = 360.;
217 conpar[2] = 2.;
bc7e1cd6 218 conpar[3] = -13500.;
4663d63d 219 conpar[4] = 0.;
c63eb7ab 220 conpar[5] = 55.;
bc7e1cd6 221 conpar[6] = -zd1;
4663d63d 222 conpar[7] = 0.;
c63eb7ab 223 conpar[8] = 55.;
4663d63d 224 gMC->Gsvolu("ZDC ", "PCON", idtmed[11], conpar, 9);
bc7e1cd6 225 gMC->Gspos("ZDC ", 1, "ALIC", 0., 0., 0., 0, "ONLY");
4663d63d 226
227 // -- FIRST SECTION OF THE BEAM PIPE (from compensator dipole to
228 // the beginning of D1)
4663d63d 229 tubpar[0] = 6.3/2.;
230 tubpar[1] = 6.7/2.;
4700b983 231 // From beginning of ZDC volumes to beginning of D1
232 tubpar[2] = (5838.3-zd1)/2.;
4663d63d 233 gMC->Gsvolu("QT01", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 234 gMC->Gspos("QT01", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
235 // Ch.debug
236 //printf("\n QT01 TUBE pipe from z = %f to z= %f (D1 beg.)\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 237
238 //-- SECOND SECTION OF THE BEAM PIPE (from the end of D1 to the
239 // beginning of D2)
240
241 //-- FROM MAGNETIC BEGINNING OF D1 TO MAGNETIC END OF D1 + 13.5 cm
242 //-- Cylindrical pipe (r = 3.47) + conical flare
243
244 // -> Beginning of D1
245 zd1 += 2.*tubpar[2];
246
247 tubpar[0] = 3.47;
248 tubpar[1] = 3.47+0.2;
249 tubpar[2] = 958.5/2.;
250 gMC->Gsvolu("QT02", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 251 gMC->Gspos("QT02", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
252 // Ch.debug
253 //printf("\n QT02 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 254
255 zd1 += 2.*tubpar[2];
256
257 conpar[0] = 25./2.;
bc7e1cd6 258 conpar[1] = 10./2.;
259 conpar[2] = 10.4/2.;
260 conpar[3] = 6.44/2.;
261 conpar[4] = 6.84/2.;
4663d63d 262 gMC->Gsvolu("QC01", "CONE", idtmed[7], conpar, 5);
bc7e1cd6 263 gMC->Gspos("QC01", 1, "ZDC ", 0., 0., -conpar[0]-zd1, 0, "ONLY");
264 // Ch.debug
265 //printf("\n QC01 CONE pipe from z = %f to z= %f\n",-zd1,-2*conpar[0]-zd1);
4663d63d 266
267 zd1 += 2.*conpar[0];
268
269 tubpar[0] = 10./2.;
270 tubpar[1] = 10.4/2.;
271 tubpar[2] = 50./2.;
272 gMC->Gsvolu("QT03", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 273 gMC->Gspos("QT03", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
274 // Ch.debug
275 //printf("\n QT03 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 276
277 zd1 += tubpar[2]*2.;
278
279 tubpar[0] = 10./2.;
280 tubpar[1] = 10.4/2.;
281 tubpar[2] = 10./2.;
282 gMC->Gsvolu("QT04", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 283 gMC->Gspos("QT04", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
284 // Ch.debug
285 //printf("\n QT04 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 286
287 zd1 += tubpar[2] * 2.;
288
289 tubpar[0] = 10./2.;
290 tubpar[1] = 10.4/2.;
291 tubpar[2] = 3.16/2.;
292 gMC->Gsvolu("QT05", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 293 gMC->Gspos("QT05", 1, "ZDC ", 0., 0., -tubpar[0]-zd1, 0, "ONLY");
294 // Ch.debug
295 //printf("\n QT05 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 296
297 zd1 += tubpar[2] * 2.;
298
299 tubpar[0] = 10.0/2.;
300 tubpar[1] = 10.4/2;
301 tubpar[2] = 190./2.;
302 gMC->Gsvolu("QT06", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 303 gMC->Gspos("QT06", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
304 // Ch.debug
305 //printf("\n QT06 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 306
307 zd1 += tubpar[2] * 2.;
308
309 conpar[0] = 30./2.;
bc7e1cd6 310 conpar[1] = 20.6/2.;
311 conpar[2] = 21./2.;
312 conpar[3] = 10./2.;
313 conpar[4] = 10.4/2.;
4663d63d 314 gMC->Gsvolu("QC02", "CONE", idtmed[7], conpar, 5);
bc7e1cd6 315 gMC->Gspos("QC02", 1, "ZDC ", 0., 0., -conpar[0]-zd1, 0, "ONLY");
316 // Ch.debug
317 //printf("\n QC02 CONE pipe from z = %f to z= %f\n",-zd1,-2*conpar[0]-zd1);
4663d63d 318
319 zd1 += conpar[0] * 2.;
320
321 tubpar[0] = 20.6/2.;
322 tubpar[1] = 21./2.;
323 tubpar[2] = 450./2.;
324 gMC->Gsvolu("QT07", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 325 gMC->Gspos("QT07", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
326 // Ch.debug
327 //printf("\n QT07 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 328
329 zd1 += tubpar[2] * 2.;
330
331 conpar[0] = 13.6/2.;
bc7e1cd6 332 conpar[1] = 25.4/2.;
333 conpar[2] = 25.8/2.;
334 conpar[3] = 20.6/2.;
335 conpar[4] = 21./2.;
4663d63d 336 gMC->Gsvolu("QC03", "CONE", idtmed[7], conpar, 5);
bc7e1cd6 337 gMC->Gspos("QC03", 1, "ZDC ", 0., 0., -conpar[0]-zd1, 0, "ONLY");
338 // Ch.debug
339 //printf("\n QC03 CONE pipe from z = %f to z= %f\n",-zd1,-2*conpar[0]-zd1);
4663d63d 340
341 zd1 += conpar[0] * 2.;
342
343 tubpar[0] = 25.4/2.;
344 tubpar[1] = 25.8/2.;
345 tubpar[2] = 205.8/2.;
346 gMC->Gsvolu("QT08", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 347 gMC->Gspos("QT08", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
348 // Ch.debug
349 //printf("\n QT08 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 350
351 zd1 += tubpar[2] * 2.;
352
353 tubpar[0] = 50./2.;
354 tubpar[1] = 50.4/2.;
355 // QT09 is 10 cm longer to accomodate TDI
356 tubpar[2] = 515.4/2.;
357 gMC->Gsvolu("QT09", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 358 gMC->Gspos("QT09", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
359 // Ch.debug
360 //printf("\n QT09 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 361
362 // --- Insert TDI (inside ZDC volume)
4663d63d 363 boxpar[0] = 5.6;
364 boxpar[1] = 5.6;
365 boxpar[2] = 400./2.;
366 gMC->Gsvolu("QTD1", "BOX ", idtmed[7], boxpar, 3);
bc7e1cd6 367 gMC->Gspos("QTD1", 1, "ZDC ", -3., 10.6, -tubpar[2]-zd1-56.3, 0, "ONLY");
368 gMC->Gspos("QTD1", 2, "ZDC ", -3., -10.6, -tubpar[2]-zd1-56.3, 0, "ONLY");
4663d63d 369
370 boxpar[0] = 0.2/2.;
371 boxpar[1] = 5.6;
372 boxpar[2] = 400./2.;
373 gMC->Gsvolu("QTD2", "BOX ", idtmed[6], boxpar, 3);
bc7e1cd6 374 gMC->Gspos("QTD2", 1, "ZDC ", -8.6-boxpar[0], 0., -tubpar[2]-zd1-56.3, 0, "ONLY");
4663d63d 375
6d5d9c06 376 tubspar[0] = 10.5; // R = 10.5 cm------------------------------------------
377 tubspar[1] = 10.7;
4663d63d 378 tubspar[2] = 400./2.;
bc7e1cd6 379 tubspar[3] = 360.-75.5;
380 tubspar[4] = 75.5;
4663d63d 381 gMC->Gsvolu("QTD3", "TUBS", idtmed[6], tubspar, 5);
bc7e1cd6 382 gMC->Gspos("QTD3", 1, "ZDC ", 0., 0., -tubpar[2]-zd1-56.3, 0, "ONLY");
383 // Ch.debug
384 //printf("\n TDI volume from z = %f to z= %f\n",-tubpar[2]-zd1-56.3,-tubpar[2]-zd1-56.3-400.);
4663d63d 385
386 zd1 += tubpar[2] * 2.;
387
388 tubpar[0] = 50./2.;
389 tubpar[1] = 50.4/2.;
390 // QT10 is 10 cm shorter
391 tubpar[2] = 690./2.;
392 gMC->Gsvolu("QT10", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 393 gMC->Gspos("QT10", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
394 // Ch.debug
395 //printf("\n QT10 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 396
397 zd1 += tubpar[2] * 2.;
398
399 tubpar[0] = 50./2.;
400 tubpar[1] = 50.4/2.;
401 tubpar[2] = 778.5/2.;
402 gMC->Gsvolu("QT11", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 403 gMC->Gspos("QT11", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
404 // Ch.debug
405 //printf("\n QT11 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 406
407 zd1 += tubpar[2] * 2.;
408
409 conpar[0] = 14.18/2.;
bc7e1cd6 410 conpar[1] = 55./2.;
411 conpar[2] = 55.4/2.;
412 conpar[3] = 50./2.;
413 conpar[4] = 50.4/2.;
4663d63d 414 gMC->Gsvolu("QC04", "CONE", idtmed[7], conpar, 5);
bc7e1cd6 415 gMC->Gspos("QC04", 1, "ZDC ", 0., 0., -conpar[0]-zd1, 0, "ONLY");
416 // Ch.debug
417 //printf("\n QC04 CONE pipe from z = %f to z= %f\n",-zd1,-2*conpar[0]-zd1);
4663d63d 418
419 zd1 += conpar[0] * 2.;
420
421 tubpar[0] = 55./2.;
422 tubpar[1] = 55.4/2.;
423 tubpar[2] = 730./2.;
424 gMC->Gsvolu("QT12", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 425 gMC->Gspos("QT12", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
426 // Ch.debug
427 //printf("\n QT12 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 428
429 zd1 += tubpar[2] * 2.;
430
431 conpar[0] = 36.86/2.;
bc7e1cd6 432 conpar[1] = 68./2.;
433 conpar[2] = 68.4/2.;
434 conpar[3] = 55./2.;
435 conpar[4] = 55.4/2.;
4663d63d 436 gMC->Gsvolu("QC05", "CONE", idtmed[7], conpar, 5);
bc7e1cd6 437 gMC->Gspos("QC05", 1, "ZDC ", 0., 0., -conpar[0]-zd1, 0, "ONLY");
438 // Ch.debug
439 //printf("\n QC05 CONE pipe from z = %f to z= %f\n",-zd1,-2*conpar[0]-zd1);
4663d63d 440
441 zd1 += conpar[0] * 2.;
442
443 tubpar[0] = 68./2.;
444 tubpar[1] = 68.4/2.;
445 tubpar[2] = 927.3/2.;
446 gMC->Gsvolu("QT13", "TUBE", idtmed[7], tubpar, 3);
bc7e1cd6 447 gMC->Gspos("QT13", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
448 // Ch.debug
449 //printf("\n QT13 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 450
451 zd1 += tubpar[2] * 2.;
452
453 tubpar[0] = 0./2.;
454 tubpar[1] = 68.4/2.;
455 tubpar[2] = 0.2/2.;
456 gMC->Gsvolu("QT14", "TUBE", idtmed[8], tubpar, 3);
bc7e1cd6 457 gMC->Gspos("QT14", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
458 // Ch.debug
459 //printf("\n QT14 TUBE pipe from z = %f to z= %f\n",-zd1,-2*tubpar[2]-zd1);
4663d63d 460
461 zd1 += tubpar[2] * 2.;
462
463 tubpar[0] = 0./2.;
464 tubpar[1] = 6.4/2.;
465 tubpar[2] = 0.2/2.;
466 gMC->Gsvolu("QT15", "TUBE", idtmed[11], tubpar, 3);
4663d63d 467 //-- Position QT15 inside QT14
468 gMC->Gspos("QT15", 1, "QT14", -7.7, 0., 0., 0, "ONLY");
bc7e1cd6 469
470 gMC->Gsvolu("QT16", "TUBE", idtmed[11], tubpar, 3);
4663d63d 471 //-- Position QT16 inside QT14
472 gMC->Gspos("QT16", 1, "QT14", 7.7, 0., 0., 0, "ONLY");
473
474
b2a1dc96 475 //-- BEAM PIPE BETWEEN END OF CONICAL PIPE AND BEGINNING OF D2
4663d63d 476
477 tubpar[0] = 6.4/2.;
478 tubpar[1] = 6.8/2.;
479 tubpar[2] = 680.8/2.;
480 gMC->Gsvolu("QT17", "TUBE", idtmed[7], tubpar, 3);
481
482 tubpar[0] = 6.4/2.;
483 tubpar[1] = 6.8/2.;
484 tubpar[2] = 680.8/2.;
485 gMC->Gsvolu("QT18", "TUBE", idtmed[7], tubpar, 3);
486
487 // -- ROTATE PIPES
bc7e1cd6 488 Float_t angle = 0.143*kDegrad; // Rotation angle
4663d63d 489
6d838c2f 490 //AliMatrix(im1, 90.+0.143, 0., 90., 90., 0.143, 0.); // x<0
491 gMC->Matrix(im1, 90.+0.143, 0., 90., 90., 0.143, 0.); // x<0
4663d63d 492 gMC->Gspos("QT17", 1, "ZDC ", TMath::Sin(angle) * 680.8/ 2. - 9.4,
bc7e1cd6 493 0., -tubpar[2]-zd1, im1, "ONLY");
4663d63d 494
6d838c2f 495 //AliMatrix(im2, 90.-0.143, 0., 90., 90., 0.143, 180.); // x>0 (ZP)
496 gMC->Matrix(im2, 90.-0.143, 0., 90., 90., 0.143, 180.); // x>0 (ZP)
4663d63d 497 gMC->Gspos("QT18", 1, "ZDC ", 9.7 - TMath::Sin(angle) * 680.8 / 2.,
bc7e1cd6 498 0., -tubpar[2]-zd1, im2, "ONLY");
c0f15647 499
4663d63d 500 // -- END OF BEAM PIPE VOLUME DEFINITION.
501 // ----------------------------------------------------------------
502
4663d63d 503 // ----------------------------------------------------------------
bc7e1cd6 504 // -- MAGNET DEFINITION -> LHC OPTICS 6.5
03ab2c93 505 // ----------------------------------------------------------------
506 // -- COMPENSATOR DIPOLE (MBXW)
507 zc = 1921.6;
508
509 // -- GAP (VACUUM WITH MAGNETIC FIELD)
510 tubpar[0] = 0.;
511 tubpar[1] = 4.5;
512 tubpar[2] = 170./2.;
513 gMC->Gsvolu("MBXW", "TUBE", idtmed[11], tubpar, 3);
514
515 // -- YOKE
516 tubpar[0] = 4.5;
517 tubpar[1] = 55.;
518 tubpar[2] = 170./2.;
3e3ba835 519 gMC->Gsvolu("YMBX", "TUBE", idtmed[13], tubpar, 3);
03ab2c93 520
521 gMC->Gspos("MBXW", 1, "ZDC ", 0., 0., -tubpar[2]-zc, 0, "ONLY");
522 gMC->Gspos("YMBX", 1, "ZDC ", 0., 0., -tubpar[2]-zc, 0, "ONLY");
4663d63d 523
4663d63d 524
03ab2c93 525 // -- INNER TRIPLET
526 zq = 2296.5;
527
4663d63d 528 // -- DEFINE MQXL AND MQX QUADRUPOLE ELEMENT
03ab2c93 529 // -- MQXL
4663d63d 530 // -- GAP (VACUUM WITH MAGNETIC FIELD)
4663d63d 531 tubpar[0] = 0.;
ee0c4fc1 532 tubpar[1] = 3.5;
533 tubpar[2] = 637./2.;
534 gMC->Gsvolu("MQXL", "TUBE", idtmed[11], tubpar, 3);
535
4663d63d 536
537 // -- YOKE
4663d63d 538 tubpar[0] = 3.5;
539 tubpar[1] = 22.;
540 tubpar[2] = 637./2.;
541 gMC->Gsvolu("YMQL", "TUBE", idtmed[7], tubpar, 3);
542
bc7e1cd6 543 gMC->Gspos("MQXL", 1, "ZDC ", 0., 0., -tubpar[2]-zq, 0, "ONLY");
544 gMC->Gspos("YMQL", 1, "ZDC ", 0., 0., -tubpar[2]-zq, 0, "ONLY");
4663d63d 545
bc7e1cd6 546 gMC->Gspos("MQXL", 2, "ZDC ", 0., 0., -tubpar[2]-zq-2430., 0, "ONLY");
547 gMC->Gspos("YMQL", 2, "ZDC ", 0., 0., -tubpar[2]-zq-2430., 0, "ONLY");
4663d63d 548
549 // -- MQX
550 // -- GAP (VACUUM WITH MAGNETIC FIELD)
4663d63d 551 tubpar[0] = 0.;
552 tubpar[1] = 3.5;
553 tubpar[2] = 550./2.;
554 gMC->Gsvolu("MQX ", "TUBE", idtmed[11], tubpar, 3);
555
556 // -- YOKE
4663d63d 557 tubpar[0] = 3.5;
558 tubpar[1] = 22.;
559 tubpar[2] = 550./2.;
560 gMC->Gsvolu("YMQ ", "TUBE", idtmed[7], tubpar, 3);
561
bc7e1cd6 562 gMC->Gspos("MQX ", 1, "ZDC ", 0., 0., -tubpar[2]-zq-908.5, 0, "ONLY");
563 gMC->Gspos("YMQ ", 1, "ZDC ", 0., 0., -tubpar[2]-zq-908.5, 0, "ONLY");
4663d63d 564
bc7e1cd6 565 gMC->Gspos("MQX ", 2, "ZDC ", 0., 0., -tubpar[2]-zq-1558.5, 0, "ONLY");
566 gMC->Gspos("YMQ ", 2, "ZDC ", 0., 0., -tubpar[2]-zq-1558.5, 0, "ONLY");
4663d63d 567
568 // -- SEPARATOR DIPOLE D1
4663d63d 569 zd1 = 5838.3;
570
571 // -- GAP (VACUUM WITH MAGNETIC FIELD)
4663d63d 572 tubpar[0] = 0.;
573 tubpar[1] = 6.94/2.;
574 tubpar[2] = 945./2.;
575 gMC->Gsvolu("MD1 ", "TUBE", idtmed[11], tubpar, 3);
576
577 // -- Insert horizontal Cu plates inside D1
578 // -- (to simulate the vacuum chamber)
8ed59a88 579 boxpar[0] = TMath::Sqrt(tubpar[1]*tubpar[1]-(2.98+0.2)*(2.98+0.2)) - 0.05;
4663d63d 580 boxpar[1] = 0.2/2.;
581 boxpar[2] =945./2.;
582 gMC->Gsvolu("MD1V", "BOX ", idtmed[6], boxpar, 3);
583 gMC->Gspos("MD1V", 1, "MD1 ", 0., 2.98+boxpar[1], 0., 0, "ONLY");
584 gMC->Gspos("MD1V", 2, "MD1 ", 0., -2.98-boxpar[1], 0., 0, "ONLY");
585
586 // -- YOKE
4663d63d 587 tubpar[0] = 0.;
588 tubpar[1] = 110./2;
589 tubpar[2] = 945./2.;
590 gMC->Gsvolu("YD1 ", "TUBE", idtmed[7], tubpar, 3);
591
bc7e1cd6 592 gMC->Gspos("YD1 ", 1, "ZDC ", 0., 0., -tubpar[2]-zd1, 0, "ONLY");
4663d63d 593 gMC->Gspos("MD1 ", 1, "YD1 ", 0., 0., 0., 0, "ONLY");
594
595 // -- DIPOLE D2
03ab2c93 596 // --- LHC optics v6.4
4663d63d 597 zd2 = 12147.6;
598
599 // -- GAP (VACUUM WITH MAGNETIC FIELD)
4663d63d 600 tubpar[0] = 0.;
601 tubpar[1] = 7.5/2.;
602 tubpar[2] = 945./2.;
603 gMC->Gsvolu("MD2 ", "TUBE", idtmed[11], tubpar, 3);
604
605 // -- YOKE
4663d63d 606 tubpar[0] = 0.;
607 tubpar[1] = 55.;
608 tubpar[2] = 945./2.;
609 gMC->Gsvolu("YD2 ", "TUBE", idtmed[7], tubpar, 3);
610
bc7e1cd6 611 gMC->Gspos("YD2 ", 1, "ZDC ", 0., 0., -tubpar[2]-zd2, 0, "ONLY");
4663d63d 612
613 gMC->Gspos("MD2 ", 1, "YD2 ", -9.4, 0., 0., 0, "ONLY");
614 gMC->Gspos("MD2 ", 2, "YD2 ", 9.4, 0., 0., 0, "ONLY");
615
616 // -- END OF MAGNET DEFINITION
617}
618
619//_____________________________________________________________________________
620void AliZDCv2::CreateZDC()
621{
c6937a87 622 //
623 // Create the various ZDCs (ZN + ZP)
624 //
4663d63d 625
c6937a87 626 Float_t dimPb[6], dimVoid[6];
4663d63d 627
628 Int_t *idtmed = fIdtmed->GetArray();
629
630 // Parameters for hadronic calorimeters geometry
631 // NB -> parameters used ONLY in CreateZDC()
4663d63d 632 Float_t fGrvZN[3] = {0.03, 0.03, 50.}; // Grooves for neutron detector
633 Float_t fGrvZP[3] = {0.04, 0.04, 75.}; // Grooves for proton detector
634 Int_t fDivZN[3] = {11, 11, 0}; // Division for neutron detector
635 Int_t fDivZP[3] = {7, 15, 0}; // Division for proton detector
636 Int_t fTowZN[2] = {2, 2}; // Tower for neutron detector
637 Int_t fTowZP[2] = {4, 1}; // Tower for proton detector
638
639 // Parameters for EM calorimeter geometry
640 // NB -> parameters used ONLY in CreateZDC()
7169b3db 641 Float_t kDimZEMPb = 0.15*(TMath::Sqrt(2.)); // z-dimension of the Pb slice
642 Float_t kFibRadZEM = 0.0315; // External fiber radius (including cladding)
4663d63d 643 Int_t fDivZEM[3] = {92, 0, 20}; // Divisions for EM detector
7169b3db 644 Float_t fDimZEM[6] = {fZEMLength, 3.5, 3.5, 45., 0., 0.}; // Dimensions of EM detector
645 Float_t fFibZEM2 = fDimZEM[2]/TMath::Sin(fDimZEM[3]*kDegrad)-kFibRadZEM;
4663d63d 646 Float_t fFibZEM[3] = {0., 0.0275, fFibZEM2}; // Fibers for EM calorimeter
647
648
649 //-- Create calorimeters geometry
650
651 // -------------------------------------------------------------------------------
652 //--> Neutron calorimeter (ZN)
653
654 gMC->Gsvolu("ZNEU", "BOX ", idtmed[1], fDimZN, 3); // Passive material
655 gMC->Gsvolu("ZNF1", "TUBE", idtmed[3], fFibZN, 3); // Active material
656 gMC->Gsvolu("ZNF2", "TUBE", idtmed[4], fFibZN, 3);
657 gMC->Gsvolu("ZNF3", "TUBE", idtmed[4], fFibZN, 3);
658 gMC->Gsvolu("ZNF4", "TUBE", idtmed[3], fFibZN, 3);
659 gMC->Gsvolu("ZNG1", "BOX ", idtmed[12], fGrvZN, 3); // Empty grooves
660 gMC->Gsvolu("ZNG2", "BOX ", idtmed[12], fGrvZN, 3);
661 gMC->Gsvolu("ZNG3", "BOX ", idtmed[12], fGrvZN, 3);
662 gMC->Gsvolu("ZNG4", "BOX ", idtmed[12], fGrvZN, 3);
663
664 // Divide ZNEU in towers (for hits purposes)
665
666 gMC->Gsdvn("ZNTX", "ZNEU", fTowZN[0], 1); // x-tower
667 gMC->Gsdvn("ZN1 ", "ZNTX", fTowZN[1], 2); // y-tower
668
669 //-- Divide ZN1 in minitowers
670 // fDivZN[0]= NUMBER OF FIBERS PER TOWER ALONG X-AXIS,
671 // fDivZN[1]= NUMBER OF FIBERS PER TOWER ALONG Y-AXIS
672 // (4 fibres per minitower)
673
674 gMC->Gsdvn("ZNSL", "ZN1 ", fDivZN[1], 2); // Slices
675 gMC->Gsdvn("ZNST", "ZNSL", fDivZN[0], 1); // Sticks
676
677 // --- Position the empty grooves in the sticks (4 grooves per stick)
678 Float_t dx = fDimZN[0] / fDivZN[0] / 4.;
679 Float_t dy = fDimZN[1] / fDivZN[1] / 4.;
680
681 gMC->Gspos("ZNG1", 1, "ZNST", 0.-dx, 0.+dy, 0., 0, "ONLY");
682 gMC->Gspos("ZNG2", 1, "ZNST", 0.+dx, 0.+dy, 0., 0, "ONLY");
683 gMC->Gspos("ZNG3", 1, "ZNST", 0.-dx, 0.-dy, 0., 0, "ONLY");
684 gMC->Gspos("ZNG4", 1, "ZNST", 0.+dx, 0.-dy, 0., 0, "ONLY");
685
686 // --- Position the fibers in the grooves
687 gMC->Gspos("ZNF1", 1, "ZNG1", 0., 0., 0., 0, "ONLY");
688 gMC->Gspos("ZNF2", 1, "ZNG2", 0., 0., 0., 0, "ONLY");
689 gMC->Gspos("ZNF3", 1, "ZNG3", 0., 0., 0., 0, "ONLY");
690 gMC->Gspos("ZNF4", 1, "ZNG4", 0., 0., 0., 0, "ONLY");
691
692 // --- Position the neutron calorimeter in ZDC
f05df11a 693 // -- Rotation of ZDCs
694 Int_t irotzdc;
695 gMC->Matrix(irotzdc, 90., 180., 90., 90., 180., 0.);
696 //
697 gMC->Gspos("ZNEU", 1, "ZDC ", fPosZN[0], fPosZN[1], fPosZN[2]-fDimZN[2], irotzdc, "ONLY");
bc7e1cd6 698 //Ch debug
699 //printf("\n ZN -> %f < z < %f cm\n",fPosZN[2],fPosZN[2]-2*fDimZN[2]);
4663d63d 700
701 // -------------------------------------------------------------------------------
702 //--> Proton calorimeter (ZP)
703
704 gMC->Gsvolu("ZPRO", "BOX ", idtmed[2], fDimZP, 3); // Passive material
705 gMC->Gsvolu("ZPF1", "TUBE", idtmed[3], fFibZP, 3); // Active material
706 gMC->Gsvolu("ZPF2", "TUBE", idtmed[4], fFibZP, 3);
707 gMC->Gsvolu("ZPF3", "TUBE", idtmed[4], fFibZP, 3);
708 gMC->Gsvolu("ZPF4", "TUBE", idtmed[3], fFibZP, 3);
709 gMC->Gsvolu("ZPG1", "BOX ", idtmed[12], fGrvZP, 3); // Empty grooves
710 gMC->Gsvolu("ZPG2", "BOX ", idtmed[12], fGrvZP, 3);
711 gMC->Gsvolu("ZPG3", "BOX ", idtmed[12], fGrvZP, 3);
712 gMC->Gsvolu("ZPG4", "BOX ", idtmed[12], fGrvZP, 3);
713
714 //-- Divide ZPRO in towers(for hits purposes)
715
716 gMC->Gsdvn("ZPTX", "ZPRO", fTowZP[0], 1); // x-tower
717 gMC->Gsdvn("ZP1 ", "ZPTX", fTowZP[1], 2); // y-tower
718
719
720 //-- Divide ZP1 in minitowers
721 // fDivZP[0]= NUMBER OF FIBERS ALONG X-AXIS PER MINITOWER,
722 // fDivZP[1]= NUMBER OF FIBERS ALONG Y-AXIS PER MINITOWER
723 // (4 fiber per minitower)
724
725 gMC->Gsdvn("ZPSL", "ZP1 ", fDivZP[1], 2); // Slices
726 gMC->Gsdvn("ZPST", "ZPSL", fDivZP[0], 1); // Sticks
727
728 // --- Position the empty grooves in the sticks (4 grooves per stick)
729 dx = fDimZP[0] / fTowZP[0] / fDivZP[0] / 2.;
730 dy = fDimZP[1] / fTowZP[1] / fDivZP[1] / 2.;
731
732 gMC->Gspos("ZPG1", 1, "ZPST", 0.-dx, 0.+dy, 0., 0, "ONLY");
733 gMC->Gspos("ZPG2", 1, "ZPST", 0.+dx, 0.+dy, 0., 0, "ONLY");
734 gMC->Gspos("ZPG3", 1, "ZPST", 0.-dx, 0.-dy, 0., 0, "ONLY");
735 gMC->Gspos("ZPG4", 1, "ZPST", 0.+dx, 0.-dy, 0., 0, "ONLY");
736
737 // --- Position the fibers in the grooves
738 gMC->Gspos("ZPF1", 1, "ZPG1", 0., 0., 0., 0, "ONLY");
739 gMC->Gspos("ZPF2", 1, "ZPG2", 0., 0., 0., 0, "ONLY");
740 gMC->Gspos("ZPF3", 1, "ZPG3", 0., 0., 0., 0, "ONLY");
741 gMC->Gspos("ZPF4", 1, "ZPG4", 0., 0., 0., 0, "ONLY");
742
743
744 // --- Position the proton calorimeter in ZDC
f05df11a 745 gMC->Gspos("ZPRO", 1, "ZDC ", fPosZP[0], fPosZP[1], fPosZP[2]-fDimZP[2], irotzdc, "ONLY");
bc7e1cd6 746 //Ch debug
747 //printf("\n ZP -> %f < z < %f cm\n",fPosZP[2],fPosZP[2]-2*fDimZP[2]);
4663d63d 748
749
750 // -------------------------------------------------------------------------------
751 // -> EM calorimeter (ZEM)
752
753 gMC->Gsvolu("ZEM ", "PARA", idtmed[10], fDimZEM, 6);
754
755 Int_t irot1, irot2;
c0f15647 756 gMC->Matrix(irot1,0.,0.,90.,90.,-90.,0.); // Rotation matrix 1
4663d63d 757 gMC->Matrix(irot2,180.,0.,90.,fDimZEM[3]+90.,90.,fDimZEM[3]);// Rotation matrix 2
c0f15647 758 //printf("irot1 = %d, irot2 = %d \n", irot1, irot2);
4663d63d 759
c0f15647 760 gMC->Gsvolu("ZEMF", "TUBE", idtmed[3], fFibZEM, 3); // Active material
4663d63d 761
c0f15647 762 gMC->Gsdvn("ZETR", "ZEM ", fDivZEM[2], 1); // Tranches
4663d63d 763
7169b3db 764 dimPb[0] = kDimZEMPb; // Lead slices
c6937a87 765 dimPb[1] = fDimZEM[2];
766 dimPb[2] = fDimZEM[1];
bc7e1cd6 767 //dimPb[3] = fDimZEM[3]; //controllare
768 dimPb[3] = 90.-fDimZEM[3]; //originale
c6937a87 769 dimPb[4] = 0.;
770 dimPb[5] = 0.;
771 gMC->Gsvolu("ZEL0", "PARA", idtmed[5], dimPb, 6);
772 gMC->Gsvolu("ZEL1", "PARA", idtmed[5], dimPb, 6);
bc7e1cd6 773 gMC->Gsvolu("ZEL2", "PARA", idtmed[5], dimPb, 6);
4663d63d 774
775 // --- Position the lead slices in the tranche
776 Float_t zTran = fDimZEM[0]/fDivZEM[2];
7169b3db 777 Float_t zTrPb = -zTran+kDimZEMPb;
4663d63d 778 gMC->Gspos("ZEL0", 1, "ZETR", zTrPb, 0., 0., 0, "ONLY");
7169b3db 779 gMC->Gspos("ZEL1", 1, "ZETR", kDimZEMPb, 0., 0., 0, "ONLY");
4663d63d 780
781 // --- Vacuum zone (to be filled with fibres)
7169b3db 782 dimVoid[0] = (zTran-2*kDimZEMPb)/2.;
c6937a87 783 dimVoid[1] = fDimZEM[2];
784 dimVoid[2] = fDimZEM[1];
785 dimVoid[3] = 90.-fDimZEM[3];
786 dimVoid[4] = 0.;
787 dimVoid[5] = 0.;
788 gMC->Gsvolu("ZEV0", "PARA", idtmed[10], dimVoid,6);
789 gMC->Gsvolu("ZEV1", "PARA", idtmed[10], dimVoid,6);
4663d63d 790
791 // --- Divide the vacuum slice into sticks along x axis
792 gMC->Gsdvn("ZES0", "ZEV0", fDivZEM[0], 3);
793 gMC->Gsdvn("ZES1", "ZEV1", fDivZEM[0], 3);
794
795 // --- Positioning the fibers into the sticks
796 gMC->Gspos("ZEMF", 1,"ZES0", 0., 0., 0., irot2, "ONLY");
797 gMC->Gspos("ZEMF", 1,"ZES1", 0., 0., 0., irot2, "ONLY");
798
799 // --- Positioning the vacuum slice into the tranche
c6937a87 800 Float_t displFib = fDimZEM[1]/fDivZEM[0];
801 gMC->Gspos("ZEV0", 1,"ZETR", -dimVoid[0], 0., 0., 0, "ONLY");
802 gMC->Gspos("ZEV1", 1,"ZETR", -dimVoid[0]+zTran, 0., displFib, 0, "ONLY");
4663d63d 803
804 // --- Positioning the ZEM into the ZDC - rotation for 90 degrees
c63eb7ab 805 // NB -> In AliZDCv2 ZEM is positioned in ALIC (instead of in ZDC) volume
806 // beacause it's impossible to make a ZDC pcon volume to contain
59ec6db4 807 // both hadronics and EM calorimeters.
bc7e1cd6 808 gMC->Gspos("ZEM ", 1,"ALIC", -fPosZEM[0], fPosZEM[1], fPosZEM[2]+fDimZEM[0], irot1, "ONLY");
4663d63d 809
410749b4 810 // Second EM ZDC (same side w.r.t. IP, just on the other side w.r.t. beam pipe)
bc7e1cd6 811 gMC->Gspos("ZEM ", 2,"ALIC", fPosZEM[0], fPosZEM[1], fPosZEM[2]+fDimZEM[0], irot1, "ONLY");
410749b4 812
4663d63d 813 // --- Adding last slice at the end of the EM calorimeter
7169b3db 814 Float_t zLastSlice = fPosZEM[2]+kDimZEMPb+2*fDimZEM[0];
bc7e1cd6 815 gMC->Gspos("ZEL2", 1,"ALIC", fPosZEM[0], fPosZEM[1], zLastSlice, irot1, "ONLY");
816 //Ch debug
817 //printf("\n ZEM lenght = %f cm\n",2*fZEMLength);
7169b3db 818 //printf("\n ZEM -> %f < z < %f cm\n",fPosZEM[2],fPosZEM[2]+2*fZEMLength+zLastSlice+kDimZEMPb);
4663d63d 819
820}
821
822//_____________________________________________________________________________
c6937a87 823void AliZDCv2::DrawModule() const
4663d63d 824{
825 //
826 // Draw a shaded view of the Zero Degree Calorimeter version 1
827 //
828
829 // Set everything unseen
830 gMC->Gsatt("*", "seen", -1);
831 //
832 // Set ALIC mother transparent
833 gMC->Gsatt("ALIC","SEEN",0);
834 //
835 // Set the volumes visible
836 gMC->Gsatt("ZDC ","SEEN",0);
837 gMC->Gsatt("QT01","SEEN",1);
838 gMC->Gsatt("QT02","SEEN",1);
839 gMC->Gsatt("QT03","SEEN",1);
840 gMC->Gsatt("QT04","SEEN",1);
841 gMC->Gsatt("QT05","SEEN",1);
842 gMC->Gsatt("QT06","SEEN",1);
843 gMC->Gsatt("QT07","SEEN",1);
844 gMC->Gsatt("QT08","SEEN",1);
845 gMC->Gsatt("QT09","SEEN",1);
846 gMC->Gsatt("QT10","SEEN",1);
847 gMC->Gsatt("QT11","SEEN",1);
848 gMC->Gsatt("QT12","SEEN",1);
849 gMC->Gsatt("QT13","SEEN",1);
850 gMC->Gsatt("QT14","SEEN",1);
851 gMC->Gsatt("QT15","SEEN",1);
852 gMC->Gsatt("QT16","SEEN",1);
853 gMC->Gsatt("QT17","SEEN",1);
854 gMC->Gsatt("QT18","SEEN",1);
855 gMC->Gsatt("QC01","SEEN",1);
856 gMC->Gsatt("QC02","SEEN",1);
857 gMC->Gsatt("QC03","SEEN",1);
858 gMC->Gsatt("QC04","SEEN",1);
859 gMC->Gsatt("QC05","SEEN",1);
860 gMC->Gsatt("QTD1","SEEN",1);
861 gMC->Gsatt("QTD2","SEEN",1);
862 gMC->Gsatt("QTD3","SEEN",1);
863 gMC->Gsatt("MQXL","SEEN",1);
864 gMC->Gsatt("YMQL","SEEN",1);
865 gMC->Gsatt("MQX ","SEEN",1);
866 gMC->Gsatt("YMQ ","SEEN",1);
867 gMC->Gsatt("ZQYX","SEEN",1);
868 gMC->Gsatt("MD1 ","SEEN",1);
869 gMC->Gsatt("MD1V","SEEN",1);
870 gMC->Gsatt("YD1 ","SEEN",1);
871 gMC->Gsatt("MD2 ","SEEN",1);
872 gMC->Gsatt("YD2 ","SEEN",1);
873 gMC->Gsatt("ZNEU","SEEN",0);
874 gMC->Gsatt("ZNF1","SEEN",0);
875 gMC->Gsatt("ZNF2","SEEN",0);
876 gMC->Gsatt("ZNF3","SEEN",0);
877 gMC->Gsatt("ZNF4","SEEN",0);
878 gMC->Gsatt("ZNG1","SEEN",0);
879 gMC->Gsatt("ZNG2","SEEN",0);
880 gMC->Gsatt("ZNG3","SEEN",0);
881 gMC->Gsatt("ZNG4","SEEN",0);
882 gMC->Gsatt("ZNTX","SEEN",0);
883 gMC->Gsatt("ZN1 ","COLO",4);
884 gMC->Gsatt("ZN1 ","SEEN",1);
885 gMC->Gsatt("ZNSL","SEEN",0);
886 gMC->Gsatt("ZNST","SEEN",0);
887 gMC->Gsatt("ZPRO","SEEN",0);
888 gMC->Gsatt("ZPF1","SEEN",0);
889 gMC->Gsatt("ZPF2","SEEN",0);
890 gMC->Gsatt("ZPF3","SEEN",0);
891 gMC->Gsatt("ZPF4","SEEN",0);
892 gMC->Gsatt("ZPG1","SEEN",0);
893 gMC->Gsatt("ZPG2","SEEN",0);
894 gMC->Gsatt("ZPG3","SEEN",0);
895 gMC->Gsatt("ZPG4","SEEN",0);
896 gMC->Gsatt("ZPTX","SEEN",0);
897 gMC->Gsatt("ZP1 ","COLO",6);
898 gMC->Gsatt("ZP1 ","SEEN",1);
899 gMC->Gsatt("ZPSL","SEEN",0);
900 gMC->Gsatt("ZPST","SEEN",0);
901 gMC->Gsatt("ZEM ","COLO",7);
902 gMC->Gsatt("ZEM ","SEEN",1);
903 gMC->Gsatt("ZEMF","SEEN",0);
904 gMC->Gsatt("ZETR","SEEN",0);
905 gMC->Gsatt("ZEL0","SEEN",0);
906 gMC->Gsatt("ZEL1","SEEN",0);
907 gMC->Gsatt("ZEL2","SEEN",0);
908 gMC->Gsatt("ZEV0","SEEN",0);
909 gMC->Gsatt("ZEV1","SEEN",0);
910 gMC->Gsatt("ZES0","SEEN",0);
911 gMC->Gsatt("ZES1","SEEN",0);
912
913 //
914 gMC->Gdopt("hide", "on");
915 gMC->Gdopt("shad", "on");
916 gMC->Gsatt("*", "fill", 7);
917 gMC->SetClipBox(".");
918 gMC->SetClipBox("*", 0, 100, -100, 100, 12000, 16000);
919 gMC->DefaultRange();
920 gMC->Gdraw("alic", 40, 30, 0, 488, 220, .07, .07);
921 gMC->Gdhead(1111, "Zero Degree Calorimeter Version 1");
922 gMC->Gdman(18, 4, "MAN");
923}
924
925//_____________________________________________________________________________
926void AliZDCv2::CreateMaterials()
927{
928 //
929 // Create Materials for the Zero Degree Calorimeter
930 //
931
1e064588 932 Float_t dens, ubuf[1], wmat[2], a[2], z[2];
4663d63d 933
934 // --- Store in UBUF r0 for nuclear radius calculation R=r0*A**1/3
935
936 // --- Tantalum -> ZN passive material
937 ubuf[0] = 1.1;
938 AliMaterial(1, "TANT", 180.95, 73., 16.65, .4, 11.9, ubuf, 1);
939
940 // --- Tungsten
941// ubuf[0] = 1.11;
942// AliMaterial(1, "TUNG", 183.85, 74., 19.3, .35, 10.3, ubuf, 1);
943
944 // --- Brass (CuZn) -> ZP passive material
945 dens = 8.48;
946 a[0] = 63.546;
947 a[1] = 65.39;
948 z[0] = 29.;
949 z[1] = 30.;
950 wmat[0] = .63;
951 wmat[1] = .37;
952 AliMixture(2, "BRASS ", a, z, dens, 2, wmat);
953
954 // --- SiO2
955 dens = 2.64;
956 a[0] = 28.086;
957 a[1] = 15.9994;
958 z[0] = 14.;
959 z[1] = 8.;
960 wmat[0] = 1.;
961 wmat[1] = 2.;
962 AliMixture(3, "SIO2 ", a, z, dens, -2, wmat);
963
964 // --- Lead
965 ubuf[0] = 1.12;
966 AliMaterial(5, "LEAD", 207.19, 82., 11.35, .56, 18.5, ubuf, 1);
967
968 // --- Copper
969 ubuf[0] = 1.10;
970 AliMaterial(6, "COPP", 63.54, 29., 8.96, 1.4, 0., ubuf, 1);
971
972 // --- Iron (energy loss taken into account)
973 ubuf[0] = 1.1;
4a9de4af 974 AliMaterial(7, "IRON0", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
4663d63d 975
976 // --- Iron (no energy loss)
977 ubuf[0] = 1.1;
4a9de4af 978 AliMaterial(8, "IRON1", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
3e3ba835 979 AliMaterial(13, "IRON2", 55.85, 26., 7.87, 1.76, 0., ubuf, 1);
4663d63d 980
1e064588 981 // ---------------------------------------------------------
982 Float_t aResGas[3]={1.008,12.0107,15.9994};
983 Float_t zResGas[3]={1.,6.,8.};
984 Float_t wResGas[3]={0.28,0.28,0.44};
985 Float_t dResGas = 3.2E-14;
986
4663d63d 987 // --- Vacuum (no magnetic field)
1e064588 988 AliMixture(10, "VOID", aResGas, zResGas, dResGas, 3, wResGas);
989 //AliMaterial(10, "VOID", 1e-16, 1e-16, 1e-16, 1e16, 1e16, ubuf,0);
4663d63d 990
991 // --- Vacuum (with magnetic field)
1e064588 992 AliMixture(11, "VOIM", aResGas, zResGas, dResGas, 3, wResGas);
993 //AliMaterial(11, "VOIM", 1e-16, 1e-16, 1e-16, 1e16, 1e16, ubuf,0);
4663d63d 994
995 // --- Air (no magnetic field)
1e064588 996 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
997 Float_t zAir[4]={6.,7.,8.,18.};
998 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
999 Float_t dAir = 1.20479E-3;
1000 //
1001 AliMixture(12, "Air $", aAir, zAir, dAir, 4, wAir);
1002 //AliMaterial(12, "Air $", 14.61, 7.3, .001205, 30420., 67500., ubuf, 0);
4663d63d 1003
1004 // --- Definition of tracking media:
1005
1006 // --- Tantalum = 1 ;
1007 // --- Brass = 2 ;
1008 // --- Fibers (SiO2) = 3 ;
1009 // --- Fibers (SiO2) = 4 ;
1010 // --- Lead = 5 ;
1011 // --- Copper = 6 ;
1012 // --- Iron (with energy loss) = 7 ;
1013 // --- Iron (without energy loss) = 8 ;
1014 // --- Vacuum (no field) = 10
1015 // --- Vacuum (with field) = 11
1016 // --- Air (no field) = 12
1017
1e064588 1018 // ****************************************************
1019 // Tracking media parameters
1020 //
1021 Float_t epsil = 0.01; // Tracking precision,
1022 Float_t stmin = 0.01; // Min. value 4 max. step (cm)
1023 Float_t stemax = 1.; // Max. step permitted (cm)
1024 Float_t tmaxfd = 0.; // Maximum angle due to field (degrees)
1025 Float_t deemax = -1.; // Maximum fractional energy loss
1026 Float_t nofieldm = 0.; // Max. field value (no field)
1027 Float_t fieldm = 45.; // Max. field value (with field)
1028 Int_t isvol = 0; // ISVOL =0 -> not sensitive volume
1029 Int_t isvolActive = 1; // ISVOL =1 -> sensitive volume
1030 Int_t inofld = 0; // IFIELD=0 -> no magnetic field
1031 Int_t ifield =2; // IFIELD=2 -> magnetic field defined in AliMagFC.h
1032 // *****************************************************
1033
1034 AliMedium(1, "ZTANT", 1, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1035 AliMedium(2, "ZBRASS",2, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1036 AliMedium(3, "ZSIO2", 3, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1037 AliMedium(4, "ZQUAR", 3, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1038 AliMedium(5, "ZLEAD", 5, isvolActive, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1039 AliMedium(6, "ZCOPP", 6, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1040 AliMedium(7, "ZIRON", 7, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1041 AliMedium(8, "ZIRONN",8, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1042 AliMedium(10,"ZVOID",10, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1043 AliMedium(12,"ZAIR", 12, isvol, inofld, nofieldm, tmaxfd, stemax, deemax, epsil, stmin);
1044 //
3e3ba835 1045 AliMedium(11,"ZVOIM", 11, isvol, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
ad962736 1046 AliMedium(13,"ZIRONE",13, isvol, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
1047}
1048
1049//_____________________________________________________________________________
1050void AliZDCv2::AddAlignableVolumes() const
1051{
1052 //
1053 // Create entries for alignable volumes associating the symbolic volume
1054 // name with the corresponding volume path. Needs to be syncronized with
1055 // eventual changes in the geometry.
1056 //
1057 TString volpath1 = "ALIC_1/ZDC_1/ZNEU_1";
1058 TString volpath2 = "ALIC_1/ZDC_1/ZPRO_1";
1059
1060 TString symname1="ZDC/NeutronZDC";
1061 TString symname2="ZDC/ProtonZDC";
1062
1063 if(!gGeoManager->SetAlignableEntry(symname1.Data(),volpath1.Data()))
1064 AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", symname1.Data(),volpath1.Data()));
1065
1066 if(!gGeoManager->SetAlignableEntry(symname2.Data(),volpath2.Data()))
1067 AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", symname2.Data(),volpath2.Data()));
1068}
1069
1070//_____________________________________________________________________________
1071void AliZDCv2::Init()
1072{
1073 InitTables();
1074 Int_t *idtmed = fIdtmed->GetArray();
1075 Int_t i;
4663d63d 1076 // Thresholds for showering in the ZDCs
1077 i = 1; //tantalum
1078 gMC->Gstpar(idtmed[i], "CUTGAM", .001);
1079 gMC->Gstpar(idtmed[i], "CUTELE", .001);
1080 gMC->Gstpar(idtmed[i], "CUTNEU", .01);
1081 gMC->Gstpar(idtmed[i], "CUTHAD", .01);
1082 i = 2; //brass
1083 gMC->Gstpar(idtmed[i], "CUTGAM", .001);
1084 gMC->Gstpar(idtmed[i], "CUTELE", .001);
1085 gMC->Gstpar(idtmed[i], "CUTNEU", .01);
1086 gMC->Gstpar(idtmed[i], "CUTHAD", .01);
1087 i = 5; //lead
1088 gMC->Gstpar(idtmed[i], "CUTGAM", .001);
1089 gMC->Gstpar(idtmed[i], "CUTELE", .001);
1090 gMC->Gstpar(idtmed[i], "CUTNEU", .01);
1091 gMC->Gstpar(idtmed[i], "CUTHAD", .01);
1092
1093 // Avoid too detailed showering in TDI
1094 i = 6; //copper
1095 gMC->Gstpar(idtmed[i], "CUTGAM", .1);
1096 gMC->Gstpar(idtmed[i], "CUTELE", .1);
1097 gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
1098 gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
1099
1100 // Avoid too detailed showering along the beam line
1101 i = 7; //iron with energy loss (ZIRON)
1102 gMC->Gstpar(idtmed[i], "CUTGAM", .1);
1103 gMC->Gstpar(idtmed[i], "CUTELE", .1);
1104 gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
1105 gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
1106
1107 // Avoid too detailed showering along the beam line
1108 i = 8; //iron with energy loss (ZIRONN)
1109 gMC->Gstpar(idtmed[i], "CUTGAM", .1);
1110 gMC->Gstpar(idtmed[i], "CUTELE", .1);
1111 gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
1112 gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
3e3ba835 1113 // Avoid too detailed showering along the beam line
1114 i = 13; //iron with energy loss (ZIRONN)
1115 gMC->Gstpar(idtmed[i], "CUTGAM", 1.);
1116 gMC->Gstpar(idtmed[i], "CUTELE", 1.);
1117 gMC->Gstpar(idtmed[i], "CUTNEU", 1.);
1118 gMC->Gstpar(idtmed[i], "CUTHAD", 1.);
4663d63d 1119
1120 // Avoid interaction in fibers (only energy loss allowed)
1121 i = 3; //fibers (ZSI02)
1122 gMC->Gstpar(idtmed[i], "DCAY", 0.);
1123 gMC->Gstpar(idtmed[i], "MULS", 0.);
1124 gMC->Gstpar(idtmed[i], "PFIS", 0.);
1125 gMC->Gstpar(idtmed[i], "MUNU", 0.);
1126 gMC->Gstpar(idtmed[i], "LOSS", 1.);
1127 gMC->Gstpar(idtmed[i], "PHOT", 0.);
1128 gMC->Gstpar(idtmed[i], "COMP", 0.);
1129 gMC->Gstpar(idtmed[i], "PAIR", 0.);
1130 gMC->Gstpar(idtmed[i], "BREM", 0.);
1131 gMC->Gstpar(idtmed[i], "DRAY", 0.);
1132 gMC->Gstpar(idtmed[i], "ANNI", 0.);
1133 gMC->Gstpar(idtmed[i], "HADR", 0.);
1134 i = 4; //fibers (ZQUAR)
1135 gMC->Gstpar(idtmed[i], "DCAY", 0.);
1136 gMC->Gstpar(idtmed[i], "MULS", 0.);
1137 gMC->Gstpar(idtmed[i], "PFIS", 0.);
1138 gMC->Gstpar(idtmed[i], "MUNU", 0.);
1139 gMC->Gstpar(idtmed[i], "LOSS", 1.);
1140 gMC->Gstpar(idtmed[i], "PHOT", 0.);
1141 gMC->Gstpar(idtmed[i], "COMP", 0.);
1142 gMC->Gstpar(idtmed[i], "PAIR", 0.);
1143 gMC->Gstpar(idtmed[i], "BREM", 0.);
1144 gMC->Gstpar(idtmed[i], "DRAY", 0.);
1145 gMC->Gstpar(idtmed[i], "ANNI", 0.);
1146 gMC->Gstpar(idtmed[i], "HADR", 0.);
1147
1148 // Avoid interaction in void
1149 i = 11; //void with field
1150 gMC->Gstpar(idtmed[i], "DCAY", 0.);
1151 gMC->Gstpar(idtmed[i], "MULS", 0.);
1152 gMC->Gstpar(idtmed[i], "PFIS", 0.);
1153 gMC->Gstpar(idtmed[i], "MUNU", 0.);
1154 gMC->Gstpar(idtmed[i], "LOSS", 0.);
1155 gMC->Gstpar(idtmed[i], "PHOT", 0.);
1156 gMC->Gstpar(idtmed[i], "COMP", 0.);
1157 gMC->Gstpar(idtmed[i], "PAIR", 0.);
1158 gMC->Gstpar(idtmed[i], "BREM", 0.);
1159 gMC->Gstpar(idtmed[i], "DRAY", 0.);
1160 gMC->Gstpar(idtmed[i], "ANNI", 0.);
1161 gMC->Gstpar(idtmed[i], "HADR", 0.);
1162
1163 //
1164 fMedSensZN = idtmed[1]; // Sensitive volume: ZN passive material
1165 fMedSensZP = idtmed[2]; // Sensitive volume: ZP passive material
1166 fMedSensF1 = idtmed[3]; // Sensitive volume: fibres type 1
1167 fMedSensF2 = idtmed[4]; // Sensitive volume: fibres type 2
1168 fMedSensZEM = idtmed[5]; // Sensitive volume: ZEM passive material
4700b983 1169 fMedSensTDI = idtmed[6]; // Sensitive volume: TDI Cu shield
1170 fMedSensPI = idtmed[7]; // Sensitive volume: beam pipes
2fcfe987 1171 fMedSensGR = idtmed[12]; // Sensitive volume: air into the grooves
4663d63d 1172}
1173
1174//_____________________________________________________________________________
1175void AliZDCv2::InitTables()
1176{
c6937a87 1177 //
1178 // Read light tables for Cerenkov light production parameterization
1179 //
1180
4663d63d 1181 Int_t k, j;
1182
1183 char *lightfName1,*lightfName2,*lightfName3,*lightfName4,
1184 *lightfName5,*lightfName6,*lightfName7,*lightfName8;
1185 FILE *fp1, *fp2, *fp3, *fp4, *fp5, *fp6, *fp7, *fp8;
1186
1187 // --- Reading light tables for ZN
5017788b 1188 lightfName1 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362207s");
4663d63d 1189 if((fp1 = fopen(lightfName1,"r")) == NULL){
1190 printf("Cannot open file fp1 \n");
1191 return;
1192 }
5017788b 1193 lightfName2 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362208s");
4663d63d 1194 if((fp2 = fopen(lightfName2,"r")) == NULL){
1195 printf("Cannot open file fp2 \n");
1196 return;
1197 }
5017788b 1198 lightfName3 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362209s");
4663d63d 1199 if((fp3 = fopen(lightfName3,"r")) == NULL){
1200 printf("Cannot open file fp3 \n");
1201 return;
1202 }
5017788b 1203 lightfName4 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620362210s");
4663d63d 1204 if((fp4 = fopen(lightfName4,"r")) == NULL){
1205 printf("Cannot open file fp4 \n");
1206 return;
1207 }
1208
1209 for(k=0; k<fNalfan; k++){
1210 for(j=0; j<fNben; j++){
1211 fscanf(fp1,"%f",&fTablen[0][k][j]);
1212 fscanf(fp2,"%f",&fTablen[1][k][j]);
1213 fscanf(fp3,"%f",&fTablen[2][k][j]);
1214 fscanf(fp4,"%f",&fTablen[3][k][j]);
1215 }
1216 }
1217 fclose(fp1);
1218 fclose(fp2);
1219 fclose(fp3);
1220 fclose(fp4);
1221
1222 // --- Reading light tables for ZP and ZEM
5017788b 1223 lightfName5 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552207s");
4663d63d 1224 if((fp5 = fopen(lightfName5,"r")) == NULL){
1225 printf("Cannot open file fp5 \n");
1226 return;
1227 }
5017788b 1228 lightfName6 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552208s");
4663d63d 1229 if((fp6 = fopen(lightfName6,"r")) == NULL){
1230 printf("Cannot open file fp6 \n");
1231 return;
1232 }
5017788b 1233 lightfName7 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552209s");
4663d63d 1234 if((fp7 = fopen(lightfName7,"r")) == NULL){
1235 printf("Cannot open file fp7 \n");
1236 return;
1237 }
5017788b 1238 lightfName8 = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/light22620552210s");
4663d63d 1239 if((fp8 = fopen(lightfName8,"r")) == NULL){
1240 printf("Cannot open file fp8 \n");
1241 return;
1242 }
1243
1244 for(k=0; k<fNalfap; k++){
1245 for(j=0; j<fNbep; j++){
1246 fscanf(fp5,"%f",&fTablep[0][k][j]);
1247 fscanf(fp6,"%f",&fTablep[1][k][j]);
1248 fscanf(fp7,"%f",&fTablep[2][k][j]);
1249 fscanf(fp8,"%f",&fTablep[3][k][j]);
1250 }
1251 }
1252 fclose(fp5);
1253 fclose(fp6);
1254 fclose(fp7);
1255 fclose(fp8);
1256}
4663d63d 1257//_____________________________________________________________________________
1258void AliZDCv2::StepManager()
1259{
1260 //
1261 // Routine called at every step in the Zero Degree Calorimeters
1262 //
bc7e1cd6 1263
4663d63d 1264 Int_t j, vol[2], ibeta=0, ialfa, ibe, nphe;
f05df11a 1265 Float_t x[3], xdet[3], destep, hits[10], m, ekin, um[3], ud[3], be, out;
1266 //Float_t radius;
c6937a87 1267 Float_t xalic[3], z, guiEff, guiPar[4]={0.31,-0.0004,0.0197,0.7958};
6faa7b45 1268 Double_t s[3], p[4];
4663d63d 1269 const char *knamed;
1270
68826ad9 1271 for (j=0;j<10;j++) hits[j]=-999.;
bc7e1cd6 1272
4700b983 1273 // --- This part is for no shower developement in beam pipe and TDI
1274 // If particle interacts with beam pipe or TDI -> return
47708541 1275 if((gMC->CurrentMedium() == fMedSensPI) || (gMC->CurrentMedium() == fMedSensTDI)){
4700b983 1276 // If option NoShower is set -> StopTrack
1277 if(fNoShower==1) {
47708541 1278 if(gMC->CurrentMedium() == fMedSensPI) {
4700b983 1279 knamed = gMC->CurrentVolName();
1e064588 1280 if(!strncmp(knamed,"YMQ",3)) fpLostIT += 1;
68826ad9 1281 if(!strncmp(knamed,"YD1",3)) fpLostD1 += 1;
bc7e1cd6 1282 }
47708541 1283 else if(gMC->CurrentMedium() == fMedSensTDI){ // NB->Cu = TDI or D1 vacuum chamber
bc7e1cd6 1284 knamed = gMC->CurrentVolName();
bc7e1cd6 1285 if(!strncmp(knamed,"MD1",3)) fpLostD1 += 1;
1286 if(!strncmp(knamed,"QTD",3)) fpLostTDI += 1;
4700b983 1287 }
ee0c4fc1 1288 printf("\n # of spectators lost in IT = %d\n",fpLostIT);
1289 printf("\n # of spectators lost in D1 = %d\n",fpLostD1);
1290 printf("\n # of spectators lost in TDI = %d\n\n",fpLostTDI);
4700b983 1291 gMC->StopTrack();
4700b983 1292 }
1293 return;
1294 }
1295
47708541 1296 if((gMC->CurrentMedium() == fMedSensZN) || (gMC->CurrentMedium() == fMedSensZP) ||
1297 (gMC->CurrentMedium() == fMedSensGR) || (gMC->CurrentMedium() == fMedSensF1) ||
1298 (gMC->CurrentMedium() == fMedSensF2) || (gMC->CurrentMedium() == fMedSensZEM)){
8cc32cbc 1299
4663d63d 1300
1301 //Particle coordinates
6faa7b45 1302 gMC->TrackPosition(s[0],s[1],s[2]);
68826ad9 1303 for(j=0; j<=2; j++) x[j] = s[j];
4663d63d 1304 hits[0] = x[0];
1305 hits[1] = x[1];
1306 hits[2] = x[2];
1307
1308 // Determine in which ZDC the particle is
1309 knamed = gMC->CurrentVolName();
68826ad9 1310 if(!strncmp(knamed,"ZN",2)) vol[0]=1;
1311 else if(!strncmp(knamed,"ZP",2)) vol[0]=2;
1312 else if(!strncmp(knamed,"ZE",2)) vol[0]=3;
4663d63d 1313
1314 // Determine in which quadrant the particle is
8cc32cbc 1315 if(vol[0]==1){ //Quadrant in ZN
410749b4 1316 // Calculating particle coordinates inside ZN
4663d63d 1317 xdet[0] = x[0]-fPosZN[0];
1318 xdet[1] = x[1]-fPosZN[1];
410749b4 1319 // Calculating quadrant in ZN
1320 if(xdet[0]<=0.){
1321 if(xdet[1]>=0.) vol[1]=1;
1322 else if(xdet[1]<0.) vol[1]=3;
1323 }
1324 else if(xdet[0]>0.){
1325 if(xdet[1]>=0.) vol[1]=2;
1326 else if(xdet[1]<0.) vol[1]=4;
1327 }
1328 if((vol[1]!=1) && (vol[1]!=2) && (vol[1]!=3) && (vol[1]!=4))
6de91202 1329 printf("\n ZDC StepManager->ERROR in ZN!!! vol[1] = %d, xdet[0] = %f,"
410749b4 1330 "xdet[1] = %f\n",vol[1], xdet[0], xdet[1]);
4663d63d 1331 }
410749b4 1332
8cc32cbc 1333 else if(vol[0]==2){ //Quadrant in ZP
410749b4 1334 // Calculating particle coordinates inside ZP
4663d63d 1335 xdet[0] = x[0]-fPosZP[0];
1336 xdet[1] = x[1]-fPosZP[1];
410749b4 1337 if(xdet[0]>=fDimZP[0]) xdet[0]=fDimZP[0]-0.01;
1338 if(xdet[0]<=-fDimZP[0]) xdet[0]=-fDimZP[0]+0.01;
1339 // Calculating tower in ZP
1340 Float_t xqZP = xdet[0]/(fDimZP[0]/2.);
4663d63d 1341 for(int i=1; i<=4; i++){
1342 if(xqZP>=(i-3) && xqZP<(i-2)){
1343 vol[1] = i;
1344 break;
1345 }
1346 }
410749b4 1347 if((vol[1]!=1) && (vol[1]!=2) && (vol[1]!=3) && (vol[1]!=4))
6de91202 1348 printf(" ZDC StepManager->ERROR in ZP!!! vol[1] = %d, xdet[0] = %f,"
68826ad9 1349 "xdet[1] = %f\n",vol[1], xdet[0], xdet[1]);
4663d63d 1350 }
410749b4 1351
1352 // Quadrant in ZEM: vol[1] = 1 -> particle in 1st ZEM (placed at x = 8.5 cm)
1353 // vol[1] = 2 -> particle in 2nd ZEM (placed at x = -8.5 cm)
1354 else if(vol[0] == 3){
1355 if(x[0]>0.){
1356 vol[1] = 1;
1357 // Particle x-coordinate inside ZEM1
1358 xdet[0] = x[0]-fPosZEM[0];
1359 }
1360 else{
1361 vol[1] = 2;
1362 // Particle x-coordinate inside ZEM2
1363 xdet[0] = x[0]+fPosZEM[0];
1364 }
4663d63d 1365 xdet[1] = x[1]-fPosZEM[1];
1366 }
1367
1368 // Store impact point and kinetic energy of the ENTERING particle
1369
4663d63d 1370 if(gMC->IsTrackEntering()){
1371 //Particle energy
6faa7b45 1372 gMC->TrackMomentum(p[0],p[1],p[2],p[3]);
4663d63d 1373 hits[3] = p[3];
1374 // Impact point on ZDC
1375 hits[4] = xdet[0];
1376 hits[5] = xdet[1];
1377 hits[6] = 0;
1378 hits[7] = 0;
1379 hits[8] = 0;
1380 hits[9] = 0;
1381
5d12ce38 1382 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
4663d63d 1383
1384 if(fNoShower==1){
63abc73a 1385 if(vol[0]==1) fnDetected += 1;
1386 else if(vol[0]==2) fpDetected += 1;
1387 printf("\n # of nucleons in ZN = %d",fnDetected);
1388 printf("\n # of nucleons in ZP = %d\n\n",fpDetected);
4663d63d 1389 gMC->StopTrack();
4663d63d 1390 return;
1391 }
1392 }
4663d63d 1393
1394 // Charged particles -> Energy loss
1395 if((destep=gMC->Edep())){
1396 if(gMC->IsTrackStop()){
6faa7b45 1397 gMC->TrackMomentum(p[0],p[1],p[2],p[3]);
4663d63d 1398 m = gMC->TrackMass();
1399 ekin = p[3]-m;
1400 hits[9] = ekin;
1401 hits[7] = 0.;
1402 hits[8] = 0.;
5d12ce38 1403 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
4663d63d 1404 }
1405 else{
1406 hits[9] = destep;
1407 hits[7] = 0.;
1408 hits[8] = 0.;
5d12ce38 1409 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
4663d63d 1410 }
4663d63d 1411 }
68826ad9 1412 }
4663d63d 1413
1414
1415 // *** Light production in fibres
47708541 1416 if((gMC->CurrentMedium() == fMedSensF1) || (gMC->CurrentMedium() == fMedSensF2)){
4663d63d 1417
1418 //Select charged particles
1419 if((destep=gMC->Edep())){
1420
1421 // Particle velocity
410749b4 1422 Float_t beta = 0.;
6faa7b45 1423 gMC->TrackMomentum(p[0],p[1],p[2],p[3]);
4663d63d 1424 Float_t ptot=TMath::Sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
410749b4 1425 if(p[3] > 0.00001) beta = ptot/p[3];
1426 else return;
f05df11a 1427 if(beta<0.67)return;
1428 else if((beta>=0.67) && (beta<=0.75)) ibeta = 0;
1429 else if((beta>0.75) && (beta<=0.85)) ibeta = 1;
1430 else if((beta>0.85) && (beta<=0.95)) ibeta = 2;
1431 else if(beta>0.95) ibeta = 3;
4663d63d 1432
1433 // Angle between particle trajectory and fibre axis
1434 // 1 -> Momentum directions
1435 um[0] = p[0]/ptot;
1436 um[1] = p[1]/ptot;
1437 um[2] = p[2]/ptot;
1438 gMC->Gmtod(um,ud,2);
1439 // 2 -> Angle < limit angle
1440 Double_t alfar = TMath::ACos(ud[2]);
1441 Double_t alfa = alfar*kRaddeg;
1442 if(alfa>=110.) return;
f05df11a 1443 //
4663d63d 1444 ialfa = Int_t(1.+alfa/2.);
1445
1446 // Distance between particle trajectory and fibre axis
6faa7b45 1447 gMC->TrackPosition(s[0],s[1],s[2]);
4663d63d 1448 for(j=0; j<=2; j++){
1449 x[j] = s[j];
1450 }
1451 gMC->Gmtod(x,xdet,1);
1452 if(TMath::Abs(ud[0])>0.00001){
1453 Float_t dcoeff = ud[1]/ud[0];
1454 be = TMath::Abs((xdet[1]-dcoeff*xdet[0])/TMath::Sqrt(dcoeff*dcoeff+1.));
1455 }
1456 else{
1457 be = TMath::Abs(ud[0]);
1458 }
1459
4663d63d 1460 ibe = Int_t(be*1000.+1);
f05df11a 1461 //if((vol[0]==1)) radius = fFibZN[1];
1462 //else if((vol[0]==2)) radius = fFibZP[1];
4663d63d 1463
1464 //Looking into the light tables
1465 Float_t charge = gMC->TrackCharge();
1466
8cc32cbc 1467 if((vol[0]==1)) { // (1) ZN fibres
4663d63d 1468 if(ibe>fNben) ibe=fNben;
1469 out = charge*charge*fTablen[ibeta][ialfa][ibe];
1470 nphe = gRandom->Poisson(out);
f05df11a 1471 // Ch. debug
1472 //if(ibeta==3) printf("\t %f \t %f \t %f\n",alfa, be, out);
1473 //printf("\t ibeta = %d, ialfa = %d, ibe = %d -> nphe = %d\n\n",ibeta,ialfa,ibe,nphe);
47708541 1474 if(gMC->CurrentMedium() == fMedSensF1){
4663d63d 1475 hits[7] = nphe; //fLightPMQ
1476 hits[8] = 0;
1477 hits[9] = 0;
5d12ce38 1478 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
4663d63d 1479 }
1480 else{
1481 hits[7] = 0;
1482 hits[8] = nphe; //fLightPMC
1483 hits[9] = 0;
5d12ce38 1484 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
4663d63d 1485 }
1486 }
8cc32cbc 1487 else if((vol[0]==2)) { // (2) ZP fibres
4663d63d 1488 if(ibe>fNbep) ibe=fNbep;
1489 out = charge*charge*fTablep[ibeta][ialfa][ibe];
1490 nphe = gRandom->Poisson(out);
47708541 1491 if(gMC->CurrentMedium() == fMedSensF1){
4663d63d 1492 hits[7] = nphe; //fLightPMQ
1493 hits[8] = 0;
1494 hits[9] = 0;
5d12ce38 1495 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
4663d63d 1496 }
1497 else{
1498 hits[7] = 0;
1499 hits[8] = nphe; //fLightPMC
1500 hits[9] = 0;
5d12ce38 1501 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
4663d63d 1502 }
1503 }
8cc32cbc 1504 else if((vol[0]==3)) { // (3) ZEM fibres
4663d63d 1505 if(ibe>fNbep) ibe=fNbep;
1506 out = charge*charge*fTablep[ibeta][ialfa][ibe];
6faa7b45 1507 gMC->TrackPosition(s[0],s[1],s[2]);
8cc32cbc 1508 for(j=0; j<=2; j++){
1509 xalic[j] = s[j];
1510 }
1511 // z-coordinate from ZEM front face
1512 // NB-> fPosZEM[2]+fZEMLength = -1000.+2*10.3 = 979.69 cm
1513 z = -xalic[2]+fPosZEM[2]+2*fZEMLength-xalic[1];
1514// z = xalic[2]-fPosZEM[2]-fZEMLength-xalic[1]*(TMath::Tan(45.*kDegrad));
1515// printf("\n fPosZEM[2]+2*fZEMLength = %f", fPosZEM[2]+2*fZEMLength);
c6937a87 1516 guiEff = guiPar[0]*(guiPar[1]*z*z+guiPar[2]*z+guiPar[3]);
c6937a87 1517 out = out*guiEff;
4663d63d 1518 nphe = gRandom->Poisson(out);
c6937a87 1519// printf(" out*guiEff = %f nphe = %d", out, nphe);
410749b4 1520 if(vol[1] == 1){
1521 hits[7] = 0;
1522 hits[8] = nphe; //fLightPMC (ZEM1)
1523 hits[9] = 0;
5d12ce38 1524 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
410749b4 1525 }
1526 else{
1527 hits[7] = nphe; //fLightPMQ (ZEM2)
1528 hits[8] = 0;
1529 hits[9] = 0;
5d12ce38 1530 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
410749b4 1531 }
4663d63d 1532 }
1533 }
1534 }
1535}