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
27 changes: 27 additions & 0 deletions PWGHF/Core/CentralityEstimation.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ enum CentralityEstimator {
FT0M,
FV0A,
NTracksPV,
FT0CVariant2,
NCentralityEstimators
};

Expand All @@ -43,6 +44,11 @@ concept HasFT0CCent = requires(T collision) {
collision.centFT0C();
};

template <typename T>
concept HasFT0CVariant2Cent = requires(T collision) {
collision.centFT0CVariant2();
};

template <typename T>
concept HasFT0MCent = requires(T collision) {
collision.centFT0M();
Expand Down Expand Up @@ -76,6 +82,15 @@ float getCentralityColl(const TCollision& collision)
return collision.centFT0C();
}

/// Evaluate centrality/multiplicity percentile using FT0C variant 1 estimator
/// \param candidate is candidate
/// \return centrality/multiplicity percentile of the collision
template <HasFT0CVariant2Cent TCollision>
float getCentralityColl(const TCollision& collision)
{
return collision.centFT0CVariant2();
}

/// Evaluate centrality/multiplicity percentile using FT0M estimator
/// \param candidate is candidate
/// \return centrality/multiplicity percentile of the collision
Expand Down Expand Up @@ -144,6 +159,18 @@ float getCentralityColl(const TCollision& collision, const int centEstimator)
}
LOG(fatal) << "Collision does not have centFV0A().";
break;
case CentralityEstimator::NTracksPV:
if constexpr (HasNTracksPvCent<TCollision>) {
return collision.centNTPV();
}
LOG(fatal) << "Collision does not have centNTPV().";
break;
case CentralityEstimator::FT0CVariant2:
if constexpr (HasFT0CVariant2Cent<TCollision>) {
return collision.centFT0CVariant2();
}
LOG(fatal) << "Collision does not have centFT0CVariant2().";
break;
default:
LOG(fatal) << "Centrality estimator not valid. See CentralityEstimator for valid values.";
break;
Expand Down
18 changes: 15 additions & 3 deletions PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ struct HfTaskFlowCharmHadrons {

Configurable<int> harmonic{"harmonic", 2, "harmonic number"};
Configurable<int> qVecDetector{"qVecDetector", 3, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5, TPC Tot: 6)"};
Configurable<int> centEstimator{"centEstimator", 2, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)"};
Configurable<int> centEstimator{"centEstimator", 2, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4, NTracksPV: 5, FT0CVariant2: 6)"};
Configurable<int> selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"};
Configurable<float> centralityMin{"centralityMin", 0., "Minimum centrality accepted in SP/EP computation (not applied in resolution process)"};
Configurable<float> centralityMax{"centralityMax", 100., "Maximum centrality accepted in SP/EP computation (not applied in resolution process)"};
Expand All @@ -124,6 +124,8 @@ struct HfTaskFlowCharmHadrons {
Configurable<bool> storeEpCosSin{"storeEpCosSin", false, "Flag to store cos and sin of EP angle in ThnSparse"};
Configurable<bool> storeCandEta{"storeCandEta", false, "Flag to store candidates eta"};
Configurable<bool> storeCandSign{"storeCandSign", false, "Flag to store candidates sign"};
Configurable<bool> storeCentSparse{"storeCentSparse", false, "Flag to store up to 4 centrality estimators comparison sparse (only applied in resolution process)"};
Configurable<std::vector<int>> centEstimatorsForSparse{"centEstimatorsForSparse", {1, 2, 3, 4}, "Centrality estimators to be stored in the centrality sparse (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4). Up to 4 estimators can be configured."};
Configurable<int> occEstimator{"occEstimator", 0, "Occupancy estimation (0: None, 1: ITS, 2: FT0C)"};
Configurable<bool> saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"};
Configurable<std::string> ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
Expand All @@ -146,7 +148,7 @@ struct HfTaskFlowCharmHadrons {
using CandXic0DataWMl = soa::Filtered<soa::Join<aod::HfCandToXiPiKf, aod::HfSelToXiPiKf, aod::HfMlToXiPi>>;
using CandD0DataWMl = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0, aod::HfMlD0>>;
using CandD0Data = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0>>;
using CollsWithQvecs = soa::Join<aod::Collisions, aod::EvSels, aod::QvectorFT0Cs, aod::QvectorFT0As, aod::QvectorFT0Ms, aod::QvectorFV0As, aod::QvectorBPoss, aod::QvectorBNegs, aod::QvectorBTots, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>;
using CollsWithQvecs = soa::Join<aod::Collisions, aod::EvSels, aod::QvectorFT0Cs, aod::QvectorFT0As, aod::QvectorFT0Ms, aod::QvectorFV0As, aod::QvectorBPoss, aod::QvectorBNegs, aod::QvectorBTots, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::CentFT0CVariant2s>;
using TracksWithExtra = soa::Join<aod::Tracks, aod::TracksExtra>;

Filter filterSelectDsCandidates = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag;
Expand Down Expand Up @@ -254,6 +256,11 @@ struct HfTaskFlowCharmHadrons {
registry.add("hCentEventWithCand", "Centrality distributions with charm candidates;Cent;entries", HistType::kTH1F, {{100, 0.f, 100.f}});
registry.add("hCentEventWithCandInSigRegion", "Centrality distributions with charm candidates in signal range;Cent;entries", HistType::kTH1F, {{100, 0.f, 100.f}});

if (storeCentSparse) {
std::vector<AxisSpec> axesCent = {thnAxisCent, thnAxisCent, thnAxisCent, thnAxisCent};
registry.add("hSparseCentEstimators", "THn with different centrality estimators; Centrality 0; Centrality 1; Centrality 2; Centrality 3", {HistType::kTHnSparseF, axesCent});
}

if (occEstimator != 0) {
registry.add("trackOccVsFT0COcc", "trackOccVsFT0COcc; trackOcc; FT0COcc", {HistType::kTH2F, {thnAxisOccupancyITS, thnAxisOccupancyFT0C}});
}
Expand Down Expand Up @@ -878,7 +885,7 @@ struct HfTaskFlowCharmHadrons {
float const xQVecBTot = collision.qvecBTotRe();
float const yQVecBTot = collision.qvecBTotIm();

centrality = o2::hf_centrality::getCentralityColl(collision, o2::hf_centrality::CentralityEstimator::FT0C);
centrality = o2::hf_centrality::getCentralityColl(collision, centEstimator);
if (storeResoOccu) {
const auto occupancy = o2::hf_occupancy::getOccupancyColl(collision, occEstimator);
registry.fill(HIST("trackOccVsFT0COcc"), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange());
Expand All @@ -890,6 +897,11 @@ struct HfTaskFlowCharmHadrons {
occupancy, evtSelFlags[0], evtSelFlags[1], evtSelFlags[2], evtSelFlags[3], evtSelFlags[4]);
}

if (storeCentSparse) {
registry.fill(HIST("hSparseCentEstimators"), o2::hf_centrality::getCentralityColl(collision, centEstimatorsForSparse->at(0)), o2::hf_centrality::getCentralityColl(collision, centEstimatorsForSparse->at(1)),
o2::hf_centrality::getCentralityColl(collision, centEstimatorsForSparse->at(2)), o2::hf_centrality::getCentralityColl(collision, centEstimatorsForSparse->at(3)));
}

if (!isCollSelected<o2::hf_centrality::CentralityEstimator::FT0C>(collision, bcs, centrality)) {
// no selection on the centrality is applied, but on event selection flags
return;
Expand Down
Loading