23#ifndef XAOD_STANDALONE
37HelperFunc(
double& sf,
const double input)
56namespace ADD_CMODE(CP)
59AsgElectronEfficiencyCorrectionTool::AsgElectronEfficiencyCorrectionTool(
60 const std::string& myname)
61 : asg::AsgMetadataTool(myname)
63 , m_appliedSystematics(
nullptr)
69 , m_UncorrRegions(
nullptr)
70 , m_nSimpleUncorrSyst(0)
76 , m_accessors{std::make_unique<Accessors>(*
this)}
79 m_rootTool = std::make_unique<Root::TElectronEfficiencyCorrectionTool>(
80 (
"T" + (this->
name())).c_str());
83 "CorrectionFileNameList",
85 "List of file names that store the correction factors for simulation.");
86 declareProperty(
"MapFilePath",
87 m_mapFile =
"ElectronEfficiencyCorrection/2015_2025/rel22.2/2026_Run2Run3_Recommendation_v3/map1.txt",
88 "Full path to the map file");
90 "RecoKey", m_recoKey =
"",
"Key associated with reconstruction");
92 "IdKey", m_idKey =
"",
"Key associated with identification working point");
94 "IsoKey", m_isoKey =
"",
"Key associated with isolation working point");
96 "TriggerKey", m_trigKey =
"",
"Key associated with trigger working point");
97 declareProperty(
"ForceDataType",
98 m_dataTypeOverwrite = -1,
99 "Force the DataType of the electron to specified value (to "
100 "circumvent problem of incorrect DataType for forward "
101 "electrons in some old releases)");
103 "ResultPrefix", m_resultPrefix =
"",
"The prefix string for the result");
104 declareProperty(
"ResultName", m_resultName =
"",
"The string for the result");
105 declareProperty(
"CorrelationModel",
106 m_correlation_model_name =
"SIMPLIFIED",
107 "Uncertainty correlation model. At the moment TOTAL, FULL, "
108 "SIMPLIFIED, SYST, MCTOYS and COMBMCTOYS are implemented. "
109 "SIMPLIFIED is the default option.");
110 declareProperty(
"NumberOfToys",
111 m_number_of_toys = 100,
112 "Number of ToyMC replica, affecting MCTOYS and COMBMCTOYS "
113 "correlation models only.");
114 declareProperty(
"MCToySeed",
116 "Seed for ToyMC replica, affecting MCTOYS and COMBMCTOYS "
117 "correlation models only.");
118 declareProperty(
"MCToyScale",
120 "Scales Toy systematics up by this factor, affecting MCTOYS "
121 "and COMBMCTOYS correlation models only.");
124 m_uncorrSimplfEtaBinsUser = { 0.0, 1.37, 4.9 },
125 "Custom Eta/Pt binning for the SIMPLIFIED correlation model.");
128 m_uncorrSimplfEtBinsUser = { 4000,
138 "Custom Eta/Pt binning for the SIMPLIFIED correlation model.");
139 declareProperty(
"EventInfoCollectionName",
140 m_eventInfoCollectionName =
"EventInfo",
141 "The EventInfo Collection Name");
142 declareProperty(
"UseRandomRunNumber", m_useRandomRunNumber =
true);
143 declareProperty(
"DefaultRandomRunNumber", m_defaultRandomRunNumber = 999999);
146AsgElectronEfficiencyCorrectionTool::~AsgElectronEfficiencyCorrectionTool()
148 if (m_UncorrRegions) {
149 delete m_UncorrRegions;
154AsgElectronEfficiencyCorrectionTool::initialize()
157 m_rootTool->msg().setLevel(this->
msg().
level());
159 if (m_corrFileNameList.empty() && m_recoKey.empty() && m_idKey.empty() &&
160 m_trigKey.empty() && m_isoKey.empty()) {
161 ATH_MSG_ERROR(
"CorrectionFileNameList as well as SFKeys are empty! Please "
162 "configure it properly...");
163 return StatusCode::FAILURE;
172 if (m_dataTypeOverwrite != -1) {
173 if (m_dataTypeOverwrite !=
175 m_dataTypeOverwrite !=
178 << m_dataTypeOverwrite);
179 return StatusCode::FAILURE;
187 if (m_corrFileNameList.empty()) {
188 if (getFile(m_recoKey, m_idKey, m_isoKey, m_trigKey).isFailure()) {
189 ATH_MSG_ERROR(
"No Root file input specified, and not available map file");
190 return StatusCode::FAILURE;
195 for (
auto& ifile : m_corrFileNameList) {
200 return StatusCode::FAILURE;
204 m_rootTool->addFileName(filename);
207 if (
ifile.find(
"efficiencySF.") != std::string::npos) {
208 m_sysSubstring =
"Trigger_";
210 if (
ifile.find(
"efficiencySF.offline") != std::string::npos) {
211 m_sysSubstring =
"ID_";
213 if (
ifile.find(
"efficiencySF.offline.RecoTrk") != std::string::npos) {
214 m_sysSubstring =
"Reco_";
216 if (
ifile.find(
"efficiencySF.offline.Fwd") != std::string::npos) {
217 m_sysSubstring =
"FwdID_";
219 if (
ifile.find(
"efficiencySF.Isolation") != std::string::npos ||
ifile.find(
"efficiencySF.isolation") != std::string::npos) {
220 m_sysSubstring =
"Iso_";
222 if (
ifile.find(
"efficiency.") != std::string::npos) {
223 m_sysSubstring =
"TriggerEff_";
225 if (
ifile.find(
"efficiencySF.ChargeID") != std::string::npos) {
226 m_sysSubstring =
"ChargeIDSel_";
228 if (m_sysSubstring.empty()) {
229 ATH_MSG_ERROR(
"Could NOT find systematics Substring file name "
231 return StatusCode::FAILURE;
236 if (m_correlation_model_name ==
"COMBMCTOYS") {
238 }
else if (m_correlation_model_name ==
"MCTOYS") {
240 }
else if (m_correlation_model_name ==
"FULL") {
242 }
else if (m_correlation_model_name ==
"SIMPLIFIED") {
245 if (m_uncorrSimplfEtaBinsUser.empty() || m_uncorrSimplfEtBinsUser.empty() ||
246 m_uncorrSimplfEtBinsUser.size() < 2 ||
247 m_uncorrSimplfEtaBinsUser.size() < 2) {
248 ATH_MSG_ERROR(
"Something went wrong when specifying bins for the "
249 "SIMPLIFIED correlation model ");
250 return StatusCode::FAILURE;
252 }
else if (m_correlation_model_name ==
"TOTAL") {
254 }
else if (m_correlation_model_name ==
"SYST") {
257 ATH_MSG_ERROR(
"Unknown correlation model " + m_correlation_model_name);
258 return StatusCode::FAILURE;
260 ATH_MSG_DEBUG(
"Correlation model: " + m_correlation_model_name
261 <<
" Enum " << m_correlation_model);
265 m_UncorrRegions =
new TH2F(
"UncorrRegions",
267 m_uncorrSimplfEtBinsUser.size() - 1,
268 &(m_uncorrSimplfEtBinsUser[0]),
269 m_uncorrSimplfEtaBinsUser.size() - 1,
270 &(m_uncorrSimplfEtaBinsUser[0]));
271 m_UncorrRegions->SetDirectory(
nullptr);
274 m_nSimpleUncorrSyst = (m_uncorrSimplfEtaBinsUser.size() - 1) *
275 (m_uncorrSimplfEtBinsUser.size() - 1);
278 if (m_seed_toys != 0) {
279 m_rootTool->setSeed(m_seed_toys);
283 m_rootTool->bookCombToyMCScaleFactors(m_number_of_toys);
287 m_rootTool->bookToyMCScaleFactors(m_number_of_toys);
290 if (0 == m_rootTool->initialize()) {
292 "Could not initialize the TElectronEfficiencyCorrectionTool!");
293 return StatusCode::FAILURE;
297 m_nCorrSyst = m_rootTool->getNSyst();
298 std::map<float, std::vector<float>>
tmp;
299 m_nUncorrSyst = m_rootTool->getNbins(tmp);
301 for (
const auto& i : tmp) {
302 m_pteta_bins.emplace_back(
i.first,
i.second);
308 m_rootTool->uncorrEmpty(m_dataType) ) {
309 ATH_MSG_ERROR(
"Called correlation model "+m_correlation_model_name+
310 " but input does not contain necessary histograms.");
311 return StatusCode::FAILURE;
315 if (InitSystematics() != StatusCode::SUCCESS) {
317 return StatusCode::FAILURE;
320 if (registerSystematics() != StatusCode::SUCCESS) {
321 ATH_MSG_ERROR(
"(registerSystematics() != StatusCode::SUCCESS)");
322 return StatusCode::FAILURE;
325 if (applySystematicVariation(CP::SystematicSet()) != StatusCode::SUCCESS) {
327 return StatusCode::FAILURE;
330 if (m_useRandomRunNumber) {
331 resetAccessor (m_accessors->randomrunnumber, *
this,
"RandomRunNumber");
334 return StatusCode::SUCCESS;
338AsgElectronEfficiencyCorrectionTool::getEfficiencyScaleFactor(
340 double& efficiencyScaleFactor)
const
343 if (evtStore()->retrieve(eventInfo, m_eventInfoCollectionName).isFailure()) {
351AsgElectronEfficiencyCorrectionTool::getEfficiencyScaleFactor(
353 double& efficiencyScaleFactor,
356 const Accessors&
acc = *m_accessors;
358 efficiencyScaleFactor = 1;
360 unsigned int runNumber = m_defaultRandomRunNumber;
361 if (m_useRandomRunNumber) {
362 if (!
acc.randomrunnumber.isAvailable(eventInfo)) {
364 "Pileup tool not run before using ElectronEfficiencyTool! SFs do not "
365 "reflect PU distribution in data");
373 double cluster_eta(-9999.9);
375 auto cluster =
acc.caloClusterAcc (inputObject) [0].value();
378 if (
acc.accAuthor.isAvailable(inputObject) &&
380 cluster_eta =
acc.clusterEtaAcc (cluster);
382 cluster_eta =
acc.clusterEtaBEAcc (cluster, 2);
387 const double energy =
acc.clusterEAcc(cluster);
388 const double parEta =
acc.m_eta(inputObject);
389 const double coshEta = std::cosh(parEta);
390 double et = (coshEta != 0.) ? energy / coshEta : 0.;
394 auto itr_pt = m_pteta_bins.begin();
398 return getEfficiencyScaleFactor(
et, cluster_eta, runNumber,
399 efficiencyScaleFactor);
403AsgElectronEfficiencyCorrectionTool::getEfficiencyScaleFactor(
405 const double cluster_eta,
406 const unsigned int runNumber,
407 double& efficiencyScaleFactor)
const
416 bool doSFOnly = appliedSystematics().empty();
426 int indexCorrelated = -999;
427 int correlatedSign = 0;
428 if (!(doSFOnly || doToys || isTotal) && (isFull || isSimplified)) {
429 const auto&
sysName = appliedSystematics().begin()->name();
430 bool isUncorr = (
sysName.find(
"UncorrUnc") != std::string::npos);
431 int currentUncorReg = -999;
435 currentUncorReg = currentUncorrSystRegion(cluster_eta,
et);
436 }
else if (isSimplified) {
437 currentUncorReg = currentSimplifiedUncorrSystRegion(cluster_eta,
et);
439 if (currentUncorReg < 0) {
443 if (appliedSystematics().matchSystematic(
444 m_uncorrVarDown[currentUncorReg])) {
446 }
else if (appliedSystematics().matchSystematic(
447 m_uncorrVarUp[currentUncorReg])) {
450 }
else if (m_nCorrSyst != 0) {
451 if (
sysName.find(
"CorrUnc") != std::string::npos) {
453 const auto varNumEnd =
sysName.rfind(
"__");
454 const auto varNumBegin =
sysName.rfind(
"NP") + 2;
456 std::stoi(
sysName.substr(varNumBegin, (varNumEnd - varNumBegin)));
457 if (appliedSystematics().matchSystematic(m_corrVarUp[varIndex])) {
458 indexCorrelated = varIndex;
460 }
else if (appliedSystematics().matchSystematic(
461 m_corrVarDown[varIndex])) {
462 indexCorrelated = varIndex;
473 Root::TElectronEfficiencyCorrectionTool::Result
result;
475 m_rootTool->calculate(m_dataType, runNumber, cluster_eta,
et,
480 efficiencyScaleFactor = 1;
484 efficiencyScaleFactor =
result.SF;
492 auto toy = appliedSystematics().getToyVariationByBaseName(m_toysBasename);
493 toy.second = m_scale_toys;
494 sys =
result.toys[toy.first - 1] * m_scale_toys;
496 efficiencyScaleFactor =
sys;
502 if (appliedSystematics().matchSystematic(m_uncorrVarUp[0])) {
503 return HelperFunc(efficiencyScaleFactor, sys);
505 if (appliedSystematics().matchSystematic(m_uncorrVarDown[0])) {
506 return HelperFunc(efficiencyScaleFactor, -1 * sys);
510 else if (unCorrSign!=0) {
512 return HelperFunc(efficiencyScaleFactor, sys);
519 if (m_nCorrSyst == 0) {
521 if (appliedSystematics().matchSystematic(m_corrVarUp[0])) {
525 return HelperFunc(efficiencyScaleFactor, sys);
527 if (appliedSystematics().matchSystematic(m_corrVarDown[0])) {
531 return HelperFunc(efficiencyScaleFactor, sys);
535 if (correlatedSign != 0) {
536 sys = correlatedSign *
result.Corr[indexCorrelated];
537 return HelperFunc(efficiencyScaleFactor, sys);
543AsgElectronEfficiencyCorrectionTool::applyEfficiencyScaleFactor(
546 double efficiencyScaleFactor = 1.0;
547 CP::CorrectionCode
result =
548 getEfficiencyScaleFactor(inputObject, efficiencyScaleFactor);
550 m_resultName +
"SF");
551 dec(inputObject) = efficiencyScaleFactor;
560AsgElectronEfficiencyCorrectionTool::isAffectedBySystematic(
561 const CP::SystematicVariation& systematic)
const
563 if (systematic.
empty()) {
566 CP::SystematicSet
sys = affectingSystematics();
569 return (
sys.begin()->ensembleContains(systematic));
571 return (
sys.find(systematic) !=
sys.end());
576AsgElectronEfficiencyCorrectionTool::affectingSystematics()
const
578 return m_affectedSys;
583AsgElectronEfficiencyCorrectionTool::registerSystematics()
587 if (
registry.registerSystematics(*
this) != StatusCode::SUCCESS) {
589 "Failed to add systematic to list of recommended systematics.");
590 return StatusCode::FAILURE;
592 return StatusCode::SUCCESS;
596AsgElectronEfficiencyCorrectionTool::recommendedSystematics()
const
598 return affectingSystematics();
602AsgElectronEfficiencyCorrectionTool::applySystematicVariation(
603 const CP::SystematicSet& systConfig)
606 auto itr = m_systFilter.find(systConfig);
608 if (itr != m_systFilter.end()) {
609 CP::SystematicSet& mySysConf = itr->second;
610 m_appliedSystematics = &mySysConf;
615 CP::SystematicSet affectingSys = affectingSystematics();
616 CP::SystematicSet filteredSys;
618 systConfig, affectingSys, filteredSys)) {
620 "Unsupported combination of systematic variations passed to the tool!");
621 return StatusCode::FAILURE;
624 if (filteredSys.
size() > 1) {
626 "More than one systematic variation passed at the same time");
627 return StatusCode::FAILURE;
630 if (filteredSys.
empty() && !systConfig.
empty()) {
632 for (
const auto& syst : systConfig) {
638 itr = m_systFilter.insert(std::make_pair(systConfig, filteredSys)).first;
640 CP::SystematicSet& mySysConf = itr->second;
641 m_appliedSystematics = &mySysConf;
643 return StatusCode::SUCCESS;
650AsgElectronEfficiencyCorrectionTool::InitSystematics()
652 const std::string
prefix =
"EL_EFF_" + m_sysSubstring;
653 const std::string prefixUncorr =
prefix + m_correlation_model_name +
"_";
656 m_toysBasename =
prefix +
"COMBMCTOY";
657 m_affectedSys.insert(
660 m_toysBasename =
prefix +
"MCTOY";
661 m_affectedSys.insert(
665 if (m_nCorrSyst == 0) {
666 auto varUp = CP::SystematicVariation(prefix +
"CorrUncertainty", 1);
667 auto varDown = CP::SystematicVariation(prefix +
"CorrUncertainty", -1);
668 m_corrVarUp.push_back(varUp);
669 m_corrVarDown.push_back(varDown);
670 m_affectedSys.insert(varUp);
671 m_affectedSys.insert(varDown);
673 for (
int i = 0;
i < m_nCorrSyst; ++
i) {
675 CP::SystematicVariation(prefix + Form(
"CorrUncertaintyNP%d", i), 1);
677 CP::SystematicVariation(prefix + Form(
"CorrUncertaintyNP%d", i), -1);
678 m_corrVarUp.push_back(varUp);
679 m_corrVarDown.push_back(varDown);
680 m_affectedSys.insert(varUp);
681 m_affectedSys.insert(varDown);
686 auto varUp = CP::SystematicVariation(prefixUncorr +
"1NPCOR_PLUS_UNCOR", 1);
688 CP::SystematicVariation(prefixUncorr +
"1NPCOR_PLUS_UNCOR", -1);
689 m_uncorrVarUp.push_back(varUp);
690 m_uncorrVarDown.push_back(varDown);
691 m_affectedSys.insert(varUp);
692 m_affectedSys.insert(varDown);
694 for (
int i = 0;
i < m_nUncorrSyst; ++
i) {
695 auto varUp = CP::SystematicVariation(
696 prefixUncorr + Form(
"UncorrUncertaintyNP%d", i), 1);
697 auto varDown = CP::SystematicVariation(
698 prefixUncorr + Form(
"UncorrUncertaintyNP%d", i), -1);
699 m_uncorrVarUp.push_back(varUp);
700 m_uncorrVarDown.push_back(varDown);
701 m_affectedSys.insert(varUp);
702 m_affectedSys.insert(varDown);
705 for (
int i = 0;
i < m_nSimpleUncorrSyst; ++
i) {
706 auto varUp = CP::SystematicVariation(
707 prefixUncorr + Form(
"UncorrUncertaintyNP%d", i), 1);
708 auto varDown = CP::SystematicVariation(
709 prefixUncorr + Form(
"UncorrUncertaintyNP%d", i), -1);
710 m_uncorrVarUp.push_back(varUp);
711 m_uncorrVarDown.push_back(varDown);
712 m_affectedSys.insert(varUp);
713 m_affectedSys.insert(varDown);
716 return StatusCode::SUCCESS;
720AsgElectronEfficiencyCorrectionTool::currentSimplifiedUncorrSystRegion(
721 const double cluster_eta,
722 const double et)
const
724 int ptbin = std::as_const(*m_UncorrRegions).GetXaxis()->FindBin(
et) - 1;
726 ptbin >= std::as_const(*m_UncorrRegions).GetXaxis()->GetNbins()) {
728 " Found electron with Et = "
729 <<
et / 1000. <<
" GeV, where you specified boundaries of ["
730 << std::as_const(*m_UncorrRegions).GetXaxis()->GetBinLowEdge(1) <<
","
731 << std::as_const(*m_UncorrRegions)
734 std::as_const(*m_UncorrRegions).GetXaxis()->GetNbins())
735 <<
"] for the SIMPLIFIED correlation model ");
739 std::as_const(*m_UncorrRegions).GetYaxis()->FindBin(std::abs(cluster_eta)) -
742 etabin >= std::as_const(*m_UncorrRegions).GetYaxis()->GetNbins()) {
744 " Found electron with |eta| = "
745 << std::abs(cluster_eta) <<
", where you specified boundaries of ["
746 << std::as_const(*m_UncorrRegions).GetYaxis()->GetBinLowEdge(1) <<
","
747 << std::as_const(*m_UncorrRegions)
750 std::as_const(*m_UncorrRegions).GetYaxis()->GetNbins())
751 <<
"] for the SIMPLIFIED correlation model ");
754 int reg = ((etabin)*m_UncorrRegions->GetNbinsX() + ptbin);
759AsgElectronEfficiencyCorrectionTool::currentUncorrSystRegion(
760 const double cluster_eta,
761 const double et)
const
766 float cluster_eta_electron = 0;
767 auto itr_ptBEGIN = m_pteta_bins.begin();
768 auto itr_ptEND = m_pteta_bins.end();
769 for (; itr_ptBEGIN != itr_ptEND; ++itr_ptBEGIN) {
770 auto itr_ptBEGINplusOne = itr_ptBEGIN;
771 ++itr_ptBEGINplusOne;
774 if (
et >= itr_ptBEGIN->first &&
776 if ((itr_ptBEGIN->second).at(0) >= 0) {
777 cluster_eta_electron = std::abs(cluster_eta);
779 cluster_eta_electron = (cluster_eta);
781 for (
unsigned int etab = 0; etab < ((itr_ptBEGIN->second).size());
783 unsigned int etabnext = etab + 1;
786 if ((cluster_eta_electron) >= (itr_ptBEGIN->second).at(etab) &&
787 (etabnext == itr_ptBEGIN->second.size() ||
788 cluster_eta_electron < itr_ptBEGIN->
second.at(etabnext))) {
800 reg += (itr_ptBEGIN->second).
size();
804 "returning the maximum index");
812AsgElectronEfficiencyCorrectionTool::systUncorrVariationIndex(
819AsgElectronEfficiencyCorrectionTool::systUncorrVariationIndex(
822 const Accessors&
acc = *m_accessors;
823 int currentSystRegion = -999;
824 double cluster_eta(-9999.9);
827 et =
acc.m_pt(inputObject);
828 const auto cluster =
acc.caloClusterAcc (inputObject) [0].value();
829 cluster_eta =
acc.clusterEtaBEAcc (cluster, 2);
830 switch (m_correlation_model) {
832 currentSystRegion = currentSimplifiedUncorrSystRegion(cluster_eta,
et);
836 currentSystRegion = currentUncorrSystRegion(cluster_eta,
et);
844 return currentSystRegion;
849AsgElectronEfficiencyCorrectionTool::getFile(
const std::string& recokey,
850 const std::string& idkey,
851 const std::string& isokey,
852 const std::string& trigkey)
860 if (!
value.empty()) {
861 m_corrFileNameList.push_back(value);
863 if (mapFileName.empty()) {
865 "Map file does not exist, Please set the path and version properly..");
870 <<
" does not exist in the map file, Please configure it properly..");
872 return StatusCode::FAILURE;
876 return StatusCode::SUCCESS;
902AsgElectronEfficiencyCorrectionTool::beginInputFile()
906 if (m_dataTypeOverwrite != -1)
907 return StatusCode::SUCCESS;
912 if (status == StatusCode::SUCCESS) {
913 m_metadata_retrieved =
true;
919 :
"fast simulation")));
922 if (m_dataTypeOverwrite == -1) {
923 m_dataType = dataType_metadata;
926 "Applying SF corrections to data while they make sense only for MC");
930 m_metadata_retrieved =
false;
933 return StatusCode::SUCCESS;
937AsgElectronEfficiencyCorrectionTool::beginEvent()
940 if (m_dataTypeOverwrite != -1)
941 return StatusCode::SUCCESS;
942 if (m_metadata_retrieved)
943 return StatusCode::SUCCESS;
945 m_metadata_retrieved =
true;
946 return StatusCode::SUCCESS;
950AsgElectronEfficiencyCorrectionTool::get_simType_from_metadata(
954#ifndef XAOD_STANDALONE
958 "/TagInfo",
"project_name", dataType, inputMetaStore()))
960 if (!(dataType ==
"IS_SIMULATION")) {
963 return StatusCode::SUCCESS;
966 if (dataType ==
"IS_SIMULATION") {
967 std::string simType(
"");
972 std::transform(simType.begin(), simType.end(), simType.begin(), ::toupper);
973 result = (simType.find(
"ATLFAST") == std::string::npos)
976 return StatusCode::SUCCESS;
984 ATH_CHECK(inputMetaStore()->retrieve(fmd,
"FileMetaData"));
986 std::string simType(
"");
991 return StatusCode::SUCCESS;
994 std::transform(simType.begin(), simType.end(), simType.begin(), ::toupper);
995 result = (simType.find(
"ATLFAST") == std::string::npos)
998 return StatusCode::SUCCESS;
1002 return StatusCode::FAILURE;
1010 const Accessors&
acc = *m_accessors;
1014 switch (getEfficiencyScaleFactor(electron, sf, event).
code())
1017 acc.m_sfDec(electron) =
sf;
1018 acc.m_validDec(electron) =
true;
1021 acc.m_sfDec(electron) =
sf;
1022 acc.m_validDec(electron) =
false;
1025 throw std::runtime_error(
"Error in getEfficiencyScaleFactor");
1032 const Accessors&
acc = *m_accessors;
1035 auto eventInfo =
acc.m_eventInfo(event);
1036 callSingleEvent (
acc.m_electrons(event), eventInfo);