31 const std::string & filename,
long unsigned int layer_index,
float eta_min,
32 float eta_max,
float energy_shift) {
45 std::vector<float> &eta_mins =
m_min_eta.at(layer_index);
46 std::vector<std::vector<float>> &phi_mins =
m_min_phi.at(layer_index);
47 std::vector<std::vector<float>> &modulation =
m_modulation.at(layer_index);
48 std::vector<float> &energy_shifts =
m_energy_shift.at(layer_index);
50 if (eta_mins.empty()) {
55 energy_shifts.push_back(-1.0);
56 energy_shifts.push_back(-1.0);
60 eta_mins.insert(eta_mins.begin(),
eta_min);
61 phi_mins.insert(phi_mins.begin(), std::vector<float>());
62 modulation.insert(modulation.begin(), std::vector<float>());
63 energy_shifts.insert(energy_shifts.begin(), -1.0);
67 auto eta_it = std::upper_bound(
m_min_eta.at(layer_index).begin(),
69 long unsigned int eta_index =
70 std::distance(
m_min_eta.at(layer_index).begin(), eta_it) - 1;
73 if (eta_index >= eta_mins.size() - 1) {
74 if (
eta_min > eta_mins.at(eta_mins.size() - 1)) {
76 phi_mins.push_back(std::vector<float>());
77 modulation.push_back(std::vector<float>());
78 energy_shifts.push_back(-1.0);
82 phi_mins.push_back(std::vector<float>());
83 modulation.push_back(std::vector<float>());
84 energy_shifts.push_back(-1.0);
87 if (eta_mins.at(eta_index) <
eta_min) {
88 eta_mins.insert(eta_mins.begin() + eta_index + 1,
eta_min);
89 phi_mins.insert(phi_mins.begin() + eta_index + 1, std::vector<float>());
90 modulation.insert(modulation.begin() + eta_index + 1,
91 std::vector<float>());
92 energy_shifts.insert(energy_shifts.begin() + eta_index + 1, -1.0);
96 if (eta_mins.at(eta_index + 1) >
eta_max) {
97 eta_mins.insert(eta_mins.begin() + eta_index + 1,
eta_max);
98 phi_mins.insert(phi_mins.begin() + eta_index + 1, std::vector<float>());
99 modulation.insert(modulation.begin() + eta_index + 1,
100 std::vector<float>());
101 energy_shifts.insert(energy_shifts.begin() + eta_index + 1, -1.0);
105 energy_shifts.at(eta_index) = energy_shift;
107 ATH_MSG_DEBUG(
"Loading phi modulation correction from " << filename);
109 std::unique_ptr<TFile> muon_corr ( TFile::Open(filename.c_str()));
110 TH2F *muon_corr_hist = (TH2F *)muon_corr->Get(
"hWt_Layer0");
112 int n_bins = muon_corr_hist->GetNbinsX();
114 for (
int i = 1; i <= n_bins; i++) {
115 phi_mins.at(eta_index).push_back(
116 muon_corr_hist->GetXaxis()->GetBinLowEdge(i));
118 phi_mins.at(eta_index).push_back(
119 muon_corr_hist->GetXaxis()->GetBinUpEdge(n_bins));
121 for (
int i = 1; i <= n_bins; i++) {
122 modulation.at(eta_index).push_back(muon_corr_hist->GetBinContent(i));
125 TParameter<double> *param =
126 (TParameter<double> *)muon_corr->Get(
"energy_shift");
128 energy_shifts.at(eta_index) = param->GetVal();
129 std::cout <<
"Energy shift: " << energy_shifts.at(eta_index) << std::endl;
140 float phi,
float eta,
long unsigned int layer_index)
const {
142 float eta_abs = TMath::Abs(
eta);
144 auto eta_it = std::upper_bound(
m_min_eta.at(layer_index).begin(),
145 m_min_eta.at(layer_index).end(), eta_abs);
146 long unsigned int eta_index =
147 std::distance(
m_min_eta.at(layer_index).begin(), eta_it) - 1;
149 if (eta_index >=
m_min_eta.at(layer_index).size() - 1) {
161 return std::make_tuple(1, 0, 0);
164 if (
m_min_eta.at(layer_index).at(eta_index) > eta_abs ||
165 m_min_eta.at(layer_index).at(eta_index + 1) < eta_abs) {
167 "Found eta outside of the specified eta range for the phi modulation");
172 <<
m_min_eta.at(layer_index).at(eta_index)
173 <<
" Eta max of bin: "
174 <<
m_min_eta.at(layer_index).at(eta_index + 1));
175 return std::make_tuple(2, 0, 0);
180 float cell_phi = cellele->
phi();
182 float phi_within_cell =
phi - cell_phi;
186 phi_within_cell = fmod(phi_within_cell, phi_cell_size);
188 if (phi_within_cell < 0)
189 phi_within_cell += phi_cell_size;
191 const std::vector<float> &phi_mins =
m_min_phi.at(layer_index).at(eta_index);
192 const std::vector<float> &modulation =
195 if (phi_mins.size() == 0) {
196 return std::make_tuple(-1, 0, 0);
201 std::upper_bound(phi_mins.begin(), phi_mins.end(), phi_within_cell);
202 long unsigned int phi_index = std::distance(phi_mins.begin(), phi_it) - 1;
204 if (phi_index >= modulation.size()) {
207 <<
" outside of the modulation correction vector");
209 <<
" Phi within cell: " << phi_within_cell);
212 ATH_MSG_ERROR(
"Modulation correction size: " << modulation.size());
213 ATH_MSG_ERROR(
"Phi bin boundaries size: " << phi_mins.size());
216 return std::make_tuple(
220 return std::make_tuple(0, eta_index, phi_index);