Fixing copy/paste typo
[u/mrichter/AliRoot.git] / VZERO / AliVZEROv7.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 /* $Id$ */
17
18 ///////////////////////////////////////////////////////////////////////
19 //                                                                   //
20 //  (V-zero) detector  version 7 as designed by the Lyon and         //
21 //   Mexico groups and Carlos Perez Lara from Pontificia Universidad //
22 //   Catolica del Peru                                               // 
23 //   All comments should be sent to Brigitte CHEYNIS:                //
24 //                     b.cheynis@ipnl.in2p3.fr                       // 
25 //   Geometry of April 2006 done with ROOT geometrical modeler       //
26 //   V0R (now V0C) sits between Z values  -89.5 and  -84.8 cm        //
27 //   V0L (now V0A) sits between Z values +338.5 and +342.5 cm        //
28 //   New coordinate system has been implemented in october 2003      //
29 //                                                                   //
30 ///////////////////////////////////////////////////////////////////////
31
32 // --- Standard libraries ---
33 #include <Riostream.h>
34
35 // --- ROOT libraries ---
36 #include <TClonesArray.h>
37 #include <TMath.h>
38 #include <TVirtualMC.h>
39 #include <TParticle.h>
40
41 #include <TGeoManager.h>
42 #include <TGeoMaterial.h>
43 #include <TGeoMedium.h>
44 #include <TGeoVolume.h>
45 #include "TGeoTube.h"
46 #include "TGeoArb8.h"
47 #include "TGeoCompositeShape.h"
48
49 // --- AliRoot header files ---
50 #include "AliRun.h"
51 #include "AliMC.h"
52 #include "AliMagF.h"
53 #include "AliVZEROLoader.h"
54 #include "AliVZEROdigit.h"
55 #include "AliVZEROhit.h"
56 #include "AliVZEROv7.h"
57 #include "AliLog.h"
58  
59 ClassImp(AliVZEROv7)
60
61 //_____________________________________________________________________________
62 AliVZEROv7:: AliVZEROv7():AliVZERO(),
63    fCellId(0),
64    fTrackPosition(),
65    fTrackMomentum(), 
66    fV0CHeight1(2.5), 
67    fV0CHeight2(4.4), 
68    fV0CHeight3(7.4), 
69    fV0CHeight4(12.5),
70    fV0CRMin(4.6), 
71    fV0CRBox(38.0),
72    fV0CLidThickness(0.30),
73    fV0CCellThickness(2.00),
74    fV0CBoxThickness(4.70),
75    fV0COffsetFibers(1.0),
76    fV0CLightYield(93.75),
77    fV0CLightAttenuation(0.05),
78    fV0CnMeters(15.0),
79    fV0CFibToPhot(0.3),
80    fV0AR0(4.2), 
81    fV0AR1(7.6), 
82    fV0AR2(13.8), 
83    fV0AR3(22.7),
84    fV0AR4(41.3), 
85    fV0AR5(43.3), 
86    fV0AR6(68.0),
87    fV0ASciWd(2.5), 
88    fV0APlaWd(0.5), 
89    fV0APlaAl(0.06), 
90    fV0AOctWd(0.75), 
91    fV0AFraWd(0.2),
92    fV0AOctH1(1.0), 
93    fV0AOctH2(2.0), 
94    fV0ABasHt(2.0),
95    fV0AFibRd(0.1),
96    fV0APlaEx(4.4),
97    fV0APMBWd(24.6), 
98    fV0APMBHt(22.0), 
99    fV0APMBTh(7.1), 
100    fV0APMBWdW(0.3), 
101    fV0APMBHtW(1.0),
102    fV0APMBAng(30.0), 
103    fV0APMBThW(0.3), 
104    fV0APMTR1(2.44), 
105    fV0APMTR2(2.54), 
106    fV0APMTR3(2.54),
107    fV0APMTR4(2.70), 
108    fV0APMTH(10.0), 
109    fV0APMTB(1.0),
110    fV0AnMeters(fV0AR6*0.01),
111    fV0ALightYield(93.75),
112    fV0ALightAttenuation(0.05),
113    fV0AFibToPhot(0.3),
114    fVersion(7)
115 {
116 // Standard default constructor 
117 }
118
119 //_____________________________________________________________________________
120 AliVZEROv7::AliVZEROv7(const char *name, const char *title):AliVZERO(name,title),
121    fCellId(0),
122    fTrackPosition(),
123    fTrackMomentum(), 
124    fV0CHeight1(2.5), 
125    fV0CHeight2(4.4), 
126    fV0CHeight3(7.4), 
127    fV0CHeight4(12.5),
128    fV0CRMin(4.6), 
129    fV0CRBox(38.0),
130    fV0CLidThickness(0.30),
131    fV0CCellThickness(2.00),
132    fV0CBoxThickness(4.70),
133    fV0COffsetFibers(1.0),
134    fV0CLightYield(93.75),
135    fV0CLightAttenuation(0.05),
136    fV0CnMeters(15.0),
137    fV0CFibToPhot(0.3),
138    fV0AR0(4.2), 
139    fV0AR1(7.6), 
140    fV0AR2(13.8), 
141    fV0AR3(22.7),
142    fV0AR4(41.3), 
143    fV0AR5(43.3), 
144    fV0AR6(68.0),
145    fV0ASciWd(2.5), 
146    fV0APlaWd(0.5), 
147    fV0APlaAl(0.06), 
148    fV0AOctWd(0.75), 
149    fV0AFraWd(0.2),
150    fV0AOctH1(1.0), 
151    fV0AOctH2(2.0), 
152    fV0ABasHt(2.0),
153    fV0AFibRd(0.1),
154    fV0APlaEx(4.4),
155    fV0APMBWd(24.6), 
156    fV0APMBHt(22.0), 
157    fV0APMBTh(7.1), 
158    fV0APMBWdW(0.3), 
159    fV0APMBHtW(1.0),
160    fV0APMBAng(30.0), 
161    fV0APMBThW(0.3), 
162    fV0APMTR1(2.44), 
163    fV0APMTR2(2.54), 
164    fV0APMTR3(2.54),
165    fV0APMTR4(2.70), 
166    fV0APMTH(10.0), 
167    fV0APMTB(1.0),
168    fV0AnMeters(fV0AR6*0.01),
169    fV0ALightYield(93.75),
170    fV0ALightAttenuation(0.05),
171    fV0AFibToPhot(0.3),
172    fVersion(7)
173
174
175 {
176 // Standard constructor for V-zero Detector  version 7
177
178   AliDebug(2,"Create VZERO object ");
179
180 //  fVersion            =     7;  // version number
181
182 //   // V0C Parameters related to geometry: All in cm
183 //   fV0CHeight1         =    2.5; // height of cell 1
184 //   fV0CHeight2         =    4.4; // height of cell 2
185 //   fV0CHeight3         =    7.4; // height of cell 3
186 //   fV0CHeight4         =   12.5; // height of cell 4
187 //   fV0CRMin            =    4.6; // inner radius of box
188 //   fV0CRBox            =   38.0; // outer radius of box
189 //   fV0CLidThickness    =   0.30; // thickness of Carbon lid
190 //   fV0CCellThickness   =   2.00; // thickness of elementary cell
191 //   fV0CBoxThickness    =   4.70; // thickness of V0C Box
192 //   fV0COffsetFibers    =    1.0; // offset to output fibers
193 //   // V0C Parameters related to light output
194 //   fV0CLightYield         =  93.75; // Light yield in BC408 (93.75 eV per photon)
195 //   fV0CLightAttenuation   =   0.05; // Light attenuation in fiber (0.05 per meter)
196 //   fV0CnMeters            =   15.0; // Number of meters of clear fibers to PM
197 //   fV0CFibToPhot          =    0.3; // Attenuation at fiber-photocathode interface
198 // 
199 //   // V0A Parameters related to geometry: All in cm
200 //   fV0AR0     =  4.2;  // Radius of hole
201 //   fV0AR1     =  7.6;  // Maximun radius of 1st cell
202 //   fV0AR2     = 13.8; // Maximun radius of 2nd cell
203 //   fV0AR3     = 22.7; // Maximun radius of 3rd cell
204 //   fV0AR4     = 41.3; // Maximun radius of 4th cell
205 //   fV0AR5     = 43.3; // Radius circunscrite to innermost octagon
206 //   fV0AR6     = 68.0; // Radius circunscrite to outtermost octagon
207 //   fV0ASciWd  =  2.5;  // Scintillator thickness 
208 //   fV0APlaWd  =  0.5;  // Plates thinckness
209 //   fV0APlaAl  = 0.06; // Plates AlMg3 thinckness
210 //   fV0AOctWd  = 0.75; // Innermost octagon thickness
211 //   fV0AOctH1  =  1.0;  // Height of innermost octagon
212 //   fV0AOctH2  =  2.0;  // Height of outtermost octagon
213 //   fV0AFibRd  =  0.1;  // Radius of Fiber
214 //   fV0AFraWd  =  0.2;  // Support Frame thickness
215 //   fV0APMBWd  = 24.6;  // Width of PM Box
216 //   fV0APMBHt  = 22.0;  // Height of PM Box
217 //   fV0APMBTh  =  7.1;  // Thickness of PM Box
218 //   fV0APMBWdW =  0.3;  // Thickness of PM Box Side1 Wall
219 //   fV0APMBHtW =  1.0;  // Thickness of PM Box Side2 Wall
220 //   fV0APMBThW =  0.3;  // Thickness of PM Box Top Wall
221 //   fV0APMBAng = 30.0;  // Angle between PM Box and Support
222 //   fV0APMTR1  = 2.44;  // PMT Glass
223 //   fV0APMTR2  = 2.54;  // PMT Glass
224 //   fV0APMTR3  = 2.54;  // PMT Cover
225 //   fV0APMTR4  = 2.70;  // PMT Cover
226 //   fV0APMTH   = 10.0;  // PMT Height
227 //   fV0APMTB   =  1.0;  // PMT Basis
228 //   fV0APlaEx  =  4.4;  // Plates Extension height
229 //   fV0ABasHt  =  2.0;  // Basis Height
230 //   // V0A Parameters related to light output
231 //   fV0ALightYield         =  93.75;      // Light yield in BC404
232 //   fV0ALightAttenuation   =   0.05;      // Light attenuation in WLS fiber, per meter
233 //   fV0AnMeters            = fV0AR6*0.01; // Tentative value, in meters
234 //   fV0AFibToPhot          =    0.3;      // Attenuation at fiber-photocathode interface
235 }
236 //_____________________________________________________________________________
237
238 void AliVZEROv7::BuildGeometry()
239
240 }
241             
242 //_____________________________________________________________________________
243 void AliVZEROv7::CreateGeometry()
244 {
245 // Constructs TGeo geometry 
246
247   AliDebug(2,"VZERO ConstructGeometry");
248   TGeoVolume *top = gGeoManager->GetVolume("ALIC");
249
250   ///////////////////////////////////////////////////////////////////////////
251   // Construct the geometry of V0C Detector. Brigitte CHEYNIS
252   
253     const int kColorVZERO  = kGreen;
254     TGeoMedium *medV0CAlu = gGeoManager->GetMedium("VZERO_V0CAlu");
255     TGeoMedium *medV0CCar = gGeoManager->GetMedium("VZERO_V0CCar");
256     TGeoMedium *medV0CSci = gGeoManager->GetMedium("VZERO_V0CSci");
257     TGeoVolume *v0RI = new TGeoVolumeAssembly("V0RI");
258     Float_t heightRight, r4Right;
259     Float_t zdet = 90.0 - 0.5 - fV0CBoxThickness/2.0;
260     heightRight  = fV0CHeight1 + fV0CHeight2 + fV0CHeight3 + fV0CHeight4;
261     r4Right      = fV0CRMin + heightRight + 3.0*0.2; // 3 spacings of 2mm between rings
262
263     // Creation of  carbon lids (3.0 mm thick) to keep V0C box shut :
264     Float_t   partube[3];
265     partube[0] =   fV0CRMin;
266     partube[1] =   fV0CRBox;
267     partube[2] =   fV0CLidThickness/2.0;
268     TGeoTube   *sV0CA = new TGeoTube("V0CA", partube[0], partube[1], partube[2]);
269     TGeoVolume *v0CA  = new TGeoVolume("V0CA",sV0CA,medV0CCar);
270     TGeoTranslation *tr2 = new TGeoTranslation(0.,0., fV0CBoxThickness/2.0-partube[2]);
271     TGeoTranslation *tr3 = new TGeoTranslation(0.,0.,-fV0CBoxThickness/2.0+partube[2]);
272     v0RI->AddNode(v0CA,1,tr2);
273     v0RI->AddNode(v0CA,2,tr3);
274     v0CA->SetLineColor(kYellow);
275
276     // Creation of aluminum rings 3.0 mm thick to maintain the v0RI pieces : 
277     partube[0] =   fV0CRMin - 0.3;
278     partube[1] =   fV0CRMin;
279     partube[2] =   fV0CBoxThickness/2.0;
280     TGeoTube   *sV0IR = new TGeoTube("V0IR", partube[0], partube[1], partube[2]);
281     TGeoVolume *v0IR  = new TGeoVolume("V0IR",sV0IR,medV0CAlu);
282     v0RI->AddNode(v0IR,1,0);
283     v0IR->SetLineColor(kYellow);
284     partube[0] =   fV0CRBox;
285     partube[1] =   fV0CRBox + 0.3; 
286     partube[2] =   fV0CBoxThickness/2.0;
287     TGeoTube   *sV0ER = new TGeoTube("V0ER", partube[0], partube[1], partube[2]);
288     TGeoVolume *v0ER  = new TGeoVolume("V0ER",sV0ER,medV0CAlu);
289     v0RI->AddNode(v0ER,1,0);
290     v0ER->SetLineColor(kYellow);
291
292     // Creation of assembly V0R0 of scintillator cells within one sector
293     TGeoVolume *v0R0 = new TGeoVolumeAssembly("V0R0");                                            
294
295     // Elementary cell of ring 1  - right part - :
296     // (cells of ring 1 will be shifted by 2.0 cm backwards to output fibers)
297     Float_t   r1Right =  fV0CRMin + fV0CHeight1;
298     Float_t   offset  = fV0CBoxThickness/2.0 - fV0CLidThickness - fV0CCellThickness/2.0;   
299     Float_t   partubs[5];   
300     partubs[0]     =  fV0CRMin;
301     partubs[1]     =  r1Right;
302     partubs[2]     =  fV0CCellThickness/2.0;
303     partubs[3]     =  90.0-22.5;
304     partubs[4]     = 135.0-22.5;
305     TGeoTubeSeg *sV0R1 = new TGeoTubeSeg("V0R1", partubs[0], partubs[1], partubs[2],
306                                          partubs[3], partubs[4]);
307     TGeoVolume  *v0R1  = new TGeoVolume("V0R1",sV0R1,medV0CSci);                                       
308     TGeoTranslation *tr4 = new TGeoTranslation(0.,0.,-offset);
309     v0R0->AddNode(v0R1,1,tr4);
310     v0R1->SetLineColor(kColorVZERO);
311
312     // Elementary cell of ring 2 - right part - :
313     // (cells of ring 2 will be shifted by 1.0 cm backwards to output fibers)
314     Float_t   r2Right  =  r1Right + fV0CHeight2;  
315     partubs[0]     =  r1Right;  //  must be equal to 7.1
316     partubs[1]     =  r2Right;  //  must be equal to 11.5
317     TGeoTubeSeg *sV0R2 = new TGeoTubeSeg("V0R2", partubs[0], partubs[1], partubs[2],
318                                          partubs[3], partubs[4]);
319     TGeoVolume  *v0R2  = new TGeoVolume("V0R2",sV0R2,medV0CSci);
320     TGeoTranslation *tr5 = new TGeoTranslation(0.0,0.2,-offset + fV0COffsetFibers);
321     v0R0->AddNode(v0R2,1,tr5);
322     v0R2->SetLineColor(kColorVZERO);
323
324     // Ring 3 - right part -  :
325     r2Right  =  r2Right + 0.2;
326     Float_t   r3Right  =  r2Right + fV0CHeight3;     
327     partubs[0]     =  r2Right;  //  must be equal to 11.7
328     partubs[1]     =  r3Right;  //  must be equal to 19.1
329     partubs[3]     =  90.0-22.5;
330     partubs[4]     = 112.5-22.5;
331     TGeoTubeSeg *sV0R3 = new TGeoTubeSeg("V0R3", partubs[0], partubs[1], partubs[2],
332                                          partubs[3], partubs[4]);
333     TGeoVolume  *v0R3  = new TGeoVolume("V0R3",sV0R3,medV0CSci);
334     TGeoTranslation *tr6 = new TGeoTranslation(0.,0.2,-offset + 2.0*fV0COffsetFibers);
335     v0R0->AddNode(v0R3,1,tr6);
336     v0R3->SetLineColor(kColorVZERO);
337     partubs[3]     = 112.5-22.5;
338     partubs[4]     = 135.0-22.5;
339     TGeoTubeSeg *sV0R4 = new TGeoTubeSeg("V0R4", partubs[0], partubs[1], partubs[2],
340                                          partubs[3], partubs[4]);
341     TGeoVolume  *v0R4  = new TGeoVolume("V0R4",sV0R4,medV0CSci);
342     v0R0->AddNode(v0R4,1,tr6);
343     v0R4->SetLineColor(kColorVZERO);
344   
345     // Ring 4 - right part -  : 
346     Float_t x = TMath::ATan(3.5/257.5) * ((180./TMath::Pi()));
347     r3Right = r3Right + 0.2 + 0.2;   // + 0.2 because no shift in translation here !!
348     partubs[0]     =  r3Right;  //  must be equal to 19.5
349     partubs[1]     =  r4Right;  //  must be equal to 32.0
350     partubs[3]     =  90.0-22.5+x;
351     partubs[4]     = 112.5-22.5-x;
352     TGeoTubeSeg *sV0R5 = new TGeoTubeSeg("V0R5", partubs[0], partubs[1], partubs[2],
353                                          partubs[3], partubs[4]);
354     TGeoVolume  *v0R5  = new TGeoVolume("V0R5",sV0R5,medV0CSci);
355     TGeoTranslation *tr7 = new TGeoTranslation(0.,0.0,-offset + 2.0*fV0COffsetFibers);                                        
356     v0R0->AddNode(v0R5,1,tr7);
357     v0R5->SetLineColor(kColorVZERO);
358     partubs[3]     = 112.5-22.5+x;
359     partubs[4]     = 135.0-22.5-x;
360     TGeoTubeSeg *sV0R6 = new TGeoTubeSeg("V0R6", partubs[0], partubs[1], partubs[2],
361                                          partubs[3], partubs[4]);
362     TGeoVolume  *v0R6  = new TGeoVolume("V0R6",sV0R6,medV0CSci);
363     v0R0->AddNode(v0R6,1,tr7);
364     v0R6->SetLineColor(kColorVZERO);
365     Float_t  phi;
366     Float_t  phiDeg= 180./4.;
367     Int_t    nsecR = 1;     // number of sectors in right part of V0
368     for (phi = 22.5; phi < 360.0; phi = phi + phiDeg) {
369       TGeoRotation  *rot1 = new TGeoRotation("rot1", 90.0, +phi, 90., 90.+phi, 0.0, 0.0 ); 
370       v0RI->AddNode(v0R0,nsecR,rot1);    
371       nsecR++;        
372     }
373
374   ///////////////////////////////////////////////////////////////////////////
375   // Construct the geometry of V0A Detector. Carlos PEREZ, PUCP
376
377     const int kV0AColorSci   = 5;
378     const int kV0AColorPlaIn = 3;
379     const int kV0AColorPlaOu = 41;
380     const int kV0AColorOct   = 7;
381     const int kV0AColorFra   = 6;
382     const int kV0AColorFib   = 11;
383     const int kV0AColorPMG   = 1;
384     const int kV0AColorPMA   = 2;
385     const int kV0AColorBas   = 20;
386     TGeoMedium *medV0ASci = gGeoManager->GetMedium("VZERO_V0ASci");
387     TGeoMedium *medV0APlaIn = gGeoManager->GetMedium("VZERO_V0APlaIn");
388     TGeoMedium *medV0APlaOu = gGeoManager->GetMedium("VZERO_V0APlaOu");
389     TGeoMedium *medV0ASup = gGeoManager->GetMedium("VZERO_V0ALuc");
390     TGeoMedium *medV0AFra = gGeoManager->GetMedium("VZERO_V0ALuc");
391     TGeoMedium *medV0AFib = gGeoManager->GetMedium("VZERO_V0AFib");
392     TGeoMedium *medV0APMGlass = gGeoManager->GetMedium("VZERO_V0APMG");
393     TGeoMedium *medV0APMAlum = gGeoManager->GetMedium("VZERO_V0APMA");
394     TGeoMedium *medV0ABas = gGeoManager->GetMedium("VZERO_V0ALuc");
395     double pi = TMath::Pi();
396     double sin225   = TMath::Sin(pi/8.);
397     double cos225   = TMath::Cos(pi/8.);
398     double ctg225   = cos225/sin225;
399     double sin45    = TMath::Sin(pi/4.); // lucky: Sin45=Cos45
400     double v0APts[16];
401
402     ////////////////////////////
403     /// Definition of one sector
404     TGeoVolume *v0ASec = new TGeoVolumeAssembly("V0ASec");
405     
406     /// For boolean sustraction
407     double preShape = 0.2;
408     for (int i=0;i<2;i++) {
409       v0APts[0+8*i] = fV0AR0-fV0AFraWd/2.-preShape;  v0APts[1+8*i] = -preShape;
410       v0APts[2+8*i] = fV0AR0-fV0AFraWd/2.-preShape;  v0APts[3+8*i] = fV0AFraWd/2.;
411       v0APts[4+8*i] = fV0AR4+fV0AFraWd/2.+preShape;  v0APts[5+8*i] = fV0AFraWd/2.;
412       v0APts[6+8*i] = fV0AR4+fV0AFraWd/2.+preShape;  v0APts[7+8*i] = -preShape;
413     }
414     new TGeoArb8("sV0ACha1",fV0ASciWd/1.5,v0APts);
415     for (int i=0;i<2;i++) {
416       v0APts[0+8*i] = fV0AR0*sin45-preShape;
417       v0APts[1+8*i] = (fV0AR0-fV0AFraWd)*sin45-preShape;
418       v0APts[2+8*i] = (fV0AR0-fV0AFraWd/2.)*sin45-preShape;
419       v0APts[3+8*i] = (fV0AR0-fV0AFraWd/2.)*sin45;
420       v0APts[4+8*i] = (fV0AR4+fV0AFraWd/2.)*sin45+preShape;
421       v0APts[5+8*i] = (fV0AR4+fV0AFraWd/2.)*sin45+2.*preShape;
422       v0APts[6+8*i] = (fV0AR4+fV0AFraWd)*sin45+preShape;
423       v0APts[7+8*i] = fV0AR4*sin45+preShape;
424     }
425     new TGeoArb8("sV0ACha2", fV0ASciWd/2.+2.*preShape, v0APts);
426     new TGeoCompositeShape("sV0ACha","sV0ACha1+sV0ACha2");
427
428     /// Frame
429     TGeoVolume *v0AFra = new TGeoVolumeAssembly("V0AFra");
430     for (int i=0;i<2;i++) {
431       v0APts[0+8*i] = fV0AR0-fV0AFraWd/2.;  v0APts[1+8*i] = 0.;
432       v0APts[2+8*i] = fV0AR0-fV0AFraWd/2.;  v0APts[3+8*i] = fV0AFraWd/2.;
433       v0APts[4+8*i] = fV0AR4+fV0AFraWd/2.;  v0APts[5+8*i] = fV0AFraWd/2.;
434       v0APts[6+8*i] = fV0AR4+fV0AFraWd/2.;  v0APts[7+8*i] = 0.;
435     }
436     TGeoArb8 *sV0AFraB1 = new TGeoArb8("sV0AFraB1",fV0ASciWd/2.,v0APts);
437     TGeoVolume *v0AFraB1 = new TGeoVolume("V0AFraB1",sV0AFraB1,medV0AFra);
438     for (int i=0;i<2;i++) {
439       v0APts[0+8*i] = fV0AR0*sin45;
440       v0APts[1+8*i] = (fV0AR0-fV0AFraWd)*sin45;
441       v0APts[2+8*i] = (fV0AR0-fV0AFraWd/2.)*sin45;
442       v0APts[3+8*i] = (fV0AR0-fV0AFraWd/2.)*sin45;
443       v0APts[4+8*i] = (fV0AR4+fV0AFraWd/2.)*sin45;
444       v0APts[5+8*i] = (fV0AR4+fV0AFraWd/2.)*sin45;
445       v0APts[6+8*i] = (fV0AR4+fV0AFraWd)*sin45;
446       v0APts[7+8*i] = fV0AR4*sin45;
447     }
448     TGeoArb8 *sV0AFraB2 = new TGeoArb8("sV0AFraB2", fV0ASciWd/2., v0APts);
449     TGeoVolume *v0AFraB2 = new TGeoVolume("V0AFraB2",sV0AFraB2,medV0AFra);
450     v0AFraB1->SetLineColor(kV0AColorFra); v0AFraB2->SetLineColor(kV0AColorFra);
451     v0AFra->AddNode(v0AFraB1,1);
452     v0AFra->AddNode(v0AFraB2,1);  // Prefer 2 GeoObjects insted of 3 GeoMovements
453     new TGeoTubeSeg( "sV0AFraR1b", fV0AR0-fV0AFraWd/2.,
454                      fV0AR0+fV0AFraWd/2., fV0ASciWd/2., 0, 45);
455     new TGeoTubeSeg( "sV0AFraR2b", fV0AR1-fV0AFraWd/2.,
456                      fV0AR1+fV0AFraWd/2., fV0ASciWd/2., 0, 45);
457     new TGeoTubeSeg( "sV0AFraR3b", fV0AR2-fV0AFraWd/2.,
458                      fV0AR2+fV0AFraWd/2., fV0ASciWd/2., 0, 45);
459     new TGeoTubeSeg( "sV0AFraR4b", fV0AR3-fV0AFraWd/2.,
460                      fV0AR3+fV0AFraWd/2., fV0ASciWd/2., 0, 45);
461     new TGeoTubeSeg( "sV0AFraR5b", fV0AR4-fV0AFraWd/2.,
462                      fV0AR4+fV0AFraWd/2., fV0ASciWd/2., 0, 45);
463     TGeoCompositeShape *sV0AFraR1 = new TGeoCompositeShape("sV0AFraR1","sV0AFraR1b-sV0ACha");
464     TGeoCompositeShape *sV0AFraR2 = new TGeoCompositeShape("sV0AFraR2","sV0AFraR2b-sV0ACha");
465     TGeoCompositeShape *sV0AFraR3 = new TGeoCompositeShape("sV0AFraR3","sV0AFraR3b-sV0ACha");
466     TGeoCompositeShape *sV0AFraR4 = new TGeoCompositeShape("sV0AFraR4","sV0AFraR4b-sV0ACha");
467     TGeoCompositeShape *sV0AFraR5 = new TGeoCompositeShape("sV0AFraR5","sV0AFraR5b-sV0ACha");
468     TGeoVolume *v0AFraR1 = new TGeoVolume("V0AFraR1",sV0AFraR1,medV0AFra);
469     TGeoVolume *v0AFraR2 = new TGeoVolume("V0AFraR2",sV0AFraR2,medV0AFra);
470     TGeoVolume *v0AFraR3 = new TGeoVolume("V0AFraR3",sV0AFraR3,medV0AFra);
471     TGeoVolume *v0AFraR4 = new TGeoVolume("V0AFraR4",sV0AFraR4,medV0AFra);
472     TGeoVolume *v0AFraR5 = new TGeoVolume("V0AFraR5",sV0AFraR5,medV0AFra);
473     v0AFraR1->SetLineColor(kV0AColorFra); v0AFraR2->SetLineColor(kV0AColorFra);
474     v0AFraR3->SetLineColor(kV0AColorFra); v0AFraR4->SetLineColor(kV0AColorFra);
475     v0AFraR5->SetLineColor(kV0AColorFra);
476     v0AFra->AddNode(v0AFraR1,1);
477     v0AFra->AddNode(v0AFraR2,1);
478     v0AFra->AddNode(v0AFraR3,1);
479     v0AFra->AddNode(v0AFraR4,1);
480     v0AFra->AddNode(v0AFraR5,1);
481     v0ASec->AddNode(v0AFra,1);
482
483     /// Sensitive scintilator
484     TGeoVolume *v0ASci = new TGeoVolumeAssembly("V0ASci");
485     new TGeoTubeSeg( "sV0AR1b", fV0AR0+fV0AFraWd/2.,
486                      fV0AR1-fV0AFraWd/2., fV0ASciWd/2., 0, 45);
487     new TGeoTubeSeg( "sV0AR2b", fV0AR1+fV0AFraWd/2.,
488                      fV0AR2-fV0AFraWd/2., fV0ASciWd/2., 0, 45);
489     new TGeoTubeSeg( "sV0AR3b", fV0AR2+fV0AFraWd/2.,
490                      fV0AR3-fV0AFraWd/2., fV0ASciWd/2., 0, 45);
491     new TGeoTubeSeg( "sV0AR4b", fV0AR3+fV0AFraWd/2.,
492                      fV0AR4-fV0AFraWd/2., fV0ASciWd/2., 0, 45);
493     TGeoCompositeShape *sV0AR1 = new TGeoCompositeShape("sV0AR1","sV0AR1b-sV0ACha");
494     TGeoCompositeShape *sV0AR2 = new TGeoCompositeShape("sV0AR2","sV0AR2b-sV0ACha");
495     TGeoCompositeShape *sV0AR3 = new TGeoCompositeShape("sV0AR3","sV0AR3b-sV0ACha");
496     TGeoCompositeShape *sV0AR4 = new TGeoCompositeShape("sV0AR4","sV0AR4b-sV0ACha");
497     TGeoVolume *v0L1 = new TGeoVolume("V0L1",sV0AR1,medV0ASci);
498     TGeoVolume *v0L2 = new TGeoVolume("V0L2",sV0AR2,medV0ASci);
499     TGeoVolume *v0L3 = new TGeoVolume("V0L3",sV0AR3,medV0ASci);
500     TGeoVolume *v0L4 = new TGeoVolume("V0L4",sV0AR4,medV0ASci);
501     v0L1->SetLineColor(kV0AColorSci); v0L2->SetLineColor(kV0AColorSci);
502     v0L3->SetLineColor(kV0AColorSci); v0L4->SetLineColor(kV0AColorSci);
503     v0ASec->AddNode(v0L1,1);
504     v0ASec->AddNode(v0L2,1);
505     v0ASec->AddNode(v0L3,1);
506     v0ASec->AddNode(v0L4,1);
507
508     /// Non-sensitive scintilator
509     for (int i=0;i<2;i++) {
510       v0APts[0+8*i] = fV0AR4;
511       v0APts[1+8*i] = fV0AFraWd/2.;
512       v0APts[2+8*i] = fV0AR4*sin45;
513       v0APts[3+8*i] = (fV0AR4-fV0AFraWd)*sin45;
514       v0APts[4+8*i] = fV0AR5/cos225*sin45+fV0AFraWd/2.*sin225;
515       v0APts[5+8*i] = fV0AR5/cos225*sin45-fV0AFraWd/2.*cos225;
516       v0APts[6+8*i] = fV0AR5/cos225-fV0AFraWd/2./ctg225;
517       v0APts[7+8*i] = fV0AFraWd/2.;
518     }
519     new TGeoArb8("sV0AR5S1", fV0ASciWd/2., v0APts);
520     new TGeoTubeSeg("sV0AR5S2", fV0AR4-(v0APts[6]-v0APts[0]),
521                     fV0AR4+fV0AFraWd/2., fV0ASciWd/2.+2*preShape, 0, 45);
522     TGeoCompositeShape *sV0AR5 = new TGeoCompositeShape("V0AR5","(sV0AR5S1 - sV0AR5S2)");
523     TGeoVolume *v0AR5 = new TGeoVolume("V0AR5",sV0AR5,medV0ASci);
524     v0AR5->SetLineColor(kV0AColorSci);
525     v0ASci->AddNode(v0AR5,1);
526     v0ASec->AddNode(v0ASci,1);
527
528     /// Segment of innermost octagon
529     TGeoVolume *v0ASup = new TGeoVolumeAssembly("V0ASup");
530     for (int i=0;i<2;i++) {
531       v0APts[0+8*i] = (fV0AR5-fV0AOctH1)/cos225;        v0APts[1+8*i] = 0.;
532       v0APts[2+8*i] = (fV0AR5-fV0AOctH1)/cos225*sin45;  v0APts[3+8*i] = (fV0AR5-fV0AOctH1)/cos225*sin45;
533       v0APts[4+8*i] = fV0AR5/cos225*sin45;              v0APts[5+8*i] = fV0AR5/cos225*sin45;
534       v0APts[6+8*i] = fV0AR5/cos225;                    v0APts[7+8*i] = 0.;
535     }
536     TGeoArb8 *sV0AOct1 = new TGeoArb8("sV0AOct1", fV0AOctWd/2., v0APts);
537     TGeoVolume *v0AOct1 = new TGeoVolume("V0AOct1",sV0AOct1,medV0ASup);
538     v0AOct1->SetLineColor(kV0AColorOct);
539     v0ASup->AddNode(v0AOct1,1,new TGeoTranslation(0,0,(fV0ASciWd+fV0AOctWd)/2.));
540     v0ASup->AddNode(v0AOct1,2,new TGeoTranslation(0,0,-(fV0ASciWd+fV0AOctWd)/2.));
541
542     /// Segment of outtermost octagon
543     for (int i=0;i<2;i++) {
544       v0APts[0+8*i] = (fV0AR6-fV0AOctH2)/cos225;        v0APts[1+8*i] = 0.;
545       v0APts[2+8*i] = (fV0AR6-fV0AOctH2)/cos225*sin45;  v0APts[3+8*i] = (fV0AR6-fV0AOctH2)/cos225*sin45;
546       v0APts[4+8*i] = fV0AR6/cos225*sin45;              v0APts[5+8*i] = fV0AR6/cos225*sin45;
547       v0APts[6+8*i] = fV0AR6/cos225;                    v0APts[7+8*i] = 0.;
548     }
549     TGeoArb8 *sV0AOct2 = new TGeoArb8("sV0AOct2", (fV0ASciWd+2*fV0AOctWd)/2., v0APts);
550     TGeoVolume *v0AOct2 = new TGeoVolume("V0AOct2", sV0AOct2,medV0ASup);
551     v0AOct2->SetLineColor(kV0AColorOct);
552     v0ASup->AddNode(v0AOct2,1);
553     v0ASec->AddNode(v0ASup,1);
554
555     /// Bunch of fibers
556     v0APts[ 0] = v0APts[ 2] = -12.5;
557     v0APts[ 1] = v0APts[ 7] = (fV0ASciWd+fV0AOctWd)/2.-0.01;
558     v0APts[ 3] = v0APts[ 5] = (fV0ASciWd+fV0AOctWd)/2.+0.01;
559     v0APts[ 4] = v0APts[ 6] = +12.5;
560     v0APts[ 8] = v0APts[10] = -0.5;
561     v0APts[ 9] = v0APts[15] = 0.;
562     v0APts[11] = v0APts[13] = 0.25;
563     v0APts[12] = v0APts[14] = +0.5;
564     TGeoArb8 *sV0AFib = new TGeoArb8("sV0AFib", (fV0AR6-fV0AR5-fV0AOctH2-0.006)/2., v0APts);
565     TGeoVolume *v0AFib1 = new TGeoVolume("V0AFib1",sV0AFib,medV0AFib);
566     TGeoVolume *v0AFib = new TGeoVolumeAssembly("V0AFib");
567     TGeoRotation *rot = new TGeoRotation("rot");
568     rot->RotateX(-90);
569     rot->RotateZ(-90.+22.5);
570     v0AFib->AddNode(v0AFib1,1,rot);
571     rot = new TGeoRotation("rot");
572     rot->RotateX(-90);
573     rot->RotateY(180);
574     rot->RotateZ(-90.+22.5);
575     v0AFib->SetLineColor(kV0AColorFib);
576     v0AFib->AddNode(v0AFib1,2,rot);
577     v0ASec->AddNode(v0AFib,1,new TGeoTranslation((fV0AR6-fV0AOctH2+fV0AR5)*cos225/2.,
578                                                  (fV0AR6-fV0AOctH2+fV0AR5)*sin225/2., 0));
579
580     /// Plates
581     for (int i=0;i<2;i++) {
582       v0APts[0+8*i] = fV0AR0;                   v0APts[1+8*i] = 0.;
583       v0APts[2+8*i] = fV0AR0*sin45;             v0APts[3+8*i] = fV0AR0*sin45;
584       v0APts[4+8*i] = fV0AR6/cos225 * sin45;    v0APts[5+8*i] = fV0AR6/cos225*sin45;
585       v0APts[6+8*i] = fV0AR6/cos225;            v0APts[7+8*i] = 0.;
586     }
587     TGeoArb8 *sV0APlaIn = new TGeoArb8("sV0APlaIn", (fV0APlaWd-2*fV0APlaAl)/2., v0APts);
588     TGeoVolume *v0APlaIn = new TGeoVolume("V0APlaIn", sV0APlaIn, medV0APlaIn);
589     TGeoArb8 *sV0APlaOu = new TGeoArb8("sV0APlaOu", fV0APlaAl/2., v0APts);
590     TGeoVolume *v0APlaOu = new TGeoVolume("V0APlaOu", sV0APlaOu, medV0APlaOu);
591     v0APlaIn->SetLineColor(kV0AColorPlaIn); v0APlaOu->SetLineColor(kV0AColorPlaOu);
592     TGeoVolume *v0APla = new TGeoVolumeAssembly("V0APla");
593     v0APla->AddNode(v0APlaIn,1);
594     v0APla->AddNode(v0APlaOu,1,new TGeoTranslation(0,0,(fV0APlaWd-fV0APlaAl)/2.));
595     v0APla->AddNode(v0APlaOu,2,new TGeoTranslation(0,0,-(fV0APlaWd-fV0APlaAl)/2.));
596     v0ASec->AddNode(v0APla,1,new TGeoTranslation(0,0,(fV0ASciWd+2*fV0AOctWd+fV0APlaWd)/2.));
597     v0ASec->AddNode(v0APla,2,new TGeoTranslation(0,0,-(fV0ASciWd+2*fV0AOctWd+fV0APlaWd)/2.));
598
599     /// PMBox
600     TGeoVolume* v0APM = new TGeoVolumeAssembly("V0APM");
601     new TGeoBBox("sV0APMB1", fV0APMBWd/2., fV0APMBHt/2., fV0APMBTh/2.);
602     new TGeoBBox("sV0APMB2", fV0APMBWd/2.-fV0APMBWdW, fV0APMBHt/2.-fV0APMBHtW, fV0APMBTh/2.-fV0APMBThW);
603     TGeoCompositeShape *sV0APMB = new TGeoCompositeShape("sV0APMB","sV0APMB1-sV0APMB2");
604     TGeoVolume *v0APMB = new TGeoVolume("V0APMB",sV0APMB, medV0APMAlum);
605     v0APMB->SetLineColor(kV0AColorPMA);
606     v0APM->AddNode(v0APMB,1);
607
608     /// PMTubes
609     TGeoTube *sV0APMT1 = new TGeoTube("sV0APMT1", fV0APMTR1, fV0APMTR2, fV0APMTH/2.);
610     TGeoVolume *v0APMT1 = new TGeoVolume("V0APMT1", sV0APMT1, medV0APMGlass);
611     TGeoTube *sV0APMT2 = new TGeoTube("sV0APMT2", fV0APMTR3, fV0APMTR4, fV0APMTH/2.);
612     TGeoVolume *v0APMT2 = new TGeoVolume("V0APMT2", sV0APMT2, medV0APMAlum);
613     TGeoVolume *v0APMT = new TGeoVolumeAssembly("V0APMT");
614     TGeoTube *sV0APMTT = new TGeoTube("sV0APMTT", 0., fV0APMTR4, fV0APMTB/2.);
615     TGeoVolume *v0APMTT = new TGeoVolume("V0APMTT", sV0APMTT, medV0APMAlum);
616     v0APMT1->SetLineColor(kV0AColorPMG);
617     v0APMT2->SetLineColor(kV0AColorPMA);
618     v0APMTT->SetLineColor(kV0AColorPMA);
619     rot = new TGeoRotation("rot", 90, 0, 180, 0, 90, 90);
620     v0APMT->AddNode(v0APMT1,1,rot);
621     v0APMT->AddNode(v0APMT2,1,rot);
622     v0APMT->AddNode(v0APMTT,1,new TGeoCombiTrans(0,-(fV0APMTH+fV0APMTB)/2.,0,rot));
623     double autoShift = (fV0APMBWd-2*fV0APMBWdW)/4.;
624     v0APM->AddNode(v0APMT, 1, new TGeoTranslation(-1.5*autoShift, 0, 0));
625     v0APM->AddNode(v0APMT, 2, new TGeoTranslation(-0.5*autoShift, 0, 0));
626     v0APM->AddNode(v0APMT, 3, new TGeoTranslation(+0.5*autoShift, 0, 0));
627     v0APM->AddNode(v0APMT, 4, new TGeoTranslation(+1.5*autoShift, 0, 0));
628
629     /// PM
630     rot = new TGeoRotation("rot");
631     rot->RotateX(90-fV0APMBAng);
632     rot->RotateZ(-90.+22.5);
633     double cosAngPMB = TMath::Cos(fV0APMBAng*TMath::DegToRad());
634     double sinAngPMB = TMath::Sin(fV0APMBAng*TMath::DegToRad());
635     double shiftZ = fV0APMBHt/2. * cosAngPMB
636       -   ( fV0ASciWd + 2 * fV0AOctWd + 2 * fV0APlaWd )/2.   -   fV0APMBTh/2. * sinAngPMB;
637     double shiftR = fV0AR6  +  fV0APMBHt/2. * sinAngPMB  +  fV0APMBTh/2. * cosAngPMB;
638     v0ASec->AddNode(v0APM,1, new TGeoCombiTrans( shiftR*cos225, shiftR*sin225, shiftZ, rot));
639
640     /// End of sector definition
641     ////////////////////////////
642
643     /// Replicate sectors
644     TGeoVolume *v0LE = new TGeoVolumeAssembly("V0LE");
645     for(int i=0; i<8; i++) {
646       TGeoRotation *rot = new TGeoRotation("rot", 90., i*45.+90, 90., 90.+i*45.+90, 0., 0.);
647       v0LE->AddNode(v0ASec,i+1,rot);  /// modificacion +1 anhadido
648     }
649   
650     /// Basis Construction
651     rot = new TGeoRotation("rot"); rot->RotateX(90-fV0APMBAng); rot->RotateZ(-22.5);
652     TGeoCombiTrans *pos1 = new TGeoCombiTrans("pos1", shiftR*sin225, shiftR*cos225, shiftZ, rot);
653     pos1->RegisterYourself();
654     for (int i=0;i<2;i++) {
655       v0APts[0+8*i] = fV0AR6/cos225*sin45;  v0APts[1+8*i] = fV0AR6/cos225*sin45;
656       v0APts[2+8*i] = 0;                    v0APts[3+8*i] = fV0AR6/cos225;
657       v0APts[4+8*i] = 0;                    v0APts[5+8*i] = fV0AR6/cos225+fV0APlaEx;
658       v0APts[6+8*i] = fV0AR6/cos225-(fV0AR6/cos225+fV0APlaEx)/ctg225;
659       v0APts[7+8*i] = fV0AR6/cos225+fV0APlaEx;
660     }
661     new TGeoArb8("sV0APlaExIn1", (fV0APlaWd-2*fV0APlaAl)/2., v0APts);
662     new TGeoArb8("sV0APlaExOu1", fV0APlaAl/2., v0APts);
663     TGeoCompositeShape *sV0APlaExIn = new TGeoCompositeShape("sV0APlaExIn","sV0APlaExIn1-sV0APMB1:pos1");
664     TGeoVolume *v0APlaExIn = new TGeoVolume("V0APlaExIn", sV0APlaExIn, medV0APlaIn);
665     TGeoCompositeShape *sV0APlaExOu = new TGeoCompositeShape("sV0APlaExOu","sV0APlaExOu1-sV0APMB1:pos1");
666     TGeoVolume *v0APlaExOu = new TGeoVolume("V0APlaExOu", sV0APlaExOu, medV0APlaOu);
667     v0APlaExIn->SetLineColor(kV0AColorPlaIn); v0APlaExOu->SetLineColor(kV0AColorPlaOu);
668     TGeoVolume *v0APlaEx = new TGeoVolumeAssembly("V0APlaEx");
669     v0APlaEx->AddNode(v0APlaExIn,1);
670     v0APlaEx->AddNode(v0APlaExOu,1,new TGeoTranslation(0,0,(fV0APlaWd-fV0APlaAl)/2.));
671     v0APlaEx->AddNode(v0APlaExOu,2,new TGeoTranslation(0,0,-(fV0APlaWd-fV0APlaAl)/2.));
672     for (int i=0;i<2;i++) {
673       v0APts[0+8*i] = fV0AR6/cos225-(fV0AR6/cos225+fV0APlaEx)/ctg225-fV0ABasHt*sin45;
674       v0APts[1+8*i] = fV0AR6/cos225+fV0APlaEx-fV0ABasHt*sin45;
675       v0APts[2+8*i] = 0;  v0APts[3+8*i] = fV0AR6/cos225+fV0APlaEx-fV0ABasHt;
676       v0APts[4+8*i] = 0;  v0APts[5+8*i] = fV0AR6/cos225+fV0APlaEx;
677       v0APts[6+8*i] = fV0AR6/cos225-(fV0AR6/cos225+fV0APlaEx)/ctg225;
678       v0APts[7+8*i] = fV0AR6/cos225+fV0APlaEx;
679     }
680     new TGeoArb8("sV0ABas1", (fV0ASciWd+2*fV0AOctWd)/2., v0APts);
681     TGeoCompositeShape *sV0ABas = new TGeoCompositeShape("sV0ABas","sV0ABas1-sV0APMB1:pos1");
682     TGeoVolume *v0ABas = new TGeoVolume("V0ABas", sV0ABas, medV0ABas);
683     v0ABas->SetLineColor(kV0AColorBas);
684     TGeoVolume *v0ABasis = new TGeoVolumeAssembly("V0ABasis");
685     rot = new TGeoRotation("rot",90.,180.,90.,90.,0.,0.);
686     v0ABasis->AddNode(v0APlaEx,1, new TGeoTranslation(0,0,(fV0ASciWd+2*fV0AOctWd+fV0APlaWd)/2.));
687     v0ABasis->AddNode(v0APlaEx,2, new TGeoTranslation(0,0,-(fV0ASciWd+2*fV0AOctWd+fV0APlaWd)/2.));
688     v0ABasis->AddNode(v0APlaEx,3, new TGeoCombiTrans(0,0,(fV0ASciWd+2*fV0AOctWd+fV0APlaWd)/2.,rot));
689     v0ABasis->AddNode(v0APlaEx,4, new TGeoCombiTrans(0,0,-(fV0ASciWd+2*fV0AOctWd+fV0APlaWd)/2.,rot));
690     v0ABasis->AddNode(v0ABas,1);
691     v0ABasis->AddNode(v0ABas,2,rot);
692     rot = new TGeoRotation("rot");
693     rot->RotateZ(180);
694     v0LE->AddNode(v0ABasis,1,rot);
695
696     // Adding detectors to top volume
697     TGeoVolume *vZERO = new TGeoVolumeAssembly("VZERO");
698     vZERO->AddNode(v0RI,1,new TGeoTranslation(0, 0, -zdet));
699     // V0A position according to TB decision 13/12/2005 
700     vZERO->AddNode(v0LE,1,new TGeoTranslation(0, 0, +327.5));
701     top->AddNode(vZERO,1);
702 }
703
704 //_____________________________________________________________________________
705 void AliVZEROv7::AddAlignableVolumes() const
706 {
707   //
708   // Create entries for alignable volumes associating the symbolic volume
709   // name with the corresponding volume path. Needs to be syncronized with
710   // eventual changes in the geometry.
711   // 
712   TString vpC = "/ALIC_1/VZERO_1/V0RI_1";
713   TString vpA = "/ALIC_1/VZERO_1/V0LE_1";
714   TString snC = "VZERO/V0C";
715   TString snA = "VZERO/V0A";
716   
717   if(!gGeoManager->SetAlignableEntry(snC.Data(),vpC.Data()))
718     AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", snC.Data(),vpC.Data()));
719   if(!gGeoManager->SetAlignableEntry(snA.Data(),vpA.Data()))
720     AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", snA.Data(),vpA.Data()));
721
722
723
724 //_____________________________________________________________________________
725 void AliVZEROv7::CreateMaterials()
726 {
727
728 // Creates materials used for geometry 
729
730   AliDebug(2,"Create materials");
731   // Parameters for simulation scope
732   Int_t     fieldType       = gAlice->Field()->Integ();     // Field type 
733   Double_t  maxField        = gAlice->Field()->Max();       // Field max.
734   Double_t  maxBending      = 10;    // Max Angle
735   Double_t  maxStepSize     = 0.01;  // Max step size 
736   Double_t  maxEnergyLoss   = 1;     // Max Delta E
737   Double_t  precision       = 0.003; // Precision
738   Double_t  minStepSize     = 0.003; // Minimum step size 
739
740   Int_t    id;
741   Double_t a, z, radLength, absLength;
742   Float_t density, as[4], zs[4], ws[4];
743
744 // Parameters  for V0CPrePlates: Aluminium
745    a = 26.98; 
746    z = 13.00;
747    density     = 2.7;
748    radLength   = 8.9;
749    absLength   = 37.2;
750    id = 2;
751    AliMaterial( id, "V0CAlu", a, z, density, radLength, absLength, 0, 0);
752    AliMedium(id, "V0CAlu", id, 1, fieldType, maxField, maxBending, maxStepSize,
753              maxEnergyLoss, precision, minStepSize);
754                     
755 // Parameters  for V0CPlates: Carbon 
756    a = 12.01; 
757    z =  6.00;
758    density   = 2.265;
759    radLength = 18.8;
760    absLength = 49.9;
761    id = 3;
762    AliMaterial(id, "V0CCar",  a, z, density, radLength, absLength, 0, 0);
763    AliMedium(id, "V0CCar", id, 1, fieldType, maxField, maxBending, maxStepSize,
764              maxEnergyLoss, precision, minStepSize);
765             
766 // Parameters  for V0Cscintillator: BC408
767    as[0] = 1.00794;     as[1] = 12.011;
768    zs[0] = 1.;          zs[1] = 6.;
769    ws[0] = 1.;          ws[1] = 1.;
770    density      = 1.032;
771    id           = 4;
772    AliMixture(id, "V0CSci", as, zs, density, -2, ws);
773    AliMedium(id,"V0CSci", id, 1, fieldType, maxField, maxBending, maxStepSize,
774              maxEnergyLoss, precision, minStepSize);
775
776 // Parameters for V0Ascintilator: BC404
777    as[0] = 1.00794;     as[1] = 12.011;
778    zs[0] = 1.;          zs[1] = 6.;
779    ws[0] = 5.21;        ws[1] = 4.74;
780    density      = 1.032;
781    id           = 5;
782    AliMixture(id, "V0ASci", as, zs, density, -2, ws);
783    AliMedium(id,  "V0ASci", id, 1, fieldType, maxField, maxBending, maxStepSize,
784              maxEnergyLoss, precision, minStepSize);
785
786 // Parameters for V0ALuc: Lucita but for the simulation BC404
787    as[0] = 1.00794;     as[1] = 12.011;
788    zs[0] = 1.;          zs[1] = 6.;
789    ws[0] = 5.21;        ws[1] = 4.74;
790    density      = 1.032;
791    id           = 6;
792    AliMixture(id, "V0ALuc", as, zs, density, -2, ws);
793    AliMedium(id, "V0ALuc", id, 1, fieldType, maxField, maxBending, maxStepSize,
794              maxEnergyLoss, precision, minStepSize);
795
796 // Parameters for V0Aplate: EuroComposite - EC-PI 626 PS - AlMg3
797    as[0] = 26.982;      as[1] = 24.305;
798    zs[0] = 13.;         zs[1] = 12.;
799    ws[0] = 1.;          ws[1] = 3.;
800    density      = 3.034;
801    id           = 7;
802    AliMixture(id, "V0APlaOu", as, zs, density, -2, ws);
803    AliMedium(id, "V0APlaOu", id, 1, fieldType, maxField, maxBending, maxStepSize,
804              maxEnergyLoss, precision, minStepSize);
805
806 // Parameters for V0Aplate: EuroComposite - EC-PI 626 PS - EC-PI 6.4-42
807    as[0] = 1.00794;     as[1] = 12.011;
808    zs[0] = 1.;          zs[1] = 6.;
809    ws[0] = 5.21;        ws[1] = 4.74;
810    density      = 0.042;
811    id           = 8;
812    AliMixture(id, "V0APlaIn", as, zs, density, -2, ws);
813    AliMedium(id, "V0APlaIn", id, 1, fieldType, maxField, maxBending, maxStepSize,
814              maxEnergyLoss, precision, minStepSize);
815
816 // Parameters for V0Afiber: BC9929AMC Plastic Scintillating Fiber from Saint-Gobain
817    as[0] = 1.00794;     as[1] = 12.011;
818    zs[0] = 1.;          zs[1] = 6.;
819    ws[0] = 4.82;        ws[1] = 4.85;
820    density      = 1.05;
821    id           = 9;
822    AliMixture(id, "V0AFib", as, zs, density, -2, ws);
823    AliMedium(id, "V0AFib", id, 1, fieldType, maxField, maxBending, maxStepSize,
824              maxEnergyLoss, precision, minStepSize);
825
826 // Parameters for V0APMA: Aluminium
827    a = 26.98; 
828    z = 13.00;
829    density     = 2.7;
830    radLength   = 8.9;
831    absLength   = 37.2;
832    id = 10;
833    AliMaterial(id, "V0APMA",  a, z, density, radLength, absLength, 0, 0);
834    AliMedium(id, "V0APMA", id, 1, fieldType, maxField, maxBending, maxStepSize,
835              maxEnergyLoss, precision, minStepSize);
836
837 // Parameters for V0APMG: Glass for the simulation Aluminium
838    a = 26.98; 
839    z = 13.00;
840    density   = 2.7;
841    radLength = 8.9;
842    absLength = 37.2;
843    id = 11;
844    AliMaterial(id, "V0APMG",  a, z, density, radLength, absLength, 0, 0);
845    AliMedium(id, "V0APMG", id, 1, fieldType, maxField, maxBending, maxStepSize,
846              maxEnergyLoss, precision, minStepSize);
847 }
848
849 //_____________________________________________________________________________
850 void AliVZEROv7::DrawModule() const
851 {
852 //  Drawing is done in DrawVZERO.C
853
854    AliDebug(2,"DrawModule");
855 }
856
857
858 //_____________________________________________________________________________
859 void AliVZEROv7::DrawGeometry() 
860 {
861 //  Drawing of V0 geometry done in DrawV0.C
862
863    AliDebug(2,"DrawGeometry");
864 }
865
866 //_____________________________________________________________________________
867 void AliVZEROv7::Init()
868 {
869 // Initialises version of the VZERO Detector given in Config
870 // Just prints an information message
871
872 //   AliInfo(Form("VZERO version %d initialized \n",IsVersion()));
873    
874    AliDebug(1,"VZERO version 7 initialized");
875    AliVZERO::Init();  
876 }
877
878 //_____________________________________________________________________________
879 void AliVZEROv7::StepManager()
880 {
881   // Step Manager, called at each step 
882
883   Int_t     copy;
884   static    Int_t   vol[4];
885   static    Float_t hits[21];
886   static    Float_t eloss, tlength;
887   static    Int_t   nPhotonsInStep = 0;
888   static    Int_t   nPhotons = 0; 
889   static    Int_t   numStep = 0;
890   Int_t     ringNumber;
891   Float_t   destep, step;
892   numStep += 1; 
893
894   //   We keep only charged tracks :
895   if ( !gMC->TrackCharge() || !gMC->IsTrackAlive() ) return;
896
897   vol[0]    = gMC->CurrentVolOffID(1, vol[1]);
898   vol[2]    = gMC->CurrentVolID(copy);
899   vol[3]    = copy;
900   static Int_t idV0R1 = gMC->VolId("V0R1");
901   static Int_t idV0L1 = gMC->VolId("V0L1");
902   static Int_t idV0R2 = gMC->VolId("V0R2");
903   static Int_t idV0L2 = gMC->VolId("V0L2");
904   static Int_t idV0R3 = gMC->VolId("V0R3");
905   static Int_t idV0L3 = gMC->VolId("V0L3");
906   static Int_t idV0R4 = gMC->VolId("V0R4");
907   static Int_t idV0L4 = gMC->VolId("V0L4");
908   static Int_t idV0R5 = gMC->VolId("V0R5");
909   static Int_t idV0R6 = gMC->VolId("V0R6");
910   bool   hitOnV0C = true;
911   double lightYield;
912   double lightAttenuation;
913   double nMeters;
914   double fibToPhot;
915   if      ( gMC->CurrentVolID(copy) == idV0R1 || gMC->CurrentVolID(copy) == idV0L1 )
916     ringNumber = 1;
917   else if ( gMC->CurrentVolID(copy) == idV0R2 || gMC->CurrentVolID(copy) == idV0L2 )
918     ringNumber = 2;  
919   else if ( gMC->CurrentVolID(copy) == idV0R3 || gMC->CurrentVolID(copy) == idV0R4
920             || gMC->CurrentVolID(copy) == idV0L3 ) ringNumber = 3;
921   else if ( gMC->CurrentVolID(copy) == idV0R5 || gMC->CurrentVolID(copy) == idV0R6
922             || gMC->CurrentVolID(copy) == idV0L4 ) ringNumber = 4;             
923   else ringNumber = 0;
924   if  (ringNumber) {
925     if (gMC->CurrentVolID(copy) == idV0L1 || gMC->CurrentVolID(copy) == idV0L2 ||
926         gMC->CurrentVolID(copy) == idV0L3 || gMC->CurrentVolID(copy) == idV0L4)
927       hitOnV0C = false;
928     destep = gMC->Edep();
929     step   = gMC->TrackStep();
930     if (hitOnV0C) {
931       lightYield = fV0CLightYield;
932       lightAttenuation = fV0CLightAttenuation;
933       nMeters = fV0CnMeters;
934       fibToPhot = fV0CFibToPhot;
935     } else {
936       lightYield = fV0ALightYield;
937       lightAttenuation = fV0ALightAttenuation;
938       nMeters = fV0AnMeters;
939       fibToPhot = fV0AFibToPhot;
940     }
941     nPhotonsInStep  = Int_t(destep / (lightYield *1e-9) );      
942     nPhotonsInStep  = gRandom->Poisson(nPhotonsInStep);
943     eloss    += destep;
944     tlength  += step;    
945     if ( gMC->IsTrackEntering() ) { 
946       nPhotons  =  nPhotonsInStep;
947       gMC->TrackPosition(fTrackPosition);
948       gMC->TrackMomentum(fTrackMomentum);
949       Float_t pt  = TMath::Sqrt( fTrackMomentum.Px() * fTrackMomentum.Px()
950                                  + fTrackMomentum.Py() * fTrackMomentum.Py() );
951       TParticle *par = gAlice->GetMCApp()->Particle(gAlice->GetMCApp()->GetCurrentTrackNumber());
952       hits[0]  = fTrackPosition.X();
953       hits[1]  = fTrackPosition.Y();
954       hits[2]  = fTrackPosition.Z();             
955       hits[3]  = Float_t (gMC->TrackPid()); 
956       hits[4]  = gMC->TrackTime();
957       hits[5]  = gMC->TrackCharge();
958       hits[6]  = fTrackMomentum.Theta()*TMath::RadToDeg();
959       hits[7]  = fTrackMomentum.Phi()*TMath::RadToDeg();
960       hits[8]  = ringNumber;
961       hits[9]  = pt;
962       hits[10] = fTrackMomentum.P();
963       hits[11] = fTrackMomentum.Px();
964       hits[12] = fTrackMomentum.Py();
965       hits[13] = fTrackMomentum.Pz();
966       hits[14] = par->Vx();
967       hits[15] = par->Vy();
968       hits[16] = par->Vz();
969       tlength  = 0.0;
970       eloss    = 0.0;       
971
972       //////////////////////////
973       ///// Display V0A geometry
974       //      if (!hitOnV0C) {
975       //        FILE *of;
976       //        of = fopen("V0A.out", "a");
977       //        // x, y, z, ringnumber, cellid
978       //        fprintf( of, "%f %f %f %f %d \n",  hits[0], hits[1], hits[2], hits[8], GetCellId (vol, hits) );
979       //        fclose(of);
980       //      }
981       //////////////////////////
982     }
983     nPhotons  = nPhotons + nPhotonsInStep;
984     if( gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()){
985       nPhotons = nPhotons - Int_t((Float_t(nPhotons) * lightAttenuation * nMeters));
986       nPhotons = nPhotons - Int_t( Float_t(nPhotons) * fibToPhot);
987       hits[17] = eloss;
988       hits[18] = tlength;
989       hits[19] = nPhotons;
990       hits[20] = GetCellId (vol, hits);
991       AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hits);
992       tlength         = 0.0;
993       eloss           = 0.0; 
994       nPhotons        = 0;
995       nPhotonsInStep  = 0;
996       numStep         = 0;  
997     }
998   }
999 }
1000
1001 //_____________________________________________________________________________
1002 void AliVZEROv7::AddHit(Int_t track, Int_t *vol, Float_t *hits)
1003 {
1004 //  Adds a VZERO hit
1005
1006   TClonesArray &lhits = *fHits;
1007   new(lhits[fNhits++]) AliVZEROhit(fIshunt,track,vol,hits);
1008 }
1009
1010 //_____________________________________________________________________________
1011 void AliVZEROv7::AddDigits(Int_t *tracks, Int_t* digits) 
1012 {
1013 //  Adds a VZERO digit
1014
1015    TClonesArray  &ldigits = *fDigits;
1016    new(ldigits[fNdigits++]) AliVZEROdigit(tracks, digits);
1017 }
1018
1019 //_____________________________________________________________________________
1020 void AliVZEROv7::MakeBranch(Option_t *option)
1021 {
1022 // Creates new branches in the current Root Tree
1023     
1024   char branchname[10];
1025   sprintf(branchname,"%s",GetName());
1026   AliDebug(2,Form("fBufferSize = %d",fBufferSize));
1027   const char *cH = strstr(option,"H");
1028   if (fHits   && TreeH() && cH) {
1029     TreeH()->Branch(branchname,&fHits, fBufferSize);
1030     AliDebug(2,Form("Making Branch %s for hits",branchname));
1031   }     
1032   const char *cD = strstr(option,"D");
1033   if (fDigits   && fLoader->TreeD() && cD) {
1034     fLoader->TreeD()->Branch(branchname,&fDigits, fBufferSize);
1035     AliDebug(2,Form("Making Branch %s for digits",branchname));
1036   }  
1037 }
1038
1039 //_____________________________________________________________________________
1040 Int_t AliVZEROv7::GetCellId(Int_t *vol, Float_t *hits) 
1041 {
1042   //   Returns Id of scintillator cell
1043   //   Right side from  0 to 47 
1044   //   Left  side from 48 to 79
1045   //   hits[8] = ring number (1 to 4)
1046   //   vol[1]  = copy number (1 to 8)
1047
1048   Int_t index      = vol[1];
1049   Int_t ringNumber = Int_t(hits[8]);
1050   fCellId          = 0;
1051
1052   Float_t phi = Float_t(TMath::ATan2(Double_t(hits[1]),Double_t(hits[0])) ); 
1053   Float_t kRaddeg = 180.0/TMath::Pi();
1054   phi = kRaddeg * phi;
1055
1056   if (index < 7) index = index + 8;
1057
1058   if (hits[2] < 0.0) {
1059     if(ringNumber < 3) {
1060       index = (index - 7) + ( ( ringNumber - 1 ) * 8);
1061     } else if (ringNumber >= 3) { 
1062       if ( gMC->CurrentVolID(vol[1]) == gMC->VolId("V0R3") || gMC->CurrentVolID(vol[1])
1063            == gMC->VolId("V0R5") )  index = (index*2-14)+((ringNumber-2)*16);
1064       if ( gMC->CurrentVolID(vol[1]) == gMC->VolId("V0R4") || gMC->CurrentVolID(vol[1])
1065            == gMC->VolId("V0R6") )  index = (index*2-13)+((ringNumber-2)*16);
1066     }
1067     fCellId   = index;           
1068   } else if (hits[2] > 0.0) {
1069     index = (index - 7 + 48) + ( ( ringNumber - 1 ) * 8);
1070     fCellId   = index;
1071   }
1072
1073   return fCellId;
1074 }