ATLAS Offline Software
Loading...
Searching...
No Matches
TrackVisualizationTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
5
12
13
14#include <filesystem>
15#include <format>
16
17#include "TMarker.h"
18#include "TROOT.h"
19#include "TStyle.h"
20#include "TLegend.h"
21#include "TH1F.h"
22
23namespace {
24 using namespace MuonR4;
25 using PrimitivesVec_t = MuonValR4::TrackVisualizationTool::PrimitivesVec_t;
26 constexpr int truthColor = kOrange +2;
27
28 constexpr int ColorBarrel = kRed;
29 constexpr int ColorEndcapA = kBlue;
30 constexpr int ColorEndcapC = kGreen +2;
31 constexpr double inM = 1./ Gaudi::Units::m;
32
33 constexpr double extraMargin = 50.*Gaudi::Units::cm * inM;
34
35 static const Muon::MuonSectorMapping sectorMap{};
36
37
38 std::unique_ptr<TMarker> drawMarker(const Amg::Vector2D& pos, const int mStyle, const int mColor, const int mSize = 2) {
39 auto marker = std::make_unique<TMarker>(pos.x(), pos.y(), mStyle);
40 marker->SetMarkerColor(mColor);
41 marker->SetMarkerSize(mSize);
42 return marker;
43 }
44
45
46 inline int stationMarkerSyle(const Muon::MuonStationIndex::ChIndex ch,
47 const bool openMarker, const bool onSeed) {
50 case Inner:
51 case BarrelExtended:
52 case Extended:
53 return onSeed ? (openMarker ? kOpenTriangleUp : kFullTriangleUp)
54 : (openMarker ? kOpenTriangleDown : kFullTriangleDown);
55 case Middle:
56 return onSeed ? (openMarker ? kOpenCrossX : kFullCrossX)
57 : (openMarker ? kOpenCross : kFullCross);
58 case Outer:
59 return onSeed ? (openMarker ? kOpenFourTrianglesX: kFullFourTrianglesX)
60 : (openMarker ? kOpenThreeTriangles : kFullThreeTriangles);
61 default:
62 return 0;
63 }
64 }
65}
66
67namespace MuonValR4{
68
69 //** @brief Visualizing seeds and corresponding segments with different colors */
70 int seedColorIdx(std::size_t iSeed){
71 // Golden ratio hue stepping -> good spread even for many seeds
72 constexpr double phi = 0.6180339887498949;
73 const double h = 360 * std::fmod(0.13 + phi * double(iSeed), 1.0); // [0,1)
74 constexpr double s = 0.75;
75 constexpr double v = 0.95;
76
77 float r=0.f, g=0.f, b=0.f;
78 TColor::HLS2RGB(h, s, v, r, g, b);
79 return TColor::GetColor(r, g, b);
80 }
81
82 void TrackVisualizationTool::PlotLegend::addColor(const int color, const std::string& label){
83 if (colors.find(color) != colors.end()) {
84 return;
85 }
86 auto box = MuonValR4::drawBox(-1.5,-1.5,-1.,-1., color, MuonValR4::fullFilling);
87 legend->AddEntry(box.get(), label.c_str(), "F");
88 colors.insert(std::make_pair(color, std::move(box)));
89 }
90 void TrackVisualizationTool::PlotLegend::addMarker(const int marker, const std::string& label, const int color){
91 if (markers.find(marker)!= markers.end()) {
92 return;
93 }
94 auto tMarker = drawMarker(Amg::Vector2D{2.*Gaudi::Units::km, 0.}, marker, color);
95 legend->AddEntry(tMarker.get(), label.c_str(), "P");
96 markers.insert(std::make_pair(marker, std::move(tMarker)));
97 }
99 legend->SetBorderSize(0);
100 legend->SetNColumns(4);
101 canvas.add(std::move(legend));
102 for (auto&[i, obj] : colors){
103 canvas.add(std::move(obj));
104 }
105 for (auto&[i, obj]: markers) {
106 canvas.add(std::move(obj));
107 }
108 }
110 const Amg::Vector2D& posOnCylinder,
111 const DisplayView view) {
112 using enum DisplayView;
113 if (view == RZ) {
114 return Amg::Vector2D{ posOnCylinder[1]*inM, posOnCylinder[0]*inM};
115 }
116 const CxxUtils::sincos phi{phiV};
117 return posOnCylinder[0] * inM * Amg::Vector2D{phi.cs, phi.sn};
118 }
120 if (m_canvasLimit > 0) {
121 m_clientToken.canvasLimit = m_canvasLimit;
122 m_clientToken.preFixName = m_canvasPrefix;
123 m_clientToken.saveSinglePlots = m_saveSinglePDFs;
124 m_clientToken.saveSummaryPlot = m_saveSummaryPDF;
125 m_clientToken.subDirectory = m_subDir;
126 ATH_CHECK(m_visualSvc.retrieve());
127 ATH_CHECK(m_visualSvc->registerClient(m_clientToken));
128 } else {
129 m_plotsDone = true;
130 }
132 ATH_CHECK(m_geoCtxKey.initialize());
133 ATH_CHECK(m_extrapolationTool.retrieve(EnableTool{!m_extrapolationTool.empty()}));
134 return StatusCode::SUCCESS;
135 }
136 void TrackVisualizationTool::displaySeeds(const EventContext& ctx,
137 const MsTrackSeeder& seederObj,
138 const xAOD::MuonSegmentContainer& segments,
139 const MsTrackSeedContainer& seeds) const {
140 displaySeeds(ctx, seederObj, segments, seeds, PrimitivesVec_t{});
141 }
142 void TrackVisualizationTool::displaySeeds(const EventContext& ctx,
143 const MsTrackSeeder& seederObj,
144 const xAOD::MuonSegmentContainer& segments,
145 const MsTrackSeedContainer& seeds,
146 PrimitivesVec_t && extPrimitives) const {
147 if (m_plotsDone || segments.empty()) {
148 return;
149 }
150
151
152
153 displaySeeds(ctx, seederObj, DisplayView::RZ, segments, seeds, clone(extPrimitives));
154 displaySeeds(ctx, seederObj, DisplayView::XY, segments, seeds, std::move(extPrimitives));
155
156 //For each seed plot respective segment parameters
157
160
161 }
162
164 const EventContext& ctx,
165 const DisplayView view,
166 const MsTrackSeedContainer& seeds) const {
167
168 auto canvas = m_visualSvc->prepareCanvas(
169 ctx, m_clientToken,
170 std::format("SeedSegsGlobalTruth{:}", view == DisplayView::XY ? "XY" : "RZ"));
171
172 if (!canvas) { m_plotsDone = true; return; }
173
174 canvas->setAxisTitles(view == DisplayView::XY ? "x [m]" : "z [m]",
175 view == DisplayView::XY ? "y [m]" : "R [m]");
176
177 PlotLegend legend{0.005, 0.005, 0.6, 0.1};
178
179 PrimitivesVec_t primitives{};
180 bool drewAny{false};
181
182 // -----------------------
183 // (A) Draw TRUTH segments
184 // -----------------------
185 const xAOD::MuonSegmentContainer* truthSegs{nullptr};
186 if (!SG::get(truthSegs, m_truthSegKey, ctx).isSuccess()) {
187 THROW_EXCEPTION("Failed to fetch the truth segment container");
188 }
189 if (truthSegs) {
190 for (const xAOD::MuonSegment* seg : *truthSegs) {
191 if (!seg) continue;
192
193 const Amg::Vector3D p = seg->position();
194 const double x = p.x() * inM;
195 const double y = p.y() * inM;
196 const double z = p.z() * inM;
197 const double r = std::hypot(x, y);
198
199 const Amg::Vector2D plotPos =
200 (view == DisplayView::XY) ? Amg::Vector2D{x, y}
201 : Amg::Vector2D{z, r};
202
203 // Same station-based marker, but OPEN marker to visually separate truth vs reco
204 const auto chIdx = seg->chamberIndex();
205 const int mStyleTruth = stationMarkerSyle(chIdx, /*openMarker=*/true, /*onSeed=*/true);
206
207 primitives.emplace_back(drawMarker(plotPos, mStyleTruth, truthColor, /*mSize=*/3));
208 legend.addMarker(
209 mStyleTruth,
210 std::string(Muon::MuonStationIndex::layerName(Muon::MuonStationIndex::toLayerIndex(chIdx))) + " (truth)", truthColor);
211
212 canvas->expandPad(plotPos.x() - extraMargin, plotPos.y() - extraMargin);
213 canvas->expandPad(plotPos.x() + extraMargin, plotPos.y() + extraMargin);
214 drewAny = true;
215 }
216 }
217
218 // ---------------------------------
219 // (B) Draw RECO seed-associated segs
220 // ---------------------------------
221 for (std::size_t iSeed = 0; iSeed < seeds.size(); ++iSeed) {
222 const MsTrackSeed& seed = seeds[iSeed];
223 const int color = seedColorIdx(iSeed);
224
225 std::string seedLabel = std::format("s{:d}: ", static_cast<int>(iSeed));
226
227 for (const xAOD::MuonSegment* seg : seed.segments()) {
228 if (!seg) continue;
229
230 const Amg::Vector3D p = seg->position();
231 const double x = p.x() * inM;
232 const double y = p.y() * inM;
233 const double z = p.z() * inM;
234 const double r = std::hypot(x, y);
235
236 const Amg::Vector2D plotPos =
237 (view == DisplayView::XY) ? Amg::Vector2D{x, y}
238 : Amg::Vector2D{z, r};
239
240 const auto chIdx = seg->chamberIndex();
241 const int mStyle = stationMarkerSyle(chIdx, /*openMarker=*/false, /*onSeed=*/true);
242
243 primitives.emplace_back(drawMarker(plotPos, mStyle, color));
244
245 std::string label = printID(*seg);
246 seedLabel += label + "_";
247
248 primitives.emplace_back(MuonValR4::drawLabel(label, plotPos.x() + 0.01, plotPos.y() + 0.01, 10, false, color));
249
250 // Marker legend: only one entry per station style (PlotLegend dedups)
251 legend.addMarker(
252 mStyle,
254
255 canvas->expandPad(plotPos.x() - extraMargin, plotPos.y() - extraMargin);
256 canvas->expandPad(plotPos.x() + extraMargin, plotPos.y() + extraMargin);
257 drewAny = true;
258 }
259 //Add text which shows segment names associated to the respective seeed
260 primitives.emplace_back(MuonValR4::drawLabel(seedLabel, 0.15, 0.9 - (0.03*iSeed), 10, true, color));
261 }
262
263 if (!drewAny) { canvas->trash(); return; }
264
265 for (auto& p : primitives) canvas->add(std::move(p));
266 legend.fillPrimitives(*canvas);
267}
268
269
270
271
272 void TrackVisualizationTool::displaySeeds(const EventContext& ctx,
273 const MsTrackSeeder& seeder,
274 const DisplayView view,
275 const xAOD::MuonSegmentContainer& segments,
276 const MsTrackSeedContainer& seeds,
277 PrimitivesVec_t&& extPrimitives) const{
278
279 auto canvas = m_visualSvc->prepareCanvas(ctx, m_clientToken, std::format("SeedDisplay{:}",
280 view == DisplayView::XY ? "XY" : "RZ" ));
281
282 if (!canvas) {
283 m_plotsDone = true;
284 return;
285 }
286 canvas->setAxisTitles(view == DisplayView::XY ? "x [m]" : "z [m]",
287 view == DisplayView::XY ? "y [m]" : "R [m]");
288
289 PlotLegend legend{0.005,0.005, 0.6,0.1};
291 fillTruthSeedPoints(ctx, seeder, view, legend, *canvas);
292
293 auto onSeed = [&seeds](const xAOD::MuonSegment* segment,
294 const Location loc) {
295 return std::ranges::any_of(seeds,[segment, loc](const MsTrackSeed& seed){
296 return seed.location() == loc && std::ranges::find(seed.segments(), segment) != seed.segments().end();
297 });
298 };
299
300 const ActsTrk::GeometryContext* gctx{nullptr};
301 if (!SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
302 THROW_EXCEPTION("Failed to fetch the geometry context "<<m_geoCtxKey.fullKey());
303 }
304 bool drawnPoint{false};
305
306 for (const xAOD::MuonSegment* segment: segments) {
307 using enum Location;
309 using namespace Muon;
310 const MuonGMR4::SpectrometerSector* msSector = detailedSegment(*segment)->msSector();
311 const auto chIdx = segment->chamberIndex();
312 const int mColor = msSector->barrel() ? ColorBarrel : (msSector->side() > 0 ? ColorEndcapA : ColorEndcapC);
313
314 for (const auto secProj : {leftOverlap, center, rightOverlap}) {
315 if (!sectorMap.insideSector(segment->sector() + Acts::toUnderlying(secProj),
316 segment->position().phi())){
317 continue;
318 }
319
320 for (const Location loc : {Barrel, Endcap}) {
321 const Amg::Vector2D projPos{seeder.expressOnCylinder(*gctx, *segment, loc, secProj)};
322 if (!seeder.withinBounds(projPos, loc)) {
323 continue;
324 }
325 drawnPoint = true;
326 const bool isGood = onSeed(segment, loc);
327 const int mStyle = stationMarkerSyle(chIdx, true, isGood);
328 const double phi = seeder.projectedPhi(segment->sector(), secProj);
329 const Amg::Vector2D markerPos{viewVector(phi, projPos, view)};
330 extPrimitives.emplace_back(drawMarker(markerPos, mStyle, mColor));
331
332 if (view == DisplayView::XY) {
333 const double r = markerPos.mag() + extraMargin;
334 canvas->expandPad(r, r);
335 canvas->expandPad(-r, -r);
336 } else {
337 canvas->expandPad(markerPos[0] - extraMargin, markerPos[1] - extraMargin);
338 canvas->expandPad(markerPos[0] + extraMargin, markerPos[1] + extraMargin);
339 }
340 legend.addMarker(mStyle, std::format("{:}{:}", MuonStationIndex::layerName(MuonStationIndex::toLayerIndex(chIdx)),
341 isGood ? "" : " (discarded)"), mColor);
342 legend.addColor(mColor, msSector->barrel() ? "Barrel" : msSector->side() > 0 ? "Endcap A" : "Endcap C");
343 }
344 }
345 }
346 if (!drawnPoint) {
347 canvas->trash();
348 return;
349 }
350 for (const MsTrackSeed& seed : seeds) {
351 const Amg::Vector3D& pos{seed.position()};
352 canvas->add(drawMarker(viewVector(pos.phi(), Amg::Vector2D{pos.perp(), pos.z()}, view),
353 kFullDiamond, kBlack));
354 legend.addMarker(kFullDiamond, "track seed");
355 }
357 for (unsigned int s = 1; s<=16 ; ++s) {
358 if (view != DisplayView::XY) {
359 break;
360 }
361 const double phi = sectorMap.sectorPhi(s);
362 const double dPhi = sectorMap.sectorWidth(s);
363
364 const int lStyle = s%2 ? kDashed : kDotted;
365 const double r = canvas->corner(Edges::xHigh);
366 const CxxUtils::sincos phiM{phi-dPhi}, phiP{phi+dPhi};
367 const Amg::Vector2D e1{r * phiM.cs, r * phiM.sn};
368 const Amg::Vector2D e2{r * phiP.cs, r * phiP.sn};
369
370 auto theLine = std::make_unique<TLine>(0.,0., e1.x(), e1.y());
371 theLine->SetLineStyle(lStyle);
372 extPrimitives.insert(extPrimitives.begin(), std::move(theLine));
373 theLine = std::make_unique<TLine>(0.,0., e2.x(), e2.y());
374 theLine->SetLineStyle(lStyle);
375 extPrimitives.insert(extPrimitives.begin(), std::move(theLine));
376 theLine = std::make_unique<TLine>(e1.x(), e1.y(), e2.x(), e2.y());
377 theLine->SetLineStyle(lStyle);
378 extPrimitives.insert(extPrimitives.begin(), std::move(theLine));
379 }
380 legend.fillPrimitives(*canvas);
381 }
383 const MsTrackSeeder& seeder,
384 const DisplayView view,
385 PlotLegend& legend,
386 Canvas_t& canvas) const {
387 const xAOD::MuonSegmentContainer* truthSegs{nullptr};
388 if (!SG::get(truthSegs,m_truthSegKey, ctx).isSuccess()) {
389 THROW_EXCEPTION("Failed to fetch the truth segment container");
390 }
391 if (!truthSegs) {
392 return;
393 }
394 const ActsTrk::GeometryContext* gctx{nullptr};
395 if (!SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
396 THROW_EXCEPTION("Failed to fetch the geometry context "<<m_geoCtxKey.fullKey());
397 }
398
399 bool addedEntry{false};
400 for (const xAOD::MuonSegment* segment: *truthSegs) {
401 const auto chIdx = segment->chamberIndex();
402 const int mStyle = stationMarkerSyle(chIdx, true, true);
403
404 using enum Location;
406 for (const auto secProj : {leftOverlap, center, rightOverlap}) {
407 if (!sectorMap.insideSector(segment->sector() + Acts::toUnderlying(secProj),
408 segment->position().phi())){
409 continue;
410 }
411 for (const Location loc : {Barrel, Endcap}) {
412 const Amg::Vector2D projected{seeder.expressOnCylinder(*gctx, *segment, loc, secProj)};
413 if (!seeder.withinBounds(projected, loc)) {
414 continue;
415 }
416 const double phi = MsTrackSeeder::projectedPhi(segment->sector(), secProj);
417 canvas.add(drawMarker(viewVector(phi, projected, view), mStyle, truthColor, 3));
418 legend.addMarker(mStyle, Muon::MuonStationIndex::layerName(Muon::MuonStationIndex::toLayerIndex(chIdx)), truthColor);
419 addedEntry = true;
420 }
421 }
422 }
423 if (addedEntry) {
424 legend.addColor(truthColor, "truth");
425 }
426 }
428 const MuonR4::MsTrackSeed& seed,
429 const OptBoundPars_t& parsToExt,
430 const std::string& objName) const {
432 return;
433 }
434 const ActsTrk::GeometryContext* gctx{nullptr};
435 SG::get(gctx, m_geoCtxKey, ctx).ignore();
436
437 Acts::ObjVisualization3D visualHelper{};
438 const std::string subDir = std::format("./ObjDisplays/{:}/", m_subDir.value());
439 ensureDirectory(subDir);
440 if (parsToExt.ok() && m_extrapolationTool.isEnabled()) {
441 auto stepsResult = m_extrapolationTool->propagationSteps(ctx, *parsToExt);
442 if (stepsResult.ok()) {
443 MuonValR4::drawPropagation(stepsResult->first, visualHelper);
444 } else {
445 ATH_MSG_WARNING("Failed to extrapolate the seed for visualization: " << stepsResult.error().message());
446 }
447 }
448 std::string segStr{removeNonAlphaNum(objName)};
449 for (const xAOD::MuonSegment* seg : seed.segments()) {
450 MuonValR4::drawSegmentMeasurements(*gctx,* seg, visualHelper);
451 MuonValR4::drawSegmentLine(*gctx,*seg, visualHelper);
452 segStr += std::format("_{:}", MuonR4::printID(*seg));
453 }
454
455 unsigned fileVersion{0};
456 std::string finalStr{};
457 while (finalStr.empty() || std::filesystem::exists(finalStr)) {
458 finalStr = std::format("{:}/{:}_{:}_{:}_{:}.obj", subDir,
459 m_clientToken.preFixName, ctx.eventID().event_number(), ++fileVersion, segStr);
460 }
461 visualHelper.write(finalStr);
462 ++m_objCounter;
463 }
464}
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define y
#define x
#define z
bool empty() const noexcept
Returns true if the collection is empty.
A spectrometer sector forms the envelope of all chambers that are placed in the same MS sector & laye...
int8_t side() const
Returns the side of the MS-sector 1 -> A side ; -1 -> C side.
bool barrel() const
Returns whether the sector is placed in the barrel.
Helper class to group muon sgements that may belong to a muon trajectory.
bool withinBounds(const Amg::Vector2D &projPos, const Location loc) const
Returns whether the expression on the cylinder is within the surface bounds.
Amg::Vector2D expressOnCylinder(const ActsTrk::GeometryContext &gctx, const xAOD::MuonSegment &segment, const Location loc, const SectorProjector proj) const
Expresses the segment on the cylinder surface.
static double projectedPhi(const int sector, const SectorProjector proj)
Returns the projected phi for a given sector and projector.
SectorProjector
Enumeration to select the sector projection.
const MuonGMR4::SpectrometerSector * msSector() const
Returns the associated MS sector.
Gaudi::Property< unsigned > m_canvasLimit
Maximum canvases to draw.
virtual void displaySeeds(const EventContext &ctx, const MuonR4::MsTrackSeeder &seederObj, const xAOD::MuonSegmentContainer &segments, const MuonR4::MsTrackSeedContainer &seeds) const override final
Displays all segments on the representative cylinder in the R-Z & X-Y plane and draws the markers of ...
Gaudi::Property< std::string > m_canvasPrefix
Prefix of the individual canvas file names <MANDATORY>
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
Track extrapolation tool.
SG::ReadHandleKey< ActsTrk::GeometryContext > m_geoCtxKey
Dependency on the geometry alignment.
virtual StatusCode initialize() override final
std::atomic< unsigned > m_objCounter
How many obj have been produced.
ServiceHandle< IRootVisualizationService > m_visualSvc
Service handle of the visualization service.
std::atomic< bool > m_plotsDone
Flag toggling whether all Canvases have been exhausted.
virtual void displayTrackSeedObj(const EventContext &ctx, const MuonR4::MsTrackSeed &seed, const OptBoundPars_t &parsToExt, const std::string &objName="") const override final
Visualizes the measurements of the segments on the track seed together with their predicted local lin...
IRootVisualizationService::ClientToken m_clientToken
Token to present to the visualization service such that the display froms this tool are grouped toget...
IRootVisualizationService::ICanvasObject Canvas_t
static Amg::Vector2D viewVector(const double phi, const Amg::Vector2D &posOnCylinder, const DisplayView view)
Transforms the projected vector into the actual view, if it's xy then an external phi is needed to pl...
Gaudi::Property< bool > m_saveSinglePDFs
If set to true each canvas is saved into a dedicated pdf file.
Gaudi::Property< std::string > m_subDir
Define the subdirectory in which the plots shall be saved.
SG::ReadHandleKey< xAOD::MuonSegmentContainer > m_truthSegKey
Key to the truth segment selection to draw the segment parameters.
DisplayView
Enumeration to toggle whether the seeds shall be painted in x-y or R-z view.
void displaySeedSegmentsGlobalWithTruth(const EventContext &ctx, const DisplayView view, const MuonR4::MsTrackSeedContainer &seeds) const
Gaudi::Property< bool > m_saveSummaryPDF
If set to true a summary Canvas is created.
MuonR4::MsTrackSeed::Location Location
Enumeration to toggle whether the segment shall displayed on the barrel/endcap.
void fillTruthSeedPoints(const EventContext &ctx, const MuonR4::MsTrackSeeder &seeder, const DisplayView view, PlotLegend &legend, Canvas_t &canvas) const
Add the truth segments to the canvas.
double sectorPhi(int sector) const
returns the centeral phi position of a sector in radians
double sectorWidth(int sector) const
sector width (with overlap) in radians
bool insideSector(int sector, double phi) const
checks whether the phi position is consistent with sector
::Muon::MuonStationIndex::ChIndex chamberIndex() const
Returns the chamber index.
Amg::Vector3D position() const
Returns the position as Amg::Vector.
int r
Definition globals.cxx:22
std::string label(const std::string &format, int i)
Definition label.h:19
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
This header ties the generic definitions in this package.
std::vector< MsTrackSeed > MsTrackSeedContainer
Definition MsTrackSeed.h:63
std::string printID(const xAOD::MuonSegment &seg)
Print the chamber ID of a segment, e.g.
const Segment * detailedSegment(const xAOD::MuonSegment &seg)
Helper function to navigate from the xAOD::MuonSegment to the MuonR4::Segment.
Lightweight algorithm to read xAOD MDT sim hits and (fast-digitised) drift circles from SG and fill a...
void ensureDirectory(const std::string &path)
Ensures that the subdirectory in the path is created.
std::unique_ptr< TLatex > drawLabel(const std::string &text, const double xPos, const double yPos, const double textSize=18, const bool useNDC=true, const int color=kBlack)
Create a TLatex label,.
std::vector< std::unique_ptr< TObject > > clone(const std::vector< std::unique_ptr< TObject > > &cloneMe)
int seedColorIdx(std::size_t iSeed)
void drawPropagation(const std::vector< Acts::detail::Step > &steps, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewLine)
Draws the recorded propagation steps as a polygon line.
constexpr int fullFilling
std::string removeNonAlphaNum(std::string str)
Removes all non-alpha numerical characters from a string.
void drawSegmentMeasurements(const ActsTrk::GeometryContext &gctx, const xAOD::MuonSegment &segment, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewSensitive)
Draw all uncalibrated measurements associated to the segment.
void drawSegmentLine(const ActsTrk::GeometryContext &gctx, const xAOD::MuonSegment &segment, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewLine, const double standardLength=1.*Gaudi::Units::m)
Draw a segment line inside the obj file.
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.
const std::string & layerName(LayerIndex index)
convert LayerIndex into a string
LayerIndex toLayerIndex(ChIndex index)
convert ChIndex into LayerIndex
LayerIndex
enum to classify the different layers in the muon spectrometer
ChIndex
enum to classify the different chamber layers in the muon spectrometer
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
MuonSegmentContainer_v1 MuonSegmentContainer
Definition of the current "MuonSegment container version".
MuonSegment_v1 MuonSegment
Reference the current persistent version:
Helper to simultaneously calculate sin and cos of the same angle.
Definition sincos.h:39
Helper struct to administer the markers & colors that are added to the legend.
void fillPrimitives(Canvas_t &canvas)
Add the primitives of the legend to the Canvas.
void addColor(const int color, const std::string &label)
Add new color legend entry.
void addMarker(const int marker, const std::string &label, const int color=kBlack)
Add new Marker style to the legend entry.
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10