ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimSectorSlice Class Reference

#include <FPGATrackSimSectorSlice.h>

Collaboration diagram for FPGATrackSimSectorSlice:

Public Member Functions

 FPGATrackSimSectorSlice (size_t nSectors, FPGATrackSimTrackParsI const &nBins, FPGATrackSimTrackPars const &min, FPGATrackSimTrackPars const &max)
 FPGATrackSimSectorSlice (const std::string &filepath)
 FPGATrackSimSectorSlice (const FPGATrackSimSectorSlice &)=delete
FPGATrackSimSectorSliceoperator= (const FPGATrackSimSectorSlice &)=delete
void addSectorToSlice (sector_t sector, FPGATrackSimTrackParsI const &bins)
void saveSlices (const std::string &filepath)
std::pair< FPGATrackSimTrackPars, FPGATrackSimTrackParsgetBoundaries () const
std::vector< sector_tsearchSectors (FPGATrackSimTrackPars const &pars) const

Private Member Functions

void calcDependentVals ()
void getBoundary (const TClonesArray *bitmasks, double x_min, double x_max, double &autoMin, double &autoMax, bool wraps, const char *debug) const
 Given a range [x_min, x_max] split in bins corresponding to the size of bitmasks, finds a tighter range of x values for where the bitmasks are non-empty.
bool checkTrackPars (FPGATrackSimTrackPars const &pars) const

Private Attributes

TClonesArray * m_bits_phi = nullptr
TClonesArray * m_bits_c = nullptr
TClonesArray * m_bits_d0 = nullptr
TClonesArray * m_bits_z0 = nullptr
TClonesArray * m_bits_eta = nullptr
FPGATrackSimTrackParsI m_nBins
FPGATrackSimTrackPars m_min
FPGATrackSimTrackPars m_max
FPGATrackSimTrackPars m_step

Detailed Description

Definition at line 31 of file FPGATrackSimSectorSlice.h.

Constructor & Destructor Documentation

◆ FPGATrackSimSectorSlice() [1/3]

FPGATrackSimSectorSlice::FPGATrackSimSectorSlice ( size_t nSectors,
FPGATrackSimTrackParsI const & nBins,
FPGATrackSimTrackPars const & min,
FPGATrackSimTrackPars const & max )

Definition at line 39 of file FPGATrackSimSectorSlice.cxx.

41 :
42 m_nBins(nBins),
43 m_min(min),
44 m_max(max)
45{
46 m_bits_phi = new TClonesArray("TBits", m_nBins.phi);
47 m_bits_c = new TClonesArray("TBits", m_nBins.qOverPt);
48 m_bits_d0 = new TClonesArray("TBits", m_nBins.d0);
49 m_bits_z0 = new TClonesArray("TBits", m_nBins.z0);
50 m_bits_eta = new TClonesArray("TBits", m_nBins.eta);
51
52 for (int i = 0; i < m_nBins.phi; i++) new ((*m_bits_phi)[i]) TBits(nSectors);
53 for (int i = 0; i < m_nBins.qOverPt; i++) new ((*m_bits_c)[i]) TBits(nSectors);
54 for (int i = 0; i < m_nBins.d0; i++) new ((*m_bits_d0)[i]) TBits(nSectors);
55 for (int i = 0; i < m_nBins.z0; i++) new ((*m_bits_z0)[i]) TBits(nSectors);
56 for (int i = 0; i < m_nBins.eta; i++) new ((*m_bits_eta)[i]) TBits(nSectors);
57
59}
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
FPGATrackSimTrackParsI m_nBins

◆ FPGATrackSimSectorSlice() [2/3]

FPGATrackSimSectorSlice::FPGATrackSimSectorSlice ( const std::string & filepath)

Definition at line 62 of file FPGATrackSimSectorSlice.cxx.

63{
64 ANA_MSG_INFO("Reading " << filepath);
65 TFile *slice_file = TFile::Open(filepath.c_str());
66
67 m_bits_phi = dynamic_cast<TClonesArray*>(slice_file->Get("c_bits_phi"));
68 m_bits_c = dynamic_cast<TClonesArray*>(slice_file->Get("c_bits_c"));
69 m_bits_d0 = dynamic_cast<TClonesArray*>(slice_file->Get("c_bits_d"));
70 m_bits_z0 = dynamic_cast<TClonesArray*>(slice_file->Get("c_bits_z0"));
71
72 // kludge for backward compatability
73 if ((slice_file->Get("c_bits_eta")) != nullptr)
74 m_bits_eta = dynamic_cast<TClonesArray*>(slice_file->Get("c_bits_eta"));
75 else
76 m_bits_eta = dynamic_cast<TClonesArray*>(slice_file->Get("c_bits_ctheta"));
77
78 if (not m_bits_eta){
79 ANA_MSG_ERROR("m_bits_eta is null in FPGATrackSimSectorSlice constructor");
80 delete slice_file;
81 return;
82 }
83 TTree *slice_tree = dynamic_cast<TTree*>(slice_file->Get("bin_info"));
84 if (not slice_tree){
85 ANA_MSG_ERROR("slice_tree is null in FPGATrackSimSectorSlice constructor");
86 delete slice_file;
87 return;
88 }
89 slice_tree->SetBranchAddress("qOverPt_max", &m_max.qOverPt);
90 slice_tree->SetBranchAddress("d0_max", &m_max.d0);
91 slice_tree->SetBranchAddress("phi_max", &m_max.phi);
92 slice_tree->SetBranchAddress("z0_max", &m_max.z0);
93 slice_tree->SetBranchAddress("eta_max", &m_max.eta);
94
95 slice_tree->SetBranchAddress("qOverPt_min", &m_min.qOverPt);
96 slice_tree->SetBranchAddress("d0_min", &m_min.d0);
97 slice_tree->SetBranchAddress("phi_min", &m_min.phi);
98 slice_tree->SetBranchAddress("z0_min", &m_min.z0);
99 slice_tree->SetBranchAddress("eta_min", &m_min.eta);
100
101 slice_tree->SetBranchAddress("qOverPt_bins",&m_nBins.qOverPt);
102 slice_tree->SetBranchAddress("d0_bins", &m_nBins.d0);
103 slice_tree->SetBranchAddress("phi_bins", &m_nBins.phi);
104 slice_tree->SetBranchAddress("z0_bins", &m_nBins.z0);
105 slice_tree->SetBranchAddress("eta_bins", &m_nBins.eta);
106
107 // For backwards compatability
108 if (slice_tree->GetBranch("qOverPt_max") == nullptr) slice_tree->SetBranchAddress("halfInvPt_max", &m_max.qOverPt);
109 if (slice_tree->GetBranch("qOverPt_min") == nullptr) slice_tree->SetBranchAddress("halfInvPt_min", &m_min.qOverPt);
110 if (slice_tree->GetBranch("qOverPt_bins") == nullptr) slice_tree->SetBranchAddress("halfInvPt_bins", &m_nBins.qOverPt);
111
112 slice_tree->GetEntry(0);
113
115
116 delete slice_file;
117}
#define ANA_MSG_INFO(xmsg)
Macro printing info messages.
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.

◆ FPGATrackSimSectorSlice() [3/3]

FPGATrackSimSectorSlice::FPGATrackSimSectorSlice ( const FPGATrackSimSectorSlice & )
delete

Member Function Documentation

◆ addSectorToSlice()

void FPGATrackSimSectorSlice::addSectorToSlice ( sector_t sector,
FPGATrackSimTrackParsI const & bins )

Definition at line 135 of file FPGATrackSimSectorSlice.cxx.

136{
137 int bin;
138
139 bin = clamp(bins.phi, 0, m_nBins.phi);
140 static_cast<TBits*>(m_bits_phi->UncheckedAt(bin))->SetBitNumber(sector);
141
142 bin = clamp(bins.qOverPt, 0, m_nBins.qOverPt);
143 static_cast<TBits*>(m_bits_c->UncheckedAt(bin))->SetBitNumber(sector);
144
145 bin = clamp(bins.d0, 0, m_nBins.d0);
146 static_cast<TBits*>(m_bits_d0->UncheckedAt(bin))->SetBitNumber(sector);
147
148 bin = clamp(bins.z0, 0, m_nBins.z0);
149 static_cast<TBits*>(m_bits_z0->UncheckedAt(bin))->SetBitNumber(sector);
150
151 bin = clamp(bins.eta, 0, m_nBins.eta);
152 static_cast<TBits*>(m_bits_eta->UncheckedAt(bin))->SetBitNumber(sector);
153}
static const std::vector< std::string > bins

◆ calcDependentVals()

void FPGATrackSimSectorSlice::calcDependentVals ( )
private

Definition at line 121 of file FPGATrackSimSectorSlice.cxx.

122{
123
124 m_step.phi = (m_max.phi - m_min.phi) / m_nBins.phi;
125 m_step.qOverPt = (m_max.qOverPt - m_min.qOverPt) / m_nBins.qOverPt;
126 m_step.d0 = (m_max.d0 - m_min.d0) / m_nBins.d0;
127 m_step.z0 = (m_max.z0 - m_min.z0) /m_nBins.z0;
128 m_step.eta = (m_max.eta - m_min.eta) / m_nBins.eta;
129}

◆ checkTrackPars()

bool FPGATrackSimSectorSlice::checkTrackPars ( FPGATrackSimTrackPars const & pars) const
private

Definition at line 197 of file FPGATrackSimSectorSlice.cxx.

198{
199 if (pars.phi < m_min.phi || pars.phi > m_max.phi) return false;
200 if (pars.qOverPt < m_min.qOverPt || pars.qOverPt > m_max.qOverPt) return false;
201 if (pars.d0 < m_min.d0 || pars.d0 > m_max.d0) return false;
202 if (pars.z0 < m_min.z0 || pars.z0 > m_max.z0) return false;
203 if (pars.eta < m_min.eta || pars.eta > m_max.eta) return false;
204 return true;
205}

◆ getBoundaries()

std::pair< FPGATrackSimTrackPars, FPGATrackSimTrackPars > FPGATrackSimSectorSlice::getBoundaries ( ) const

Definition at line 252 of file FPGATrackSimSectorSlice.cxx.

253{
254 FPGATrackSimTrackPars min;
255 FPGATrackSimTrackPars max;
256
257 getBoundary(m_bits_phi, m_min.phi, m_max.phi, min.phi, max.phi, true, "phi");
258 getBoundary(m_bits_c, m_min.qOverPt, m_max.qOverPt, min.qOverPt, max.qOverPt, false, "c");
259 getBoundary(m_bits_d0, m_min.d0, m_max.d0, min.d0, max.d0, false, "d0");
260 getBoundary(m_bits_z0, m_min.z0, m_max.z0, min.z0, max.z0, false, "z0");
261 getBoundary(m_bits_eta, m_min.eta, m_max.eta, min.eta, max.eta, false, "eta");
262
263 ANA_MSG_INFO("getBoundaries() returning " << min << "; " << max);
264 return { min, max };
265}
void getBoundary(const TClonesArray *bitmasks, double x_min, double x_max, double &autoMin, double &autoMax, bool wraps, const char *debug) const
Given a range [x_min, x_max] split in bins corresponding to the size of bitmasks, finds a tighter ran...

◆ getBoundary()

void FPGATrackSimSectorSlice::getBoundary ( const TClonesArray * bitmasks,
double x_min,
double x_max,
double & bound_min,
double & bound_max,
bool wraps,
const char * debug ) const
private

Given a range [x_min, x_max] split in bins corresponding to the size of bitmasks, finds a tighter range of x values for where the bitmasks are non-empty.

Parameters
bitmasks- A TBits vector with sector bitmasks for each bin.
bound_min- Return value for the boundary min x
bound_max- Return value for the boundary max x

Definition at line 276 of file FPGATrackSimSectorSlice.cxx.

278{
279 int nbin = bitmasks->GetEntries();
280
281 // Find the bounds of where there are bits, i_lower and i_upper are inclusive.
282 int i_lower, i_upper;
283 if (!wraps)
284 {
285 for (i_lower = 0; i_lower < nbin-1; i_lower++)
286 if (dynamic_cast<TBits const *>(bitmasks->UncheckedAt(i_lower))->CountBits() > 0) break;
287 for (i_upper = nbin-1; i_upper > 0; i_upper--)
288 if (dynamic_cast<TBits const *>(bitmasks->UncheckedAt(i_upper))->CountBits() > 0) break;
289 }
290 else // special case for cyclic values that wrap around, like phi
291 {
292 // Mark bins with nonzero bits, with a safety margin
293 std::vector<bool> good_bins(nbin);
294 for (int j = 0; j < nbin; j++)
295 {
296 if (dynamic_cast<TBits const *>(bitmasks->UncheckedAt(j))->CountBits() > 0)
297 {
298 // add safety margin: +/- 1 bin
299 // if the good bins are not actually continuous, the region found below will leave out some bins
300 good_bins[(j+nbin-1) % nbin] = true; // mod to handle wrap-around
301 good_bins[j] = true;
302 good_bins[(j+1) % nbin] = true;
303 }
304 }
305
306 // Locate largest continuous region
307 largest_region_wrap(good_bins, i_lower, i_upper);
308 }
309
310 if (i_lower >= i_upper) ANA_MSG_WARNING("getBoundary() Completely empty bitmask array");
311 bound_min = x_min + ((x_max-x_min) * i_lower) / nbin;
312 bound_max = x_min + ((x_max-x_min) * (i_upper+1)) / nbin;
313
314 ANA_MSG_INFO("getBoundary() " << debug << " nbin=" << nbin
315 << " range=[" << x_min << ", " << x_max
316 << "], index=[" << i_lower << ", " << i_upper
317 << "], result=[" << bound_min << ", " << bound_max << "]");
318}
#define ANA_MSG_WARNING(xmsg)
Macro printing warning messages.
void largest_region_wrap(std::vector< bool > const &good_bin, int &i_lower, int &i_upper)
const bool debug

◆ operator=()

FPGATrackSimSectorSlice & FPGATrackSimSectorSlice::operator= ( const FPGATrackSimSectorSlice & )
delete

◆ saveSlices()

void FPGATrackSimSectorSlice::saveSlices ( const std::string & filepath)

Definition at line 156 of file FPGATrackSimSectorSlice.cxx.

157{
158 TFile ofile(filepath.c_str(), "recreate");
159
160 m_bits_phi->Write("c_bits_phi", TObject::kSingleKey);
161 m_bits_c->Write("c_bits_c", TObject::kSingleKey);
162 m_bits_d0->Write("c_bits_d", TObject::kSingleKey);
163 m_bits_z0->Write("c_bits_z0", TObject::kSingleKey);
164 m_bits_eta->Write("c_bits_eta", TObject::kSingleKey);
165
166 TTree *slice_tree = new TTree("bin_info", "Slice binning information");
167
168 slice_tree->Branch("qOverPt_max", &m_max.qOverPt);
169 slice_tree->Branch("d0_max", &m_max.d0);
170 slice_tree->Branch("phi_max", &m_max.phi);
171 slice_tree->Branch("z0_max", &m_max.z0);
172 slice_tree->Branch("eta_max", &m_max.eta);
173
174 slice_tree->Branch("qOverPt_min", &m_min.qOverPt);
175 slice_tree->Branch("d0_min", &m_min.d0);
176 slice_tree->Branch("phi_min", &m_min.phi);
177 slice_tree->Branch("z0_min", &m_min.z0);
178 slice_tree->Branch("eta_min", &m_min.eta);
179
180 slice_tree->Branch("qOverPt_bins",&m_nBins.qOverPt);
181 slice_tree->Branch("d0_bins", &m_nBins.d0);
182 slice_tree->Branch("phi_bins", &m_nBins.phi);
183 slice_tree->Branch("z0_bins", &m_nBins.z0);
184 slice_tree->Branch("eta_bins", &m_nBins.eta);
185
186 slice_tree->Fill();
187
188 ofile.Write();
189 ofile.Close();
190}

◆ searchSectors()

std::vector< sector_t > FPGATrackSimSectorSlice::searchSectors ( FPGATrackSimTrackPars const & pars) const

Definition at line 216 of file FPGATrackSimSectorSlice.cxx.

217{
218 std::vector<sector_t> sectors;
219 if (!checkTrackPars(pars))
220 {
221 ANA_MSG_ERROR("searchSectors() Bad track parameters: " << pars);
222 return sectors;
223 }
224
225 // Special case for phi
226 int bin = static_cast<int>((pars.phi - m_min.phi) / m_step.phi);
227 bin = (bin + m_nBins.phi) % m_nBins.phi; // modulo operator: phi wraps around
228 TBits result_bits = *(TBits*)(m_bits_phi->UncheckedAt(bin));
229
230 result_bits &= *(TBits*)(m_bits_c->UncheckedAt(getBin(pars.qOverPt, m_min.qOverPt, m_step.qOverPt, m_nBins.qOverPt)));
231 result_bits &= *(TBits*)(m_bits_d0->UncheckedAt(getBin(pars.d0, m_min.d0, m_step.d0, m_nBins.d0)));
232 result_bits &= *(TBits*)(m_bits_z0->UncheckedAt(getBin(pars.z0, m_min.z0, m_step.z0, m_nBins.z0)));
233 result_bits &= *(TBits*)(m_bits_eta->UncheckedAt(getBin(pars.eta, m_min.eta, m_step.eta, m_nBins.eta)));
234
235 unsigned int curPos = result_bits.FirstSetBit(0);
236 while (curPos != result_bits.GetNbits())
237 {
238 sectors.push_back(static_cast<sector_t>(curPos));
239 curPos = result_bits.FirstSetBit(curPos + 1);
240 }
241
242 return sectors;
243}
int getBin(double x, double min, double step, int clamp_max)
int32_t sector_t
bool checkTrackPars(FPGATrackSimTrackPars const &pars) const

Member Data Documentation

◆ m_bits_c

TClonesArray* FPGATrackSimSectorSlice::m_bits_c = nullptr
private

Definition at line 62 of file FPGATrackSimSectorSlice.h.

◆ m_bits_d0

TClonesArray* FPGATrackSimSectorSlice::m_bits_d0 = nullptr
private

Definition at line 63 of file FPGATrackSimSectorSlice.h.

◆ m_bits_eta

TClonesArray* FPGATrackSimSectorSlice::m_bits_eta = nullptr
private

Definition at line 65 of file FPGATrackSimSectorSlice.h.

◆ m_bits_phi

TClonesArray* FPGATrackSimSectorSlice::m_bits_phi = nullptr
private

Definition at line 61 of file FPGATrackSimSectorSlice.h.

◆ m_bits_z0

TClonesArray* FPGATrackSimSectorSlice::m_bits_z0 = nullptr
private

Definition at line 64 of file FPGATrackSimSectorSlice.h.

◆ m_max

FPGATrackSimTrackPars FPGATrackSimSectorSlice::m_max
private

Definition at line 72 of file FPGATrackSimSectorSlice.h.

◆ m_min

FPGATrackSimTrackPars FPGATrackSimSectorSlice::m_min
private

Definition at line 71 of file FPGATrackSimSectorSlice.h.

◆ m_nBins

FPGATrackSimTrackParsI FPGATrackSimSectorSlice::m_nBins
private

Definition at line 68 of file FPGATrackSimSectorSlice.h.

◆ m_step

FPGATrackSimTrackPars FPGATrackSimSectorSlice::m_step
private

Definition at line 75 of file FPGATrackSimSectorSlice.h.


The documentation for this class was generated from the following files: