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