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());
353 auto owner = std::shared_ptr<const std::vector<FPGATrackSimHit>>(
355 [](
const std::vector<FPGATrackSimHit>*) {}
358 for (
const auto& hit : sector_hits) {
360 sector_hits_ptrs.emplace_back(owner, &hit);
380 return StatusCode::SUCCESS;
388 std::vector<FPGATrackSimHit> hits;
401 std::vector<FPGATrackSimCluster> clustered_hits;
407 std::vector<FPGATrackSimCluster> spacepoints;
413 std::vector<FPGATrackSimTowerInputHeader> towers = logicalHeader.
towers();
414 for (
auto &tower : towers) {
415 std::vector<FPGATrackSimHit>
const & towerHits = tower.hits();
427 std::vector<FPGATrackSimTruthTrack> training_tracks;
434 if (!(
m_EvtSel->passMatching(track)))
continue;
436 double pt = TMath::Sqrt(track.getPX()*track.getPX() + track.getPY()*track.getPY());
437 double pt_GeV = pt / 1000;
444 double c = track.getQ() /(2 * pt);
445 double eta = TMath::ASinH(track.getPZ() / pt);
446 double phi = TMath::ATan2(track.getPY(), track.getPX());
451 <<
" pdgcode = " << track.getPDGCode());
456 return training_tracks;
463 std::map<int, std::vector<FPGATrackSimHit>>
map;
467 map[track.getBarcode()] = std::vector<FPGATrackSimHit>();
472 int barcode = hit.getTruth().best_barcode();
475 auto it =
map.find(barcode);
476 if (it !=
map.end()) (*it).second.push_back(hit);
515 if (old_section == new_section) {
521 rmax = phi_max - phi_min;
527 rmax = phi_max - phi_min;
553 old_disk =
m_FPGATrackSimMapping->PlaneMap_1st(subregion)->getLayerInfo(layer, old_section).physDisk;
554 new_disk =
m_FPGATrackSimMapping->PlaneMap_1st(subregion)->getLayerInfo(layer, new_section).physDisk;
559 old_disk =
m_FPGATrackSimMapping->PlaneMap_2nd(subregion)->getLayerInfo(layer, old_section).physDisk;
560 new_disk =
m_FPGATrackSimMapping->PlaneMap_2nd(subregion)->getLayerInfo(layer, new_section).physDisk;
563 if (old_isEC != new_isEC) {
569 else if (old_disk == new_disk) {
571 ATH_MSG_DEBUG(
"Two modules hit in same physical disk " << old_disk);
576 ATH_MSG_DEBUG(
"Keeping the lower-z of the two disks (" << old_disk <<
", " << new_disk <<
") hit");
596 sector_hits.resize(nLayers, nohit);
597 std::vector<int> layer_count(nLayers);
600 if (!hit.isReal() || !hit.isMapped())
continue;
604 if (rmap->getRegions(hit).size() == 0) {
607 int layer = hit.getLayer();
608 if (layer_count[layer] == 0){
609 layer_count[layer]++;
610 sector_hits[layer] = hit;
612 else if (layer_count[layer] == 1) {
613 layer_count[layer]++;
624 ATH_MSG_DEBUG(
"Too many hits on a plane, exiting filterHitsSec");
635 for (
int i = 0; i < nLayers; ++i)
637 if (layer_count[i] == 0)
647 if (sector_hits[i].isPixel()) {
654 ATH_MSG_DEBUG(
"Found " << num_sp <<
" spacepoints after removing duplicates.");
666 if (num_sp < minSpacePlusPixel) {
667 ATH_MSG_DEBUG(
"Not enough pixel hits + spacepoints (" << num_sp <<
" < " << minSpacePlusPixel <<
")");
679 std::vector<bool> region_mask(
m_nRegions,
true);
683 for (
int region = 0; region <
m_nRegions; region++) {
686 region_mask[region] =
false;
690 region_mask[region] =
false;
697 for (
int region = 0; region <
m_nRegions; region++) {
698 if (region_mask[region])
713 for (
auto module : modules) {
714 if (module == -1) nwc++;
718 for (
int layer = 0; layer < nLayers; layer++) {
720 std::vector<std::shared_ptr<const FPGATrackSimHit>> modified_hits = sector_hits;
723 ATH_MSG_DEBUG(
"Attempting to make wildcard in layer " << layer <<
", is1ststage = " << is1ststage);
724 auto wcHit = std::make_shared<FPGATrackSimHit>();
726 wcHit->setLayer(layer);
727 if (is1ststage) wcHit->setDetType(
m_FPGATrackSimMapping->PlaneMap_1st(subregion)->getDetType(layer));
730 modified_hits[layer] = std::move(wcHit);
733 std::shared_ptr<const FPGATrackSimHit> originalHit;
736 other_layer = (sector_hits[layer]->getPhysLayer() % 2 == 0) ? layer + 1 : layer - 1;
738 ATH_MSG_ERROR(
"FPGATrackSimMatrixGenAlgo::fillAccumulatorByDropping: layer index is negative.");
741 originalHit = std::make_shared<FPGATrackSimHit>(sector_hits[other_layer]->getOriginalHit());
742 modified_hits[other_layer] = std::move(originalHit);
751 if (
sc != StatusCode::SUCCESS){
752 ATH_MSG_ERROR(
"FPGATrackSimMatrixGenAlgo::fillAccumulatorByDropping; makeAccumulator failed");
753 return StatusCode::FAILURE;
755 accumulate(
map, new_modules_acc.first, new_modules_acc.second);
758 return StatusCode::SUCCESS;
770 std::vector<module_t> modules(nLayers);
776 double qoverpt = track.getQ() / track.getPt();
788 std::string module_printout =
"";
789 for (
int i = 0; i < nLayers; i++)
791 if (sector_hits[i] && sector_hits[i]->isReal()) {
792 if (
m_single) modules[i] = sector_hits[i]->getIdentifierHash();
794 modules[i] = sectorbin;
800 module_printout += std::to_string(modules[i]) +
", ";
808 ATH_MSG_DEBUG(
"Generating track in sectorbin = " << sectorbin <<
" with modules: " << module_printout);
812 const int ToKeep[13] = {2200,2564,2861,3831,5368,14169,14173,20442,20446,29625,29629,42176,42180};
813 bool keepThis =
true;
814 for (
int i = 0; i < 13; i++) {
815 if (modules[i] != ToKeep[i] && modules[i] != -1) {
821 for (
int i = 0; i < 13; i++) modules[i] = -1;
824 for (
int i = 0; i < 13; i++) {
831 double y = accumulator.second.pars.qOverPt;
832 double x = accumulator.second.pars.phi;
835 std::vector<float> coords;
837 for (
int i = 0; i < nLayers; ++i) {
839 if (sector_hits[i] && sector_hits[i]->isReal()) {
844 int other_layer = (sector_hits[i]->getSide() == 0) ? i + 1 : i - 1;
850 std::vector<float> coords_tmp;
860 if (sector_hits[i]->getHitType() !=
HitType::spacepoint || sector_hits[i]->getSide() == 0) {
862 coords.push_back(coords_tmp[1]);
867 if (sector_hits[i]->getDim() == 2 || (sector_hits[i]->getHitType() ==
HitType::spacepoint && (sector_hits[i]->getPhysLayer() % 2) == 1)) {
869 coords.push_back(coords_tmp[0]);
873 if (pmap->
getDim(i) == 2) {
880 assert(coords.size() == (
size_t)nDim);
881 acc.hit_coords = coords;
882 acc.hit_coordsG = coords;
885 acc.pars = track.getPars();
887 acc.pars.qOverPt = (
y / 1000.0) - track.getQOverPt();
888 acc.pars.phi =
x - track.getPhi();
894 acc.track_bins.push_back(
bins);
898 while (acc.pars.phi < 0) acc.pars.phi += 2*
M_PI;
899 while (acc.pars.phi > 2*
M_PI) acc.pars.phi -= 2*
M_PI;
903 for (
int i = 0; i < nDim; i++)
905 acc.hit_x_QoP[i] = coords[i] * acc.pars.qOverPt;
906 acc.hit_xG_HIP[i] = coords[i] * acc.pars.qOverPt;
907 acc.hit_x_d0[i] = coords[i] * acc.pars.d0;
908 acc.hit_x_z0[i] = coords[i] * acc.pars.z0;
909 acc.hit_x_eta[i] = coords[i] * acc.pars.eta;
910 acc.hit_xG_eta[i] = coords[i] * acc.pars.eta;
911 acc.hit_x_phi[i] = coords[i] * acc.pars.phi;
913 for (
int j = i; j < nDim; j++)
914 acc.covariance[i * nDim + j] = coords[i] * coords[j];
916 for (
int j = i; j < nDim; j++)
917 acc.covarianceG[i * nDim + j] = coords[i] * coords[j];
920 accumulator = {modules, acc};
921 return StatusCode::SUCCESS;
938 for (
int region = 0; region <
m_nRegions; region++) {
940 std::stringstream name;
941 std::stringstream title;
942 name <<
"am" << region;
943 title <<
"Ambank " << region <<
" parameters";
944 TTree*
tree =
new TTree(name.str().c_str(), title.str().c_str());
952 double coverage = sector_info.second.track_bins.size();
961 return StatusCode::SUCCESS;
967 TTree* sliceTree =
new TTree(
"slice",
"Region slice boundaries");
969 sliceTree->Branch(
"c_max", &
m_sliceMax.qOverPt);
971 sliceTree->Branch(
"phi_max", &
m_sliceMax.phi);
973 sliceTree->Branch(
"eta_max", &
m_sliceMax.eta);
975 sliceTree->Branch(
"c_min", &
m_sliceMin.qOverPt);
977 sliceTree->Branch(
"phi_min", &
m_sliceMin.phi);
979 sliceTree->Branch(
"eta_min", &
m_sliceMin.eta);
981 sliceTree->Branch(
"c_slices", &
m_nBins.qOverPt);
982 sliceTree->Branch(
"d0_slices", &
m_nBins.d0);
983 sliceTree->Branch(
"phi_slices", &
m_nBins.phi);
984 sliceTree->Branch(
"z0_slices", &
m_nBins.z0);
985 sliceTree->Branch(
"eta_slices", &
m_nBins.eta);
987 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
size_t size() const
Number of registered mappings.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
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
StatusCode execute(const EventContext &ctx) override
Execute method.
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
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