80 const EventContext& ctx)
const {
82 ATH_MSG_DEBUG(
"TrigAFPDijetComboHypoTool::executeAlg Executing algorithm");
84 std::vector<ElementLink<xAOD::JetContainer>> selected_jets;
87 if(combination.size() != 3)
ATH_MSG_ERROR(
"Number of leg decisions is not 3!");
91 for(
const auto& comb: combination){
92 const auto dec = comb.second;
94 if (jet_link.isValid()) {
95 selected_jets.push_back(jet_link);
99 if(selected_jets.size() != 2){
100 ATH_MSG_ERROR(
"Expecting to combine exactly two jets, but instead found "
101 << selected_jets.size() <<
". Will throw a runtime error");
102 throw std::runtime_error(
103 "Expecting to combine exactly two jets, but instead found " +
104 std::to_string(selected_jets.size()));
108 auto jetLink1 = selected_jets[0];
109 auto jetLink2 = selected_jets[1];
111 TLorentzVector jet1_vec = (*jetLink1)->p4();
112 TLorentzVector jet2_vec = (*jetLink2)->p4();
113 TLorentzVector dijet = jet1_vec + jet2_vec;
118 dijetMass = dijet.M() *
m_GeV;
120 dijetRapidity = dijet.Rapidity();
133 auto predictProtonAEnergy =
Monitored::Scalar(
"PredictProtonAEnergy" , -999.0 );
134 auto predictProtonCEnergy =
Monitored::Scalar(
"PredictProtonCEnergy" , -999.0 );
159 double sideA_minDist = 9e9;
160 double sideC_minDist = 9e9;
162 int nearestTrackSideAId = 999;
163 int nearestTrackSideCId = 999;
170 for(
auto track: (*tracksAFP)){
177 if(track->stationID() == 1){
180 yDiff = sideA_predictY - track->yLocal();
181 distance = sqrt(xDiff * xDiff + yDiff * yDiff);
183 if(distance < sideA_minDist){
184 sideA_minDist = distance;
185 nearestTrackSideAId = track->index();
188 }
else if(track->stationID() == 2){
191 yDiff = sideC_predictY - track->yLocal();
192 distance = sqrt(xDiff * xDiff + yDiff * yDiff);
194 if(distance < sideC_minDist){
195 sideC_minDist = distance;
196 nearestTrackSideCId = track->index();
206 bool passRCutA =
false;
207 bool passRCutC =
false;
209 bool passXYCutA =
false;
210 bool passXYCutC =
false;
223 if(nearestTrackSideAId != 999){
226 sideA_trackY = tracksAFP.
get()->at(nearestTrackSideAId)->yLocal();
227 sideA_diffX = sideA_predictX - sideA_trackX;
228 sideA_diffY = sideA_predictY - sideA_trackY;
230 ATH_MSG_DEBUG(
"TrigAFPDijetComboHypoTool::execute sideA_diffX: " << sideA_diffX);
242 if(nearestTrackSideCId != 999){
245 sideC_trackY = tracksAFP.
get()->at(nearestTrackSideCId)->yLocal();
246 sideC_diffX = sideC_predictX - sideC_trackX;
247 sideC_diffY = sideC_predictY - sideC_trackY;
270 if(passRCutA && passRCutC && passXYCutA && passXYCutC) pass =
true;
LinkInfo< T > findLink(const Decision *start, const std::string &linkName, const bool suppressMultipleLinksWarning=false)
Perform a recursive search for ElementLinks of type T and name 'linkName', starting from Decision obj...