]>
Commit | Line | Data |
---|---|---|
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 | 18 | Revision 1.9 1999/11/08 07:12:31 fca |
19 | Minor corrections thanks to I.Hrivnacova | |
20 | ||
f45c4ddb | 21 | Revision 1.8 1999/09/29 09:24:25 fca |
22 | Introduction 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 | ||
54 | ClassImp(AliPHOSv2) | |
55 | ||
56 | /////////////////////////////////////////////////////////////////////////////// | |
57 | ||
58 | AliPHOSv2::~AliPHOSv2(void) | |
59 | { | |
60 | ||
61 | // fNV = 0; | |
62 | // fNH = 0; | |
63 | fIshunt = 0; | |
64 | ||
fe4da5cc | 65 | } |
66 | ||
67 | /////////////////////////////////////////////////////////////////////////////// | |
68 | ||
69 | AliPHOSv2::AliPHOSv2() | |
70 | { | |
71 | ||
72 | // fNV = 0; | |
73 | // fNH = 0; | |
74 | fIshunt = 0; | |
75 | fHits = 0; | |
76 | fDigits = 0; | |
77 | ||
78 | } | |
79 | ||
80 | /////////////////////////////////////////////////////////////////////////////// | |
81 | ||
82 | AliPHOSv2::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 | ||
108 | void 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 | ||
164 | void 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 | ||
183 | void 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 | ||
222 | void 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 | ||
321 | void 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 | ||
614 | void 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 | ||
660 | void 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 | ||
685 | ClassImp(AliPHOShitv2) | |
686 | ||
687 | ////////////////////////////////////////////////////////////////////////////// | |
688 | ||
689 | AliPHOShitv2::AliPHOShitv2(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits): | |
690 | AliHit(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 | ||
705 | Bool_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 | ||
722 | AliPHOShitv2 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 | ////////////////////////////////////////////////////////////////////////////// |