From fba233af4d67e0aca79ecd0347decf454cdd9c26 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Sun, 4 Jun 2023 22:09:42 -0300 Subject: [PATCH 1/2] Add bach-baryon cuts, tuning --- PWGLF/DataModel/LFStrangenessTables.h | 7 +++ PWGLF/TableProducer/cascadebuilder.cxx | 78 +++++++++++++++++++++++++- PWGLF/TableProducer/cascadefinder.cxx | 4 +- 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index e3e57fa231c..c9bf565af67 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -334,6 +334,11 @@ DECLARE_SOA_COLUMN(DCAZCascToPV, dcaZCascToPV, float); //! DECLARE_SOA_COLUMN(PositionCovMat, positionCovMat, float[6]); //! covariance matrix elements DECLARE_SOA_COLUMN(MomentumCovMat, momentumCovMat, float[6]); //! covariance matrix elements +// Selection to avoid spurious invariant mass correlation +// bachelor-baryon cosine of pointing angle / DCA to PV +DECLARE_SOA_COLUMN(BachBaryonCosPA, bachBaryonCosPA, float); //! avoid bach-baryon correlated inv mass structure in analysis +DECLARE_SOA_COLUMN(BachBaryonDCAxyToPV, bachBaryonDCAxyToPV, float); //! avoid bach-baryon correlated inv mass structure in analysis + // Saved from strangeness tracking DECLARE_SOA_COLUMN(MatchingChi2, matchingChi2, float); //! DECLARE_SOA_COLUMN(TopologyChi2, topologyChi2, float); //! @@ -401,6 +406,7 @@ DECLARE_SOA_TABLE(StoredCascDatas, "AOD", "CASCDATA", //! cascdata::Px, cascdata::Py, cascdata::Pz, cascdata::DCAV0Daughters, cascdata::DCACascDaughters, cascdata::DCAPosToPV, cascdata::DCANegToPV, cascdata::DCABachToPV, cascdata::DCAXYCascToPV, cascdata::DCAZCascToPV, + cascdata::BachBaryonCosPA, cascdata::BachBaryonDCAxyToPV, // Dynamic columns cascdata::Pt, @@ -431,6 +437,7 @@ DECLARE_SOA_TABLE(StoredTraCascDatas, "AOD", "TRACASCDATA", //! cascdata::Px, cascdata::Py, cascdata::Pz, cascdata::DCAV0Daughters, cascdata::DCACascDaughters, cascdata::DCAPosToPV, cascdata::DCANegToPV, cascdata::DCABachToPV, cascdata::DCAXYCascToPV, cascdata::DCAZCascToPV, + cascdata::BachBaryonCosPA, cascdata::BachBaryonDCAxyToPV, cascdata::MatchingChi2, cascdata::TopologyChi2, cascdata::ItsClsSize, // Dynamic columns diff --git a/PWGLF/TableProducer/cascadebuilder.cxx b/PWGLF/TableProducer/cascadebuilder.cxx index 0755af62d26..9e7b5ed239c 100644 --- a/PWGLF/TableProducer/cascadebuilder.cxx +++ b/PWGLF/TableProducer/cascadebuilder.cxx @@ -124,6 +124,7 @@ struct cascadeBuilder { Configurable d_GenerateOnlyTrackedCascades{"d_GenerateOnlyTrackedCascades", false, "Skip cascades that aren't tracked"}; Configurable d_QA_checkMC{"d_QA_checkMC", true, "check MC truth in QA"}; Configurable d_QA_checkdEdx{"d_QA_checkdEdx", false, "check dEdx in QA"}; + Configurable calculateBachBaryonVars{"calculateBachBaryonVars", false, "calculate variables for removing cascade inv mass bump"}; // CCDB options Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -196,6 +197,8 @@ struct cascadeBuilder { float mOmega; float yXi; float yOmega; + float bachBaryonCosPA; + float bachBaryonDCAxyToPV; } cascadecandidate; o2::track::TrackParCov lBachelorTrack; @@ -518,6 +521,10 @@ struct cascadeBuilder { matCorrCascade = o2::base::Propagator::MatCorrType::USEMatCorrTGeo; if (useMatCorrTypeCasc == 2) matCorrCascade = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + + // initialize bach baryon variables just in case + cascadecandidate.bachBaryonCosPA = 1; // would ordinarily reject all + cascadecandidate.bachBaryonDCAxyToPV = 0; // would ordinarily reject all } void initCCDB(aod::BCsWithTimestamps::iterator const& bc) @@ -568,6 +575,60 @@ struct cascadeBuilder { } } + template + void processBachBaryonVariables(TCollision const& collision, TTrack const& track1, TTrack const& track2) + { + cascadecandidate.bachBaryonCosPA = 0; // would ordinarily accept all + cascadecandidate.bachBaryonDCAxyToPV = 1e+3; // would ordinarily accept all + + // create tracks from table rows + o2::track::TrackParCov tr1 = getTrackParCov(track1); + o2::track::TrackParCov tr2 = getTrackParCov(track2); + + //---/---/---/ + // Move close to minima + int nCand = 0; + try { + nCand = fitter.process(tr1, tr2); + } catch (...) { + registry.fill(HIST("hCaughtExceptions"), 0.5f); + LOG(error) << "Exception caught in DCA fitter process call!"; + return; + } + if (nCand == 0) + return; // variables are such that candidate is accepted (not obvious...) + + // Calculate DCAxy of the cascade (with bending) + o2::track::TrackPar wrongV0 = fitter.createParentTrackPar(); + wrongV0.setAbsCharge(0); // charge zero + gpu::gpustd::array dcaInfo; + dcaInfo[0] = 999; + dcaInfo[1] = 999; + + // bachelor-baryon DCAxy to PV + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, wrongV0, 2.f, matCorr, &dcaInfo); + cascadecandidate.bachBaryonDCAxyToPV = dcaInfo[0]; + + const auto& vtx = fitter.getPCACandidate(); + if(!fitter.isPropagateTracksToVertexDone()) + return; + + std::array tr1p; + std::array tr2p; + + fitter.getTrack(1).getPxPyPzGlo(tr1p); + fitter.getTrack(2).getPxPyPzGlo(tr2p); + + // bachelor-baryon CosPA + cascadecandidate.bachBaryonCosPA = RecoDecay::cpa( + array{collision.posX(), collision.posY(), collision.posZ()}, + array{vtx[0], vtx[1], vtx[2]}, + array{tr1p[0]+tr2p[0], tr1p[1]+tr2p[1], tr1p[2]+tr2p[2]}); + + // Potentially also to be considered: bachelor-baryon DCA (between the two tracks) + // to be added here as complementary information in the future + } + template bool buildCascadeCandidate(TCascObject const& cascade) { @@ -582,6 +643,16 @@ struct cascadeBuilder { auto negTrack = v0.template negTrack_as(); auto const& collision = cascade.collision(); + if(calculateBachBaryonVars){ + // Calculates properties of the V0 comprised of bachelor and baryon in the cascade + // baryon: distinguished via bachelor charge + if(bachTrack.sign()<0){ + processBachBaryonVariables(collision, bachTrack, posTrack); + }else{ + processBachBaryonVariables(collision, bachTrack, negTrack); + } + } + // value 0.5: any considered cascade statisticsRegistry.cascstats[kCascAll]++; @@ -785,7 +856,8 @@ struct cascadeBuilder { cascadecandidate.bachP[2] + cascadecandidate.v0mompos[2] + cascadecandidate.v0momneg[2], // <--- redundant but ok cascadecandidate.v0dcadau, cascadecandidate.dcacascdau, cascadecandidate.v0dcapostopv, cascadecandidate.v0dcanegtopv, - cascadecandidate.bachDCAxy, cascadecandidate.cascDCAxy, cascadecandidate.cascDCAz); // <--- no corresponding stratrack information available + cascadecandidate.bachDCAxy, cascadecandidate.cascDCAxy, cascadecandidate.cascDCAz, // <--- no corresponding stratrack information available + cascadecandidate.bachBaryonCosPA, cascadecandidate.bachBaryonDCAxyToPV); // populate cascade covariance matrices if required by any other task if (createCascCovMats) { @@ -853,7 +925,8 @@ struct cascadeBuilder { cascadecandidate.bachP[2] + cascadecandidate.v0mompos[2] + cascadecandidate.v0momneg[2], cascadecandidate.v0dcadau, cascadecandidate.dcacascdau, cascadecandidate.v0dcapostopv, cascadecandidate.v0dcanegtopv, - cascadecandidate.bachDCAxy, cascadecandidate.cascDCAxy, cascadecandidate.cascDCAz); + cascadecandidate.bachDCAxy, cascadecandidate.cascDCAxy, cascadecandidate.cascDCAz, + cascadecandidate.bachBaryonCosPA, cascadecandidate.bachBaryonDCAxyToPV); // populate cascade covariance matrices if required by any other task if (createCascCovMats) { @@ -1003,6 +1076,7 @@ struct cascadeBuilder { cascadecandidate.v0dcadau, cascadecandidate.dcacascdau, cascadecandidate.v0dcapostopv, cascadecandidate.v0dcanegtopv, cascadecandidate.bachDCAxy, cascadecandidate.cascDCAxy, cascadecandidate.cascDCAz, // <--- stratrack (cascDCAxy/z) + cascadecandidate.bachBaryonCosPA, cascadecandidate.bachBaryonDCAxyToPV, // <--- anti-inv-mass structure trackedCascade.matchingChi2(), trackedCascade.topologyChi2(), trackedCascade.itsClsSize()); // <--- stratrack fit info } } diff --git a/PWGLF/TableProducer/cascadefinder.cxx b/PWGLF/TableProducer/cascadefinder.cxx index b4f027bae74..f4d3e9aef37 100644 --- a/PWGLF/TableProducer/cascadefinder.cxx +++ b/PWGLF/TableProducer/cascadefinder.cxx @@ -267,7 +267,7 @@ struct cascadefinder { v0.dcapostopv(), v0.dcanegtopv(), t0id.dcaXY(), - dcaInfo[0], dcaInfo[1]); + dcaInfo[0], dcaInfo[1], 0, 1e+3); } // end if cascade recoed } // end loop over bachelor } // end if v0 recoed @@ -357,7 +357,7 @@ struct cascadefinder { v0.dcapostopv(), v0.dcanegtopv(), t0id.dcaXY(), - dcaInfo[0], dcaInfo[1]); + dcaInfo[0], dcaInfo[1], 0, 1e+3); } // end if cascade recoed } // end loop over bachelor } // end if v0 recoed From ca69342b88c814c9e74f562ba732d0ddd231b609 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Mon, 5 Jun 2023 06:57:18 -0300 Subject: [PATCH 2/2] Clang-format fixes --- PWGLF/DataModel/LFStrangenessTables.h | 10 +++---- PWGLF/TableProducer/cascadebuilder.cxx | 40 +++++++++++++------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index c9bf565af67..be38f9ca8ff 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -334,9 +334,9 @@ DECLARE_SOA_COLUMN(DCAZCascToPV, dcaZCascToPV, float); //! DECLARE_SOA_COLUMN(PositionCovMat, positionCovMat, float[6]); //! covariance matrix elements DECLARE_SOA_COLUMN(MomentumCovMat, momentumCovMat, float[6]); //! covariance matrix elements -// Selection to avoid spurious invariant mass correlation -// bachelor-baryon cosine of pointing angle / DCA to PV -DECLARE_SOA_COLUMN(BachBaryonCosPA, bachBaryonCosPA, float); //! avoid bach-baryon correlated inv mass structure in analysis +// Selection to avoid spurious invariant mass correlation +// bachelor-baryon cosine of pointing angle / DCA to PV +DECLARE_SOA_COLUMN(BachBaryonCosPA, bachBaryonCosPA, float); //! avoid bach-baryon correlated inv mass structure in analysis DECLARE_SOA_COLUMN(BachBaryonDCAxyToPV, bachBaryonDCAxyToPV, float); //! avoid bach-baryon correlated inv mass structure in analysis // Saved from strangeness tracking @@ -406,7 +406,7 @@ DECLARE_SOA_TABLE(StoredCascDatas, "AOD", "CASCDATA", //! cascdata::Px, cascdata::Py, cascdata::Pz, cascdata::DCAV0Daughters, cascdata::DCACascDaughters, cascdata::DCAPosToPV, cascdata::DCANegToPV, cascdata::DCABachToPV, cascdata::DCAXYCascToPV, cascdata::DCAZCascToPV, - cascdata::BachBaryonCosPA, cascdata::BachBaryonDCAxyToPV, + cascdata::BachBaryonCosPA, cascdata::BachBaryonDCAxyToPV, // Dynamic columns cascdata::Pt, @@ -437,7 +437,7 @@ DECLARE_SOA_TABLE(StoredTraCascDatas, "AOD", "TRACASCDATA", //! cascdata::Px, cascdata::Py, cascdata::Pz, cascdata::DCAV0Daughters, cascdata::DCACascDaughters, cascdata::DCAPosToPV, cascdata::DCANegToPV, cascdata::DCABachToPV, cascdata::DCAXYCascToPV, cascdata::DCAZCascToPV, - cascdata::BachBaryonCosPA, cascdata::BachBaryonDCAxyToPV, + cascdata::BachBaryonCosPA, cascdata::BachBaryonDCAxyToPV, cascdata::MatchingChi2, cascdata::TopologyChi2, cascdata::ItsClsSize, // Dynamic columns diff --git a/PWGLF/TableProducer/cascadebuilder.cxx b/PWGLF/TableProducer/cascadebuilder.cxx index 9e7b5ed239c..efb7394133a 100644 --- a/PWGLF/TableProducer/cascadebuilder.cxx +++ b/PWGLF/TableProducer/cascadebuilder.cxx @@ -197,7 +197,7 @@ struct cascadeBuilder { float mOmega; float yXi; float yOmega; - float bachBaryonCosPA; + float bachBaryonCosPA; float bachBaryonDCAxyToPV; } cascadecandidate; @@ -522,9 +522,9 @@ struct cascadeBuilder { if (useMatCorrTypeCasc == 2) matCorrCascade = o2::base::Propagator::MatCorrType::USEMatCorrLUT; - // initialize bach baryon variables just in case - cascadecandidate.bachBaryonCosPA = 1; // would ordinarily reject all - cascadecandidate.bachBaryonDCAxyToPV = 0; // would ordinarily reject all + // initialize bach baryon variables just in case + cascadecandidate.bachBaryonCosPA = 1; // would ordinarily reject all + cascadecandidate.bachBaryonDCAxyToPV = 0; // would ordinarily reject all } void initCCDB(aod::BCsWithTimestamps::iterator const& bc) @@ -578,8 +578,8 @@ struct cascadeBuilder { template void processBachBaryonVariables(TCollision const& collision, TTrack const& track1, TTrack const& track2) { - cascadecandidate.bachBaryonCosPA = 0; // would ordinarily accept all - cascadecandidate.bachBaryonDCAxyToPV = 1e+3; // would ordinarily accept all + cascadecandidate.bachBaryonCosPA = 0; // would ordinarily accept all + cascadecandidate.bachBaryonDCAxyToPV = 1e+3; // would ordinarily accept all // create tracks from table rows o2::track::TrackParCov tr1 = getTrackParCov(track1); @@ -609,9 +609,9 @@ struct cascadeBuilder { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, wrongV0, 2.f, matCorr, &dcaInfo); cascadecandidate.bachBaryonDCAxyToPV = dcaInfo[0]; - const auto& vtx = fitter.getPCACandidate(); - if(!fitter.isPropagateTracksToVertexDone()) - return; + const auto& vtx = fitter.getPCACandidate(); + if (!fitter.isPropagateTracksToVertexDone()) + return; std::array tr1p; std::array tr2p; @@ -619,13 +619,13 @@ struct cascadeBuilder { fitter.getTrack(1).getPxPyPzGlo(tr1p); fitter.getTrack(2).getPxPyPzGlo(tr2p); - // bachelor-baryon CosPA + // bachelor-baryon CosPA cascadecandidate.bachBaryonCosPA = RecoDecay::cpa( array{collision.posX(), collision.posY(), collision.posZ()}, array{vtx[0], vtx[1], vtx[2]}, - array{tr1p[0]+tr2p[0], tr1p[1]+tr2p[1], tr1p[2]+tr2p[2]}); + array{tr1p[0] + tr2p[0], tr1p[1] + tr2p[1], tr1p[2] + tr2p[2]}); - // Potentially also to be considered: bachelor-baryon DCA (between the two tracks) + // Potentially also to be considered: bachelor-baryon DCA (between the two tracks) // to be added here as complementary information in the future } @@ -643,13 +643,13 @@ struct cascadeBuilder { auto negTrack = v0.template negTrack_as(); auto const& collision = cascade.collision(); - if(calculateBachBaryonVars){ - // Calculates properties of the V0 comprised of bachelor and baryon in the cascade + if (calculateBachBaryonVars) { + // Calculates properties of the V0 comprised of bachelor and baryon in the cascade // baryon: distinguished via bachelor charge - if(bachTrack.sign()<0){ - processBachBaryonVariables(collision, bachTrack, posTrack); - }else{ - processBachBaryonVariables(collision, bachTrack, negTrack); + if (bachTrack.sign() < 0) { + processBachBaryonVariables(collision, bachTrack, posTrack); + } else { + processBachBaryonVariables(collision, bachTrack, negTrack); } } @@ -857,7 +857,7 @@ struct cascadeBuilder { cascadecandidate.v0dcadau, cascadecandidate.dcacascdau, cascadecandidate.v0dcapostopv, cascadecandidate.v0dcanegtopv, cascadecandidate.bachDCAxy, cascadecandidate.cascDCAxy, cascadecandidate.cascDCAz, // <--- no corresponding stratrack information available - cascadecandidate.bachBaryonCosPA, cascadecandidate.bachBaryonDCAxyToPV); + cascadecandidate.bachBaryonCosPA, cascadecandidate.bachBaryonDCAxyToPV); // populate cascade covariance matrices if required by any other task if (createCascCovMats) { @@ -925,7 +925,7 @@ struct cascadeBuilder { cascadecandidate.bachP[2] + cascadecandidate.v0mompos[2] + cascadecandidate.v0momneg[2], cascadecandidate.v0dcadau, cascadecandidate.dcacascdau, cascadecandidate.v0dcapostopv, cascadecandidate.v0dcanegtopv, - cascadecandidate.bachDCAxy, cascadecandidate.cascDCAxy, cascadecandidate.cascDCAz, + cascadecandidate.bachDCAxy, cascadecandidate.cascDCAxy, cascadecandidate.cascDCAz, cascadecandidate.bachBaryonCosPA, cascadecandidate.bachBaryonDCAxyToPV); // populate cascade covariance matrices if required by any other task