14#include "FairLogger.h"
30#include <Math/SMatrix.h>
31#include <Math/SVector.h>
33#include <TGeoGlobalMagField.h>
73 mMatchedTracks[
i].clear();
74 mOutHMPLabels[
i].clear();
75 mTracksWork[
i].clear();
76 mMatchedTracksIndex[
i].clear();
80 mTracksIndexCache[it].clear();
82 mTracksLblWork[it].clear();
86 mHMPTriggersIndexCache.clear();
88 bool isPrepareHMPClusters = prepareHMPClusters();
90 if (!isPrepareHMPClusters) {
97 if (!prepareTracks()) {
101 if (mIsITSTPCused || mIsTPCTRDused || mIsITSTPCTRDused || mIsITSTPCTOFused || mIsTPCTOFused || mIsITSTPCTRDTOFused || mIsTPCTRDTOFused) {
106 mIsITSTPCused =
false;
107 mIsTPCTRDused =
false;
108 mIsITSTPCTRDused =
false;
109 mIsTPCTOFused =
false;
110 mIsITSTPCTRDTOFused =
false;
111 mIsTPCTRDTOFused =
false;
114bool MatchHMP::prepareTracks()
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) {
123 if (std::abs(trk.getQ2Pt()) > mMaxInvPt) {
126 this->addTPCSeed(trk, gid, time0, terr);
128 if constexpr (isTPCITSTrack<decltype(trk)>()) {
132 this->addITSTPCSeed(trk, gid, time0, terr);
134 if constexpr (isTRDTrack<decltype(trk)>()) {
135 this->addTRDSeed(trk, gid, time0, terr);
137 if constexpr (isTPCTOFTrack<decltype(trk)>()) {
138 this->addTPCTOFSeed(trk, gid, time0, terr);
146 mMatchedTracksIndex[it].resize(mTracksWork[it].
size());
147 std::fill(mMatchedTracksIndex[it].
begin(), mMatchedTracksIndex[it].
end(), -1);
171 if (mIsITSTPCused || mIsTPCTRDused || mIsITSTPCTRDused || mIsITSTPCTOFused || mIsTPCTOFused || mIsITSTPCTRDTOFused || mIsTPCTRDTOFused) {
174 LOG(
debug) << indexCache.size() <<
" tracks";
175 if (!indexCache.size()) {
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.);
191 mIsITSTPCused =
true;
193 auto trc = _tr.getParamOut();
198 addConstrainedSeed(trc, srcGID, ts);
204 mIsTPCTRDused =
true;
206 mIsITSTPCTRDused =
true;
208 mIsTPCTRDTOFused =
true;
210 mIsTPCTRDTOFused =
true;
215 auto trc = _tr.getOuterParam();
220 timeEst ts(time0, terr + mExtraTimeToleranceTRD);
222 addConstrainedSeed(trc, srcGID, ts);
228 mIsTPCTOFused =
true;
230 mIsTPCTRDTOFused =
true;
232 mIsITSTPCTRDTOFused =
true;
239 timeEst ts(time0, terr + mExtraTimeToleranceTOF);
241 addConstrainedSeed(trc, srcGID, ts);
246 std::array<float, 3> globalPos;
253 prop->getFieldXYZ(trc.getXYZGlo(), bxyz);
254 double bz = -bxyz[2];
258 if (TMath::Abs(bz - 5.0) < 0.5) {
262 if (TMath::Abs(bz - 2.0) < 0.5) {
266 if (trc.getP() > pCut && TMath::Abs(trc.getTgl()) < 0.544 && TMath::Abs(trc.getPhi() - TMath::Pi()) > (TMath::Pi() * 0.5)) {
284 std::array<float, 3> globalPos;
294 auto trc = _tr.getOuterParam();
296 float trackTime0 = _tr.getTime0() * mTPCTBinMUS;
298 timeInfo.setTimeStampError((_tr.getDeltaTBwd() + 5) * mTPCTBinMUS + extraErr);
301 timeInfo.setTimeStamp(trackTime0);
303 trc.getXYZGlo(globalPos);
314bool MatchHMP::prepareHMPClusters()
320 mMCTruthON = mHMPClusLabels && mHMPClusLabels->
getNElements();
324 mHMPTriggersWork.clear();
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];
333 mHMPTriggersWork.emplace_back(clOrig);
335 mHMPTriggersIndexCache.push_back(mHMPTriggersWork.size() - 1);
339 auto& indexCache = mHMPTriggersIndexCache;
340 LOG(
debug) << indexCache.size() <<
" HMP triggers";
341 if (!indexCache.size()) {
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.; });
355void MatchHMP::doMatching()
362 const float kdRadiator = 10.;
365 auto& cacheTriggerHMP = mHMPTriggersIndexCache;
366 auto& cacheTrk = mTracksIndexCache[
type];
367 int nTracks = cacheTrk.size(), nHMPtriggers = cacheTriggerHMP.size();
369 LOG(
debug) <<
" ************************number of tracks: " << nTracks <<
", number of HMP triggers: " << nHMPtriggers;
370 if (!nTracks || !nHMPtriggers) {
378 double cluLORS[2] = {0};
380 LOG(
debug) <<
"Trying to match %d tracks" << cacheTrk.size();
384 for (
int ievt = 0; ievt < cacheTriggerHMP.size(); ievt++) {
386 auto&
event = mHMPTriggersWork[cacheTriggerHMP[ievt]];
387 auto evtTime =
event.getIr().differenceInBCMUS(mStartIR);
391 for (
int itrk = 0; itrk < cacheTrk.size(); itrk++) {
393 auto& trackWork = mTracksWork[
type][cacheTrk[itrk]];
394 auto& trackGid = mTrackGid[
type][cacheTrk[itrk]];
395 auto& trefTrk = trackWork.first;
397 prop->getFieldXYZ(trefTrk.getXYZGlo(), bxyz);
398 double bz = -bxyz[2];
400 double timeUncert = trackWork.second.getTimeStampError();
402 float minTrkTime = (trackWork.second.getTimeStamp() - mSigmaTimeCut * timeUncert);
403 float maxTrkTime = (trackWork.second.getTimeStamp() + mSigmaTimeCut * timeUncert);
406 if (evtTime < maxTrkTime && evtTime > minTrkTime) {
412 matching.setHMPIDtrk(0, 0, 0, 0);
413 matching.setHMPIDmip(0, 0, 0, 0);
414 matching.setIdxHMPClus(99, 99999);
416 matching.setIdxTrack(trackGid);
419 hmpTrk.set(trefTrk.getX(), trefTrk.getAlpha(), trefTrk.getParams(), trefTrk.getCharge(), trefTrk.getPID());
421 double xPc, yPc, xRa, yRa, theta,
phi;
423 Int_t iCh = intTrkCha(&trefTrk, xPc, yPc, xRa, yRa, theta, phi, bz);
428 matching.setHMPIDtrk(xPc, yPc, theta, phi);
429 matching.setIdxHMPClus(iCh, 9999);
433 double dmin = 999999;
435 bool isOkDcut = kFALSE;
436 bool isOkQcut = kFALSE;
437 bool isMatched = kFALSE;
439 Cluster* bestHmpCluster =
nullptr;
440 std::vector<Cluster> oneEventClusters;
442 for (
int j =
event.getFirstEntry();
j <=
event.getLastEntry();
j++) {
445 if (cluster.ch() != iCh) {
448 oneEventClusters.push_back(cluster);
449 double qthre = pParam->
qCut();
451 if (cluster.q() < 150. || cluster.size() > 10) {
457 cluLORS[0] = cluster.x();
458 cluLORS[1] = cluster.y();
462 if (TMath::Abs((xPc - cluLORS[0]) * (xPc - cluLORS[0]) + (yPc - cluLORS[1]) * (yPc - cluLORS[1])) > 0.0001) {
464 dist = TMath::Sqrt((xPc - cluLORS[0]) * (xPc - cluLORS[0]) + (yPc - cluLORS[1]) * (yPc - cluLORS[1]));
469 index = oneEventClusters.size() - 1;
470 bestHmpCluster = &cluster;
477 if (!bestHmpCluster) {
478 oneEventClusters.clear();
482 TVector3 vG = pParam->
lors2Mars(iCh, bestHmpCluster->
x(), bestHmpCluster->
y());
486 float alpha = TMath::ATan2(gy, gx);
487 float radiusH = TMath::Sqrt(gy * gy + gx * gx);
488 if (!(hmpTrk.rotate(
alpha))) {
492 oneEventClusters.clear();
500 std::array<float, 2> trkPos{0, gz};
501 std::array<float, 3> trkCov{0.1 * 0.1, 0., 0.1 * 0.1};
504 trackC.update(trkPos, trkCov);
509 hmpTrkConstrained.set(trackC.getX(), trackC.getAlpha(), trackC.getParams(), trackC.getCharge(), trackC.getPID());
511 oneEventClusters.clear();
515 float hmpMom = hmpTrkConstrained.getP() * hmpTrkConstrained.getSign();
517 matching.setHmpMom(hmpMom);
521 double xPc0 = 0., yPc0 = 0.;
522 intTrkCha(iCh, &hmpTrkConstrained, xPc0, yPc0, xRa, yRa, theta, phi, bz);
526 int cluSize = bestHmpCluster->
size();
527 matching.setHMPIDmip(bestHmpCluster->
x(), bestHmpCluster->
y(), (
int)bestHmpCluster->
q(), 0);
528 matching.setMipClusSize(bestHmpCluster->
size());
529 matching.setIdxHMPClus(iCh,
index + 1000 * cluSize);
530 matching.setHMPIDtrk(xPc, yPc, theta, phi);
538 dmin = TMath::Sqrt((xPc - bestHmpCluster->
x()) * (xPc - bestHmpCluster->
x()) + (yPc - bestHmpCluster->
y()) * (yPc - bestHmpCluster->
y()));
549 if (isOkQcut * isOkDcut) {
554 mMatchedTracks[
type].push_back(matching);
555 oneEventClusters.clear();
564 recon->
ckovAngle(&matching, oneEventClusters,
index, nmean, xRa, yRa);
566 mMatchedTracks[
type].push_back(matching);
568 oneEventClusters.clear();
578int MatchHMP::intTrkCha(
o2::track::TrackParCov* pTrk,
double& xPc,
double& yPc,
double& xRa,
double& yRa,
double& theta,
double& phi,
double bz)
585 Int_t chInt = intTrkCha(
i, hmpTrk, xPc, yPc, xRa, yRa, theta, phi, bz);
597int MatchHMP::intTrkCha(
int ch,
o2::dataformats::TrackHMP* pHmpTrk,
double& xPc,
double& yPc,
double& xRa,
double& yRa,
double& theta,
double& phi,
double bz)
603 Double_t
p1[3], n1[3];
604 pParam->
norm(ch, n1);
606 Double_t
p2[3], n2[3];
607 pParam->
norm(ch, n2);
General auxilliary methods.
Definition of the GeometryManager class.
Header of the General Run Parameters object.
Some ALICE geometry constants of common interest.
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.
o2::dataformats::TrackHMP TrackHMP
Definition of the parameter class for the detector electronics.
Definition of the parameter class for the detector gas.
Header to collect physics constants.
Wrapper container for different reconstructed object types.
Track Length and TOF integral.
static constexpr float MAX_SIN_PHI
static constexpr float MAX_STEP
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
void run(const o2::globaltracking::RecoContainer &inp)
< perform matching for provided input
HMPID cluster implementation.
void mars2Lors(Int_t c, double *m, double &x, double &y) const
double meanIdxRad() const
void point(Int_t c, double *p, Int_t plane) const
TVector3 norm(Int_t c) const
void lors2Mars(Int_t c, double x, double y, double *m, Int_t pl=kPc) const
static bool isInside(float x, float y, float d=0)
static Param * instance()
void mars2LorsVec(Int_t c, double *m, double &th, double &ph) const
void ckovAngle(o2::dataformats::MatchInfoHMP *match, const std::vector< o2::hmpid::Cluster > clusters, int index, double nmean, float xRa, float yRa)
void setImpPC(double xPc, double yPc)
HMPID Trigger declaration.
GLfloat GLfloat GLfloat alpha
GLboolean GLboolean GLboolean b
GLint GLint GLsizei GLint GLenum GLenum type
GLboolean GLboolean GLboolean GLboolean a
constexpr float XTPCOuterRef
reference radius to propagate outer TPC track
Enum< T >::Iterator begin(Enum< T >)
uint16_t bc
bunch crossing ID of interaction
o2::InteractionRecord startIR
auto getHMPClustersMCLabels() const
auto getTPCITSTrackMCLabel(GTrackID id) const
void createTracksVariadic(T creator, GTrackID::mask_t srcSel=GTrackID::getSourcesMask("all")) const
auto getTPCTrackMCLabel(GTrackID id) const
auto getHMPClusterTriggers() const
auto getHMPClusters() const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"