ATLAS Offline Software
Functions
FPGATrackSimLayerStudyTool.cxx File Reference
#include "FPGATrackSimBinning/FPGATrackSimLayerStudyTool.h"
#include "AthenaBaseComps/AthMsgStreamMacros.h"
#include "FPGATrackSimBinning/IFPGATrackSimBinDesc.h"
#include "FPGATrackSimBinning/FPGATrackSimBinUtil.h"
#include "FPGATrackSimBinning/FPGATrackSimBinnedHits.h"
#include "FPGATrackSimObjects/FPGATrackSimTrackPars.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TTree.h"
#include <algorithm>
#include <bit>
#include <numbers>

Go to the source code of this file.

Functions

void FPGATrackSimLayerStudyTool::fillBinLevelOutput ATLAS_NOT_THREAD_SAFE (const FPGATrackSimBinUtil::IdxSet &idx, const FPGATrackSimBinnedHits::BinEntry &data)
 
void FPGATrackSimLayerStudyTool::fillBinningSummary ATLAS_NOT_THREAD_SAFE (const std::vector< std::shared_ptr< const FPGATrackSimHit >> &hits)
 
void FPGATrackSimLayerStudyTool::parseTruthInfo ATLAS_NOT_THREAD_SAFE (std::vector< FPGATrackSimTruthTrack > const &truthtracks)
 

Function Documentation

◆ ATLAS_NOT_THREAD_SAFE() [1/3]

void FPGATrackSimLayerStudyTool::fillBinLevelOutput ATLAS_NOT_THREAD_SAFE ( const FPGATrackSimBinUtil::IdxSet idx,
const FPGATrackSimBinnedHits::BinEntry data 
)

Definition at line 170 of file FPGATrackSimLayerStudyTool.cxx.

172 {
173  setBinPlotsActive(idx);
174 
175  // fill all truth
176  m_ptDist[0]->Fill(std::abs(1/m_truthpars.qOverPt));
177  m_etaDist[0]->Fill(1/m_truthpars.eta);
178  m_phiDist[0]->Fill(1/m_truthpars.phi);
179  m_d0Dist[0]->Fill(1/m_truthpars.d0);
180  m_z0Dist[0]->Fill(1/m_truthpars.z0);
181 
182  if (m_binPlotsActive) {
183  for (auto& hit : data.hits) {
184  m_phiShift_road->Fill(hit.phiShift);
185  m_etaShift_road->Fill(hit.etaShift);
186  m_phiShift2D_road->Fill(hit.phiShift, hit.hitptr->getR());
187  m_etaShift2D_road->Fill(hit.etaShift, hit.hitptr->getR());
188  }
189 
190  // fill param monitoring
191  for (int i = 0; i < 2; i++) {
192  // i=0 all, i=1 no missed layers, i=2 is one missed layer
193  if ((i == 0)|| (data.lyrCnt() >= m_binnedhits->getNLayers() - (i - 1))) {
194  // all layer hit
195  m_ptDist[i]->Fill(std::abs(1 / m_truthpars.qOverPt));
196  m_etaDist[i]->Fill(1 / m_truthpars.eta);
197  m_phiDist[i]->Fill(1 / m_truthpars.phi);
198  m_d0Dist[i]->Fill(1 / m_truthpars.d0);
199  m_z0Dist[i]->Fill(1 / m_truthpars.z0);
200  }
201  }
202 
203  // Module mapping and Layer definition studies
204  // first sort hits by r+z radii
205  std::vector<FPGATrackSimBinUtil::StoredHit> sorted_hits = data.hits;
206  std::sort(sorted_hits.begin(), sorted_hits.end(),
207  [](const auto &hit1, const auto &hit2) {
208  return hit1.rzrad() < hit2.rzrad();
209  });
210 
211  // Fill tree
212  m_bin_tree_bin = std::vector<unsigned>(idx);
213  ClearTreeVectors();
214  for (auto &hit : sorted_hits) {
215 
216  m_bin_tree_r.push_back(hit.hitptr->getR());
217  m_bin_tree_z.push_back(hit.hitptr->getZ());
218  m_bin_tree_id.push_back(hit.hitptr->getIdentifier());
219  m_bin_tree_hash.push_back(hit.hitptr->getIdentifierHash());
220  m_bin_tree_layer.push_back(hit.hitptr->getLayerDisk());
221  m_bin_tree_side.push_back(hit.hitptr->getSide());
222  m_bin_tree_etamod.push_back(hit.hitptr->getEtaModule());
223  m_bin_tree_phimod.push_back(hit.hitptr->getPhiModule());
224  m_bin_tree_dettype.push_back((int)hit.hitptr->getDetType());
225  m_bin_tree_detzone.push_back((int)hit.hitptr->getDetectorZone());
226  }
227  m_bin_tree->Fill();
228  m_binsFilledCnt++;
229  }
230 }

