47#include "GPUChainTrackingGetters.inc"
94 auto const&
raw = pc.
inputs().
get<
const char*>(
"corrMap");
95 mTPCCorrMaps = &o2::gpu::TPCFastTransformPOD::get(raw);
96 float lumiCTP = mRequestCTPLumi ? pc.
inputs().
get<
float>(
"lumiCTP") : 0;
99 static bool initOnceDone =
false;
106 geo->createPadPlaneArray();
107 geo->createClusterMatrixArray();
108 mFlatGeo = std::make_unique<GeometryFlat>(*geo);
111 cfgRecoStep.
steps = gpudatatypes::RecoStep::NoRecoStep;
130 LOG(error) <<
"Strict matching mode requested, but tracks with another close hypothesis will not be rejected. Please set trdNCandidates to at least 3.";
132 mTracker->SetProcessPerTimeFrame(
true);
133 mTracker->SetGenerateSpacePoints(
false);
139 LOG(fatal) <<
"GPUReconstruction could not be initialized";
143 LOG(info) <<
"Strict matching mode is " << ((mStrict) ?
"ON" :
"OFF");
144 LOGF(info,
"The search road in time for ITS-TPC tracks is set to %.1f sigma and %.2f us are added to it on top",
155 const auto& trackTune = TrackTuneParams::Instance();
156 float scale = lumiCTP;
160 mCovDiagInner = trackTune.getCovInnerTotal(scale);
161 mCovDiagOuter = trackTune.getCovOuterTotal(scale);
165 mTPCTBinMUS = elParam.ZbinWidth;
166 mTPCTBinMUSInv = 1. / mTPCTBinMUS;
168 mTPCVdrift = vd.getVDrift();
169 mTPCTDriftOffset = vd.getTimeOffset();
170 LOGP(info,
"Updating TPC VDrift factor of {} wrt reference {} and DriftTimeOffset correction {} wrt {} from source {}",
171 vd.corrFact, vd.refVDrift, vd.timeOffsetCorr, vd.refTimeOffset, mTPCVDriftHelper.
getSourceName());
172 mTracker->SetTPCVdrift(mTPCVdrift);
173 mTracker->SetTPCTDriftOffset(mTPCTDriftOffset);
187 LOG(info) <<
"cluster dictionary updated";
191#ifdef ENABLE_UPGRADES
193 LOG(info) <<
"it3 cluster dictionary updated";
208 LOG(
debug) <<
"Checking seed with label: " << lblSeed;
209 std::unordered_map<o2::MCCompLabel, unsigned int> labelCounter;
210 int maxOccurences = 0;
212 auto trkltIndex = trk.getTrackletIndex(iLy);
213 if (trkltIndex == -1) {
217 const auto& lblsTrklt = trkltLabels->
getLabels(trkltIndex);
218 for (
const auto lblTrklt : lblsTrklt) {
219 int nOcc = ++labelCounter[lblTrklt];
220 if (nOcc > maxOccurences) {
221 maxOccurences = nOcc;
226 for (
const auto& [lbl,
count] : labelCounter) {
227 LOG(
debug) <<
"Label " << lbl <<
" occured " <<
count <<
" times.";
228 if (
count == maxOccurences) {
229 if (lblSeed == lbl) {
231 mostFrequentLabel = lbl;
232 mostFrequentLabel.
setFakeFlag(maxOccurences != trk.getNtracklets());
233 lblContainerTrd.push_back(mostFrequentLabel);
234 lblContainerMatch.push_back(lblSeed);
238 mostFrequentLabel = lbl;
242 mostFrequentLabel.
setFakeFlag(maxOccurences != trk.getNtracklets());
243 lblContainerTrd.push_back(mostFrequentLabel);
245 lblContainerMatch.push_back(lblSeed);
255 int prevCollisionID = -1;
257 for (
size_t iTrk = 0; iTrk < tracks.size(); ++iTrk) {
258 const auto& trk = tracks[iTrk];
259 auto collisionID = trk.getCollisionId();
261 prevCollisionID = collisionID;
263 if (collisionID != prevCollisionID) {
265 trigRec.emplace_back(trackletTrigRec[prevCollisionID].getBCData(), iTrackFirst, nTracksCurr);
266 iTrackFirst += nTracksCurr;
267 prevCollisionID = collisionID;
272 if (nTracksCurr > 0) {
274 trigRec.emplace_back(trackletTrigRec[tracks.back().getCollisionId()].getBCData(), iTrackFirst, nTracksCurr);
283 updateTimeDependentParams(pc);
301 auto pattIt = patterns.begin();
302 mITSClustersArray.clear();
303 mITSClustersArray.reserve(clusITS.size());
304#ifdef ENABLE_UPGRADES
318 std::vector<o2::MCCompLabel> matchLabelsITSTPC;
319 std::vector<o2::MCCompLabel> trdLabelsITSTPC;
320 std::vector<o2::MCCompLabel> matchLabelsTPC;
321 std::vector<o2::MCCompLabel> trdLabelsTPC;
322 gsl::span<const o2::MCCompLabel> tpcTrackLabels;
323 gsl::span<const o2::MCCompLabel> itstpcTrackLabels;
337 bool foundFilteredTrigger =
false;
340 foundFilteredTrigger =
true;
344 if (!foundFilteredTrigger && mTrigRecFilter) {
345 static bool warningSent =
false;
347 LOG(warning) <<
"Trigger filtering requested, but no TRD trigger is actually masked. Can be that none needed to be masked or that the setting was not active for the tracklet transformer";
350 }
else if (foundFilteredTrigger && !mTrigRecFilter) {
351 LOG(error) <<
"Trigger filtering is not requested, but masked TRD triggers are found. Rerun tracklet transformer without trigger filtering";
355 const auto& trackTune = TrackTuneParams::Instance();
356 LOG(
debug) <<
"Start loading input seeds into TRD tracker";
357 int nTracksLoadedITSTPC = 0;
358 int nTracksLoadedTPC = 0;
362 GPUTRDTracker::HelperTrackAttributes trkAttribs;
363 trkAttribs.mTime = trkITSTPC.getTimeMUS().getTimeStamp();
364 trkAttribs.mTimeAddMax = trkITSTPC.getTimeMUS().getTimeStampError() * mRec->
GetParam().
rec.trd.nSigmaTerrITSTPC + mRec->
GetParam().
rec.trd.addTimeRoadITSTPC;
365 trkAttribs.mTimeSubMax = trkITSTPC.getTimeMUS().getTimeStampError() * mRec->
GetParam().
rec.trd.nSigmaTerrITSTPC + mRec->
GetParam().
rec.trd.addTimeRoadITSTPC;
369 if (mTracker->LoadTrack(trkLoad, trackGID.getRaw(),
true, &trkAttribs)) {
372 ++nTracksLoadedITSTPC;
373 LOGF(
debug,
"Loaded ITS-TPC track %i with time %f. Window from %f to %f", nTracksLoadedITSTPC, trkAttribs.mTime, trkAttribs.mTime - trkAttribs.mTimeSubMax, trkAttribs.mTime + trkAttribs.mTimeAddMax);
382 GPUTRDTracker::HelperTrackAttributes trkAttribs;
383 trkAttribs.mTime = trkTpc.getTime0() * mTPCTBinMUS - mTPCTDriftOffset;
384 trkAttribs.mTimeAddMax = trkTpc.getDeltaTFwd() * mTPCTBinMUS;
385 trkAttribs.mTimeSubMax = trkTpc.getDeltaTBwd() * mTPCTBinMUS;
386 if (trkTpc.hasASideClustersOnly()) {
387 trkAttribs.mSide = -1;
388 }
else if (trkTpc.hasCSideClustersOnly()) {
389 trkAttribs.mSide = 1;
392 if (!trackTune.sourceLevelTPC) {
393 if (trackTune.useTPCOuterCorr) {
394 trkLoad.updateParams(trackTune.tpcParOuter);
396 if (trackTune.tpcCovOuterType != TrackTuneParams::AddCovType::Disable) {
397 trkLoad.updateCov(mCovDiagOuter, trackTune.tpcCovOuterType == TrackTuneParams::AddCovType::WithCorrelations);
401 if (mTracker->LoadTrack(trkLoad, trackGID.getRaw(),
true, &trkAttribs)) {
405 LOGF(
debug,
"Loaded TPC track %i with time %f. Window from %f to %f", nTracksLoadedTPC, trkAttribs.mTime, trkAttribs.mTime - trkAttribs.mTimeSubMax, trkAttribs.mTime + trkAttribs.mTimeAddMax);
407 LOGF(info,
"%i tracks are loaded into the TRD tracker. Out of those %i ITS-TPC tracks and %i TPC tracks", nTracksLoadedITSTPC + nTracksLoadedTPC, nTracksLoadedITSTPC, nTracksLoadedTPC);
413 uint32_t firstOrbit = 0;
414 for (
size_t ft0id = 0; ft0id < ft0recPoints.size(); ft0id++) {
415 const auto& f0rec = ft0recPoints[ft0id];
417 firstOrbit = f0rec.getInteractionRecord().orbit;
420 uint32_t currentOrbit = f0rec.getInteractionRecord().orbit;
426 mTracker->SetFT0TriggeredBC(mTriggeredBCFT0.data(), mTriggeredBCFT0.size());
434 std::vector<TrackTRD> tracksOutITSTPC;
435 std::vector<TrackTRD> tracksOutTPC;
436 std::vector<TrackTriggerRecord> trackTrigRecITSTPC;
437 std::vector<TrackTriggerRecord> trackTrigRecTPC;
439 std::vector<unsigned int> trackIdxArray(mTracker->NTracks());
440 std::iota(trackIdxArray.begin(), trackIdxArray.end(), 0);
441 std::sort(trackIdxArray.begin(), trackIdxArray.end(), [tracksOutRaw](
int lhs,
int rhs) { return tracksOutRaw[lhs].getCollisionId() < tracksOutRaw[rhs].getCollisionId(); });
443 std::vector<std::pair<uint8_t, uint8_t>> pileUpDist;
444 bool ft0Seen =
false;
446 long maxDiffFwd = mTracker->Param().rec.trd.pileupFwdNBC;
447 long maxDiffBwd = mTracker->Param().rec.trd.pileupBwdNBC;
449 auto trdTriggers = tmpInputContainer->mTriggerRecords;
450 ft0Seen = ft0recPoints.size() > 0;
451 pileUpDist.resize(trdTriggers.size(), {0, 0});
453 for (
size_t itrd = 0; itrd < trdTriggers.size(); itrd++) {
454 const auto& trig = trdTriggers[itrd];
455 uint8_t fwd = 0, bwd = 0;
456 for (
size_t ft0id = curFT0; ft0id < ft0recPoints.size(); ft0id++) {
457 const auto& f0rec = ft0recPoints[ft0id];
459 auto bcdiff = trig.getBCData().toLong() - f0rec.getInteractionRecord().toLong();
460 if (bcdiff > maxDiffBwd) {
466 bwd = uint8_t(bcdiff);
469 if (bcdiff < -maxDiffFwd) {
472 fwd = uint8_t(-bcdiff);
476 pileUpDist[itrd] = {bwd, fwd};
480 int nTrackletsAttached = 0;
481 int nTracksFailedTPCTRDRefit = 0;
482 int nTracksFailedITSTPCTRDRefit = 0;
483 for (
int iTrk = 0; iTrk < mTracker->NTracks(); ++iTrk) {
484 const auto& trdTrack = mTracker->Tracks()[trackIdxArray[iTrk]];
485 if (trdTrack.getCollisionId() < 0) {
489 if (mStrict && (trdTrack.getIsAmbiguous() || trdTrack.getReducedChi2() > mTracker->Param().rec.trd.chi2StrictCut)) {
493 if (trdTrack.getNtracklets() < mTracker->Param().rec.trd.nTrackletsMin) {
496 if (trdTrack.getChi2() / trdTrack.getNtracklets() > mTracker->Param().rec.trd.maxChi2Red) {
499 nTrackletsAttached += trdTrack.getNtracklets();
500 auto trackGID = trdTrack.getRefGlobalTrackId();
503 tracksOutITSTPC.push_back(trdTrack);
505 tracksOutITSTPC.back().setPileUpDistance(pileUpDist[trdTrack.getCollisionId()].first, pileUpDist[trdTrack.getCollisionId()].second);
507 tracksOutITSTPC.back().setPileUpDistance(mTracker->Param().rec.trd.pileupBwdNBC, mTracker->Param().rec.trd.pileupFwdNBC);
510 tracksOutITSTPC.pop_back();
511 ++nTracksFailedITSTPCTRDRefit;
518 tracksOutITSTPC.back().setSignal(mBase->process(trdTrack, inputTracks,
false));
522 tracksOutTPC.push_back(trdTrack);
524 tracksOutTPC.back().setPileUpDistance(pileUpDist[trdTrack.getCollisionId()].first, pileUpDist[trdTrack.getCollisionId()].second);
526 tracksOutTPC.back().setPileUpDistance(mTracker->Param().rec.trd.pileupBwdNBC, mTracker->Param().rec.trd.pileupFwdNBC);
529 tracksOutTPC.pop_back();
530 ++nTracksFailedTPCTRDRefit;
537 tracksOutTPC.back().setSignal(mBase->process(trdTrack, inputTracks,
true));
545 LOGF(info,
"The TRD tracker found %lu tracks from TPC seeds and %lu tracks from ITS-TPC seeds and attached in total %i tracklets out of %i",
546 tracksOutTPC.size(), tracksOutITSTPC.size(), nTrackletsAttached, mChainTracking->
mIOPtrs.
nTRDTracklets);
547 LOGF(info,
"Number of tracks failed in the refit: TPC-TRD (%i), ITS-TPC-TRD (%i)", nTracksFailedTPCTRDRefit, nTracksFailedITSTPCTRDRefit);
567 static bool first =
true;
583 auto& outerParam = trk.getOuterParam();
585 int nCl = -1, clEntry = -1, nClRefit = 0, clRefs[14];
586 float chi2Out = 0, timeZErr = 0.;
587 bool pileUpOn = trk.hasPileUpInfo();
591 const auto& trkITS = mITSTracksArray[detRefs[
GTrackID::ITS]];
592 outerParam = trkITS.getParamOut();
593 outerParam.setPID(recoCont->
getTPCITSTrack(trk.getRefGlobalTrackId()).getPID(),
true);
594 nCl = trkITS.getNumberOfClusters();
595 clEntry = trkITS.getFirstClusterEntry();
596 chi2Out = trkITS.getChi2();
597 for (
int icl = 0; icl < nCl; icl++) {
598 clRefs[icl] = mITSTrackClusIdx[clEntry + icl];
602 nCl = trkITSABref.getNClusters();
603 clEntry = trkITSABref.getFirstEntry();
605 outerParam.resetCovariance(100);
607 for (
int icl = 0; icl < nCl; icl++) {
608 const auto& clus = mITSClustersArray[clRefs[nCl - icl - 1] = mITSABTrackClusIdx[clEntry + icl]];
609 if (!outerParam.rotate(geom->getSensorRefAlpha(clus.getSensorID())) ||
613 chi2Out += outerParam.getPredictedChi2(clus);
614 if (!outerParam.update(clus)) {
619 if (nClRefit != nCl) {
620 LOG(
debug) <<
"ITS-AB refit outward failed";
628 LOG(
debug) <<
"Propagation to inner TPC boundary X=" << xtogo <<
" failed, Xtr=" << outerParam.getX() <<
" snp=" << outerParam.getSnp();
631 int retVal = mTPCRefitter->RefitTrackAsTrackParCov(outerParam, mTPCTracksArray[detRefs[
GTrackID::TPC]].getClusterRef(), timeTRD * mTPCTBinMUSInv, &chi2Out,
true,
false);
633 LOG(
debug) <<
"TPC refit outwards failed";
638 LOG(
debug) <<
"TRD refit outwards failed";
645 LOG(
debug) <<
"TRD refit inwards failed";
648 auto posStart = trk.getXYZGlo();
649 retVal = mTPCRefitter->RefitTrackAsTrackParCov(trk, mTPCTracksArray[detRefs[
GTrackID::TPC]].getClusterRef(), timeTRD * mTPCTBinMUSInv, &chi2In,
false,
false);
651 LOG(
debug) <<
"TPC refit inwards failed";
657 LOG(
debug) <<
"BACK-Propagationto inner boundary failed";
660 auto posEnd = trk.getXYZGlo();
661 auto lInt = propagator->estimateLTIncrement(trk, posStart, posEnd);
662 trk.getLTIntegralOut().addStep(lInt, trk.getQ2P2());
665 const auto& trackTune = TrackTuneParams::Instance();
666 if (trackTune.tpcCovInnerType != TrackTuneParams::AddCovType::Disable || trackTune.useTPCInnerCorr) {
668 LOG(
debug) <<
"Propagation to TPC inner reference X for ITS refit inwards failed";
671 if (!trackTune.useTPCInnerCorr) {
672 trk.updateParams(trackTune.tpcParInner);
674 if (trackTune.tpcCovInnerType != TrackTuneParams::AddCovType::Disable) {
675 trk.updateCov(mCovDiagInner, trackTune.tpcCovInnerType == TrackTuneParams::AddCovType::WithCorrelations);
680 for (
int icl = 0; icl < nCl; icl++) {
681 const auto& clus = mITSClustersArray[clRefs[icl]];
682 if (!trk.rotate(geom->getSensorRefAlpha(clus.getSensorID())) ||
689 chi2In += trk.getPredictedChi2(clus);
690 if (!trk.update(clus)) {
695 if (nClRefit != nCl) {
696 LOG(
debug) <<
"ITS refit inwards failed";
704 if (!propagator->propagateToDCA(vtxDummy.getXYZ(), trkPar, propagator->getNominalBz(),
o2::base::Propagator::MAX_STEP, matCorr,
nullptr, &trk.getLTIntegralOut())) {
705 LOG(error) <<
"LTOF integral might be incorrect";
715 auto& outerParam = trk.getOuterParam();
718 float chi2Out = 0, timeZErr = 0.;
719 bool pileUpOn = trk.hasPileUpInfo();
720 int retVal = mTPCRefitter->RefitTrackAsTrackParCov(outerParam, mTPCTracksArray[detRefs[
GTrackID::TPC]].getClusterRef(), timeTRD * mTPCTBinMUSInv, &chi2Out,
true,
false);
722 LOG(
debug) <<
"TPC refit outwards failed";
726 timeZErr = mTPCVdrift * trk.getPileUpTimeErrorMUS();
730 LOG(
debug) <<
"TRD refit outwards failed";
737 LOG(
debug) <<
"TRD refit inwards failed";
740 auto posStart = trk.getXYZGlo();
741 retVal = mTPCRefitter->RefitTrackAsTrackParCov(trk, mTPCTracksArray[detRefs[
GTrackID::TPC]].getClusterRef(), timeTRD * mTPCTBinMUSInv, &chi2In,
false,
false);
743 LOG(
debug) <<
"TPC refit inwards failed";
752 LOG(
debug) <<
"BACK-Propagationto inner boundary failed";
755 auto posEnd = trk.getXYZGlo();
756 auto lInt = propagator->estimateLTIncrement(trk, posStart, posEnd);
757 trk.getLTIntegralOut().addStep(lInt, trk.getQ2P2());
761 LOG(
debug) <<
"Final propagation to inner TPC radius failed (not removing the track because of this)";
764 const auto& trackTune = TrackTuneParams::Instance();
765 if (!trackTune.useTPCInnerCorr) {
766 trk.updateParams(trackTune.tpcParInner);
768 if (trackTune.tpcCovInnerType != TrackTuneParams::AddCovType::Disable) {
769 trk.updateCov(mCovDiagInner, trackTune.tpcCovInnerType == TrackTuneParams::AddCovType::WithCorrelations);
772 propagator->estimateLTFast(trk.getLTIntegralOut(), trk);
780 int lyStart = inwards ?
NLAYER - 1 : 0;
781 int direction = inwards ? -1 : 1;
782 int lyEnd = inwards ? -1 :
NLAYER;
789 tofL = &trk.getLTIntegralOut();
791 trkParam = &trk.getOuterParam();
792 trkParam->setUserField(trk.getUserField());
794 const auto& trackTune = TrackTuneParams::Instance();
795 if ((trackTune.useTPCOuterCorr || trackTune.tpcCovOuterType != TrackTuneParams::AddCovType::Disable) &&
796 (!tpcSA || !trackTune.sourceLevelTPC)) {
798 LOG(
debug) <<
"Propagation to TPC outer reference X for TRD outward refit failed";
801 if (trackTune.useTPCOuterCorr) {
802 trkParam->updateParams(trackTune.tpcParOuter);
804 if (trackTune.tpcCovOuterType != TrackTuneParams::AddCovType::Disable) {
805 trkParam->updateCov(mCovDiagOuter, trackTune.tpcCovOuterType == TrackTuneParams::AddCovType::WithCorrelations);
811 float tCorrPileUp = 0.;
812 float tErrPileUp2 = 0;
816 float sumCorr2 = 0.f;
818 for (
int iBC = 0; iBC < mTriggeredBCFT0.size(); iBC++) {
820 if (deltaBC <= mRecoParam.getPileUpRangeBefore() || deltaBC >= mRecoParam.getPileUpRangeAfter()) {
824 std::array<int, 6> q0;
825 std::array<int, 6> q1;
826 for (
int iLy = 0; iLy <
NLAYER; iLy++) {
827 int trkltId = trk.getTrackletIndex(iLy);
832 q0[iLy] = mTrackletsRaw[trkltId].getQ0();
833 q1[iLy] = mTrackletsRaw[trkltId].getQ1();
837 float probBC = mRecoParam.getPileUpProbTrack(deltaBC, q0, q1);
838 sumCorr += probBC * deltaBC;
839 sumCorr2 += probBC * deltaBC * deltaBC;
841 if (probBC > maxProb) {
843 tCorrPileUp = -deltaBC;
846 if (sumProb > 1e-6) {
847 tErrPileUp2 = sumCorr2 / sumProb - 2 * tCorrPileUp * sumCorr / sumProb + tCorrPileUp * tCorrPileUp;
852 trkParam->resetCovariance(100);
854 for (
int iLy = lyStart; iLy != lyEnd; iLy += direction) {
855 int trkltId = trk.getTrackletIndex(iLy);
859 int trkltDet = mTrackletsRaw[trkltId].getDetector();
863 LOGF(
debug,
"Track at alpha=%.2f could not be rotated in tracklet coordinate system with alpha=%.2f", trkParam->getAlpha(),
o2::math_utils::sector2Angle(trkltSec));
868 LOGF(
debug,
"Track propagation failed in layer %i (pt=%f, xTrk=%f, xToGo=%f)", iLy, trkParam->getPt(), trkParam->getX(), mTrackletsCalib[trkltId].getX());
872 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
874 float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trkParam->getZ());
875 float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trkParam->getTgl();
876 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
877 if (!((trkParam->getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trkParam->getZ()) < padLength))) {
882 float slopeFactor = mTrackletsRaw[trkltId].getSlopeFloat() * pad->getWidthIPad() / 4.f;
883 float yCorrPileUp = tCorrPileUp * slopeFactor;
884 float yAddErrPileUp2 = tErrPileUp2 * slopeFactor * slopeFactor;
886 int nTrackletsChamber = mTracker->GetNtrackletsChamber(trk.getCollisionId(), trkltDet);
887 float angularPull = (mTrackletsCalib[trkltId].getDy() + dyTiltCorr - mRecoParam.convertAngleToDy(trkParam->getSnp())) / std::sqrt(mRecoParam.getDyRes(trkParam->getSnp(), nTrackletsChamber));
889 std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp + yCorrPileUp, zPosCorrUp};
890 std::array<float, 3> trkltCovUp;
891 mRecoParam.recalcTrkltCov(tilt, trkParam->getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp, (mRec->
GetParam().
rec.trd.useAngularPull != 0 ? angularPull : 0.), nTrackletsChamber);
892 trkltCovUp[0] += yAddErrPileUp2;
894 chi2 += trkParam->getPredictedChi2(trkltPosUp, trkltCovUp);
895 if (!trkParam->update(trkltPosUp, trkltCovUp)) {
896 LOGF(
debug,
"Failed to update track with space point in layer %i", iLy);
904 LOG(
debug) <<
"Propagation to TPC outer reference X after TRD inward refit failed";
912 LOG(
debug) <<
"Propagation/rotation to TPC outer reference X after TRD inward refit failed " << trkParam->asString();
921 LOGF(info,
"TRD global tracking total timing: Cpu: %.3e Real: %.3e s in %d slots",
922 mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
927 std::vector<OutputSpec> outputs;
929 std::shared_ptr<DataRequest> dataRequest = std::make_shared<DataRequest>();
931 dataRequest->setMatchingInputStrict();
936 dataRequest->requestTPCClusters(
false);
939#ifdef ENABLE_UPGRADES
941 dataRequest->requestIT3Clusters(
false);
943 dataRequest->requestITSClusters(
false);
946 dataRequest->requestITSClusters(
false);
950 dataRequest->requestTracks(trkSrc, useMC);
951 auto& inputs = dataRequest->inputs;
952 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
965 if (requestCTPLumi) {
974 inputs.emplace_back(
"lq1dlut",
"TRD",
"LQ1D", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD/PID/LQ1D"));
977 inputs.emplace_back(
"lq2dlut",
"TRD",
"LQ2D", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD/PID/LQ2D"));
980 inputs.emplace_back(
"lq3dlut",
"TRD",
"LQ3D", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD/PID/LQ3D"));
982#ifdef TRDPID_WITH_ONNX
984 inputs.emplace_back(
"xgb",
"TRD",
"XGB", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD_test/PID_new/xgb"));
987 inputs.emplace_back(
"py",
"TRD",
"py", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD_test/PID_new/py"));
993 throw std::runtime_error(
"Unable to load requested PID policy data!");
996 inputs.emplace_back(
"localgainfactors",
"TRD",
"LOCALGAINFACTORS", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD/Calib/LocalGainFactor"));
1017 if (trigRecFilterActive) {
1018 LOG(info) <<
"Matching to TPC-only tracks requested, but IRs without ITS contribution are filtered out (used strict matching mode to constrain TPC tracks before matching to ITS)";
1023 std::regex reg(
"[,\\[\\]]+");
1024 processorName = regex_replace(processorName, reg,
"_");
1030 AlgorithmSpec{adaptFromTask<TRDGlobalTracking>(useMC, withPID, policy, dataRequest, ggRequest,
src, trigRecFilterActive, strict, requestCTPLumi)},
Definition of the ITS/MFT clusterer settings.
Definition of the Names Generator class.
Definition of the GeometryManager class.
o2::raw::RawFileWriter * raw
TRD Tracklet word for GPU tracker - 32bit tracklet info + half chamber ID + index.
Some ALICE geometry constants of common interest.
Definition of the GeometryTGeo class.
Definition of the parameter class for the detector electronics.
Declarations of the helper class for clusters / roadwidth matching.
Result of refitting TPC-ITS matched track.
Configurable params for tracks ad hoc tuning.
Helper class to obtain TPC clusters / digits / labels from DPL.
void setFakeFlag(bool v=true)
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
static std::string getConfigOutputFileName(const std::string &procName, const std::string &confName="", bool json=true)
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)
static const ParameterElectronics & Instance()
static void write(std::string const &filename, std::string const &keyOnly="")
void snapshot(const Output &spec, T const &object)
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
void SetTRDGeometry(std::unique_ptr< o2::trd::GeometryFlat > &&geo)
void SetO2Propagator(const o2::base::Propagator *prop)
void SetTRDRecoParam(std::unique_ptr< GPUTRDRecoParam > &&par)
int32_t DoTRDGPUTracking(T *externalInstance=nullptr)
GPUTrackingInOutPointers & mIOPtrs
static float getNominalGPUBz(T &src)
void SetupGPUProcessor(T *proc, bool allocate)
void RegisterGPUProcessor(T *proc, bool deviceSlave)
void SetSettings(float solenoidBzNominalGPU, const GPURecoStepConfiguration *workflow=nullptr)
T * AddChain(Args... args)
static GPUReconstruction * CreateInstance(const GPUSettingsDeviceBackend &cfg)
const GPUParam & GetParam() const
const GPUSettingsProcessing & GetProcessingSettings() const
void init(float bz, const GPUSettingsRec *rec=nullptr)
Load parameterization for given magnetic field.
void PrintSettings() const
void SetNCandidates(int32_t n)
static std::shared_ptr< const tmpDataContainer > fillIOPtr(GPUTrackingInOutPointers &ioPtr, const o2::globaltracking::RecoContainer &recoCont, bool useMC, const GPUCalibObjectsConst *calib=nullptr, GID::mask_t maskCl=GID::MASK_ALL, GID::mask_t maskTrk=GID::MASK_ALL, GID::mask_t maskMatch=GID::MASK_ALL)
static GeometryTGeo * Instance()
void fillMatrixCache(int mask) override
static void requestCCDBInputs(std::vector< o2::framework::InputSpec > &inputs, bool laser=true, bool itstpcTgl=true)
void extractCCDBInputs(o2::framework::ProcessingContext &pc, bool laser=true, bool itstpcTgl=true)
const VDriftCorrFact & getVDriftObject() const
bool accountCCDBInputs(const o2::framework::ConcreteDataMatcher &matcher, void *obj)
static std::string_view getSourceName(Source s)
static Geometry * instance()
void fillMCTruthInfo(const TrackTRD &trk, o2::MCCompLabel lblSeed, std::vector< o2::MCCompLabel > &lblContainerTrd, std::vector< o2::MCCompLabel > &lblContainerMatch, const o2::dataformats::MCTruthContainer< o2::MCCompLabel > *trkltLabels) const
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void run(o2::framework::ProcessingContext &pc) final
bool refitTRDTrack(TrackTRD &trk, float &chi2, bool inwards, bool tpcSA)
void init(o2::framework::InitContext &ic) final
bool refitITSTPCTRDTrack(TrackTRD &trk, float timeTRD, o2::globaltracking::RecoContainer *recoCont)
void fillTrackTriggerRecord(const std::vector< TrackTRD > &tracks, std::vector< TrackTriggerRecord > &trigRec, const gsl::span< const o2::trd::TriggerRecord > &trackletTrigRec) const
bool refitTPCTRDTrack(TrackTRD &trk, float timeTRD, o2::globaltracking::RecoContainer *recoCont)
constexpr o2::header::DataOrigin gDataOriginCTP
constexpr o2::header::DataOrigin gDataOriginTPC
constexpr o2::header::DataOrigin gDataOriginTRD
constexpr float XTPCOuterRef
reference radius to propagate outer TPC track
constexpr float XTPCInnerRef
reference radius at which TPC provides the tracks
constexpr double LHCBunchSpacingMUS
constexpr int LHCMaxBunches
Defining ITS Vertex explicitly as messageable.
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
GPUTRDTracker_t< GPUTRDTrack, GPUTRDPropagator > GPUTRDTracker
void convertCompactClusters(gsl::span< const itsmft::CompClusterExt > clusters, gsl::span< const unsigned char >::iterator &pattIt, std::vector< o2::BaseCluster< float > > &output, const o2::its3::TopologyDictionary *dict)
convert compact clusters to 3D spacepoints
void convertCompactClusters(gsl::span< const itsmft::CompClusterExt > clusters, gsl::span< const unsigned char >::iterator &pattIt, std::vector< o2::BaseCluster< float > > &output, const itsmft::TopologyDictionary *dict)
convert compact clusters to 3D spacepoints
int angle2Sector(float phi)
float sector2Angle(int sect)
constexpr int NLAYER
the number of layers
constexpr int NSTACK
the number of stacks per sector
framework::DataProcessorSpec getTRDGlobalTrackingSpec(bool useMC, o2::dataformats::GlobalTrackID::mask_t src, bool trigRecFilterActive, bool strict, bool withPID, PIDPolicy policy, bool requestCTPLumi)
create a processor spec
std::unique_ptr< PIDBase > getTRDPIDPolicy(PIDPolicy policy)
Factory function to create a PID policy.
PIDPolicy
Option for available PID policies.
@ LQ3D
3-Dimensional Likelihood model
@ LQ2D
2-Dimensional Likelihood model
@ Dummy
Dummy object outputting -1.f.
@ LQ1D
1-Dimensional Likelihood model
auto getRecoInputContainer(o2::framework::ProcessingContext &pc, o2::gpu::GPUTrackingInOutPointers *ptrs, const o2::globaltracking::RecoContainer *inputTracks, bool mc=false)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string name
The name of the associated DataProcessorSpec.
auto getITSTracks() const
GlobalIDSet getSingleDetectorRefs(GTrackID gidx) const
gsl::span< const o2::trd::CalibratedTracklet > getTRDCalibratedTracklets() const
auto getITSTracksClusterRefs() const
auto getITSABRefs() const
auto getTPCTracksClusterRefs() const
auto getITSClustersPatterns() const
const o2::dataformats::MCTruthContainer< o2::MCCompLabel > * getTRDTrackletsMCLabels() const
gsl::span< const unsigned char > clusterShMapTPC
externally set TPC clusters sharing map
const o2::dataformats::TrackTPCITS & getTPCITSTrack(GTrackID gid) const
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
auto getTPCTracksMCLabels() const
auto getFT0RecPoints() const
std::unique_ptr< o2::tpc::internal::getWorkflowTPCInput_ret > inputsTPCclusters
auto getTPCTracks() const
gsl::span< const unsigned int > occupancyMapTPC
externally set TPC clusters occupancy map
auto getITSABClusterRefs() const
auto getITSClusters() const
auto getTPCITSTracksMCLabels() const
gsl::span< const o2::trd::Tracklet64 > getTRDTracklets() const
GPUSettingsProcessing configProcessing
GPUSettingsO2 ReadConfigurableParam()
GPUSettingsRec configReconstruction
gpudatatypes::RecoStepField steps
gpudatatypes::InOutTypeField inputs
gpudatatypes::InOutTypeField outputs
float solenoidBzNominalGPU
const o2::dataformats::TrackTPCITS * tracksTPCITSO2
uint32_t nOutputTracksTPCO2
const o2::tpc::TrackTPC * outputTracksTPCO2
const float * trdTriggerTimes
const uint8_t * trdTrigRecMask
uint32_t nTRDTriggerRecords
static std::string concat_string(Ts const &... ts)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"