11 return StatusCode::SUCCESS;
16 if (passingLegs.size() == 0) {
17 return StatusCode::SUCCESS;
20 std::vector<std::vector<Combo::LegDecision>> legDecisions;
29 std::unordered_set<TrigCompositeUtils::DecisionID> dispj_leg_ids;
31 ATH_MSG_DEBUG(
"Have "<<passingLegs.size()<<
" passing legs in");
34 if(!passingLegs.contains(legId))
continue;
36 auto decs = passingLegs[legId];
37 if(decs.size() == 0)
continue;
41 dispj_leg_ids.insert(legId);
45 ATH_MSG_DEBUG(
"Have "<<dispj_leg_ids.size()<<
" dispjet legs");
47 std::vector<const xAOD::Jet*> input_jets;
48 std::map<const xAOD::Jet*, std::vector<Combo::LegDecision>> jet_decisions;
51 for(
const auto& leg_decs : legDecisions){
52 for(
auto dec_pair : leg_decs){
57 if(dispj_leg_ids.count(dec_pair.first) == 0)
continue;
61 if(jet_feature_links.size() == 0)
continue;
68 jet_decisions[
jet].push_back(dec_pair);
77 for(
const auto &
pair: jet_decisions){
78 input_jets.push_back(
pair.first);
81 if(input_jets.empty()){
86 return StatusCode::SUCCESS;
93 ATH_MSG_DEBUG(
"Reject event as it has "<<input_jets.size()<<
" input passing jets but max jet cut is "<<
m_maxjets);
95 return StatusCode::SUCCESS;
102 return a->pt() > b->pt();
107 Combo::LegDecisionsMap accepted_decisions_by_leg;
109 unsigned int n_jets_passed = 0;
111 for(
size_t i = 0; i<input_jets.size(); i++){
116 for(
auto leg_dec_pair: jet_decisions.at(input_jets.at(i))){
117 accepted_decisions_by_leg[leg_dec_pair.first].push_back(leg_dec_pair.second);
118 ATH_MSG_DEBUG(
"Accepting decision for jet "<<input_jets.at(i)->pt()/1000.0);
123 if(n_jets_passed < input_jets.size()){
127 for (
auto& legIt : passingLegs) {
128 if(dispj_leg_ids.count(legIt.first) == 0)
continue;
130 auto accepted_decisions_on_leg = accepted_decisions_by_leg.find(legIt.first);
132 if(accepted_decisions_on_leg != accepted_decisions_by_leg.end()){
134 legIt.second = accepted_decisions_on_leg->second;
135 ATH_MSG_DEBUG(
"Updating leg "<<legIt.first<<
" with "<<accepted_decisions_on_leg->second.size()<<
" decisions");
139 ATH_MSG_DEBUG(
"Updating leg "<<legIt.first<<
"; clearing decisions");
140 legIt.second.clear();
147 for(
size_t i=0; i<lm.size(); i++){
150 if(passingLegs[legId].size() < (
size_t)(lm.at(i))){
153 ATH_MSG_DEBUG(
"Leg "<<legId<<
" fails mulitplicity check, rejecting event");
155 return StatusCode::SUCCESS;
159 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
bool hasObjectLink(const std::string &name, const CLID clid=CLID_NULL) const
Check if a link to an object with a given name and type exists. CLID_NULL to not check type.
xAOD::TrigComposite Decision
const std::string & featureString()
void findLinks(const Decision *start, const std::string &linkName, std::vector< LinkInfo< T > > &links, unsigned int behaviour=TrigDefs::allFeaturesOfType, std::set< const xAOD::TrigComposite * > *fullyExploredFrom=nullptr)
search back the TC links for the object of type T linked to the one of TC (recursively) Populates pro...
static const unsigned int lastFeatureOfType
Run 3 "enum". Only return the final feature along each route through the navigation.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Jet_v1 Jet
Definition of the current "jet version".
Helper to keep a Decision object, ElementLink and ActiveState (with respect to some requested ChainGr...
ElementLink< T > link
Link to the feature.