◆ ATLAS_NOT_THREAD_SAFE() [2/3]

void FPGATrackSimLayerStudyTool::fillBinningSummary ATLAS_NOT_THREAD_SAFE ( const std::vector< std::shared_ptr< const FPGATrackSimHit >> &  hits)

Definition at line 232 of file FPGATrackSimLayerStudyTool.cxx.

234 {
235  m_inputHits->Fill(hits.size());
236 
237  for (auto &step : m_binnedhits->getBinTool().steps()) {
238  for (auto bin : m_binnedhits->binnedHits()[step->stepNum()])
239  m_hitsPerStepBin[step->stepNum()]->Fill(bin.data().hitCnt);
240  }
241 
242  for (auto bin :m_binnedhits->binnedHits()[m_binnedhits->getBinTool().lastStep()->stepNum()]) {
243  for (unsigned lyr = 0; lyr < m_binnedhits->getNLayers(); lyr++) {
244  unsigned cnt = bin.data().hitsInLyr(lyr);
245  m_hitsPerLayer->Fill(lyr, cnt);
246  m_hitsPerLayer2D->Fill(lyr, cnt);
247  }
248  }
249 
250  m_binsFilled->Fill(m_binsFilledCnt);
251  m_binsFilledCnt=0;
252 
253 }

◆ ATLAS_NOT_THREAD_SAFE() [3/3]

void FPGATrackSimLayerStudyTool::parseTruthInfo ATLAS_NOT_THREAD_SAFE ( std::vector< FPGATrackSimTruthTrack > const truthtracks)

Definition at line 284 of file FPGATrackSimLayerStudyTool.cxx.

