13#include <TStopwatch.h>
58#include "GPUParam.inc"
63#include <unordered_map>
81using VTIndexV = std::pair<int, o2::dataformats::VtxTrackIndex>;
92 : mDataRequest(dr), mGGCCDBRequest(gr), mTracksSrc(
src), mCheckSV(checkSV) {}
98 void process(const
o2::globaltracking::RecoContainer& recoData);
101 void processTPCTrackRefs();
102 void processITSTracks(const
o2::globaltracking::RecoContainer& recoData);
103 void loadTPCOccMap(const
o2::globaltracking::RecoContainer& recoData);
104 void fillMCClusterInfo(const
o2::globaltracking::RecoContainer& recoData);
105 void prepareITSData(const
o2::globaltracking::RecoContainer& recoData);
106 bool processMCParticle(
int src,
int ev,
int trid);
107 bool addMCParticle(const
MCTrack& mctr, const
o2::
MCCompLabel& lb, TParticlePDG* pPDG =
nullptr);
110 bool refitV0(
int i,
o2::dataformats::
V0&
v0, const
o2::globaltracking::RecoContainer& recoData);
112 float getDCAYCut(
float pt) const;
114 const
std::vector<
o2::
MCTrack>* mCurrMCTracks =
nullptr;
115 TVector3 mCurrMCVertex;
116 o2::tpc::VDriftHelper mTPCVDriftHelper{};
118 std::shared_ptr<DataRequest> mDataRequest;
119 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
120 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOut;
121 std::vector<float> mTBinClOcc;
122 std::vector<float> mTBinClOccHist;
123 std::vector<long> mIntBC;
124 std::vector<float> mTPCOcc;
125 std::vector<int> mITSOcc;
129 bool mCheckSV =
false;
130 bool mRecProcStage =
false;
131 int mNTPCOccBinLength = 0;
132 float mNTPCOccBinLengthInv = -1.f;
134 float mITSTimeBiasMUS = 0.f;
135 float mITSROFrameLengthMUS = 0.f;
136 float mTPCTBinMUS = 0.;
138 int mNCheckDecays = 0;
142 std::vector<int> mITSROF;
143 std::vector<TBracket> mITSROFBracket;
144 std::vector<o2::MCCompLabel> mDecProdLblPool;
145 std::vector<MCVertex> mMCVtVec{};
151 int daughterFirst = -1;
152 int daughterLast = -1;
155 std::vector<std::vector<DecayRef>> mDecaysMaps;
156 std::unordered_map<o2::MCCompLabel, TrackFamily> mSelMCTracks;
157 std::unordered_map<o2::MCCompLabel, std::pair<int, int>> mSelTRefIdx;
158 std::vector<o2::track::TrackPar> mSelTRefs;
160 static constexpr float MaxSnp = 0.9;
168 mDBGOut = std::make_unique<o2::utils::TreeStreamRedirector>(
"trackMCStudy.root",
"recreate");
169 mVerbose = ic.
options().
get<
int>(
"device-verbosity");
172 for (
int id = 0;
id <
sizeof(
params.decayPDG) /
sizeof(
int);
id++) {
173 if (
params.decayPDG[
id] < 0) {
178 mDecaysMaps.resize(mNCheckDecays);
184 for (
int i = 0;
i < mNCheckDecays;
i++) {
185 mDecaysMaps[
i].clear();
187 mDecProdLblPool.clear();
189 mCurrMCTracks =
nullptr;
192 updateTimeDependentParams(pc);
193 mRecProcStage =
false;
201 auto const&
raw = pc.
inputs().
get<
const char*>(
"corrMap");
202 mTPCCorrMaps = &o2::gpu::TPCFastTransformPOD::get(raw);
203 static bool initOnceDone =
false;
207 mITSROFrameLengthMUS =
o2::base::GRPGeomHelper::instance().
getGRPECS()->isDetContinuousReadOut(o2::detectors::DetID::ITS) ? alpParamsITS.roFrameLengthInBC * o2::constants::lhc::LHCBunchSpacingMUS : alpParamsITS.roFrameLengthTrig * 1.e-3;
208 LOGP(info,
"VertexTrackMatcher ITSROFrameLengthMUS:{}", mITSROFrameLengthMUS);
211 mTPCTBinMUS = elParam.ZbinWidth;
216 mFitterV0.
setOldMode(svparam.oldDCAFitterMode);
217 mFitterV0.setUseAbsDCA(svparam.useAbsDCA);
218 mFitterV0.setPropagateToPCA(
false);
219 mFitterV0.setMaxR(svparam.maxRIni);
220 mFitterV0.setMinParamChange(svparam.minParamChange);
221 mFitterV0.setMinRelChi2Change(svparam.minRelChi2Change);
222 mFitterV0.setMaxDZIni(svparam.maxDZIni);
223 mFitterV0.setMaxDXYIni(svparam.maxDXYIni);
224 mFitterV0.setMaxChi2(svparam.maxChi2);
226 mFitterV0.setUsePropagator(svparam.usePropagator);
227 mFitterV0.setRefitWithMatCorr(svparam.refitWithMatCorr);
228 mFitterV0.setMaxStep(svparam.maxStep);
229 mFitterV0.setMaxSnp(svparam.maxSnp);
230 mFitterV0.setMinXSeed(svparam.minXSeed);
237 constexpr float SQRT12Inv = 0.288675f;
244 int nv = vtxRefs.size();
248 prepareITSData(recoData);
249 loadTPCOccMap(recoData);
250 auto getITSPatt = [&](
GTrackID gid, uint8_t& ncl) {
254 ncl = itsTrf.getNClusters();
255 for (
int il = 0; il < 7; il++) {
256 if (itsTrf.hasHitOnLayer(il)) {
263 for (
int il = 0; il < 7; il++) {
264 if (itsTr.hasHitOnLayer(il)) {
275 uint8_t clSect = 0, clRow = 0, lowestR = -1;
280 for (
int ic = 0; ic < trc.getNClusterReferences(); ic++) {
281 trc.getClusterReference(clRefs, ic, clSect, clRow, clIdx);
282 if (clRow < lowestR) {
286 unsigned int absoluteIndex = tpcClusAcc.clusterOffset[clSect][clRow] + clIdx;
291 tref.lowestPadRow = lowestR;
292 const auto& clus = tpcClusAcc.clusters[clSect][clRow][clIdx];
293 int padFromEdge = int(clus.getPad()), npads = o2::gpu::GPUTPCGeometry::NPads(clRow);
294 if (padFromEdge > npads / 2) {
295 padFromEdge = npads - 1 - padFromEdge;
297 tref.padFromEdge = uint8_t(padFromEdge);
298 trc.getClusterReference(clRefs, 0, clSect, clRow, clIdx);
299 tref.rowMaxTPC = clRow;
306 const auto* TPCClMClab = recoData.
inputsTPCclusters->clusterIndex.clustersMCTruth;
308 for (
int ic = 0; ic < trc.getNClusterReferences(); ic++) {
309 uint8_t clSect = 0, clRow = 0;
311 trc.getClusterReference(clRefs, ic, clSect, clRow, clIdx);
312 auto labels = TPCClMClab->getLabels(clIdx + TPCClusterIdxStruct.clusterOffset[clSect][clRow]);
313 for (
auto& lbl :
labels) {
331 std::array<int, o2::globaltracking::MaxITSLayers> ITSTimeBias{}, ITSROFLen{};
332 std::array<unsigned int, o2::globaltracking::MaxITSLayers> rofCount{};
333 for (
int lr = 0; lr < nLrOcc; lr++) {
335 ITSTimeBias[lr] = alpParITS.getROFBiasInBC(lr);
336 ITSROFLen[lr] = alpParITS.getROFLengthInBC(lr);
338 for (
const auto& mcIR : mcEvRecords) {
339 long tbc = mcIR.differenceInBC(recoData.
startIR);
340 auto& mcVtx = mMCVtVec.emplace_back();
341 mcVtx.ts = tbc * o2::constants::lhc::LHCBunchSpacingMUS + mcIR.getTimeOffsetWrtBC() * 1e-3;
342 mcVtx.ID = mIntBC.size();
343 mIntBC.push_back(tbc);
344 int occBin = tbc / 8 * mNTPCOccBinLengthInv;
345 mTPCOcc.push_back(occBin < 0 ? mTBinClOcc[0] : (occBin >= mTBinClOcc.size() ? mTBinClOcc.back() : mTBinClOcc[occBin]));
347 long gbc = mcIR.toLong();
349 for (
int lr = 0; lr < nLrOcc; lr++) {
350 const auto& rofs = ITSClusROFRec[lr];
351 while (rofCount[lr] < rofs.size()) {
352 long rofbcMin = rofs[rofCount[lr]].getBCData().toLong() + ITSTimeBias[lr], rofbcMax = rofbcMin + ITSROFLen[lr];
353 if (gbc < rofbcMin) {
355 }
else if (gbc < rofbcMax) {
356 itsOcc += rofs[rofCount[lr]].getNEntries();
362 mITSOcc.push_back(itsOcc);
363 if (mNTPCOccBinLengthInv > 0.f) {
364 mcVtx.occTPCV.resize(
params.nOccBinsDrift);
365 int grp = TMath::Max(1, TMath::Nint(
params.nTBPerOccBin * mNTPCOccBinLengthInv));
366 for (
int ib = 0; ib <
params.nOccBinsDrift; ib++) {
368 int tbs = occBin + TMath::Nint(ib *
params.nTBPerOccBin * mNTPCOccBinLengthInv);
369 for (
int ig = 0; ig < grp; ig++) {
370 if (tbs >= 0 && tbs <
int(mTBinClOccHist.size())) {
371 smb += mTBinClOccHist[tbs];
375 mcVtx.occTPCV[ib] = smb;
381 int curSrcMC = 0, curEvMC = 0;
382 for (curSrcMC = 0; curSrcMC < (int)mcReader.
getNSources(); curSrcMC++) {
384 LOGP(info,
"Source {}", curSrcMC);
387 bool okAccVtx =
true;
388 if (nev != (
int)mMCVtVec.size()) {
389 LOGP(
debug,
"source {} has {} events while {} MC vertices were booked", curSrcMC, nev, mMCVtVec.size());
391 if (nev > (
int)mMCVtVec.size()) {
395 for (curEvMC = 0; curEvMC < nev; curEvMC++) {
397 LOGP(info,
"Event {}", curEvMC);
399 mCurrMCTracks = &mcReader.
getTracks(curSrcMC, curEvMC);
402 auto&
pos = mMCVtVec[curEvMC].pos;
404 pos[0] = mCurrMCVertex.X();
405 pos[1] = mCurrMCVertex.Y();
406 pos[2] = mCurrMCVertex.Z();
409 for (
int itr = 0; itr < mCurrMCTracks->size(); itr++) {
410 processMCParticle(curSrcMC, curEvMC, itr);
415 for (
int id = 0;
id < mNCheckDecays;
id++) {
416 LOGP(info,
"Decay PDG={} : {} entries",
params.decayPDG[
id], mDecaysMaps[
id].size());
421 mRecProcStage =
true;
422 for (
int iv = 0; iv < nv; iv++) {
424 LOGP(info,
"processing PV {} of {}", iv, nv);
428 if (iv < (
int)pvvecLbl.size()) {
429 pvLbl = pvvecLbl[iv];
432 mMCVtVec[pvLbl.
getEventID()].recVtx.emplace_back(
RecPV{pvvec[iv], pvLbl});
435 const auto& vtref = vtxRefs[iv];
438 if (!mTracksSrc[is] || !recoData.
isTrackSourceLoaded(is) || !(dm[DetID::ITS] || dm[DetID::TPC])) {
441 int idMin = vtref.getFirstEntryOfSource(is), idMax = idMin + vtref.getEntriesOfSource(is);
442 for (
int i = idMin;
i < idMax;
i++) {
443 auto vid = trackIndex[
i];
445 if (trc.getPt() <
params.minPt || std::abs(trc.getTgl()) >
params.maxTgl) {
451 auto entry = mSelMCTracks.find(lbl);
452 if (
entry == mSelMCTracks.end()) {
453 if (lbl.getSourceID() != curSrcMC || lbl.getEventID() != curEvMC) {
454 curSrcMC = lbl.getSourceID();
455 curEvMC = lbl.getEventID();
456 mCurrMCTracks = &mcReader.
getTracks(curSrcMC, curEvMC);
459 if (!acceptMCCharged((*mCurrMCTracks)[lbl.getTrackID()], lbl)) {
462 entry = mSelMCTracks.find(lbl);
464 auto& trackFamily =
entry->second;
465 if (vid.isAmbiguous()) {
466 if (trackFamily.contains(vid)) {
470 auto& trf = trackFamily.recTracks.emplace_back();
474 while (dm[DetID::ITS] && dm[DetID::TPC]) {
480 if (lblITS == trackFamily.mcTrackInfo.label) {
484 if (trcITSF.getPt() <
params.minPt || std::abs(trcITSF.getTgl()) >
params.maxTgl) {
487 auto entryOfFake = mSelMCTracks.find(lblITS);
488 if (entryOfFake == mSelMCTracks.end()) {
491 auto& trackFamilyOfFake = entryOfFake->second;
492 auto& trfOfFake = trackFamilyOfFake.recTracks.emplace_back();
497 LOGP(info,
"Matched rec track {} to MC track {}", vid.asString(),
entry->first.asString());
506 LOGP(info,
"collected {} MC tracks", mSelMCTracks.size());
507 if (
params.minTPCRefsToExtractClRes > 0 ||
params.storeTPCTrackRefs) {
508 processTPCTrackRefs();
512 for (
auto&
entry : mSelMCTracks) {
513 auto& trackFam =
entry.second;
514 auto&
tracks = trackFam.recTracks;
520 LOGP(info,
"Processing MC track#{} {} -> {} reconstructed tracks", mcnt - 1,
entry.first.asString(),
tracks.size());
524 const auto mskL = lhs.gid.getSourceDetectorsMask();
525 const auto mskR = rhs.gid.getSourceDetectorsMask();
526 bool itstpcL = mskL[DetID::ITS] && mskL[DetID::TPC], itstpcR = mskR[DetID::ITS] && mskR[DetID::TPC];
527 if (itstpcL && !itstpcR) {
530 return lhs.gid.getSource() > rhs.gid.getSource();
532 if (
params.storeTPCTrackRefs) {
533 auto rft = mSelTRefIdx.find(
entry.first);
534 if (rft != mSelTRefIdx.end()) {
535 auto rfent = rft->second;
536 for (
int irf = rfent.first; irf < rfent.second; irf++) {
537 trackFam.mcTrackInfo.trackRefsTPC.push_back(mSelTRefs[irf]);
543 for (
auto& tref :
tracks) {
544 if (tref.gid.isSourceSet()) {
550 auto msk = tref.gid.getSourceDetectorsMask();
551 if (msk[DetID::ITS]) {
553 tref.pattITS = getITSPatt(gidSet[
GTrackID::ITS], tref.nClITS);
554 if (trackFam.entITS < 0) {
555 trackFam.entITS = tcnt;
558 if (lblITS.isFake()) {
561 if (lblITS == trackFam.mcTrackInfo.label) {
562 trackFam.entITSFound = tcnt;
570 if (msk[DetID::TPC]) {
571 if (trackFam.entITSTPC < 0) {
572 trackFam.entITSTPC = tcnt;
578 if (msk[DetID::TRD]) {
582 if (msk[DetID::TOF]) {
588 if (msk[DetID::TOF]) {
596 if (msk[DetID::TPC]) {
598 tref.nClTPC = trtpc.getNClusters();
599 if (trtpc.hasBothSidesClusters()) {
602 fillTPCClusterInfo(trtpc, tref);
603 flagTPCClusters(trtpc,
entry.first);
604 if (trackFam.entTPC < 0) {
605 trackFam.entTPC = tcnt;
606 trackFam.tpcT0 = trtpc.getTime0();
611 if (!msk[DetID::ITS]) {
612 if (msk[DetID::TRD]) {
616 if (msk[DetID::TOF]) {
622 if (msk[DetID::TOF]) {
630 float ts = 0, terr = 0;
635 const auto& itsBra = mITSROFBracket[mITSROF[tref.gid.getIndex()]];
636 tref.ts =
timeEst{itsBra.mean(), itsBra.delta() * SQRT12Inv};
639 LOGP(info,
"Invalid entry {} of {} getTrackMCLabel {}", tcnt,
tracks.size(), tref.gid.asString());
643 if (trackFam.entITS > -1 && trackFam.entTPC > -1) {
648 if (propagateToRefX(trcTPC, trcITS)) {
649 trackFam.trackITSProp = trcITS;
650 trackFam.trackTPCProp = trcTPC;
652 trackFam.trackITSProp.invalidate();
653 trackFam.trackTPCProp.invalidate();
656 trackFam.trackITSProp.invalidate();
657 trackFam.trackTPCProp.invalidate();
663 auto v0s = recoData.getV0sIdx();
666 s += fmt::format(
" par {} Ntpccl={} Nitscl={} ",
f.mcTrackInfo.pdgParent,
f.mcTrackInfo.nTPCCl,
f.mcTrackInfo.nITSCl);
667 for (
auto& t :
f.recTracks) {
668 s += t.gid.asString();
673 for (
int svID; svID < (int)v0s.size(); svID++) {
674 const auto& v0idx = v0s[svID];
675 int nOKProngs = 0, realMCSVID = -1;
676 int8_t decTypeID = -1;
677 for (
int ipr = 0; ipr < v0idx.getNProngs(); ipr++) {
678 auto mcl = recoData.getTrackMCLabel(v0idx.getProngID(ipr));
679 auto itl = mSelMCTracks.find(mcl);
680 if (itl == mSelMCTracks.end()) {
684 auto& trackFamily = itl->second;
685 int decayParentIndex = trackFamily.mcTrackInfo.parentEntry;
686 if (decayParentIndex < 0) {
690 realMCSVID = decayParentIndex;
691 decTypeID = trackFamily.mcTrackInfo.parentDecID;
693 LOGP(
debug,
"Prong{} {} comes from {}/{}", ipr, prpr(trackFamily), decTypeID, realMCSVID);
696 if (realMCSVID != decayParentIndex || decTypeID != trackFamily.mcTrackInfo.parentDecID) {
699 LOGP(
debug,
"Prong{} {} comes from {}/{}", ipr, prpr(trackFamily), decTypeID, realMCSVID);
702 if (nOKProngs == v0idx.getNProngs()) {
703 LOGP(
debug,
"Decay {}/{} was found", decTypeID, realMCSVID);
704 mDecaysMaps[decTypeID][realMCSVID].foundSVID = svID;
710 fillMCClusterInfo(recoData);
713 for (
auto&
entry : mSelMCTracks) {
714 auto& trackFam =
entry.second;
715 (*mDBGOut) <<
"tracks" <<
"tr=" << trackFam <<
"\n";
719 std::vector<TrackFamily> decFam;
720 for (
int id = 0;
id < mNCheckDecays;
id++) {
721 std::string decTreeName = fmt::format(
"dec{}",
params.decayPDG[
id]);
722 for (
const auto& dec : mDecaysMaps[
id]) {
725 for (
int idd = dec.daughterFirst; idd <= dec.daughterLast; idd++) {
726 auto dtLbl = mDecProdLblPool[idd];
727 const auto& dtFamily = mSelMCTracks[dtLbl];
728 if (dtFamily.mcTrackInfo.pdgParent != dec.pdg) {
729 LOGP(error,
"{}-th decay (pdg={}): {} in {}:{} range refers to MC track with pdgParent = {}",
id,
params.decayPDG[
id], idd, dec.daughterFirst, dec.daughterLast, dtFamily.mcTrackInfo.pdgParent);
733 decFam.push_back(dtFamily);
737 if (dec.foundSVID >= 0 && !refitV0(dec.foundSVID,
v0, recoData)) {
740 (*mDBGOut) << decTreeName.c_str() <<
"pdgPar=" << dec.pdg <<
"trPar=" << dec.parent <<
"prod=" << decFam <<
"found=" << dec.foundSVID <<
"sv=" <<
v0 <<
"\n";
745 for (
auto& mcVtx : mMCVtVec) {
746 std::sort(mcVtx.recVtx.begin(), mcVtx.recVtx.end(), [](
const RecPV& lhs,
const RecPV& rhs) {
747 return lhs.pv.getNContributors() > rhs.pv.getNContributors();
749 (*mDBGOut) <<
"mcVtxTree" <<
"mcVtx=" << mcVtx <<
"\n";
752 if (
params.storeITSInfo) {
753 processITSTracks(recoData);
757void TrackMCStudy::processTPCTrackRefs()
759 constexpr float alpsec[18] = {0.174533, 0.523599, 0.872665, 1.221730, 1.570796, 1.919862, 2.268928, 2.617994, 2.967060, 3.316126, 3.665191, 4.014257, 4.363323, 4.712389, 5.061455, 5.410521, 5.759587, 6.108652};
760 constexpr float sinAlp[18] = {0.173648, 0.500000, 0.766044, 0.939693, 1.000000, 0.939693, 0.766044, 0.500000, 0.173648, -0.173648, -0.500000, -0.766044, -0.939693, -1.000000, -0.939693, -0.766044, -0.500000, -0.173648};
761 constexpr float cosAlp[18] = {0.984808, 0.866025, 0.642788, 0.342020, 0.000000, -0.342020, -0.642788, -0.866025, -0.984808, -0.984808, -0.866025, -0.642788, -0.342020, -0.000000, 0.342020, 0.642788, 0.866025, 0.984808};
763 for (
auto&
entry : mSelMCTracks) {
764 auto lb =
entry.first;
765 auto trspan = mcReader.getTrackRefs(lb.getSourceID(), lb.getEventID(), lb.getTrackID());
766 int q =
entry.second.mcTrackInfo.track.getCharge();
770 int ref0entry = mSelTRefs.size(), nrefsSel = 0;
771 for (
const auto& trf : trspan) {
772 if (trf.getDetectorId() != 1) {
775 float pT = std::sqrt(trf.Px() * trf.Px() + trf.Py() * trf.Py());
779 float secX, secY,
phi = std::atan2(trf.Y(), trf.X());
782 float phiPt = std::atan2(trf.Py(), trf.Px());
783 o2::math_utils::bringTo02Pi(phiPt);
784 auto dphiPt = phiPt - alpsec[sector];
785 if (dphiPt > o2::constants::math::PI) {
786 dphiPt -= o2::constants::math::TwoPI;
787 }
else if (dphiPt < -o2::constants::math::PI) {
788 dphiPt += o2::constants::math::TwoPI;
789 }
else if (std::abs(dphiPt) > o2::constants::math::PIHalf * 0.8) {
792 float tgL = trf.Pz() / pT;
793 std::array<float, 5> pars = {secY, trf.Z(), std::sin(dphiPt), tgL, q / pT};
794 auto& refTrack = mSelTRefs.emplace_back(secX, alpsec[sector], pars);
795 refTrack.setUserField(uint16_t(sector));
798 if (nrefsSel <
params.minTPCRefsToExtractClRes) {
799 mSelTRefs.resize(ref0entry);
802 mSelTRefIdx[lb] = std::make_pair(ref0entry, ref0entry + nrefsSel);
811 const auto* TPCClMClab = recoData.
inputsTPCclusters->clusterIndex.clustersMCTruth;
815 for (uint8_t
row = 0;
row < 152;
row++) {
816 for (uint8_t sector = 0; sector < 36; sector++) {
817 unsigned int offs = TPCClusterIdxStruct.clusterOffset[sector][
row];
818 for (
unsigned int icl0 = 0; icl0 < TPCClusterIdxStruct.nClusters[sector][
row]; icl0++) {
819 const auto labels = TPCClMClab->getLabels(icl0 + offs);
821 for (
const auto& lbl :
labels) {
822 if (!lbl.isValid()) {
827 const auto& clus = TPCClusterIdxStruct.clusters[sector][
row][icl0];
828 int tbinH =
int(clus.getTime() * mNTPCOccBinLengthInv);
829 clRes.contTracks.clear();
830 bool doClusRes = (
params.minTPCRefsToExtractClRes > 0) && (
params.rejectClustersResStat <= 0. || gRandom->Rndm() <
params.rejectClustersResStat);
832 bool corrAttach = lbl.isFake();
833 lbl.setFakeFlag(
false);
834 auto entry = mSelMCTracks.find(lbl);
835 if (
entry == mSelMCTracks.end()) {
838 auto& mctr =
entry->second.mcTrackInfo;
840 if (
row > mctr.maxTPCRow) {
841 mctr.maxTPCRow =
row;
842 mctr.maxTPCRowSect = sector;
844 }
else if (
row == 0 && mctr.nUsedPadRows == 0) {
847 if (
row < mctr.minTPCRow) {
848 mctr.minTPCRow =
row;
849 mctr.minTPCRowSect = sector;
851 if (mctr.minTPCRowSect == sector &&
row > mctr.maxTPCRowInner) {
852 mctr.maxTPCRowInner =
row;
859 auto entTRefIDsIt = mSelTRefIdx.find(lbl);
860 if (entTRefIDsIt == mSelTRefIdx.end()) {
864 mTPCCorrMaps->Transform(sector,
row, clus.getPad(), clus.getTime(), xc, yc, zc, mctr.bcInTF / 8.);
866 const auto& entTRefIDs = entTRefIDsIt->second;
868 int entIDBelow = -1, entIDAbove = -1;
869 float xBelow = -1e6, xAbove = 1e6;
871 for (
int entID = entTRefIDs.first; entID < entTRefIDs.second; entID++) {
872 const auto& refTr = mSelTRefs[entID];
873 if (refTr.getUserField() != sector % 18) {
876 if ((refTr.getX() < xc) && (refTr.getX() > xBelow) && (refTr.getX() > xc -
params.maxTPCRefExtrap)) {
877 xBelow = refTr.getX();
880 if ((refTr.getX() > xc) && (refTr.getX() < xAbove) && (refTr.getX() < xc +
params.maxTPCRefExtrap)) {
881 xAbove = refTr.getX();
885 if ((entIDBelow < 0 && entIDAbove < 0) || (
params.requireTopBottomRefs && (entIDBelow < 0 || entIDAbove < 0))) {
890 bool okBelow = entIDBelow >= 0 && prop->PropagateToXBxByBz((tparBelow = mSelTRefs[entIDBelow]), xc, 0.99, 2.);
891 bool okAbove = entIDAbove >= 0 && prop->PropagateToXBxByBz((tparAbove = mSelTRefs[entIDAbove]), xc, 0.99, 2.);
892 if ((!okBelow && !okAbove) || (
params.requireTopBottomRefs && (!okBelow || !okAbove))) {
897 auto& clCont = clRes.contTracks.emplace_back();
898 clCont.corrAttach = corrAttach;
900 clCont.below = {mSelTRefs[entIDBelow].getX(), tparBelow.getY(), tparBelow.getZ()};
901 clCont.snp += tparBelow.getSnp();
902 clCont.tgl += tparBelow.getTgl();
903 clCont.q2pt += tparBelow.getQ2Pt();
907 clCont.above = {mSelTRefs[entIDAbove].getX(), tparAbove.getY(), tparAbove.getZ()};
908 clCont.snp += tparAbove.getSnp();
909 clCont.tgl += tparAbove.getTgl();
910 clCont.q2pt += tparAbove.getQ2Pt();
914 if (clRes.contTracks.size() == 1) {
915 int occBin = mctr.bcInTF / 8 * mNTPCOccBinLengthInv;
916 clRes.occ = occBin < 0 ? mTBinClOcc[0] : (occBin >= mTBinClOcc.size() ? mTBinClOcc.back() : mTBinClOcc[occBin]);
918 clCont.xyz = {xc, yc, zc};
925 clRes.contTracks.pop_back();
929 if (clRes.getNCont()) {
932 clRes.qtot = clus.getQtot();
933 clRes.qmax = clus.getQmax();
934 clRes.flags = clus.getFlags();
935 clRes.sigmaTimePacked = clus.sigmaTimePacked;
936 clRes.sigmaPadPacked = clus.sigmaPadPacked;
937 clRes.ncont = ncontLb;
942 }
else if (tbinH >=
int(mTBinClOccHist.size())) {
943 tbinH = (
int)mTBinClOccHist.size() - 1;
945 clRes.occBin = mTBinClOccHist[tbinH];
947 (*mDBGOut) <<
"clres" <<
"clr=" << clRes <<
"\n";
954 for (
int lr = 0; lr < nLrCl; lr++) {
957 for (
unsigned int icl = 0; icl <
ITSClusters.size(); icl++) {
958 const auto labels = mcITSClusters->getLabels(icl);
959 for (
const auto& lbl :
labels) {
960 auto entry = mSelMCTracks.find(lbl);
961 if (
entry == mSelMCTracks.end()) {
964 auto& mctr =
entry->second.mcTrackInfo;
971 for (
auto&
entry : mSelMCTracks) {
972 const auto& trackFam =
entry.second;
973 const auto& mctr = trackFam.mcTrackInfo;
974 if (mctr.getLowestITSLayer() == 0 && mctr.getNITSClusCont() > 3) {
975 auto& mcev = mMCVtVec[mctr.label.getEventID()];
976 mcev.nTrackSelRCBL0++;
977 if (mctr.isPrimary()) {
978 mcev.nTrackSelRCBL0P++;
980 if (trackFam.entITSFound >= 0) {
981 mcev.nTrackRecRCBL0++;
984 if (mctr.maxTPCRow - mctr.minTPCRow >=
params.nMinTPCRowSpan) {
985 mcev.nTrackSelRCBL1++;
986 if (mctr.isPrimary()) {
987 mcev.nTrackSelRCBL1P++;
989 if (trackFam.entITSTPC >= 0) {
990 mcev.nTrackRecRCBL1++;
999 bool refReached =
false;
1000 constexpr float TgHalfSector = 0.17632698f;
1008 if (fabs(trcTPC.getY()) <
par.XMatchingRef * TgHalfSector) {
1012 if (!trialsLeft--) {
1016 if (!trcTPC.rotate(alphaNew) != 0) {
1024 float alp = trcTPC.getAlpha();
1041 if (mTPCVDriftHelper.accountCCDBInputs(matcher, obj)) {
1045 LOG(info) <<
"ITS Alpide param updated";
1047 par.printKeyValues();
1048 mITSTimeBiasMUS = par.roFrameBiasInBC * o2::constants::lhc::LHCBunchSpacingNS * 1e-3;
1049 mITSROFrameLengthMUS = par.roFrameLengthInBC * o2::constants::lhc::LHCBunchSpacingNS * 1e-3;
1053 LOG(info) <<
"cluster dictionary updated";
1064 int nROFs = ITSTrackROFRec.size();
1066 mITSROFBracket.clear();
1067 mITSROF.reserve(ITSTracksArray.size());
1068 mITSROFBracket.reserve(ITSTracksArray.size());
1069 for (
int irof = 0; irof < nROFs; irof++) {
1070 const auto& rofRec = ITSTrackROFRec[irof];
1071 long nBC = rofRec.getBCData().differenceInBC(recoData.
startIR);
1072 float tMin = nBC * o2::constants::lhc::LHCBunchSpacingMUS + mITSTimeBiasMUS;
1073 float tMax = tMin + mITSROFrameLengthMUS;
1074 mITSROFBracket.emplace_back(tMin, tMax);
1075 for (
int it = 0; it < rofRec.getNEntries(); it++) {
1076 mITSROF.push_back(irof);
1088bool TrackMCStudy::processMCParticle(
int src,
int ev,
int trid)
1090 const auto& mcPart = (*mCurrMCTracks)[trid];
1091 int pdg = mcPart.GetPdgCode();
1097 if (mcPart.T() <
params.decayMotherMaxT) {
1098 for (
int id = 0;
id < mNCheckDecays;
id++) {
1099 if (
params.decayPDG[
id] == std::abs(pdg)) {
1105 auto& decayPool = mDecaysMaps[decay];
1106 int idd0 = mcPart.getFirstDaughterTrackId(), idd1 = mcPart.getLastDaughterTrackId();
1107 int dtStart = mDecProdLblPool.size(), dtEnd = -1;
1111 for (
int idd = idd0; idd <= idd1; idd++) {
1112 const auto& product = (*mCurrMCTracks)[idd];
1114 if (!acceptMCCharged(product, lbld, decay)) {
1116 mDecProdLblPool.resize(dtStart);
1119 mDecProdLblPool.push_back(lbld);
1123 dtEnd = mDecProdLblPool.size();
1124 for (
int dtid = dtStart; dtid < dtEnd; dtid++) {
1125 mSelMCTracks[mDecProdLblPool[dtid]].mcTrackInfo.parentEntry = decayPool.size();
1126 mSelMCTracks[mDecProdLblPool[dtid]].mcTrackInfo.parentDecID = int8_t(decay);
1129 std::array<float, 3> xyz{(float)mcPart.GetStartVertexCoordinatesX(), (float)mcPart.GetStartVertexCoordinatesY(), (float)mcPart.GetStartVertexCoordinatesZ()};
1130 std::array<float, 3> pxyz{(float)mcPart.GetStartVertexMomentumX(), (float)mcPart.GetStartVertexMomentumY(), (float)mcPart.GetStartVertexMomentumZ()};
1131 decayPool.emplace_back(DecayRef{lbl,
1133 mcPart.GetPdgCode(), dtStart, dtEnd});
1135 LOGP(info,
"Adding MC parent pdg={} {}, with prongs in {}:{} range", pdg, lbl.asString(), dtStart, dtEnd);
1143 if (mSelMCTracks.find(lbl) == mSelMCTracks.end()) {
1144 res = acceptMCCharged(mcPart, lbl);
1157 if (mVerbose > 1 && followDecay > -1) {
1158 LOGP(info,
"rejecting decay {} prong : pdg={}, pT={}, tgL={}, r={}", followDecay, tr.
GetPdgCode(), tr.
GetPt(), tr.
GetTgl(), std::sqrt(tr.
R2()));
1163 float r2 = dx * dx + dy * dy;
1164 float posTgl2 = r2 > 1 && std::abs(dz) < 20 ? dz * dz / r2 : 0;
1165 if (posTgl2 >
params.maxPosTglMC *
params.maxPosTglMC) {
1166 if (mVerbose > 1 && followDecay > -1) {
1167 LOGP(info,
"rejecting decay {} prong : pdg={}, pT={}, tgL={}, dr={}, dz={} r={}, z={}, posTgl={}", followDecay, tr.
GetPdgCode(), tr.
GetPt(), tr.
GetTgl(), std::sqrt(r2), dz, std::sqrt(tr.
R2()), tr.
GetStartVertexCoordinatesZ(), std::sqrt(posTgl2));
1171 if (
params.requireITSorTPCTrackRefs) {
1174 for (
const auto& trf : trspan) {
1175 if (trf.getDetectorId() == DetID::ITS || trf.getDetectorId() == DetID::TPC) {
1189 if (pPDG->Charge() == 0.) {
1192 return addMCParticle(tr, lb, pPDG);
1203 auto& mcEntry = mSelMCTracks[lb];
1204 mcEntry.mcTrackInfo.pdg = mcPart.
GetPdgCode();
1205 mcEntry.mcTrackInfo.track =
o2::track::TrackPar(xyz, pxyz, TMath::Nint(pPDG->Charge() / 3),
true);
1206 mcEntry.mcTrackInfo.label = lb;
1207 mcEntry.mcTrackInfo.bcInTF = mIntBC[lb.
getEventID()];
1208 mcEntry.mcTrackInfo.occTPC = mTPCOcc[lb.
getEventID()];
1209 mcEntry.mcTrackInfo.occITS = mITSOcc[lb.
getEventID()];
1210 mcEntry.mcTrackInfo.occTPCV = mMCVtVec[lb.
getEventID()].occTPCV;
1211 if (mRecProcStage) {
1212 mcEntry.mcTrackInfo.setAddedAtRecStage();
1215 mcEntry.mcTrackInfo.setPrimary();
1220 const auto& mcPartPar = (*mCurrMCTracks)[moth];
1221 mcEntry.mcTrackInfo.pdgParent = mcPartPar.GetPdgCode();
1225 if (mcPart.
GetPt() > 0.1) {
1242 if (svparam.mTPCTrackPhotonTune && isTPConly) {
1243 mFitterV0.setMaxDZIni(svparam.mTPCTrackMaxDZIni);
1244 mFitterV0.setMaxDXYIni(svparam.mTPCTrackMaxDXYIni);
1245 mFitterV0.setMaxChi2(svparam.mTPCTrackMaxChi2);
1246 mFitterV0.setCollinear(
true);
1248 int nCand = mFitterV0.process(seedP, seedN);
1249 if (svparam.mTPCTrackPhotonTune && isTPConly) {
1251 mFitterV0.setMaxDZIni(svparam.maxDZIni);
1252 mFitterV0.setMaxDXYIni(svparam.maxDXYIni);
1253 mFitterV0.setMaxChi2(svparam.maxChi2);
1254 mFitterV0.setCollinear(
false);
1260 if (!mFitterV0.isPropagateTracksToVertexDone(cand) && !mFitterV0.propagateTracksToVertex(cand)) {
1263 const auto& trPProp = mFitterV0.getTrack(0, cand);
1264 const auto& trNProp = mFitterV0.getTrack(1, cand);
1265 std::array<float, 3> pP{}, pN{};
1266 trPProp.getPxPyPzGlo(pP);
1267 trNProp.getPxPyPzGlo(pN);
1268 std::array<float, 3> pV0 = {pP[0] + pN[0], pP[1] + pN[1], pP[2] + pN[2]};
1269 auto p2V0 = pV0[0] * pV0[0] + pV0[1] * pV0[1] + pV0[2] * pV0[2];
1271 const auto v0XYZ = mFitterV0.getPCACandidatePos(cand);
1272 float dx = v0XYZ[0] - pv.getX(), dy = v0XYZ[1] - pv.getY(), dz = v0XYZ[2] - pv.getZ(), prodXYZv0 = dx * pV0[0] + dy * pV0[1] + dz * pV0[2];
1273 float cosPA = prodXYZv0 / std::sqrt((dx * dx + dy * dy + dz * dz) * p2V0);
1275 v0.
setDCA(mFitterV0.getChi2AtPCACandidate(cand));
1285 auto TPCRefitter = std::make_unique<o2::gpu::GPUO2InterfaceRefit>(&recoData.
inputsTPCclusters->clusterIndex, mTPCCorrMaps, prop->getNominalBz(),
1287 mNTPCOccBinLength = TPCRefitter->getParam()->rec.tpc.occupancyMapTimeBins;
1289 if (mNTPCOccBinLength > 1 && TPCOccMap.size()) {
1290 mNTPCOccBinLengthInv = 1. / mNTPCOccBinLength;
1291 int nTPCBins = NHBPerTF * o2::constants::lhc::LHCMaxBunches / 8, ninteg = 0;
1292 int nTPCOccBins = nTPCBins * mNTPCOccBinLengthInv, sumBins = std::max(1,
int(o2::constants::lhc::LHCMaxBunches / 8 * mNTPCOccBinLengthInv));
1293 mTBinClOcc.resize(nTPCOccBins);
1294 mTBinClOccHist.resize(nTPCOccBins);
1295 float sm = 0., tb = 0.5 * mNTPCOccBinLength;
1296 for (
int i = 0;
i < nTPCOccBins;
i++) {
1297 mTBinClOccHist[
i] = TPCRefitter->getParam()->GetUnscaledMult(tb);
1298 tb += mNTPCOccBinLength;
1300 for (
int i = nTPCOccBins;
i--;) {
1301 sm += mTBinClOccHist[
i];
1302 if (
i + sumBins < nTPCOccBins) {
1303 sm -= mTBinClOccHist[
i + sumBins];
1308 mTBinClOcc.resize(1);
1309 mTBinClOccHist.resize(1);
1316 LOGP(warn,
"ITS data is not loaded");
1324 mITSClustersArray.init(nLr);
1325 for (
int lr = 0; lr < nLr; lr++) {
1326 mITSClustersArray.beginLayer(lr);
1329 auto pattIt = patterns.begin();
1330 mITSClustersArray.getClusters().reserve(mITSClustersArray.size() + clusITS.size());
1332 LOGP(info,
"We have {} ITS clusters and the number of patterns is {} on the layer slot {}", clusITS.size(), patterns.size(), lr);
1334 mITSClustersArray.finalize();
1336 int ntr = itsLbls.size();
1337 LOGP(info,
"In total {} ITS clusters, ITSdict:{} NMCLabels: {}", mITSClustersArray.size(), mITSDict !=
nullptr, itsLbls.size());
1339 std::vector<int> evord(ntr);
1340 std::iota(evord.begin(), evord.end(), 0);
1341 std::sort(evord.begin(), evord.end(), [&](
int i,
int j) { return itsLbls[i] < itsLbls[j]; });
1342 std::vector<ITSHitInfo> outHitInfo;
1343 std::array<int, 7> cl2arr{};
1345 for (
int itr0 = 0; itr0 < ntr; itr0++) {
1346 auto itr = evord[itr0];
1347 const auto& itsTr = itsTracks[itr];
1348 const auto& itsLb = itsLbls[itr];
1350 int nCl = itsTr.getNClusters();
1351 if (itsLb.isFake() || nCl <
params.minITSClForITSoutput) {
1354 auto entrySel = mSelMCTracks.find(itsLb);
1355 if (entrySel == mSelMCTracks.end()) {
1360 auto clEntry = itsTr.getFirstClusterEntry();
1361 for (
int iCl = nCl; iCl--;) {
1362 const auto& cls = mITSClustersArray[itsClRefs[clEntry + iCl]];
1363 int hpos = outHitInfo.size();
1364 auto& hinf = outHitInfo.emplace_back();
1366 hinf.clus.setCount(geom->getLayer(cls.getSensorID()));
1367 geom->getSensorXAlphaRefPlane(cls.getSensorID(), hinf.chipX, hinf.chipAlpha);
1368 cl2arr[hinf.clus.getCount()] = hpos;
1370 auto trspan = mcReader.getTrackRefs(itsLb.getSourceID(), itsLb.getEventID(), itsLb.getTrackID());
1371 int ilrc = -1, nrefAcc = 0;
1372 for (
const auto& trf : trspan) {
1373 if (trf.getDetectorId() != 0) {
1376 int lrt = trf.getUserId();
1377 int clEnt = cl2arr[lrt];
1381 auto& hinf = outHitInfo[clEnt];
1384 if (hinf.trefXT < 1 || std::abs(traX - hinf.chipX) < std::abs(hinf.trefXT - hinf.chipX)) {
1385 if (hinf.trefXT < 1) {
1393 (*mDBGOut) <<
"itsTree" <<
"hits=" << outHitInfo <<
"trIn=" << ((
o2::track::TrackParCov&)itsTr) <<
"trOut=" << itsTr.getParamOut() <<
"mcTr=" << entrySel->second.mcTrackInfo.track <<
"mcPDG=" << entrySel->second.mcTrackInfo.pdg <<
"nTrefs=" << nrefAcc <<
"\n";
1399 std::vector<OutputSpec> outputs;
1401 {
"device-verbosity", VariantType::Int, 0, {
"Verbosity level"}},
1402 {
"dcay-vs-pt", VariantType::String,
"0.0105 + 0.0350 / pow(x, 1.1)", {
"Formula for global tracks DCAy vs pT cut"}},
1403 {
"min-tpc-clusters", VariantType::Int, 60, {
"Cut on TPC clusters"}},
1404 {
"max-tpc-dcay", VariantType::Float, 2.f, {
"Cut on TPC dcaY"}},
1405 {
"max-tpc-dcaz", VariantType::Float, 2.f, {
"Cut on TPC dcaZ"}},
1406 {
"min-x-prop", VariantType::Float, 6.f, {
"track should be propagated to this X at least"}}};
1407 auto dataRequest = std::make_shared<DataRequest>();
1408 dataRequest->setITSPerLayer(itsStag);
1410 dataRequest->requestTracks(srcTracks, useMC);
1411 dataRequest->requestClusters(srcClusters, useMC);
1412 dataRequest->requestPrimaryVertices(useMC);
1414 dataRequest->requestSecondaryVertices(useMC);
1418 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
1424 dataRequest->inputs,
1431 AlgorithmSpec{adaptFromTask<TrackMCStudy>(dataRequest, ggRequest, srcTracks, checkSV)},
Container of the ITS/MFT clusters addressed by the composed (layer,index) ID.
Defintions for N-prongs secondary vertex fit.
Definition of the GeometryManager class.
o2::raw::RawFileWriter * raw
Helper for geometry and GRP related CCDB requests.
Global index for barrel track: provides provenance (detectors combination), index in respective array...
Definition of the GeometryTGeo class.
std::vector< o2::MCCompLabel > labels
std::vector< o2::its::TrackITS > tracks
Utility functions for MC particles.
Configurable params for TPC ITS matching.
Definition of the Names Generator class.
Definition of the parameter class for the detector electronics.
Wrapper container for different reconstructed object types.
o2::track::TrackParCov TrackParCov
Configurable params for secondary vertexer.
Result of refitting TPC-ITS matched track.
Reference on ITS/MFT clusters set.
Helper class to extract VDrift from different sources.
Referenc on track indices contributing to the vertex, with possibility chose tracks from specific sou...
void setFakeFlag(bool v=true)
std::string asString() const
Double_t GetStartVertexMomentumZ() const
Double_t GetStartVertexMomentumX() const
Double_t GetStartVertexCoordinatesY() const
Double_t GetStartVertexCoordinatesZ() const
Double_t R2() const
production radius squared
Double_t GetStartVertexMomentumY() const
Double_t GetStartVertexCoordinatesX() const
Int_t GetPdgCode() const
Accessors.
Int_t getMotherTrackId() const
static TDatabasePDG * Instance()
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
static const TrackMCStudyConfig & Instance()
Static class with identifiers, bitmasks and names for ALICE detectors.
T get(const char *key) const
ConfigParamRegistry const & options()
InputRecord & inputs()
The inputs associated with this processing context.
static GeometryTGeo * Instance()
void fillMatrixCache(int mask) override
static constexpr int getLayer(int chipSW)
static bool isPhysicalPrimary(o2::MCTrack const &p, std::vector< o2::MCTrack > const &pcontainer)
std::vector< o2::InteractionTimeRecord > & getEventRecords(bool withQED=false)
bool initFromDigitContext(std::string_view filename)
DigitizationContext const * getDigitizationContext() const
size_t getNEvents(int source) const
Get number of events.
o2::dataformats::MCEventHeader const & getMCEventHeader(int source, int event) const
retrieves the MCEventHeader for a given eventID and sourceID
size_t getNSources() const
Get number of sources.
std::vector< MCTrack > const & getTracks(int source, int event) const
variant returning all tracks for source and event at once
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
void endOfStream(EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void init(InitContext &ic) final
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
void run(ProcessingContext &pc) final
void process(const o2::globaltracking::RecoContainer &recoData)
TrackMCStudy(std::shared_ptr< DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > gr, GTrackID::mask_t src, bool checkSV)
~TrackMCStudy() final=default
GLenum const GLfloat * params
constexpr o2::header::DataOrigin gDataOriginTPC
uint8_t int statusCode int
Node par(int index)
Parameters.
Defining ITS Vertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
constexpr int MaxITSLayers
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
o2::track::TrackParCov int int int float int nCl
detail::Bracket< float > Bracketf_t
float angle2Alpha(float phi)
int angle2Sector(float phi)
std::tuple< float, float > rotateZInv(float xG, float yG, float snAlp, float csAlp)
std::pair< int, o2::dataformats::VtxTrackIndex > VTIndexV
o2::dataformats::VtxTrackRef V2TRef
o2::dataformats::VtxTrackIndex VTIndex
o2::itsmft::ClustersPerLayer< o2::BaseCluster< float > > ITSClusters
o2::framework::DataProcessorSpec getTrackMCStudySpec(o2::dataformats::GlobalTrackID::mask_t srcTracks, o2::dataformats::GlobalTrackID::mask_t srcClus, bool checkSV, bool itsStag)
create a processor spec
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
auto getITSPerLayer() const
auto getITSTracks() const
GTrackID getITSContributorGID(GTrackID source) const
bool isTrackSourceLoaded(int src) const
o2::InteractionRecord startIR
GlobalIDSet getSingleDetectorRefs(GTrackID gidx) const
const o2::tpc::TrackTPC & getTPCTrack(GTrackID id) const
auto getITSTracksClusterRefs() const
auto getPrimaryVertices() const
auto getPrimaryVertexMatchedTracks() const
const o2::tpc::ClusterNativeAccess & getTPCClusters() const
auto getITSClustersROFRecords(int layer=0) const
auto getITSABRefs() const
auto getTPCTracksClusterRefs() const
auto getPrimaryVertexMatchedTrackRefs() const
auto getITSClustersPatterns(int layer=0) const
o2::MCCompLabel getTrackMCLabel(GTrackID id) const
GTrackID getTPCContributorGID(GTrackID source) const
const o2::track::TrackParCov & getTrackParam(GTrackID gidx) const
gsl::span< const unsigned char > clusterShMapTPC
externally set TPC clusters sharing map
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
const o2::track::TrackParCov & getTrackParamOut(GTrackID gidx) const
auto getPrimaryVertexMCLabels() const
const o2::dataformats::PrimaryVertex & getPrimaryVertex(int i) const
const o2::its::TrackITS & getITSTrack(GTrackID gid) const
std::unique_ptr< o2::tpc::internal::getWorkflowTPCInput_ret > inputsTPCclusters
auto getITSTracksROFRecords() const
void getTrackTime(GTrackID gid, float &t, float &tErr) const
gsl::span< const unsigned int > occupancyMapTPC
externally set TPC clusters occupancy map
auto getITSClusters(int layer=0) const
auto getITSTracksMCLabels() const
auto getITSClustersMCLabels(int layer=0) const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"