27#include <boost/dynamic_bitset.hpp>
30static inline std::string
to_string(std::vector<size_t> v);
31static inline boost::dynamic_bitset<>
lshift(boost::dynamic_bitset<>
const & b,
int n);
32static inline boost::dynamic_bitset<>
rshift(boost::dynamic_bitset<>
const & b,
int n);
33static inline void updateBinHits(std::vector<boost::dynamic_bitset<>> & binHits,
unsigned layer, boost::dynamic_bitset<>
const & b);
55 return StatusCode::FAILURE;
61 ATH_MSG_FATAL(
"initialize() Hit extend must have size == nLayers");
62 return StatusCode::FAILURE;
73 for (
unsigned ilayer = 0; ilayer <
m_nLayers; ilayer++) {
82 ATH_MSG_WARNING(
"initialize() idealGeoRoads conflicts with useSectors, switching off FPGATrackSim sector matching");
87 ATH_MSG_WARNING(
"initialize() idealGeoRoads requires tracing hits, turning on automatically");
110 return StatusCode::SUCCESS;
125 float iterShift = (
sign>0) ? 0.0 : -1.0;
134 std::vector<int> shifts;
142 int shift =
static_cast<int>(round(dPhi /
m_phiStep));
143 if (shift >=
static_cast<int>(
m_phiBins) || shift <= -(
static_cast<int>(
m_phiBins)))
return;
144 shifts.push_back(shift);
148 for (
const std::vector<int>& d0shift:
m_d0shifts){
153 m_qpt.push_back(qpt);
154 m_shifts.push_back(std::move(shifts));
184 std::ifstream fin(filepath);
188 throw (
"FPGATrackSimHough1DShiftTool::readShifts couldn't open " + filepath);
195 bool newsubr =
false;
196 bool headerdone =
false;
202 while (getline(fin, line))
204 newsubr|=(line.empty());
205 if (line.empty() || line[0] ==
'#')
continue;
206 std::istringstream sline(line);
208 std::string towers,
phi;
209 ok = ok && (sline >> towers);
210 if (towers!=
"towers") {
211 ATH_MSG_FATAL(
"Parse Error expected 'towers' got "<< towers);
212 throw (
"FPGATrackSimHough1DShiftTool::readShifts couldn't parse " + filepath);
214 ok = ok && (sline >> nslices);
215 ATH_MSG_INFO(
"FPGATrackSimHough1DShiftTool::readShifts " << nslices <<
"slices in shift file");
216 ok = ok && (sline >>
phi);
219 throw (
"FPGATrackSimHough1DShiftTool::readShifts couldn't parse " + filepath);
221 ok = ok && (sline >> nphi);
227 ok = ok && (sline >> subregion);
236 std::vector<int> shifts;
238 for (
unsigned layer = 1; layer <
m_nLayers; layer++)
241 ok = ok && (sline >> shift);
243 shifts.push_back(shift);
246 if (shifts[0]<-1000) {
247 ATH_MSG_INFO(
"FPGATrackSimHough1DShiftTool::readShifts skipping line with shift out of range: " << line);
252 std::string droplist;
253 ok = ok && (sline >> droplist);
254 ok = ok && (droplist.size() ==
m_nLayers);
257 boost::dynamic_bitset<> drops(
m_nLayers);
259 if (droplist[i] ==
'1')
264 ok = ok && (sline >> qpt);
269 std::vector<float> phivals;
270 for (
unsigned layer = 0; layer <
m_nLayers; layer++)
273 ok = ok && (sline >> phival);
275 phivals.push_back(phival);
278 m_qpt.push_back(qpt);
279 m_shifts.push_back(std::move(shifts));
290 throw "FPGATrackSimHough1DShiftTool::readShifts read error";
300 return StatusCode::SUCCESS;
316 std::vector<boost::dynamic_bitset<>> hitMasks(
makeHitMasks(hits));
320 for (
size_t iShift = 0; iShift <
m_shifts.size(); iShift++)
323 std::vector<boost::dynamic_bitset<>> binHits(
m_phiBins, boost::dynamic_bitset<>(
m_nLayers));
347 <<
to_string(
r.getNHits_layer()) <<
" reg=" <<
r.getSubRegion()
348 <<
" bin=" <<
bin <<
" shift=" << iShift <<
" phi=" <<
r.getX() <<
" pti=" <<
r.getY() <<
" " <<
m_qpt[iShift]);
367 return StatusCode::SUCCESS;
389 for (
unsigned j = 0; j <
m_vetolist.size(); j++) {
410 std::vector<boost::dynamic_bitset<>> hitMasks(
m_nLayers, boost::dynamic_bitset<>(
m_phiBins));
411 for (
auto const &hit : hits)
417 for (
int i = std::max(
bins.first, 0); i <= std::min(
bins.second, (
int)
m_phiBins - 1); i++)
418 hitMasks[hit->getLayer()][i] =
true;
427 std::vector<int>
const & shifts =
m_shifts[iShift];
428 float qpT =
m_qpt[iShift];
430 std::vector<std::shared_ptr<const FPGATrackSimHit>> road_hits;
433 for (
const auto & hit : hits)
439 bins.first += shifts[hit->getLayer()];
440 bins.second += shifts[hit->getLayer()];
443 if (bin_track >=
bins.first && bin_track <=
bins.second)
445 road_hits.push_back(hit);
446 hitLayers |= 1 << hit->getLayer();
456 r.setHitLayers(hitLayers);
457 r.setHits(std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>(std::move(sorted_hits)));
460 int inner_bin =
static_cast<int>(bin_track)-
static_cast<int>(shifts[0]);
461 if ((inner_bin < 0) || (inner_bin >=
static_cast<int>(
m_phiBins))) {
467 r.setX(
phitrk(bin_track,shifts).first);
491 float phi = hit->getGPhi();
496 float r = hit->getR();
498 float maxshift = +1*((std::sin(dphimax)*(
r-
m_r[hit->getLayer()]))/
r)/
m_phiStep;
500 float minshift = +1*((std::sin(dphimin)*(
r-
m_r[hit->getLayer()]))/
r)/
m_phiStep;
502 center += (maxshift+minshift)/2.0;
503 bin_extend += std::abs((maxshift-minshift)/2.0);
507 int low = std::max(
static_cast<int>(center - bin_extend),0);
508 int high = std::min(
static_cast<int>(center + bin_extend),
static_cast<int>(
m_phiBins-1));
509 return { low, high };
525 float phi_track = phi1+ std::atan2(r2-r1*std::cos(phi2-phi1),r1*std::sin(phi2-phi1)) - TMath::Pi()/2.0;
532 int inner_bin =
static_cast<int>(
bin)-
static_cast<int>(shifts[0]);
533 int outer_bin =
static_cast<int>(
bin)-
static_cast<int>(shifts[
m_nLayers-1]);
534 if ((inner_bin < 0) || (inner_bin >=
static_cast<int>(
m_phiBins)))
return {-100000,
false};
535 if ((outer_bin < 0) || (outer_bin >=
static_cast<int>(
m_phiBins)))
return {-100000,
false};
536 float phi1 =
m_bins[inner_bin];
537 float phi2 =
m_bins[outer_bin];
539 return {phi_track,
true};
551static inline std::string
to_string(std::vector<size_t> v)
553 std::ostringstream oss;
557 std::copy(v.begin(), v.end()-1, std::ostream_iterator<size_t>(oss,
", "));
565static inline boost::dynamic_bitset<>
lshift(boost::dynamic_bitset<>
const & b,
int n)
567 if (n < 0)
return rshift(b, -n);
571static inline boost::dynamic_bitset<>
rshift(boost::dynamic_bitset<>
const & b,
int n)
573 if (n < 0)
return lshift(b, -n);
575 boost::dynamic_bitset<> out(b >> n);
578 for (
int i = 0; i < n; i++)
579 out[out.size() - 1 - i] =
false;
584static inline void updateBinHits(std::vector<boost::dynamic_bitset<>> & binHits,
unsigned layer, boost::dynamic_bitset<>
const & b)
586 for (
size_t i = 0; i < b.size(); i++)
587 if (b[i]) binHits[i].set(layer);
592 std::stringstream
ss;
593 ss <<
"Hit Masks:\n";
594 for (
auto const & b : hitMasks)
597 for (
size_t i = 0; i < b.size(); i++)
611 TH2F
h(name.c_str(),
"Hough 1D Shift;phi;layer",
616 for (
size_t layer = 0; layer <
m_nLayers; layer++)
618 h.SetBinContent(i+1, layer+1, hitMasks[layer][i]);
625 std::vector<boost::dynamic_bitset<>> shiftedMasks;
626 for (
size_t layer = 0; layer <
m_nLayers; layer++)
627 shiftedMasks.push_back(
lshift(hitMasks[layer], shifts[layer]));
634 std::stringstream
ss;
636 for (
size_t i = 0; i <
m_shifts.size(); i++)
639 ss <<
"q/pT=" << qpt <<
"; ";
640 for (
int shift :
m_shifts[i])
ss << shift <<
" ";
654 std::vector<int> d0shift;
655 for (
unsigned lyr = 0; lyr <
m_nLayers; lyr++) {
656 float phi_for_d0step = d0step/
m_r[lyr];
657 int shift =
static_cast<int>(round(phi_for_d0step/
m_phiStep));
658 d0shift.push_back(shift);
669 std::vector<int> retv;
671 if (
base.size()!=var.size()) {
672 ATH_MSG_ERROR(
"Base and Var lengths must match " <<
base.size() <<
" " << var.size() );
675 for (
unsigned i = 0; i <
base.size(); i++) {
676 retv.push_back(
base[i]+
sign*var[i]);
684 for (
unsigned lyr = 0; lyr <
m_nLayers; lyr++) {
685 if (lyr !=droplayer) retv.push_back(shift[lyr]);
694 std::vector< std::set< std::vector<int> > > reducedShifts(
m_nLayers);
698 for (
size_t iShift = 0; iShift <
m_shifts.size(); iShift++)
700 boost::dynamic_bitset<> drops(
m_nLayers);
701 for (
unsigned droplayer =0; droplayer <
m_nLayers; droplayer++) {
704 drops.set(droplayer);
717 for (
unsigned i = 0; i <
r.getNLayers(); i++) {
718 if (
r.getHitLayers() & (1<<i)) cnt++;
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
double fieldCorrection(unsigned region, double qoverpt, double r)
: FPGATrackSim-specific class to represent an hit in the detector.
std::vector< std::vector< std::shared_ptr< const FPGATrackSimHit > > > sortByLayer(Container const &hits)
Maps physical layers to logical layers.
Maps ITK module indices to FPGATrackSim regions.
Stores slice definitions for FPGATrackSim regions.
This file declares a class that stores the module IDs of the sectors.
static const std::vector< std::string > bins
Header file for AthHistogramAlgorithm.
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
static constexpr double A