ATLAS Offline Software
TrigAFPToFHypoAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "TrigAFPToFHypoAlg.h"
6 
7 using namespace TrigCompositeUtils;
8 
9 TrigAFPToFHypoAlg::TrigAFPToFHypoAlg(const std::string &name, ISvcLocator *pSvcLocator):
10  ::HypoBase(name, pSvcLocator)
11 {
12 }
13 
15 {
16  ATH_MSG_DEBUG("TrigAFPToFHypoAlg::initialize()");
17  ATH_CHECK(m_inputIdVtxKey.initialize()); //ID vertex
18  ATH_CHECK(m_inputAfpVtxKey.initialize()); //ToF vertex
19  ATH_CHECK(m_hypoTools.retrieve());
20  if (!m_monTool.empty()) ATH_CHECK(m_monTool.retrieve());
21  return StatusCode::SUCCESS;
22 }
23 
24 StatusCode TrigAFPToFHypoAlg::execute(const EventContext &context) const
25 {
26  ATH_MSG_DEBUG("TrigAFPToFHypoAlg::execute()");
27 
28  // Create the input and output decision containers
29  SG::ReadHandle<DecisionContainer> inputDecisionsHandle(decisionInput(), context);
30  SG::WriteHandle<DecisionContainer> outputDecisionsHandle = createAndStore(decisionOutput(), context );
31 
32  // Jet vertex container
34  ATH_CHECK(idVtxHandle.isValid());
35 
36  // AFP ToF vertex container
38  ATH_CHECK(afpVtxHandle.isValid());
39 
40  // monitor reason for skipping hypo tool
41  auto skipHypoTool = Monitored::Scalar<int>("skipHypoTool", 0);
42 
43  // vertex handle error checking
44  if (!afpVtxHandle.isValid()) {
45  ATH_MSG_DEBUG("AFP vertex handle invalid");
46  skipHypoTool = 1;
47  }
48  if (!idVtxHandle.isValid()) {
49  ATH_MSG_DEBUG("ID vertex handle invalid");
50  skipHypoTool = 2;
51  }
52 
53  // check vertex handle size
54  if (afpVtxHandle->size() == 0) {
55  ATH_MSG_DEBUG("No AFP vertices");
56  skipHypoTool = 3;
57  }
58  if (idVtxHandle->size() == 0) {
59  ATH_MSG_DEBUG("No ID vertices");
60  skipHypoTool = 4;
61  }
62 
63  // check if the only vertex has tracks (exclude 0 AFP vertices)
64  if (skipHypoTool != 3 && idVtxHandle->size() == 1 && idVtxHandle->at(0)->vxTrackAtVertexAvailable() == false) {
65  ATH_MSG_DEBUG("The only ID vertex has no tracks");
66  skipHypoTool = 5;
67  }
68 
69  // monitor number of vertices
70  auto n_afp_vertex = Monitored::Scalar<size_t>("afp_vtx_count", 0);
71  auto n_id_vertex = Monitored::Scalar<size_t>("id_vtx_count", 0);
72 
73  // loop over AFP vertices
74  for (size_t i = 0; i < afpVtxHandle->size(); ++i) {
75  const xAOD::AFPVertex* afpVtx = afpVtxHandle->at(i);
76  // if hypo tool is not skipped, print vertex information
77  if (skipHypoTool == 0) ATH_MSG_DEBUG("AFP vertex [" << i << "] z position: " << afpVtx->position());
78  auto afp_vtx_z = Monitored::Scalar<float>("afp_vtx_z", afpVtx->position());
79  Monitored::fill(m_monTool, afp_vtx_z);
80  n_afp_vertex += 1;
81  }
82  Monitored::fill(m_monTool, n_afp_vertex);
83 
84  // loop over ID vertices
85  for (size_t i = 0; i < idVtxHandle->size(); ++i) {
86  const xAOD::Vertex* idVtx = idVtxHandle->at(i);
87  // if hypo tool is not skipped, print vertex information
88  if (skipHypoTool == 0) ATH_MSG_DEBUG("ID vertex [" << i << "] z position: " << idVtx->z()
89  << " chi2: " << idVtx->chiSquared()
90  << " ndof: " << idVtx->numberDoF());
91  // skip dummy vertex
92  if (idVtx->vxTrackAtVertexAvailable() == false) continue;
93  if (idVtx->nTrackParticles() == 0) continue;
94 
95  auto id_vtx_z = Monitored::Scalar<float>("id_vtx_z", idVtx->z());
96  Monitored::fill(m_monTool, id_vtx_z);
97  n_id_vertex += 1;
98  }
99  Monitored::fill(m_monTool,n_id_vertex);
100 
101  // Vector of structs to pass to hypo tool
102  std::vector<TrigAFPToFHypoTool::AFPToFHypoToolInfo> hypoToolInput;
103 
104  // monitor the reason for skipping the hypo tool
105  Monitored::fill(m_monTool, skipHypoTool);
106 
107  if (skipHypoTool != 0)
108  {
109  ATH_MSG_DEBUG("Skipping hypo tool");
110  }
111  else
112  {
113  for (size_t i = 0; i < inputDecisionsHandle->size(); ++i) {
114  const Decision* previousDecision = inputDecisionsHandle->at(i);
115 
116  const xAOD::AFPVertex* afpVtx = afpVtxHandle->at(0);
117  const xAOD::Vertex* idVtx = idVtxHandle->at(0);
118 
119  // monitor delta z between vertices
120  auto delta_z = Monitored::Scalar<float>("delta_z", afpVtx->position() - idVtx->z());
121  Monitored::fill(m_monTool, delta_z);
122 
123  // Create an output Decision Object to track this object in the trigger navigation.
124  Decision* outputDecision = newDecisionIn(outputDecisionsHandle.ptr(), hypoAlgNodeName());
125 
126  // We link this 'outputDecision' to its parent, 'inputDecision'
127  linkToPrevious(outputDecision, previousDecision, context);
128 
129  // We attach the "feature" ElementLink which associates the DecisionObject with the AFP vertex
130  outputDecision->setObjectLink(featureString(), ElementLink<xAOD::AFPVertexContainer>(*afpVtxHandle, i, context));
131 
132  // We collect the set of chains which were active on this inputDecision coming in to this Step.
133  DecisionIDContainer inputPassingChains;
134  decisionIDs(previousDecision, inputPassingChains);
135 
136  hypoToolInput.emplace_back(inputPassingChains, afpVtx, idVtx, outputDecision);
137  }
138  }
139 
140  // Each individual chain has its own HypoTool, we loop over them and give them the hypoToolInput to discriminate over
141  for (const auto &tool : m_hypoTools) {
142  ATH_CHECK(tool->decide(hypoToolInput));
143  }
144 
145  // Performs some runtime-checks.
146  ATH_CHECK( hypoBaseOutputProcessing(outputDecisionsHandle) );
147 
148  return StatusCode::SUCCESS;
149 }
xAOD::Vertex_v1::nTrackParticles
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
Definition: Vertex_v1.cxx:270
TrigAFPToFHypoAlg::m_inputAfpVtxKey
SG::ReadHandleKey< xAOD::AFPVertexContainer > m_inputAfpVtxKey
Definition: TrigAFPToFHypoAlg.h:34
TrigAFPToFHypoAlg::m_inputIdVtxKey
SG::ReadHandleKey< xAOD::VertexContainer > m_inputIdVtxKey
Definition: TrigAFPToFHypoAlg.h:33
TrigAFPToFHypoAlg::execute
virtual StatusCode execute(const EventContext &context) const override
Definition: TrigAFPToFHypoAlg.cxx:24
TrigCompositeUtils::newDecisionIn
Decision * newDecisionIn(DecisionContainer *dc, const std::string &name)
Helper method to create a Decision object, place it in the container and return a pointer to it.
Definition: TrigCompositeUtilsRoot.cxx:46
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
xAOD::AFPVertex_v1::position
float position() const
Vertex position .
TrigCompositeUtils::hypoAlgNodeName
const std::string & hypoAlgNodeName()
Definition: TrigCompositeUtilsRoot.cxx:906
TrigCompositeUtils::createAndStore
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.
Definition: TrigCompositeUtilsRoot.cxx:30
TrigAFPToFHypoAlg::m_monTool
ToolHandle< GenericMonitoringTool > m_monTool
Definition: TrigAFPToFHypoAlg.h:38
lumiFormat.i
int i
Definition: lumiFormat.py:92
TrigAFPToFHypoAlg::initialize
virtual StatusCode initialize() override
Definition: TrigAFPToFHypoAlg.cxx:14
xAOD::TrigComposite_v1::setObjectLink
bool setObjectLink(const std::string &name, const ElementLink< CONTAINER > &link)
Set the link to an object.
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::WriteHandle::ptr
pointer_type ptr()
Dereference the pointer.
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::Vertex_v1::z
float z() const
Returns the z position.
xAOD::TrigComposite_v1
Class used to describe composite objects in the HLT.
Definition: TrigComposite_v1.h:52
TrigAFPToFHypoAlg::m_hypoTools
ToolHandleArray< TrigAFPToFHypoTool > m_hypoTools
Definition: TrigAFPToFHypoAlg.h:35
Monitored::fill
void fill(const ToolHandle< GenericMonitoringTool > &tool, T &&... variables)
Definition: MonitoredGroup.h:122
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
TrigCompositeUtils::featureString
const std::string & featureString()
Definition: TrigCompositeUtilsRoot.cxx:886
TrigAFPToFHypoAlg::TrigAFPToFHypoAlg
TrigAFPToFHypoAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TrigAFPToFHypoAlg.cxx:9
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:453
xAOD::Vertex_v1::numberDoF
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
TrigCompositeUtils::linkToPrevious
void linkToPrevious(Decision *d, const std::string &previousCollectionKey, size_t previousIndex)
Links to the previous object, location of previous 'seed' decision supplied by hand.
Definition: TrigCompositeUtilsRoot.cxx:139
TrigCompositeUtils::DecisionIDContainer
std::set< DecisionID > DecisionIDContainer
Definition: TrigComposite_v1.h:28
xAOD::Vertex_v1::chiSquared
float chiSquared() const
Returns the of the vertex fit as float.
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
TrigCompositeUtils::decisionIDs
void decisionIDs(const Decision *d, DecisionIDContainer &destination)
Extracts DecisionIDs stored in the Decision object.
Definition: TrigCompositeUtilsRoot.cxx:67
TrigCompositeUtils
Definition: Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h:19
DataVector::at
const T * at(size_type n) const
Access an element, as an rvalue.
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
TrigAFPToFHypoAlg.h
xAOD::AFPVertex_v1
Class representing a vertex reconstructed in AFP.
Definition: AFPVertex_v1.h:41
xAOD::Vertex_v1::vxTrackAtVertexAvailable
bool vxTrackAtVertexAvailable() const
Check if VxTrackAtVertices are attached to the object.
Definition: Vertex_v1.cxx:209
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.