From 1a4f0bc78c0ed69d75c749ea2ecc156c202e3f60 Mon Sep 17 00:00:00 2001 From: Maria Paula Martins Palhares Date: Thu, 10 Oct 2024 18:51:27 +0200 Subject: [PATCH 1/4] add alphaAP as lnnCand.IsMatter flag --- PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx | 68 ++++++++++++++++------ 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx index da509a17295..9680518500f 100644 --- a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx @@ -76,6 +76,15 @@ std::shared_ptr hIsMatterGen; std::shared_ptr hIsMatterGenTwoBody; std::shared_ptr hDCAxy3H; +float alphaAP(std::array const& momB, std::array const& momC) +{ + std::array momA = {momB[0] + momC[0], momB[1] + momC[1], momB[2] + momC[2]}; + float momTot = std::sqrt(momA[0] * momA[0] + momA[1] * momA[1] + momA[2] * momA[2]); + float lQlPos = (momB[0] * momA[0] + momB[1] * momA[1] + momB[2] * momA[2]) / momTot; + float lQlNeg = (momC[0] * momA[0] + momC[1] * momA[1] + momC[2] * momA[2]) / momTot; + return (lQlPos - lQlNeg) / (lQlPos + lQlNeg); +} + } // namespace struct lnnCandidate { @@ -142,7 +151,6 @@ struct lnnRecoTask { Configurable nSigmaCutMaxTPC{"nSigmaCutMaxTPC", 5, "triton dEdx cut (n sigma)"}; Configurable nTPCClusMin3H{"nTPCClusMin3H", 80, "triton NTPC clusters cut"}; Configurable ptMinTOF{"ptMinTOF", 0.8, "minimum pt for TOF cut"}; - Configurable ptMaxTOF{"ptMaxTOF", 3.5, "minimum pt for TOF cut"}; Configurable TrTOFMass2Cut{"TrTOFMass2Cut", 5.5, "minimum Triton mass square to TOF"}; Configurable mcSignalOnly{"mcSignalOnly", true, "If true, save only signal in MC"}; @@ -339,16 +347,34 @@ struct lnnRecoTask { hdEdxTot->Fill(-negRigidity, negTrack.tpcSignal()); // ITS only tracks do not have TPC information. TPCnSigma: only lower cut to allow for triton reconstruction - bool is3H = posTrack.hasTPC() && nSigmaTPCpos > nSigmaCutMinTPC && nSigmaTPCpos < nSigmaCutMaxTPC; bool isAnti3H = negTrack.hasTPC() && nSigmaTPCneg > nSigmaCutMinTPC && nSigmaTPCneg < nSigmaCutMaxTPC; - if (!is3H && !isAnti3H) + if (!is3H && !isAnti3H) // discard if both tracks are not 3H candidates continue; - // Describing lnn as matter candidate + auto posTrackCov = getTrackParCov(posTrack); + auto negTrackCov = getTrackParCov(negTrack); + + int nCandTrack = 0; + try { + nCandTrack = fitter.process(posTrackCov, negTrackCov); + } catch (...) { + LOG(error) << "Exception caught in DCA fitter process call!"; + continue; + } + if (nCandTrack == 0) { + continue; + } + + // if alphaAP is > 0 the candidate is 3H, if < 0 it is anti-3H + std::array momPos = std::array{static_cast(-999.), static_cast(-999.), static_cast(-999.)}; + std::array momNeg = std::array{static_cast(-999.), static_cast(-999.), static_cast(-999.)}; + posTrack.getPxPyPzGlo(momPos); + negTrack.getPxPyPzGlo(momNeg); + float alphaAP = alphaAP(momPos, momNeg); lnnCandidate lnnCand; - lnnCand.isMatter = is3H && isAnti3H ? std::abs(nSigmaTPCpos) < std::abs(nSigmaTPCneg) : is3H; + lnnCand.isMatter = alphaAP > 0; auto& h3track = lnnCand.isMatter ? posTrack : negTrack; auto& h3Rigidity = lnnCand.isMatter ? posRigidity : negRigidity; @@ -374,21 +400,17 @@ struct lnnRecoTask { auto h3TrackCov = getTrackParCov(posTrack); auto negTrackCov = getTrackParCov(negTrack); - int chargeFactor = -1 + 2 * lnnCand.isMatter; - hdEdx3HSel->Fill(chargeFactor * lnnCand.mom3HTPC, h3track.tpcSignal()); - hNsigma3HSel->Fill(chargeFactor * lnnCand.mom3HTPC, lnnCand.nSigma3H); - hDCAxy3H->Fill(h3track.pt(), h3track.dcaXY()); - if (is3H) { - hdEdx3HPosTrack->Fill(lnnCand.mom3HTPC, h3track.tpcSignal()); - } - if (h3track.hasTOF()) { - float beta = h3track.beta(); + + float beta = -1.f; + if (h3track.pt() >= ptMinTOF) { + if (!h3track.hasTOF()) { + continue; + } + beta = h3track.beta(); lnnCand.mass2TrTOF = h3track.mass() * h3track.mass(); - if (h3track.pt() >= ptMinTOF && h3track.pt() <= ptMaxTOF && lnnCand.mass2TrTOF >= TrTOFMass2Cut) { - h3HSignalPtTOF->Fill(chargeFactor * h3track.pt(), beta); - hNsigma3HSelTOF->Fill(chargeFactor * h3track.pt(), h3track.tofNSigmaTr()); - h3HMassPtTOF->Fill(chargeFactor * h3track.pt(), lnnCand.mass2TrTOF); + if (lnnCand.mass2TrTOF < TrTOFMass2Cut) { + continue; } } @@ -472,6 +494,16 @@ struct lnnRecoTask { lnnCand.negTrackID = negTrack.globalIndex(); lnnCandidates.push_back(lnnCand); + + // Fill QA histograms + hdEdx3HSel->Fill(chargeFactor * lnnCand.mom3HTPC, h3track.tpcSignal()); + hNsigma3HSel->Fill(chargeFactor * lnnCand.mom3HTPC, lnnCand.nSigma3H); + hDCAxy3H->Fill(h3track.pt(), h3track.dcaXY()); + if (h3track.hasTOF()) { + h3HSignalPtTOF->Fill(chargeFactor * h3track.pt(), beta); + hNsigma3HSelTOF->Fill(chargeFactor * h3track.pt(), h3track.tofNSigmaTr()); + h3HMassPtTOF->Fill(chargeFactor * h3track.pt(), lnnCand.mass2TrTOF); + } } } From 086af49939dea6defab2a0ca153af3892f6ffe59 Mon Sep 17 00:00:00 2001 From: Maria Paula Martins Palhares Date: Fri, 11 Oct 2024 10:37:00 +0200 Subject: [PATCH 2/4] Fix alibuild erros --- PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx index 9680518500f..be7dabc4fd6 100644 --- a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx @@ -367,14 +367,17 @@ struct lnnRecoTask { continue; } + auto& posPropTrack = fitter.getTrack(0); + auto& negPropTrack = fitter.getTrack(1); + // if alphaAP is > 0 the candidate is 3H, if < 0 it is anti-3H std::array momPos = std::array{static_cast(-999.), static_cast(-999.), static_cast(-999.)}; std::array momNeg = std::array{static_cast(-999.), static_cast(-999.), static_cast(-999.)}; - posTrack.getPxPyPzGlo(momPos); - negTrack.getPxPyPzGlo(momNeg); - float alphaAP = alphaAP(momPos, momNeg); + posPropTrack.getPxPyPzGlo(momPos); + negPropTrack.getPxPyPzGlo(momNeg); + float alpha = alphaAP(momPos, momNeg); lnnCandidate lnnCand; - lnnCand.isMatter = alphaAP > 0; + lnnCand.isMatter = alpha > 0; auto& h3track = lnnCand.isMatter ? posTrack : negTrack; auto& h3Rigidity = lnnCand.isMatter ? posRigidity : negRigidity; @@ -399,7 +402,7 @@ struct lnnRecoTask { lnnCand.flags |= lnnCand.isMatter ? static_cast(negTrack.pidForTracking() & 0xF) : static_cast(posTrack.pidForTracking() & 0xF); auto h3TrackCov = getTrackParCov(posTrack); - auto negTrackCov = getTrackParCov(negTrack); + auto piTrackCov = getTrackParCov(negTrack); int chargeFactor = -1 + 2 * lnnCand.isMatter; float beta = -1.f; @@ -416,7 +419,7 @@ struct lnnRecoTask { int nCand = 0; try { - nCand = fitter.process(h3TrackCov, negTrackCov); + nCand = fitter.process(h3TrackCov, piTrackCov); } catch (...) { LOG(error) << "Exception caught in DCA fitter process call!"; continue; From be56d1784afdfd39ffc6915cb53eec55ecf6d96a Mon Sep 17 00:00:00 2001 From: Maria Paula Martins Palhares Date: Fri, 11 Oct 2024 12:11:54 +0200 Subject: [PATCH 3/4] Remove getPxPyPz for posTrack and negTrack (alpha calculation) and fix h3dcaxy and pidcaxy fill --- PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx | 39 ++++++---------------- 1 file changed, 10 insertions(+), 29 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx index be7dabc4fd6..0050b0c47a4 100644 --- a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx @@ -352,29 +352,11 @@ struct lnnRecoTask { if (!is3H && !isAnti3H) // discard if both tracks are not 3H candidates continue; - - auto posTrackCov = getTrackParCov(posTrack); - auto negTrackCov = getTrackParCov(negTrack); - - int nCandTrack = 0; - try { - nCandTrack = fitter.process(posTrackCov, negTrackCov); - } catch (...) { - LOG(error) << "Exception caught in DCA fitter process call!"; - continue; - } - if (nCandTrack == 0) { - continue; - } - - auto& posPropTrack = fitter.getTrack(0); - auto& negPropTrack = fitter.getTrack(1); + // if alphaAP is > 0 the candidate is 3H, if < 0 it is anti-3H - std::array momPos = std::array{static_cast(-999.), static_cast(-999.), static_cast(-999.)}; - std::array momNeg = std::array{static_cast(-999.), static_cast(-999.), static_cast(-999.)}; - posPropTrack.getPxPyPzGlo(momPos); - negPropTrack.getPxPyPzGlo(momNeg); + std::array momPos = std::array{posTrack.px(), posTrack.py(), posTrack.pz()}; + std::array momNeg = std::array{negTrack.px(), negTrack.py(), negTrack.pz()}; float alpha = alphaAP(momPos, momNeg); lnnCandidate lnnCand; lnnCand.isMatter = alpha > 0; @@ -401,8 +383,8 @@ struct lnnRecoTask { lnnCand.flags |= lnnCand.isMatter ? static_cast((posTrack.pidForTracking() & 0xF) << 4) : static_cast((negTrack.pidForTracking() & 0xF) << 4); lnnCand.flags |= lnnCand.isMatter ? static_cast(negTrack.pidForTracking() & 0xF) : static_cast(posTrack.pidForTracking() & 0xF); - auto h3TrackCov = getTrackParCov(posTrack); - auto piTrackCov = getTrackParCov(negTrack); + auto posTrackCov = getTrackParCov(posTrack); + auto negTrackCov = getTrackParCov(negTrack); int chargeFactor = -1 + 2 * lnnCand.isMatter; float beta = -1.f; @@ -419,7 +401,7 @@ struct lnnRecoTask { int nCand = 0; try { - nCand = fitter.process(h3TrackCov, piTrackCov); + nCand = fitter.process(posTrackCov, negTrackCov); } catch (...) { LOG(error) << "Exception caught in DCA fitter process call!"; continue; @@ -484,12 +466,11 @@ struct lnnRecoTask { // if survived all selections, propagate decay daughters to PV gpu::gpustd::array dcaInfo; + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, h3PropTrack, 2.f, fitter.getMatCorrType(), &dcaInfo); + lnnCand.h3DCAXY = dcaInfo[0]; - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, h3TrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); - lnnCand.isMatter ? lnnCand.h3DCAXY = dcaInfo[0] : lnnCand.piDCAXY = dcaInfo[0]; - - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, negTrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); - lnnCand.isMatter ? lnnCand.piDCAXY = dcaInfo[0] : lnnCand.h3DCAXY = dcaInfo[0]; + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, piPropTrack, 2.f, fitter.getMatCorrType(), &dcaInfo); + lnnCand.piDCAXY = dcaInfo[0]; // finally, push back the candidate lnnCand.isReco = true; From d74d25782284d0cd3e448d016070b658ad365228 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 11 Oct 2024 10:14:43 +0000 Subject: [PATCH 4/4] Please consider the following formatting changes --- PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx index 0050b0c47a4..e5ebc7a704a 100644 --- a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx @@ -352,7 +352,6 @@ struct lnnRecoTask { if (!is3H && !isAnti3H) // discard if both tracks are not 3H candidates continue; - // if alphaAP is > 0 the candidate is 3H, if < 0 it is anti-3H std::array momPos = std::array{posTrack.px(), posTrack.py(), posTrack.pz()};