Skip to content
Merged
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
37 changes: 4 additions & 33 deletions Common/DataModel/EventSelection.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,36 +72,6 @@ enum EventSelectionFlags {
kNsel
};

// In a struct to avoid warnings if that is not used in all executables which include this file
struct EventSelectionLabels {
static constexpr const char* labels[kNsel] = {
"kIsBBV0A",
"kIsBBV0C",
"kIsBBFDA",
"kIsBBFDC",
"kNoBGV0A",
"kNoBGV0C",
"kNoBGFDA",
"kNoBGFDC",
"kIsBBT0A",
"kIsBBT0C",
"kIsBBZNA",
"kIsBBZNC",
"kNoBGZNA",
"kNoBGZNC",
"kNoV0MOnVsOfPileup",
"kNoSPDOnVsOfPileup",
"kNoV0Casymmetry",
"kIsGoodTimeRange",
"kNoIncompleteDAQ",
"kNoTPCLaserWarmUp",
"kNoTPCHVdip",
"kNoPileupFromSPD",
"kNoV0PFPileup",
"kNoSPDClsVsTklBG",
"kNoV0C012vsTklBG"};
};

// collision-joinable event selection decisions
namespace evsel
{
Expand All @@ -122,21 +92,22 @@ DECLARE_SOA_COLUMN(SpdClusters, spdClusters, uint32_t); //! Number of SPD cluste
DECLARE_SOA_COLUMN(NTracklets, nTracklets, int); //! Tracklet multiplicity
DECLARE_SOA_COLUMN(Sel7, sel7, bool); //! Event selection decision based on V0A & V0C
DECLARE_SOA_COLUMN(Sel8, sel8, bool); //! Event selection decision based on TVX
DECLARE_SOA_COLUMN(FoundFT0, foundFT0, int64_t); //! FT0 entry index in FT0s table (-1 if doesn't exist)
DECLARE_SOA_COLUMN(FoundFT0, foundFT0, int32_t); //! FT0 entry index in FT0s table (-1 if doesn't exist)
DECLARE_SOA_COLUMN(FoundFV0, foundFV0, int32_t); //! FV0 entry index in FV0A table (-1 if doesn't exist)
} // namespace evsel
DECLARE_SOA_TABLE(EvSels, "AOD", "EVSEL", //!
evsel::Alias, evsel::Selection,
evsel::BBV0A, evsel::BBV0C, evsel::BGV0A, evsel::BGV0C,
evsel::BBFDA, evsel::BBFDC, evsel::BGFDA, evsel::BGFDC,
evsel::MultRingV0A, evsel::MultRingV0C, evsel::SpdClusters, evsel::NTracklets,
evsel::Sel7, evsel::Sel8, evsel::FoundFT0);
evsel::Sel7, evsel::Sel8, evsel::FoundFT0, evsel::FoundFV0);
using EvSel = EvSels::iterator;

DECLARE_SOA_TABLE(BcSels, "AOD", "BCSEL", //!
evsel::Alias, evsel::Selection,
evsel::BBV0A, evsel::BBV0C, evsel::BGV0A, evsel::BGV0C,
evsel::BBFDA, evsel::BBFDC, evsel::BGFDA, evsel::BGFDC,
evsel::MultRingV0A, evsel::MultRingV0C, evsel::SpdClusters, evsel::FoundFT0);
evsel::MultRingV0A, evsel::MultRingV0C, evsel::SpdClusters, evsel::FoundFT0, evsel::FoundFV0);
using BcSel = BcSels::iterator;
} // namespace o2::aod

