Skip to content

Commit fc709af

Browse files
authored
Implement manual calibration for centrality estimation
Added manual calibration options for centrality estimation based on generated mid-rapidity multiplicity. Introduced helper functions to calculate multiplicity and map it to centrality bins.
1 parent 26c07a1 commit fc709af

1 file changed

Lines changed: 90 additions & 8 deletions

File tree

PWGLF/Tasks/Resonances/lambda1520analysisinpp.cxx

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,13 @@ struct Lambda1520analysisinpp {
203203
Configurable<bool> cFill1DQAs{"cFill1DQAs", false, "Invariant mass 1D"};
204204
Configurable<int> centEstimator{"centEstimator", 0, "Select centrality estimator: 0 - FT0M, 1 - FT0A, 2 - FT0C"};
205205

206+
// calibration
207+
Configurable<std::vector<float>> cfgGenMultCuts{"cfgGenMultCuts", std::vector<float>{500, 300, 200, 120, 80, 50, 30, 10, 0}, "Generated multiplicity lower cuts"};
208+
Configurable<std::vector<float>> cfgCentBinCentres{"cfgCentBinCentres", std::vector<float>{2.5f, 7.5f, 15.0f, 25.0f, 35.0f, 45.0f, 55.0f, 75.0f, 95.0f}, "Reco centrality bin centres"};
209+
Configurable<float> cfgGenMultEtaMax{"cfgGenMultEtaMax", 0.5f, "Max Eta for generated mid-rapidity multiplicity"};
210+
Configurable<float> cfgGenMultEtaMin{"cfgGenMultEtaMin", -0.5f, "Min Eta for generated mid-rapidity multiplicity"};
211+
Configurable<bool> useManualCalibration{"useManualCalibration", false, "Use Manual generated multiplicity for centrality estimation"};
212+
206213
TRandom* rn = new TRandom();
207214

208215
// Pre-filters for efficient process
@@ -1116,6 +1123,40 @@ struct Lambda1520analysisinpp {
11161123
}
11171124
}
11181125

