|
ATLAS Offline Software
|
#include <PatternVisualizationTool.h>
|
| PatternVisualizationTool (const std::string &type, const std::string &name, const IInterface *parent) |
|
virtual StatusCode | initialize () override final |
|
virtual StatusCode | finalize () override final |
|
virtual void | visualizeBucket (const EventContext &ctx, const MuonR4::SpacePointBucket &bucket, const std::string &extraLabel) const override final |
|
virtual void | visualizeBucket (const EventContext &ctx, const MuonR4::SpacePointBucket &bucket, const std::string &extraLabel, PrimitiveVec &&extraPaints) const override final |
|
virtual void | visualizeSeed (const EventContext &ctx, const MuonR4::SegmentSeed &seed, const std::string &extraLabel) const override final |
|
virtual void | visualizeSeed (const EventContext &ctx, const MuonR4::SegmentSeed &seed, const std::string &extraLabel, PrimitiveVec &&extraPaints) const override final |
|
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 |
|
virtual void | visualizeAccumulator (const EventContext &ctx, const MuonR4::HoughPlane &accumulator, const Acts::HoughTransformUtils::HoughAxisRanges &axisRanges, const MaximumVec &maxima, const std::string &extraLabel, PrimitiveVec &&extraPaints) const override final |
|
virtual void | visualizeSegment (const EventContext &ctx, const MuonR4::Segment &segment, const std::string &extraLabel) const override final |
|
virtual void | visualizeSegment (const EventContext &ctx, const MuonR4::Segment &segment, const std::string &extraLabel, PrimitiveVec &&extraPaints) const override final |
|
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. More...
|
|
virtual LabeledSegmentSet | getLabeledSegments (const std::vector< const xAOD::UncalibratedMeasurement * > &hits) const override final |
|
virtual bool | isLabeled (const MuonR4::SpacePoint &hit) const override final |
| Fetches all labeled (e.g. More...
|
|
virtual bool | isLabeled (const xAOD::UncalibratedMeasurement &hit) const override final |
|
template<class SpacePointType > |
const SpacePoint * | drawHit (const SpacePointType &hit, PrimitiveVec &primitives, std::array< double, 4 > &canvasDim, const unsigned int view, unsigned int fillStyle) const |
|
|
void | closeSummaryCanvas () const |
| Closes the summary canvas & closes the associated ROOT file. More...
|
|
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. More...
|
|
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. More...
|
|
template<class SpacePointType > |
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 of the box surrounding the event. More...
|
|
template<class SpacePointType > |
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. More...
|
|
template<class SpacePointType > |
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. More...
|
|
void | drawPrimitives (const TCanvas &can, PrimitiveVec &primitives) const |
| Draw the various primitives onto the Canvas. More...
|
|
|
Gaudi::Property< unsigned int > | m_canvasLimit {this, "CanvasLimits", 5000} |
| Maximum canvases to draw. More...
|
|
Gaudi::Property< bool > | m_saveSinglePDFs {this, "saveSinglePDFs", false} |
| If set to true each canvas is saved into a dedicated pdf file. More...
|
|
Gaudi::Property< bool > | m_saveSummaryPDF {this, "saveSummaryPDF", false} |
| If set to true a summary Canvas is created. More...
|
|
Gaudi::Property< std::string > | m_allCanName {this, "AllCanvasName", "AllPatternPlots"} |
| Name of the summary canvas & the ROOT file to save the monitoring plots. More...
|
|
Gaudi::Property< std::string > | m_canvasPrefix {this, "CanvasPreFix", ""} |
| Prefix of the individual canvas file names <MANDATORY>
More...
|
|
Gaudi::Property< bool > | m_displayBucket {this, "displayBucket", true} |
| Display the surrounding hits from the bucket not part of the seed. More...
|
|
Gaudi::Property< double > | m_canvasExtraScale {this, "CanvasExtraScale" , 1.5} |
| Extra safety margin to zoom out from the Canvas. More...
|
|
Gaudi::Property< bool > | m_accumlIsEta {this, "AccumulatorsInEtaPlane", true} |
| Swtich toggling whether the accumulator view are in the eta or phi plane. More...
|
|
Gaudi::Property< bool > | m_doEtaBucketViews {this,"doEtaBucketViews", true} |
| Switch to visualize the eta view of the bucket event. More...
|
|
Gaudi::Property< bool > | m_doPhiBucketViews {this,"doPhiBucketViews", true} |
| Switch to visualize the phi view of the bucket event. More...
|
|
Gaudi::Property< std::string > | m_AtlasLabel {this, "AtlasLabel", "Internal"} |
| ATLAS label (Internal / Prelimnary / Simulation) More...
|
|
Gaudi::Property< std::string > | m_sqrtSLabel {this, "SqrtSLabel", "14"} |
| Centre of mass energy label. More...
|
|
Gaudi::Property< std::string > | m_lumiLabel {this, "LumiLabel", ""} |
| Luminosity label. More...
|
|
SG::ReadHandleKeyArray< xAOD::UncalibratedMeasurementContainer > | m_prepContainerKeys {this, "PrdContainer", {}} |
| Declare dependency on the prep data containers. More...
|
|
Gaudi::Property< std::set< std::string > > | m_truthSegLinks {this, "TruthSegDecors", {}} |
| List of truth segment links to fetch. More...
|
|
SG::ReadDecorHandleKeyArray< xAOD::UncalibratedMeasurementContainer > | m_truthLinkDecorKeys {this, "LinkDecorKeys", {}} |
| Declaration of the dependency on the decorations. More...
|
|
std::vector< SegLinkDecor_t > | m_truthLinkDecors {} |
|
Gaudi::Property< unsigned > | m_canvasWidth {this, "CanvasWidth", 800} |
|
Gaudi::Property< unsigned > | m_canvasHeight {this, "CanvasHeight", 600} |
|
Gaudi::Property< bool > | m_displayOnlyTruth {this, "displayTruthOnly", false} |
|
const MuonGMR4::MuonDetectorManager * | m_detMgr {nullptr} |
| pointer to the Detector manager More...
|
|
SG::ReadHandleKey< ActsGeometryContext > | m_geoCtxKey {this, "AlignmentKey", "ActsAlignment", "cond handle key"} |
| Geometry context key to retrieve the alignment. More...
|
|
ServiceHandle< Muon::IMuonIdHelperSvc > | m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"} |
| Service Handle to the IMuonIdHelperSvc. More...
|
|
std::unique_ptr< TCanvas > m_allCan | ATLAS_THREAD_SAFE {} |
|
std::unique_ptr< TFile > m_outFile | ATLAS_THREAD_SAFE {} |
|
std::atomic< unsigned int > m_canvCounter | ATLAS_THREAD_SAFE {0} |
| how many canvases have been visualized More...
|
|
Definition at line 29 of file PatternVisualizationTool.h.
◆ LabeledSegmentSet
◆ SegLink_t
◆ SegLinkDecor_t
◆ SegLinkVec_t
◆ PatternVisualizationTool()
MuonValR4::PatternVisualizationTool::PatternVisualizationTool |
( |
const std::string & |
type, |
|
|
const std::string & |
name, |
|
|
const IInterface * |
parent |
|
) |
| |
◆ closeSummaryCanvas()
void MuonValR4::PatternVisualizationTool::closeSummaryCanvas |
( |
| ) |
const |
|
private |
◆ drawHit() [1/2]
template<class SpacePointType >
Converts a Hit into a particular TBox/ TEllipse for drawing.
If the hit provides information that's requested for that view. The underlying space pointer is returned and the dimensions of the canvas are updated, if the drawing was succesful
- Parameters
-
hit | Reference to the hit to draw |
primitives | Vector into which the generated object is pushed |
canvasDim | Array encoding the canvas dimensions [0] -> low x; [1] -> high x, [2] -> low y, [3] -> high y |
view | Draw the hit either in the eta or phi view, |
fillStyle | Standard fill style for the box e.g. full. |
◆ drawHit() [2/2]
template<class SpacePointType >
const SpacePoint* MuonValR4::PatternVisualizationTool::drawHit |
( |
const SpacePointType & |
hit, |
|
|
PrimitiveVec & |
primitives, |
|
|
std::array< double, 4 > & |
canvasDim, |
|
|
const unsigned int |
view, |
|
|
unsigned int |
fillStyle |
|
) |
| const |
Don't draw any hit which is not participating in the view
Update the fill style accrodingly
Definition at line 491 of file PatternVisualizationTool.cxx.
495 static_assert(std::is_same_v<SpacePointType, SpacePoint> ||
496 std::is_same_v<SpacePointType, CalibratedSpacePoint>,
"Only usual & calibrated space points are supported");
503 canvasDim[Edges::yLow] =
std::min(canvasDim[Edges::yLow], hit.positionInChamber()[
view] - hit.driftRadius());
504 canvasDim[Edges::yHigh] =
std::max(canvasDim[Edges::yHigh], hit.positionInChamber()[
view] + hit.driftRadius());
505 canvasDim[Edges::zLow] =
std::min(canvasDim[Edges::zLow], hit.positionInChamber().z() - hit.driftRadius());
506 canvasDim[Edges::zHigh] =
std::max(canvasDim[Edges::zHigh], hit.positionInChamber().z() + hit.driftRadius());
511 constexpr
int invalidCalibFill = 3305;
512 if constexpr (std::is_same_v<SpacePointType, SpacePoint>) {
517 fillStyle = invalidCalibFill;
520 }
else if constexpr(std::is_same_v<SpacePointType, CalibratedSpacePoint>) {
521 underlyingSp = hit.spacePoint();
522 if (hit.fitState() == CalibratedSpacePoint::State::Valid) {
524 }
else if (hit.fitState() == CalibratedSpacePoint::State::FailedCalib) {
525 fillStyle = invalidCalibFill;
533 primitives.push_back(
drawDriftCircle(hit.positionInChamber(), dc->readoutElement()->innerTubeRadius(),
536 const int circColor =
isLabeled(*dc) ? truthColor : kBlue;
537 primitives.push_back(
drawDriftCircle(hit.positionInChamber(), hit.driftRadius(), circColor, fillStyle));
541 const int boxColor =
isLabeled(*meas) ? truthColor : kGreen +2;
542 const double boxWidth = 0.5*std::sqrt(12)*underlyingSp->uncertainty()[
view];
543 primitives.push_back(
drawBox(hit.positionInChamber(), boxWidth, 0.5*meas->readoutElement()->gasGapPitch(),
544 boxColor, fillStyle));
547 const auto* meas{
static_cast<const xAOD::TgcStrip*
>(underlyingSp->primaryMeasurement())};
548 const int boxColor =
isLabeled(*meas) ? truthColor : kCyan + 2;
549 const double boxWidth = 0.5*std::sqrt(12)*underlyingSp->uncertainty()[
view];
550 primitives.push_back(
drawBox(hit.positionInChamber(), boxWidth, 0.5*meas->readoutElement()->gasGapPitch(),
551 boxColor, fillStyle));
554 const auto* meas{
static_cast<const xAOD::MMCluster*
>(underlyingSp->primaryMeasurement())};
555 const int boxColor =
isLabeled(*meas) ? truthColor : kAquamarine;
558 boxColor, fillStyle));
563 ATH_MSG_WARNING(
"Please implement proper drawings of the new small wheel.. "<<__FILE__<<
":"<<__LINE__);
◆ drawHits()
template<class SpacePointType >
bool MuonValR4::PatternVisualizationTool::drawHits |
( |
const MuonR4::SpacePointBucket & |
bucket, |
|
|
const std::vector< SpacePointType > & |
hitsToDraw, |
|
|
PrimitiveVec & |
primitivesToPush, |
|
|
std::array< double, 4 > & |
canvasDim, |
|
|
unsigned int |
view |
|
) |
| const |
|
private |
Translates the Spacepoint information into TObjects that are dawn on the canvas & evaluates the size of the box surrounding the event.
Returns true if at least 2 objects were created.
- Parameters
-
bucket | SpacePoint bucket from which the hits are taken. If the <DisplayBucket> is set true, the hits that were not in the subset are also painted with hollow filling |
hitsToDraw | Primary hit collection to draw which are drawn with fullFillStyle |
primitivesToPush | Output vector into which the painting objects are pushed_back |
canvasDim | Array encoding the canvas dimensions [0] -> low x; [1] -> high x, [2] -> low y, [3] -> high y |
view | Either the eta or the phi view? |
Definition at line 570 of file PatternVisualizationTool.cxx.
576 canvasDim[Edges::yLow] = canvasDim[Edges::zLow] = 100. *
Gaudi::Units::m;
577 canvasDim[Edges::yHigh] = canvasDim[Edges::zHigh] = -100. *
Gaudi::Units::m;
580 for (
const SpacePointType& hit : hitsToDraw) {
584 for (
const SpacePointBucket::value_type& hit : bucket) {
586 if (drawnPoints.count(hit.get())) {
595 for (
auto & prim : primitives){
596 TBox* theBox =
dynamic_cast<TBox*
>(prim.get());
598 canvasDim[Edges::zLow] =
std::min(canvasDim[Edges::zLow], theBox->GetY1());
599 canvasDim[Edges::zHigh] =
std::max(canvasDim[Edges::zHigh], theBox->GetY2());
604 double height = (canvasDim[Edges::zHigh] - canvasDim[Edges::zLow])*
m_canvasExtraScale;
608 const double midPointX = 0.5 * (canvasDim[Edges::yHigh] + canvasDim[Edges::yLow]);
609 const double midPointY = 0.5 * (canvasDim[Edges::zHigh] + canvasDim[Edges::zLow]);
610 canvasDim[Edges::yLow] = midPointX - 0.5 *
width;
611 canvasDim[Edges::zLow] = midPointY - 0.5 * height;
612 canvasDim[Edges::yHigh] = midPointX + 0.5 *
width;
613 canvasDim[Edges::zHigh] = midPointY + 0.5 * height;
614 return drawnPoints.size() - drawnPoints.count(
nullptr) > 1;
◆ drawPrimitives()
void MuonValR4::PatternVisualizationTool::drawPrimitives |
( |
const TCanvas & |
can, |
|
|
PrimitiveVec & |
primitives |
|
) |
| const |
|
private |
Draw the various primitives onto the Canvas.
If a TLine is amongst them it's automatically adjusted to fit the canvas ranges
- Parameters
-
canvas | Reference to the canvas to draw the primitives on |
prmitives | Primitives to draw onto the Canvas |
Definition at line 141 of file PatternVisualizationTool.cxx.
142 const double yLow =
can.GetPad(0)->GetUymin();
143 const double yHigh =
can.GetPad(0)->GetUymax();
144 for (
auto& prim : primitives) {
145 const TObject &primRef = *prim;
146 if (
typeid(primRef) ==
typeid(TLine)){
147 TLine*
line =
static_cast<TLine*
>(prim.get());
151 const Amg::Vector3D newHigh = linePoint + Amg::intersect<3>(linePoint, lineDir, Amg::Vector3D::UnitY(), yHigh).value_or(0.) * lineDir;
152 const Amg::Vector3D newLow = linePoint + Amg::intersect<3>(linePoint, lineDir, Amg::Vector3D::UnitY(), yLow).value_or(0.) * lineDir;
153 line->SetX1(newLow.x());
154 line->SetY1(newLow.y());
155 line->SetX2(newHigh.x());
156 line->SetY2(newHigh.y());
◆ finalize()
StatusCode MuonValR4::PatternVisualizationTool::finalize |
( |
| ) |
|
|
finaloverridevirtual |
◆ getLabeledSegments() [1/2]
Returns whether the hit has been used on the labeled segments we refer to (e.g.
truth or data Zµµ)
- Parameters
-
hits | Vector of hits to search |
Definition at line 119 of file PatternVisualizationTool.cxx.
120 std::vector<const xAOD::UncalibratedMeasurement*> measurements{};
121 measurements.reserve(2*
hits.size());
123 measurements.push_back(hit->primaryMeasurement());
124 if(hit->secondaryMeasurement()) {
125 measurements.push_back(hit->secondaryMeasurement());
◆ getLabeledSegments() [2/2]
◆ initialize()
StatusCode MuonValR4::PatternVisualizationTool::initialize |
( |
| ) |
|
|
finaloverridevirtual |
Definition at line 62 of file PatternVisualizationTool.cxx.
66 return StatusCode::FAILURE;
72 m_outFile = std::make_unique<TFile>( (
m_allCanName +
".root").c_str(),
"RECREATE");
76 gROOT->SetStyle(
"ATLAS");
77 TStyle* plotStyle = gROOT->GetStyle(
"ATLAS");
78 plotStyle->SetOptTitle(0);
79 plotStyle->SetHistLineWidth(1.);
80 plotStyle->SetPalette(kViridis);
84 ATH_MSG_INFO(
"Hits linked to the following segment decorations are considered as truth");
87 if (decorName.empty()) {
89 return StatusCode::FAILURE;
102 return StatusCode::SUCCESS;
◆ isLabeled() [1/2]
Fetches all labeled (e.g.
by truth or Zµµ reco) segments containing at least one measurement in the list passed as arg
- Parameters
-
hit | Reference to the hit to check |
Definition at line 108 of file PatternVisualizationTool.cxx.
◆ isLabeled() [2/2]
◆ makeCanvas()
std::unique_ptr< TCanvas > MuonValR4::PatternVisualizationTool::makeCanvas |
( |
const EventContext & |
ctx, |
|
|
const std::array< double, 4 > & |
canvasDim, |
|
|
const int |
view |
|
) |
| const |
|
private |
Create a new Canvas & draw the underlying frame.
- Parameters
-
ctx | EventContext to generate a unique canvas name |
canvasDim | Array encoding the canvas dimensions [0] -> low x; [1] -> high x, [2] -> low y, [3] -> high y |
view | Is the canvas created in the context of an eta or phi visualization view The x-axis of the frame is adapted accordingly |
Definition at line 693 of file PatternVisualizationTool.cxx.
696 std::stringstream canvasName{};
697 canvasName<<
name()<<
"_"<<ctx.eventID().event_number()<<
"_"<<m_canvCounter;
698 ATH_MSG_VERBOSE(
"Create new canvas "<<canvasName.str()<<
" "<<canvasDim);
701 TH1F* frame =
canvas->DrawFrame(canvasDim[Edges::yLow],canvasDim[Edges::zLow], canvasDim[Edges::yHigh], canvasDim[Edges::zHigh]);
703 frame->GetYaxis()->SetTitle(
"z [mm]");
◆ saveCanvas()
void MuonValR4::PatternVisualizationTool::saveCanvas |
( |
const EventContext & |
ctx, |
|
|
const Identifier & |
chambId, |
|
|
TCanvas & |
canvas, |
|
|
const std::string & |
extraLabel |
|
) |
| const |
|
private |
Saves the Canvas as pdf & also into the ROOT file.
If the canvase limit is reached, then the summary files are closed as well.
- Parameters
-
ctx | EventContext to fetch the event number |
chambId | Identifier of the chamber from which the hits are stemming from |
primtives | List of objects to draw onto the canvas |
extraLabel | Externally passed extra label |
Definition at line 706 of file PatternVisualizationTool.cxx.
711 std::stringstream canvasName{};
712 canvasName<<
m_canvasPrefix.value()<<
"_"<<ctx.eventID().event_number()<<
"_"<<(m_canvCounter++)<<
"_"
717 if (!extraLabel.empty()) canvasName<<
"_"<<removeNonAlphaNum(extraLabel);
725 m_outFile->WriteObject(&
canvas, canvasName.str().c_str());
◆ visualizeAccumulator() [1/2]
void MuonValR4::PatternVisualizationTool::visualizeAccumulator |
( |
const EventContext & |
ctx, |
|
|
const MuonR4::HoughPlane & |
accumulator, |
|
|
const Acts::HoughTransformUtils::HoughAxisRanges & |
axisRanges, |
|
|
const MaximumVec & |
maxima, |
|
|
const std::string & |
extraLabel |
|
) |
| const |
|
finaloverridevirtual |
◆ visualizeAccumulator() [2/2]
void MuonValR4::PatternVisualizationTool::visualizeAccumulator |
( |
const EventContext & |
ctx, |
|
|
const MuonR4::HoughPlane & |
accumulator, |
|
|
const Acts::HoughTransformUtils::HoughAxisRanges & |
axisRanges, |
|
|
const MaximumVec & |
maxima, |
|
|
const std::string & |
extraLabel, |
|
|
PrimitiveVec && |
extraPaints |
|
) |
| const |
|
finaloverridevirtual |
Check whether the canvas limit has been reached
Enter the lock phase
Check again in case multiple threads are simultaneously in the lock phase
Definition at line 170 of file PatternVisualizationTool.cxx.
182 std::lock_guard guard{
s_mutex};
188 if (accumulator.getNonEmptyBins().empty()) {
193 auto accHisto = std::make_unique<TH2F>(
"AccumulatorHisto",
"histo",
194 accumulator.nBinsX(), axisRanges.xMin, axisRanges.xMax,
195 accumulator.nBinsY(), axisRanges.yMin, axisRanges.yMax);
197 accHisto->SetDirectory(
nullptr);
199 accHisto->GetYaxis()->SetTitle( std::string{
m_accumlIsEta ?
"y_{0}" :
"x_{0}"}.c_str());
201 std::vector<const SpacePoint*> spacePointsInAcc{};
202 for (
const std::size_t
bin : accumulator.getNonEmptyBins()) {
203 const auto [xBin, yBin] = accumulator.axisBins(
bin);
204 const SpacePointSet& hitsInBin{accumulator.hitIds(xBin, yBin)};
205 spacePointsInAcc.insert(spacePointsInAcc.end(),hitsInBin.begin(), hitsInBin.end());
206 accHisto->SetBinContent(xBin+1, yBin+1, accumulator.nHits(
bin));
217 auto truthMarker = std::make_unique<TMarker>(
tan, icept, kFullCrossX);
218 truthMarker->SetMarkerColor(truthColor);
219 truthMarker->SetMarkerSize(8);
220 primitives.push_back(std::move(truthMarker));
223 for (
const auto& maximum : maxima) {
224 auto maxMarker = std::make_unique<TMarker>(maximum.x, maximum.y, kFullTriangleUp);
225 maxMarker->SetMarkerColor(parLineColor);
226 maxMarker->SetMarkerSize(8);
227 primitives.push_back(std::move(maxMarker));
232 std::stringstream canvasName{};
233 canvasName<<
name()<<
"_"<<ctx.eventID().event_number()<<
"_"<<m_canvCounter;
234 auto canvas = std::make_unique<TCanvas>(canvasName.str().c_str(),
236 canvas->GetPad(0)->SetRightMargin(0.12);
237 canvas->GetPad(0)->SetTopMargin(0.12);
239 accHisto->Draw(
"COLZ");
241 primitives.push_back(std::move(accHisto));
243 primitives.push_back(std::move(
canvas));
◆ visualizeBucket() [1/2]
◆ visualizeBucket() [2/2]
Check whether the canvas limit has been reached
Enter the lock phase
Check again in case multiple threads are simultaneously in the lock phase
reset the primitives
Definition at line 335 of file PatternVisualizationTool.cxx.
344 std::lock_guard guard{
s_mutex};
350 std::array<double, 4> canvasDim{};
355 const std::size_t parsedPrimSize{primitives.size()};
362 primitives.resize(parsedPrimSize);
363 if (!
drawHits(bucket, bucket, primitives, canvasDim,
view)) {
366 bool drawnTrueLabel{
false};
369 truthColor, kDotted,
view));
370 if (!drawnTrueLabel) {
372 drawnTrueLabel =
true;
376 std::stringstream legendLabel{};
377 legendLabel<<
"Event: "<<ctx.eventID().event_number()
378 <<
", chamber : "<<
m_idHelperSvc->toStringChamber(bucket.front()->identify())
380 if (!extraLabel.empty()) {
381 legendLabel<<
" ("<<extraLabel<<
")";
383 primitives.push_back(
drawLabel(legendLabel.str(), 0.2, 0.96));
391 saveCanvas(ctx, bucket.front()->identify(), *
can, extraLabel);
◆ visualizeSeed() [1/2]
◆ visualizeSeed() [2/2]
Check whether the canvas limit has been reached
Enter the lock phase
Check again in case multiple threads are simultaneously in the lock phase
reset the primitives
Definition at line 257 of file PatternVisualizationTool.cxx.
267 std::lock_guard guard{
s_mutex};
279 std::array<double, 4> canvasDim{};
280 const std::size_t parsedPrimSize{primitives.size()};
287 primitives.resize(parsedPrimSize);
295 truthColor, kDotted,
view));
297 primitives.push_back(
drawLine(
seed.parameters(), canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
298 parLineColor, kDashed,
view));
302 std::stringstream legendLabel{};
305 legendLabel<<
"Event: "<<ctx.eventID().event_number()<<
", chamber : "<<
m_idHelperSvc->toStringChamber(
seed.getHitsInMax().front()->identify())
309 if (!extraLabel.empty()) {
310 legendLabel<<
" ("<<extraLabel<<
")";
312 primitives.push_back(
drawLabel(legendLabel.str(), 0.1, 0.96));
◆ visualizeSegment() [1/2]
void MuonValR4::PatternVisualizationTool::visualizeSegment |
( |
const EventContext & |
ctx, |
|
|
const MuonR4::Segment & |
segment, |
|
|
const std::string & |
extraLabel |
|
) |
| const |
|
finaloverridevirtual |
◆ visualizeSegment() [2/2]
Check whether the canvas limit has been reached
Enter the lock phase
Check again in case multiple threads are simultaneously in the lock phase
reset the primitives
Definition at line 407 of file PatternVisualizationTool.cxx.
416 std::lock_guard guard{
s_mutex};
439 std::array<double, 4> canvasDim{};
440 const std::size_t parsedPrimSize{primitives.size()};
447 primitives.resize(parsedPrimSize);
450 primitives, canvasDim,
view)) {
455 truthColor, kDotted,
view));
462 primitives.push_back(
drawLine(segPars, canvasDim[Edges::zLow], canvasDim[Edges::zHigh],
463 parLineColor, kDashed,
view));
466 std::stringstream legendLabel{};
468 legendLabel<<
"Event: "<<ctx.eventID().event_number() <<
", chamber : "<<
m_idHelperSvc->toStringChamber(canvasId)
472 if (!extraLabel.empty()) {
473 legendLabel<<
" ("<<extraLabel<<
")";
475 primitives.push_back(
drawLabel(legendLabel.str(), 0.2, 0.96));
◆ writeChi2()
template<class SpacePointType >
Writes the chi2 of the hits onto the Canvas.
- Parameters
-
pars | Parameter for which the chi2 is evaluated, |
hits | Vector of hits to consider |
primitivesToPush | Output vector into which the TLabels are pushed for later drawing |
legX | x-position of the list |
statLegY | y-position of the first entry. The next one is 0.05 apart |
endLeg | y-position of the last shown entry. The routine aborts if there're more hits in the event. |
Definition at line 617 of file PatternVisualizationTool.cxx.
624 for (
const SpacePointType& hit :
hits) {
627 if constexpr( std::is_same_v<SpacePointType, Segment::MeasType>) {
628 underlyingSp = hit->spacePoint();
630 std::nullopt, *hit, msgStream());
637 std::string legendstream{};
638 switch(hit->type()) {
642 legendstream =
std::format(
"ML: {:1d}, TL: {:1d}, T: {:3d}, {:}",
643 idHelper.multilayer(hitId), idHelper.tubeLayer(hitId),
644 idHelper.tube(hitId),
driftSign == -1 ?
"L" :
"R");
648 legendstream=
std::format(
"DR: {:1d}, DZ: {:1d}, GAP: {:1d}, #eta/#phi: {:}/{:}",
649 idHelper.doubletR(hitId), idHelper.doubletZ(hitId), idHelper.gasGap(hitId),
650 hit->measuresEta() ?
"si" :
"nay", hit->measuresPhi() ?
"si" :
"nay");
654 legendstream =
std::format(
"ST: {:}, GAP: {:1d}, #eta/#phi: {:}/{:}",
655 m_idHelperSvc->stationNameString(hitId), idHelper.gasGap(hitId),
656 hit->measuresEta() ?
"si" :
"nay", hit->measuresPhi() ?
"si" :
"nay");
660 const auto* clus =
static_cast<const xAOD::MMCluster*
>(underlyingSp->primaryMeasurement());
661 const MuonGMR4::StripDesign& design = clus->readoutElement()->stripLayer(clus->layerHash()).design();
662 legendstream =
std::format(
"ML: {:1d}, GAP: {:1d}, {:}", idHelper.multilayer(hitId), idHelper.gasGap(hitId),
667 legendstream =
std::format(
"ML: {:1d}, GAP: {:1d}, #eta/#phi: {:}/{:}",
668 idHelper.multilayer(hitId), idHelper.gasGap(hitId),
669 hit->measuresEta() ?
"si" :
"nay", hit->measuresPhi() ?
"si" :
"nay");
676 primitives.push_back(
drawLabel(legendstream, legX, startLegY, 14));
678 if (startLegY<= endLegY) {
◆ ATLAS_THREAD_SAFE [1/3]
std::unique_ptr<TCanvas> m_allCan MuonValR4::PatternVisualizationTool::ATLAS_THREAD_SAFE {} |
|
mutableprivate |
◆ ATLAS_THREAD_SAFE [2/3]
std::unique_ptr<TFile> m_outFile MuonValR4::PatternVisualizationTool::ATLAS_THREAD_SAFE {} |
|
mutableprivate |
◆ ATLAS_THREAD_SAFE [3/3]
std::atomic<unsigned int> m_canvCounter MuonValR4::PatternVisualizationTool::ATLAS_THREAD_SAFE {0} |
|
mutableprivate |
◆ m_accumlIsEta
Gaudi::Property<bool> MuonValR4::PatternVisualizationTool::m_accumlIsEta {this, "AccumulatorsInEtaPlane", true} |
|
private |
Swtich toggling whether the accumulator view are in the eta or phi plane.
Just affects the axis labels
Definition at line 184 of file PatternVisualizationTool.h.
◆ m_allCanName
Gaudi::Property<std::string> MuonValR4::PatternVisualizationTool::m_allCanName {this, "AllCanvasName", "AllPatternPlots"} |
|
private |
◆ m_AtlasLabel
Gaudi::Property<std::string> MuonValR4::PatternVisualizationTool::m_AtlasLabel {this, "AtlasLabel", "Internal"} |
|
private |
◆ m_canvasExtraScale
Gaudi::Property<double> MuonValR4::PatternVisualizationTool::m_canvasExtraScale {this, "CanvasExtraScale" , 1.5} |
|
private |
◆ m_canvasHeight
Gaudi::Property<unsigned> MuonValR4::PatternVisualizationTool::m_canvasHeight {this, "CanvasHeight", 600} |
|
private |
◆ m_canvasLimit
Gaudi::Property<unsigned int> MuonValR4::PatternVisualizationTool::m_canvasLimit {this, "CanvasLimits", 5000} |
|
private |
◆ m_canvasPrefix
Gaudi::Property<std::string> MuonValR4::PatternVisualizationTool::m_canvasPrefix {this, "CanvasPreFix", ""} |
|
private |
◆ m_canvasWidth
Gaudi::Property<unsigned> MuonValR4::PatternVisualizationTool::m_canvasWidth {this, "CanvasWidth", 800} |
|
private |
◆ m_detMgr
◆ m_displayBucket
Gaudi::Property<bool> MuonValR4::PatternVisualizationTool::m_displayBucket {this, "displayBucket", true} |
|
private |
◆ m_displayOnlyTruth
Gaudi::Property<bool> MuonValR4::PatternVisualizationTool::m_displayOnlyTruth {this, "displayTruthOnly", false} |
|
private |
◆ m_doEtaBucketViews
Gaudi::Property<bool> MuonValR4::PatternVisualizationTool::m_doEtaBucketViews {this,"doEtaBucketViews", true} |
|
private |
◆ m_doPhiBucketViews
Gaudi::Property<bool> MuonValR4::PatternVisualizationTool::m_doPhiBucketViews {this,"doPhiBucketViews", true} |
|
private |
◆ m_geoCtxKey
◆ m_idHelperSvc
◆ m_lumiLabel
Gaudi::Property<std::string> MuonValR4::PatternVisualizationTool::m_lumiLabel {this, "LumiLabel", ""} |
|
private |
◆ m_prepContainerKeys
◆ m_saveSinglePDFs
Gaudi::Property<bool> MuonValR4::PatternVisualizationTool::m_saveSinglePDFs {this, "saveSinglePDFs", false} |
|
private |
◆ m_saveSummaryPDF
Gaudi::Property<bool> MuonValR4::PatternVisualizationTool::m_saveSummaryPDF {this, "saveSummaryPDF", false} |
|
private |
If set to true a summary Canvas is created.
ATTENTION: There can be only one summary PDF in an athena job
Definition at line 173 of file PatternVisualizationTool.h.
◆ m_sqrtSLabel
Gaudi::Property<std::string> MuonValR4::PatternVisualizationTool::m_sqrtSLabel {this, "SqrtSLabel", "14"} |
|
private |
◆ m_truthLinkDecorKeys
◆ m_truthLinkDecors
std::vector<SegLinkDecor_t> MuonValR4::PatternVisualizationTool::m_truthLinkDecors {} |
|
private |
◆ m_truthSegLinks
Gaudi::Property<std::set<std::string> > MuonValR4::PatternVisualizationTool::m_truthSegLinks {this, "TruthSegDecors", {}} |
|
private |
◆ s_mutex
std::mutex MuonValR4::PatternVisualizationTool::s_mutex {} |
|
staticprivate |
The documentation for this class was generated from the following files:
def retrieve(aClass, aKey=None)
constexpr int fullFilling
MuonValR4::IPatternVisualizationTool::PrimitiveVec PrimitiveVec
double stereoAngle() const
Returns the value of the stereo angle.
RpcMeasurement_v1: Class storing the geneic.
AmgVector(toInt(ParamDefs::nPars)) Parameters
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.
Class describing a MuonSegment.
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)
const xAOD::UncalibratedMeasurement * secondaryMeasurement() const
HitVec stripSmartPtr(const SpacePointBucket &bucket)
#define ATH_MSG_VERBOSE(x)
double chiSqTerm(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const SpacePoint &measurement, MsgStream &msg)
Calculates the chi2 contribuation to a linear segment line from an uncalibrated measurement.
std::pair< Amg::Vector3D, Amg::Vector3D > makeLine(const Parameters &pars)
Returns the parsed parameters into an Eigen line parametrization.
std::unique_ptr< TLatex > drawLabel(const std::string &text, const double xPos, const double yPos, const unsigned int fontSize=18)
Create a TLatex label,.
@ u
Enums for curvilinear frames.
@ MdtStatusDriftTime
The tube produced a vaild measurement.
const xAOD::UncalibratedMeasurement * primaryMeasurement() const
double houghTanPhi(const Amg::Vector3D &v)
: Returns the hough tanPhi [x] / [z]
int driftSign(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const SpacePoint &uncalibHit, MsgStream &msg)
Calculates whether a segement line travereses the tube measurement on the left (-1) or right (1) side...
Eigen::Affine3d Transform3D
double chi2(TH1 *h0, TH1 *h1)
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
The muon space point is the combination of two uncalibrated measurements one of them measures the eta...
ElementLink implementation for ROOT usage.
constexpr int objViewEta
ObjectView.
constexpr int toInt(const ParamDefs p)
Eigen::Matrix< double, 3, 1 > Vector3D
#define ATH_MSG_WARNING(x)
std::vector< const SpacePoint * > SpacePointSet
vector of space points
constexpr int hollowFilling
Filling codes for hollow / fullFilling / hatched filling.
std::string makeLabel(const Parameters &pars)
Parameters localSegmentPars(const xAOD::MuonSegment &seg)
Returns the localSegPars decoration from a xAODMuon::Segment.
bool hasStereoAngle() const
Returns whether a stereo angle is defined.
std::unique_ptr< TEllipse > drawDriftCircle(const Amg::Vector3D ¢er, const double radius, const int color=kViolet, const int fillStyle=hollowFilling)
Create a TEllipse for drawing a drift circle.
std::unique_ptr< TLatex > drawAtlasLabel(const double xPos, const double yPos, const std::string &status="Internal")
Create a ATLAS label.
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
https://gitlab.cern.ch/atlas/athena/-/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecEvent/Mu...
double houghTanTheta(const Amg::Vector3D &v)
Returns the hough tanTheta [y] / [z].
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.
constexpr int hatchedFilling
Muon::NSW_PadTriggerSegment segment(const NSWL1::PadTrigger &data)