ATLAS Offline Software
Loading...
Searching...
No Matches
AFP_TDLocRecoTool.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_TDLocRecoTool::AFP_TDLocRecoTool");
15}
16
17
19{
20 ATH_MSG_DEBUG("begin AFP_TDLocRecoTool::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 // 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
45 // case (c) wouldn't necessarily break things but it's not a sign of a good configuration and thus it's forbidden as well
46 // first, get names from write handle keys
47 std::vector<std::string> listOfWHKeys;
48 for(const auto &whk : m_arrayOfWriteHandleKeys)
49 {
50 ATH_MSG_DEBUG("have WHKey "<<whk.key());
51 listOfWHKeys.push_back(whk.key());
52 }
53 unsigned int all_WHkeys=listOfWHKeys.size();
54 // remove duplicities, there shouldn't be any
55 std::sort(listOfWHKeys.begin(), listOfWHKeys.end());
56 listOfWHKeys.erase(std::unique(listOfWHKeys.begin(),listOfWHKeys.end()), listOfWHKeys.end());
57 if(listOfWHKeys.size() != all_WHkeys)
58 {
59 ATH_MSG_ERROR("It seems write handle keys do not have unique values, check settings in AFP_LocReco/AFP_LocReco.py. Aborting.");
60 return StatusCode::FAILURE;
61 }
62 // get names from track reco tools
63 std::vector<std::string> listOfOutputContainers;
64 for(const auto &recoTool : m_recoToolsList)
65 {
66 ATH_MSG_DEBUG("have ouput container "<<recoTool->outputContainerName());
67 listOfOutputContainers.push_back(recoTool->outputContainerName());
68 }
69 // remove duplicities, they are allowed
70 std::sort(listOfOutputContainers.begin(), listOfOutputContainers.end());
71 listOfOutputContainers.erase(std::unique(listOfOutputContainers.begin(),listOfOutputContainers.end()), listOfOutputContainers.end());
72 // write handle keys and names from track reco tools should have the same size
73 if(listOfWHKeys.size() != listOfOutputContainers.size())
74 {
75 ATH_MSG_ERROR("There is different number of unique write handle keys ("<<listOfWHKeys.size()<<") and unique output containers ("<<listOfOutputContainers.size()<<"). Aborting");
76 return StatusCode::FAILURE;
77 }
78 // check they are the same; one of these loops are not strictly neccessary, but they will print outstanding names
79 bool doAbort=false;
80 for(const auto &trkOutCont : listOfOutputContainers)
81 {
82 if(std::find(listOfWHKeys.begin(),listOfWHKeys.end(),trkOutCont) == listOfWHKeys.end())
83 {
84 ATH_MSG_ERROR("Cannot find track reconstruction output container "<<trkOutCont<<" in write handle keys. Aborting");
85 doAbort=true;
86 }
87 }
88 for(const auto &whk : listOfWHKeys)
89 {
90 if(std::find(listOfOutputContainers.begin(),listOfOutputContainers.end(),whk) == listOfOutputContainers.end())
91 {
92 ATH_MSG_ERROR("Cannot find write handle key "<<whk<<" in track reconstruction output containers. Aborting");
93 doAbort=true;
94 }
95 }
96 if(doAbort) return StatusCode::FAILURE;
97 // Now, we are sure it's setup correctly
98
99
100 ATH_MSG_DEBUG("end AFP_TDLocRecoTool::initialize()");
101 return StatusCode::SUCCESS;
102}
103
104StatusCode AFP_TDLocRecoTool::execute(const EventContext& ctx) const
105{
106 ATH_MSG_DEBUG("begin AFP_TDLocRecoTool::execute()");
107
108 for(const auto &whk : m_arrayOfWriteHandleKeys)
109 {
110 // reconstruct tracks
111 auto afpTrk=std::make_unique<xAOD::AFPToFTrackContainer>();
112 auto afpTrkAux=std::make_unique<xAOD::AFPToFTrackAuxContainer>();
113 afpTrk->setStore(afpTrkAux.get());
114
115 ATH_MSG_DEBUG("Number of AFP ToF tracks = " <<afpTrk->size());
116
117 for(const auto &recoTool : m_recoToolsList)
118 {
119 if(recoTool->outputContainerName() != whk.key()) continue;
120
121 if( recoTool->reconstructTracks(afpTrk, ctx).isFailure() )
122 {
123 ATH_MSG_WARNING ("Failed to reconstruct tracks with algorithm = "<<recoTool->name());
124 }
125 }
126
127 SG::WriteHandle<xAOD::AFPToFTrackContainer> trackContainer(whk, ctx);
128 ATH_CHECK( trackContainer.record(std::move(afpTrk), std::move(afpTrkAux)) );
129 }
130
131 ATH_MSG_DEBUG("end AFP_TDLocRecoTool::execute()");
132 return StatusCode::SUCCESS;
133}
134
136{
137 return StatusCode::SUCCESS;
138}
139
140
141
#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.
SG::WriteHandleKeyArray< xAOD::AFPToFTrackContainer > m_arrayOfWriteHandleKeys
Array of unique write handle keys for track output containers.
StatusCode initialize() override
ToolHandleArray< IAFPTDLocRecoTrackAlgTool > m_recoToolsList
Vector of tool handles to be used for tracks reconstruction.
StatusCode finalize() override
Does nothing.
AFP_TDLocRecoTool(const std::string &type, const std::string &name, const IInterface *parent)
StatusCode execute(const EventContext &ctx) const override
Run pixel clustering tool and next run track reconstruction tools.
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.