ATLAS Offline Software
Loading...
Searching...
No Matches
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
7using 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
110StatusCode 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
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.
AFP_SIDLocRecoTool(const std::string &type, const std::string &name, const IInterface *parent)
ToolHandleArray< IAFPSiDLocRecoTrackAlgTool > m_recoToolsList
Vector of tool handles to be used for tracks reconstruction.
StatusCode initialize() override
SG::WriteHandleKeyArray< xAOD::AFPTrackContainer > m_arrayOfWriteHandleKeys
Array of unique write handle keys for track output containers.
StatusCode execute(const EventContext &ctx) const override
Run pixel clustering tool and next run track reconstruction tools.
StatusCode finalize() override
Does nothing.
ToolHandle< GenericMonitoringTool > m_monTool
@ brief Monitoring tool
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
STL namespace.
DataModel_detail::iterator< DVL > unique(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of unique for DataVector/List.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.