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
13 changes: 8 additions & 5 deletions PWGCF/Femto/Core/baseSelection.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,9 @@ class BaseSelection
case 1: // mandatory cut; only one threshold so the most permissive bit is skipped and no extra bit is stored
mSelectionContainers.at(observableIndex) = SelectionContainer<T, BitmaskType>(selectionName, std::vector<T>{1}, limits::LimitType::kEqual, true, true, false);
break;
case 2: // pass through mode; cut is neither minimal nor optional and we store all bits
mSelectionContainers.at(observableIndex) = SelectionContainer<T, BitmaskType>(selectionName, std::vector<T>{1}, limits::LimitType::kEqual, false, false, false);
break;
default:
LOG(fatal) << "Invalid switch for boolean selection";
}
Expand Down Expand Up @@ -301,8 +304,8 @@ class BaseSelection
mFinalBitmask |= (selectionContainer.getBitmask() << selectionContainer.getOffset());

for (std::size_t j = 0; j < selectionContainer.getNSelections(); ++j) {
if (j == 0 && selectionContainer.isMinimalCut()) {
// minimal cuts are always filled
if (j == 0 && selectionContainer.skipMostPermissiveBit()) {
// if the most permissive bit is skipped, this means this cut always applies
mHistRegistry->fill(HIST(HistName), binCenter);
} else {
// use container's internal offset for checking the bit
Expand Down Expand Up @@ -367,10 +370,10 @@ class BaseSelection

line << " " << std::left << std::setw(25) << sel;

if (j == 0 && container.isMinimalCut()) {
line << "-> minimal cut, no bit saved";
if (j == 0 && container.skipMostPermissiveBit()) {
line << "-> most permissive bit not saved";
} else {
int bit = container.getOffset() + (j - (container.isMinimalCut() ? 1 : 0));
int bit = container.getOffset() + (j - (container.skipMostPermissiveBit() ? 1 : 0));
line << "-> Bit: 0x" << std::hex << std::uppercase << (1ULL << bit) << std::dec;
}

Expand Down
70 changes: 51 additions & 19 deletions PWGCF/Femto/Core/collisionBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ struct ConfCollisionFilters : o2::framework::ConfigurableGroup {

struct ConfCollisionBits : o2::framework::ConfigurableGroup {
std::string prefix = std::string("CollisionBits");
o2::framework::Configurable<bool> passThrough{"passThrough", false, "If true, all tracks are passed through. Bits for all selections are stored."};
o2::framework::Configurable<int> sel8{"sel8", 1, "Use sel8 (-1: stored in bitmaks; 0 off; 1 on)"};
o2::framework::Configurable<int> noSameBunchPileup{"noSameBunchPileup", 0, "Reject collisions in case of pileup with another collision in the same foundBC (-1: stored in bitmaks; 0 off; 1 on)"};
o2::framework::Configurable<int> isVertexItsTpc{"isVertexItsTpc", 0, "At least one ITS-TPC track found for the vertex (-1: stored in bitmaks; 0 off; 1 on)"};
Expand Down Expand Up @@ -175,7 +176,7 @@ class CollisionSelection : public BaseSelection<float, o2::aod::femtodatatypes::
template <typename T1, typename T2>
void configure(o2::framework::HistogramRegistry* registry, T1 const& filter, T2 const& config)
{
// cuts
// filters
mVtxZMin = filter.vtxZMin.value;
mVtxZMax = filter.vtxZMax.value;
mMagFieldMin = filter.magFieldMin.value;
Expand All @@ -187,26 +188,48 @@ class CollisionSelection : public BaseSelection<float, o2::aod::femtodatatypes::
mSphericityMin = filter.sphericityMin.value;
mSphericityMax = filter.sphericityMax.value;

// flags
this->addSelection(kSel8, collisionSelectionNames.at(kSel8), config.sel8.value);
this->addSelection(kNoSameBunchPileUp, collisionSelectionNames.at(kNoSameBunchPileUp), config.noSameBunchPileup.value);
this->addSelection(kIsGoodZvtxFt0VsPv, collisionSelectionNames.at(kIsGoodZvtxFt0VsPv), config.isGoodZvtxFt0VsPv.value);
this->addSelection(kNoCollInTimeRangeNarrow, collisionSelectionNames.at(kNoCollInTimeRangeNarrow), config.noCollInTimeRangeNarrow.value);
this->addSelection(kNoCollInTimeRangeStrict, collisionSelectionNames.at(kNoCollInTimeRangeStrict), config.noCollInTimeRangeStrict.value);
this->addSelection(kNoCollInTimeRangeStandard, collisionSelectionNames.at(kNoCollInTimeRangeStandard), config.noCollInTimeRangeStandard.value);
this->addSelection(kNoCollInRofStrict, collisionSelectionNames.at(kNoCollInRofStrict), config.noCollInRofStrict.value);
this->addSelection(kNoCollInRofStandard, collisionSelectionNames.at(kNoCollInRofStandard), config.noCollInRofStandard.value);
this->addSelection(kNoHighMultCollInPrevRof, collisionSelectionNames.at(kNoHighMultCollInPrevRof), config.noHighMultCollInPrevRof.value);
this->addSelection(kIsGoodItsLayer3, collisionSelectionNames.at(kIsGoodItsLayer3), config.isGoodItsLayer3.value);
this->addSelection(kIsGoodItsLayer0123, collisionSelectionNames.at(kIsGoodItsLayer0123), config.isGoodItsLayer0123.value);
this->addSelection(kIsGoodItsLayersAll, collisionSelectionNames.at(kIsGoodItsLayersAll), config.isGoodItsLayersAll.value);
this->addSelection(kOccupancyMin, collisionSelectionNames.at(kOccupancyMin), config.occupancyMin.value, limits::kLowerLimit, true, true, false);
this->addSelection(kOccupancyMax, collisionSelectionNames.at(kOccupancyMax), config.occupancyMax.value, limits::kUpperLimit, true, true, false);
this->addSelection(kSphericityMin, collisionSelectionNames.at(kSphericityMin), config.sphericityMin.value, limits::kLowerLimit, true, true, false);
this->addSelection(kSphericityMax, collisionSelectionNames.at(kSphericityMax), config.sphericityMax.value, limits::kUpperLimit, true, true, false);
// if pass through mode is activated, each cut is neutral (i.e. neither minimal nor optional and we do store all bits, so the most permissive bit is not skipped for minimal selections)
mPassThrough = config.passThrough.value;

if (mPassThrough) {
this->addSelection(kSel8, collisionSelectionNames.at(kSel8), 2);
this->addSelection(kNoSameBunchPileUp, collisionSelectionNames.at(kNoSameBunchPileUp), 2);
this->addSelection(kIsGoodZvtxFt0VsPv, collisionSelectionNames.at(kIsGoodZvtxFt0VsPv), 2);
this->addSelection(kNoCollInTimeRangeNarrow, collisionSelectionNames.at(kNoCollInTimeRangeNarrow), 2);
this->addSelection(kNoCollInTimeRangeStrict, collisionSelectionNames.at(kNoCollInTimeRangeStrict), 2);
this->addSelection(kNoCollInTimeRangeStandard, collisionSelectionNames.at(kNoCollInTimeRangeStandard), 2);
this->addSelection(kNoCollInRofStrict, collisionSelectionNames.at(kNoCollInRofStrict), 2);
this->addSelection(kNoCollInRofStandard, collisionSelectionNames.at(kNoCollInRofStandard), 2);
this->addSelection(kNoHighMultCollInPrevRof, collisionSelectionNames.at(kNoHighMultCollInPrevRof), 2);
this->addSelection(kIsGoodItsLayer3, collisionSelectionNames.at(kIsGoodItsLayer3), 2);
this->addSelection(kIsGoodItsLayer0123, collisionSelectionNames.at(kIsGoodItsLayer0123), 2);
this->addSelection(kIsGoodItsLayersAll, collisionSelectionNames.at(kIsGoodItsLayersAll), 2);
} else {
this->addSelection(kSel8, collisionSelectionNames.at(kSel8), config.sel8.value);
this->addSelection(kNoSameBunchPileUp, collisionSelectionNames.at(kNoSameBunchPileUp), config.noSameBunchPileup.value);
this->addSelection(kIsGoodZvtxFt0VsPv, collisionSelectionNames.at(kIsGoodZvtxFt0VsPv), config.isGoodZvtxFt0VsPv.value);
this->addSelection(kNoCollInTimeRangeNarrow, collisionSelectionNames.at(kNoCollInTimeRangeNarrow), config.noCollInTimeRangeNarrow.value);
this->addSelection(kNoCollInTimeRangeStrict, collisionSelectionNames.at(kNoCollInTimeRangeStrict), config.noCollInTimeRangeStrict.value);
this->addSelection(kNoCollInTimeRangeStandard, collisionSelectionNames.at(kNoCollInTimeRangeStandard), config.noCollInTimeRangeStandard.value);
this->addSelection(kNoCollInRofStrict, collisionSelectionNames.at(kNoCollInRofStrict), config.noCollInRofStrict.value);
this->addSelection(kNoCollInRofStandard, collisionSelectionNames.at(kNoCollInRofStandard), config.noCollInRofStandard.value);
this->addSelection(kNoHighMultCollInPrevRof, collisionSelectionNames.at(kNoHighMultCollInPrevRof), config.noHighMultCollInPrevRof.value);
this->addSelection(kIsGoodItsLayer3, collisionSelectionNames.at(kIsGoodItsLayer3), config.isGoodItsLayer3.value);
this->addSelection(kIsGoodItsLayer0123, collisionSelectionNames.at(kIsGoodItsLayer0123), config.isGoodItsLayer0123.value);
this->addSelection(kIsGoodItsLayersAll, collisionSelectionNames.at(kIsGoodItsLayersAll), config.isGoodItsLayersAll.value);
}

const bool isMinimalCut = mPassThrough ? false : true;
const bool isOptionalCut = mPassThrough ? false : true;
const bool skipMostPermissiveBit = mPassThrough ? false : true;

this->addSelection(kOccupancyMin, collisionSelectionNames.at(kOccupancyMin), config.occupancyMin.value, limits::kLowerLimit, skipMostPermissiveBit, isMinimalCut, false);
this->addSelection(kOccupancyMax, collisionSelectionNames.at(kOccupancyMax), config.occupancyMax.value, limits::kUpperLimit, skipMostPermissiveBit, isMinimalCut, false);
this->addSelection(kSphericityMin, collisionSelectionNames.at(kSphericityMin), config.sphericityMin.value, limits::kLowerLimit, skipMostPermissiveBit, isMinimalCut, false);
this->addSelection(kSphericityMax, collisionSelectionNames.at(kSphericityMax), config.sphericityMax.value, limits::kUpperLimit, skipMostPermissiveBit, isMinimalCut, false);

std::vector<float> triggerValues(config.triggers.value.size(), 1.f);
this->addSelection(kTriggers, collisionSelectionNames.at(kTriggers), triggerValues, limits::kEqualArray, false, false, true);
this->addSelection(kTriggers, collisionSelectionNames.at(kTriggers), triggerValues, limits::kEqualArray, false, false, isOptionalCut);
this->addComments(kTriggers, config.triggers.value);

this->setupContainers<HistName>(registry);
Expand Down Expand Up @@ -311,6 +334,8 @@ class CollisionSelection : public BaseSelection<float, o2::aod::femtodatatypes::
this->assembleBitmask<HistName>();
};

bool passThroughAllCollisions() const { return mPassThrough; }

protected:
template <typename T>
float computeSphericity(T const& tracks)
Expand Down Expand Up @@ -361,6 +386,8 @@ class CollisionSelection : public BaseSelection<float, o2::aod::femtodatatypes::
float mSphericity = 0.f;
float mCentrality = 0.f;
float mMultiplicity = 0.f;

bool mPassThrough = false;
};

struct CollisionBuilderProducts : o2::framework::ProducesGroup {
Expand Down Expand Up @@ -477,6 +504,11 @@ class CollisionBuilder
template <typename T1>
bool checkCollision(T1 const& col)
{

if (mCollisionSelection.passThroughAllCollisions()) {
return true;
}

// check RCT flags first
if (mUseRctFlags) {
if (!mRctFlagsChecker(col)) {
Expand Down
Loading
Loading