ATLAS Offline Software
FPGATrackSimMatrixGenAlgo.cxx
Go to the documentation of this file.
1 // Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2 
11 #include "GaudiKernel/MsgStream.h"
12 #include "GaudiKernel/ITHistSvc.h"
18 
19 #include "TH1.h"
20 #include "TH2.h"
21 #include "TStyle.h"
22 
23 #include <cassert>
24 #include <sstream>
25 #include <iostream>
26 #include <fstream>
27 #include <cmath>
28 #include <utility>
29 
30 
32 // Constructors
34 
35 FPGATrackSimMatrixGenAlgo::FPGATrackSimMatrixGenAlgo(const std::string& name, ISvcLocator* pSvcLocator) :
36  AthAlgorithm(name, pSvcLocator)
37 {
38 }
39 
40 
41 
43 // Initialize
45 
47 {
48  ATH_MSG_DEBUG("initialize()");
49 
50  // set the slicing variables from inputs
56 
62 
68 
69  // Retrieve handles
70  ATH_CHECK(m_tHistSvc.retrieve());
71  ATH_CHECK(m_FPGATrackSimMapping.retrieve());
72  ATH_CHECK(m_hitInputTool.retrieve());
73  ATH_CHECK(m_hitMapTool.retrieve());
74  ATH_CHECK(m_EvtSel.retrieve());
75  ATH_CHECK(m_roadFinderTool.retrieve());
76  if (m_doClustering) ATH_CHECK(m_clusteringTool.retrieve());
78 
79  if (m_doHoughConstants) {
80  if (m_ideal_geom == 0) {
81  ATH_MSG_INFO("Hough constants method needs idealized geometry > 0, aborting.");
82  return StatusCode::FAILURE;
83  }
84  m_pmap = m_FPGATrackSimMapping->PlaneMap_1st();
85  // Get detector configurations
86  m_nLayers = m_FPGATrackSimMapping->PlaneMap_1st()->getNLogiLayers();
87  m_nRegions = m_FPGATrackSimMapping->RegionMap_1st()->getNRegions();
88  m_nDim = m_FPGATrackSimMapping->PlaneMap_1st()->getNCoords();
89 
90  }
91  else {
92  m_pmap = m_FPGATrackSimMapping->PlaneMap_2nd();
93  // Get detector configurations
94  m_nLayers = m_FPGATrackSimMapping->PlaneMap_2nd()->getNLogiLayers();
95  m_nRegions = m_FPGATrackSimMapping->RegionMap_2nd()->getNRegions();
96  m_nDim = m_FPGATrackSimMapping->PlaneMap_2nd()->getNCoords();
97  }
98 
99  m_nDim2 = m_nDim * m_nDim;
100  m_sector_cum.resize(m_nRegions);
101 
102  // Retrieve slice information
103  m_sliceMin = m_EvtSel->getMin();
104  m_sliceMax = m_EvtSel->getMax();
105 
106  // Check q/pt binning information
107  if (m_qOverPtBins.size() == 0) {
108  ATH_MSG_ERROR("q/pt bin information not set in matrix element job options!");
109  return StatusCode::FAILURE;
110  }
111 
112 
113  // Histograms
115 
117 
118  return StatusCode::SUCCESS;
119 }
120 
121 
123 {
124  // Training tracks
125  for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++) {
126  std::string name = "h_trainingTrack_" + FPGATrackSimTrackPars::parName(i);
127  std::string title = FPGATrackSimTrackPars::parName(i) + " of tracks passing pt/barcode check";
128 
129  m_h_trainingTrack[i] = new TH1I(name.c_str(), title.c_str(), 100, m_sliceMin[i], m_sliceMax[i]);
130  ATH_CHECK(m_tHistSvc->regHist("/TRIGFPGATrackSimMATRIXOUT/" + name, m_h_trainingTrack[i]));
131  }
132 
133  // Sector pars
134  for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++) {
135 
136  std::string name = "h_sectorPars_" + FPGATrackSimTrackPars::parName(i);
137  std::string title = "Average " + FPGATrackSimTrackPars::parName(i) + " in sector";
138 
139  m_h_sectorPars[i] = new TH1I(name.c_str(), title.c_str(), 100, m_sliceMin[i], m_sliceMax[i]);
140  ATH_CHECK(m_tHistSvc->regHist("/TRIGFPGATrackSimMATRIXOUT/" + name, m_h_sectorPars[i]));
141  }
142 
143  // Select hit failure
144  for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++) {
145 
146  std::string name = "h_SHfailure_" + FPGATrackSimTrackPars::parName(i);
147  std::string title = FPGATrackSimTrackPars::parName(i) + " of tracks failing in selectHit()";
148 
149  m_h_SHfailure[i] = new TH1I(name.c_str(), title.c_str(), 100, m_sliceMin[i], m_sliceMax[i]);
150  ATH_CHECK(m_tHistSvc->regHist("/TRIGFPGATrackSimMATRIXOUT/" + name, m_h_SHfailure[i]));
151  }
152 
153  // 3 hits in layer
154  for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++) {
155 
156  std::string name = "h_3hitsInLayer_" + FPGATrackSimTrackPars::parName(i);
157  std::string title = FPGATrackSimTrackPars::parName(i) + " of tracks containing 3+ hits in a single layer";
158 
159  m_h_3hitsInLayer[i] = new TH1I(name.c_str(), title.c_str(), 100, m_sliceMin[i], m_sliceMax[i]);
160  ATH_CHECK(m_tHistSvc->regHist("/TRIGFPGATrackSimMATRIXOUT/" + name, m_h_3hitsInLayer[i]));
161  }
162 
163  // Not enough hits
164  for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++) {
165  std::string name = "h_notEnoughHits_" + FPGATrackSimTrackPars::parName(i);
166  std::string title = FPGATrackSimTrackPars::parName(i) + " of tracks failing because it didn't have enough hits";
167 
168  m_h_notEnoughHits[i] = new TH1I(name.c_str(), title.c_str(), 100, m_sliceMin[i], m_sliceMax[i]);
169  ATH_CHECK(m_tHistSvc->regHist("/TRIGFPGATrackSimMATRIXOUT/" + name, m_h_notEnoughHits[i]));
170  }
171 
172  m_h_trackQoP_okHits = new TH1I("h_trackQoP_okHits", "half inverse pt of tracks passing hit check",
174  m_h_trackQoP_okRegion = new TH1I("h_trackQoP_okRegion", "half inverse pt of tracks passing region check",
176  m_h_nHit = new TH1I("h_nHit", "number of hits in sector", 100, 0, 100);
177 
178  ATH_CHECK(m_tHistSvc->regHist("/TRIGFPGATrackSimMATRIXOUT/h_trackQoP_okHits", m_h_trackQoP_okHits));
179  ATH_CHECK(m_tHistSvc->regHist("/TRIGFPGATrackSimMATRIXOUT/h_trackQoP_okRegion", m_h_trackQoP_okRegion));
180  ATH_CHECK(m_tHistSvc->regHist("/TRIGFPGATrackSimMATRIXOUT/h_nHit",m_h_nHit));
181 
182  return StatusCode::SUCCESS;
183 }
184 
186 {
187  FPGATrackSimTrackPars pars = track.getPars();
188  for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++)
189  hists[i]->Fill(pars[i]);
190 }
191 
193 // Execute
195 
196 
198 {
199  ATH_MSG_DEBUG("execute()");
201  m_eventHeader->reset();
202 
203  // Get hits and training tracks from this event
204  ATH_CHECK(m_hitInputTool->readData(m_eventHeader, Gaudi::Hive::currentContext()));
205 
206  std::vector<FPGATrackSimHit> hits = getLogicalHits();
207 
208  std::vector<FPGATrackSimTruthTrack> truth_tracks = m_eventHeader->optional().getTruthTracks();
209  std::vector<FPGATrackSimTruthTrack> tracks = filterTrainingTracks(truth_tracks);
210 
211  m_nTracks += truth_tracks.size();
212  if (tracks.empty()) {
213  ATH_MSG_DEBUG("Empty training tracks");
214  return StatusCode::SUCCESS;
215  }
216 
217  // Prepare a map of the hits according the barcode
218  std::map<int, std::vector<FPGATrackSimHit>> barcode_hits = makeBarcodeMap(hits, tracks);
219 
220  // For each training track, find the sector it belongs to and accumulate the
221  // hit coordinates and track parameters.
222  for (FPGATrackSimTruthTrack const & track : tracks) {
223 
224  // Get list of hits associated to the current truth track
225  std::vector<FPGATrackSimHit> & track_hits = barcode_hits[track.getBarcode()];
226 
227  // Get the hits that will form the actual sector
228  std::vector<FPGATrackSimHit> sector_hits;
229  bool success = filterSectorHits(track_hits, sector_hits, track);
230  if (!success) continue; // Skip this track if it has bad hits (not complete, etc.)
231  m_h_trackQoP_okHits->Fill(track.getQOverPt());
232 
233  // Get the region of this sector
234  int region = getRegion(sector_hits);
235  if (region < 0 || region >= m_nRegions) continue;
236  m_h_trackQoP_okRegion->Fill(track.getQOverPt());
237 
238  //For the Hough constants, find the Hough roads
239  std::vector<FPGATrackSimRoad*> houghRoads;
240  if (m_doHoughConstants){
241 
242  std::vector<const FPGATrackSimHit*> phits;
243  std::vector<FPGATrackSimRoad*> roads;
244 
245  for (const FPGATrackSimHit& hit : sector_hits) phits.push_back(&hit);
246 
247  StatusCode sc = m_roadFinderTool->getRoads(phits, roads);
248  if (sc.isFailure()) ATH_MSG_WARNING("Hough Transform -> getRoads() failed");
249 
250  if (!roads.empty()){
251  for (FPGATrackSimRoad* hr : roads){
252  houghRoads.push_back(hr);
253  }
254  }
255 
256  if (!houghRoads.empty()){
257  double y = 0.0;
258  double x = 0.0;
259 
260  //For each Hough road, make the accumulator
261  for (FPGATrackSimRoad* hr : houghRoads){
262  y = hr->getY();
263  x = hr->getX();
264 
265  // Prepare the accumulator struct
266  std::vector<module_t> modules(m_nLayers);
268  acc.pars.qOverPt = y;
269  acc.pars.phi = x;
270  std::pair<std::vector<module_t>, FPGATrackSimMatrixAccumulator> modules_acc = {modules, acc};
271  ATH_CHECK(makeAccumulator(sector_hits, track, modules_acc));
272 
273  // Add the track to the accumulate map
274  accumulate(m_sector_cum[region], modules_acc.first, modules_acc.second);
275  m_nTracksUsed++;
276  }
277  }
278  else{
279  ATH_MSG_DEBUG("execute(): no hough roads?");
280  return StatusCode::SUCCESS;
281  }
282  }
283  else{
284  // Prepare the accumulator struct
285  std::vector<module_t> modules(m_nLayers);
287  std::pair<std::vector<module_t>, FPGATrackSimMatrixAccumulator> modules_acc = {modules, acc};
288  ATH_CHECK(makeAccumulator(sector_hits, track, modules_acc));
289 
290  // Add the track to the accumulate map
291  accumulate(m_sector_cum[region], modules_acc.first, modules_acc.second);
292  m_nTracksUsed++;
293  }
294  }
295 
296  return StatusCode::SUCCESS;
297 }
298 
299 
300 // Converts raw hits from header into logical hits, and filters those in FPGATrackSim layers
301 // Could replace this with the RawToLogical tool (but probably won't)
302 std::vector<FPGATrackSimHit> FPGATrackSimMatrixGenAlgo::getLogicalHits()
303 {
304  std::vector<FPGATrackSimHit> hits;
305  //Setup the logical header...
307  //Map the hits to the logical header...
308  unsigned stage = 0;
309  if (m_doHoughConstants) stage = 1; // For now Hough constants only works on 1st stage
310  else stage = 2;
311  StatusCode sc = m_hitMapTool->convert(stage, *m_eventHeader, logicalHeader);
312  if (sc.isFailure()) ATH_MSG_ERROR("Hit mapping failed");
313 
314  // Since the clustering tool modifies the logical towers-- refactored this
315  // to only access the output hits from the towers.
316  if (m_doClustering) {
317  std::vector<FPGATrackSimCluster> clustered_hits;
318  sc = m_clusteringTool->DoClustering(logicalHeader, clustered_hits);
319  if (sc.isFailure()) ATH_MSG_ERROR("Clustering failed");
320  }
321  // Optionally do spacepoints (as well).
322  if (m_doSpacePoints) {
323  std::vector<FPGATrackSimCluster> spacepoints;
324  sc = m_spacePointsTool->DoSpacePoints(logicalHeader, spacepoints);
325  if (sc.isFailure()) ATH_MSG_ERROR("Spacepoints failed");
326  }
327 
328  // It should now be safe to pull the towers, regardless.
329  std::vector<FPGATrackSimTowerInputHeader> towers = logicalHeader.towers();
330  for (auto &tower : towers) {
331  std::vector<FPGATrackSimHit> const & towerHits = tower.hits();
332  for (FPGATrackSimHit const & hit : towerHits) {
333  hits.push_back(hit);
334  }
335  }
336  return hits;
337 }
338 
339 
340 // Filters tracks based on m_PT_THRESHOLD and m_TRAING_PDG and D0_THRESHOLD
341 std::vector<FPGATrackSimTruthTrack> FPGATrackSimMatrixGenAlgo::filterTrainingTracks(std::vector<FPGATrackSimTruthTrack> const & truth_tracks) const
342 {
343  std::vector<FPGATrackSimTruthTrack> training_tracks;
344 
345  for (FPGATrackSimTruthTrack const & track : truth_tracks) {
346  if (HepMC::generations(&track) >= 1 || std::abs(track.getPDGCode()) != m_TRAIN_PDG) continue;
347  if (std::abs(track.getD0()) > m_D0_THRESHOLD) continue;
348 
349  double pt = TMath::Sqrt(track.getPX()*track.getPX() + track.getPY()*track.getPY());
350  double pt_GeV = pt / 1000;
351 
352  // Add the track to the list of good tracks
353  if (pt_GeV > m_PT_THRESHOLD) training_tracks.push_back(track);
354 
355  // Debug
356  if (msgLvl(MSG::DEBUG)) {
357  double c = track.getQ() /(2 * pt);
358  double eta = TMath::ASinH(track.getPZ() / pt);
359  double phi = TMath::ATan2(track.getPY(), track.getPX());
360  ATH_MSG_DEBUG("pt_GeV = "<< pt_GeV
361  << " c = " << c
362  << " eta = " << eta
363  << " phi = " << phi
364  << " pdgcode = " << track.getPDGCode());
365  }
367  }
368 
369  return training_tracks;
370 }
371 
372 
373 // Sorts 'hits' by barcodes appearing in 'tracks', drops the rest.
374 std::map<int, std::vector<FPGATrackSimHit>> FPGATrackSimMatrixGenAlgo::makeBarcodeMap(std::vector<FPGATrackSimHit> const & hits, std::vector<FPGATrackSimTruthTrack> const & tracks) const
375 {
376  std::map<int, std::vector<FPGATrackSimHit>> map;
377 
378  // Ready the barcodes
379  for (const FPGATrackSimTruthTrack & track : tracks)
380  map[track.getBarcode()] = std::vector<FPGATrackSimHit>();
381 
382  // Add the hits
383  for (const FPGATrackSimHit & hit : hits) {
384  // Get the predominant barcode for the current hit
385  int barcode = hit.getTruth().best_barcode();
386 
387  // Add hit to the list; skip the hits if not associated to a good truth tracks
388  auto it = map.find(barcode);
389  if (it != map.end()) (*it).second.push_back(hit);
390  }
391 
392  return map;
393 }
394 
395 
396 // Given two hits in the same layer, selects the better hit to use for sector
397 // generation based on multiple criteria.
398 //
399 // Returns:
400 // 0 - Failure, this track should be discarded
401 // 1 - Keep old hit
402 // 2 - Use new hit
403 //
404 // NB: sector overlap is a perfectly reasonable situation with forward disks
405 // eta and phi will differ in general in this case
406 // Take the lower-z hit preferentially (right thing to do? d0/pT tradeoff)
407 // But something fishy is going on if we've got two hits on the same disk.
409 {
410  if ((new_hit.getSection() == old_hit.getSection()) && (new_hit.getLayer() == old_hit.getLayer())
411  && (new_hit.getEtaModule() == old_hit.getEtaModule()) && (new_hit.getPhiModule() == old_hit.getPhiModule())) {
412  ATH_MSG_DEBUG("Two hits on same module");
414  }
415 
416  // Always prefer spacepoints, regardless of all other considerations.
417  // This is necessary in part due to spacepoint duplication.
418  if (old_hit.getHitType() == HitType::spacepoint && new_hit.getHitType() != HitType::spacepoint) {
420  } else if (old_hit.getHitType() != HitType::spacepoint && new_hit.getHitType() == HitType::spacepoint) {
422  }
423 
424  int new_section = new_hit.getSection();
425  int old_section = old_hit.getSection();
426 
427  if (old_section == new_section) {
428 
429  if (old_hit.getEtaModule() == new_hit.getEtaModule()) {
430  int rmax = 0;
431  if (m_doHoughConstants) {
432  int reg = m_FPGATrackSimMapping->RegionMap_1st()->getRegions(new_hit)[0]; // just take region with lowest index
433 
434  int phi_max = m_FPGATrackSimMapping->RegionMap_1st()->getRegionBoundaries(reg, new_hit.getLayer(), new_section).phi_max;
435  int phi_min = m_FPGATrackSimMapping->RegionMap_1st()->getRegionBoundaries(reg, new_hit.getLayer(), new_section).phi_min;
436 
437  rmax = phi_max - phi_min;
438  }
439  else {
440  int reg = m_FPGATrackSimMapping->RegionMap_2nd()->getRegions(new_hit)[0]; // just take region with lowest index
441 
442  int phi_max = m_FPGATrackSimMapping->RegionMap_2nd()->getRegionBoundaries(reg, new_hit.getLayer(), new_section).phi_max;
443  int phi_min = m_FPGATrackSimMapping->RegionMap_2nd()->getRegionBoundaries(reg, new_hit.getLayer(), new_section).phi_min;
444 
445  rmax = phi_max - phi_min;
446  }
447 
448  int phi_diff = old_hit.getPhiModule() - new_hit.getPhiModule();
449 
450  if (phi_diff == 1 || phi_diff == -rmax) return selectHit_returnCode::SH_KEEP_OLD;
451  else if (phi_diff == -1 || phi_diff == rmax) return selectHit_returnCode::SH_KEEP_NEW;
452  else {
453  ATH_MSG_DEBUG("Hits are too far away in phi");
455  }
456  }
457  else { // Different eta is no good
458 
459  ATH_MSG_DEBUG("Hits are in different eta");
461  }
462  }
463  else { // sections are different
464 
465  int layer = old_hit.getLayer();
466  bool old_isEC = 0;
467  bool new_isEC = 0;
468  int old_disk = 0;
469  int new_disk = 0;
470  if (m_doHoughConstants) {
471  old_isEC = m_FPGATrackSimMapping->PlaneMap_1st()->isEC(layer, old_section);
472  new_isEC = m_FPGATrackSimMapping->PlaneMap_1st()->isEC(layer, new_section);
473  old_disk = m_FPGATrackSimMapping->PlaneMap_1st()->getLayerInfo(layer, old_section).physDisk;
474  new_disk = m_FPGATrackSimMapping->PlaneMap_1st()->getLayerInfo(layer, new_section).physDisk;
475  }
476  else {
477  old_isEC = m_FPGATrackSimMapping->PlaneMap_2nd()->isEC(layer, old_section);
478  new_isEC = m_FPGATrackSimMapping->PlaneMap_2nd()->isEC(layer, new_section);
479  old_disk = m_FPGATrackSimMapping->PlaneMap_2nd()->getLayerInfo(layer, old_section).physDisk;
480  new_disk = m_FPGATrackSimMapping->PlaneMap_2nd()->getLayerInfo(layer, new_section).physDisk;
481  }
482  // If one is barrel and one endcap, it's definitely OK, take the barrel hit
483  if (old_isEC != new_isEC) {
484 
485  if (old_isEC) return selectHit_returnCode::SH_KEEP_NEW;
487  }
488  // Two endcap hits : same disk: discard
489  else if (old_disk == new_disk) {
490 
491  ATH_MSG_DEBUG("Two modules hit in same physical disk " << old_disk);
493  }
494  // Two endcap hits on same side: different disks: take the lower-z
495  else {
496  ATH_MSG_DEBUG("Keeping the lower-z of the two disks (" << old_disk << ", " << new_disk << ") hit");
497  if (old_disk > new_disk) return selectHit_returnCode::SH_KEEP_NEW;
499  }
500  }
501 }
502 
503 
504 // A sector is created from 8 hits in 8 layers. Sometimes there will be extraneous hits
505 // that need to be filtered. This functions returns true on success, and by reference
506 // the filtered hit list with size m_nLayers.
507 //
508 // See selectHit() for details on which hit is chosen when there's more than 1 per layer.
509 bool FPGATrackSimMatrixGenAlgo::filterSectorHits(std::vector<FPGATrackSimHit> const & all_hits, std::vector<FPGATrackSimHit> & sector_hits,
510  /* TEMP */ FPGATrackSimTruthTrack const & t) const
511 {
512  FPGATrackSimHit nohit;
514  sector_hits.resize(m_nLayers, nohit);
515  std::vector<int> layer_count(m_nLayers); // count number of hits seen in each layer
516 
517  for (FPGATrackSimHit const & hit : all_hits) {
518  int layer = hit.getLayer();
519 
520  if (layer_count[layer] == 0){
521  layer_count[layer]++;
522  sector_hits[layer] = hit;
523  }
524  else if (layer_count[layer] == 1) {
525  layer_count[layer]++;
526 
527  // Already found a hit in this layer, so pick which hit to use
528  selectHit_returnCode selected_hit = selectHit(sector_hits[layer], hit);
529 
530  if (selected_hit == selectHit_returnCode::SH_FAILURE) {
532  return false;
533  }
534  else if (selected_hit == selectHit_returnCode::SH_KEEP_NEW) sector_hits[layer] = hit;
535  }
536  else {
537  ATH_MSG_DEBUG("Too many hits on a plane, exiting filterHitsSec");
539  return false;
540  }
541  }
542 
543  // Count number of wildcards, spacepoints, and pixel hits.
544  int nwc = 0;
545  int num_sp = 0;
546  int num_pixel = 0;
547 
548  // Check we have the right number of hits
549  // Check we have the right number of hits.
550  for (int i = 0; i < m_nLayers; ++i)
551  {
552  if (layer_count[i] == 0)
553  {
554  ATH_MSG_DEBUG("Layer " << i << " has no hits");
555  nwc++;
556  }
557 
558  // Now that we've decided which hit to use-- check their type.
559  if (sector_hits[i].getHitType() == HitType::spacepoint) {
560  num_sp += 1;
561  }
562  if (sector_hits[i].isPixel()) {
563  num_pixel += 1;
564  }
565  }
566 
567  ATH_MSG_DEBUG("Found " << nwc << " wildcards compared to maximum: " << m_MaxWC);
568  // Divide by 2 due to spacepoint duplication.
569  num_sp /= 2;
570  ATH_MSG_DEBUG("Found " << num_sp << " spacepoints after removing duplicates.");
571  // Require we don't have too many wildcards.
572  if (nwc > m_MaxWC)
573  {
575  return false;
576  }
577  // Require that we have a certain number of "2D" hits (i.e. pixels and spacepoints)
578  // The effect of this is that we can ensure we have 4/5 2D hits but 7/9 hits total.
579  // NOTE Again, uncomment logic below for second stage running.
580  num_sp += num_pixel;
581  int minSpacePlusPixel = /*m_isSecondStage ? m_minSpacePlusPixel2 :*/ m_minSpacePlusPixel;
582  if (num_sp < minSpacePlusPixel) {
583  ATH_MSG_DEBUG("Not enough pixel hits + spacepoints (" << num_sp << " < " << minSpacePlusPixel << ")");
585  return false;
586  }
587  return true;
588 }
589 
590 
591 // Returns the lowest index region that contains all hits in 'hits'
592 int FPGATrackSimMatrixGenAlgo::getRegion(std::vector<FPGATrackSimHit> const & hits) const
593 {
594  // Start with a bitmask, all true, and set a region to false if any mismatch is found
595  std::vector<bool> region_mask(m_nRegions, true);
596 
597  for (FPGATrackSimHit const & hit : hits) {
598  if (hit.getHitType() != HitType::wildcard){ // don't worry about hits that are WCs
599  for (int region = 0; region < m_nRegions; region++) {
600  if (m_doHoughConstants) {
601  if (!m_FPGATrackSimMapping->RegionMap_1st()->isInRegion(region, hit))
602  region_mask[region] = false;
603  }
604  else {
605  if (!m_FPGATrackSimMapping->RegionMap_2nd()->isInRegion(region, hit))
606  region_mask[region] = false;
607  }
608  }
609  }
610  }
611 
612  // For now just give preference to lowest region index for simplicity
613  for (int region = 0; region < m_nRegions; region++)
614  if (region_mask[region])
615  return region;
616 
617  return -1;
618 }
619 
620 
621 // Given a track and corresponding hits, returns the sector (list of modules) and the accumulation
622 // struct.
623 StatusCode FPGATrackSimMatrixGenAlgo::makeAccumulator(std::vector<FPGATrackSimHit> const & sector_hits, FPGATrackSimTruthTrack const & track, std::pair<std::vector<module_t>, FPGATrackSimMatrixAccumulator> & accumulator) const
624 {
625  std::vector<module_t> modules(m_nLayers);
627 
628  //find the bin!
629  // NOTE: this only implements q/pt binning, not the subregion / eta pattern-based constants for now.
630  int sectorbin = 0;
631  double qoverpt = track.getQ() / track.getPt();
632  if (m_absQOverPtBinning) qoverpt = abs(qoverpt);
633  for (unsigned bin = 0; bin < m_qOverPtBins.size()-1; bin++) {
634  sectorbin = fpgatracksim::QPT_SECTOR_OFFSET * bin;
635  if (qoverpt < m_qOverPtBins[bin+1]) break;
636  }
637 
638  // Create sector definitions (list of modules)
639  std::string module_printout = "";
640  for (int i = 0; i < m_nLayers; i++)
641  {
642  if (sector_hits[i].getHitType() != HitType::wildcard) {
643  if (m_single) modules[i] = sector_hits[i].getIdentifierHash();
644  else {
645  modules[i] = sectorbin;
646  // Modify sectorbin by a "type" field, which for now means: 0 = not spacepoint, 1 = spacepoint.
647  // This will fail if we have more than 99 q/pt bins!
648  if (sector_hits[i].getHitType() == HitType::spacepoint) {
650  }
651  module_printout += std::to_string(modules[i]) + ", ";
652  }
653  }
654  else {
655  modules[i] = -1; // WC
656  }
657  }
658 
659  ATH_MSG_DEBUG("Generating track in sectorbin = " << sectorbin << " with modules: " << module_printout);
660 
661 
662  if (m_single) {
663  const int ToKeep[13] = {2200,2564,2861,3831,5368,14169,14173,20442,20446,29625,29629,42176,42180};
664  bool keepThis = true;
665  for (int i = 0; i < 13; i++) {
666  if (modules[i] != ToKeep[i] && modules[i] != -1) {
667  keepThis = false;
668  }
669  }
670 
671  if (!keepThis) {
672  for (int i = 0; i < 13; i++) modules[i] = -1;
673  }
674  else {
675  for (int i = 0; i < 13; i++) {
676  }
677  }
678  }
679 
680 
681  // rho = (0.33 m) (pT/GeV) / (B/T)
682  // 0.33 in m -> 330.0 mm. Track pt -> GeV. 2.0 Tesla
683  // inverse, x2 for convenience
684 
685  // rho = 330 mm * track.getPT() / 2 T
686  // 2 rho = 330 mm * track.getPT()
687  // 1/ (2rho) = 1./(330 * pT) for pT in GeV
688  // or 1./(0.33 * pt) for pT in MeV
689 
690  double const trackTwoRhoInv = track.getQ() * 1.0 / ( 0.33 * track.getPt() );
691 
692  // Hough Constants parameters
693  double y = accumulator.second.pars.qOverPt;
694  double x = accumulator.second.pars.phi;
695  double const houghRho = fpgatracksim::A * y; // Aq/pT
696 
697  // Vectorize (flatten) coordinates
698  std::vector<double> coords;
699  std::vector<double> coordsG;
700  for (int i = 0; i < m_nLayers; ++i) {
701  if (sector_hits[i].getHitType() != HitType::wildcard) {
702  double hitGPhi = sector_hits[i].getGPhi(); // need to be careful about 2 pi boundary in the future!
703 
704  // If this is a spacepoint the target R should be the average of the two layers.
705  // TODO, get this to be loaded in from a mean radii file into the mapping infrastructure.
706  double target_r = m_FPGATrackSimMapping->RegionMap_1st()->getAvgRadius(0, i);
707  if (sector_hits[i].getHitType() == HitType::spacepoint) {
708  int other_layer = (sector_hits[i].getSide() == 0) ? i + 1 : i - 1;
709  target_r = (target_r + m_FPGATrackSimMapping->RegionMap_1st()->getAvgRadius(0, other_layer)) / 2.;
710  }
711 
712  // Create phi for any hits that are not spacepoints, as well as "inner" spacepoints.
713  // but not outer spacepoints. this avoids duplicate coordinates.
714  if (sector_hits[i].getHitType() != HitType::spacepoint || sector_hits[i].getSide() == 0) {
715 
716  if (m_doHoughConstants){
717  double expectedGPhi = x; // to get the intersection of the hough road with detector layer
718 
719  hitGPhi += ( sector_hits[i].getR() - target_r ) * houghRho; //first order
720  expectedGPhi -= target_r * houghRho; //first order
721 
722  if ( m_ideal_geom > 1 ) {
723  hitGPhi += ( pow( sector_hits[i].getR() * houghRho, 3.0 ) / 6.0 ); //higher order
724  expectedGPhi -= ( pow( target_r * houghRho, 3.0 ) / 6.0 ); //higher order
725  }
726 
727  if (m_doDeltaPhiConsts) {
728  coords.push_back(hitGPhi - expectedGPhi);
729  coordsG.push_back(hitGPhi - expectedGPhi);
730  } else {
731  coords.push_back(hitGPhi);
732  coordsG.push_back(hitGPhi);
733  ATH_MSG_DEBUG("Pushed back phi coord = " << hitGPhi);
734  }
735  }
736  else {
737  // Idealise phi coordinate if requested
738  if ( m_ideal_geom > 0 ) {
739  hitGPhi += ( sector_hits[i].getR() - target_r ) * trackTwoRhoInv; //first order
740  }
741  if ( m_ideal_geom > 1 ) {
742  hitGPhi += ( pow( sector_hits[i].getR() * trackTwoRhoInv, 3.0 ) / 6.0 ); //higher order
743  }
744  coords.push_back(hitGPhi);
745  coordsG.push_back(hitGPhi);
746  }
747  }
748 
749  // Create a z coordinate for the "outer" layer of the spacepoint and for 2D pixel hits.
750  // This means that a spacepoint will write out (phi, eta) pairs, but (0, phi) or (phi, 0) if it's missing.
751  if (sector_hits[i].getDim() == 2 || (sector_hits[i].getHitType() == HitType::spacepoint && (sector_hits[i].getPhysLayer() % 2) == 1)) {
752  double hitZ = sector_hits[i].getZ();
753 
754  if(m_doHoughConstants){
755  hitZ -= sector_hits[i].getGCotTheta() * (sector_hits[i].getR() - target_r);
756  if ( m_ideal_geom > 1 )
757  hitZ -= (sector_hits[i].getGCotTheta() * pow (sector_hits[i].getR(), 3.0) * houghRho * houghRho) / 6.0;
758  }
759  else{
760  if ( m_ideal_geom > 0 ) {
761  hitZ -= sector_hits[i].getGCotTheta() * (sector_hits[i].getR() - target_r);
762  }
763  if ( m_ideal_geom > 1 ) {
764  hitZ -= sector_hits[i].getGCotTheta() * ( pow (sector_hits[i].getR(), 3.0) * trackTwoRhoInv * trackTwoRhoInv) / 6.0;
765  }
766  }
767 
768  coords.push_back(hitZ);
769  coordsG.push_back(hitZ);
770  ATH_MSG_DEBUG("Pushed back z coord = " << hitZ);
771  }
772 
773  }
774  else {
775  coords.push_back(0);
776  coordsG.push_back(0);
777  if (m_pmap->getDim(i) == 2) coords.push_back(0);
778  if (m_pmap->getDim(i) == 2) coordsG.push_back(0);
779  }
780  }
781  assert(coords.size() == (size_t)m_nDim);
782  acc.hit_coords = coords;
783  acc.hit_coordsG = coordsG;
784 
785  // Get the track parameters
786  acc.pars = track.getPars();
788  acc.pars.qOverPt = (y / 1000.0) - track.getQOverPt(); // fit for delta q/pT
789  acc.pars.phi = x - track.getPhi(); // fit for delta phi_0
790  }
791 
793  for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++)
794  bins[i] = (acc.pars[i] - m_sliceMin[i]) * m_nBins[i] / (m_sliceMax[i] - m_sliceMin[i]);
795  acc.track_bins.push_back(bins);
796 
797  // Force phi to be in [0, 2pi] (post binning)
798  if (!m_doDeltaPhiConsts) {
799  while (acc.pars.phi < 0) acc.pars.phi += 2*M_PI;
800  while (acc.pars.phi > 2*M_PI) acc.pars.phi -= 2*M_PI;
801  }
802 
803  // Calculate the pre-multiplied elements
804  for (int i = 0; i < m_nDim; i++)
805  {
806  acc.hit_x_QoP[i] = coords[i] * acc.pars.qOverPt;
807  acc.hit_xG_HIP[i] = coordsG[i] * acc.pars.qOverPt;
808  acc.hit_x_d0[i] = coords[i] * acc.pars.d0;
809  acc.hit_x_z0[i] = coords[i] * acc.pars.z0;
810  acc.hit_x_eta[i] = coords[i] * acc.pars.eta;
811  acc.hit_xG_eta[i] = coordsG[i] * acc.pars.eta;
812  acc.hit_x_phi[i] = coords[i] * acc.pars.phi;
813 
814  for (int j = i; j < m_nDim; j++)
815  acc.covariance[i * m_nDim + j] = coords[i] * coords[j];
816 
817  for (int j = i; j < m_nDim; j++)
818  acc.covarianceG[i * m_nDim + j] = coordsG[i] * coordsG[j];
819  }
820 
821  accumulator = {modules, acc};
822  return StatusCode::SUCCESS;
823 }
824 
825 
826 
828 // Finalize
830 
831 
833 {
834  ATH_MSG_DEBUG("finalize()");
835  ATH_MSG_INFO("Tracks used: " << m_nTracksUsed << "/" << m_nTracks);
836 
837  for (int region = 0; region < m_nRegions; region++) {
838  // Create the tree
839  std::stringstream name;
840  std::stringstream title;
841  name << "am" << region;
842  title << "Ambank " << region << " parameters";
843  TTree* tree = new TTree(name.str().c_str(), title.str().c_str());
844  ATH_CHECK(m_tHistSvc->regTree(Form("/TRIGFPGATrackSimMATRIXOUT/%s",tree->GetName()), tree));
845 
846  // Fill the tree
848  // Monitoring
849  ATH_MSG_INFO("Sectors found in region " << region << ": " << m_sector_cum[region].size());
850  for (auto & sector_info : m_sector_cum[region]) {
851  double coverage = sector_info.second.track_bins.size();
852  m_h_nHit->Fill(coverage);
853  for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++)
854  m_h_sectorPars[i]->Fill(sector_info.second.pars[i] / coverage);
855  }
856  }
857 
858  writeSliceTree();
859  ATH_CHECK(m_tHistSvc->finalize());
860  return StatusCode::SUCCESS;
861 }
862 
863 
865 {
866  TTree* sliceTree = new TTree("slice", "Region slice boundaries"); // slice
867 
868  sliceTree->Branch("c_max", &m_sliceMax.qOverPt);
869  sliceTree->Branch("d0_max", &m_sliceMax.d0);
870  sliceTree->Branch("phi_max", &m_sliceMax.phi);
871  sliceTree->Branch("z0_max", &m_sliceMax.z0);
872  sliceTree->Branch("eta_max", &m_sliceMax.eta);
873 
874  sliceTree->Branch("c_min", &m_sliceMin.qOverPt);
875  sliceTree->Branch("d0_min", &m_sliceMin.d0);
876  sliceTree->Branch("phi_min", &m_sliceMin.phi);
877  sliceTree->Branch("z0_min", &m_sliceMin.z0);
878  sliceTree->Branch("eta_min", &m_sliceMin.eta);
879 
880  sliceTree->Branch("c_slices", &m_nBins.qOverPt);
881  sliceTree->Branch("d0_slices", &m_nBins.d0);
882  sliceTree->Branch("phi_slices", &m_nBins.phi);
883  sliceTree->Branch("z0_slices", &m_nBins.z0);
884  sliceTree->Branch("eta_slices", &m_nBins.eta);
885 
886  StatusCode sc = m_tHistSvc->regTree("/TRIGFPGATrackSimMATRIXOUT/slice",sliceTree);
887  if (sc.isFailure()) ATH_MSG_ERROR("tHist failed");
888 
889  sliceTree->Fill();
890 }
FPGATrackSimMatrixGenAlgo::filterSectorHits
bool filterSectorHits(std::vector< FPGATrackSimHit > const &all_hits, std::vector< FPGATrackSimHit > &sector_hits, FPGATrackSimTruthTrack const &t) const
Definition: FPGATrackSimMatrixGenAlgo.cxx:509
FPGATrackSimHit::getSection
unsigned getSection() const
Definition: FPGATrackSimHit.cxx:81
FPGATrackSimMatrixGenAlgo::selectHit
selectHit_returnCode selectHit(FPGATrackSimHit const &old_hit, FPGATrackSimHit const &new_hit) const
Definition: FPGATrackSimMatrixGenAlgo.cxx:408
make_hlt_rep.pars
pars
Definition: make_hlt_rep.py:90
FPGATrackSimHit::getPhiModule
unsigned getPhiModule() const
Definition: FPGATrackSimHit.h:83
FPGATrackSimMatrixGenAlgo::m_hitMapTool
ToolHandle< FPGATrackSimRawToLogicalHitsTool > m_hitMapTool
Definition: FPGATrackSimMatrixGenAlgo.h:78
FPGATrackSimMatrixGenAlgo::getLogicalHits
std::vector< FPGATrackSimHit > getLogicalHits()
Definition: FPGATrackSimMatrixGenAlgo.cxx:302
FPGATrackSimMatrixGenAlgo::m_qOverPtBins
Gaudi::Property< std::vector< double > > m_qOverPtBins
Definition: FPGATrackSimMatrixGenAlgo.h:115
FPGATrackSimMatrixGenAlgo::m_temp_z0_max
Gaudi::Property< float > m_temp_z0_max
Definition: FPGATrackSimMatrixGenAlgo.h:106
FPGATrackSimMatrixGenAlgo::m_temp_d0_max
Gaudi::Property< float > m_temp_d0_max
Definition: FPGATrackSimMatrixGenAlgo.h:104
FPGATrackSimMatrixGenAlgo::makeAccumulator
StatusCode makeAccumulator(std::vector< FPGATrackSimHit > const &sector_hits, FPGATrackSimTruthTrack const &track, std::pair< std::vector< module_t >, FPGATrackSimMatrixAccumulator > &accumulator) const
Definition: FPGATrackSimMatrixGenAlgo.cxx:623
FPGATrackSimMatrixGenAlgo::m_temp_phi_max
Gaudi::Property< float > m_temp_phi_max
Definition: FPGATrackSimMatrixGenAlgo.h:102
FPGATrackSimTrackPars::phi
double phi
Definition: FPGATrackSimTrackPars.h:24
FPGATrackSimMatrixGenAlgo::m_temp_d0_min
Gaudi::Property< float > m_temp_d0_min
Definition: FPGATrackSimMatrixGenAlgo.h:103
FPGATrackSimLogicalEventInputHeader
Definition: FPGATrackSimLogicalEventInputHeader.h:21
FPGATrackSimRegionSlices.h
Stores slice definitions for FPGATrackSim regions.
python.FPGATrackSimAnalysisConfig.stage
stage
Definition: FPGATrackSimAnalysisConfig.py:604
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
FPGATrackSimTrackParsI::eta
int eta
Definition: FPGATrackSimTrackPars.h:62
python.App.bins
bins
Definition: App.py:410
FPGATrackSimMatrixGenAlgo::m_minSpacePlusPixel
Gaudi::Property< int > m_minSpacePlusPixel
Definition: FPGATrackSimMatrixGenAlgo.h:95
FPGATrackSimMatrixGenAlgo::getRegion
int getRegion(std::vector< FPGATrackSimHit > const &hits) const
Definition: FPGATrackSimMatrixGenAlgo.cxx:592
TH1I
Definition: rootspy.cxx:332
FPGATrackSimMatrixGenAlgo::m_nTracksUsed
size_t m_nTracksUsed
Definition: FPGATrackSimMatrixGenAlgo.h:131
FPGATrackSimMatrixGenAlgo::makeBarcodeMap
std::map< int, std::vector< FPGATrackSimHit > > makeBarcodeMap(std::vector< FPGATrackSimHit > const &hits, std::vector< FPGATrackSimTruthTrack > const &tracks) const
Definition: FPGATrackSimMatrixGenAlgo.cxx:374
FPGATrackSimTrackPars
Definition: FPGATrackSimTrackPars.h:22
FPGATrackSimTrackPars::qOverPt
double qOverPt
Definition: FPGATrackSimTrackPars.h:25
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
FPGATrackSimMatrixGenAlgo::m_FPGATrackSimMapping
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
Definition: FPGATrackSimMatrixGenAlgo.h:73
FPGATrackSimMatrixGenAlgo::m_temp_z0_slices
Gaudi::Property< int > m_temp_z0_slices
Definition: FPGATrackSimMatrixGenAlgo.h:112
fpgatracksim::SPACEPOINT_SECTOR_OFFSET
constexpr int SPACEPOINT_SECTOR_OFFSET
Definition: FPGATrackSimConstants.h:22
FPGATrackSimTruthTrack
Definition: FPGATrackSimTruthTrack.h:13
accumulate
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
Definition: FPGATrackSimMatrixAccumulator.cxx:22
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
tree
TChain * tree
Definition: tile_monitor.h:30
FPGATrackSimTrackPars::d0
double d0
Definition: FPGATrackSimTrackPars.h:26
skel.it
it
Definition: skel.GENtoEVGEN.py:423
FPGATrackSimHit::getLayer
unsigned getLayer() const
Definition: FPGATrackSimHit.cxx:75
BindingsTest.hr
hr
Definition: BindingsTest.py:23
test_pyathena.pt
pt
Definition: test_pyathena.py:11
FPGATrackSimMatrixGenAlgo::filterTrainingTracks
std::vector< FPGATrackSimTruthTrack > filterTrainingTracks(std::vector< FPGATrackSimTruthTrack > const &truth_tracks) const
Definition: FPGATrackSimMatrixGenAlgo.cxx:341
M_PI
#define M_PI
Definition: ActiveFraction.h:11
bin
Definition: BinsDiffFromStripMedian.h:43
AthCommonMsg< Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
FPGATrackSimMatrixGenAlgo::m_nDim
int m_nDim
Definition: FPGATrackSimMatrixGenAlgo.h:118
FPGATrackSimTrackParsI::d0
int d0
Definition: FPGATrackSimTrackPars.h:60
FPGATrackSimMatrixGenAlgo::writeSliceTree
void writeSliceTree()
Definition: FPGATrackSimMatrixGenAlgo.cxx:864
HitType::spacepoint
@ spacepoint
FPGATrackSimMatrixGenAlgo::m_ideal_geom
Gaudi::Property< int > m_ideal_geom
Definition: FPGATrackSimMatrixGenAlgo.h:90
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
FPGATrackSimMatrixGenAlgo::m_temp_phi_min
Gaudi::Property< float > m_temp_phi_min
Definition: FPGATrackSimMatrixGenAlgo.h:101
FPGATrackSimTrackPars::eta
double eta
Definition: FPGATrackSimTrackPars.h:28
FPGATrackSimMatrixGenAlgo::m_D0_THRESHOLD
Gaudi::Property< float > m_D0_THRESHOLD
Definition: FPGATrackSimMatrixGenAlgo.h:97
FPGATrackSimMatrixGenAlgo::m_temp_z0_min
Gaudi::Property< float > m_temp_z0_min
Definition: FPGATrackSimMatrixGenAlgo.h:105
x
#define x
python.DomainsRegistry.reg
reg
globals -----------------------------------------------------------------—
Definition: DomainsRegistry.py:343
FPGATrackSimMatrixGenAlgo::m_temp_eta_slices
Gaudi::Property< int > m_temp_eta_slices
Definition: FPGATrackSimMatrixGenAlgo.h:113
FPGATrackSimMatrixGenAlgo::m_temp_eta_min
Gaudi::Property< float > m_temp_eta_min
Definition: FPGATrackSimMatrixGenAlgo.h:107
FPGATrackSimMatrixGenAlgo::selectHit_returnCode::SH_FAILURE
@ SH_FAILURE
FPGATrackSimHit::getEtaModule
unsigned getEtaModule() const
Definition: FPGATrackSimHit.h:82
FPGATrackSimMatrixGenAlgo::m_EvtSel
ServiceHandle< IFPGATrackSimEventSelectionSvc > m_EvtSel
Definition: FPGATrackSimMatrixGenAlgo.h:74
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
FPGATrackSimConstants.h
FPGATrackSimOptionalEventInfo::getTruthTracks
const std::vector< FPGATrackSimTruthTrack > & getTruthTracks() const
Definition: FPGATrackSimOptionalEventInfo.h:37
FPGATrackSimHit
Definition: FPGATrackSimHit.h:38
FPGATrackSimPlaneMap::getDim
uint32_t getDim(size_t logiLayer) const
Definition: FPGATrackSimPlaneMap.h:81
HitType::wildcard
@ wildcard
FPGATrackSimMatrixGenAlgo::m_doHoughConstants
Gaudi::Property< bool > m_doHoughConstants
Definition: FPGATrackSimMatrixGenAlgo.h:92
fillTree
void fillTree(AccumulateMap &map, TTree *tree, int nLayers, int nCoords)
Writes the contents of an AccumulateMap into the supplied tree (one entry per sector).
Definition: FPGATrackSimMatrixIO.cxx:225
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
FPGATrackSimMatrixGenAlgo::initialize
StatusCode initialize() override
Definition: FPGATrackSimMatrixGenAlgo.cxx:46
FPGATrackSimMatrixGenAlgo::FPGATrackSimMatrixGenAlgo
FPGATrackSimMatrixGenAlgo(const std::string &name, ISvcLocator *pSvcLocator)
Definition: FPGATrackSimMatrixGenAlgo.cxx:35
FPGATrackSimMatrixGenAlgo::m_sliceMax
FPGATrackSimTrackPars m_sliceMax
Definition: FPGATrackSimMatrixGenAlgo.h:122
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
FPGATrackSimMatrixGenAlgo::m_temp_c_min
Gaudi::Property< float > m_temp_c_min
Definition: FPGATrackSimMatrixGenAlgo.h:99
FPGATrackSimMatrixGenAlgo::m_nRegions
Gaudi::Property< int > m_nRegions
Definition: FPGATrackSimMatrixGenAlgo.h:87
FPGATrackSimMatrixGenAlgo::selectHit_returnCode::SH_KEEP_OLD
@ SH_KEEP_OLD
FPGATrackSimMatrixGenAlgo::m_single
Gaudi::Property< bool > m_single
Definition: FPGATrackSimMatrixGenAlgo.h:91
lumiFormat.i
int i
Definition: lumiFormat.py:92
FPGATrackSimEventInputHeader::clearHits
void clearHits()
Definition: FPGATrackSimEventInputHeader.h:39
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
LArG4ShowerLibProcessing.hits
hits
Definition: LArG4ShowerLibProcessing.py:136
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
FPGATrackSimMatrixAccumulator
Definition: FPGATrackSimMatrixAccumulator.h:36
FPGATrackSimMatrixGenAlgo::m_spacePointsTool
ToolHandle< FPGATrackSimSpacePointsToolI > m_spacePointsTool
Definition: FPGATrackSimMatrixGenAlgo.h:80
FPGATrackSimMatrixGenAlgo::m_h_sectorPars
TH1I * m_h_sectorPars[FPGATrackSimTrackPars::NPARS]
Definition: FPGATrackSimMatrixGenAlgo.h:155
FPGATrackSimMatrixGenAlgo.h
Algorithm to generate matrix files, to be used for sector and constant generation.
covarianceTool.title
title
Definition: covarianceTool.py:542
FPGATrackSimMatrixGenAlgo::m_hitInputTool
ToolHandle< IFPGATrackSimInputTool > m_hitInputTool
Definition: FPGATrackSimMatrixGenAlgo.h:77
FPGATrackSimMatrixGenAlgo::m_temp_d0_slices
Gaudi::Property< int > m_temp_d0_slices
Definition: FPGATrackSimMatrixGenAlgo.h:111
FPGATrackSimMatrixGenAlgo::m_h_trackQoP_okHits
TH1I * m_h_trackQoP_okHits
Definition: FPGATrackSimMatrixGenAlgo.h:160
FPGATrackSimMatrixGenAlgo::m_doDeltaPhiConsts
Gaudi::Property< bool > m_doDeltaPhiConsts
Definition: FPGATrackSimMatrixGenAlgo.h:93
FPGATrackSimMatrixGenAlgo::m_PT_THRESHOLD
Gaudi::Property< float > m_PT_THRESHOLD
Definition: FPGATrackSimMatrixGenAlgo.h:96
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MakeTH3DFromTH2Ds.hists
hists
Definition: MakeTH3DFromTH2Ds.py:72
FPGATrackSimEventInputHeader
Definition: FPGATrackSimEventInputHeader.h:22
FPGATrackSimMatrixGenAlgo::m_temp_phi_slices
Gaudi::Property< int > m_temp_phi_slices
Definition: FPGATrackSimMatrixGenAlgo.h:110
FPGATrackSimMatrixGenAlgo::m_doSpacePoints
Gaudi::Property< bool > m_doSpacePoints
Definition: FPGATrackSimMatrixGenAlgo.h:89
FPGATrackSimMatrixGenAlgo::execute
StatusCode execute() override
Definition: FPGATrackSimMatrixGenAlgo.cxx:197
FPGATrackSimMatrixGenAlgo::m_absQOverPtBinning
Gaudi::Property< bool > m_absQOverPtBinning
Definition: FPGATrackSimMatrixGenAlgo.h:114
FPGATrackSimMatrixGenAlgo::m_doClustering
Gaudi::Property< bool > m_doClustering
Definition: FPGATrackSimMatrixGenAlgo.h:88
FPGATrackSimMatrixGenAlgo::m_clusteringTool
ToolHandle< FPGATrackSimClusteringToolI > m_clusteringTool
Definition: FPGATrackSimMatrixGenAlgo.h:79
FPGATrackSimMatrixGenAlgo::m_eventHeader
FPGATrackSimEventInputHeader * m_eventHeader
Definition: FPGATrackSimMatrixGenAlgo.h:125
FPGATrackSimMatrixGenAlgo::bookHistograms
StatusCode bookHistograms()
Definition: FPGATrackSimMatrixGenAlgo.cxx:122
AthAlgorithm
Definition: AthAlgorithm.h:47
FPGATrackSimMatrixGenAlgo::m_h_notEnoughHits
TH1I * m_h_notEnoughHits[FPGATrackSimTrackPars::NPARS]
Definition: FPGATrackSimMatrixGenAlgo.h:158
FPGATrackSimMatrixGenAlgo::m_nTracks
size_t m_nTracks
Definition: FPGATrackSimMatrixGenAlgo.h:130
fpgatracksim::QPT_SECTOR_OFFSET
constexpr int QPT_SECTOR_OFFSET
Definition: FPGATrackSimConstants.h:23
FPGATrackSimMatrixAccumulator.h
Helper struct for accumulating sector information for matrix generation.
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
MagicNumbers.h
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
plotBeamSpotVxVal.bin
int bin
Definition: plotBeamSpotVxVal.py:83
FPGATrackSimMatrixGenAlgo::selectHit_returnCode::SH_KEEP_NEW
@ SH_KEEP_NEW
FPGATrackSimMatrixGenAlgo::m_h_3hitsInLayer
TH1I * m_h_3hitsInLayer[FPGATrackSimTrackPars::NPARS]
Definition: FPGATrackSimMatrixGenAlgo.h:157
FPGATrackSimMatrixGenAlgo::m_sector_cum
std::vector< AccumulateMap > m_sector_cum
Definition: FPGATrackSimMatrixGenAlgo.h:68
FPGATrackSimMatrixGenAlgo::m_h_SHfailure
TH1I * m_h_SHfailure[FPGATrackSimTrackPars::NPARS]
Definition: FPGATrackSimMatrixGenAlgo.h:156
FPGATrackSimTrackPars::parName
static std::string parName(unsigned i)
Definition: FPGATrackSimTrackPars.cxx:72
FPGATrackSimEventInputHeader::optional
FPGATrackSimOptionalEventInfo const & optional() const
Definition: FPGATrackSimEventInputHeader.h:33
FPGATrackSimMatrixGenAlgo::m_nLayers
int m_nLayers
Definition: FPGATrackSimMatrixGenAlgo.h:117
FPGATrackSimTrackParsI::phi
int phi
Definition: FPGATrackSimTrackPars.h:58
FPGATrackSimMatrixGenAlgo::m_temp_c_max
Gaudi::Property< float > m_temp_c_max
Definition: FPGATrackSimMatrixGenAlgo.h:100
fillTrackPars
void fillTrackPars(TH1I *const hists[FPGATrackSimTrackPars::NPARS], FPGATrackSimTruthTrack const &track)
Definition: FPGATrackSimMatrixGenAlgo.cxx:185
y
#define y
FPGATrackSimMatrixGenAlgo::m_nDim2
int m_nDim2
Definition: FPGATrackSimMatrixGenAlgo.h:119
RunTileMonitoring.towers
towers
Definition: RunTileMonitoring.py:133
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
FPGATrackSimMatrixGenAlgo::m_h_trackQoP_okRegion
TH1I * m_h_trackQoP_okRegion
Definition: FPGATrackSimMatrixGenAlgo.h:161
FPGATrackSimTrackPars::z0
double z0
Definition: FPGATrackSimTrackPars.h:27
FPGATrackSimMatrixGenAlgo::m_sliceMin
FPGATrackSimTrackPars m_sliceMin
Definition: FPGATrackSimMatrixGenAlgo.h:121
FPGATrackSimMatrixGenAlgo::m_h_trainingTrack
TH1I * m_h_trainingTrack[FPGATrackSimTrackPars::NPARS]
Definition: FPGATrackSimMatrixGenAlgo.h:154
DEBUG
#define DEBUG
Definition: page_access.h:11
FPGATrackSimTrackPars::NPARS
@ NPARS
Definition: FPGATrackSimTrackPars.h:49
IDTPM::getR
float getR(const xAOD::TrackParticle &)
Accessor utility function for getting the value of prodR.
Definition: TrackParametersHelper.h:95
FPGATrackSimMatrixGenAlgo::m_MaxWC
Gaudi::Property< int > m_MaxWC
Definition: FPGATrackSimMatrixGenAlgo.h:94
FPGATrackSimMatrixGenAlgo::m_TRAIN_PDG
Gaudi::Property< int > m_TRAIN_PDG
Definition: FPGATrackSimMatrixGenAlgo.h:98
FPGATrackSimTrackParsI::z0
int z0
Definition: FPGATrackSimTrackPars.h:61
FPGATrackSimMatrixGenAlgo::m_nBins
FPGATrackSimTrackParsI m_nBins
Definition: FPGATrackSimMatrixGenAlgo.h:123
FPGATrackSimMatrixGenAlgo::m_h_nHit
TH1I * m_h_nHit
Definition: FPGATrackSimMatrixGenAlgo.h:162
FPGATrackSimMatrixGenAlgo::finalize
StatusCode finalize() override
Definition: FPGATrackSimMatrixGenAlgo.cxx:832
FPGATrackSimLogicalEventInputHeader::towers
const std::vector< FPGATrackSimTowerInputHeader > & towers() const
Definition: FPGATrackSimLogicalEventInputHeader.h:36
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
FPGATrackSimTrackParsI::qOverPt
int qOverPt
Definition: FPGATrackSimTrackPars.h:59
FPGATrackSimTrackParsI
Definition: FPGATrackSimTrackPars.h:56
HepMC::generations
int generations(const T &p)
Method to return how many interactions a particle has undergone during simulation (TODO migrate to be...
Definition: MagicNumbers.h:302
FPGATrackSimMatrixGenAlgo::m_tHistSvc
ServiceHandle< ITHistSvc > m_tHistSvc
Definition: FPGATrackSimMatrixGenAlgo.h:75
FPGATrackSimMatrixGenAlgo::m_temp_eta_max
Gaudi::Property< float > m_temp_eta_max
Definition: FPGATrackSimMatrixGenAlgo.h:108
FPGATrackSimEventInputHeader::reset
void reset()
Definition: FPGATrackSimEventInputHeader.cxx:15
FPGATrackSimMatrixGenAlgo::m_pmap
const FPGATrackSimPlaneMap * m_pmap
Definition: FPGATrackSimMatrixGenAlgo.h:82
FPGATrackSimMatrixGenAlgo::m_roadFinderTool
ToolHandle< IFPGATrackSimRoadFinderTool > m_roadFinderTool
Definition: FPGATrackSimMatrixGenAlgo.h:81
python.compressB64.c
def c
Definition: compressB64.py:93
FPGATrackSimMatrixGenAlgo::selectHit_returnCode
selectHit_returnCode
Definition: FPGATrackSimMatrixGenAlgo.h:136
FPGATrackSimRoad
Definition: FPGATrackSimRoad.h:29
FPGATrackSimHit::getHitType
HitType getHitType() const
Definition: FPGATrackSimHit.h:54
FPGATrackSimMatrixGenAlgo::m_temp_c_slices
Gaudi::Property< int > m_temp_c_slices
Definition: FPGATrackSimMatrixGenAlgo.h:109
FPGATrackSimHit::setHitType
void setHitType(HitType type)
Definition: FPGATrackSimHit.h:51
LArGeo::ATan2
GeoGenfun::FunctionNoop ATan2(GeoGenfun::GENFUNCTION y, GeoGenfun::GENFUNCTION x)
Definition: BarrelAuxFunctions.cxx:50