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 | |
16 | /* |
17 | $Log$ |
bef02574 |
18 | Revision 1.3 2000/06/13 13:06:38 jbarbosa |
19 | Fixed compiling error for HP (multiple declaration) |
20 | |
7f36f6bc |
21 | Revision 1.2 2000/06/12 15:36:16 jbarbosa |
22 | Cleaned up version. |
23 | |
237c933d |
24 | Revision 1.1 2000/06/09 15:00:31 jbarbosa |
25 | New full version. All parameters configurable. |
26 | |
c28632f0 |
27 | Revision 1.9 2000/05/31 08:19:38 jbarbosa |
28 | Fixed bug in StepManager |
29 | |
30 | Revision 1.8 2000/05/26 17:30:08 jbarbosa |
31 | Cerenkov angle now stored within cerenkov data structure. |
32 | |
33 | Revision 1.7 2000/05/18 10:31:36 jbarbosa |
34 | Fixed positioning of spacers inside freon. |
35 | Fixed positioning of proximity gap |
36 | inside methane. |
37 | Fixed cut on neutral particles in the StepManager. |
38 | |
39 | Revision 1.6 2000/04/28 11:51:58 morsch |
40 | Dimensions of arrays hits and Ckov_data corrected. |
41 | |
42 | Revision 1.5 2000/04/19 13:28:46 morsch |
43 | Major changes in geometry (parametrised), materials (updated) and |
44 | step manager (diagnostics) (JB, AM) |
45 | |
46 | */ |
47 | |
48 | |
49 | |
50 | ////////////////////////////////////////////////////////// |
51 | // Manager and hits classes for set: RICH full version // |
52 | ////////////////////////////////////////////////////////// |
53 | |
54 | #include <TTUBE.h> |
55 | #include <TNode.h> |
56 | #include <TRandom.h> |
237c933d |
57 | #include <TParticle.h> |
c28632f0 |
58 | |
59 | #include "AliRICHv1.h" |
237c933d |
60 | #include "AliRICHHit.h" |
c28632f0 |
61 | #include "AliRun.h" |
62 | #include "AliMC.h" |
63 | #include "iostream.h" |
64 | #include "AliCallf77.h" |
65 | #include "AliConst.h" |
66 | #include "AliPDG.h" |
67 | #include "TGeant3.h" |
68 | |
69 | ClassImp(AliRICHv1) |
70 | |
71 | //___________________________________________ |
72 | AliRICHv1::AliRICHv1() : AliRICHv0() |
73 | { |
237c933d |
74 | |
75 | // Default constructor fo AliRICHvv1 (full version) |
76 | |
c28632f0 |
77 | //fChambers = 0; |
78 | } |
79 | |
80 | //___________________________________________ |
81 | AliRICHv1::AliRICHv1(const char *name, const char *title) |
82 | : AliRICHv0(name,title) |
83 | { |
c28632f0 |
84 | |
237c933d |
85 | // Full version of RICH with hits and diagnostics |
86 | |
87 | fCkovNumber=0; |
88 | fFreonProd=0; |
bef02574 |
89 | |
237c933d |
90 | fChambers = new TObjArray(kNCH); |
bef02574 |
91 | for (Int_t i=0; i<kNCH; i++) { |
c28632f0 |
92 | |
93 | (*fChambers)[i] = new AliRICHChamber(); |
94 | |
95 | } |
96 | } |
97 | |
237c933d |
98 | void AliRICHv1::Init() |
99 | { |
100 | |
101 | printf("*********************************** RICH_INIT ***********************************\n"); |
102 | printf("* *\n"); |
103 | printf("* AliRICHv1 Configurable version started *\n"); |
104 | printf("* *\n"); |
105 | |
106 | |
107 | AliRICHSegmentation* segmentation; |
108 | AliRICHGeometry* geometry; |
109 | AliRICHResponse* response; |
110 | |
111 | |
112 | // |
113 | // Initialize Tracking Chambers |
114 | // |
bef02574 |
115 | for (Int_t i=1; i<kNCH; i++) { |
237c933d |
116 | //printf ("i:%d",i); |
117 | ( (AliRICHChamber*) (*fChambers)[i])->Init(); |
118 | } |
119 | |
120 | // |
121 | // Set the chamber (sensitive region) GEANT identifier |
122 | |
123 | ((AliRICHChamber*)(*fChambers)[0])->SetGid(1); |
124 | ((AliRICHChamber*)(*fChambers)[1])->SetGid(2); |
125 | ((AliRICHChamber*)(*fChambers)[2])->SetGid(3); |
126 | ((AliRICHChamber*)(*fChambers)[3])->SetGid(4); |
127 | ((AliRICHChamber*)(*fChambers)[4])->SetGid(5); |
128 | ((AliRICHChamber*)(*fChambers)[5])->SetGid(6); |
129 | ((AliRICHChamber*)(*fChambers)[6])->SetGid(7); |
130 | |
131 | Float_t pos1[3]={0,471.8999,165.2599}; |
132 | Chamber(0).SetChamberTransform(pos1[0],pos1[1],pos1[2],new TRotMatrix("rot993","rot993",90,0,70.69,90,19.30999,-90)); |
133 | |
134 | Float_t pos2[3]={171,470,0}; |
135 | Chamber(1).SetChamberTransform(pos2[0],pos2[1],pos2[2],new TRotMatrix("rot994","rot994",90,-20,90,70,0,0)); |
136 | |
137 | Float_t pos3[3]={0,500,0}; |
138 | Chamber(2).SetChamberTransform(pos3[0],pos3[1],pos3[2],new TRotMatrix("rot995","rot995",90,0,90,90,0,0)); |
139 | |
140 | Float_t pos4[3]={-171,470,0}; |
141 | Chamber(3).SetChamberTransform(pos4[0],pos4[1],pos4[2], new TRotMatrix("rot996","rot996",90,20,90,110,0,0)); |
142 | |
143 | Float_t pos5[3]={161.3999,443.3999,-165.3}; |
144 | Chamber(4).SetChamberTransform(pos5[0],pos5[1],pos5[2],new TRotMatrix("rot997","rot997",90,340,108.1999,70,18.2,70)); |
145 | |
146 | Float_t pos6[3]={0., 471.9, -165.3,}; |
147 | Chamber(5).SetChamberTransform(pos6[0],pos6[1],pos6[2],new TRotMatrix("rot998","rot998",90,0,109.3099,90,19.30999,90)); |
148 | |
149 | Float_t pos7[3]={-161.399,443.3999,-165.3}; |
150 | Chamber(6).SetChamberTransform(pos7[0],pos7[1],pos7[2],new TRotMatrix("rot999","rot999",90,20,108.1999,110,18.2,110)); |
151 | |
152 | segmentation=Chamber(0).GetSegmentationModel(0); |
153 | geometry=Chamber(0).GetGeometryModel(); |
154 | response=Chamber(0).GetResponseModel(); |
155 | |
156 | |
157 | printf("* Pads : %3dx%3d *\n",segmentation->Npx(),segmentation->Npy()); |
158 | printf("* Pad size : %5.2f x%5.2f mm2 *\n",segmentation->Dpx(),segmentation->Dpy()); |
159 | printf("* Gap Thickness : %5.1f mm *\n",geometry->GetGapThickness()); |
160 | printf("* Radiator Width : %5.1f mm *\n",geometry->GetQuartzWidth()); |
161 | printf("* Radiator Length : %5.1f mm *\n",geometry->GetQuartzLength()); |
162 | printf("* Freon Thickness : %5.1f mm *\n",geometry->GetFreonThickness()); |
163 | printf("* Charge Slope : %5.1f ADC *\n",response->ChargeSlope()); |
164 | printf("* Feedback Prob. : %5.2f %% *\n",response->AlphaFeedback()); |
165 | printf("* *\n"); |
166 | printf("* Success! *\n"); |
167 | printf("* *\n"); |
168 | printf("*********************************************************************************\n"); |
169 | |
170 | } |
c28632f0 |
171 | |
172 | //___________________________________________ |
173 | void AliRICHv1::StepManager() |
174 | { |
237c933d |
175 | |
176 | // Full Step Manager |
177 | |
c28632f0 |
178 | Int_t copy, id; |
179 | static Int_t idvol; |
180 | static Int_t vol[2]; |
181 | Int_t ipart; |
182 | static Float_t hits[18]; |
237c933d |
183 | static Float_t ckovData[19]; |
184 | TLorentzVector position; |
185 | TLorentzVector momentum; |
c28632f0 |
186 | Float_t pos[3]; |
187 | Float_t mom[4]; |
237c933d |
188 | Float_t localPos[3]; |
189 | Float_t localMom[4]; |
190 | Float_t localTheta,localPhi; |
c28632f0 |
191 | Float_t theta,phi; |
192 | Float_t destep, step; |
193 | Float_t ranf[2]; |
237c933d |
194 | Int_t nPads; |
c28632f0 |
195 | Float_t coscerenkov; |
196 | static Float_t eloss, xhit, yhit, tlength; |
237c933d |
197 | const Float_t kBig=1.e10; |
c28632f0 |
198 | |
199 | TClonesArray &lhits = *fHits; |
200 | TGeant3 *geant3 = (TGeant3*) gMC; |
201 | TParticle *current = (TParticle*)(*gAlice->Particles())[gAlice->CurrentTrack()]; |
202 | |
203 | //if (current->Energy()>1) |
204 | //{ |
205 | |
206 | // Only gas gap inside chamber |
207 | // Tag chambers and record hits when track enters |
208 | |
209 | idvol=-1; |
210 | id=gMC->CurrentVolID(copy); |
237c933d |
211 | Float_t cherenkovLoss=0; |
c28632f0 |
212 | //gAlice->KeepTrack(gAlice->CurrentTrack()); |
213 | |
237c933d |
214 | gMC->TrackPosition(position); |
215 | pos[0]=position(0); |
216 | pos[1]=position(1); |
217 | pos[2]=position(2); |
218 | ckovData[1] = pos[0]; // X-position for hit |
219 | ckovData[2] = pos[1]; // Y-position for hit |
220 | ckovData[3] = pos[2]; // Z-position for hit |
221 | //ckovData[11] = gAlice->CurrentTrack(); |
c28632f0 |
222 | |
223 | //AliRICH *RICH = (AliRICH *) gAlice->GetDetector("RICH"); |
224 | |
225 | /********************Store production parameters for Cerenkov photons************************/ |
226 | //is it a Cerenkov photon? |
227 | if (gMC->TrackPid() == 50000050) { |
228 | |
229 | //if (gMC->VolId("GAP ")==gMC->CurrentVolID(copy)) |
230 | //{ |
237c933d |
231 | Float_t ckovEnergy = current->Energy(); |
c28632f0 |
232 | //energy interval for tracking |
237c933d |
233 | if (ckovEnergy > 5.6e-09 && ckovEnergy < 7.8e-09 ) |
234 | //if (ckovEnergy > 0) |
c28632f0 |
235 | { |
236 | if (gMC->IsTrackEntering()){ //is track entering? |
237 | if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy)) |
238 | { //is it in freo? |
239 | if (geant3->Gctrak()->nstep<1){ //is it the first step? |
240 | Int_t mother = current->GetFirstMother(); |
241 | |
242 | //printf("Second Mother:%d\n",current->GetSecondMother()); |
243 | |
237c933d |
244 | ckovData[10] = mother; |
245 | ckovData[11] = gAlice->CurrentTrack(); |
246 | ckovData[12] = 1; //Media where photon was produced 1->Freon, 2->Quarz |
247 | fCkovNumber++; |
248 | fFreonProd=1; |
249 | //printf("Index: %d\n",fCkovNumber); |
c28632f0 |
250 | } //first step question |
251 | } //freo question |
252 | |
253 | if (geant3->Gctrak()->nstep<1){ //is it first step? |
254 | if (gMC->VolId("QUAR")==gMC->CurrentVolID(copy)) //is it in quarz? |
255 | { |
237c933d |
256 | ckovData[12] = 2; |
c28632f0 |
257 | } //quarz question |
258 | } //first step question |
259 | |
237c933d |
260 | //printf("Before %d\n",fFreonProd); |
c28632f0 |
261 | } //track entering question |
262 | |
237c933d |
263 | if (ckovData[12] == 1) //was it produced in Freon? |
264 | //if (fFreonProd == 1) |
c28632f0 |
265 | { |
266 | if (gMC->IsTrackEntering()){ //is track entering? |
267 | //printf("Got in"); |
268 | if (gMC->VolId("META")==gMC->CurrentVolID(copy)) //is it in gap? |
269 | { |
270 | //printf("Got in\n"); |
237c933d |
271 | gMC->TrackMomentum(momentum); |
272 | mom[0]=momentum(0); |
273 | mom[1]=momentum(1); |
274 | mom[2]=momentum(2); |
275 | mom[3]=momentum(3); |
c28632f0 |
276 | // Z-position for hit |
277 | |
278 | |
279 | /**************** Photons lost in second grid have to be calculated by hand************/ |
280 | |
281 | Float_t cophi = TMath::Cos(TMath::ATan2(mom[0], mom[1])); |
282 | Float_t t = (1. - .025 / cophi) * (1. - .05 / cophi); |
283 | gMC->Rndm(ranf, 1); |
284 | //printf("grid calculation:%f\n",t); |
285 | if (ranf[0] > t) { |
286 | //geant3->StopTrack(); |
237c933d |
287 | ckovData[13] = 5; |
288 | AddCerenkov(gAlice->CurrentTrack(),vol,ckovData); |
c28632f0 |
289 | //printf("Lost one in grid\n"); |
290 | } |
291 | /**********************************************************************************/ |
292 | } //gap |
293 | |
294 | if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy)) //is it in csi? |
295 | { |
237c933d |
296 | gMC->TrackMomentum(momentum); |
297 | mom[0]=momentum(0); |
298 | mom[1]=momentum(1); |
299 | mom[2]=momentum(2); |
300 | mom[3]=momentum(3); |
c28632f0 |
301 | |
302 | /********* Photons lost by Fresnel reflection have to be calculated by hand********/ |
303 | /***********************Cerenkov phtons (always polarised)*************************/ |
304 | |
305 | Float_t cophi = TMath::Cos(TMath::ATan2(mom[0], mom[1])); |
237c933d |
306 | Float_t t = Fresnel(ckovEnergy*1e9,cophi,1); |
c28632f0 |
307 | gMC->Rndm(ranf, 1); |
308 | if (ranf[0] < t) { |
309 | //geant3->StopTrack(); |
237c933d |
310 | ckovData[13] = 6; |
311 | AddCerenkov(gAlice->CurrentTrack(),vol,ckovData); |
c28632f0 |
312 | //printf("Lost by Fresnel\n"); |
313 | } |
314 | /**********************************************************************************/ |
315 | } |
316 | } //track entering? |
317 | |
318 | |
319 | /********************Evaluation of losses************************/ |
320 | /******************still in the old fashion**********************/ |
321 | |
322 | Int_t i1 = geant3->Gctrak()->nmec; //number of physics mechanisms acting on the particle |
323 | for (Int_t i = 0; i < i1; ++i) { |
324 | // Reflection loss |
325 | if (geant3->Gctrak()->lmec[i] == 106) { //was it reflected |
237c933d |
326 | ckovData[13]=10; |
c28632f0 |
327 | if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy)) |
237c933d |
328 | ckovData[13]=1; |
c28632f0 |
329 | if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR")) |
237c933d |
330 | ckovData[13]=2; |
c28632f0 |
331 | //geant3->StopTrack(); |
237c933d |
332 | AddCerenkov(gAlice->CurrentTrack(),vol,ckovData); |
c28632f0 |
333 | } //reflection question |
334 | |
335 | |
336 | // Absorption loss |
337 | else if (geant3->Gctrak()->lmec[i] == 101) { //was it absorbed? |
237c933d |
338 | ckovData[13]=20; |
c28632f0 |
339 | if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy)) |
237c933d |
340 | ckovData[13]=11; |
c28632f0 |
341 | if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR")) |
237c933d |
342 | ckovData[13]=12; |
c28632f0 |
343 | if (gMC->CurrentVolID(copy) == gMC->VolId("META")) |
237c933d |
344 | ckovData[13]=13; |
c28632f0 |
345 | if (gMC->CurrentVolID(copy) == gMC->VolId("GAP ")) |
237c933d |
346 | ckovData[13]=13; |
c28632f0 |
347 | |
348 | if (gMC->CurrentVolID(copy) == gMC->VolId("SRIC")) |
237c933d |
349 | ckovData[13]=15; |
c28632f0 |
350 | |
351 | // CsI inefficiency |
352 | if (gMC->CurrentVolID(copy) == gMC->VolId("CSI ")) { |
237c933d |
353 | ckovData[13]=16; |
c28632f0 |
354 | } |
355 | //geant3->StopTrack(); |
237c933d |
356 | AddCerenkov(gAlice->CurrentTrack(),vol,ckovData); |
357 | //printf("Added cerenkov %d\n",fCkovNumber); |
c28632f0 |
358 | } //absorption question |
359 | |
360 | |
361 | // Photon goes out of tracking scope |
362 | else if (geant3->Gctrak()->lmec[i] == 30) { //is it below energy treshold? |
237c933d |
363 | ckovData[13]=21; |
c28632f0 |
364 | //geant3->StopTrack(); |
237c933d |
365 | AddCerenkov(gAlice->CurrentTrack(),vol,ckovData); |
c28632f0 |
366 | } // energy treshold question |
367 | } //number of mechanisms cycle |
368 | /**********************End of evaluation************************/ |
369 | } //freon production question |
370 | } //energy interval question |
371 | //}//inside the proximity gap question |
372 | } //cerenkov photon question |
373 | |
374 | /**************************************End of Production Parameters Storing*********************/ |
375 | |
376 | |
377 | /*******************************Treat photons that hit the CsI (Ckovs and Feedbacks)************/ |
378 | |
379 | if (gMC->TrackPid() == 50000050 || gMC->TrackPid() == 50000051) { |
380 | //printf("Cerenkov\n"); |
381 | if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy)) |
382 | { |
383 | |
384 | if (gMC->Edep() > 0.){ |
237c933d |
385 | gMC->TrackPosition(position); |
386 | gMC->TrackMomentum(momentum); |
387 | pos[0]=position(0); |
388 | pos[1]=position(1); |
389 | pos[2]=position(2); |
390 | mom[0]=momentum(0); |
391 | mom[1]=momentum(1); |
392 | mom[2]=momentum(2); |
393 | mom[3]=momentum(3); |
c28632f0 |
394 | Double_t tc = mom[0]*mom[0]+mom[1]*mom[1]; |
395 | Double_t rt = TMath::Sqrt(tc); |
396 | theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg; |
397 | phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg; |
237c933d |
398 | gMC->Gmtod(pos,localPos,1); |
399 | gMC->Gmtod(mom,localMom,2); |
c28632f0 |
400 | |
401 | gMC->CurrentVolOffID(2,copy); |
402 | vol[0]=copy; |
403 | idvol=vol[0]-1; |
404 | |
405 | //Int_t sector=((AliRICHChamber*) (*fChambers)[idvol]) |
237c933d |
406 | //->Sector(localPos[0], localPos[2]); |
c28632f0 |
407 | //printf("Sector:%d\n",sector); |
408 | |
409 | /*if (gMC->TrackPid() == 50000051){ |
410 | fFeedbacks++; |
411 | printf("Feedbacks:%d\n",fFeedbacks); |
412 | }*/ |
413 | |
414 | ((AliRICHChamber*) (*fChambers)[idvol]) |
237c933d |
415 | ->SigGenInit(localPos[0], localPos[2], localPos[1]); |
416 | if(idvol<kNCH) { |
417 | ckovData[0] = gMC->TrackPid(); // particle type |
418 | ckovData[1] = pos[0]; // X-position for hit |
419 | ckovData[2] = pos[1]; // Y-position for hit |
420 | ckovData[3] = pos[2]; // Z-position for hit |
421 | ckovData[4] = theta; // theta angle of incidence |
422 | ckovData[5] = phi; // phi angle of incidence |
423 | ckovData[8] = (Float_t) fNPadHits; // first padhit |
424 | ckovData[9] = -1; // last pad hit |
425 | ckovData[13] = 4; // photon was detected |
426 | ckovData[14] = mom[0]; |
427 | ckovData[15] = mom[1]; |
428 | ckovData[16] = mom[2]; |
c28632f0 |
429 | |
430 | destep = gMC->Edep(); |
237c933d |
431 | gMC->SetMaxStep(kBig); |
432 | cherenkovLoss += destep; |
433 | ckovData[7]=cherenkovLoss; |
c28632f0 |
434 | |
237c933d |
435 | nPads = MakePadHits(localPos[0],localPos[2],cherenkovLoss,idvol,kCerenkov); |
436 | if (fNPadHits > (Int_t)ckovData[8]) { |
437 | ckovData[8]= ckovData[8]+1; |
438 | ckovData[9]= (Float_t) fNPadHits; |
c28632f0 |
439 | } |
440 | |
237c933d |
441 | ckovData[17] = nPads; |
442 | //printf("nPads:%d",nPads); |
c28632f0 |
443 | |
444 | //TClonesArray *Hits = RICH->Hits(); |
445 | AliRICHHit *mipHit = (AliRICHHit*) (fHits->UncheckedAt(0)); |
446 | if (mipHit) |
447 | { |
448 | mom[0] = current->Px(); |
449 | mom[1] = current->Py(); |
450 | mom[2] = current->Pz(); |
237c933d |
451 | Float_t mipPx = mipHit->fMomX; |
452 | Float_t mipPy = mipHit->fMomY; |
453 | Float_t mipPz = mipHit->fMomZ; |
c28632f0 |
454 | |
455 | Float_t r = mom[0]*mom[0] + mom[1]*mom[1] + mom[2]*mom[2]; |
456 | Float_t rt = TMath::Sqrt(r); |
237c933d |
457 | Float_t mipR = mipPx*mipPx + mipPy*mipPy + mipPz*mipPz; |
458 | Float_t mipRt = TMath::Sqrt(mipR); |
459 | if ((rt*mipRt) > 0) |
c28632f0 |
460 | { |
237c933d |
461 | coscerenkov = (mom[0]*mipPx + mom[1]*mipPy + mom[2]*mipPz)/(rt*mipRt); |
c28632f0 |
462 | } |
463 | else |
464 | { |
465 | coscerenkov = 0; |
466 | } |
467 | Float_t cherenkov = TMath::ACos(coscerenkov); |
237c933d |
468 | ckovData[18]=cherenkov; |
c28632f0 |
469 | } |
470 | //if (sector != -1) |
471 | //{ |
237c933d |
472 | AddHit(gAlice->CurrentTrack(),vol,ckovData); |
473 | AddCerenkov(gAlice->CurrentTrack(),vol,ckovData); |
c28632f0 |
474 | //} |
475 | } |
476 | } |
477 | } |
478 | } |
479 | |
480 | /***********************************************End of photon hits*********************************************/ |
481 | |
482 | |
483 | /**********************************************Charged particles treatment*************************************/ |
484 | |
485 | else if (gMC->TrackCharge()) |
486 | //else if (1 == 1) |
487 | { |
488 | //If MIP |
489 | /*if (gMC->IsTrackEntering()) |
490 | { |
491 | hits[13]=20;//is track entering? |
492 | }*/ |
493 | if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy)) |
494 | { |
237c933d |
495 | fFreonProd=1; |
c28632f0 |
496 | } |
497 | |
498 | if (gMC->VolId("GAP ")== gMC->CurrentVolID(copy)) { |
499 | // Get current particle id (ipart), track position (pos) and momentum (mom) |
500 | |
501 | gMC->CurrentVolOffID(3,copy); |
502 | vol[0]=copy; |
503 | idvol=vol[0]-1; |
504 | |
505 | //Int_t sector=((AliRICHChamber*) (*fChambers)[idvol]) |
237c933d |
506 | //->Sector(localPos[0], localPos[2]); |
c28632f0 |
507 | //printf("Sector:%d\n",sector); |
508 | |
237c933d |
509 | gMC->TrackPosition(position); |
510 | gMC->TrackMomentum(momentum); |
511 | pos[0]=position(0); |
512 | pos[1]=position(1); |
513 | pos[2]=position(2); |
514 | mom[0]=momentum(0); |
515 | mom[1]=momentum(1); |
516 | mom[2]=momentum(2); |
517 | mom[3]=momentum(3); |
518 | gMC->Gmtod(pos,localPos,1); |
519 | gMC->Gmtod(mom,localMom,2); |
c28632f0 |
520 | |
521 | ipart = gMC->TrackPid(); |
522 | // |
523 | // momentum loss and steplength in last step |
524 | destep = gMC->Edep(); |
525 | step = gMC->TrackStep(); |
526 | |
527 | // |
528 | // record hits when track enters ... |
529 | if( gMC->IsTrackEntering()) { |
530 | // gMC->SetMaxStep(fMaxStepGas); |
531 | Double_t tc = mom[0]*mom[0]+mom[1]*mom[1]; |
532 | Double_t rt = TMath::Sqrt(tc); |
533 | theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg; |
534 | phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg; |
535 | |
536 | |
237c933d |
537 | Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2]; |
538 | Double_t localRt = TMath::Sqrt(localTc); |
539 | localTheta = Float_t(TMath::ATan2(localRt,Double_t(localMom[1])))*kRaddeg; |
540 | localPhi = Float_t(TMath::ATan2(Double_t(localMom[2]),Double_t(localMom[0])))*kRaddeg; |
c28632f0 |
541 | |
542 | hits[0] = Float_t(ipart); // particle type |
237c933d |
543 | hits[1] = localPos[0]; // X-position for hit |
544 | hits[2] = localPos[1]; // Y-position for hit |
545 | hits[3] = localPos[2]; // Z-position for hit |
546 | hits[4] = localTheta; // theta angle of incidence |
547 | hits[5] = localPhi; // phi angle of incidence |
c28632f0 |
548 | hits[8] = (Float_t) fNPadHits; // first padhit |
549 | hits[9] = -1; // last pad hit |
237c933d |
550 | hits[13] = fFreonProd; // did id hit the freon? |
c28632f0 |
551 | hits[14] = mom[0]; |
552 | hits[15] = mom[1]; |
553 | hits[16] = mom[2]; |
554 | |
555 | tlength = 0; |
556 | eloss = 0; |
237c933d |
557 | fFreonProd = 0; |
c28632f0 |
558 | |
237c933d |
559 | Chamber(idvol).LocaltoGlobal(localPos,hits+1); |
c28632f0 |
560 | |
561 | |
237c933d |
562 | //To make chamber coordinates x-y had to pass localPos[0], localPos[2] |
563 | xhit = localPos[0]; |
564 | yhit = localPos[2]; |
c28632f0 |
565 | // Only if not trigger chamber |
237c933d |
566 | if(idvol<kNCH) { |
c28632f0 |
567 | // |
568 | // Initialize hit position (cursor) in the segmentation model |
569 | ((AliRICHChamber*) (*fChambers)[idvol]) |
237c933d |
570 | ->SigGenInit(localPos[0], localPos[2], localPos[1]); |
c28632f0 |
571 | } |
572 | } |
573 | |
574 | // |
575 | // Calculate the charge induced on a pad (disintegration) in case |
576 | // |
577 | // Mip left chamber ... |
578 | if( gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()){ |
237c933d |
579 | gMC->SetMaxStep(kBig); |
c28632f0 |
580 | eloss += destep; |
581 | tlength += step; |
582 | |
583 | |
584 | // Only if not trigger chamber |
237c933d |
585 | if(idvol<kNCH) { |
c28632f0 |
586 | if (eloss > 0) |
587 | { |
588 | if(gMC->TrackPid() == kNeutron) |
589 | printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n"); |
237c933d |
590 | nPads = MakePadHits(xhit,yhit,eloss,idvol,kMip); |
591 | hits[17] = nPads; |
592 | //printf("nPads:%d",nPads); |
c28632f0 |
593 | } |
594 | } |
595 | |
596 | hits[6]=tlength; |
597 | hits[7]=eloss; |
598 | if (fNPadHits > (Int_t)hits[8]) { |
599 | hits[8]= hits[8]+1; |
600 | hits[9]= (Float_t) fNPadHits; |
601 | } |
602 | |
603 | //if(sector !=-1) |
604 | new(lhits[fNhits++]) AliRICHHit(fIshunt,gAlice->CurrentTrack(),vol,hits); |
605 | eloss = 0; |
606 | // |
607 | // Check additional signal generation conditions |
608 | // defined by the segmentation |
609 | // model (boundary crossing conditions) |
610 | } else if |
611 | (((AliRICHChamber*) (*fChambers)[idvol]) |
237c933d |
612 | ->SigGenCond(localPos[0], localPos[2], localPos[1])) |
c28632f0 |
613 | { |
614 | ((AliRICHChamber*) (*fChambers)[idvol]) |
237c933d |
615 | ->SigGenInit(localPos[0], localPos[2], localPos[1]); |
c28632f0 |
616 | if (eloss > 0) |
617 | { |
618 | if(gMC->TrackPid() == kNeutron) |
619 | printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n"); |
237c933d |
620 | nPads = MakePadHits(xhit,yhit,eloss,idvol,kMip); |
621 | hits[17] = nPads; |
c28632f0 |
622 | //printf("Npads:%d",NPads); |
623 | } |
237c933d |
624 | xhit = localPos[0]; |
625 | yhit = localPos[2]; |
c28632f0 |
626 | eloss = destep; |
627 | tlength += step ; |
628 | // |
629 | // nothing special happened, add up energy loss |
630 | } else { |
631 | eloss += destep; |
632 | tlength += step ; |
633 | } |
634 | } |
635 | } |
636 | /*************************************************End of MIP treatment**************************************/ |
637 | //} |
638 | } |