]> git.uio.no Git - u/mrichter/AliRoot.git/blame - RICH/AliRICHv1.cxx
This class has been replaced by AliRICHRecon
[u/mrichter/AliRoot.git] / RICH / AliRICHv1.cxx
CommitLineData
c28632f0 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
c28632f0 16
237c933d 17#include <TParticle.h>
88cb7938 18#include <TRandom.h>
88cb7938 19#include <TVirtualMC.h>
d128c9d1 20#include <TPDGCode.h>
c28632f0 21
88cb7938 22#include "AliRICHv1.h"
c60862bf 23#include "AliRICHParam.h"
24#include <AliConst.h>
25#include <AliPDG.h>
26#include <AliRun.h>
c28632f0 27
d128c9d1 28ClassImp(AliRICHv1)
29//______________________________________________________________________________
c28632f0 30AliRICHv1::AliRICHv1(const char *name, const char *title)
d128c9d1 31 :AliRICH(name,title)
3ea9cb08 32{// Full version of RICH with hits and diagnostics
33 if(GetDebug())Info("named ctor","Start.");
34 if(GetDebug())Info("named ctor","Stop.");
35}//named ctor
36//______________________________________________________________________________
237c933d 37void AliRICHv1::Init()
3ea9cb08 38{//nothing to do here, all the work in ctor or CreateGeometry()
39 if(GetDebug())Info("Init","Start.");
40 if(GetDebug())Info("Init","Stop.");
41}//void AliRICHv1::Init()
d128c9d1 42//______________________________________________________________________________
43void AliRICHv1::StepManager()
44{//Full Step Manager
45
c60862bf 46 Int_t copy, id;
47 static Int_t iCurrentChamber;
48 static Int_t vol[2];
49 Int_t ipart;
50 static Float_t hits[22];
51 static Float_t ckovData[19];
52 TLorentzVector x4,p4;
53 Float_t pos[3],mom[4],localPos[3],localMom[4];
54 Float_t theta,phi,localTheta,localPhi;
55 Float_t destep, step;
56 Double_t ranf[2];
57 Int_t nPads=kBad;
58 Float_t coscerenkov;
59 static Float_t eloss, tlength;
60 const Float_t kBig=1.e10;
d128c9d1 61
c60862bf 62 TParticle *current = (TParticle*)(*gAlice->Particles())[gAlice->GetCurrentTrackNumber()];
d128c9d1 63
d128c9d1 64
65
c60862bf 66 id=gMC->CurrentVolID(copy); iCurrentChamber=copy;
67 Float_t cherenkovLoss=0;
d128c9d1 68
c60862bf 69 gMC->TrackPosition(x4); pos[0]=x4(0); pos[1]=x4(1); pos[2]=x4(2);
70 ckovData[1] = pos[0]; ckovData[2] = pos[1]; ckovData[3] = pos[2];
71 ckovData[6] = 0; // dummy track length
d128c9d1 72
73 /********************Store production parameters for Cerenkov photons************************/
853634d3 74
c60862bf 75 if(gMC->TrackPid()==kCerenkov){//C
76 Float_t ckovEnergy = current->Energy();
77 if(ckovEnergy > 5.6e-09 && ckovEnergy < 7.8e-09 ){//C+E
78 if(gMC->IsTrackEntering()){//C+E+enter
79 if(gMC->VolId("FRE1")==gMC->CurrentVolID(copy)||gMC->VolId("FRE2")==gMC->CurrentVolID(copy)){//C+E+enter+FRE
80 if(gMC->IsNewTrack()){//C+E+enter+FRE+new
81 Int_t mother=current->GetFirstMother();
82 ckovData[10]=mother;
83 ckovData[11]=gAlice->GetCurrentTrackNumber();
84 ckovData[12]=1; //Media where photon was produced 1->Freon, 2->Quarz
85 fCkovNumber++;
86 fFreonProd=1;
87 }//C+E+enter+FRE+new
88 }//C+E+enter+FRE
89 if(gMC->IsNewTrack()&&gMC->VolId("QUAR")==gMC->CurrentVolID(copy)) ckovData[12]=2;
90 }//C+E+enter
91 if(ckovData[12]==1){//C+E+produced in Freon
92 if(gMC->IsTrackEntering()){ //is track entering?
93 if (gMC->VolId("META")==gMC->CurrentVolID(copy)){ //is it in gap?
94 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
d128c9d1 95
96 gMC->Gmtod(mom,localMom,2);
97 Float_t cophi = TMath::Cos(TMath::ATan2(localMom[0], localMom[1]));
98 Float_t t = (1. - .025 / cophi) * (1. - .05 / cophi);
99 /**************** Photons lost in second grid have to be calculated by hand************/
100 gMC->GetRandom()->RndmArray(1,ranf);
101 if (ranf[0] > t) {
102 gMC->StopTrack();
103 ckovData[13] = 5;
543d5224 104 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
d128c9d1 105 }
106 /**********************************************************************************/
107 } //gap
108
c60862bf 109 if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy)){ //is it in csi?
110
111 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
d128c9d1 112
113 gMC->Gmtod(mom,localMom,2);
114 /********* Photons lost by Fresnel reflection have to be calculated by hand********/
115 /***********************Cerenkov phtons (always polarised)*************************/
116 Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2];
117 Double_t localRt = TMath::Sqrt(localTc);
118 localTheta = Float_t(TMath::ATan2(localRt,Double_t(localMom[1])));
119 Double_t cotheta = TMath::Abs(cos(localTheta));
120 Float_t t = Fresnel(ckovEnergy*1e9,cotheta,1);
121 gMC->GetRandom()->RndmArray(1,ranf);
122 if (ranf[0] < t) {
123 gMC->StopTrack();
124 ckovData[13] = 6;
543d5224 125 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
d128c9d1 126
127 //printf("Added One (2)!\n");
128 //printf("Lost by Fresnel\n");
129 }
130 /**********************************************************************************/
131 }
132 } //track entering?
d128c9d1 133 /********************Evaluation of losses************************/
134 /******************still in the old fashion**********************/
d128c9d1 135 TArrayI procs;
136 Int_t i1 = gMC->StepProcesses(procs); //number of physics mechanisms acting on the particle
137 for (Int_t i = 0; i < i1; ++i) {
138 // Reflection loss
139 if (procs[i] == kPLightReflection) { //was it reflected
140 ckovData[13]=10;
141 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
142 ckovData[13]=1;
143 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
144 ckovData[13]=2;
d128c9d1 145 } //reflection question
146
147 // Absorption loss
148 else if (procs[i] == kPLightAbsorption) { //was it absorbed?
149 //printf("Got in absorption\n");
150 ckovData[13]=20;
151 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
152 ckovData[13]=11;
153 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
154 ckovData[13]=12;
155 if (gMC->CurrentVolID(copy) == gMC->VolId("META"))
156 ckovData[13]=13;
157 if (gMC->CurrentVolID(copy) == gMC->VolId("GAP "))
158 ckovData[13]=13;
159
160 if (gMC->CurrentVolID(copy) == gMC->VolId("SRIC"))
161 ckovData[13]=15;
162
163 // CsI inefficiency
164 if (gMC->CurrentVolID(copy) == gMC->VolId("CSI ")) {
165 ckovData[13]=16;
166 }
167 gMC->StopTrack();
543d5224 168 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
d128c9d1 169 } //absorption question
170
171
172 // Photon goes out of tracking scope
173 else if (procs[i] == kPStop) { //is it below energy treshold?
174 ckovData[13]=21;
175 gMC->StopTrack();
543d5224 176 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
d128c9d1 177 } // energy treshold question
178 } //number of mechanisms cycle
179 /**********************End of evaluation************************/
c60862bf 180 }//C+E+produced in Freon
181 }//C+E
182 }//C
183//*************************************End of Production Parameters Storing*********************
d128c9d1 184
c60862bf 185 if(gMC->TrackPid()==kCerenkov||gMC->TrackPid()==kFeedback){//CF
186 if(gMC->VolId("CSI ")==gMC->CurrentVolID(copy)){//CF+CSI
187 if(gMC->Edep()>0.){//CF+CSI+DE
188 gMC->TrackPosition(x4); pos[0]=x4(0); pos[1]=x4(1); pos[2]=x4(2);
189 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
190
191 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
192 Double_t rt = TMath::Sqrt(tc);
193 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
194 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
d128c9d1 195
c60862bf 196 gMC->CurrentVolOffID(2,copy); vol[0]=copy; iCurrentChamber=vol[0];
197
198 gMC->Gmtod(pos,localPos,1); gMC->Gmtod(mom,localMom,2);
d128c9d1 199
c60862bf 200 Param()->SigGenInit(localPos[0],localPos[2]);
201 ckovData[0]=gMC->TrackPid();
202 ckovData[1]=pos[0]; ckovData[2]=pos[1]; ckovData[3]=pos[2];
203 ckovData[4]=theta; ckovData[5]=phi; //theta-phi angles of incidence
204 ckovData[8]=(Float_t) fNsdigits; // first sdigit
205 ckovData[9]=-1; // last pad hit
206 ckovData[13]=4; // photon was detected
207 ckovData[14]=mom[0]; ckovData[15]=mom[1]; ckovData[16]=mom[2];
d128c9d1 208
c60862bf 209 destep = gMC->Edep();
210 gMC->SetMaxStep(kBig);
211 cherenkovLoss += destep;
212 ckovData[7]=cherenkovLoss;
d128c9d1 213
c60862bf 214 GenerateFeedbacks(iCurrentChamber,cherenkovLoss);//CF+CSI+DE
d128c9d1 215
c60862bf 216 if (fNsdigits > (Int_t)ckovData[8]) {
217 ckovData[8]= ckovData[8]+1;
218 ckovData[9]= (Float_t) fNsdigits;
219 }
d128c9d1 220
c60862bf 221 ckovData[17] = nPads;
222 AliRICHhit *mipHit = (AliRICHhit*) (fHits->UncheckedAt(0));
223 if(mipHit){
224 mom[0] = current->Px(); mom[1] = current->Py(); mom[2] = current->Pz();
225 Float_t mipPx = mipHit->MomX(); Float_t mipPy = mipHit->MomY(); Float_t mipPz = mipHit->MomZ();
d128c9d1 226
c60862bf 227 Float_t r = mom[0]*mom[0] + mom[1]*mom[1] + mom[2]*mom[2];
228 Float_t rt = TMath::Sqrt(r);
229 Float_t mipR = mipPx*mipPx + mipPy*mipPy + mipPz*mipPz;
230 Float_t mipRt = TMath::Sqrt(mipR);
231 if((rt*mipRt) > 0)
232 coscerenkov = (mom[0]*mipPx + mom[1]*mipPy + mom[2]*mipPz)/(rt*mipRt);
233 else
234 coscerenkov = 0;
235 ckovData[18]=TMath::ACos(coscerenkov);//Cerenkov angle
236 }
237 AddHit(gAlice->GetCurrentTrackNumber(),vol,ckovData);//PHOTON HIT CF+CSI+DE
543d5224 238 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
c60862bf 239 }//CF+CSI+DE
240 }//CF+CSI
241 }/*CF*/else if(gMC->TrackCharge()){//MIP
242 if(gMC->VolId("FRE1")==gMC->CurrentVolID(copy)||gMC->VolId("FRE2")==gMC->CurrentVolID(copy)){//MIP+FRE
243 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
244 hits[19]=mom[0]; hits [20] = mom[1]; hits [21] = mom[2]; fFreonProd=1;
245 }//MIP+FRE
246 if(gMC->VolId("GAP ")==gMC->CurrentVolID(copy)){//MIP+GAP
247 gMC->CurrentVolOffID(3,copy); vol[0]=copy; iCurrentChamber=vol[0];
248 gMC->TrackPosition(x4); pos[0]=x4(0); pos[1]=x4(1); pos[2]=x4(2);
249 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
250 gMC->Gmtod(pos,localPos,1); gMC->Gmtod(mom,localMom,2);
251 ipart =gMC->TrackPid();
252 destep = gMC->Edep();step = gMC->TrackStep();// momentum loss and steplength in last step
253 if(gMC->IsTrackEntering()){//MIP+GAP+Enter record hit when mip enters ...
254 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
255 Double_t rt = TMath::Sqrt(tc);
256 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
257 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
258 Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2];
259 Double_t localRt = TMath::Sqrt(localTc);
260 localTheta = Float_t(TMath::ATan2(localRt,Double_t(localMom[1])))*kRaddeg;
261 localPhi = Float_t(TMath::ATan2(Double_t(localMom[2]),Double_t(localMom[0])))*kRaddeg;
262 hits[0] = Float_t(ipart); // particle type
263 hits[1] = localPos[0]; hits[2] = localPos[1]; hits[3] = localPos[2];
264 hits[4] = localTheta; hits[5] = localPhi; // theta-phi angles of incidence
265 hits[8] = (Float_t) fNsdigits; // first sdigit
266 hits[9] = -1; // last pad hit
267 hits[13] = fFreonProd; // did id hit the freon?
268 hits[14] = mom[0]; hits[15] = mom[1]; hits[16] = mom[2];
269 hits[18] = 0; // dummy cerenkov angle
270 tlength = 0; eloss = 0; fFreonProd = 0;
271 C(iCurrentChamber)->LocaltoGlobal(localPos,hits+1);
272
273 Param()->SigGenInit(localPos[0], localPos[2]);
274 }/*MIP+GAP+Enter*/else if(gMC->IsTrackExiting()||gMC->IsTrackStop()||gMC->IsTrackDisappeared()){//MIP+GAP+Exit
275 gMC->SetMaxStep(kBig);
276 eloss += destep;
277 tlength += step;
278 if (eloss > 0) {
279 if(gMC->TrackPid() == kNeutron) printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
280 GenerateFeedbacks(iCurrentChamber,eloss);//MIP+GAP+Exit
281 hits[17] = nPads;
282 }
283 hits[6]=tlength; hits[7]=eloss;
284 if(fNsdigits > (Int_t)hits[8]) {
285 hits[8]= hits[8]+1;
286 hits[9]= (Float_t) fNsdigits;
287 }
288 AddHit(gAlice->GetCurrentTrackNumber(),vol,hits);//MIP HIT MIP+GAP+Exit
289 eloss = 0;
290 }/*MIP+GAP+Exit*/else if(Param()->SigGenCond(localPos[0], localPos[2])){//MIP+GAP+Spec
291 Param()->SigGenInit(localPos[0], localPos[2]);
292 if(eloss>0){
293 if(gMC->TrackPid() == kNeutron) printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
294 GenerateFeedbacks(iCurrentChamber,eloss);//MIP+GAP+Spec
295 hits[17] = nPads;
296 }
297
298 eloss = destep; tlength += step ;
299 }/*MIP+GAP+Spec*/else{//MIP+GAP+nothing special
300 eloss += destep;
301 tlength += step ;
302 }//MIP+GAP+nothing special
303 }//MIP+GAP
304 }//MIP
d128c9d1 305}//void AliRICHv1::StepManager()