18namespace ADD_CMODE(CP)
21StatusCode TElectronTestAlg::initialize() {
24 ATH_CHECK(m_electronContainer.initialize());
27 m_pimpl = std::make_unique<Root::TElectronEfficiencyCorrectionTool>(
28 (this->name() +
".TElectronEfficiencyCorrection").c_str());
30 m_pimpl->msg().setLevel(this->
msg().level());
34 m_isoKey, m_triggerKey);
37 if (filename.empty()) {
39 return StatusCode::FAILURE;
41 ATH_MSG_INFO(
" Using recommendations file = " << filename);
43 m_pimpl->addFileName(filename);
45 if (m_mode == Toys || m_mode == All) {
46 m_pimpl->bookCombToyMCScaleFactors(m_number_of_toys);
49 if (m_pimpl->initialize() == 0) {
51 "Could not initialize the TElectronEfficiencyCorrectionTool!");
52 return StatusCode::FAILURE;
56 m_numberCorr = m_pimpl->getNSyst();
57 std::map<float, std::vector<float>> tmp;
58 m_pimpl->getNbins(tmp);
59 m_lowestEt = tmp.begin()->first;
60 m_doDetail = (m_mode != Toys && m_mode !=
Total);
61 m_doToys = (m_mode == Toys || m_mode == All);
64 const std::string baseName = m_electronContainer.key();
65 m_SF = baseName +
".EFF_" + key +
"_SF";
66 m_TotalUp = baseName +
".EFF_" + key +
"_Total__Up";
67 m_TotalDown = baseName +
".EFF_" + key +
"_Total__Down";
68 m_uncorrUp = baseName +
".EFF_" + key +
"_UnCorr__Up";
69 m_uncorrDown = baseName +
".EFF_" + key +
"_UnCorr__Down";
70 m_HistIndex = baseName +
".EFF_" + key +
"_HistIndex";
71 m_HistBin = baseName +
".EFF_" + key +
"_HistBin";
72 m_corrUp = baseName +
".EFF_" + key +
"_Corr__Up";
73 m_corrDown = baseName +
".EFF_" + key +
"_Corr__Down";
74 m_toys = baseName +
".EFF_" + key +
"__toys";
77 ATH_CHECK(m_TotalUp.initialize(m_decorate));
78 ATH_CHECK(m_TotalDown.initialize(m_decorate));
79 ATH_CHECK(m_uncorrUp.initialize(m_decorate && m_doDetail));
80 ATH_CHECK(m_uncorrDown.initialize(m_decorate && m_doDetail));
81 ATH_CHECK(m_HistIndex.initialize(m_decorate && m_doDetail));
82 ATH_CHECK(m_HistBin.initialize(m_decorate && m_doDetail));
83 ATH_CHECK(m_corrUp.initialize(m_decorate && m_doDetail));
84 ATH_CHECK(m_corrDown.initialize(m_decorate && m_doDetail));
85 ATH_CHECK(m_toys.initialize(m_decorate && m_doToys));
87 return StatusCode::SUCCESS;
90StatusCode TElectronTestAlg::execute(
const EventContext& ctx)
const {
93 unsigned int runNumber = 428648;
95 int dataType = m_dataType;
99 std::optional<SG::WriteDecorHandle<xAOD::ElectronContainer, double>> SF;
100 std::optional<SG::WriteDecorHandle<xAOD::ElectronContainer, double>> TotalUp;
101 std::optional<SG::WriteDecorHandle<xAOD::ElectronContainer, double>>
103 std::optional<SG::WriteDecorHandle<xAOD::ElectronContainer, double>> uncorrUp;
104 std::optional<SG::WriteDecorHandle<xAOD::ElectronContainer, double>>
106 std::optional<SG::WriteDecorHandle<xAOD::ElectronContainer, int>> HistIndex;
107 std::optional<SG::WriteDecorHandle<xAOD::ElectronContainer, int>> HistBin;
119 SF.emplace(m_SF, ctx);
120 TotalUp.emplace(m_TotalUp, ctx);
121 TotalDown.emplace(m_TotalDown, ctx);
123 uncorrUp.emplace(m_uncorrUp, ctx);
124 uncorrDown.emplace(m_uncorrDown, ctx);
125 HistIndex.emplace(m_HistIndex, ctx);
126 HistBin.emplace(m_HistBin, ctx);
127 corrUp.emplace(m_corrUp, ctx);
128 corrDown.emplace(m_corrDown, ctx);
131 toys.emplace(m_toys, ctx);
140 if (std::abs(el->eta()) > 2.469 || el->pt() < 10000) {
144 SF.value()(*el) = result.SF;
145 TotalUp.value()(*el) = result.SF + result.Total;
146 TotalDown.value()(*el) = result.SF - result.Total;
148 uncorrUp.value()(*el) = result.SF + result.UnCorr;
149 uncorrDown.value()(*el) = result.SF - result.UnCorr;
150 HistIndex.value()(*el) = result.histIndex;
151 HistBin.value()(*el) = result.histBinNum;
152 corrUp.value()(*el) = result.Corr;
153 corrDown.value()(*el) = result.Corr;
156 toys.value()(*el) = result.toys;
163 double cluster_eta(-9999.9);
166 ATH_MSG_ERROR(
"ERROR no cluster associated to the Electron \n");
167 return StatusCode::FAILURE;
173 cluster_eta = cluster->
eta();
175 cluster_eta = cluster->
etaBE(2);
180 const double energy = cluster->
e();
181 const double parEta = el->eta();
182 const double coshEta = std::cosh(parEta);
183 double et = (coshEta != 0.) ? energy / coshEta : 0.;
185 if (
et < m_lowestEt) {
190 const int status = m_pimpl->calculate(
193 result, (m_mode ==
Total) );
196 return StatusCode::FAILURE;
200 ATH_MSG_INFO(
"--------------------------------------------");
201 ATH_MSG_INFO(
"Electron pt : " << el->pt() <<
" eta " << el->eta());
202 ATH_MSG_INFO(
"SF = " << result.SF <<
" +- " << result.Total);
204 ATH_MSG_INFO(
"SF = " << result.SF <<
" +- " << result.UnCorr
206 ATH_MSG_INFO(
"At histo " << result.histIndex <<
" at bin "
207 << result.histBinNum);
209 for (
double res : result.Corr) {
215 for (
double res : result.toys) {
220 SF.value()(*el) = result.SF;
221 TotalUp.value()(*el) = result.SF + result.Total;
222 TotalDown.value()(*el) = result.SF - result.Total;
224 uncorrUp.value()(*el) = result.SF + result.UnCorr;
225 uncorrDown.value()(*el) = result.SF - result.UnCorr;
226 HistIndex.value()(*el) = result.histIndex;
227 HistBin.value()(*el) = result.histBinNum;
228 const size_t corrsize = result.Corr.size();
229 std::vector<double> up(corrsize, 0);
230 std::vector<double> down(corrsize, 0);
231 for (
size_t i = 0; i < corrsize; ++i) {
232 up[i] = result.SF + result.Corr[i];
233 down[i] = result.SF - result.Corr[i];
235 corrUp.value()(*el) = std::move(up);
236 corrDown.value()(*el) = std::move(down);
239 toys.value()(*el) = std::move(result.toys);
244 return StatusCode::SUCCESS;