Skip to content

Commit 74a5449

Browse files
committed
add efficiency weight method
1 parent cc910ed commit 74a5449

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
{
@@ -1535,6 +1589,8 @@ void VarManager::SetDefaultVarNames()
15351589
fgVariableUnits[kCos2ThetaStarRandom] = "";
15361590
fgVariableNames[kMCCosThetaStar] = "cos#it{#theta}^{*}_{MC}";
15371591
fgVariableUnits[kMCCosThetaStar] = "";
1592+
fgVariableNames[kPairWeight] = "weight";
1593+
fgVariableUnits[kPairWeight] = "";
15381594
fgVariableNames[kCosPhiVP] = "cos#it{#varphi}_{VP}";
15391595
fgVariableUnits[kCosPhiVP] = "";
15401596
fgVariableNames[kPhiVP] = "#varphi_{VP} - #Psi_{2}";
@@ -2364,6 +2420,7 @@ void VarManager::SetDefaultVarNames()
23642420
fgVarNamesMap["kCosThetaStarRandom"] = kCosThetaStarRandom;
23652421
fgVarNamesMap["kCos2ThetaStarRandom"] = kCos2ThetaStarRandom;
23662422
fgVarNamesMap["kMCCosThetaStar"] = kMCCosThetaStar;
2423+
fgVarNamesMap["kPairWeight"] = kPairWeight;
23672424
fgVarNamesMap["kCosPhiVP"] = kCosPhiVP;
23682425
fgVarNamesMap["kPhiVP"] = kPhiVP;
23692426
fgVarNamesMap["kDeltaPhiPair2"] = kDeltaPhiPair2;

PWGDQ/Core/VarManager.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,8 @@ class VarManager : public TObject
928928
kS12,
929929
kS13,
930930
kS23,
931+
kPairEfficiency,
932+
kPairWeight,
931933
kNPairVariables,
932934

933935
// Candidate-track correlation variables
@@ -1113,6 +1115,13 @@ class VarManager : public TObject
11131115
kNCalibObjects
11141116
};
11151117

1118+
enum EfficiencyType {
1119+
kNone = 0,
1120+
kPairPtCentFT0cCosThetaStarFT0c,
1121+
// Add more efficiency types as needed
1122+
kNEfficiencyTypes
1123+
};
1124+
11161125
enum DileptonCharmHadronTypes {
11171126
kJPsi = 0,
11181127
kD0ToPiK,
@@ -1464,6 +1473,8 @@ class VarManager : public TObject
14641473
}
14651474
static double ComputePIDcalibration(int species, double nSigmaValue);
14661475

1476+
static void SetEfficiencyObject(int type, TObject* obj);
1477+
static void FillEfficiency(float* values = nullptr);
14671478
static TObject* GetCalibrationObject(CalibObjects calib)
14681479
{
14691480
auto obj = fgCalibs.find(calib);
@@ -1547,6 +1558,9 @@ class VarManager : public TObject
15471558
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
15481559
static bool fgUseInterpolatedCalibration; // use interpolated calibration histograms (default: true)
15491560

1561+
static int fgEfficiencyType; // type of efficiency correction to apply
1562+
static TObject* fgEfficiencyHist; // histogram for efficiency correction
1563+
15501564
VarManager& operator=(const VarManager& c);
15511565
VarManager(const VarManager& c);
15521566

PWGDQ/Tasks/tableReader_withAssoc.cxx

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

13071308
struct : ConfigurableGroup {
@@ -1318,6 +1319,8 @@ struct AnalysisSameEventPairing {
13181319
Configurable<float> centerMassEnergy{"energy", 13600, "Center of mass energy in GeV"};
13191320
Configurable<bool> propTrack{"cfgPropTrack", true, "Propgate tracks to associated collision to recalculate DCA and momentum vector"};
13201321
Configurable<bool> useRemoteCollisionInfo{"cfgUseRemoteCollisionInfo", false, "Use remote collision information from CCDB"};
1322+
Configurable<bool> useEfficiencyWeighting{"cfgUseEfficiencyWeighting", false, "Apply efficiency weighting to the pairs from CCDB"};
1323+
Configurable<int> efficiencyType{"cfgEfficiencyType", 0, "Type of efficiency to apply from CCDB: 0 no efficiency, 1 pt-cent-costhetastar"};
13211324
} fConfigOptions;
13221325
struct : ConfigurableGroup {
13231326
Configurable<bool> applyBDT{"applyBDT", false, "Flag to apply ML selections"};
@@ -1731,6 +1734,11 @@ struct AnalysisSameEventPairing {
17311734
o2::parameters::GRPLHCIFData* grpo = fCCDB->getForTimeStamp<o2::parameters::GRPLHCIFData>(fConfigCCDB.GrpLhcIfPath, timestamp);
17321735
VarManager::SetCollisionSystem(grpo);
17331736
}
1737+
1738+
if (fConfigOptions.useEfficiencyWeighting) {
1739+
auto effList = fCCDB->getForTimeStamp<TList>(fConfigCCDB.efficiencyPath.value, timestamp);
1740+
VarManager::SetEfficiencyObject(fConfigOptions.efficiencyType.value, effList->FindObject("efficiency"));
1741+
}
17341742
}
17351743

17361744
// Template function to run same event pairing (barrel-barrel, muon-muon, barrel-muon)
@@ -1853,6 +1861,10 @@ struct AnalysisSameEventPairing {
18531861
VarManager::FillPairVn<TEventFillMap, TPairType>(t1, t2);
18541862
}
18551863

1864+
if (fConfigOptions.useEfficiencyWeighting) {
1865+
VarManager::FillEfficiency();
1866+
}
1867+
18561868
dielectronList(event.globalIndex(), VarManager::fgValues[VarManager::kMass],
18571869
VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi],
18581870
t1.sign() + t2.sign(), twoTrackFilter, 0);

0 commit comments

Comments
 (0)