@@ -133,6 +133,7 @@ struct HStrangeCorrelation {
133133 Configurable<bool > applyEfficiencyPropagation{" applyEfficiencyPropagation" , false , " propagate also the efficiency uncertainty" };
134134 Configurable<bool > applyPurityHadron{" applyPurityHadron" , false , " apply the purity correction for associated hadrons" };
135135 Configurable<bool > applyPurityTrigger{" applyPurityTrigger" , false , " apply the purity correction for trigger particle" };
136+ Configurable<bool > applyEffAsFunctionOfMult{" applyEffAsFunctionOfMult" , false , " apply efficiency as a function of multiplicity as well" };
136137 } efficiencyFlags;
137138 Configurable<std::string> ccdburl{" ccdburl" , " http://alice-ccdb.cern.ch" , " url of the ccdb repository to use" };
138139 Configurable<std::string> efficiencyCCDBPath{" efficiencyCCDBPath" , " GLO/Config/GeometryAligned" , " Path of the efficiency corrections" };
@@ -215,6 +216,7 @@ struct HStrangeCorrelation {
215216
216217 // objects to use for efficiency corrections
217218 TH2F* hEfficiencyTrigger;
219+ TH3F* hEfficiencyTriggerMult;
218220 TH2F* hEfficiencyPion;
219221 TH2F* hEfficiencyK0Short;
220222 TH2F* hEfficiencyLambda;
@@ -224,9 +226,12 @@ struct HStrangeCorrelation {
224226 TH2F* hEfficiencyOmegaMinus;
225227 TH2F* hEfficiencyOmegaPlus;
226228 TH2F* hEfficiencyHadron;
229+ TH3F* hEfficiencyHadronMult;
227230 TH1F* hPurityHadron;
231+ TH2F* hPurityHadronMult;
228232 // objects to propagate the efficiency uncertainty
229233 TH2F* hEfficiencyUncertaintyTrigger;
234+ TH3F* hEfficiencyUncertaintyTriggerMult;
230235 TH2F* hEfficiencyUncertaintyPion;
231236 TH2F* hEfficiencyUncertaintyK0Short;
232237 TH2F* hEfficiencyUncertaintyLambda;
@@ -236,7 +241,9 @@ struct HStrangeCorrelation {
236241 TH2F* hEfficiencyUncertaintyOmegaMinus;
237242 TH2F* hEfficiencyUncertaintyOmegaPlus;
238243 TH2F* hEfficiencyUncertaintyHadron;
244+ TH3F* hEfficiencyUncertaintyHadronMult;
239245 TH1F* hPurityUncertaintyHadron;
246+ TH2F* hPurityUncertaintyHadronMult;
240247
241248 using BinningType = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentFT0M>;
242249 using BinningTypePbPb = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentFT0C>;
@@ -307,6 +314,7 @@ struct HStrangeCorrelation {
307314 }
308315
309316 hEfficiencyTrigger = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyTrigger" ));
317+ hEfficiencyTriggerMult = static_cast <TH3F*>(listEfficiencies->FindObject (" hEfficiencyTriggerMult" ));
310318 hEfficiencyK0Short = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyK0Short" ));
311319 hEfficiencyLambda = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyLambda" ));
312320 hEfficiencyAntiLambda = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyAntiLambda" ));
@@ -315,9 +323,12 @@ struct HStrangeCorrelation {
315323 hEfficiencyOmegaMinus = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyOmegaMinus" ));
316324 hEfficiencyOmegaPlus = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyOmegaPlus" ));
317325 hEfficiencyHadron = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyHadron" ));
326+ hEfficiencyHadronMult = static_cast <TH3F*>(listEfficiencies->FindObject (" hEfficiencyHadronMult" ));
318327 hEfficiencyPion = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyPion" ));
319328 hPurityHadron = static_cast <TH1F*>(listEfficiencies->FindObject (" hPurityHadron" ));
329+ hPurityHadronMult = static_cast <TH2F*>(listEfficiencies->FindObject (" hPurityHadronMult" ));
320330 hEfficiencyUncertaintyTrigger = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyUncertaintyTrigger" ));
331+ hEfficiencyUncertaintyTriggerMult = static_cast <TH3F*>(listEfficiencies->FindObject (" hEfficiencyUncertaintyTriggerMult" ));
321332 hEfficiencyUncertaintyK0Short = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyUncertaintyK0Short" ));
322333 hEfficiencyUncertaintyLambda = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyUncertaintyLambda" ));
323334 hEfficiencyUncertaintyAntiLambda = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyUncertaintyAntiLambda" ));
@@ -327,7 +338,9 @@ struct HStrangeCorrelation {
327338 hEfficiencyUncertaintyOmegaPlus = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyUncertaintyOmegaPlus" ));
328339 hEfficiencyUncertaintyPion = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyUncertaintyPion" ));
329340 hEfficiencyUncertaintyHadron = static_cast <TH2F*>(listEfficiencies->FindObject (" hEfficiencyUncertaintyHadron" ));
341+ hEfficiencyUncertaintyHadronMult = static_cast <TH3F*>(listEfficiencies->FindObject (" hEfficiencyUncertaintyHadronMult" ));
330342 hPurityUncertaintyHadron = static_cast <TH1F*>(listEfficiencies->FindObject (" hPurityUncertaintyHadron" ));
343+ hPurityUncertaintyHadronMult = static_cast <TH2F*>(listEfficiencies->FindObject (" hPurityUncertaintyHadronMult" ));
331344 if (efficiencyFlags.applyEfficiencyPropagation && !hEfficiencyUncertaintyTrigger)
332345 LOG (fatal) << " Problem getting hEfficiencyUncertaintyTrigger!" ;
333346 LOG (info) << " Efficiencies now loaded for " << mRunNumber ;
@@ -806,13 +819,28 @@ struct HStrangeCorrelation {
806819 float purityTriggErr = 0 .0f ;
807820 if (!mixing) {
808821 if (efficiencyFlags.applyEfficiencyForTrigger ) {
809- efficiencyTrigg = hEfficiencyTrigger->Interpolate (trigg.pt (), trigg.eta ());
810- if (efficiencyFlags.applyPurityTrigger )
811- purityTrigg = hPurityHadron->Interpolate (trigg.pt ());
822+ if (efficiencyFlags.applyEffAsFunctionOfMult ) {
823+ efficiencyTrigg = hEfficiencyTriggerMult->Interpolate (trigg.pt (), trigg.eta (), mult);
824+ } else {
825+ efficiencyTrigg = hEfficiencyTrigger->Interpolate (trigg.pt (), trigg.eta ());
826+ }
827+ if (efficiencyFlags.applyPurityTrigger ) {
828+ if (efficiencyFlags.applyEffAsFunctionOfMult )
829+ purityTrigg = hPurityHadronMult->Interpolate (trigg.pt (), mult);
830+ else
831+ purityTrigg = hPurityHadron->Interpolate (trigg.pt ());
832+ }
812833 if (efficiencyFlags.applyEfficiencyPropagation ) {
813- efficiencyTriggError = hEfficiencyUncertaintyTrigger->Interpolate (trigg.pt (), trigg.eta ());
814- if (efficiencyFlags.applyPurityTrigger )
815- purityTriggErr = hPurityUncertaintyHadron->Interpolate (trigg.pt ());
834+ if (efficiencyFlags.applyEffAsFunctionOfMult )
835+ efficiencyTriggError = hEfficiencyUncertaintyTriggerMult->Interpolate (trigg.pt (), trigg.eta (), mult);
836+ else
837+ efficiencyTriggError = hEfficiencyUncertaintyTrigger->Interpolate (trigg.pt (), trigg.eta ());
838+ if (efficiencyFlags.applyPurityTrigger ) {
839+ if (efficiencyFlags.applyEffAsFunctionOfMult )
840+ purityTriggErr = hPurityUncertaintyHadronMult->Interpolate (trigg.pt (), mult);
841+ else
842+ purityTriggErr = hPurityUncertaintyHadron->Interpolate (trigg.pt ());
843+ }
816844 }
817845 if (efficiencyTrigg == 0 ) { // check for zero efficiency, do not apply if the case
818846 efficiencyTrigg = 1 ;
@@ -984,13 +1012,27 @@ struct HStrangeCorrelation {
9841012 if (!mixing) {
9851013
9861014 if (efficiencyFlags.applyEfficiencyForTrigger ) {
987- efficiencyTrigger = hEfficiencyTrigger->Interpolate (trigg.pt (), trigg.eta ());
988- if (efficiencyFlags.applyPurityTrigger )
989- purityTrigger = hPurityHadron->Interpolate (trigg.pt ());
1015+ if (efficiencyFlags.applyEffAsFunctionOfMult )
1016+ efficiencyTrigger = hEfficiencyTriggerMult->Interpolate (trigg.pt (), trigg.eta (), mult);
1017+ else
1018+ efficiencyTrigger = hEfficiencyTrigger->Interpolate (trigg.pt (), trigg.eta ());
1019+ if (efficiencyFlags.applyPurityTrigger ) {
1020+ if (efficiencyFlags.applyEffAsFunctionOfMult )
1021+ purityTrigger = hPurityHadronMult->Interpolate (trigg.pt (), mult);
1022+ else
1023+ purityTrigger = hPurityHadron->Interpolate (trigg.pt ());
1024+ }
9901025 if (efficiencyFlags.applyEfficiencyPropagation ) {
991- efficiencyTriggerError = hEfficiencyUncertaintyTrigger->Interpolate (trigg.pt (), trigg.eta ());
992- if (efficiencyFlags.applyPurityTrigger )
993- purityTriggerError = hPurityUncertaintyHadron->Interpolate (trigg.pt ());
1026+ if (efficiencyFlags.applyEffAsFunctionOfMult )
1027+ efficiencyTriggerError = hEfficiencyUncertaintyTriggerMult->Interpolate (trigg.pt (), trigg.eta (), mult);
1028+ else
1029+ efficiencyTriggerError = hEfficiencyUncertaintyTrigger->Interpolate (trigg.pt (), trigg.eta ());
1030+ if (efficiencyFlags.applyPurityTrigger ) {
1031+ if (efficiencyFlags.applyEffAsFunctionOfMult )
1032+ purityTriggerError = hPurityUncertaintyHadronMult->Interpolate (trigg.pt (), mult);
1033+ else
1034+ purityTriggerError = hPurityUncertaintyHadron->Interpolate (trigg.pt ());
1035+ }
9941036 }
9951037 if (efficiencyTrigger == 0 ) { // check for zero efficiency, do not apply if the case
9961038 efficiencyTrigger = 1 ;
@@ -1057,13 +1099,27 @@ struct HStrangeCorrelation {
10571099 if (efficiencyFlags.applyEfficiencyPropagation )
10581100 efficiencyUncertainty = hEfficiencyUncertaintyPion->Interpolate (ptassoc, assoc.eta ());
10591101 } else {
1060- efficiency = hEfficiencyHadron->Interpolate (ptassoc, assoc.eta ());
1061- if (efficiencyFlags.applyPurityHadron )
1062- purity = hPurityHadron->Interpolate (ptassoc);
1102+ if (efficiencyFlags.applyEffAsFunctionOfMult )
1103+ efficiency = hEfficiencyHadronMult->Interpolate (ptassoc, assoc.eta (), mult);
1104+ else
1105+ efficiency = hEfficiencyHadron->Interpolate (ptassoc, assoc.eta ());
1106+ if (efficiencyFlags.applyPurityHadron ) {
1107+ if (efficiencyFlags.applyEffAsFunctionOfMult )
1108+ purity = hPurityHadronMult->Interpolate (ptassoc, mult);
1109+ else
1110+ purity = hPurityHadron->Interpolate (ptassoc);
1111+ }
10631112 if (efficiencyFlags.applyEfficiencyPropagation ) {
1064- efficiencyUncertainty = hEfficiencyUncertaintyHadron->Interpolate (ptassoc, assoc.eta ());
1065- if (efficiencyFlags.applyPurityHadron )
1066- purityUncertainty = hPurityUncertaintyHadron->Interpolate (ptassoc);
1113+ if (efficiencyFlags.applyEffAsFunctionOfMult )
1114+ efficiencyUncertainty = hEfficiencyUncertaintyHadronMult->Interpolate (ptassoc, assoc.eta (), mult);
1115+ else
1116+ efficiencyUncertainty = hEfficiencyUncertaintyHadron->Interpolate (ptassoc, assoc.eta ());
1117+ if (efficiencyFlags.applyPurityHadron ) {
1118+ if (efficiencyFlags.applyEffAsFunctionOfMult )
1119+ purityUncertainty = hPurityUncertaintyHadronMult->Interpolate (ptassoc, mult);
1120+ else
1121+ purityUncertainty = hPurityUncertaintyHadron->Interpolate (ptassoc);
1122+ }
10671123 }
10681124 }
10691125 }
@@ -1409,9 +1465,9 @@ struct HStrangeCorrelation {
14091465
14101466 // MC generated plots
14111467 if (doprocessMCGenerated) {
1412- histos.add (" Generated/hTrigger" , " " , kTH2F , {axesConfigurations.axisPtQA , axesConfigurations.axisEta });
1468+ histos.add (" Generated/hTrigger" , " " , kTH3F , {axesConfigurations.axisPtQA , axesConfigurations.axisEta , axesConfigurations. axisMult });
14131469 for (int i = 0 ; i < 9 ; i++) {
1414- histos.add (fmt::format (" Generated/h{}" , kParticlenames [i]).c_str (), " " , kTH2F , {axesConfigurations.axisPtQA , axesConfigurations.axisEta });
1470+ histos.add (fmt::format (" Generated/h{}" , kParticlenames [i]).c_str (), " " , kTH3F , {axesConfigurations.axisPtQA , axesConfigurations.axisEta , axesConfigurations. axisMult });
14151471 }
14161472 histos.addClone (" Generated/" , " GeneratedWithPV/" );
14171473
@@ -1675,28 +1731,28 @@ struct HStrangeCorrelation {
16751731 histos.fill (HIST (" hTriggerPrimaryEtaVsPt" ), track.pt (), track.eta (), collision.centFT0M ());
16761732 histos.fill (HIST (" hTrackEtaVsPtVsPhi" ), track.pt (), track.eta (), track.phi (), weight);
16771733 }
1678- for (auto const & assocTrack : assocHadrons) {
1679- auto assoc = assocTrack.track_as <TracksComplete>();
1680- if (!isValidAssocHadron (assoc))
1681- continue ;
1682- float efficiency = 1 .0f ;
1683- float purity = 1 .0f ;
1684- if (efficiencyFlags.applyEfficiencyCorrection ) {
1685- efficiency = hEfficiencyHadron->Interpolate (assoc.pt (), assoc.eta ());
1686- if (efficiencyFlags.applyPurityHadron )
1687- purity = hPurityHadron->Interpolate (assoc.pt ());
1688- }
1689- if (efficiency == 0 ) { // check for zero efficiency, do not apply if the case
1690- efficiency = 1 ;
1691- }
1692- float weight = efficiencyFlags.applyEfficiencyCorrection ? purity / efficiency : 1 .0f ;
1693- histos.fill (HIST (" hAssocHadronsAllSelectedEtaVsPt" ), assoc.pt (), assoc.eta (), collision.centFT0M ());
1694- histos.fill (HIST (" hAssocPtResolution" ), assoc.pt (), assocTrack.mcOriginalPt ());
1695- if (doAssocPhysicalPrimary && !assocTrack.mcPhysicalPrimary ())
1696- continue ;
1697- histos.fill (HIST (" hAssocPrimaryEtaVsPt" ), assoc.pt (), assoc.eta (), collision.centFT0M ());
1698- histos.fill (HIST (" hAsssocTrackEtaVsPtVsPhi" ), assoc.pt (), assoc.eta (), assoc.phi (), weight);
1734+ }
1735+ for (auto const & assocTrack : assocHadrons) {
1736+ auto assoc = assocTrack.track_as <TracksComplete>();
1737+ if (!isValidAssocHadron (assoc))
1738+ continue ;
1739+ float efficiency = 1 .0f ;
1740+ float purity = 1 .0f ;
1741+ if (efficiencyFlags.applyEfficiencyCorrection ) {
1742+ efficiency = hEfficiencyHadron->Interpolate (assoc.pt (), assoc.eta ());
1743+ if (efficiencyFlags.applyPurityHadron )
1744+ purity = hPurityHadron->Interpolate (assoc.pt ());
1745+ }
1746+ if (efficiency == 0 ) { // check for zero efficiency, do not apply if the case
1747+ efficiency = 1 ;
16991748 }
1749+ float weight = efficiencyFlags.applyEfficiencyCorrection ? purity / efficiency : 1 .0f ;
1750+ histos.fill (HIST (" hAssocHadronsAllSelectedEtaVsPt" ), assoc.pt (), assoc.eta (), collision.centFT0M (), weight);
1751+ histos.fill (HIST (" hAssocPtResolution" ), assoc.pt (), assocTrack.mcOriginalPt ());
1752+ if (doAssocPhysicalPrimary && !assocTrack.mcPhysicalPrimary ())
1753+ continue ;
1754+ histos.fill (HIST (" hAssocPrimaryEtaVsPt" ), assoc.pt (), assoc.eta (), collision.centFT0M ());
1755+ histos.fill (HIST (" hAsssocTrackEtaVsPtVsPhi" ), assoc.pt (), assoc.eta (), assoc.phi (), weight);
17001756 }
17011757
17021758 // ________________________________________________
@@ -2172,10 +2228,10 @@ struct HStrangeCorrelation {
21722228 constexpr int Index = i.value ;
21732229 if (i == 0 || i == 7 ) {
21742230 if (std::abs (mcParticle.pdgCode ()) == kPdgCodes [i])
2175- histos.fill (HIST (" Generated/h" ) + HIST (kParticlenames [Index]), mcParticle.pt (), mcParticle.eta ());
2231+ histos.fill (HIST (" Generated/h" ) + HIST (kParticlenames [Index]), mcParticle.pt (), mcParticle.eta (), 1 );
21762232 } else {
21772233 if (mcParticle.pdgCode () == kPdgCodes [i])
2178- histos.fill (HIST (" Generated/h" ) + HIST (kParticlenames [Index]), mcParticle.pt (), mcParticle.eta ());
2234+ histos.fill (HIST (" Generated/h" ) + HIST (kParticlenames [Index]), mcParticle.pt (), mcParticle.eta (), 1 );
21792235 }
21802236 });
21812237 }
@@ -2265,7 +2321,7 @@ struct HStrangeCorrelation {
22652321 double geta = mcParticle.eta ();
22662322 double gpt = mcParticle.pt ();
22672323 if (std::abs (mcParticle.pdgCode ()) == PDG_t::kPiPlus || std::abs (mcParticle.pdgCode ()) == PDG_t::kKPlus || std::abs (mcParticle.pdgCode ()) == PDG_t::kProton || std::abs (mcParticle.pdgCode ()) == PDG_t::kElectron || std::abs (mcParticle.pdgCode ()) == PDG_t::kMuonMinus )
2268- histos.fill (HIST (" GeneratedWithPV/hTrigger" ), gpt, geta);
2324+ histos.fill (HIST (" GeneratedWithPV/hTrigger" ), gpt, geta, bestCollisionFT0Mpercentile );
22692325 if (mcParticle.pdgCode () == PDG_t::kLambda0 && !doAssocPhysicalPrimaryInGen && !mcParticle.isPhysicalPrimary ()) {
22702326 if (std::abs (geta) > etaSel) {
22712327 continue ;
@@ -2311,14 +2367,14 @@ struct HStrangeCorrelation {
23112367 constexpr int Index = i.value ;
23122368 if (i == 0 || i == 7 ) {
23132369 if (std::abs (mcParticle.pdgCode ()) == kPdgCodes [i]) {
2314- histos.fill (HIST (" GeneratedWithPV/h" ) + HIST (kParticlenames [Index]), gpt, geta);
2370+ histos.fill (HIST (" GeneratedWithPV/h" ) + HIST (kParticlenames [Index]), gpt, geta, bestCollisionFT0Mpercentile );
23152371 if (std::abs (mcParticle.y ()) < ySel)
23162372 histos.fill (HIST (" GeneratedWithPV/h" ) + HIST (kParticlenames [Index]) + HIST (" _MidYVsMult" ), gpt, bestCollisionFT0Mpercentile);
23172373 }
23182374
23192375 } else {
23202376 if (mcParticle.pdgCode () == kPdgCodes [i]) {
2321- histos.fill (HIST (" GeneratedWithPV/h" ) + HIST (kParticlenames [Index]), gpt, geta);
2377+ histos.fill (HIST (" GeneratedWithPV/h" ) + HIST (kParticlenames [Index]), gpt, geta, bestCollisionFT0Mpercentile );
23222378 if (std::abs (mcParticle.y ()) < ySel)
23232379 histos.fill (HIST (" GeneratedWithPV/h" ) + HIST (kParticlenames [Index]) + HIST (" _MidYVsMult" ), gpt, bestCollisionFT0Mpercentile);
23242380 }
@@ -2432,7 +2488,9 @@ struct HStrangeCorrelation {
24322488 if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary ()) {
24332489 triggerIndices.emplace_back (iteratorNum);
24342490 histos.fill (HIST (" ClosureTest/hTrigger" ), gpt, geta, bestCollisionFT0Mpercentile);
2435- if (doCorrelationHadron) {
2491+ }
2492+ if (doCorrelationHadron) {
2493+ if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary ()) {
24362494 assocHadronIndices.emplace_back (iteratorNum);
24372495 histos.fill (HIST (" ClosureTest/hHadron" ), gpt, geta, gphi);
24382496 }
0 commit comments