ATLAS Offline Software
AFP_SIDLocRecoTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 using namespace std;
8 
10  const std::string &name,
11  const IInterface *parent)
12  : base_class(type, name, parent)
13 {
14  ATH_MSG_DEBUG("in AFP_SIDLocRecoTool constructor");
15 }
16 
17 
19 {
20  ATH_MSG_DEBUG("in AFP_SIDLocRecoTool::initialize()");
21 
22  // track reconstruction tools
23  if(m_recoToolsList.empty())
24  {
25  ATH_MSG_ERROR("No track reconstruction tools set, check settings in AFP_LocReco/AFP_LocReco.py. Aborting.");
26  return StatusCode::FAILURE;
27  }
28  else
29  {
30  CHECK( m_recoToolsList.retrieve() );
31  }
32 
33  // output containers for the track reconstruction tools
34  if(m_arrayOfWriteHandleKeys.empty())
35  {
36  ATH_MSG_ERROR("No output track containers provided, check settings in AFP_LocReco/AFP_LocReco.py. Aborting.");
37  return StatusCode::FAILURE;
38  }
39  else
40  {
41  CHECK( m_arrayOfWriteHandleKeys.initialize() );
42  }
43 
44 
45  // the code in execute relies on the facts that (a) the keys in WriteHandleKeyArray are unique; (b) all output container names from track reco tools are also in WriteHandleKeyArray; and moreover (c) that there are no extra WriteHandleKeys that are not present in any track reco tools
46  // case (c) wouldn't necessarily break things but it's not a sign of a good configuration and thus it's forbidden as well
47  // first, get names from write handle keys
48  std::vector<std::string> listOfWHKeys;
49  for(const auto &whk : m_arrayOfWriteHandleKeys)
50  {
51  ATH_MSG_DEBUG("have WHKey "<<whk.key());
52  listOfWHKeys.push_back(whk.key());
53  }
54  unsigned int all_WHkeys=listOfWHKeys.size();
55  // remove duplicities, there shouldn't be any
56  std::sort(listOfWHKeys.begin(), listOfWHKeys.end());
57  listOfWHKeys.erase(std::unique(listOfWHKeys.begin(),listOfWHKeys.end()), listOfWHKeys.end());
58  if(listOfWHKeys.size() != all_WHkeys)
59  {
60  ATH_MSG_ERROR("It seems write handle keys do not have unique values, check settings in AFP_LocReco/AFP_LocReco.py. Aborting.");
61  return StatusCode::FAILURE;
62  }
63  // get names from track reco tools
64  std::vector<std::string> listOfOutputContainers;
65  for(const auto &recoTool : m_recoToolsList)
66  {
67  ATH_MSG_DEBUG("have ouput container "<<recoTool->outputContainerName());
68  listOfOutputContainers.push_back(recoTool->outputContainerName());
69  }
70  // remove duplicities, they are allowed
71  std::sort(listOfOutputContainers.begin(), listOfOutputContainers.end());
72  listOfOutputContainers.erase(std::unique(listOfOutputContainers.begin(),listOfOutputContainers.end()), listOfOutputContainers.end());
73  // write handle keys and names from track reco tools should have the same size
74  if(listOfWHKeys.size() != listOfOutputContainers.size())
75  {
76  ATH_MSG_ERROR("There is different number of unique write handle keys ("<<listOfWHKeys.size()<<") and unique output containers ("<<listOfOutputContainers.size()<<"). Aborting");
77  return StatusCode::FAILURE;
78  }
79  // check they are the same; one of these loops are not strictly neccessary, but they will print outstanding names
80  bool doAbort=false;
81  for(const auto &trkOutCont : listOfOutputContainers)
82  {
83  if(std::find(listOfWHKeys.begin(),listOfWHKeys.end(),trkOutCont) == listOfWHKeys.end())
84  {
85  ATH_MSG_ERROR("Cannot find track reconstruction output container "<<trkOutCont<<" in write handle keys. Aborting");
86  doAbort=true;
87  }
88  }
89  for(const auto &whk : listOfWHKeys)
90  {
91  if(std::find(listOfOutputContainers.begin(),listOfOutputContainers.end(),whk) == listOfOutputContainers.end())
92  {
93  ATH_MSG_ERROR("Cannot find write handle key "<<whk<<" in track reconstruction output containers. Aborting");
94  doAbort=true;
95  }
96  }
97  if(doAbort) return StatusCode::FAILURE;
98  // Now, we are sure it's setup correctly
99 
100 
101  // monitoring
102  if (!(m_monTool.name().empty())) {
103  CHECK( m_monTool.retrieve() );
104  ATH_MSG_DEBUG("m_monTool name: " << m_monTool);
105  }
106 
107  return StatusCode::SUCCESS;
108 }
109 
110 StatusCode AFP_SIDLocRecoTool::execute(const EventContext& ctx) const
111 {
112  ATH_MSG_DEBUG("in AFP_SIDLocRecoTool::execute()");
113 
114 
115  auto trkSize = Monitored::Scalar("TrkSize", 0.0);
116 
117  for(const auto &whk : m_arrayOfWriteHandleKeys)
118  {
119  // reconstruct tracks
120  auto afpTrk=std::make_unique<xAOD::AFPTrackContainer>();
121  auto afpTrkAux=std::make_unique<xAOD::AFPTrackAuxContainer>();
122  afpTrk->setStore(afpTrkAux.get());
123 
124  for(const auto &recoTool : m_recoToolsList)
125  {
126  if(recoTool->outputContainerName() != whk.key()) continue;
127 
128  if( recoTool->reconstructTracks(afpTrk, ctx).isFailure() )
129  {
130  ATH_MSG_WARNING ("Failed to reconstruct tracks with algorithm = "<<recoTool->name());
131  }
132  }
133 
134  trkSize += afpTrk->size();
135  ATH_MSG_DEBUG("Number of AFP SID tracks = " << trkSize);
136 
137  SG::WriteHandle<xAOD::AFPTrackContainer> trackContainer(whk, ctx);
138  ATH_CHECK( trackContainer.record(std::move(afpTrk), std::move(afpTrkAux)) );
139  }
140 
141  Monitored::Group( m_monTool, trkSize);
142 
143  return StatusCode::SUCCESS;
144 }
145 
147 {
148  return StatusCode::SUCCESS;
149 }
150 
TrigDefs::Group
Group
Properties of a chain group.
Definition: GroupProperties.h:13
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
AFP_SIDLocRecoTool::m_arrayOfWriteHandleKeys
SG::WriteHandleKeyArray< xAOD::AFPTrackContainer > m_arrayOfWriteHandleKeys
Array of unique write handle keys for track output containers.
Definition: AFP_SIDLocRecoTool.h:57
AFP_SIDLocRecoTool::AFP_SIDLocRecoTool
AFP_SIDLocRecoTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: AFP_SIDLocRecoTool.cxx:9
AFP_SIDLocRecoTool.h
AFP_SIDLocRecoTool::m_recoToolsList
ToolHandleArray< IAFPSiDLocRecoTrackAlgTool > m_recoToolsList
Vector of tool handles to be used for tracks reconstruction.
Definition: AFP_SIDLocRecoTool.h:52
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
AFP_SIDLocRecoTool::finalize
StatusCode finalize() override
Does nothing.
Definition: AFP_SIDLocRecoTool.cxx:146
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
std::unique
std::reverse_iterator< DataModel_detail::iterator< DVL > > unique(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, BinaryPredicate pred)
Specialization of unique for DataVector/List.
Definition: DVL_algorithms.h:199
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
AFP_SIDLocRecoTool::initialize
StatusCode initialize() override
Definition: AFP_SIDLocRecoTool.cxx:18
AFP_SIDLocRecoTool::m_monTool
ToolHandle< GenericMonitoringTool > m_monTool
@ brief Monitoring tool
Definition: AFP_SIDLocRecoTool.h:60
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
AFP_SIDLocRecoTool::execute
StatusCode execute(const EventContext &ctx) const override
Run pixel clustering tool and next run track reconstruction tools.
Definition: AFP_SIDLocRecoTool.cxx:110
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34