Skip to content

Commit 5bb1eb0

Browse files
authored
[PWGDQ] add efficiency weight method (#16203)
1 parent cf11d71 commit 5bb1eb0

3 files changed

Lines changed: 83 additions & 0 deletions

File tree

PWGDQ/Core/VarManager.cxx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ std::map<VarManager::CalibObjects, TObject*> VarManager::fgCalibs;
7474
bool VarManager::fgRunTPCPostCalibration[4] = {false, false, false, false};
7575
int VarManager::fgCalibrationType = 0; // 0 - no calibration, 1 - calibration vs (TPCncls,pIN,eta) typically for pp, 2 - calibration vs (eta,nPV,nLong,tLong) typically for PbPb
7676
bool VarManager::fgUseInterpolatedCalibration = true; // use interpolated calibration histograms (default: true)
77+
int VarManager::fgEfficiencyType = 0; // type of efficiency to be applied, default is no efficiency
78+
TObject* VarManager::fgEfficiencyHist = nullptr; // histogram for efficiency
7779

7880
//__________________________________________________________________
7981
VarManager::VarManager() : TObject()
@@ -380,6 +382,58 @@ double VarManager::ComputePIDcalibration(int species, double nSigmaValue)
380382
}
381383
}
382384

385+
//__________________________________________________________________
386+
void VarManager::SetEfficiencyObject(int efficiencyType, TObject* obj)
387+
{
388+
// check the type of the efficiency object and set it accordingly
389+
if (efficiencyType >= kNEfficiencyTypes || efficiencyType < 0) {
390+
LOG(warning) << "SetEfficiencyObject: unknown efficiency type " << efficiencyType;
391+
return;
392+
}
393+
394+
// set the efficiency type
395+
fgEfficiencyType = efficiencyType;
396+
// set the efficiency object
397+
fgEfficiencyHist = obj;
398+
}
399+
400+
void VarManager::FillEfficiency(float* values)
401+
{
402+
// depending on the efficiency type, we use different types of efficiency histograms and different variables to get the efficiency value
403+
if (!values) {
404+
values = fgValues;
405+
}
406+
407+
if (fgEfficiencyType == kNone) {
408+
values[kPairEfficiency] = 1.0; // if no efficiency is to be applied, set the efficiency value to 1
409+
values[kPairWeight] = 1.0; // set the weight to 1
410+
} else if (fgEfficiencyType == kPairPtCentFT0cCosThetaStarFT0c) {
411+
if (!fgEfficiencyHist) {
412+
LOG(fatal) << "efficiency histogram not set";
413+
return;
414+
}
415+
TH3F* efficiencyHist = reinterpret_cast<TH3F*>(fgEfficiencyHist);
416+
// Get the bin indices for the efficiency histogram
417+
int binPt = efficiencyHist->GetXaxis()->FindBin(values[kPairPt]);
418+
binPt = (binPt == 0 ? 1 : binPt);
419+
binPt = (binPt > efficiencyHist->GetXaxis()->GetNbins() ? efficiencyHist->GetXaxis()->GetNbins() : binPt);
420+
int binCent = efficiencyHist->GetYaxis()->FindBin(values[kCentFT0C]);
421+
binCent = (binCent == 0 ? 1 : binCent);
422+
binCent = (binCent > efficiencyHist->GetYaxis()->GetNbins() ? efficiencyHist->GetYaxis()->GetNbins() : binCent);
423+
int binCosThetaStarFT0c = efficiencyHist->GetZaxis()->FindBin(values[kCosThetaStarFT0C]);
424+
binCosThetaStarFT0c = (binCosThetaStarFT0c == 0 ? 1 : binCosThetaStarFT0c);
425+
binCosThetaStarFT0c = (binCosThetaStarFT0c > efficiencyHist->GetZaxis()->GetNbins() ? efficiencyHist->GetZaxis()->GetNbins() : binCosThetaStarFT0c);
426+
427+
// get the efficiency value from the histogram
428+
values[kPairEfficiency] = efficiencyHist->GetBinContent(binPt, binCent, binCosThetaStarFT0c);
429+
values[kPairWeight] = 1.0 / (values[kPairEfficiency] > 0 ? values[kPairEfficiency] : 1.0); // set the weight as the inverse of the efficiency, but avoid division by zero
430+
} else {
431+
LOG(warning) << "FillEfficiency: unknown efficiency type " << fgEfficiencyType << ", using default efficiency = 1";
432+
values[kPairEfficiency] = 1;
433+
values[kPairWeight] = 1;
434+
}
435+
}
436+
383437
//__________________________________________________________________
384438
std::tuple<float, float, float, float, float> VarManager::BimodalityCoefficientUnbinned(const std::vector<float>& data)
385439
{
@@ -1547,6 +1601,8 @@ void VarManager::SetDefaultVarNames()
15471601
fgVariableUnits[kCos2ThetaStarRandom] = "";
15481602
fgVariableNames[kMCCosThetaStar] = "cos#it{#theta}^{*}_{MC}";
15491603
fgVariableUnits[kMCCosThetaStar] = "";
1604+
fgVariableNames[kPairWeight] = "weight";
1605+
fgVariableUnits[kPairWeight] = "";
15501606
fgVariableNames[kCosPhiVP] = "cos#it{#varphi}_{VP}";
15511607
fgVariableUnits[kCosPhiVP] = "";
15521608
fgVariableNames[kPhiVP] = "#varphi_{VP} - #Psi_{2}";
@@ -2384,6 +2440,7 @@ void VarManager::SetDefaultVarNames()
23842440
fgVarNamesMap["kCosThetaStarRandom"] = kCosThetaStarRandom;
23852441
fgVarNamesMap["kCos2ThetaStarRandom"] = kCos2ThetaStarRandom;
23862442
fgVarNamesMap["kMCCosThetaStar"] = kMCCosThetaStar;
2443+
fgVarNamesMap["kPairWeight"] = kPairWeight;
23872444
fgVarNamesMap["kCosPhiVP"] = kCosPhiVP;
23882445
fgVarNamesMap["kPhiVP"] = kPhiVP;
23892446
fgVarNamesMap["kDeltaPhiPair2"] = kDeltaPhiPair2;

PWGDQ/Core/VarManager.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,8 @@ class VarManager : public TObject
936936
kS12,
937937
kS13,
938938
kS23,
939+
kPairEfficiency,
940+
kPairWeight,
939941
kNPairVariables,
940942

941943
// Candidate-track correlation variables
@@ -1121,6 +1123,13 @@ class VarManager : public TObject
11211123
kNCalibObjects
11221124
};
11231125

