@@ -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