Loading [MathJax]/extensions/MathMenu.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
FPGATrackSimGenScanTool.cxx
Go to the documentation of this file.
1 // Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 
19 
20 #include <sstream>
21 #include <cmath>
22 #include <algorithm>
23 
24 
25 #include <nlohmann/json.hpp>
26 
27 #include "TH1.h"
28 
29 
30 
32 // Debug Print Tools
33 template<class T>
34 static inline std::string to_string(const std::vector<T>& v)
35 {
36  std::ostringstream oss;
37  oss << "[";
38  if (!v.empty())
39  {
40  std::copy(v.begin(), v.end() - 1, std::ostream_iterator<T>(oss, ", "));
41  oss << v.back();
42  }
43  oss << "]";
44  return oss.str();
45 }
46 
47 
48 std::ostream& operator<<(std::ostream &os, const FPGATrackSimGenScanTool::StoredHit &hit)
49 {
50  os << "lyr: " << hit.layer << " ";
51  os << "(" << hit.hitptr->getR() << ", " << hit.hitptr->getGPhi() << ", " << hit.hitptr->getZ() << ") ";
52  os << "[" << hit.phiShift << ", " << hit.etaShift << "]";
53  return os;
54 }
55 
56 
58 // AthAlgTool
59 
60 FPGATrackSimGenScanTool::FPGATrackSimGenScanTool(const std::string& algname, const std::string &name, const IInterface *ifc) :
61  base_class(algname, name, ifc)
62 {
63  declareInterface<IFPGATrackSimRoadFinderTool>(this);
64 }
65 
66 
68 {
69  // Dump the configuration to make sure it propagated through right
70  const std::vector<Gaudi::Details::PropertyBase*> props = this->getProperties();
71  for( Gaudi::Details::PropertyBase* prop : props ) {
72  if (prop->ownerTypeName()==this->type()) {
73  ATH_MSG_DEBUG("Property:\t" << prop->name() << "\t : \t" << prop->toString());
74  }
75  }
76 
77  // Retrieve info
78  ATH_CHECK(m_FPGATrackSimBankSvc.retrieve());
79  ATH_CHECK(m_FPGATrackSimMapping.retrieve());
80  ATH_MSG_INFO("Map specifies :" << m_nLayers);
81  ATH_CHECK(m_monitoring.retrieve());
82  ATH_MSG_INFO("Monitoring Dir :" << m_monitoring->dir());
83  ATH_CHECK(m_binning.retrieve());
84 
85  // Setup layer configuration
86  m_nLayers = m_FPGATrackSimMapping->PlaneMap_1st(getSubRegion())->getNLogiLayers();
87 
88  // This is the layers they get paired with previous layers
89  for (unsigned lyr = 0; lyr < m_nLayers; ++lyr) m_pairingLayers.push_back(lyr);
90  if (m_reversePairDir) {
92  }
93  ATH_MSG_INFO("Pairing Layers: " << m_pairingLayers);
94 
95  // Check inputs
96  bool ok = false;
97  if (m_pairFilterDeltaPhiCut.size() != m_nLayers - 1)
98  ATH_MSG_FATAL("initialize() pairFilterDeltaPhiCut must have size nLayers-1=" << m_nLayers - 1 << " found " << m_pairFilterDeltaPhiCut.size());
99  else if (m_pairFilterDeltaEtaCut.size() != m_nLayers - 1)
100  ATH_MSG_FATAL("initialize() pairFilterDeltaEtaCut must have size nLayers-1=" << m_nLayers - 1 << " found " << m_pairFilterDeltaEtaCut.size());
101  else if (m_pairFilterPhiExtrapCut.size() != 2)
102  ATH_MSG_FATAL("initialize() pairFilterPhiExtrapCut must have size 2 found " << m_pairFilterPhiExtrapCut.size());
103  else if (m_pairFilterEtaExtrapCut.size() != 2)
104  ATH_MSG_FATAL("initialize() pairFilterEtaExtrapCut must have size 2 found " << m_pairFilterEtaExtrapCut.size());
105  else if (m_pairSetPhiExtrapCurvedCut.size() != 2)
106  ATH_MSG_FATAL("initialize() PairSetPhiExtrapCurvedCut must have size 2found " << m_pairSetPhiExtrapCurvedCut.size());
107  else if ((m_rin < 0.0) || (m_rout < 0.0))
108  ATH_MSG_FATAL("Radii not set");
109  else
110  ok = true;
111  if (!ok)
112  return StatusCode::FAILURE;
113 
114 
115  // Dump Binning
116  for (unsigned par : m_binning->slicePars()) { ATH_MSG_INFO("Slice Par: " << m_binning->parNames(par)); }
117  for (unsigned par : m_binning->scanPars()) { ATH_MSG_INFO("Scan Par: " << m_binning->parNames(par)); }
118  ATH_MSG_INFO("Row Par: " << m_binning->parNames(m_binning->rowParIdx()));
119 
120  // Configure Binning
121  for (unsigned par = 0; par < FPGATrackSimGenScanBinningBase::NPars; par++)
122  {
123  m_binning->m_parMin[par] = m_parMin[par];
124  m_binning->m_parMax[par] = m_parMax[par];
125  m_binning->m_parBins[par] = m_parBins[par];
126  if (m_parBins[par] <= 0)
127  {
128  ATH_MSG_FATAL("Every dimension must be at least one bin");
129  return StatusCode::FAILURE;
130  }
131  m_binning->m_parStep[par] = (m_parMax[par] - m_parMin[par]) / m_parBins[par];
132  }
133 
134  // Build Image
135  m_image.setsize(m_binning->m_parBins, BinEntry());
136  ATH_MSG_INFO("Final Image Size: " << m_image.size());
137  // make sure image is starts reset
138  // (reusing saves having to reallocate memory for each event)
140  {
141  bin.data().reset();
142  }
143 
144  // Compute which bins correspond to track parameters that are in the region
145  // i.e. the pT, eta, phi, z0 and d0 bounds
146  // list of valid bins is extracted from the layer map if its loaded
147  initValidBins();
148  if (m_lyrmapFile.size()==0)
149  {
151  } else {
153  }
154  printValidBin(); // also dumps firmware constants
155 
156  // register histograms
157  ATH_CHECK(m_monitoring->registerHistograms(m_nLayers, m_binning.get(), m_rin, m_rout));
158 
159  return StatusCode::SUCCESS;
160 }
161 
163 // Internal Storage Classes
164 
166 {
167  hitCnt = 0;
168  lyrhit = 0;
169  hits.clear();
170 }
171 
173 {
174  hitCnt++;
175  if (((lyrhit >> hit.layer) & 0x1) == 0x0)
176  {
177  lyrhit |= (0x1 << hit.layer);
178  }
179  hits.push_back(hit);
180 }
181 
183 // Main Algorithm
184 
185 StatusCode FPGATrackSimGenScanTool::getRoads(const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits,
186  std::vector<std::shared_ptr<const FPGATrackSimRoad>> &roads)
187 {
188  ATH_MSG_DEBUG("In getRoads, Processing Event# " << ++m_evtsProcessed << " hit size = " << hits.size());
189 
190  roads.clear();
191  m_roads.clear();
192  m_monitoring->resetDataFlowCounters();
193 
194  // Currently assume that if less than 100 hits its a single track MC
195  m_monitoring->parseTruthInfo(getTruthTracks(),(hits.size() < 100),m_validBin);
196 
197  // do the binning...
199 
200  // scan over image building pairs for bins over threshold
202  {
203  // apply threshold
204  if (bin.data().lyrCnt() < m_threshold) continue;
205  ATH_MSG_DEBUG("Bin passes threshold " << bin.data().lyrCnt() << " " << bin.idx());
206 
207  // Monitor contents of bins passing threshold
208  m_monitoring->fillBinLevelOutput(bin.idx(), bin.data());
209  if (m_binningOnly) continue;
210 
211  // pass hits for bin to filterRoad and get back pairs of hits grouped into pairsets
212  std::vector<HitPairSet> pairsets;
213  if (m_binFilter=="PairThenGroup") {
214  ATH_CHECK(pairThenGroupFilter(bin.data(), pairsets));
215  } else if (m_binFilter=="IncrementalBuild") {
216  ATH_CHECK(incrementalBuildFilter(bin.data(), pairsets));
217  } else {
218  ATH_MSG_FATAL("Unknown bin filter" << m_binFilter);
219  }
220  ATH_MSG_DEBUG("grouped PairSets " << pairsets.size());
221 
222  // convert the group pairsets to FPGATrackSimRoads
223  for (const FPGATrackSimGenScanTool::HitPairSet& pairset: pairsets)
224  {
225  addRoad(pairset.hitlist, bin.idx());
226  ATH_MSG_DEBUG("Output road size=" <<pairset.hitlist.size());
227 
228  // debug statement if more than one road found in bin
229  // not necessarily a problem
230  if (pairsets.size() >1) {
231  std::string s = "";
232  for (const FPGATrackSimGenScanTool::StoredHit* const hit : pairset.hitlist)
233  {
234  s += "(" + std::to_string(hit->layer) + "," + std::to_string(hit->hitptr->getR()) + "), ";
235  }
236  ATH_MSG_DEBUG("Duplicate Group " << s);
237  }
238  }
239  }
240 
241  // copy roads to output vector
242  roads.reserve(m_roads.size());
243  for (auto & r : m_roads) roads.push_back(std::move(r));
244  ATH_MSG_DEBUG("Roads = " << roads.size());
245  m_monitoring->fillOutputSummary(m_validSlice, m_validSliceAndScan);
246 
247  // clear previous event
248  // (reusing saves having to reallocate memory for each event)
250  {
251  bin.data().reset();
252  }
253 
254  m_evtsProcessed++;
255  return StatusCode::SUCCESS;
256 }
257 
258 // Put hits in all track parameter bins they could be a part of (binning is defined
259 // by m_binning object)
260 StatusCode FPGATrackSimGenScanTool::fillImage(const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits)
261 {
262  ATH_MSG_DEBUG("In fillImage");
263 
264  for (const std::shared_ptr<const FPGATrackSimHit>& hit : hits)
265  {
266  m_monitoring->fillHitLevelInput(hit.get());
267 
268  // The following code loops sequentially of the slice, then scan, then row parameters
269  // skipping invalid slices/scans/row/bins and adding hits if the hits are in the bin
270  // according to the m_binning class
271 
272  // this will contain current bin idx as it is built from slices and scans
274 
275  // iterate over slices
277  {
278  // if slice is not valid continue
279  if (!slicebin.data()) continue;
280 
281  // set the slice bins in the current bin idx object
282  m_binning->setIdxSubVec(idx, m_binning->slicePars(), slicebin.idx());
283 
284  // if hit is not in slice skip slice (contiue)
285  if (!m_binning->hitInSlice(idx, hit.get()))
286  {
287  m_monitoring->sliceCheck(slicebin.idx());
288  continue;
289  }
290 
291  m_monitoring->incrementInputPerSlice(slicebin.idx());
292 
293  // iterate over scan bins
295 
296  // if scan bin is not valid continue
297  if (!scanbin.data()) continue; // scan bin not valid
298 
299  // set the scan bins in the current bin idx object
300  m_binning->setIdxSubVec(idx, m_binning->scanPars(), scanbin.idx());
301 
302  // Find the min/max bins for hit in the row
303  std::pair<unsigned, unsigned> rowRange = m_binning->idxsetToRowParBinRange(idx, hit.get());
304 
305  // put hit in row bins according to row range
306  for (unsigned rowbin = rowRange.first; rowbin < rowRange.second; rowbin++)
307  {
308  idx[m_binning->rowParIdx()] = rowbin;
309 
310  // if full bin is not valid continue
311  if (!m_validBin[idx]) continue;
312 
313  // make a stored hit and fill it with the eta/phishifts as
314  // speficied by the Binning class
315  StoredHit s_hit;
316  s_hit.hitptr = hit;
317  s_hit.layer = hit->getLayer();
318  s_hit.phiShift = m_binning->phiShift(idx, hit.get());
319  s_hit.etaShift = m_binning->etaShift(idx, hit.get());
320 
321  // replace the hit layer with the layer map and only add if its in the map
322  if (m_mod_to_lyr_map.size() != 0) {
323  if (m_mod_to_lyr_map[idx].contains(hit->getIdentifierHash())) {
324  s_hit.layer = m_mod_to_lyr_map[idx][hit->getIdentifierHash()];
325  m_image[idx].addHit(s_hit);
326  } else {
327  if (m_monitoring->isTruthBin(idx))
328  ATH_MSG_DEBUG("Hit missed layer map bin=" << idx << " hash=" << hit->getIdentifierHash());
329  }
330  } else {
331  // add hit to the BinEntry for the bin
332  m_image[idx].addHit(std::move(s_hit));
333  }
334 
335  }
336  }
337  }
338  }
339 
340 
341  m_monitoring->fillInputSummary(hits, m_validSlice, m_validSliceAndScan);
342 
343  return StatusCode::SUCCESS;
344 }
345 
346 // Filter the bins above threshold into pairsets which output roads
348  std::vector<HitPairSet> &output_pairsets)
349 {
350  ATH_MSG_VERBOSE("In pairThenGroupFilter");
351 
352  // Organize Hits by Layer
353  std::vector<std::vector<const StoredHit *>> hitsByLayer(m_nLayers);
354  ATH_CHECK(sortHitsByLayer(bindata, hitsByLayer));
355 
356  // This is monitoring for each bin over threshold
357  // It's here so it can get the hitsByLayer
358  m_monitoring->fillHitsByLayer(hitsByLayer);
359 
360  // Make Pairs
362  ATH_CHECK(makePairs(hitsByLayer, pairs));
363 
364  // Filter Pairs
365  HitPairSet filteredpairs;
366  ATH_CHECK(filterPairs(pairs, filteredpairs));
367 
368  // Require road is still over threshold
369  bool passedPairFilter = (filteredpairs.lyrCnt() >= m_threshold);
370  m_monitoring->pairFilterCheck(pairs, filteredpairs, passedPairFilter);
371 
372  // if passed Pair Filter proceed to group the filtered pairs into pairsets
373  if (passedPairFilter)
374  {
375  // Pair Set Grouping
376  std::vector<HitPairSet> pairsets;
377  ATH_CHECK(groupPairs(filteredpairs, pairsets, false));
378 
379  // loop over pairsets and find those that are over thresold
380  for (const FPGATrackSimGenScanTool::HitPairSet& pairset : pairsets)
381  {
382  // if over threshold add it to the output
383  if (pairset.lyrCnt() >= m_threshold)
384  {
385  if (m_applyPairSetFilter) {
386  output_pairsets.push_back(pairset);
387  }
388  }
389  }
390  }
391 
392  // set outputs if not all filters applied
393  if (!m_applyPairFilter) {
394  // output is just the filtered pairs
395  output_pairsets.push_back(pairs);
396  }
397  else if (passedPairFilter && !m_applyPairSetFilter)
398  {
399  // output is just the filtered pairs
400  output_pairsets.push_back(filteredpairs);
401  }
402 
403  return StatusCode::SUCCESS;
404 }
405 
406 
408  IntermediateState &outputstate,
409  unsigned lyridx,
410  const std::vector<const StoredHit *>& newhits)
411 {
412  unsigned int allowed_missed_hits = m_nLayers - m_threshold;
413 
414  std::vector<bool> pairset_used(inputstate.pairsets.size(),false);
415 
416  for (auto &newhit : newhits) {
417 
418  // don't make new pairs with hits that the new hit is already paired with in a group
419  std::set<const StoredHit *> vetoList;
420 
421  // try adding hit to existing pair sets
422  for (auto &pairset : inputstate.pairsets) {
423  HitPair nextpair(pairset.lastpair().second, newhit, m_reversePairDir);
424  if (pairMatchesPairSet(pairset, nextpair, false) || (m_applyPairSetFilter==false)) {
425  HitPairSet newset(pairset);
426  newset.addPair(nextpair);
427  outputstate.pairsets.push_back(newset);
428  // put inpair hits in list of hits not to pair again with the new hits
429  for (auto vetohit : pairset.hitlist) {
430  vetoList.insert(vetohit);
431  }
432  }
433  }
434 
435  // make new pairsets with unpaired hits
436  for (auto prevhit : inputstate.unpairedHits) {
437  if (vetoList.count(prevhit) == 0) {
438  HitPair newpair(prevhit, newhit, m_reversePairDir);
439  if (pairPassesFilter(newpair) || (m_applyPairFilter == false)) {
440  HitPairSet newset;
441  newset.addPair(newpair);
442  outputstate.pairsets.push_back(newset);
443  }
444  }
445  }
446 
447  // if this can be the start of a the start of a track and still
448  // have enough hits to make a track, add it to the unpaired hits list
449  if (lyridx <= allowed_missed_hits) {
450  outputstate.unpairedHits.push_back(newhit);
451  }
452  }
453 
454  // Add groups to output without new hit if they have enough hits to skip
455  // this layer. Note expected hits at this point is lyridx+1, since we start
456  // counting lyridx from zero. Logic is then keep the pairset if
457  // expected hits <= hits in set + allows misses
458  for (auto &pairset : inputstate.pairsets) {
459  if (lyridx < (pairset.hitlist.size() + allowed_missed_hits)) {
460  outputstate.pairsets.push_back(pairset);
461  }
462  }
463 
464  // Add hits to unpaired list if hits are still allowed to start a track
465  // ---------------------------------------------------------------------
466  // If you start a new track with a pair whose second element is
467  // layer N (layer numbering starting from zero), then you'll have missed N-1
468  // layers Minus 1 because the first hit was one of the N layers already
469  // passed.
470  //
471  // The next pass will be layer N=lyridx+1 where lyridx is the current value
472  // at this point in the code. You will have then missed lyridx layers, so...
473  // E.g. if you allow one missed layer then this stops putting hits in the
474  // unpairedHits list if lyridx>1, so tracks must start with layer 0 or 1,
475  // which makes sense
476  if (lyridx > allowed_missed_hits) {
477  // make no new track starts
478  outputstate.unpairedHits.clear();
479  } else {
480  // copy in any previous unpairedHits as well
481  for (auto prevhit : inputstate.unpairedHits) {
482  outputstate.unpairedHits.push_back(prevhit);
483  }
484  }
485 }
486 
487 // Filter the bins above threshold into pairsets which output roads
489  std::vector<HitPairSet> &output_pairsets)
490 {
491  ATH_MSG_VERBOSE("In buildGroupsWithPairs");
492 
493  // Organize Hits by Layer
494  std::vector<std::vector<const StoredHit *>> hitsByLayer(m_nLayers);
495  ATH_CHECK(sortHitsByLayer(bindata, hitsByLayer));
496 
497  // This is monitoring for each bin over threshold
498  // It's here so it can get the hitsByLayer
499  m_monitoring->fillHitsByLayer(hitsByLayer);
500 
501  std::vector<IntermediateState> states{m_nLayers+1};
502  for (unsigned lyridx = 0; lyridx < m_nLayers; lyridx++) {
503  unsigned lyr = m_pairingLayers[lyridx];
504  updateState(states[lyridx] , states[lyridx+1], lyridx, hitsByLayer[lyr]);
505  }
506 
507  // this is a little ugly because it requires copying the output pairsets right now
508  output_pairsets=states[m_nLayers].pairsets;
509 
510  m_monitoring->fillBuildGroupsWithPairs(states,m_nLayers-m_threshold);
511 
512  return StatusCode::SUCCESS;
513 }
514 
515 
516 // 1st step of filter: sort hits by layer
518  std::vector<std::vector<const StoredHit *>>& hitsByLayer)
519 {
520  ATH_MSG_VERBOSE("In fillHitsByLayer");
521 
522  for (const FPGATrackSimGenScanTool::StoredHit& hit : bindata.hits)
523  {
524  hitsByLayer[hit.layer].push_back(&hit);
525  }
526 
527  return StatusCode::SUCCESS;
528 }
529 
530 
531 
532 
533 
534 // 2nd step of filter: make pairs of hits from adjacent and next-to-adjacent layers
535 StatusCode FPGATrackSimGenScanTool::makePairs(const std::vector<std::vector<const StoredHit *>>& hitsByLayer,
536  HitPairSet &pairs)
537 {
538  ATH_MSG_VERBOSE("In makePairs");
539 
540  std::vector<const FPGATrackSimGenScanTool::StoredHit *> const * lastlyr = 0;
541  std::vector<const FPGATrackSimGenScanTool::StoredHit *> const * lastlastlyr = 0;
542 
543  // order here is designed so lower radius hits come first
544  for (unsigned lyr : m_pairingLayers) {
545  for (const FPGATrackSimGenScanTool::StoredHit *const &ptr1 :
546  hitsByLayer[lyr]) {
547  if (lastlyr) {
548  for (const FPGATrackSimGenScanTool::StoredHit *const &ptr2 : *lastlyr) {
549  pairs.addPair(HitPair(ptr2, ptr1,m_reversePairDir));
550  }
551  // Add Pairs that skip one layer
552  if (lastlastlyr) {
553  for (const FPGATrackSimGenScanTool::StoredHit *const &ptr2 : *lastlastlyr) {
554  pairs.addPair(HitPair(ptr2, ptr1,m_reversePairDir));
555  }
556  }
557  }
558  }
559  lastlastlyr = lastlyr;
560  lastlyr = &hitsByLayer[lyr];
561  m_monitoring->fillPairingHits(lastlyr,lastlastlyr);
562  }
563 
564  return StatusCode::SUCCESS;
565 }
566 
567 // 3rd step of filter: make cuts on the pairs to ensure that are consisten with
568 // the bin they are in
569 
571  m_monitoring->fillPairFilterCuts(pair);
572  int lyr = std::min(pair.first->layer,pair.second->layer);
573  return (std::abs(pair.dPhi()) < m_pairFilterDeltaPhiCut[lyr]) &&
574  (std::abs(pair.dEta()) < m_pairFilterDeltaEtaCut[lyr]) &&
575  (std::abs(pair.PhiInExtrap(m_rin)) < m_pairFilterPhiExtrapCut[0]) &&
576  (std::abs(pair.PhiOutExtrap(m_rout)) < m_pairFilterPhiExtrapCut[1]) &&
577  (std::abs(pair.EtaInExtrap(m_rin)) < m_pairFilterEtaExtrapCut[0]) &&
578  (std::abs(pair.EtaOutExtrap(m_rout)) < m_pairFilterEtaExtrapCut[1]);
579 }
580 
582 {
583  ATH_MSG_VERBOSE("In filterPairs");
584 
585  for (const FPGATrackSimGenScanTool::HitPair &pair : pairs.pairList) {
586  if (pairPassesFilter(pair)) {
587  filteredpairs.addPair(pair);
588  }
589  }
590  return StatusCode::SUCCESS;
591 }
592 
593 
594 // 4th step of filter: group pairs into sets where they are all consistent with being from the same track
596  std::vector<HitPairSet> &pairsets,
597  bool verbose)
598 {
599  ATH_MSG_VERBOSE("In groupPairs");
600  for (const FPGATrackSimGenScanTool::HitPair & pair : filteredpairs.pairList)
601  {
602  bool added = false;
603  for (FPGATrackSimGenScanTool::HitPairSet &pairset : pairsets)
604  {
605  // Only add skip pairs if skipped layer is not already hit
606  if ((std::abs(pair.second->layer - pair.first->layer) > 1) // gives if is a skip pair
607  && (pairset.hasLayer(std::min(pair.first->layer,pair.second->layer) + 1))) // gives true if skipped layer already in set
608  {
609  // if it matches mark as added so it doesn't start a new pairset
610  // false here is so it doesn't plot these either
611  if (pairMatchesPairSet(pairset, pair, verbose))
612  added = true;
613  if (!added) {
614  ATH_MSG_VERBOSE("Skip pair does not match non-skip pair");
615  }
616  }
617  else
618  {
619  if (pairMatchesPairSet(pairset, pair, verbose))
620  {
621  int size = pairset.addPair(pair);
622  if (verbose)
623  ATH_MSG_VERBOSE("addPair " << pairsets.size() << " " << pairset.pairList.size() << " " << size);
624  added = true;
625  }
626  }
627 
628  }
629 
630  if (!added)
631  {
632  HitPairSet newpairset;
633  newpairset.addPair(pair);
634  pairsets.push_back(newpairset);
635  }
636  }
637 
638  return StatusCode::SUCCESS;
639 
640 }
641 
642 // used to determine if a pair is consistend with a pairset
644  const HitPair &pair,
645  bool verbose) {
646  // In order to make it easy to have a long list of possible cuts,
647  // a vector of cutvar structs is used to represent each cut
648  // then apply the AND of all the cuts is done with a std::count_if function
649 
650  // define the struct (effectively mapping because variable, configured cut value,
651  // and histograms for plotting
652  struct cutvar {
653  cutvar(std::string name, double val, double cut, std::vector<TH1D *>& histset) :
654  m_name(std::move(name)), m_val(val), m_cut(cut), m_histset(histset) {}
655  bool passed() { return std::abs(m_val) < m_cut; }
656  void fill(unsigned cat) { m_histset[cat]->Fill(m_val); }
657  std::string m_name;
658  double m_val;
659  double m_cut;
660  std::vector<TH1D *> &m_histset;
661  };
662 
663  // add the cuts to the list of all cuts
664  std::vector<cutvar> allcuts;
665  allcuts.push_back(cutvar("MatchPhi", pairset.MatchPhi(pair),
667  m_monitoring->m_pairSetMatchPhi));
668  allcuts.push_back(cutvar("MatchEta", pairset.MatchEta(pair),
670  m_monitoring->m_pairSetMatchEta));
671  allcuts.push_back(cutvar("DeltaDeltaPhi", pairset.DeltaDeltaPhi(pair),
673  m_monitoring->m_deltaDeltaPhi));
674  allcuts.push_back(cutvar("DeltaDeltaEta", pairset.DeltaDeltaEta(pair),
676  m_monitoring->m_deltaDeltaEta));
677  allcuts.push_back(cutvar("PhiCurvature", pairset.PhiCurvature(pair),
679  m_monitoring->m_phiCurvature));
680  allcuts.push_back(cutvar("EtaCurvature", pairset.EtaCurvature(pair),
682  m_monitoring->m_etaCurvature));
683  if (pairset.pairList.size() > 1) {
684  allcuts.push_back(cutvar(
685  "DeltaPhiCurvature", pairset.DeltaPhiCurvature(pair),
686  m_pairSetDeltaPhiCurvatureCut, m_monitoring->m_deltaPhiCurvature));
687  allcuts.push_back(cutvar(
688  "DeltaEtaCurvature", pairset.DeltaEtaCurvature(pair),
689  m_pairSetDeltaEtaCurvatureCut, m_monitoring->m_deltaEtaCurvature));
690  }
691  allcuts.push_back(cutvar(
692  "PhiInExtrapCurved", pairset.PhiInExtrapCurved(pair, m_rin),
693  m_pairSetPhiExtrapCurvedCut[0], m_monitoring->m_phiInExtrapCurved));
694  allcuts.push_back(cutvar(
695  "PhiOutExtrapCurved", pairset.PhiOutExtrapCurved(pair, m_rout),
696  m_pairSetPhiExtrapCurvedCut[1], m_monitoring->m_phiOutExtrapCurved));
697 
698  // count number of cuts passed
699  unsigned passedCuts = std::count_if(allcuts.begin(), allcuts.end(),
700  [](cutvar& cut) { return cut.passed(); });
701  bool passedAll = (passedCuts == allcuts.size());
702 
703  // monitoring
704  bool passedAllButOne = (passedCuts == allcuts.size() - 1);
705  for (cutvar& cut: allcuts) {
706  // the last value computes if an n-1 histogram should be filled
707  m_monitoring->fillPairSetFilterCut(cut.m_histset, cut.m_val, pair,
708  pairset.lastpair(),
709  (passedAll || (passedAllButOne && !cut.passed())));
710  }
711 
712  if (verbose)
713  {
714  std::string s = "";
715  for (cutvar &cut : allcuts)
716  {
717  s += cut.m_name + " : (" + cut.passed() + ", " + cut.m_val + "), ";
718  }
719  ATH_MSG_DEBUG("PairSet test " << passedAll << " " << s);
720  ATH_MSG_DEBUG("Hits: \n " << *pairset.lastpair().first << "\n "
721  << *pairset.lastpair().second << "\n "
722  << *pair.first << "\n "
723  << *pair.second);
724  }
725 
726  return passedAll;
727 }
728 
729 // format final pairsets into expected output of getRoads
730 void FPGATrackSimGenScanTool::addRoad(std::vector<const StoredHit *> const &hits, const FPGATrackSimGenScanBinningBase::IdxSet &idx)
731 {
732  layer_bitmask_t hitLayers = 0;
733  std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>
734  sorted_hits(m_nLayers,std::vector<std::shared_ptr<const FPGATrackSimHit>>());
735  for (const FPGATrackSimGenScanTool::StoredHit* hit : hits)
736  {
737  hitLayers |= 1 << hit->layer;
738  sorted_hits[hit->layer].push_back(hit->hitptr);
739  }
740 
741  m_roads.emplace_back(std::make_unique<FPGATrackSimRoad>());
742  FPGATrackSimRoad *r = m_roads.back().get();
743 
744  r->setRoadID(m_roads.size() - 1);
745  // r.setPID(y * m_imageSize_y + x);
746  r->setHits(std::move(sorted_hits));
747 
748  FPGATrackSimTrackPars trackpars = m_binning->parSetToTrackPars(m_binning->binCenter(idx));
749  r->setX(trackpars[FPGATrackSimTrackPars::IPHI]);
750  r->setY(trackpars[FPGATrackSimTrackPars::IHIP]);
751  r->setXBin(idx[3]);
752  r->setYBin(idx[4]);
753  r->setHitLayers(hitLayers);
754  r->setSubRegion(0);
755 }
756 
757 
759 // HitPair and HitPairSet Storage
760 
762 {for (const FPGATrackSimGenScanTool::StoredHit* hit : hitlist)
763  {
764  if (hit == newhit)
765  return true;
766  }
767  return false;
768 }
769 
771 {
772  if (pairList.size() > 0)
773  {
774  // these need to be done before the pair is added
775  LastPhiCurvature = PhiCurvature(pair);
776  LastEtaCurvature = EtaCurvature(pair);
777  }
778 
779  pairList.push_back(pair);
780 
781  hitLayers |= (0x1 << pair.first->layer);
782  hitLayers |= (0x1 << pair.second->layer);
783  if (!hasHit(pair.first))
784  hitlist.push_back(pair.first);
785  if (!hasHit(pair.second))
786  hitlist.push_back(pair.second);
787  return this->pairList.size();
788 }
789 
790 
792 {
793  if ((lastpair().first->hitptr==pair.first->hitptr)||
794  (lastpair().first->hitptr==pair.second->hitptr)||
795  (lastpair().second->hitptr==pair.first->hitptr)||
796  (lastpair().second->hitptr==pair.second->hitptr))
797  return 0.0;
798 
799  double dr = (lastpair().second->hitptr->getR() - pair.first->hitptr->getR()) / 2.0;
800  double lastpairextrap = lastpair().second->phiShift - lastpair().dPhi() / lastpair().dR() * dr;
801  double newpairextrap = pair.first->phiShift + pair.dPhi() / pair.dR() * dr;
802  return lastpairextrap - newpairextrap;
803 }
804 
806 {
807  if ((lastpair().first->hitptr==pair.first->hitptr)||
808  (lastpair().first->hitptr==pair.second->hitptr)||
809  (lastpair().second->hitptr==pair.first->hitptr)||
810  (lastpair().second->hitptr==pair.second->hitptr))
811  return 0.0;
812 
813  double dr = (lastpair().second->hitptr->getR() - pair.first->hitptr->getR()) / 2.0;
814  double lastpairextrap = lastpair().second->etaShift - lastpair().dEta() / lastpair().dR() * dr;
815  double newpairextrap = pair.first->etaShift + pair.dEta() / pair.dR() * dr;
816  return lastpairextrap - newpairextrap;
817 }
818 
819 double
821  return (pair.dPhi() * lastpair().dR() - lastpair().dPhi() * pair.dR()) / (lastpair().dR() * pair.dR());
822 }
823 
825 {
826  return (pair.dEta() * lastpair().dR() - lastpair().dEta() * pair.dR()) / (lastpair().dR() * pair.dR());
827 }
828 
830 {
831  return 2 * DeltaDeltaPhi(pair) / (lastpair().dR() + pair.dR());
832 }
834 {
835  return 2 * DeltaDeltaEta(pair) / (lastpair().dR() + pair.dR());
836 }
838 {
839  return PhiCurvature(pair) - LastPhiCurvature;
840 }
842 {
843  return EtaCurvature(pair) - LastEtaCurvature;
844 }
846 {
847  double r = std::min(lastpair().first->hitptr->getR(),lastpair().second->hitptr->getR());
848  return lastpair().PhiInExtrap(r_in) + 0.5 * PhiCurvature(pair) * (r_in - r) * (r_in - r);
849 }
851 {
852  double r = std::max(lastpair().first->hitptr->getR(),lastpair().second->hitptr->getR());
853  return pair.PhiOutExtrap(r_out) + 0.5 * PhiCurvature(pair) * (r_out - r) * (r_out - r);
854 }
855 
856 void FPGATrackSimGenScanTool::setValidBin(std::vector<unsigned> idx) {
857  m_validBin[idx] = true;
858  m_validSlice[m_binning->sliceIdx(idx)] = true;
859  m_validScan[m_binning->scanIdx(idx)] = true;
860  m_validSliceAndScan[m_binning->sliceAndScanIdx(idx)] = true;
861 }
862 
864  m_validBin.setsize(m_binning->m_parBins,false);
865  m_validSlice.setsize(m_binning->sliceBins(),false);
866  m_validScan.setsize(m_binning->scanBins(),false);
867  m_validSliceAndScan.setsize(m_binning->sliceAndScanBins(),false);
868 }
869 
870 
871 
872 // Compute which bins correspond to track parameters that are in the region
873 // i.e. the pT, eta, phi, z0 and d0 bounds
875  // determine which bins are valid
876 
877  FPGATrackSimTrackPars min_padded;
878  FPGATrackSimTrackPars max_padded;
885  for (unsigned par = 0; par < FPGATrackSimTrackPars::NPARS; par++)
886  {
887  min_padded[par] = m_EvtSel->getMin()[par] - padding[par] * (m_EvtSel->getMax()[par]-m_EvtSel->getMin()[par]);
888  max_padded[par] = m_EvtSel->getMax()[par] + padding[par] * (m_EvtSel->getMax()[par]-m_EvtSel->getMin()[par]);
890  // working in units of GeV internally
891  min_padded[par] *= 1000;
892  max_padded[par] *= 1000;
893  }
894  ATH_MSG_INFO("Padded Parameter Range: " << FPGATrackSimTrackPars::parName(par)
895  << " min=" << min_padded[par] << " max=" << max_padded[par]);
896  }
897 
898 
900  {
901  // this finds the parameters at all 2^5 corners of the bin and then finds the min and max of those
902  std::vector<FPGATrackSimGenScanBinningBase::ParSet> parsets = m_binning->makeVariationSet(std::vector<unsigned>({0,1,2,3,4}),bin.idx());
903  FPGATrackSimTrackPars minvals = m_binning->parSetToTrackPars(m_binning->binCenter(bin.idx()));
904  FPGATrackSimTrackPars maxvals = m_binning->parSetToTrackPars(m_binning->binCenter(bin.idx()));
905  for (FPGATrackSimGenScanBinningBase::ParSet & parset : parsets) {
906  FPGATrackSimTrackPars trackpars = m_binning->parSetToTrackPars(parset);
907  for (unsigned par =0; par < FPGATrackSimTrackPars::NPARS; par++) {
908  minvals[par] = std::min(minvals[par],trackpars[par]);
909  maxvals[par] = std::max(maxvals[par],trackpars[par]);
910  }
911  }
912 
913  // make sure bin overlaps with active region
914  bool inRange = true;
915  for (unsigned par =0; par < FPGATrackSimTrackPars::NPARS; par++) {
916  inRange = inRange && (minvals[par] < max_padded[par]) && (maxvals[par] > min_padded[par]);
917  }
918  if (inRange)
919  {
920  setValidBin(bin.idx());
921  }
922 
923  if (bin.data() == false)
924  {
925  ATH_MSG_VERBOSE("Invalid bin: " << bin.idx() << " :" << m_binning->parSetToTrackPars(m_binning->binCenter(bin.idx()))
926  << " minvals: " << minvals << " maxvals: " << maxvals );
927  }
928  }
929 }
930 
931 
932 
933 
935  std::ifstream f(filename);
937 
939  std::vector <std::set<unsigned> >(5,std::set<unsigned>()));
941  std::map <unsigned,unsigned>());
942 
943  for (auto &binelem : data) {
944  std::vector<unsigned> bin;
945  binelem.at("bin").get_to(bin);
946  auto& lyrmap = binelem["lyrmap"];
947  ATH_MSG_DEBUG("bin = " << bin);
948  ATH_MSG_DEBUG("lyrmap = " << lyrmap);
949  for (auto &lyrelem : lyrmap) {
950  unsigned lyr;
951  lyrelem.at("lyr").get_to(lyr);
952  lyrelem.at("mods").get_to(m_lyr_to_mod_map[bin][lyr]);
953  ATH_MSG_DEBUG("lyr = " << lyr);
954  ATH_MSG_DEBUG("mods = " << m_lyr_to_mod_map[bin][lyr]);
955  for (auto &mod : m_lyr_to_mod_map[bin][lyr]) {
956  m_mod_to_lyr_map[bin][mod]=lyr;
957  }
958  // set valid bins
959  setValidBin(bin);
960  }
961  }
962 }
963 
965  // count valid bins
966  int validBins = 0;
968  if (bin.data())
969  validBins++;
970  }
971 
972  int validSlices = 0;
974  if (bin.data())
975  validSlices++;
976  }
977 
978  int validScans = 0;
980  if (bin.data())
981  validScans++;
982  }
983 
984  // Dump FW constants
985  m_binning->writeScanConsts(m_validScan);
986  m_binning->writeSliceConsts(m_validSlice);
987 
988  ATH_MSG_INFO("Valid Bins: " << validBins << " valid slices: " << validSlices
989  << " valid scans: " << validScans);
990 }
FPGATrackSimGenScanTool::BinEntry::lyrhit
layer_bitmask_t lyrhit
Definition: FPGATrackSimGenScanTool.h:220
FPGATrackSimGenScanTool::m_pairFilterEtaExtrapCut
Gaudi::Property< std::vector< double > > m_pairFilterEtaExtrapCut
Definition: FPGATrackSimGenScanTool.h:132
FPGATrackSimGenScanTool::m_parMin
Gaudi::Property< std::vector< float > > m_parMin
Definition: FPGATrackSimGenScanTool.h:105
FPGATrackSimGenScanTool::IntermediateState::unpairedHits
std::vector< const StoredHit * > unpairedHits
Definition: FPGATrackSimGenScanTool.h:308
FPGATrackSimGenScanTool::m_mod_to_lyr_map
FPGATrackSimGenScanArray< std::map< unsigned, unsigned > > m_mod_to_lyr_map
Definition: FPGATrackSimGenScanTool.h:333
FPGATrackSimTrackPars::IHIP
@ IHIP
Definition: FPGATrackSimTrackPars.h:49
beamspotman.r
def r
Definition: beamspotman.py:676
FPGATrackSimGenScanArray::dims
const std::vector< unsigned int > & dims() const
Definition: FPGATrackSimGenScanArray.h:78
FPGATrackSimGenScanArray
Definition: FPGATrackSimGenScanArray.h:41
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
FPGATrackSimGenScanTool::pairMatchesPairSet
bool pairMatchesPairSet(const HitPairSet &pairset, const HitPair &pair, bool verbose)
Definition: FPGATrackSimGenScanTool.cxx:643
FPGATrackSimTrackPars::ID0
@ ID0
Definition: FPGATrackSimTrackPars.h:49
FPGATrackSimGenScanBinningBase::IdxSet
Definition: FPGATrackSimGenScanBinning.h:111
FPGATrackSimGenScanTool::m_pairSetPhiCurvatureCut
Gaudi::Property< double > m_pairSetPhiCurvatureCut
Definition: FPGATrackSimGenScanTool.h:139
getMenu.algname
algname
Definition: getMenu.py:54
FPGATrackSimGenScanTool::HitPair::PhiInExtrap
double PhiInExtrap(double r_in) const
Definition: FPGATrackSimGenScanTool.h:246
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
FPGATrackSimGenScanTool::initialize
virtual StatusCode initialize() override
Definition: FPGATrackSimGenScanTool.cxx:67
TRTCalib_Extractor.hits
hits
Definition: TRTCalib_Extractor.py:35
FPGATrackSimGenScanTool::filterPairs
StatusCode filterPairs(HitPairSet &pairs, HitPairSet &filteredpairs)
Definition: FPGATrackSimGenScanTool.cxx:581
TrigCompositeUtils::passed
bool passed(DecisionID id, const DecisionIDContainer &idSet)
checks if required decision ID is in the set of IDs in the container
Definition: TrigCompositeUtilsRoot.cxx:117
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
FPGATrackSimGenScanTool::m_binFilter
Gaudi::Property< std::string > m_binFilter
Definition: FPGATrackSimGenScanTool.h:124
FPGATrackSimGenScanTool::updateState
void updateState(const IntermediateState &inputstate, IntermediateState &outputstate, unsigned lyridx, const std::vector< const StoredHit * > &newhits)
Definition: FPGATrackSimGenScanTool.cxx:407
FPGATrackSimGenScanTool.h
Implements a generalized 5d scan which filters pair of hits in bins linearized about nominal trajecto...
AthMsgStreamMacros.h
FPGATrackSimGenScanTool::m_rin
Gaudi::Property< double > m_rin
Definition: FPGATrackSimGenScanTool.h:109
json
nlohmann::json json
Definition: HistogramDef.cxx:9
FPGATrackSimGenScanTool::addRoad
void addRoad(std::vector< const StoredHit * > const &hits, const FPGATrackSimGenScanBinningBase::IdxSet &idx)
Definition: FPGATrackSimGenScanTool.cxx:730
FPGATrackSimPlaneMap.h
Maps physical layers to logical layers.
FPGATrackSimTrackPars
Definition: FPGATrackSimTrackPars.h:22
FPGATrackSimGenScanTool::initValidBins
void initValidBins()
Definition: FPGATrackSimGenScanTool.cxx:863
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
FPGATrackSimTrackPars::IZ0
@ IZ0
Definition: FPGATrackSimTrackPars.h:49
IFPGATrackSimMappingSvc.h
FPGATrackSimGenScanTool::fillImage
StatusCode fillImage(const std::vector< std::shared_ptr< const FPGATrackSimHit >> &hits)
Definition: FPGATrackSimGenScanTool.cxx:260
parse
std::map< std::string, std::string > parse(const std::string &list)
Definition: egammaLayerRecalibTool.cxx:1082
FPGATrackSimGenScanBinningBase::ParSet
Definition: FPGATrackSimGenScanBinning.h:101
FPGATrackSimGenScanTool::StoredHit
Definition: FPGATrackSimGenScanTool.h:203
FPGATrackSimGenScanTool::HitPairSet::PhiOutExtrapCurved
double PhiOutExtrapCurved(const HitPair &pair, double r_out) const
Definition: FPGATrackSimGenScanTool.cxx:850
FPGATrackSimGenScanTool::BinEntry::addHit
void addHit(StoredHit hit)
Definition: FPGATrackSimGenScanTool.cxx:172
FPGATrackSimGenScanMonitoring.h
This is the monitoring for the FPGATrackSimGenScanTool.
FPGATrackSimGenScanArray::size
unsigned int size() const
Definition: FPGATrackSimGenScanArray.h:69
FPGATrackSimGenScanTool::m_z0FractionalPadding
Gaudi::Property< double > m_z0FractionalPadding
Definition: FPGATrackSimGenScanTool.h:115
FPGATrackSimGenScanTool::makePairs
StatusCode makePairs(const std::vector< std::vector< const StoredHit * >> &hitsByLayer, HitPairSet &pairs)
Definition: FPGATrackSimGenScanTool.cxx:535
FPGATrackSimGenScanTool::FPGATrackSimGenScanTool
FPGATrackSimGenScanTool(const std::string &, const std::string &, const IInterface *)
Definition: FPGATrackSimGenScanTool.cxx:60
bin
Definition: BinsDiffFromStripMedian.h:43
FPGATrackSimGenScanTool::HitPairSet::MatchEta
double MatchEta(const HitPair &pair) const
Definition: FPGATrackSimGenScanTool.cxx:805
FPGATrackSimGenScanTool::setValidBin
void setValidBin(std::vector< unsigned > idx)
Definition: FPGATrackSimGenScanTool.cxx:856
FPGATrackSimGenScanTool::sortHitsByLayer
StatusCode sortHitsByLayer(const BinEntry &bindata, std::vector< std::vector< const StoredHit * >> &hitsByLayer)
Definition: FPGATrackSimGenScanTool.cxx:517
FPGATrackSimGenScanTool::StoredHit::etaShift
double etaShift
Definition: FPGATrackSimGenScanTool.h:206
FPGATrackSimGenScanTool::HitPairSet::DeltaDeltaPhi
double DeltaDeltaPhi(const HitPair &pair) const
Definition: FPGATrackSimGenScanTool.cxx:820
FPGATrackSimGenScanTool::HitPair::EtaOutExtrap
double EtaOutExtrap(double r_out) const
Definition: FPGATrackSimGenScanTool.h:249
FPGATrackSimGenScanTool::m_image
FPGATrackSimGenScanArray< BinEntry > m_image
Definition: FPGATrackSimGenScanTool.h:322
python.TurnDataReader.dr
dr
Definition: TurnDataReader.py:112
FPGATrackSimGenScanTool::m_qOverPtFractionalPadding
Gaudi::Property< double > m_qOverPtFractionalPadding
Definition: FPGATrackSimGenScanTool.h:118
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
m_name
std::string m_name
Definition: ColumnarPhysliteTest.cxx:53
FPGATrackSimGenScanTool::m_evtsProcessed
int m_evtsProcessed
Definition: FPGATrackSimGenScanTool.h:314
FPGATrackSimGenScanTool::HitPairSet::hasHit
bool hasHit(const StoredHit *hit) const
Definition: FPGATrackSimGenScanTool.cxx:761
FPGATrackSimGenScanTool::IntermediateState
Definition: FPGATrackSimGenScanTool.h:307
dqutils::padding
std::atomic< int > padding
Definition: MonitoringFile_MoveVertexMonitoring.cxx:20
FPGATrackSimGenScanTool::m_EvtSel
ServiceHandle< IFPGATrackSimEventSelectionSvc > m_EvtSel
Definition: FPGATrackSimGenScanTool.h:96
FPGATrackSimGenScanTool::StoredHit::layer
int layer
Definition: FPGATrackSimGenScanTool.h:207
DeMoUpdate.reverse
reverse
Definition: DeMoUpdate.py:563
python.CreateTierZeroArgdict.pairs
pairs
Definition: CreateTierZeroArgdict.py:201
FPGATrackSimGenScanTool::HitPair::dR
double dR() const
Definition: FPGATrackSimGenScanTool.h:234
FPGATrackSimRegionMap.h
Maps ITK module indices to FPGATrackSim regions.
FPGATrackSimGenScanTool::m_pairFilterPhiExtrapCut
Gaudi::Property< std::vector< double > > m_pairFilterPhiExtrapCut
Definition: FPGATrackSimGenScanTool.h:131
FPGATrackSimGenScanTool::m_binning
ToolHandle< FPGATrackSimGenScanBinningBase > m_binning
Definition: FPGATrackSimGenScanTool.h:100
FPGATrackSimGenScanTool::getSubRegion
virtual int getSubRegion() const override
Definition: FPGATrackSimGenScanTool.h:88
FPGATrackSimGenScanTool::m_validScan
FPGATrackSimGenScanArray< int > m_validScan
Definition: FPGATrackSimGenScanTool.h:327
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
FPGATrackSimGenScanTool::IntermediateState::pairsets
std::vector< HitPairSet > pairsets
Definition: FPGATrackSimGenScanTool.h:309
FPGATrackSimGenScanBinningBase::NPars
static constexpr unsigned NPars
Definition: FPGATrackSimGenScanBinning.h:266
FPGATrackSimGenScanTool::m_parBins
Gaudi::Property< std::vector< unsigned > > m_parBins
Definition: FPGATrackSimGenScanTool.h:107
FPGATrackSimGenScanTool::m_pairSetDeltaDeltaEtaCut
Gaudi::Property< double > m_pairSetDeltaDeltaEtaCut
Definition: FPGATrackSimGenScanTool.h:138
FPGATrackSimGenScanTool::m_pairSetDeltaEtaCurvatureCut
Gaudi::Property< double > m_pairSetDeltaEtaCurvatureCut
Definition: FPGATrackSimGenScanTool.h:142
maskDeadModules.mod
mod
Definition: maskDeadModules.py:36
FPGATrackSimGenScanTool::m_FPGATrackSimBankSvc
ServiceHandle< IFPGATrackSimBankSvc > m_FPGATrackSimBankSvc
Definition: FPGATrackSimGenScanTool.h:97
FPGATrackSimGenScanTool::m_validSlice
FPGATrackSimGenScanArray< int > m_validSlice
Definition: FPGATrackSimGenScanTool.h:326
FPGATrackSimGenScanTool::HitPairSet::PhiCurvature
double PhiCurvature(const HitPair &pair) const
Definition: FPGATrackSimGenScanTool.cxx:829
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
FPGATrackSimGenScanTool::m_binningOnly
Gaudi::Property< bool > m_binningOnly
Definition: FPGATrackSimGenScanTool.h:126
urldecode::states
states
Definition: urldecode.h:39
TauGNNUtils::Variables::Track::dPhi
bool dPhi(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:548
FPGATrackSimGenScanTool::m_threshold
Gaudi::Property< unsigned > m_threshold
Definition: FPGATrackSimGenScanTool.h:122
contains
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition: hcg.cxx:111
operator<<
std::ostream & operator<<(std::ostream &os, const FPGATrackSimGenScanTool::StoredHit &hit)
Definition: FPGATrackSimGenScanTool.cxx:48
FPGATrackSimGenScanTool::HitPairSet
Definition: FPGATrackSimGenScanTool.h:262
BindingsTest.cut
cut
This script demonstrates how to call a C++ class from Python Also how to use PyROOT is shown.
Definition: BindingsTest.py:13
FPGATrackSimGenScanTool::HitPairSet::DeltaDeltaEta
double DeltaDeltaEta(const HitPair &pair) const
Definition: FPGATrackSimGenScanTool.cxx:824
FPGATrackSimGenScanTool::m_pairSetDeltaPhiCurvatureCut
Gaudi::Property< double > m_pairSetDeltaPhiCurvatureCut
Definition: FPGATrackSimGenScanTool.h:141
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
FPGATrackSimGenScanTool::m_pairSetEtaCurvatureCut
Gaudi::Property< double > m_pairSetEtaCurvatureCut
Definition: FPGATrackSimGenScanTool.h:140
hist_file_dump.f
f
Definition: hist_file_dump.py:141
FPGATrackSimGenScanTool::HitPairSet::DeltaPhiCurvature
double DeltaPhiCurvature(const HitPair &pair) const
Definition: FPGATrackSimGenScanTool.cxx:837
FPGATrackSimGenScanTool::m_d0FractionalPadding
Gaudi::Property< double > m_d0FractionalPadding
Definition: FPGATrackSimGenScanTool.h:114
FPGATrackSimGenScanTool::HitPairSet::addPair
int addPair(const HitPair &pair)
Definition: FPGATrackSimGenScanTool.cxx:770
FPGATrackSimGenScanTool::m_monitoring
ToolHandle< FPGATrackSimGenScanMonitoring > m_monitoring
Definition: FPGATrackSimGenScanTool.h:99
FPGATrackSimGenScanTool::BinEntry::hitCnt
unsigned int hitCnt
Definition: FPGATrackSimGenScanTool.h:219
ReadFromCoolCompare.os
os
Definition: ReadFromCoolCompare.py:231
inRange
bool inRange(const double *boundaries, const double value, const double tolerance=0.02)
Definition: LArSCIdVsIdTest.cxx:5
fill
void fill(H5::Group &out_file, size_t iterations)
Definition: test-hdf5-writer.cxx:95
FPGATrackSimGenScanTool::computeValidBins
void computeValidBins()
Definition: FPGATrackSimGenScanTool.cxx:874
FPGATrackSimGenScanTool::m_pairSetDeltaDeltaPhiCut
Gaudi::Property< double > m_pairSetDeltaDeltaPhiCut
Definition: FPGATrackSimGenScanTool.h:137
FPGATrackSimGenScanTool::pairPassesFilter
bool pairPassesFilter(const HitPair &pair)
Definition: FPGATrackSimGenScanTool.cxx:570
FPGATrackSimGenScanTool::BinEntry::reset
void reset()
Definition: FPGATrackSimGenScanTool.cxx:165
FPGATrackSimGenScanTool::getRoads
virtual StatusCode getRoads(const std::vector< std::shared_ptr< const FPGATrackSimHit >> &hits, std::vector< std::shared_ptr< const FPGATrackSimRoad >> &road) override
Definition: FPGATrackSimGenScanTool.cxx:185
FPGATrackSimGenScanTool::groupPairs
StatusCode groupPairs(HitPairSet &filteredpairs, std::vector< HitPairSet > &clusters, bool verbose)
Definition: FPGATrackSimGenScanTool.cxx:595
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
createCoolChannelIdFile.par
par
Definition: createCoolChannelIdFile.py:29
FPGATrackSimGenScanTool::m_roads
std::vector< std::unique_ptr< FPGATrackSimRoad > > m_roads
Definition: FPGATrackSimGenScanTool.h:336
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
FPGATrackSimGenScanTool::m_pairSetMatchPhiCut
Gaudi::Property< double > m_pairSetMatchPhiCut
Definition: FPGATrackSimGenScanTool.h:135
FPGATrackSimGenScanTool::HitPair::dPhi
double dPhi() const
Definition: FPGATrackSimGenScanTool.h:232
plotBeamSpotVxVal.bin
int bin
Definition: plotBeamSpotVxVal.py:83
FPGATrackSimHit.h
: FPGATrackSim-specific class to represent an hit in the detector.
FPGATrackSimGenScanTool::HitPairSet::DeltaEtaCurvature
double DeltaEtaCurvature(const HitPair &pair) const
Definition: FPGATrackSimGenScanTool.cxx:841
FPGATrackSimGenScanTool::readLayerMap
void readLayerMap(const std::string &filename)
Definition: FPGATrackSimGenScanTool.cxx:934
FPGATrackSimGenScanTool::m_lyrmapFile
Gaudi::Property< std::string > m_lyrmapFile
Definition: FPGATrackSimGenScanTool.h:112
FPGATrackSimGenScanTool::m_pairFilterDeltaEtaCut
Gaudi::Property< std::vector< double > > m_pairFilterDeltaEtaCut
Definition: FPGATrackSimGenScanTool.h:130
FPGATrackSimTrackPars::parName
static std::string parName(unsigned i)
Definition: FPGATrackSimTrackPars.cxx:72
FPGATrackSimTrackPars::IPHI
@ IPHI
Definition: FPGATrackSimTrackPars.h:49
FPGATrackSimGenScanTool::HitPairSet::pairList
std::vector< HitPair > pairList
Definition: FPGATrackSimGenScanTool.h:267
FPGATrackSimGenScanTool::m_applyPairSetFilter
Gaudi::Property< bool > m_applyPairSetFilter
Definition: FPGATrackSimGenScanTool.h:134
FPGATrackSimGenScanTool::StoredHit::phiShift
double phiShift
Definition: FPGATrackSimGenScanTool.h:205
FPGATrackSimGenScanTool::m_lyr_to_mod_map
FPGATrackSimGenScanArray< std::vector< std::set< unsigned > > > m_lyr_to_mod_map
Definition: FPGATrackSimGenScanTool.h:332
python.PyAthena.v
v
Definition: PyAthena.py:154
FPGATrackSimGenScanTool::HitPair::dEta
double dEta() const
Definition: FPGATrackSimGenScanTool.h:233
FPGATrackSimGenScanTool::m_phiFractionalPadding
Gaudi::Property< double > m_phiFractionalPadding
Definition: FPGATrackSimGenScanTool.h:117
FPGATrackSimGenScanTool::HitPair
Definition: FPGATrackSimGenScanTool.h:229
IFPGATrackSimEventSelectionSvc.h
FPGATrackSimGenScanTool::HitPairSet::lastpair
const HitPair & lastpair() const
Definition: FPGATrackSimGenScanTool.h:282
FPGATrackSimGenScanTool::m_nLayers
unsigned m_nLayers
Definition: FPGATrackSimGenScanTool.h:315
FPGATrackSimGenScanTool::StoredHit::hitptr
std::shared_ptr< const FPGATrackSimHit > hitptr
Definition: FPGATrackSimGenScanTool.h:204
FPGATrackSimGenScanTool::HitPairSet::EtaCurvature
double EtaCurvature(const HitPair &pair) const
Definition: FPGATrackSimGenScanTool.cxx:833
FPGATrackSimGenScanTool::m_FPGATrackSimMapping
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
Definition: FPGATrackSimGenScanTool.h:98
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
layer_bitmask_t
uint32_t layer_bitmask_t
Definition: FPGATrackSimTypes.h:22
FPGATrackSimGenScanArray::Iterator
Definition: FPGATrackSimGenScanArray.h:127
FPGATrackSimGenScanTool::m_applyPairFilter
Gaudi::Property< bool > m_applyPairFilter
Definition: FPGATrackSimGenScanTool.h:127
python.TriggerHandler.verbose
verbose
Definition: TriggerHandler.py:297
DeMoScan.first
bool first
Definition: DeMoScan.py:536
FPGATrackSimGenScanTool::HitPairSet::lyrCnt
unsigned int lyrCnt() const
Definition: FPGATrackSimGenScanTool.h:287
FPGATrackSimTrackPars::NPARS
@ NPARS
Definition: FPGATrackSimTrackPars.h:49
FPGATrackSimGenScanTool::BinEntry::hits
std::vector< StoredHit > hits
Definition: FPGATrackSimGenScanTool.h:221
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
CaloCellTimeCorrFiller.filename
filename
Definition: CaloCellTimeCorrFiller.py:24
FPGATrackSimGenScanTool::m_rout
Gaudi::Property< double > m_rout
Definition: FPGATrackSimGenScanTool.h:110
FPGATrackSimGenScanTool::m_pairSetPhiExtrapCurvedCut
Gaudi::Property< std::vector< double > > m_pairSetPhiExtrapCurvedCut
Definition: FPGATrackSimGenScanTool.h:143
FPGATrackSimGenScanTool::HitPairSet::PhiInExtrapCurved
double PhiInExtrapCurved(const HitPair &pair, double r_in) const
Definition: FPGATrackSimGenScanTool.cxx:845
calibdata.copy
bool copy
Definition: calibdata.py:27
FPGATrackSimGenScanTool::HitPairSet::MatchPhi
double MatchPhi(const HitPair &pair) const
Definition: FPGATrackSimGenScanTool.cxx:791
TauGNNUtils::Variables::Track::dEta
bool dEta(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:537
FPGATrackSimGenScanTool::m_validSliceAndScan
FPGATrackSimGenScanArray< int > m_validSliceAndScan
Definition: FPGATrackSimGenScanTool.h:328
FPGATrackSimGenScanTool::BinEntry
Definition: FPGATrackSimGenScanTool.h:214
FPGATrackSimGenScanTool::printValidBin
void printValidBin()
Definition: FPGATrackSimGenScanTool.cxx:964
FPGATrackSimGenScanTool::m_reversePairDir
Gaudi::Property< bool > m_reversePairDir
Definition: FPGATrackSimGenScanTool.h:128
FPGATrackSimGenScanTool::incrementalBuildFilter
StatusCode incrementalBuildFilter(const BinEntry &bindata, std::vector< HitPairSet > &output_pairset)
Definition: FPGATrackSimGenScanTool.cxx:488
FPGATrackSimGenScanTool::m_pairFilterDeltaPhiCut
Gaudi::Property< std::vector< double > > m_pairFilterDeltaPhiCut
Definition: FPGATrackSimGenScanTool.h:129
FPGATrackSimGenScanTool::m_pairSetMatchEtaCut
Gaudi::Property< double > m_pairSetMatchEtaCut
Definition: FPGATrackSimGenScanTool.h:136
FPGATrackSimTypes.h
FPGATrackSimGenScanArray::setsize
void setsize(const std::vector< unsigned int > &dims, const T &initval)
Definition: FPGATrackSimGenScanArray.h:51
FPGATrackSimGenScanTool::m_pairingLayers
std::vector< unsigned int > m_pairingLayers
Definition: FPGATrackSimGenScanTool.h:316
FPGATrackSimGenScanTool::m_etaFractionalPadding
Gaudi::Property< double > m_etaFractionalPadding
Definition: FPGATrackSimGenScanTool.h:116
FPGATrackSimGenScanTool::pairThenGroupFilter
StatusCode pairThenGroupFilter(const BinEntry &bindata, std::vector< HitPairSet > &output_pairset)
Definition: FPGATrackSimGenScanTool.cxx:347
FPGATrackSimGenScanTool::m_validBin
FPGATrackSimGenScanArray< int > m_validBin
Definition: FPGATrackSimGenScanTool.h:325
FPGATrackSimGenScanTool::m_parMax
Gaudi::Property< std::vector< float > > m_parMax
Definition: FPGATrackSimGenScanTool.h:106
FPGATrackSimRoad
Definition: FPGATrackSimRoad.h:31
FPGATrackSimGenScanTool::HitPair::EtaInExtrap
double EtaInExtrap(double r_in) const
Definition: FPGATrackSimGenScanTool.h:252
FPGATrackSimTrackPars::IETA
@ IETA
Definition: FPGATrackSimTrackPars.h:49
FPGATrackSimGenScanTool::HitPair::PhiOutExtrap
double PhiOutExtrap(double r_out) const
Definition: FPGATrackSimGenScanTool.h:242