25 #include <nlohmann/json.hpp>
34 static inline std::string
to_string(
const std::vector<T>&
v)
36 std::ostringstream oss;
40 std::copy(
v.begin(),
v.end() - 1, std::ostream_iterator<T>(oss,
", "));
50 os <<
"lyr: " << hit.
layer <<
" ";
51 os <<
"(" << hit.
hitptr->getR() <<
", " << hit.
hitptr->getGPhi() <<
", " << hit.
hitptr->getZ() <<
") ";
63 declareInterface<IFPGATrackSimRoadFinderTool>(
this);
70 const std::vector<Gaudi::Details::PropertyBase*> props = this->getProperties();
71 for( Gaudi::Details::PropertyBase* prop : props ) {
72 if (prop->ownerTypeName()==this->type()) {
73 ATH_MSG_DEBUG(
"Property:\t" << prop->name() <<
"\t : \t" << prop->toString());
112 return StatusCode::FAILURE;
129 return StatusCode::FAILURE;
159 return StatusCode::SUCCESS;
175 if (((lyrhit >> hit.
layer) & 0
x1) == 0x0)
177 lyrhit |= (0x1 << hit.
layer);
186 std::vector<std::shared_ptr<const FPGATrackSimRoad>> &roads)
212 std::vector<HitPairSet> pairsets;
230 if (pairsets.size() >1) {
234 s +=
"(" + std::to_string(hit->
layer) +
"," + std::to_string(hit->
hitptr->getR()) +
"), ";
243 for (
auto &
r :
m_roads) roads.push_back(std::move(
r));
255 return StatusCode::SUCCESS;
264 for (
const std::shared_ptr<const FPGATrackSimHit>& hit :
hits)
279 if (!slicebin.data())
continue;
297 if (!scanbin.data())
continue;
303 std::pair<unsigned, unsigned> rowRange =
m_binning->idxsetToRowParBinRange(
idx, hit.get());
306 for (
unsigned rowbin = rowRange.first; rowbin < rowRange.second; rowbin++)
317 s_hit.
layer = hit->getLayer();
328 ATH_MSG_DEBUG(
"Hit missed layer map bin=" <<
idx <<
" hash=" << hit->getIdentifierHash());
343 return StatusCode::SUCCESS;
348 std::vector<HitPairSet> &output_pairsets)
353 std::vector<std::vector<const StoredHit *>> hitsByLayer(
m_nLayers);
373 if (passedPairFilter)
376 std::vector<HitPairSet> pairsets;
386 output_pairsets.push_back(pairset);
395 output_pairsets.push_back(
pairs);
400 output_pairsets.push_back(filteredpairs);
403 return StatusCode::SUCCESS;
410 const std::vector<const StoredHit *>& newhits)
414 std::vector<bool> pairset_used(inputstate.
pairsets.size(),
false);
416 for (
auto &newhit : newhits) {
419 std::set<const StoredHit *> vetoList;
422 for (
auto &pairset : inputstate.
pairsets) {
427 outputstate.
pairsets.push_back(newset);
429 for (
auto vetohit : pairset.hitlist) {
430 vetoList.insert(vetohit);
437 if (vetoList.count(prevhit) == 0) {
442 outputstate.
pairsets.push_back(newset);
449 if (lyridx <= allowed_missed_hits) {
458 for (
auto &pairset : inputstate.
pairsets) {
459 if (lyridx < (pairset.hitlist.size() + allowed_missed_hits)) {
460 outputstate.
pairsets.push_back(pairset);
476 if (lyridx > allowed_missed_hits) {
489 std::vector<HitPairSet> &output_pairsets)
494 std::vector<std::vector<const StoredHit *>> hitsByLayer(
m_nLayers);
502 for (
unsigned lyridx = 0; lyridx <
m_nLayers; lyridx++) {
512 return StatusCode::SUCCESS;
518 std::vector<std::vector<const StoredHit *>>& hitsByLayer)
524 hitsByLayer[hit.
layer].push_back(&hit);
527 return StatusCode::SUCCESS;
540 std::vector<const FPGATrackSimGenScanTool::StoredHit *>
const * lastlyr = 0;
541 std::vector<const FPGATrackSimGenScanTool::StoredHit *>
const * lastlastlyr = 0;
559 lastlastlyr = lastlyr;
560 lastlyr = &hitsByLayer[lyr];
564 return StatusCode::SUCCESS;
572 int lyr =
std::min(pair.first->layer,pair.second->layer);
590 return StatusCode::SUCCESS;
596 std::vector<HitPairSet> &pairsets,
606 if ((std::abs(pair.second->layer - pair.first->layer) > 1)
607 && (pairset.hasLayer(
std::min(pair.first->layer,pair.second->layer) + 1)))
621 int size = pairset.addPair(pair);
623 ATH_MSG_VERBOSE(
"addPair " << pairsets.size() <<
" " << pairset.pairList.size() <<
" " <<
size);
634 pairsets.push_back(newpairset);
638 return StatusCode::SUCCESS;
653 cutvar(std::string
name,
double val,
double cut, std::vector<TH1D *>& histset) :
655 bool passed() {
return std::abs(m_val) < m_cut; }
656 void fill(
unsigned cat) { m_histset[cat]->Fill(m_val); }
660 std::vector<TH1D *> &m_histset;
664 std::vector<cutvar> allcuts;
665 allcuts.push_back(cutvar(
"MatchPhi", pairset.
MatchPhi(pair),
668 allcuts.push_back(cutvar(
"MatchEta", pairset.
MatchEta(pair),
671 allcuts.push_back(cutvar(
"DeltaDeltaPhi", pairset.
DeltaDeltaPhi(pair),
674 allcuts.push_back(cutvar(
"DeltaDeltaEta", pairset.
DeltaDeltaEta(pair),
677 allcuts.push_back(cutvar(
"PhiCurvature", pairset.
PhiCurvature(pair),
680 allcuts.push_back(cutvar(
"EtaCurvature", pairset.
EtaCurvature(pair),
684 allcuts.push_back(cutvar(
687 allcuts.push_back(cutvar(
691 allcuts.push_back(cutvar(
694 allcuts.push_back(cutvar(
699 unsigned passedCuts = std::count_if(allcuts.begin(), allcuts.end(),
700 [](cutvar&
cut) { return cut.passed(); });
701 bool passedAll = (passedCuts == allcuts.size());
704 bool passedAllButOne = (passedCuts == allcuts.size() - 1);
705 for (cutvar&
cut: allcuts) {
709 (passedAll || (passedAllButOne && !
cut.passed())));
715 for (cutvar &
cut : allcuts)
717 s +=
cut.m_name +
" : (" +
cut.passed() +
", " +
cut.m_val +
"), ";
721 << *pairset.
lastpair().second <<
"\n "
722 << *pair.first <<
"\n "
733 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>
734 sorted_hits(
m_nLayers,std::vector<std::shared_ptr<const FPGATrackSimHit>>());
737 hitLayers |= 1 << hit->layer;
738 sorted_hits[hit->layer].push_back(hit->hitptr);
741 m_roads.emplace_back(std::make_unique<FPGATrackSimRoad>());
746 r->setHits(std::move(sorted_hits));
753 r->setHitLayers(hitLayers);
772 if (pairList.size() > 0)
775 LastPhiCurvature = PhiCurvature(pair);
776 LastEtaCurvature = EtaCurvature(pair);
779 pairList.push_back(pair);
781 hitLayers |= (0x1 << pair.first->layer);
782 hitLayers |= (0x1 << pair.second->layer);
783 if (!hasHit(pair.first))
784 hitlist.push_back(pair.first);
785 if (!hasHit(pair.second))
786 hitlist.push_back(pair.second);
787 return this->pairList.size();
793 if ((lastpair().
first->hitptr==pair.first->hitptr)||
794 (lastpair().
first->hitptr==pair.second->hitptr)||
795 (lastpair().
second->hitptr==pair.first->hitptr)||
796 (lastpair().
second->hitptr==pair.second->hitptr))
799 double dr = (lastpair().second->hitptr->getR() - pair.first->hitptr->getR()) / 2.0;
800 double lastpairextrap = lastpair().second->phiShift - lastpair().dPhi() / lastpair().dR() *
dr;
801 double newpairextrap = pair.first->phiShift + pair.
dPhi() / pair.
dR() *
dr;
802 return lastpairextrap - newpairextrap;
807 if ((lastpair().
first->hitptr==pair.first->hitptr)||
808 (lastpair().
first->hitptr==pair.second->hitptr)||
809 (lastpair().
second->hitptr==pair.first->hitptr)||
810 (lastpair().
second->hitptr==pair.second->hitptr))
813 double dr = (lastpair().second->hitptr->getR() - pair.first->hitptr->getR()) / 2.0;
814 double lastpairextrap = lastpair().second->etaShift - lastpair().dEta() / lastpair().dR() *
dr;
815 double newpairextrap = pair.first->etaShift + pair.
dEta() / pair.
dR() *
dr;
816 return lastpairextrap - newpairextrap;
821 return (pair.
dPhi() * lastpair().dR() - lastpair().
dPhi() * pair.
dR()) / (lastpair().dR() * pair.
dR());
826 return (pair.
dEta() * lastpair().dR() - lastpair().
dEta() * pair.
dR()) / (lastpair().dR() * pair.
dR());
831 return 2 * DeltaDeltaPhi(pair) / (lastpair().dR() + pair.
dR());
835 return 2 * DeltaDeltaEta(pair) / (lastpair().dR() + pair.
dR());
839 return PhiCurvature(pair) - LastPhiCurvature;
843 return EtaCurvature(pair) - LastEtaCurvature;
848 return lastpair().PhiInExtrap(r_in) + 0.5 * PhiCurvature(pair) * (r_in -
r) * (r_in -
r);
853 return pair.
PhiOutExtrap(r_out) + 0.5 * PhiCurvature(pair) * (r_out -
r) * (r_out -
r);
891 min_padded[
par] *= 1000;
892 max_padded[
par] *= 1000;
895 <<
" min=" << min_padded[
par] <<
" max=" << max_padded[
par]);
902 std::vector<FPGATrackSimGenScanBinningBase::ParSet> parsets =
m_binning->makeVariationSet(std::vector<unsigned>({0,1,2,3,4}),
bin.idx());
923 if (
bin.data() ==
false)
926 <<
" minvals: " << minvals <<
" maxvals: " << maxvals );
939 std::vector <std::set<unsigned> >(5,std::set<unsigned>()));
941 std::map <unsigned,unsigned>());
943 for (
auto &binelem :
data) {
944 std::vector<unsigned>
bin;
945 binelem.at(
"bin").get_to(
bin);
946 auto& lyrmap = binelem[
"lyrmap"];
949 for (
auto &lyrelem : lyrmap) {
951 lyrelem.at(
"lyr").get_to(lyr);
988 ATH_MSG_INFO(
"Valid Bins: " << validBins <<
" valid slices: " << validSlices
989 <<
" valid scans: " << validScans);