1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 #include <TParticle.h>
19 #include <TVirtualMC.h>
22 #include "AliRICHv1.h"
23 #include "AliRICHParam.h"
29 //______________________________________________________________________________
30 AliRICHv1::AliRICHv1(const char *name, const char *title)
32 {// Full version of RICH with hits and diagnostics
33 if(GetDebug())Info("named ctor","Start.");
34 if(GetDebug())Info("named ctor","Stop.");
36 //______________________________________________________________________________
37 void AliRICHv1::Init()
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()
42 //______________________________________________________________________________
43 void AliRICHv1::StepManager()
47 static Int_t iCurrentChamber;
50 static Float_t hits[22];
51 static Float_t ckovData[19];
53 Float_t pos[3],mom[4],localPos[3],localMom[4];
54 Float_t theta,phi,localTheta,localPhi;
59 static Float_t eloss, tlength;
60 const Float_t kBig=1.e10;
62 TParticle *current = (TParticle*)(*gAlice->Particles())[gAlice->GetCurrentTrackNumber()];
66 id=gMC->CurrentVolID(copy); iCurrentChamber=copy;
67 Float_t cherenkovLoss=0;
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
73 /********************Store production parameters for Cerenkov photons************************/
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();
83 ckovData[11]=gAlice->GetCurrentTrackNumber();
84 ckovData[12]=1; //Media where photon was produced 1->Freon, 2->Quarz
89 if(gMC->IsNewTrack()&&gMC->VolId("QUAR")==gMC->CurrentVolID(copy)) ckovData[12]=2;
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);
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);
104 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
106 /**********************************************************************************/
109 if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy)){ //is it in csi?
111 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
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);
125 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
127 //printf("Added One (2)!\n");
128 //printf("Lost by Fresnel\n");
130 /**********************************************************************************/
133 /********************Evaluation of losses************************/
134 /******************still in the old fashion**********************/
136 Int_t i1 = gMC->StepProcesses(procs); //number of physics mechanisms acting on the particle
137 for (Int_t i = 0; i < i1; ++i) {
139 if (procs[i] == kPLightReflection) { //was it reflected
141 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
143 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
145 } //reflection question
148 else if (procs[i] == kPLightAbsorption) { //was it absorbed?
149 //printf("Got in absorption\n");
151 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
153 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
155 if (gMC->CurrentVolID(copy) == gMC->VolId("META"))
157 if (gMC->CurrentVolID(copy) == gMC->VolId("GAP "))
160 if (gMC->CurrentVolID(copy) == gMC->VolId("SRIC"))
164 if (gMC->CurrentVolID(copy) == gMC->VolId("CSI ")) {
168 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
169 } //absorption question
172 // Photon goes out of tracking scope
173 else if (procs[i] == kPStop) { //is it below energy treshold?
176 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
177 } // energy treshold question
178 } //number of mechanisms cycle
179 /**********************End of evaluation************************/
180 }//C+E+produced in Freon
183 //*************************************End of Production Parameters Storing*********************
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);
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;
196 gMC->CurrentVolOffID(2,copy); vol[0]=copy; iCurrentChamber=vol[0];
198 gMC->Gmtod(pos,localPos,1); gMC->Gmtod(mom,localMom,2);
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];
209 destep = gMC->Edep();
210 gMC->SetMaxStep(kBig);
211 cherenkovLoss += destep;
212 ckovData[7]=cherenkovLoss;
214 GenerateFeedbacks(iCurrentChamber,cherenkovLoss);//CF+CSI+DE
216 if (fNsdigits > (Int_t)ckovData[8]) {
217 ckovData[8]= ckovData[8]+1;
218 ckovData[9]= (Float_t) fNsdigits;
221 ckovData[17] = nPads;
222 AliRICHhit *mipHit = (AliRICHhit*) (fHits->UncheckedAt(0));
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();
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);
232 coscerenkov = (mom[0]*mipPx + mom[1]*mipPy + mom[2]*mipPz)/(rt*mipRt);
235 ckovData[18]=TMath::ACos(coscerenkov);//Cerenkov angle
237 AddHit(gAlice->GetCurrentTrackNumber(),vol,ckovData);//PHOTON HIT CF+CSI+DE
238 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
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;
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);
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);
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
283 hits[6]=tlength; hits[7]=eloss;
284 if(fNsdigits > (Int_t)hits[8]) {
286 hits[9]= (Float_t) fNsdigits;
288 AddHit(gAlice->GetCurrentTrackNumber(),vol,hits);//MIP HIT MIP+GAP+Exit
290 }/*MIP+GAP+Exit*/else if(Param()->SigGenCond(localPos[0], localPos[2])){//MIP+GAP+Spec
291 Param()->SigGenInit(localPos[0], localPos[2]);
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
298 eloss = destep; tlength += step ;
299 }/*MIP+GAP+Spec*/else{//MIP+GAP+nothing special
302 }//MIP+GAP+nothing special
305 }//void AliRICHv1::StepManager()