This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / ITS / AliITSv5.cxx
1 ///////////////////////////////////////////////////////////////////////////////
2 //                                                                           //
3 //  Inner Traking System version 5                                           //
4 //  This class contains the base procedures for the Inner Tracking System    //
5 //                                                                           //
6 //Begin_Html
7 /*
8 <img src="gif/AliITSv5Class.gif">
9 </pre>
10 <br clear=left>
11 <font size=+2 color=red>
12 <p>The responsible person for this module is
13 <a href="mailto:roberto.barbera@ct.infn.it">Roberto Barbera</a>.
14 </font>
15 <pre>
16 */
17 //End_Html
18 //                                                                           //
19 ///////////////////////////////////////////////////////////////////////////////
20
21 #include <stdio.h> 
22
23 #include <TMath.h>
24 #include "AliITSv5.h"
25 #include "AliRun.h"
26 #include "stdlib.h"
27 #include "TSystem.h"
28 #include "TGeant3.h"
29
30 ClassImp(AliITSv5)
31  
32 //_____________________________________________________________________________
33 AliITSv5::AliITSv5() : AliITS() 
34 {
35   //
36   // Default constructor for the ITS
37   //
38 }
39  
40 //_____________________________________________________________________________
41 AliITSv5::AliITSv5(const char *name, const char *title)
42   : AliITS(name, title)
43 {
44   //
45   // Standard constructor for the ITS
46   //
47   fEuclidMaterial="$(ALICE_ROOT)/ITSgeometry_60.tme";
48   fEuclidGeometry="$(ALICE_ROOT)/ITSgeometry_60.euc";
49 }
50
51  
52 //_____________________________________________________________________________
53 void AliITSv5::CreateMaterials()
54 {
55   //
56   // Read materials for the ITS
57   //
58   FILE *file = fopen(fEuclidMaterial.Data(),"r");
59   if(file) {
60     fclose(file);
61     gAlice->ReadEuclidMedia(fEuclidMaterial.Data(),2);
62   } else {
63     Error("CreateMaterials"," THE MEDIA FILE %s DOES NOT EXIST !",fEuclidMaterial.Data());
64     exit(1);
65   }
66 }
67
68 //_____________________________________________________________________________
69 void AliITSv5::CreateGeometry()
70 {
71   //
72   // Read geometry for the ITS
73   //
74
75   AliMC* pMC = AliMC::GetMC();
76   
77   char topvol[5];
78   char *filtmp;
79 //
80   filtmp=gSystem->ExpandPathName(fEuclidGeometry.Data());
81   FILE *file = fopen(filtmp,"r");
82   delete [] filtmp;
83   if(file) {
84     fclose(file);
85     gAlice->ReadEuclid(fEuclidGeometry.Data(),2,topvol);
86   } else {
87     Error("CreateGeometry"," THE GEOM FILE %s DOES NOT EXIST !",fEuclidGeometry.Data());
88     exit(1);
89   }
90   //
91   // --- Place the ITS ghost volume ITSV in its mother volume (ALIC) and make it
92   //     invisible
93   //
94   pMC->Gspos("ITSV",1,"ALIC",0,0,0,0,"ONLY");
95   //
96   // --- Outputs the geometry tree in the EUCLID/CAD format
97   
98     if (fEuclidOut) {
99       pMC->WriteEuclid("ITSgeometry", "ITSV", 1, 5);
100     }
101 }
102
103 //_____________________________________________________________________________
104 void AliITSv5::Init()
105 {
106   //
107   // Initialise the ITS after it has been created
108   //
109   AliITS::Init();
110
111  
112 //_____________________________________________________________________________
113 void AliITSv5::StepManager()
114 {
115   //
116   // Called for every step in the ITS
117   //
118   Int_t         copy, id;
119   Int_t         copy1,copy2;
120   Float_t       hits[7];
121   Int_t         vol[3];
122   Float_t       position[3];
123   Float_t       momentum[4];
124   TClonesArray &lhits = *fHits;
125   AliMC* pMC = AliMC::GetMC();
126   //
127   if(pMC->TrackCharge() && pMC->Edep()) {
128     //
129     // Only entering charged tracks
130     if((id=pMC->CurrentVol(0,copy))==fIdSens1) {  
131       vol[0]=1;
132       id=pMC->CurrentVolOff(0,0,copy);        //detector copy in the ladder = 1<->4  (ITS1)
133       vol[1]=copy;
134       pMC->CurrentVolOff(1,0,copy1);      //ladder copy in the module   = 1<->2  (I186)
135       pMC->CurrentVolOff(2,0,copy2);      //module copy in the layer    = 1<->10 (I132)
136       vol[2]=copy1+(copy2-1)*2;               //# of ladders in one module  = 2          
137     } else if(id==fIdSens2) {
138       vol[0]=2;
139       id=pMC->CurrentVolOff(0,0,copy);        //detector copy in the ladder = 1<->4  (ITS2)        
140       vol[1]=copy;
141       pMC->CurrentVolOff(1,0,copy1);      //ladder copy in the module   = 1<->4  (I131)
142       pMC->CurrentVolOff(2,0,copy2);      //module copy in the layer    = 1<->10 (I132)
143       vol[2]=copy1+(copy2-1)*4;                   //# of ladders in one module  = 4   
144     } else if(id==fIdSens3) {
145       vol[0]=3;
146       id=pMC->CurrentVolOff(1,0,copy);        //detector copy in the ladder = 1<->5  (ITS3 is inside I314)
147       vol[1]=copy;
148       id=pMC->CurrentVolOff(2,0,copy);        //ladder copy in the layer    = 1<->12 (I316)
149       vol[2]=copy;             
150     } else if(id==fIdSens4) {
151       vol[0]=4;
152       id=pMC->CurrentVolOff(1,0,copy);        //detector copy in the ladder = 1<->8  (ITS4 is inside I414)
153       vol[1]=copy;
154       id=pMC->CurrentVolOff(2,0,copy);        //ladder copy in the layer    = 1<->22 (I417)
155       vol[2]=copy;               
156     } else if(id==fIdSens5) {
157       vol[0]=5;
158       id=pMC->CurrentVolOff(1,0,copy);        //detector copy in the ladder = 1<->23  (ITS5 is inside I562)       
159       vol[1]=copy;
160       id=pMC->CurrentVolOff(2,0,copy);        //ladder copy in the layer    = 1<->34 (I565)
161       vol[2]=copy;               
162     } else if(id==fIdSens6) {
163       vol[0]=6;
164       id=pMC->CurrentVolOff(1,0,copy);        //detector copy in the ladder = 1<->26  (ITS6 is inside I566)       
165       vol[1]=copy;
166       id=pMC->CurrentVolOff(2,0,copy);        //ladder copy in the layer    = 1<->38 (I569)
167       vol[2]=copy;                      
168     } else return;
169     pMC->TrackPosition(position);
170     pMC->TrackMomentum(momentum);
171     hits[0]=position[0];
172     hits[1]=position[1];
173     hits[2]=position[2];          
174     hits[3]=momentum[0]*momentum[3];
175     hits[4]=momentum[1]*momentum[3];
176     hits[5]=momentum[2]*momentum[3];        
177     hits[6]=pMC->Edep();
178     new(lhits[fNhits++]) AliITShit(fIshunt,gAlice->CurrentTrack(),vol,hits);
179   }      
180 }