diff --git a/PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h b/PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h index 69b4f8c1b5d..514913a9c5a 100644 --- a/PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h +++ b/PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h @@ -18,8 +18,12 @@ #ifndef PWGCF_TWOPARTICLECORRELATIONS_DATAMODEL_LONGRANGEDERIVED_H_ #define PWGCF_TWOPARTICLECORRELATIONS_DATAMODEL_LONGRANGEDERIVED_H_ +#include "PWGMM/Mult/DataModel/bestCollisionTable.h" + #include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include #include #include @@ -138,19 +142,121 @@ using LRZdc = LRZdcs::iterator; namespace lrcorrtrktable { + +template +inline typename binningType::binned_t packInTable(const float& valueToBin) +{ + if (valueToBin <= binningType::binned_min) { + return binningType::underflowBin; + } else if (valueToBin >= binningType::binned_max) { + return binningType::overflowBin; + } else { + return static_cast((valueToBin - binningType::binned_min) / binningType::bin_width); + } +} + +template +inline float unPack(const typename binningType::binned_t& b) +{ + return binningType::bin_width * b + binningType::binned_min; +} + +template +inline typename binningType::binned_t packSymmetric(const float& valueToBin) +{ + if (valueToBin <= binningType::binned_min) { + return (binningType::underflowBin); + } else if (valueToBin >= binningType::binned_max) { + return (binningType::overflowBin); + } else if (valueToBin >= 0) { + return (static_cast((valueToBin * binningType::inv_bin_width) + 0.5f)); + } else { + return (static_cast((valueToBin * binningType::inv_bin_width) - 0.5f)); + } +} + +template +inline float unPackSymmetric(const typename binningType::binned_t& b) +{ + return binningType::bin_width * static_cast(b); +} + +namespace binning +{ + +template lim, typename binVariable = int8_t> +struct binningParent { + public: + typedef binVariable binned_t; + + // Reserve two bins: one for overflow and one for underflow + static constexpr int nbins = (1 << (8 * sizeof(binned_t))) - 2; + static constexpr binned_t overflowBin = nbins; + static constexpr binned_t underflowBin = -1; + static constexpr float binned_min = lim.first; + static constexpr float binned_max = lim.second; + static constexpr float binned_center = 0.5 * (binned_min + binned_max); + static constexpr float bin_width = (binned_max - binned_min) / static_cast(nbins); + static constexpr float inv_bin_width = 1. / bin_width; + static_assert(binned_min < binned_max, "Invalid binning range"); + static void print() + { + LOG(info) << "Binning: " << binned_min << " - " << binned_max << " with " << nbins << " bins, width = " + << bin_width << ". Overflow bin " << static_cast(overflowBin) << " Underflow bin " << static_cast(underflowBin); + } +}; + +using trkdca_v0 = binningParent(-2.0f, 2.0f), int8_t>; +using trkphi_v0 = binningParent(0.0f, o2::constants::math::TwoPI), uint16_t>; +using trkamp_v0 = binningParent(0.0f, 5000.0f), uint16_t>; +using trkpt_v0 = binningParent(0.0f, 10.0f), uint16_t>; +using trketa_v0 = binningParent(-5.0f, 5.0f), int16_t>; +using trkchi2_v0 = binningParent(0.0f, 10.0f), int8_t>; + +using trkdca = trkdca_v0; +using trkchi2 = trkchi2_v0; +using trkpt = trkpt_v0; +using trketa = trketa_v0; +using trkphi = trkphi_v0; +using trkamp = trkamp_v0; + +} // namespace binning + DECLARE_SOA_INDEX_COLUMN(LRCollision, lrCollision); DECLARE_SOA_INDEX_COLUMN(UpcLRCollision, upcLRCollision); -DECLARE_SOA_COLUMN(Pt, pt, float); -DECLARE_SOA_COLUMN(Eta, eta, float); -DECLARE_SOA_COLUMN(Phi, phi, float); -DECLARE_SOA_COLUMN(ChannelID, channelID, int); -DECLARE_SOA_COLUMN(Amplitude, amplitude, float); -DECLARE_SOA_COLUMN(GainAmplitude, gainAmplitude, float); +DECLARE_SOA_COLUMN(ChannelID, channelID, uint8_t); +DECLARE_SOA_COLUMN(AmplitudeStore, amplitudeStore, binning::trkamp::binned_t); DECLARE_SOA_COLUMN(InvMass, invMass, float); DECLARE_SOA_COLUMN(IdPos, idPos, int64_t); DECLARE_SOA_COLUMN(IdNeg, idNeg, int64_t); DECLARE_SOA_COLUMN(TrackType, trackType, uint8_t); DECLARE_SOA_COLUMN(V0Type, v0Type, uint8_t); +DECLARE_SOA_COLUMN(AmbDegree, ambDegree, uint8_t); +DECLARE_SOA_COLUMN(TPCNClsFound, tpcNClsFound, uint8_t); +DECLARE_SOA_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows, uint8_t); +DECLARE_SOA_COLUMN(TPCChi2NClStore, tpcChi2NClStore, binning::trkchi2::binned_t); //! Stored binned chi2 +DECLARE_SOA_COLUMN(DCAzStore, dcazStore, binning::trkdca::binned_t); //! Stored binned dcaz +DECLARE_SOA_COLUMN(BestDCAxyStore, bestdcaxyStore, binning::trkdca::binned_t); //! Stored binned best dcaxy +DECLARE_SOA_COLUMN(BestDCAzStore, bestdcazStore, binning::trkdca::binned_t); //! Stored binned best dcaz +DECLARE_SOA_COLUMN(PtStore, ptStore, binning::trkpt::binned_t); //! Stored binned pt +DECLARE_SOA_COLUMN(EtaStore, etaStore, binning::trketa::binned_t); //! Stored binned eta +DECLARE_SOA_COLUMN(PhiStore, phiStore, binning::trkphi::binned_t); //! Stored binned phi +DECLARE_SOA_DYNAMIC_COLUMN(TPCChi2NCl, tpcChi2NCl, + [](binning::trkchi2::binned_t chi2_binned) -> float { return unPack(chi2_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(DCAz, dcaZ, + [](binning::trkdca::binned_t dcaz_binned) -> float { return unPackSymmetric(dcaz_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, + [](binning::trkpt::binned_t pt_binned) -> float { return unPack(pt_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, + [](binning::trketa::binned_t eta_binned) -> float { return unPackSymmetric(eta_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, + [](binning::trkphi::binned_t phi_binned) -> float { return unPackSymmetric(phi_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(BestDCAXY, bestDCAXY, + [](binning::trkdca::binned_t bestdcaxy_binned) -> float { return unPackSymmetric(bestdcaxy_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(BestDCAZ, bestDCAZ, + [](binning::trkdca::binned_t bestdcaz_binned) -> float { return unPackSymmetric(bestdcaz_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(Amplitude, amplitude, + [](binning::trkamp::binned_t amp_binned) -> float { return unPack(amp_binned); }); enum TrackPid { kSpCharge, kSpPion, @@ -168,30 +274,43 @@ enum V0TrackPid { DECLARE_SOA_TABLE(LRMidTracks, "AOD", "LRMIDTRACK", o2::soa::Index<>, lrcorrtrktable::LRCollisionId, - lrcorrtrktable::Pt, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi, - lrcorrtrktable::TrackType); + lrcorrtrktable::TPCNClsFound, + lrcorrtrktable::TPCNClsCrossedRows, + lrcorrtrktable::TPCChi2NClStore, + lrcorrtrktable::PtStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, + lrcorrtrktable::DCAzStore, + lrcorrtrktable::TrackType, + lrcorrtrktable::TPCChi2NCl, + lrcorrtrktable::Pt, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi, + lrcorrtrktable::DCAz); using LRMidTrack = LRMidTracks::iterator; DECLARE_SOA_TABLE(LRFt0aTracks, "AOD", "LRFT0ATRACK", o2::soa::Index<>, lrcorrtrktable::LRCollisionId, lrcorrtrktable::ChannelID, - lrcorrtrktable::Amplitude, - lrcorrtrktable::GainAmplitude, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi); + lrcorrtrktable::AmplitudeStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, + lrcorrtrktable::Amplitude, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi); using LRFt0aTrack = LRFt0aTracks::iterator; DECLARE_SOA_TABLE(LRFt0cTracks, "AOD", "LRFT0CTRACK", o2::soa::Index<>, lrcorrtrktable::LRCollisionId, lrcorrtrktable::ChannelID, - lrcorrtrktable::Amplitude, - lrcorrtrktable::GainAmplitude, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi); + lrcorrtrktable::AmplitudeStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, + lrcorrtrktable::Amplitude, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi); using LRFt0cTrack = LRFt0cTracks::iterator; DECLARE_SOA_TABLE(LRV0Tracks, "AOD", "LRV0TRACK", @@ -199,56 +318,73 @@ DECLARE_SOA_TABLE(LRV0Tracks, "AOD", "LRV0TRACK", lrcorrtrktable::LRCollisionId, lrcorrtrktable::IdPos, lrcorrtrktable::IdNeg, - lrcorrtrktable::Pt, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi, + lrcorrtrktable::PtStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, lrcorrtrktable::InvMass, - lrcorrtrktable::V0Type); + lrcorrtrktable::V0Type, + lrcorrtrktable::Pt, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi); using LRV0Track = LRV0Tracks::iterator; DECLARE_SOA_TABLE(LRMftTracks, "AOD", "LRMFTTRACK", o2::soa::Index<>, lrcorrtrktable::LRCollisionId, - lrcorrtrktable::Pt, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi); + lrcorrtrktable::AmbDegree, + lrcorrtrktable::PtStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, + fwdtrack::NClusters, + lrcorrtrktable::BestDCAxyStore, + lrcorrtrktable::BestDCAzStore, + lrcorrtrktable::BestDCAXY, + lrcorrtrktable::BestDCAZ, + lrcorrtrktable::Pt, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi); using LRMftTrack = LRMftTracks::iterator; -DECLARE_SOA_TABLE(LRMftBestTracks, "AOD", "LRMFTBESTTRACK", - o2::soa::Index<>, - lrcorrtrktable::LRCollisionId, - lrcorrtrktable::Pt, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi); -using LRMftBestTrack = LRMftBestTracks::iterator; - DECLARE_SOA_TABLE(UpcLRMidTracks, "AOD", "UPCLRMIDTRACK", o2::soa::Index<>, lrcorrtrktable::UpcLRCollisionId, - lrcorrtrktable::Pt, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi, - lrcorrtrktable::TrackType); + lrcorrtrktable::TPCNClsFound, + lrcorrtrktable::TPCNClsCrossedRows, + lrcorrtrktable::TPCChi2NClStore, + lrcorrtrktable::PtStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, + lrcorrtrktable::DCAzStore, + lrcorrtrktable::TrackType, + lrcorrtrktable::TPCChi2NCl, + lrcorrtrktable::Pt, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi, + lrcorrtrktable::DCAz); using UpcLRMidTrack = UpcLRMidTracks::iterator; DECLARE_SOA_TABLE(UpcLRFt0aTracks, "AOD", "UPCLRFT0ATRACK", o2::soa::Index<>, lrcorrtrktable::UpcLRCollisionId, lrcorrtrktable::ChannelID, - lrcorrtrktable::Amplitude, - lrcorrtrktable::GainAmplitude, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi); + lrcorrtrktable::AmplitudeStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, + lrcorrtrktable::Amplitude, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi); using UpcLRFt0aTrack = UpcLRFt0aTracks::iterator; DECLARE_SOA_TABLE(UpcLRFt0cTracks, "AOD", "UPCLRFT0CTRACK", o2::soa::Index<>, lrcorrtrktable::UpcLRCollisionId, lrcorrtrktable::ChannelID, - lrcorrtrktable::Amplitude, - lrcorrtrktable::GainAmplitude, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi); + lrcorrtrktable::AmplitudeStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, + lrcorrtrktable::Amplitude, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi); using UpcLRFt0cTrack = UpcLRFt0cTracks::iterator; DECLARE_SOA_TABLE(UpcLRV0Tracks, "AOD", "UPCLRV0TRACK", @@ -256,28 +392,32 @@ DECLARE_SOA_TABLE(UpcLRV0Tracks, "AOD", "UPCLRV0TRACK", lrcorrtrktable::UpcLRCollisionId, lrcorrtrktable::IdPos, lrcorrtrktable::IdNeg, - lrcorrtrktable::Pt, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi, + lrcorrtrktable::PtStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, lrcorrtrktable::InvMass, - lrcorrtrktable::V0Type); + lrcorrtrktable::V0Type, + lrcorrtrktable::Pt, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi); using UpcLRV0Track = UpcLRV0Tracks::iterator; DECLARE_SOA_TABLE(UpcLRMftTracks, "AOD", "UPCLRMFTTRACK", o2::soa::Index<>, lrcorrtrktable::UpcLRCollisionId, - lrcorrtrktable::Pt, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi); + lrcorrtrktable::AmbDegree, + lrcorrtrktable::PtStore, + lrcorrtrktable::EtaStore, + lrcorrtrktable::PhiStore, + fwdtrack::NClusters, + lrcorrtrktable::BestDCAxyStore, + lrcorrtrktable::BestDCAzStore, + lrcorrtrktable::BestDCAXY, + lrcorrtrktable::BestDCAZ, + lrcorrtrktable::Pt, + lrcorrtrktable::Eta, + lrcorrtrktable::Phi); using UpcLRMftTrack = UpcLRMftTracks::iterator; - -DECLARE_SOA_TABLE(UpcLRMftBestTracks, "AOD", "UPCLRMFTBESTTRACK", - o2::soa::Index<>, - lrcorrtrktable::UpcLRCollisionId, - lrcorrtrktable::Pt, - lrcorrtrktable::Eta, - lrcorrtrktable::Phi); -using UpcLRMftBestTrack = UpcLRMftBestTracks::iterator; } // namespace o2::aod #endif // PWGCF_TWOPARTICLECORRELATIONS_DATAMODEL_LONGRANGEDERIVED_H_ diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx index eccf6d8fb4d..79a9465064c 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx @@ -84,6 +84,7 @@ auto static constexpr CintZero = 0; auto static constexpr KminFt0cCell = 96; auto static constexpr TotFt0Channels = 208; AxisSpec axisEvent{15, 0.5, 15.5, "#Event", "EventAxis"}; +AxisSpec axisTrackSel{10, 0.5, 10.5, "#Track", "TrackAxis"}; auto static constexpr KminCharge = 3.0f; static constexpr std::string_view species[] = {"Pi", "Ka", "Pr"}; static constexpr std::array speciesIds{kPiPlus, kKPlus, kProton}; @@ -108,8 +109,8 @@ struct LongrangeMaker { Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", false, "Enable GoodZvtxFT0vsPV cut"}; Configurable isApplyGoodITSLayersAll{"isApplyGoodITSLayersAll", false, "Enable GoodITSLayersAll cut"}; Configurable isApplyExtraCorrCut{"isApplyExtraCorrCut", false, "Enable extra NPVtracks vs FTOC correlation cut"}; - Configurable npvTracksCut{"npvTracksCut", 1.0f, "Apply extra NPVtracks cut"}; - Configurable ft0cCut{"ft0cCut", 1.0f, "Apply extra FT0C cut"}; + Configurable isApplyBestCollIndex{"isApplyBestCollIndex", true, "bestCollIndex"}; + Configurable isrejectFlangeEvent{"isrejectFlangeEvent", false, "At least one channel with -350 TDC < time < -450 TDC"}; Configurable isApplyNoCollInTimeRangeStandard{"isApplyNoCollInTimeRangeStandard", false, "Enable NoCollInTimeRangeStandard cut"}; Configurable isApplyNoCollInRofStandard{"isApplyNoCollInRofStandard", false, "Enable NoCollInRofStandard cut"}; Configurable isApplyNoHighMultCollInPrevRof{"isApplyNoHighMultCollInPrevRof", false, "Enable NoHighMultCollInPrevRof cut"}; @@ -119,39 +120,45 @@ struct LongrangeMaker { Configurable isApplyOccuSelection{"isApplyOccuSelection", false, "Enable occupancy selection"}; Configurable cfgOccuCut{"cfgOccuCut", 1000, "Occupancy selection"}; Configurable cfgVtxCut{"cfgVtxCut", 10.0f, "vertex Z selection"}; - Configurable isApplyBestCollIndex{"isApplyBestCollIndex", true, "bestCollIndex"}; - Configurable isrejectFlangeEvent{"isrejectFlangeEvent", false, "At least one channel with -350 TDC < time < -450 TDC"}; + Configurable npvTracksCut{"npvTracksCut", 1.0f, "Apply extra NPVtracks cut"}; + Configurable ft0cCut{"ft0cCut", 1.0f, "Apply extra FT0C cut"}; } cfgevtsel; struct : ConfigurableGroup { + Configurable cfgItsPattern{"cfgItsPattern", 1, "0 = Run3ITSibAny, 1 = Run3ITSallAny, 2 = Run3ITSall7Layers, 3 = Run3ITSibTwo"}; Configurable cfgEtaCut{"cfgEtaCut", 0.8f, "Eta range to consider"}; Configurable cfgPtCutMin{"cfgPtCutMin", 0.2f, "minimum accepted track pT"}; Configurable cfgPtCutMax{"cfgPtCutMax", 10.0f, "maximum accepted track pT"}; Configurable cfgPtCutMult{"cfgPtCutMult", 3.0f, "maximum track pT for multiplicity classification"}; Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 70.f, "cut on minimum number of TPC crossed rows"}; Configurable minTPCNClsFound{"minTPCNClsFound", 50.f, "cut on minimum value of TPC found clusters"}; - Configurable maxDcaZ{"maxDcaZ", 2.f, "cut on maximum abs value of DCA z"}; - Configurable maxDcaXY{"maxDcaXY", 1.f, "cut on maximum abs value of DCA xy"}; + Configurable minNCrossedRowsOverFindableClustersTPC{"minNCrossedRowsOverFindableClustersTPC", 0.8f, "cut on minNCrossedRowsOverFindableClustersTPC"}; Configurable maxChi2PerClusterTPC{"maxChi2PerClusterTPC", 4.f, "cut on maximum value of TPC chi2 per cluster"}; + Configurable maxChi2PerClusterITS{"maxChi2PerClusterITS", 36.f, "cut on maximum value of ITS chi2 per cluster"}; + Configurable maxDcaZ{"maxDcaZ", 2.0f, "cut on maximum abs value of DCA z"}; + Configurable maxDcaXY{"maxDcaXY", 1.0f, "cut on maximum abs value of DCA xy"}; } cfgtrksel; struct : ConfigurableGroup { - Configurable cfigMftEtaMax{"cfigMftEtaMax", -2.5f, "Maximum MFT eta cut"}; - Configurable cfigMftEtaMin{"cfigMftEtaMin", -3.6f, "Minimum MFT eta cut"}; - Configurable cfigMftDcaxy{"cfigMftDcaxy", 2.0f, "cut on DCA xy for MFT tracks"}; - Configurable cfigMftDcaz{"cfigMftDcaz", 2.0f, "cut on DCA z for MFT tracks"}; - Configurable cfigMftCluster{"cfigMftCluster", 5, "cut on MFT Cluster"}; + Configurable cfgUseChi2Cut{"cfgUseChi2Cut", false, "Use condition on MFT track: chi2/Nclusters"}; + Configurable cfgRequireCA{"cfgRequireCA", false, "Use Cellular Automaton track-finding algorithm"}; Configurable useMftPtCut{"useMftPtCut", true, "Choose to apply MFT track pT cut"}; + Configurable cfgMftCluster{"cfgMftCluster", 5, "cut on MFT Cluster"}; + Configurable cfgMftEtaMax{"cfgMftEtaMax", -2.4f, "Maximum MFT eta cut"}; + Configurable cfgMftEtaMin{"cfgMftEtaMin", -3.6f, "Minimum MFT eta cut"}; + Configurable cfgMftDcaxy{"cfgMftDcaxy", 2.0f, "cut on DCA xy for MFT tracks"}; + Configurable cfgMftDcaz{"cfgMftDcaz", 2.0f, "cut on DCA z for MFT tracks"}; Configurable cfgMftPtCutMin{"cfgMftPtCutMin", 0.f, "minimum accepted MFT track pT"}; Configurable cfgMftPtCutMax{"cfgMftPtCutMax", 10.f, "maximum accepted MFT track pT"}; + Configurable cfgMaxChi2NCl{"cfgMaxChi2NCl", 1.f, "Cut on MFT track: chi2/Nclusters"}; } cfgmfttrksel; struct : ConfigurableGroup { - Configurable cfigFt0aEtaMax{"cfigFt0aEtaMax", 4.9f, "Maximum FT0A eta cut"}; - Configurable cfigFt0aEtaMin{"cfigFt0aEtaMin", 3.5f, "Minimum FT0A eta cut"}; - Configurable cfigFt0cEtaMax{"cfigFt0cEtaMax", -2.1f, "Maximum FT0C eta cut"}; - Configurable cfigFt0cEtaMin{"cfigFt0cEtaMin", -3.3f, "Minimum FT0C eta cut"}; - Configurable cfigVerbosity{"cfigVerbosity", 0, "print statement"}; + Configurable cfgFt0aEtaMax{"cfgFt0aEtaMax", 4.9f, "Maximum FT0A eta cut"}; + Configurable cfgFt0aEtaMin{"cfgFt0aEtaMin", 3.5f, "Minimum FT0A eta cut"}; + Configurable cfgFt0cEtaMax{"cfgFt0cEtaMax", -2.1f, "Maximum FT0C eta cut"}; + Configurable cfgFt0cEtaMin{"cfgFt0cEtaMin", -3.3f, "Minimum FT0C eta cut"}; + Configurable cfgVerbosity{"cfgVerbosity", 0, "print statement"}; Configurable useGainCalib{"useGainCalib", true, "use gain calibration"}; Configurable confGainPath{"confGainPath", "Analysis/EventPlane/GainEq/FT0", "Path to gain calibration"}; } cfgfittrksel; @@ -183,6 +190,16 @@ struct LongrangeMaker { Configurable maxLambdaLifeTime{"maxLambdaLifeTime", 30.0f, "Maximum Lambda lifetime (in cm)"}; } cfgv0trksel; + struct : ConfigurableGroup { + ConfigurableAxis axisVtx = {"axisVtx", {20, -10, 10}, "Vertex axis"}; + ConfigurableAxis axisMult = {"axisMult", {100, 0, 100}, "Multiplicity axis"}; + ConfigurableAxis axisEta = {"axisEta", {20, -1, 1}, "eta axis"}; + ConfigurableAxis axisPt = {"axisPt", {10, 0, 10}, "pT axis"}; + ConfigurableAxis axisSpecies = {"axisSpecies", {4, 0.5, 4.5}, "Species axis"}; + ConfigurableAxis axisAmplitude{"axisAmplitude", {5000, 0, 10000}, "FT0 amplitude"}; + ConfigurableAxis axisChannel{"axisChannel", {208, 0, 208}, "FT0 channel"}; + } cfgAxis; + Configurable> itsNsigmaPidCut{"itsNsigmaPidCut", std::vector{3, 2.5, 2, -3, -2.5, -2}, "ITS n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; Configurable> tpcNsigmaPidCut{"tpcNsigmaPidCut", std::vector{1.5, 1.5, 1.5, -1.5, -1.5, -1.5}, "TPC n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; Configurable> tofNsigmaPidCut{"tofNsigmaPidCut", std::vector{1.5, 1.5, 1.5, -1.5, -1.5, -1.5}, "TOF n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; @@ -190,12 +207,6 @@ struct LongrangeMaker { Configurable isUseItsPid{"isUseItsPid", false, "Use ITS PID for particle identification"}; Configurable isUseCentEst{"isUseCentEst", false, "Centrality based classification"}; - ConfigurableAxis vtxHistBin{"vtxHistBin", {20, -10, 10}, ""}; - ConfigurableAxis multHistBin{"multHistBin", {100, 0, 100}, ""}; - ConfigurableAxis etaHistBin{"etaHistBin", {20, -1, 1}, ""}; - ConfigurableAxis ptHistBin{"ptHistBin", {10, 0, 10}, ""}; - ConfigurableAxis speciesHistBin{"speciesHistBin", {4, 0.5, 4.5}, ""}; - Service ccdb; Service pdg; o2::ccdb::CcdbApi ccdbApi; @@ -246,15 +257,38 @@ struct LongrangeMaker { x->SetBinLabel(13, "reject flange event"); histos.add("hSelectionResult", "hSelectionResult", kTH1I, {{5, -0.5, 4.5}}); - AxisSpec axisVtx = {vtxHistBin, "Vertex", "VtxAxis"}; - AxisSpec axisMult = {multHistBin, "Mult", "MultAxis"}; - AxisSpec axisEta = {etaHistBin, "Eta", "EtaAxis"}; - AxisSpec axisPt = {ptHistBin, "Pt", "PtAxis"}; - AxisSpec axisSpecies = {speciesHistBin, "Species", "SpeciesAxis"}; + histos.add("hMftTrkSel", "hMftTrkSel", kTH1D, {axisTrackSel}, false); + auto hMftTrkStat = histos.get(HIST("hMftTrkSel")); + auto* xMftTrk = hMftTrkStat->GetXaxis(); + xMftTrk->SetBinLabel(1, "All"); + xMftTrk->SetBinLabel(2, "Cluster selection"); + xMftTrk->SetBinLabel(3, "Chi2/NCluster selection"); + xMftTrk->SetBinLabel(4, "eta selection"); + xMftTrk->SetBinLabel(5, "pT selection"); + xMftTrk->SetBinLabel(6, "CA track selection"); + + histos.add("hMftBestTrkSel", "hMftBestTrkSel", kTH1D, {axisTrackSel}, false); + auto hMftBestTrkStat = histos.get(HIST("hMftBestTrkSel")); + auto* xMftBestTrk = hMftBestTrkStat->GetXaxis(); + xMftBestTrk->SetBinLabel(1, "All"); + xMftBestTrk->SetBinLabel(2, "BestSelCollID selection"); + xMftBestTrk->SetBinLabel(3, "Orphan track selection"); + xMftBestTrk->SetBinLabel(4, "DCAxy selection"); + xMftBestTrk->SetBinLabel(5, "DCAz selection"); + + histos.add("FT0A_Amp", "FT0A_Amp", kTH1D, {cfgAxis.axisAmplitude}); + histos.add("FT0A_Amp_gaincorrected", "FT0A_Amp_gaincorrected", kTH1D, {cfgAxis.axisAmplitude}); + histos.add("FT0A_Channel_vs_Amp", "FT0A_Channel_vs_Amp", kTH2D, {cfgAxis.axisChannel, cfgAxis.axisAmplitude}); + histos.add("FT0A_Channel_vs_Amp_gaincorrected", "FT0A_Channel_vs_Amp_gaincorrected", kTH2D, {cfgAxis.axisChannel, cfgAxis.axisAmplitude}); + + histos.add("FT0C_Amp", "FT0C_Amp", kTH1D, {cfgAxis.axisAmplitude}); + histos.add("FT0C_Amp_gaincorrected", "FT0C_Amp_gaincorrected", kTH1D, {cfgAxis.axisAmplitude}); + histos.add("FT0C_Channel_vs_Amp", "FT0C_Channel_vs_Amp", kTH2D, {cfgAxis.axisChannel, cfgAxis.axisAmplitude}); + histos.add("FT0C_Channel_vs_Amp_gaincorrected", "FT0C_Channel_vs_Amp_gaincorrected", kTH2D, {cfgAxis.axisChannel, cfgAxis.axisAmplitude}); if (doprocessTPCtrackEff || doprocessMFTtrackEff) { - histos.add("hGenMCdndpt", "hGenMCdndpt", kTHnSparseD, {axisVtx, axisMult, axisEta, axisPt, axisSpecies}, false); - histos.add("hRecMCdndpt", "hRecMCdndpt", kTHnSparseD, {axisVtx, axisMult, axisEta, axisPt, axisSpecies}, false); + histos.add("hGenMCdndpt", "hGenMCdndpt", kTHnSparseD, {cfgAxis.axisVtx, cfgAxis.axisMult, cfgAxis.axisEta, cfgAxis.axisPt, cfgAxis.axisSpecies}, false); + histos.add("hRecMCdndpt", "hRecMCdndpt", kTHnSparseD, {cfgAxis.axisVtx, cfgAxis.axisMult, cfgAxis.axisEta, cfgAxis.axisPt, cfgAxis.axisSpecies}, false); auto hGenSpecies = histos.get(HIST("hGenMCdndpt")); auto hRecSpecies = histos.get(HIST("hRecMCdndpt")); auto* axisGen = hGenSpecies->GetAxis(4); @@ -267,14 +301,16 @@ struct LongrangeMaker { axisRec->SetBinLabel(4, "Other"); } - myTrackFilter = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default); + myTrackFilter = getGlobalTrackSelectionRun3ITSMatch(cfgtrksel.cfgItsPattern, TrackSelection::GlobalTrackRun3DCAxyCut::Default); myTrackFilter.SetPtRange(cfgtrksel.cfgPtCutMin, cfgtrksel.cfgPtCutMax); myTrackFilter.SetEtaRange(-cfgtrksel.cfgEtaCut, cfgtrksel.cfgEtaCut); myTrackFilter.SetMinNCrossedRowsTPC(cfgtrksel.minNCrossedRowsTPC); + myTrackFilter.SetMinNCrossedRowsOverFindableClustersTPC(cfgtrksel.minNCrossedRowsOverFindableClustersTPC); myTrackFilter.SetMinNClustersTPC(cfgtrksel.minTPCNClsFound); + myTrackFilter.SetMaxChi2PerClusterTPC(cfgtrksel.maxChi2PerClusterTPC); + myTrackFilter.SetMaxChi2PerClusterITS(cfgtrksel.maxChi2PerClusterITS); myTrackFilter.SetMaxDcaZ(cfgtrksel.maxDcaZ); myTrackFilter.SetMaxDcaXYPtDep([scale = cfgtrksel.maxDcaXY.value](float pt) { return scale * (0.0105f + 0.0350f / std::pow(pt, 1.1f)); }); - myTrackFilter.SetMaxChi2PerClusterTPC(cfgtrksel.maxChi2PerClusterTPC); myTrackFilter.print(); tofNsigmaCut = tofNsigmaPidCut; @@ -296,7 +332,6 @@ struct LongrangeMaker { Produces lrft0atracks; Produces lrft0ctracks; Produces lrmfttracks; - Produces lrmftbesttracks; Produces lrv0tracks; Produces upclrcollision; @@ -307,21 +342,20 @@ struct LongrangeMaker { Produces upclrft0atracks; Produces upclrft0ctracks; Produces upclrmfttracks; - Produces upclrmftbesttracks; Produces upclrv0tracks; Filter fTracksEta = nabs(aod::track::eta) < cfgtrksel.cfgEtaCut; Filter fTracksPt = (aod::track::pt > cfgtrksel.cfgPtCutMin) && (aod::track::pt < cfgtrksel.cfgPtCutMax); - using CollTable = soa::Join; + using CollTable = soa::Join; using TrksTable = soa::Filtered>; using MftTrkTable = aod::MFTTracks; using BCs = soa::Join; std::vector ft0gainvalues{}; void processData(CollTable::iterator const& col, TrksTable const& tracks, - aod::FT0s const&, MftTrkTable const& mfttracks, - soa::SmallGroups const& besttracks, + aod::FT0s const&, MftTrkTable const&, + soa::SmallGroups const& reassoMftTracks, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) { if (!isEventSelected(col)) { @@ -330,6 +364,7 @@ struct LongrangeMaker { auto multiplicity = countNTracks(tracks); auto centrality = selColCent(col); auto bc = col.bc_as(); + // retrieve FT0 gain info from CCDB ft0gainvalues.clear(); ft0gainvalues = {}; if (cfgfittrksel.useGainCalib) { @@ -355,25 +390,58 @@ struct LongrangeMaker { if (!myTrackFilter.IsSelected(track)) continue; auto pid = getTrackPID(track); - lrmidtracks(lrcollision.lastIndex(), track.pt(), track.eta(), track.phi(), aod::lrcorrtrktable::kSpCharge); + lrmidtracks(lrcollision.lastIndex(), + track.tpcNClsFound(), + track.tpcNClsCrossedRows(), + aod::lrcorrtrktable::packInTable(track.tpcChi2NCl()), + aod::lrcorrtrktable::packInTable(track.pt()), + aod::lrcorrtrktable::packSymmetric(track.eta()), + aod::lrcorrtrktable::packSymmetric(track.phi()), + aod::lrcorrtrktable::packSymmetric(track.dcaZ()), + aod::lrcorrtrktable::kSpCharge); + if (pid != aod::lrcorrtrktable::kSpCharge) { - lrmidtracks(lrcollision.lastIndex(), track.pt(), track.eta(), track.phi(), pid); + lrmidtracks(lrcollision.lastIndex(), + track.tpcNClsFound(), + track.tpcNClsCrossedRows(), + aod::lrcorrtrktable::packInTable(track.tpcChi2NCl()), + aod::lrcorrtrktable::packInTable(track.pt()), + aod::lrcorrtrktable::packSymmetric(track.eta()), + aod::lrcorrtrktable::packSymmetric(track.phi()), + aod::lrcorrtrktable::packSymmetric(track.dcaZ()), + pid); } } // ft0 loop if (col.has_foundFT0()) { const auto& ft0 = col.foundFT0(); + if (cfgevtsel.isrejectFlangeEvent) { + constexpr int IsFlangeEventId = 7; + std::bitset<8> ft0TriggerMask = ft0.triggerMask(); + if (ft0TriggerMask[IsFlangeEventId]) { + return; + } + } + histos.fill(HIST("EventHist"), 13); for (std::size_t iCh = 0; iCh < ft0.channelA().size(); iCh++) { auto chanelid = ft0.channelA()[iCh]; float ampl = ft0.amplitudeA()[iCh]; auto phi = getPhiFT0(chanelid, 0); auto eta = getEtaFT0(chanelid, 0); auto gainampl = ampl / ft0gainvalues[chanelid]; - if (cfgfittrksel.cfigVerbosity > 0) { + if (cfgfittrksel.cfgVerbosity > 0) { LOGF(info, "FT0A info: Channel = %d | indexchannel = %d | %f | %f", chanelid, iCh, ft0gainvalues[chanelid], ft0gainvalues[iCh]); } - lrft0atracks(lrcollision.lastIndex(), chanelid, ampl, gainampl, eta, phi); + lrft0atracks(lrcollision.lastIndex(), + chanelid, + aod::lrcorrtrktable::packInTable(gainampl), + aod::lrcorrtrktable::packSymmetric(eta), + aod::lrcorrtrktable::packSymmetric(phi)); + histos.fill(HIST("FT0A_Amp"), ampl); + histos.fill(HIST("FT0A_Channel_vs_Amp"), chanelid, ampl); + histos.fill(HIST("FT0A_Amp_gaincorrected"), gainampl); + histos.fill(HIST("FT0A_Channel_vs_Amp_gaincorrected"), chanelid, gainampl); } for (std::size_t iCh = 0; iCh < ft0.channelC().size(); iCh++) { auto chanelid = ft0.channelC()[iCh] + KminFt0cCell; @@ -381,34 +449,39 @@ struct LongrangeMaker { auto phi = getPhiFT0(chanelid, 1); auto eta = getEtaFT0(chanelid, 1); auto gainampl = ampl / ft0gainvalues[chanelid]; - if (cfgfittrksel.cfigVerbosity > 0) { + if (cfgfittrksel.cfgVerbosity > 0) { LOGF(info, "FT0C info: Channel = %d | indexchannel = %d | %f | %f", chanelid, iCh, ft0gainvalues[chanelid], ft0gainvalues[iCh]); } - lrft0ctracks(lrcollision.lastIndex(), chanelid, ampl, gainampl, eta, phi); + lrft0ctracks(lrcollision.lastIndex(), + chanelid, + aod::lrcorrtrktable::packInTable(gainampl), + aod::lrcorrtrktable::packSymmetric(eta), + aod::lrcorrtrktable::packSymmetric(phi)); + histos.fill(HIST("FT0C_Amp"), ampl); + histos.fill(HIST("FT0C_Channel_vs_Amp"), chanelid, ampl); + histos.fill(HIST("FT0C_Amp_gaincorrected"), gainampl); + histos.fill(HIST("FT0C_Channel_vs_Amp_gaincorrected"), chanelid, gainampl); } } - // mft loop - for (const auto& track : mfttracks) { - if (!isMftTrackSelected(track)) + // mft tracks + for (const auto& reassoMftTrack : reassoMftTracks) { + if (!isMftBestTrackSelected(reassoMftTrack)) + continue; + auto itrack = reassoMftTrack.template mfttrack_as(); + if (!isMftTrackSelected(itrack)) { continue; - auto phi = track.phi(); - o2::math_utils::bringTo02Pi(phi); - lrmfttracks(lrcollision.lastIndex(), track.pt(), track.eta(), phi); - } - - if (besttracks.size() > 0) { - for (const auto& besttrack : besttracks) { - if (!isMftBestTrackSelected(besttrack)) - continue; - auto track = besttrack.mfttrack(); - if (!isMftTrackSelected(track)) { - continue; - } - auto phi = track.phi(); - o2::math_utils::bringTo02Pi(phi); - lrmftbesttracks(lrcollision.lastIndex(), track.pt(), track.eta(), phi); } + auto phi = itrack.phi(); + o2::math_utils::bringTo02Pi(phi); + lrmfttracks(lrcollision.lastIndex(), + reassoMftTrack.ambDegree(), + aod::lrcorrtrktable::packInTable(itrack.pt()), + aod::lrcorrtrktable::packSymmetric(itrack.eta()), + aod::lrcorrtrktable::packSymmetric(phi), + itrack.nClusters(), + aod::lrcorrtrktable::packSymmetric(reassoMftTrack.bestDCAXY()), + aod::lrcorrtrktable::packSymmetric(reassoMftTrack.bestDCAZ())); } // v0 loop @@ -422,8 +495,14 @@ struct LongrangeMaker { // K0short if (isSelectK0s(col, v0)) { // candidate is K0s - lrv0tracks(lrcollision.lastIndex(), posTrack.globalIndex(), negTrack.globalIndex(), - v0.pt(), v0.eta(), v0.phi(), v0.mK0Short(), aod::lrcorrtrktable::kSpK0short); + lrv0tracks(lrcollision.lastIndex(), + posTrack.globalIndex(), + negTrack.globalIndex(), + aod::lrcorrtrktable::packInTable(v0.pt()), + aod::lrcorrtrktable::packSymmetric(v0.eta()), + aod::lrcorrtrktable::packSymmetric(v0.phi()), + v0.mK0Short(), + aod::lrcorrtrktable::kSpK0short); } // Lambda and Anti-Lambda @@ -433,13 +512,25 @@ struct LongrangeMaker { // Note: candidate compatible with Lambda and Anti-Lambda hypothesis are counted twice (once for each hypothesis) if (lambdaTag) { // candidate is Lambda massV0 = v0.mLambda(); - lrv0tracks(lrcollision.lastIndex(), posTrack.globalIndex(), negTrack.globalIndex(), - v0.pt(), v0.eta(), v0.phi(), massV0, aod::lrcorrtrktable::kSpLambda); + lrv0tracks(lrcollision.lastIndex(), + posTrack.globalIndex(), + negTrack.globalIndex(), + aod::lrcorrtrktable::packInTable(v0.pt()), + aod::lrcorrtrktable::packSymmetric(v0.eta()), + aod::lrcorrtrktable::packSymmetric(v0.phi()), + massV0, + aod::lrcorrtrktable::kSpLambda); } if (antilambdaTag) { // candidate is Anti-lambda massV0 = v0.mAntiLambda(); - lrv0tracks(lrcollision.lastIndex(), posTrack.globalIndex(), negTrack.globalIndex(), - v0.pt(), v0.eta(), v0.phi(), massV0, aod::lrcorrtrktable::kSpALambda); + lrv0tracks(lrcollision.lastIndex(), + posTrack.globalIndex(), + negTrack.globalIndex(), + aod::lrcorrtrktable::packInTable(v0.pt()), + aod::lrcorrtrktable::packSymmetric(v0.eta()), + aod::lrcorrtrktable::packSymmetric(v0.phi()), + massV0, + aod::lrcorrtrktable::kSpALambda); } // end of Lambda and Anti-Lambda processing } } // process function @@ -447,8 +538,8 @@ struct LongrangeMaker { void processUpc(CollTable::iterator const& col, BCs const& bcs, TrksTable const& tracks, aod::Zdcs const&, aod::FV0As const& fv0as, aod::FT0s const& ft0s, - aod::FDDs const& fdds, MftTrkTable const& mfttracks, - soa::SmallGroups const& besttracks, + aod::FDDs const& fdds, MftTrkTable const&, + soa::SmallGroups const& reassoMftTracks, aod::V0Datas const& V0s) { if (!isEventSelected(col)) { @@ -492,9 +583,26 @@ struct LongrangeMaker { if (!myTrackFilter.IsSelected(track)) continue; auto pid = getTrackPID(track); - upclrmidtracks(upclrcollision.lastIndex(), track.pt(), track.eta(), track.phi(), aod::lrcorrtrktable::kSpCharge); + upclrmidtracks(upclrcollision.lastIndex(), + track.tpcNClsFound(), + track.tpcNClsCrossedRows(), + aod::lrcorrtrktable::packInTable(track.tpcChi2NCl()), + aod::lrcorrtrktable::packInTable(track.pt()), + aod::lrcorrtrktable::packSymmetric(track.eta()), + aod::lrcorrtrktable::packSymmetric(track.phi()), + aod::lrcorrtrktable::packSymmetric(track.dcaZ()), + aod::lrcorrtrktable::kSpCharge); + if (pid != aod::lrcorrtrktable::kSpCharge) { - upclrmidtracks(upclrcollision.lastIndex(), track.pt(), track.eta(), track.phi(), pid); + upclrmidtracks(upclrcollision.lastIndex(), + track.tpcNClsFound(), + track.tpcNClsCrossedRows(), + aod::lrcorrtrktable::packInTable(track.tpcChi2NCl()), + aod::lrcorrtrktable::packInTable(track.pt()), + aod::lrcorrtrktable::packSymmetric(track.eta()), + aod::lrcorrtrktable::packSymmetric(track.phi()), + aod::lrcorrtrktable::packSymmetric(track.dcaZ()), + pid); } } @@ -506,38 +614,42 @@ struct LongrangeMaker { float ampl = ft0.amplitudeA()[iCh]; auto phi = getPhiFT0(chanelid, 0); auto eta = getEtaFT0(chanelid, 0); - upclrft0atracks(upclrcollision.lastIndex(), chanelid, ampl, ampl, eta, phi); + upclrft0atracks(upclrcollision.lastIndex(), + chanelid, + aod::lrcorrtrktable::packInTable(ampl), + aod::lrcorrtrktable::packSymmetric(eta), + aod::lrcorrtrktable::packSymmetric(phi)); } for (std::size_t iCh = 0; iCh < ft0.channelC().size(); iCh++) { auto chanelid = ft0.channelC()[iCh] + KminFt0cCell; float ampl = ft0.amplitudeC()[iCh]; auto phi = getPhiFT0(chanelid, 1); auto eta = getEtaFT0(chanelid, 1); - upclrft0ctracks(upclrcollision.lastIndex(), chanelid, ampl, ampl, eta, phi); + upclrft0ctracks(upclrcollision.lastIndex(), + chanelid, + aod::lrcorrtrktable::packInTable(ampl), + aod::lrcorrtrktable::packSymmetric(eta), + aod::lrcorrtrktable::packSymmetric(phi)); } } - // mft loop - for (const auto& track : mfttracks) { - if (!isMftTrackSelected(track)) + for (const auto& reassoMftTrack : reassoMftTracks) { + if (!isMftBestTrackSelected(reassoMftTrack)) + continue; + auto itrack = reassoMftTrack.template mfttrack_as(); + if (!isMftTrackSelected(itrack)) { continue; - auto phi = track.phi(); - o2::math_utils::bringTo02Pi(phi); - upclrmfttracks(upclrcollision.lastIndex(), track.pt(), track.eta(), phi); - } - - if (besttracks.size() > 0) { - for (const auto& besttrack : besttracks) { - if (!isMftBestTrackSelected(besttrack)) - continue; - auto track = besttrack.mfttrack(); - if (!isMftTrackSelected(track)) { - continue; - } - auto phi = track.phi(); - o2::math_utils::bringTo02Pi(phi); - upclrmftbesttracks(upclrcollision.lastIndex(), track.pt(), track.eta(), phi); } + auto phi = itrack.phi(); + o2::math_utils::bringTo02Pi(phi); + upclrmfttracks(upclrcollision.lastIndex(), + reassoMftTrack.ambDegree(), + aod::lrcorrtrktable::packInTable(itrack.pt()), + aod::lrcorrtrktable::packSymmetric(itrack.eta()), + aod::lrcorrtrktable::packSymmetric(phi), + itrack.nClusters(), + aod::lrcorrtrktable::packSymmetric(reassoMftTrack.bestDCAXY()), + aod::lrcorrtrktable::packSymmetric(reassoMftTrack.bestDCAZ())); } // v0 loop @@ -551,8 +663,14 @@ struct LongrangeMaker { // K0short if (isSelectK0s(col, v0)) { // candidate is K0s - upclrv0tracks(upclrcollision.lastIndex(), posTrack.globalIndex(), negTrack.globalIndex(), - v0.pt(), v0.eta(), v0.phi(), v0.mK0Short(), aod::lrcorrtrktable::kSpK0short); + upclrv0tracks(upclrcollision.lastIndex(), + posTrack.globalIndex(), + negTrack.globalIndex(), + aod::lrcorrtrktable::packInTable(v0.pt()), + aod::lrcorrtrktable::packSymmetric(v0.eta()), + aod::lrcorrtrktable::packSymmetric(v0.phi()), + v0.mK0Short(), + aod::lrcorrtrktable::kSpK0short); } // Lambda and Anti-Lambda @@ -562,13 +680,25 @@ struct LongrangeMaker { // Note: candidate compatible with Lambda and Anti-Lambda hypothesis are counted twice (once for each hypothesis) if (lambdaTag) { // candidate is Lambda massV0 = v0.mLambda(); - upclrv0tracks(upclrcollision.lastIndex(), posTrack.globalIndex(), negTrack.globalIndex(), - v0.pt(), v0.eta(), v0.phi(), massV0, aod::lrcorrtrktable::kSpLambda); + upclrv0tracks(upclrcollision.lastIndex(), + posTrack.globalIndex(), + negTrack.globalIndex(), + aod::lrcorrtrktable::packInTable(v0.pt()), + aod::lrcorrtrktable::packSymmetric(v0.eta()), + aod::lrcorrtrktable::packSymmetric(v0.phi()), + massV0, + aod::lrcorrtrktable::kSpLambda); } if (antilambdaTag) { // candidate is Anti-lambda massV0 = v0.mAntiLambda(); - upclrv0tracks(upclrcollision.lastIndex(), posTrack.globalIndex(), negTrack.globalIndex(), - v0.pt(), v0.eta(), v0.phi(), massV0, aod::lrcorrtrktable::kSpALambda); + upclrv0tracks(upclrcollision.lastIndex(), + posTrack.globalIndex(), + negTrack.globalIndex(), + aod::lrcorrtrktable::packInTable(v0.pt()), + aod::lrcorrtrktable::packSymmetric(v0.eta()), + aod::lrcorrtrktable::packSymmetric(v0.phi()), + massV0, + aod::lrcorrtrktable::kSpALambda); } // end of Lambda and Anti-Lambda processing } } // SG events @@ -579,11 +709,10 @@ struct LongrangeMaker { using TrksMCRecTable = soa::Filtered>; using MftTrkMCRecTable = soa::Join; Preslice perColMidtrack = aod::track::collisionId; - Preslice perColMfttrack = o2::aod::fwdtrack::collisionId; - PresliceUnsorted perColMftbesttrack = aod::fwdtrack::bestCollisionId; + PresliceUnsorted perColMftTrack = aod::fwdtrack::bestCollisionId; void processMCRec(ColMCTrueTable::iterator const& mcCollision, ColMCRecTable const& RecCols, TrksMCRecTable const& RecTracks, - aod::FT0s const&, MftTrkMCRecTable const& mfttracks, aod::BestCollisionsFwd3d const& besttracks, + aod::FT0s const&, MftTrkMCRecTable const&, aod::BestCollisionsFwd3d const& reassoMftTracks, aod::McParticles const& mcparticles, aod::BCsWithTimestamps const&) { auto multiplicity = 0; @@ -636,9 +765,26 @@ struct LongrangeMaker { if (RecCol.mcCollisionId() != mcpart.mcCollisionId()) continue; auto pid = getTrackPID(track); - lrmidtracks(lrcollision.lastIndex(), track.pt(), track.eta(), track.phi(), aod::lrcorrtrktable::kSpCharge); + lrmidtracks(lrcollision.lastIndex(), + track.tpcNClsFound(), + track.tpcNClsCrossedRows(), + aod::lrcorrtrktable::packInTable(track.tpcChi2NCl()), + aod::lrcorrtrktable::packInTable(track.pt()), + aod::lrcorrtrktable::packSymmetric(track.eta()), + aod::lrcorrtrktable::packSymmetric(track.phi()), + aod::lrcorrtrktable::packSymmetric(track.dcaZ()), + aod::lrcorrtrktable::kSpCharge); + if (pid != aod::lrcorrtrktable::kSpCharge) { - lrmidtracks(lrcollision.lastIndex(), track.pt(), track.eta(), track.phi(), pid); + lrmidtracks(lrcollision.lastIndex(), + track.tpcNClsFound(), + track.tpcNClsCrossedRows(), + aod::lrcorrtrktable::packInTable(track.tpcChi2NCl()), + aod::lrcorrtrktable::packInTable(track.pt()), + aod::lrcorrtrktable::packSymmetric(track.eta()), + aod::lrcorrtrktable::packSymmetric(track.phi()), + aod::lrcorrtrktable::packSymmetric(track.dcaZ()), + pid); } } @@ -651,7 +797,15 @@ struct LongrangeMaker { auto phi = getPhiFT0(chanelid, 0); auto eta = getEtaFT0(chanelid, 0); auto gainampl = ampl / ft0gainvalues[chanelid]; - lrft0atracks(lrcollision.lastIndex(), chanelid, ampl, gainampl, eta, phi); + lrft0atracks(lrcollision.lastIndex(), + chanelid, + aod::lrcorrtrktable::packInTable(gainampl), + aod::lrcorrtrktable::packSymmetric(eta), + aod::lrcorrtrktable::packSymmetric(phi)); + histos.fill(HIST("FT0A_Amp"), ampl); + histos.fill(HIST("FT0A_Channel_vs_Amp"), chanelid, ampl); + histos.fill(HIST("FT0A_Amp_gaincorrected"), gainampl); + histos.fill(HIST("FT0A_Channel_vs_Amp_gaincorrected"), chanelid, gainampl); } for (std::size_t iCh = 0; iCh < ft0.channelC().size(); iCh++) { auto chanelid = ft0.channelC()[iCh] + KminFt0cCell; @@ -659,38 +813,36 @@ struct LongrangeMaker { auto phi = getPhiFT0(chanelid, 1); auto eta = getEtaFT0(chanelid, 1); auto gainampl = ampl / ft0gainvalues[chanelid]; - lrft0ctracks(lrcollision.lastIndex(), chanelid, ampl, gainampl, eta, phi); + lrft0ctracks(lrcollision.lastIndex(), + chanelid, + aod::lrcorrtrktable::packInTable(gainampl), + aod::lrcorrtrktable::packSymmetric(eta), + aod::lrcorrtrktable::packSymmetric(phi)); + histos.fill(HIST("FT0C_Amp"), ampl); + histos.fill(HIST("FT0C_Channel_vs_Amp"), chanelid, ampl); + histos.fill(HIST("FT0C_Amp_gaincorrected"), gainampl); + histos.fill(HIST("FT0C_Channel_vs_Amp_gaincorrected"), chanelid, gainampl); } } - // mft loop - auto recMftTracksPart = mfttracks.sliceBy(perColMfttrack, RecCol.globalIndex()); - for (const auto& track : recMftTracksPart) { - if (!isMftTrackSelected(track)) + auto recMftTracksPart = reassoMftTracks.sliceBy(perColMftTrack, RecCol.globalIndex()); + for (const auto& reassoMftTrack : recMftTracksPart) { + if (!isMftBestTrackSelected(reassoMftTrack)) continue; - if (!track.has_mcParticle()) + auto itrack = reassoMftTrack.template mfttrack_as(); + if (!isMftTrackSelected(itrack)) { continue; - auto mcpart = track.mcParticle(); - if (RecCol.mcCollisionId() != mcpart.mcCollisionId()) - continue; - auto phi = track.phi(); - o2::math_utils::bringTo02Pi(phi); - lrmfttracks(lrcollision.lastIndex(), track.pt(), track.eta(), phi); - } - - auto recMftbestTracksPart = besttracks.sliceBy(perColMftbesttrack, RecCol.globalIndex()); - if (recMftbestTracksPart.size() > 0) { - for (const auto& besttrack : recMftbestTracksPart) { - if (!isMftBestTrackSelected(besttrack)) - continue; - auto track = besttrack.mfttrack_as(); - if (!isMftTrackSelected(track)) { - continue; - } - auto phi = track.phi(); - o2::math_utils::bringTo02Pi(phi); - lrmftbesttracks(lrcollision.lastIndex(), track.pt(), track.eta(), phi); } + auto phi = itrack.phi(); + o2::math_utils::bringTo02Pi(phi); + lrmfttracks(lrcollision.lastIndex(), + reassoMftTrack.ambDegree(), + aod::lrcorrtrktable::packInTable(itrack.pt()), + aod::lrcorrtrktable::packSymmetric(itrack.eta()), + aod::lrcorrtrktable::packSymmetric(phi), + itrack.nClusters(), + aod::lrcorrtrktable::packSymmetric(reassoMftTrack.bestDCAXY()), + aod::lrcorrtrktable::packSymmetric(reassoMftTrack.bestDCAZ())); } for (const auto& particle : mcparticles) { @@ -701,12 +853,12 @@ struct LongrangeMaker { if (std::abs(particle.eta()) < cfgtrksel.cfgEtaCut && particle.pt() > cfgtrksel.cfgPtCutMin && particle.pt() < cfgtrksel.cfgPtCutMult) lrmidmctracks(lrmccollision.lastIndex(), particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), particle.flags()); // Fill FT0 tracks - if (cfgfittrksel.cfigFt0aEtaMin < particle.eta() && particle.eta() < cfgfittrksel.cfigFt0aEtaMax) + if (cfgfittrksel.cfgFt0aEtaMin < particle.eta() && particle.eta() < cfgfittrksel.cfgFt0aEtaMax) lrft0amctracks(lrmccollision.lastIndex(), particle.pt(), particle.eta(), particle.phi()); - if (cfgfittrksel.cfigFt0cEtaMin < particle.eta() && particle.eta() < cfgfittrksel.cfigFt0cEtaMax) + if (cfgfittrksel.cfgFt0cEtaMin < particle.eta() && particle.eta() < cfgfittrksel.cfgFt0cEtaMax) lrft0cmctracks(lrmccollision.lastIndex(), particle.pt(), particle.eta(), particle.phi()); // Fill MFT tracks - if (cfgmfttrksel.cfigMftEtaMin < particle.eta() && particle.eta() < cfgmfttrksel.cfigMftEtaMax) + if (cfgmfttrksel.cfgMftEtaMin < particle.eta() && particle.eta() < cfgmfttrksel.cfgMftEtaMax) lrmftmctracks(lrmccollision.lastIndex(), particle.pt(), particle.eta(), particle.phi()); } } @@ -730,12 +882,12 @@ struct LongrangeMaker { if (std::abs(particle.eta()) < cfgtrksel.cfgEtaCut && particle.pt() > cfgtrksel.cfgPtCutMin && particle.pt() < cfgtrksel.cfgPtCutMult) lrmidmctracks(lrmccollision.lastIndex(), particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), particle.flags()); // Fill FT0 tracks - if (cfgfittrksel.cfigFt0aEtaMin < particle.eta() && particle.eta() < cfgfittrksel.cfigFt0aEtaMax) + if (cfgfittrksel.cfgFt0aEtaMin < particle.eta() && particle.eta() < cfgfittrksel.cfgFt0aEtaMax) lrft0amctracks(lrmccollision.lastIndex(), particle.pt(), particle.eta(), particle.phi()); - if (cfgfittrksel.cfigFt0cEtaMin < particle.eta() && particle.eta() < cfgfittrksel.cfigFt0cEtaMax) + if (cfgfittrksel.cfgFt0cEtaMin < particle.eta() && particle.eta() < cfgfittrksel.cfgFt0cEtaMax) lrft0cmctracks(lrmccollision.lastIndex(), particle.pt(), particle.eta(), particle.phi()); // Fill MFT tracks - if (cfgmfttrksel.cfigMftEtaMin < particle.eta() && particle.eta() < cfgmfttrksel.cfigMftEtaMax) + if (cfgmfttrksel.cfgMftEtaMin < particle.eta() && particle.eta() < cfgmfttrksel.cfgMftEtaMax) lrmftmctracks(lrmccollision.lastIndex(), particle.pt(), particle.eta(), particle.phi()); } } @@ -797,8 +949,8 @@ struct LongrangeMaker { } } void processMFTtrackEff(ColMCTrueTable::iterator const& mcCollision, ColMCRecTable const& RecCols, - TrksMCRecTable const& RecTracks, MftTrkMCRecTable const& mfttracks, - aod::McParticles const& mcparticles) + TrksMCRecTable const& RecTracks, MftTrkMCRecTable const&, + aod::BestCollisionsFwd3d const& reassoMftTracks, aod::McParticles const& mcparticles) { if (std::abs(mcCollision.posZ()) >= cfgevtsel.cfgVtxCut) { return; @@ -821,7 +973,7 @@ struct LongrangeMaker { atLeastOne = true; } for (const auto& particle : mcparticles) { - if (!isGenPartSelected(particle) || particle.eta() > cfgmfttrksel.cfigMftEtaMax || particle.eta() < cfgmfttrksel.cfigMftEtaMin || particle.pt() < cfgmfttrksel.cfgMftPtCutMin || particle.pt() > cfgmfttrksel.cfgMftPtCutMax) + if (!isGenPartSelected(particle) || particle.eta() > cfgmfttrksel.cfgMftEtaMax || particle.eta() < cfgmfttrksel.cfgMftEtaMin || particle.pt() < cfgmfttrksel.cfgMftPtCutMin || particle.pt() > cfgmfttrksel.cfgMftPtCutMax) continue; if (atLeastOne) histos.fill(HIST("hGenMCdndpt"), mcCollision.posZ(), multiplicity, particle.eta(), particle.pt(), 1.0); @@ -833,10 +985,15 @@ struct LongrangeMaker { continue; if (cfgevtsel.isApplyBestCollIndex && RecCol.globalIndex() != mcCollision.bestCollisionIndex()) continue; - auto recTracksPart = mfttracks.sliceBy(perColMfttrack, RecCol.globalIndex()); - for (const auto& track : recTracksPart) { - if (!isMftTrackSelected(track)) + + auto recTracksPart = reassoMftTracks.sliceBy(perColMftTrack, RecCol.globalIndex()); + for (const auto& reassoMftTrack : recTracksPart) { + if (!isMftBestTrackSelected(reassoMftTrack)) continue; + auto track = reassoMftTrack.mfttrack_as(); + if (!isMftTrackSelected(track)) { + continue; + } if (!track.has_mcParticle()) continue; auto particle = track.mcParticle(); @@ -915,16 +1072,6 @@ struct LongrangeMaker { return false; } histos.fill(HIST("EventHist"), 12); - if (cfgevtsel.isrejectFlangeEvent) { - if constexpr (requires { col.ft0TriggerMask(); }) { - constexpr int IsFlangeEventId = 7; - std::bitset<8> ft0TriggerMask = col.ft0TriggerMask(); - if (ft0TriggerMask[IsFlangeEventId]) { - return false; - } - } - } - histos.fill(HIST("EventHist"), 13); return true; } @@ -1027,36 +1174,78 @@ struct LongrangeMaker { return -std::log(std::tan(0.5 * theta)); } - template + template bool isMftTrackSelected(CheckMftTrack const& track) { - if (track.nClusters() < cfgmfttrksel.cfigMftCluster) { + if constexpr (fillHis) { + histos.fill(HIST("hMftTrkSel"), 1); + } + if (track.nClusters() < cfgmfttrksel.cfgMftCluster) { return false; } - if (track.eta() > cfgmfttrksel.cfigMftEtaMax || track.eta() < cfgmfttrksel.cfigMftEtaMin) { + if constexpr (fillHis) { + histos.fill(HIST("hMftTrkSel"), 2); + } + if (cfgmfttrksel.cfgUseChi2Cut) { + float nclMft = std::max(2.0f * track.nClusters() - 5.0f, 1.0f); + float mftChi2NCl = track.chi2() / nclMft; + if (mftChi2NCl > cfgmfttrksel.cfgMaxChi2NCl) + return false; + } + if constexpr (fillHis) { + histos.fill(HIST("hMftTrkSel"), 3); + } + if (track.eta() > cfgmfttrksel.cfgMftEtaMax || track.eta() < cfgmfttrksel.cfgMftEtaMin) { return false; } + if constexpr (fillHis) { + histos.fill(HIST("hMftTrkSel"), 4); + } if (cfgmfttrksel.useMftPtCut && (track.pt() < cfgmfttrksel.cfgMftPtCutMin || track.pt() > cfgmfttrksel.cfgMftPtCutMax)) { return false; } + if constexpr (fillHis) { + histos.fill(HIST("hMftTrkSel"), 5); + } + if (cfgmfttrksel.cfgRequireCA && !track.isCA()) { + return false; + } + if constexpr (fillHis) { + histos.fill(HIST("hMftTrkSel"), 6); + } return true; } - template - bool isMftBestTrackSelected(CheckMftBestTrack const& besttrack) + template + bool isMftBestTrackSelected(CheckMftTrack const& mfttrack) { - if (besttrack.bestCollisionId() < CintZero) { + if constexpr (fillHis) { + histos.fill(HIST("hMftBestTrkSel"), 1); + } + if (mfttrack.bestCollisionId() < CintZero) { return false; } - if (besttrack.ambDegree() == CintZero) { + if constexpr (fillHis) { + histos.fill(HIST("hMftBestTrkSel"), 2); + } + if (mfttrack.ambDegree() == CintZero) { return false; } - if (std::abs(besttrack.bestDCAXY()) > cfgmfttrksel.cfigMftDcaxy) { + if constexpr (fillHis) { + histos.fill(HIST("hMftBestTrkSel"), 3); + } + if (std::abs(mfttrack.bestDCAXY()) >= cfgmfttrksel.cfgMftDcaxy) { return false; } - if (std::abs(besttrack.bestDCAZ()) >= cfgmfttrksel.cfigMftDcaz) { + if constexpr (fillHis) { + histos.fill(HIST("hMftBestTrkSel"), 4); + } + if (std::abs(mfttrack.bestDCAZ()) >= cfgmfttrksel.cfgMftDcaz) { return false; } + if constexpr (fillHis) { + histos.fill(HIST("hMftBestTrkSel"), 5); + } return true; } diff --git a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx index 705795bf863..f387acbbd2b 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx @@ -54,13 +54,58 @@ struct LongrangecorrDerived { SliceCache cache; SGSelector sgSelector; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - Configurable cfgNmixedevent{"cfgNmixedevent", 5, "how many events are mixed"}; - Configurable cfgPidMask{"cfgPidMask", 0, "Selection bitmask for the TPC particle"}; - Configurable cfgV0Mask{"cfgV0Mask", 0, "Selection bitmask for the V0 particle"}; - Configurable cfgVtxCut{"cfgVtxCut", 10.0f, "Vertex Z range to consider"}; - Configurable isUseCentEst{"isUseCentEst", false, "Centrality based classification"}; - Configurable isUseDataLikeMult{"isUseDataLikeMult", 0, "Data like mult/cent classification"}; - Configurable useGainCorr{"useGainCorr", true, "use gain calibration"}; + + struct : ConfigurableGroup { + Configurable cfgNmixedevent{"cfgNmixedevent", 5, "how many events are mixed"}; + Configurable cfgPidMask{"cfgPidMask", 0, "Selection bitmask for the TPC particle"}; + Configurable cfgV0Mask{"cfgV0Mask", 0, "Selection bitmask for the V0 particle"}; + Configurable cfgVtxCut{"cfgVtxCut", 10.0f, "Vertex Z range to consider"}; + Configurable isUseCentEst{"isUseCentEst", false, "Centrality based classification"}; + Configurable isUseDataLikeMult{"isUseDataLikeMult", 0, "Data like mult/cent classification"}; + + Configurable cfgTpcMinNclsFound{"cfgTpcMinNclsFound", 50.0f, ""}; + Configurable cfgTpcMinNCrossedRows{"cfgTpcMinNCrossedRows", 70.0f, ""}; + Configurable cfgTpcMaxChi2PerCluster{"cfgTpcMaxChi2PerCluster", 4.0f, ""}; + Configurable cfgTpcMaxDcaZ{"cfgTpcMaxDcaZ", 1.0f, ""}; + + Configurable cfgMftCluster{"cfgMftCluster", 5, "cut on MFT Cluster"}; + Configurable cfgMftDcaxy{"cfgMftDcaxy", 2.0f, "cut on DCA xy for MFT tracks"}; + Configurable cfgMftDcaz{"cfgMftDcaz", 2.0f, "cut on DCA z for MFT tracks"}; + Configurable cfgRejectAmbTrk{"cfgRejectAmbTrk", false, "Condition to reject Ambiguous tracks"}; + Configurable cfgRejectNonAmbTrk{"cfgRejectNonAmbTrk", false, "Condition to reject Non-Ambiguous tracks"}; + } cfgSel; + + struct : ConfigurableGroup { + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 10, 15, 25, 50, 60, 1000}, "multiplicity axis"}; + ConfigurableAxis axisPhi{"axisPhi", {96, 0, TwoPI}, "#phi axis"}; + ConfigurableAxis axisEtaTrig{"axisEtaTrig", {40, -1., 1.}, "#eta trig axis"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt assoc axis for histograms"}; + ConfigurableAxis axisVtxZ{"axisVtxZ", {40, -20, 20}, "vertex axis"}; + ConfigurableAxis axisEtaAssoc{"axisEtaAssoc", {96, 3.5, 4.9}, "#eta assoc axis"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {40, -6, -2}, "delta eta axis for histograms"}; + ConfigurableAxis axisInvMass{"axisInvMass", {VARIABLE_WIDTH, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2.0}, "invariant mass axis"}; + ConfigurableAxis axisInvMassQA{"axisInvMassQA", {20, 0.45, 0.55}, "invariant mass axis for QA"}; + ConfigurableAxis axisAmplitude{"axisAmplitude", {5000, 0, 10000}, "FT0 amplitude"}; + ConfigurableAxis axisChannel{"axisChannel", {208, 0, 208}, "FT0 channel"}; + ConfigurableAxis axisMultME{"axisMultME", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 1000}, "Mixing bins - multiplicity"}; + ConfigurableAxis axisVtxZME{"axisVtxZME", {VARIABLE_WIDTH, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10}, "Mixing bins - z-vertex"}; + + ConfigurableAxis axisTPCNClsFound{"axisTPCNClsFound", {200, -0.5, 199.5}, "TPC Cluster axis"}; + ConfigurableAxis axisTPCNClsCrossedRows{"axisTPCNClsCrossedRows", {200, -0.5, 199.5}, "TPC NCrossedRow axis"}; + ConfigurableAxis axisTPCChi2NCl{"axisTPCChi2NCl", {20, 0.0, 20.0}, "TPC Chi2/NCl axis"}; + ConfigurableAxis axisTPCdcaZ{"axisTPCdcaZ", {200, -10.0, 10.0}, "TPC dcaZ axis"}; + + ConfigurableAxis axisMFTAmbDegree{"axisMFTAmbDegree", {50, -0.5, 49.5}, "Track Ambiguity axis"}; + ConfigurableAxis axisMFTNClusters{"axisMFTNClusters", {200, -0.5, 199.5}, "MFT Cluster axis"}; + ConfigurableAxis axisMFTbestDCAXY{"axisMFTbestDCAXY", {200, -10.0, 10.0}, "MFT dcaXY axis"}; + ConfigurableAxis axisMFTbestDCAZ{"axisMFTbestDCAZ", {200, -10.0, 10.0}, "MFT dcaZ axis"}; + + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {1, 0.5, 8.0}, "pt axis for efficiency histograms"}; + } cfgAxis; Configurable cfgFv0Cut{"cfgFv0Cut", 50.0f, "FV0A threshold"}; Configurable cfgFt0aCut{"cfgFt0aCut", 100.0f, "FT0A threshold"}; @@ -68,26 +113,6 @@ struct LongrangecorrDerived { Configurable cfgZdcCut{"cfgZdcCut", 0.1f, "ZDC threshold"}; Configurable cfgGapSideCut{"cfgGapSideCut", 0, "Gap-side A=0, C=1, AC = 2, No Gap = -1, All events = 3"}; - ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 10, 15, 25, 50, 60, 1000}, "multiplicity axis"}; - ConfigurableAxis axisPhi{"axisPhi", {96, 0, TwoPI}, "#phi axis"}; - ConfigurableAxis axisEtaTrig{"axisEtaTrig", {40, -1., 1.}, "#eta trig axis"}; - ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; - ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt assoc axis for histograms"}; - ConfigurableAxis axisVtxZ{"axisVtxZ", {40, -20, 20}, "vertex axis"}; - ConfigurableAxis axisEtaAssoc{"axisEtaAssoc", {96, 3.5, 4.9}, "#eta assoc axis"}; - ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; - ConfigurableAxis axisDeltaEta{"axisDeltaEta", {40, -6, -2}, "delta eta axis for histograms"}; - ConfigurableAxis axisInvMass{"axisInvMass", {VARIABLE_WIDTH, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2.0}, "invariant mass axis"}; - ConfigurableAxis axisInvMassQA{"axisInvMassQA", {20, 0.45, 0.55}, "invariant mass axis for QA"}; - ConfigurableAxis axisAmplitude{"axisAmplitude", {5000, 0, 10000}, "FT0 amplitude"}; - ConfigurableAxis axisChannel{"axisChannel", {208, 0, 208}, "FT0 channel"}; - ConfigurableAxis axisMultME{"axisMultME", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 1000}, "Mixing bins - multiplicity"}; - ConfigurableAxis axisVtxZME{"axisVtxZME", {VARIABLE_WIDTH, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10}, "Mixing bins - z-vertex"}; - - ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; - ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; - ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; - OutputObj same{"sameEvent"}; OutputObj mixed{"mixedEvent"}; @@ -96,7 +121,6 @@ struct LongrangecorrDerived { using MftTrksTable = aod::LRMftTracks; using Ft0aTrksTable = aod::LRFt0aTracks; using Ft0cTrksTable = aod::LRFt0cTracks; - using MftbestTrksTable = aod::LRMftBestTracks; using V0TrksTable = aod::LRV0Tracks; using McCollsTable = aod::LRMcCollisions; @@ -110,19 +134,16 @@ struct LongrangecorrDerived { using MftTrksUpcTable = aod::UpcLRMftTracks; using Ft0aTrksUpcTable = aod::UpcLRFt0aTracks; using Ft0cTrksUpcTable = aod::UpcLRFt0cTracks; - using MftbestTrksUpcTable = aod::UpcLRMftBestTracks; using V0TrksUpcTable = aod::UpcLRV0Tracks; Preslice perColTpc = aod::lrcorrtrktable::lrCollisionId; Preslice perColMft = aod::lrcorrtrktable::lrCollisionId; - Preslice perColMftbest = aod::lrcorrtrktable::lrCollisionId; Preslice perColFt0a = aod::lrcorrtrktable::lrCollisionId; Preslice perColFt0c = aod::lrcorrtrktable::lrCollisionId; Preslice perColV0 = aod::lrcorrtrktable::lrCollisionId; Preslice perUpcColTpc = aod::lrcorrtrktable::upcLRCollisionId; Preslice perUpcColMft = aod::lrcorrtrktable::upcLRCollisionId; - Preslice perUpcColMftbest = aod::lrcorrtrktable::upcLRCollisionId; Preslice perUpcColFt0a = aod::lrcorrtrktable::upcLRCollisionId; Preslice perUpcColFt0c = aod::lrcorrtrktable::upcLRCollisionId; Preslice perUpcColV0 = aod::lrcorrtrktable::upcLRCollisionId; @@ -134,50 +155,86 @@ struct LongrangecorrDerived { void init(InitContext const&) { - std::vector corrAxis = {{axisVtxZ, "z-vtx (cm)"}, - {axisMultiplicity, "multiplicity"}, - {axisPtTrigger, "p_{T} (GeV/c)"}, - {axisPtAssoc, "p_{T} (GeV/c)"}, - {axisDeltaPhi, "#Delta#varphi (rad)"}, - {axisDeltaEta, "#Delta#eta"}}; - std::vector effAxis = {{axisVertexEfficiency, "z-vtx (cm)"}, - {axisPtEfficiency, "p_{T} (GeV/c)"}, - {axisEtaEfficiency, "#eta"}}; - std::vector userAxis = {{axisInvMass, "m (GeV/c^2)"}}; + std::vector corrAxis = {{cfgAxis.axisVtxZ, "z-vtx (cm)"}, + {cfgAxis.axisMultiplicity, "multiplicity"}, + {cfgAxis.axisPtTrigger, "p_{T} (GeV/c)"}, + {cfgAxis.axisPtAssoc, "p_{T} (GeV/c)"}, + {cfgAxis.axisDeltaPhi, "#Delta#varphi (rad)"}, + {cfgAxis.axisDeltaEta, "#Delta#eta"}}; + std::vector effAxis = {{cfgAxis.axisVertexEfficiency, "z-vtx (cm)"}, + {cfgAxis.axisPtEfficiency, "p_{T} (GeV/c)"}, + {cfgAxis.axisEtaEfficiency, "#eta"}}; + std::vector userAxis = {{cfgAxis.axisInvMass, "m (GeV/c^2)"}}; same.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, userAxis)); mixed.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, userAxis)); - histos.add("hMultiplicity", "hMultiplicity", kTH1D, {axisMultiplicity}); - histos.add("hCentrality", "hCentrality", kTH1D, {axisMultiplicity}); - histos.add("hVertexZ", "hVertexZ", kTH1D, {axisVtxZ}); + histos.add("hMultiplicity", "hMultiplicity", kTH1D, {cfgAxis.axisMultiplicity}); + histos.add("hCentrality", "hCentrality", kTH1D, {cfgAxis.axisMultiplicity}); + histos.add("hVertexZ", "hVertexZ", kTH1D, {cfgAxis.axisVtxZ}); histos.add("hGapSide", "hGapSide", kTH1I, {{5, -0.5, 4.5}}); histos.add("hTrueGapSide", "hTrueGapSide", kTH1I, {{6, -1.5, 4.5}}); histos.add("hTrueGapSide_AfterSel", "hTrueGapSide_AfterSel", kTH1I, {{6, -1.5, 4.5}}); - histos.add("Trig_eta", "Trig_eta", kTH1D, {axisEtaTrig}); - histos.add("Trig_phi", "Trig_phi", kTH1D, {axisPhi}); - histos.add("Trig_etavsphi", "Trig_etavsphi", kTH2D, {axisPhi, axisEtaTrig}); - histos.add("Trig_pt", "Trig_pt", kTH1D, {axisPtTrigger}); - histos.add("Trig_invMass", "Trig_invMass", kTH1D, {axisInvMassQA}); - histos.add("Trig_hist", "Trig_hist", kTHnSparseF, {axisVtxZ, axisMultiplicity, axisPtTrigger, axisInvMass}); - histos.add("Trig_amp", "Trig_amp", kTH1D, {axisAmplitude}); - histos.add("Trig_amp_gaincorrected", "Trig_amp_gaincorrected", kTH1D, {axisAmplitude}); - histos.add("Channel_vs_Trig_amp", "Channel_vs_Trig_amp", kTH2D, {axisChannel, axisAmplitude}); - histos.add("Channel_vs_Trig_amp_gaincorrected", "Channel_vs_Trig_amp_gaincorrected", kTH2D, {axisChannel, axisAmplitude}); - - histos.add("Assoc_eta", "Assoc_eta", kTH1D, {axisEtaAssoc}); - histos.add("Assoc_phi", "Assoc_phi", kTH1D, {axisPhi}); - histos.add("Assoc_etavsphi", "Assoc_etavsphi", kTH2D, {axisPhi, axisEtaAssoc}); - histos.add("Assoc_pt", "Assoc_pt", kTH1D, {axisPtAssoc}); - histos.add("Assoc_amp", "Assoc_amp", kTH1D, {axisAmplitude}); - histos.add("Assoc_amp_gaincorrected", "Assoc_amp_gaincorrected", kTH1D, {axisAmplitude}); - histos.add("Channel_vs_Assoc_amp", "Channel_vs_Assoc_amp", kTH2D, {axisChannel, axisAmplitude}); - histos.add("Channel_vs_Assoc_amp_gaincorrected", "Channel_vs_Assoc_amp_gaincorrected", kTH2D, {axisChannel, axisAmplitude}); - - histos.add("deltaEta_deltaPhi_same", "", kTH2D, {axisDeltaPhi, axisDeltaEta}); - histos.add("deltaEta_deltaPhi_mixed", "", kTH2D, {axisDeltaPhi, axisDeltaEta}); + histos.add("Trig_eta", "Trig_eta", kTH1D, {cfgAxis.axisEtaTrig}); + histos.add("Trig_phi", "Trig_phi", kTH1D, {cfgAxis.axisPhi}); + histos.add("Trig_etavsphi", "Trig_etavsphi", kTH2D, {cfgAxis.axisPhi, cfgAxis.axisEtaTrig}); + histos.add("Trig_pt", "Trig_pt", kTH1D, {cfgAxis.axisPtTrigger}); + histos.add("Trig_invMass", "Trig_invMass", kTH1D, {cfgAxis.axisInvMassQA}); + histos.add("Trig_hist", "Trig_hist", kTHnSparseF, {cfgAxis.axisVtxZ, cfgAxis.axisMultiplicity, cfgAxis.axisPtTrigger, cfgAxis.axisInvMass}); + histos.add("Trig_amp", "Trig_amp", kTH1D, {cfgAxis.axisAmplitude}); + histos.add("Channel_vs_Trig_amp", "Channel_vs_Trig_amp", kTH2D, {cfgAxis.axisChannel, cfgAxis.axisAmplitude}); + + histos.add("Assoc_eta", "Assoc_eta", kTH1D, {cfgAxis.axisEtaAssoc}); + histos.add("Assoc_phi", "Assoc_phi", kTH1D, {cfgAxis.axisPhi}); + histos.add("Assoc_etavsphi", "Assoc_etavsphi", kTH2D, {cfgAxis.axisPhi, cfgAxis.axisEtaAssoc}); + histos.add("Assoc_pt", "Assoc_pt", kTH1D, {cfgAxis.axisPtAssoc}); + histos.add("Assoc_amp", "Assoc_amp", kTH1D, {cfgAxis.axisAmplitude}); + histos.add("Channel_vs_Assoc_amp", "Channel_vs_Assoc_amp", kTH2D, {cfgAxis.axisChannel, cfgAxis.axisAmplitude}); + + histos.add("deltaEta_deltaPhi_same", "deltaEta_deltaPhi_same", kTH2D, {cfgAxis.axisDeltaPhi, cfgAxis.axisDeltaEta}); + histos.add("deltaEta_deltaPhi_mixed", "deltaEta_deltaPhi_mixed", kTH2D, {cfgAxis.axisDeltaPhi, cfgAxis.axisDeltaEta}); + + histos.add("TPCNClsFound", "TPCNClsFound", kTH1D, {cfgAxis.axisTPCNClsFound}); + histos.add("TPCNClsCrossedRows", "TPCNClsCrossedRows", kTH1D, {cfgAxis.axisTPCNClsCrossedRows}); + histos.add("TPCChi2NCl", "TPCChi2NCl", kTH1D, {cfgAxis.axisTPCChi2NCl}); + histos.add("TPCdcaZ", "TPCdcaZ", kTH1D, {cfgAxis.axisTPCdcaZ}); + + histos.add("MFTAmbDegree", "MFTAmbDegree", kTH1D, {cfgAxis.axisMFTAmbDegree}); + histos.add("MFTNClusters", "MFTNClusters", kTH1D, {cfgAxis.axisMFTNClusters}); + histos.add("MFTbestDCAXY", "MFTbestDCAXY", kTH1D, {cfgAxis.axisMFTbestDCAXY}); + histos.add("MFTbestDCAZ", "MFTbestDCAZ", kTH1D, {cfgAxis.axisMFTbestDCAZ}); + } + + template + bool isTrackSelected(TTrack const& track) + { + if constexpr (requires { track.tpcNClsFound(); }) { + if (track.tpcNClsFound() < cfgSel.cfgTpcMinNclsFound) + return false; + if (track.tpcNClsCrossedRows() < cfgSel.cfgTpcMinNCrossedRows) + return false; + if (track.tpcChi2NCl() > cfgSel.cfgTpcMaxChi2PerCluster) + return false; + if (std::abs(track.dcaZ()) > cfgSel.cfgTpcMaxDcaZ) + return false; + return true; + } else if constexpr (requires { track.nClusters(); }) { + if (track.nClusters() < cfgSel.cfgMftCluster) + return false; + if (std::abs(track.bestDCAXY()) >= cfgSel.cfgMftDcaxy) + return false; + if (std::abs(track.bestDCAZ()) >= cfgSel.cfgMftDcaz) + return false; + if (cfgSel.cfgRejectAmbTrk && track.ambDegree() > 1) + return false; + if (cfgSel.cfgRejectNonAmbTrk && track.ambDegree() == 1) + return false; + return true; + } else { + return true; + } } template @@ -199,14 +256,24 @@ struct LongrangecorrDerived { if constexpr (requires { track.channelID(); }) { histos.fill(HIST("Trig_amp"), track.amplitude()); histos.fill(HIST("Channel_vs_Trig_amp"), track.channelID(), track.amplitude()); - histos.fill(HIST("Trig_amp_gaincorrected"), track.gainAmplitude()); - histos.fill(HIST("Channel_vs_Trig_amp_gaincorrected"), track.channelID(), track.gainAmplitude()); } else { histos.fill(HIST("Trig_pt"), track.pt()); } if constexpr (requires { track.invMass(); }) { histos.fill(HIST("Trig_invMass"), track.invMass()); } + if constexpr (requires { track.tpcNClsFound(); }) { + histos.fill(HIST("TPCNClsFound"), track.tpcNClsFound()); + histos.fill(HIST("TPCNClsCrossedRows"), track.tpcNClsCrossedRows()); + histos.fill(HIST("TPCChi2NCl"), track.tpcChi2NCl()); + histos.fill(HIST("TPCdcaZ"), track.dcaZ()); + } + if constexpr (requires { track.nClusters(); }) { + histos.fill(HIST("MFTNClusters"), track.nClusters()); + histos.fill(HIST("MFTbestDCAXY"), track.bestDCAXY()); + histos.fill(HIST("MFTbestDCAZ"), track.bestDCAZ()); + histos.fill(HIST("MFTAmbDegree"), track.ambDegree()); + } } template @@ -218,11 +285,15 @@ struct LongrangecorrDerived { if constexpr (requires { track.channelID(); }) { histos.fill(HIST("Assoc_amp"), track.amplitude()); histos.fill(HIST("Channel_vs_Assoc_amp"), track.channelID(), track.amplitude()); - histos.fill(HIST("Assoc_amp_gaincorrected"), track.gainAmplitude()); - histos.fill(HIST("Channel_vs_Assoc_amp_gaincorrected"), track.channelID(), track.gainAmplitude()); } else { histos.fill(HIST("Assoc_pt"), track.pt()); } + if constexpr (requires { track.nClusters(); }) { + histos.fill(HIST("MFTNClusters"), track.nClusters()); + histos.fill(HIST("MFTbestDCAXY"), track.bestDCAXY()); + histos.fill(HIST("MFTbestDCAZ"), track.bestDCAZ()); + histos.fill(HIST("MFTAmbDegree"), track.ambDegree()); + } } template @@ -249,25 +320,26 @@ struct LongrangecorrDerived { for (auto const& triggerTrack : triggers) { auto trigAmpl = 1.0f; if constexpr (requires { triggerTrack.channelID(); }) { - if (useGainCorr) - trigAmpl = triggerTrack.gainAmplitude(); - else - trigAmpl = triggerTrack.amplitude(); + trigAmpl = triggerTrack.amplitude(); } else { trigAmpl = 1.0; } + + if (!isTrackSelected(triggerTrack)) + continue; + if constexpr (requires { triggerTrack.trackType(); }) { - if (cfgPidMask != 0 && (cfgPidMask & (1u << static_cast(triggerTrack.trackType()))) == 0u) + if (cfgSel.cfgPidMask != 0 && (cfgSel.cfgPidMask & (1u << static_cast(triggerTrack.trackType()))) == 0u) continue; } else if constexpr (requires { triggerTrack.v0Type(); }) { - if (cfgV0Mask != 0 && (cfgV0Mask & (1u << static_cast(triggerTrack.v0Type()))) == 0u) + if (cfgSel.cfgV0Mask != 0 && (cfgSel.cfgV0Mask & (1u << static_cast(triggerTrack.v0Type()))) == 0u) continue; } if (!mixing) { fillTrigTrackQA(triggerTrack); if constexpr (requires { triggerTrack.channelID(); }) { histos.fill(HIST("Trig_hist"), vz, multiplicity, 1.0, 1.0, eventWeight * trigAmpl); - } else if constexpr (requires { triggerTrack.v0Type(); }) { + } else if constexpr (requires { triggerTrack.invMass(); }) { histos.fill(HIST("Trig_hist"), vz, multiplicity, triggerTrack.pt(), triggerTrack.invMass(), eventWeight * trigAmpl); } else { histos.fill(HIST("Trig_hist"), vz, multiplicity, triggerTrack.pt(), 1.0, eventWeight * trigAmpl); @@ -275,14 +347,15 @@ struct LongrangecorrDerived { } for (auto const& assoTrack : assocs) { auto assoAmpl = 1.0f; - if constexpr (requires { assoTrack.v0Type(); }) { - if (useGainCorr) - assoAmpl = assoTrack.gainAmplitude(); - else - assoAmpl = assoTrack.amplitude(); + if constexpr (requires { assoTrack.channelID(); }) { + assoAmpl = assoTrack.amplitude(); } else { assoAmpl = 1.0f; } + + if (!isTrackSelected(assoTrack)) + continue; + float deltaPhi = RecoDecay::constrainAngle(triggerTrack.phi() - assoTrack.phi(), -PIHalf); float deltaEta = triggerTrack.eta() - assoTrack.eta(); if (!mixing) { @@ -305,13 +378,13 @@ struct LongrangecorrDerived { template void processSame(TCollision const& col, TTriggers const& triggers, TAssocs const& assocs) { - if (std::abs(col.posZ()) >= cfgVtxCut) { + if (std::abs(col.posZ()) >= cfgSel.cfgVtxCut) { return; } fillCollQA(col); auto multiplicity = 1.0f; if constexpr (requires { col.centrality(); }) { - if (isUseCentEst) + if (cfgSel.isUseCentEst) multiplicity = col.centrality(); else multiplicity = col.multiplicity(); @@ -334,7 +407,7 @@ struct LongrangecorrDerived { } auto multiplicity = 1.0f; if constexpr (requires { col.centrality(); }) { - if (isUseCentEst) + if (cfgSel.isUseCentEst) multiplicity = col.centrality(); else multiplicity = col.multiplicity(); @@ -344,11 +417,11 @@ struct LongrangecorrDerived { return multiplicity; }; using MixedBinning = FlexibleBinningPolicy, aod::collision::PosZ, decltype(getMultiplicity)>; - MixedBinning binningOnVtxAndMult{{getMultiplicity}, {axisVtxZME, axisMultME}, true}; + MixedBinning binningOnVtxAndMult{{getMultiplicity}, {cfgAxis.axisVtxZME, cfgAxis.axisMultME}, true}; auto tracksTuple = std::make_tuple(std::forward(tracks)...); using TupleAtrack = std::tuple_element<0, decltype(tracksTuple)>::type; using TupleBtrack = std::tuple_element - 1, decltype(tracksTuple)>::type; - Pair pairs{binningOnVtxAndMult, cfgNmixedevent, -1, cols, tracksTuple, &cache}; + Pair pairs{binningOnVtxAndMult, cfgSel.cfgNmixedevent, -1, cols, tracksTuple, &cache}; for (auto it = pairs.begin(); it != pairs.end(); it++) { auto& [col1, tracks1, col2, tracks2] = *it; if constexpr (requires { col1.gapSide(); } || requires { col2.gapSide(); }) { @@ -365,14 +438,14 @@ struct LongrangecorrDerived { template void processMcSame(McCollsTable::iterator const& mccollision, soa::SmallGroups const& collisions, TTriggers const& triggers, TAssocs const& assocs) { - if (std::abs(mccollision.posZ()) >= cfgVtxCut) { + if (std::abs(mccollision.posZ()) >= cfgSel.cfgVtxCut) { return; } fillCollQA(mccollision); auto multiplicity = mccollision.multiplicity(); - if (isUseDataLikeMult > 0) { + if (cfgSel.isUseDataLikeMult > 0) { for (const auto& collision : collisions) { - if (isUseCentEst) + if (cfgSel.isUseCentEst) multiplicity = collision.centrality(); else multiplicity = collision.multiplicity(); @@ -384,7 +457,7 @@ struct LongrangecorrDerived { template void processMcMixed(McCollsTable const& mccollisions, aod::LRCollisionsWithLabel const& collisions, TrackTypes&&... tracks) { - bool useMCMultiplicity = (isUseDataLikeMult == 0); + bool useMCMultiplicity = (cfgSel.isUseDataLikeMult == 0); auto getMultiplicity = [&collisions, &useMCMultiplicity, this](auto& col) { if (useMCMultiplicity) @@ -392,18 +465,18 @@ struct LongrangecorrDerived { auto groupedCollisions = collisions.sliceByCached(aod::lrcorrcolltable::lrMcCollisionId, col.globalIndex(), this->cache); if (groupedCollisions.size() == 0) return -1.0f; - if (isUseCentEst) + if (cfgSel.isUseCentEst) return groupedCollisions.begin().centrality(); else return groupedCollisions.begin().multiplicity(); }; using MixedBinning = FlexibleBinningPolicy, aod::mccollision::PosZ, decltype(getMultiplicity)>; - MixedBinning binningOnVtxAndMult{{getMultiplicity}, {axisVtxZME, axisMultME}, true}; + MixedBinning binningOnVtxAndMult{{getMultiplicity}, {cfgAxis.axisVtxZME, cfgAxis.axisMultME}, true}; auto tracksTuple = std::make_tuple(std::forward(tracks)...); using TupleAtrack = std::tuple_element<0, decltype(tracksTuple)>::type; using TupleBtrack = std::tuple_element - 1, decltype(tracksTuple)>::type; - Pair pairs{binningOnVtxAndMult, cfgNmixedevent, -1, mccollisions, tracksTuple, &cache}; + Pair pairs{binningOnVtxAndMult, cfgSel.cfgNmixedevent, -1, mccollisions, tracksTuple, &cache}; for (auto it = pairs.begin(); it != pairs.end(); it++) { auto& [col1, tracks1, col2, tracks2] = *it; float eventweight = 1.0f / it.currentWindowNeighbours(); @@ -442,21 +515,6 @@ struct LongrangecorrDerived { processSame(col, tracks, mfts); } - void processTpcmftbestSE(CollsTable::iterator const& col, TrksTable const& tracks, MftbestTrksTable const& mfts) - { - processSame(col, tracks, mfts); - } - - void processMftbestft0aSE(CollsTable::iterator const& col, MftbestTrksTable const& mfts, Ft0aTrksTable const& ft0as) - { - processSame(col, mfts, ft0as); - } - - void processV0mftbestSE(CollsTable::iterator const& col, V0TrksTable const& tracks, MftbestTrksTable const& mfts) - { - processSame(col, tracks, mfts); - } - void processFt0aft0cSE(CollsTable::iterator const& col, Ft0aTrksTable const& ft0as, Ft0cTrksTable const& ft0cs) { processSame(col, ft0as, ft0cs); @@ -492,21 +550,6 @@ struct LongrangecorrDerived { processMixed(cols, tracks, mfts); } - void processTpcmftbestME(CollsTable const& cols, TrksTable const& tracks, MftbestTrksTable const& mfts) - { - processMixed(cols, tracks, mfts); - } - - void processMftbestft0aME(CollsTable const& cols, MftbestTrksTable const& mfts, Ft0aTrksTable const& ft0as) - { - processMixed(cols, mfts, ft0as); - } - - void processV0mftbestME(CollsTable const& cols, V0TrksTable const& tracks, MftbestTrksTable const& mfts) - { - processMixed(cols, tracks, mfts); - } - void processFt0aft0cME(CollsTable const& cols, Ft0aTrksTable const& ft0as, Ft0cTrksTable const& ft0cs) { processMixed(cols, ft0as, ft0cs); @@ -560,30 +603,6 @@ struct LongrangecorrDerived { processSame(col, tracks, mfts); } - void processUpcTpcmftbestSE(UpcCollsTable::iterator const& col, TrksUpcTable const& tracks, MftbestTrksUpcTable const& mfts) - { - if (!isUpcEventSelected(col)) { - return; - } - processSame(col, tracks, mfts); - } - - void processUpcMftbestft0aSE(UpcCollsTable::iterator const& col, MftbestTrksUpcTable const& mfts, Ft0aTrksUpcTable const& ft0as) - { - if (!isUpcEventSelected(col)) { - return; - } - processSame(col, mfts, ft0as); - } - - void processUpcV0mftbestSE(UpcCollsTable::iterator const& col, V0TrksUpcTable const& tracks, MftbestTrksUpcTable const& mfts) - { - if (!isUpcEventSelected(col)) { - return; - } - processSame(col, tracks, mfts); - } - void processUpcTpcft0aME(UpcCollsTable const& cols, TrksUpcTable const& tracks, Ft0aTrksUpcTable const& ft0as) { processMixed(cols, tracks, ft0as); @@ -614,21 +633,6 @@ struct LongrangecorrDerived { processMixed(cols, tracks, mfts); } - void processUpcTpcmftbestME(UpcCollsTable const& cols, TrksUpcTable const& tracks, MftbestTrksUpcTable const& mfts) - { - processMixed(cols, tracks, mfts); - } - - void processUpcMftbestft0aME(UpcCollsTable const& cols, MftbestTrksUpcTable const& mfts, Ft0aTrksUpcTable const& ft0as) - { - processMixed(cols, mfts, ft0as); - } - - void processUpcV0mftbestME(UpcCollsTable const& cols, V0TrksUpcTable const& tracks, MftbestTrksUpcTable const& mfts) - { - processMixed(cols, tracks, mfts); - } - void processMcTpcft0aSE(McCollsTable::iterator const& mccollision, soa::SmallGroups const& collisions, McTrksTable const& tracks, McFt0aTrksTable const& ft0as) { processMcSame(mccollision, collisions, tracks, ft0as); @@ -691,12 +695,6 @@ struct LongrangecorrDerived { PROCESS_SWITCH(LongrangecorrDerived, processV0ft0aME, "mixed event V0 vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processV0mftSE, "same event V0 vs MFT", false); PROCESS_SWITCH(LongrangecorrDerived, processV0mftME, "mixed event V0 vs MFT", false); - PROCESS_SWITCH(LongrangecorrDerived, processTpcmftbestSE, "same event TPC vs best MFT", false); - PROCESS_SWITCH(LongrangecorrDerived, processTpcmftbestME, "mixed event TPC vs best MFT", false); - PROCESS_SWITCH(LongrangecorrDerived, processMftbestft0aSE, "same event best MFT vs FT0A", false); - PROCESS_SWITCH(LongrangecorrDerived, processMftbestft0aME, "mixed event best MFT vs FT0A", false); - PROCESS_SWITCH(LongrangecorrDerived, processV0mftbestSE, "same event V0 vs best MFT", false); - PROCESS_SWITCH(LongrangecorrDerived, processV0mftbestME, "mixed event V0 vs best MFT", false); PROCESS_SWITCH(LongrangecorrDerived, processFt0aft0cSE, "same event FT0A vs FT0C", false); PROCESS_SWITCH(LongrangecorrDerived, processFt0aft0cME, "mixed event FT0A vs FT0C", false); PROCESS_SWITCH(LongrangecorrDerived, processUpcTpcft0aSE, "same UPC event TPC vs FT0A", false); @@ -711,12 +709,6 @@ struct LongrangecorrDerived { PROCESS_SWITCH(LongrangecorrDerived, processUpcV0ft0aME, "mixed UPC event V0 vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processUpcV0mftSE, "same UPC event V0 vs MFT", false); PROCESS_SWITCH(LongrangecorrDerived, processUpcV0mftME, "mixed UPC event V0 vs MFT", false); - PROCESS_SWITCH(LongrangecorrDerived, processUpcTpcmftbestSE, "same UPC event TPC vs best MFT", false); - PROCESS_SWITCH(LongrangecorrDerived, processUpcTpcmftbestME, "mixed UPC event TPC vs best MFT", false); - PROCESS_SWITCH(LongrangecorrDerived, processUpcMftbestft0aSE, "same UPC event best MFT vs FT0A", false); - PROCESS_SWITCH(LongrangecorrDerived, processUpcMftbestft0aME, "mixed UPC event best MFT vs FT0A", false); - PROCESS_SWITCH(LongrangecorrDerived, processUpcV0mftbestSE, "same UPC event V0 vs best MFT", false); - PROCESS_SWITCH(LongrangecorrDerived, processUpcV0mftbestME, "mixed UPC event V0 vs best MFT", false); PROCESS_SWITCH(LongrangecorrDerived, processMcTpcft0aSE, "same MC event TPC vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processMcTpcft0aME, "mixed MC event TPC vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processMcTpcft0cSE, "same MC event TPC vs FT0C", false);