ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimGNNRootOutputTool.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
4
6// AthAlgTool
7
8FPGATrackSimGNNRootOutputTool::FPGATrackSimGNNRootOutputTool(const std::string& algname, const std::string& name, const IInterface *ifc) :
9 AthAlgTool(algname, name, ifc)
10{
11}
12
14{
15 ATH_CHECK(m_tHistSvc.retrieve());
17 ATH_CHECK(m_layerNumberTool.retrieve());
18 m_pix_h2l = m_layerNumberTool->pixelLayers();
19 m_layerGeometry = m_layerNumberTool->layerGeometry();
20 return StatusCode::SUCCESS;
21}
22
24// Functions
25
27{
28 std::string hittree_str = "FPGATrackSimHit_reg" + m_region.value();
29 m_hit_tree = new TTree(hittree_str.c_str(), hittree_str.c_str());
30 m_hit_tree->Branch("hit_id",&m_hit_id);
31 m_hit_tree->Branch("hit_module_id",&m_hit_module_id);
32 m_hit_tree->Branch("hit_x",&m_hit_x);
33 m_hit_tree->Branch("hit_y",&m_hit_y);
34 m_hit_tree->Branch("hit_z",&m_hit_z);
35 m_hit_tree->Branch("hit_r",&m_hit_r);
36 m_hit_tree->Branch("hit_phi",&m_hit_phi);
37 m_hit_tree->Branch("hit_isPixel",&m_hit_isPixel);
38 m_hit_tree->Branch("hit_isStrip",&m_hit_isStrip);
39 m_hit_tree->Branch("hit_hitType",&m_hit_hitType);
40 m_hit_tree->Branch("hit_uniqueID",&m_hit_uniqueID);
41 m_hit_tree->Branch("hit_eventIndex",&m_hit_eventIndex);
42 m_hit_tree->Branch("hit_cluster_x",&m_hit_cluster_x);
43 m_hit_tree->Branch("hit_cluster_y",&m_hit_cluster_y);
44 m_hit_tree->Branch("hit_cluster_z",&m_hit_cluster_z);
45 m_hit_tree->Branch("hit_globalLayerID",&m_hit_globalLayerID);
46
47 std::string GNNhittree_str = "FPGATrackSimGNNHit_reg" + m_region.value();
48 m_GNNHit_tree = new TTree(GNNhittree_str.c_str(), GNNhittree_str.c_str());
49 m_GNNHit_tree->Branch("hit_id",&m_GNNHit_id);
50 m_GNNHit_tree->Branch("hit_module_id",&m_GNNHit_module_id);
51 m_GNNHit_tree->Branch("hit_uniqueID",&m_GNNHit_uniqueID);
52 m_GNNHit_tree->Branch("hit_eventIndex",&m_GNNHit_eventIndex);
53 m_GNNHit_tree->Branch("hit_road_id",&m_GNNHit_road_id);
54 m_GNNHit_tree->Branch("hit_x",&m_GNNHit_x);
55 m_GNNHit_tree->Branch("hit_y",&m_GNNHit_y);
56 m_GNNHit_tree->Branch("hit_z",&m_GNNHit_z);
57 m_GNNHit_tree->Branch("hit_r",&m_GNNHit_r);
58 m_GNNHit_tree->Branch("hit_phi",&m_GNNHit_phi);
59 m_GNNHit_tree->Branch("hit_eta",&m_GNNHit_eta);
60 m_GNNHit_tree->Branch("hit_cluster_x_1",&m_GNNHit_cluster_x_1);
61 m_GNNHit_tree->Branch("hit_cluster_y_1",&m_GNNHit_cluster_y_1);
62 m_GNNHit_tree->Branch("hit_cluster_z_1",&m_GNNHit_cluster_z_1);
63 m_GNNHit_tree->Branch("hit_cluster_r_1",&m_GNNHit_cluster_r_1);
64 m_GNNHit_tree->Branch("hit_cluster_phi_1",&m_GNNHit_cluster_phi_1);
65 m_GNNHit_tree->Branch("hit_cluster_eta_1",&m_GNNHit_cluster_eta_1);
66 m_GNNHit_tree->Branch("hit_cluster_x_2",&m_GNNHit_cluster_x_2);
67 m_GNNHit_tree->Branch("hit_cluster_y_2",&m_GNNHit_cluster_y_2);
68 m_GNNHit_tree->Branch("hit_cluster_z_2",&m_GNNHit_cluster_z_2);
69 m_GNNHit_tree->Branch("hit_cluster_r_2",&m_GNNHit_cluster_r_2);
70 m_GNNHit_tree->Branch("hit_cluster_phi_2",&m_GNNHit_cluster_phi_2);
71 m_GNNHit_tree->Branch("hit_cluster_eta_2",&m_GNNHit_cluster_eta_2);
72
73 std::string GNNedgetree_str = "FPGATrackSimGNNEdge_reg" + m_region.value();
74 m_GNNEdge_tree = new TTree(GNNedgetree_str.c_str(), GNNedgetree_str.c_str());
75 m_GNNEdge_tree->Branch("edge_index_1",&m_GNNEdge_index_1);
76 m_GNNEdge_tree->Branch("edge_index_2",&m_GNNEdge_index_2);
77 m_GNNEdge_tree->Branch("edge_dr",&m_GNNEdge_dR);
78 m_GNNEdge_tree->Branch("edge_dphi",&m_GNNEdge_dPhi);
79 m_GNNEdge_tree->Branch("edge_dz",&m_GNNEdge_dZ);
80 m_GNNEdge_tree->Branch("edge_deta",&m_GNNEdge_dEta);
81 m_GNNEdge_tree->Branch("edge_phislope",&m_GNNEdge_phiSlope);
82 m_GNNEdge_tree->Branch("edge_rphislope",&m_GNNEdge_rPhiSlope);
83 m_GNNEdge_tree->Branch("edge_score",&m_GNNEdge_score);
84
85 std::string roadtree_str = "FPGATrackSimRoad_reg" + m_region.value();
86 m_road_tree = new TTree(roadtree_str.c_str(), roadtree_str.c_str());
87 m_road_tree->Branch("road_id",&m_road_id);
88 m_road_tree->Branch("road_nHits",&m_road_nHits);
89 m_road_tree->Branch("road_nHits_layer",&m_road_nHits_layer);
90 m_road_tree->Branch("road_nLayers",&m_road_nLayers);
91 m_road_tree->Branch("road_hit_uniqueID",&m_road_hit_uniqueID);
92 m_road_tree->Branch("road_hit_barcode",&m_road_hit_barcode);
93 m_road_tree->Branch("road_hit_eventIndex",&m_road_hit_eventIndex);
94 m_road_tree->Branch("road_hit_z",&m_road_hit_z);
95 m_road_tree->Branch("road_hit_r",&m_road_hit_r);
96
97 ATH_CHECK(m_tHistSvc->regTree(Form("/TRIGFPGATrackSimGNNOUTPUT/%s",m_hit_tree->GetName()), m_hit_tree));
98 ATH_CHECK(m_tHistSvc->regTree(Form("/TRIGFPGATrackSimGNNOUTPUT/%s",m_GNNHit_tree->GetName()), m_GNNHit_tree));
99 ATH_CHECK(m_tHistSvc->regTree(Form("/TRIGFPGATrackSimGNNOUTPUT/%s",m_GNNEdge_tree->GetName()), m_GNNEdge_tree));
100 ATH_CHECK(m_tHistSvc->regTree(Form("/TRIGFPGATrackSimGNNOUTPUT/%s",m_road_tree->GetName()), m_road_tree));
101
102 return StatusCode::SUCCESS;
103}
104
105StatusCode FPGATrackSimGNNRootOutputTool::fillTree(const std::vector<std::shared_ptr<const FPGATrackSimHit>> & hits,
106 const std::vector<std::shared_ptr<FPGATrackSimGNNHit>> & gnn_hits,
107 const std::vector<std::shared_ptr<FPGATrackSimGNNEdge>> & edges,
108 const std::vector<FPGATrackSimRoad> & roads)
109{
110 // fill the FPGATrackSimHits
111 int hit_count = 0;
112 for (const auto& hit : hits) {
113 if (hit->isStrip()) continue;
114
115 m_hit_id.push_back(hit_count);
116 m_hit_module_id.push_back(hit->getIdentifierHash());
117 m_hit_x.push_back(hit->getX());
118 m_hit_y.push_back(hit->getY());
119 m_hit_z.push_back(hit->getZ());
120 m_hit_r.push_back(hit->getR());
121 m_hit_phi.push_back(hit->getGPhi());
122 m_hit_isPixel.push_back(hit->isPixel());
123 m_hit_isStrip.push_back(hit->isStrip());
124 m_hit_hitType.push_back(static_cast<int>(hit->getHitType()));
125 m_hit_uniqueID.push_back(hit->getUniqueID());
126 m_hit_eventIndex.push_back(hit->getEventIndex());
127 m_hit_cluster_x.push_back(hit->getOriginalHit().getX());
128 m_hit_cluster_y.push_back(hit->getOriginalHit().getY());
129 m_hit_cluster_z.push_back(hit->getOriginalHit().getZ());
130 hit_count++;
131
132 short layer = m_pix_h2l->at(static_cast<int>(hit->getIdentifierHash()));
133 TrigInDetSiLayer layerGeometry = m_layerGeometry->at(layer);
134 int combinedId = layerGeometry.m_subdet;
135 m_hit_globalLayerID.push_back(combinedId);
136 }
137 m_hit_tree->Fill();
138
139 // fill the FPGATrackSimGNNHits
140 for (const auto& hit : gnn_hits) {
141 m_GNNHit_id.push_back(hit->getHitID());
142 m_GNNHit_module_id.push_back(hit->getIdentifierHash());
143 m_GNNHit_uniqueID.push_back(hit->getUniqueID());
144 m_GNNHit_eventIndex.push_back(hit->getEventIndex());
145 m_GNNHit_road_id.push_back(hit->getRoadID());
146 m_GNNHit_x.push_back(hit->getX());
147 m_GNNHit_y.push_back(hit->getY());
148 m_GNNHit_z.push_back(hit->getZ());
149 m_GNNHit_r.push_back(hit->getR());
150 m_GNNHit_phi.push_back(hit->getPhi());
151 m_GNNHit_eta.push_back(hit->getEta());
152 m_GNNHit_cluster_x_1.push_back(hit->getCluster1X());
153 m_GNNHit_cluster_y_1.push_back(hit->getCluster1Y());
154 m_GNNHit_cluster_z_1.push_back(hit->getCluster1Z());
155 m_GNNHit_cluster_r_1.push_back(hit->getCluster1R());
156 m_GNNHit_cluster_phi_1.push_back(hit->getCluster1Phi());
157 m_GNNHit_cluster_eta_1.push_back(hit->getCluster1Eta());
158 m_GNNHit_cluster_x_2.push_back(hit->getCluster2X());
159 m_GNNHit_cluster_y_2.push_back(hit->getCluster2Y());
160 m_GNNHit_cluster_z_2.push_back(hit->getCluster2Z());
161 m_GNNHit_cluster_r_2.push_back(hit->getCluster2R());
162 m_GNNHit_cluster_phi_2.push_back(hit->getCluster2Phi());
163 m_GNNHit_cluster_eta_2.push_back(hit->getCluster2Eta());
164 }
165 m_GNNHit_tree->Fill();
166
167 // fill the FPGATrackSimGNNEdges
168 for (const auto& edge : edges) {
169 m_GNNEdge_index_1.push_back(edge->getEdgeIndex1());
170 m_GNNEdge_index_2.push_back(edge->getEdgeIndex2());
171 m_GNNEdge_dR.push_back(edge->getEdgeDR());
172 m_GNNEdge_dPhi.push_back(edge->getEdgeDPhi());
173 m_GNNEdge_dZ.push_back(edge->getEdgeDZ());
174 m_GNNEdge_dEta.push_back(edge->getEdgeDEta());
175 m_GNNEdge_phiSlope.push_back(edge->getEdgePhiSlope());
176 m_GNNEdge_rPhiSlope.push_back(edge->getEdgeRPhiSlope());
177 m_GNNEdge_score.push_back(edge->getEdgeScore());
178 }
179 m_GNNEdge_tree->Fill();
180
181 for (const auto& road : roads) {
182 m_road_id.push_back(road.getRoadID());
183 m_road_nHits.push_back(road.getNHits());
184 m_road_nHits_layer.push_back(road.getNHits_layer());
185 m_road_nLayers.push_back(road.getNLayers());
186
187 std::vector<std::vector<HepMcParticleLink::barcode_type>> road_hit_uniqueID(road.getNLayers());
188 std::vector<std::vector<HepMcParticleLink::barcode_type>> road_hit_barcode(road.getNLayers());
189 std::vector<std::vector<long>> road_hit_eventIndex(road.getNLayers());
190 std::vector<std::vector<float>> road_hit_z(road.getNLayers());
191 std::vector<std::vector<float>> road_hit_r(road.getNLayers());
192 for (size_t l = 0; l < road.getNLayers(); ++l) {
193 for (const auto &layerH : road.getHitPtrs(l)) {
194 road_hit_uniqueID[l].push_back((*layerH).getUniqueID());
195 road_hit_barcode[l].push_back((*layerH).getBarcode());
196 road_hit_eventIndex[l].push_back((*layerH).getEventIndex());
197 road_hit_z[l].push_back((*layerH).getOriginalHit().getZ());
198 road_hit_r[l].push_back((*layerH).getOriginalHit().getR());
199 }
200 }
201
202 m_road_hit_uniqueID.push_back(std::move(road_hit_uniqueID));
203 m_road_hit_barcode.push_back(std::move(road_hit_barcode));
204 m_road_hit_eventIndex.push_back(std::move(road_hit_eventIndex));
205 m_road_hit_z.push_back(std::move(road_hit_z));
206 m_road_hit_r.push_back(std::move(road_hit_r));
207
208 }
209 m_road_tree->Fill();
210
211 resetVectors();
212
213 return StatusCode::SUCCESS;
214}
215
217{
218 m_hit_id.clear();
219 m_hit_module_id.clear();
220 m_hit_x.clear();
221 m_hit_y.clear();
222 m_hit_z.clear();
223 m_hit_r.clear();
224 m_hit_phi.clear();
225 m_hit_isPixel.clear();
226 m_hit_isStrip.clear();
227 m_hit_hitType.clear();
228 m_hit_uniqueID.clear();
229 m_hit_eventIndex.clear();
230 m_hit_cluster_x.clear();
231 m_hit_cluster_y.clear();
232 m_hit_cluster_z.clear();
233 m_hit_globalLayerID.clear();
234 m_GNNHit_id.clear();
235 m_GNNHit_module_id.clear();
236 m_GNNHit_uniqueID.clear();
237 m_GNNHit_eventIndex.clear();
238 m_GNNHit_road_id.clear();
239 m_GNNHit_x.clear();
240 m_GNNHit_y.clear();
241 m_GNNHit_z.clear();
242 m_GNNHit_r.clear();
243 m_GNNHit_phi.clear();
244 m_GNNHit_eta.clear();
245 m_GNNHit_cluster_x_1.clear();
246 m_GNNHit_cluster_y_1.clear();
247 m_GNNHit_cluster_z_1.clear();
248 m_GNNHit_cluster_r_1.clear();
251 m_GNNHit_cluster_x_2.clear();
252 m_GNNHit_cluster_y_2.clear();
253 m_GNNHit_cluster_z_2.clear();
254 m_GNNHit_cluster_r_2.clear();
257 m_GNNEdge_index_1.clear();
258 m_GNNEdge_index_2.clear();
259 m_GNNEdge_dR.clear();
260 m_GNNEdge_dPhi.clear();
261 m_GNNEdge_dZ.clear();
262 m_GNNEdge_dEta.clear();
263 m_GNNEdge_phiSlope.clear();
264 m_GNNEdge_rPhiSlope.clear();
265 m_GNNEdge_score.clear();
266 m_road_id.clear();
267 m_road_nHits.clear();
268 m_road_nHits_layer.clear();
269 m_road_nLayers.clear();
270 m_road_hit_uniqueID.clear();
271 m_road_hit_barcode.clear();
272 m_road_hit_eventIndex.clear();
273 m_road_hit_z.clear();
274 m_road_hit_r.clear();
275}
#define ATH_CHECK
Evaluate an expression and check for errors.
Implements tool to output hit, edge and road information from GNN pattern recognition pipeline.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
std::vector< unsigned int > m_GNNEdge_index_1
std::vector< std::vector< std::vector< float > > > m_road_hit_r
std::vector< HepMcParticleLink::barcode_type > m_hit_uniqueID
std::vector< std::vector< std::vector< float > > > m_road_hit_z
const std::vector< TrigInDetSiLayer > * m_layerGeometry
std::vector< unsigned int > m_GNNEdge_index_2
ToolHandle< ITrigL2LayerNumberTool > m_layerNumberTool
Gaudi::Property< std::string > m_region
std::vector< HepMcParticleLink::barcode_type > m_GNNHit_uniqueID
std::vector< std::vector< std::vector< long > > > m_road_hit_eventIndex
std::vector< std::vector< size_t > > m_road_nHits_layer
StatusCode fillTree(const std::vector< std::shared_ptr< const FPGATrackSimHit > > &hits, const std::vector< std::shared_ptr< FPGATrackSimGNNHit > > &gnn_hits, const std::vector< std::shared_ptr< FPGATrackSimGNNEdge > > &edges, const std::vector< FPGATrackSimRoad > &roads)
std::vector< std::vector< std::vector< HepMcParticleLink::barcode_type > > > m_road_hit_uniqueID
std::vector< std::vector< std::vector< HepMcParticleLink::barcode_type > > > m_road_hit_barcode
FPGATrackSimGNNRootOutputTool(const std::string &, const std::string &, const IInterface *)