ATLAS Offline Software
PatternVisualizationTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
5 
10 
12 
15 
20 
21 #include "Acts/Utilities/Helpers.hpp"
22 
23 #include <format>
24 #include <sstream>
25 #include <filesystem>
26 
27 
28 #include "TH1F.h"
29 #include "TH2F.h"
30 #include "TMarker.h"
31 #include "TROOT.h"
32 #include "TStyle.h"
33 namespace {
34  std::string removeNonAlphaNum(std::string str) {
35  str.erase(std::remove_if(str.begin(),str.end(),
36  [](const unsigned char c){
37  return !std::isalnum(c);
38  }), str.end());
39  return str;
40  }
41  constexpr int truthColor = kOrange +2;
42  constexpr int parLineColor = kRed;
43  using SpacePointSet = std::unordered_set<const MuonR4::SpacePoint*>;
44  enum Edges {
45  yLow = 0, yHigh, zLow, zHigh
46  };
47 }
48 
49 
50 namespace MuonValR4 {
51  using namespace MuonR4;
52  using namespace SegmentFit;
55 
57  if (m_canvasLimit > 0) {
58  if (m_canvasPrefix.value().empty() || m_allCanName.value().empty()) {
59  ATH_MSG_FATAL("Please define "<<m_canvasPrefix<<" && "<<m_allCanName);
60  return StatusCode::FAILURE;
61  }
62  if (m_saveSummaryPDF) {
63  m_allCan = std::make_unique<TCanvas>("all", "all", m_canvasWidth, m_canvasHeight);
64  m_allCan->SaveAs((m_allCanName +".pdf[").c_str());
65  }
66  m_outFile = std::make_unique<TFile>( (m_allCanName +".root").c_str(), "RECREATE");
67  if (m_saveSinglePDFs) {
68  std::filesystem::create_directories("Plots/" + m_canvasPrefix);
69  }
70  gROOT->SetStyle("ATLAS");
71  TStyle* plotStyle = gROOT->GetStyle("ATLAS");
72  plotStyle->SetOptTitle(0);
73  plotStyle->SetHistLineWidth(1.);
74  plotStyle->SetPalette(kViridis);
75  }
76  ATH_CHECK(m_prepContainerKeys.initialize(!m_truthSegLinks.empty()));
77  m_truthLinkDecorKeys.clear();
78  ATH_MSG_INFO("Hits linked to the following segment decorations are considered as truth");
79  for (const std::string& decorName : m_truthSegLinks) {
80  ATH_MSG_INFO(" **** "<<decorName);
81  if (decorName.empty()) {
82  ATH_MSG_FATAL("Decoration must not be empty");
83  return StatusCode::FAILURE;
84  }
85  for (const SG::ReadHandleKey<xAOD::UncalibratedMeasurementContainer>& key : m_prepContainerKeys) {
86  m_truthLinkDecorKeys.emplace_back(key, decorName);
87  m_truthLinkDecors.push_back(SegLinkDecor_t{decorName});
88  }
89  }
90  ATH_CHECK(m_truthLinkDecorKeys.initialize());
91  m_displayOnlyTruth.value() &= !m_truthLinkDecorKeys.empty();
92 
93  ATH_CHECK(m_idHelperSvc.retrieve());
94  ATH_CHECK(m_geoCtxKey.initialize());
95  ATH_CHECK(detStore()->retrieve(m_detMgr));
96  return StatusCode::SUCCESS;
97  }
99  closeSummaryCanvas();
100  return StatusCode::SUCCESS;
101  }
103  return isLabeled(*hit.primaryMeasurement()) ||
104  (hit.secondaryMeasurement() && isLabeled(*hit.secondaryMeasurement()));
105  }
107  return std::find_if(m_truthLinkDecors.begin(), m_truthLinkDecors.end(),
108  [&hit](const SegLinkDecor_t& decor){
109  return !decor(hit).empty();
110  }) != m_truthLinkDecors.end();
111  }
112 
113  LabeledSegmentSet PatternVisualizationTool::getLabeledSegments(const std::vector<const MuonR4::SpacePoint*>& hits) const {
114  std::vector<const xAOD::UncalibratedMeasurement*> measurements{};
115  measurements.reserve(2* hits.size());
116  for (const SpacePoint* hit: hits) {
117  measurements.push_back(hit->primaryMeasurement());
118  if(hit->secondaryMeasurement()) {
119  measurements.push_back(hit->secondaryMeasurement());
120  }
121  }
122  return getLabeledSegments(measurements);
123  }
124  LabeledSegmentSet PatternVisualizationTool::getLabeledSegments(const std::vector<const xAOD::UncalibratedMeasurement*>& hits) const {
125  LabeledSegmentSet truthSegs{};
126  for (const xAOD::UncalibratedMeasurement* hit : hits) {
127  for (const SegLinkDecor_t& decor: m_truthLinkDecors) {
128  for (const SegLink_t& link : decor(*hit)) {
129  truthSegs.insert(*link);
130  }
131  }
132  }
133  return truthSegs;
134  }
135  void PatternVisualizationTool::drawPrimitives(const TCanvas& can, PrimitiveVec& primitives) const {
136  const double yLow = can.GetPad(0)->GetUymin();
137  const double yHigh = can.GetPad(0)->GetUymax();
138  for (auto& prim : primitives) {
139  const TObject &primRef = *prim;
140  if (typeid(primRef) == typeid(TLine)){
141  TLine* line = static_cast<TLine*>(prim.get());
142  const Amg::Vector3D linePoint{line->GetX1(), line->GetY1(), 0.};
143  const Amg::Vector3D lineDir = Amg::Vector3D{(line->GetX2() - line->GetX1()) / (line->GetY2() - line->GetY1()), 1.,0.}.unit();
144 
145  const Amg::Vector3D newHigh = linePoint + Amg::intersect<3>(linePoint, lineDir, Amg::Vector3D::UnitY(), yHigh).value_or(0.) * lineDir;
146  const Amg::Vector3D newLow = linePoint + Amg::intersect<3>(linePoint, lineDir, Amg::Vector3D::UnitY(), yLow).value_or(0.) * lineDir;
147  line->SetX1(newLow.x());
148  line->SetY1(newLow.y());
149  line->SetX2(newHigh.x());
150  line->SetY2(newHigh.y());
151  }
152  prim->Draw();
153  }
154 
155  }
157  const MuonR4::HoughPlane& accumulator,
158  const Acts::HoughTransformUtils::HoughAxisRanges& axisRanges,
159  const MaximumVec& maxima,
160  const std::string& extraLabel) const {
161  PrimitiveVec primitives{};
162  visualizeAccumulator(ctx, accumulator, axisRanges, maxima, extraLabel, std::move(primitives));
163  }
165  const MuonR4::HoughPlane& accumulator,
166  const Acts::HoughTransformUtils::HoughAxisRanges& axisRanges,
167  const MaximumVec& maxima,
168  const std::string& extraLabel,
169  PrimitiveVec&& primitives) const {
170 
172  if (m_canvCounter >= m_canvasLimit) {
173  return;
174  }
176  std::lock_guard guard{s_mutex};
178  //cppcheck-suppress identicalConditionAfterEarlyExit
179  if (m_canvCounter >= m_canvasLimit) {
180  return;
181  }
182  if (accumulator.getNonEmptyBins().empty()) {
183  ATH_MSG_WARNING("Hough accumulator is empty");
184  return;
185  }
186 
187  auto accHisto = std::make_unique<TH2F>("AccumulatorHisto", "histo",
188  accumulator.nBinsX(), axisRanges.xMin, axisRanges.xMax,
189  accumulator.nBinsY(), axisRanges.yMin, axisRanges.yMax);
190 
191  accHisto->SetDirectory(nullptr);
192  accHisto->GetXaxis()->SetTitle(std::format("tan#{}", m_accumlIsEta ? "theta" : "phi" ).c_str());
193  accHisto->GetYaxis()->SetTitle( std::string{m_accumlIsEta ? "y_{0}" : "x_{0}"}.c_str());
194 
195  std::vector<const SpacePoint*> spacePointsInAcc{};
196  for (const std::size_t bin : accumulator.getNonEmptyBins()) {
197  const auto [xBin, yBin] = accumulator.axisBins(bin);
200  SpacePointSet hitsInBin;
201  auto hitIds = accumulator.hitIds(xBin, yBin);
202  hitsInBin.insert(std::make_move_iterator(hitIds.begin()),std::make_move_iterator(hitIds.end()));
203 
204  spacePointsInAcc.insert(spacePointsInAcc.end(),hitsInBin.begin(), hitsInBin.end());
205  accHisto->SetBinContent(xBin+1, yBin+1, accumulator.nHits(bin));
206  }
207 
208  const LabeledSegmentSet truthSegs{getLabeledSegments(spacePointsInAcc)};
209  if (truthSegs.empty() && m_displayOnlyTruth) {
210  return;
211  }
212  for (const xAOD::MuonSegment* segment : truthSegs) {
213  const auto [pos, dir] = makeLine(localSegmentPars(*segment));
214  const double tan = m_accumlIsEta ? houghTanTheta(dir) : houghTanPhi(dir);
215  const double icept = pos[m_accumlIsEta ? objViewEta : objViewPhi];
216  auto truthMarker = std::make_unique<TMarker>(tan, icept, kFullCrossX);
217  truthMarker->SetMarkerColor(truthColor);
218  truthMarker->SetMarkerSize(8);
219  primitives.push_back(std::move(truthMarker));
220  primitives.push_back(drawLabel(std::format("true parameters: {:}",makeLabel(localSegmentPars(*segment))),0.2, 0.9));
221  }
222  for (const auto& maximum : maxima) {
223  auto maxMarker = std::make_unique<TMarker>(maximum.x, maximum.y, kFullTriangleUp);
224  maxMarker->SetMarkerColor(parLineColor);
225  maxMarker->SetMarkerSize(8);
226  primitives.push_back(std::move(maxMarker));
227  }
228  primitives.push_back(drawAtlasLabel(0.65, 0.26, m_AtlasLabel));
229  primitives.push_back(drawLumiSqrtS(0.65,0.21, m_sqrtSLabel, m_lumiLabel));
230 
231  std::stringstream canvasName{};
232  canvasName<<name()<<"_"<<ctx.eventID().event_number()<<"_"<<m_canvCounter;
233  auto canvas = std::make_unique<TCanvas>(canvasName.str().c_str(),
234  "can", m_canvasWidth, m_canvasHeight);
235  canvas->GetPad(0)->SetRightMargin(0.12);
236  canvas->GetPad(0)->SetTopMargin(0.12);
237  canvas->cd();
238  accHisto->Draw("COLZ");
239  drawPrimitives(*canvas, primitives);
240  primitives.push_back(std::move(accHisto));
241  saveCanvas(ctx, spacePointsInAcc.front()->identify(), *canvas, extraLabel);
242  primitives.push_back(std::move(canvas));
243 
244  primitives.clear();
245  if (m_canvasLimit <= m_canvCounter) {
246  closeSummaryCanvas();
247  }
248  }
249  void PatternVisualizationTool::paintSimHits(const EventContext& ctx,
250  const xAOD::MuonSegment& truthSeg,
251  PrimitiveVec& primitives,
252  const int view) const {
253  if (!m_paintTruthHits) {
254  return;
255  }
256  auto truthHits = getMatchingSimHits(truthSeg);
257  const ActsGeometryContext* geoCtx{nullptr};
258  if (!SG::get(geoCtx, m_geoCtxKey, ctx).isSuccess()) {
259  return;
260  }
261  for (const xAOD::MuonSimHit* simHit : truthHits) {
262  const MuonGMR4::MuonReadoutElement* re = m_detMgr->getReadoutElement(simHit->identify());
263  const IdentifierHash hash = re->detectorType() == ActsTrk::DetectorType::Mdt ?
264  re->measurementHash(simHit->identify()) :
265  re->layerHash(simHit->identify());
266  const Amg::Transform3D trf = re->msSector()->globalToLocalTrans(*geoCtx) *
267  re->localToGlobalTrans(*geoCtx, hash);
268  const Amg::Vector3D locPos = trf * xAOD::toEigen(simHit->localPosition());
269  const Amg::Vector3D locDir = trf.linear() * xAOD::toEigen(simHit->localDirection());
270  primitives.push_back(drawArrow(locPos, locDir, truthColor, kDashed, view));
271  }
272  }
273  void PatternVisualizationTool::visualizeSeed(const EventContext& ctx,
274  const MuonR4::SegmentSeed& seed,
275  const std::string& extraLabel) const {
276  PrimitiveVec primitives{};
277  visualizeSeed(ctx, seed, extraLabel, std::move(primitives));
278  }
279  void PatternVisualizationTool::visualizeSeed(const EventContext& ctx,
280  const MuonR4::SegmentSeed& seed,
281  const std::string& extraLabel,
282  PrimitiveVec&& primitives) const {
283 
285  if (m_canvCounter >= m_canvasLimit) {
286  return;
287  }
289  std::lock_guard guard{s_mutex};
291  //cppcheck-suppress identicalConditionAfterEarlyExit
292  if (m_canvCounter >= m_canvasLimit) {
293  return;
294  }
295 
296  const LabeledSegmentSet truthSegs{getLabeledSegments(seed.getHitsInMax())};
297  if (truthSegs.empty() && m_displayOnlyTruth) {
298  return;
299  }
300 
301  std::array<double, 4> canvasDim{};
302  const std::size_t parsedPrimSize{primitives.size()};
303  for (const int view : {objViewEta, objViewPhi}) {
304  if ((view == objViewEta && !m_doEtaBucketViews) ||
305  (view == objViewPhi && !m_doPhiBucketViews)){
306  continue;
307  }
309  primitives.resize(parsedPrimSize);
310 
311  if (!drawHits(*seed.parentBucket(), seed.getHitsInMax(), primitives, canvasDim, view)) {
312  continue;
313  }
314  for (const xAOD::MuonSegment* segment : truthSegs) {
315  primitives.push_back(drawLine(localSegmentPars(*segment), canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
316  truthColor, kDotted, view));
317  paintSimHits(ctx,*segment, primitives, view);
318  }
319  primitives.push_back(drawLine(seed.parameters(), canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
320  parLineColor, kDashed, view));
321 
322  writeChi2(seed.parameters(), seed.getHitsInMax(), primitives);
323 
324  std::stringstream legendLabel{};
325  double chi2{0.};
326  unsigned nDoF{0};
327  legendLabel<<"Event: "<<ctx.eventID().event_number()<<", chamber : "<<m_idHelperSvc->toStringChamber(seed.getHitsInMax().front()->identify())
328  <<std::format(", #chi^{{2}} /nDoF: {:.2f} ({:})", chi2/std::max(1u, nDoF), std::max(1u,nDoF))
329  <<", #"<<(view ==objViewEta ? "eta" : "phi")<<"-view";
330 
331  if (!extraLabel.empty()) {
332  legendLabel<<" ("<<extraLabel<<")";
333  }
334  primitives.push_back(drawLabel(legendLabel.str(), 0.1, 0.96));
335  primitives.push_back(drawLabel(makeLabel(seed.parameters()),0.25, 0.89));
336 
337  auto canvas = makeCanvas(ctx, canvasDim, view);
338  primitives.push_back(drawAtlasLabel(0.75, 0.26, m_AtlasLabel));
339  primitives.push_back(drawLumiSqrtS(0.75,0.21, m_sqrtSLabel, m_lumiLabel));
340 
341  drawPrimitives(*canvas, primitives);
342 
343  saveCanvas(ctx, seed.getHitsInMax().front()->identify(), *canvas, extraLabel);
344  }
345  if (m_canvasLimit <= m_canvCounter) {
346  primitives.clear();
347  closeSummaryCanvas();
348  }
349  }
350 
351  void PatternVisualizationTool::visualizeBucket(const EventContext& ctx,
352  const MuonR4::SpacePointBucket& bucket,
353  const std::string& extraLabel) const {
354  PrimitiveVec primitives{};
355  visualizeBucket(ctx, bucket, extraLabel, std::move(primitives));
356  }
357  void PatternVisualizationTool::visualizeBucket(const EventContext& ctx,
358  const MuonR4::SpacePointBucket& bucket,
359  const std::string& extraLabel,
360  PrimitiveVec&& primitives) const {
362  if (m_canvCounter >= m_canvasLimit) {
363  return;
364  }
366  std::lock_guard guard{s_mutex};
368  //cppcheck-suppress identicalConditionAfterEarlyExit
369  if (m_canvCounter >= m_canvasLimit) {
370  return;
371  }
372  std::array<double, 4> canvasDim{};
373  LabeledSegmentSet truthSegs{getLabeledSegments(Acts::unpackConstSmartPointers(bucket))};
374  if (truthSegs.empty() && m_displayOnlyTruth) {
375  return;
376  }
377  const std::size_t parsedPrimSize{primitives.size()};
378  for (const int view : {objViewEta, objViewPhi}) {
379  if ((view == objViewEta && !m_doEtaBucketViews) ||
380  (view == objViewPhi && !m_doPhiBucketViews)){
381  continue;
382  }
384  primitives.resize(parsedPrimSize);
385  if (!drawHits(bucket, bucket, primitives, canvasDim, view)) {
386  continue;
387  }
388  bool drawnTrueLabel{false};
389  for (const xAOD::MuonSegment* segment : truthSegs) {
390  primitives.push_back(drawLine(localSegmentPars(*segment), canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
391  truthColor, kDotted, view));
392  if (!drawnTrueLabel) {
393  primitives.push_back(drawLabel(std::format("true parameters: {:}",makeLabel(localSegmentPars(*segment))),0.2, 0.89));
394  drawnTrueLabel = true;
395  }
396  paintSimHits(ctx,*segment, primitives, view);
397  }
398 
399  std::stringstream legendLabel{};
400  legendLabel<<"Event: "<<ctx.eventID().event_number()
401  <<", chamber : "<<m_idHelperSvc->toStringChamber(bucket.front()->identify())
402  <<",#"<<(view ==objViewEta ? "eta" : "phi")<<"-view";
403  if (!extraLabel.empty()) {
404  legendLabel<<" ("<<extraLabel<<")";
405  }
406  primitives.push_back(drawLabel(legendLabel.str(), 0.2, 0.96));
407 
408  primitives.push_back(drawAtlasLabel(0.75, 0.26, m_AtlasLabel));
409  primitives.push_back(drawLumiSqrtS(0.75,0.21, m_sqrtSLabel, m_lumiLabel));
410 
411  auto can = makeCanvas(ctx , canvasDim, view);
412  drawPrimitives(*can, primitives);
413 
414  saveCanvas(ctx, bucket.front()->identify(), *can, extraLabel);
415  }
416  if (m_canvasLimit <= m_canvCounter) {
417  primitives.clear();
418  closeSummaryCanvas();
419  }
420 
421  }
422 
423  void PatternVisualizationTool::visualizeSegment(const EventContext& ctx,
424  const MuonR4::Segment& segment,
425  const std::string& extraLabel) const {
426  PrimitiveVec primitives{};
427  visualizeSegment(ctx, segment,extraLabel, std::move(primitives));
428  }
429 
430  void PatternVisualizationTool::visualizeSegment(const EventContext& ctx,
431  const MuonR4::Segment& segment,
432  const std::string& extraLabel,
433  PrimitiveVec&& primitives) const {
435  if (m_canvCounter >= m_canvasLimit) {
436  return;
437  }
439  std::lock_guard guard{s_mutex};
441  //cppcheck-suppress identicalConditionAfterEarlyExit
442  if (m_canvCounter >= m_canvasLimit) {
443  return;
444  }
445  const LabeledSegmentSet truthSegs{getLabeledSegments(segment.parent()->getHitsInMax())};
446  if (truthSegs.empty() && m_displayOnlyTruth) {
447  return;
448  }
449  Parameters segPars{};
450  {
451  const ActsGeometryContext* geoCtx{nullptr};
452  if (!SG::get(geoCtx, m_geoCtxKey, ctx).isSuccess()) {
453  return;
454  }
455  const Amg::Transform3D trf{segment.msSector()->globalToLocalTrans(*geoCtx)};
456  const Amg::Vector3D locPos = trf * segment.position();
457  const Amg::Vector3D locDir = trf.linear() * segment.direction();
458  segPars[Acts::toUnderlying(ParamDefs::x0)] = locPos.x();
459  segPars[Acts::toUnderlying(ParamDefs::y0)] = locPos.y();
460  segPars[Acts::toUnderlying(ParamDefs::theta)] = locDir.theta();
461  segPars[Acts::toUnderlying(ParamDefs::phi)] = locDir.phi();
462  segPars[Acts::toUnderlying(ParamDefs::t0)] = segment.segementT0();
463  }
464 
465  std::array<double, 4> canvasDim{};
466  const std::size_t parsedPrimSize{primitives.size()};
467  for (const int view : {objViewEta, objViewPhi}) {
468  if ((view == objViewEta && !m_doEtaBucketViews) ||
469  (view == objViewPhi && !m_doPhiBucketViews)){
470  continue;
471  }
473  primitives.resize(parsedPrimSize);
474 
475  if (!drawHits(*segment.parent()->parentBucket(), segment.measurements(),
476  primitives, canvasDim, view)) {
477  continue;
478  }
479  for (const xAOD::MuonSegment* segment : truthSegs) {
480  primitives.push_back(drawLine(localSegmentPars(*segment), canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
481  truthColor, kDotted, view));
482  paintSimHits(ctx,*segment, primitives, view);
483  }
484  writeChi2(segPars, segment.measurements(), primitives);
485 
486  primitives.push_back(drawAtlasLabel(0.75, 0.26, m_AtlasLabel));
487  primitives.push_back(drawLumiSqrtS(0.75,0.21, m_sqrtSLabel, m_lumiLabel));
488 
489  primitives.push_back(drawLine(segPars, canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
490  parLineColor, kDashed, view));
491 
492 
493  std::stringstream legendLabel{};
494  const Identifier canvasId{segment.parent()->getHitsInMax().front()->identify()};
495  legendLabel<<"Event: "<<ctx.eventID().event_number() <<", chamber : "<<m_idHelperSvc->toStringChamber(canvasId)
496  <<std::format(", #chi^{{2}} /nDoF: {:.2f} ({:d})", segment.chi2() /std::max(1u, segment.nDoF()), segment.nDoF())
497  <<", #"<<(view ==objViewEta ? "eta" : "phi")<<"-view";
498 
499  if (!extraLabel.empty()) {
500  legendLabel<<" ("<<extraLabel<<")";
501  }
502  primitives.push_back(drawLabel(legendLabel.str(), 0.2, 0.96));
503  primitives.push_back(drawLabel(makeLabel(segPars),0.25, 0.91));
504 
505  auto canvas = makeCanvas(ctx, canvasDim, view);
506  drawPrimitives(*canvas, primitives);
507 
508  saveCanvas(ctx, canvasId, *canvas, extraLabel);
509  }
510  if (m_canvasLimit <= m_canvCounter) {
511  primitives.clear();
512  closeSummaryCanvas();
513  }
514  }
515 
516  template<class SpacePointType>
517  const SpacePoint*
518  PatternVisualizationTool::drawHit(const SpacePointType& hit, PrimitiveVec& primitives,
519  std::array<double, 4>& canvasDim, const unsigned int view,
520  unsigned int fillStyle) const {
521 
523  if ((view == objViewEta && !hit.measuresEta()) || (view == objViewPhi && !hit.measuresPhi())) {
524  return nullptr;
525  }
526 
527  if (hit.type() != xAOD::UncalibMeasType::Other) {
528  canvasDim[Edges::yLow] = std::min(canvasDim[Edges::yLow], hit.localPosition()[view] - hit.driftRadius());
529  canvasDim[Edges::yHigh] = std::max(canvasDim[Edges::yHigh], hit.localPosition()[view] + hit.driftRadius());
530  canvasDim[Edges::zLow] = std::min(canvasDim[Edges::zLow], hit.localPosition().z() - hit.driftRadius());
531  canvasDim[Edges::zHigh] = std::max(canvasDim[Edges::zHigh], hit.localPosition().z() + hit.driftRadius());
532  }
533 
534  const SpacePoint* underlyingSp{nullptr};
536  constexpr int invalidCalibFill = 3305;
537  if constexpr (std::is_same_v<SpacePointType, SpacePoint>) {
538  underlyingSp = &hit;
539  if (hit.type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
540  const auto* dc = static_cast<const xAOD::MdtDriftCircle*>(hit.primaryMeasurement());
542  fillStyle = invalidCalibFill;
543  }
544  }
545  } else if constexpr(std::is_same_v<SpacePointType, CalibratedSpacePoint>) {
546  underlyingSp = hit.spacePoint();
547  if (hit.fitState() == CalibratedSpacePoint::State::Valid) {
548  fillStyle = fullFilling;
549  } else if (hit.fitState() == CalibratedSpacePoint::State::FailedCalib) {
550  fillStyle = invalidCalibFill;
551  } else {
552  fillStyle = hatchedFilling;
553  }
554  }
555  switch(hit.type()) {
557  const auto* dc = static_cast<const xAOD::MdtDriftCircle*>(underlyingSp->primaryMeasurement());
558  primitives.push_back(drawDriftCircle(hit.localPosition(), dc->readoutElement()->innerTubeRadius(),
559  kBlack, hollowFilling));
560 
561  const int circColor = isLabeled(*dc) ? truthColor : kBlue;
562  primitives.push_back(drawDriftCircle(hit.localPosition(), hit.driftRadius(), circColor, fillStyle));
563  break;
565  const auto* meas{static_cast<const xAOD::RpcMeasurement*>(underlyingSp->primaryMeasurement())};
566  const int boxColor = isLabeled(*meas) ? truthColor : kGreen +2;
567  const double boxWidth = 0.5*std::sqrt(12)*std::sqrt(underlyingSp->covariance()[view]);
568  primitives.push_back(drawBox(hit.localPosition(), boxWidth, 0.5*meas->readoutElement()->gasGapPitch(),
569  boxColor, fillStyle));
570  break;
572  const auto* meas{static_cast<const xAOD::TgcStrip*>(underlyingSp->primaryMeasurement())};
573  const int boxColor = isLabeled(*meas) ? truthColor : kCyan + 2;
574  const double boxWidth = 0.5*std::sqrt(12)*std::sqrt(underlyingSp->covariance()[view]);
575  primitives.push_back(drawBox(hit.localPosition(), boxWidth, 0.5*meas->readoutElement()->gasGapPitch(),
576  boxColor, fillStyle));
577  break;
579  const auto* meas{static_cast<const xAOD::MMCluster*>(underlyingSp->primaryMeasurement())};
580  const int boxColor = isLabeled(*meas) ? truthColor : kAquamarine;
581  const double boxWidth = 0.5*Gaudi::Units::mm;
582  primitives.push_back(drawBox(hit.localPosition(), boxWidth, 10.*Gaudi::Units::mm,
583  boxColor, fillStyle));
584  break;
586  break;
587  } default:
588  ATH_MSG_WARNING("Please implement proper drawings of the new small wheel.. "<<__FILE__<<":"<<__LINE__);
589  break;
590  }
591  return underlyingSp;
592  }
593 
594  template<class SpacePointType>
596  const std::vector<SpacePointType>& hitsToDraw,
597  std::vector<PrimitivePtr>& primitives,
598  std::array<double, 4>& canvasDim,
599  unsigned int view) const {
600 
601  canvasDim[Edges::yLow] = canvasDim[Edges::zLow] = 100. *Gaudi::Units::m;
602  canvasDim[Edges::yHigh] = canvasDim[Edges::zHigh] = -100. *Gaudi::Units::m;
603 
604  SpacePointSet drawnPoints{};
605  for (const SpacePointType& hit : hitsToDraw) {
606  drawnPoints.insert(drawHit(*hit, primitives, canvasDim, view, fullFilling));
607  }
608  if (m_displayBucket) {
609  for (const SpacePointBucket::value_type& hit : bucket) {
610  // Don't redraw the other points
611  if (drawnPoints.count(hit.get())) {
612  continue;
613  }
614  drawHit(*hit, primitives, canvasDim, view, hollowFilling);
615  }
616  }
617 
618  // adapt the draw range to make sure any detector elements we wish to display
619  // are included
620  for (auto & prim : primitives){
621  TBox* theBox = dynamic_cast<TBox*>(prim.get());
622  if (theBox){
623  canvasDim[Edges::zLow] = std::min(canvasDim[Edges::zLow], theBox->GetY1());
624  canvasDim[Edges::zHigh] = std::max(canvasDim[Edges::zHigh], theBox->GetY2());
625  }
626  }
627 
628  double width = (canvasDim[Edges::yHigh] - canvasDim[Edges::yLow])*m_canvasExtraScale;
629  double height = (canvasDim[Edges::zHigh] - canvasDim[Edges::zLow])*m_canvasExtraScale;
630  if (height > width) width = height;
631  else height = width;
632 
633  const double midPointX = 0.5 * (canvasDim[Edges::yHigh] + canvasDim[Edges::yLow]);
634  const double midPointY = 0.5 * (canvasDim[Edges::zHigh] + canvasDim[Edges::zLow]);
635  canvasDim[Edges::yLow] = midPointX - 0.5 * width;
636  canvasDim[Edges::zLow] = midPointY - 0.5 * height;
637  canvasDim[Edges::yHigh] = midPointX + 0.5 * width;
638  canvasDim[Edges::zHigh] = midPointY + 0.5 * height;
639  return drawnPoints.size() - drawnPoints.count(nullptr) > 1;
640  }
641  template<class SpacePointType>
643  const std::vector<SpacePointType>& hits,
644  PrimitiveVec& primitives,
645  const double legX, double startLegY,
646  const double endLegY) const {
647 
648 
649 
650  const auto [pos, dir] = makeLine(pars);
651 
652  for (const SpacePointType& hit : hits) {
653  const SpacePoint* underlyingSp{nullptr};
654  bool displayChi2{true};
655  if constexpr(std::is_same_v<SpacePointType, Segment::MeasType>) {
656  underlyingSp = hit->spacePoint();
657  displayChi2 = (hit->fitState() == CalibratedSpacePoint::State::Valid);
658  } else {
659  underlyingSp = hit;
660  }
661 
662 
663 
664  const Identifier hitId = underlyingSp ? underlyingSp->identify(): Identifier{};
665  std::string legendstream{};
666  switch(hit->type()) {
668  const int driftSign{SeedingAux::strawSign(pos, dir, *hit)};
669  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
670  legendstream = std::format("ML: {:1d}, TL: {:1d}, T: {:3d}, {:}",
671  idHelper.multilayer(hitId), idHelper.tubeLayer(hitId),
672  idHelper.tube(hitId), driftSign == -1 ? "L" : "R");
673  break;
675  const RpcIdHelper& idHelper{m_idHelperSvc->rpcIdHelper()};
676  legendstream= std::format("DR: {:1d}, DZ: {:1d}, GAP: {:1d}, #eta/#phi: {:}/{:}",
677  idHelper.doubletR(hitId), idHelper.doubletZ(hitId), idHelper.gasGap(hitId),
678  hit->measuresEta() ? "si" : "nay", hit->measuresPhi() ? "si" : "nay");
679  break;
681  const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
682  legendstream = std::format("ST: {:}, GAP: {:1d}, #eta/#phi: {:}/{:}",
683  m_idHelperSvc->stationNameString(hitId), idHelper.gasGap(hitId),
684  hit->measuresEta() ? "si" : "nay", hit->measuresPhi() ? "si" : "nay");
685  break;
687  const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
688  const auto* clus = static_cast<const xAOD::MMCluster*>(underlyingSp->primaryMeasurement());
689  const MuonGMR4::StripDesign& design = clus->readoutElement()->stripLayer(clus->layerHash()).design();
690  legendstream = std::format("ML: {:1d}, GAP: {:1d}, {:}", idHelper.multilayer(hitId), idHelper.gasGap(hitId),
691  !design.hasStereoAngle() ? "X" : design.stereoAngle() > 0 ? "U" :"V");
692  break;
694  const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
695  legendstream = std::format("ML: {:1d}, GAP: {:1d}, #eta/#phi: {:}/{:}",
696  idHelper.multilayer(hitId), idHelper.gasGap(hitId),
697  hit->measuresEta() ? "si" : "nay", hit->measuresPhi() ? "si" : "nay");
698  break;
700  legendstream = "Ext. constaint";
701  }
702  default:
703  break;
704  }
705  if (displayChi2) {
706  const double chi2 = SeedingAux::chi2Term(pos, dir,*hit);
707  legendstream+=std::format(", #chi^{{2}}: {:.2f}", chi2);
708  } else {
709  legendstream+=", #chi^{2}: ---";
710  }
711  primitives.push_back(drawLabel(legendstream, legX, startLegY, 14));
712  startLegY -= 0.05;
713  if (startLegY<= endLegY) {
714  break;
715  }
716  }
717  }
719  if (!m_outFile) return;
720  ATH_MSG_INFO("Close summary pdf & root file "<<m_allCanName);
721  if (m_allCan) {
722  m_allCan->cd();
723  m_allCan->SaveAs((m_allCanName +".pdf]").c_str());
724  m_allCan.reset();
725  }
726  m_outFile.reset();
727  }
728  std::unique_ptr<TCanvas> PatternVisualizationTool::makeCanvas(const EventContext& ctx,
729  const std::array<double, 4>& canvasDim,
730  const int view) const {
731  std::stringstream canvasName{};
732  canvasName<<name()<<"_"<<ctx.eventID().event_number()<<"_"<<m_canvCounter;
733  ATH_MSG_VERBOSE("Create new canvas "<<canvasName.str()<<" "<<canvasDim);
734  auto canvas = std::make_unique<TCanvas>(canvasName.str().c_str(), "all", m_canvasWidth, m_canvasHeight);
735  canvas->cd();
736  TH1F* frame = canvas->DrawFrame(canvasDim[Edges::yLow],canvasDim[Edges::zLow], canvasDim[Edges::yHigh], canvasDim[Edges::zHigh]);
737  frame->GetXaxis()->SetTitle(std::format("{:} [mm]", view == objViewEta ? 'y' : 'x').c_str());
738  frame->GetYaxis()->SetTitle("z [mm]");
739  return canvas;
740  }
741  void PatternVisualizationTool::saveCanvas(const EventContext& ctx,
742  const Identifier& chambId,
743  TCanvas& canvas,
744  const std::string& extraLabel) const {
745  // If an eta view closes the summary canvas & a phi view is processed
746  std::stringstream canvasName{};
747  canvasName<<m_canvasPrefix.value()<<"_"<<ctx.eventID().event_number()<<"_"<<(m_canvCounter++)<<"_"
748  <<m_idHelperSvc->stationNameString(chambId)
749  <<std::abs(m_idHelperSvc->stationEta(chambId))
750  <<(m_idHelperSvc->stationEta(chambId) >0 ? "A" : "C")
751  <<m_idHelperSvc->stationPhi(chambId);
752  if (!extraLabel.empty()) canvasName<<"_"<<removeNonAlphaNum(extraLabel);
753  ATH_MSG_VERBOSE("Save new plot "<<canvasName.str());
754  if (m_saveSinglePDFs) {
755  canvas.SaveAs(("Plots/" + m_canvasPrefix+"/" + canvasName.str()+".pdf").c_str());
756  }
757  if (m_saveSummaryPDF) {
758  canvas.SaveAs((m_allCanName+".pdf").c_str());
759  }
760  m_outFile->WriteObject(&canvas, canvasName.str().c_str());
761  }
762 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
MuonValR4::fullFilling
constexpr int fullFilling
Definition: VisualizationHelpers.h:21
MuonR4::PrimitiveVec
MuonValR4::IPatternVisualizationTool::PrimitiveVec PrimitiveVec
Definition: SegmentFittingAlg.cxx:50
make_hlt_rep.pars
pars
Definition: make_hlt_rep.py:90
MuonValR4::drawLine
std::unique_ptr< TLine > drawLine(const MuonR4::SegmentFit::Parameters &pars, const double lowEnd, const double highEnd, const int color=kRed+1, const int lineStyle=kDashed, const int view=objViewEta)
Draws a line from the segment fit parameters.
Definition: VisualizationHelpers.cxx:59
MuonValR4::LabeledSegmentSet
PatternVisualizationTool::LabeledSegmentSet LabeledSegmentSet
Definition: PatternVisualizationTool.cxx:53
MuonSimHitHelpers.h
xAOD::MuonSimHit_v1
Definition: MuonSimHit_v1.h:18
MuonGMR4::StripDesign::stereoAngle
double stereoAngle() const
Returns the value of the stereo angle.
xAOD::RpcMeasurement_v1
RpcMeasurement_v1: Class storing the geneic.
Definition: RpcMeasurement_v1.h:21
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
MuonGMR4::StripDesign
Definition: StripDesign.h:30
TRTCalib_Extractor.hits
hits
Definition: TRTCalib_Extractor.py:35
python.SystemOfUnits.mm
float mm
Definition: SystemOfUnits.py:98
HoughMaximum.h
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
MuonR4::SpacePointBucket
: The muon space point bucket represents a collection of points that will bre processed together in t...
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePointContainer.h:21
vtune_athena.format
format
Definition: vtune_athena.py:14
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
xAOD::MMCluster_v1
Definition: MMCluster_v1.h:20
MuonValR4::PatternVisualizationTool::s_mutex
static std::mutex s_mutex
Definition: PatternVisualizationTool.h:231
TgcIdHelper
Definition: TgcIdHelper.h:50
VisualizationHelpers.h
BeamSpot::mutex
std::mutex mutex
Definition: InDetBeamSpotVertex.cxx:18
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
xAOD::TgcStrip_v1
Definition: TgcStrip_v1.h:19
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
SegmentSeed.h
theta
Scalar theta() const
theta method
Definition: AmgMatrixBasePlugin.h:75
MuonR4::Segment
Placeholder for what will later be the muon segment EDM representation.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:19
MuonValR4::PatternVisualizationTool::finalize
virtual StatusCode finalize() override final
Definition: PatternVisualizationTool.cxx:98
ALFA_EventTPCnv_Dict::t0
std::vector< ALFA_RawData_p1 > t0
Definition: ALFA_EventTPCnvDict.h:42
xAOD::UncalibMeasType::MMClusterType
@ MMClusterType
MuonGMR4::MuonReadoutElement
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonReadoutElement.h:38
bin
Definition: BinsDiffFromStripMedian.h:43
MuonValR4::drawBox
std::unique_ptr< TBox > drawBox(const Amg::Vector3D &boxCenter, const double boxWidth, const double boxHeight, const int color=kGreen+2, const int fillStyle=hollowFilling, const int view=objViewEta)
Creates a box for drawing, e.g strip measurements.
Definition: VisualizationHelpers.cxx:41
MuonValR4::PatternVisualizationTool::visualizeSegment
virtual void visualizeSegment(const EventContext &ctx, const MuonR4::Segment &segment, const std::string &extraLabel) const override final
Definition: PatternVisualizationTool.cxx:423
xAOD::MuonSegment_v1
Class describing a MuonSegment.
Definition: MuonSegment_v1.h:33
MuonValR4::PatternVisualizationTool::saveCanvas
void saveCanvas(const EventContext &ctx, const Identifier &chambId, TCanvas &canvas, const std::string &extraLabel) const
Saves the Canvas as pdf & also into the ROOT file.
Definition: PatternVisualizationTool.cxx:741
MuonR4::HoughPlane
Acts::HoughTransformUtils::HoughPlane< HoughHitType > HoughPlane
Definition: MuonHoughDefs.h:25
MuonR4::SpacePoint::secondaryMeasurement
const xAOD::UncalibratedMeasurement * secondaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:78
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:55
MuonValR4::PatternVisualizationTool::makeCanvas
std::unique_ptr< TCanvas > makeCanvas(const EventContext &ctx, const std::array< double, 4 > &canvasDim, const int view) const
Create a new Canvas & draw the underlying frame.
Definition: PatternVisualizationTool.cxx:728
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::ReadHandleKey
Property holding a SG store/key/clid from which a ReadHandle is made.
Definition: StoreGate/StoreGate/ReadHandleKey.h:39
xAOD::UncalibMeasType::sTgcStripType
@ sTgcStripType
MuonR4::SegmentFit::makeLine
std::pair< Amg::Vector3D, Amg::Vector3D > makeLine(const Parameters &pars)
Returns the parsed parameters into an Eigen line parametrization.
Definition: SegmentFitterEventData.cxx:27
MuonValR4::PatternVisualizationTool::paintSimHits
void paintSimHits(const EventContext &ctx, const xAOD::MuonSegment &truthSeg, PrimitiveVec &primitives, const int view) const
Paints the truth sim hits associated with the segment.
Definition: PatternVisualizationTool.cxx:249
MuonValR4::drawLabel
std::unique_ptr< TLatex > drawLabel(const std::string &text, const double xPos, const double yPos, const unsigned int fontSize=18)
Create a TLatex label,.
Definition: VisualizationHelpers.cxx:32
dq_defect_bulk_create_defects.line
line
Definition: dq_defect_bulk_create_defects.py:27
RpcIdHelper
Definition: RpcIdHelper.h:51
MuonValR4::PatternVisualizationTool::getLabeledSegments
virtual LabeledSegmentSet getLabeledSegments(const std::vector< const MuonR4::SpacePoint * > &hits) const override final
Returns whether the hit has been used on the labeled segments we refer to (e.g.
Definition: PatternVisualizationTool.cxx:113
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
Muon::MdtStatusDriftTime
@ MdtStatusDriftTime
The tube produced a vaild measurement.
Definition: MdtDriftCircleStatus.h:34
xAOD::UncalibMeasType::TgcStripType
@ TgcStripType
MuonR4::SpacePoint::primaryMeasurement
const xAOD::UncalibratedMeasurement * primaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:75
MuonR4::houghTanPhi
double houghTanPhi(const Amg::Vector3D &v)
: Returns the hough tanPhi [x] / [z]
Definition: SegmentFitterEventData.cxx:19
MuonValR4::PatternVisualizationTool::visualizeSeed
virtual void visualizeSeed(const EventContext &ctx, const MuonR4::SegmentSeed &seed, const std::string &extraLabel) const override final
Definition: PatternVisualizationTool.cxx:273
PlotPulseshapeFromCool.can
can
Definition: PlotPulseshapeFromCool.py:91
xAOD::UncalibratedMeasurement_v1
Definition: UncalibratedMeasurement_v1.h:13
MuonValR4::PatternVisualizationTool::visualizeAccumulator
virtual void visualizeAccumulator(const EventContext &ctx, const MuonR4::HoughPlane &accumulator, const Acts::HoughTransformUtils::HoughAxisRanges &axisRanges, const MaximumVec &maxima, const std::string &extraLabel) const override final
Definition: PatternVisualizationTool.cxx:156
SG::get
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Definition: ReadCondHandle.h:287
DeMoAtlasDataLoss.canvas
dictionary canvas
Definition: DeMoAtlasDataLoss.py:187
MuonValR4::PatternVisualizationTool::isLabeled
virtual bool isLabeled(const MuonR4::SpacePoint &hit) const override final
Fetches all labeled (e.g.
Definition: PatternVisualizationTool.cxx:102
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SegmentFitHelperFunctions.h
MuonValR4::PatternVisualizationTool::drawHit
const MuonR4::SpacePoint * drawHit(const SpacePointType &hit, PrimitiveVec &primitives, std::array< double, 4 > &canvasDim, const unsigned int view, unsigned int fillStyle) const
Converts a Hit into a particular TBox/ TEllipse for drawing.
python.CaloAddPedShiftConfig.str
str
Definition: CaloAddPedShiftConfig.py:42
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
MuonR4::CalibratedSpacePoint::State::FailedCalib
@ FailedCalib
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:525
MdtIdHelper
Definition: MdtIdHelper.h:61
xAOD::Other
@ Other
MuonValR4::objViewPhi
constexpr int objViewPhi
Definition: VisualizationHelpers.h:26
MuonValR4::PatternVisualizationTool::writeChi2
void writeChi2(const MuonR4::SegmentFit::Parameters &pars, const std::vector< SpacePointType > &hits, PrimitiveVec &primitivesToPush, const double legX=0.2, double startLegY=0.8, const double endLegY=0.3) const
Writes the chi2 of the hits onto the Canvas.
Definition: PatternVisualizationTool.cxx:642
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:27
MuonValR4::PatternVisualizationTool::drawHits
bool drawHits(const MuonR4::SpacePointBucket &bucket, const std::vector< SpacePointType > &hitsToDraw, PrimitiveVec &primitivesToPush, std::array< double, 4 > &canvasDim, unsigned int view) const
Translates the Spacepoint information into TObjects that are dawn on the canvas & evaluates the size ...
Definition: PatternVisualizationTool.cxx:595
MdtDriftCircle.h
beamspotman.dir
string dir
Definition: beamspotman.py:619
MuonR4::CalibratedSpacePoint::State::Valid
@ Valid
MuonR4::SpacePoint
The muon space point is the combination of two uncalibrated measurements one of them measures the eta...
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:24
MuonValR4
Lightweight algorithm to read xAOD MDT sim hits and (fast-digitised) drift circles from SG and fill a...
Definition: IPatternVisualizationTool.h:23
MuonValR4::PatternVisualizationTool::initialize
virtual StatusCode initialize() override final
Definition: PatternVisualizationTool.cxx:56
TgcStrip.h
FPEAudit::s_mutex
std::mutex s_mutex
Definition: FPEAuditor.cxx:42
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
ActsTrk::DetectorType::Mdt
@ Mdt
MuonSpectrometer.
MuonValR4::objViewEta
constexpr int objViewEta
ObjectView.
Definition: VisualizationHelpers.h:25
MuonValR4::PatternVisualizationTool::LabeledSegmentSet
std::unordered_set< const xAOD::MuonSegment * > LabeledSegmentSet
Definition: PatternVisualizationTool.h:79
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
sTgcIdHelper
Definition: sTgcIdHelper.h:55
RpcMeasurement.h
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
python.copyTCTOutput.locDir
locDir
Definition: copyTCTOutput.py:110
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:16
MuonR4
This header ties the generic definitions in this package.
Definition: HoughEventData.h:16
MmIdHelper
Definition: MmIdHelper.h:54
MuonValR4::drawArrow
std::unique_ptr< TArrow > drawArrow(const Amg::Vector3D &start, const Amg::Vector3D &dir, const int color=kRed+1, const int lineStyle=kDashed, const int view=objViewEta)
Definition: VisualizationHelpers.cxx:22
Base_Fragment.width
width
Definition: Sherpa_i/share/common/Base_Fragment.py:59
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:108
SegmentFitterEventData.h
MuonValR4::PatternVisualizationTool::drawPrimitives
void drawPrimitives(const TCanvas &can, PrimitiveVec &primitives) const
Draw the various primitives onto the Canvas.
Definition: PatternVisualizationTool.cxx:135
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Trk::SpacePointSet
std::vector< const SpacePoint * > SpacePointSet
vector of space points
Definition: FitterTypes.h:38
MuonValR4::PatternVisualizationTool::closeSummaryCanvas
void closeSummaryCanvas() const
Closes the summary canvas & closes the associated ROOT file.
Definition: PatternVisualizationTool.cxx:718
re
const boost::regex re(r_e)
MuonR4::SegmentSeed
Representation of a segment seed (a fully processed hough maximum) produced by the hough transform.
Definition: SegmentSeed.h:14
MuonValR4::hollowFilling
constexpr int hollowFilling
Filling codes for hollow / fullFilling / hatched filling.
Definition: VisualizationHelpers.h:20
MuonR4::SegmentFit::makeLabel
std::string makeLabel(const Parameters &pars)
Definition: SegmentFitterEventData.cxx:51
MuonR4::SegmentFit::localSegmentPars
Parameters localSegmentPars(const xAOD::MuonSegment &seg)
Returns the localSegPars decoration from a xAODMuon::Segment.
Definition: SegmentFitterEventData.cxx:33
MMCluster.h
MuonGMR4::StripDesign::hasStereoAngle
bool hasStereoAngle() const
Returns whether a stereo angle is defined.
MuonValR4::drawDriftCircle
std::unique_ptr< TEllipse > drawDriftCircle(const Amg::Vector3D &center, const double radius, const int color=kViolet, const int fillStyle=hollowFilling)
Create a TEllipse for drawing a drift circle.
Definition: VisualizationHelpers.cxx:12
str
Definition: BTagTrackIpAccessor.cxx:11
MuonValR4::drawAtlasLabel
std::unique_ptr< TLatex > drawAtlasLabel(const double xPos, const double yPos, const std::string &status="Internal")
Create a ATLAS label.
Definition: VisualizationHelpers.cxx:72
python.TrigEgammaMonitorHelper.TH1F
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:24
CaloLCW_tf.trf
trf
Definition: CaloLCW_tf.py:20
xAOD::MdtDriftCircle_v1
https://gitlab.cern.ch/atlas/athena/-/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecEvent/Mu...
Definition: MdtDriftCircle_v1.h:21
MuonR4::SegmentFit::Parameters
AmgVector(Acts::toUnderlying(ParamDefs::nPars)) Parameters
Definition: MuonHoughDefs.h:45
Segment.h
MuonValR4::PatternVisualizationTool::visualizeBucket
virtual void visualizeBucket(const EventContext &ctx, const MuonR4::SpacePointBucket &bucket, const std::string &extraLabel) const override final
Definition: PatternVisualizationTool.cxx:351
python.compressB64.c
def c
Definition: compressB64.py:93
xAOD::UncalibMeasType::RpcStripType
@ RpcStripType
xAOD::UncalibMeasType::MdtDriftCircleType
@ MdtDriftCircleType
MuonR4::houghTanTheta
double houghTanTheta(const Amg::Vector3D &v)
Returns the hough tanTheta [y] / [z].
Definition: SegmentFitterEventData.cxx:15
MuonR4::getMatchingSimHits
std::unordered_set< const xAOD::MuonSimHit * > getMatchingSimHits(const xAOD::MuonSegment &segment)
: Returns all sim hits matched to a xAOD::MuonSegment
Definition: MuonSimHitHelpers.cxx:27
MuonValR4::drawLumiSqrtS
std::unique_ptr< TLatex > drawLumiSqrtS(const double xPos, const double yPos, const std::string_view sqrtS="14", const std::string_view lumi="")
Create a luminosity sqrtS label.
Definition: VisualizationHelpers.cxx:76
MuonValR4::hatchedFilling
constexpr int hatchedFilling
Definition: VisualizationHelpers.h:22
python.SystemOfUnits.m
float m
Definition: SystemOfUnits.py:106
NSWL1::PadTriggerAdapter::segment
Muon::NSW_PadTriggerSegment segment(const NSWL1::PadTrigger &data)
Definition: PadTriggerAdapter.cxx:5
drawFromPickle.view
view
Definition: drawFromPickle.py:294
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
Identifier
Definition: IdentifierFieldParser.cxx:14
PatternVisualizationTool.h