11#include "GaudiKernel/MsgStream.h"
12#include "GaudiKernel/ITHistSvc.h"
88 ATH_MSG_INFO(
"Hough constants method needs idealized geometry > 0, aborting.");
89 return StatusCode::FAILURE;
115 ATH_MSG_ERROR(
"q/pt bin information not set in matrix element job options!");
116 return StatusCode::FAILURE;
125 return StatusCode::SUCCESS;
179 m_h_trackQoP_okHits =
new TH1I(
"h_trackQoP_okHits",
"half inverse pt of tracks passing hit check",
181 m_h_trackQoP_okRegion =
new TH1I(
"h_trackQoP_okRegion",
"half inverse pt of tracks passing region check",
183 m_h_nHit =
new TH1I(
"h_nHit",
"number of hits in sector", 100, 0, 100);
189 return StatusCode::SUCCESS;
196 hists[i]->Fill(pars[i]);
214 std::vector<FPGATrackSimTruthTrack> truth_tracks =
m_eventHeader->optional().getTruthTracks();
217 if (tracks.empty()) {
219 return StatusCode::SUCCESS;
222 std::map<int, std::vector<FPGATrackSimHit>> barcode_hits =
makeBarcodeMap(hits, tracks);
230 std::vector<FPGATrackSimHit> & sector_hits = barcode_hits[track.getBarcode()];
236 for (
int iSlice = 0; iSlice<nSlices; iSlice++){
239 for (
auto & iHit : sector_hits) {
258 std::vector<FPGATrackSimRoad> houghRoads;
261 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits;
263 ATH_MSG_DEBUG(
"Starting from some number of sector hits = " << sector_hits.size());
264 for (
const FPGATrackSimHit&
hit : sector_hits)
if (
hit.isMapped() &&
hit.isReal()) phits.emplace_back(std::make_shared<const FPGATrackSimHit>(
hit));
265 ATH_MSG_DEBUG(
"Passing nhits = " << phits.size() <<
" to road finder");
273 std::vector<FPGATrackSimTrack> tracks_1st;
279 ATH_MSG_DEBUG(
"We found " << tracks_1st.size() <<
" combinations");
281 for (
const auto& track_comb : tracks_1st) {
282 auto & track_hits_ptrs = track_comb.getFPGATrackSimHitPtrs();
289 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits_2nd;
292 for (
const auto&
hit : sector_hits) {
293 phits_2nd.push_back(std::make_shared<const FPGATrackSimHit>(
hit));
297 std::vector<FPGATrackSimRoad> roads_2nd;
301 std::vector<FPGATrackSimTrack> tracks_2nd;
304 auto & track_hits_2nd_ptrs = track_2nd.getFPGATrackSimHitPtrs();
307 acc.pars.qOverPt = track_2nd.getHoughY();
308 acc.pars.phi = track_2nd.getHoughX();
311 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits;
325 double y = track_comb.getHoughY();
326 double x = track_comb.getHoughX();
330 acc.pars.qOverPt =
y;
347 std::vector<std::shared_ptr<const FPGATrackSimHit>> sector_hits_ptrs;
348 sector_hits_ptrs.reserve(sector_hits.size());
350 auto owner = std::shared_ptr<const std::vector<FPGATrackSimHit>>(
352 [](
const std::vector<FPGATrackSimHit>*) {}
355 for (
const auto&
hit : sector_hits) {
357 sector_hits_ptrs.emplace_back(owner, &
hit);
377 return StatusCode::SUCCESS;
385 std::vector<FPGATrackSimHit> hits;
398 std::vector<FPGATrackSimCluster> clustered_hits;
404 std::vector<FPGATrackSimCluster> spacepoints;
410 std::vector<FPGATrackSimTowerInputHeader> towers = logicalHeader.
towers();
411 for (
auto &tower : towers) {
412 std::vector<FPGATrackSimHit>
const & towerHits = tower.hits();
424 std::vector<FPGATrackSimTruthTrack> training_tracks;
431 if (!(
m_EvtSel->passMatching(track)))
continue;
433 double pt = TMath::Sqrt(track.getPX()*track.getPX() + track.getPY()*track.getPY());
434 double pt_GeV = pt / 1000;
441 double c = track.getQ() /(2 * pt);
442 double eta = TMath::ASinH(track.getPZ() / pt);
443 double phi = TMath::ATan2(track.getPY(), track.getPX());
448 <<
" pdgcode = " << track.getPDGCode());
453 return training_tracks;
460 std::map<int, std::vector<FPGATrackSimHit>>
map;
464 map[track.getBarcode()] = std::vector<FPGATrackSimHit>();
469 int barcode =
hit.getTruth().best_barcode();
472 auto it =
map.find(barcode);
473 if (it !=
map.end()) (*it).second.push_back(
hit);
512 if (old_section == new_section) {
518 rmax = phi_max - phi_min;
524 rmax = phi_max - phi_min;
550 old_disk =
m_FPGATrackSimMapping->PlaneMap_1st(subregion)->getLayerInfo(layer, old_section).physDisk;
551 new_disk =
m_FPGATrackSimMapping->PlaneMap_1st(subregion)->getLayerInfo(layer, new_section).physDisk;
556 old_disk =
m_FPGATrackSimMapping->PlaneMap_2nd(subregion)->getLayerInfo(layer, old_section).physDisk;
557 new_disk =
m_FPGATrackSimMapping->PlaneMap_2nd(subregion)->getLayerInfo(layer, new_section).physDisk;
560 if (old_isEC != new_isEC) {
566 else if (old_disk == new_disk) {
568 ATH_MSG_DEBUG(
"Two modules hit in same physical disk " << old_disk);
573 ATH_MSG_DEBUG(
"Keeping the lower-z of the two disks (" << old_disk <<
", " << new_disk <<
") hit");
593 sector_hits.resize(nLayers, nohit);
594 std::vector<int> layer_count(nLayers);
597 if (!
hit.isReal() || !
hit.isMapped())
continue;
601 if (rmap->getRegions(
hit).size() == 0) {
604 int layer =
hit.getLayer();
605 if (layer_count[layer] == 0){
606 layer_count[layer]++;
607 sector_hits[layer] =
hit;
609 else if (layer_count[layer] == 1) {
610 layer_count[layer]++;
621 ATH_MSG_DEBUG(
"Too many hits on a plane, exiting filterHitsSec");
632 for (
int i = 0; i < nLayers; ++i)
634 if (layer_count[i] == 0)
644 if (sector_hits[i].isPixel()) {
651 ATH_MSG_DEBUG(
"Found " << num_sp <<
" spacepoints after removing duplicates.");
663 if (num_sp < minSpacePlusPixel) {
664 ATH_MSG_DEBUG(
"Not enough pixel hits + spacepoints (" << num_sp <<
" < " << minSpacePlusPixel <<
")");
676 std::vector<bool> region_mask(
m_nRegions,
true);
680 for (
int region = 0; region <
m_nRegions; region++) {
683 region_mask[region] =
false;
687 region_mask[region] =
false;
694 for (
int region = 0; region <
m_nRegions; region++) {
695 if (region_mask[region])
710 for (
auto module : modules) {
711 if (module == -1) nwc++;
715 for (
int layer = 0; layer < nLayers; layer++) {
717 std::vector<std::shared_ptr<const FPGATrackSimHit>> modified_hits = sector_hits;
720 ATH_MSG_DEBUG(
"Attempting to make wildcard in layer " << layer <<
", is1ststage = " << is1ststage);
721 auto wcHit = std::make_shared<FPGATrackSimHit>();
723 wcHit->setLayer(layer);
724 if (is1ststage) wcHit->setDetType(
m_FPGATrackSimMapping->PlaneMap_1st(subregion)->getDetType(layer));
727 modified_hits[layer] = std::move(wcHit);
730 std::shared_ptr<const FPGATrackSimHit> originalHit;
731 unsigned other_layer = 0;
733 other_layer = (sector_hits[layer]->getPhysLayer() % 2 == 0) ? layer + 1 : layer - 1;
734 originalHit = std::make_shared<FPGATrackSimHit>(sector_hits[other_layer]->getOriginalHit());
735 modified_hits[other_layer] = std::move(originalHit);
744 if (
sc != StatusCode::SUCCESS){
745 ATH_MSG_ERROR(
"FPGATrackSimMatrixGenAlgo::fillAccumulatorByDropping; makeAccumulator failed");
746 return StatusCode::FAILURE;
748 accumulate(
map, new_modules_acc.first, new_modules_acc.second);
751 return StatusCode::SUCCESS;
763 std::vector<module_t> modules(nLayers);
769 double qoverpt = track.getQ() / track.getPt();
781 std::string module_printout =
"";
782 for (
int i = 0; i < nLayers; i++)
784 if (sector_hits[i] && sector_hits[i]->isReal()) {
785 if (
m_single) modules[i] = sector_hits[i]->getIdentifierHash();
787 modules[i] = sectorbin;
793 module_printout += std::to_string(modules[i]) +
", ";
801 ATH_MSG_DEBUG(
"Generating track in sectorbin = " << sectorbin <<
" with modules: " << module_printout);
805 const int ToKeep[13] = {2200,2564,2861,3831,5368,14169,14173,20442,20446,29625,29629,42176,42180};
806 bool keepThis =
true;
807 for (
int i = 0; i < 13; i++) {
808 if (modules[i] != ToKeep[i] && modules[i] != -1) {
814 for (
int i = 0; i < 13; i++) modules[i] = -1;
817 for (
int i = 0; i < 13; i++) {
824 double y = accumulator.second.pars.qOverPt;
825 double x = accumulator.second.pars.phi;
828 std::vector<float> coords;
830 for (
int i = 0; i < nLayers; ++i) {
832 if (sector_hits[i] && sector_hits[i]->isReal()) {
837 int other_layer = (sector_hits[i]->getSide() == 0) ? i + 1 : i - 1;
843 std::vector<float> coords_tmp;
853 if (sector_hits[i]->getHitType() !=
HitType::spacepoint || sector_hits[i]->getSide() == 0) {
855 coords.push_back(coords_tmp[1]);
860 if (sector_hits[i]->getDim() == 2 || (sector_hits[i]->getHitType() ==
HitType::spacepoint && (sector_hits[i]->getPhysLayer() % 2) == 1)) {
862 coords.push_back(coords_tmp[0]);
866 if (pmap->
getDim(i) == 2) {
873 assert(coords.size() == (
size_t)nDim);
874 acc.hit_coords = coords;
875 acc.hit_coordsG = coords;
878 acc.pars = track.getPars();
880 acc.pars.qOverPt = (
y / 1000.0) - track.getQOverPt();
881 acc.pars.phi =
x - track.getPhi();
887 acc.track_bins.push_back(
bins);
891 while (acc.pars.phi < 0) acc.pars.phi += 2*
M_PI;
892 while (acc.pars.phi > 2*
M_PI) acc.pars.phi -= 2*
M_PI;
896 for (
int i = 0; i < nDim; i++)
898 acc.hit_x_QoP[i] = coords[i] * acc.pars.qOverPt;
899 acc.hit_xG_HIP[i] = coords[i] * acc.pars.qOverPt;
900 acc.hit_x_d0[i] = coords[i] * acc.pars.d0;
901 acc.hit_x_z0[i] = coords[i] * acc.pars.z0;
902 acc.hit_x_eta[i] = coords[i] * acc.pars.eta;
903 acc.hit_xG_eta[i] = coords[i] * acc.pars.eta;
904 acc.hit_x_phi[i] = coords[i] * acc.pars.phi;
906 for (
int j = i; j < nDim; j++)
907 acc.covariance[i * nDim + j] = coords[i] * coords[j];
909 for (
int j = i; j < nDim; j++)
910 acc.covarianceG[i * nDim + j] = coords[i] * coords[j];
913 accumulator = {modules, acc};
914 return StatusCode::SUCCESS;
931 for (
int region = 0; region <
m_nRegions; region++) {
933 std::stringstream name;
934 std::stringstream title;
935 name <<
"am" << region;
936 title <<
"Ambank " << region <<
" parameters";
937 TTree*
tree =
new TTree(name.str().c_str(), title.str().c_str());
945 double coverage = sector_info.second.track_bins.size();
954 return StatusCode::SUCCESS;
960 TTree* sliceTree =
new TTree(
"slice",
"Region slice boundaries");
962 sliceTree->Branch(
"c_max", &
m_sliceMax.qOverPt);
964 sliceTree->Branch(
"phi_max", &
m_sliceMax.phi);
966 sliceTree->Branch(
"eta_max", &
m_sliceMax.eta);
968 sliceTree->Branch(
"c_min", &
m_sliceMin.qOverPt);
970 sliceTree->Branch(
"phi_min", &
m_sliceMin.phi);
972 sliceTree->Branch(
"eta_min", &
m_sliceMin.eta);
974 sliceTree->Branch(
"c_slices", &
m_nBins.qOverPt);
975 sliceTree->Branch(
"d0_slices", &
m_nBins.d0);
976 sliceTree->Branch(
"phi_slices", &
m_nBins.phi);
977 sliceTree->Branch(
"z0_slices", &
m_nBins.z0);
978 sliceTree->Branch(
"eta_slices", &
m_nBins.eta);
980 StatusCode
sc =
m_tHistSvc->regTree(
"/TRIGFPGATrackSimMATRIXOUT/slice",sliceTree);
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
std::vector< float > computeIdealCoords(const FPGATrackSimHit &hit, const double hough_x, const double hough_y, const double target_r, const bool doDeltaGPhis, const TrackCorrType trackCorrType)
void roadsToTrack(std::vector< FPGATrackSimRoad > &roads, std::vector< FPGATrackSimTrack > &track_cands, const FPGATrackSimPlaneMap *pmap)
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
Helper struct for accumulating sector information for matrix generation.
std::unordered_map< std::vector< module_t >, FPGATrackSimMatrixAccumulator, container_hash< std::vector< module_t > > > AccumulateMap
void fillTrackPars(TH1I *const hists[FPGATrackSimTrackPars::NPARS], FPGATrackSimTruthTrack const &track)
Algorithm to generate matrix files, to be used for sector and constant generation.
void fillTree(AccumulateMap &map, TTree *tree, int nLayers, int nCoords)
Writes the contents of an AccumulateMap into the supplied tree (one entry per sector).
Stores slice definitions for FPGATrackSim regions.
static const std::vector< std::string > bins
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
bool msgLvl(const MSG::Level lvl) const
void setHitType(HitType type)
int getEtaModule(bool old=false) const
unsigned getPhiModule() const
unsigned getSection() const
HitType getHitType() const
Gaudi::Property< int > m_ideal_geom
ToolHandle< FPGATrackSimRawToLogicalHitsTool > m_hitMapTool
std::map< int, std::vector< FPGATrackSimHit > > makeBarcodeMap(std::vector< FPGATrackSimHit > const &hits, std::vector< FPGATrackSimTruthTrack > const &tracks) const
Gaudi::Property< float > m_temp_c_max
FPGATrackSimMatrixGenAlgo(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< bool > m_doDeltaPhiConsts
StatusCode initialize() override
StatusCode bookHistograms()
Gaudi::Property< float > m_temp_d0_max
Gaudi::Property< bool > m_single
TH1I * m_h_trackQoP_okRegion
const FPGATrackSimPlaneMap * m_pmap_2nd
std::vector< FPGATrackSimTruthTrack > filterTrainingTracks(std::vector< FPGATrackSimTruthTrack > const &truth_tracks) const
Gaudi::Property< std::vector< double > > m_qOverPtBins
Gaudi::Property< float > m_temp_phi_max
Gaudi::Property< int > m_temp_z0_slices
Gaudi::Property< float > m_PT_THRESHOLD
Gaudi::Property< int > m_temp_d0_slices
Gaudi::Property< int > m_temp_eta_slices
TH1I * m_h_trainingTrack[FPGATrackSimTrackPars::NPARS]
Gaudi::Property< int > m_temp_phi_slices
ToolHandle< FPGATrackSimRoadUnionTool > m_roadFinderTool
Gaudi::Property< float > m_temp_c_min
Gaudi::Property< float > m_temp_z0_max
Gaudi::Property< float > m_temp_eta_min
FPGATrackSimTrackParsI m_nBins
Gaudi::Property< float > m_D0_THRESHOLD
StatusCode makeAccumulator(std::vector< std::shared_ptr< const FPGATrackSimHit > > const §or_hits, FPGATrackSimTruthTrack const &track, std::pair< std::vector< module_t >, FPGATrackSimMatrixAccumulator > &accumulator) const
Gaudi::Property< bool > m_doSpacePoints
Gaudi::Property< int > m_TRAIN_PDG
Gaudi::Property< bool > m_absQOverPtBinning
FPGATrackSimTrackPars m_sliceMin
Gaudi::Property< float > m_temp_phi_min
Gaudi::Property< float > m_temp_z0_min
ToolHandle< FPGATrackSimClusteringToolI > m_clusteringTool
ToolHandle< FPGATrackSimOverlapRemovalTool > m_overlapRemovalTool
StatusCode fillAccumulatorByDropping(std::vector< std::shared_ptr< const FPGATrackSimHit > > const §or_hits, bool is1ststage, double x, double y, std::vector< module_t > &modules, AccumulateMap &map, FPGATrackSimTruthTrack const &track, int subregion) const
TH1I * m_h_trackQoP_okHits
StatusCode finalize() override
Gaudi::Property< bool > m_doClustering
FPGATrackSimTrackPars m_sliceMax
TH1I * m_h_notEnoughHits[FPGATrackSimTrackPars::NPARS]
Gaudi::Property< int > m_minSpacePlusPixel
const FPGATrackSimPlaneMap * m_pmap_1st
TH1I * m_h_sectorPars[FPGATrackSimTrackPars::NPARS]
std::vector< FPGATrackSimHit > getLogicalHits()
TH1I * m_h_3hitsInLayer[FPGATrackSimTrackPars::NPARS]
FPGATrackSimEventInputHeader * m_eventHeader
ToolHandle< FPGATrackSimTrackFitterTool > m_trackFitterTool_1st
ServiceHandle< ITHistSvc > m_tHistSvc
selectHit_returnCode selectHit(FPGATrackSimHit const &old_hit, FPGATrackSimHit const &new_hit, bool is1ststage, int subregion) const
StatusCode execute() override
std::vector< AccumulateMap > m_sector_cum
Gaudi::Property< float > m_temp_d0_min
Gaudi::Property< int > m_nRegions
Gaudi::Property< bool > m_dropHitsAndFill
Gaudi::Property< int > m_temp_c_slices
ToolHandle< IFPGATrackSimTrackExtensionTool > m_trackExtensionTool
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
Gaudi::Property< bool > m_doHoughConstants
ServiceHandle< IFPGATrackSimEventSelectionSvc > m_EvtSel
int getRegion(std::vector< FPGATrackSimHit > const &hits, bool is1ststage) const
bool filterSectorHits(std::vector< FPGATrackSimHit > const &all_hits, std::vector< FPGATrackSimHit > §or_hits, FPGATrackSimTruthTrack const &t, bool is1ststage, int subregion) const
Gaudi::Property< float > m_temp_eta_max
TH1I * m_h_SHfailure[FPGATrackSimTrackPars::NPARS]
Gaudi::Property< int > m_MaxWC
ToolHandle< FPGATrackSimSpacePointsToolI > m_spacePointsTool
Gaudi::Property< bool > m_doSecondStage
ToolHandle< IFPGATrackSimInputTool > m_hitInputTool
uint32_t getDim(size_t logiLayer) const
void map(FPGATrackSimHit &hit) const
static std::string parName(unsigned i)
int generations(const T &p)
Method to return how many interactions a particle has undergone during simulation (TODO migrate to be...
constexpr int QPT_SECTOR_OFFSET
constexpr int SPACEPOINT_SECTOR_OFFSET
FPGATrackSimTrackPars pars