Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions PWGDQ/Core/CutsLibrary.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -4113,6 +4113,17 @@
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);
Expand Down Expand Up @@ -4676,6 +4687,15 @@
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

Expand Down Expand Up @@ -5861,7 +5881,7 @@
if (icase == 0) {
cut->AddCut(VarManager::kTPCnSigmaEl, -4., 4., false, VarManager::kPin, 0.0, 1e+10, false);
cut->AddCut(VarManager::kTPCnSigmaPi, -99., 2.5, true, VarManager::kPin, 0.0, 1e+10, false);
} else if (icase == 1 || icase == 2) {

Check failure on line 5884 in PWGDQ/Core/CutsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[magic-number]

Avoid magic numbers in expressions. Assign the value to a clearly named variable or constant.
cut->AddCut(VarManager::kTPCnSigmaEl_Corr, -4., 4., false, VarManager::kPin, 0.0, 1e+10, false);
cut->AddCut(VarManager::kTPCnSigmaPi_Corr, -99., 2.5, true, VarManager::kPin, 0.0, 1e+10, false);
}
Expand Down
1 change: 1 addition & 0 deletions PWGDQ/Core/HistogramsLibrary.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -1361,6 +1361,7 @@
}
}
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")) {
Expand Down Expand Up @@ -2438,7 +2439,7 @@
LOG(fatal) << "histClass field should be an array of strings, e.g. [class1, class2]";
return false;
}
for (auto& v : hist->FindMember("histClass")->value.GetArray()) {

Check failure on line 2442 in PWGDQ/Core/HistogramsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
if (!v.IsString()) {
LOG(fatal) << "histClass field should be an array of strings, e.g. [class1, class2]";
return false;
Expand Down Expand Up @@ -2594,7 +2595,7 @@
}
}
if (isTHn) {
for (auto& v : hist->FindMember("vars")->value.GetArray()) {

Check failure on line 2598 in PWGDQ/Core/HistogramsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
if (VarManager::fgVarNamesMap.find(v.GetString()) == VarManager::fgVarNamesMap.end()) {
LOG(fatal) << "Bad variable in vars (" << v.GetString() << ") specified for histogram";
return false;
Expand Down Expand Up @@ -2657,7 +2658,7 @@

// create an array of strings to store the different histogram classes
std::vector<const char*> histClasses;
for (auto& v : hist.FindMember("histClass")->value.GetArray()) {

Check failure on line 2661 in PWGDQ/Core/HistogramsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
histClasses.push_back(v.GetString());
}
const char* title = hist.FindMember("title")->value.GetString();
Expand All @@ -2668,7 +2669,7 @@

int* vars = new int[nDimensions];
int iDim = 0;
for (auto& v : hist.FindMember("vars")->value.GetArray()) {

Check failure on line 2672 in PWGDQ/Core/HistogramsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
LOG(debug) << "iDim " << iDim << ": " << v.GetString();
vars[iDim++] = VarManager::fgVarNamesMap[v.GetString()];
}
Expand All @@ -2682,27 +2683,27 @@
xmin = new double[nDimensions];
xmax = new double[nDimensions];
int iDim = 0;
for (auto& v : hist.FindMember("nBins")->value.GetArray()) {

Check failure on line 2686 in PWGDQ/Core/HistogramsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
nBins[iDim++] = v.GetInt();
LOG(debug) << "nBins " << iDim << ": " << nBins[iDim - 1];
}
iDim = 0;
for (auto& v : hist.FindMember("xmin")->value.GetArray()) {

Check failure on line 2691 in PWGDQ/Core/HistogramsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
xmin[iDim++] = v.GetDouble();
LOG(debug) << "xmin " << iDim << ": " << xmin[iDim - 1];
}
iDim = 0;
for (auto& v : hist.FindMember("xmax")->value.GetArray()) {

Check failure on line 2696 in PWGDQ/Core/HistogramsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
xmax[iDim++] = v.GetDouble();
LOG(debug) << "xmax " << iDim << ": " << xmax[iDim - 1];
}
} else {
int iDim = 0;
binLimits = new TArrayD[nDimensions];
for (auto& v : hist.FindMember("binLimits")->value.GetArray()) {

Check failure on line 2703 in PWGDQ/Core/HistogramsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
double* lims = new double[v.GetArray().Size()];
int iElem = 0;
for (auto& lim : v.GetArray()) {

Check failure on line 2706 in PWGDQ/Core/HistogramsLibrary.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
lims[iElem++] = lim.GetDouble();
}
binLimits[iDim++] = TArrayD(v.GetArray().Size(), lims);
Expand Down
9 changes: 9 additions & 0 deletions PWGDQ/DataModel/ReducedInfoTables.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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", //!
Expand Down
45 changes: 34 additions & 11 deletions PWGDQ/Tasks/dqEfficiency_withAssoc.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -2005,23 +2005,46 @@ struct AnalysisSameEventPairing {
uint32_t mcDecision = static_cast<uint32_t>(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);

Expand Down
41 changes: 31 additions & 10 deletions PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -1669,20 +1669,41 @@ struct AnalysisSameEventPairing {
uint32_t mcDecision = static_cast<uint32_t>(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);

Expand Down
56 changes: 44 additions & 12 deletions PWGDQ/Tasks/tableReader_withAssoc.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -1298,6 +1298,7 @@ struct AnalysisSameEventPairing {
Produces<aod::DileptonsInfo> dileptonInfoList;
Produces<aod::JPsieeCandidates> PromptNonPromptSepTable;
Produces<aod::DileptonPolarization> dileptonPolarList;
Produces<aod::DileptonsEventInfo> dileptonEventInfoList;

o2::base::MatLayerCylSet* fLUT = nullptr;
int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc.
Expand Down Expand Up @@ -1399,7 +1400,7 @@ struct AnalysisSameEventPairing {

void init(o2::framework::InitContext& context)
{
fEnableBarrelHistos = context.mOptions.get<bool>("processAllSkimmed") || context.mOptions.get<bool>("processBarrelOnlySkimmed") || context.mOptions.get<bool>("processBarrelOnlyWithCollSkimmed") || context.mOptions.get<bool>("processBarrelOnlySkimmedNoCov") || context.mOptions.get<bool>("processBarrelOnlySkimmedNoCovWithMultExtra") || context.mOptions.get<bool>("processBarrelOnlyWithQvectorCentrSkimmedNoCov");
fEnableBarrelHistos = context.mOptions.get<bool>("processAllSkimmed") || context.mOptions.get<bool>("processBarrelOnlySkimmed") || context.mOptions.get<bool>("processBarrelOnlyWithCollSkimmed") || context.mOptions.get<bool>("processBarrelOnlySkimmedNoCov") || context.mOptions.get<bool>("processBarrelOnlySkimmedNoCovWithMultExtra") || context.mOptions.get<bool>("processBarrelOnlyWithQvectorCentrSkimmedNoCov") || context.mOptions.get<bool>("processBarrelOnlyWithQvectorCentrSkimmed");
fEnableBarrelMixingHistos = context.mOptions.get<bool>("processMixingAllSkimmed") || context.mOptions.get<bool>("processMixingBarrelSkimmed") || context.mOptions.get<bool>("processMixingBarrelSkimmedFlow") || context.mOptions.get<bool>("processMixingBarrelWithQvectorCentrSkimmedNoCov");
fEnableBarrelMixingHistos |= fConfigRunMixingAcrossTFs;
fEnableMuonHistos = context.mOptions.get<bool>("processAllSkimmed") || context.mOptions.get<bool>("processMuonOnlySkimmed") || context.mOptions.get<bool>("processMuonOnlySkimmedMultExtra") || context.mOptions.get<bool>("processMuonOnlySkimmedFlow");
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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]);
Expand Down Expand Up @@ -2762,6 +2786,13 @@ struct AnalysisSameEventPairing {
runSameEventPairing<false, VarManager::kDecayToEE, gkEventFillMapWithQvectorCentr, gkTrackFillMap>(events, trackAssocsPerCollision, barrelAssocs, barrelTracks);
}

void processBarrelOnlyWithQvectorCentrSkimmed(MyEventsQvectorCentrSelected const& events,
soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const& barrelAssocs,
MyBarrelTracksWithCovWithAmbiguities const& barrelTracks)
{
runSameEventPairing<true, VarManager::kDecayToEE, gkEventFillMapWithQvectorCentr, gkTrackFillMapWithCov>(events, trackAssocsPerCollision, barrelAssocs, barrelTracks);
}

void processMuonOnlySkimmed(MyEventsVtxCovSelected const& events,
soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons)
{
Expand Down Expand Up @@ -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);
Expand Down
29 changes: 21 additions & 8 deletions PWGDQ/Tasks/tableReader_withAssoc_direct.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading