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]);
368 return StatusCode::SUCCESS;
390 for (
unsigned j = 0; j <
m_vetolist.size(); j++) {
411 std::vector<boost::dynamic_bitset<>> hitMasks(
m_nLayers, boost::dynamic_bitset<>(
m_phiBins));
412 for (
auto const &hit : hits)
418 for (
int i = std::max(
bins.first, 0); i <= std::min(
bins.second, (
int)
m_phiBins - 1); i++)
419 hitMasks[hit->getLayer()][i] =
true;
428 std::vector<int>
const & shifts =
m_shifts[iShift];
429 float qpT =
m_qpt[iShift];
431 std::vector<std::shared_ptr<const FPGATrackSimHit>> road_hits;
434 for (
const auto & hit : hits)
440 bins.first += shifts[hit->getLayer()];
441 bins.second += shifts[hit->getLayer()];
444 if (bin_track >=
bins.first && bin_track <=
bins.second)
446 road_hits.push_back(hit);
447 hitLayers |= 1 << hit->getLayer();
457 r.setHitLayers(hitLayers);
458 r.setHits(std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>(std::move(sorted_hits)));
461 int inner_bin =
static_cast<int>(bin_track)-
static_cast<int>(shifts[0]);
462 if ((inner_bin < 0) || (inner_bin >=
static_cast<int>(
m_phiBins))) {
468 r.setX(
phitrk(bin_track,shifts).first);
492 float phi = hit->getGPhi();
497 float r = hit->getR();
499 float maxshift = +1*((std::sin(dphimax)*(
r-
m_r[hit->getLayer()]))/
r)/
m_phiStep;
501 float minshift = +1*((std::sin(dphimin)*(
r-
m_r[hit->getLayer()]))/
r)/
m_phiStep;
503 center += (maxshift+minshift)/2.0;
504 bin_extend += std::abs((maxshift-minshift)/2.0);
508 int low = std::max(
static_cast<int>(center - bin_extend),0);
509 int high = std::min(
static_cast<int>(center + bin_extend),
static_cast<int>(
m_phiBins-1));
510 return { low, high };
526 float phi_track = phi1+ std::atan2(r2-r1*std::cos(phi2-phi1),r1*std::sin(phi2-phi1)) - TMath::Pi()/2.0;
533 int inner_bin =
static_cast<int>(
bin)-
static_cast<int>(shifts[0]);
534 int outer_bin =
static_cast<int>(
bin)-
static_cast<int>(shifts[
m_nLayers-1]);
535 if ((inner_bin < 0) || (inner_bin >=
static_cast<int>(
m_phiBins)))
return {-100000,
false};
536 if ((outer_bin < 0) || (outer_bin >=
static_cast<int>(
m_phiBins)))
return {-100000,
false};
537 float phi1 =
m_bins[inner_bin];
538 float phi2 =
m_bins[outer_bin];
540 return {phi_track,
true};
552static inline std::string
to_string(std::vector<size_t> v)
554 std::ostringstream oss;
558 std::copy(v.begin(), v.end()-1, std::ostream_iterator<size_t>(oss,
", "));
566static inline boost::dynamic_bitset<>
lshift(boost::dynamic_bitset<>
const & b,
int n)
568 if (n < 0)
return rshift(b, -n);
572static inline boost::dynamic_bitset<>
rshift(boost::dynamic_bitset<>
const & b,
int n)
574 if (n < 0)
return lshift(b, -n);
576 boost::dynamic_bitset<> out(b >> n);
579 for (
int i = 0; i < n; i++)
580 out[out.size() - 1 - i] =
false;
585static inline void updateBinHits(std::vector<boost::dynamic_bitset<>> & binHits,
unsigned layer, boost::dynamic_bitset<>
const & b)
587 for (
size_t i = 0; i < b.size(); i++)
588 if (b[i]) binHits[i].set(layer);
593 std::stringstream
ss;
594 ss <<
"Hit Masks:\n";
595 for (
auto const & b : hitMasks)
598 for (
size_t i = 0; i < b.size(); i++)
612 TH2F
h(name.c_str(),
"Hough 1D Shift;phi;layer",
617 for (
size_t layer = 0; layer <
m_nLayers; layer++)
619 h.SetBinContent(i+1, layer+1, hitMasks[layer][i]);
626 std::vector<boost::dynamic_bitset<>> shiftedMasks;
627 for (
size_t layer = 0; layer <
m_nLayers; layer++)
628 shiftedMasks.push_back(
lshift(hitMasks[layer], shifts[layer]));
635 std::stringstream
ss;
637 for (
size_t i = 0; i <
m_shifts.size(); i++)
640 ss <<
"q/pT=" << qpt <<
"; ";
641 for (
int shift :
m_shifts[i])
ss << shift <<
" ";
655 std::vector<int> d0shift;
656 for (
unsigned lyr = 0; lyr <
m_nLayers; lyr++) {
657 float phi_for_d0step = d0step/
m_r[lyr];
658 int shift =
static_cast<int>(round(phi_for_d0step/
m_phiStep));
659 d0shift.push_back(shift);
670 std::vector<int> retv;
672 if (
base.size()!=var.size()) {
673 ATH_MSG_ERROR(
"Base and Var lengths must match " <<
base.size() <<
" " << var.size() );
676 for (
unsigned i = 0; i <
base.size(); i++) {
677 retv.push_back(
base[i]+
sign*var[i]);
685 for (
unsigned lyr = 0; lyr <
m_nLayers; lyr++) {
686 if (lyr !=droplayer) retv.push_back(shift[lyr]);
695 std::vector< std::set< std::vector<int> > > reducedShifts(
m_nLayers);
699 for (
size_t iShift = 0; iShift <
m_shifts.size(); iShift++)
701 boost::dynamic_bitset<> drops(
m_nLayers);
702 for (
unsigned droplayer =0; droplayer <
m_nLayers; droplayer++) {
705 drops.set(droplayer);
718 for (
unsigned i = 0; i <
r.getNLayers(); i++) {
719 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