ATLAS Offline Software
Loading...
Searching...
No Matches
python.physvalPostProcessingTools.EfficiencyComputation Class Reference
Collaboration diagram for python.physvalPostProcessingTools.EfficiencyComputation:

Public Member Functions

 __init__ (self, numerator, denominator, output)
 __call__ (self, root_file)

Static Public Member Functions

 from_yaml (fragment)

Public Attributes

 numerator = numerator
 denominator = denominator
 output = output

Detailed Description

Definition at line 109 of file physvalPostProcessingTools.py.

Constructor & Destructor Documentation

◆ __init__()

python.physvalPostProcessingTools.EfficiencyComputation.__init__ ( self,
numerator,
denominator,
output )

Definition at line 110 of file physvalPostProcessingTools.py.

110 def __init__(self, numerator, denominator, output):
111 self.numerator = numerator
112 self.denominator = denominator
113 self.output = output
114

Member Function Documentation

◆ __call__()

python.physvalPostProcessingTools.EfficiencyComputation.__call__ ( self,
root_file )

Definition at line 115 of file physvalPostProcessingTools.py.

115 def __call__(self, root_file):
116 num = find_histo(root_file, self.numerator)
117 den = find_histo(root_file, self.denominator)
118 if not num or not den:
119 if crash_on_error:
120 raise RuntimeError(f"Missing histogram: {self.numerator} or {self.denominator}")
121 else:
122 logging.error(f"Missing histogram: {self.numerator} or {self.denominator}")
123 return
124
125 if not ROOT.TEfficiency.CheckConsistency(num, den):
126 logging.warning("Inconsistency detected between numerator and denominator histograms.")
127 logging.info("Attempting to fix...")
128 for i in range(1, num.GetNbinsX() + 1):
129 num_val = num.GetBinContent(i)
130 den_val = den.GetBinContent(i)
131 if den_val == 0:
132 den.SetBinContent(i, 1e-6)
133 den_val = 1e-6 # avoid zero denominator by assigning a tiny epsilon
134 logging.info(f"Setting denominator to a smaller value for bin {i} as it is zero. Any other options?")
135 if num_val > den_val:
136 logging.info(f"For Bin {i}: Num ({num_val}) > Den ({den_val})! Adjusting by setting Den to Num. Any other options?")
137 den.SetBinContent(i, num_val)
138 if not ROOT.TEfficiency.CheckConsistency(num, den):
139 logging.error("Unable to fix histogram inconsistencies. Aborting efficiency calculation.")
140 return
141
142 eff = ROOT.TEfficiency(num, den)
143 path_parts = self.output.strip("/").split("/")
144 *dir_path, obj_name = path_parts
145 directory_path = "/".join(dir_path)
146 eff.SetName(obj_name)
147 eff.SetTitle(f"{self.numerator}/{self.denominator};{num.GetXaxis().GetTitle()};Efficiency")
148 ensure_directory_exists(root_file, directory_path)
149 root_file.cd(directory_path)
150 eff.Write()
151 logging.info(f"Saved efficiency '{obj_name}' in '{directory_path}'.")
152
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:177

◆ from_yaml()

python.physvalPostProcessingTools.EfficiencyComputation.from_yaml ( fragment)
static

Definition at line 154 of file physvalPostProcessingTools.py.

154 def from_yaml(fragment):
155 return EfficiencyComputation(
156 numerator=fragment["numerator"],
157 denominator=fragment["denominator"],
158 output=fragment["output"]
159 )
160

Member Data Documentation

◆ denominator

python.physvalPostProcessingTools.EfficiencyComputation.denominator = denominator

Definition at line 112 of file physvalPostProcessingTools.py.

◆ numerator

python.physvalPostProcessingTools.EfficiencyComputation.numerator = numerator

Definition at line 111 of file physvalPostProcessingTools.py.

◆ output

python.physvalPostProcessingTools.EfficiencyComputation.output = output

Definition at line 113 of file physvalPostProcessingTools.py.


The documentation for this class was generated from the following file: