27 #include <boost/dynamic_bitset.hpp>
30 static inline std::string
to_string(std::vector<size_t>
v);
31 static inline boost::dynamic_bitset<> lshift(boost::dynamic_bitset<>
const &
b,
int n);
32 static inline boost::dynamic_bitset<> rshift(boost::dynamic_bitset<>
const &
b,
int n);
33 static 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;
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);
184 std::ifstream
fin(filepath);
188 throw (
"FPGATrackSimHough1DShiftTool::readShifts couldn't open " + filepath);
195 bool newsubr =
false;
196 bool headerdone =
false;
204 newsubr|=(
line.empty());
205 if (
line.empty() ||
line[0] ==
'#')
continue;
206 std::istringstream sline(
line);
209 ok = ok && (sline >>
towers);
212 throw (
"FPGATrackSimHough1DShiftTool::readShifts couldn't parse " + filepath);
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;
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;
273 ok = ok && (sline >> phival);
275 phivals.push_back(phival);
278 m_qpt.push_back(qpt);
290 throw "FPGATrackSimHough1DShiftTool::readShifts read error";
300 return StatusCode::SUCCESS;
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));
328 updateBinHits(binHits,
i, lshift(hitMasks[
i],
m_shifts[iShift][
i]));
346 ATH_MSG_DEBUG(
"New Road: "<< layersHit(
r) <<
" lyrs, " <<
r.getNHits() <<
" hits :"
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)
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);
497 float r = hit->
getR();
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};
546 float dPhi = std::asin(fpgatracksim::A *
r *
qPt);
552 static 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,
", "));
566 static inline boost::dynamic_bitset<> lshift(boost::dynamic_bitset<>
const &
b,
int n)
568 if (
n < 0)
return rshift(
b, -
n);
572 static 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;
585 static 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++)
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",
626 std::vector<boost::dynamic_bitset<>> shiftedMasks;
628 shiftedMasks.push_back(lshift(hitMasks[
layer], shifts[
layer]));
635 std::stringstream
ss;
640 ss <<
"q/pT=" << qpt <<
"; ";
655 std::vector<int> d0shift;
656 for (
unsigned lyr = 0; lyr <
m_nLayers; lyr++) {
657 float phi_for_d0step = d0step/
m_r[lyr];
659 d0shift.push_back(shift);
670 std::vector<int> retv;
676 for (
unsigned i = 0;
i <
base.size();
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++;