ATLAS Offline Software
Loading...
Searching...
No Matches
MuonValR4::TrackVisualizationTool Class Reference

#include <TrackVisualizationTool.h>

Inheritance diagram for MuonValR4::TrackVisualizationTool:
Collaboration diagram for MuonValR4::TrackVisualizationTool:

Classes

struct  PlotLegend
 Helper struct to administer the markers & colors that are added to the legend. More...

Public Member Functions

virtual ~TrackVisualizationTool ()=default
 Destructor.
virtual StatusCode initialize () override final
virtual void displaySeeds (const EventContext &ctx, 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 the successfully built seeds & truth segments.
virtual void displaySeeds (const EventContext &ctx, const MuonR4::MsTrackSeedContainer &seeds, PrimitivesVec_t &&extPrimitives) const override final
 Displays all segments on the representative cylinder in the R-Z & X-Y plane and draws the markers of the successfully built seeds & truth segments.
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 line parameters as an obj file.

Private Types

enum class  DisplayView { RZ , XY }
 Enumeration to toggle whether the seeds shall be painted in x-y or R-z view. More...
using Canvas_t = IRootVisualizationService::ICanvasObject
using Edges = Canvas_t::AxisRanges
using Location = MuonR4::MsTrackSeed::Location
 Enumeration to toggle whether the segment shall displayed on the barrel/endcap.

Private Member Functions

void displaySeeds (const EventContext &ctx, const DisplayView view, const xAOD::MuonSegmentContainer &segments, const MuonR4::MsTrackSeedContainer &seeds, PrimitivesVec_t &&extPrimitives) const
 Actual implementation of the display seeds method with the augmentation to define the view.
void fillTruthSeedPoints (const EventContext &ctx, const DisplayView view, PlotLegend &legend, Canvas_t &canvas) const
 Add the truth segments to the canvas.
void displaySeedSegmentsGlobalWithTruth (const EventContext &ctx, const DisplayView view, const MuonR4::MsTrackSeedContainer &seeds) const

Static Private Member Functions

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 place the marker.

Private Attributes

ToolHandle< ActsTrk::IExtrapolationToolm_extrapolationTool {this, "ExtrapolationTool" ,"" }
 Track extrapolation tool.
ServiceHandle< IRootVisualizationServicem_visualSvc {this, "VisualSvc", "MuonValR4::RootVisualizationService"}
 Service handle of the visualization service.
IRootVisualizationService::ClientToken m_clientToken {}
 Token to present to the visualization service such that the display froms this tool are grouped together.
SG::ReadHandleKey< xAOD::MuonSegmentContainerm_truthSegKey {this, "TruthSegkey", "MuonTruthSegments"}
 Key to the truth segment selection to draw the segment parameters.
ToolHandle< MuonR4::ITrackSeedingDiagnosticsToolm_seedingTool {this, "SeedingTool", ""}
 The track seeding tool to construct the seed candidates and to estimate the initial parameters.
SG::ReadHandleKey< xAOD::MuonSegmentContainerm_segmentKey {this, "SegmentContainer", "MuonSegmentsFromR4" }
 Declare the data dependency on the standard Mdt+Rpc+Tgc segment container & on the NSW segment container.
ActsTrk::GeoContextReadKey_t m_geoCtxKey {this, "AlignmentKey", "ActsAlignment", "cond handle key"}
 Dependency on the geometry alignment.
Gaudi::Property< unsigned > m_canvasLimit {this, "CanvasLimit", 5000}
 Maximum canvases to draw.
Gaudi::Property< bool > m_saveSinglePDFs {this, "saveSinglePDFs", true}
 If set to true each canvas is saved into a dedicated pdf file.
Gaudi::Property< bool > m_saveSummaryPDF {this, "saveSummaryPDF", true}
 If set to true a summary Canvas is created.
Gaudi::Property< std::string > m_subDir {this, "outSubDir", ""}
 Define the subdirectory in which the plots shall be saved.
Gaudi::Property< std::string > m_canvasPrefix {this, "CanvasPreFix", "MsTrackValid"}
 Prefix of the individual canvas file names <MANDATORY>.
std::atomic< bool > m_plotsDone {false}
 Flag toggling whether all Canvases have been exhausted.
std::atomic< unsigned > m_objCounter {0}
 How many obj have been produced.

Detailed Description

Definition at line 20 of file TrackVisualizationTool.h.

Member Typedef Documentation

◆ Canvas_t

◆ Edges

◆ Location

Enumeration to toggle whether the segment shall displayed on the barrel/endcap.

Definition at line 71 of file TrackVisualizationTool.h.

Member Enumeration Documentation

◆ DisplayView

Enumeration to toggle whether the seeds shall be painted in x-y or R-z view.

Enumerator
RZ 
XY 

Definition at line 73 of file TrackVisualizationTool.h.

73{RZ, XY};

Constructor & Destructor Documentation

◆ ~TrackVisualizationTool()

virtual MuonValR4::TrackVisualizationTool::~TrackVisualizationTool ( )
virtualdefault

Destructor.

Member Function Documentation

◆ displaySeeds() [1/3]

void MuonValR4::TrackVisualizationTool::displaySeeds ( const EventContext & ctx,
const DisplayView view,
const xAOD::MuonSegmentContainer & segments,
const MuonR4::MsTrackSeedContainer & seeds,
PrimitivesVec_t && extPrimitives ) const
private

Actual implementation of the display seeds method with the augmentation to define the view.

Parameters
ctxEventContext to access store gate & conditions
viewActual view to display
segmentsContainer of all MS segments in the event
seedsThe constructed track seeds from the event
extPrimitivesExtra TObjects that should be additionally painted onto the Canvases

First add the truth points

Draw the sector map

Definition at line 297 of file TrackVisualizationTool.cxx.

301 {
302
303 auto canvas = m_visualSvc->prepareCanvas(ctx, m_clientToken, std::format("SeedDisplay{:}",
304 view == DisplayView::XY ? "XY" : "RZ" ));
305
306 if (!canvas) {
307 m_plotsDone = true;
308 return;
309 }
310 canvas->setAxisTitles(view == DisplayView::XY ? "x [m]" : "z [m]",
311 view == DisplayView::XY ? "y [m]" : "R [m]");
312
313 PlotLegend legend{0.005,0.005, 0.6,0.1};
315 fillTruthSeedPoints(ctx, view, legend, *canvas);
316
317 auto onSeed = [&seeds](const xAOD::MuonSegment* segment,
318 const Location loc) {
319 return std::ranges::any_of(seeds,[segment, loc](const MsTrackSeed& seed){
320 return seed.location() == loc && std::ranges::find(seed.segments(), segment) != seed.segments().end();
321 });
322 };
323
324 const ActsTrk::GeometryContext* gctx{nullptr};
325 if (!SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
326 THROW_EXCEPTION("Failed to fetch the geometry context "<<m_geoCtxKey.fullKey());
327 }
328 const Acts::GeometryContext tgContext = gctx->context();
329 bool drawnPoint{false};
330
331 for (const xAOD::MuonSegment* segment: segments) {
332 using enum Location;
334 using namespace Muon;
335 const MuonGMR4::SpectrometerSector* msSector = detailedSegment(*segment)->msSector();
336 const auto chIdx = segment->chamberIndex();
337 const int mColor = msSector->barrel() ? ColorBarrel : (msSector->side() > 0 ? ColorEndcapA : ColorEndcapC);
338
339 for (const auto secProj : {leftOverlap, center, rightOverlap}) {
340 const ExpandedSector sector{static_cast<unsigned>(segment->sector()), secProj};
341 if (ExpandedSector{segment->position().phi()} != sector){
342 continue;
343 }
344
345 for (const Location loc : {Barrel, Endcap}) {
346 const Amg::Vector2D projPos{m_seedingTool->expressOnCylinder(tgContext, *segment, loc, sector)};
347 if (!m_seedingTool->withinBounds(projPos, loc)) {
348 continue;
349 }
350 drawnPoint = true;
351 const bool isGood = onSeed(segment, loc);
352 const int mStyle = stationMarkerSyle(chIdx, true, isGood);
353 const Amg::Vector2D markerPos{viewVector(sector.phi(), projPos, view)};
354 extPrimitives.emplace_back( drawMarker(markerPos, mStyle, mColor)); //Is this necessary?
355 canvas->add( drawMarker(markerPos, mStyle, mColor));
356
357 if (view == DisplayView::XY) {
358 const double r = markerPos.mag() + extraMargin;
359 canvas->expandPad(r, r);
360 canvas->expandPad(-r, -r);
361 } else {
362 canvas->expandPad(markerPos[0] - extraMargin, markerPos[1] - extraMargin);
363 canvas->expandPad(markerPos[0] + extraMargin, markerPos[1] + extraMargin);
364 }
365 legend.addMarker(mStyle, std::format("{:}{:}", MuonStationIndex::layerName(MuonStationIndex::toLayerIndex(chIdx)),
366 isGood ? "" : " (discarded)"), mColor);
367 legend.addColor(mColor, msSector->barrel() ? "Barrel" : msSector->side() > 0 ? "Endcap A" : "Endcap C");
368 }
369 }
370 }
371 if (!drawnPoint) {
372 canvas->trash();
373 return;
374 }
375 for (const MsTrackSeed& seed : seeds) {
376 const Amg::Vector3D& pos{seed.position()};
377 canvas->add(drawMarker(viewVector(pos.phi(), Amg::Vector2D{pos.perp(), pos.z()}, view),
378 kFullDiamond, kBlack));
379 legend.addMarker(kFullDiamond, "track seed");
380 }
382 for (unsigned int s = 1; s<=16 ; ++s) {
383 if (view != DisplayView::XY) {
384 break;
385 }
386 const double phi = sectorMap.sectorPhi(s);
387 const double dPhi = sectorMap.sectorWidth(s);
388
389 const int lStyle = s%2 ? kDashed : kDotted;
390 const double r = canvas->corner(Edges::xHigh);
391 const CxxUtils::sincos phiM{phi-dPhi}, phiP{phi+dPhi};
392 const Amg::Vector2D e1{r * phiM.cs, r * phiM.sn};
393 const Amg::Vector2D e2{r * phiP.cs, r * phiP.sn};
394
395 auto theLine = std::make_unique<TLine>(0.,0., e1.x(), e1.y());
396 theLine->SetLineStyle(lStyle);
397 extPrimitives.insert(extPrimitives.begin(), std::move(theLine));
398 theLine = std::make_unique<TLine>(0.,0., e2.x(), e2.y());
399 theLine->SetLineStyle(lStyle);
400 extPrimitives.insert(extPrimitives.begin(), std::move(theLine));
401 theLine = std::make_unique<TLine>(e1.x(), e1.y(), e2.x(), e2.y());
402 theLine->SetLineStyle(lStyle);
403 extPrimitives.insert(extPrimitives.begin(), std::move(theLine));
404 }
405 legend.fillPrimitives(*canvas);
406 }
Scalar phi() const
phi method
Acts::GeometryContext context() const
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.
double phi() const
Returns the phi angle of the expanded sector.
SectorProjector
Enumeration to select the sector projection of the regular MS sector.
const MuonGMR4::SpectrometerSector * msSector() const
Returns the associated MS sector.
void fillTruthSeedPoints(const EventContext &ctx, const DisplayView view, PlotLegend &legend, Canvas_t &canvas) const
Add the truth segments to the canvas.
ServiceHandle< IRootVisualizationService > m_visualSvc
Service handle of the visualization service.
std::atomic< bool > m_plotsDone
Flag toggling whether all Canvases have been exhausted.
IRootVisualizationService::ClientToken m_clientToken
Token to present to the visualization service such that the display froms this tool are grouped toget...
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...
ActsTrk::GeoContextReadKey_t m_geoCtxKey
Dependency on the geometry alignment.
ToolHandle< MuonR4::ITrackSeedingDiagnosticsTool > m_seedingTool
The track seeding tool to construct the seed candidates and to estimate the initial parameters.
MuonR4::MsTrackSeed::Location Location
Enumeration to toggle whether the segment shall displayed on the barrel/endcap.
::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
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
@ Endcap
Definition DetType.h:14
const Segment * detailedSegment(const xAOD::MuonSegment &seg)
Helper function to navigate from the xAOD::MuonSegment to the MuonR4::Segment.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
bool dPhi(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
double e2(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 2nd sampling
double e1(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 1st sampling
Muon_v1 Muon
Reference the current persistent version:
MuonSegment_v1 MuonSegment
Reference the current persistent version:
Helper struct to administer the markers & colors that are added to the legend.
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ displaySeeds() [2/3]

void MuonValR4::TrackVisualizationTool::displaySeeds ( const EventContext & ctx,
const MuonR4::MsTrackSeedContainer & seeds ) const
finaloverridevirtual

Displays all segments on the representative cylinder in the R-Z & X-Y plane and draws the markers of the successfully built seeds & truth segments.

Parameters
ctxEventContext to access store gate & conditions
seedsThe constructed track seeds from the event

Definition at line 147 of file TrackVisualizationTool.cxx.

148 {
149 displaySeeds(ctx, seeds, PrimitivesVec_t{});
150 }
virtual void displaySeeds(const EventContext &ctx, 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 ...

◆ displaySeeds() [3/3]

void MuonValR4::TrackVisualizationTool::displaySeeds ( const EventContext & ctx,
const MuonR4::MsTrackSeedContainer & seeds,
PrimitivesVec_t && extPrimitives ) const
finaloverridevirtual

Displays all segments on the representative cylinder in the R-Z & X-Y plane and draws the markers of the successfully built seeds & truth segments.

Parameters
ctxEventContext to access store gate & conditions
seedsThe constructed track seeds from the event

Definition at line 151 of file TrackVisualizationTool.cxx.

153 {
154
155
156 const xAOD::MuonSegmentContainer* segments{nullptr};
157 if (m_plotsDone || !SG::get(segments, m_segmentKey, ctx) || segments->empty()) {
158 return;
159 }
160
161 displaySeeds(ctx, DisplayView::RZ, *segments, seeds, clone(extPrimitives));
162 displaySeeds(ctx, DisplayView::XY, *segments, seeds, std::move(extPrimitives));
163
164 //For each seed plot respective segment parameters
165
168
169 }
bool empty() const noexcept
Returns true if the collection is empty.
SG::ReadHandleKey< xAOD::MuonSegmentContainer > m_segmentKey
Declare the data dependency on the standard Mdt+Rpc+Tgc segment container & on the NSW segment contai...
void displaySeedSegmentsGlobalWithTruth(const EventContext &ctx, const DisplayView view, const MuonR4::MsTrackSeedContainer &seeds) const
std::vector< std::unique_ptr< TObject > > clone(const std::vector< std::unique_ptr< TObject > > &cloneMe)
MuonSegmentContainer_v1 MuonSegmentContainer
Definition of the current "MuonSegment container version".

◆ displaySeedSegmentsGlobalWithTruth()

void MuonValR4::TrackVisualizationTool::displaySeedSegmentsGlobalWithTruth ( const EventContext & ctx,
const DisplayView view,
const MuonR4::MsTrackSeedContainer & seeds ) const
private

Definition at line 171 of file TrackVisualizationTool.cxx.

174 {
175
176 auto canvas = m_visualSvc->prepareCanvas(
177 ctx, m_clientToken,
178 std::format("SeedSegsGlobalTruth{:}", view == DisplayView::XY ? "XY" : "RZ"));
179
180 if (!canvas) { m_plotsDone = true; return; }
181
182 canvas->setAxisTitles(view == DisplayView::XY ? "x [m]" : "z [m]",
183 view == DisplayView::XY ? "y [m]" : "R [m]");
184
185 PlotLegend legend{0.005, 0.005, 0.6, 0.1};
186
187 PrimitivesVec_t primitives{};
188 bool drewAny{false};
189
190 // -----------------------
191 // (A) Draw TRUTH segments
192 // -----------------------
193 const xAOD::MuonSegmentContainer* truthSegs{nullptr};
194 if (!SG::get(truthSegs, m_truthSegKey, ctx).isSuccess()) {
195 THROW_EXCEPTION("Failed to fetch the truth segment container");
196 }
197 if (truthSegs) {
198 for (const xAOD::MuonSegment* seg : *truthSegs) {
199 if (!seg) continue;
200
201 // Same station-based marker, but OPEN marker to visually separate truth vs reco
202 const auto chIdx = seg->chamberIndex();
203 const int mStyleTruth = stationMarkerSyle(chIdx, /*openMarker=*/true, /*onSeed=*/true);
204
205 const Amg::Vector3D p = seg->position();
206 const double x = p.x() * inM;
207 const double y = p.y() * inM;
208 const double z = p.z() * inM;
209 const double r = std::hypot(x, y);
210 const Amg::Vector2D plotPos =
212 : Amg::Vector2D{z, r};
213 primitives.emplace_back(drawMarker(plotPos, mStyleTruth, truthColor, /*mSize=*/3));
214
215 //Plot direction of the segment as well
216 const double dir_x = seg->direction().x() * inM;
217 const double dir_y = seg->direction().y() * inM;
218 const double dir_z = seg->direction().z() * inM;
219 const Amg::Vector2D plotDir =
220 (view == DisplayView::XY) ? Amg::Vector2D{dir_x, dir_y}
221 : Amg::Vector2D{dir_z, std::hypot(dir_x, dir_y)};
222 primitives.emplace_back(drawArrow2D(plotPos, plotDir, truthColor));
223
224
225 legend.addMarker(
226 mStyleTruth,
227 std::string(Muon::MuonStationIndex::layerName(Muon::MuonStationIndex::toLayerIndex(chIdx))) + " (truth)", truthColor);
228
229 canvas->expandPad(plotPos.x() - extraMargin, plotPos.y() - extraMargin);
230 canvas->expandPad(plotPos.x() + extraMargin, plotPos.y() + extraMargin);
231 drewAny = true;
232 }
233 }
234
235 // ---------------------------------
236 // (B) Draw RECO seed-associated segs
237 // ---------------------------------
238 for (std::size_t iSeed = 0; iSeed < seeds.size(); ++iSeed) {
239 const MsTrackSeed& seed = seeds[iSeed];
240 const int color = seedColorIdx(iSeed);
241
242 std::string seedLabel = std::format("s{:d}: ", static_cast<int>(iSeed));
243
244 for (const xAOD::MuonSegment* seg : seed.segments()) {
245 if (!seg) continue;
246
247 const auto chIdx = seg->chamberIndex();
248 const int mStyle = stationMarkerSyle(chIdx, /*openMarker=*/false, /*onSeed=*/true);
249
250 const Amg::Vector3D p = seg->position();
251 const double x = p.x() * inM;
252 const double y = p.y() * inM;
253 const double z = p.z() * inM;
254 const double r = std::hypot(x, y);
255 const Amg::Vector2D plotPos =
257 : Amg::Vector2D{z, r};
258
259 primitives.emplace_back(drawMarker(plotPos, mStyle, color));
260
261 //Plot direction of the segment as well
262 const double dir_x = seg->direction().x() * inM;
263 const double dir_y = seg->direction().y() * inM;
264 const double dir_z = seg->direction().z() * inM;
265 const Amg::Vector2D plotDir =
266 (view == DisplayView::XY) ? Amg::Vector2D{dir_x, dir_y}
267 : Amg::Vector2D{dir_z, std::hypot(dir_x, dir_y)};
268 primitives.emplace_back(drawArrow2D(plotPos, plotDir, color));
269
270 std::string label = printID(*seg);
271 seedLabel += label + "_";
272
273 primitives.emplace_back(MuonValR4::drawLabel(label, plotPos.x() + 0.01, plotPos.y() + 0.01, 10, false, color));
274
275 // Marker legend: only one entry per station style (PlotLegend dedups)
276 legend.addMarker(
277 mStyle,
279
280 canvas->expandPad(plotPos.x() - extraMargin, plotPos.y() - extraMargin);
281 canvas->expandPad(plotPos.x() + extraMargin, plotPos.y() + extraMargin);
282 drewAny = true;
283 }
284 //Add text which shows segment names associated to the respective seeed
285 primitives.emplace_back(MuonValR4::drawLabel(seedLabel, 0.15, 0.9 - (0.03*iSeed), 10, true, color));
286 }
287
288 if (!drewAny) { canvas->trash(); return; }
289
290 for (auto& p : primitives) canvas->add(std::move(p));
291 legend.fillPrimitives(*canvas);
292}
#define y
#define x
#define z
SG::ReadHandleKey< xAOD::MuonSegmentContainer > m_truthSegKey
Key to the truth segment selection to draw the segment parameters.
std::string label(const std::string &format, int i)
Definition label.h:19
std::string printID(const xAOD::MuonSegment &seg)
Print the chamber ID of a segment, e.g.
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,.
int seedColorIdx(std::size_t iSeed)
const std::string & layerName(LayerIndex index)
convert LayerIndex into a string
LayerIndex toLayerIndex(ChIndex index)
convert ChIndex into LayerIndex

◆ displayTrackSeedObj()

void MuonValR4::TrackVisualizationTool::displayTrackSeedObj ( const EventContext & ctx,
const MuonR4::MsTrackSeed & seed,
const OptBoundPars_t & parsToExt,
const std::string & objName = "" ) const
finaloverridevirtual

Visualizes the measurements of the segments on the track seed together with their predicted local line parameters as an obj file.

If parameters to extrapolate are parsed, then they're extrapolated to the end of the world and the trajectory is added to the obj

Parameters
ctxEventContext to fetch the conditions data & the event information
seedMsTrack to visualize
parsToExtParameters to extrapolate on top
objNameExtra token to be added to the file name

Definition at line 445 of file TrackVisualizationTool.cxx.

448 {
450 return;
451 }
452 const ActsTrk::GeometryContext* gctx{nullptr};
453 SG::get(gctx, m_geoCtxKey, ctx).ignore();
454
455 Acts::ObjVisualization3D visualHelper{};
456 const std::string subDir = std::format("./ObjDisplays/{:}/", m_subDir.value());
457 ensureDirectory(subDir);
458 if (parsToExt.ok() && m_extrapolationTool.isEnabled()) {
459 auto stepsResult = m_extrapolationTool->propagationSteps(ctx, *parsToExt);
460 if (stepsResult.ok()) {
461 MuonValR4::drawPropagation(stepsResult->first, visualHelper);
462 } else {
463 ATH_MSG_WARNING("Failed to extrapolate the seed for visualization: " << stepsResult.error().message());
464 }
465 }
466 std::string segStr{removeNonAlphaNum(objName)};
467 for (const xAOD::MuonSegment* seg : seed.segments()) {
468 MuonValR4::drawSegmentMeasurements(gctx->context(),* seg, visualHelper);
469 MuonValR4::drawSegmentLine(gctx->context(), *seg, visualHelper);
470 segStr += std::format("_{:}", MuonR4::printID(*seg));
471 }
472
473 unsigned fileVersion{0};
474 std::string finalStr{};
475 while (finalStr.empty() || std::filesystem::exists(finalStr)) {
476 finalStr = std::format("{:}/{:}_{:}_{:}_{:}.obj", subDir,
477 m_clientToken.preFixName, ctx.eventID().event_number(), ++fileVersion, segStr);
478 }
479 visualHelper.write(finalStr);
480 ++m_objCounter;
481 }
#define ATH_MSG_WARNING(x)
Gaudi::Property< unsigned > m_canvasLimit
Maximum canvases to draw.
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
Track extrapolation tool.
std::atomic< unsigned > m_objCounter
How many obj have been produced.
Gaudi::Property< std::string > m_subDir
Define the subdirectory in which the plots shall be saved.
void ensureDirectory(const std::string &path)
Ensures that the subdirectory in the path is created.
void drawSegmentMeasurements(const Acts::GeometryContext &tgContext, const xAOD::MuonSegment &segment, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewSensitive)
Draw all uncalibrated measurements associated to the segment.
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.
void drawSegmentLine(const Acts::GeometryContext &tgContext, 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::string removeNonAlphaNum(std::string str)
Removes all non-alpha numerical characters from a string.

◆ fillTruthSeedPoints()

void MuonValR4::TrackVisualizationTool::fillTruthSeedPoints ( const EventContext & ctx,
const DisplayView view,
PlotLegend & legend,
Canvas_t & canvas ) const
private

Add the truth segments to the canvas.

Parameters
ctxEventContext to access store gate
viewActual view to display
legendReference to the legend object to add the marker / truth legends
canvasReference to the canvas to which the drawn markers are appended to

Definition at line 407 of file TrackVisualizationTool.cxx.

410 {
411 const xAOD::MuonSegmentContainer* truthSegs{nullptr};
412 if (!SG::get(truthSegs,m_truthSegKey, ctx).isSuccess()) {
413 THROW_EXCEPTION("Failed to fetch the truth segment container");
414 }
415 if (!truthSegs) {
416 return;
417 }
418 const ActsTrk::GeometryContext* gctx{nullptr};
419 if (!SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
420 THROW_EXCEPTION("Failed to fetch the geometry context "<<m_geoCtxKey.fullKey());
421 }
422 const Acts::GeometryContext tgContext = gctx->context();
423 bool addedEntry{false};
424 for (const xAOD::MuonSegment* segment: *truthSegs) {
425 const auto chIdx = segment->chamberIndex();
426 const int mStyle = stationMarkerSyle(chIdx, true, true);
427
428 using enum Location;
430 ExpandedSector sector{segment->position().phi()};
431 for (const Location loc : {Barrel, Endcap}) {
432 const Amg::Vector2D projected{m_seedingTool->expressOnCylinder(tgContext, *segment, loc, sector)};
433 if (!m_seedingTool->withinBounds(projected, loc)) {
434 continue;
435 }
436 canvas.add(drawMarker(viewVector(sector.phi(), projected, view), mStyle, truthColor, 3));
438 addedEntry = true;
439 }
440 }
441 if (addedEntry) {
442 legend.addColor(truthColor, "truth");
443 }
444 }

◆ initialize()

StatusCode MuonValR4::TrackVisualizationTool::initialize ( )
finaloverridevirtual

Definition at line 128 of file TrackVisualizationTool.cxx.

128 {
129 if (m_canvasLimit > 0) {
130 m_clientToken.canvasLimit = m_canvasLimit;
131 m_clientToken.preFixName = m_canvasPrefix;
132 m_clientToken.saveSinglePlots = m_saveSinglePDFs;
133 m_clientToken.saveSummaryPlot = m_saveSummaryPDF;
134 m_clientToken.subDirectory = m_subDir;
135 ATH_CHECK(m_visualSvc.retrieve());
136 ATH_CHECK(m_visualSvc->registerClient(m_clientToken));
137 } else {
138 m_plotsDone = true;
139 }
141 ATH_CHECK(m_segmentKey.initialize());
142 ATH_CHECK(m_geoCtxKey.initialize());
143 ATH_CHECK(m_seedingTool.retrieve());
144 ATH_CHECK(m_extrapolationTool.retrieve(EnableTool{!m_extrapolationTool.empty()}));
145 return StatusCode::SUCCESS;
146 }
#define ATH_CHECK
Evaluate an expression and check for errors.
Gaudi::Property< std::string > m_canvasPrefix
Prefix of the individual canvas file names <MANDATORY>.
Gaudi::Property< bool > m_saveSinglePDFs
If set to true each canvas is saved into a dedicated pdf file.
Gaudi::Property< bool > m_saveSummaryPDF
If set to true a summary Canvas is created.

◆ viewVector()

Amg::Vector2D MuonValR4::TrackVisualizationTool::viewVector ( const double phi,
const Amg::Vector2D & posOnCylinder,
const DisplayView view )
staticprivate

Transforms the projected vector into the actual view, if it's xy then an external phi is needed to place the marker.

Parameters
phiAngle for the xy view - taken from the segment direction
posOnCylinderProjection of the segment's position onto the seed cylinder
viewActual view to display

Definition at line 118 of file TrackVisualizationTool.cxx.

120 {
121 using enum DisplayView;
122 if (view == RZ) {
123 return Amg::Vector2D{ posOnCylinder[1]*inM, posOnCylinder[0]*inM};
124 }
125 const CxxUtils::sincos phi{phiV};
126 return posOnCylinder[0] * inM * Amg::Vector2D{phi.cs, phi.sn};
127 }
DisplayView
Enumeration to toggle whether the seeds shall be painted in x-y or R-z view.

Member Data Documentation

◆ m_canvasLimit

Gaudi::Property<unsigned> MuonValR4::TrackVisualizationTool::m_canvasLimit {this, "CanvasLimit", 5000}
private

Maximum canvases to draw.

Definition at line 125 of file TrackVisualizationTool.h.

125{this, "CanvasLimit", 5000};

◆ m_canvasPrefix

Gaudi::Property<std::string> MuonValR4::TrackVisualizationTool::m_canvasPrefix {this, "CanvasPreFix", "MsTrackValid"}
private

Prefix of the individual canvas file names <MANDATORY>.

Definition at line 133 of file TrackVisualizationTool.h.

133{this, "CanvasPreFix", "MsTrackValid"};

◆ m_clientToken

IRootVisualizationService::ClientToken MuonValR4::TrackVisualizationTool::m_clientToken {}
private

Token to present to the visualization service such that the display froms this tool are grouped together.

Definition at line 113 of file TrackVisualizationTool.h.

113{};

◆ m_extrapolationTool

ToolHandle<ActsTrk::IExtrapolationTool> MuonValR4::TrackVisualizationTool::m_extrapolationTool {this, "ExtrapolationTool" ,"" }
private

Track extrapolation tool.

Definition at line 108 of file TrackVisualizationTool.h.

108{this, "ExtrapolationTool" ,"" };

◆ m_geoCtxKey

ActsTrk::GeoContextReadKey_t MuonValR4::TrackVisualizationTool::m_geoCtxKey {this, "AlignmentKey", "ActsAlignment", "cond handle key"}
private

Dependency on the geometry alignment.

Definition at line 123 of file TrackVisualizationTool.h.

123{this, "AlignmentKey", "ActsAlignment", "cond handle key"};

◆ m_objCounter

std::atomic<unsigned> MuonValR4::TrackVisualizationTool::m_objCounter {0}
mutableprivate

How many obj have been produced.

Definition at line 137 of file TrackVisualizationTool.h.

137{0};

◆ m_plotsDone

std::atomic<bool> MuonValR4::TrackVisualizationTool::m_plotsDone {false}
mutableprivate

Flag toggling whether all Canvases have been exhausted.

Definition at line 135 of file TrackVisualizationTool.h.

135{false};

◆ m_saveSinglePDFs

Gaudi::Property<bool> MuonValR4::TrackVisualizationTool::m_saveSinglePDFs {this, "saveSinglePDFs", true}
private

If set to true each canvas is saved into a dedicated pdf file.

Definition at line 127 of file TrackVisualizationTool.h.

127{this, "saveSinglePDFs", true};

◆ m_saveSummaryPDF

Gaudi::Property<bool> MuonValR4::TrackVisualizationTool::m_saveSummaryPDF {this, "saveSummaryPDF", true}
private

If set to true a summary Canvas is created.

Definition at line 129 of file TrackVisualizationTool.h.

129{this, "saveSummaryPDF", true};

◆ m_seedingTool

ToolHandle<MuonR4::ITrackSeedingDiagnosticsTool> MuonValR4::TrackVisualizationTool::m_seedingTool {this, "SeedingTool", ""}
private

The track seeding tool to construct the seed candidates and to estimate the initial parameters.

Definition at line 117 of file TrackVisualizationTool.h.

117{this, "SeedingTool", ""};

◆ m_segmentKey

SG::ReadHandleKey<xAOD::MuonSegmentContainer> MuonValR4::TrackVisualizationTool::m_segmentKey {this, "SegmentContainer", "MuonSegmentsFromR4" }
private

Declare the data dependency on the standard Mdt+Rpc+Tgc segment container & on the NSW segment container.

Definition at line 120 of file TrackVisualizationTool.h.

120{this, "SegmentContainer", "MuonSegmentsFromR4" };

◆ m_subDir

Gaudi::Property<std::string> MuonValR4::TrackVisualizationTool::m_subDir {this, "outSubDir", ""}
private

Define the subdirectory in which the plots shall be saved.

Definition at line 131 of file TrackVisualizationTool.h.

131{this, "outSubDir", ""};

◆ m_truthSegKey

SG::ReadHandleKey<xAOD::MuonSegmentContainer> MuonValR4::TrackVisualizationTool::m_truthSegKey {this, "TruthSegkey", "MuonTruthSegments"}
private

Key to the truth segment selection to draw the segment parameters.

Definition at line 115 of file TrackVisualizationTool.h.

115{this, "TruthSegkey", "MuonTruthSegments"};

◆ m_visualSvc

ServiceHandle<IRootVisualizationService> MuonValR4::TrackVisualizationTool::m_visualSvc {this, "VisualSvc", "MuonValR4::RootVisualizationService"}
private

Service handle of the visualization service.

Definition at line 110 of file TrackVisualizationTool.h.

110{this, "VisualSvc", "MuonValR4::RootVisualizationService"};

The documentation for this class was generated from the following files: