Skip to content

Commit 629b5e1

Browse files
authored
[PWGEM/Dilepton] update 3D smearing (#9156)
1 parent 8eda9e8 commit 629b5e1

File tree

3 files changed

+80
-28
lines changed

3 files changed

+80
-28
lines changed

PWGEM/Dilepton/Tasks/createResolutionMap.cxx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ struct CreateResolutionMap {
147147
const AxisSpec axis_dphi{ConfDeltaPhiBins, "#varphi_{l}^{gen} - #varphi_{l}^{rec} (rad.)"};
148148
const AxisSpec axis_charge_gen{3, -1.5, +1.5, "true sign"};
149149

150+
registry.add("Event/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true);
150151
registry.add("Electron/Ptgen_RelDeltaPt", "resolution", kTH2F, {{axis_pt_gen}, {axis_dpt}}, true);
151152
registry.add("Electron/Ptgen_DeltaEta", "resolution", kTH2F, {{axis_pt_gen}, {axis_deta}}, true);
152153
registry.add("Electron/Ptgen_DeltaPhi_Pos", "resolution", kTH2F, {{axis_pt_gen}, {axis_dphi}}, true);
@@ -384,6 +385,8 @@ struct CreateResolutionMap {
384385
centrality = std::array{collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}[cfgCentEstimator];
385386
}
386387

388+
registry.fill(HIST("Event/hImpPar_Centrality"), mccollision.impactParameter(), centrality);
389+
387390
auto tracks_per_coll = tracks.sliceBy(perCollision_mid, collision.globalIndex());
388391
for (auto& track : tracks_per_coll) {
389392
if (!track.has_mcParticle()) {

PWGEM/Dilepton/Tasks/smearing.cxx

Lines changed: 63 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// Analysis task to produce smeared pt, eta, phi for electrons/muons in dilepton analysis
1414
// Please write to: daiki.sekihata@cern.ch
1515

16+
#include <array>
1617
#include <string>
1718
#include <chrono>
1819

@@ -33,18 +34,24 @@ using namespace o2::framework;
3334
using namespace o2::framework::expressions;
3435
using namespace o2::aod;
3536

37+
namespace o2::aod::pwgem::dilepton::smearing
38+
{
39+
enum class EMAnaType : int {
40+
kEfficiency = 0,
41+
kCocktail = 1,
42+
};
43+
} // namespace o2::aod::pwgem::dilepton::smearing
44+
3645
struct ApplySmearing {
37-
enum class EMAnaType : int {
38-
kEfficiency = 0,
39-
kCocktail = 1,
40-
};
4146

4247
Produces<aod::SmearedElectrons> smearedelectron;
4348
Produces<aod::SmearedMuons> smearedmuon;
4449

4550
Configurable<bool> fFromCcdb{"cfgFromCcdb", false, "get resolution and efficiency histos from CCDB"};
4651
Configurable<std::string> fConfigCcdbUrl{"cfgCcdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
4752
Configurable<int64_t> fTimestamp{"cfgCcdbTimestamp", 10, "valid timestamp of CCDB object"};
53+
Configurable<float> fCentralityForCocktail{"cfgCentralityForCocktail", 5, "average centrality for cocktail"};
54+
Configurable<int> cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"};
4855

4956
struct : ConfigurableGroup {
5057
std::string prefix = "electron_filename_group";
@@ -62,6 +69,7 @@ struct ApplySmearing {
6269
Configurable<std::string> fConfigCcdbPathRes{"cfgCcdbPathRes", "", "path to the ccdb object for resolution"};
6370
Configurable<std::string> fConfigCcdbPathEff{"cfgCcdbPahtEff", "", "path to the ccdb object for efficiency"};
6471
Configurable<std::string> fConfigCcdbPathDCA{"cfgCcdbPahtDCA", "", "path to the ccdb object for dca"};
72+
Configurable<float> fConfigMinPt{"cfgMinPt", -1, "if ptgen is smaller than this threshold, this value is used as input for ptgen."};
6573
} electron_filenames;
6674

6775
struct : ConfigurableGroup {
@@ -80,6 +88,7 @@ struct ApplySmearing {
8088
Configurable<std::string> fConfigCcdbPathRes{"cfgCcdbPathRes", "", "path to the ccdb object for resolution"};
8189
Configurable<std::string> fConfigCcdbPathEff{"cfgCcdbPahtEff", "", "path to the ccdb object for efficiency"};
8290
Configurable<std::string> fConfigCcdbPathDCA{"cfgCcdbPahtDCA", "", "path to the ccdb object for dca"};
91+
Configurable<float> fConfigMinPt{"cfgMinPt", -1, "if ptgen is smaller than this threshold, this value is used as input for ptgen."};
8392
} sa_muon_filenames;
8493

8594
struct : ConfigurableGroup {
@@ -98,6 +107,7 @@ struct ApplySmearing {
98107
Configurable<std::string> fConfigCcdbPathRes{"cfgCcdbPathRes", "", "path to the ccdb object for resolution"};
99108
Configurable<std::string> fConfigCcdbPathEff{"cfgCcdbPahtEff", "", "path to the ccdb object for efficiency"};
100109
Configurable<std::string> fConfigCcdbPathDCA{"cfgCcdbPahtDCA", "", "path to the ccdb object for dca"};
110+
Configurable<float> fConfigMinPt{"cfgMinPt", -1, "if ptgen is smaller than this threshold, this value is used as input for ptgen."};
101111
} gl_muon_filenames;
102112

103113
MomentumSmearer smearer_Electron;
@@ -118,6 +128,7 @@ struct ApplySmearing {
118128
smearer_Electron.setEffHistName(TString(electron_filenames.fConfigEffHistName));
119129
smearer_Electron.setDCAFileName(TString(electron_filenames.fConfigDCAFileName));
120130
smearer_Electron.setDCAHistName(TString(electron_filenames.fConfigDCAHistName));
131+
smearer_Electron.setMinPt(electron_filenames.fConfigMinPt);
121132

122133
smearer_StandaloneMuon.setNDSmearing(sa_muon_filenames.fConfigNDSmearing.value);
123134
smearer_StandaloneMuon.setResFileName(TString(sa_muon_filenames.fConfigResFileName));
@@ -130,6 +141,7 @@ struct ApplySmearing {
130141
smearer_StandaloneMuon.setEffHistName(TString(sa_muon_filenames.fConfigEffHistName));
131142
smearer_StandaloneMuon.setDCAFileName(TString(sa_muon_filenames.fConfigDCAFileName));
132143
smearer_StandaloneMuon.setDCAHistName(TString(sa_muon_filenames.fConfigDCAHistName));
144+
smearer_StandaloneMuon.setMinPt(sa_muon_filenames.fConfigMinPt);
133145

134146
smearer_GlobalMuon.setNDSmearing(gl_muon_filenames.fConfigNDSmearing.value);
135147
smearer_GlobalMuon.setResFileName(TString(gl_muon_filenames.fConfigResFileName));
@@ -142,6 +154,7 @@ struct ApplySmearing {
142154
smearer_GlobalMuon.setEffHistName(TString(gl_muon_filenames.fConfigEffHistName));
143155
smearer_GlobalMuon.setDCAFileName(TString(gl_muon_filenames.fConfigDCAFileName));
144156
smearer_GlobalMuon.setDCAHistName(TString(gl_muon_filenames.fConfigDCAHistName));
157+
smearer_GlobalMuon.setMinPt(gl_muon_filenames.fConfigMinPt);
145158

146159
if (fFromCcdb) {
147160
ccdb->setURL(fConfigCcdbUrl);
@@ -172,8 +185,10 @@ struct ApplySmearing {
172185
smearer_GlobalMuon.init();
173186
}
174187

175-
template <EMAnaType type, typename TTracksMC, typename TCollisions, typename TMCCollisions>
176-
void applySmearing(TTracksMC const& tracksMC, TCollisions const&, TMCCollisions const&)
188+
PresliceUnsorted<aod::EMMCEventLabels> recColperMcCollision = aod::emmceventlabel::emmceventId;
189+
190+
template <o2::aod::pwgem::dilepton::smearing::EMAnaType type, typename TTracksMC, typename TCollisions, typename TMCCollisions>
191+
void applySmearing(TTracksMC const& tracksMC, TCollisions const& collisions, TMCCollisions const&)
177192
{
178193
for (auto& mctrack : tracksMC) {
179194
float ptgen = mctrack.pt();
@@ -182,11 +197,30 @@ struct ApplySmearing {
182197
float efficiency = 1.;
183198
float dca = 0.;
184199

185-
float centrality = 105.f;
186-
if constexpr (type == EMAnaType::kEfficiency) {
187-
centrality = 0; // to be implemented later.
200+
float ptsmeared = 0, etasmeared = 0, phismeared = 0;
201+
float centrality = -1.f;
202+
if constexpr (type == o2::aod::pwgem::dilepton::smearing::EMAnaType::kEfficiency) {
203+
auto mccollision = mctrack.template emmcevent_as<TMCCollisions>();
204+
auto rec_colls_per_mccoll = collisions.sliceBy(recColperMcCollision, mccollision.globalIndex());
205+
uint32_t maxNumContrib = 0;
206+
int rec_col_globalIndex = -999;
207+
for (auto& rec_col : rec_colls_per_mccoll) {
208+
if (rec_col.numContrib() > maxNumContrib) {
209+
rec_col_globalIndex = rec_col.globalIndex();
210+
maxNumContrib = rec_col.numContrib(); // assign mc collision to collision where the number of contibutor is lager. LF/MM recommendation
211+
}
212+
}
213+
214+
if (rec_colls_per_mccoll.size() > 0) { // if mc collisions are not reconstructed, such mc collisions should not enter efficiency calculation.
215+
auto collision = collisions.rawIteratorAt(rec_col_globalIndex);
216+
centrality = std::array{collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}[cfgCentEstimator];
217+
} else {
218+
ptsmeared = ptgen;
219+
etasmeared = etagen;
220+
phismeared = phigen;
221+
}
188222
} else {
189-
centrality = 0;
223+
centrality = fCentralityForCocktail;
190224
}
191225

192226
int pdgCode = mctrack.pdgCode();
@@ -196,7 +230,6 @@ struct ApplySmearing {
196230
ch = 1;
197231
}
198232
// apply smearing for electrons or muons.
199-
float ptsmeared, etasmeared, phismeared;
200233
smearer_Electron.applySmearing(centrality, ch, ptgen, etagen, phigen, ptsmeared, etasmeared, phismeared);
201234
// get the efficiency
202235
efficiency = smearer_Electron.getEfficiency(ptgen, etagen, phigen);
@@ -229,12 +262,12 @@ struct ApplySmearing {
229262
smearedelectron(ptgen, etagen, phigen, efficiency, dca);
230263
smearedmuon(ptgen, etagen, phigen, efficiency, dca, ptgen, etagen, phigen, efficiency, dca);
231264
}
232-
}
265+
} // end of mc track loop
233266
}
234267

235-
void processMCanalysisEM(aod::EMMCParticles const& tracksMC, aod::EMEvents const& collisions, aod::EMMCEvents const& mccollisions)
268+
void processMCanalysisEM(aod::EMMCParticles const& tracksMC, soa::Join<aod::EMEvents, aod::EMEventsCent, aod::EMMCEventLabels> const& collisions, aod::EMMCEvents const& mccollisions)
236269
{
237-
applySmearing<EMAnaType::kEfficiency>(tracksMC, collisions, mccollisions);
270+
applySmearing<o2::aod::pwgem::dilepton::smearing::EMAnaType::kEfficiency>(tracksMC, collisions, mccollisions);
238271
}
239272

240273
// void processMCanalysisDQ(ReducedMCTracks const& tracksMC)
@@ -244,7 +277,7 @@ struct ApplySmearing {
244277

245278
void processCocktail(aod::McParticles const& tracksMC)
246279
{
247-
applySmearing<EMAnaType::kCocktail>(tracksMC, nullptr, nullptr);
280+
applySmearing<o2::aod::pwgem::dilepton::smearing::EMAnaType::kCocktail>(tracksMC, nullptr, nullptr);
248281
}
249282

250283
void processDummyCocktail(aod::McParticles const& tracksMC)
@@ -317,14 +350,24 @@ struct CheckSmearing {
317350
}
318351
}
319352

320-
template <typename TTracksMC>
321-
void Check(TTracksMC const& tracksMC)
353+
PresliceUnsorted<aod::EMMCEventLabels> recColperMcCollision = aod::emmceventlabel::emmceventId;
354+
355+
template <o2::aod::pwgem::dilepton::smearing::EMAnaType type, typename TTracksMC, typename TCollisions, typename TMCCollisions>
356+
void Check(TTracksMC const& tracksMC, TCollisions const& collisions, TMCCollisions const&)
322357
{
323358
for (auto& mctrack : tracksMC) {
324359
if (abs(mctrack.pdgCode()) != fPdgCode) {
325360
continue;
326361
}
327362

363+
if constexpr (type == o2::aod::pwgem::dilepton::smearing::EMAnaType::kEfficiency) {
364+
auto mccollision = mctrack.template emmcevent_as<TMCCollisions>();
365+
auto rec_colls_per_mccoll = collisions.sliceBy(recColperMcCollision, mccollision.globalIndex());
366+
if (rec_colls_per_mccoll.size() < 1) { // if mc collisions are not reconstructed, such mc collisions should not enter efficiency calculation.
367+
continue;
368+
}
369+
}
370+
328371
float deltaptoverpt = -1000.;
329372
if (mctrack.pt() > 0.)
330373
deltaptoverpt = (mctrack.pt() - mctrack.ptSmeared()) / mctrack.pt();
@@ -343,9 +386,9 @@ struct CheckSmearing {
343386
} // end of mctrack loop
344387
}
345388

346-
void processCheckMCanalysisEM(EMMCParticlesWithSmearing const& tracksMC)
389+
void processCheckMCanalysisEM(EMMCParticlesWithSmearing const& tracksMC, soa::Join<aod::EMEvents, aod::EMEventsCent, aod::EMMCEventLabels> const& collisions, aod::EMMCEvents const& mccollisions)
347390
{
348-
Check(tracksMC);
391+
Check<o2::aod::pwgem::dilepton::smearing::EMAnaType::kEfficiency>(tracksMC, collisions, mccollisions);
349392
}
350393

351394
// void processCheckMCanalysisDQ(MyReducedTracks const& tracksMC)
@@ -355,7 +398,7 @@ struct CheckSmearing {
355398

356399
void processCheckCocktail(MyCocktailTracks const& tracksMC)
357400
{
358-
Check(tracksMC);
401+
Check<o2::aod::pwgem::dilepton::smearing::EMAnaType::kCocktail>(tracksMC, nullptr, nullptr);
359402
}
360403

361404
void processDummyMCanalysisEM(aod::EMMCParticles const&) {}

PWGEM/Dilepton/Utils/MomentumSmearer.h

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -365,11 +365,12 @@ class MomentumSmearer
365365
fInitialized = true;
366366
}
367367

368-
void applySmearing(float ptgen, float vargen, float multiply, float& varsmeared, TH2F* fReso, std::vector<TH1F*>& fVecReso)
368+
void applySmearing(const float ptgen, const float vargen, const float multiply, float& varsmeared, TH2F* fReso, std::vector<TH1F*>& fVecReso)
369369
{
370+
float ptgen_tmp = ptgen > fMinPtGen ? ptgen : fMinPtGen;
370371
TAxis* axisPt = fReso->GetXaxis();
371372
int nBinsPt = axisPt->GetNbins();
372-
int ptbin = axisPt->FindBin(ptgen);
373+
int ptbin = axisPt->FindBin(ptgen_tmp);
373374
if (ptbin < 1) {
374375
ptbin = 1;
375376
}
@@ -393,6 +394,12 @@ class MomentumSmearer
393394
}
394395

395396
if (fDoNDSmearing) {
397+
if (centrality < 0) {
398+
ptsmeared = ptgen;
399+
etasmeared = etagen;
400+
phismeared = phigen;
401+
return;
402+
}
396403
applySmearingND(centrality, ch, ptgen, etagen, phigen, ptsmeared, etasmeared, phismeared);
397404
} else {
398405
applySmearing(ptgen, ptgen, ptgen, ptsmeared, fResoPt, fVecResoPt);
@@ -407,8 +414,9 @@ class MomentumSmearer
407414

408415
void applySmearingND(const float centrality, const int ch, const float ptgen, const float etagen, const float phigen, float& ptsmeared, float& etasmeared, float& phismeared)
409416
{
417+
float ptgen_tmp = ptgen > fMinPtGen ? ptgen : fMinPtGen;
410418
int cenbin = fResoND->GetAxis(0)->FindBin(centrality);
411-
int ptbin = fResoND->GetAxis(1)->FindBin(ptgen);
419+
int ptbin = fResoND->GetAxis(1)->FindBin(ptgen_tmp);
412420
int etabin = fResoND->GetAxis(2)->FindBin(etagen);
413421
int phibin = fResoND->GetAxis(3)->FindBin(phigen);
414422
int chbin = fResoND->GetAxis(4)->FindBin(ch);
@@ -448,11 +456,6 @@ class MomentumSmearer
448456
chbin = fNChBins;
449457
}
450458

451-
// ptbin = 1;
452-
// etabin = 1;
453-
// phibin = 1;
454-
// chbin = 1;
455-
456459
double dpt_rel = 0, deta = 0, dphi = 0;
457460
if (fVecResoND[cenbin - 1][ptbin - 1][etabin - 1][phibin - 1][chbin - 1]->GetEntries() > 0) {
458461
fVecResoND[cenbin - 1][ptbin - 1][etabin - 1][phibin - 1][chbin - 1]->GetRandom3(dpt_rel, deta, dphi);
@@ -570,6 +573,7 @@ class MomentumSmearer
570573
fFromCcdb = true;
571574
}
572575
void setTimestamp(int64_t timestamp) { fTimestamp = timestamp; }
576+
void setMinPt(float minpt) { fMinPtGen = minpt; }
573577

574578
// getters
575579
bool getNDSmearing() { return fDoNDSmearing; }
@@ -591,6 +595,7 @@ class MomentumSmearer
591595
TString getCcdbPathRes() { return fCcdbPathRes; }
592596
TString getCcdbPathEff() { return fCcdbPathEff; }
593597
TString getCcdbPathDCA() { return fCcdbPathDCA; }
598+
float getMinPt() { return fMinPtGen; }
594599

595600
private:
596601
bool fInitialized = false;
@@ -632,6 +637,7 @@ class MomentumSmearer
632637
int64_t fTimestamp;
633638
bool fFromCcdb = false;
634639
Service<ccdb::BasicCCDBManager> fCcdb;
640+
float fMinPtGen = -1.f;
635641
};
636642

637643
#endif // PWGEM_DILEPTON_UTILS_MOMENTUMSMEARER_H_

0 commit comments

Comments
 (0)