14def apply_pileup_correction(hist_cumulative, metadata):
15 """Apply pileup correction to cumulative histogram"""
16
17 BCR = metadata['bunchCrossingRate']
18 pileup = metadata['targetMu']
19
20
21 hist_pileup_corrected = hist_cumulative.Clone(f"{hist_cumulative.GetName()}_pileup_corrected")
22
23
24 for bin in range(1, hist_pileup_corrected.GetNbinsX() + 1):
25 bin_value = hist_cumulative.GetBinContent(bin)
26 P_scatter = bin_value / BCR / pileup
27 corrected_value = BCR * (1.0 -
pow(1.0 - P_scatter, pileup))
28 hist_pileup_corrected.SetBinContent(bin, corrected_value)
29
30
31 bin_error = hist_cumulative.GetBinError(bin)
32 if bin_value > 0:
33 error_scale = corrected_value / bin_value
34 hist_pileup_corrected.SetBinError(bin, bin_error * error_scale)
35 else:
36 hist_pileup_corrected.SetBinError(bin, 0)
37
38 return hist_pileup_corrected
39
40
constexpr int pow(int base, int exp) noexcept