1126+
enum EfficiencyType {
1127+
kNone = 0,
1128+
kPairPtCentFT0cCosThetaStarFT0c,
1129+
// Add more efficiency types as needed
1130+
kNEfficiencyTypes
1131+
};
1132+
11241133
enum DileptonCharmHadronTypes {
11251134
kJPsi = 0,
11261135
kD0ToPiK,
@@ -1472,6 +1481,8 @@ class VarManager : public TObject
14721481
}
14731482
static double ComputePIDcalibration(int species, double nSigmaValue);
14741483

1484+
static void SetEfficiencyObject(int type, TObject* obj);
1485+
static void FillEfficiency(float* values = nullptr);
14751486
static TObject* GetCalibrationObject(CalibObjects calib)
14761487
{
14771488
auto obj = fgCalibs.find(calib);
@@ -1555,6 +1566,9 @@ class VarManager : public TObject
15551566
static int fgCalibrationType; // 0 - no calibration, 1 - calibration vs (TPCncls,pIN,eta) typically for pp, 2 - calibration vs (eta,nPV,nLong,tLong) typically for PbPb
15561567
static bool fgUseInterpolatedCalibration; // use interpolated calibration histograms (default: true)
15571568

1569+
static int fgEfficiencyType; // type of efficiency correction to apply
1570+
static TObject* fgEfficiencyHist; // histogram for efficiency correction
1571+
15581572
VarManager& operator=(const VarManager& c);
15591573
VarManager(const VarManager& c);
15601574

PWGDQ/Tasks/tableReader_withAssoc.cxx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,6 +1317,7 @@ struct AnalysisSameEventPairing {
13171317
Configurable<std::string> lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"};
13181318
Configurable<std::string> geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"};
13191319
Configurable<std::string> GrpLhcIfPath{"grplhcif", "GLO/Config/GRPLHCIF", "Path on the CCDB for the GRPLHCIF object"};
1320+
Configurable<std::string> efficiencyPath{"effHistPath", "Users/z/zhxiong/efficiency", "Path on the CCDB for the efficiency histograms"};
13201321
} fConfigCCDB;
13211322

13221323
struct : ConfigurableGroup {
@@ -1333,6 +1334,8 @@ struct AnalysisSameEventPairing {
13331334
Configurable<float> centerMassEnergy{"energy", 13600, "Center of mass energy in GeV"};
13341335
Configurable<bool> propTrack{"cfgPropTrack", true, "Propgate tracks to associated collision to recalculate DCA and momentum vector"};
13351336
Configurable<bool> useRemoteCollisionInfo{"cfgUseRemoteCollisionInfo", false, "Use remote collision information from CCDB"};
1337+
Configurable<bool> useEfficiencyWeighting{"cfgUseEfficiencyWeighting", false, "Apply efficiency weighting to the pairs from CCDB"};
1338+
Configurable<int> efficiencyType{"cfgEfficiencyType", 0, "Type of efficiency to apply from CCDB: 0 no efficiency, 1 pt-cent-costhetastar"};
13361339
} fConfigOptions;
13371340
struct : ConfigurableGroup {
13381341
Configurable<bool> applyBDT{"applyBDT", false, "Flag to apply ML selections"};
@@ -1746,6 +1749,11 @@ struct AnalysisSameEventPairing {
17461749
o2::parameters::GRPLHCIFData* grpo = fCCDB->getForTimeStamp<o2::parameters::GRPLHCIFData>(fConfigCCDB.GrpLhcIfPath, timestamp);
17471750
VarManager::SetCollisionSystem(grpo);
17481751
}
1752+
1753+
if (fConfigOptions.useEfficiencyWeighting) {
1754+
auto effList = fCCDB->getForTimeStamp<TList>(fConfigCCDB.efficiencyPath.value, timestamp);
1755+
VarManager::SetEfficiencyObject(fConfigOptions.efficiencyType.value, effList->FindObject("efficiency"));
1756+
}
17491757
}
17501758

17511759
// Template function to run same event pairing (barrel-barrel, muon-muon, barrel-muon)
@@ -1868,6 +1876,10 @@ struct AnalysisSameEventPairing {
18681876
VarManager::FillPairVn<TEventFillMap, TPairType>(t1, t2);
18691877
}
18701878

1879+
if (fConfigOptions.useEfficiencyWeighting) {
1880+
VarManager::FillEfficiency();
1881+
}
1882+
18711883
dielectronList(event.globalIndex(), VarManager::fgValues[VarManager::kMass],
18721884
VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi],
18731885
t1.sign() + t2.sign(), twoTrackFilter, 0);

0 commit comments

Comments
 (0)