diff --git a/PWGLF/DataModel/Reduced3BodyTables.h b/PWGLF/DataModel/Reduced3BodyTables.h index aeabfb92c0b..3b221d17539 100644 --- a/PWGLF/DataModel/Reduced3BodyTables.h +++ b/PWGLF/DataModel/Reduced3BodyTables.h @@ -86,6 +86,7 @@ DECLARE_SOA_TABLE_FULL(StoredRedIUTracks, "RedIUTracks", "AOD", "REDIUTRACK", // track::HasITS, track::HasTPC, track::HasTOF, + track::HasTRD, track::TPCNClsFound, track::TPCNClsCrossedRows, track::v001::ITSClsSizeInLayer, diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index 77c3e5668a7..e7ddcd7b471 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -8,7 +8,6 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. - // ======================== /// \file decay3bodybuilder.cxx /// \brief Builder task for 3-body hypertriton decay reconstruction (proton + pion + deuteron) @@ -16,49 +15,50 @@ /// \author Carolina Reetz // ======================== -#include -#include -#include -#include -#include -#include -#include -#include +#include "TableHelper.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "ReconstructionDataFormats/Track.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" #include "PWGLF/DataModel/Reduced3BodyTables.h" #include "PWGLF/DataModel/Vtx3BodyTables.h" #include "PWGLF/DataModel/pidTOFGeneric.h" #include "PWGLF/Utils/decay3bodyBuilderHelper.h" + +#include "Common/Core/PID/PIDTOF.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" -#include "Common/Core/PID/PIDTOF.h" -#include "TableHelper.h" -#include "Tools/KFparticle/KFUtilities.h" - #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" +#include "Tools/KFparticle/KFUtilities.h" -#include "DetectorsBase/Propagator.h" -#include "DetectorsBase/GeometryManager.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DetectorsBase/GeometryManager.h" +#include "DetectorsBase/Propagator.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/Track.h" + +#include +#include +#include +#include +#include +#include +#include +#include #ifndef HomogeneousField #define HomogeneousField #endif // includes KFParticle -#include "KFParticle.h" #include "KFPTrack.h" #include "KFPVertex.h" +#include "KFParticle.h" #include "KFParticleBase.h" #include "KFVertex.h" @@ -125,6 +125,7 @@ struct decay3bodyBuilder { Configurable doSkimmedProcessing{"doSkimmedProcessing", false, "Apply Zoroo counting in case of skimmed data input"}; Configurable triggerList{"triggerList", "fTriggerEventF1Proton, fTrackedOmega, fTrackedXi, fOmegaLargeRadius, fDoubleOmega, fOmegaHighMult, fSingleXiYN, fQuadrupleXi, fDoubleXi, fhadronOmega, fOmegaXi, fTripleXi, fOmega, fGammaVeryLowPtEMCAL, fGammaVeryLowPtDCAL, fGammaHighPtEMCAL, fGammaLowPtEMCAL, fGammaVeryHighPtDCAL, fGammaVeryHighPtEMCAL, fGammaLowPtDCAL, fJetNeutralLowPt, fJetNeutralHighPt, fGammaHighPtDCAL, fJetFullLowPt, fJetFullHighPt, fEMCALReadout, fPCMandEE, fPHOSnbar, fPCMHighPtPhoton, fPHOSPhoton, fLD, fPPPHI, fPD, fLLL, fPLL, fPPL, fPPP, fLeadingPtTrack, fHighFt0cFv0Flat, fHighFt0cFv0Mult, fHighFt0Flat, fHighFt0Mult, fHighMultFv0, fHighTrackMult, fHfSingleNonPromptCharm3P, fHfSingleNonPromptCharm2P, fHfSingleCharm3P, fHfPhotonCharm3P, fHfHighPt2P, fHfSigmaC0K0, fHfDoubleCharm2P, fHfBeauty3P, fHfFemto3P, fHfFemto2P, fHfHighPt3P, fHfSigmaCPPK, fHfDoubleCharm3P, fHfDoubleCharmMix, fHfPhotonCharm2P, fHfV0Charm2P, fHfBeauty4P, fHfV0Charm3P, fHfSingleCharm2P, fHfCharmBarToXiBach, fSingleMuHigh, fSingleMuLow, fLMeeHMR, fDiMuon, fDiElectron, fLMeeIMR, fSingleE, fTrackHighPt, fTrackLowPt, fJetChHighPt, fJetChLowPt, fUDdiffLarge, fUDdiffSmall, fITSextremeIonisation, fITSmildIonisation, fH3L3Body, fHe, fH2", "List of triggers used to select events"}; Configurable onlyKeepInterestedTrigger{"onlyKeepInterestedTrigger", false, "Flag to keep only interested trigger"}; + Configurable doLikeSign{"doLikeSign", false, "Flag to produce like-sign background. If true, require the sign of pion is as same as deuteron but not proton."}; // CCDB options struct : ConfigurableGroup { @@ -145,6 +146,7 @@ struct decay3bodyBuilder { Configurable useSelections{"useSelections", true, "Apply selections during decay3body building"}; Configurable useTPCforPion{"useTPCforPion", false, "Flag to ask for TPC info for pion track (PID, nClusters), false: pion track can be ITS only"}; Configurable acceptTPCOnly{"acceptTPCOnly", false, "Accept TPC only tracks as daughters"}; + Configurable askOnlyITSMatch{"askOnlyITSMatch", true, "ask only ITS match to distinguish TPC only tracks"}; Configurable calculateCovariance{"calculateCovariance", true, "Calculate candidate and daughter covariance matrices"}; // daughter track selections Configurable maxEtaDaughters{"maxEtaDaughters", 0.9, "Max eta of daughters"}; @@ -182,7 +184,7 @@ struct decay3bodyBuilder { Configurable n3bodyMixing{"n3bodyMixing", 0, "Number of decay3bodys to mix: 0 - value set to maximum bin entry in hDecay3BodyRadiusPhi, > 0 - manual setting"}; Configurable mixingType{"mixingType", 0, "0: mix V0 from one event with bachelor from another, 1: mix pion and bachelor from one event with proton from another, 1: mix proton and bachelor from one event with pion from another "}; ConfigurableAxis bins3BodyRadius{"mixingOpts.bins3BodyRadius", {VARIABLE_WIDTH, 0.0f, 2.0f, 4.0f, 7.0f, 10.0f, 14.0f, 18.0f, 22.0f, 30.0f, 40.0f}, "Mixing bins - 3body radius"}; - ConfigurableAxis bins3BodyPhi{"mixingOpts.bins3BodyPhi", {VARIABLE_WIDTH, -180 * TMath::Pi() / 180, -120 * TMath::Pi() / 180, -60 * TMath::Pi() / 180, 0, 60 * TMath::Pi() / 180, 120 * TMath::Pi() / 180, 180 * TMath::Pi() / 180}, "Mixing bins - 3body phi (rad)"}; + ConfigurableAxis bins3BodyPhi{"mixingOpts.bins3BodyPhi", {VARIABLE_WIDTH, -180 * o2::constants::math::Deg2Rad, -120 * o2::constants::math::Deg2Rad, -60 * o2::constants::math::Deg2Rad, 0, 60 * o2::constants::math::Deg2Rad, 120 * o2::constants::math::Deg2Rad, 180 * o2::constants::math::Deg2Rad}, "Mixing bins - 3body phi (rad)"}; ConfigurableAxis bins3BodyPhiDegree{"mixingOpts.bins3BodyPhiDegree", {VARIABLE_WIDTH, -180, -120, -60, 0, 60, 120, 180}, "Mixing bins - 3body phi (degree)"}; ConfigurableAxis bins3BodyPosZ{"mixingOpts.bins3BodyPosZ", {VARIABLE_WIDTH, -500.0f, -200.0f, -100.0f, -70.0f, -60.0f, -50.0f, -40.0f, -35.0f, -30.0f, -25.0f, -20.0f, -15.0f, -13.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 13.0f, 15.0f, 20.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f, 60.0f, 70.0f, 100.0f, 200.0f, 500.0f}, "3body SV z position"}; Configurable selectPVPosZ3bodyMixing{"selectPVPosZ3bodyMixing", true, "Select same pvPosZ events in case of 3body mixing"}; @@ -264,6 +266,8 @@ struct decay3bodyBuilder { // tracked cluster size std::vector fTrackedClSizeVector; + // trigger info + std::vector isTriggeredCollision; // MC info std::vector isGoodCollision; @@ -652,8 +656,14 @@ struct decay3bodyBuilder { // prepare MC container (not necessarily used) std::vector mcParticleIsReco; + if constexpr (soa::is_table) { + isTriggeredCollision.clear(); + isTriggeredCollision.resize(collisions.size(), false); + } // clear and reserve size for MC info vectors if constexpr (soa::is_table) { + isGoodCollision.clear(); + mcParticleIsReco.clear(); isGoodCollision.resize(mcCollisions.size(), false); mcParticleIsReco.resize(mcParticles.size(), false); } @@ -670,6 +680,7 @@ struct decay3bodyBuilder { } } + isTriggeredCollision[collision.globalIndex()] = true; // event counting registry.fill(HIST("Counters/hEventCounter"), 0.5); if (doSel8selection && !collision.sel8()) { @@ -711,7 +722,7 @@ struct decay3bodyBuilder { // skip decay3body without assigned collision /// TODO: do we want this?? if (decay3body.collisionId() < 0) { - return; + continue; } // aquire collision @@ -727,8 +738,11 @@ struct decay3bodyBuilder { } // event selection - if constexpr (soa::is_table) { - if (doSel8selection && !collision.sel8()) { // only when NOT running over reduced data + if constexpr (soa::is_table) { // only when NOT running over reduced data + if (doSel8selection && !collision.sel8()) { + continue; + } + if (onlyKeepInterestedTrigger && !isTriggeredCollision[collision.globalIndex()]) { continue; } } @@ -740,12 +754,9 @@ struct decay3bodyBuilder { auto trackPos = decay3body.template track0_as(); auto trackNeg = decay3body.template track1_as(); auto trackDeuteron = decay3body.template track2_as(); - auto trackProton = trackPos; - auto trackPion = trackNeg; - if (trackDeuteron.sign() < 0) { - trackProton = trackNeg; - trackPion = trackPos; - } + int protonSign = doLikeSign ? -trackDeuteron.sign() : trackDeuteron.sign(); + auto trackProton = protonSign > 0 ? trackPos : trackNeg; + auto trackPion = protonSign > 0 ? trackNeg : trackPos; // get deuteron TOF PID float tofNSigmaDeuteron; @@ -772,6 +783,7 @@ struct decay3bodyBuilder { decay3bodyBuilderOpts.useSelections, decay3bodyBuilderOpts.useTPCforPion, decay3bodyBuilderOpts.acceptTPCOnly, + decay3bodyBuilderOpts.askOnlyITSMatch, decay3bodyBuilderOpts.calculateCovariance, false /*isEventMixing*/)) { continue; @@ -863,7 +875,7 @@ struct decay3bodyBuilder { // MC handling part: generated information of non-reco candidates // ____________________________________________________________________ if constexpr (soa::is_table) { - for (auto& mcparticle : mcParticles) { + for (const auto& mcparticle : mcParticles) { // MC info resetMCInfo(this3BodyMCInfo); this3BodyMCInfo.isReco = false; @@ -877,14 +889,14 @@ struct decay3bodyBuilder { this3BodyMCInfo.survivedEventSel = isGoodCollision[mcparticle.mcCollisionId()]; // check if MC particle is hypertriton - if (std::abs(mcparticle.pdgCode()) != 1010010030) { + if (std::abs(mcparticle.pdgCode()) != o2::constants::physics::Pdg::kHyperTriton) { continue; } // check daughter identities bool haveProton = false, havePion = false, haveDeuteron = false; bool haveAntiProton = false, haveAntiPion = false, haveAntiDeuteron = false; - for (auto& mcparticleDaughter : mcparticle.template daughters_as()) { + for (const auto& mcparticleDaughter : mcparticle.template daughters_as()) { if (mcparticleDaughter.pdgCode() == PDG_t::kProton) haveProton = true; if (mcparticleDaughter.pdgCode() == PDG_t::kProtonBar) @@ -893,9 +905,9 @@ struct decay3bodyBuilder { havePion = true; if (mcparticleDaughter.pdgCode() == PDG_t::kPiMinus) haveAntiPion = true; - if (mcparticleDaughter.pdgCode() == 1000010020) + if (mcparticleDaughter.pdgCode() == o2::constants::physics::Pdg::kDeuteron) haveDeuteron = true; - if (mcparticleDaughter.pdgCode() == -1000010020) + if (mcparticleDaughter.pdgCode() == -o2::constants::physics::Pdg::kDeuteron) haveAntiDeuteron = true; } @@ -907,7 +919,7 @@ struct decay3bodyBuilder { this3BodyMCInfo.isTrueAntiH3L = true; } // get daughters - for (auto& mcparticleDaughter : mcparticle.template daughters_as()) { + for (const auto& mcparticleDaughter : mcparticle.template daughters_as()) { if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kProton) { // proton this3BodyMCInfo.genMomProton = mcparticleDaughter.p(); this3BodyMCInfo.genPtProton = mcparticleDaughter.pt(); @@ -917,7 +929,7 @@ struct decay3bodyBuilder { this3BodyMCInfo.genMomPion = mcparticleDaughter.p(); this3BodyMCInfo.genPtPion = mcparticleDaughter.pt(); this3BodyMCInfo.daughterPiPdgCode = mcparticleDaughter.pdgCode(); - } else if (std::abs(mcparticleDaughter.pdgCode()) == 1000010020) { // deuteron + } else if (std::abs(mcparticleDaughter.pdgCode()) == o2::constants::physics::Pdg::kDeuteron) { // deuteron this3BodyMCInfo.genMomDeuteron = mcparticleDaughter.p(); this3BodyMCInfo.genPtDeuteron = mcparticleDaughter.pt(); this3BodyMCInfo.daughterDePdgCode = mcparticleDaughter.pdgCode(); @@ -1168,6 +1180,7 @@ struct decay3bodyBuilder { decay3bodyBuilderOpts.useSelections, decay3bodyBuilderOpts.useTPCforPion, decay3bodyBuilderOpts.acceptTPCOnly, + decay3bodyBuilderOpts.askOnlyITSMatch, decay3bodyBuilderOpts.calculateCovariance, true /*isEventMixing*/)) { // fill analysis tables with built candidate @@ -1183,14 +1196,14 @@ struct decay3bodyBuilder { template int checkH3LTruth(MCTrack3B const& mcParticlePr, MCTrack3B const& mcParticlePi, MCTrack3B const& mcParticleDe, bool& isMuonReco) { - if (std::abs(mcParticlePr.pdgCode()) != 2212 || std::abs(mcParticleDe.pdgCode()) != 1000010020) { + if (std::abs(mcParticlePr.pdgCode()) != PDG_t::kProton || std::abs(mcParticleDe.pdgCode()) != o2::constants::physics::Pdg::kDeuteron) { return -1; } // check proton and deuteron mother int prDeMomID = -1; for (const auto& motherPr : mcParticlePr.template mothers_as()) { for (const auto& motherDe : mcParticleDe.template mothers_as()) { - if (motherPr.globalIndex() == motherDe.globalIndex() && std::abs(motherPr.pdgCode()) == 1010010030) { + if (motherPr.globalIndex() == motherDe.globalIndex() && std::abs(motherPr.pdgCode()) == o2::constants::physics::Pdg::kHyperTriton) { prDeMomID = motherPr.globalIndex(); break; } @@ -1199,14 +1212,14 @@ struct decay3bodyBuilder { if (prDeMomID == -1) { return -1; } - if (std::abs(mcParticlePi.pdgCode()) != 211 && std::abs(mcParticlePi.pdgCode()) != 13) { + if (std::abs(mcParticlePi.pdgCode()) != PDG_t::kPiPlus && std::abs(mcParticlePi.pdgCode()) != PDG_t::kMuonMinus) { return -1; } // check if the pion track is a muon coming from a pi -> mu + vu decay, if yes, take the mother pi auto mcParticlePiTmp = mcParticlePi; - if (std::abs(mcParticlePiTmp.pdgCode()) == 13) { + if (std::abs(mcParticlePiTmp.pdgCode()) == PDG_t::kMuonMinus) { for (const auto& motherPi : mcParticlePiTmp.template mothers_as()) { - if (std::abs(motherPi.pdgCode()) == 211) { + if (std::abs(motherPi.pdgCode()) == PDG_t::kPiPlus) { mcParticlePiTmp = motherPi; isMuonReco = true; break; diff --git a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx index 4f52fdd8066..091f0b03580 100644 --- a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx @@ -14,48 +14,49 @@ /// \author Yuanzhe Wang /// \author Carolina Reetz -#include -#include -#include -#include -#include -#include +#include "TableHelper.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "DCAFitter/DCAFitterN.h" -#include "ReconstructionDataFormats/Track.h" +#include "PWGLF/DataModel/Reduced3BodyTables.h" +#include "PWGLF/DataModel/pidTOFGeneric.h" + +#include "Common/Core/PID/PIDTOF.h" +#include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" -#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" -#include "PWGLF/DataModel/pidTOFGeneric.h" -#include "PWGLF/DataModel/Reduced3BodyTables.h" #include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponse.h" -#include "Common/Core/PID/PIDTOF.h" -#include "Common/Core/RecoDecay.h" -#include "TableHelper.h" -#include "Tools/KFparticle/KFUtilities.h" - #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" +#include "Tools/KFparticle/KFUtilities.h" -#include "DetectorsBase/Propagator.h" -#include "DetectorsBase/GeometryManager.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" +#include "DCAFitter/DCAFitterN.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DetectorsBase/GeometryManager.h" +#include "DetectorsBase/Propagator.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/Track.h" + +#include +#include +#include +#include +#include +#include #ifndef HomogeneousField #define HomogeneousField #endif // includes KFParticle -#include "KFParticle.h" #include "KFPTrack.h" #include "KFPVertex.h" +#include "KFParticle.h" #include "KFParticleBase.h" #include "KFVertex.h" @@ -87,8 +88,8 @@ struct reduced3bodyCreator { o2::vertexing::DCAFitterN<3> fitter3body; o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; - Configurable event_sel8_selection{"event_sel8_selection", true, "event selection count post sel8 cut"}; - Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; + Configurable doSel8selection{"doSel8selection", true, "flag for sel8 event selection"}; + Configurable doPosZselection{"doPosZselection", true, "flag for posZ event selection"}; // CCDB options Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; @@ -110,7 +111,7 @@ struct reduced3bodyCreator { Configurable cfgMaterialCorrection{"cfgMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrNONE), "Type of material correction for DCAFitter"}; int mRunNumber; - float d_bz; + float mBz; o2::pid::tof::TOFResoParamsV2 mRespParamsV2; // tracked cluster size @@ -171,27 +172,18 @@ struct reduced3bodyCreator { // In case override, don't proceed, please - no CCDB access required auto run3grp_timestamp = bc.timestamp(); - o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); - o2::parameters::GRPMagField* grpmag = 0x0; - if (grpo) { - o2::base::Propagator::initFieldFromGRP(grpo); - // Fetch magnetic field from ccdb for current collision - d_bz = grpo->getNominalL3Field(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; - } else { - grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpmag); - // Fetch magnetic field from ccdb for current collision - // d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); - d_bz = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + o2::parameters::GRPMagField* grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; } + o2::base::Propagator::initFieldFromGRP(grpmag); + // Fetch magnetic field from ccdb for current collision + // mBz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + mBz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << mBz << " kZG"; // Set magnetic field for KF vertexing #ifdef HomogeneousField - KFParticle::SetField(d_bz); + KFParticle::SetField(mBz); #endif // Initial TOF PID Paras, copied from PIDTOF.h @@ -252,7 +244,7 @@ struct reduced3bodyCreator { } } - fitter3body.setBz(d_bz); + fitter3body.setBz(mBz); bachelorTOFPID.SetParams(mRespParamsV2); } @@ -302,7 +294,7 @@ struct reduced3bodyCreator { void process(ColwithEvTimesMultsCents const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::Tracked3Bodys const& tracked3bodys, aod::BCsWithTimestamps const&) { - std::vector triggeredCollisions(collisions.size(), false); + std::vector isTriggeredCollision(collisions.size(), false); int lastRunNumber = -1; // RunNumber of last collision, used for zorro counting // Event counting @@ -320,17 +312,17 @@ struct reduced3bodyCreator { isZorroSelected = zorro.isSelected(bc.globalBC()); if (isZorroSelected) { registry.fill(HIST("hEventCounterZorro"), 0.5); - triggeredCollisions[collision.globalIndex()] = true; + isTriggeredCollision[collision.globalIndex()] = true; } } // Event selection registry.fill(HIST("hEventCounter"), 0.5); - if (event_sel8_selection && !collision.sel8()) { + if (doSel8selection && !collision.sel8()) { continue; } registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { // 10cm + if (doPosZselection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { // 10cm continue; } registry.fill(HIST("hEventCounter"), 2.5); @@ -355,17 +347,17 @@ struct reduced3bodyCreator { auto collision = d3body.template collision_as(); - if (event_sel8_selection && !collision.sel8()) { + if (doSel8selection && !collision.sel8()) { continue; } - if (event_posZ_selection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { // 10cm + if (doPosZselection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { // 10cm continue; } auto bc = collision.bc_as(); initCCDB(bc); if (cfgSkimmedProcessing && cfgOnlyKeepInterestedTrigger) { - if (triggeredCollisions[collision.globalIndex()] == false) { + if (isTriggeredCollision[collision.globalIndex()] == false) { continue; } } diff --git a/PWGLF/Utils/decay3bodyBuilderHelper.h b/PWGLF/Utils/decay3bodyBuilderHelper.h index 550625f2fc6..03a5b98aa08 100644 --- a/PWGLF/Utils/decay3bodyBuilderHelper.h +++ b/PWGLF/Utils/decay3bodyBuilderHelper.h @@ -186,6 +186,7 @@ class decay3bodyBuilderHelper bool useSelections = true, bool useTPCforPion = false, bool acceptTPCOnly = false, + bool askOnlyITSMatch = true, bool calculateCovariance = true, bool isEventMixing = false) { @@ -240,9 +241,21 @@ class decay3bodyBuilderHelper } // TPC only - if (!acceptTPCOnly && (!trackProton.hasITS() || !trackPion.hasITS() || !trackDeuteron.hasITS())) { - decay3body = {}; - return false; + if (!acceptTPCOnly) { + if (askOnlyITSMatch) { + if (!trackProton.hasITS() || !trackPion.hasITS() || !trackDeuteron.hasITS()) { + decay3body = {}; + return false; + } + } else { + bool isProtonTPCOnly = !trackProton.hasITS() && !trackProton.hasTOF() && !trackProton.hasTRD(); + bool isPionTPCOnly = !trackPion.hasITS() && !trackPion.hasTOF() && !trackPion.hasTRD(); + bool isDeuteronTPCOnly = !trackDeuteron.hasITS() && !trackDeuteron.hasTOF() && !trackDeuteron.hasTRD(); + if (isProtonTPCOnly || isPionTPCOnly || isDeuteronTPCOnly) { + decay3body = {}; + return false; + } + } } // daughter TPC PID