]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PHOS/AliPHOSv2.cxx
Added the entry for the IRST code checking utility
[u/mrichter/AliRoot.git] / PHOS / AliPHOSv2.cxx
CommitLineData
fe4da5cc 1//-*-C++-*-
2//_________________________________________________________________________
3// Manager and hit classes for PHOS
4//*-- Author : Maxim Volkov, RRC KI
5// AliPHOSv2 derives directly from AliDetector, because too much functionality
6// has been put in AliPHOS for my liking.
7//////////////////////////////////////////////////////////////////////////////
8
9// --- ROOT system ---
10#include "TH1.h"
11#include "TRandom.h"
12#include "TFile.h"
13#include "TTree.h"
14#include "TBRIK.h"
15#include "TNode.h"
16
17// --- Standard library ---
18#include <stdio.h>
19#include <string.h>
20#include <stdlib.h>
21
22// --- galice header files ---
23#include "AliPHOSv2.h"
24#include "AliRun.h"
25#include "AliConst.h"
26#include "AliMC.h"
27
28///////////////////////////////////////////////////////////////////////////////
29
30ClassImp(AliPHOSv2)
31
32///////////////////////////////////////////////////////////////////////////////
33
34AliPHOSv2::~AliPHOSv2(void)
35{
36
37 // fNV = 0;
38 // fNH = 0;
39 fIshunt = 0;
40
41 delete fHits;
42
43}
44
45///////////////////////////////////////////////////////////////////////////////
46
47AliPHOSv2::AliPHOSv2()
48{
49
50 // fNV = 0;
51 // fNH = 0;
52 fIshunt = 0;
53 fHits = 0;
54 fDigits = 0;
55
56}
57
58///////////////////////////////////////////////////////////////////////////////
59
60AliPHOSv2::AliPHOSv2(const char *name, const char *title):
61 AliDetector(name,title)
62{
63
64 //Begin_Html
65 /*
1439f98e 66 <img src="picts/aliphos.gif">
fe4da5cc 67 */
68 //End_Html
69
70 fHits = new TClonesArray("AliPHOShitv2", 405);
71
72 // fNV = 4;
73 // fNH = 4;
74 fIshunt = 1; // All hits are associated with primary particles
75
76 DefPars(); // Set geometry parameters
77
78 // SetMarkerColor(kGreen);
79 // SetMarkerStyle(2);
80 // SetMarkerSize(0.4);
81
82}
83
84//////////////////////////////////////////////////////////////////////////////
85
86void AliPHOSv2::DefPars(void)
87{
88
89 // Initialization of GEANT3 geometry parameters
90 fXtlSize[0]=2.2;
91 fXtlSize[1]=18.0;
92 fXtlSize[2]=2.2;
93
94 fWrapThickness=0.01;
95
96 fPINSize[0]=1.0;
97 fPINSize[1]=0.1;
98 fPINSize[2]=1.0;
99
100 fCPVThickness=1.0;
101
102 fPHOSFoam[0]=214.6;
103 fPHOSFoam[1]=80.0;
104 fPHOSFoam[2]=260.0;
105
106 fPHOStxwall[0]=209.0;
107 fPHOStxwall[1]=71.0;
108 fPHOStxwall[2]=250.0;
109
110 fPHOSAir[0]=206.0;
111 fPHOSAir[1]=66.0;
112 fPHOSAir[2]=244.0;
113
114 fRadius[0]=447.0;
115 fRadius[1]=460.0;
116
117 fPHOSextra[0]=0.005; // Titanium cover thickness
118 fPHOSextra[1]=6.95; // Crystal support height
119 fPHOSextra[2]=4.0; // Thermo Insulating outer cover Upper plate thickness
120 fPHOSextra[3]=5.0; // Upper Polystyrene Foam plate thickness
121 fPHOSextra[4]=2.0; // Thermo insulating Crystal Block wall thickness
122 fPHOSextra[5]=0.06; // Upper Cooling Plate thickness
123 fPHOSextra[6]=10.0; // Al Support Plate thickness
124 fPHOSextra[7]=3.0; // Lower Thermo Insulating Plate thickness
125 fPHOSextra[8]=1.0; // Lower Textolit Plate thickness
126 fPHOSextra[9]=0.03; // 1/2 total gap between adjacent crystals
127
128 fNphi=88;
129 fNz=104;
130
131 fNModules=4;
132
133 fPHOSAngle[0]=0.0; // Module position angles are set in CreateGeometry()
134 fPHOSAngle[1]=0.0;
135 fPHOSAngle[2]=0.0;
136 fPHOSAngle[3]=0.0;
137
138}
139
140//////////////////////////////////////////////////////////////////////////////
141
142void AliPHOSv2::Init(void)
143{
144
145 Int_t i;
146
147 printf("\n");
148 for(i=0;i<35;i++) printf("*");
149 printf(" PHOS_INIT ");
150 for(i=0;i<35;i++) printf("*");
151 printf("\n");
152
153 // Here the PHOS initialisation code (if any!)
154 for(i=0;i<80;i++) printf("*");
155 printf("\n");
156
157}
158
159//////////////////////////////////////////////////////////////////////////////
160
161void AliPHOSv2::BuildGeometry()
162{
163
164 // Stolen completely from A. Zvyagine
165
166 TNode *Node, *Top;
167
168 const int kColorPHOS = kRed;
169
170 Top=gAlice->GetGeometry()->GetNode("alice");
171
172 // PHOS
173 Float_t pphi=12.9399462;
174 new TRotMatrix("rot988","rot988",90,-3*pphi,90,90-3*pphi,0,0);
175 new TRotMatrix("rot989","rot989",90,- pphi,90,90- pphi,0,0);
176 new TRotMatrix("rot990","rot990",90, pphi,90,90+ pphi,0,0);
177 new TRotMatrix("rot991","rot991",90, 3*pphi,90,90+3*pphi,0,0);
178 new TBRIK("S_PHOS","PHOS box","void",107.3,40,130);
179 Top->cd();
180 Node=new TNode("PHOS1","PHOS1","S_PHOS",-317.824921,-395.014343,0,"rot988");
181 Node->SetLineColor(kColorPHOS);
182 fNodes->Add(Node);
183 Top->cd();
184 Node=new TNode("PHOS2","PHOS2","S_PHOS",-113.532333,-494.124908,0,"rot989");
185 fNodes->Add(Node);
186 Node->SetLineColor(kColorPHOS);
187 Top->cd();
188 Node=new TNode("PHOS3","PHOS3","S_PHOS", 113.532333,-494.124908,0,"rot990");
189 Node->SetLineColor(kColorPHOS);
190 fNodes->Add(Node);
191 Top->cd();
192 Node=new TNode("PHOS4","PHOS4","S_PHOS", 317.824921,-395.014343,0,"rot991");
193 Node->SetLineColor(kColorPHOS);
194 fNodes->Add(Node);
195
196}
197
198//////////////////////////////////////////////////////////////////////////////
199
200void AliPHOSv2::CreateMaterials()
201{
202
203 // DEFINITION OF AVAILABLE PHOS MATERIALS
204
fe4da5cc 205 Int_t ISXFLD=gAlice->Field()->Integ();
206 Float_t SXMGMX=gAlice->Field()->Max();
207
208 // --- The PbWO4 crystals ---
209 Float_t AX[3]={207.19, 183.85, 16.0};
210 Float_t ZX[3]={82.0, 74.0, 8.0};
211 Float_t WX[3]={1.0, 1.0, 4.0};
212 Float_t DX=8.28;
213
214 // --- Titanium ---
215 Float_t ATIT[3]={47.88, 26.98, 54.94};
216 Float_t ZTIT[3]={22.0, 13.0, 25.0};
217 Float_t WTIT[3]={69.0, 6.0, 1.0};
218 Float_t DTIT=4.5;
219
220 // --- The polysterene scintillator (CH) ---
221 Float_t AP[2]={12.011, 1.00794};
222 Float_t ZP[2]={6.0, 1.0};
223 Float_t WP[2]={1.0, 1.0};
224 Float_t DP=1.032;
225
226 // --- Tyvek (CnH2n) ---
227 Float_t AT[2]={12.011, 1.00794};
228 Float_t ZT[2]={6.0, 1.0};
229 Float_t WT[2]={1.0, 2.0};
230 Float_t DT=0.331;
231
232 // --- Polystyrene foam ---
233 Float_t AF[2]={12.011, 1.00794};
234 Float_t ZF[2]={6.0, 1.0};
235 Float_t WF[2]={1.0, 1.0};
236 Float_t DF=0.12;
237
238 // --- Foam thermo insulation ---
239 Float_t ATI[2]={12.011, 1.00794};
240 Float_t ZTI[2]={6.0, 1.0};
241 Float_t WTI[2]={1.0, 1.0};
242 Float_t DTI=0.1;
243
244 // --- Textolit ---
245 Float_t ATX[4]={16.0, 28.09, 12.011, 1.00794};
246 Float_t ZTX[4]={8.0, 14.0, 6.0, 1.0};
247 Float_t WTX[4]={292.0, 68.0, 462.0, 736.0};
248 Float_t DTX=1.75;
249
ad51aeb0 250 Int_t *idtmed = fIdtmed->GetArray()-699;
fe4da5cc 251
252 AliMixture(0, "PbWO4$", AX, ZX, DX, -3, WX);
253 AliMixture(1, "Polystyrene$", AP, ZP, DP, -2, WP);
254 AliMaterial(2, "Al$", 26.98, 13., 2.7, 8.9, 999., 0, 0);
255 // --- Absorption length^ is ignored ---
256 AliMixture(3, "Tyvek$", AT, ZT, DT, -2, WT);
257 AliMixture(4, "Foam$", AF, ZF, DF, -2, WF);
258 AliMixture(5, "Titanium$", ATIT, ZTIT, DTIT, -3, WTIT);
259 AliMaterial(6, "Si$", 28.09, 14., 2.33, 9.36, 42.3, 0, 0);
260 AliMixture(7, "Thermo Insul.$", ATI, ZTI, DTI, -2, WTI);
261 AliMixture(8, "Textolit$", ATX, ZTX, DTX, -4, WTX);
262 AliMaterial(99, "Air$", 14.61, 7.3, 0.001205, 30420., 67500., 0, 0);
263
ad51aeb0 264 AliMedium(0, "PHOS Xtal $", 0, 1,
fe4da5cc 265 ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
ad51aeb0 266 AliMedium(1, "CPV scint. $", 1, 1,
fe4da5cc 267 ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
ad51aeb0 268 AliMedium(2, "Al parts $", 2, 0,
fe4da5cc 269 ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0);
ad51aeb0 270 AliMedium(3, "Tyvek wrapper$", 3, 0,
fe4da5cc 271 ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0);
ad51aeb0 272 AliMedium(4, "Polyst. foam $", 4, 0,
fe4da5cc 273 ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
ad51aeb0 274 AliMedium(5, "Titan. cover $", 5, 0,
fe4da5cc 275 ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.0001, 0.0001, 0, 0);
ad51aeb0 276 AliMedium(6, "Si PIN $", 6, 0,
fe4da5cc 277 ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.01, 0.01, 0, 0);
ad51aeb0 278 AliMedium(7, "Thermo Insul.$", 7, 0,
fe4da5cc 279 ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
ad51aeb0 280 AliMedium(8, "Textolit $", 8, 0,
fe4da5cc 281 ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
ad51aeb0 282 AliMedium(99, "Air $", 99, 0,
fe4da5cc 283 ISXFLD, SXMGMX, 10.0, 1.0, 0.1, 0.1, 10.0, 0, 0);
284
285 // --- Set decent energy thresholds for gamma and electron tracking
cfce8870 286 gMC->Gstpar(idtmed[699],"CUTGAM",0.5E-4);
287 gMC->Gstpar(idtmed[699],"CUTELE",1.0E-4);
fe4da5cc 288 // --- Generate explicitly delta rays in the titan cover ---
cfce8870 289 gMC->Gstpar(idtmed[704],"LOSS",3.);
290 gMC->Gstpar(idtmed[704],"DRAY",1.);
fe4da5cc 291 // --- and in aluminium parts ---
cfce8870 292 gMC->Gstpar(idtmed[701],"LOSS",3.);
293 gMC->Gstpar(idtmed[701],"DRAY",1.);
fe4da5cc 294
295}
296
297//////////////////////////////////////////////////////////////////////////////
298
299void AliPHOSv2::CreateGeometry()
300{
301
6435828c 302 AliPHOSv2 *PHOS_tmp = (AliPHOSv2*)gAlice->GetModule("PHOS");
fe4da5cc 303 if(PHOS_tmp==NULL){
304
305 fprintf(stderr,"PHOS detector not found!\n");
306 return;
307
308 }
309
310 // --- Dimensions of volumes ---
311 Float_t DPHOS[3], DPTXW[3], DPAIR[3];
312 Float_t DPUFP[3], DPUCP[3], DPASP[3], DPTIP[3], DPTXP[3];
313 Float_t DPTCB[3], DPCBL[3], DPSTC[3], DPPAP[3], DPXTL[3], DPSUP[3],
314 DPPIN[3];
315 Float_t DPCPV[3], DPCPA[3];
316
317 Float_t R, YO, XP1, YP1, PPHI, angle;
318 Int_t IDROTM[99];
319 Int_t i;
320
321 Double_t const RADDEG=180.0/kPI;
322 // Double_t const DEGRAD=kPI/180.0;
323
324 // --- Dimensions of PbWO4 crystal ---
325 // PARAMETER(XTL_X=2.2,XTL_Y=18.,XTL_Z=2.2)
326 Float_t XTL_X=GetCrystalSize(0);
327 Float_t XTL_Y=GetCrystalSize(1);
328 Float_t XTL_Z=GetCrystalSize(2);
329
330 // --- Tyvek wrapper thickness
331 // PARAMETER(PAP_THICK=0.01)
332 Float_t PAP_THICK=GetWrapThickness();
333
334 // --- Steel (titanium) cover thickness ---
335 // PARAMETER(STE_THICK=0.005)
336 Float_t STE_THICK=GetPHOSextra(0);
337
338 // --- Crystal support height ---
339 // PARAMETER(SUP_Y=6.95)
340 Float_t SUP_Y=GetPHOSextra(1);
341
342 // --- PIN-diode dimensions ---
343 // PARAMETER(PIN_X=1.4,PIN_Y=0.4,PIN_Z=1.4)
344 Float_t PIN_X=GetPINSize(0);
345 Float_t PIN_Y=GetPINSize(1);
346 Float_t PIN_Z=GetPINSize(2);
347
348 // --- CPV thickness ---
349 // PARAMETER(CPV_Y=0.5)
350 Float_t CPV_Y=GetCPVThickness();
351
352 // --- Foam Thermo Insulating outer cover dimensions ---
353 // PARAMETER(FTI_X=214.6,FTI_Y=80.,FTI_Z=260.)
354 Float_t FTI_X=GetPHOSFoam(0);
355 Float_t FTI_Y=GetPHOSFoam(1);
356 Float_t FTI_Z=GetPHOSFoam(2);
357
358 // --- Thermo Insulating outer cover Upper plate thickness ---
359 // PARAMETER(FTIU_THICK=4.)
360 Float_t FTIU_THICK=GetPHOSextra(2);
361
362 // --- Textolit Wall box dimentions ---
363 // PARAMETER(TXW_X=209.,TXW_Y=71.,TXW_Z=250.)
364 Float_t TXW_X=GetPHOStxwall(0);
365 Float_t TXW_Y=GetPHOStxwall(1);
366 Float_t TXW_Z=GetPHOStxwall(2);
367
368 // --- Inner AIR volume dimensions ---
369 // PARAMETER(AIR_X=206.,AIR_Y=66.,AIR_Z=244.)
370 Float_t AIR_X=GetPHOSAir(0);
371 Float_t AIR_Y=GetPHOSAir(1);
372 Float_t AIR_Z=GetPHOSAir(2);
373
374 // --- Upper Polystyrene Foam plate thickness ---
375 // PARAMETER(UFP_Y=5.)
376 Float_t UFP_Y=GetPHOSextra(3);
377
378 // --- Thermo insulating Crystal Block wall thickness ---
379 // PARAMETER(TCB_THICK=2.)
380 Float_t TCB_THICK=GetPHOSextra(4);
381
382 // --- Upper Cooling Plate thickness ---
383 // PARAMETER(UCP_Y=0.06)
384 Float_t UCP_Y=GetPHOSextra(5);
385
386 // --- Al Support Plate thickness ---
387 // PARAMETER(ASP_Y=10.)
388 Float_t ASP_Y=GetPHOSextra(6);
389
390 // --- Lower Thermo Insulating Plate thickness ---
391 // PARAMETER(TIP_Y=3.)
392 Float_t TIP_Y=GetPHOSextra(7);
393
394 // --- Lower Textolit Plate thickness ---
395 // PARAMETER(TXP_Y=1.)
396 Float_t TXP_Y=GetPHOSextra(8);
397
398 // --- 1/2 total gap between adjacent crystals
399 Float_t TOTAL_GAP=GetPHOSextra(9);
400
401 // --- Distance from IP to Foam Thermo Insulating top plate ---
402 // PARAMETER(FTI_R=467.)
403 Float_t FTI_R=GetRadius(0);
404
405 // --- Distance from IP to Crystal Block top Surface (needs to be 460.) ---
406 // PARAMETER(CBS_R=480.)
407 Float_t CBS_R=GetRadius(1);
408
409 // Get pointer to the array containing media indeces
ad51aeb0 410 Int_t *IDTMED = fIdtmed->GetArray()-699;
fe4da5cc 411
412 // --- Define PHOS box volume, fill with thermo insulating foam ---
413 DPHOS[0]=FTI_X/2.0;
414 DPHOS[1]=FTI_Y/2.0;
415 DPHOS[2]=FTI_Z/2.0;
cfce8870 416 gMC->Gsvolu("PHOS", "BOX ", IDTMED[706], DPHOS, 3);
fe4da5cc 417
418 // --- Define Textolit Wall box, position inside PHOS ---
419 DPTXW[0]=TXW_X/2.0;
420 DPTXW[1]=TXW_Y/2.0;
421 DPTXW[2]=TXW_Z/2.0;
cfce8870 422 gMC->Gsvolu("PTXW", "BOX ", IDTMED[707], DPTXW, 3);
fe4da5cc 423 YO=(FTI_Y-TXW_Y)/2.0-FTIU_THICK;
cfce8870 424 gMC->Gspos("PTXW", 1, "PHOS", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 425
426 // --- Define Upper Polystyrene Foam Plate, place inside PTXW ---
427 // --- immediately below Foam Thermo Insulation Upper plate ---
428 DPUFP[0]=TXW_X/2.0;
429 DPUFP[1]=UFP_Y/2.0;
430 DPUFP[2]=TXW_Z/2.0;
cfce8870 431 gMC->Gsvolu("PUFP", "BOX ", IDTMED[703], DPUFP, 3);
fe4da5cc 432 YO=(TXW_Y-UFP_Y)/2.0;
cfce8870 433 gMC->Gspos("PUFP", 1, "PTXW", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 434
435 // --- Define air-filled box, place inside PTXW ---
436 DPAIR[0]=AIR_X/2.0;
437 DPAIR[1]=AIR_Y/2.0;
438 DPAIR[2]=AIR_Z/2.0;
cfce8870 439 gMC->Gsvolu("PAIR", "BOX ", IDTMED[798], DPAIR, 3);
fe4da5cc 440 YO=(TXW_Y-AIR_Y)/2.0-UFP_Y;
cfce8870 441 gMC->Gspos("PAIR", 1, "PTXW", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 442
443 // --- Define Thermo insulating Crystal Box, position inside PAIR ---
444 DPTCB[0]=GetNphi()*(XTL_X+2*TOTAL_GAP)/2.0+TCB_THICK;
445 DPTCB[1]=(XTL_Y+SUP_Y+PAP_THICK+STE_THICK)/2.0+TCB_THICK/2.0;
446 DPTCB[2]=GetNz()*(XTL_Z+2*TOTAL_GAP)/2.0+TCB_THICK;
cfce8870 447 gMC->Gsvolu("PTCB", "BOX ", IDTMED[706], DPTCB, 3);
fe4da5cc 448 YO=AIR_Y/2.0-DPTCB[1]-
449 (CBS_R-FTI_R-TCB_THICK-FTIU_THICK-UFP_Y);
cfce8870 450 gMC->Gspos("PTCB", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 451
452 // --- Define Crystal BLock filled with air, position it inside PTCB ---
453 DPCBL[0]=GetNphi()*(XTL_X+2*TOTAL_GAP)/2.0;
454 DPCBL[1]=(XTL_Y+SUP_Y+PAP_THICK+STE_THICK)/2.0;
455 DPCBL[2]=GetNz()*(XTL_Z+2*TOTAL_GAP)/2.0;
cfce8870 456 gMC->Gsvolu("PCBL", "BOX ", IDTMED[798], DPCBL, 3);
fe4da5cc 457
458 // --- Divide PCBL in X (phi) and Z directions --
cfce8870 459 gMC->Gsdvn("PROW", "PCBL", Int_t (GetNphi()), 1);
460 gMC->Gsdvn("PCEL", "PROW", Int_t (GetNz()), 3);
fe4da5cc 461 YO=-TCB_THICK/2.0;
cfce8870 462 gMC->Gspos("PCBL", 1, "PTCB", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 463
464 // --- Define STeel (actually, it's titanium) Cover volume, place inside PCEL
465 DPSTC[0]=(XTL_X+2*PAP_THICK)/2.0;
466 DPSTC[1]=(XTL_Y+SUP_Y+PAP_THICK+STE_THICK)/2.0;
467 DPSTC[2]=(XTL_Z+2*PAP_THICK+2*STE_THICK)/2.0;
cfce8870 468 gMC->Gsvolu("PSTC", "BOX ", IDTMED[704], DPSTC, 3);
469 gMC->Gspos("PSTC", 1, "PCEL", 0.0, 0.0, 0.0, 0, "ONLY");
fe4da5cc 470
471 // --- Define Tyvek volume, place inside PSTC ---
472 DPPAP[0]=XTL_X/2.0+PAP_THICK;
473 DPPAP[1]=(XTL_Y+SUP_Y+PAP_THICK)/2.0;
474 DPPAP[2]=XTL_Z/2.0+PAP_THICK;
cfce8870 475 gMC->Gsvolu("PPAP", "BOX ", IDTMED[702], DPPAP, 3);
fe4da5cc 476 YO=(XTL_Y+SUP_Y+PAP_THICK)/2.0-(XTL_Y+SUP_Y+PAP_THICK+STE_THICK)/2.0;
cfce8870 477 gMC->Gspos("PPAP", 1, "PSTC", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 478
479 // --- Define PbWO4 crystal volume, place inside PPAP ---
480 DPXTL[0]=XTL_X/2.0;
481 DPXTL[1]=XTL_Y/2.0;
482 DPXTL[2]=XTL_Z/2.0;
cfce8870 483 gMC->Gsvolu("PXTL", "BOX ", IDTMED[699], DPXTL, 3);
fe4da5cc 484 YO=(XTL_Y+SUP_Y+PAP_THICK)/2.0-XTL_Y/2.0-PAP_THICK;
cfce8870 485 gMC->Gspos("PXTL", 1, "PPAP", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 486
487 // --- Define crystal support volume, place inside PPAP ---
488 DPSUP[0]=XTL_X/2.0+PAP_THICK;
489 DPSUP[1]=SUP_Y/2.0;
490 DPSUP[2]=XTL_Z/2.0+PAP_THICK;
cfce8870 491 gMC->Gsvolu("PSUP", "BOX ", IDTMED[798], DPSUP, 3);
fe4da5cc 492 YO=SUP_Y/2.0-(XTL_Y+SUP_Y+PAP_THICK)/2.0;
cfce8870 493 gMC->Gspos("PSUP", 1, "PPAP", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 494
495 // --- Define PIN-diode volume and position it inside crystal support ---
496 // --- right behind PbWO4 crystal
497 DPPIN[0]=PIN_X/2.0;
498 DPPIN[1]=PIN_Y/2.0;
499 DPPIN[2]=PIN_Z/2.0;
cfce8870 500 gMC->Gsvolu("PPIN", "BOX ", IDTMED[705], DPPIN, 3);
fe4da5cc 501 YO=SUP_Y/2.0-PIN_Y/2.0;
cfce8870 502 gMC->Gspos("PPIN", 1, "PSUP", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 503
504 // --- Define Upper Cooling Panel, place it on top of PTCB ---
505 DPUCP[0]=DPTCB[0];
506 DPUCP[1]=UCP_Y/2.0;
507 DPUCP[2]=DPTCB[2];
cfce8870 508 gMC->Gsvolu("PUCP", "BOX ", IDTMED[701], DPUCP,3);
fe4da5cc 509 YO=(AIR_Y-UCP_Y)/2.0-(CBS_R-FTI_R-TCB_THICK-FTIU_THICK-UFP_Y-UCP_Y);
cfce8870 510 gMC->Gspos("PUCP", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 511
512 // --- Define Al Support Plate, position it inside PAIR ---
513 // --- right beneath PTCB ---
514 DPASP[0]=AIR_X/2.0;
515 DPASP[1]=ASP_Y/2.0;
516 DPASP[2]=AIR_Z/2.0;
cfce8870 517 gMC->Gsvolu("PASP", "BOX ", IDTMED[701], DPASP, 3);
fe4da5cc 518 YO=(AIR_Y-ASP_Y)/2.0-(CBS_R-FTI_R-FTIU_THICK-UFP_Y+DPCBL[1]*2);
cfce8870 519 gMC->Gspos("PASP", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 520
521 // --- Define Thermo Insulating Plate, position it inside PAIR ---
522 // --- right beneath PASP ---
523 DPTIP[0]=AIR_X/2.0;
524 DPTIP[1]=TIP_Y/2.0;
525 DPTIP[2]=AIR_Z/2.0;
cfce8870 526 gMC->Gsvolu("PTIP", "BOX ", IDTMED[706], DPTIP, 3);
fe4da5cc 527 YO=(AIR_Y-TIP_Y)/2.0-(CBS_R-FTI_R-FTIU_THICK-UFP_Y+DPCBL[1]*2+ASP_Y);
cfce8870 528 gMC->Gspos("PTIP", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 529
530 // --- Define Textolit Plate, position it inside PAIR ---
531 // --- right beneath PTIP ---
532 DPTXP[0]=AIR_X/2.0;
533 DPTXP[1]=TXP_Y/2.0;
534 DPTXP[2]=AIR_Z/2.0;
cfce8870 535 gMC->Gsvolu("PTXP", "BOX ", IDTMED[707], DPTXP, 3);
fe4da5cc 536 YO=(AIR_Y-TXP_Y)/2.0-
537 (CBS_R-FTI_R-FTIU_THICK-UFP_Y+DPCBL[1]*2+ASP_Y+TIP_Y);
cfce8870 538 gMC->Gspos("PTXP", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
fe4da5cc 539
540 // --- Define CPV volume, DON'T PLACE IT YET ---
541 // --- Divide in X and Z direction (same way as PCBL) ---
542 DPCPV[0]=DPCBL[0];
543 DPCPV[1]=CPV_Y/2.0;
544 DPCPV[2]=DPCBL[2];
cfce8870 545 // gMC->Gsvolu("PCPV", "BOX ", IDTMED[700], DPCPV, 3);
546 gMC->Gsvolu("PCPV", "BOX ", IDTMED[798], DPCPV, 3);
547 gMC->Gsdvn("PCRO", "PCPV", Int_t (GetNphi()), 1);
548 gMC->Gsdvn("PCCE", "PCRO", Int_t (GetNz()), 3);
fe4da5cc 549
550 // Define CPV sensitive pad. It has the same size as PCCE.
551 DPCPA[0]=DPCBL[0]/GetNphi();
552 DPCPA[1]=CPV_Y/2.0;
553 DPCPA[2]=DPCBL[2]/GetNz();
cfce8870 554 gMC->Gsvolu("PCPA", "BOX ", IDTMED[700], DPCPA, 3);
555 gMC->Gspos("PCPA", 1, "PCCE", 0.0, 0.0, 0.0, 0, "ONLY");
fe4da5cc 556
557 // --- Position various PHOS units in ALICE setup ---
558 // --- PHOS itself first ---
559 PPHI=TMath::ATan(FTI_X/(2.0*FTI_R));
560 PPHI*=RADDEG;
561
562 for(i=1; i<=GetNModules(); i++){
563
564 angle=PPHI*2*(i-GetNModules()/2.0-0.5);
565 AliMatrix(IDROTM[i-1], 90.0, angle, 90.0, 90.0+angle, 0.0, 0.0);
566
567 // --- Position various PHOS units in ALICE setup ---
568 // --- PHOS itself first ---
569 R=FTI_R+FTI_Y/2.0;
570 XP1=R*TMath::Sin(angle/RADDEG);
571 YP1=-R*TMath::Cos(angle/RADDEG);
cfce8870 572 gMC->Gspos("PHOS", i, "ALIC", XP1, YP1, 0.0, IDROTM[i-1], "ONLY");
fe4da5cc 573
574 // --- Now position PCPV so that its plates are right on top of ---
575 // --- corresponding PHOS modules (previously called cradles) ---
576 R=FTI_R-CPV_Y/2.0;
577 XP1=R*TMath::Sin(angle/RADDEG);
578 YP1=-R*TMath::Cos(angle/RADDEG);
cfce8870 579 gMC->Gspos("PCPV", i, "ALIC", XP1, YP1, 0.0, IDROTM[i-1], "ONLY");
fe4da5cc 580 GetModuleAngle(i-1)=angle-90.0;
581
582 }
583
584 // --- Set volumes seen without their descendants for drawing ---
cfce8870 585 gMC->Gsatt("PCEL", "SEEN", -2);
586 gMC->Gsatt("PCCE", "SEEN", -2);
fe4da5cc 587
588}
589
590//////////////////////////////////////////////////////////////////////////////
591
592void AliPHOSv2::StepManager(void)
593{
594
fe4da5cc 595 Int_t blrc[4]; // (box, layer, row, column) indices
596 Float_t xyze[4]; // position wrt MRS and energy deposited
31ccd13b 597 TLorentzVector pos;
fe4da5cc 598
ad51aeb0 599 Int_t *IDTMED=fIdtmed->GetArray()-699;
fe4da5cc 600
cfce8870 601 if(gMC->GetMedium()==IDTMED[700]){ // We are inside a CPV sensitive pad
fe4da5cc 602
31ccd13b 603 gMC->TrackPosition(pos);
604 xyze[0]=pos[0];
605 xyze[1]=pos[1];
606 xyze[2]=pos[2];
cfce8870 607 xyze[3]=gMC->Edep();
fe4da5cc 608
0a6d8768 609 gMC->CurrentVolOffID(3, blrc[0]);
fe4da5cc 610 blrc[1]=1; // CPV corresponds to layer 1
0a6d8768 611 gMC->CurrentVolOffID(2, blrc[2]);
612 gMC->CurrentVolOffID(1, blrc[3]);
fe4da5cc 613
614 AddHit(gAlice->CurrentTrack(), blrc, xyze);
615
616 }
617
cfce8870 618 if(gMC->GetMedium()==IDTMED[699]){ // We are inside a PWO crystal
fe4da5cc 619
31ccd13b 620 gMC->TrackPosition(pos);
621 xyze[0]=pos[0];
622 xyze[1]=pos[1];
623 xyze[2]=pos[2];
cfce8870 624 xyze[3]=gMC->Edep();
fe4da5cc 625
0a6d8768 626 gMC->CurrentVolOffID(9, blrc[0]);
fe4da5cc 627 blrc[1]=2; // PWO crystals correspond to layer 2
0a6d8768 628 gMC->CurrentVolOffID(4, blrc[2]);
629 gMC->CurrentVolOffID(3, blrc[3]);
fe4da5cc 630
631 AddHit(gAlice->CurrentTrack(), blrc, xyze);
632
633 }
634}
635
636////////////////////////////////////////////////////////////////////////////
637
638void AliPHOSv2::AddHit(Int_t track, Int_t *vol, Float_t *hits)
639{
640
641 Int_t hitCounter;
642 TClonesArray &lhits = *fHits;
643 AliPHOShitv2 *newHit,*curHit;
644
645 newHit=new AliPHOShitv2(fIshunt, track, vol, hits);
646
647 for(hitCounter=0;hitCounter<fNhits;hitCounter++){
648 curHit=(AliPHOShitv2*)lhits[hitCounter];
649 if(*curHit==*newHit){
650 *curHit=*curHit+*newHit;
651 delete newHit;
652 return;
653 }
654 }
655
656 new(lhits[fNhits++]) AliPHOShitv2(*newHit);
657 delete newHit;
658
659}
660
661///////////////////////////////////////////////////////////////////////////////
662
663ClassImp(AliPHOShitv2)
664
665//////////////////////////////////////////////////////////////////////////////
666
667AliPHOShitv2::AliPHOShitv2(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits):
668AliHit(shunt, track)
669{
670
671 Int_t i;
672 for (i=0;i<4;i++)fVolume[i]=vol[i];
673
674 fX = hits[0];
675 fY = hits[1];
676 fZ = hits[2];
677 fELOS = hits[3];
678
679}
680
681//////////////////////////////////////////////////////////////////////////////
682
683Bool_t AliPHOShitv2::operator==(AliPHOShitv2 const &rValue) const
684{
685
686 Int_t volCounter;
687
688 // if(fDet!=rValue.GetDet()) return kFALSE;
689 if(fTrack!=rValue.GetTrack()) return kFALSE;
690
691 for(volCounter=0;volCounter<4;volCounter++)
692 if(fVolume[volCounter]!=rValue.GetVolume(volCounter))return kFALSE;
693
694 return kTRUE;
695
696}
697
698/////////////////////////////////////////////////////////////////////////////
699
700AliPHOShitv2 const AliPHOShitv2::operator+(AliPHOShitv2 const &rValue) const
701{
702
703 AliPHOShitv2 added(*this);
704
705 added.fELOS+=rValue.GetEnergy();
706 return added;
707
708}
709
710//////////////////////////////////////////////////////////////////////////////