ecd1a606eaa338d57176aca84f731c7c93026268
[u/mrichter/AliRoot.git] / PHOS / AliPHOSv2.cxx
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$
18 Revision 1.9  1999/11/08 07:12:31  fca
19 Minor corrections thanks to I.Hrivnacova
20
21 Revision 1.8  1999/09/29 09:24:25  fca
22 Introduction of the Copyright and cvs Log
23
24 */
25
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"
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   
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):
83   AliPHOS(name,title)
84 {
85   
86   //Begin_Html
87   /*
88     <img src="picts/aliphos.gif">
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   
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
272   Int_t *idtmed = fIdtmed->GetArray()-699;
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   
286   AliMedium(0, "PHOS Xtal    $", 0, 1,
287             ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
288   AliMedium(1, "CPV scint.   $", 1, 1,
289             ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
290   AliMedium(2, "Al parts     $", 2, 0,
291             ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0);
292   AliMedium(3, "Tyvek wrapper$", 3, 0,
293             ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0);
294   AliMedium(4, "Polyst. foam $", 4, 0,
295             ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
296   AliMedium(5, "Titan. cover $", 5, 0,
297             ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.0001, 0.0001, 0, 0);
298   AliMedium(6, "Si PIN       $", 6, 0,
299             ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.01, 0.01, 0, 0);
300   AliMedium(7, "Thermo Insul.$", 7, 0,
301             ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
302   AliMedium(8, "Textolit     $", 8, 0,
303             ISXFLD, SXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0);
304   AliMedium(99, "Air          $", 99, 0,
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
308   gMC->Gstpar(idtmed[699],"CUTGAM",0.5E-4);
309   gMC->Gstpar(idtmed[699],"CUTELE",1.0E-4);
310   // --- Generate explicitly delta rays in the titan cover ---
311   gMC->Gstpar(idtmed[704],"LOSS",3.);
312   gMC->Gstpar(idtmed[704],"DRAY",1.);
313   // --- and in aluminium parts ---
314   gMC->Gstpar(idtmed[701],"LOSS",3.);
315   gMC->Gstpar(idtmed[701],"DRAY",1.);
316
317 }
318
319 //////////////////////////////////////////////////////////////////////////////
320
321 void AliPHOSv2::CreateGeometry()
322 {
323
324   AliPHOSv2 *PHOS_tmp = (AliPHOSv2*)gAlice->GetModule("PHOS");
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
432   Int_t *IDTMED = fIdtmed->GetArray()-699;
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;
438   gMC->Gsvolu("PHOS", "BOX ", IDTMED[706], DPHOS, 3);
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;
444   gMC->Gsvolu("PTXW", "BOX ", IDTMED[707], DPTXW, 3);
445   YO=(FTI_Y-TXW_Y)/2.0-FTIU_THICK;
446   gMC->Gspos("PTXW", 1, "PHOS", 0.0, YO, 0.0, 0, "ONLY");
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;
453   gMC->Gsvolu("PUFP", "BOX ", IDTMED[703], DPUFP, 3);
454   YO=(TXW_Y-UFP_Y)/2.0;
455   gMC->Gspos("PUFP", 1, "PTXW", 0.0, YO, 0.0, 0, "ONLY");
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;
461   gMC->Gsvolu("PAIR", "BOX ", IDTMED[798], DPAIR, 3);
462   YO=(TXW_Y-AIR_Y)/2.0-UFP_Y;
463   gMC->Gspos("PAIR", 1, "PTXW", 0.0, YO, 0.0, 0, "ONLY");
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;
469   gMC->Gsvolu("PTCB", "BOX ", IDTMED[706], DPTCB, 3);
470   YO=AIR_Y/2.0-DPTCB[1]-
471     (CBS_R-FTI_R-TCB_THICK-FTIU_THICK-UFP_Y);
472   gMC->Gspos("PTCB", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
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;
478   gMC->Gsvolu("PCBL", "BOX ", IDTMED[798], DPCBL, 3);
479   
480   // --- Divide PCBL in X (phi) and Z directions --
481   gMC->Gsdvn("PROW", "PCBL", GetNphi(), 1);
482   gMC->Gsdvn("PCEL", "PROW", GetNz(), 3);
483   YO=-TCB_THICK/2.0;
484   gMC->Gspos("PCBL", 1, "PTCB", 0.0, YO, 0.0, 0, "ONLY");
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;
490   gMC->Gsvolu("PSTC", "BOX ", IDTMED[704], DPSTC, 3);
491   gMC->Gspos("PSTC", 1, "PCEL", 0.0, 0.0, 0.0, 0, "ONLY");
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;
497   gMC->Gsvolu("PPAP", "BOX ", IDTMED[702], DPPAP, 3);
498   YO=(XTL_Y+SUP_Y+PAP_THICK)/2.0-(XTL_Y+SUP_Y+PAP_THICK+STE_THICK)/2.0;
499   gMC->Gspos("PPAP", 1, "PSTC", 0.0, YO, 0.0, 0, "ONLY");
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;
505   gMC->Gsvolu("PXTL", "BOX ", IDTMED[699], DPXTL, 3);
506   YO=(XTL_Y+SUP_Y+PAP_THICK)/2.0-XTL_Y/2.0-PAP_THICK;
507   gMC->Gspos("PXTL", 1, "PPAP", 0.0, YO, 0.0, 0, "ONLY");
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;
513   gMC->Gsvolu("PSUP", "BOX ", IDTMED[798], DPSUP, 3);
514   YO=SUP_Y/2.0-(XTL_Y+SUP_Y+PAP_THICK)/2.0;
515   gMC->Gspos("PSUP", 1, "PPAP", 0.0, YO, 0.0, 0, "ONLY");
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;
522   gMC->Gsvolu("PPIN", "BOX ", IDTMED[705], DPPIN, 3);
523   YO=SUP_Y/2.0-PIN_Y/2.0;
524   gMC->Gspos("PPIN", 1, "PSUP", 0.0, YO, 0.0, 0, "ONLY");
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];
530   gMC->Gsvolu("PUCP", "BOX ", IDTMED[701], DPUCP,3);
531   YO=(AIR_Y-UCP_Y)/2.0-(CBS_R-FTI_R-TCB_THICK-FTIU_THICK-UFP_Y-UCP_Y);
532   gMC->Gspos("PUCP", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
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;
539   gMC->Gsvolu("PASP", "BOX ", IDTMED[701], DPASP, 3);
540   YO=(AIR_Y-ASP_Y)/2.0-(CBS_R-FTI_R-FTIU_THICK-UFP_Y+DPCBL[1]*2);
541   gMC->Gspos("PASP", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
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;
548   gMC->Gsvolu("PTIP", "BOX ", IDTMED[706], DPTIP, 3);
549   YO=(AIR_Y-TIP_Y)/2.0-(CBS_R-FTI_R-FTIU_THICK-UFP_Y+DPCBL[1]*2+ASP_Y);
550   gMC->Gspos("PTIP", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
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;
557   gMC->Gsvolu("PTXP", "BOX ", IDTMED[707], DPTXP, 3);
558   YO=(AIR_Y-TXP_Y)/2.0-
559     (CBS_R-FTI_R-FTIU_THICK-UFP_Y+DPCBL[1]*2+ASP_Y+TIP_Y);
560   gMC->Gspos("PTXP", 1, "PAIR", 0.0, YO, 0.0, 0, "ONLY");
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];
567   //  gMC->Gsvolu("PCPV", "BOX ", IDTMED[700], DPCPV, 3);
568   gMC->Gsvolu("PCPV", "BOX ", IDTMED[798], DPCPV, 3);
569   gMC->Gsdvn("PCRO", "PCPV", GetNphi(), 1);
570   gMC->Gsdvn("PCCE", "PCRO", GetNz(), 3);
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();
576   gMC->Gsvolu("PCPA", "BOX ", IDTMED[700], DPCPA, 3);
577   gMC->Gspos("PCPA", 1, "PCCE", 0.0, 0.0, 0.0, 0, "ONLY");
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);
594     gMC->Gspos("PHOS", i, "ALIC", XP1, YP1, 0.0, IDROTM[i-1], "ONLY");
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);
601     gMC->Gspos("PCPV", i, "ALIC", XP1, YP1, 0.0, IDROTM[i-1], "ONLY");
602     GetModuleAngle(i-1)=angle-90.0;
603
604   }
605
606   // --- Set volumes seen without their descendants for drawing ---
607   gMC->Gsatt("PCEL", "SEEN", -2);
608   gMC->Gsatt("PCCE", "SEEN", -2);
609
610 }
611
612 //////////////////////////////////////////////////////////////////////////////
613
614 void AliPHOSv2::StepManager(void)
615 {
616
617   Int_t blrc[4]; // (box, layer, row, column) indices
618   Float_t xyze[4]; // position wrt MRS and energy deposited
619   TLorentzVector pos;
620
621   Int_t *IDTMED=fIdtmed->GetArray()-699;
622
623   if(gMC->GetMedium()==IDTMED[700]){ // We are inside a CPV sensitive pad
624
625     gMC->TrackPosition(pos);
626     xyze[0]=pos[0];
627     xyze[1]=pos[1];
628     xyze[2]=pos[2];
629     xyze[3]=gMC->Edep();
630     
631     gMC->CurrentVolOffID(3, blrc[0]);
632     blrc[1]=1; // CPV corresponds to layer 1
633     gMC->CurrentVolOffID(2, blrc[2]);
634     gMC->CurrentVolOffID(1, blrc[3]);
635     
636     AddHit(gAlice->CurrentTrack(), blrc, xyze);
637
638   }
639
640   if(gMC->GetMedium()==IDTMED[699]){ // We are inside a PWO crystal
641
642     gMC->TrackPosition(pos);
643     xyze[0]=pos[0];
644     xyze[1]=pos[1];
645     xyze[2]=pos[2];
646     xyze[3]=gMC->Edep();
647
648     gMC->CurrentVolOffID(9, blrc[0]);
649     blrc[1]=2; // PWO crystals correspond to layer 2
650     gMC->CurrentVolOffID(4, blrc[2]);
651     gMC->CurrentVolOffID(3, blrc[3]);
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 //////////////////////////////////////////////////////////////////////////////