Expand Down
52 changes: 33 additions & 19 deletions Common/TableProducer/eventSelection.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -207,13 +207,14 @@ struct BcSelectionTask {
selection[kNoPileupFromSPD] = (eventCuts & 1 << aod::kIsPileupFromSPD) == 0;
selection[kNoV0PFPileup] = (eventCuts & 1 << aod::kIsV0PFPileup) == 0;

int64_t foundFT0 = bc.has_ft0() ? bc.ft0().globalIndex() : -1;
int32_t foundFT0 = bc.has_ft0() ? bc.ft0().globalIndex() : -1;
int32_t foundFV0 = bc.has_fv0a() ? bc.fv0a().globalIndex() : -1;

// Fill bc selection columns
bcsel(alias, selection,
bbV0A, bbV0C, bgV0A, bgV0C,
bbFDA, bbFDC, bgFDA, bgFDC,
multRingV0A, multRingV0C, spdClusters, foundFT0);
multRingV0A, multRingV0C, spdClusters, foundFT0, foundFV0);
}
}
PROCESS_SWITCH(BcSelectionTask, processRun2, "Process Run2 event selection", true);
Expand Down Expand Up @@ -275,13 +276,14 @@ struct BcSelectionTask {

uint32_t spdClusters = 0;

int64_t foundFT0 = bc.has_ft0() ? bc.ft0().globalIndex() : -1;
int32_t foundFT0 = bc.has_ft0() ? bc.ft0().globalIndex() : -1;
int32_t foundFV0 = bc.has_fv0a() ? bc.fv0a().globalIndex() : -1;
LOGP(debug, "foundFT0={}\n", foundFT0);
// Fill bc selection columns
bcsel(alias, selection,
bbV0A, bbV0C, bgV0A, bgV0C,
bbFDA, bbFDC, bgFDA, bgFDC,
multRingV0A, multRingV0C, spdClusters, foundFT0);
multRingV0A, multRingV0C, spdClusters, foundFT0, foundFV0);
}
}
PROCESS_SWITCH(BcSelectionTask, processRun3, "Process Run3 event selection", false);
Expand All @@ -291,6 +293,7 @@ struct EventSelectionTask {
Produces<aod::EvSels> evsel;
Configurable<std::string> syst{"syst", "PbPb", "pp, pPb, Pbp, PbPb, XeXe"}; // TODO determine from AOD metadata or from CCDB
Configurable<int> muonSelection{"muonSelection", 0, "0 - barrel, 1 - muon selection with pileup cuts, 2 - muon selection without pileup cuts"};
Configurable<int> customDeltaBC{"customDeltaBC", 300, "custom BC delta for FIT-collision matching"};
Configurable<bool> isMC{"isMC", 0, "0 - data, 1 - MC"};
Partition<aod::Tracks> tracklets = (aod::track::trackType == static_cast<uint8_t>(o2::aod::track::TrackTypeEnum::Run2Tracklet));
EvSelParameters par;
Expand Down Expand Up @@ -365,7 +368,8 @@ struct EventSelectionTask {
void processRun2(aod::Collision const& col, BCsWithBcSels const& bcs, aod::Tracks const& tracks)
{
auto bc = col.bc_as<BCsWithBcSels>();
int64_t foundFT0 = bc.foundFT0();
int32_t foundFT0 = bc.foundFT0();
int32_t foundFV0 = bc.foundFV0();

// copy alias decisions from bcsel table
int32_t alias[kNaliases];
Expand Down Expand Up @@ -421,45 +425,55 @@ struct EventSelectionTask {
bbV0A, bbV0C, bgV0A, bgV0C,
bbFDA, bbFDC, bgFDA, bgFDC,
multRingV0A, multRingV0C, spdClusters, nTkl, sel7, sel8,
foundFT0);
foundFT0, foundFV0);
}
PROCESS_SWITCH(EventSelectionTask, processRun2, "Process Run2 event selection", true);

void processRun3(aod::Collision const& col, BCsWithBcSels const& bcs)
{
auto bc = col.bc_as<BCsWithBcSels>();
int64_t foundFT0 = bc.foundFT0();
uint64_t apprBC = bc.globalBC();
int64_t meanBC = apprBC - std::lround(col.collisionTime() / o2::constants::lhc::LHCBunchSpacingNS);
int64_t deltaBC = std::ceil(col.collisionTimeRes() / o2::constants::lhc::LHCBunchSpacingNS * 4);
// use custom delta
if (customDeltaBC > 0) {
deltaBC = customDeltaBC;
}

int32_t foundFT0 = bc.foundFT0();
if (foundFT0 < 0) { // search in +/-4 sigma around meanBC
int64_t apprBC = bc.globalBC();
int64_t meanBC = apprBC - std::lround(col.collisionTime() / o2::constants::lhc::LHCBunchSpacingNS);
int64_t deltaBC = std::ceil(col.collisionTimeRes() / o2::constants::lhc::LHCBunchSpacingNS * 4);
// search forward
int forwardMoveCount = 0;
int64_t forwardBcDist = deltaBC + 1;
for (; bc != bcs.end() && apprBC - meanBC <= deltaBC; ++bc, ++forwardMoveCount) {
for (; bc != bcs.end() && int64_t(bc.globalBC()) <= meanBC + deltaBC; ++bc, ++forwardMoveCount) {
if (bc.foundFT0() >= 0) {
forwardBcDist = apprBC - meanBC;
forwardBcDist = bc.globalBC() - meanBC;
break;
}
}
bc.moveByIndex(-forwardMoveCount);
// search backward
int backwardMoveCount = 0;
int64_t backwardBcDist = deltaBC + 1;
for (; bc != bcs.begin() && apprBC - meanBC >= -deltaBC; --bc, --backwardMoveCount) {
for (; int64_t(bc.globalBC()) >= meanBC - deltaBC; --bc, ++backwardMoveCount) {
if (bc.foundFT0() >= 0) {
backwardBcDist = meanBC - apprBC;
backwardBcDist = meanBC - bc.globalBC();
break;
}
if (bc == bcs.begin()) {
break;
}
}
if (forwardBcDist > deltaBC && backwardBcDist > deltaBC) {
bc.moveByIndex(-backwardMoveCount); // return to nominal bc if neighbouring ft0 is not found
bc.moveByIndex(backwardMoveCount); // return to nominal bc if neighbouring ft0 is not found
} else if (forwardBcDist < backwardBcDist) {
bc.moveByIndex(-backwardMoveCount + forwardMoveCount); // move forward
}
bc.moveByIndex(backwardMoveCount + forwardMoveCount); // move forward
} // else keep backward bc
}
LOGP(debug, "{}", bc.foundFT0());
foundFT0 = bc.foundFT0();

int32_t foundFV0 = bc.foundFV0();
LOGP(debug, "foundFT0 = {}", foundFT0);

// copy alias decisions from bcsel table
int32_t alias[kNaliases];
Expand Down Expand Up @@ -508,7 +522,7 @@ struct EventSelectionTask {
bbV0A, bbV0C, bgV0A, bgV0C,
bbFDA, bbFDC, bgFDA, bgFDC,
multRingV0A, multRingV0C, spdClusters, nTkl, sel7, sel8,
foundFT0);
foundFT0, foundFV0);
}
PROCESS_SWITCH(EventSelectionTask, processRun3, "Process Run3 event selection", false);
};
Expand Down