128a8042 |
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 | //Class to check the response of the detection elements of the MUON tracking chambers |
17 | //in function of the position in the detection element. |
18 | //Author: Nicolas LE BRIS - SUBATECH Nantes |
19 | |
20 | //PWG3/muon: |
21 | #include "AliAnalysisTaskMuonTrackingEff.h" |
22 | #include "AliCheckMuonDetEltResponse.h" |
23 | |
24 | //include STEER: |
25 | #include "AliLog.h" |
26 | #include "AliESDEvent.h" |
27 | #include "AliTracker.h" |
28 | #include "AliESDMuonTrack.h" |
29 | |
30 | //include MUON: |
31 | #include "AliMUONTrack.h" |
32 | #include "AliMUONTrackParam.h" |
33 | #include "AliMUONTrackExtrap.h" |
34 | #include "AliMUONVCluster.h" |
35 | #include "AliMUONConstants.h" |
36 | #include "AliMUONGeometryTransformer.h" |
37 | #include "AliMUONESDInterface.h" |
38 | |
39 | //include MUON/mapping: |
40 | #include "mapping/AliMpDEManager.h" |
0246246b |
41 | #include "mapping/AliMpSegmentation.h" |
42 | #include "mapping/AliMpSlat.h" |
43 | #include "mapping/AliMpSlatSegmentation.h" |
44 | #include "mapping/AliMpSector.h" |
45 | #include "mapping/AliMpSectorSegmentation.h" |
46 | #include "mapping/AliMpPad.h" |
128a8042 |
47 | |
48 | //include ROOT: |
49 | #include <Riostream.h> |
50 | #include <TMath.h> |
51 | #include <TROOT.h> |
52 | #include <TSystem.h> |
53 | #include <TH2F.h> |
0246246b |
54 | #include <TH1F.h> |
128a8042 |
55 | #include <TClonesArray.h> |
56 | #include <TPaveLabel.h> |
57 | #include <TList.h> |
58 | |
59 | /// \cond CLASSIMP |
60 | ClassImp(AliCheckMuonDetEltResponse) |
61 | /// \endcond |
62 | |
63 | const Int_t AliCheckMuonDetEltResponse::fNbrOfChamber = 10; |
64 | const Int_t AliCheckMuonDetEltResponse::fNbrOfStation = 5; |
65 | const Int_t AliCheckMuonDetEltResponse::fNbrOfDetectionElt[10] = {4, 4, 4, 4, 18, 18, 26, 26, 26, 26}; |
66 | const Int_t AliCheckMuonDetEltResponse::fFirstDetectionElt[10] = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000}; |
67 | const Int_t AliCheckMuonDetEltResponse::fOffset = 100; |
68 | const Int_t AliCheckMuonDetEltResponse::fOverlapSize = 15; |
0246246b |
69 | const Int_t AliCheckMuonDetEltResponse::fYSlatSize = 20; |
128a8042 |
70 | |
71 | //_____________________________________________________________________________ |
72 | AliCheckMuonDetEltResponse::AliCheckMuonDetEltResponse() |
128a8042 |
73 | : TObject(), |
665701ae |
74 | fNCh(0), |
75 | fNSt(0), |
76 | fNDE(0), |
128a8042 |
77 | fTransformer(0x0), |
665701ae |
78 | fESD(0x0), |
128a8042 |
79 | fTracksTotalNbr(0x0), |
22b42448 |
80 | fIsCosmicData(kFALSE), |
128a8042 |
81 | fTrackParams(0x0), |
82 | fTrackParam(0x0), |
83 | fCluster(0x0), |
84 | fDetEltTDHistList(0x0), |
0246246b |
85 | fDetEltTTHistList(0x0), |
86 | fChamberTDHistList(0x0), |
87 | fChamberTTHistList(0x0) |
128a8042 |
88 | { |
89 | /// Default constructor |
90 | |
91 | fNCh = AliCheckMuonDetEltResponse::fNbrOfChamber; |
92 | fNSt = AliCheckMuonDetEltResponse::fNbrOfStation; |
93 | fNDE = AliAnalysisTaskMuonTrackingEff::fTotNbrOfDetectionElt; |
94 | |
95 | for (Int_t iCluster = 0; iCluster<fNCh; ++iCluster) |
128a8042 |
96 | fNbrClustersCh[iCluster] = 0; |
128a8042 |
97 | |
128a8042 |
98 | for (Int_t i=0; i<fNCh; ++i) |
128a8042 |
99 | fTrackFilter[i] = 0; |
128a8042 |
100 | } |
101 | |
665701ae |
102 | //_____________________________________________________________________________ |
103 | AliCheckMuonDetEltResponse::AliCheckMuonDetEltResponse(const AliCheckMuonDetEltResponse& src) |
104 | : TObject(src), |
105 | fNCh(0), |
106 | fNSt(0), |
107 | fNDE(0), |
108 | fTransformer(0x0), |
109 | fESD(0x0), |
110 | fTracksTotalNbr(0x0), |
22b42448 |
111 | fIsCosmicData(kFALSE), |
665701ae |
112 | fTrackParams(0x0), |
113 | fTrackParam(0x0), |
114 | fCluster(0x0), |
115 | fDetEltTDHistList(0x0), |
0246246b |
116 | fDetEltTTHistList(0x0), |
117 | fChamberTDHistList(0x0), |
118 | fChamberTTHistList(0x0) |
665701ae |
119 | { |
120 | src.Copy(*this); |
121 | } |
122 | //_____________________________________________________________________________ |
123 | AliCheckMuonDetEltResponse& AliCheckMuonDetEltResponse::operator=(const AliCheckMuonDetEltResponse& src) |
124 | { |
125 | /// assignement operator |
126 | if ( this != &src ) |
127 | { |
128 | src.Copy(*this); |
129 | } |
130 | return *this; |
131 | } |
128a8042 |
132 | |
133 | //_____________________________________________________________________________ |
134 | AliCheckMuonDetEltResponse::AliCheckMuonDetEltResponse(const AliMUONGeometryTransformer* transformer, |
135 | AliESDEvent* esd, |
136 | TClonesArray* detEltTDHistList, |
0246246b |
137 | TClonesArray* detEltTTHistList, |
138 | TClonesArray* chamberTDHistList, |
139 | TClonesArray* chamberTTHistList, |
140 | Bool_t isCosmic) |
128a8042 |
141 | : TObject(), |
665701ae |
142 | fNCh(0), |
143 | fNSt(0), |
144 | fNDE(0), |
128a8042 |
145 | fTransformer(transformer), |
146 | fESD(esd), |
147 | fTracksTotalNbr(0), |
22b42448 |
148 | fIsCosmicData(kFALSE), |
128a8042 |
149 | fTrackParams(0x0), |
150 | fTrackParam(0), |
0246246b |
151 | fCluster(0), |
128a8042 |
152 | fDetEltTDHistList(detEltTDHistList), |
0246246b |
153 | fDetEltTTHistList(detEltTTHistList), |
154 | fChamberTDHistList(chamberTDHistList), |
155 | fChamberTTHistList(chamberTTHistList) |
128a8042 |
156 | { |
157 | /// Constructor |
158 | |
159 | fNCh = AliCheckMuonDetEltResponse::fNbrOfChamber; |
160 | fNSt = AliCheckMuonDetEltResponse::fNbrOfStation; |
161 | fNDE = AliAnalysisTaskMuonTrackingEff::fTotNbrOfDetectionElt; |
0246246b |
162 | fIsCosmicData = isCosmic; |
128a8042 |
163 | |
164 | for (Int_t iCluster = 0; iCluster<fNCh; ++iCluster) |
128a8042 |
165 | fNbrClustersCh[iCluster] = 0; |
0246246b |
166 | |
128a8042 |
167 | for (Int_t i=0; i<fNCh; ++i) |
128a8042 |
168 | fTrackFilter[i] = 0; |
0246246b |
169 | |
128a8042 |
170 | } |
171 | |
172 | |
173 | //_____________________________________________________________________________ |
174 | AliCheckMuonDetEltResponse::~AliCheckMuonDetEltResponse() |
175 | |
176 | { |
177 | /// Destructor |
178 | delete fTrackParams; |
179 | } |
180 | |
181 | |
182 | |
183 | //_____________________________________________________________________________ |
184 | void AliCheckMuonDetEltResponse::CheckDetEltResponse() |
185 | { |
186 | // |
187 | //Cataloging positions (X,Y) of the clusters detected in the detection elements |
188 | //(fDetEltTDHistList), and positions of crossing points between all the |
189 | //tracks and the detection elements (fDetEltTTHistList). |
190 | //Efficiency = 100 * fDetEltTDHistList / fDetEltTTHistList. |
191 | |
192 | //Loop on tracks |
193 | //-------------- |
194 | TrackLoop(); |
195 | } |
196 | |
197 | |
198 | |
199 | //_____________________________________________________________________________ |
200 | void AliCheckMuonDetEltResponse::TrackLoop() |
201 | { |
202 | AliESDMuonTrack* esdTrack; |
203 | AliMUONTrack track; |
204 | Int_t nTracks, iTrack; |
205 | |
206 | nTracks = (Int_t)fESD -> GetNumberOfMuonTracks(); |
207 | fTrackParams = new TClonesArray(); |
208 | ///Begininig of the loop: |
209 | for (iTrack = 0; iTrack < nTracks; iTrack++) |
210 | { |
211 | esdTrack = fESD -> GetMuonTrack(iTrack); |
212 | |
0246246b |
213 | if( esdTrack->ContainTrackerData() && esdTrack->GetMatchTrigger() > 0) |
214 | { |
215 | if (fIsCosmicData) |
216 | { |
217 | // Beginnig of long stuff to check the number of trigger hit (to only keep muon trigger and cut cosmic showers) |
218 | Int_t nTriggerHit = 0; |
219 | Int_t nTriggerHitStrip[8] = {0, 0, 0, 0, |
220 | 0, 0, 0, 0}; |
221 | UShort_t triggerPattern[8] = {esdTrack->GetTriggerX1Pattern(), esdTrack->GetTriggerX2Pattern(), esdTrack->GetTriggerX3Pattern(), esdTrack->GetTriggerX4Pattern(), |
222 | esdTrack->GetTriggerY1Pattern(), esdTrack->GetTriggerY2Pattern(), esdTrack->GetTriggerY3Pattern(), esdTrack->GetTriggerY4Pattern()}; |
223 | |
224 | for (Int_t ii = 0; ii < 8; ii++) |
225 | { |
226 | UShort_t pattern = triggerPattern[ii]; |
227 | Int_t binaryValue[16] = {0, 0, 0, 0, |
228 | 0, 0, 0, 0, |
229 | 0, 0, 0, 0, |
230 | 0, 0, 0, 0}; |
231 | |
232 | for (Int_t jj = 15; jj >= 0; jj--) |
233 | { |
234 | Int_t base = 1; |
235 | for (Int_t bb = 0; bb < jj; bb++) |
236 | base *= 2; |
237 | |
238 | if (pattern/base == 1) |
239 | { |
240 | binaryValue[jj] = 1; |
241 | pattern = pattern - base; |
242 | } |
243 | } |
244 | } |
245 | |
246 | for (Int_t ii = 0; ii < 8; ii++) |
247 | nTriggerHit += nTriggerHitStrip[ii]; |
248 | // End of long stuff |
249 | |
250 | |
251 | // Important part |
252 | if (nTriggerHit < 10) |
253 | { |
254 | AliMUONESDInterface::ESDToMUON(*esdTrack, track); |
255 | fTrackParams = track.GetTrackParamAtCluster(); |
256 | TrackParamLoop(); //!<Loop on trackParam. |
257 | } |
258 | } |
259 | |
260 | // No trigger cut is required for non-cosmic data |
261 | else |
262 | { |
263 | AliMUONESDInterface::ESDToMUON(*esdTrack, track); |
264 | fTrackParams = track.GetTrackParamAtCluster(); |
265 | TrackParamLoop(); //!<Loop on trackParam. |
266 | } |
267 | } |
128a8042 |
268 | } |
269 | } |
270 | |
271 | |
272 | |
273 | //_____________________________________________________________________________ |
274 | void AliCheckMuonDetEltResponse::TrackParamLoop() |
275 | { |
0246246b |
276 | Int_t nTrackParams = (Int_t) fTrackParams->GetEntriesFast(); //!<Number of trackParams in the track. |
277 | Int_t iTrackParam = 0; //!<Number of the trackParam of the track. |
278 | Int_t oldChamber = -1, newChamber = 0; //!<To check if there is 0, 1 or 2 (overlap cases) clusters in the same chamber for a track. |
279 | Int_t detElt; //!<Detection element Id. |
128a8042 |
280 | |
0246246b |
281 | for (Int_t ch = 0; ch < fNCh; ++ch) |
9a7a0b91 |
282 | fTrackFilter[ch] = 0; |
283 | |
128a8042 |
284 | |
0246246b |
285 | Double_t posXL, posYL, posZL; //!<Local positions. |
286 | Double_t posXG, posYG, posZG; //!<Global. positions. |
287 | Int_t chamberResponse [10] = {0}; //!<1 if the chamber has responded; 0 if not |
288 | |
289 | for (iTrackParam = 0; iTrackParam < nTrackParams; ++iTrackParam) |
128a8042 |
290 | { |
291 | fTrackParam = (AliMUONTrackParam*) fTrackParams->At(iTrackParam); |
292 | fCluster = (AliMUONVCluster* ) fTrackParam ->GetClusterPtr(); |
293 | fTrackFilter [fCluster->GetChamberId()] = 1; |
294 | chamberResponse[fCluster->GetChamberId()] = 1; |
295 | } |
128a8042 |
296 | |
9a7a0b91 |
297 | for (Int_t station = 0; station < fNSt-1; ++station) |
128a8042 |
298 | { |
9a7a0b91 |
299 | Int_t filter; //<! |
300 | Int_t ch1, ch2, ch3, ch4; //<! |
301 | ch1 = 2*station; //<! |
302 | ch2 = 2*station + 1; //<! |
303 | ch3 = 2*station + 2; //<! |
304 | ch4 = 2*station + 3; //<! |
305 | //<!For the efficiency calculation the tracks |
306 | if (station < 3 ) //<!reconstructed must have responded to the |
307 | { //<!criteria of the tracking. |
308 | filter = fTrackFilter[ch1]; //<!And that's why the tracks usable for the |
309 | fTrackFilter[ch1] = fTrackFilter[ch2]; //<!intrinsic efficiency calculation are |
310 | fTrackFilter[ch2] = filter; //<!the tracks which have one or two clusters |
311 | } //<!in each station. So the case where a track |
312 | //<!hasn't a cluster in a station is not |
313 | else //<!taking into account. |
314 | { //<!This part solves the problem. See the ALICE |
315 | if (chamberResponse[ch3]*chamberResponse[ch4] != 0) //<!note of Diego STOCCO on the trigger efficiency |
316 | { //<! |
317 | filter = fTrackFilter[ch1]; //<! |
318 | fTrackFilter[ch1] = fTrackFilter[ch2]; //<! |
319 | fTrackFilter[ch2] = filter; //<! |
320 | } //<! |
321 | else //<! |
322 | { //<! |
323 | fTrackFilter[ch1] = 0; //<! |
324 | fTrackFilter[ch2] = 0; //<! |
325 | } //<! |
326 | |
327 | if (chamberResponse[ch1]*chamberResponse[ch2] != 0) |
0246246b |
328 | { |
9a7a0b91 |
329 | filter = fTrackFilter[ch3]; |
330 | fTrackFilter[ch3] = fTrackFilter[ch4]; |
331 | fTrackFilter[ch4] = filter; |
332 | } |
333 | else |
334 | { |
335 | fTrackFilter[ch3] = 0; |
336 | fTrackFilter[ch4] = 0; |
0246246b |
337 | } |
0246246b |
338 | } |
9a7a0b91 |
339 | } |
0246246b |
340 | |
9a7a0b91 |
341 | |
0246246b |
342 | ///Begining of the loop: |
343 | for (iTrackParam = 0; iTrackParam < nTrackParams; ++iTrackParam) |
128a8042 |
344 | { |
345 | fTrackParam = (AliMUONTrackParam*) fTrackParams->At(iTrackParam); |
346 | fCluster = (AliMUONVCluster* ) fTrackParam ->GetClusterPtr(); |
347 | |
348 | newChamber = fCluster->GetChamberId(); |
349 | detElt = fCluster->GetDetElemId(); |
350 | |
0246246b |
351 | ///Global and local positions calculation: |
128a8042 |
352 | posXG = fTrackParam->GetNonBendingCoor(); |
353 | posYG = fTrackParam->GetBendingCoor(); |
354 | posZG = fTrackParam->GetZ(); |
0246246b |
355 | |
128a8042 |
356 | fTransformer->Global2Local(detElt, posXG, posYG, posZG, posXL, posYL, posZL); //!<Transfomation from global to local positions. |
0246246b |
357 | |
358 | ///Filling histograms of the cluster positions on the detection element of the TRACKS DETECTED (TD): |
359 | FillTDHistos(newChamber, detElt, posXL, posYL); |
360 | |
361 | ///Filling histograms of the cluster positions on the detection element of ALL THE TRACKS (TT): |
362 | FillTTHistos(newChamber, detElt, posXL, posYL); |
128a8042 |
363 | |
364 | if (newChamber != oldChamber) |
128a8042 |
365 | { |
0246246b |
366 | if (newChamber > oldChamber + 1) //!<Check if it doesn't miss a chamber. |
367 | { |
368 | Int_t nbrMissChamber = newChamber - (oldChamber + 1); |
369 | FindAndFillMissedDetElt(fTrackParam, oldChamber+1, nbrMissChamber); //!<Calculation of the parameters of the missing cluster(s). |
370 | } |
371 | |
372 | if ( iTrackParam == nTrackParams - 1 && newChamber != fNCh-1) //!<Check if the last chamber, chamber 9 (from 0 to 9) has responded. |
9a7a0b91 |
373 | FindAndFillMissedDetElt(fTrackParam, fNCh-1, 1); //!<Calculation of the parameters of the missing cluster(s) in the last chamber. |
374 | |
128a8042 |
375 | } |
128a8042 |
376 | oldChamber = newChamber; |
0246246b |
377 | } |
128a8042 |
378 | } |
379 | |
380 | |
381 | |
382 | //_____________________________________________________________________________ |
0246246b |
383 | void AliCheckMuonDetEltResponse::FillTDHistos(Int_t chamber, |
384 | Int_t detElt, |
385 | Double_t posXL, |
386 | Double_t posYL) |
128a8042 |
387 | { |
0246246b |
388 | if(fTrackFilter[chamber]== 1) |
128a8042 |
389 | { |
390 | Int_t iDet = 0; //!<Position of the detection element in the histograms' list. |
391 | iDet = FromDetElt2iDet(chamber, detElt); |
392 | ((TH2F*) fDetEltTDHistList->UncheckedAt(iDet))->Fill(posXL, posYL); |
9a7a0b91 |
393 | ((TH2F*) fDetEltTDHistList->UncheckedAt(fNDE))->Fill(chamber, 0); |
394 | |
0246246b |
395 | Int_t detEltLocalId = 0; //!<Id of the detection element in the station |
396 | detEltLocalId = FromDetElt2LocalId(chamber, detElt); |
397 | ((TH1F*) fChamberTDHistList->UncheckedAt(chamber))->Fill(detEltLocalId); |
9a7a0b91 |
398 | ((TH1F*) fChamberTDHistList->UncheckedAt(10))->Fill(chamber); |
399 | } |
128a8042 |
400 | } |
401 | |
402 | |
403 | |
0246246b |
404 | |
128a8042 |
405 | //_____________________________________________________________________________ |
0246246b |
406 | void AliCheckMuonDetEltResponse::FillTTHistos(Int_t chamber, |
407 | Int_t detElt, |
408 | Double_t posXL, |
409 | Double_t posYL) |
128a8042 |
410 | { |
0246246b |
411 | if(fTrackFilter[chamber] == 1) |
128a8042 |
412 | { |
413 | Int_t iDet = 0; //!<Position of the detection element in the histograms' list. |
414 | iDet = FromDetElt2iDet(chamber, detElt); |
0246246b |
415 | ((TH2F*) fDetEltTTHistList->UncheckedAt(iDet)) -> Fill(posXL, posYL); |
9a7a0b91 |
416 | ((TH2F*) fDetEltTTHistList->UncheckedAt(fNDE))->Fill(chamber, 0); |
417 | |
0246246b |
418 | Int_t detEltLocalId = 0; //!<Id of the detection element in the station |
419 | detEltLocalId = FromDetElt2LocalId(chamber, detElt); |
420 | ((TH1F*) fChamberTTHistList->UncheckedAt(chamber))->Fill(detEltLocalId); |
9a7a0b91 |
421 | ((TH1F*) fChamberTTHistList->UncheckedAt(10))->Fill(chamber); |
128a8042 |
422 | } |
423 | } |
424 | |
425 | |
426 | |
128a8042 |
427 | |
428 | |
429 | //_____________________________________________________________________________ |
430 | Int_t AliCheckMuonDetEltResponse::FromDetElt2iDet(Int_t chamber, |
431 | Int_t detElt) |
432 | { |
433 | /// |
434 | ///Connexion between the detection element X and its position in the list of histograms iX. |
435 | /// |
436 | |
437 | Int_t iDet = 0; //!<Position of the detection element (detElt) in the histograms' list. |
438 | |
439 | if (chamber<4) iDet = detElt-fOffset*(chamber+1)+ 4* chamber ; |
a6e0ebfe |
440 | if (chamber>3 && chamber<6) iDet = detElt-fOffset*(chamber+1)+18*(chamber-4)+16; |
128a8042 |
441 | if (chamber>5) iDet = detElt-fOffset*(chamber+1)+26*(chamber-6)+52; |
442 | |
443 | return iDet; |
444 | } |
445 | |
446 | |
447 | |
448 | //_____________________________________________________________________________ |
0246246b |
449 | Int_t AliCheckMuonDetEltResponse::FromDetElt2LocalId(Int_t chamber, |
450 | Int_t detElt) |
128a8042 |
451 | { |
452 | /// |
0246246b |
453 | ///Connexion between the detection element X and its number in the station. |
128a8042 |
454 | /// |
455 | |
0246246b |
456 | Int_t localId = 0; //!<Position of the detection element (detElt) in the histograms' list. |
457 | localId = detElt - (chamber+1) * 100; |
128a8042 |
458 | |
0246246b |
459 | return localId; |
460 | } |
128a8042 |
461 | |
128a8042 |
462 | |
128a8042 |
463 | |
0246246b |
464 | //_____________________________________________________________________________ |
465 | void AliCheckMuonDetEltResponse::FindAndFillMissedDetElt(AliMUONTrackParam* extrapTrackParam, |
466 | Int_t firstMissCh, |
467 | Int_t nbrMissCh) |
468 | { |
469 | /// |
470 | ///Find which detection elements should have been hit but were missed, |
471 | ///and fill the TT histos appropriately |
472 | /// |
473 | for (Int_t iCh = 0; iCh < nbrMissCh; ++iCh) |
128a8042 |
474 | { |
0246246b |
475 | Int_t chamber = firstMissCh + iCh; |
476 | Int_t nbrOfDetElt = AliMpDEManager::GetNofDEInChamber(chamber, kTRUE); //!<Number of detection elements in the chamber. |
477 | |
478 | Double_t pos1[6] = {0, 0, 0, 0, 0, 0}; //!<First point used to compute the extrapolated point (first 3 for global coordinates, last 3 for local). |
479 | Double_t pos2[6] = {0, 0, 0, 0, 0, 0}; //!<Second point used to compute the extrapolated point (first 3 for global coordinates, last 3 for local). |
480 | Double_t posMiss[2] = {0, 0}; //!<(X, Y) local coordinates of the missing cluster. |
481 | |
482 | pos1[2] = AliMUONConstants::DefaultChamberZ(chamber); //!<Z of point 1, defined by being the Z of the chamber in "perfect" position. |
483 | AliMUONTrackExtrap::ExtrapToZ(extrapTrackParam, pos1[2]); |
484 | pos1[0] = extrapTrackParam->GetNonBendingCoor(); //!<X of point 1, extrapolated by following the Track. |
485 | pos1[1] = extrapTrackParam->GetBendingCoor(); //!<Y of point 1, extrapolated by following the Track. |
486 | |
487 | pos2[2] = AliMUONConstants::DefaultChamberZ(chamber) + AliMUONConstants::DzCh(); //!<Z of point 2, defined by being the Z of the chamber in "perfect" position |
488 | AliMUONTrackExtrap::ExtrapToZ(extrapTrackParam, pos2[2]); //!< + plus a small shift (the distance between two stations in a same chamber). |
489 | pos2[0] = extrapTrackParam->GetNonBendingCoor(); //!<X of point 2, extrapolated by following the Track. |
490 | pos2[1] = extrapTrackParam->GetBendingCoor(); //!<Y of point 2, extrapolated by following the Track. |
491 | |
492 | |
493 | |
494 | for (Int_t iDE = 0; iDE < nbrOfDetElt; iDE++) //!<Loop on all the detection element of the chamber |
495 | { |
496 | Int_t deId = (chamber + 1)*fOffset + iDE; //!<detection element Id |
497 | |
498 | fTransformer->Global2Local(deId, pos1[0], pos1[1], pos1[2], pos1[3], pos1[4], pos1[5]); //!<convesrion of point 1 and 2 in the local coordinates |
499 | fTransformer->Global2Local(deId, pos2[0], pos2[1], pos2[2], pos2[3], pos2[4], pos2[5]); |
500 | |
501 | CoordinatesOfMissingCluster(pos1[3], pos1[4], pos1[5], pos2[3], pos2[4], pos2[5], posMiss[0], posMiss[1]); |
502 | |
9a7a0b91 |
503 | Bool_t isMissed = kFALSE; |
0246246b |
504 | if (chamber < 4) |
9a7a0b91 |
505 | isMissed = CoordinatesInDetEltSt12(deId, posMiss[0], posMiss[1]); |
0246246b |
506 | else |
9a7a0b91 |
507 | isMissed = CoordinatesInDetEltSt345(deId, posMiss[0], posMiss[1]); |
0246246b |
508 | |
9a7a0b91 |
509 | if (isMissed) |
0246246b |
510 | FillTTHistos(chamber, deId, posMiss[0], posMiss[1]); |
0246246b |
511 | } |
128a8042 |
512 | } |
513 | } |
0246246b |
514 | |
515 | |
516 | |
517 | //_____________________________________________________________________________ |
518 | void AliCheckMuonDetEltResponse::CoordinatesOfMissingCluster(Double_t x1, Double_t y1, Double_t z1, |
519 | Double_t x2, Double_t y2, Double_t z2, |
520 | Double_t& x, Double_t& y) |
521 | { |
522 | // |
523 | //Compute the coordinates of the missing cluster. |
524 | //There are defined by the intersection between the straigth line joining two extrapolated points (1 and 2) and the detection element plane. |
525 | //In the local coordinates, this means Z=0 in the parametric equation of the line. |
526 | // |
527 | |
528 | Double_t t = 0; |
529 | t = - z1 / (z2 - z1); |
530 | |
531 | x = t * (x2 - x1) + x1; |
532 | y = t * (y2 - y1) + y1; |
533 | } |
534 | |
535 | |
536 | //_____________________________________________________________________________ |
537 | Bool_t AliCheckMuonDetEltResponse::CoordinatesInDetEltSt345(Int_t DeId, Double_t x, Double_t y) |
538 | { |
539 | // |
540 | //Return kTRUE if the coordinates are in the Detection Element, for station 3, 4 and 5. |
541 | //This is done by checking if a pad correspond to the (x, y) position. |
542 | // |
543 | |
544 | AliMpPad pad1; |
545 | AliMpPad pad2; |
546 | |
547 | AliMpSlatSegmentation *segm1 = new AliMpSlatSegmentation(AliMpSegmentation::Instance(kFALSE)->GetSlat(DeId, AliMp::kCath0)); |
548 | AliMpSlatSegmentation *segm2 = new AliMpSlatSegmentation(AliMpSegmentation::Instance(kFALSE)->GetSlat(DeId, AliMp::kCath1)); |
549 | pad1 = segm1->PadByPosition(x, y, kFALSE); |
550 | pad2 = segm2->PadByPosition(x, y, kFALSE); |
551 | |
9a7a0b91 |
552 | if (pad1.IsValid() && pad2.IsValid()) |
0246246b |
553 | return kTRUE; |
554 | else |
555 | return kFALSE; |
556 | } |
557 | |
558 | |
559 | //_____________________________________________________________________________ |
560 | Bool_t AliCheckMuonDetEltResponse::CoordinatesInDetEltSt12(Int_t DeId, Double_t x, Double_t y) |
561 | { |
562 | //Return kTRUE if the coordinates are in the Detection Element, for station 1 and 2. |
563 | //This is done by checking if a pad correspond to the (x, y) position. |
564 | |
565 | AliMpPad pad1; |
566 | AliMpPad pad2; |
567 | |
568 | AliMpSectorSegmentation *segm1 = new AliMpSectorSegmentation(AliMpSegmentation::Instance(kFALSE)->GetSector(DeId, AliMp::kCath0)); |
569 | AliMpSectorSegmentation *segm2 = new AliMpSectorSegmentation(AliMpSegmentation::Instance(kFALSE)->GetSector(DeId, AliMp::kCath1)); |
570 | pad1 = segm1->PadByPosition(x, y, kFALSE); |
571 | pad2 = segm2->PadByPosition(x, y, kFALSE); |
572 | |
9a7a0b91 |
573 | if (pad1.IsValid() && pad2.IsValid()) |
0246246b |
574 | return kTRUE; |
575 | else |
576 | return kFALSE; |
577 | } |