From 65dccacaa7eb0e75363a6d852e8a50bd7d1e5d11 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Thu, 16 Nov 2023 11:22:31 -0300 Subject: [PATCH 01/13] Min ITS clusters, TPC required for baryons --- .../include/DetectorsVertexing/SVertexer.h | 2 ++ .../DetectorsVertexing/SVertexerParams.h | 5 +++++ Detectors/Vertexing/src/SVertexer.cxx | 21 ++++++++++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h index 6439831ad991a..0246b81ef03d0 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h @@ -97,6 +97,8 @@ class SVertexer GIndex gid{}; VBracket vBracket{}; float minR = 0; // track lowest point r + bool hasTPC = false; + uint8_t nITSclu = -1; // number of ITS clusters }; SVertexer(bool enabCascades = true, bool enab3body = false) : mEnableCascades{enabCascades}, mEnable3BodyDecays{enab3body} diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h index e0b0d1bf67d52..10ddd9aa0cc03 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h @@ -58,6 +58,7 @@ struct SVertexerParams : public o2::conf::ConfigurableParamHelper minMomTPCdEdx are always accepted float minMomTPCdEdx = 0.8; // minimum p for tracks with dEdx > mMinTPCdEdx to be accepted + // cascade-specific selections + uint8_t minNITSCluCascMesons = 6; // require at least this many ITS clusters for mesonic cascade daughters + bool requireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC + // cuts on different V0 PID params bool checkV0Hypothesis = true; float pidCutsPhoton[SVertexHypothesis::NPIDParams] = {0.001, 20, 0.60, 20, 0.60, 0.0, 0.0, 0.0, 0.0}; // Photon diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index 14b4b93224e72..9961ae57bfe43 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -429,6 +429,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a auto trackIndex = recoData.getPrimaryVertexMatchedTracks(); // Global ID's for associated tracks auto vtxRefs = recoData.getPrimaryVertexMatchedTrackRefs(); // references from vertex to these track IDs bool isTPCloaded = recoData.isTrackSourceLoaded(GIndex::TPC); + bool isITSloaded = recoData.isTrackSourceLoaded(GIndex::ITS); if (isTPCloaded && !mSVParams->mExcludeTPCtracks) { mTPCTracksArray = recoData.getTPCTracks(); mTPCTrackClusIdx = recoData.getTPCTracksClusterRefs(); @@ -477,9 +478,11 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a } const auto& trc = recoData.getTrackParam(tvid); + bool hasTPC = false; bool heavyIonisingParticle = false; auto tpcGID = recoData.getTPCContributorGID(tvid); if (tpcGID.isIndexSet() && isTPCloaded) { + hasTPC = true; auto& tpcTrack = recoData.getTPCTrack(tpcGID); float dEdxTPC = tpcTrack.getdEdx().dEdxTotTPC; if (dEdxTPC > mSVParams->minTPCdEdx && trc.getP() > mSVParams->minMomTPCdEdx) // accept high dEdx tracks (He3, He4) @@ -488,6 +491,14 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a } } + // get Nclusters in the ITS if available + uint8_t nITSclu = -1; + auto itsGID = recoData.getITSContributorGID(tvid); + if (itsGID.isIndexSet() && isITSloaded) { + auto& itsTrack = recoData.getITSTrack(itsGID); + nITSclu = itsTrack.getNumberOfClusters(); + } + if (!acceptTrack(tvid, trc) && !heavyIonisingParticle) { if (tvid.isAmbiguous()) { rejmap[tvid] = true; @@ -496,7 +507,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a } int posneg = trc.getSign() < 0 ? 1 : 0; float r = std::sqrt(trc.getX() * trc.getX() + trc.getY() * trc.getY()); - mTracksPool[posneg].emplace_back(TrackCand{trc, tvid, {iv, iv}, r}); + mTracksPool[posneg].emplace_back(TrackCand{trc, tvid, {iv, iv}, r, hasTPC, nITSclu}); if (tvid.getSource() == GIndex::TPC) { // constrained TPC track? correctTPCTrack(mTracksPool[posneg].back(), mTPCTracksArray[tvid], -1, -1); } @@ -580,10 +591,10 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } // check tight lambda mass only bool goodLamForCascade = false, goodALamForCascade = false; - if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0)) { + if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade && (seedN.nITSclu >= mSVParams->minNITSCluCascMesons || seedN.hasTPC) && (!mSVParams->requireTPCforCascBaryons || seedP.hasTPC)) { goodLamForCascade = true; } - if (mV0Hyps[AntiLambda].checkTight(p2Pos, p2Neg, p2V0, ptV0)) { + if (mV0Hyps[AntiLambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade && (seedP.nITSclu >= mSVParams->minNITSCluCascMesons || seedP.hasTPC) && (!mSVParams->requireTPCforCascBaryons || seedN.hasTPC)) { goodALamForCascade = true; } @@ -746,6 +757,10 @@ int SVertexer::checkCascades(const V0Index& v0Idx, const V0& v0, float rv0, std: continue; // skip the track used by V0 } auto& bach = tracks[it]; + if( !bach.hasTPC && bach.nITSclu< mSVParams->minNITSCluCascMesons){ + continue; // skip bachelors below min number ITS clusters and without TPC + } + if (bach.vBracket.getMin() > v0vlist.getMax()) { LOG(debug) << "Skipping"; break; // all other bachelor candidates will be also not compatible with this PV From 8e454dc19c7335234525f0cd8ed315e11c2edc18 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Thu, 16 Nov 2023 16:50:06 -0300 Subject: [PATCH 02/13] Streamline, add rough BB proton sel possibility --- .../include/DetectorsVertexing/SVertexer.h | 7 ++++- .../DetectorsVertexing/SVertexerParams.h | 8 +++--- Detectors/Vertexing/src/SVertexer.cxx | 27 ++++++++++++++----- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h index 0246b81ef03d0..29ec7a2f063be 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h @@ -36,6 +36,7 @@ #include #include "GPUO2InterfaceRefit.h" #include "TPCFastTransform.h" +#include "DataFormatsTPC/PIDResponse.h" namespace o2 { @@ -65,6 +66,7 @@ class SVertexer using Decay3BodyIndex = o2::dataformats::Decay3BodyIndex; using RRef = o2::dataformats::RangeReference; using VBracket = o2::math_utils::Bracket; + using PIDResponse = o2::tpc::PIDResponse; enum HypV0 { Photon, K0, @@ -98,7 +100,7 @@ class SVertexer VBracket vBracket{}; float minR = 0; // track lowest point r bool hasTPC = false; - uint8_t nITSclu = -1; // number of ITS clusters + bool compatibleProton = false; // dE/dx compatibility with proton hypothesis (FIXME: use better, uint8_t compat mask?) }; SVertexer(bool enabCascades = true, bool enab3body = false) : mEnableCascades{enabCascades}, mEnable3BodyDecays{enab3body} @@ -185,6 +187,9 @@ class SVertexer std::vector> mFitterV0; std::vector> mFitterCasc; std::vector> mFitter3body; + + PIDResponse mPIDresponse; + int mNThreads = 1; int mNV0s = 0, mNCascades = 0, mN3Bodies = 0, mNStrangeTracks = 0; float mMinR2ToMeanVertex = 0; diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h index 10ddd9aa0cc03..f07ccc66cd5ac 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h @@ -95,9 +95,11 @@ struct SVertexerParams : public o2::conf::ConfigurableParamHelper minMomTPCdEdx are always accepted float minMomTPCdEdx = 0.8; // minimum p for tracks with dEdx > mMinTPCdEdx to be accepted - // cascade-specific selections - uint8_t minNITSCluCascMesons = 6; // require at least this many ITS clusters for mesonic cascade daughters - bool requireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC + uint8_t mITSSAminNclu = 6; // require at least this many ITS clusters if no TPC info present + bool mRequireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC + + // percent deviation from expected proton dEdx - to be replaced - estimated sigma from TPC for now 6%; a 6*sigma cut is therefore 36% = 0.36f. Any value above 1.0f will be ignored manually when checking. + float mFractiondEdxforCascBaryons = 0.36f; // cuts on different V0 PID params bool checkV0Hypothesis = true; diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index 9961ae57bfe43..6f92217639b56 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -301,6 +301,12 @@ void SVertexer::updateTimeDependentParams() for (auto& ft : mFitter3body) { ft.setBz(bz); } + + // TPC dE/dx usage information + // default: average 2023 from C. Sonnabend, Nov 2023: ([0.217553 4.02762 0.00850178 2.33324 0.880904 ]) + // to-do: grab from CCDB when available -> discussion with TPC experts, not available yet + const float bbPars[] = {0.217553, 4.02762, 0.00850178, 2.33324, 0.880904}; + mPIDresponse.setBetheBlochParams(bbPars); } //______________________________________________ @@ -480,6 +486,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a bool hasTPC = false; bool heavyIonisingParticle = false; + bool compatibleWithProton = mSVParams->mFractiondEdxforCascBaryons > 0.999f; // if 1 or above, accept all regardless of TPC auto tpcGID = recoData.getTPCContributorGID(tvid); if (tpcGID.isIndexSet() && isTPCloaded) { hasTPC = true; @@ -489,6 +496,12 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a { heavyIonisingParticle = true; } + auto protonId = o2::track::PID::Proton; + float dEdxExpected = mPIDresponse.getExpectedSignal(tpcTrack, protonId); + float fracDevProton = std::abs((dEdxTPC - dEdxExpected) / dEdxExpected); + if(fracDevProtonmFractiondEdxforCascBaryons){ + compatibleWithProton = true; + } } // get Nclusters in the ITS if available @@ -505,9 +518,14 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a } continue; } + + if(!hasTPC && nITSclu < mSVParams->mITSSAminNclu){ + continue; // reject track if no TPC && below minimum N ITS clusters + } + int posneg = trc.getSign() < 0 ? 1 : 0; float r = std::sqrt(trc.getX() * trc.getX() + trc.getY() * trc.getY()); - mTracksPool[posneg].emplace_back(TrackCand{trc, tvid, {iv, iv}, r, hasTPC, nITSclu}); + mTracksPool[posneg].emplace_back(TrackCand{trc, tvid, {iv, iv}, r, hasTPC, compatibleWithProton}); if (tvid.getSource() == GIndex::TPC) { // constrained TPC track? correctTPCTrack(mTracksPool[posneg].back(), mTPCTracksArray[tvid], -1, -1); } @@ -591,10 +609,10 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } // check tight lambda mass only bool goodLamForCascade = false, goodALamForCascade = false; - if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade && (seedN.nITSclu >= mSVParams->minNITSCluCascMesons || seedN.hasTPC) && (!mSVParams->requireTPCforCascBaryons || seedP.hasTPC)) { + if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { goodLamForCascade = true; } - if (mV0Hyps[AntiLambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade && (seedP.nITSclu >= mSVParams->minNITSCluCascMesons || seedP.hasTPC) && (!mSVParams->requireTPCforCascBaryons || seedN.hasTPC)) { + if (mV0Hyps[AntiLambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade &&(!mSVParams->mRequireTPCforCascBaryons || seedN.hasTPC && seedN.compatibleProton)) { goodALamForCascade = true; } @@ -757,9 +775,6 @@ int SVertexer::checkCascades(const V0Index& v0Idx, const V0& v0, float rv0, std: continue; // skip the track used by V0 } auto& bach = tracks[it]; - if( !bach.hasTPC && bach.nITSclu< mSVParams->minNITSCluCascMesons){ - continue; // skip bachelors below min number ITS clusters and without TPC - } if (bach.vBracket.getMin() > v0vlist.getMax()) { LOG(debug) << "Skipping"; From d69174dc35f5d284b448c28e19f8b1872155b760 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Thu, 16 Nov 2023 20:10:11 +0000 Subject: [PATCH 03/13] Please consider the following formatting changes --- .../include/DetectorsVertexing/SVertexerParams.h | 6 +++--- Detectors/Vertexing/src/SVertexer.cxx | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h index f07ccc66cd5ac..0db75062bcc84 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h @@ -95,11 +95,11 @@ struct SVertexerParams : public o2::conf::ConfigurableParamHelper minMomTPCdEdx are always accepted float minMomTPCdEdx = 0.8; // minimum p for tracks with dEdx > mMinTPCdEdx to be accepted - uint8_t mITSSAminNclu = 6; // require at least this many ITS clusters if no TPC info present + uint8_t mITSSAminNclu = 6; // require at least this many ITS clusters if no TPC info present bool mRequireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC - + // percent deviation from expected proton dEdx - to be replaced - estimated sigma from TPC for now 6%; a 6*sigma cut is therefore 36% = 0.36f. Any value above 1.0f will be ignored manually when checking. - float mFractiondEdxforCascBaryons = 0.36f; + float mFractiondEdxforCascBaryons = 0.36f; // cuts on different V0 PID params bool checkV0Hypothesis = true; diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index 6f92217639b56..00b268fccec89 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -302,7 +302,7 @@ void SVertexer::updateTimeDependentParams() ft.setBz(bz); } - // TPC dE/dx usage information + // TPC dE/dx usage information // default: average 2023 from C. Sonnabend, Nov 2023: ([0.217553 4.02762 0.00850178 2.33324 0.880904 ]) // to-do: grab from CCDB when available -> discussion with TPC experts, not available yet const float bbPars[] = {0.217553, 4.02762, 0.00850178, 2.33324, 0.880904}; @@ -499,7 +499,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a auto protonId = o2::track::PID::Proton; float dEdxExpected = mPIDresponse.getExpectedSignal(tpcTrack, protonId); float fracDevProton = std::abs((dEdxTPC - dEdxExpected) / dEdxExpected); - if(fracDevProtonmFractiondEdxforCascBaryons){ + if (fracDevProton < mSVParams->mFractiondEdxforCascBaryons) { compatibleWithProton = true; } } @@ -519,7 +519,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a continue; } - if(!hasTPC && nITSclu < mSVParams->mITSSAminNclu){ + if (!hasTPC && nITSclu < mSVParams->mITSSAminNclu) { continue; // reject track if no TPC && below minimum N ITS clusters } @@ -612,7 +612,7 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { goodLamForCascade = true; } - if (mV0Hyps[AntiLambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade &&(!mSVParams->mRequireTPCforCascBaryons || seedN.hasTPC && seedN.compatibleProton)) { + if (mV0Hyps[AntiLambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade && (!mSVParams->mRequireTPCforCascBaryons || seedN.hasTPC && seedN.compatibleProton)) { goodALamForCascade = true; } From fb113c02ac5e4aff7e00dea184368c5d9ae3a7db Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Fri, 17 Nov 2023 04:59:58 -0300 Subject: [PATCH 04/13] Change short-ITS-only rej to affect casc only --- .../include/DetectorsVertexing/SVertexer.h | 1 + .../DetectorsVertexing/SVertexerParams.h | 6 ++--- Detectors/Vertexing/src/SVertexer.cxx | 23 +++++++++---------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h index 29ec7a2f063be..42f67378e2e04 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexer.h @@ -100,6 +100,7 @@ class SVertexer VBracket vBracket{}; float minR = 0; // track lowest point r bool hasTPC = false; + uint8_t nITSclu = -1; bool compatibleProton = false; // dE/dx compatibility with proton hypothesis (FIXME: use better, uint8_t compat mask?) }; diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h index 0db75062bcc84..4e4f66e1747ac 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h @@ -95,11 +95,11 @@ struct SVertexerParams : public o2::conf::ConfigurableParamHelper minMomTPCdEdx are always accepted float minMomTPCdEdx = 0.8; // minimum p for tracks with dEdx > mMinTPCdEdx to be accepted - uint8_t mITSSAminNclu = 6; // require at least this many ITS clusters if no TPC info present + uint8_t mITSSAminNcluCascades = 6; // require at least this many ITS clusters if no TPC info present bool mRequireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC - + // percent deviation from expected proton dEdx - to be replaced - estimated sigma from TPC for now 6%; a 6*sigma cut is therefore 36% = 0.36f. Any value above 1.0f will be ignored manually when checking. - float mFractiondEdxforCascBaryons = 0.36f; + float mFractiondEdxforCascBaryons = 0.36f; // cuts on different V0 PID params bool checkV0Hypothesis = true; diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index 00b268fccec89..216fd44a7e691 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -302,7 +302,7 @@ void SVertexer::updateTimeDependentParams() ft.setBz(bz); } - // TPC dE/dx usage information + // TPC dE/dx usage information // default: average 2023 from C. Sonnabend, Nov 2023: ([0.217553 4.02762 0.00850178 2.33324 0.880904 ]) // to-do: grab from CCDB when available -> discussion with TPC experts, not available yet const float bbPars[] = {0.217553, 4.02762, 0.00850178, 2.33324, 0.880904}; @@ -499,7 +499,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a auto protonId = o2::track::PID::Proton; float dEdxExpected = mPIDresponse.getExpectedSignal(tpcTrack, protonId); float fracDevProton = std::abs((dEdxTPC - dEdxExpected) / dEdxExpected); - if (fracDevProton < mSVParams->mFractiondEdxforCascBaryons) { + if(fracDevProtonmFractiondEdxforCascBaryons){ compatibleWithProton = true; } } @@ -519,13 +519,9 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a continue; } - if (!hasTPC && nITSclu < mSVParams->mITSSAminNclu) { - continue; // reject track if no TPC && below minimum N ITS clusters - } - int posneg = trc.getSign() < 0 ? 1 : 0; float r = std::sqrt(trc.getX() * trc.getX() + trc.getY() * trc.getY()); - mTracksPool[posneg].emplace_back(TrackCand{trc, tvid, {iv, iv}, r, hasTPC, compatibleWithProton}); + mTracksPool[posneg].emplace_back(TrackCand{trc, tvid, {iv, iv}, r, hasTPC, nITSclu, compatibleWithProton}); if (tvid.getSource() == GIndex::TPC) { // constrained TPC track? correctTPCTrack(mTracksPool[posneg].back(), mTPCTracksArray[tvid], -1, -1); } @@ -609,13 +605,16 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } // check tight lambda mass only bool goodLamForCascade = false, goodALamForCascade = false; - if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { - goodLamForCascade = true; - } - if (mV0Hyps[AntiLambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && ptV0 > mSVParams->minPtV0FromCascade && (!mSVParams->mRequireTPCforCascBaryons || seedN.hasTPC && seedN.compatibleProton)) { - goodALamForCascade = true; + if( ptV0 > mSVParams->minPtV0FromCascade && seedP.nITSclu >= mSVParams->mITSSAminNcluCascades && seedN.nITSclu >= mSVParams->mITSSAminNcluCascades ){ + if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { + goodLamForCascade = true; + } + if (mV0Hyps[AntiLambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && (!mSVParams->mRequireTPCforCascBaryons || seedN.hasTPC && seedN.compatibleProton)) { + goodALamForCascade = true; + } } + // apply mass selections for 3-body decay bool good3bodyV0Hyp = false; for (int ipid = 2; ipid < 4; ipid++) { From ebf97a21da955d2ab5f73d23e70aab4f0aacba2b Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 17 Nov 2023 08:01:37 +0000 Subject: [PATCH 05/13] Please consider the following formatting changes --- .../Vertexing/include/DetectorsVertexing/SVertexerParams.h | 6 +++--- Detectors/Vertexing/src/SVertexer.cxx | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h index 4e4f66e1747ac..8221bbd1749db 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h @@ -95,11 +95,11 @@ struct SVertexerParams : public o2::conf::ConfigurableParamHelper minMomTPCdEdx are always accepted float minMomTPCdEdx = 0.8; // minimum p for tracks with dEdx > mMinTPCdEdx to be accepted - uint8_t mITSSAminNcluCascades = 6; // require at least this many ITS clusters if no TPC info present + uint8_t mITSSAminNcluCascades = 6; // require at least this many ITS clusters if no TPC info present bool mRequireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC - + // percent deviation from expected proton dEdx - to be replaced - estimated sigma from TPC for now 6%; a 6*sigma cut is therefore 36% = 0.36f. Any value above 1.0f will be ignored manually when checking. - float mFractiondEdxforCascBaryons = 0.36f; + float mFractiondEdxforCascBaryons = 0.36f; // cuts on different V0 PID params bool checkV0Hypothesis = true; diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index 216fd44a7e691..024d55f93c3ac 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -302,7 +302,7 @@ void SVertexer::updateTimeDependentParams() ft.setBz(bz); } - // TPC dE/dx usage information + // TPC dE/dx usage information // default: average 2023 from C. Sonnabend, Nov 2023: ([0.217553 4.02762 0.00850178 2.33324 0.880904 ]) // to-do: grab from CCDB when available -> discussion with TPC experts, not available yet const float bbPars[] = {0.217553, 4.02762, 0.00850178, 2.33324, 0.880904}; @@ -499,7 +499,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a auto protonId = o2::track::PID::Proton; float dEdxExpected = mPIDresponse.getExpectedSignal(tpcTrack, protonId); float fracDevProton = std::abs((dEdxTPC - dEdxExpected) / dEdxExpected); - if(fracDevProtonmFractiondEdxforCascBaryons){ + if (fracDevProton < mSVParams->mFractiondEdxforCascBaryons) { compatibleWithProton = true; } } @@ -605,7 +605,7 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } // check tight lambda mass only bool goodLamForCascade = false, goodALamForCascade = false; - if( ptV0 > mSVParams->minPtV0FromCascade && seedP.nITSclu >= mSVParams->mITSSAminNcluCascades && seedN.nITSclu >= mSVParams->mITSSAminNcluCascades ){ + if (ptV0 > mSVParams->minPtV0FromCascade && seedP.nITSclu >= mSVParams->mITSSAminNcluCascades && seedN.nITSclu >= mSVParams->mITSSAminNcluCascades) { if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { goodLamForCascade = true; } @@ -614,7 +614,6 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } } - // apply mass selections for 3-body decay bool good3bodyV0Hyp = false; for (int ipid = 2; ipid < 4; ipid++) { From cd273c1f0be867277b69cab3a525a3f36ea9abd0 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Fri, 17 Nov 2023 10:38:48 -0300 Subject: [PATCH 06/13] Fix logic back to n-2 commit --- Detectors/Vertexing/src/SVertexer.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index 024d55f93c3ac..18c0bf63ab4a5 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -605,7 +605,7 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } // check tight lambda mass only bool goodLamForCascade = false, goodALamForCascade = false; - if (ptV0 > mSVParams->minPtV0FromCascade && seedP.nITSclu >= mSVParams->mITSSAminNcluCascades && seedN.nITSclu >= mSVParams->mITSSAminNcluCascades) { + if( ptV0 > mSVParams->minPtV0FromCascade && (seedP.hasTPC || seedP.nITSclu >= mSVParams->mITSSAminNcluCascades) && (seedN.hasTPC || seedN.nITSclu >= mSVParams->mITSSAminNcluCascades) ){ if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { goodLamForCascade = true; } @@ -774,6 +774,10 @@ int SVertexer::checkCascades(const V0Index& v0Idx, const V0& v0, float rv0, std: } auto& bach = tracks[it]; + if( !bach.hasTPC && bach.nITSclu < mSVParams->mITSSAminNcluCascades ){ + continue; + } + if (bach.vBracket.getMin() > v0vlist.getMax()) { LOG(debug) << "Skipping"; break; // all other bachelor candidates will be also not compatible with this PV From cec70f7caa1f3b4581b2423ecebd746024414120 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 17 Nov 2023 13:39:33 +0000 Subject: [PATCH 07/13] Please consider the following formatting changes --- Detectors/Vertexing/src/SVertexer.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index 18c0bf63ab4a5..b1860fbb97a24 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -605,7 +605,7 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } // check tight lambda mass only bool goodLamForCascade = false, goodALamForCascade = false; - if( ptV0 > mSVParams->minPtV0FromCascade && (seedP.hasTPC || seedP.nITSclu >= mSVParams->mITSSAminNcluCascades) && (seedN.hasTPC || seedN.nITSclu >= mSVParams->mITSSAminNcluCascades) ){ + if (ptV0 > mSVParams->minPtV0FromCascade && (seedP.hasTPC || seedP.nITSclu >= mSVParams->mITSSAminNcluCascades) && (seedN.hasTPC || seedN.nITSclu >= mSVParams->mITSSAminNcluCascades)) { if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { goodLamForCascade = true; } @@ -774,8 +774,8 @@ int SVertexer::checkCascades(const V0Index& v0Idx, const V0& v0, float rv0, std: } auto& bach = tracks[it]; - if( !bach.hasTPC && bach.nITSclu < mSVParams->mITSSAminNcluCascades ){ - continue; + if (!bach.hasTPC && bach.nITSclu < mSVParams->mITSSAminNcluCascades) { + continue; } if (bach.vBracket.getMin() > v0vlist.getMax()) { From b986da4555c697277b4610737a7025a5f20882aa Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Fri, 17 Nov 2023 15:47:38 -0300 Subject: [PATCH 08/13] Change according to option 1 + skip tpc only --- .../DetectorsVertexing/SVertexerParams.h | 7 ++++++- Detectors/Vertexing/src/SVertexer.cxx | 19 ++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h index 8221bbd1749db..845b11ed48f4a 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h @@ -95,11 +95,16 @@ struct SVertexerParams : public o2::conf::ConfigurableParamHelper minMomTPCdEdx are always accepted float minMomTPCdEdx = 0.8; // minimum p for tracks with dEdx > mMinTPCdEdx to be accepted - uint8_t mITSSAminNcluCascades = 6; // require at least this many ITS clusters if no TPC info present + uint8_t mITSSAminNclu = 6; // require at least this many ITS clusters if no TPC info present bool mRequireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC + bool mSkipTPCOnlyCascade = true; // skip TPC only tracks when doing cascade finding + bool mSkipTPCOnly3Body = true; // skip TPC only tracks when doing cascade finding // percent deviation from expected proton dEdx - to be replaced - estimated sigma from TPC for now 6%; a 6*sigma cut is therefore 36% = 0.36f. Any value above 1.0f will be ignored manually when checking. float mFractiondEdxforCascBaryons = 0.36f; + // default: average 2023 from C. Sonnabend, Nov 2023: ([0.217553 4.02762 0.00850178 2.33324 0.880904 ]) + // to-do: grab from CCDB when available -> discussion with TPC experts, not available yet + float mBBpars[5] = {0.217553, 4.02762, 0.00850178, 2.33324, 0.880904}; // cuts on different V0 PID params bool checkV0Hypothesis = true; diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index b1860fbb97a24..c41888910c4a8 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -302,11 +302,7 @@ void SVertexer::updateTimeDependentParams() ft.setBz(bz); } - // TPC dE/dx usage information - // default: average 2023 from C. Sonnabend, Nov 2023: ([0.217553 4.02762 0.00850178 2.33324 0.880904 ]) - // to-do: grab from CCDB when available -> discussion with TPC experts, not available yet - const float bbPars[] = {0.217553, 4.02762, 0.00850178, 2.33324, 0.880904}; - mPIDresponse.setBetheBlochParams(bbPars); + mPIDresponse.setBetheBlochParams(mSVParams->mBBpars); } //______________________________________________ @@ -519,6 +515,10 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a continue; } + if( !hasTPC && nITSclu < mSVParams->mITSSAminNclu ){ + continue; // reject short ITS-only + } + int posneg = trc.getSign() < 0 ? 1 : 0; float r = std::sqrt(trc.getX() * trc.getX() + trc.getY() * trc.getY()); mTracksPool[posneg].emplace_back(TrackCand{trc, tvid, {iv, iv}, r, hasTPC, nITSclu, compatibleWithProton}); @@ -605,7 +605,8 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } // check tight lambda mass only bool goodLamForCascade = false, goodALamForCascade = false; - if (ptV0 > mSVParams->minPtV0FromCascade && (seedP.hasTPC || seedP.nITSclu >= mSVParams->mITSSAminNcluCascades) && (seedN.hasTPC || seedN.nITSclu >= mSVParams->mITSSAminNcluCascades)) { + bool usesTPCOnly = (seedP.hasTPC && seedP.nITSclu<1) || (seedN.hasTPC && seedN.nITSclu<1); + if (ptV0 > mSVParams->minPtV0FromCascade && (!mSVParams->mSkipTPCOnlyCascade || !usesTPCOnly)) { if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { goodLamForCascade = true; } @@ -625,7 +626,7 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } // we want to reconstruct the 3 body decay of hypernuclei starting from the V0 of a proton and a pion (e.g. H3L->d + (p + pi-), or He4L->He3 + (p + pi-))) - bool checkFor3BodyDecays = mEnable3BodyDecays && (!mSVParams->checkV0Hypothesis || good3bodyV0Hyp) && (pt2V0 > 0.5); + bool checkFor3BodyDecays = mEnable3BodyDecays && (!mSVParams->checkV0Hypothesis || good3bodyV0Hyp) && (pt2V0 > 0.5) && (!mSVParams->mSkipTPCOnly3Body || !usesTPCOnly); bool rejectAfter3BodyCheck = false; // To reject v0s which can be 3-body decay candidates but not cascade or v0 bool checkForCascade = mEnableCascades && r2v0 < mMaxR2ToMeanVertexCascV0 && (!mSVParams->checkV0Hypothesis || (goodLamForCascade || goodALamForCascade)); bool rejectIfNotCascade = false; @@ -774,10 +775,6 @@ int SVertexer::checkCascades(const V0Index& v0Idx, const V0& v0, float rv0, std: } auto& bach = tracks[it]; - if (!bach.hasTPC && bach.nITSclu < mSVParams->mITSSAminNcluCascades) { - continue; - } - if (bach.vBracket.getMin() > v0vlist.getMax()) { LOG(debug) << "Skipping"; break; // all other bachelor candidates will be also not compatible with this PV From 920663d6f0b6e3aa175e99eb703a6b1694b10c80 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 17 Nov 2023 18:48:18 +0000 Subject: [PATCH 09/13] Please consider the following formatting changes --- .../Vertexing/include/DetectorsVertexing/SVertexerParams.h | 6 +++--- Detectors/Vertexing/src/SVertexer.cxx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h index 845b11ed48f4a..c66b8da451d12 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h @@ -95,10 +95,10 @@ struct SVertexerParams : public o2::conf::ConfigurableParamHelper minMomTPCdEdx are always accepted float minMomTPCdEdx = 0.8; // minimum p for tracks with dEdx > mMinTPCdEdx to be accepted - uint8_t mITSSAminNclu = 6; // require at least this many ITS clusters if no TPC info present + uint8_t mITSSAminNclu = 6; // require at least this many ITS clusters if no TPC info present bool mRequireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC - bool mSkipTPCOnlyCascade = true; // skip TPC only tracks when doing cascade finding - bool mSkipTPCOnly3Body = true; // skip TPC only tracks when doing cascade finding + bool mSkipTPCOnlyCascade = true; // skip TPC only tracks when doing cascade finding + bool mSkipTPCOnly3Body = true; // skip TPC only tracks when doing cascade finding // percent deviation from expected proton dEdx - to be replaced - estimated sigma from TPC for now 6%; a 6*sigma cut is therefore 36% = 0.36f. Any value above 1.0f will be ignored manually when checking. float mFractiondEdxforCascBaryons = 0.36f; diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index c41888910c4a8..340dd9bfafbbd 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -515,7 +515,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a continue; } - if( !hasTPC && nITSclu < mSVParams->mITSSAminNclu ){ + if (!hasTPC && nITSclu < mSVParams->mITSSAminNclu) { continue; // reject short ITS-only } @@ -605,7 +605,7 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, } // check tight lambda mass only bool goodLamForCascade = false, goodALamForCascade = false; - bool usesTPCOnly = (seedP.hasTPC && seedP.nITSclu<1) || (seedN.hasTPC && seedN.nITSclu<1); + bool usesTPCOnly = (seedP.hasTPC && seedP.nITSclu < 1) || (seedN.hasTPC && seedN.nITSclu < 1); if (ptV0 > mSVParams->minPtV0FromCascade && (!mSVParams->mSkipTPCOnlyCascade || !usesTPCOnly)) { if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { goodLamForCascade = true; From e89e14390d8f6be1555076eeb35e4526387ed987 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Sat, 18 Nov 2023 09:52:47 -0300 Subject: [PATCH 10/13] Fix fullCI --- Detectors/Vertexing/src/SVertexer.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index 340dd9bfafbbd..f296344f46ae6 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -503,7 +503,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a // get Nclusters in the ITS if available uint8_t nITSclu = -1; auto itsGID = recoData.getITSContributorGID(tvid); - if (itsGID.isIndexSet() && isITSloaded) { + if (itsGID.getSource()==GIndex::ITS && isITSloaded) { auto& itsTrack = recoData.getITSTrack(itsGID); nITSclu = itsTrack.getNumberOfClusters(); } From 63e497a7a67a5828ad554694b0e7c535c17e534b Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Sat, 18 Nov 2023 12:53:33 +0000 Subject: [PATCH 11/13] Please consider the following formatting changes --- Detectors/Vertexing/src/SVertexer.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index f296344f46ae6..25d11120becd8 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -503,7 +503,7 @@ void SVertexer::buildT2V(const o2::globaltracking::RecoContainer& recoData) // a // get Nclusters in the ITS if available uint8_t nITSclu = -1; auto itsGID = recoData.getITSContributorGID(tvid); - if (itsGID.getSource()==GIndex::ITS && isITSloaded) { + if (itsGID.getSource() == GIndex::ITS && isITSloaded) { auto& itsTrack = recoData.getITSTrack(itsGID); nITSclu = itsTrack.getNumberOfClusters(); } From 7846d1bd6ea8b967f24b3d2a47d42b726c8c0532 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Sat, 18 Nov 2023 10:07:00 -0300 Subject: [PATCH 12/13] Separate min ITS clu cut for track pool + for cascades --- .../Vertexing/include/DetectorsVertexing/SVertexerParams.h | 3 ++- Detectors/Vertexing/src/SVertexer.cxx | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h index c66b8da451d12..c4d231034edcf 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h @@ -95,7 +95,8 @@ struct SVertexerParams : public o2::conf::ConfigurableParamHelper minMomTPCdEdx are always accepted float minMomTPCdEdx = 0.8; // minimum p for tracks with dEdx > mMinTPCdEdx to be accepted - uint8_t mITSSAminNclu = 6; // require at least this many ITS clusters if no TPC info present + uint8_t mITSSAminNclu = 6; // global requirement of at least this many ITS clusters if no TPC info present (N.B.: affects all secondary vertexing) + uint8_t mITSSAminNcluCascades = 6; // require at least this many ITS clusters if no TPC info present for cascade finding. bool mRequireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC bool mSkipTPCOnlyCascade = true; // skip TPC only tracks when doing cascade finding bool mSkipTPCOnly3Body = true; // skip TPC only tracks when doing cascade finding diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index 25d11120becd8..cd122578967ee 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -606,7 +606,8 @@ bool SVertexer::checkV0(const TrackCand& seedP, const TrackCand& seedN, int iP, // check tight lambda mass only bool goodLamForCascade = false, goodALamForCascade = false; bool usesTPCOnly = (seedP.hasTPC && seedP.nITSclu < 1) || (seedN.hasTPC && seedN.nITSclu < 1); - if (ptV0 > mSVParams->minPtV0FromCascade && (!mSVParams->mSkipTPCOnlyCascade || !usesTPCOnly)) { + bool usesShortITSOnly = (!seedP.hasTPC && seedP.nITSclu < mSVParams->mITSSAminNcluCascades) || (!seedN.hasTPC && seedN.nITSclu < mSVParams->mITSSAminNcluCascades); + if (ptV0 > mSVParams->minPtV0FromCascade && (!mSVParams->mSkipTPCOnlyCascade || !usesTPCOnly) && !usesShortITSOnly) { if (mV0Hyps[Lambda].checkTight(p2Pos, p2Neg, p2V0, ptV0) && (!mSVParams->mRequireTPCforCascBaryons || seedP.hasTPC) && seedP.compatibleProton) { goodLamForCascade = true; } @@ -774,6 +775,10 @@ int SVertexer::checkCascades(const V0Index& v0Idx, const V0& v0, float rv0, std: continue; // skip the track used by V0 } auto& bach = tracks[it]; + + if (!bach.hasTPC && bach.nITSclu < mSVParams->mITSSAminNcluCascades) { + continue; // reject short ITS-only + } if (bach.vBracket.getMin() > v0vlist.getMax()) { LOG(debug) << "Skipping"; From d329a14633b02d3332261f9710186c11ae60757c Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Sat, 18 Nov 2023 13:08:19 +0000 Subject: [PATCH 13/13] Please consider the following formatting changes --- .../Vertexing/include/DetectorsVertexing/SVertexerParams.h | 2 +- Detectors/Vertexing/src/SVertexer.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h index c4d231034edcf..47c56a400a289 100644 --- a/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h +++ b/Detectors/Vertexing/include/DetectorsVertexing/SVertexerParams.h @@ -96,7 +96,7 @@ struct SVertexerParams : public o2::conf::ConfigurableParamHelper mMinTPCdEdx to be accepted uint8_t mITSSAminNclu = 6; // global requirement of at least this many ITS clusters if no TPC info present (N.B.: affects all secondary vertexing) - uint8_t mITSSAminNcluCascades = 6; // require at least this many ITS clusters if no TPC info present for cascade finding. + uint8_t mITSSAminNcluCascades = 6; // require at least this many ITS clusters if no TPC info present for cascade finding. bool mRequireTPCforCascBaryons = true; // require that baryon daughter of cascade has TPC bool mSkipTPCOnlyCascade = true; // skip TPC only tracks when doing cascade finding bool mSkipTPCOnly3Body = true; // skip TPC only tracks when doing cascade finding diff --git a/Detectors/Vertexing/src/SVertexer.cxx b/Detectors/Vertexing/src/SVertexer.cxx index cd122578967ee..47657a0633cf5 100644 --- a/Detectors/Vertexing/src/SVertexer.cxx +++ b/Detectors/Vertexing/src/SVertexer.cxx @@ -775,7 +775,7 @@ int SVertexer::checkCascades(const V0Index& v0Idx, const V0& v0, float rv0, std: continue; // skip the track used by V0 } auto& bach = tracks[it]; - + if (!bach.hasTPC && bach.nITSclu < mSVParams->mITSSAminNcluCascades) { continue; // reject short ITS-only }