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