1126+
// Helper 1: Calculate generated mid-rapidity multiplicity
1127+
template <typename McPartsT>
1128+
int getGenMidRapMultiplicity(McPartsT const& partsThisMc)
1129+
{
1130+
int nCh = 0;
1131+
for (auto const& part : partsThisMc) {
1132+
if (!part.isPhysicalPrimary()) {
1133+
continue;
1134+
}
1135+
if (part.eta() > cfgGenMultEtaMax || part.eta() < cfgGenMultEtaMin) {
1136+
continue;
1137+
}
1138+
auto pdgParticle = pdg->GetParticle(part.pdgCode());
1139+
if (!pdgParticle || pdgParticle->Charge() == 0) {
1140+
continue;
1141+
}
1142+
nCh++;
1143+
}
1144+
return nCh;
1145+
}
1146+
1147+
// Helper 2: Map multiplicity count to a specific centrality bin
1148+
float getCentClassFromGenMult(int nCh)
1149+
{
1150+
const auto& cuts = cfgGenMultCuts.value;
1151+
const auto& centres = cfgCentBinCentres.value;
1152+
for (size_t i = 0; i < cuts.size(); ++i) {
1153+
if (nCh >= cuts[i]) {
1154+
return centres[i];
1155+
}
1156+
}
1157+
return -999.0f; // Invalid centrality
1158+
}
1159+
11191160
void processData(EventCandidates::iterator const& collision,
11201161
TrackCandidates const& tracks)
11211162
{
@@ -1345,18 +1386,39 @@ struct Lambda1520analysisinpp {
13451386
bool isTrueINELgt0 = pwglf::isINELgt0mc(particlesInCollision, pdg);
13461387
bool isInAfterAllCuts = isSelected(collision, false);
13471388

1348-
float centrality = mcCollision.centFT0M();
1389+
float centrality;
1390+
1391+
if (useManualCalibration) {
1392+
// Multiplicity-to-centrality mapping
1393+
int genMult = getGenMidRapMultiplicity(particlesInCollision);
1394+
centrality = getCentClassFromGenMult(genMult);
1395+
} else
1396+
centrality = mcCollision.centFT0M();
1397+
1398+
if (centrality == -999.0f)
1399+
continue;
13491400

13501401
if (isTrueINELgt0 && isInAfterAllCuts)
13511402
histos.fill(HIST("Event/MultiplicityRecoEv"), centrality);
13521403
}
13531404

13541405
// Loop on generated collisions to fill the event factor for the INEL>0 correction
13551406
for (const auto& mccolls : mcCollisions) {
1356-
float centrality = mccolls.centFT0M();
1357-
bool inVtx10 = std::abs(mccolls.posZ()) <= configEvents.cfgEvtZvtx;
1358-
13591407
const auto& particlesInCollision = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mccolls.globalIndex(), cacheMC);
1408+
1409+
float centrality;
1410+
1411+
if (useManualCalibration) {
1412+
// Multiplicity-to-centrality mapping
1413+
int genMult = getGenMidRapMultiplicity(particlesInCollision);
1414+
centrality = getCentClassFromGenMult(genMult);
1415+
} else
1416+
centrality = mccolls.centFT0M();
1417+
1418+
if (centrality == -999.0f)
1419+
continue;
1420+
1421+
bool inVtx10 = std::abs(mccolls.posZ()) <= configEvents.cfgEvtZvtx;
13601422
bool isTrueINELgt0 = pwglf::isINELgt0mc(particlesInCollision, pdg); // QA for Trigger efficiency
13611423

13621424
histos.fill(HIST("Event/hMCEventIndices"), centrality, Inel);
@@ -1384,7 +1446,17 @@ struct Lambda1520analysisinpp {
13841446
bool isInAfterAllCuts = isSelected(collision, false);
13851447
bool inVtx10 = std::abs(mcCollision.posZ()) <= configEvents.cfgEvtZvtx;
13861448

1387-
float centrality = mcCollision.centFT0M();
1449+
float centrality;
1450+
1451+
if (useManualCalibration) {
1452+
// Multiplicity-to-centrality mapping
1453+
int genMult = getGenMidRapMultiplicity(particlesInCollision);
1454+
centrality = getCentClassFromGenMult(genMult);
1455+
} else
1456+
centrality = mcCollision.centFT0M();
1457+
1458+
if (centrality == -999.0f)
1459+
continue;
13881460

13891461
auto computePtL = [&](float pt, float m_ref) {
13901462
float ptL2 = pt * pt + m_ref * m_ref - MassLambda1520 * MassLambda1520;
@@ -1470,11 +1542,21 @@ struct Lambda1520analysisinpp {
14701542

14711543
// Loop on generated collisions to fill the event factor for the INEL>0 correction
14721544
for (const auto& mccolls : mcCollisions) {
1473-
float centrality = mccolls.centFT0M();
1545+
const auto& particlesInCollision = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mccolls.globalIndex(), cacheMC);
14741546

1475-
bool inVtx10 = std::abs(mccolls.posZ()) <= configEvents.cfgEvtZvtx;
1547+
float centrality;
14761548

1477-
const auto& particlesInCollision = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mccolls.globalIndex(), cacheMC);
1549+
if (useManualCalibration) {
1550+
// Multiplicity-to-centrality mapping
1551+
int genMult = getGenMidRapMultiplicity(particlesInCollision);
1552+
centrality = getCentClassFromGenMult(genMult);
1553+
} else
1554+
centrality = mccolls.centFT0M();
1555+
1556+
if (centrality == -999.0f)
1557+
continue;
1558+
1559+
bool inVtx10 = std::abs(mccolls.posZ()) <= configEvents.cfgEvtZvtx;
14781560
bool isTrueINELgt0 = pwglf::isINELgt0mc(particlesInCollision, pdg);
14791561

14801562
if (!(inVtx10 && isTrueINELgt0))

0 commit comments

Comments
 (0)