diff --git a/PWGCF/TwoParticleCorrelations/Tasks/nucleibalance.cxx b/PWGCF/TwoParticleCorrelations/Tasks/nucleibalance.cxx index c04207d4381..380b6f04594 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/nucleibalance.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/nucleibalance.cxx @@ -71,10 +71,10 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace constants::math; -#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; +#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, (DEFAULT), (HELP)}; static constexpr float PairCutOff = -1.f; -static constexpr float CfgPairCutDefaults[1][5] = {{PairCutOff, PairCutOff, PairCutOff, PairCutOff, PairCutOff}}; +static constexpr std::array, 1> CfgPairCutDefaults{{{PairCutOff, PairCutOff, PairCutOff, PairCutOff, PairCutOff}}}; struct Nucleibalance { SliceCache cache; @@ -125,7 +125,7 @@ struct Nucleibalance { O2_DEFINE_CONFIGURABLE(cfgAssociatedSpecies, int, 2, "Associated species for BF: 0 = #pi, 1 = K, 2 = p, 3 = d, -1 = all charged tracks"); // Suggested values: Photon: 0.004; K0 and Lambda: 0.005 - Configurable> cfgPairCut{"cfgPairCut", {CfgPairCutDefaults[0], 5, {"Photon", "K0", "Lambda", "Phi", "Rho"}}, "Pair cuts on various particles"}; + Configurable> cfgPairCut{"cfgPairCut", {CfgPairCutDefaults[0].data(), 5, {"Photon", "K0", "Lambda", "Phi", "Rho"}}, "Pair cuts on various particles"}; O2_DEFINE_CONFIGURABLE(cfgEfficiencyTrigger, std::string, "", "CCDB path to efficiency object for trigger particles") O2_DEFINE_CONFIGURABLE(cfgEfficiencyAssociated, std::string, "", "CCDB path to efficiency object for associated particles") @@ -134,7 +134,7 @@ struct Nucleibalance { O2_DEFINE_CONFIGURABLE(cfgVerbosity, int, 1, "Verbosity level (0 = major, 1 = per collision)") - O2_DEFINE_CONFIGURABLE(cfgMcTriggerPDGs, std::vector, {}, "MC PDG codes to use exclusively as trigger particles and exclude from associated particles. Empty = no selection.") + O2_DEFINE_CONFIGURABLE(cfgMcTriggerPDGs, std::vector, std::vector{}, "MC PDG codes to use exclusively as trigger particles and exclude from associated particles. Empty = no selection.") ConfigurableAxis axisVertex{"axisVertex", {7, -7, 7}, "vertex axis for histograms"}; ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; @@ -172,14 +172,17 @@ struct Nucleibalance { { if (cfgTrigger.value == TriggerNone) { return true; - } else if (cfgTrigger.value == TriggerSel8) { + } + if (cfgTrigger.value == TriggerSel8) { return collision.sel8(); - } else if (cfgTrigger.value == TriggerSel8Quality) { + } + if (cfgTrigger.value == TriggerSel8Quality) { return collision.sel8() && collision.selection_bit(aod::evsel::kNoSameBunchPileup) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) && collision.selection_bit(aod::evsel::kIsGoodITSLayersAll); - } else if (cfgTrigger.value == TriggerSel8OccQuality) { + } + if (cfgTrigger.value == TriggerSel8OccQuality) { const int occupancy = collision.trackOccupancyInTimeRange(); if (occupancy < cfgMinOcc.value || occupancy >= cfgMaxOcc.value) { return false; @@ -189,7 +192,8 @@ struct Nucleibalance { collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) && collision.selection_bit(aod::evsel::kNoCollInTimeRangeStandard) && collision.selection_bit(aod::evsel::kIsGoodITSLayersAll); - } else if (cfgTrigger.value == TriggerSel8NoSbpZvtx) { + } + if (cfgTrigger.value == TriggerSel8NoSbpZvtx) { return collision.sel8() && collision.selection_bit(aod::evsel::kNoSameBunchPileup) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV); @@ -270,7 +274,7 @@ struct Nucleibalance { std::vector efficiencyAssociatedCache; std::unique_ptr multCutFormula; - std::array multCutFormulaParamIndex; + std::array multCutFormulaParamIndex{}; struct Config { bool mPairCuts = false; @@ -282,7 +286,7 @@ struct Nucleibalance { HistogramRegistry registry{"registry"}; PairCuts mPairCuts; - Service ccdb; + Service ccdb{}; // AO2D-based tracks with PID for pi / K / p / d using TracksPID = soa::Join triggerTracks; std::vector associatedTracks; }; @@ -424,17 +433,22 @@ struct Nucleibalance { registry.add("etaphi", "multiplicity/centrality vs eta vs phi", {HistType::kTH3F, {{100, 0, 100, "multiplicity/centrality"}, {100, -2, 2, "#eta"}, {200, 0, o2::constants::math::TwoPI, "#varphi"}}}); if (doprocessSameDerivedMultSet) { - if (cfgMultCorrelationsMask == 0) + if (cfgMultCorrelationsMask.value == 0u) { LOGF(fatal, "cfgMultCorrelationsMask can not be 0 when MultSet process functions are in use."); + } std::vector multAxes; - if (cfgMultCorrelationsMask & aod::cfmultset::CentFT0C) + if ((cfgMultCorrelationsMask.value & aod::cfmultset::CentFT0C) != 0u) { multAxes.emplace_back(100, 0, 100, "FT0C centrality"); - if (cfgMultCorrelationsMask & aod::cfmultset::MultFV0A) + } + if ((cfgMultCorrelationsMask.value & aod::cfmultset::MultFV0A) != 0u) { multAxes.emplace_back(1000, 0, 100000, "V0A multiplicity"); - if (cfgMultCorrelationsMask & aod::cfmultset::MultNTracksPV) + } + if ((cfgMultCorrelationsMask.value & aod::cfmultset::MultNTracksPV) != 0u) { multAxes.emplace_back(100, 0, 1000, "Nch PV"); - if (cfgMultCorrelationsMask & aod::cfmultset::MultNTracksGlobal) + } + if ((cfgMultCorrelationsMask.value & aod::cfmultset::MultNTracksGlobal) != 0u) { multAxes.emplace_back(100, 0, 1000, "Nch Global"); + } registry.add("multCorrelations", "Multiplicity correlations", {HistType::kTHnSparseF, multAxes}); } registry.add("multiplicity", "event multiplicity", {HistType::kTH1F, {{1000, 0, 100, "/multiplicity/centrality"}}}); @@ -502,8 +516,9 @@ struct Nucleibalance { same->setTrackEtaCut(cfgCutEta); mixed->setTrackEtaCut(cfgCutEta); - if (!cfgEfficiencyAssociated.value.empty()) + if (!cfgEfficiencyAssociated.value.empty()) { efficiencyAssociatedCache.reserve(512); + } // o2-ccdb-upload -p Users/jgrosseo/correlations/LHC15o -f /tmp/correction_2011_global.root -k correction @@ -698,41 +713,41 @@ struct Nucleibalance { if (cfg.efficiencyLoaded) { return; } - if (cfgEfficiencyTrigger.value.empty() == false) { + if (!cfgEfficiencyTrigger.value.empty()) { if (cfgLocalEfficiency > 0) { TFile* fEfficiencyTrigger = TFile::Open(cfgEfficiencyTrigger.value.c_str(), "READ"); - cfg.mEfficiencyTrigger = reinterpret_cast(fEfficiencyTrigger->Get("ccdb_object")); + cfg.mEfficiencyTrigger = dynamic_cast(fEfficiencyTrigger->Get("ccdb_object")); } else { cfg.mEfficiencyTrigger = ccdb->getForTimeStamp>(cfgEfficiencyTrigger, timestamp); } if (cfg.mEfficiencyTrigger == nullptr) { LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgEfficiencyTrigger.value.c_str()); } - LOGF(info, "Loaded efficiency histogram for trigger particles from %s (%p)", cfgEfficiencyTrigger.value.c_str(), (void*)cfg.mEfficiencyTrigger); + LOGF(info, "Loaded efficiency histogram for trigger particles from %s (%p)", cfgEfficiencyTrigger.value.c_str(), static_cast(cfg.mEfficiencyTrigger)); } - if (cfgEfficiencyAssociated.value.empty() == false) { + if (!cfgEfficiencyAssociated.value.empty()) { if (cfgLocalEfficiency > 0) { TFile* fEfficiencyAssociated = TFile::Open(cfgEfficiencyAssociated.value.c_str(), "READ"); - cfg.mEfficiencyAssociated = reinterpret_cast(fEfficiencyAssociated->Get("ccdb_object")); + cfg.mEfficiencyAssociated = dynamic_cast(fEfficiencyAssociated->Get("ccdb_object")); } else { cfg.mEfficiencyAssociated = ccdb->getForTimeStamp>(cfgEfficiencyAssociated, timestamp); } if (cfg.mEfficiencyAssociated == nullptr) { LOGF(fatal, "Could not load efficiency histogram for associated particles from %s", cfgEfficiencyAssociated.value.c_str()); } - LOGF(info, "Loaded efficiency histogram for associated particles from %s (%p)", cfgEfficiencyAssociated.value.c_str(), (void*)cfg.mEfficiencyAssociated); + LOGF(info, "Loaded efficiency histogram for associated particles from %s (%p)", cfgEfficiencyAssociated.value.c_str(), static_cast(cfg.mEfficiencyAssociated)); } cfg.efficiencyLoaded = true; } double getEfficiencyCorrection(THn* eff, float eta, float pt, float multiplicity, float posZ) { - int effVars[4]; + std::array effVars{}; effVars[0] = eff->GetAxis(0)->FindBin(eta); effVars[1] = eff->GetAxis(1)->FindBin(pt); effVars[2] = eff->GetAxis(2)->FindBin(multiplicity); effVars[3] = eff->GetAxis(3)->FindBin(posZ); - return eff->GetBinContent(effVars); + return eff->GetBinContent(effVars.data()); } template @@ -863,13 +878,13 @@ struct Nucleibalance { if (passPIDForSpecies(trk, cfgTriggerSpecies.value)) { if (cfgTriggerCharge.value == 0 || trk.sign() == cfgTriggerCharge.value) { - triggerTracks.push_back(SimpleTrack{cftrk.eta(), cftrk.phi(), cftrk.pt(), trk.sign()}); + triggerTracks.push_back(makeSimpleTrack(cftrk.eta(), cftrk.phi(), cftrk.pt(), trk.sign())); } } if (passPIDForSpecies(trk, cfgAssociatedSpecies.value)) { if (cfgAssociatedCharge.value == 0 || trk.sign() == cfgAssociatedCharge.value) { - associatedTracks.push_back(SimpleTrack{cftrk.eta(), cftrk.phi(), cftrk.pt(), trk.sign()}); + associatedTracks.push_back(makeSimpleTrack(cftrk.eta(), cftrk.phi(), cftrk.pt(), trk.sign())); } } } @@ -952,7 +967,7 @@ struct Nucleibalance { } // Save for multiplicity / QA (keep charge even if neutral) - eventTracks.push_back(SimpleTrack{trk.eta(), trk.phi(), trk.pt(), static_cast(trk.sign())}); + eventTracks.push_back(makeSimpleTrack(trk.eta(), trk.phi(), trk.pt(), static_cast(trk.sign()))); if (trk.sign() == 0) { continue; @@ -961,14 +976,14 @@ struct Nucleibalance { // Trigger selection: PID + charge if (passPIDForSpecies(trk, cfgTriggerSpecies.value)) { if (cfgTriggerCharge.value == 0 || trk.sign() == cfgTriggerCharge.value) { - triggerTracks.push_back(SimpleTrack{trk.eta(), trk.phi(), trk.pt(), trk.sign()}); + triggerTracks.push_back(makeSimpleTrack(trk.eta(), trk.phi(), trk.pt(), trk.sign())); } } // Associated selection: PID + charge if (passPIDForSpecies(trk, cfgAssociatedSpecies.value)) { if (cfgAssociatedCharge.value == 0 || trk.sign() == cfgAssociatedCharge.value) { - associatedTracks.push_back(SimpleTrack{trk.eta(), trk.phi(), trk.pt(), trk.sign()}); + associatedTracks.push_back(makeSimpleTrack(trk.eta(), trk.phi(), trk.pt(), trk.sign())); } } } @@ -1108,7 +1123,7 @@ struct Nucleibalance { continue; } - eventTracks.push_back(SimpleTrack{trk.eta(), trk.phi(), trk.pt(), static_cast(trk.sign())}); + eventTracks.push_back(makeSimpleTrack(trk.eta(), trk.phi(), trk.pt(), static_cast(trk.sign()))); if (trk.sign() == 0) { continue; @@ -1116,12 +1131,12 @@ struct Nucleibalance { if (passPIDForSpecies(trk, cfgTriggerSpecies.value) && (cfgTriggerCharge.value == 0 || trk.sign() == cfgTriggerCharge.value)) { - triggerTracks.push_back(SimpleTrack{trk.eta(), trk.phi(), trk.pt(), trk.sign()}); + triggerTracks.push_back(makeSimpleTrack(trk.eta(), trk.phi(), trk.pt(), trk.sign())); } if (passPIDForSpecies(trk, cfgAssociatedSpecies.value) && (cfgAssociatedCharge.value == 0 || trk.sign() == cfgAssociatedCharge.value)) { - associatedTracks.push_back(SimpleTrack{trk.eta(), trk.phi(), trk.pt(), trk.sign()}); + associatedTracks.push_back(makeSimpleTrack(trk.eta(), trk.phi(), trk.pt(), trk.sign())); } } @@ -1395,7 +1410,7 @@ struct Nucleibalance { } if (passPIDForSpecies(trk, cfgTriggerSpecies.value)) { if (cfgTriggerCharge.value == 0 || trk.sign() == cfgTriggerCharge.value) { - triggerTracks.push_back(SimpleTrack{cftrk.eta(), cftrk.phi(), cftrk.pt(), trk.sign()}); + triggerTracks.push_back(makeSimpleTrack(cftrk.eta(), cftrk.phi(), cftrk.pt(), trk.sign())); } } } @@ -1408,7 +1423,7 @@ struct Nucleibalance { } if (passPIDForSpecies(trk, cfgAssociatedSpecies.value)) { if (cfgAssociatedCharge.value == 0 || trk.sign() == cfgAssociatedCharge.value) { - associatedTracks.push_back(SimpleTrack{cftrk.eta(), cftrk.phi(), cftrk.pt(), trk.sign()}); + associatedTracks.push_back(makeSimpleTrack(cftrk.eta(), cftrk.phi(), cftrk.pt(), trk.sign())); } } } @@ -1468,11 +1483,13 @@ struct Nucleibalance { case PdgProton: // proton case -PdgProton: return 2; + default: + break; } - if (std::find(cfgMcTriggerPDGs->begin(), cfgMcTriggerPDGs->end(), pdgCode) != cfgMcTriggerPDGs->end()) + if (std::find(cfgMcTriggerPDGs->begin(), cfgMcTriggerPDGs->end(), pdgCode) != cfgMcTriggerPDGs->end()) { return 4; - else - return 3; + } + return 3; } // NOTE SmallGroups includes soa::Filtered always @@ -1573,11 +1590,13 @@ struct Nucleibalance { bool useMCMultiplicity = (cfgCentBinsForMC == 0); auto getMultiplicity = [&collisions, &useMCMultiplicity, this](auto& col) { - if (useMCMultiplicity) + if (useMCMultiplicity) { return col.multiplicity(); + } auto groupedCollisions = collisions.sliceBy(collisionPerMCCollision, col.globalIndex()); - if (groupedCollisions.size() == 0) + if (groupedCollisions.size() == 0) { return -1.0f; + } return groupedCollisions.begin().multiplicity(); }; @@ -1686,7 +1705,6 @@ struct Lambdastarproxy { static constexpr float ProxyMomentumScale = 0.5f; static constexpr float TofBetaMin = 0.01f; static constexpr float TofBetaMax = 1.2f; - static constexpr double Half = 0.5; // PID strategy values static constexpr int PidStrategyRectangular = 0; static constexpr int PidStrategyCircularTPCAndTOF = 1; @@ -1837,14 +1855,17 @@ struct Lambdastarproxy { } if (lstarCfgTrigger.value == TriggerNone) { return true; - } else if (lstarCfgTrigger.value == TriggerSel8) { + } + if (lstarCfgTrigger.value == TriggerSel8) { return collision.sel8(); - } else if (lstarCfgTrigger.value == TriggerSel8Quality) { + } + if (lstarCfgTrigger.value == TriggerSel8Quality) { return collision.sel8() && collision.selection_bit(aod::evsel::kNoSameBunchPileup) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) && collision.selection_bit(aod::evsel::kIsGoodITSLayersAll); - } else if (lstarCfgTrigger.value == TriggerSel8OccQuality) { + } + if (lstarCfgTrigger.value == TriggerSel8OccQuality) { const int occupancy = collision.trackOccupancyInTimeRange(); if (occupancy < lstarMinOcc.value || occupancy >= lstarMaxOcc.value) { return false; @@ -1854,7 +1875,8 @@ struct Lambdastarproxy { collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) && collision.selection_bit(aod::evsel::kNoCollInTimeRangeStandard) && collision.selection_bit(aod::evsel::kIsGoodITSLayersAll); - } else if (lstarCfgTrigger.value == TriggerSel8NoSbpZvtx) { + } + if (lstarCfgTrigger.value == TriggerSel8NoSbpZvtx) { return collision.sel8() && collision.selection_bit(aod::evsel::kNoSameBunchPileup) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV); @@ -2042,7 +2064,8 @@ struct Lambdastarproxy { { AxisSpec massAxis{200, 1.4, 1.9, "M_{pK} (GeV/c^{2})"}; AxisSpec ptAxis{100, 0., 10., "p_{T} (GeV/c)"}; - AxisSpec nsAxis{100, -10., 10., "n#sigma"}; + AxisSpec nsAxis{500, -50., 50., "n#sigma"}; + AxisSpec tofMatchAxis{2, -0.5, 1.5, "has TOF match"}; AxisSpec pAxis{100, 0., 10., "p (GeV/c)"}; AxisSpec etaAxis{80, -2., 2., "#eta"}; AxisSpec phiAxis{64, 0., o2::constants::math::TwoPI, "#varphi"}; @@ -2119,6 +2142,14 @@ struct Lambdastarproxy { "TOF #beta vs p;p (GeV/c);#beta_{TOF};Counts", HistType::kTH2F, {pAxis, betaAxis}); + histos.add("hHasTOFVsP", + "TOF matching flag vs p;p (GeV/c);has TOF match;Counts", + HistType::kTH2F, {pAxis, tofMatchAxis}); + + histos.add("hHasTOFVsPt", + "TOF matching flag vs p_{T};p_{T} (GeV/c);has TOF match;Counts", + HistType::kTH2F, {ptAxis, tofMatchAxis}); + // --- Per-species inclusive PID QA before final candidate PID cuts --- // Species tagging here uses classifyPidSpecies() and is meant only for QA. histos.add("hTPCdEdxVsP_Pi", @@ -2147,6 +2178,36 @@ struct Lambdastarproxy { "TOF #beta vs p (tagged d);p (GeV/c);#beta_{TOF};Counts", HistType::kTH2F, {pAxis, betaAxis}); + // Inclusive tagged nSigma QA before final candidate PID cuts: after track-quality cuts only. + // These are separate from the final-candidate PID QA histograms. + histos.add("hNsigmaTPCPionTaggedVsP", + "TPC n#sigma_{#pi} vs p for tagged #pi;p (GeV/c);n#sigma^{TPC}_{#pi};Counts", + HistType::kTH2F, {pAxis, nsAxis}); + histos.add("hNsigmaTOFPionTaggedVsP", + "TOF n#sigma_{#pi} vs p for tagged #pi;p (GeV/c);n#sigma^{TOF}_{#pi};Counts", + HistType::kTH2F, {pAxis, nsAxis}); + + histos.add("hNsigmaTPCKaonTaggedVsP", + "TPC n#sigma_{K} vs p for tagged K;p (GeV/c);n#sigma^{TPC}_{K};Counts", + HistType::kTH2F, {pAxis, nsAxis}); + histos.add("hNsigmaTOFKaonTaggedVsP", + "TOF n#sigma_{K} vs p for tagged K;p (GeV/c);n#sigma^{TOF}_{K};Counts", + HistType::kTH2F, {pAxis, nsAxis}); + + histos.add("hNsigmaTPCProtonTaggedVsP", + "TPC n#sigma_{p} vs p for tagged p;p (GeV/c);n#sigma^{TPC}_{p};Counts", + HistType::kTH2F, {pAxis, nsAxis}); + histos.add("hNsigmaTOFProtonTaggedVsP", + "TOF n#sigma_{p} vs p for tagged p;p (GeV/c);n#sigma^{TOF}_{p};Counts", + HistType::kTH2F, {pAxis, nsAxis}); + + histos.add("hNsigmaTPCDeuteronTaggedVsP", + "TPC n#sigma_{d} vs p for tagged d;p (GeV/c);n#sigma^{TPC}_{d};Counts", + HistType::kTH2F, {pAxis, nsAxis}); + histos.add("hNsigmaTOFDeuteronTaggedVsP", + "TOF n#sigma_{d} vs p for tagged d;p (GeV/c);n#sigma^{TOF}_{d};Counts", + HistType::kTH2F, {pAxis, nsAxis}); + // --- MC QA (AO2D-MC mode) --- histos.add("hMcPrimariesPtEta", "MC charged physical primaries; p_{T} (GeV/c); #eta; Counts", @@ -2615,10 +2676,18 @@ struct Lambdastarproxy { fillTPCdEdxVsPIfAvailable(trk); fillTOFBetaVsPIfAvailable(trk); + const double pForPidQA = static_cast(trk.pt()) * std::cosh(static_cast(trk.eta())); + const bool hasTofForPidQA = hasTOFMatch(trk); + + histos.fill(HIST("hHasTOFVsP"), pForPidQA, hasTofForPidQA ? 1.0 : 0.0); + histos.fill(HIST("hHasTOFVsPt"), trk.pt(), hasTofForPidQA ? 1.0 : 0.0); + // Per-species PID-QA (tagged) histograms const int sp = classifyPidSpecies(trk); switch (sp) { case 0: { // pion + histos.fill(HIST("hNsigmaTPCPionTaggedVsP"), pForPidQA, trk.tpcNSigmaPi()); + histos.fill(HIST("hNsigmaTOFPionTaggedVsP"), pForPidQA, trk.tofNSigmaPi()); if constexpr (requires { trk.tpcSignal(); }) { histos.fill(HIST("hTPCdEdxVsP_Pi"), trk.p(), trk.tpcSignal()); } @@ -2632,6 +2701,8 @@ struct Lambdastarproxy { break; } case 1: { // kaon + histos.fill(HIST("hNsigmaTPCKaonTaggedVsP"), pForPidQA, trk.tpcNSigmaKa()); + histos.fill(HIST("hNsigmaTOFKaonTaggedVsP"), pForPidQA, trk.tofNSigmaKa()); if constexpr (requires { trk.tpcSignal(); }) { histos.fill(HIST("hTPCdEdxVsP_K"), trk.p(), trk.tpcSignal()); } @@ -2645,6 +2716,8 @@ struct Lambdastarproxy { break; } case 2: { // proton + histos.fill(HIST("hNsigmaTPCProtonTaggedVsP"), pForPidQA, trk.tpcNSigmaPr()); + histos.fill(HIST("hNsigmaTOFProtonTaggedVsP"), pForPidQA, trk.tofNSigmaPr()); if constexpr (requires { trk.tpcSignal(); }) { histos.fill(HIST("hTPCdEdxVsP_P"), trk.p(), trk.tpcSignal()); } @@ -2658,6 +2731,8 @@ struct Lambdastarproxy { break; } case 3: { // deuteron + histos.fill(HIST("hNsigmaTPCDeuteronTaggedVsP"), pForPidQA, trk.tpcNSigmaDe()); + histos.fill(HIST("hNsigmaTOFDeuteronTaggedVsP"), pForPidQA, trk.tofNSigmaDe()); if constexpr (requires { trk.tpcSignal(); }) { histos.fill(HIST("hTPCdEdxVsP_D"), trk.p(), trk.tpcSignal()); } @@ -2763,7 +2838,7 @@ struct Lambdastarproxy { const float pyProxy = ProxyMomentumScale * ptD * std::sin(phiD); const float pzProxy = ProxyMomentumScale * ptD * std::sinh(etaD); - proxyCands.push_back(ProxyCand{pxProxy, pyProxy, pzProxy, static_cast(trkD.sign()), static_cast(trkD.globalIndex())}); + proxyCands.push_back(ProxyCand{.px = pxProxy, .py = pyProxy, .pz = pzProxy, .charge = static_cast(trkD.sign()), .tid = static_cast(trkD.globalIndex())}); } // Proton candidates (for genuine pK #Lambda^{*} reconstruction) @@ -2823,7 +2898,7 @@ struct Lambdastarproxy { const float pyP = ptP * std::sin(phiP); const float pzP = ptP * std::sinh(etaP); - protonCands.push_back(ProtonCand{pxP, pyP, pzP, static_cast(trkP.sign()), static_cast(trkP.globalIndex())}); + protonCands.push_back(ProtonCand{.px = pxP, .py = pyP, .pz = pzP, .charge = static_cast(trkP.sign()), .tid = static_cast(trkP.globalIndex())}); } // Kaon candidates @@ -2891,7 +2966,7 @@ struct Lambdastarproxy { const float pyK = ptK * std::sin(phiK); const float pzK = ptK * std::sinh(etaK); - kaonCands.push_back(KaonCand{pxK, pyK, pzK, static_cast(trkK.sign()), static_cast(trkK.globalIndex())}); + kaonCands.push_back(KaonCand{.px = pxK, .py = pyK, .pz = pzK, .charge = static_cast(trkK.sign()), .tid = static_cast(trkK.globalIndex())}); } if (kaonCands.empty()) { @@ -2955,8 +3030,9 @@ struct Lambdastarproxy { if (hasProxyCandidates) { for (auto const& pr : proxyCands) { for (auto const& k : kaonCands) { - if (pr.tid == k.tid) + if (pr.tid == k.tid) { continue; // sanity check: should never match, but just in case of bug in candidate-building logic + } const double mass = invariantMass(pr.px, pr.py, pr.pz, MassProton, k.px, k.py, k.pz, MassKaonCharged); const float pxTot = pr.px + k.px;