ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimHoughRootOutputTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
9
10
12FPGATrackSimHoughRootOutputTool::FPGATrackSimHoughRootOutputTool(const std::string& algname, const std::string& name, const IInterface *ifc) :
13 AthAlgTool(algname, name, ifc)
14{
15}
16
17
18
19// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
21{
23 ATH_CHECK(m_tHistSvc.retrieve());
24 ATH_CHECK(m_EvtSel.retrieve());
25
26 if(m_algorithm == "Normal") m_algo=ORAlgo::Normal;
27 else if(m_algorithm == "Invert") m_algo=ORAlgo::InvertGrouping;
28
30 return StatusCode::SUCCESS;
31}
32
33
34// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
36{
37 std::string tree_str = "FPGATrackSimHoughRootOutput_reg" + m_region.value();
38 m_tree = new TTree(tree_str.c_str(), tree_str.c_str());
39
40 m_tree->Branch("x",&m_x);
41 m_tree->Branch("y",&m_y);
42 m_tree->Branch("z",&m_z);
43 m_tree->Branch("volumeID",&m_volumeID);
44 m_tree->Branch("custom_layerID",&m_custom_layerID);
45
46 m_tree->Branch("layerID",&m_layerID);
47 m_tree->Branch("etaID",&m_etaID);
48
49 m_tree->Branch("associated_truth_d0",&m_associated_truth_d0);
50 m_tree->Branch("associated_truth_z0",&m_associated_truth_z0);
51 m_tree->Branch("associated_truth_pt",&m_associated_truth_pt);
52 m_tree->Branch("associated_truth_q",&m_associated_truth_q);
53 m_tree->Branch("associated_truth_eta",&m_associated_truth_eta);
54 m_tree->Branch("associated_truth_phi",&m_associated_truth_phi);
55
56 m_tree->Branch("gphi",&m_gphi);
57 m_tree->Branch("zIdeal",&m_zIdeal);
58 m_tree->Branch("gphiIdeal",&m_gphiIdeal);
59 m_tree->Branch("phi",&m_phi);
60 m_tree->Branch("invpt",&m_invpt);
61 m_tree->Branch("tracknumber",&m_tracknumber);
62 m_tree->Branch("roadnumber",&m_roadnumber);
63 m_tree->Branch("barcode",&m_barcode);
64 m_tree->Branch("barcodefrac",&m_barcodefrac);
65 m_tree->Branch("eventindex",&m_eventindex);
66 m_tree->Branch("isRealHit",&m_realHit);
67 m_tree->Branch("isPixel",&m_isPixel);
68 m_tree->Branch("isSP",&m_isSP);
69 m_tree->Branch("layer",&m_layer);
70 m_tree->Branch("isBarrel",&m_isBarrel);
71 m_tree->Branch("etawidth",&m_etawidth);
72 m_tree->Branch("phiwidth",&m_phiwidth);
73 m_tree->Branch("etamodule",&m_etamodule);
74 m_tree->Branch("phimodule",&m_phimodule);
75 m_tree->Branch("ID",&m_ID);
76 m_tree->Branch("diskLayer",&m_diskLayer);
77
78 m_tree->Branch("candidate_barcodefrac",&m_candidate_barcodefrac);
79 m_tree->Branch("candidate_barcode",&m_candidate_barcode);
80 m_tree->Branch("candidate_eventindex",&m_candidate_eventindex);
81 m_tree->Branch("treeindex",&m_treeindex);
82 m_tree->Branch("subregion",&m_subregion);
83 m_tree->Branch("fakelabel",&m_fakelabel);
84 m_tree->Branch("passesOR",&m_passesOR);
85 m_tree->Branch("roadChi2",&m_roadChi2);
86 m_tree->Branch("roadChi2ndof",&m_roadChi2ndof);
87 m_tree->Branch("roadNCoords",&m_roadNCoords);
88 m_tree->Branch("nMissingHits",&m_nMissingHits);
89 m_tree->Branch("NTracksORMinusRoads",&m_NTracksORMinusRoads);
90
91 m_treeindex = 0;
92
93 std::string truthtree_str = "FPGATrackSimTruthTree_reg" + m_region.value();
94 m_truthtree = new TTree(truthtree_str.c_str(), truthtree_str.c_str());
95
96 m_truthtree->Branch("truth_d0",&m_truth_d0);
97 m_truthtree->Branch("truth_z0",&m_truth_z0);
98 m_truthtree->Branch("truth_pt",&m_truth_pt);
99 m_truthtree->Branch("truth_eta",&m_truth_eta);
100 m_truthtree->Branch("truth_phi",&m_truth_phi);
101 m_truthtree->Branch("truth_q",&m_truth_q);
102 m_truthtree->Branch("truth_pdg",&m_truth_pdg);
103 m_truthtree->Branch("truth_barcode",&m_truth_barcode);
104 m_truthtree->Branch("truth_eventindex",&m_truth_eventindex);
105 m_truthtree->Branch("truth_track_hit_x",&m_track_hit_x);
106 m_truthtree->Branch("truth_track_hit_y",&m_track_hit_y);
107 m_truthtree->Branch("truth_track_hit_z",&m_track_hit_z);
108 m_truthtree->Branch("truth_track_hit_R",&m_track_hit_R);
109 m_truthtree->Branch("truth_track_hit_phi",&m_track_hit_phi);
110 m_truthtree->Branch("truth_track_hit_layer_disk",&m_track_hit_layer_disk);
111 m_truthtree->Branch("has_strip_nonspacepoint",&m_has_strip_nonspacepoint);
112 m_truthtree->Branch("truth_track_hit_isPixel", &m_track_hit_isPixel);
113 m_truthtree->Branch("truth_track_hit_isStrip", &m_track_hit_isStrip);
114 m_truthtree->Branch("truth_track_hit_isClustered", &m_track_hit_isClustered);
115 m_truthtree->Branch("truth_track_hit_isSpacepoint", &m_track_hit_isSpacepoint);
116 m_truthtree->Branch("truth_track_hit_barcode", &m_track_hit_barcode);
117 m_truthtree->Branch("truth_track_hit_barcodefrac", &m_track_hit_barcodefrac);
118 m_truthtree->Branch("truth_track_hit_zIdeal", &m_track_hit_zIdeal);
119 m_truthtree->Branch("truth_track_hit_gphiIdeal", &m_track_hit_gphiIdeal);
120 m_truthtree->Branch("truth_track_hit_fineID", &m_track_hit_fineID);
121 m_truthtree->Branch("truth_track_hit_volumeID", &m_track_hit_volumeID);
122 m_truthtree->Branch("truth_track_hit_isMapped", &m_track_hit_isMapped);
123
124 std::string offltree_str = "FPGATrackSimOfflineTree_reg" + m_region.value();
125 m_offlinetree = new TTree(offltree_str.c_str(), offltree_str.c_str());
126
127 m_offlinetree->Branch("offline_d0",&m_offline_d0);
128 m_offlinetree->Branch("offline_z0",&m_offline_z0);
129 m_offlinetree->Branch("offline_pt",&m_offline_pt);
130 m_offlinetree->Branch("offline_eta",&m_offline_eta);
131 m_offlinetree->Branch("offline_phi",&m_offline_phi);
132 m_offlinetree->Branch("offline_q",&m_offline_q);
133 m_offlinetree->Branch("offline_barcode",&m_offline_barcode);
134 m_offlinetree->Branch("offline_barcodefrac",&m_offline_barcodefrac);
135 m_offlinetree->Branch("offline_n_holes",&m_offline_n_holes);
136 m_offlinetree->Branch("offline_n_inertmaterial",&m_offline_n_inertmaterial);
137 m_offlinetree->Branch("offline_n_measurement",&m_offline_n_measurement);
138 m_offlinetree->Branch("offline_n_brempoint",&m_offline_n_brempoint);
139 m_offlinetree->Branch("offline_n_scatterer",&m_offline_n_scatterer);
140 m_offlinetree->Branch("offline_n_perigee",&m_offline_n_perigee);
141 m_offlinetree->Branch("offline_n_outlier",&m_offline_n_outlier);
142 m_offlinetree->Branch("offline_n_other",&m_offline_n_other);
143
144 ATH_CHECK(m_tHistSvc->regTree(Form("/TRIGFPGATrackSimHOUGHOUTPUT/%s",m_tree->GetName()), m_tree));
145 ATH_CHECK(m_tHistSvc->regTree(Form("/TRIGFPGATrackSimHOUGHOUTPUT/%s",m_truthtree->GetName()), m_truthtree));
146 ATH_CHECK(m_tHistSvc->regTree(Form("/TRIGFPGATrackSimHOUGHOUTPUT/%s",m_offlinetree->GetName()), m_offlinetree));
147
148 return StatusCode::SUCCESS;
149}
150
151
152StatusCode FPGATrackSimHoughRootOutputTool::fillTree(const std::vector<FPGATrackSimTrack> &track_cands, const std::vector<FPGATrackSimTruthTrack> &truthTracks, const std::vector<FPGATrackSimOfflineTrack> &offlineTracks, const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits_2nd, const bool writeOutNonSPStripHits, const bool roadsAreSecondStage)
153{
154 ATH_MSG_DEBUG("Running HoughOutputTool!!");
155
156 m_tracknumber = 0;
157 ResetVectors();
158
159 if (roadsAreSecondStage) m_SUBREGIONMAP = m_FPGATrackSimMapping->SubRegionMap_2nd();
160 else m_SUBREGIONMAP = m_FPGATrackSimMapping->SubRegionMap();
161
162
163 std::vector<float> tmp_hits_x;
164 std::vector<float> tmp_hits_y;
165 std::vector<float> tmp_hits_z;
166 std::vector<float> tmp_hits_R;
167 std::vector<float> tmp_hits_phi;
168 std::vector<int> tmp_hits_layer_disk;
169 std::vector<bool> tmp_hits_mapped;
170 std::vector<bool> tmp_hits_isPixel;
171 std::vector<bool> tmp_hits_isStrip;
172 std::vector<bool> tmp_hits_isClustered;
173 std::vector<bool> tmp_hits_isSpacepoint;
174 std::vector<float> tmp_hits_barcodefrac;
175 std::vector<int> tmp_hits_barcode;
176 std::vector<float> tmp_hits_zIdeal;
177 std::vector<float> tmp_hits_gphiIdeal;
178 std::vector<long> tmp_hits_fineID;
179 std::vector<int> tmp_hits_volumeID;
180
181 std::vector<float> tmp_hits_x_sorted;
182 std::vector<float> tmp_hits_y_sorted;
183 std::vector<float> tmp_hits_z_sorted;
184 std::vector<float> tmp_hits_R_sorted;
185 std::vector<float> tmp_hits_phi_sorted;
186 std::vector<int> tmp_hits_layer_disk_sorted;
187 std::vector<bool> tmp_hits_isPixel_sorted;
188 std::vector<bool> tmp_hits_isStrip_sorted;
189 std::vector<bool> tmp_hits_isClustered_sorted;
190 std::vector<bool> tmp_hits_isSpacepoint_sorted;
191 std::vector<float> tmp_hits_barcodefrac_sorted;
192 std::vector<int> tmp_hits_barcode_sorted;
193 std::vector<float> tmp_hits_zIdeal_sorted;
194 std::vector<float> tmp_hits_gphiIdeal_sorted;
195 std::vector<long> tmp_hits_fineID_sorted;
196 std::vector<int> tmp_hits_volumeID_sorted;
197
198 std::vector<bool> tmp_hits_mapped_sorted;
199 bool has_strip_nonspacepoint;
200
201
202 // fill the truth tree, simply once per event! to know which entry here to loop at for a given road or hit
203 // combination below, use treeindex from below to find the entry here
204 for (const auto & track : truthTracks) {
205 if (!m_EvtSel->passCuts(track)) continue;
206 if (track.getStatus() != 1) continue;
207
208
209 tmp_hits_x.clear();
210 tmp_hits_y.clear();
211 tmp_hits_z.clear();
212 tmp_hits_R.clear();
213 tmp_hits_phi.clear();
214 tmp_hits_layer_disk.clear();
215 tmp_hits_mapped.clear();
216 tmp_hits_isPixel.clear();
217 tmp_hits_isStrip.clear();
218 tmp_hits_isClustered.clear();
219 tmp_hits_isSpacepoint.clear();
220 tmp_hits_barcodefrac.clear();
221 tmp_hits_barcode.clear();
222 tmp_hits_zIdeal.clear();
223 tmp_hits_gphiIdeal.clear();
224 tmp_hits_fineID.clear();
225
226 tmp_hits_x_sorted.clear();
227 tmp_hits_y_sorted.clear();
228 tmp_hits_z_sorted.clear();
229 tmp_hits_R_sorted.clear();
230 tmp_hits_phi_sorted.clear();
231 tmp_hits_layer_disk_sorted.clear();
232 tmp_hits_mapped_sorted.clear();
233 tmp_hits_isPixel_sorted.clear();
234 tmp_hits_isStrip_sorted.clear();
235 tmp_hits_isClustered_sorted.clear();
236 tmp_hits_isSpacepoint_sorted.clear();
237 tmp_hits_barcodefrac_sorted.clear();
238 tmp_hits_barcode_sorted.clear();
239 tmp_hits_zIdeal_sorted.clear();
240 tmp_hits_gphiIdeal_sorted.clear();
241 tmp_hits_fineID_sorted.clear();
242 tmp_hits_volumeID.clear();
243
244 has_strip_nonspacepoint = false;
245
246 double target_r;
247 std::vector<float> idealized_coords;
250
251 // Collect truth tracks' 2nd stage hits
252 for (auto hit : hits_2nd) {
253 // Only write out hits belonging to the truth track
254 if (hit->getBarcode() == track.getBarcode()) {
255
256 if (hit->isPixel() == 0 && hit->getHitType() != HitType::spacepoint) {has_strip_nonspacepoint = true;}
257
258 FPGATrackSimMultiTruth truth = hit->getTruth();
260
261 const bool ok = truth.best(tbarcode, tfrac);
262 if (tfrac < 1.0) { continue; }
263 if( ok ) {
264 tmp_hits_barcode.push_back((int)(tbarcode.second));
265 tmp_hits_barcodefrac.push_back(tfrac);
266 }
267 else {
268 tmp_hits_barcode.push_back(-1);
269 tmp_hits_barcodefrac.push_back(-1);
270 }
271
272 tmp_hits_x.push_back(hit->getX());
273 tmp_hits_y.push_back(hit->getY());
274 tmp_hits_z.push_back(hit->getZ());
275 tmp_hits_R.push_back(hit->getR());
276 tmp_hits_phi.push_back(hit->getGPhi());
277 tmp_hits_layer_disk.push_back(hit->getLayerDisk(true));
278 tmp_hits_volumeID.push_back(getVolumeID(*hit));
279 tmp_hits_mapped.push_back(hit->isMapped());
280 tmp_hits_isPixel.push_back(hit->isPixel());
281 tmp_hits_isStrip.push_back(hit->isStrip());
282 tmp_hits_isClustered.push_back(hit->isClustered());
283
284 tmp_hits_fineID.push_back(getFineID(*hit));
285
286 target_r = m_SUBREGIONMAP->getAvgRadius(0, hit->getLayerDisk());
287 idealized_coords = computeIdealCoords(*hit, hit->getGPhi(), track.getQOverPt(), target_r, true, TrackCorrType::None);
288 tmp_hits_zIdeal.push_back(idealized_coords[0]);
289 tmp_hits_gphiIdeal.push_back(idealized_coords[1]);
290
291 if (hit->getHitType() == HitType::spacepoint) {
292 tmp_hits_isSpacepoint.push_back(true);
293 }
294 else {
295 tmp_hits_isSpacepoint.push_back(false);
296 }
297 }
298 }
299
300
301 m_has_strip_nonspacepoint.push_back(has_strip_nonspacepoint);
302
303 if ( (! writeOutNonSPStripHits & has_strip_nonspacepoint)) {
304 ATH_MSG_DEBUG("Truth Track is not written to HoughRootOutput file, because it contains a non-SP strip hit!");
305 continue;
306 }
307
308 std::vector<int> sorting_index(tmp_hits_R.size(), 0);
309 for (unsigned int i = 0 ; i != sorting_index.size() ; i++) {
310 sorting_index[i] = i;
311 }
312 sort(sorting_index.begin(), sorting_index.end(),
313 [&](const int& a, const int& b) {
314 return (tmp_hits_R[a] < tmp_hits_R[b]);
315 }
316 );
317
318 for (unsigned int i = 0 ; i != sorting_index.size() ; i++) {
319 tmp_hits_x_sorted.push_back(tmp_hits_x[sorting_index[i]]);
320 tmp_hits_y_sorted.push_back(tmp_hits_y[sorting_index[i]]);
321 tmp_hits_z_sorted.push_back(tmp_hits_z[sorting_index[i]]);
322 tmp_hits_R_sorted.push_back(tmp_hits_R[sorting_index[i]]);
323 tmp_hits_phi_sorted.push_back(tmp_hits_phi[sorting_index[i]]);
324 tmp_hits_layer_disk_sorted.push_back(tmp_hits_layer_disk[sorting_index[i]]);
325 tmp_hits_isPixel_sorted.push_back(tmp_hits_isPixel[sorting_index[i]]);
326 tmp_hits_isStrip_sorted.push_back(tmp_hits_isStrip[sorting_index[i]]);
327 tmp_hits_isClustered_sorted.push_back(tmp_hits_isClustered[sorting_index[i]]);
328 tmp_hits_isSpacepoint_sorted.push_back(tmp_hits_isSpacepoint[sorting_index[i]]);
329 tmp_hits_barcode_sorted.push_back(tmp_hits_barcode[sorting_index[i]]);
330 tmp_hits_barcodefrac_sorted.push_back(tmp_hits_barcodefrac[sorting_index[i]]);
331 tmp_hits_zIdeal_sorted.push_back(tmp_hits_zIdeal[sorting_index[i]]);
332 tmp_hits_gphiIdeal_sorted.push_back(tmp_hits_gphiIdeal[sorting_index[i]]);
333 tmp_hits_fineID_sorted.push_back(tmp_hits_fineID[sorting_index[i]]);
334 tmp_hits_volumeID_sorted.push_back(tmp_hits_volumeID[sorting_index[i]]);
335 tmp_hits_mapped_sorted.push_back(tmp_hits_mapped[sorting_index[i]]);
336
337 };
338
339 m_track_hit_x.push_back(tmp_hits_x_sorted);
340 m_track_hit_y.push_back(tmp_hits_y_sorted);
341 m_track_hit_z.push_back(tmp_hits_z_sorted);
342 m_track_hit_R.push_back(tmp_hits_R_sorted);
343 m_track_hit_phi.push_back(tmp_hits_phi_sorted);
344 m_track_hit_layer_disk.push_back(tmp_hits_layer_disk_sorted);
345 m_track_hit_isPixel.push_back(tmp_hits_isPixel_sorted);
346 m_track_hit_isStrip.push_back(tmp_hits_isStrip);
347 m_track_hit_isClustered.push_back(tmp_hits_isClustered_sorted);
348 m_track_hit_isSpacepoint.push_back(tmp_hits_isSpacepoint_sorted);
349 m_track_hit_barcode.push_back(tmp_hits_barcode_sorted);
350 m_track_hit_barcodefrac.push_back(tmp_hits_barcodefrac_sorted);
351 m_track_hit_zIdeal.push_back(tmp_hits_zIdeal_sorted);
352 m_track_hit_gphiIdeal.push_back(tmp_hits_gphiIdeal_sorted);
353 m_track_hit_fineID.push_back(tmp_hits_fineID_sorted);
354 m_track_hit_volumeID.push_back(tmp_hits_volumeID_sorted);
355 m_track_hit_isMapped.push_back(tmp_hits_mapped_sorted);
356
357 m_truth_d0.push_back(track.getD0());
358 m_truth_z0.push_back(track.getZ0());
359 m_truth_pt.push_back(track.getPt());
360 m_truth_eta.push_back(track.getEta());
361 m_truth_phi.push_back(track.getPhi());
362 m_truth_barcode.push_back(track.getBarcode());
363 m_truth_eventindex.push_back(track.getEventIndex());
364 m_truth_q.push_back(track.getQ());
365 m_truth_pdg.push_back(track.getPDGCode());
366 }
367 // Fill only if at least one truth track to save to avoid empty events
368 if (m_truth_eventindex.size() != 0) {
369 m_truthtree->Fill();
370 }
371 ResetVectors();
372
373
374 // now do the same for offline tree, once per event
375 for (const auto & track : offlineTracks) {
376 if (!m_EvtSel->passCuts(track)) continue;
377
378 m_offline_d0.push_back(track.getD0());
379 m_offline_z0.push_back(track.getZ0());
380 m_offline_pt.push_back(abs(1./track.getQOverPt()));
381 m_offline_eta.push_back(track.getEta());
382 m_offline_phi.push_back(track.getPhi());
383 m_offline_barcode.push_back(track.getBarcode());
384 m_offline_barcodefrac.push_back(track.getBarcodeFrac());
385
386 m_offline_q.push_back(track.getQOverPt() > 0 ? 1 : -1);
387 int nhole(0), nmeasurement(0), ninert(0), nbrem(0), nscatter(0), nperigee(0), noutlier(0), nother(0);
388 for (const auto& hit : track.getOfflineHits()) {
389 if (hit.getHitType() == OfflineHitType::Measurement) nmeasurement++;
390 else if (hit.getHitType() == OfflineHitType::InertMaterial) ninert++;
391 else if (hit.getHitType() == OfflineHitType::BremPoint) nbrem++;
392 else if (hit.getHitType() == OfflineHitType::Scatterer) nscatter++;
393 else if (hit.getHitType() == OfflineHitType::Perigee) nperigee++;
394 else if (hit.getHitType() == OfflineHitType::Outlier) noutlier++;
395 else if (hit.getHitType() == OfflineHitType::Hole) nhole++;
396 else nother++;
397 }
398 m_offline_n_holes.push_back(nhole);
399 m_offline_n_measurement.push_back(nmeasurement);
400 m_offline_n_inertmaterial.push_back(ninert);
401 m_offline_n_brempoint.push_back(nbrem);
402 m_offline_n_scatterer.push_back(nscatter);
403 m_offline_n_perigee.push_back(nperigee);
404 m_offline_n_outlier.push_back(noutlier);
405 m_offline_n_other.push_back(nother);
406 }
407 m_offlinetree->Fill();
408 ResetVectors();
409
410 // for calculating the truth for the entire combination, not just an individual hit
411 std::vector<FPGATrackSimMultiTruth> mtv;
412
413 double target_r;
414
415 for (size_t iroad = 0; iroad < track_cands.size(); iroad++) {
416 m_roadnumber = iroad;
417 FPGATrackSimTrack road = track_cands[iroad];
418
419 if (roadsAreSecondStage) {
420 mtv.reserve( m_FPGATrackSimMapping->PlaneMap_2nd(road.getSubRegion())->getNLogiLayers());
421 }
422 else {
423 mtv.reserve( m_FPGATrackSimMapping->PlaneMap_1st(road.getSubRegion())->getNLogiLayers());
424 }
425
426 m_roadChi2ndof.push_back(track_cands[iroad].getChi2ndof());
427 m_roadChi2.push_back(track_cands[iroad].getChi2());
428 m_roadNCoords.push_back(track_cands[iroad].getNCoords());
429
430 m_nMissingHits.push_back(track_cands[iroad].getNMissing());
431
432 m_passesOR.push_back(road.passedOR());
433
434 m_phi = road.getHoughX();
435 m_invpt = road.getHoughY();
436 m_subregion = road.getRegion();
437 std::vector<FPGATrackSimHit> hits = road.getFPGATrackSimHits();
438
439
440 // Add the hits from each combination to the tree
441 for (FPGATrackSimHit hit : hits) {
442
443 m_realHit.push_back(hit.isReal());
444 if (hit.getHitType() == HitType::spacepoint) {
445 m_isSP.push_back(true);
446 }
447 else {
448 m_isSP.push_back(false);
449 }
450 FPGATrackSimMultiTruth truth = hit.getTruth();
451
453 mtv.push_back( truth );
454
457 const bool ok = truth.best(tbarcode,tfrac);
458 if( ok ) {
459 m_eventindex.push_back((int)(tbarcode.first));
460 m_barcode.push_back((int)(tbarcode.second));
461 m_barcodefrac.push_back(tfrac);
462 }
463 else {
464 m_eventindex.push_back(-1);
465 m_barcode.push_back(-1);
466 m_barcodefrac.push_back(-1);
467 }
468
469 target_r = m_SUBREGIONMAP->getAvgRadius(0, hit.getLayer());
470 std::shared_ptr<const FPGATrackSimHit> hit_ptr = std::make_shared<const FPGATrackSimHit>(hit);
471 std::vector<float> idealized_coords = computeIdealCoords(hit, m_invpt, hit.getGPhi(), target_r, true, TrackCorrType::None);
472
473 m_x.push_back(hit.getX());
474 m_y.push_back(hit.getY());
475 m_z.push_back(hit.getZ());
476 m_volumeID.push_back(getVolumeID(*hit_ptr));
477 m_custom_layerID.push_back(getFineID(*hit_ptr));
478 m_layerID.push_back(hit.getLayerDisk(true));
479 m_etaID.push_back(hit.getEtaModule(true));
480
481 m_gphi.push_back(hit.getGPhi());
482 m_zIdeal.push_back(idealized_coords[0]);
483 m_gphiIdeal.push_back(idealized_coords[1]);
484 m_isPixel.push_back(hit.isPixel() ? 1 : 0);
485 m_layer.push_back(hit.getLayer());
486 m_isBarrel.push_back(hit.isBarrel() ? 1 : 0);
487 m_etawidth.push_back(hit.getEtaWidth());
488 m_phiwidth.push_back(hit.getPhiWidth());
489 m_etamodule.push_back(hit.getEtaModule(true));
490 m_phimodule.push_back(hit.getPhiModule());
491 m_ID.push_back(hit.getIdentifierHash());
492 m_diskLayer.push_back(hit.getLayerDisk(true));
493 }
494
495 // done looping over hits, now we do the truth calculation for this track candidate
496 // first compute the best geant match, the barcode with the largest number of contributing hits
497 // frac is then the fraction of the total number of hits on the candidate attributed to the barcode.
498 FPGATrackSimMultiTruth mt( std::accumulate(mtv.begin(),mtv.end(),FPGATrackSimMultiTruth(),FPGATrackSimMultiTruth::AddAccumulator()) );
499 // retrieve the best barcode and frac and store it
502 const bool ok = mt.best(tbarcode,tfrac);
503 if( ok ) {
504 m_candidate_eventindex = (int)(tbarcode.first);
505 m_candidate_barcode = (int)(tbarcode.second);
507 if ( tfrac <= 0.5 ) m_fakelabel = 1;
508 else if ( tfrac == 1.0 ) m_fakelabel = 0;
509 }
510 else {
514 m_fakelabel = 2;
515 }
516
517 for (const auto & track : truthTracks) {
518 if (!m_EvtSel->passCuts(track)) continue;
519 if (track.getStatus() != 1) continue;
520
521 m_associated_truth_d0 = track.getD0();
522 m_associated_truth_z0 = track.getZ0();
523 m_associated_truth_pt = track.getPt();
524 m_associated_truth_q = track.getQ();
525 m_associated_truth_eta = track.getEta();
526 m_associated_truth_phi = track.getPhi();
527 break;
528 }
529
530 m_tree->Fill();
531
532 mtv.clear();
533 ResetVectors();
535 }
536 m_treeindex++;
537 return StatusCode::SUCCESS;
538}
539
540
541
542StatusCode FPGATrackSimHoughRootOutputTool::fillTree(const std::vector<std::shared_ptr<const FPGATrackSimRoad>> &roads, const std::vector<FPGATrackSimTruthTrack> &truthTracks, const std::vector<FPGATrackSimOfflineTrack> &offlineTracks, const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits_2nd, const bool writeOutNonSPStripHits, const float minChi2, const int maxOverlappingHits, const bool roadsAreSecondStage)
543{
544 ATH_MSG_DEBUG("Running HoughOutputTool!!");
545
546
547 // Create a list of track candidates by taking all possible combinations of hits in road.
548 std::vector<FPGATrackSimTrack> track_cands;
549
550 for (size_t iroad = 0; iroad < roads.size(); iroad++) {
551 m_roadnumber = iroad;
552 std::shared_ptr<const FPGATrackSimRoad> road = roads[iroad];
553 std::vector<FPGATrackSimTrack> track_cand;
554 if (road == nullptr) continue; // Not Hough roads
555
556 auto pmap = m_FPGATrackSimMapping->PlaneMap_1st(road->getSubRegion());
557
558 if (roadsAreSecondStage) {
559 pmap = m_FPGATrackSimMapping->PlaneMap_2nd(road->getSubRegion());
560 }
561
562 std::vector<std::vector<int>> combs = ::getComboIndices(road->getNHits_layer());
563 m_phi = road->getX();
564 m_invpt = road->getY();
565
566 // Build track candidate for OR tool
567 int nMissing;
568 bool missPixel;
569 bool missStrip;
570 layer_bitmask_t missing_mask;
571 layer_bitmask_t norecovery_mask; // mask to prevent majority in planes with multiple hits
572 getMissingInfo(*road, nMissing, missPixel, missStrip, missing_mask, norecovery_mask, m_FPGATrackSimMapping, m_idealCoordFitType);
573 // Create a template track with common parameters filled already for initializing below
575
576 if (roadsAreSecondStage) {
577 temp.setTrackStage(TrackStage::SECOND);
578 }
579 else {
580 temp.setTrackStage(TrackStage::FIRST);
581 }
582 temp.setSecondSectorID(road->getSector());
583 temp.setNLayers(pmap->getNLogiLayers());
584 temp.setBankID(-1); // TODO
585 temp.setPatternID(road->getPID());
586 temp.setHitMap(missing_mask);
587 temp.setNMissing(nMissing);
588 temp.setHoughX(road->getX());
589 temp.setHoughY(road->getY());
590 temp.setQOverPt(road->getY());
591 temp.setTrackCorrType(m_IdealCoordFitType);
592 temp.setDoDeltaGPhis(true);
593 temp.setPassedOR(1);
594
595 makeTrackCandidates(*road, temp, track_cand, m_FPGATrackSimMapping);
596 for (auto const &tr : track_cand) {
597 track_cands.push_back(tr);
598 }
599 }
600
601 ATH_CHECK(runOverlapRemoval(track_cands, minChi2, maxOverlappingHits, m_algo, m_monTool));
602 unsigned long passed = 0;
603 for (auto const &cand : track_cands) {
604 if (cand.passedOR()) {
605 passed++;
606 }
607 }
608
609 m_NTracksORMinusRoads = passed - roads.size();
610
611 return fillTree(track_cands, truthTracks, offlineTracks, hits_2nd, writeOutNonSPStripHits, roadsAreSecondStage);
612}
613
615 m_x.clear();
616 m_y.clear();
617 m_z.clear();
618 m_volumeID.clear();
619 m_custom_layerID.clear();
620
621 m_layerID.clear();
622 m_etaID.clear();
623
624 m_barcode.clear();
625 m_barcodefrac.clear();
626 m_eventindex.clear();
627 m_realHit.clear();
628 m_isSP.clear();
629 m_isPixel.clear();
630 m_layer.clear();
631 m_isBarrel.clear();
632 m_etawidth.clear();
633 m_phiwidth.clear();
634 m_etamodule.clear();
635 m_phimodule.clear();
636 m_ID.clear();
637 m_diskLayer.clear();
638 m_passesOR.clear();
639 m_roadChi2.clear();
640 m_roadChi2ndof.clear();
641 m_roadNCoords.clear();
642 m_nMissingHits.clear();
643 m_truth_d0.clear();
644 m_truth_z0.clear();
645 m_truth_pt.clear();
646 m_truth_eta.clear();
647 m_truth_phi.clear();
648 m_truth_q.clear();
649 m_truth_barcode.clear();
650 m_truth_eventindex.clear();
651 m_truth_pdg.clear();
652 m_track_hit_volumeID.clear();
653 m_offline_n_holes.clear();
656 m_offline_n_brempoint.clear();
657 m_offline_n_scatterer.clear();
658 m_offline_n_perigee.clear();
659 m_offline_n_outlier.clear();
660 m_offline_n_other.clear();
661 m_offline_d0.clear();
662 m_offline_z0.clear();
663 m_offline_pt.clear();
664 m_offline_eta.clear();
665 m_offline_phi.clear();
666 m_offline_q.clear();
667 m_offline_barcode.clear();
668 m_offline_barcodefrac.clear();
669 m_track_hit_x.clear();
670 m_track_hit_y.clear();
671 m_track_hit_z.clear();
672 m_track_hit_R.clear();
673 m_track_hit_phi.clear();
675 m_track_hit_isPixel.clear();
676 m_track_hit_isStrip.clear();
679 m_track_hit_barcode.clear();
681 m_track_hit_zIdeal.clear();
682 m_track_hit_gphiIdeal.clear();
683 m_track_hit_fineID.clear();
684 m_track_hit_isMapped.clear();
685
686 m_gphi.clear();
687 m_zIdeal.clear();
688 m_gphiIdeal.clear();
690}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
std::vector< std::vector< int > > getComboIndices(std::vector< size_t > const &sizes)
Given a vector of sizes (of arrays), generates a vector of all combinations of indices to index one e...
std::vector< float > computeIdealCoords(const FPGATrackSimHit &hit, const double hough_x, const double hough_y, const double target_r, const bool doDeltaGPhis, const TrackCorrType trackCorrType)
long getFineID(const FPGATrackSimHit &hit)
void getMissingInfo(const FPGATrackSimRoad &road, int &nMissing, bool &missPixel, bool &missStrip, layer_bitmask_t &missing_mask, layer_bitmask_t &norecovery_mask, const ServiceHandle< IFPGATrackSimMappingSvc > &FPGATrackSimMapping, const TrackCorrType idealCoordFitType)
long getVolumeID(const FPGATrackSimHit &hit)
void makeTrackCandidates(const FPGATrackSimRoad &road, const FPGATrackSimTrack &temp, std::vector< FPGATrackSimTrack > &track_cands, const ServiceHandle< IFPGATrackSimMappingSvc > &FPGATrackSimMapping)
Creates a list of track candidates by taking all possible combination of hits in road.
StatusCode runOverlapRemoval(std::vector< FPGATrackSimTrack > &tracks, const float minChi2, const int NumOfHitPerGrouping, ORAlgo orAlgo, ToolHandle< GenericMonitoringTool > &monTool, bool compareAllHits=false)
Output roads into a ROOT file.
uint32_t layer_bitmask_t
bool passed(DecisionID id, const DecisionIDContainer &)
checks if required decision ID is in the set of IDs in the container
static Double_t a
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
std::vector< std::vector< float > > m_track_hit_R
std::vector< std::vector< float > > m_track_hit_x
std::vector< std::vector< bool > > m_track_hit_isStrip
std::vector< std::vector< float > > m_track_hit_zIdeal
std::vector< std::vector< float > > m_track_hit_z
std::vector< std::vector< bool > > m_track_hit_isClustered
std::vector< std::vector< bool > > m_track_hit_isSpacepoint
std::vector< std::vector< bool > > m_track_hit_isPixel
FPGATrackSimHoughRootOutputTool(const std::string &, const std::string &, const IInterface *)
std::vector< std::vector< long > > m_track_hit_fineID
std::vector< std::vector< int > > m_track_hit_barcode
std::vector< std::vector< float > > m_track_hit_barcodefrac
std::vector< std::vector< int > > m_track_hit_volumeID
std::vector< std::vector< int > > m_track_hit_layer_disk
std::vector< std::vector< float > > m_track_hit_phi
StatusCode fillTree(const std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads, const std::vector< FPGATrackSimTruthTrack > &truthTracks, const std::vector< FPGATrackSimOfflineTrack > &offlineTracks, const std::vector< std::shared_ptr< const FPGATrackSimHit > > &hits_2nd, const bool writeOutNonSPStripHits, const float minChi2, const int maxOverlappingHits, const bool roadsAreSecondStage)
std::vector< std::vector< float > > m_track_hit_gphiIdeal
ServiceHandle< IFPGATrackSimEventSelectionSvc > m_EvtSel
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
std::vector< std::vector< float > > m_track_hit_y
std::vector< std::vector< bool > > m_track_hit_isMapped
ToolHandle< GenericMonitoringTool > m_monTool
bool best(FPGATrackSimMultiTruth::Barcode &code, FPGATrackSimMultiTruth::Weight &weight) const
std::pair< unsigned long, unsigned long > Barcode
void setSecondSectorID(int v)
float getHoughX() const
unsigned int passedOR() const
float getHoughY() const
const std::vector< FPGATrackSimHit > & getFPGATrackSimHits() const