ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimRoad.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
10
11#include <vector>
12
15
16using namespace std;
17
18//FPGATrackSimRoad::~FPGATrackSimRoad() { }
19
21{
22 size_t n = 0;
23 for (const auto& l : m_hits_trans) n += l.size();
24 return n;
25}
26
27std::vector<size_t> FPGATrackSimRoad::getNHits_layer() const
28{
29 std::vector<size_t> out;
30 out.reserve(m_hits_trans.size());
31 for (const auto& l : m_hits_trans) out.push_back(l.size());
32 return out;
33}
34
36{
37 size_t combos = 1;
38 size_t l = m_hits_trans.size();
39 std::vector<unsigned int> skipindices;
40
41 // figure out indices of outer layers of stereo layers, where inner layer is also present to not
42 // double count spacepoints
43 for (size_t i = 1; i < l; ++i) {
44 if (m_hits_trans[i - 1].size() > 0 && m_hits_trans[i].size() > 0) {
45 if ((m_hits_trans[i - 1][0]->isStrip() && m_hits_trans[i][0]->isStrip()) &&
46 (m_hits_trans[i - 1][0]->getPhysLayer() % 2 == 0) &&
47 (m_hits_trans[i][0]->getPhysLayer() - m_hits_trans[i - 1][0]->getPhysLayer() == 1)) {
48 skipindices.push_back(i);
49 ++i;
50 }
51 }
52 }
53
54 // calculate number of combinations
55 for (size_t i = 0; i < l; ++i) {
56 size_t n = 0;
57 for (size_t j = 0; j < m_hits_trans[i].size(); ++j) {
58 // extra handling of spacepoints in combination calculation
59 if (m_hits_trans[i][j]->getHitType() == HitType::spacepoint) {
60 bool skip = false;
61 size_t skipsize = skipindices.size();
62 for (size_t k = 0; k < skipsize; ++k)
63 if (i == skipindices[k]) skip = true;
64
65 if (skip) continue;
66 }
67 ++n;
68 }
69 if (n > 0) combos *= n;
70 }
71
72 return combos;
73}
74
75
77{
78 // get number of pixel layers from hits. Assumes strips follow pixels,
79 // and all hits in a layer share the same det type
80 unsigned nPixel;
81 for (nPixel = 0; nPixel < m_hits_trans.size(); nPixel++)
82 if (!m_hits_trans[nPixel].empty() && m_hits_trans[nPixel].front()->isStrip())
83 break;
84
85 std::map<FPGATrackSimMultiTruth::Barcode, layer_bitmask_t> layer_map;
86
87 for (auto const& hits : m_hits_trans)
88 for (auto const &h : hits)
89 for (auto const& x : h->getTruth())
90 layer_map[x.first] |= (1 << h->getLayer());
91
93 for (auto const& x : layer_map)
94 {
95 int w = 0, n = 0;
96 for (unsigned i = 0; i < m_hits_trans.size(); i++)
97 {
98 if (!m_hits_trans[i].empty())
99 n += (i < nPixel) ? 2 : 1; // double weight pixels
100 if (x.second & (1 << i))
101 w += (i < nPixel) ? 2 : 1; // double weight pixels
102 }
103 if (n == 0){
104 throw std::range_error("divide by zero in FPGATrackSimRoad::getTruth");
105 }
106 mt.add(x.first, static_cast<float>(w) / n);
107 }
108
109 return mt;
110}
111
112
113std::unordered_set<std::shared_ptr<const FPGATrackSimHit>> FPGATrackSimRoad::getHits_flat() const {
114 std::unordered_set<std::shared_ptr<const FPGATrackSimHit>> hits;
115 for (const auto& layerHits : m_hits_trans) {
116 for (auto const& hit : layerHits) {
117 hits.insert(hit);
118 }
119 }
120 return hits;
121}
122
123void FPGATrackSimRoad::repopulateTransHits() { // this is needed if trying to read the hits from the road in a stored output file, call this first, otherwise not in Athena
124 m_hits_trans.resize(m_hits.size());
125 for (unsigned ilayer = 0; ilayer < m_hits.size(); ilayer++) {
126 m_hits_trans[ilayer].resize(m_hits[ilayer].size());
127 for (unsigned ihit = 0; ihit < m_hits[ilayer].size(); ihit++) {
128 m_hits_trans[ilayer][ihit] = std::make_shared<const FPGATrackSimHit>(m_hits[ilayer][ihit]);
129 }
130 }
131}
132
133void FPGATrackSimRoad::setHits(unsigned layer, std::vector<std::shared_ptr<const FPGATrackSimHit>> && hits) {
134 m_hits_trans[layer] = std::move(hits);
135 m_hits[layer].clear();
136 for (const auto& hit : m_hits_trans[layer]) {
137 m_hits[layer].push_back(*hit);
138 }
139} // ensure setNLayers is called first
140
141void FPGATrackSimRoad::setHits(std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> &&hits){
142 if (hits.size() != m_hits_trans.size()) setNLayers(hits.size());
143 for (unsigned i = 0;i < hits.size();++i) {
144 setHits(i,std::move(hits[i]));
145 }
146}
147
148
149ostream& operator<<(ostream& os, const FPGATrackSimRoad& road)
150{
151 os << "road " << road.m_roadID
152 << ": PID " << road.m_pid
153 << ", sector " << road.m_sector
154 << " hitLayers " << std::showbase << std::hex << road.m_hit_layers
155 << " wcLayers " << std::showbase << std::hex << road.m_wildcard_layers
156 << ", nHits " << road.getNHits();
157 /*
158 for (size_t l=0; l < road.m_hits.size(); l++)
159 {
160 for (FPGATrackSimHit const * hit : road.m_hits[l])
161 os << "\n\t" << *hit;
162 }
163 */
164
165 return os;
166}
167
Defines a class for roads.
#define x
static const Attributes_t empty
void add(const FPGATrackSimMultiTruth::Barcode &code, const FPGATrackSimMultiTruth::Weight &weight)
layer_bitmask_t m_wildcard_layers
FPGATrackSimMultiTruth getTruth() const
size_t getNHitCombos() const
std::vector< std::vector< std::shared_ptr< const FPGATrackSimHit > > > m_hits_trans
size_t getNHits() const
layer_bitmask_t m_hit_layers
std::unordered_set< std::shared_ptr< const FPGATrackSimHit > > getHits_flat() const
void setHits(std::vector< std::vector< std::shared_ptr< const FPGATrackSimHit > > > &&hits)
FPGATrackSimRoad()=default
std::vector< std::vector< FPGATrackSimHit > > m_hits
void setNLayers(unsigned layers)
std::vector< size_t > getNHits_layer() const
STL namespace.
ostream & operator<<(ostream &s, const SG::VarHandleKey &m)