diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index f999af41b0e..bcc8a1ba788 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -4113,6 +4113,17 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("eventStandardSel8PbPbQualityCent90")) { + cut->AddCut(VarManager::kVtxZ, -10.0, 10.0); + cut->AddCut(VarManager::kIsSel8, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoTFBorder, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoITSROFBorder, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoSameBunch, 0.5, 1.5); + cut->AddCut(VarManager::kIsGoodZvtxFT0vsPV, 0.5, 1.5); + cut->AddCut(VarManager::kCentFT0C, 0.0, 90.0); + return cut; + } + if (!nameStr.compare("eventStandardSel8PbPbQualityGoodITSLayersAll")) { // kIsSel8 = kIsTriggerTVX && kNoITSROFrameBorder && kNoTimeFrameBorder cut->AddCut(VarManager::kVtxZ, -10.0, 10.0); cut->AddCut(VarManager::kIsSel8, 0.5, 1.5); @@ -4676,6 +4687,15 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("acceptance_PbPb5360_y08")) { + cut->AddCut(VarManager::kMCY, -0.8, 0.8); + cut->AddCut(VarManager::kMCP1, 1.0, 1000.0); + cut->AddCut(VarManager::kMCP2, 1.0, 1000.0); + cut->AddCut(VarManager::kMCEta1, -0.8, 0.8); + cut->AddCut(VarManager::kMCEta2, -0.8, 0.8); + return cut; + } + // --------------------------------------------------- // MC generated particle acceptance cuts diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 33846186632..098f5a7df10 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1361,6 +1361,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h } } if (subGroupStr.Contains("globalpolarization")) { + hm->AddHistogram(histClass, "RandomPlaneAngle", "", false, 100, -TMath::Pi() / 2, TMath::Pi() / 2, VarManager::kRandomPsi2); hm->AddHistogram(histClass, "CosThetaStarRandom", "", false, 100, -1.0, 1.0, VarManager::kCosThetaStarRandom); hm->AddHistogram(histClass, "Cos2ThetaStarRandom_Mass", "", true, 50, 2.0, 4.0, VarManager::kMass, 100, -1.0, 1.0, VarManager::kCos2ThetaStarRandom); if (subGroupStr.Contains("tpc")) { diff --git a/PWGDQ/DataModel/ReducedInfoTables.h b/PWGDQ/DataModel/ReducedInfoTables.h index 71a15a1ddbd..be60adab101 100644 --- a/PWGDQ/DataModel/ReducedInfoTables.h +++ b/PWGDQ/DataModel/ReducedInfoTables.h @@ -152,6 +152,11 @@ DECLARE_SOA_COLUMN(CORR4REF, corr4ref, float); //! Ref Flow correla DECLARE_SOA_COLUMN(M11REF, m11ref, float); //! Weighted multiplicity of <<2>> for reference flow DECLARE_SOA_COLUMN(M1111REF, m1111ref, float); //! Weighted multiplicity of <<4>> for reference flow DECLARE_SOA_COLUMN(M11REFetagap, m11refetagap, float); //! Weighted multiplicity of <<2>> etagap for reference flow + +DECLARE_SOA_COLUMN(Psi2Random, psi2random, float); //! Event plane angle from random subevent +DECLARE_SOA_COLUMN(Psi2A, psi2a, float); //! Event plane angle from Q-vector A +DECLARE_SOA_COLUMN(Psi2B, psi2b, float); //! Event plane angle from Q-vector B +DECLARE_SOA_COLUMN(Psi2C, psi2c, float); //! Event plane angle from Q-vector C } // namespace reducedevent DECLARE_SOA_TABLE_STAGED(ReducedEvents, "REDUCEDEVENT", //! Main event information table @@ -993,6 +998,9 @@ DECLARE_SOA_TABLE(DileptonsPolarization, "AOD", "RTDILPOLAR", //! reducedpair::CosThetaRM, reducedpair::CosThetaStarTPC, reducedpair::CosThetaStarFT0A, reducedpair::CosThetaStarFT0C); +DECLARE_SOA_TABLE(DileptonsEventInfo, "AOD", "RTDILEVENTINFO", //! + cent::CentFT0C, collision::PosZ, collision::NumContrib, reducedevent::Psi2Random, reducedevent::Psi2A, reducedevent::Psi2B, reducedevent::Psi2C); + using Dielectron = Dielectrons::iterator; using StoredDielectron = StoredDielectrons::iterator; using Dimuon = Dimuons::iterator; @@ -1007,6 +1015,7 @@ using DileptonMiniTree = DileptonsMiniTree::iterator; using DileptonMiniTreeGen = DileptonsMiniTreeGen::iterator; using DileptonMiniTreeRec = DileptonsMiniTreeRec::iterator; using DileptonPolarization = DileptonsPolarization::iterator; +using DileptonEventInfo = DileptonsEventInfo::iterator; // Tables for using analysis-dilepton-track with analysis-asymmetric-pairing DECLARE_SOA_TABLE(Ditracks, "AOD", "RTDITRACK", //! diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index ebeb6b0399a..4ea4e79e70e 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -2005,23 +2005,46 @@ struct AnalysisSameEventPairing { uint32_t mcDecision = static_cast(0); bool isCorrectAssoc_leg1 = false; bool isCorrectAssoc_leg2 = false; - dielectronList.reserve(1); - dimuonList.reserve(1); - dielectronsExtraList.reserve(1); - dimuonsExtraList.reserve(1); - dielectronInfoList.reserve(1); - dileptonInfoList.reserve(1); + + // estimate reserved size + int64_t reserveSize = 0; + for (auto& event : events) { + if (event.isEventSelected_bit(0)) { + auto groupedAssocs = assocs.sliceBy(preslice, event.globalIndex()); + size_t nGood = 0; + for (auto const& t : groupedAssocs) { + if constexpr (TPairType == VarManager::kDecayToEE) { + if (t.isBarrelSelected_raw()) { + nGood++; + } + } else if constexpr (TPairType == VarManager::kDecayToMuMu) { + if (t.isMuonSelected_raw()) { + nGood++; + } + } + } + reserveSize += nGood * (nGood - 1) / 2; + } + } + + dielectronList.reserve(reserveSize); + dimuonList.reserve(reserveSize); + dielectronsExtraList.reserve(reserveSize); + dimuonsExtraList.reserve(reserveSize); + dielectronInfoList.reserve(reserveSize); + dileptonInfoList.reserve(reserveSize); if (fConfigOptions.flatTables.value) { - dielectronAllList.reserve(1); - dimuonAllList.reserve(1); + dielectronAllList.reserve(reserveSize); + dimuonAllList.reserve(reserveSize); } if (useMiniTree.fConfigMiniTree) { - dileptonMiniTreeGen.reserve(1); - dileptonMiniTreeRec.reserve(1); + dileptonMiniTreeGen.reserve(reserveSize); + dileptonMiniTreeRec.reserve(reserveSize); } if (fConfigOptions.polarTables.value) { - dileptonPolarList.reserve(1); + dileptonPolarList.reserve(reserveSize); } + constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0); constexpr bool trackHasCov = ((TTrackFillMap & VarManager::ObjTypes::ReducedTrackBarrelCov) > 0); diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx index 3113e45f191..5a437d6f091 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx @@ -1669,20 +1669,41 @@ struct AnalysisSameEventPairing { uint32_t mcDecision = static_cast(0); bool isCorrectAssoc_leg1 = false; bool isCorrectAssoc_leg2 = false; - dielectronList.reserve(1); - // dimuonList.reserve(1); - dielectronsExtraList.reserve(1); - // dimuonsExtraList.reserve(1); - dielectronInfoList.reserve(1); - dileptonInfoList.reserve(1); + + // estimate reserved size + int64_t reserveSize = 0; + for (auto& event : events) { + if (event.isEventSelected_bit(0)) { + auto groupedAssocs = assocs.sliceBy(preslice, event.globalIndex()); + size_t nGood = 0; + for (auto const& t : groupedAssocs) { + if constexpr (TPairType == VarManager::kDecayToEE) { + if (t.isBarrelSelected_raw()) { + nGood++; + } + } + /*else if constexpr (TPairType == VarManager::kDecayToMuMu) { + if (t.isMuonSelected_raw()) { + nGood++; + } + }*/ + } + reserveSize += nGood * (nGood - 1) / 2; + } + } + + dielectronList.reserve(reserveSize); + dielectronsExtraList.reserve(reserveSize); + dielectronInfoList.reserve(reserveSize); + dileptonInfoList.reserve(reserveSize); if (fConfigOptions.flatTables.value) { - dielectronAllList.reserve(1); - // dimuonAllList.reserve(1); + dielectronAllList.reserve(reserveSize); } if (fConfigOptions.fConfigMiniTree) { - dileptonMiniTreeGen.reserve(1); - dileptonMiniTreeRec.reserve(1); + dileptonMiniTreeGen.reserve(reserveSize); + dileptonMiniTreeRec.reserve(reserveSize); } + constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0); constexpr bool trackHasCov = ((TTrackFillMap & VarManager::ObjTypes::TrackCov) > 0); diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 0b916cef236..0c099b65eaa 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1298,6 +1298,7 @@ struct AnalysisSameEventPairing { Produces dileptonInfoList; Produces PromptNonPromptSepTable; Produces dileptonPolarList; + Produces dileptonEventInfoList; o2::base::MatLayerCylSet* fLUT = nullptr; int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. @@ -1399,7 +1400,7 @@ struct AnalysisSameEventPairing { void init(o2::framework::InitContext& context) { - fEnableBarrelHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processBarrelOnlySkimmed") || context.mOptions.get("processBarrelOnlyWithCollSkimmed") || context.mOptions.get("processBarrelOnlySkimmedNoCov") || context.mOptions.get("processBarrelOnlySkimmedNoCovWithMultExtra") || context.mOptions.get("processBarrelOnlyWithQvectorCentrSkimmedNoCov"); + fEnableBarrelHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processBarrelOnlySkimmed") || context.mOptions.get("processBarrelOnlyWithCollSkimmed") || context.mOptions.get("processBarrelOnlySkimmedNoCov") || context.mOptions.get("processBarrelOnlySkimmedNoCovWithMultExtra") || context.mOptions.get("processBarrelOnlyWithQvectorCentrSkimmedNoCov") || context.mOptions.get("processBarrelOnlyWithQvectorCentrSkimmed"); fEnableBarrelMixingHistos = context.mOptions.get("processMixingAllSkimmed") || context.mOptions.get("processMixingBarrelSkimmed") || context.mOptions.get("processMixingBarrelSkimmedFlow") || context.mOptions.get("processMixingBarrelWithQvectorCentrSkimmedNoCov"); fEnableBarrelMixingHistos |= fConfigRunMixingAcrossTFs; fEnableMuonHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processMuonOnlySkimmed") || context.mOptions.get("processMuonOnlySkimmedMultExtra") || context.mOptions.get("processMuonOnlySkimmedFlow"); @@ -1828,21 +1829,43 @@ struct AnalysisSameEventPairing { // Reserve capacity for the output tables to avoid repeated reallocations // inside the Arrow builders. Unused capacity is virtual address space // only — pages are not faulted in until written. - auto nAssocs = assocs.size(); - dielectronList.reserve(nAssocs); - dimuonList.reserve(nAssocs); - dielectronsExtraList.reserve(nAssocs); - dielectronInfoList.reserve(nAssocs); - dimuonsExtraList.reserve(nAssocs); - dileptonInfoList.reserve(nAssocs); - dileptonFlowList.reserve(nAssocs); + // estimate reserved size + int64_t reserveSize = 0; + for (auto& event : events) { + if (event.isEventSelected_bit(0)) { + auto groupedAssocs = assocs.sliceBy(preslice, event.globalIndex()); + size_t nGood = 0; + for (auto const& t : groupedAssocs) { + if constexpr (TPairType == VarManager::kDecayToEE) { + if (t.isBarrelSelected_raw()) { + nGood++; + } + } else if constexpr (TPairType == VarManager::kDecayToMuMu) { + if (t.isMuonSelected_raw()) { + nGood++; + } + } + } + reserveSize += nGood * (nGood - 1) / 2; + } + } + + dielectronList.reserve(reserveSize); + dimuonList.reserve(reserveSize); + dielectronsExtraList.reserve(reserveSize); + dielectronInfoList.reserve(reserveSize); + dimuonsExtraList.reserve(reserveSize); + dileptonInfoList.reserve(reserveSize); + dileptonFlowList.reserve(reserveSize); if (fConfigOptions.flatTables.value) { - dielectronAllList.reserve(nAssocs); - dimuonAllList.reserve(nAssocs); + dielectronAllList.reserve(reserveSize); + dimuonAllList.reserve(reserveSize); } if (fConfigOptions.polarTables.value) { - dileptonPolarList.reserve(nAssocs); + dileptonPolarList.reserve(reserveSize); + dileptonEventInfoList.reserve(reserveSize); } + fAmbiguousPairs.clear(); constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0); constexpr bool eventHasQvectorCentr = ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0); @@ -1930,6 +1953,7 @@ struct AnalysisSameEventPairing { VarManager::fgValues[VarManager::kCosThetaPP], VarManager::fgValues[VarManager::kPhiPP], VarManager::fgValues[VarManager::kPhiTildePP], VarManager::fgValues[VarManager::kCosThetaRM], VarManager::fgValues[VarManager::kCosThetaStarTPC], VarManager::fgValues[VarManager::kCosThetaStarFT0A], VarManager::fgValues[VarManager::kCosThetaStarFT0C]); + dileptonEventInfoList(VarManager::fgValues[VarManager::kCentFT0C], VarManager::fgValues[VarManager::kVtxZ], VarManager::fgValues[VarManager::kVtxNcontrib], VarManager::fgValues[VarManager::kRandomPsi2], VarManager::fgValues[VarManager::kPsi2A], VarManager::fgValues[VarManager::kPsi2B], VarManager::fgValues[VarManager::kPsi2C]); } if constexpr (trackHasCov && TTwoProngFitter) { dielectronsExtraList(t1.globalIndex(), t2.globalIndex(), VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]); @@ -2762,6 +2786,13 @@ struct AnalysisSameEventPairing { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks); } + void processBarrelOnlyWithQvectorCentrSkimmed(MyEventsQvectorCentrSelected const& events, + soa::Join const& barrelAssocs, + MyBarrelTracksWithCovWithAmbiguities const& barrelTracks) + { + runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks); + } + void processMuonOnlySkimmed(MyEventsVtxCovSelected const& events, soa::Join const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons) { @@ -2843,6 +2874,7 @@ struct AnalysisSameEventPairing { PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlySkimmedNoCov, "Run barrel only pairing (no covariances), with skimmed tracks and with collision information", false); PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlySkimmedNoCovWithMultExtra, "Run barrel only pairing (no covariances), with skimmed tracks, with collision information, with MultsExtra", false); PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlyWithQvectorCentrSkimmedNoCov, "Run barrel only pairing (no covariances), with skimmed tracks, with Qvector from central framework", false); + PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlyWithQvectorCentrSkimmed, "Run barrel only pairing (no covariances), with skimmed tracks, with collision information, with Qvector from central framework", false); PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlySkimmedFlow, "Run barrel only pairing, with skimmed tracks and with flow", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmed, "Run muon only pairing, with skimmed tracks", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmedMultExtra, "Run muon only pairing, with skimmed tracks", false); diff --git a/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx b/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx index 39814f73fa8..13e6b82c889 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx @@ -1637,16 +1637,29 @@ struct AnalysisSameEventPairing { int sign1 = 0; int sign2 = 0; - dielectronList.reserve(1); - // dimuonList.reserve(1); - dielectronsExtraList.reserve(1); - // dimuonsExtraList.reserve(1); - dielectronInfoList.reserve(1); - dileptonInfoList.reserve(1); + // estimate reserved size + int64_t reserveSize = 0; + for (auto& event : events) { + if (event.isEventSelected_bit(0)) { + auto groupedAssocs = assocs.sliceBy(preslice, event.globalIndex()); + size_t nGood = 0; + for (auto const& t : groupedAssocs) { + if constexpr (TPairType == VarManager::kDecayToEE) { + if (t.isBarrelSelected_raw()) { + nGood++; + } + } + } + reserveSize += nGood * (nGood - 1) / 2; + } + } + dielectronList.reserve(reserveSize); + dielectronsExtraList.reserve(reserveSize); + dielectronInfoList.reserve(reserveSize); + dileptonInfoList.reserve(reserveSize); if (fConfigOptions.flatTables.value) { - dielectronAllList.reserve(1); - // dimuonAllList.reserve(1); + dielectronAllList.reserve(reserveSize); } constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0);