dependence on reference point removed
[u/mrichter/AliRoot.git] / T0 / AliT0v2.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 // T0 ( T-zero) detector  version 0                        //
21 //
22 //Begin Html       
23 /*
24 <img src="gif/AliT0v2Class.gif">
25 */
26 //End Html
27 //                                                                  //
28 //                                                                  //
29 //////////////////////////////////////////////////////////////////////
30
31 #define RIGHT_ARRAY             1
32 #define LEFT_ARRAY              2
33
34 #include <Riostream.h>
35 #include <stdlib.h>
36
37 #include <TGeometry.h>
38 #include <TLorentzVector.h>
39 #include <TMath.h>
40 #include <TNode.h>
41 #include <TTUBE.h>
42 #include <TVirtualMC.h>
43
44 #include "AliMagF.h"
45 #include "AliRun.h"
46 #include "AliT0hit.h"
47 #include "AliT0v2.h"
48 #include "AliMC.h"
49 //#include "AliT0hitPhoton.h"
50 //#include "TGeant3.h"
51
52 ClassImp(AliT0v2)
53
54
55 //////////////////////////////////////////////////////////////////////
56 // Standart constructor for T0 Detector version 2
57 //////////////////////////////////////////////////////////////////////
58 AliT0v2::AliT0v2(const char *name, const char *title):
59  AliT0(name,title)
60 {
61   fIdSens1 = 0;
62 //  setBufferSize(128000);
63 }
64
65
66 //////////////////////////////////////////////////////////////////////
67 // Create the geometry of T0 Detector version 2
68 //////////////////////////////////////////////////////////////////////
69 void AliT0v2::CreateGeometry()
70 {
71   /*
72      <img src="gif/AliT0v2.gif">
73   */
74
75   Int_t         *idtmed;
76   Int_t         idrotm[999];
77   Int_t         i, j;
78   Float_t       x, y, z;
79   Float_t       zRight;
80   Float_t       zLeft;
81   Float_t       phi[3];
82   Float_t       theta;
83   Double_t      angel;
84   
85   Float_t       pstart[3]       = {4.5,  10.7,   5.3};
86   Float_t       pinstart[3]     = {0.,    1.31,  5.25};
87   Float_t       ppmt[3]         = {0.,    1.31,  3.5};
88   Float_t       ptop[3]         = {0.,    1.3,   1.5};
89 //  Float_t     preg[3]         = {0.,    1.3,   0.005};
90   Float_t       preg[3]         = {0.,    0.875, 0.005};
91   Float_t       pdes[3]         = {0.875, 1.3,   0.005};
92
93
94   zRight = 75.;
95   zLeft  = 350.;
96   theta  = (180 / TMath::Pi()) * TMath::ATan(6.5 / zRight);
97   angel  = 2 * TMath::Pi() / 12;
98   idtmed = fIdtmed->GetArray();
99     
100
101   AliMatrix (idrotm[901], 90., 0., 90., 90., 180., 0.);
102     
103   gMC->Gsvolu ("0RST", "TUBE", idtmed[3], pstart, 3);
104   gMC->Gsvolu ("0LST", "TUBE", idtmed[3], pstart, 3);
105   gMC->Gspos ("0RST", 1, "ALIC", 0., 0., -zRight, 0, "ONLY");
106   gMC->Gspos ("0LST", 1, "ALIC", 0., 0., zLeft, idrotm[901], "ONLY");
107
108 //  12 unit: PMT + divider
109   gMC->Gsvolu("0INS", "TUBE", idtmed[3], pinstart, 3);   
110   z = 0;
111   for (i = 0; i < 12; i++)
112   {
113      x = 6.5 * TMath::Sin(i * angel);
114      y = 6.5 * TMath::Cos(i * angel);
115         
116      phi[0] = -30 * i;
117      phi[1] = 90 - i * 30;
118      phi[2] = 90 - i * 30;
119      for (j = 0; j < 3; j++)
120         if (phi[j] < 0)  phi[j] += 360;
121         
122      AliMatrix (idrotm[902 + i], 90.,         phi[0],
123                                  90. + theta, phi[1],
124                                  theta,       phi[2]);  
125
126      gMC->Gspos ("0INS", i + 1, "0RST", x, y, z, idrotm[902 + i], "ONLY");
127      gMC->Gspos ("0INS", i + 13, "0LST", x, y, z, 0, "ONLY");
128   }
129
130   gMC->Gsvolu ("0PMT", "TUBE", idtmed[1], ppmt, 3);     
131   x = y = 0;      
132   z = -pinstart[2] + ppmt[2];
133   gMC->Gspos ("0PMT", 1, "0INS", x, y, z, 0, "ONLY");
134     
135 // PMT
136   // Entry window (glass)
137   gMC->Gsvolu ("0TOP", "TUBE", idtmed[6], ptop, 3);
138   z = -ppmt[2] + ptop[2];
139   gMC->Gspos ("0TOP", 1, "0PMT", 0, 0, z, 0, "ONLY");
140
141   gMC->Gsvolu ("0REG", "TUBE", idtmed[6], preg, 3);
142   z = -ppmt[2] + 2 * ptop[2] + preg[2];
143   gMC->Gspos ("0REG", 1, "0PMT", 0, 0, z, 0, "ONLY");
144
145   gMC->Gsvolu ("0DES", "TUBE", idtmed[6], pdes, 3);
146   z = -ppmt[2] + 2 * ptop[2] + preg[2];
147   gMC->Gspos ("0DES", 1, "0PMT", 0, 0, z, 0, "ONLY");
148 }   
149  
150
151 //////////////////////////////////////////////////////////////////////
152 // Definition of avaible T0 materials
153 //////////////////////////////////////////////////////////////////////
154 void AliT0v2::CreateMaterials()
155 {
156    Int_t isxfld   = gAlice->Field()->Integ();
157    Float_t sxmgmx = gAlice->Field()->Max();
158    
159    Float_t a, z, d, radl, absl, buf[1];
160    Int_t nbuf;
161
162 // Scintillator CH
163    Float_t      ascin[2] = {1.01, 12.01};
164    Float_t      zscin[2] = {1.,    6.};
165    Float_t      wscin[2] = {1.,    1.};
166    Float_t      denscin  = 1.03;
167    
168 // PMT glass SiO2
169    Float_t      aglass[2] = {28.0855, 15.9994};
170    Float_t      zglass[2] = {14.,      8.};
171    Float_t      wglass[2] = { 1.,      2.};
172    Float_t      dglass    = 2.65;
173    
174 // Ceramic   97.2% Al2O3 , 2.8% SiO2
175    Float_t      acer[2], zcer[2];
176    Float_t      wcer[2]    = { 0.972,     0.028};
177    Float_t      aal2o3[2]  = {26.981539, 15.9994 };
178    Float_t      zal2o3[2]  = {13.,        8.};
179    Float_t      wal2o3[2]  = { 2.,        3.};
180    Float_t      denscer    = 3.6;
181
182 // Brass 80% Cu, 20% Zn
183    Float_t abrass[2] = {63.546, 65.39};
184    Float_t zbrass[2] = {29.,    30.};
185    Float_t wbrass[2] = { 0.8,    0.2};
186    Float_t denbrass  = 8.96;
187
188 //Ribber C6H12S
189    Float_t aribber[3] = {12.,  1., 32.};
190    Float_t zribber[3] = { 6.,  1., 16.};
191    Float_t wribber[3] = { 6., 12.,  1.};
192    Float_t denribber  = 0.8;
193    
194     
195    AliMaterial (0, "T0 Steel$", 55.850, 26., 7.87, 1.76, 999);
196    AliMaterial (1, "T0 Vacuum$", 1.e-16, 1.e-16, 1.e-16, 1.e16, 999);
197    AliMaterial (2, "T0 Air$", 14.61, 7.3, .001205, 30423., 999); 
198    
199    AliMixture (3, "Al2O3   $", aal2o3, zal2o3, denscer, -2, wal2o3);
200    AliMixture (4, "PMT glass   $", aglass, zglass, dglass, -2, wglass);
201    char namate[21]="";
202    gMC->Gfmate ((*fIdmate)[3], namate, a, z, d, radl, absl, buf, nbuf);
203    acer[0] = a;
204    zcer[0] = z;
205    gMC->Gfmate ((*fIdmate)[4], namate, a, z, d, radl, absl, buf, nbuf);
206    acer[1] = a;
207    zcer[1] = z;
208    
209    AliMixture (5, "Scintillator$",ascin,zscin,denscin,-2,wscin);
210    AliMixture (6, "Brass    $", abrass, zbrass, denbrass, 2, wbrass);
211    AliMixture (7, "Ribber $",aribber,zribber,denribber,-3,wribber);
212    AliMixture (9, "Ceramic    $", acer, zcer, denscer, 2, wcer);
213    
214    AliMedium (1, "T0 Air$", 2, 0, isxfld, sxmgmx, 10., .1, 1., .003, .003);
215    AliMedium (2, "Scintillator$", 5, 1, isxfld, sxmgmx, 10., .01, 1., .003, .003);
216    AliMedium (3, "Vacuum$", 1, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
217    AliMedium (4, "Ceramic$", 9, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
218    AliMedium (6, "Glass$", 4, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
219    AliMedium (8, "Steel$", 0, 0, isxfld, sxmgmx, 1., .001, 1., .001, .001);
220    AliMedium (9, "Ribber  $", 7, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
221    AliMedium(11, "Brass  $", 6, 0, isxfld, sxmgmx, 10., .01, .1, .003, .003);
222 }
223
224
225 //////////////////////////////////////////////////////////////////////
226 // Draw a shaded view of the Forward multiplicity detector version 2
227 //////////////////////////////////////////////////////////////////////
228 void AliT0v2::DrawModule() const
229 {  
230   //Set ALIC mother transparent
231   gMC->Gsatt ("ALIC", "SEEN", 0);
232
233   //Set volumes visible
234   gMC->Gsatt ("0STA", "SEEN", 0);
235   gMC->Gsatt ("0PMT", "SEEN", 1);
236   gMC->Gsatt ("0DIV", "SEEN", 1);
237
238   gMC->Gdopt ("hide", "on");
239   gMC->Gdopt ("shad", "on");
240   gMC->SetClipBox (".");
241   gMC->SetClipBox ("*", 0, 1000, -1000, 1000, -1000, 1000);
242   gMC->DefaultRange();
243   gMC->Gdraw ("alic", 40, 30, 0, 12, 9.5, 0.7, 0.7);
244   gMC->Gdhead (1111, "T-Zero detector");
245   gMC->Gdopt ("hide", "off");
246 }
247
248 //////////////////////////////////////////////////////////////////////
249 // Definition of optical properties for the Forward Multiplicity Detector
250 //////////////////////////////////////////////////////////////////////
251 void AliT0v2::DefineOpticalProperties()
252 {
253 // Optical properties definition.
254 // Definition Cherenkov parameters
255   const Int_t NUMENTRIES = 32;
256
257   Float_t ppckov[NUMENTRIES] =
258             { 2.034E-9, 2.068E-9, 2.103E-9, 2.139E-9,
259               2.177E-9, 2.216E-9, 2.256E-9, 2.298E-9,
260               2.341E-9, 2.386E-9, 2.433E-9, 2.481E-9,
261               2.532E-9, 2.585E-9, 2.640E-9, 2.697E-9,
262               2.757E-9, 2.820E-9, 2.885E-9, 2.954E-9,
263               3.026E-9, 3.102E-9, 3.181E-9, 3.265E-9,
264               3.353E-9, 3.446E-9, 3.545E-9, 3.649E-9,
265               3.760E-9, 3.877E-9, 4.002E-9, 4.136E-9 };
266
267   Float_t rindex_qwarz[NUMENTRIES] =
268             { 1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458,
269               1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458,
270               1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458,
271               1.458, 1.458, 1.458, 1.458, 1.458, 1.458, 1.458,
272               1.458, 1.458, 1.458, 1.458 };
273
274   Float_t rindex_air[NUMENTRIES] =
275             { 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
276               1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
277               1., 1., 1., 1. };
278
279   Float_t effic_all[NUMENTRIES] =
280             { 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
281               1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
282               1., 1., 1., 1. };
283               
284   Float_t absor_qwarz[NUMENTRIES] =
285             { 2000., 2000., 2000., 2000., 2000., 2000., 2000., 
286               2000., 2000., 2000., 2000., 2000., 2000., 2000.,
287               2000., 2000., 2000., 2000., 2000., 2000., 2000.,
288               2000., 2000., 2000., 2000., 2000., 2000., 2000.,
289               2000., 2000., 2000., 2000. };
290
291   Float_t absor_air[NUMENTRIES] =
292             { 200., 200., 200., 200., 200., 200., 200., 
293               200., 200., 200., 200., 200., 200., 200.,
294               200., 200., 200., 200., 200., 200., 200.,
295               200., 200., 200., 200., 200., 200., 200.,
296               200., 200., 200., 200. };
297    
298   Int_t *idtmed = fIdtmed->GetArray();
299
300    gMC->SetCerenkov (idtmed[6], NUMENTRIES, ppckov, absor_qwarz, effic_all, rindex_qwarz);
301    gMC->SetCerenkov (idtmed[1], NUMENTRIES, ppckov, absor_air, effic_all, rindex_air);
302 }
303
304 //////////////////////////////////////////////////////////////////////
305 // Initialises version 2 of the Forward Multiplicity Detector
306 //////////////////////////////////////////////////////////////////////
307 void AliT0v2::Init()
308 {
309   AliT0::Init();
310   fIdSens1 = gMC->VolId ("0REG");
311   printf ("*** T0 version 2 initialized ***\n");
312 }
313
314
315 //////////////////////////////////////////////////////////////////////
316 // Called for every step in the T0 Detector
317 //////////////////////////////////////////////////////////////////////
318 void AliT0v2::StepManager()
319 {
320   Int_t                         id;
321   Int_t                         copy;
322 //  Int_t                               copy1;
323   Float_t                       xyz[3];
324   Float_t                       XYZ[3];
325   Float_t                       hitPhoton[6];
326   static Float_t                hits[7];
327   static Float_t                edep;
328   static Int_t                  vol[2];
329   TLorentzVector                pos;
330   TLorentzVector                mom;
331   
332   
333   if(!gMC->IsTrackAlive()) return; // particle has disappeared
334
335 //  TGeant3  *g3 = (TGeant3*) gMC;
336 //  g3->Gpcxyz();
337
338   TClonesArray  &lhits = *fHits;
339
340
341 ///////////////////////////////////////////////
342 // If particles is photon then ...
343
344   if (gMC->TrackPid() == 50000050)
345   {
346      id = gMC->CurrentVolID(copy);
347
348      // Check the sensetive volume
349      if (id == fIdSens1) 
350      {
351         if (gMC->IsTrackEntering()) 
352         {
353            gMC->CurrentVolOffID(2,copy);
354            if (copy < 13) 
355              {
356                vol[0] = RIGHT_ARRAY;
357                vol[1] = copy;
358              }
359            else 
360              {
361                vol[0] = LEFT_ARRAY;
362                vol[1] = copy - 12;
363              }
364
365            gMC->TrackPosition(pos);
366            gMC->TrackMomentum(mom);
367            XYZ[0] = pos[0];
368            XYZ[1] = pos[1];
369            XYZ[2] = pos[2];
370            gMC->Gmtod (XYZ, xyz, 1);
371
372            hitPhoton[0] = sqrt (xyz[0] * xyz[0] + xyz[1] * xyz[1]);
373            hitPhoton[1] = mom[0];
374            hitPhoton[2] = mom[1];
375            hitPhoton[3] = mom[2];
376            hitPhoton[4] = 1e9 * gMC->TrackTime();
377            hitPhoton[5] = 1e9 * gMC->Etot();
378            
379            AddHitPhoton (gAlice->GetMCApp()->GetCurrentTrackNumber(), vol, hitPhoton);
380         }
381         gMC->StopTrack();
382      }
383      else  
384         if (id == gMC->VolId ("0DES"))  gMC->StopTrack();
385   }
386
387 // end photon particalary
388 ///////////////////////////////////////////////
389
390
391 ///////////////////////////////////////////////
392 // If particles is charge then ...
393  
394   // Float_t charge = gMC->TrackCharge();
395   //  if(TMath::Abs(charge) <= 0.) return;
396   id = gMC->CurrentVolID(copy);
397
398   
399   //  printf("gMC->ckine->ipart %d",gMC->ckine->ipart);
400   // Check the sensetive volume
401   if(id==gMC->VolId("0TOP") ) {
402     if(gMC->IsTrackEntering()) {
403       gMC->CurrentVolOffID(2,copy);
404       if (copy < 13) 
405         {
406           vol[0] = RIGHT_ARRAY;
407           vol[1] = copy;
408         }
409       else 
410         {
411           vol[0] = LEFT_ARRAY;
412           vol[1] = copy - 12;
413         }
414       
415       gMC->TrackPosition(pos);
416       hits[0] = pos[0];
417       hits[1] = pos[1];
418       hits[2] = pos[2];
419       Float_t etot = gMC->Etot();
420       hits[4] = etot;
421       Int_t part = gMC->TrackPid();
422       hits[5] = part;
423       Float_t ttime = gMC->TrackTime();
424       hits[6] = ttime*1e9;
425       edep = 0;
426     }
427     if(gMC->IsTrackInside())    {
428       Float_t de = gMC->Edep(); 
429       edep = edep + de;
430       //       printf ("E deposition %f\n",edep);
431       //    for (i=0; i<=6; i++){
432       //    printf(" HITS on T0 inside %f\n",hits[i]); } 
433     }
434     if(gMC->IsTrackExiting())   {
435       Float_t de = gMC->Edep(); 
436       edep = edep + de;
437       hits[3] = edep * 1e3;
438
439       //       for (i=0; i<=6; i++){
440       //         printf(" HITS on T0 Exit %f\n",hits[i]); } 
441       //for (i=0; i<=1; i++) { printf("T0 vol %d\n",vol[i]);}
442      
443       new(lhits[fNhits++]) AliT0hit(fIshunt,gAlice->GetMCApp()->GetCurrentTrackNumber(),vol,hits);      
444     }
445   }
446
447 // end charge particles particalary
448 ///////////////////////////////////////////////
449
450 }