36 std::string filename,
long unsigned int layer_index,
float eta_min,
37 float eta_max,
float energy_shift) {
50 std::vector<float> &eta_mins =
m_min_eta.at(layer_index);
51 std::vector<std::vector<float>> &phi_mins =
m_min_phi.at(layer_index);
52 std::vector<std::vector<float>> &modulation =
m_modulation.at(layer_index);
53 std::vector<float> &energy_shifts =
m_energy_shift.at(layer_index);
55 if (eta_mins.empty()) {
60 energy_shifts.push_back(-1.0);
61 energy_shifts.push_back(-1.0);
65 eta_mins.insert(eta_mins.begin(),
eta_min);
66 phi_mins.insert(phi_mins.begin(), std::vector<float>());
67 modulation.insert(modulation.begin(), std::vector<float>());
68 energy_shifts.insert(energy_shifts.begin(), -1.0);
72 auto eta_it = std::upper_bound(
m_min_eta.at(layer_index).begin(),
74 long unsigned int eta_index =
75 std::distance(
m_min_eta.at(layer_index).begin(), eta_it) - 1;
78 if (eta_index >= eta_mins.size() - 1) {
79 if (
eta_min > eta_mins.at(eta_mins.size() - 1)) {
81 phi_mins.push_back(std::vector<float>());
82 modulation.push_back(std::vector<float>());
83 energy_shifts.push_back(-1.0);
87 phi_mins.push_back(std::vector<float>());
88 modulation.push_back(std::vector<float>());
89 energy_shifts.push_back(-1.0);
92 if (eta_mins.at(eta_index) <
eta_min) {
93 eta_mins.insert(eta_mins.begin() + eta_index + 1,
eta_min);
94 phi_mins.insert(phi_mins.begin() + eta_index + 1, std::vector<float>());
95 modulation.insert(modulation.begin() + eta_index + 1,
96 std::vector<float>());
97 energy_shifts.insert(energy_shifts.begin() + eta_index + 1, -1.0);
101 if (eta_mins.at(eta_index + 1) >
eta_max) {
102 eta_mins.insert(eta_mins.begin() + eta_index + 1,
eta_max);
103 phi_mins.insert(phi_mins.begin() + eta_index + 1, std::vector<float>());
104 modulation.insert(modulation.begin() + eta_index + 1,
105 std::vector<float>());
106 energy_shifts.insert(energy_shifts.begin() + eta_index + 1, -1.0);
110 energy_shifts.at(eta_index) = energy_shift;
112 ATH_MSG_DEBUG(
"Loading phi modulation correction from " << filename);
114 TFile *muon_corr = TFile::Open(filename.c_str());
115 TH2F *muon_corr_hist = (TH2F *)muon_corr->Get(
"hWt_Layer0");
117 int n_bins = muon_corr_hist->GetNbinsX();
119 for (
int i = 1; i <= n_bins; i++) {
120 phi_mins.at(eta_index).push_back(
121 muon_corr_hist->GetXaxis()->GetBinLowEdge(i));
123 phi_mins.at(eta_index).push_back(
124 muon_corr_hist->GetXaxis()->GetBinUpEdge(n_bins));
126 for (
int i = 1; i <= n_bins; i++) {
127 modulation.at(eta_index).push_back(muon_corr_hist->GetBinContent(i));
130 TParameter<double> *param =
131 (TParameter<double> *)muon_corr->Get(
"energy_shift");
133 energy_shifts.at(eta_index) = param->GetVal();
134 std::cout <<
"Energy shift: " << energy_shifts.at(eta_index) << std::endl;
145 float phi,
float eta,
long unsigned int layer_index)
const {
147 float eta_abs = TMath::Abs(
eta);
149 auto eta_it = std::upper_bound(
m_min_eta.at(layer_index).begin(),
150 m_min_eta.at(layer_index).end(), eta_abs);
151 long unsigned int eta_index =
152 std::distance(
m_min_eta.at(layer_index).begin(), eta_it) - 1;
154 if (eta_index >=
m_min_eta.at(layer_index).size() - 1) {
166 return std::make_tuple(1, 0, 0);
169 if (
m_min_eta.at(layer_index).at(eta_index) > eta_abs ||
170 m_min_eta.at(layer_index).at(eta_index + 1) < eta_abs) {
172 "Found eta outside of the specified eta range for the phi modulation");
177 <<
m_min_eta.at(layer_index).at(eta_index)
178 <<
" Eta max of bin: "
179 <<
m_min_eta.at(layer_index).at(eta_index + 1));
180 return std::make_tuple(2, 0, 0);
185 float cell_phi = cellele->
phi();
187 float phi_within_cell =
phi - cell_phi;
191 phi_within_cell = fmod(phi_within_cell, phi_cell_size);
193 if (phi_within_cell < 0)
194 phi_within_cell += phi_cell_size;
196 const std::vector<float> &phi_mins =
m_min_phi.at(layer_index).at(eta_index);
197 const std::vector<float> &modulation =
200 if (phi_mins.size() == 0) {
201 return std::make_tuple(-1, 0, 0);
206 std::upper_bound(phi_mins.begin(), phi_mins.end(), phi_within_cell);
207 long unsigned int phi_index = std::distance(phi_mins.begin(), phi_it) - 1;
209 if (phi_index >= modulation.size()) {
212 <<
" outside of the modulation correction vector");
214 <<
" Phi within cell: " << phi_within_cell);
217 ATH_MSG_ERROR(
"Modulation correction size: " << modulation.size());
218 ATH_MSG_ERROR(
"Phi bin boundaries size: " << phi_mins.size());
221 return std::make_tuple(
225 return std::make_tuple(0, eta_index, phi_index);