28 using namespace asg::SFHelper;
30 setMsgLevel(MSG::INFO);
41 std::vector<CP::SystematicVariation> positiveVar{};
42 std::vector<CP::SystematicVariation> negativeVar{};
43 for (
const auto& sys : systs) {
44 float param = sys.parameter();
46 negativeVar.push_back(sys);
48 positiveVar.push_back(sys);
54 const std::vector<CP::SystematicVariation>& variations,
55 const double nominal) {
58 for (
const auto& sys : variations) {
59 if (tool->applySystematicVariation({ sys }) != StatusCode::SUCCESS ||
60 tool->getEfficiencyScaleFactor(el, systematic) !=
65 total2 += (nominal - systematic) * (nominal - systematic);
67 return std::sqrt(total2);
72 ANA_CHECK(tool->applySystematicVariation({}));
73 ANA_CHECK(tool->getEfficiencyScaleFactor(el, nominalSF) ==
75 totalNeg = totalSyst(el, negativeVar, nominalSF);
76 totalPos = totalSyst(el, positiveVar, nominalSF);
80 sysVec.
setToys(tool->getNumberOfToys());
82 std::vector<CP::SystematicSet> toys = sysVec.
result(
"toys");
83 std::vector<double> toysVal{};
84 toysVal.reserve(toys.size());
87 for (
const auto& sys : toys) {
89 ANA_CHECK(tool->applySystematicVariation(sys) == StatusCode::SUCCESS &&
90 tool->getEfficiencyScaleFactor(el, systematic) ==
93 <<
" toy Result : " << systematic);
94 toysVal.push_back(systematic);
102 double meanK{ toysVal[0] };
103 double meanK_1{ toysVal[0] };
106 const size_t N = toysVal.size();
108 for (
size_t i = 1; i != N; ++i) {
109 const double x{ toysVal[i] };
110 const double invk{ (1.0 / (++k)) };
111 meanK_1 = meanK + (
x - meanK) * invk;
112 s += (
x - meanK_1) * (
x - meanK);
115 const double variance = s / (N - 1);
117 totalNeg = sqrt(variance);
118 totalPos = sqrt(variance);
int result(asg::StandaloneToolHandle< IAsgElectronEfficiencyCorrectionTool > &tool, const xAOD::Electron &el, double &nominalSF, double &totalPos, double &totalNeg, const bool isToys)