15#include <TObjString.h>
49#include "GPUChainTrackingGetters.inc"
97 auto const&
raw = pc.
inputs().
get<
const char*>(
"corrMap");
98 mTPCCorrMaps = &o2::gpu::TPCFastTransformPOD::get(raw);
99 float lumiCTP = mRequestCTPLumi ? pc.
inputs().
get<
float>(
"lumiCTP") : 0;
102 static bool initOnceDone =
false;
109 geo->createPadPlaneArray();
110 geo->createClusterMatrixArray();
111 mFlatGeo = std::make_unique<GeometryFlat>(*geo);
114 cfgRecoStep.
steps = gpudatatypes::RecoStep::NoRecoStep;
133 LOG(error) <<
"Strict matching mode requested, but tracks with another close hypothesis will not be rejected. Please set trdNCandidates to at least 3.";
135 mTracker->SetProcessPerTimeFrame(
true);
136 mTracker->SetGenerateSpacePoints(
false);
142 LOG(fatal) <<
"GPUReconstruction could not be initialized";
146 LOG(info) <<
"Strict matching mode is " << ((mStrict) ?
"ON" :
"OFF");
147 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",
158 const auto& trackTune = TrackTuneParams::Instance();
159 float scale = lumiCTP;
163 mCovDiagInner = trackTune.getCovInnerTotal(scale);
164 mCovDiagOuter = trackTune.getCovOuterTotal(scale);
168 mTPCTBinMUS = elParam.ZbinWidth;
169 mTPCTBinMUSInv = 1. / mTPCTBinMUS;
171 mTPCVdrift = vd.getVDrift();
172 mTPCTDriftOffset = vd.getTimeOffset();
173 LOGP(info,
"Updating TPC VDrift factor of {} wrt reference {} and DriftTimeOffset correction {} wrt {} from source {}",
174 vd.corrFact, vd.refVDrift, vd.timeOffsetCorr, vd.refTimeOffset, mTPCVDriftHelper.
getSourceName());
175 mTracker->SetTPCVdrift(mTPCVdrift);
176 mTracker->SetTPCTDriftOffset(mTPCTDriftOffset);
190 LOG(info) <<
"cluster dictionary updated";
194#ifdef ENABLE_UPGRADES
196 LOG(info) <<
"it3 cluster dictionary updated";
211 LOG(
debug) <<
"Checking seed with label: " << lblSeed;
212 std::unordered_map<o2::MCCompLabel, unsigned int> labelCounter;
213 int maxOccurences = 0;
215 auto trkltIndex = trk.getTrackletIndex(iLy);
216 if (trkltIndex == -1) {
220 const auto& lblsTrklt = trkltLabels->
getLabels(trkltIndex);
221 for (
const auto lblTrklt : lblsTrklt) {
222 int nOcc = ++labelCounter[lblTrklt];
223 if (nOcc > maxOccurences) {
224 maxOccurences = nOcc;
229 for (
const auto& [lbl,
count] : labelCounter) {
230 LOG(
debug) <<
"Label " << lbl <<
" occured " <<
count <<
" times.";
231 if (
count == maxOccurences) {
232 if (lblSeed == lbl) {
234 mostFrequentLabel = lbl;
235 mostFrequentLabel.
setFakeFlag(maxOccurences != trk.getNtracklets());
236 lblContainerTrd.push_back(mostFrequentLabel);
237 lblContainerMatch.push_back(lblSeed);
241 mostFrequentLabel = lbl;
245 mostFrequentLabel.
setFakeFlag(maxOccurences != trk.getNtracklets());
246 lblContainerTrd.push_back(mostFrequentLabel);
248 lblContainerMatch.push_back(lblSeed);
258 int prevCollisionID = -1;
260 for (
size_t iTrk = 0; iTrk < tracks.size(); ++iTrk) {
261 const auto& trk = tracks[iTrk];
262 auto collisionID = trk.getCollisionId();
264 prevCollisionID = collisionID;
266 if (collisionID != prevCollisionID) {
268 trigRec.emplace_back(trackletTrigRec[prevCollisionID].getBCData(), iTrackFirst, nTracksCurr);
269 iTrackFirst += nTracksCurr;
270 prevCollisionID = collisionID;
275 if (nTracksCurr > 0) {
277 trigRec.emplace_back(trackletTrigRec[tracks.back().getCollisionId()].getBCData(), iTrackFirst, nTracksCurr);
286 updateTimeDependentParams(pc);
305 auto pattIt = patterns.begin();
306 mITSClustersArray.clear();
307 mITSClustersArray.reserve(clusITS.size());
308#ifdef ENABLE_UPGRADES
322 std::vector<o2::MCCompLabel> matchLabelsITSTPC;
323 std::vector<o2::MCCompLabel> trdLabelsITSTPC;
324 std::vector<o2::MCCompLabel> matchLabelsTPC;
325 std::vector<o2::MCCompLabel> trdLabelsTPC;
326 gsl::span<const o2::MCCompLabel> tpcTrackLabels;
327 gsl::span<const o2::MCCompLabel> itstpcTrackLabels;
341 bool foundFilteredTrigger =
false;
344 foundFilteredTrigger =
true;
348 if (!foundFilteredTrigger && mTrigRecFilter) {
349 static bool warningSent =
false;
351 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";
354 }
else if (foundFilteredTrigger && !mTrigRecFilter) {
355 LOG(error) <<
"Trigger filtering is not requested, but masked TRD triggers are found. Rerun tracklet transformer without trigger filtering";
359 const auto& trackTune = TrackTuneParams::Instance();
360 LOG(
debug) <<
"Start loading input seeds into TRD tracker";
361 int nTracksLoadedITSTPC = 0;
362 int nTracksLoadedTPC = 0;
366 GPUTRDTracker::HelperTrackAttributes trkAttribs;
367 trkAttribs.mTime = trkITSTPC.getTimeMUS().getTimeStamp();
368 trkAttribs.mTimeAddMax = trkITSTPC.getTimeMUS().getTimeStampError() * mRec->
GetParam().
rec.trd.nSigmaTerrITSTPC + mRec->
GetParam().
rec.trd.addTimeRoadITSTPC;
369 trkAttribs.mTimeSubMax = trkITSTPC.getTimeMUS().getTimeStampError() * mRec->
GetParam().
rec.trd.nSigmaTerrITSTPC + mRec->
GetParam().
rec.trd.addTimeRoadITSTPC;
373 if (mTracker->LoadTrack(trkLoad, trackGID.getRaw(),
true, &trkAttribs)) {
376 ++nTracksLoadedITSTPC;
377 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);
386 GPUTRDTracker::HelperTrackAttributes trkAttribs;
387 trkAttribs.mTime = trkTpc.getTime0() * mTPCTBinMUS - mTPCTDriftOffset;
388 trkAttribs.mTimeAddMax = trkTpc.getDeltaTFwd() * mTPCTBinMUS;
389 trkAttribs.mTimeSubMax = trkTpc.getDeltaTBwd() * mTPCTBinMUS;
390 if (trkTpc.hasASideClustersOnly()) {
391 trkAttribs.mSide = -1;
392 }
else if (trkTpc.hasCSideClustersOnly()) {
393 trkAttribs.mSide = 1;
396 if (!trackTune.sourceLevelTPC) {
397 if (trackTune.useTPCOuterCorr) {
398 trkLoad.updateParams(trackTune.tpcParOuter);
400 if (trackTune.tpcCovOuterType != TrackTuneParams::AddCovType::Disable) {
401 trkLoad.updateCov(mCovDiagOuter, trackTune.tpcCovOuterType == TrackTuneParams::AddCovType::WithCorrelations);
405 if (mTracker->LoadTrack(trkLoad, trackGID.getRaw(),
true, &trkAttribs)) {
409 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);
411 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);
417 uint32_t firstOrbit = 0;
418 for (
size_t ft0id = 0; ft0id < ft0recPoints.size(); ft0id++) {
419 const auto& f0rec = ft0recPoints[ft0id];
421 firstOrbit = f0rec.getInteractionRecord().orbit;
424 uint32_t currentOrbit = f0rec.getInteractionRecord().orbit;
430 mTracker->SetFT0TriggeredBC(mTriggeredBCFT0.data(), mTriggeredBCFT0.size());
438 std::vector<TrackTRD> tracksOutITSTPC;
439 std::vector<TrackTRD> tracksOutTPC;
440 std::vector<TrackTriggerRecord> trackTrigRecITSTPC;
441 std::vector<TrackTriggerRecord> trackTrigRecTPC;
443 std::vector<unsigned int> trackIdxArray(mTracker->NTracks());
444 std::iota(trackIdxArray.begin(), trackIdxArray.end(), 0);
445 std::sort(trackIdxArray.begin(), trackIdxArray.end(), [tracksOutRaw](
int lhs,
int rhs) { return tracksOutRaw[lhs].getCollisionId() < tracksOutRaw[rhs].getCollisionId(); });
447 std::vector<std::pair<uint8_t, uint8_t>> pileUpDist;
448 bool ft0Seen =
false;
450 long maxDiffFwd = mTracker->Param().rec.trd.pileupFwdNBC;
451 long maxDiffBwd = mTracker->Param().rec.trd.pileupBwdNBC;
453 auto trdTriggers = tmpInputContainer->mTriggerRecords;
454 ft0Seen = ft0recPoints.size() > 0;
455 pileUpDist.resize(trdTriggers.size(), {0, 0});
457 for (
size_t itrd = 0; itrd < trdTriggers.size(); itrd++) {
458 const auto& trig = trdTriggers[itrd];
459 uint8_t fwd = 0, bwd = 0;
460 for (
size_t ft0id = curFT0; ft0id < ft0recPoints.size(); ft0id++) {
461 const auto& f0rec = ft0recPoints[ft0id];
463 auto bcdiff = trig.getBCData().toLong() - f0rec.getInteractionRecord().toLong();
464 if (bcdiff > maxDiffBwd) {
470 bwd = uint8_t(bcdiff);
473 if (bcdiff < -maxDiffFwd) {
476 fwd = uint8_t(-bcdiff);
480 pileUpDist[itrd] = {bwd, fwd};
484 int nTrackletsAttached = 0;
485 int nTracksFailedTPCTRDRefit = 0;
486 int nTracksFailedITSTPCTRDRefit = 0;
487 for (
int iTrk = 0; iTrk < mTracker->NTracks(); ++iTrk) {
488 const auto& trdTrack = mTracker->Tracks()[trackIdxArray[iTrk]];
489 if (trdTrack.getCollisionId() < 0) {
493 if (mStrict && (trdTrack.getIsAmbiguous() || trdTrack.getReducedChi2() > mTracker->Param().rec.trd.chi2StrictCut)) {
497 if (trdTrack.getNtracklets() < mTracker->Param().rec.trd.nTrackletsMin) {
500 if (trdTrack.getChi2() / trdTrack.getNtracklets() > mTracker->Param().rec.trd.maxChi2Red) {
503 nTrackletsAttached += trdTrack.getNtracklets();
504 auto trackGID = trdTrack.getRefGlobalTrackId();
507 tracksOutITSTPC.push_back(trdTrack);
509 tracksOutITSTPC.back().setPileUpDistance(pileUpDist[trdTrack.getCollisionId()].first, pileUpDist[trdTrack.getCollisionId()].second);
511 tracksOutITSTPC.back().setPileUpDistance(mTracker->Param().rec.trd.pileupBwdNBC, mTracker->Param().rec.trd.pileupFwdNBC);
514 tracksOutITSTPC.pop_back();
515 ++nTracksFailedITSTPCTRDRefit;
522 tracksOutITSTPC.back().setSignal(mBase->process(trdTrack, inputTracks,
false));
526 tracksOutTPC.push_back(trdTrack);
528 tracksOutTPC.back().setPileUpDistance(pileUpDist[trdTrack.getCollisionId()].first, pileUpDist[trdTrack.getCollisionId()].second);
530 tracksOutTPC.back().setPileUpDistance(mTracker->Param().rec.trd.pileupBwdNBC, mTracker->Param().rec.trd.pileupFwdNBC);
533 tracksOutTPC.pop_back();
534 ++nTracksFailedTPCTRDRefit;
541 tracksOutTPC.back().setSignal(mBase->process(trdTrack, inputTracks,
true));
549 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",
550 tracksOutTPC.size(), tracksOutITSTPC.size(), nTrackletsAttached, mChainTracking->
mIOPtrs.
nTRDTracklets);
551 LOGF(info,
"Number of tracks failed in the refit: TPC-TRD (%i), ITS-TPC-TRD (%i)", nTracksFailedTPCTRDRefit, nTracksFailedITSTPCTRDRefit);
576 static bool first =
true;
582 md.SetOwnerKeyValue();
583 md.Add(
new TObjString(o2::gpu::internal::GPUConfigurableParamGPUSettingsRecTRD::Instance().
getName().c_str()),
new TObjString(
o2::conf::ConfigurableParam::asJSON(o2::gpu::internal::GPUConfigurableParamGPUSettingsRecTRD::Instance().
getName()).c_str()));
594 auto& outerParam = trk.getOuterParam();
596 int nCl = -1, clEntry = -1, nClRefit = 0, clRefs[14];
597 float chi2Out = 0, timeZErr = 0.;
598 bool pileUpOn = trk.hasPileUpInfo();
602 const auto& trkITS = mITSTracksArray[detRefs[
GTrackID::ITS]];
603 outerParam = trkITS.getParamOut();
604 outerParam.setPID(recoCont->
getTPCITSTrack(trk.getRefGlobalTrackId()).getPID(),
true);
605 nCl = trkITS.getNumberOfClusters();
606 clEntry = trkITS.getFirstClusterEntry();
607 chi2Out = trkITS.getChi2();
608 for (
int icl = 0; icl < nCl; icl++) {
609 clRefs[icl] = mITSTrackClusIdx[clEntry + icl];
613 nCl = trkITSABref.getNClusters();
614 clEntry = trkITSABref.getFirstEntry();
616 outerParam.resetCovariance(100);
618 for (
int icl = 0; icl < nCl; icl++) {
619 const auto& clus = mITSClustersArray[clRefs[nCl - icl - 1] = mITSABTrackClusIdx[clEntry + icl]];
620 if (!outerParam.rotate(geom->getSensorRefAlpha(clus.getSensorID())) ||
624 chi2Out += outerParam.getPredictedChi2(clus);
625 if (!outerParam.update(clus)) {
630 if (nClRefit != nCl) {
631 LOG(
debug) <<
"ITS-AB refit outward failed";
639 LOG(
debug) <<
"Propagation to inner TPC boundary X=" << xtogo <<
" failed, Xtr=" << outerParam.getX() <<
" snp=" << outerParam.getSnp();
642 int retVal = mTPCRefitter->RefitTrackAsTrackParCov(outerParam, mTPCTracksArray[detRefs[
GTrackID::TPC]].getClusterRef(), timeTRD * mTPCTBinMUSInv, &chi2Out,
true,
false);
644 LOG(
debug) <<
"TPC refit outwards failed";
649 LOG(
debug) <<
"TRD refit outwards failed";
656 LOG(
debug) <<
"TRD refit inwards failed";
659 auto posStart = trk.getXYZGlo();
660 retVal = mTPCRefitter->RefitTrackAsTrackParCov(trk, mTPCTracksArray[detRefs[
GTrackID::TPC]].getClusterRef(), timeTRD * mTPCTBinMUSInv, &chi2In,
false,
false);
662 LOG(
debug) <<
"TPC refit inwards failed";
668 LOG(
debug) <<
"BACK-Propagationto inner boundary failed";
671 auto posEnd = trk.getXYZGlo();
672 auto lInt = propagator->estimateLTIncrement(trk, posStart, posEnd);
673 trk.getLTIntegralOut().addStep(lInt, trk.getQ2P2());
676 const auto& trackTune = TrackTuneParams::Instance();
677 if (trackTune.tpcCovInnerType != TrackTuneParams::AddCovType::Disable || trackTune.useTPCInnerCorr) {
679 LOG(
debug) <<
"Propagation to TPC inner reference X for ITS refit inwards failed";
682 if (!trackTune.useTPCInnerCorr) {
683 trk.updateParams(trackTune.tpcParInner);
685 if (trackTune.tpcCovInnerType != TrackTuneParams::AddCovType::Disable) {
686 trk.updateCov(mCovDiagInner, trackTune.tpcCovInnerType == TrackTuneParams::AddCovType::WithCorrelations);
691 for (
int icl = 0; icl < nCl; icl++) {
692 const auto& clus = mITSClustersArray[clRefs[icl]];
693 if (!trk.rotate(geom->getSensorRefAlpha(clus.getSensorID())) ||
700 chi2In += trk.getPredictedChi2(clus);
701 if (!trk.update(clus)) {
706 if (nClRefit != nCl) {
707 LOG(
debug) <<
"ITS refit inwards failed";
715 if (!propagator->propagateToDCA(vtxDummy.getXYZ(), trkPar, propagator->getNominalBz(),
o2::base::Propagator::MAX_STEP, matCorr,
nullptr, &trk.getLTIntegralOut())) {
716 LOG(error) <<
"LTOF integral might be incorrect";
726 auto& outerParam = trk.getOuterParam();
729 float chi2Out = 0, timeZErr = 0.;
730 bool pileUpOn = trk.hasPileUpInfo();
731 int retVal = mTPCRefitter->RefitTrackAsTrackParCov(outerParam, mTPCTracksArray[detRefs[
GTrackID::TPC]].getClusterRef(), timeTRD * mTPCTBinMUSInv, &chi2Out,
true,
false);
733 LOG(
debug) <<
"TPC refit outwards failed";
737 timeZErr = mTPCVdrift * trk.getPileUpTimeErrorMUS();
741 LOG(
debug) <<
"TRD refit outwards failed";
748 LOG(
debug) <<
"TRD refit inwards failed";
751 auto posStart = trk.getXYZGlo();
752 retVal = mTPCRefitter->RefitTrackAsTrackParCov(trk, mTPCTracksArray[detRefs[
GTrackID::TPC]].getClusterRef(), timeTRD * mTPCTBinMUSInv, &chi2In,
false,
false);
754 LOG(
debug) <<
"TPC refit inwards failed";
763 LOG(
debug) <<
"BACK-Propagationto inner boundary failed";
766 auto posEnd = trk.getXYZGlo();
767 auto lInt = propagator->estimateLTIncrement(trk, posStart, posEnd);
768 trk.getLTIntegralOut().addStep(lInt, trk.getQ2P2());
772 LOG(
debug) <<
"Final propagation to inner TPC radius failed (not removing the track because of this)";
775 const auto& trackTune = TrackTuneParams::Instance();
776 if (!trackTune.useTPCInnerCorr) {
777 trk.updateParams(trackTune.tpcParInner);
779 if (trackTune.tpcCovInnerType != TrackTuneParams::AddCovType::Disable) {
780 trk.updateCov(mCovDiagInner, trackTune.tpcCovInnerType == TrackTuneParams::AddCovType::WithCorrelations);
783 propagator->estimateLTFast(trk.getLTIntegralOut(), trk);
791 int lyStart = inwards ?
NLAYER - 1 : 0;
792 int direction = inwards ? -1 : 1;
793 int lyEnd = inwards ? -1 :
NLAYER;
800 tofL = &trk.getLTIntegralOut();
802 trkParam = &trk.getOuterParam();
803 trkParam->setUserField(trk.getUserField());
805 const auto& trackTune = TrackTuneParams::Instance();
806 if ((trackTune.useTPCOuterCorr || trackTune.tpcCovOuterType != TrackTuneParams::AddCovType::Disable) &&
807 (!tpcSA || !trackTune.sourceLevelTPC)) {
809 LOG(
debug) <<
"Propagation to TPC outer reference X for TRD outward refit failed";
812 if (trackTune.useTPCOuterCorr) {
813 trkParam->updateParams(trackTune.tpcParOuter);
815 if (trackTune.tpcCovOuterType != TrackTuneParams::AddCovType::Disable) {
816 trkParam->updateCov(mCovDiagOuter, trackTune.tpcCovOuterType == TrackTuneParams::AddCovType::WithCorrelations);
822 float tCorrPileUp = 0.;
823 float tErrPileUp2 = 0;
827 float sumCorr2 = 0.f;
829 for (
int iBC = 0; iBC < mTriggeredBCFT0.size(); iBC++) {
831 if (deltaBC <= mRecoParam.getPileUpRangeBefore() || deltaBC >= mRecoParam.getPileUpRangeAfter()) {
835 std::array<int, 6> q0;
836 std::array<int, 6> q1;
837 for (
int iLy = 0; iLy <
NLAYER; iLy++) {
838 int trkltId = trk.getTrackletIndex(iLy);
843 q0[iLy] = mTrackletsRaw[trkltId].getQ0();
844 q1[iLy] = mTrackletsRaw[trkltId].getQ1();
848 float probBC = mRecoParam.getPileUpProbTrack(deltaBC, q0, q1);
849 sumCorr += probBC * deltaBC;
850 sumCorr2 += probBC * deltaBC * deltaBC;
852 if (probBC > maxProb) {
854 tCorrPileUp = -deltaBC;
857 if (sumProb > 1e-6) {
858 tErrPileUp2 = sumCorr2 / sumProb - 2 * tCorrPileUp * sumCorr / sumProb + tCorrPileUp * tCorrPileUp;
863 trkParam->resetCovariance(100);
865 for (
int iLy = lyStart; iLy != lyEnd; iLy += direction) {
866 int trkltId = trk.getTrackletIndex(iLy);
870 int trkltDet = mTrackletsRaw[trkltId].getDetector();
874 LOGF(
debug,
"Track at alpha=%.2f could not be rotated in tracklet coordinate system with alpha=%.2f", trkParam->getAlpha(),
o2::math_utils::sector2Angle(trkltSec));
879 LOGF(
debug,
"Track propagation failed in layer %i (pt=%f, xTrk=%f, xToGo=%f)", iLy, trkParam->getPt(), trkParam->getX(), mTrackletsCalib[trkltId].getX());
883 float tilt = tan(TMath::DegToRad() * pad->getTiltingAngle());
885 float tiltCorrUp = tilt * (mTrackletsCalib[trkltId].getZ() - trkParam->getZ());
886 float zPosCorrUp = mTrackletsCalib[trkltId].getZ() + mRecoParam.getZCorrCoeffNRC() * trkParam->getTgl();
887 float padLength = pad->getRowSize(mTrackletsRaw[trkltId].getPadRow());
888 if (!((trkParam->getSigmaZ2() < (padLength * padLength / 12.f)) && (std::fabs(mTrackletsCalib[trkltId].getZ() - trkParam->getZ()) < padLength))) {
893 float slopeFactor = mTrackletsRaw[trkltId].getSlopeFloat() * pad->getWidthIPad() / 4.f;
894 float yCorrPileUp = tCorrPileUp * slopeFactor;
895 float yAddErrPileUp2 = tErrPileUp2 * slopeFactor * slopeFactor;
897 int nTrackletsChamber = mTracker->GetNtrackletsChamber(trk.getCollisionId(), trkltDet);
898 float angularPull = (mTrackletsCalib[trkltId].getDy() + dyTiltCorr - mRecoParam.convertAngleToDy(trkParam->getSnp())) / std::sqrt(mRecoParam.getDyRes(trkParam->getSnp(), nTrackletsChamber));
900 std::array<float, 2> trkltPosUp{mTrackletsCalib[trkltId].getY() - tiltCorrUp + yCorrPileUp, zPosCorrUp};
901 std::array<float, 3> trkltCovUp;
902 mRecoParam.recalcTrkltCov(tilt, trkParam->getSnp(), pad->getRowSize(mTrackletsRaw[trkltId].getPadRow()), trkltCovUp, (mRec->
GetParam().
rec.trd.useAngularPull != 0 ? angularPull : 0.), nTrackletsChamber);
903 trkltCovUp[0] += yAddErrPileUp2;
905 chi2 += trkParam->getPredictedChi2(trkltPosUp, trkltCovUp);
906 if (!trkParam->update(trkltPosUp, trkltCovUp)) {
907 LOGF(
debug,
"Failed to update track with space point in layer %i", iLy);
915 LOG(
debug) <<
"Propagation to TPC outer reference X after TRD inward refit failed";
923 LOG(
debug) <<
"Propagation/rotation to TPC outer reference X after TRD inward refit failed " << trkParam->asString();
932 LOGF(info,
"TRD global tracking total timing: Cpu: %.3e Real: %.3e s in %d slots",
933 mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
938 std::vector<OutputSpec> outputs;
940 std::shared_ptr<DataRequest> dataRequest = std::make_shared<DataRequest>();
942 dataRequest->setMatchingInputStrict();
947 dataRequest->requestTPCClusters(
false);
950#ifdef ENABLE_UPGRADES
952 dataRequest->requestIT3Clusters(
false);
954 dataRequest->requestITSClusters(
false);
957 dataRequest->requestITSClusters(
false);
961 dataRequest->requestTracks(trkSrc, useMC);
962 auto& inputs = dataRequest->inputs;
963 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
976 if (requestCTPLumi) {
985 inputs.emplace_back(
"lq1dlut",
"TRD",
"LQ1D", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD/PID/LQ1D"));
988 inputs.emplace_back(
"lq2dlut",
"TRD",
"LQ2D", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD/PID/LQ2D"));
991 inputs.emplace_back(
"lq3dlut",
"TRD",
"LQ3D", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD/PID/LQ3D"));
993#ifdef TRDPID_WITH_ONNX
995 inputs.emplace_back(
"xgb",
"TRD",
"XGB", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD_test/PID_new/xgb"));
998 inputs.emplace_back(
"py",
"TRD",
"py", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD_test/PID_new/py"));
1004 throw std::runtime_error(
"Unable to load requested PID policy data!");
1007 inputs.emplace_back(
"localgainfactors",
"TRD",
"LOCALGAINFACTORS", 0, Lifetime::Condition,
ccdbParamSpec(
"TRD/Calib/LocalGainFactor"));
1028 if (trigRecFilterActive) {
1029 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)";
1033 outputs.emplace_back(
"META",
"TRDTRACKER", 0, Lifetime::Sporadic);
1036 std::regex reg(
"[,\\[\\]]+");
1037 processorName = regex_replace(processorName, reg,
"_");
1043 AlgorithmSpec{adaptFromTask<TRDGlobalTracking>(useMC, withPID, policy, dataRequest, ggRequest,
src, trigRecFilterActive, strict, requestCTPLumi)},
Definition of the ITS/MFT clusterer settings.
std::string getName(const TDataMember *dm, int index, int size)
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 std::string asJSON(std::string const &keyOnly="")
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.
size_t inputTimesliceId
The time pipelining id of this particular device.
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"