19 m_transportBeamA(
"AFPProtonTransportTool/TransportBeamA", this),
20 m_transportBeamC(
"AFPProtonTransportTool/TransportBeamC", this)
22 declareProperty(
"TransportBeamA",
m_transportBeamA,
"Proton transport tool side A");
23 declareProperty(
"TransportBeamC",
m_transportBeamC,
"Proton transport tool side C");
31 ATH_MSG_INFO(
"Initialization. The correct configuration of this algorithm "
32 <<
"requires jets ordered in increasing energy");
70 return StatusCode::SUCCESS;
75 return l->p4().Et() >
r->p4().Et();
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 " +
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);
185 nearestTrackSideAId =
track->index();
188 }
else if(
track->stationID() == 2){
191 yDiff = sideC_predictY -
track->yLocal();
192 distance = sqrt(xDiff * xDiff + yDiff * yDiff);
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;