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"
30 //______________________________________________________________________________
31 AliRICHv1::AliRICHv1(const char *name, const char *title)
33 {// Full version of RICH with hits and diagnostics
34 if(GetDebug())Info("named ctor","Start.");
35 if(GetDebug())Info("named ctor","Stop.");
37 //______________________________________________________________________________
38 void AliRICHv1::Init()
39 {//nothing to do here, all the work in ctor or CreateGeometry()
40 if(GetDebug())Info("Init","Start.");
41 if(GetDebug())Info("Init","Stop.");
42 }//void AliRICHv1::Init()
43 //______________________________________________________________________________
44 void AliRICHv1::StepManager()
48 static Int_t iCurrentChamber;
51 static Float_t hits[22];
52 static Float_t ckovData[19];
54 Float_t pos[3],mom[4],localPos[3],localMom[4];
55 Float_t theta,phi,localTheta,localPhi;
60 static Float_t eloss, tlength;
61 const Float_t kBig=1.e10;
63 TParticle *current = (TParticle*)(*gAlice->GetMCApp()->Particles())[gAlice->GetMCApp()->GetCurrentTrackNumber()];
67 id=gMC->CurrentVolID(copy); iCurrentChamber=copy;
68 Float_t cherenkovLoss=0;
70 gMC->TrackPosition(x4); pos[0]=x4(0); pos[1]=x4(1); pos[2]=x4(2);
71 ckovData[1] = pos[0]; ckovData[2] = pos[1]; ckovData[3] = pos[2];
72 ckovData[6] = 0; // dummy track length
74 /********************Store production parameters for Cerenkov photons************************/
76 if(gMC->TrackPid()==kCerenkov){//C
77 Float_t ckovEnergy = current->Energy();
78 if(ckovEnergy > 5.6e-09 && ckovEnergy < 7.8e-09 ){//C+E
79 if(gMC->IsTrackEntering()){//C+E+enter
80 if(gMC->VolId("FRE1")==gMC->CurrentVolID(copy)||gMC->VolId("FRE2")==gMC->CurrentVolID(copy)){//C+E+enter+FRE
81 if(gMC->IsNewTrack()){//C+E+enter+FRE+new
82 Int_t mother=current->GetFirstMother();
84 ckovData[11]=gAlice->GetMCApp()->GetCurrentTrackNumber();
85 ckovData[12]=1; //Media where photon was produced 1->Freon, 2->Quarz
90 if(gMC->IsNewTrack()&&gMC->VolId("QUAR")==gMC->CurrentVolID(copy)) ckovData[12]=2;
92 if(ckovData[12]==1){//C+E+produced in Freon
93 if(gMC->IsTrackEntering()){ //is track entering?
94 if (gMC->VolId("META")==gMC->CurrentVolID(copy)){ //is it in gap?
95 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
97 gMC->Gmtod(mom,localMom,2);
98 Float_t cophi = TMath::Cos(TMath::ATan2(localMom[0], localMom[1]));
99 Float_t t = (1. - .025 / cophi) * (1. - .05 / cophi);
100 /**************** Photons lost in second grid have to be calculated by hand************/
101 gMC->GetRandom()->RndmArray(1,ranf);
105 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
107 /**********************************************************************************/
110 if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy)){ //is it in csi?
112 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
114 gMC->Gmtod(mom,localMom,2);
115 /********* Photons lost by Fresnel reflection have to be calculated by hand********/
116 /***********************Cerenkov phtons (always polarised)*************************/
117 Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2];
118 Double_t localRt = TMath::Sqrt(localTc);
119 localTheta = Float_t(TMath::ATan2(localRt,Double_t(localMom[1])));
120 Double_t cotheta = TMath::Abs(cos(localTheta));
121 Float_t t = Fresnel(ckovEnergy*1e9,cotheta,1);
122 gMC->GetRandom()->RndmArray(1,ranf);
126 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
128 //printf("Added One (2)!\n");
129 //printf("Lost by Fresnel\n");
131 /**********************************************************************************/
134 /********************Evaluation of losses************************/
135 /******************still in the old fashion**********************/
137 Int_t i1 = gMC->StepProcesses(procs); //number of physics mechanisms acting on the particle
138 for (Int_t i = 0; i < i1; ++i) {
140 if (procs[i] == kPLightReflection) { //was it reflected
142 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
144 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
146 } //reflection question
149 else if (procs[i] == kPLightAbsorption) { //was it absorbed?
150 //printf("Got in absorption\n");
152 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
154 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
156 if (gMC->CurrentVolID(copy) == gMC->VolId("META"))
158 if (gMC->CurrentVolID(copy) == gMC->VolId("GAP "))
161 if (gMC->CurrentVolID(copy) == gMC->VolId("SRIC"))
165 if (gMC->CurrentVolID(copy) == gMC->VolId("CSI ")) {
169 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
170 } //absorption question
173 // Photon goes out of tracking scope
174 else if (procs[i] == kPStop) { //is it below energy treshold?
177 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
178 } // energy treshold question
179 } //number of mechanisms cycle
180 /**********************End of evaluation************************/
181 }//C+E+produced in Freon
184 //*************************************End of Production Parameters Storing*********************
186 if(gMC->TrackPid()==kCerenkov||gMC->TrackPid()==kFeedback){//CF
187 if(gMC->VolId("CSI ")==gMC->CurrentVolID(copy)){//CF+CSI
188 if(gMC->Edep()>0.){//CF+CSI+DE
189 gMC->TrackPosition(x4); pos[0]=x4(0); pos[1]=x4(1); pos[2]=x4(2);
190 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
192 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
193 Double_t rt = TMath::Sqrt(tc);
194 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
195 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
197 gMC->CurrentVolOffID(2,copy); vol[0]=copy; iCurrentChamber=vol[0];
199 gMC->Gmtod(pos,localPos,1); gMC->Gmtod(mom,localMom,2);
201 Param()->SigGenInit(localPos[0],localPos[2]);
202 ckovData[0]=gMC->TrackPid();
203 ckovData[1]=pos[0]; ckovData[2]=pos[1]; ckovData[3]=pos[2];
204 ckovData[4]=theta; ckovData[5]=phi; //theta-phi angles of incidence
205 ckovData[8]=(Float_t) fNsdigits; // first sdigit
206 ckovData[9]=-1; // last pad hit
207 ckovData[13]=4; // photon was detected
208 ckovData[14]=mom[0]; ckovData[15]=mom[1]; ckovData[16]=mom[2];
210 destep = gMC->Edep();
211 gMC->SetMaxStep(kBig);
212 cherenkovLoss += destep;
213 ckovData[7]=cherenkovLoss;
215 GenerateFeedbacks(iCurrentChamber,cherenkovLoss);//CF+CSI+DE
217 if (fNsdigits > (Int_t)ckovData[8]) {
218 ckovData[8]= ckovData[8]+1;
219 ckovData[9]= (Float_t) fNsdigits;
222 ckovData[17] = nPads;
223 AliRICHhit *mipHit = (AliRICHhit*) (fHits->UncheckedAt(0));
225 mom[0] = current->Px(); mom[1] = current->Py(); mom[2] = current->Pz();
226 Float_t mipPx = mipHit->MomX(); Float_t mipPy = mipHit->MomY(); Float_t mipPz = mipHit->MomZ();
228 Float_t r = mom[0]*mom[0] + mom[1]*mom[1] + mom[2]*mom[2];
229 Float_t rt = TMath::Sqrt(r);
230 Float_t mipR = mipPx*mipPx + mipPy*mipPy + mipPz*mipPz;
231 Float_t mipRt = TMath::Sqrt(mipR);
233 coscerenkov = (mom[0]*mipPx + mom[1]*mipPy + mom[2]*mipPz)/(rt*mipRt);
236 ckovData[18]=TMath::ACos(coscerenkov);//Cerenkov angle
238 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol,ckovData);//PHOTON HIT CF+CSI+DE
239 //AddCerenkov(gAlice->GetCurrentTrackNumber(),vol,ckovData);
242 }/*CF*/else if(gMC->TrackCharge()){//MIP
243 if(gMC->VolId("FRE1")==gMC->CurrentVolID(copy)||gMC->VolId("FRE2")==gMC->CurrentVolID(copy)){//MIP+FRE
244 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
245 hits[19]=mom[0]; hits [20] = mom[1]; hits [21] = mom[2]; fFreonProd=1;
247 if(gMC->VolId("GAP ")==gMC->CurrentVolID(copy)){//MIP+GAP
248 gMC->CurrentVolOffID(3,copy); vol[0]=copy; iCurrentChamber=vol[0];
249 gMC->TrackPosition(x4); pos[0]=x4(0); pos[1]=x4(1); pos[2]=x4(2);
250 gMC->TrackMomentum(p4); mom[0]=p4(0); mom[1]=p4(1); mom[2]=p4(2); mom[3]=p4(3);
251 gMC->Gmtod(pos,localPos,1); gMC->Gmtod(mom,localMom,2);
252 ipart =gMC->TrackPid();
253 destep = gMC->Edep();step = gMC->TrackStep();// momentum loss and steplength in last step
254 if(gMC->IsTrackEntering()){//MIP+GAP+Enter record hit when mip enters ...
255 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
256 Double_t rt = TMath::Sqrt(tc);
257 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
258 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
259 Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2];
260 Double_t localRt = TMath::Sqrt(localTc);
261 localTheta = Float_t(TMath::ATan2(localRt,Double_t(localMom[1])))*kRaddeg;
262 localPhi = Float_t(TMath::ATan2(Double_t(localMom[2]),Double_t(localMom[0])))*kRaddeg;
263 hits[0] = Float_t(ipart); // particle type
264 hits[1] = localPos[0]; hits[2] = localPos[1]; hits[3] = localPos[2];
265 hits[4] = localTheta; hits[5] = localPhi; // theta-phi angles of incidence
266 hits[8] = (Float_t) fNsdigits; // first sdigit
267 hits[9] = -1; // last pad hit
268 hits[13] = fFreonProd; // did id hit the freon?
269 hits[14] = mom[0]; hits[15] = mom[1]; hits[16] = mom[2];
270 hits[18] = 0; // dummy cerenkov angle
271 tlength = 0; eloss = 0; fFreonProd = 0;
272 C(iCurrentChamber)->LocaltoGlobal(localPos,hits+1);
274 Param()->SigGenInit(localPos[0], localPos[2]);
275 }/*MIP+GAP+Enter*/else if(gMC->IsTrackExiting()||gMC->IsTrackStop()||gMC->IsTrackDisappeared()){//MIP+GAP+Exit
276 gMC->SetMaxStep(kBig);
280 if(gMC->TrackPid() == kNeutron) printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
281 GenerateFeedbacks(iCurrentChamber,eloss);//MIP+GAP+Exit
284 hits[6]=tlength; hits[7]=eloss;
285 if(fNsdigits > (Int_t)hits[8]) {
287 hits[9]= (Float_t) fNsdigits;
289 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol,hits);//MIP HIT MIP+GAP+Exit
291 }/*MIP+GAP+Exit*/else if(Param()->SigGenCond(localPos[0], localPos[2])){//MIP+GAP+Spec
292 Param()->SigGenInit(localPos[0], localPos[2]);
294 if(gMC->TrackPid() == kNeutron) printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
295 GenerateFeedbacks(iCurrentChamber,eloss);//MIP+GAP+Spec
299 eloss = destep; tlength += step ;
300 }/*MIP+GAP+Spec*/else{//MIP+GAP+nothing special
303 }//MIP+GAP+nothing special
306 }//void AliRICHv1::StepManager()