Project
Loading...
Searching...
No Matches
MatchHMP.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11#include <TTree.h>
12#include <cassert>
13
14#include "FairLogger.h"
15#include "Field/MagneticField.h"
16#include "Field/MagFieldFast.h"
17#include "TOFBase/Geo.h"
18
20
22
23#include "MathUtils/Cartesian.h"
24#include "MathUtils/Utils.h"
29
30#include <Math/SMatrix.h>
31#include <Math/SVector.h>
32#include <TFile.h>
33#include <TGeoGlobalMagField.h>
38
40
44
47#include "HMPIDBase/Param.h"
49
51
52using namespace o2::globaltracking;
61
63//==================================================================================================================================================
65{
67
68 mRecoCont = &inp;
69 mStartIR = inp.startIR;
70
72 mTrackGid[i].clear();
73 mMatchedTracks[i].clear();
74 mOutHMPLabels[i].clear();
75 mTracksWork[i].clear();
76 mMatchedTracksIndex[i].clear();
77 }
78
79 for (int it = 0; it < o2::globaltracking::MatchHMP::trackType::SIZE; it++) {
80 mTracksIndexCache[it].clear();
81 if (mMCTruthON) {
82 mTracksLblWork[it].clear();
83 }
84 }
85
86 mHMPTriggersIndexCache.clear();
87
88 bool isPrepareHMPClusters = prepareHMPClusters();
89
90 if (!isPrepareHMPClusters) { // check cluster before of tracks to see also if MC is required
91 return;
92 }
93
94 // mExtraTPCFwdTime.clear();
95
96 mTimerTot.Start();
97 if (!prepareTracks()) {
98 return;
99 }
100
101 if (mIsITSTPCused || mIsTPCTRDused || mIsITSTPCTRDused || mIsITSTPCTOFused || mIsTPCTOFused || mIsITSTPCTRDTOFused || mIsTPCTRDTOFused) {
102 doMatching();
103 }
104
105 mIsTPCused = false;
106 mIsITSTPCused = false;
107 mIsTPCTRDused = false;
108 mIsITSTPCTRDused = false;
109 mIsTPCTOFused = false;
110 mIsITSTPCTRDTOFused = false;
111 mIsTPCTRDTOFused = false;
112}
113//==================================================================================================================================================
114bool MatchHMP::prepareTracks()
115{
116
117 auto creator = [this](auto& trk, GTrackID gid, float time0, float terr) {
118 const int nclustersMin = 0;
119 if constexpr (isTPCTrack<decltype(trk)>()) {
120 if (trk.getNClusters() < nclustersMin) {
121 return true;
122 }
123 if (std::abs(trk.getQ2Pt()) > mMaxInvPt) {
124 return true;
125 }
126 this->addTPCSeed(trk, gid, time0, terr);
127 }
128 if constexpr (isTPCITSTrack<decltype(trk)>()) {
129 if (trk.getParamOut().getX() < o2::constants::geom::XTPCOuterRef - 1.) {
130 return true;
131 }
132 this->addITSTPCSeed(trk, gid, time0, terr);
133 }
134 if constexpr (isTRDTrack<decltype(trk)>()) {
135 this->addTRDSeed(trk, gid, time0, terr);
136 }
137 if constexpr (isTPCTOFTrack<decltype(trk)>()) {
138 this->addTPCTOFSeed(trk, gid, time0, terr);
139 }
140 return true;
141 };
142
143 mRecoCont->createTracksVariadic(creator);
144
145 for (int it = 0; it < o2::globaltracking::MatchHMP::trackType::SIZE; it++) {
146 mMatchedTracksIndex[it].resize(mTracksWork[it].size());
147 std::fill(mMatchedTracksIndex[it].begin(), mMatchedTracksIndex[it].end(), -1); // initializing all to -1
148 }
149
150 // Unconstrained tracks
151 /*
152 if (mIsTPCused) {
153
154 // sort tracks in each sector according to their time (increasing in time)
155 // for (int sec = o2::constants::math::NSectors; sec--;) {
156 auto& indexCache = mTracksIndexCache[o2::globaltracking::MatchHMP::trackType::UNCONS];
157 LOG(debug) << indexCache.size() << " tracks";
158 if (!indexCache.size()) {
159 return false;
160 }
161 std::sort(indexCache.begin(), indexCache.end(), [this](int a, int b) {
162 auto& trcA = mTracksWork[o2::globaltracking::MatchHMP::trackType::UNCONS][a].second;
163 auto& trcB = mTracksWork[o2::globaltracking::MatchHMP::trackType::UNCONS][b].second;
164 return ((trcA.getTimeStamp() - trcA.getTimeStampError()) - (trcB.getTimeStamp() - trcB.getTimeStampError()) < 0.);
165 });
166 // } // loop over tracks of single sector
167 } // unconstrained tracks
168 */
169 // Constrained tracks
170
171 if (mIsITSTPCused || mIsTPCTRDused || mIsITSTPCTRDused || mIsITSTPCTOFused || mIsTPCTOFused || mIsITSTPCTRDTOFused || mIsTPCTRDTOFused) {
172
173 auto& indexCache = mTracksIndexCache[o2::globaltracking::MatchHMP::trackType::CONSTR];
174 LOG(debug) << indexCache.size() << " tracks";
175 if (!indexCache.size()) {
176 return false;
177 }
178 std::sort(indexCache.begin(), indexCache.end(), [this](int a, int b) {
179 auto& trcA = mTracksWork[o2::globaltracking::MatchHMP::trackType::CONSTR][a].second;
180 auto& trcB = mTracksWork[o2::globaltracking::MatchHMP::trackType::CONSTR][b].second;
181 return ((trcA.getTimeStamp() - mSigmaTimeCut * trcA.getTimeStampError()) - (trcB.getTimeStamp() - mSigmaTimeCut * trcB.getTimeStampError()) < 0.);
182 });
183 // } // loop over tracks of single sector
184 } // constrained tracks
185
186 return true;
187}
188//______________________________________________
189void MatchHMP::addITSTPCSeed(const o2::dataformats::TrackTPCITS& _tr, o2::dataformats::GlobalTrackID srcGID, float time0, float terr)
190{
191 mIsITSTPCused = true;
192
193 auto trc = _tr.getParamOut();
194 o2::track::TrackLTIntegral intLT0 = _tr.getLTIntegralOut();
195
196 timeEst ts(time0, terr);
197
198 addConstrainedSeed(trc, srcGID, ts);
199}
200//______________________________________________
201void MatchHMP::addTRDSeed(const o2::trd::TrackTRD& _tr, o2::dataformats::GlobalTrackID srcGID, float time0, float terr)
202{
203 if (srcGID.getSource() == o2::dataformats::GlobalTrackID::TPCTRD) {
204 mIsTPCTRDused = true;
205 } else if (srcGID.getSource() == o2::dataformats::GlobalTrackID::ITSTPCTRD) {
206 mIsITSTPCTRDused = true;
207 } else if (srcGID.getSource() == o2::dataformats::GlobalTrackID::TPCTRDTOF) {
208 mIsTPCTRDTOFused = true;
209 } else if (srcGID.getSource() == o2::dataformats::GlobalTrackID::ITSTPCTRDTOF) {
210 mIsTPCTRDTOFused = true;
211 } else { // shouldn't happen
212 LOG(error) << "MatchHMP::addTRDSee: srcGID.getSource() = " << int(srcGID.getSource()) << " not allowed; expected ones are: " << int(o2::dataformats::GlobalTrackID::TPCTRD) << " and " << int(o2::dataformats::GlobalTrackID::ITSTPCTRD) << " and " << int(o2::dataformats::GlobalTrackID::TPCTRDTOF) << " and " << int(o2::dataformats::GlobalTrackID::ITSTPCTRDTOF);
213 }
214
215 auto trc = _tr.getOuterParam();
216
217 o2::track::TrackLTIntegral intLT0 = _tr.getLTIntegralOut();
218
219 // o2::dataformats::TimeStampWithError<float, float>
220 timeEst ts(time0, terr + mExtraTimeToleranceTRD);
221
222 addConstrainedSeed(trc, srcGID, ts);
223}
224//______________________________________________
225void MatchHMP::addTPCTOFSeed(const o2::dataformats::TrackTPCTOF& _tr, o2::dataformats::GlobalTrackID srcGID, float time0, float terr)
226{
227 if (srcGID.getSource() == o2::dataformats::GlobalTrackID::TPCTOF) {
228 mIsTPCTOFused = true;
229 } else if (srcGID.getSource() == o2::dataformats::GlobalTrackID::TPCTRDTOF) {
230 mIsTPCTRDTOFused = true;
231 } else if (srcGID.getSource() == o2::dataformats::GlobalTrackID::ITSTPCTRDTOF) {
232 mIsITSTPCTRDTOFused = true;
233 } else { // shouldn't happen
234 LOG(error) << "MatchHMP::addTPCTOFCSeed: srcGID.getSource() = " << int(srcGID.getSource()) << " not allowed; expected ones are: " << int(o2::dataformats::GlobalTrackID::TPCTOF) << " and " << int(o2::dataformats::GlobalTrackID::TPCTRDTOF) << " and " << int(o2::dataformats::GlobalTrackID::ITSTPCTRDTOF);
235 }
236
237 auto trc = _tr.getParamOut();
238
239 timeEst ts(time0, terr + mExtraTimeToleranceTOF);
240
241 addConstrainedSeed(trc, srcGID, ts);
242}
243//______________________________________________
244void MatchHMP::addConstrainedSeed(o2::track::TrackParCov& trc, o2::dataformats::GlobalTrackID srcGID, timeEst timeMUS)
245{
246 std::array<float, 3> globalPos;
247
248 // current track index
249 int it = mTracksWork[o2::globaltracking::MatchHMP::trackType::CONSTR].size();
250
251 auto prop = o2::base::Propagator::Instance();
252 float bxyz[3];
253 prop->getFieldXYZ(trc.getXYZGlo(), bxyz);
254 double bz = -bxyz[2];
255
256 float pCut = 0.;
257
258 if (TMath::Abs(bz - 5.0) < 0.5) {
259 pCut = 0.450;
260 }
261
262 if (TMath::Abs(bz - 2.0) < 0.5) {
263 pCut = 0.200;
264 }
265
266 if (trc.getP() > pCut && TMath::Abs(trc.getTgl()) < 0.544 && TMath::Abs(trc.getPhi() - TMath::Pi()) > (TMath::Pi() * 0.5)) {
267 // create working copy of track param
268 mTracksWork[o2::globaltracking::MatchHMP::trackType::CONSTR].emplace_back(std::make_pair(trc, timeMUS));
269
270 mTrackGid[o2::globaltracking::MatchHMP::trackType::CONSTR].emplace_back(srcGID);
271
272 if (mMCTruthON) {
273 mTracksLblWork[o2::globaltracking::MatchHMP::trackType::CONSTR].emplace_back(mRecoCont->getTPCITSTrackMCLabel(srcGID));
274 }
275
276 mTracksIndexCache[o2::globaltracking::MatchHMP::trackType::CONSTR].push_back(it);
277 }
278}
279//______________________________________________
280void MatchHMP::addTPCSeed(const o2::tpc::TrackTPC& _tr, o2::dataformats::GlobalTrackID srcGID, float time0, float terr)
281{
282 mIsTPCused = true;
283
284 std::array<float, 3> globalPos;
285
286 // current track index
287 int it = mTracksWork[o2::globaltracking::MatchHMP::trackType::UNCONS].size();
288
289 // create working copy of track param
290 timeEst timeInfo;
291 // set
292 float extraErr = 0;
293
294 auto trc = _tr.getOuterParam();
295
296 float trackTime0 = _tr.getTime0() * mTPCTBinMUS;
297
298 timeInfo.setTimeStampError((_tr.getDeltaTBwd() + 5) * mTPCTBinMUS + extraErr);
299 // mExtraTPCFwdTime.push_back((_tr.getDeltaTFwd() + 5) * mTPCTBinMUS + extraErr);
300
301 timeInfo.setTimeStamp(trackTime0);
302
303 trc.getXYZGlo(globalPos);
304
305 mTracksWork[o2::globaltracking::MatchHMP::trackType::UNCONS].emplace_back(std::make_pair(trc, timeInfo));
306
307 if (mMCTruthON) {
308 mTracksLblWork[o2::globaltracking::MatchHMP::trackType::UNCONS].emplace_back(mRecoCont->getTPCTrackMCLabel(srcGID));
309 }
310
311 mTracksIndexCache[o2::globaltracking::MatchHMP::trackType::UNCONS].push_back(it);
312}
313//==================================================================================================================================================
314bool MatchHMP::prepareHMPClusters()
315{
316 mHMPClustersArray = mRecoCont->getHMPClusters();
317 mHMPTriggersArray = mRecoCont->getHMPClusterTriggers();
318
319 mHMPClusLabels = mRecoCont->getHMPClustersMCLabels();
320 mMCTruthON = mHMPClusLabels && mHMPClusLabels->getNElements();
321
322 mNumOfTriggers = 0;
323
324 mHMPTriggersWork.clear();
325
326 int nTriggersInCurrentChunk = mHMPTriggersArray.size();
327 LOG(debug) << "nTriggersInCurrentChunk = " << nTriggersInCurrentChunk;
328 mNumOfTriggers += nTriggersInCurrentChunk;
329 mHMPTriggersWork.reserve(mHMPTriggersWork.size() + mNumOfTriggers);
330 for (int it = 0; it < nTriggersInCurrentChunk; it++) {
331 const Trigger& clOrig = mHMPTriggersArray[it];
332 // create working copy of track param
333 mHMPTriggersWork.emplace_back(clOrig);
334 // cache work track index
335 mHMPTriggersIndexCache.push_back(mHMPTriggersWork.size() - 1);
336 }
337
338 // sort hmp events according to their time (increasing in time)
339 auto& indexCache = mHMPTriggersIndexCache;
340 LOG(debug) << indexCache.size() << " HMP triggers";
341 if (!indexCache.size()) {
342 return false;
343 }
344
345 std::sort(indexCache.begin(), indexCache.end(), [this](int a, int b) {
346 auto& clA = mHMPTriggersWork[a];
347 auto& clB = mHMPTriggersWork[b];
348 auto timeA = o2::InteractionRecord::bc2ns(clA.getBc(), clA.getOrbit());
349 auto timeB = o2::InteractionRecord::bc2ns(clB.getBc(), clB.getOrbit());
350 return (timeA - timeB) < 0.; });
351
352 return true;
353}
354//==================================================================================================================================================
355void MatchHMP::doMatching()
356{
358 o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; // material correction method
359 Recon* recon = new o2::hmpid::Recon();
361
362 const float kdRadiator = 10.; // distance between radiator and the plane
363
364 //< do the real matching
365 auto& cacheTriggerHMP = mHMPTriggersIndexCache; // array of cached HMP triggers indices; reminder: they are ordered in time!
366 auto& cacheTrk = mTracksIndexCache[type]; // array of cached tracks indices;
367 int nTracks = cacheTrk.size(), nHMPtriggers = cacheTriggerHMP.size();
368
369 LOG(debug) << " ************************number of tracks: " << nTracks << ", number of HMP triggers: " << nHMPtriggers;
370 if (!nTracks || !nHMPtriggers) {
371 return;
372 }
373
374 auto prop = o2::base::Propagator::Instance();
375
376 float bxyz[3];
377
378 double cluLORS[2] = {0};
379
380 LOG(debug) << "Trying to match %d tracks" << cacheTrk.size();
381
382 float timeFromTF = o2::InteractionRecord::bc2ns(mStartIR.bc, mStartIR.orbit);
383
384 for (int ievt = 0; ievt < cacheTriggerHMP.size(); ievt++) { // events loop
385
386 auto& event = mHMPTriggersWork[cacheTriggerHMP[ievt]];
387 auto evtTime = event.getIr().differenceInBCMUS(mStartIR);
388
389 int evtTracks = 0;
390
391 for (int itrk = 0; itrk < cacheTrk.size(); itrk++) { // tracks loop
392
393 auto& trackWork = mTracksWork[type][cacheTrk[itrk]];
394 auto& trackGid = mTrackGid[type][cacheTrk[itrk]];
395 auto& trefTrk = trackWork.first;
396
397 prop->getFieldXYZ(trefTrk.getXYZGlo(), bxyz);
398 double bz = -bxyz[2];
399
400 double timeUncert = trackWork.second.getTimeStampError();
401
402 float minTrkTime = (trackWork.second.getTimeStamp() - mSigmaTimeCut * timeUncert);
403 float maxTrkTime = (trackWork.second.getTimeStamp() + mSigmaTimeCut * timeUncert);
404
405 // if (evtTime < (maxTrkTime + timeFromTF) && evtTime > (minTrkTime + timeFromTF)) {
406 if (evtTime < maxTrkTime && evtTime > minTrkTime) {
407
408 evtTracks++;
409
410 MatchInfo matching(999999, mTrackGid[type][cacheTrk[itrk]]);
411
412 matching.setHMPIDtrk(0, 0, 0, 0); // no intersection found
413 matching.setHMPIDmip(0, 0, 0, 0); // store mip info in any case
414 matching.setIdxHMPClus(99, 99999); // chamber not found, mip not yet considered
415 matching.setHMPsignal(Recon::kNotPerformed); // ring reconstruction not yet performed
416 matching.setIdxTrack(trackGid);
417 TrackHMP hmpTrk(trefTrk); // create a hmpid track to be used for propagation and matching
418
419 hmpTrk.set(trefTrk.getX(), trefTrk.getAlpha(), trefTrk.getParams(), trefTrk.getCharge(), trefTrk.getPID());
420
421 double xPc, yPc, xRa, yRa, theta, phi;
422
423 Int_t iCh = intTrkCha(&trefTrk, xPc, yPc, xRa, yRa, theta, phi, bz); // find the intersected chamber for this track
424 if (iCh < 0) {
425 continue;
426 } // no intersection at all, go next track
427
428 matching.setHMPIDtrk(xPc, yPc, theta, phi); // store initial infos
429 matching.setIdxHMPClus(iCh, 9999); // set chamber, index of cluster + cluster size
430
431 int index = -1;
432
433 double dmin = 999999; //, distCut = 1.;
434
435 bool isOkDcut = kFALSE;
436 bool isOkQcut = kFALSE;
437 bool isMatched = kFALSE;
438
439 Cluster* bestHmpCluster = nullptr; // the best matching cluster
440 std::vector<Cluster> oneEventClusters;
441
442 for (int j = event.getFirstEntry(); j <= event.getLastEntry(); j++) { // event clusters loop
443 auto& cluster = (o2::hmpid::Cluster&)mHMPClustersArray[j];
444
445 if (cluster.ch() != iCh) {
446 continue;
447 }
448 oneEventClusters.push_back(cluster);
449 double qthre = pParam->qCut();
450
451 if (cluster.q() < 150. || cluster.size() > 10) {
452 continue;
453 }
454
455 isOkQcut = kTRUE;
456
457 cluLORS[0] = cluster.x();
458 cluLORS[1] = cluster.y(); // get the LORS coordinates of the cluster
459
460 double dist = 0.;
461
462 if (TMath::Abs((xPc - cluLORS[0]) * (xPc - cluLORS[0]) + (yPc - cluLORS[1]) * (yPc - cluLORS[1])) > 0.0001) {
463
464 dist = TMath::Sqrt((xPc - cluLORS[0]) * (xPc - cluLORS[0]) + (yPc - cluLORS[1]) * (yPc - cluLORS[1]));
465 }
466
467 if (dist < dmin) {
468 dmin = dist;
469 index = oneEventClusters.size() - 1;
470 bestHmpCluster = &cluster;
471 }
472
473 } // event clusters loop
474
475 // 2. Propagate track to the MIP cluster using the central method
476
477 if (!bestHmpCluster) {
478 oneEventClusters.clear();
479 continue;
480 }
481
482 TVector3 vG = pParam->lors2Mars(iCh, bestHmpCluster->x(), bestHmpCluster->y());
483 float gx = vG.X();
484 float gy = vG.Y();
485 float gz = vG.Z();
486 float alpha = TMath::ATan2(gy, gx);
487 float radiusH = TMath::Sqrt(gy * gy + gx * gx);
488 if (!(hmpTrk.rotate(alpha))) {
489 continue;
490 }
491 if (!prop->PropagateToXBxByBz(hmpTrk, radiusH, o2::base::Propagator::MAX_SIN_PHI, o2::base::Propagator::MAX_STEP, matCorr)) {
492 oneEventClusters.clear();
493 continue;
494 }
495
496 // 3. Update the track with MIP cluster (Improved angular and position resolution - to be used for Cherenkov angle calculation)
497
498 o2::track::TrackParCov trackC(hmpTrk);
499
500 std::array<float, 2> trkPos{0, gz};
501 std::array<float, 3> trkCov{0.1 * 0.1, 0., 0.1 * 0.1};
502
503 // auto chi2 = trackC.getPredictedChi2(trkPos, trkCov);
504 trackC.update(trkPos, trkCov);
505
506 // 4. Propagate back the constrained track to the radiator radius
507
508 TrackHMP hmpTrkConstrained(trackC);
509 hmpTrkConstrained.set(trackC.getX(), trackC.getAlpha(), trackC.getParams(), trackC.getCharge(), trackC.getPID());
510 if (!prop->PropagateToXBxByBz(hmpTrkConstrained, radiusH - kdRadiator, o2::base::Propagator::MAX_SIN_PHI, o2::base::Propagator::MAX_STEP, matCorr)) {
511 oneEventClusters.clear();
512 continue;
513 }
514
515 float hmpMom = hmpTrkConstrained.getP() * hmpTrkConstrained.getSign();
516
517 matching.setHmpMom(hmpMom);
518
519 // 5. Propagation in the last 10 cm with the fast method
520
521 double xPc0 = 0., yPc0 = 0.;
522 intTrkCha(iCh, &hmpTrkConstrained, xPc0, yPc0, xRa, yRa, theta, phi, bz);
523
524 // 6. Set match information
525
526 int cluSize = bestHmpCluster->size();
527 matching.setHMPIDmip(bestHmpCluster->x(), bestHmpCluster->y(), (int)bestHmpCluster->q(), 0); // store mip info in any case
528 matching.setMipClusSize(bestHmpCluster->size());
529 matching.setIdxHMPClus(iCh, index + 1000 * cluSize); // set chamber, index of cluster + cluster size
530 matching.setHMPIDtrk(xPc, yPc, theta, phi);
531
532 if (!isOkQcut) {
533 matching.setHMPsignal(pParam->kMipQdcCut);
534 }
535
536 // dmin recalculated
537
538 dmin = TMath::Sqrt((xPc - bestHmpCluster->x()) * (xPc - bestHmpCluster->x()) + (yPc - bestHmpCluster->y()) * (yPc - bestHmpCluster->y()));
539
540 if (dmin < 6.) {
541 isOkDcut = kTRUE;
542 }
543 // isOkDcut = kTRUE; // switch OFF cut
544
545 if (!isOkDcut) {
546 matching.setHMPsignal(pParam->kMipDistCut); // closest cluster with enough charge is still too far from intersection
547 }
548
549 if (isOkQcut * isOkDcut) {
550 isMatched = kTRUE;
551 } // MIP-Track matched !!
552
553 if (!isMatched) {
554 mMatchedTracks[type].push_back(matching);
555 oneEventClusters.clear();
556 continue;
557 } // If matched continue...
558
559 double nmean = pParam->meanIdxRad();
560
561 // 7. Calculate the Cherenkov angle
562
563 recon->setImpPC(xPc, yPc); // store track impact to PC
564 recon->ckovAngle(&matching, oneEventClusters, index, nmean, xRa, yRa); // search for Cerenkov angle of this track
565
566 mMatchedTracks[type].push_back(matching);
567
568 oneEventClusters.clear();
569
570 } // if matching in time
571 } // tracks loop
572 } // events loop
573
574 delete recon;
575 recon = nullptr;
576}
577//==================================================================================================================================================
578int MatchHMP::intTrkCha(o2::track::TrackParCov* pTrk, double& xPc, double& yPc, double& xRa, double& yRa, double& theta, double& phi, double bz)
579{
580 // Static method to find intersection in between given track and HMPID chambers
581 // Arguments: pTrk- ESD track; xPc,yPc- track intersection with PC in LORS [cm]
582 // Returns: intersected chamber ID or -1
583 TrackHMP* hmpTrk = new TrackHMP(*pTrk); // create a hmpid track to be used for propagation and matching
584 for (Int_t i = o2::hmpid::Param::kMinCh; i <= o2::hmpid::Param::kMaxCh; i++) { // chambers loop
585 Int_t chInt = intTrkCha(i, hmpTrk, xPc, yPc, xRa, yRa, theta, phi, bz);
586 if (chInt >= 0) {
587 delete hmpTrk;
588 hmpTrk = nullptr;
589 return chInt;
590 }
591 } // chambers loop
592 delete hmpTrk;
593 hmpTrk = nullptr;
594 return -1; // no intersection with HMPID chambers
595} // IntTrkCha()
596//==================================================================================================================================================
597int MatchHMP::intTrkCha(int ch, o2::dataformats::TrackHMP* pHmpTrk, double& xPc, double& yPc, double& xRa, double& yRa, double& theta, double& phi, double bz)
598{
599 // Static method to find intersection in between given track and HMPID chambers
600 // Arguments: pTrk- HMPID track; xPc,yPc- track intersection with PC in LORS [cm]
601 // Returns: intersected chamber ID or -1
603 Double_t p1[3], n1[3];
604 pParam->norm(ch, n1);
605 pParam->point(ch, p1, o2::hmpid::Param::kRad); // point & norm for middle of radiator plane
606 Double_t p2[3], n2[3];
607 pParam->norm(ch, n2);
608 pParam->point(ch, p2, o2::hmpid::Param::kPc); // point & norm for entrance to PC plane
609
610 if (pHmpTrk->intersect(p1, n1, bz) == kFALSE) {
611 return -1;
612 } // try to intersect track with the middle of radiator
613 if (pHmpTrk->intersect(p2, n2, bz) == kFALSE) {
614 return -1;
615 }
616 pParam->mars2LorsVec(ch, n1, theta, phi); // track angles at RAD
617 pParam->mars2Lors(ch, p1, xRa, yRa); // TRKxRAD position
618 pParam->mars2Lors(ch, p2, xPc, yPc); // TRKxPC position
619
620 if (pParam->isInside(xPc, yPc, pParam->distCut()) == kTRUE) {
621 return ch;
622 } // return intersected chamber
623 return -1; // no intersection with HMPID chambers
624} // IntTrkCha()
625//==================================================================================================================================================
General auxilliary methods.
Wrapper container for different reconstructed object types.
particle ids, masses, names class definition
Definition of the GeometryManager class.
int32_t i
Header of the General Run Parameters object.
Some ALICE geometry constants of common interest.
constexpr int p2()
constexpr int p1()
constexpr to accelerate the coordinates changing
Definition of a container to keep Monte Carlo truth external to simulation objects.
Definition of the fast magnetic field parametrization MagFieldFast.
Definition of the MagF class.
ClassImp(MatchHMP)
o2::dataformats::TrackHMP TrackHMP
Definition MatchHMP.cxx:59
useful math constants
Definition of the parameter class for the detector electronics.
Definition of the parameter class for the detector gas.
Header to collect physics constants.
uint32_t j
Definition RawData.h:0
Wrapper container for different reconstructed object types.
class to create TPC fast transformation
Track Length and TOF integral.
std::ostringstream debug
static constexpr float MAX_SIN_PHI
Definition Propagator.h:72
static constexpr float MAX_STEP
Definition Propagator.h:73
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
Definition Propagator.h:143
Bool_t intersect(Double_t pnt[3], Double_t norm[3], double bz) const
Definition TrackHMP.cxx:50
o2::track::TrackParCov & getParamOut()
Definition TrackTPCTOF.h:53
void run(const o2::globaltracking::RecoContainer &inp)
< perform matching for provided input
Definition MatchHMP.cxx:64
HMPID cluster implementation.
Definition Cluster.h:27
void mars2Lors(Int_t c, double *m, double &x, double &y) const
Definition Param.h:199
float distCut() const
Definition Param.h:162
float qCut() const
Definition Param.h:163
double meanIdxRad() const
Definition Param.h:159
void point(Int_t c, double *p, Int_t plane) const
Definition Param.h:226
TVector3 norm(Int_t c) const
Definition Param.h:215
void lors2Mars(Int_t c, double x, double y, double *m, Int_t pl=kPc) const
Definition Param.h:176
static bool isInside(float x, float y, float d=0)
Definition Param.h:132
static Param * instance()
Definition Param.cxx:438
void mars2LorsVec(Int_t c, double *m, double &th, double &ph) const
Definition Param.h:206
void ckovAngle(o2::dataformats::MatchInfoHMP *match, const std::vector< o2::hmpid::Cluster > clusters, int index, double nmean, float xRa, float yRa)
Definition Recon.cxx:49
void setImpPC(double xPc, double yPc)
Definition Recon.h:140
HMPID Trigger declaration.
Definition Trigger.h:32
struct _cl_event * event
Definition glcorearb.h:2982
GLfloat GLfloat GLfloat alpha
Definition glcorearb.h:279
GLsizeiptr size
Definition glcorearb.h:659
GLuint GLuint end
Definition glcorearb.h:469
GLuint index
Definition glcorearb.h:781
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
constexpr float XTPCOuterRef
reference radius to propagate outer TPC track
Enum< T >::Iterator begin(Enum< T >)
Definition Defs.h:173
TrackParCovF TrackParCov
Definition Track.h:33
uint32_t orbit
LHC orbit.
uint16_t bc
bunch crossing ID of interaction
auto getTPCITSTrackMCLabel(GTrackID id) const
void createTracksVariadic(T creator, GTrackID::mask_t srcSel=GTrackID::getSourcesMask("all")) const
auto getTPCTrackMCLabel(GTrackID id) const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"