ATLAS Offline Software
Loading...
Searching...
No Matches
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 181 of file FPGATrackSimLayerStudyTool.cxx.

183{
184 setBinPlotsActive(idx);
185
186 // fill all truth
187 m_ptDist[0]->Fill(std::abs(1/m_truthpars.qOverPt));
188 m_etaDist[0]->Fill(1/m_truthpars.eta);
189 m_phiDist[0]->Fill(1/m_truthpars.phi);
190 m_d0Dist[0]->Fill(1/m_truthpars.d0);
191 m_z0Dist[0]->Fill(1/m_truthpars.z0);
192
193 if (m_binPlotsActive) {
194 for (auto& hit : data.hits) {
195 m_phiShift_road->Fill(hit.phiShift);
196 m_etaShift_road->Fill(hit.etaShift);
197 m_phiShift2D_road->Fill(hit.phiShift, hit.hitptr->getR());
198 m_etaShift2D_road->Fill(hit.etaShift, hit.hitptr->getR());
199 }
200
201 // fill param monitoring
202 for (int i = 0; i < 2; i++) {
203 // i=0 all, i=1 no missed layers, i=2 is one missed layer
204 if ((i == 0)|| (data.lyrCnt() >= m_binnedhits->getNLayers() - (i - 1))) {
205 // all layer hit
206 m_ptDist[i]->Fill(std::abs(1 / m_truthpars.qOverPt));
207 m_etaDist[i]->Fill(1 / m_truthpars.eta);
208 m_phiDist[i]->Fill(1 / m_truthpars.phi);
209 m_d0Dist[i]->Fill(1 / m_truthpars.d0);
210 m_z0Dist[i]->Fill(1 / m_truthpars.z0);
211 }
212 }
213
214 // Module mapping and Layer definition studies
215 // first sort hits by r+z radii
216 std::vector<FPGATrackSimBinUtil::StoredHit> sorted_hits = data.hits;
217 std::sort(sorted_hits.begin(), sorted_hits.end(),
218 [](const auto &hit1, const auto &hit2) {
219 return hit1.rzrad() < hit2.rzrad();
220 });
221
222 // Fill tree
223 ClearTreeVectors();
224 m_bin_tree_bin = std::vector<unsigned>(idx);
225 ATH_MSG_DEBUG("Output: Bin Tree bin" << idx);
226 for (auto &hit : sorted_hits) {
227 m_bin_tree_r.push_back(hit.hitptr->getR());
228 m_bin_tree_z.push_back(hit.hitptr->getZ());
229 m_bin_tree_id.push_back(hit.hitptr->getIdentifier());
230 m_bin_tree_hash.push_back(hit.hitptr->getIdentifierHash());
231 m_bin_tree_layer.push_back(hit.hitptr->getLayerDisk());
232 m_bin_tree_side.push_back(hit.hitptr->getSide());
233 m_bin_tree_etamod.push_back(hit.hitptr->getEtaModule());
234 m_bin_tree_phimod.push_back(hit.hitptr->getPhiModule());
235 m_bin_tree_dettype.push_back((int)hit.hitptr->getDetType());
236 m_bin_tree_detzone.push_back((int)hit.hitptr->getDetectorZone());
237 }
238 m_bin_tree->Fill();
239 m_binsFilledCnt++;
240 }
241}
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.

◆ 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 243 of file FPGATrackSimLayerStudyTool.cxx.

245{
246 m_inputHits->Fill(hits.size());
247
248 for (auto &step : m_binnedhits->getBinTool().steps()) {
249 for (auto bin : m_binnedhits->binnedHits()[step->stepNum()])
250 m_hitsPerStepBin[step->stepNum()]->Fill(bin.data().hitCnt);
251 }
252
253 for (auto bin :m_binnedhits->binnedHits()[m_binnedhits->getBinTool().lastStep()->stepNum()]) {
254 for (unsigned lyr = 0; lyr < m_binnedhits->getNLayers(); lyr++) {
255 unsigned cnt = bin.data().hitsInLyr(lyr);
256 m_hitsPerLayer->Fill(lyr, cnt);
257 m_hitsPerLayer2D->Fill(lyr, cnt);
258 }
259 }
260 m_binsFilled->Fill(m_binsFilledCnt);
261 m_binsFilledCnt=0;
262
263}

◆ ATLAS_NOT_THREAD_SAFE() [3/3]

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

Definition at line 294 of file FPGATrackSimLayerStudyTool.cxx.