284  {
285  ATH_MSG_DEBUG("In parseTruthInfo, truthtracks size = " << truthtracks.size());
286  m_truthIsValid = false;
287 
288  const IFPGATrackSimBinDesc* bindesc = m_binnedhits->getBinTool().binDesc();
289 
290  if (truthtracks.size() == 0) return;
291 
292  // Convert to binning parameters and find truth bin for each step
293  m_truthpars = (truthtracks)[0].getPars();
294  m_truthpars[FPGATrackSimTrackPars::IHIP] =
295  m_truthpars[FPGATrackSimTrackPars::IHIP] * 1000;
296  m_truthparset = bindesc->trackParsToParSet(m_truthpars);
297  m_truthbin.clear();
298  for (auto &step : m_binnedhits->getBinTool().steps()) {
299  m_truthbin.push_back(step->binIdx(m_truthparset));
300  }
301 
302  // histogram parameters
303  for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++) {
304  m_truthpars_hists[i]->Fill(m_truthparset[i]);
305  }
306 
307  // a closure test
308  FPGATrackSimTrackPars recovered = bindesc->parSetToTrackPars(m_truthparset);
309  ATH_MSG_DEBUG("parset:" << m_truthparset << " " << m_truthpars
310  << " ?= " << recovered << " closure:"
311  << " " << recovered[FPGATrackSimTrackPars::IHIP] - m_truthpars[FPGATrackSimTrackPars::IHIP]
312  << " " << recovered[FPGATrackSimTrackPars::IPHI] - m_truthpars[FPGATrackSimTrackPars::IPHI]
313  << " " << recovered[FPGATrackSimTrackPars::ID0] - m_truthpars[FPGATrackSimTrackPars::ID0]
314  << " " << recovered[FPGATrackSimTrackPars::IETA] - m_truthpars[FPGATrackSimTrackPars::IETA]
315  << " " << recovered[FPGATrackSimTrackPars::IZ0] - m_truthpars[FPGATrackSimTrackPars::IZ0]);
316 
317  m_truth_tree_phi = m_truthpars[FPGATrackSimTrackPars::IPHI];
318  m_truth_tree_qOverPt = m_truthpars[FPGATrackSimTrackPars::IHIP];
319  m_truth_tree_d0 = m_truthpars[FPGATrackSimTrackPars::ID0];
320  m_truth_tree_z0 = m_truthpars[FPGATrackSimTrackPars::IZ0];
321  m_truth_tree_eta = m_truthpars[FPGATrackSimTrackPars::IETA];
322  m_truth_tree_parset = std::vector<double>(m_truthparset);
323  m_truth_tree->Fill();
324 
325  // print if there are multiple tracks for debugging single track MC
326  if (truthtracks.size() > 1) {
327  for (unsigned i = 0; i < truthtracks.size(); i++) {
328  ATH_MSG_INFO("Multiple truth" << i << " of " << truthtracks.size()
329  << " " << (truthtracks)[i].getPars());
330  }
331  }
332 
333  // find truth bin for later plotting selections
334  ATH_MSG_DEBUG("truthbin " << truthtracks.size()
335  << " " << m_truthpars << " " << m_truthbin);
336 
337  // Check if the truth track falls in the binning range
338  if (!m_binnedhits->getBinTool().inRange(m_truthparset)) {
339  ATH_MSG_INFO("Truth out of range because truth parset = " << m_truthparset << " wrt min = " << m_binnedhits->getBinTool().parMin() << ", max = " << m_binnedhits->getBinTool().parMax());
340  return;
341  }
342 
343  // Check that truth track falls in an actual bin
344  // this should alway pass, except for weird events
345  m_truthIsValid = true;
346  for (auto &step : m_binnedhits->getBinTool().steps()) {
347  if (!step->validBinsFull()[m_truthbin[step->stepNum()]]) {
348  ATH_MSG_INFO("Truth Bin not valid! Step " << step->stepName() << " "
349  << m_truthbin[step->stepNum()]
350  << " : " << m_truthpars);
351  std::vector<FPGATrackSimBinUtil::IdxSet> idxsets =
353  std::vector<unsigned>({0, 1, 2, 3, 4}),
354  m_truthbin[step->stepNum()]);
355  for (FPGATrackSimBinUtil::IdxSet &idxset : idxsets) {
356  ATH_MSG_INFO("Truth Box "
357  << bindesc->parSetToTrackPars(step->binLowEdge(idxset)));
358  }
359  m_truthIsValid = false;
360  }
361  }
362 }
FPGATrackSimTrackPars::IHIP
@ IHIP
Definition: FPGATrackSimTrackPars.h:49
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
FPGATrackSimTrackPars::ID0
@ ID0
Definition: FPGATrackSimTrackPars.h:49
TRTCalib_Extractor.hits
hits
Definition: TRTCalib_Extractor.py:35
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
FPGATrackSimTrackPars
Definition: FPGATrackSimTrackPars.h:22
IFPGATrackSimBinDesc::trackParsToParSet
virtual const FPGATrackSimBinUtil::ParSet trackParsToParSet(const FPGATrackSimTrackPars &pars) const =0
FPGATrackSimTrackPars::IZ0
@ IZ0
Definition: FPGATrackSimTrackPars.h:49
bin
Definition: BinsDiffFromStripMedian.h:43
lumiFormat.i
int i
Definition: lumiFormat.py:85
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
IFPGATrackSimBinDesc::parSetToTrackPars
virtual const FPGATrackSimTrackPars parSetToTrackPars(const FPGATrackSimBinUtil::ParSet &parset) const =0
FPGATrackSimBinUtil::makeVariationSet
std::vector< IdxSet > makeVariationSet(const std::vector< unsigned > &scanpars, const IdxSet &idx)
Definition: FPGATrackSimBinUtil.cxx:93
FPGATrackSimTrackPars::IPHI
@ IPHI
Definition: FPGATrackSimTrackPars.h:49
trigbs_pickEvents.cnt
cnt
Definition: trigbs_pickEvents.py:71
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
FPGATrackSimTrackPars::NPARS
@ NPARS
Definition: FPGATrackSimTrackPars.h:49
IFPGATrackSimBinDesc
Definition: IFPGATrackSimBinDesc.h:47
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
LArCellBinning.step
step
Definition: LArCellBinning.py:158
FPGATrackSimBinUtil::IdxSet
Definition: FPGATrackSimBinUtil.h:50
FPGATrackSimTrackPars::IETA
@ IETA
Definition: FPGATrackSimTrackPars.h:49