146 std::unordered_map<std::string, bool>* matched_per_trigger,
147 const LeptonList& leptons,
unsigned runNumber) {
149 if(matched_per_trigger) {
150 for(
auto& [key, flag] : *matched_per_trigger) flag =
false;
157 if (!period->m_triggers.size()) {
158 ATH_MSG_ERROR(
"Empty list of triggers for run number " << runNumber);
161 auto& trigMatchTool =
m_parent->m_trigMatchTool;
165 const unsigned nLep = leptons.size();
166 std::vector<flat_set<std::size_t>> validLegs(leptons.size());
167 for (
unsigned i = 0; i < nLep; ++i) {
174 std::vector<flat_set<std::size_t>> firedLegs;
175 std::vector<const xAOD::IParticle*> trigLeptons;
176 const std::size_t magicWordHLT = 0xf7b8b87ef2917d66;
178 for (
auto& trig : period->m_triggers) {
180 auto itr =
m_parent->m_dictionary.find(trig.name ^ magicWordHLT);
181 if (itr ==
m_parent->m_dictionary.end()) {
183 .emplace(trig.name ^ magicWordHLT,
184 "HLT_" +
m_parent->m_dictionary.at(trig.name))
187 const std::string& chain = itr->second;
198 << std::hex << trig.type << std::dec <<
") " << chain);
201 firedLegs.resize(nLegs);
202 trigLeptons.resize(nLegs);
203 for (
unsigned i0 = 0; i0 < nLep; ++i0) {
204 firedLegs[0].swap(validLegs[i0]);
206 trigLeptons[0] = leptons[i0].particle();
209 if(
canTriggerBeFired(trig, firedLegs) && trigMatchTool->match(trigLeptons, chain)) {
211 if(!matched_per_trigger)
return true;
212 if(matched_per_trigger->count(chain)) matched_per_trigger->at(chain) =
true;
215 for (
unsigned i1 = i0 + 1; i1 < nLep; ++i1) {
216 firedLegs[1].swap(validLegs[i1]);
217 trigLeptons[1] = leptons[i1].particle();
219 if(
canTriggerBeFired(trig, firedLegs) && trigMatchTool->match(trigLeptons, chain)) {
221 if(!matched_per_trigger)
return true;
222 if(matched_per_trigger->count(chain)) matched_per_trigger->at(chain) =
true;
225 for (
unsigned i2 = i1 + 1; i2 < nLep; ++i2) {
226 firedLegs[2].swap(validLegs[i2]);
227 trigLeptons[2] = leptons[i2].particle();
228 if(
canTriggerBeFired(trig, firedLegs) && trigMatchTool->match(trigLeptons, chain)) {
230 if(!matched_per_trigger)
return true;
231 if(matched_per_trigger->count(chain)) matched_per_trigger->at(chain) =
true;
233 firedLegs[2].swap(validLegs[i2]);
235 firedLegs[1].swap(validLegs[i1]);
620 const Trig2Lsym trig2L,
623 -> std::enable_if_t<Trig2Lsym::is2Lsym() && Trig1L::is1L() &&
624 Trig1L::object() == Trig2Lsym::object(),
626 ATH_MSG_DEBUG(
"Entered Calculator::globalEfficiency_One2LSeveral1L() at line "
630 if (!trig2L || trig2L.hiddenBy(trigs1L))
632 globalEfficiencies = {0.};
635 for (
auto& lepton : leptons) {
636 if (trig2L.irrelevantFor(lepton))
640 std::size_t loosest1lepLeg =
642 if (loosest1lepLeg) {
644 loosest1lepLeg, success);
648 loosestLegEfficiency =
649 (
m_parent->getLoosestLeg(lepton, trig2L(), loosest1lepLeg,
650 success) == trig2L())
654 loosestLegEfficiency = &efficiencies1L;
658 loosestLegEfficiency = &efficiencies2L;
662 ~(*loosestLegEfficiency) * globalEfficiencies + efficiencies1L;
663 if (loosestLegEfficiency == &efficiencies2L)
664 globalEfficiencies +=
665 ~twoSingleInefficiencies * (efficiencies2L - efficiencies1L);
666 twoSingleInefficiencies *= ~(*loosestLegEfficiency);
676 const Trig2Lasym trig2L,
679 -> std::enable_if_t<Trig2Lasym::is2Lasym() && Trig1L::is1L() &&
680 Trig1L::object() == Trig2Lasym::object(),
682 ATH_MSG_DEBUG(
"Entered Calculator::globalEfficiency_One2LSeveral1L() at line "
684 if (trig2L.symmetric())
689 if (!trig2L || trig2L.hiddenBy(trigs1L))
691 globalEfficiencies = {0.};
693 threeSingleInefficiencies = {1.};
695 for (
auto& lepton : leptons) {
696 if (trig2L.irrelevantFor(lepton))
699 for (std::size_t leg : trig2L.legs)
701 validLegs.insert(leg);
703 std::size_t loosest1lepLeg =
705 if (loosest1lepLeg) {
707 loosest1lepLeg, success);
708 validLegs.insert(loosest1lepLeg);
710 if (!validLegs.size())
712 auto looseLegs =
m_parent->getTwoLoosestLegs(lepton, validLegs, success);
713 auto efficienciesLoose =
714 (looseLegs.first == loosest1lepLeg)
717 looseLegs.first, success);
719 if (validLegs.size() >= 2)
721 (looseLegs.second == loosest1lepLeg)
724 looseLegs.second, success);
726 ~efficienciesLoose * globalEfficiencies + efficiencies1L;
727 if (loosest1lepLeg != looseLegs.first) {
728 globalEfficiencies +=
729 (efficienciesLoose - efficienciesMedium) *
730 ~twoSingleInefficiencies[looseLegs.first == trig2L.legs[0]];
731 if (loosest1lepLeg != looseLegs.second)
732 globalEfficiencies +=
733 (efficienciesMedium - efficiencies1L) * ~threeSingleInefficiencies;
735 threeSingleInefficiencies *= ~efficienciesLoose;
736 twoSingleInefficiencies[0] *= (looseLegs.first != trig2L.legs[1])
738 : ~efficienciesMedium;
739 twoSingleInefficiencies[1] *= (looseLegs.first != trig2L.legs[0])
741 : ~efficienciesMedium;
751 const Trig2Lsym trig2L1,
752 const Trig2Lsym trig2L2,
755 -> std::enable_if_t<Trig2Lsym::is2Lsym() && Trig1L::is1L() &&
756 Trig1L::object() == Trig2Lsym::object(),
758 ATH_MSG_DEBUG(
"Entered Calculator::globalEfficiency_Two2LSeveral1L() at line "
760 if (!trig2L1 || trig2L1 == trig2L2 || trig2L1.hiddenBy(trigs1L))
763 if (!trig2L2 || trig2L2.hiddenBy(trigs1L))
766 globalEfficiencies = {0.};
771 for (
auto& lepton : leptons) {
772 if (trig2L1.irrelevantFor(lepton))
775 std::map<std::size_t, Efficiencies> efficiencies{{0, 0.}};
776 std::size_t loosest1lepLeg =
778 for (std::size_t leg : {loosest1lepLeg, trig2L1(), trig2L2()}) {
780 validLegs.insert(leg);
782 lepton, runNumber, leg, success));
784 efficiencies.emplace(leg, 0.);
786 if (!validLegs.size())
788 auto looseLegs =
m_parent->getTwoLoosestLegs(lepton, validLegs, success);
789 std::size_t lambda13 =
790 (looseLegs.first != trig2L2()) ? looseLegs.first : looseLegs.second;
791 std::size_t lambda23 =
792 (looseLegs.first != trig2L1()) ? looseLegs.first : looseLegs.second;
793 globalEfficiencies = globalEfficiencies * ~efficiencies[looseLegs.first] +
794 efficiencies[loosest1lepLeg];
795 if (looseLegs.first == trig2L1())
796 globalEfficiencies +=
797 efficiencies2Lsym[1] *
798 (efficiencies[trig2L1()] - efficiencies[looseLegs.second]);
799 if (looseLegs.first == trig2L2())
800 globalEfficiencies +=
801 efficiencies2Lsym[0] *
802 (efficiencies[trig2L2()] - efficiencies[looseLegs.second]);
803 if (looseLegs.first != loosest1lepLeg)
804 globalEfficiencies +=
805 ~singleInefficiencies *
806 (efficiencies[looseLegs.second] - efficiencies[loosest1lepLeg]);
807 efficiencies2Lsym[0] =
808 ~efficiencies[looseLegs.first] * efficiencies2Lsym[0] +
809 efficiencies[lambda23];
810 efficiencies2Lsym[1] =
811 ~efficiencies[looseLegs.first] * efficiencies2Lsym[1] +
812 efficiencies[lambda13];
813 if (looseLegs.first == trig2L1())
814 efficiencies2Lsym[0] +=
815 (efficiencies[trig2L1()] - efficiencies[lambda23]) *
816 ~singleInefficiencies;
817 if (looseLegs.first == trig2L2())
818 efficiencies2Lsym[1] +=
819 (efficiencies[trig2L2()] - efficiencies[lambda13]) *
820 ~singleInefficiencies;
821 singleInefficiencies *= ~efficiencies[looseLegs.first];
831 const Trig2Lasym trig2Lasym,
832 const Trig2Lsym trig2Lsym,
835 -> std::enable_if_t<Trig2Lasym::is2Lasym() && Trig2Lsym::is2Lsym() &&
836 Trig2Lsym::object() == Trig2Lasym::object() &&
838 Trig1L::object() == Trig2Lasym::object(),
840 ATH_MSG_DEBUG(
"Entered Calculator::globalEfficiency_Two2LSeveral1L() at line "
842 if (!trig2Lasym || trig2Lasym.hiddenBy(trigs1L))
845 if (!trig2Lsym || trig2Lsym.hiddenBy(trigs1L))
848 if (trig2Lasym(0) == trig2Lsym() || trig2Lasym(1) == trig2Lsym()) {
850 "implementation -- does this function work properly when the two 2L "
851 "triggers have one leg in common? Must be checked");
854 if (trig2Lasym.symmetric())
856 trig2Lsym, trigs1L, globalEfficiencies);
857 globalEfficiencies = {0.};
858 Efficiencies singleInefficiencies[3] = {{1.}, {1.}, {1.}};
860 efficiencies2Lsym[3] = {{0.}, {0.}, {0.}};
863 for (
auto& lepton : leptons) {
864 if (trig2Lasym.irrelevantFor(lepton))
867 std::map<std::size_t, Efficiencies> efficiencies{{0, 0.}};
868 std::size_t loosest1lepLeg =
870 for (std::size_t leg :
871 {trig2Lasym(0), trig2Lasym(1), trig2Lsym(), loosest1lepLeg}) {
873 validLegs.insert(leg);
875 lepton, runNumber, leg, success));
877 efficiencies.emplace(leg, 0.);
879 if (!validLegs.size())
882 const auto sortedLegs =
m_parent->getSortedLegs(lepton, validLegs, success);
885 std::size_t loosestLeg = sortedLegs[0];
886 std::size_t secondLoosestLeg = validLegs.size() >= 2 ? sortedLegs[1] : 0;
887 std::size_t secondTightestLeg = validLegs.size() >= 3 ? sortedLegs[2] : 0;
888 std::size_t tightestLeg = validLegs.size() >= 4 ? sortedLegs[3] : 0;
889 std::size_t lambda124 =
890 (loosestLeg != trig2Lasym(1)) ? loosestLeg : secondLoosestLeg;
891 std::size_t lambda134 =
892 (loosestLeg != trig2Lasym(0)) ? loosestLeg : secondLoosestLeg;
893 std::size_t lambda234 =
894 (loosestLeg != trig2Lsym()) ? loosestLeg : secondLoosestLeg;
895 std::size_t lambda14 = (lambda124 != trig2Lasym(0)) ? lambda124
896 : (lambda134 != trig2Lasym(1)) ? lambda134
898 std::size_t lambda24 = (lambda124 != trig2Lsym()) ? lambda124
899 : (lambda234 != trig2Lasym(1)) ? lambda234
901 std::size_t lambda34 = (lambda134 != trig2Lsym()) ? lambda134
902 : (lambda234 != trig2Lasym(0)) ? lambda234
904 std::size_t tau13 = 0, tau12 = 0, tau23 = 0;
905 if (loosestLeg == trig2Lsym() || loosestLeg == trig2Lasym(0))
906 tau12 = (loosestLeg == trig2Lsym()) ? trig2Lasym(0) : trig2Lsym();
907 else if (secondLoosestLeg == trig2Lsym() ||
908 secondLoosestLeg == trig2Lasym(0))
909 tau12 = (secondLoosestLeg == trig2Lsym()) ? trig2Lasym(0) : trig2Lsym();
910 else if (secondTightestLeg == trig2Lsym() ||
911 secondTightestLeg == trig2Lasym(0))
912 tau12 = (secondTightestLeg == trig2Lsym()) ? trig2Lasym(0) : trig2Lsym();
913 else if (tightestLeg == trig2Lsym() || tightestLeg == trig2Lasym(0))
914 tau12 = (tightestLeg == trig2Lsym()) ? trig2Lasym(0) : trig2Lsym();
915 if (loosestLeg == trig2Lsym() || loosestLeg == trig2Lasym(1))
916 tau13 = (loosestLeg == trig2Lsym()) ? trig2Lasym(1) : trig2Lsym();
917 else if (secondLoosestLeg == trig2Lsym() ||
918 secondLoosestLeg == trig2Lasym(1))
919 tau13 = (secondLoosestLeg == trig2Lsym()) ? trig2Lasym(1) : trig2Lsym();
920 else if (secondTightestLeg == trig2Lsym() ||
921 secondTightestLeg == trig2Lasym(1))
922 tau13 = (secondTightestLeg == trig2Lsym()) ? trig2Lasym(1) : trig2Lsym();
923 else if (tightestLeg == trig2Lsym() || tightestLeg == trig2Lasym(1))
924 tau13 = (tightestLeg == trig2Lsym()) ? trig2Lasym(1) : trig2Lsym();
925 if (loosestLeg == trig2Lasym(0) || loosestLeg == trig2Lasym(1))
926 tau23 = (loosestLeg == trig2Lasym(0)) ? trig2Lasym(1) : trig2Lasym(0);
927 else if (secondLoosestLeg == trig2Lasym(0) ||
928 secondLoosestLeg == trig2Lasym(1))
930 (secondLoosestLeg == trig2Lasym(0)) ? trig2Lasym(1) : trig2Lasym(0);
931 else if (secondTightestLeg == trig2Lasym(0) ||
932 secondTightestLeg == trig2Lasym(1))
934 (secondTightestLeg == trig2Lasym(0)) ? trig2Lasym(1) : trig2Lasym(0);
935 else if (tightestLeg == trig2Lasym(0) || tightestLeg == trig2Lasym(1))
936 tau23 = (tightestLeg == trig2Lasym(0)) ? trig2Lasym(1) : trig2Lasym(0);
940 globalEfficiencies * ~efficiencies[loosestLeg] +
941 efficiencies[loosest1lepLeg] +
942 (efficiencies[tau13] - efficiencies[secondTightestLeg]) *
943 ~singleInefficiencies[0] +
944 (efficiencies[tau12] - efficiencies[secondTightestLeg]) *
945 ~singleInefficiencies[1] +
946 (efficiencies[tau23] - efficiencies[secondTightestLeg]) *
947 efficiencies2Lsym[2];
948 if (loosestLeg == trig2Lsym())
949 globalEfficiencies +=
950 (efficiencies[trig2Lsym()] - efficiencies[secondLoosestLeg]) *
952 else if (loosestLeg == trig2Lasym(1))
953 globalEfficiencies +=
954 (efficiencies[trig2Lasym(1)] - efficiencies[secondLoosestLeg]) *
955 efficiencies2Lsym[0];
956 else if (loosestLeg == trig2Lasym(0))
957 globalEfficiencies +=
958 (efficiencies[trig2Lasym(0)] - efficiencies[secondLoosestLeg]) *
959 efficiencies2Lsym[1];
960 if (secondTightestLeg &&
961 tightestLeg == loosest1lepLeg)
963 globalEfficiencies +=
964 (efficiencies[secondTightestLeg] - efficiencies[tightestLeg]) *
965 ~singleInefficiencies[2];
968 ~efficiencies[loosestLeg] * efficiencies2Lasym + efficiencies[lambda14];
969 if (loosestLeg == trig2Lasym(0) || loosestLeg == trig2Lasym(1)) {
972 efficiencies2Lasym +=
973 (efficiencies[loosestLeg] - efficiencies[secondLoosestLeg]) *
974 ~singleInefficiencies[loosestLeg == trig2Lasym(0)] +
975 (efficiencies[secondLoosestLeg] - efficiencies[lambda14]) *
976 ~singleInefficiencies[2];
978 efficiencies2Lsym[0] = ~efficiencies[lambda124] * efficiencies2Lsym[0] +
979 efficiencies[lambda24];
980 efficiencies2Lsym[1] = ~efficiencies[lambda134] * efficiencies2Lsym[1] +
981 efficiencies[lambda34];
982 efficiencies2Lsym[2] = ~efficiencies[loosestLeg] * efficiencies2Lsym[2] +
983 efficiencies[lambda234];
984 if (lambda124 == trig2Lsym())
985 efficiencies2Lsym[0] +=
986 (efficiencies[trig2Lsym()] - efficiencies[lambda24]) *
987 ~singleInefficiencies[0];
988 if (lambda134 == trig2Lsym())
989 efficiencies2Lsym[1] +=
990 (efficiencies[trig2Lsym()] - efficiencies[lambda34]) *
991 ~singleInefficiencies[1];
992 if (loosestLeg == trig2Lsym())
993 efficiencies2Lsym[2] +=
994 (efficiencies[trig2Lsym()] - efficiencies[lambda234]) *
995 ~singleInefficiencies[2];
996 singleInefficiencies[0] *= ~efficiencies[lambda124];
997 singleInefficiencies[1] *= ~efficiencies[lambda134];
998 singleInefficiencies[2] *= ~efficiencies[loosestLeg];
1035 const Trig3Lhalfsym trig,
1037 -> std::enable_if_t<Trig3Lhalfsym::is3Lhalfsym(),
bool> {
1038 ATH_MSG_DEBUG(
"Entered Calculator::globalEfficiency_One3L() at line "
1040 if (trig.symmetric())
1042 globalEfficiencies);
1043 globalEfficiencies = {0.};
1045 twoSingleInefficiencies{1.};
1046 Efficiencies efficiencies2Lsym{0.}, efficiencies2Lasym{0.},
1047 efficiencies2L2L{0.};
1048 bool success =
true;
1049 for (
auto& lepton : leptons) {
1050 if (trig.irrelevantFor(lepton))
1053 const int asym = 0, sym = 1;
1057 lepton, runNumber, trig.asymLeg(), success);
1060 lepton, runNumber, trig.symLeg(), success);
1062 m_parent->getLoosestLeg(lepton, trig.asymLeg(), trig.symLeg(),
1063 success) == trig.asymLeg()
1070 lepton, runNumber, trig.symLeg(), success);
1074 Efficiencies delta = efficiencies[asym] - efficiencies[sym];
1075 if (loosestLeg == asym) {
1076 globalEfficiencies = ~efficiencies[asym] * globalEfficiencies +
1077 efficiencies[sym] * efficiencies2L2L +
1078 delta * efficiencies2Lsym;
1079 efficiencies2L2L = ~efficiencies[asym] * efficiencies2L2L +
1080 efficiencies[sym] * ~twoSingleInefficiencies +
1081 delta * ~singleInefficiencies[sym];
1082 efficiencies2Lasym = ~efficiencies[asym] * efficiencies2Lasym +
1083 efficiencies[sym] * ~twoSingleInefficiencies +
1084 delta * ~singleInefficiencies[sym];
1086 globalEfficiencies = ~efficiencies[sym] * globalEfficiencies +
1087 efficiencies[asym] * efficiencies2L2L -
1088 delta * efficiencies2Lasym;
1089 efficiencies2L2L = ~efficiencies[sym] * efficiencies2L2L +
1090 efficiencies[sym] * ~twoSingleInefficiencies;
1091 efficiencies2Lasym = ~efficiencies[sym] * efficiencies2Lasym +
1092 efficiencies[asym] * ~twoSingleInefficiencies -
1093 delta * ~singleInefficiencies[asym];
1095 efficiencies2Lsym = ~efficiencies[sym] * efficiencies2Lsym +
1096 efficiencies[sym] * ~singleInefficiencies[sym];
1097 twoSingleInefficiencies *= ~efficiencies[loosestLeg];
1098 singleInefficiencies[sym] *= ~efficiencies[sym];
1099 singleInefficiencies[asym] *= ~efficiencies[asym];
1138 const Trig2L_obj1 trig2L_obj1,
1139 const Trig2L_obj2 trig2L_obj2,
1140 const Trig2Lmix trig2Lmix,
1142 -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
1143 Trig2L_obj1::object() == Trig2Lmix::object1() &&
1144 Trig2L_obj2::is2Lnomix() &&
1145 Trig2L_obj2::object() == Trig2Lmix::object2(),
1148 ATH_MSG_DEBUG(
"Entered Calculator::globalEfficiency_Three2L() at line "
1151 efficiencies2Lor1L[2] = {{0.}, {0.}};
1152 bool success =
true;
1159 trig2Lmix.template side<Trig2L_obj1>(),
1160 efficiencies2Lor1L[0]);
1162 efficiencies2Lor1L[0] = efficiencies2L[0];
1163 }
else if (trig2Lmix)
1166 trig2Lmix.template side<Trig2L_obj1>(),
1167 efficiencies2Lor1L[0]);
1174 trig2Lmix.template side<Trig2L_obj2>(),
1175 efficiencies2Lor1L[1]);
1177 efficiencies2Lor1L[1] = efficiencies2L[1];
1178 }
else if (trig2Lmix)
1181 trig2Lmix.template side<Trig2L_obj2>(),
1182 efficiencies2Lor1L[1]);
1183 globalEfficiencies = efficiencies2L[0] * ~efficiencies2Lor1L[1] +
1184 efficiencies2L[1] * ~efficiencies2Lor1L[0] +
1185 efficiencies2Lor1L[0] * efficiencies2Lor1L[1];
1195 const Trig2L_obj1 trig2L_obj1,
1196 const Trig2L_obj2 trig2L_obj2,
1197 const Trig2Lmix trig2Lmix,
1201 -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
1202 Trig2L_obj1::object() == Trig2Lmix::object1() &&
1203 Trig2L_obj2::is2Lnomix() &&
1204 Trig2L_obj2::object() == Trig2Lmix::object2() &&
1205 Trig1L_obj1::is1L() &&
1206 Trig1L_obj1::object() == Trig2Lmix::object1() &&
1207 Trig1L_obj2::is1L() &&
1208 Trig1L_obj2::object() == Trig2Lmix::object2(),
1212 "Entered Calculator::globalEfficiency_Three2LSeveral1L() at line "
1215 bool success =
true;
1218 trigs1L_obj1, efficiencies[0]);
1224 trigs1L_obj2, efficiencies[1]);
1228 if (trig2Lmix && !trig2Lmix.hiddenBy(trigs1L_obj1)) {
1229 auto t = trig2Lmix.addTo(trigs1L_obj1);
1237 efficiencies[2] = efficiencies[0];
1238 if (trig2Lmix && !trig2Lmix.hiddenBy(trigs1L_obj2)) {
1239 auto t = trig2Lmix.addTo(trigs1L_obj2);
1247 efficiencies[3] = efficiencies[1];
1248 globalEfficiencies =
1249 Efficiencies(1.) - ~efficiencies[0] * ~efficiencies[1] +
1250 (efficiencies[2] - efficiencies[0]) * (efficiencies[3] - efficiencies[1]);
1262 const LeptonList& leptons,
unsigned runNumber,
1263 const Trig2L_obj1 trig2L_obj1,
const Trig2Lsym_obj1 trig2Lsym_obj1,
1264 const Trig2L_obj2 trig2L_obj2,
const Trig2Lsym_obj2 trig2Lsym_obj2,
1265 const Trig2Lmix trig2Lmix1,
const Trig2Lmix trig2Lmix2,
1268 -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
1269 Trig2L_obj1::object() == Trig2Lmix::object1() &&
1270 Trig2L_obj2::is2Lnomix() &&
1271 Trig2L_obj2::object() == Trig2Lmix::object2() &&
1272 Trig2Lsym_obj1::is2Lsym() &&
1273 Trig2Lsym_obj1::object() == Trig2Lmix::object1() &&
1274 Trig2Lsym_obj2::is2Lsym() &&
1275 Trig2Lsym_obj2::object() == Trig2Lmix::object2() &&
1276 Trig1L_obj1::is1L() &&
1277 Trig1L_obj1::object() == Trig2Lmix::object1() &&
1278 Trig1L_obj2::is1L() &&
1279 Trig1L_obj2::object() == Trig2Lmix::object2(),
1281 ATH_MSG_DEBUG(
"Entered Calculator::globalEfficiency_Six2LSeveral1L() at line "
1284 auto singleObjectFactor = [=](
auto trig2L,
auto trig2Lsym,
auto& trigs1L,
1286 auto eval_for = [=](
const auto& trigs1L_extended,
1288 if (trig2L && trig2Lsym)
1290 trigs1L_extended, eff);
1293 trigs1L_extended, eff);
1296 trigs1L_extended, eff);
1302 bool success = eval_for(trigs1L, efficiencies[0]);
1304 success = success && eval_for(trig2Lmix1.addTo(trigs1L), efficiencies[1]);
1306 efficiencies[1] = efficiencies[0];
1308 auto t = trig2Lmix2.addTo(trigs1L);
1309 success = success && eval_for(t, efficiencies[2]);
1311 success&& eval_for(trig2Lmix1.addTo(t), efficiencies[3]);
1313 efficiencies[3] = efficiencies[2];
1315 efficiencies[2] = efficiencies[0];
1316 efficiencies[3] = efficiencies[1];
1322 bool success = singleObjectFactor(trig2L_obj1, trig2Lsym_obj1, trigs1L_obj1,
1324 singleObjectFactor(trig2L_obj2, trig2Lsym_obj2, trigs1L_obj2,
1327 ~efficiencies1[0] * ~efficiencies2[0] +
1328 (efficiencies1[1] - efficiencies1[0]) *
1329 (efficiencies2[1] - efficiencies2[0]) +
1330 (efficiencies1[2] - efficiencies1[0]) *
1331 (efficiencies2[2] - efficiencies2[0]) -
1332 (efficiencies1[0] - efficiencies1[1] - efficiencies1[2] +
1334 (efficiencies2[0] - efficiencies2[1] -
1335 efficiencies2[2] + efficiencies2[3]);
1365 const Trig3Lmix1 trig1,
1366 const Trig3Lmix2 trig2,
1368 -> std::enable_if_t<Trig3Lmix1::is3Lmix() && Trig3Lmix2::is3Lmix() &&
1369 Trig3Lmix1::object1() == Trig3Lmix2::object2() &&
1370 Trig3Lmix1::object2() == Trig3Lmix2::object1(),
1372 ATH_MSG_DEBUG(
"Entered Calculator::globalEfficiency_Two3L() at line "
1374 Efficiencies efficiencies[6] = {{0.}, {0.}, {0.}, {0.}, {0.}, {0.}};
1375 auto trig2La = trig1.template side<Trig3Lmix1::object1()>();
1376 auto trig1La = trig2.template side<Trig3Lmix2::object2()>();
1380 if (!trig2La.hiddenBy(trig1La))
1381 success = success &&
globalEfficiency(leptons, runNumber, trig2La, trig1La,
1384 efficiencies[2] = efficiencies[0];
1385 auto trig2Lb = trig2.template side<Trig3Lmix2::object1()>();
1386 auto trig1Lb = trig1.template side<Trig3Lmix1::object2()>();
1387 success = success &&
1390 if (!trig2Lb.hiddenBy(trig1Lb))
1391 success = success &&
globalEfficiency(leptons, runNumber, trig2Lb, trig1Lb,
1394 efficiencies[5] = efficiencies[3];
1395 globalEfficiencies =
1396 efficiencies[0] * efficiencies[4] + efficiencies[3] * efficiencies[1] +
1397 (efficiencies[2] - efficiencies[0] - efficiencies[1]) *
1398 (efficiencies[3] + efficiencies[4] - efficiencies[5]);
1526 const std::vector<TrigDef>& triggers,
1528 ATH_MSG_DEBUG(
"Entered Calculator::globalEfficiency_Toys() at line "
1530 globalEfficiencies = {0.};
1531 if (
m_parent->m_numberOfToys <= 0) {
1535 std::map<const Lepton*, std::vector<std::pair<std::size_t, Efficiencies>>>
1537 for (
auto& lepton : leptons) {
1541 auto& efficiencies = leptonEfficiencies[&lepton];
1542 const int nLegs = validLegs.size();
1544 bool success =
true;
1545 for (std::size_t leg :
1546 m_parent->getSortedLegs(lepton, validLegs, success)) {
1548 lepton, runNumber, leg, success));
1555 if (!
m_parent->m_useInternalSeed) {
1556 if (!
m_parent->retrieveEventNumber(seed)) {
1562 std::mt19937_64 randomEngine(seed);
1563 std::uniform_real_distribution<double> uniformPdf(0., 1.);
1564 std::vector<flat_set<std::size_t>> firedLegs(leptonEfficiencies.size());
1565 unsigned long nPassed[2] = {0, 0};
1566 for (
unsigned long toy = 0; toy <
m_parent->m_numberOfToys; ++toy) {
1567 for (
int step = 0; step < 2; ++step)
1569 auto legs = firedLegs.begin();
1570 for (
auto& kv : leptonEfficiencies) {
1572 double x = uniformPdf(randomEngine);
1573 for (
auto& p : kv.second) {
1574 if (
x < (step ? p.second.mc() : p.second.data()))
1575 legs->emplace(p.first);
1579 for (
auto& trig : triggers) {
1587 globalEfficiencies.
data() =
1588 double(nPassed[0]) / double(
m_parent->m_numberOfToys);
1589 globalEfficiencies.
mc() =
1590 double(nPassed[1]) / double(
m_parent->m_numberOfToys);