294 {
295 ATH_MSG_DEBUG("In parseTruthInfo, truthtracks size = " << truthtracks.size());
296 m_truthIsValid = false;
297 m_bin_tree_event++;
298
299 const IFPGATrackSimBinDesc* bindesc = m_binnedhits->getBinTool().binDesc();
300
301 if (truthtracks.size() == 0) return;
302
303 // Convert to binning parameters and find truth bin for each step
304 m_truthpars = (truthtracks)[0].getPars();
305 m_truthpars[FPGATrackSimTrackPars::IHIP] =
306 m_truthpars[FPGATrackSimTrackPars::IHIP] * 1000;
307 m_truthparset = bindesc->trackParsToParSet(m_truthpars);
308 m_truthbin.clear();
309 for (auto &step : m_binnedhits->getBinTool().steps()) {
310 m_truthbin.push_back(step->binIdx(m_truthparset));
311 }
312
313 // histogram parameters
314 for (unsigned i = 0; i < FPGATrackSimTrackPars::NPARS; i++) {
315 m_truthpars_hists[i]->Fill(m_truthparset[i]);
316 }
317
318 // a closure test
319 FPGATrackSimTrackPars recovered = bindesc->parSetToTrackPars(m_truthparset);
320 ATH_MSG_DEBUG("parset:" << m_truthparset << " " << m_truthpars
321 << " ?= " << recovered << " closure:"
322 << " " << recovered[FPGATrackSimTrackPars::IHIP] - m_truthpars[FPGATrackSimTrackPars::IHIP]
323 << " " << recovered[FPGATrackSimTrackPars::IPHI] - m_truthpars[FPGATrackSimTrackPars::IPHI]
324 << " " << recovered[FPGATrackSimTrackPars::ID0] - m_truthpars[FPGATrackSimTrackPars::ID0]
325 << " " << recovered[FPGATrackSimTrackPars::IETA] - m_truthpars[FPGATrackSimTrackPars::IETA]
326 << " " << recovered[FPGATrackSimTrackPars::IZ0] - m_truthpars[FPGATrackSimTrackPars::IZ0]);
327
328 m_truth_tree_phi = m_truthpars[FPGATrackSimTrackPars::IPHI];
329 m_truth_tree_qOverPt = m_truthpars[FPGATrackSimTrackPars::IHIP];
330 m_truth_tree_d0 = m_truthpars[FPGATrackSimTrackPars::ID0];
331 m_truth_tree_z0 = m_truthpars[FPGATrackSimTrackPars::IZ0];
332 m_truth_tree_eta = m_truthpars[FPGATrackSimTrackPars::IETA];
333 m_truth_tree_parset = std::vector<double>(m_truthparset);
334 m_truth_tree->Fill();
335
336 // print if there are multiple tracks for debugging single track MC
337 if (truthtracks.size() > 1) {
338 for (unsigned i = 0; i < truthtracks.size(); i++) {
339 ATH_MSG_INFO("Multiple truth" << i << " of " << truthtracks.size()
340 << " " << (truthtracks)[i].getPars());
341 }
342 }
343
344 // find truth bin for later plotting selections
345 ATH_MSG_DEBUG("truthbin " << truthtracks.size()
346 << " " << m_truthpars << " " << m_truthbin);
347
348 // Check if the truth track falls in the binning range
349 if (!m_binnedhits->getBinTool().inRange(m_truthparset)) {
350 ATH_MSG_INFO("Truth out of range because truth parset = " << m_truthparset << " wrt min = " << m_binnedhits->getBinTool().parMin() << ", max = " << m_binnedhits->getBinTool().parMax());
351 return;
352 }
353
354 // Check that truth track falls in an actual bin
355 // this should alway pass, except for weird events
356 m_truthIsValid = true;
357 for (auto &step : m_binnedhits->getBinTool().steps()) {
358 if (!step->validBinsFull()[m_truthbin[step->stepNum()]]) {
359 ATH_MSG_INFO("Truth Bin not valid! Step " << step->stepName() << " "
360 << m_truthbin[step->stepNum()]
361 << " : " << m_truthpars);
362 std::vector<FPGATrackSimBinUtil::IdxSet> idxsets =
364 std::vector<unsigned>({0, 1, 2, 3, 4}),
365 m_truthbin[step->stepNum()]);
366 for (FPGATrackSimBinUtil::IdxSet &idxset : idxsets) {
367 ATH_MSG_INFO("Truth Box "
368 << bindesc->parSetToTrackPars(step->binLowEdge(idxset)));
369 }
370 m_truthIsValid = false;
371 }
372 }
373}
#define ATH_MSG_INFO(x)
virtual const FPGATrackSimTrackPars parSetToTrackPars(const FPGATrackSimBinUtil::ParSet &parset) const =0
virtual const FPGATrackSimBinUtil::ParSet trackParsToParSet(const FPGATrackSimTrackPars &pars) const =0
std::vector< IdxSet > makeVariationSet(const std::vector< unsigned > &scanpars, const IdxSet &idx)