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 
13 
18 
19 #include "Acts/Utilities/Helpers.hpp"
20 
21 #include <format>
22 #include <sstream>
23 #include <filesystem>
24 
25 
26 #include "TH1F.h"
27 #include "TH2F.h"
28 #include "TMarker.h"
29 #include "TROOT.h"
30 #include "TStyle.h"
31 namespace {
32  std::string removeNonAlphaNum(std::string str) {
33  str.erase(std::remove_if(str.begin(),str.end(),
34  [](const unsigned char c){
35  return !std::isalnum(c);
36  }), str.end());
37  return str;
38  }
39  constexpr int truthColor = kOrange +2;
40  constexpr int parLineColor = kRed;
41  using SpacePointSet = std::unordered_set<const MuonR4::SpacePoint*>;
42  enum Edges {
43  yLow = 0, yHigh, zLow, zHigh
44  };
45 }
46 
47 
48 namespace MuonValR4 {
49  using namespace MuonR4;
50  using namespace SegmentFit;
53 
55  if (m_canvasLimit > 0) {
56  if (m_canvasPrefix.value().empty() || m_allCanName.value().empty()) {
57  ATH_MSG_FATAL("Please define "<<m_canvasPrefix<<" && "<<m_allCanName);
58  return StatusCode::FAILURE;
59  }
60  if (m_saveSummaryPDF) {
61  m_allCan = std::make_unique<TCanvas>("all", "all", m_canvasWidth, m_canvasHeight);
62  m_allCan->SaveAs((m_allCanName +".pdf[").c_str());
63  }
64  m_outFile = std::make_unique<TFile>( (m_allCanName +".root").c_str(), "RECREATE");
65  if (m_saveSinglePDFs) {
66  std::filesystem::create_directories("Plots/" + m_canvasPrefix);
67  }
68  gROOT->SetStyle("ATLAS");
69  TStyle* plotStyle = gROOT->GetStyle("ATLAS");
70  plotStyle->SetOptTitle(0);
71  plotStyle->SetHistLineWidth(1.);
72  plotStyle->SetPalette(kViridis);
73  }
74  ATH_CHECK(m_prepContainerKeys.initialize(!m_truthSegLinks.empty()));
75  m_truthLinkDecorKeys.clear();
76  ATH_MSG_INFO("Hits linked to the following segment decorations are considered as truth");
77  for (const std::string& decorName : m_truthSegLinks) {
78  ATH_MSG_INFO(" **** "<<decorName);
79  if (decorName.empty()) {
80  ATH_MSG_FATAL("Decoration must not be empty");
81  return StatusCode::FAILURE;
82  }
83  for (const SG::ReadHandleKey<xAOD::UncalibratedMeasurementContainer>& key : m_prepContainerKeys) {
84  m_truthLinkDecorKeys.emplace_back(key, decorName);
85  m_truthLinkDecors.push_back(SegLinkDecor_t{decorName});
86  }
87  }
88  ATH_CHECK(m_truthLinkDecorKeys.initialize());
89  m_displayOnlyTruth.value() &= !m_truthLinkDecorKeys.empty();
90 
91  ATH_CHECK(m_idHelperSvc.retrieve());
92  ATH_CHECK(m_geoCtxKey.initialize());
93  ATH_CHECK(detStore()->retrieve(m_detMgr));
94  return StatusCode::SUCCESS;
95  }
97  closeSummaryCanvas();
98  return StatusCode::SUCCESS;
99  }
101  return isLabeled(*hit.primaryMeasurement()) ||
102  (hit.secondaryMeasurement() && isLabeled(*hit.secondaryMeasurement()));
103  }
105  return std::find_if(m_truthLinkDecors.begin(), m_truthLinkDecors.end(),
106  [&hit](const SegLinkDecor_t& decor){
107  return !decor(hit).empty();
108  }) != m_truthLinkDecors.end();
109  }
110 
111  LabeledSegmentSet PatternVisualizationTool::getLabeledSegments(const std::vector<const MuonR4::SpacePoint*>& hits) const {
112  std::vector<const xAOD::UncalibratedMeasurement*> measurements{};
113  measurements.reserve(2* hits.size());
114  for (const SpacePoint* hit: hits) {
115  measurements.push_back(hit->primaryMeasurement());
116  if(hit->secondaryMeasurement()) {
117  measurements.push_back(hit->secondaryMeasurement());
118  }
119  }
120  return getLabeledSegments(measurements);
121  }
122  LabeledSegmentSet PatternVisualizationTool::getLabeledSegments(const std::vector<const xAOD::UncalibratedMeasurement*>& hits) const {
123  LabeledSegmentSet truthSegs{};
124  for (const xAOD::UncalibratedMeasurement* hit : hits) {
125  for (const SegLinkDecor_t& decor: m_truthLinkDecors) {
126  for (const SegLink_t& link : decor(*hit)) {
127  truthSegs.insert(*link);
128  }
129  }
130  }
131  return truthSegs;
132  }
133  void PatternVisualizationTool::drawPrimitives(const TCanvas& can, PrimitiveVec& primitives) const {
134  const double yLow = can.GetPad(0)->GetUymin();
135  const double yHigh = can.GetPad(0)->GetUymax();
136  for (auto& prim : primitives) {
137  const TObject &primRef = *prim;
138  if (typeid(primRef) == typeid(TLine)){
139  TLine* line = static_cast<TLine*>(prim.get());
140  const Amg::Vector3D linePoint{line->GetX1(), line->GetY1(), 0.};
141  const Amg::Vector3D lineDir = Amg::Vector3D{(line->GetX2() - line->GetX1()) / (line->GetY2() - line->GetY1()), 1.,0.}.unit();
142 
143  const Amg::Vector3D newHigh = linePoint + Amg::intersect<3>(linePoint, lineDir, Amg::Vector3D::UnitY(), yHigh).value_or(0.) * lineDir;
144  const Amg::Vector3D newLow = linePoint + Amg::intersect<3>(linePoint, lineDir, Amg::Vector3D::UnitY(), yLow).value_or(0.) * lineDir;
145  line->SetX1(newLow.x());
146  line->SetY1(newLow.y());
147  line->SetX2(newHigh.x());
148  line->SetY2(newHigh.y());
149  }
150  prim->Draw();
151  }
152 
153  }
155  const MuonR4::HoughPlane& accumulator,
156  const Acts::HoughTransformUtils::HoughAxisRanges& axisRanges,
157  const MaximumVec& maxima,
158  const std::string& extraLabel) const {
159  PrimitiveVec primitives{};
160  visualizeAccumulator(ctx, accumulator, axisRanges, maxima, extraLabel, std::move(primitives));
161  }
163  const MuonR4::HoughPlane& accumulator,
164  const Acts::HoughTransformUtils::HoughAxisRanges& axisRanges,
165  const MaximumVec& maxima,
166  const std::string& extraLabel,
167  PrimitiveVec&& primitives) const {
168 
170  if (m_canvCounter >= m_canvasLimit) {
171  return;
172  }
174  std::lock_guard guard{s_mutex};
176  //cppcheck-suppress identicalConditionAfterEarlyExit
177  if (m_canvCounter >= m_canvasLimit) {
178  return;
179  }
180  if (accumulator.getNonEmptyBins().empty()) {
181  ATH_MSG_WARNING("Hough accumulator is empty");
182  return;
183  }
184 
185  auto accHisto = std::make_unique<TH2F>("AccumulatorHisto", "histo",
186  accumulator.nBinsX(), axisRanges.xMin, axisRanges.xMax,
187  accumulator.nBinsY(), axisRanges.yMin, axisRanges.yMax);
188 
189  accHisto->SetDirectory(nullptr);
190  accHisto->GetXaxis()->SetTitle(std::format("tan#{}", m_accumlIsEta ? "theta" : "phi" ).c_str());
191  accHisto->GetYaxis()->SetTitle( std::string{m_accumlIsEta ? "y_{0}" : "x_{0}"}.c_str());
192 
193  std::vector<const SpacePoint*> spacePointsInAcc{};
194  for (const std::size_t bin : accumulator.getNonEmptyBins()) {
195  const auto [xBin, yBin] = accumulator.axisBins(bin);
198  SpacePointSet hitsInBin;
199  auto hitIds = accumulator.hitIds(xBin, yBin);
200  hitsInBin.insert(std::make_move_iterator(hitIds.begin()),std::make_move_iterator(hitIds.end()));
201 
202  spacePointsInAcc.insert(spacePointsInAcc.end(),hitsInBin.begin(), hitsInBin.end());
203  accHisto->SetBinContent(xBin+1, yBin+1, accumulator.nHits(bin));
204  }
205 
206  const LabeledSegmentSet truthSegs{getLabeledSegments(spacePointsInAcc)};
207  if (truthSegs.empty() && m_displayOnlyTruth) {
208  return;
209  }
210  for (const xAOD::MuonSegment* segment : truthSegs) {
211  const auto [pos, dir] = makeLine(localSegmentPars(*segment));
212  const double tan = m_accumlIsEta ? houghTanBeta(dir) : houghTanAlpha(dir);
213  const double icept = pos[m_accumlIsEta ? objViewEta : objViewPhi];
214  auto truthMarker = std::make_unique<TMarker>(tan, icept, kFullCrossX);
215  truthMarker->SetMarkerColor(truthColor);
216  truthMarker->SetMarkerSize(8);
217  primitives.push_back(std::move(truthMarker));
218  primitives.push_back(drawLabel(std::format("true parameters: {:}",makeLabel(localSegmentPars(*segment))),0.2, 0.9));
219  }
220  for (const auto& maximum : maxima) {
221  auto maxMarker = std::make_unique<TMarker>(maximum.x, maximum.y, kFullTriangleUp);
222  maxMarker->SetMarkerColor(parLineColor);
223  maxMarker->SetMarkerSize(8);
224  primitives.push_back(std::move(maxMarker));
225  }
226  primitives.push_back(drawAtlasLabel(0.65, 0.26, m_AtlasLabel));
227  primitives.push_back(drawLumiSqrtS(0.65,0.21, m_sqrtSLabel, m_lumiLabel));
228 
229  std::stringstream canvasName{};
230  canvasName<<name()<<"_"<<ctx.eventID().event_number()<<"_"<<m_canvCounter;
231  auto canvas = std::make_unique<TCanvas>(canvasName.str().c_str(),
232  "can", m_canvasWidth, m_canvasHeight);
233  canvas->GetPad(0)->SetRightMargin(0.12);
234  canvas->GetPad(0)->SetTopMargin(0.12);
235  canvas->cd();
236  accHisto->Draw("COLZ");
237  drawPrimitives(*canvas, primitives);
238  primitives.push_back(std::move(accHisto));
239  saveCanvas(ctx, spacePointsInAcc.front()->identify(), *canvas, extraLabel);
240  primitives.push_back(std::move(canvas));
241 
242  primitives.clear();
243  if (m_canvasLimit <= m_canvCounter) {
244  closeSummaryCanvas();
245  }
246  }
247  void PatternVisualizationTool::paintSimHits(const EventContext& ctx,
248  const xAOD::MuonSegment& truthSeg,
249  PrimitiveVec& primitives,
250  const int view) const {
251  if (!m_paintTruthHits) {
252  return;
253  }
254  auto truthHits = getMatchingSimHits(truthSeg);
255  const ActsTrk::GeometryContext* geoCtx{nullptr};
256  if (!SG::get(geoCtx, m_geoCtxKey, ctx).isSuccess()) {
257  return;
258  }
259  for (const xAOD::MuonSimHit* simHit : truthHits) {
260  const MuonGMR4::MuonReadoutElement* re = m_detMgr->getReadoutElement(simHit->identify());
261  const IdentifierHash hash = re->detectorType() == ActsTrk::DetectorType::Mdt ?
262  re->measurementHash(simHit->identify()) :
263  re->layerHash(simHit->identify());
264  const Amg::Transform3D trf = re->msSector()->globalToLocalTrans(*geoCtx) *
265  re->localToGlobalTrans(*geoCtx, hash);
266  const Amg::Vector3D locPos = trf * xAOD::toEigen(simHit->localPosition());
267  const Amg::Vector3D locDir = trf.linear() * xAOD::toEigen(simHit->localDirection());
268  primitives.push_back(drawArrow(locPos, locDir, truthColor, kDashed, view));
269  }
270  }
271  void PatternVisualizationTool::visualizeSeed(const EventContext& ctx,
272  const MuonR4::SegmentSeed& seed,
273  const std::string& extraLabel) const {
274  PrimitiveVec primitives{};
275  visualizeSeed(ctx, seed, extraLabel, std::move(primitives));
276  }
277  void PatternVisualizationTool::visualizeSeed(const EventContext& ctx,
278  const MuonR4::SegmentSeed& seed,
279  const std::string& extraLabel,
280  PrimitiveVec&& primitives) const {
281 
283  if (m_canvCounter >= m_canvasLimit) {
284  return;
285  }
287  std::lock_guard guard{s_mutex};
289  //cppcheck-suppress identicalConditionAfterEarlyExit
290  if (m_canvCounter >= m_canvasLimit) {
291  return;
292  }
293 
294  const LabeledSegmentSet truthSegs{getLabeledSegments(seed.getHitsInMax())};
295  if (truthSegs.empty() && m_displayOnlyTruth) {
296  return;
297  }
298 
299  std::array<double, 4> canvasDim{};
300  const std::size_t parsedPrimSize{primitives.size()};
301  for (const int view : {objViewEta, objViewPhi}) {
302  if ((view == objViewEta && !m_doEtaBucketViews) ||
303  (view == objViewPhi && !m_doPhiBucketViews)){
304  continue;
305  }
307  primitives.resize(parsedPrimSize);
308 
309  if (!drawHits(*seed.parentBucket(), seed.getHitsInMax(), primitives, canvasDim, view)) {
310  continue;
311  }
312  for (const xAOD::MuonSegment* segment : truthSegs) {
313  primitives.push_back(drawLine(localSegmentPars(*segment), canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
314  truthColor, kDotted, view));
315  paintSimHits(ctx,*segment, primitives, view);
316  }
317  primitives.push_back(drawLine(seed.parameters(), canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
318  parLineColor, kDashed, view));
319 
320  writeChi2(seed.parameters(), seed.getHitsInMax(), primitives);
321 
322  std::stringstream legendLabel{};
323  double chi2{0.};
324  unsigned nDoF{0};
325  legendLabel<<"Event: "<<ctx.eventID().event_number()<<", chamber : "<<m_idHelperSvc->toStringChamber(seed.getHitsInMax().front()->identify())
326  <<std::format(", #chi^{{2}} /nDoF: {:.2f} ({:})", chi2/std::max(1u, nDoF), std::max(1u,nDoF))
327  <<", #"<<(view ==objViewEta ? "eta" : "phi")<<"-view";
328 
329  if (!extraLabel.empty()) {
330  legendLabel<<" ("<<extraLabel<<")";
331  }
332  primitives.push_back(drawLabel(legendLabel.str(), 0.1, 0.96));
333  primitives.push_back(drawLabel(makeLabel(seed.parameters()),0.25, 0.89));
334 
335  auto canvas = makeCanvas(ctx, canvasDim, view);
336  primitives.push_back(drawAtlasLabel(0.75, 0.26, m_AtlasLabel));
337  primitives.push_back(drawLumiSqrtS(0.75,0.21, m_sqrtSLabel, m_lumiLabel));
338 
339  drawPrimitives(*canvas, primitives);
340 
341  saveCanvas(ctx, seed.getHitsInMax().front()->identify(), *canvas, extraLabel);
342  }
343  if (m_canvasLimit <= m_canvCounter) {
344  primitives.clear();
345  closeSummaryCanvas();
346  }
347  }
348 
349  void PatternVisualizationTool::visualizeBucket(const EventContext& ctx,
350  const MuonR4::SpacePointBucket& bucket,
351  const std::string& extraLabel) const {
352  PrimitiveVec primitives{};
353  visualizeBucket(ctx, bucket, extraLabel, std::move(primitives));
354  }
355  void PatternVisualizationTool::visualizeBucket(const EventContext& ctx,
356  const MuonR4::SpacePointBucket& bucket,
357  const std::string& extraLabel,
358  PrimitiveVec&& primitives) const {
360  if (m_canvCounter >= m_canvasLimit) {
361  return;
362  }
364  std::lock_guard guard{s_mutex};
366  //cppcheck-suppress identicalConditionAfterEarlyExit
367  if (m_canvCounter >= m_canvasLimit) {
368  return;
369  }
370  std::array<double, 4> canvasDim{};
371  LabeledSegmentSet truthSegs{getLabeledSegments(Acts::unpackConstSmartPointers(bucket))};
372  if (truthSegs.empty() && m_displayOnlyTruth) {
373  return;
374  }
375  const std::size_t parsedPrimSize{primitives.size()};
376  for (const int view : {objViewEta, objViewPhi}) {
377  if ((view == objViewEta && !m_doEtaBucketViews) ||
378  (view == objViewPhi && !m_doPhiBucketViews)){
379  continue;
380  }
382  primitives.resize(parsedPrimSize);
383  if (!drawHits(bucket, bucket, primitives, canvasDim, view)) {
384  continue;
385  }
386  bool drawnTrueLabel{false};
387  for (const xAOD::MuonSegment* segment : truthSegs) {
388  primitives.push_back(drawLine(localSegmentPars(*segment), canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
389  truthColor, kDotted, view));
390  if (!drawnTrueLabel) {
391  primitives.push_back(drawLabel(std::format("true parameters: {:}",makeLabel(localSegmentPars(*segment))),0.2, 0.89));
392  drawnTrueLabel = true;
393  }
394  paintSimHits(ctx,*segment, primitives, view);
395  }
396 
397  std::stringstream legendLabel{};
398  legendLabel<<"Event: "<<ctx.eventID().event_number()
399  <<", chamber : "<<m_idHelperSvc->toStringChamber(bucket.front()->identify())
400  <<",#"<<(view ==objViewEta ? "eta" : "phi")<<"-view";
401  if (!extraLabel.empty()) {
402  legendLabel<<" ("<<extraLabel<<")";
403  }
404  primitives.push_back(drawLabel(legendLabel.str(), 0.2, 0.96));
405 
406  primitives.push_back(drawAtlasLabel(0.75, 0.26, m_AtlasLabel));
407  primitives.push_back(drawLumiSqrtS(0.75,0.21, m_sqrtSLabel, m_lumiLabel));
408 
409  auto can = makeCanvas(ctx , canvasDim, view);
410  drawPrimitives(*can, primitives);
411 
412  saveCanvas(ctx, bucket.front()->identify(), *can, extraLabel);
413  }
414  if (m_canvasLimit <= m_canvCounter) {
415  primitives.clear();
416  closeSummaryCanvas();
417  }
418 
419  }
420 
421  void PatternVisualizationTool::visualizeSegment(const EventContext& ctx,
422  const MuonR4::Segment& segment,
423  const std::string& extraLabel) const {
424  PrimitiveVec primitives{};
425  visualizeSegment(ctx, segment,extraLabel, std::move(primitives));
426  }
427 
428  void PatternVisualizationTool::visualizeSegment(const EventContext& ctx,
429  const MuonR4::Segment& segment,
430  const std::string& extraLabel,
431  PrimitiveVec&& primitives) const {
433  if (m_canvCounter >= m_canvasLimit) {
434  return;
435  }
437  std::lock_guard guard{s_mutex};
439  //cppcheck-suppress identicalConditionAfterEarlyExit
440  if (m_canvCounter >= m_canvasLimit) {
441  return;
442  }
443  const LabeledSegmentSet truthSegs{getLabeledSegments(segment.parent()->getHitsInMax())};
444  if (truthSegs.empty() && m_displayOnlyTruth) {
445  return;
446  }
447  Parameters segPars{};
448  {
449  const ActsTrk::GeometryContext* geoCtx{nullptr};
450  if (!SG::get(geoCtx, m_geoCtxKey, ctx).isSuccess()) {
451  return;
452  }
453  const Amg::Transform3D trf{segment.msSector()->globalToLocalTrans(*geoCtx)};
454  const Amg::Vector3D locPos = trf * segment.position();
455  const Amg::Vector3D locDir = trf.linear() * segment.direction();
456  segPars[Acts::toUnderlying(ParamDefs::x0)] = locPos.x();
457  segPars[Acts::toUnderlying(ParamDefs::y0)] = locPos.y();
458  segPars[Acts::toUnderlying(ParamDefs::theta)] = locDir.theta();
459  segPars[Acts::toUnderlying(ParamDefs::phi)] = locDir.phi();
460  segPars[Acts::toUnderlying(ParamDefs::t0)] = segment.segementT0();
461  }
462 
463  std::array<double, 4> canvasDim{};
464  const std::size_t parsedPrimSize{primitives.size()};
465  for (const int view : {objViewEta, objViewPhi}) {
466  if ((view == objViewEta && !m_doEtaBucketViews) ||
467  (view == objViewPhi && !m_doPhiBucketViews)){
468  continue;
469  }
471  primitives.resize(parsedPrimSize);
472 
473  if (!drawHits(*segment.parent()->parentBucket(), segment.measurements(),
474  primitives, canvasDim, view)) {
475  continue;
476  }
477  for (const xAOD::MuonSegment* segment : truthSegs) {
478  primitives.push_back(drawLine(localSegmentPars(*segment), canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
479  truthColor, kDotted, view));
480  paintSimHits(ctx,*segment, primitives, view);
481  }
482  writeChi2(segPars, segment.measurements(), primitives);
483 
484  primitives.push_back(drawAtlasLabel(0.75, 0.26, m_AtlasLabel));
485  primitives.push_back(drawLumiSqrtS(0.75,0.21, m_sqrtSLabel, m_lumiLabel));
486 
487  primitives.push_back(drawLine(segPars, canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
488  parLineColor, kDashed, view));
489 
490 
491  std::stringstream legendLabel{};
492  const Identifier canvasId{segment.parent()->getHitsInMax().front()->identify()};
493  legendLabel<<"Event: "<<ctx.eventID().event_number() <<", chamber : "<<m_idHelperSvc->toStringChamber(canvasId)
494  <<std::format(", #chi^{{2}} /nDoF: {:.2f} ({:d})", segment.chi2() /std::max(1u, segment.nDoF()), segment.nDoF())
495  <<", #"<<(view ==objViewEta ? "eta" : "phi")<<"-view";
496 
497  if (!extraLabel.empty()) {
498  legendLabel<<" ("<<extraLabel<<")";
499  }
500  primitives.push_back(drawLabel(legendLabel.str(), 0.2, 0.96));
501  primitives.push_back(drawLabel(makeLabel(segPars),0.25, 0.91));
502 
503  auto canvas = makeCanvas(ctx, canvasDim, view);
504  drawPrimitives(*canvas, primitives);
505 
506  saveCanvas(ctx, canvasId, *canvas, extraLabel);
507  }
508  if (m_canvasLimit <= m_canvCounter) {
509  primitives.clear();
510  closeSummaryCanvas();
511  }
512  }
513 
514  template<class SpacePointType>
515  const SpacePoint*
516  PatternVisualizationTool::drawHit(const SpacePointType& hit, PrimitiveVec& primitives,
517  std::array<double, 4>& canvasDim, const unsigned int view,
518  unsigned int fillStyle) const {
519 
521  if ((view == objViewEta && !hit.measuresEta()) || (view == objViewPhi && !hit.measuresPhi())) {
522  return nullptr;
523  }
524 
525  if (hit.type() != xAOD::UncalibMeasType::Other) {
526  canvasDim[Edges::yLow] = std::min(canvasDim[Edges::yLow], hit.localPosition()[view] - hit.driftRadius());
527  canvasDim[Edges::yHigh] = std::max(canvasDim[Edges::yHigh], hit.localPosition()[view] + hit.driftRadius());
528  canvasDim[Edges::zLow] = std::min(canvasDim[Edges::zLow], hit.localPosition().z() - hit.driftRadius());
529  canvasDim[Edges::zHigh] = std::max(canvasDim[Edges::zHigh], hit.localPosition().z() + hit.driftRadius());
530  }
531 
532  const SpacePoint* underlyingSp{nullptr};
534  constexpr int invalidCalibFill = 3305;
535  if constexpr (std::is_same_v<SpacePointType, SpacePoint>) {
536  underlyingSp = &hit;
537  if (hit.type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
538  const auto* dc = static_cast<const xAOD::MdtDriftCircle*>(hit.primaryMeasurement());
540  fillStyle = invalidCalibFill;
541  }
542  }
543  } else if constexpr(std::is_same_v<SpacePointType, CalibratedSpacePoint>) {
544  underlyingSp = hit.spacePoint();
545  if (hit.fitState() == CalibratedSpacePoint::State::Valid) {
546  fillStyle = fullFilling;
547  } else if (hit.fitState() == CalibratedSpacePoint::State::FailedCalib) {
548  fillStyle = invalidCalibFill;
549  } else {
550  fillStyle = hatchedFilling;
551  }
552  }
553  switch(hit.type()) {
555  const auto* dc = static_cast<const xAOD::MdtDriftCircle*>(underlyingSp->primaryMeasurement());
556  primitives.push_back(drawDriftCircle(hit.localPosition(), dc->readoutElement()->innerTubeRadius(),
557  kBlack, hollowFilling));
558 
559  const int circColor = isLabeled(*dc) ? truthColor : kBlue;
560  primitives.push_back(drawDriftCircle(hit.localPosition(), hit.driftRadius(), circColor, fillStyle));
561  break;
563  const auto* meas{static_cast<const xAOD::RpcMeasurement*>(underlyingSp->primaryMeasurement())};
564  const int boxColor = isLabeled(*meas) ? truthColor : kGreen +2;
565  const double boxWidth = 0.5*std::sqrt(12)*std::sqrt(underlyingSp->covariance()[view]);
566  primitives.push_back(drawBox(hit.localPosition(), boxWidth, 0.5*meas->readoutElement()->gasGapPitch(),
567  boxColor, fillStyle));
568  break;
570  const auto* meas{static_cast<const xAOD::TgcStrip*>(underlyingSp->primaryMeasurement())};
571  const int boxColor = isLabeled(*meas) ? truthColor : kCyan + 2;
572  const double boxWidth = 0.5*std::sqrt(12)*std::sqrt(underlyingSp->covariance()[view]);
573  primitives.push_back(drawBox(hit.localPosition(), boxWidth, 0.5*meas->readoutElement()->gasGapPitch(),
574  boxColor, fillStyle));
575  break;
577  const int boxColor = isLabeled(*underlyingSp->primaryMeasurement()) ? truthColor : kAquamarine;
578  const double boxWidth = 5*Gaudi::Units::mm;
579  primitives.push_back(drawBox(hit.localPosition(), boxWidth, 10.*Gaudi::Units::mm,
580  boxColor, fillStyle));
581  break;
583  break;
585  const int boxColor = isLabeled(*underlyingSp->primaryMeasurement()) ? truthColor : kTeal;
586  const double boxWidth = 5*Gaudi::Units::mm;
587  primitives.push_back(drawBox(hit.localPosition(), boxWidth, 10.*Gaudi::Units::mm,
588  boxColor, fillStyle));
589  break;
590  } default: {
591  ATH_MSG_WARNING("Please implement proper drawings of the new small wheel.. "<<__FILE__<<":"<<__LINE__);
592  break;
593  }
594  }
595  return underlyingSp;
596  }
597 
598  template<class SpacePointType>
600  const std::vector<SpacePointType>& hitsToDraw,
601  std::vector<PrimitivePtr>& primitives,
602  std::array<double, 4>& canvasDim,
603  unsigned int view) const {
604 
605  canvasDim[Edges::yLow] = canvasDim[Edges::zLow] = 100. *Gaudi::Units::m;
606  canvasDim[Edges::yHigh] = canvasDim[Edges::zHigh] = -100. *Gaudi::Units::m;
607 
608  SpacePointSet drawnPoints{};
609  for (const SpacePointType& hit : hitsToDraw) {
610  drawnPoints.insert(drawHit(*hit, primitives, canvasDim, view, fullFilling));
611  }
612  if (m_displayBucket) {
613  for (const SpacePointBucket::value_type& hit : bucket) {
614  // Don't redraw the other points
615  if (drawnPoints.count(hit.get())) {
616  continue;
617  }
618  drawHit(*hit, primitives, canvasDim, view, hollowFilling);
619  }
620  }
621 
622  // adapt the draw range to make sure any detector elements we wish to display
623  // are included
624  for (auto & prim : primitives){
625  TBox* theBox = dynamic_cast<TBox*>(prim.get());
626  if (theBox){
627  canvasDim[Edges::zLow] = std::min(canvasDim[Edges::zLow], theBox->GetY1());
628  canvasDim[Edges::zHigh] = std::max(canvasDim[Edges::zHigh], theBox->GetY2());
629  }
630  }
631 
632  double width = (canvasDim[Edges::yHigh] - canvasDim[Edges::yLow])*m_canvasExtraScale;
633  double height = (canvasDim[Edges::zHigh] - canvasDim[Edges::zLow])*m_canvasExtraScale;
634  if (height > width) width = height;
635  else height = width;
636 
637  const double midPointX = 0.5 * (canvasDim[Edges::yHigh] + canvasDim[Edges::yLow]);
638  const double midPointY = 0.5 * (canvasDim[Edges::zHigh] + canvasDim[Edges::zLow]);
639  canvasDim[Edges::yLow] = midPointX - 0.5 * width;
640  canvasDim[Edges::zLow] = midPointY - 0.5 * height;
641  canvasDim[Edges::yHigh] = midPointX + 0.5 * width;
642  canvasDim[Edges::zHigh] = midPointY + 0.5 * height;
643  return drawnPoints.size() - drawnPoints.count(nullptr) > 1;
644  }
645  template<class SpacePointType>
647  const std::vector<SpacePointType>& hits,
648  PrimitiveVec& primitives,
649  const double legX, double startLegY,
650  const double endLegY) const {
651 
652 
653 
654  const auto [pos, dir] = makeLine(pars);
655 
656  for (const SpacePointType& hit : hits) {
657  const SpacePoint* underlyingSp{nullptr};
658  bool displayChi2{true};
659  if constexpr(std::is_same_v<SpacePointType, Segment::MeasType>) {
660  underlyingSp = hit->spacePoint();
661  displayChi2 = (hit->fitState() == CalibratedSpacePoint::State::Valid);
662  } else {
663  underlyingSp = hit;
664  }
665 
666 
667 
668  const Identifier hitId = underlyingSp ? underlyingSp->identify(): Identifier{};
669  std::string legendstream{};
670  switch(hit->type()) {
672  const int driftSign{SeedingAux::strawSign(pos, dir, *hit)};
673  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
674  legendstream = std::format("ML: {:1d}, TL: {:1d}, T: {:3d}, {:}",
675  idHelper.multilayer(hitId), idHelper.tubeLayer(hitId),
676  idHelper.tube(hitId), driftSign == -1 ? "L" : "R");
677  break;
679  const RpcIdHelper& idHelper{m_idHelperSvc->rpcIdHelper()};
680  legendstream= std::format("DR: {:1d}, DZ: {:1d}, GAP: {:1d}, #eta/#phi: {:}/{:}",
681  idHelper.doubletR(hitId), idHelper.doubletZ(hitId), idHelper.gasGap(hitId),
682  hit->measuresEta() ? "si" : "nay", hit->measuresPhi() ? "si" : "nay");
683  break;
685  const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
686  legendstream = std::format("ST: {:}, GAP: {:1d}, #eta/#phi: {:}/{:}",
687  m_idHelperSvc->stationNameString(hitId), idHelper.gasGap(hitId),
688  hit->measuresEta() ? "si" : "nay", hit->measuresPhi() ? "si" : "nay");
689  break;
691  const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
692  const auto* clus = static_cast<const xAOD::MMCluster*>(underlyingSp->primaryMeasurement());
693  const MuonGMR4::StripDesign& design = clus->readoutElement()->stripLayer(clus->layerHash()).design();
694  legendstream = std::format("ML: {:1d}, GAP: {:1d}, {:}", idHelper.multilayer(hitId), idHelper.gasGap(hitId),
695  !design.hasStereoAngle() ? "X" : design.stereoAngle() > 0 ? "U" :"V");
696  break;
698  const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
699  legendstream = std::format("ML: {:1d}, GAP: {:1d}, #eta/#phi: {:}/{:}",
700  idHelper.multilayer(hitId), idHelper.gasGap(hitId),
701  hit->measuresEta() ? "si" : "nay", hit->measuresPhi() ? "si" : "nay");
702  break;
704  legendstream = "Ext. constaint";
705  }
706  default:
707  break;
708  }
709  if (displayChi2) {
710  const double chi2 = SeedingAux::chi2Term(pos, dir,*hit);
711  legendstream+=std::format(", #chi^{{2}}: {:.2f}", chi2);
712  } else {
713  legendstream+=", #chi^{2}: ---";
714  }
715  primitives.push_back(drawLabel(legendstream, legX, startLegY, 14));
716  startLegY -= 0.05;
717  if (startLegY<= endLegY) {
718  break;
719  }
720  }
721  }
723  if (!m_outFile) return;
724  ATH_MSG_INFO("Close summary pdf & root file "<<m_allCanName);
725  if (m_allCan) {
726  m_allCan->cd();
727  m_allCan->SaveAs((m_allCanName +".pdf]").c_str());
728  m_allCan.reset();
729  }
730  m_outFile.reset();
731  }
732  std::unique_ptr<TCanvas> PatternVisualizationTool::makeCanvas(const EventContext& ctx,
733  const std::array<double, 4>& canvasDim,
734  const int view) const {
735  std::stringstream canvasName{};
736  canvasName<<name()<<"_"<<ctx.eventID().event_number()<<"_"<<m_canvCounter;
737  ATH_MSG_VERBOSE("Create new canvas "<<canvasName.str()<<" "<<canvasDim);
738  auto canvas = std::make_unique<TCanvas>(canvasName.str().c_str(), "all", m_canvasWidth, m_canvasHeight);
739  canvas->cd();
740  TH1F* frame = canvas->DrawFrame(canvasDim[Edges::yLow],canvasDim[Edges::zLow], canvasDim[Edges::yHigh], canvasDim[Edges::zHigh]);
741  frame->GetXaxis()->SetTitle(std::format("{:} [mm]", view == objViewEta ? 'y' : 'x').c_str());
742  frame->GetYaxis()->SetTitle("z [mm]");
743  return canvas;
744  }
745  void PatternVisualizationTool::saveCanvas(const EventContext& ctx,
746  const Identifier& chambId,
747  TCanvas& canvas,
748  const std::string& extraLabel) const {
749  // If an eta view closes the summary canvas & a phi view is processed
750  std::stringstream canvasName{};
751  canvasName<<m_canvasPrefix.value()<<"_"<<ctx.eventID().event_number()<<"_"<<(m_canvCounter++)<<"_"
752  <<m_idHelperSvc->stationNameString(chambId)
753  <<std::abs(m_idHelperSvc->stationEta(chambId))
754  <<(m_idHelperSvc->stationEta(chambId) >0 ? "A" : "C")
755  <<m_idHelperSvc->stationPhi(chambId);
756  if (!extraLabel.empty()) canvasName<<"_"<<removeNonAlphaNum(extraLabel);
757  ATH_MSG_VERBOSE("Save new plot "<<canvasName.str());
758  if (m_saveSinglePDFs) {
759  canvas.SaveAs(("Plots/" + m_canvasPrefix+"/" + canvasName.str()+".pdf").c_str());
760  }
761  if (m_saveSummaryPDF) {
762  canvas.SaveAs((m_allCanName+".pdf").c_str());
763  }
764  m_outFile->WriteObject(&canvas, canvasName.str().c_str());
765  }
766 }
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:24
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:51
MuonR4::SegmentSeed::parentBucket
const SpacePointBucket * parentBucket() const
Returns the bucket out of which the seed was formed.
Definition: SegmentSeed.cxx:49
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
MuonR4::CalibratedSpacePoint::State::FailedCalib
@ FailedCalib
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
MuonR4::CalibratedSpacePoint::State::Valid
@ Valid
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:96
ALFA_EventTPCnv_Dict::t0
std::vector< ALFA_RawData_p1 > t0
Definition: ALFA_EventTPCnvDict.h:42
xAOD::UncalibMeasType::MMClusterType
@ MMClusterType
MuonR4::Segment::measurements
const MeasVec & measurements() const
Returns the associated measurements.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:49
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:421
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:745
MuonR4::HoughPlane
Acts::HoughTransformUtils::HoughPlane< HoughHitType > HoughPlane
Definition: MuonHoughDefs.h:26
MuonR4::SpacePoint::secondaryMeasurement
const xAOD::UncalibratedMeasurement * secondaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:78
MuonR4::Segment::chi2
double chi2() const
Returns the chi2 of the segment fit.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:45
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:732
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:35
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:247
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
MuonR4::Segment::nDoF
unsigned int nDoF() const
Returns the number of degrees of freedom.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:47
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:111
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::Segment::position
const Amg::Vector3D & position() const
Returns the global segment position.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:41
MuonR4::SpacePoint::primaryMeasurement
const xAOD::UncalibratedMeasurement * primaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:75
MuonR4::houghTanBeta
double houghTanBeta(const Amg::Vector3D &v)
Returns the hough tanBeta [y] / [z].
Definition: SegmentFitterEventData.cxx:26
MuonValR4::PatternVisualizationTool::visualizeSeed
virtual void visualizeSeed(const EventContext &ctx, const MuonR4::SegmentSeed &seed, const std::string &extraLabel) const override final
Definition: PatternVisualizationTool.cxx:271
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:154
MuonR4::Segment::direction
const Amg::Vector3D & direction() const
Returns the global segment direction.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:43
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
MuonR4::Segment::parent
const SegmentSeed * parent() const
Returns the seed out of which the segment was built.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:51
MuonValR4::PatternVisualizationTool::isLabeled
virtual bool isLabeled(const MuonR4::SpacePoint &hit) const override final
Fetches all labeled (e.g.
Definition: PatternVisualizationTool.cxx:100
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
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
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:525
MuonR4::SegmentSeed::getHitsInMax
const std::vector< HitType > & getHitsInMax() const
Returns the list of assigned hits.
Definition: SegmentSeed.cxx:48
MdtIdHelper
Definition: MdtIdHelper.h:61
MuonR4::SegmentFit::Parameters
Acts::Experimental::CompositeSpacePointLineFitter::ParamVec_t Parameters
Definition: MuonHoughDefs.h:46
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:646
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
ActsTrk::GeometryContext
Definition: GeometryContext.h:28
MuonR4::Segment::msSector
const MuonGMR4::SpectrometerSector * msSector() const
Returns the associated MS sector.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:39
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:599
MdtDriftCircle.h
beamspotman.dir
string dir
Definition: beamspotman.py:619
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
MuonGMR4::SpectrometerSector::globalToLocalTrans
Amg::Transform3D globalToLocalTrans(const ActsTrk::GeometryContext &gctx) const
Returns the global -> local transformation from the ATLAS global.
Definition: SpectrometerSector.cxx:78
MuonValR4::PatternVisualizationTool::initialize
virtual StatusCode initialize() override final
Definition: PatternVisualizationTool.cxx:54
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:133
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:722
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)
Dumps the parameters into a string in the form of TLatex.
Definition: SegmentFitterEventData.cxx:64
MuonR4::SegmentFit::localSegmentPars
Parameters localSegmentPars(const xAOD::MuonSegment &seg)
Returns the localSegPars decoration from a xAODMuon::Segment.
Definition: SegmentFitterEventData.cxx:42
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
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:349
MuonR4::houghTanAlpha
double houghTanAlpha(const Amg::Vector3D &v)
: Returns the hough tanAlpha [x] / [z]
Definition: SegmentFitterEventData.cxx:30
python.compressB64.c
def c
Definition: compressB64.py:93
xAOD::UncalibMeasType::RpcStripType
@ RpcStripType
xAOD::UncalibMeasType::MdtDriftCircleType
@ MdtDriftCircleType
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:38
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
MuonR4::Segment::segementT0
double segementT0() const
Returns the fitted segment time, if there's any.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:59
MuonValR4::hatchedFilling
constexpr int hatchedFilling
Definition: VisualizationHelpers.h:22
python.SystemOfUnits.m
float m
Definition: SystemOfUnits.py:106
drawFromPickle.view
view
Definition: drawFromPickle.py:294
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
Identifier
Definition: IdentifierFieldParser.cxx:14
PatternVisualizationTool.h