ATLAS Offline Software
Loading...
Searching...
No Matches
MuonGMR4::MuonChamberToolTest Class Reference

#include <MuonChamberToolTest.h>

Inheritance diagram for MuonGMR4::MuonChamberToolTest:
Collaboration diagram for MuonGMR4::MuonChamberToolTest:

Public Member Functions

 ~MuonChamberToolTest ()=default
StatusCode execute (const EventContext &ctx) const override
StatusCode initialize () override
bool isReEntrant () const override final
template<class EnevelopeType>
StatusCode testReadoutEle (const ActsTrk::GeometryContext &gctx, const TgcReadoutElement &tgc, const EnevelopeType &chamber, const Acts::Volume &detVol) const
template<class EnevelopeType>
StatusCode testReadoutEle (const ActsTrk::GeometryContext &gctx, const MmReadoutElement &mm, const EnevelopeType &chamber, const Acts::Volume &detVol) const
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
 Get filter decision:
virtual void setFilterPassed (bool state, const EventContext &ctx) const
 Set filter decision:
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvc > StoreGateSvc_t

Private Member Functions

std::vector< Amg::Vector3D > cornerPoints (const ActsTrk::GeometryContext &gctx, const Acts::Volume &volume) const
 Returns the edge points from a trapezoidal / cuboid /diamond volume.
std::vector< Amg::Vector3D > cornerPoints (const ActsTrk::GeometryContext &gctx, const Acts::Surface &surface) const
void saveEnvelope (const ActsTrk::GeometryContext &gctx, const std::string &envName, const Acts::Volume &envelopeVol, const std::vector< const Acts::Surface * > &assocSurfaces, const std::vector< const Acts::Volume * > &subVolumes={}) const
StatusCode checkPortals (const ActsTrk::GeometryContext &gctx, const Acts::TrackingVolume &volume) const
StatusCode checkChambers (const ActsTrk::GeometryContext &gctx) const
 Check whether the chamber envelopes are consistent.
StatusCode checkEnvelopes (const ActsTrk::GeometryContext &gctx) const
 Check envelopes.
StatusCode checkTrackingGeometry (const ActsTrk::GeometryContext &gctx, const Acts::TrackingGeometry &trackingGeometry) const
 Check tracking geometry volumes.
template<class EnvelopeType>
StatusCode allReadoutInEnvelope (const ActsTrk::GeometryContext &ctx, const EnvelopeType &envelope) const
 Checks whether the readout elements of an enevelope are completely embedded into the envelope.
template<class EnvelopeType>
StatusCode pointInside (const ActsTrk::GeometryContext &gctx, const EnvelopeType &envelope, const Acts::Volume &boundVol, const Amg::Vector3D &point, const std::string &descr, const Identifier &channelId) const
 Checks whether the point is inside of an envelope object, i.e.
StatusCode pointInside (const ActsTrk::GeometryContext &gctx, const Acts::TrackingVolume &volume, const Amg::Vector3D &point, const std::string &descr, const Identifier &chamberId) const
 Checks whether the point is inside a tracking volume.
bool hasOverlap (const ActsTrk::GeometryContext &gctx, const std::vector< Amg::Vector3D > &chamberEdges, const Acts::Volume &volume) const
 Checks whether the edge points from a trapezoid/cuboid/diamond form a volume overlapping with the given volume.
template<class EnvelopeType>
StatusCode testReadoutEle (const ActsTrk::GeometryContext &gctx, const MdtReadoutElement &readOutEle, const EnvelopeType &envelope, const Acts::Volume &boundVol) const
 Checks whether all channels of a given readout element are fully covered by the envelope.
template<class EnvelopeType>
StatusCode testReadoutEle (const ActsTrk::GeometryContext &gctx, const RpcReadoutElement &readOutEle, const EnvelopeType &envelope, const Acts::Volume &boundVol) const
template<class EnvelopeType>
StatusCode testReadoutEle (const ActsTrk::GeometryContext &gctx, const TgcReadoutElement &readOutEle, const EnvelopeType &envelope, const Acts::Volume &boundVol) const
template<class EnvelopeType>
StatusCode testReadoutEle (const ActsTrk::GeometryContext &gctx, const sTgcReadoutElement &readOutEle, const EnvelopeType &envelope, const Acts::Volume &boundVol) const
template<class EnvelopeType>
StatusCode testReadoutEle (const ActsTrk::GeometryContext &gctx, const MmReadoutElement &readOutEle, const EnvelopeType &envelope, const Acts::Volume &boundVol) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
ActsTrk::GeoContextReadKey_t m_geoCtxKey {this, "AlignmentKey", "ActsAlignment", "cond handle key"}
ServiceHandle< ActsTrk::ITrackingGeometrySvc > m_trackingGeometrySvc {this, "TrackingGeometrySvc","ActsTrackingGeometrySvc"}
Gaudi::Property< unsigned > m_overlapSamples {this, "overlapSamples", 50}
 Number of points to scan along the lines between two volume corners to check whether they belong to an another volume.
Gaudi::Property< std::string > m_overlapChambObj {this, "chamberOverlapFile", "OverlapingChambers.obj"}
 Name of the chamber output obj file.
Gaudi::Property< bool > m_ignoreOverlapCh {this, "ignoreChamberOverlap", true}
 The overlap of chamber volumes does not lead to a failure.
Gaudi::Property< bool > m_ignoreOutsideSurf {this, "ignoreOutsideSurface", true}
 The exceeding surfaces does not lead to a failure.
Gaudi::Property< bool > m_dumpObjs {this, "dumpVolumes" , false}
 Dump the chambers & sectors as separate obj files.
const MuonDetectorManager * m_detMgr {nullptr}
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 30 of file MuonChamberToolTest.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 376 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ ~MuonChamberToolTest()

MuonGMR4::MuonChamberToolTest::~MuonChamberToolTest ( )
default

Member Function Documentation

◆ allReadoutInEnvelope()

template<class EnvelopeType>
StatusCode MuonGMR4::MuonChamberToolTest::allReadoutInEnvelope ( const ActsTrk::GeometryContext & ctx,
const EnvelopeType & envelope ) const
private

Checks whether the readout elements of an enevelope are completely embedded into the envelope.

Definition at line 233 of file MuonChamberToolTest.cxx.

234 {
235 std::shared_ptr<Acts::Volume> boundVol = envelope.boundingVolume();
236 const Chamber::ReadoutSet reEles = envelope.readoutEles();
237 for(const MuonReadoutElement* readOut : reEles) {
238 if constexpr (std::is_same_v<EnvelopeType, SpectrometerSector>) {
239 if (readOut->msSector() != &envelope) {
240 ATH_MSG_ERROR("Mismatch in the sector association "<<m_idHelperSvc->toStringDetEl(readOut->identify())
241 <<std::endl<<(*readOut->msSector())<<std::endl<<envelope);
242 return StatusCode::FAILURE;
243 }
244 } else if constexpr (std::is_same_v<EnvelopeType, Chamber>) {
245 if (readOut->chamber() != &envelope) {
246 ATH_MSG_ERROR("Mismatch in the chamber association "<<m_idHelperSvc->toStringDetEl(readOut->identify())
247 <<std::endl<<(*readOut->chamber())<<std::endl<<envelope);
248 return StatusCode::FAILURE;
249 }
250 }
251 switch (readOut->detectorType()) {
253 const auto* detEle = static_cast<const TgcReadoutElement*>(readOut);
254 ATH_CHECK(testReadoutEle(gctx, *detEle, envelope, *boundVol));
255 break;
257 const auto* detEle = static_cast<const MdtReadoutElement*>(readOut);
258 ATH_CHECK(testReadoutEle(gctx, *detEle, envelope, *boundVol));
259 break;
261 const auto* detEle = static_cast<const RpcReadoutElement*>(readOut);
262 ATH_CHECK(testReadoutEle(gctx, *detEle, envelope, *boundVol));
263 break;
265 const auto* detEle = static_cast<const MmReadoutElement*>(readOut);
266 ATH_CHECK(testReadoutEle(gctx, *detEle, envelope, *boundVol));
267 break;
269 const auto* detEle = static_cast<const sTgcReadoutElement*>(readOut);
270 ATH_CHECK(testReadoutEle(gctx, *detEle, envelope, *boundVol));
271 break;
272 } default: {
273 ATH_MSG_ERROR("Who came up with putting "<<readOut->detectorType()<<" into the MS");
274 return StatusCode::FAILURE;
275 }
276 }
277 }
278 ATH_MSG_DEBUG("All "<<reEles.size()<<" readout elements are embedded in "<<envelope);
279 return StatusCode::SUCCESS;
280 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
std::vector< const MuonReadoutElement * > ReadoutSet
Define the list of read out elements of the chamber.
Definition Chamber.h:32
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
StatusCode testReadoutEle(const ActsTrk::GeometryContext &gctx, const MdtReadoutElement &readOutEle, const EnvelopeType &envelope, const Acts::Volume &boundVol) const
Checks whether all channels of a given readout element are fully covered by the envelope.
@ Mm
Maybe not needed in the migration.
@ Tgc
Resitive Plate Chambers.
@ sTgc
Micromegas (NSW).
@ Rpc
Monitored Drift Tubes.
@ Mdt
MuonSpectrometer.

◆ checkChambers()

StatusCode MuonGMR4::MuonChamberToolTest::checkChambers ( const ActsTrk::GeometryContext & gctx) const
private

Check whether the chamber envelopes are consistent.

Check the overlap with other chambers

Definition at line 348 of file MuonChamberToolTest.cxx.

348 {
349
350 std::vector<const MuonReadoutElement*> allRE = m_detMgr->getAllReadoutElements();
352 const ChamberSet chambers = m_detMgr->getAllChambers();
353 ATH_MSG_INFO("Fetched "<<chambers.size()<<" chambers.");
354 std::vector<const Chamber*> chamberVec{chambers.begin(), chambers.end()};
355
356 const auto missChamb = std::ranges::find_if(allRE, [&chamberVec](const MuonGMR4::MuonReadoutElement* re){
357 return std::ranges::find(chamberVec, re->chamber()) == chamberVec.end();
358 });
359 if (missChamb != allRE.end()) {
360 ATH_MSG_ERROR("The chamber "<<(*(*missChamb)->chamber())<<" is not in the chamber set");
361 return StatusCode::FAILURE;
362 }
363
364 // Retrieve bounds here rather than inside the loop below,
365 // so we only need to do it O(N) rather than O(N^2) times.
366 std::vector<std::shared_ptr<Acts::Volume> > chamberBoundsVec;
367 chamberBoundsVec.reserve (chamberVec.size());
368 for (const Chamber* ch : chamberVec) {
369 chamberBoundsVec.push_back(ch->boundingVolume());
370 }
371 std::set<const Chamber*> overlapChambers{};
372 std::stringstream overlapstream{};
373 for (std::size_t chIdx = 0; chIdx< chamberVec.size(); ++chIdx) {
374 const Chamber& chamber{*chamberVec[chIdx]};
375 const Acts::Volume& chamberBounds = *chamberBoundsVec[chIdx];
376 if (m_dumpObjs) {
377 saveEnvelope(gctx, std::format("Chamber_{:}{:}{:}{:}{:}",
378 chamber.detectorType(),
379 chName(chamber.chamberIndex()),
380 std::abs(chamber.stationEta()),
381 chamber.stationEta() > 0 ? 'A' : 'C',
382 chamber.stationPhi()),
383 chamberBounds, extractSurfaces(chamber.readoutEles()));
384 }
385 ATH_CHECK(allReadoutInEnvelope(gctx, chamber));
386 const std::vector<Amg::Vector3D> chambCorners = cornerPoints(gctx, chamberBounds);
388 std::vector<const Chamber*> overlaps{};
389 for (std::size_t chIdx1 = 0; chIdx1<chamberVec.size(); ++chIdx1) {
390 if (chIdx == chIdx1) {
391 continue;
392 }
393 const Chamber* overlapTest{chamberVec[chIdx1]};
394 if (hasOverlap(gctx, chambCorners, *chamberBoundsVec[chIdx1])) {
395 overlaps.push_back(overlapTest);
396 }
397 }
398 if (overlaps.empty()) {
399 continue;
400 }
401 overlapstream<<"The chamber "<<chamber<<" overlaps with "<<std::endl;
402 for (const Chamber* itOverlaps : overlaps) {
403 overlapstream<<" *** "<<(*itOverlaps)<<std::endl;
404 }
405 overlapstream<<std::endl<<std::endl;
406 overlapChambers.insert(overlaps.begin(), overlaps.end());
407 overlapChambers.insert(chamberVec[chIdx]);
408 }
409 if (!overlapChambers.empty()) {
410 Acts::ObjVisualization3D visualHelper{};
411 for (const Chamber* hasOverlap: overlapChambers) {
412 Acts::GeometryView3D::drawVolume(visualHelper, *hasOverlap->boundingVolume(), gctx.context());
413 visualHelper.write(m_overlapChambObj.value());
414 }
415 if (m_ignoreOverlapCh) {
416 ATH_MSG_WARNING(overlapstream.str());
417 } else {
418 ATH_MSG_ERROR(overlapstream.str());
419 }
420 }
421 ATH_MSG_INFO("Chamber test completed. Found "<<overlapChambers.size()<<" overlapping chambers");
422 return overlapChambers.empty() || m_ignoreOverlapCh ? StatusCode::SUCCESS : StatusCode::FAILURE;
423 }
const std::regex re(r_e)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
Acts::GeometryContext context() const
const MuonDetectorManager * m_detMgr
Gaudi::Property< bool > m_ignoreOverlapCh
The overlap of chamber volumes does not lead to a failure.
void saveEnvelope(const ActsTrk::GeometryContext &gctx, const std::string &envName, const Acts::Volume &envelopeVol, const std::vector< const Acts::Surface * > &assocSurfaces, const std::vector< const Acts::Volume * > &subVolumes={}) const
Gaudi::Property< bool > m_dumpObjs
Dump the chambers & sectors as separate obj files.
Gaudi::Property< std::string > m_overlapChambObj
Name of the chamber output obj file.
StatusCode allReadoutInEnvelope(const ActsTrk::GeometryContext &ctx, const EnvelopeType &envelope) const
Checks whether the readout elements of an enevelope are completely embedded into the envelope.
std::vector< Amg::Vector3D > cornerPoints(const ActsTrk::GeometryContext &gctx, const Acts::Volume &volume) const
Returns the edge points from a trapezoidal / cuboid /diamond volume.
bool hasOverlap(const ActsTrk::GeometryContext &gctx, const std::vector< Amg::Vector3D > &chamberEdges, const Acts::Volume &volume) const
Checks whether the edge points from a trapezoid/cuboid/diamond form a volume overlapping with the giv...
SpectrometerSector::ChamberSet ChamberSet
const std::string & chName(ChIndex index)
convert ChIndex into a string
Chamber
Define chamber types and locations.

◆ checkEnvelopes()

StatusCode MuonGMR4::MuonChamberToolTest::checkEnvelopes ( const ActsTrk::GeometryContext & gctx) const
private

Check envelopes.

Definition at line 425 of file MuonChamberToolTest.cxx.

425 {
426
427 std::vector<const MuonReadoutElement*> allREs = m_detMgr->getAllReadoutElements();
428 for (const MuonReadoutElement* re : allREs) {
429 if (!re->msSector()) {
430 ATH_MSG_ERROR("The readout element "<<m_idHelperSvc->toStringDetEl(re->identify())<<" does not have any sector associated ");
431 return StatusCode::FAILURE;
432 }
433 const SpectrometerSector* sectorFromDet = m_detMgr->getSectorEnvelope(re->chamberIndex(),
434 m_idHelperSvc->sector(re->identify()),
435 re->stationEta());
436 if (sectorFromDet != re->msSector()) {
437 ATH_MSG_ERROR("The sector attached to "<<m_idHelperSvc->toStringDetEl(re->identify())
438 <<", chIdx: "<<chName(re->chamberIndex())<<", sector: "<<m_idHelperSvc->sector(re->identify())
439 <<" is not the one attached to the readout geometry \n"<<(*re->msSector())<<"\n"<<(*sectorFromDet));
440 return StatusCode::FAILURE;
441 }
442 }
443 using SectorSet = MuonDetectorManager::MuonSectorSet;
444 const SectorSet sectors = m_detMgr->getAllSectors();
445 ATH_MSG_INFO(__func__<<"() "<<__LINE__<<" - Fetched "<<sectors.size()<<" sectors. ");
446 for (const SpectrometerSector* sector : sectors) {
447 if (m_dumpObjs) {
448 const auto subVols = chamberVolumes(*sector);
449 saveEnvelope(gctx, std::format("Sector_{:}{:}{:}",
450 chName(sector->chamberIndex()),
451 sector->side() >0? 'A' :'C',
452 sector->stationPhi() ),
453 *sector->boundingVolume(),
454 extractSurfaces(sector->readoutEles()),
455 Acts::unpackSmartPointers(subVols));
456 }
457 ATH_CHECK(allReadoutInEnvelope(gctx, *sector));
458 const std::shared_ptr<Acts::Volume> secVolume = sector->boundingVolume();
459 for (const SpectrometerSector::ChamberPtr& chamber : sector->chambers()){
460 const std::vector<Amg::Vector3D> edges = cornerPoints(gctx, *chamber->boundingVolume());
461 unsigned int edgeCount{0};
462 for (const Amg::Vector3D& edge : edges) {
463 ATH_CHECK(pointInside(gctx, *sector, *secVolume, edge, std::format("Edge {:}", ++edgeCount),
464 chamber->readoutEles().front()->identify()));
465 }
466 }
467 }
468 ATH_MSG_INFO(__func__<<"() "<<__LINE__<<" - Sector envelope test completed.");
469 return StatusCode::SUCCESS;
470 }
StatusCode pointInside(const ActsTrk::GeometryContext &gctx, const EnvelopeType &envelope, const Acts::Volume &boundVol, const Amg::Vector3D &point, const std::string &descr, const Identifier &channelId) const
Checks whether the point is inside of an envelope object, i.e.
GeoModel::TransientConstSharedPtr< Chamber > ChamberPtr
Eigen::Matrix< double, 3, 1 > Vector3D

◆ checkPortals()

StatusCode MuonGMR4::MuonChamberToolTest::checkPortals ( const ActsTrk::GeometryContext & gctx,
const Acts::TrackingVolume & volume ) const
private

First check the bounds

Definition at line 471 of file MuonChamberToolTest.cxx.

472 {
473 if (!volume.isAlignable()) {
474 return StatusCode::SUCCESS;
475 }
476 const Acts::GeometryContext geoCtx = gctx.context();
477 std::vector<std::shared_ptr<const Acts::Surface>> portals{};
478 for (const Acts::Portal& portal : volume.portals()) {
479 if (portal.surface().geometryId().withBoundary(0) != volume.geometryId()) {
480 continue;
481 }
482 portals.push_back(portal.surface().getSharedPtr());
483 }
484 const auto unAlignedPortals = volume.volumeBounds().orientedSurfaces(volume.localToGlobalTransform(geoCtx));
485
486 if (unAlignedPortals.size() != portals.size()) {
487 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - The size of the aligned and unaligned portals don't match for volume "
488 <<volume.volumeName()<<". Aligned: "<<portals.size()<<", unaligned: "<<unAlignedPortals.size());
489 return StatusCode::FAILURE;
490 }
491 StatusCode retCode = StatusCode::SUCCESS;
492 for (std::size_t p =0 ; p < portals.size(); ++p){
494 if (portals[p]->bounds() != unAlignedPortals[p].surface->bounds()) {
495 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - The bounds of the "<<p
496 <<"-th portal differ:\n -- aligned: "<<portals[p]->bounds()
497 <<"\n -- unaligned: "<<unAlignedPortals[p].surface->bounds());
498 retCode = StatusCode::FAILURE;
499 }
500 const Amg::Transform3D& uTrf{unAlignedPortals[p].surface->localToGlobalTransform(geoCtx)};
501 const Amg::Transform3D& aTrf{portals[p]->localToGlobalTransform(geoCtx)};
502
503 if (!Amg::isIdentity(uTrf * aTrf.inverse())) {
504 ATH_MSG_ERROR(__func__<<"() "<<__LINE__
505 <<" - The unaligned and aligned portals don't end up at the same point \n"
506 <<" -- aligned: "<<Amg::toString(aTrf)<<"\n"<<" -- unaligned: "<<Amg::toString(uTrf));
507 retCode = StatusCode::FAILURE;
508 }
509 }
510 return retCode;
511 }
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
bool isIdentity(const Amg::Transform3D &trans)
Checks whether the transformation is the Identity transformation.
Eigen::Affine3d Transform3D
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ checkTrackingGeometry()

StatusCode MuonGMR4::MuonChamberToolTest::checkTrackingGeometry ( const ActsTrk::GeometryContext & gctx,
const Acts::TrackingGeometry & trackingGeometry ) const
private

Check tracking geometry volumes.

Assume that's a top-level chamber volume

That's a dirty hack because the halfZ is invalid here

Definition at line 514 of file MuonChamberToolTest.cxx.

515 {
516
517 //visit the volumes and check the overlaps with the other volumes in the tracking geometry
518 // also check overlaps between volumes and surfaces (e.g surfaces where the passive material is mapped)
519 std::vector<const Acts::TrackingVolume*> volumeVec{};
520 std::vector<const Acts::Surface*> passiveSurfaces{};
521
522 std::unordered_set<const Acts::TrackingVolume*> overlapVolumes{};
523 std::unordered_set<const Acts::Surface*> overlapSurfaces{};
524
525
526 //keep onyl the chamber volumes - not the cylinders
527 trackingGeometry.visitVolumes([&](const Acts::TrackingVolume* vol) {
528 //for the cylinder type volumes , fetch the inner surfaces only (e.g passive material surfaces)
529 if(vol->volumeBounds().type() == Acts::VolumeBounds::BoundsType::eCylinder){
530 ATH_MSG_DEBUG("checkTrackingGeometry() "<<__LINE__<<" - Fetch "<<vol->surfaces().size()
531 <<" passive surfaces from "<<vol->volumeName()<<".");
532 std::ranges::for_each(vol->surfaces(), [&](const Acts::Surface& surf){
533 ATH_MSG_VERBOSE(" --- "<<surf.type()<<" @"<<Amg::toString(surf.center(gctx.context()))
534 <<" "<<surf.bounds());
535 passiveSurfaces.push_back(&surf);
536 });
537 return;
538 }
539 const auto* placement = dynamic_cast<const ActsTrk::VolumePlacement*>(vol->volumePlacement());
540 // Not a senitive muon volume
541 if (!placement || !MuonGMR4::isMuon(placement->detectorType())) {
542 ATH_MSG_DEBUG("checkTrackingGeometry() "<<__LINE__<<" - Skip volume "
543 <<vol->volumeName()<<".");
544 return;
545 }
546 volumeVec.push_back(vol);
547 });
548
549 ATH_MSG_INFO(__func__<<"() "<<__LINE__<<" - Fetched "
550 << passiveSurfaces.size()<< " passive surfaces");
551 {
552 Acts::ObjVisualization3D visualHelper{};
553 std::ranges::for_each(passiveSurfaces,
554 [&visualHelper, &gctx](const Acts::Surface* surface) {
555 Acts::GeometryView3D::drawSurface(visualHelper, *surface, gctx.context());
556 });
557 visualHelper.write("MsTrackTest_passiveSurfaces.obj");
558
559 }
560 StatusCode retCode = StatusCode::SUCCESS;
561 for(std::size_t vIdx = 0; vIdx < volumeVec.size(); ++vIdx) {
562 const Acts::TrackingVolume* testVol{volumeVec.at(vIdx)};
563 ATH_CHECK(checkPortals(gctx, *testVol));
564
565 std::vector<const Acts::TrackingVolume*> overlaps{};
566 const std::vector<Amg::Vector3D> edges = cornerPoints(gctx, *testVol);
567
568 for(const auto& surface : testVol->surfaces()) {
569
570 ATH_MSG_VERBOSE(__func__<<"() - "<<__LINE__<<" Checking "<<surface.type()<<" surface "<<identify(surface)
571 <<" / "<<surface.geometryId() <<" in volume "<<testVol->volumeName());
572 for(const Amg::Vector3D& edge : cornerPoints(gctx, surface)) {
573 if(!testVol->inside(gctx.context(), edge, 0.01)) {
574 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - The "<<surface.type()<<"-surface "
575 << m_idHelperSvc->toString(identify(surface))<<" / "
576 <<surface.geometryId() <<" @vertex point "
577 <<Amg::toString(testVol->globalToLocalTransform(gctx.context()) *edge)<<", local: "
578 <<Amg::toString(surface.localToGlobalTransform(gctx.context()).inverse() * edge)
579 <<" is outside the parent volume: " << testVol->volumeName()
580 <<", "<<Amg::toString(testVol->localToGlobalTransform(gctx.context()))
581 <<", "<<testVol->volumeBounds());
582 overlapSurfaces.insert(&surface);
583 overlapVolumes.insert(testVol);
584 if (!m_ignoreOutsideSurf) {
585 retCode = StatusCode::FAILURE;
586 }
587 }
588 }
589 }
590
591 //check if the child volume is entirely enclosed by the mother volume
592 for (const Acts::TrackingVolume& child : testVol->volumes()) {
593 for(const auto& edge : cornerPoints(gctx, child)){
594 if(!testVol->inside(gctx.context(), edge, 0.01)){
595 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - The children volume's "
596 << child.volumeName() <<" vertex point " <<Amg::toString(edge)
597 <<" is outside the parent volume" << testVol->volumeName());
598 return StatusCode::FAILURE;
599 }
600 }
601 }
603 if (!testVol->motherVolume()->isAlignable() && m_dumpObjs) {
604 std::vector<const Acts::Surface*> surfaces = extractSurfaces(*testVol);
605 const Identifier volId = identify(*surfaces.front());
606 const int eta = m_idHelperSvc->stationEta(volId);
607 saveEnvelope(gctx, std::format("TrackingVolume_{:}{:}{:}{:}_{:}",
608 chName(m_idHelperSvc->chamberIndex(volId)),
609 std::abs(eta), eta > 0 ? 'A' : 'C',
610 m_idHelperSvc->stationPhi(volId), vIdx),
611 *testVol, surfaces , chamberVolumes(*testVol));
612
613 }
614 // Check that there is not overlap with other volumes
615 for (std::size_t vIdx1 = 0 ; vIdx1 < vIdx; ++vIdx1) {
616 const Acts::TrackingVolume* overlapTest{volumeVec.at(vIdx1)};
617 if (overlapTest->motherVolume() == testVol ||
618 testVol->motherVolume() == overlapTest){
619 continue;
620 }
621 if (hasOverlap(gctx, edges, *overlapTest)) {
622 overlaps.push_back(overlapTest);
623 std::ranges::copy(extractSurfaces(*testVol),
624 std::inserter(overlapSurfaces, overlapSurfaces.begin()));
625 std::ranges::copy(extractSurfaces(*overlapTest),
626 std::inserter(overlapSurfaces, overlapSurfaces.begin()));
627 }
628 }
629 /*check if the tracking volume overlaps with surfaces of the tracking geometry
630 (e.g cylinders of the barrel where material is mapped) */
631 const Identifier volId = identify(*extractSurfaces(*testVol).front());
632 double volHalfR{0.}, volHalfZ{0.};
633 const double halfX = MuonGMR4::halfXhighY(testVol->volumeBounds());
634 const bool isBarrel = Muon::MuonStationIndex::isBarrel(m_idHelperSvc->chamberIndex(volId));
635 if (isBarrel){
636 volHalfR = MuonGMR4::halfZ(testVol->volumeBounds());
637 volHalfZ = MuonGMR4::halfY(testVol->volumeBounds());
638 } else {
639 volHalfZ = MuonGMR4::halfZ(testVol->volumeBounds());
640 volHalfR = MuonGMR4::halfY(testVol->volumeBounds());
641 }
642 const Amg::Vector3D center{testVol->center(gctx.context())};
643 const double rMin = center.perp() - volHalfR;
644 // Calculate the global r from the local half X which is always along phi
645 // and the halfR which is along Y (Z) for endcap (barrel) chambers.
646 const double rMax = (testVol->localToGlobalTransform(gctx.context()) *(
647 halfX * Amg::Vector3D::UnitX() +
648 volHalfR * Amg::Vector3D::Unit(1 + isBarrel))).perp();
649
650 double zMin = center.z() - volHalfZ;
651 double zMax = center.z() + volHalfZ;
653 if (testVol->volumeBounds().type() == Acts::VolumeBounds::eDiamond) {
654 zMin = 1._km; zMax = -1._km;
655 for (const Amg::Vector3D& p : cornerPoints(gctx, *testVol)){
656 zMin = std::min(zMin, p.z());
657 zMax = std::max(zMax, p.z());
658 }
659 }
660
661 for(std::size_t i = 0; i < passiveSurfaces.size(); ++i) {
662
663 const Acts::Surface* surf = passiveSurfaces[i];
664
665 const Amg::Vector3D center = surf->center(gctx.context());
666 if(surf->type() == Acts::Surface::SurfaceType::Cylinder) {
667 using BoundEnum = Acts::CylinderBounds::BoundValues;
668 const auto& bounds = static_cast<const Acts::CylinderBounds&>(surf->bounds());
669 const double passiveR = bounds.get(BoundEnum::eR);
670 const double passiveZ = bounds.get(BoundEnum:: eHalfLengthZ);
671 if (rMin < passiveR || rMax > passiveR){
672 continue;
673 }
674 if (passiveZ < zMin || -passiveZ > zMax) {
675 continue;
676 }
677 } else if(surf->type() == Acts::Surface::SurfaceType::Disc){
678 using BoundEnum = Acts::RadialBounds::BoundValues;
679 const auto& bounds = static_cast<const Acts::RadialBounds&>(surf->bounds());
680 if (center.z() < zMin || center.z() > zMax) {
681 continue;
682 }
683 const double surfRMax = bounds.get(BoundEnum::eMaxR);
684 const double surfRMin = bounds.get(BoundEnum::eMinR);
685 if (surfRMax < rMin || surfRMin > rMax){
686 continue;
687 }
688 // continue;
689 } else {
690 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - The surface "<< surf->geometryId()
691 <<", "<< surf->name() <<" is not a cylinder surface or disc");
692 return StatusCode::FAILURE;
693 }
694
695 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - The volume "
696 << testVol->volumeName() << " overlaps with the surface "
697 << surf->name() << " with geo id" << surf->geometryId()
698 <<" -- volume radius: ["<<rMin<<";"<<rMax<<"] z: ["<<zMin<<";"<<zMax<<"]"
699 <<" "<<surf->bounds());
700 if (m_ignoreOutsideSurf) {
701 retCode = StatusCode::FAILURE;
702 }
703 overlapSurfaces.insert(surf);
704 overlapVolumes.insert(testVol);
705
706
707 }
708
709 if(overlaps.empty()) {
710 ATH_MSG_DEBUG(__func__<<"() "<<__LINE__<<" - No overlaps detected for the volume "<<testVol->volumeName());
711 continue;
712 }
713
714 overlapVolumes.insert(overlaps.begin(), overlaps.end());
715 overlapVolumes.insert(testVol);
716
717 std::stringstream overlapStream{};
718 overlapStream<<__func__<<"() "<<__LINE__<<" - The volume "
719 <<testVol->volumeName() << " overlaps with: "<<std::endl;
720
721 for(const Acts::TrackingVolume* overlap: overlaps){
722 overlapStream<<" --- Volume: " << overlap->volumeName()<<", "<<overlap->volumeBounds()
723 <<", "<<Amg::toString(overlap->localToGlobalTransform(gctx.context()))<<std::endl;;
724 }
725 ATH_MSG_ALWAYS(overlapStream.str());
726 }
727
728 //check passive surfaces overlaps with each other
729 for(std::size_t i = 0; i < passiveSurfaces.size(); ++i) {
730 const Acts::Surface* surf = passiveSurfaces[i];
731 const Amg::Vector3D center = surf->center(gctx.context());
732 for(std::size_t j = i+1; j < passiveSurfaces.size(); ++j) {
733 const Acts::Surface* testSurf = passiveSurfaces[j];
734 ATH_MSG_INFO(__func__<<"() "<<__LINE__<<" - Checking passive surface "<<surf->name()<<" geo id "<<surf->geometryId()
735 <<" with passive surface "<<testSurf->name()<<" geo id "<<testSurf->geometryId());
736 if(testSurf->geometryId().volume() != surf->geometryId().volume()){
737 continue;
738 }
739 if(surf->type() == Acts::Surface::SurfaceType::Cylinder){
740 using BoundEnum = Acts::CylinderBounds::BoundValues;
741 const auto& bounds = static_cast<const Acts::CylinderBounds&>(surf->bounds());
742 double passiveR = bounds.get(BoundEnum::eR);
743 double passiveZ = bounds.get(BoundEnum:: eHalfLengthZ);
744 bool overlap = checkOverlapWithCylinder(gctx.context(), testSurf, center, passiveR, passiveZ);
745 if(overlap) {
746 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - The surface "<<surf->name()<<"geo id "<<surf->geometryId()
747 <<" overlaps with surface "<<testSurf->name()<<"geo id "<<testSurf->geometryId()
748 <<" in the same volume "<<surf->geometryId().volume());
749 overlapSurfaces.insert(surf);
750 overlapSurfaces.insert(testSurf);
751 if (!m_ignoreOutsideSurf) {
752 retCode = StatusCode::FAILURE;
753 }
754 }
755 }else if(surf->type() == Acts::Surface::SurfaceType::Disc){
756 using BoundEnum = Acts::RadialBounds::BoundValues;
757 const auto& bounds = static_cast<const Acts::RadialBounds&>(surf->bounds());
758 bool overlap = checkOverlapWithDisc(gctx.context(), testSurf, center, bounds.get(BoundEnum::eMaxR));
759 if(overlap) {
760 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - The surface "<<surf->name()<<"geo id "<<surf->geometryId()
761 <<" overlaps with surface "<<testSurf->name()<<"geo id "<<testSurf->geometryId()
762 <<" in the same volume "<<surf->geometryId().volume());
763 overlapSurfaces.insert(surf);
764 overlapSurfaces.insert(testSurf);
765 if (!m_ignoreOutsideSurf) {
766 retCode = StatusCode::FAILURE;
767 }
768 }
769 } else {
770 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - The surface "<< surf->geometryId()
771 <<", "<< surf->name() <<" is not a cylinder surface or disc");
772 return StatusCode::FAILURE;
773 }
774 }
775 }
776
777 if (overlapVolumes.size() || overlapSurfaces.size()) {
778 const Acts::Volume* refVolume = (*overlapVolumes.begin());
779 std::vector<const Acts::Volume*> childVols{};
780 childVols.insert(childVols.begin(),std::next(overlapVolumes.begin()), overlapVolumes.end());
781 std::vector<const Acts::Surface*> childSurfs{overlapSurfaces.begin(), overlapSurfaces.end()};
782 saveEnvelope(gctx, "TrackingGeometryOverlaps", *refVolume,
783 childSurfs, childVols);
784 }
785
786
787 if(overlapVolumes.empty()) {
788 ATH_MSG_ALWAYS("No overlaps detected in the tracking geometry!!");
789 } else if (!m_ignoreOverlapCh) {
790 retCode = StatusCode::FAILURE;
791 }
792 return retCode;
793 }
Scalar eta() const
pseudorapidity method
#define ATH_MSG_ALWAYS(x,...)
#define ATH_MSG_VERBOSE(x,...)
StatusCode checkPortals(const ActsTrk::GeometryContext &gctx, const Acts::TrackingVolume &volume) const
Gaudi::Property< bool > m_ignoreOutsideSurf
The exceeding surfaces does not lead to a failure.
double halfY(const Acts::VolumeBounds &bounds)
Returns the half-Y length for the parsed volume bounds (Trapezoid/ Cuboid).
bool isMuon(const ActsTrk::DetectorType type)
Returns whether the parsed type is muon.
double halfZ(const Acts::VolumeBounds &bounds)
Returns the half-Z length for the parsed volume bounds (Trapezoid/ Cuboid).
double halfXhighY(const Acts::VolumeBounds &bounds)
Returns the half-Y length @ posiive Y for the parsed volume bounds (Trapezoid/ Cuboid).
bool isBarrel(const ChIndex index)
Returns true if the chamber index points to a barrel chamber.
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
const Identifier & identify(const UncalibratedMeasurement *meas)
Returns the associated identifier from the muon measurement.

◆ cornerPoints() [1/2]

std::vector< Amg::Vector3D > MuonGMR4::MuonChamberToolTest::cornerPoints ( const ActsTrk::GeometryContext & gctx,
const Acts::Surface & surface ) const
private

Definition at line 299 of file MuonChamberToolTest.cxx.

300 {
301 return surface.polyhedronRepresentation(gctx.context(), 10).vertices;
302 }

◆ cornerPoints() [2/2]

std::vector< Amg::Vector3D > MuonGMR4::MuonChamberToolTest::cornerPoints ( const ActsTrk::GeometryContext & gctx,
const Acts::Volume & volume ) const
private

Returns the edge points from a trapezoidal / cuboid /diamond volume.

Definition at line 282 of file MuonChamberToolTest.cxx.

283 {
284
285 std::vector<Amg::Vector3D> edges{};
286 const Acts::VolumeBounds& bounds{volume.volumeBounds()};
287 const Acts::Transform3& trf{volume.localToGlobalTransform(gctx.context())};
288 for (const Acts::OrientedSurface& boundary : bounds.orientedSurfaces(trf)) {
289 std::vector<Amg::Vector3D> corners = cornerPoints(gctx, *boundary.surface);
290 edges.insert(edges.end(), std::make_move_iterator(corners.begin()),
291 std::make_move_iterator(corners.end()));
292 }
293 auto [begin, end] = std::ranges::unique(edges, [](const Amg::Vector3D& a, const Amg::Vector3D& b) {
294 return (a - b).mag2() < 1._mm;
295 });
296 edges.erase(begin, end);
297 return edges;
298 }
static Double_t a

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode MuonGMR4::MuonChamberToolTest::execute ( const EventContext & ctx) const
override

Check that all chambers covered by their sector envelopes

Definition at line 814 of file MuonChamberToolTest.cxx.

814 {
815 const ActsTrk::GeometryContext* gctx{nullptr};
816 ATH_CHECK(SG::get(gctx, m_geoCtxKey, ctx));
818 ATH_CHECK(checkChambers(*gctx));
820 ATH_CHECK(checkTrackingGeometry(*gctx, *m_trackingGeometrySvc->trackingGeometry()));
821
822 return StatusCode::SUCCESS;
823 }
ActsTrk::GeoContextReadKey_t m_geoCtxKey
StatusCode checkEnvelopes(const ActsTrk::GeometryContext &gctx) const
Check envelopes.
StatusCode checkChambers(const ActsTrk::GeometryContext &gctx) const
Check whether the chamber envelopes are consistent.
ServiceHandle< ActsTrk::ITrackingGeometrySvc > m_trackingGeometrySvc
StatusCode checkTrackingGeometry(const ActsTrk::GeometryContext &gctx, const Acts::TrackingGeometry &trackingGeometry) const
Check tracking geometry volumes.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 89 of file AthCommonAlgorithm.cxx.

54{
55 // If we didn't find any symlinks to add, just return the collection
56 // from the base class. Otherwise, return the extended collection.
57 if (!m_extendedExtraObjects.empty()) {
59 }
61}
Common base class for algorithms.

◆ filterPassed()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Get filter decision:

Definition at line 93 of file AthCommonAlgorithm.h.

93 {
94 return execState( ctx ).filterPassed();
95 }
virtual bool filterPassed(const EventContext &ctx) const
Get filter decision:

◆ hasOverlap()

bool MuonGMR4::MuonChamberToolTest::hasOverlap ( const ActsTrk::GeometryContext & gctx,
const std::vector< Amg::Vector3D > & chamberEdges,
const Acts::Volume & volume ) const
private

Checks whether the edge points from a trapezoid/cuboid/diamond form a volume overlapping with the given volume.

Parameters
gctxGeometry context carrying all alignment & global transformations
chamberEdgesEdge points of the volume that might overlap
volumeSecond volume used for the overlap checking

First check that there's at least a chance that the edges might overlap with the center

The bound values contain the half length's if the minDist is within reach Then continue the check

Definition at line 311 of file MuonChamberToolTest.cxx.

313 {
314
316 const Amg::Vector3D center{volume.center(gctx.context())};
317 double minDist = 1._km;
318 for (const Amg::Vector3D& edge : chamberEdges) {
319 minDist = std::min(minDist, (edge - center).mag());
320 }
323 if (std::ranges::none_of(volume.volumeBounds().values(),
324 [minDist](const double bound){
325 return minDist < 2.5*bound;
326 })) {
327 return false;
328 }
329 const double stepLength = 1. / m_overlapSamples;
330
331 const Acts::VolumeBounds& volBounds = volume.volumeBounds();
332 const Acts::Transform3& transform = volume.globalToLocalTransform(gctx.context());
333 for (unsigned edge1 = 1; edge1 < chamberEdges.size(); ++edge1) {
334 for (unsigned edge2 = 0; edge2 < edge1; ++edge2) {
335 for (unsigned step = 0 ; step <= m_overlapSamples; ++step) {
336 const double section = stepLength * step;
337 const Amg::Vector3D testPoint = section* chamberEdges[edge1] + (1. -section) *chamberEdges[edge2];
338 // Using acts::Volume::inside is horribly slow in dbg builds.
339 // Using the bounds method directly is much faster.
340 if (volBounds.inside (transform * testPoint)) {
341 return true;
342 }
343 }
344 }
345 }
346 return false;
347 }
Scalar mag() const
mag method
void section(const std::string &sec)
Gaudi::Property< unsigned > m_overlapSamples
Number of points to scan along the lines between two volume corners to check whether they belong to a...

◆ initialize()

StatusCode MuonGMR4::MuonChamberToolTest::initialize ( )
override

Definition at line 162 of file MuonChamberToolTest.cxx.

162 {
163 ATH_CHECK(m_idHelperSvc.retrieve());
164 ATH_CHECK(m_geoCtxKey.initialize());
166 ATH_CHECK(detStore()->retrieve(m_detMgr));
167 return StatusCode::SUCCESS;
168 }
const ServiceHandle< StoreGateSvc > & detStore() const

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::isClonable ( ) const
inlineoverridevirtualinherited

Specify if the algorithm is clonable.

Only relevant for non-reentrant algorithms. Actual number of clones needs to be set via the "Cardinality" property.

Reimplemented in AFP_DigiTop, AlgB, AlgT, BCM_Digitization, CscDigitBuilder, CscDigitToCscRDO, G4AtlasAlg, G4RunAlg, HGTD_Digitization, HiveAlgBase, InDet::GNNSeedingTrackMaker, InDet::SCT_Clusterization, InDet::SiSPGNNTrackMaker, InDet::SiSPSeededTrackFinder, InDet::SiTrackerSpacePointFinder, ISF::SimKernelMT, ITk::StripDigitization, ITkPixelCablingAlg, ITkStripCablingAlg, LArHitEMapMaker, LArTTL1Maker, LUCID_DigiTop, LVL1::L1TopoSimulation, MergeCalibHits, MergeGenericMuonSimHitColl, MergeHijingPars, MergeMcEventCollection, MergeTrackRecordCollection, MergeTruthJets, MergeTruthParticles, MuonDigitizer, PileUpMTAlg, PixelDigitization, RoIBResultToxAOD, SCT_ByteStreamErrorsTestAlg, SCT_CablingCondAlgFromCoraCool, SCT_CablingCondAlgFromText, SCT_ConditionsParameterTestAlg, SCT_ConditionsSummaryTestAlg, SCT_ConfigurationConditionsTestAlg, SCT_Digitization, SCT_FlaggedConditionTestAlg, SCT_LinkMaskingTestAlg, SCT_MajorityConditionsTestAlg, SCT_ModuleVetoTestAlg, SCT_MonitorConditionsTestAlg, SCT_PrepDataToxAOD, SCT_RawDataToxAOD, SCT_ReadCalibChipDataTestAlg, SCT_ReadCalibDataTestAlg, SCT_RODVetoTestAlg, SCT_SensorsTestAlg, SCT_SiliconConditionsTestAlg, SCT_StripVetoTestAlg, SCT_TdaqEnabledTestAlg, SCT_TestCablingAlg, SCTEventFlagWriter, SCTRawDataProvider, SCTSiLorentzAngleTestAlg, SCTSiPropertiesTestAlg, SGInputLoader, Simulation::BeamEffectsAlg, TileHitVecToCnt, TileMuonFitter, TilePulseForTileMuonReceiver, TileRawChannelMaker, TRTDigitization, and ZDC_DigiTop.

Definition at line 68 of file AthCommonAlgorithm.h.

68 {
69 return true;
70 }

◆ isReEntrant()

bool MuonGMR4::MuonChamberToolTest::isReEntrant ( ) const
inlinefinaloverride

Definition at line 38 of file MuonChamberToolTest.h.

38{return false;}

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ pointInside() [1/2]

StatusCode MuonGMR4::MuonChamberToolTest::pointInside ( const ActsTrk::GeometryContext & gctx,
const Acts::TrackingVolume & volume,
const Amg::Vector3D & point,
const std::string & descr,
const Identifier & chamberId ) const
private

Checks whether the point is inside a tracking volume.

Parameters
gctxGeometry context carrying the aligned local -> global transfors
volumeReference to the tracking volume to check
pointPoint that needs to be inside the volume
descrDescription of the point
chamberIdIdentifier for more information if the point is outside

Definition at line 215 of file MuonChamberToolTest.cxx.

219 {
220 if (volume.inside(gctx.context(), point, tolerance)) {
221 return StatusCode::SUCCESS;
222 }
223 ATH_MSG_ERROR("In channel "<<m_idHelperSvc->toString(chamberId) <<", the point "
224 << descr <<" "<<Amg::toString(volume.globalToLocalTransform(gctx.context())* point)
225 <<" is not part of the chamber volume. The corners of the volume are:");
226 for(const Amg::Vector3D& corner : cornerPoints(gctx, volume)) {
227 ATH_MSG_ERROR(" "<<Amg::toString(volume.globalToLocalTransform(gctx.context())*corner));
228 }
229 return StatusCode::FAILURE;
230 }
constexpr double tolerance

◆ pointInside() [2/2]

template<class EnvelopeType>
StatusCode MuonGMR4::MuonChamberToolTest::pointInside ( const ActsTrk::GeometryContext & gctx,
const EnvelopeType & envelope,
const Acts::Volume & boundVol,
const Amg::Vector3D & point,
const std::string & descr,
const Identifier & channelId ) const
private

Checks whether the point is inside of an envelope object, i.e.

the spectrometer sector or the chamber

Parameters
gctxGeometry context carrying the aligned local -> global transfors
envelopeReference to the envelope to check
boundVolReference to the bounding volume representing the envelope
pointPoint that needs to be inside the volume
descrDescription of the point
channelIdIdentifier for more information if the point is outside

Why does the strip design give a different result than the Acts bounds?

Definition at line 178 of file MuonChamberToolTest.cxx.

183 {
184
185 // Explicitly inline Volume::inside here so that it gets
186 // flattened in debug builds. Gives a significant speedup.
187 //if (boundVol.inside(gctx.context(), point, tolerance)) {
188 const Amg::Vector3D locPos{boundVol.globalToLocalTransform(gctx.context()) * point};
189 if (boundVol.volumeBounds().inside(locPos,tolerance)) {
190 ATH_MSG_VERBOSE("In channel "<<m_idHelperSvc->toString(channelId)
191 <<", point "<<descr <<" is inside of the chamber "<<std::endl<<chamb<<std::endl
192 <<"Local position:" <<Amg::toString(boundVol.globalToLocalTransform(gctx.context()) * point));
193 return StatusCode::SUCCESS;
194 }
195
196 StripDesign planeTrapezoid{};
197 planeTrapezoid.defineTrapezoid(chamb.halfXShort(), chamb.halfXLong(), chamb.halfY());
198 planeTrapezoid.setLevel(MSG::VERBOSE);
200 static const Eigen::Rotation2D axisSwap{90. *Gaudi::Units::deg};
201 if (std::abs(locPos.z()) - chamb.halfZ() < -tolerance &&
202 planeTrapezoid.insideTrapezoid(axisSwap*locPos.block<2,1>(0,0))) {
203 return StatusCode::SUCCESS;
204 }
205 planeTrapezoid.defineStripLayout(locPos.y() * Amg::Vector2D::UnitX(), 1, 1, 1);
206 ATH_MSG_ERROR("In channel "<<m_idHelperSvc->toString(channelId) <<", the point "
207 << descr <<" "<<Amg::toString(point)<<" is not part of the chamber volume."
208 <<std::endl<<std::endl<<chamb<<std::endl<<"Local position "<<Amg::toString(locPos)
209 <<", "<<planeTrapezoid
210 <<", box left edge: "<<Amg::toString(planeTrapezoid.leftEdge(1).value_or(Amg::Vector2D::Zero()))
211 <<", box right edge "<<Amg::toString(planeTrapezoid.rightEdge(1).value_or(Amg::Vector2D::Zero())));
212 return StatusCode::FAILURE;
213 }

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 368 of file AthCommonDataStore.h.

369 {
370 h.renounce();
372 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 352 of file AthCommonDataStore.h.

352 {
354 }

◆ saveEnvelope()

void MuonGMR4::MuonChamberToolTest::saveEnvelope ( const ActsTrk::GeometryContext & gctx,
const std::string & envName,
const Acts::Volume & envelopeVol,
const std::vector< const Acts::Surface * > & assocSurfaces,
const std::vector< const Acts::Volume * > & subVolumes = {} ) const
private

Definition at line 795 of file MuonChamberToolTest.cxx.

799 {
800 Acts::ObjVisualization3D visualHelper{};
801 std::ranges::for_each(assocSurfaces, [&visualHelper, &gctx](const Acts::Surface* surface) {
802 Acts::GeometryView3D::drawSurface(visualHelper, *surface, gctx.context());
803
804 });
805 std::ranges::for_each(subVols, [&visualHelper, &gctx](const Acts::Volume* subVol) {
806 Acts::GeometryView3D::drawVolume(visualHelper,*subVol, gctx.context(), Amg::Isometry3D::Identity(),
807 Acts::s_viewPassive);
808 });
809 Acts::GeometryView3D::drawVolume(visualHelper, envelopeVol, gctx.context());
810 ATH_MSG_DEBUG("Save new envelope 'MsTrackTest_"<<envName<<".obj'");
811 visualHelper.write(std::format("MsTrackTest_{:}.obj", envName));
812 }

◆ setFilterPassed()

virtual void AthCommonAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Set filter decision:

Definition at line 99 of file AthCommonAlgorithm.h.

99 {
101 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const
Set filter decision:

◆ sysExecute()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Reimplemented in AthAnalysisAlgorithm.

Definition at line 80 of file AthCommonAlgorithm.cxx.

41{
42 return BaseAlg::sysExecute (ctx);
43}

◆ sysInitialize()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in AthAnalysisAlgorithm, AthHistogramAlgorithm, HypoBase, InputMakerBase, and PyAthena::Alg.

Definition at line 60 of file AthCommonAlgorithm.cxx.

71 {
73
74 if (sc.isFailure()) {
75 return sc;
76 }
77
78 ServiceHandle<ICondSvc> cs("CondSvc",name());
79 for (auto h : outputHandles()) {
80 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
81 // do this inside the loop so we don't create the CondSvc until needed
82 if ( cs.retrieve().isFailure() ) {
83 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
85 }
86 if (cs->regHandle(this,*h).isFailure()) {
88 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
89 << " with CondSvc");
90 }
91 }
92 }
93 return sc;
94}
virtual StatusCode sysInitialize() override
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ testReadoutEle() [1/7]

template<class EnvelopeType>
StatusCode MuonGMR4::MuonChamberToolTest::testReadoutEle ( const ActsTrk::GeometryContext & gctx,
const MdtReadoutElement & readOutEle,
const EnvelopeType & envelope,
const Acts::Volume & boundVol ) const
private

Checks whether all channels of a given readout element are fully covered by the envelope.

Parameters
gctxGeometry context carrying all alignment & global transformations
readOutEleReadout element to test
envelopeReference to the envelope to check
boundVolBounding volume representing the envelope

Definition at line 825 of file MuonChamberToolTest.cxx.

828 {
829 ATH_MSG_VERBOSE("Test whether "<<m_idHelperSvc->toStringDetEl(mdtMl.identify())<<std::endl<<mdtMl.getParameters());
830
831 for (unsigned int layer = 1; layer <= mdtMl.numLayers(); ++layer) {
832 for (unsigned int tube = 1; tube <= mdtMl.numTubesInLay(); ++tube) {
833 const IdentifierHash idHash = mdtMl.measurementHash(layer, tube);
834 if (!mdtMl.isValid(idHash)){
835 continue;
836 }
837 const Amg::Transform3D& locToGlob{mdtMl.localToGlobalTransform(gctx, idHash)};
838 const Identifier measId{mdtMl.measurementId(idHash)};
839
840 ATH_CHECK(pointInside(gctx, chamber, detVol, mdtMl.globalTubePos(gctx, idHash), "tube center", measId));
841
842 ATH_CHECK(pointInside(gctx, chamber, detVol, mdtMl.readOutPos(gctx, idHash), "tube readout", measId));
843 ATH_CHECK(pointInside(gctx, chamber, detVol, mdtMl.highVoltPos(gctx, idHash), "tube HV", measId));
844
845 ATH_CHECK(pointInside(gctx, chamber, detVol, locToGlob*(-mdtMl.innerTubeRadius() * Amg::Vector3D::UnitX()),
846 "bottom of the tube box", measId));
847 ATH_CHECK(pointInside(gctx, chamber, detVol, locToGlob*(mdtMl.innerTubeRadius() * Amg::Vector3D::UnitX()),
848 "sealing of the tube box", measId));
849
850 ATH_CHECK(pointInside(gctx, chamber, detVol, locToGlob*(-mdtMl.innerTubeRadius() * Amg::Vector3D::UnitY()),
851 "wall to the previous tube", measId));
852 ATH_CHECK(pointInside(gctx, chamber, detVol, locToGlob*(-mdtMl.innerTubeRadius() * Amg::Vector3D::UnitY()),
853 "wall to the next tube", measId));
854 }
855 }
856 return StatusCode::SUCCESS;
857 }
@ layer
Definition HitInfo.h:79

◆ testReadoutEle() [2/7]

template<class EnevelopeType>
StatusCode MuonGMR4::MuonChamberToolTest::testReadoutEle ( const ActsTrk::GeometryContext & gctx,
const MmReadoutElement & mm,
const EnevelopeType & chamber,
const Acts::Volume & detVol ) const

Definition at line 902 of file MuonChamberToolTest.cxx.

905 {
906
907 const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
908 for(unsigned int gasGap = 1; gasGap <= mm.nGasGaps(); ++gasGap){
909 IdentifierHash gasGapHash = MmReadoutElement::createHash(gasGap,0);
910 unsigned int firstStrip = mm.firstStrip(gasGapHash);
911 for(unsigned int strip = firstStrip; strip <= mm.numStrips(gasGapHash); ++strip){
912 const Identifier stripId = idHelper.channelID(mm.identify(), mm.multilayer(), gasGap, strip);
913 ATH_CHECK(pointInside(gctx, chamber, detVol, mm.stripPosition(gctx, stripId), "center", stripId));
914 ATH_CHECK(pointInside(gctx, chamber, detVol, mm.leftStripEdge(gctx, mm.measurementHash(stripId)), "left edge", stripId));
915 ATH_CHECK(pointInside(gctx, chamber, detVol, mm.rightStripEdge(gctx, mm.measurementHash(stripId)), "right edge", stripId));
916 }
917 }
918
919 return StatusCode::SUCCESS;
920 }
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channel) const
static IdentifierHash createHash(const int gasGap, const int strip)

◆ testReadoutEle() [3/7]

template<class EnvelopeType>
StatusCode MuonGMR4::MuonChamberToolTest::testReadoutEle ( const ActsTrk::GeometryContext & gctx,
const MmReadoutElement & readOutEle,
const EnvelopeType & envelope,
const Acts::Volume & boundVol ) const
private

◆ testReadoutEle() [4/7]

template<class EnvelopeType>
StatusCode MuonGMR4::MuonChamberToolTest::testReadoutEle ( const ActsTrk::GeometryContext & gctx,
const RpcReadoutElement & readOutEle,
const EnvelopeType & envelope,
const Acts::Volume & boundVol ) const
private

Definition at line 859 of file MuonChamberToolTest.cxx.

862 {
863
864 ATH_MSG_VERBOSE("Test whether "<<m_idHelperSvc->toStringDetEl(rpc.identify())<<std::endl<<rpc.getParameters());
865
866 const RpcIdHelper& idHelper{m_idHelperSvc->rpcIdHelper()};
867 for (unsigned int gasGap = 1 ; gasGap <= rpc.nGasGaps(); ++gasGap) {
868 for (int doubletPhi = rpc.doubletPhi(); doubletPhi <= rpc.doubletPhiMax(); ++doubletPhi){
869 for (bool measPhi : {false, true}) {
870 const int nStrips = measPhi ? rpc.nPhiStrips() : rpc.nEtaStrips();
871 for (int strip = 1; strip <= nStrips; ++strip) {
872 const Identifier stripId = idHelper.channelID(rpc.identify(),rpc.doubletZ(),
873 doubletPhi, gasGap, measPhi, strip);
874 ATH_CHECK(pointInside(gctx, chamber, detVol, rpc.stripPosition(gctx, stripId), "center", stripId));
875 ATH_CHECK(pointInside(gctx, chamber, detVol, rpc.leftStripEdge(gctx, stripId), "right edge", stripId));
876 ATH_CHECK(pointInside(gctx, chamber, detVol, rpc.rightStripEdge(gctx, stripId), "left edge", stripId));
877 }
878 }
879 }
880 }
881 return StatusCode::SUCCESS;
882 }
Identifier channelID(int stationName, int stationEta, int stationPhi, int doubletR, int doubletZ, int doubletPhi, int gasGap, int measuresPhi, int strip) const
int nStrips(const MuonGM::TgcReadoutElement &readoutEle, int layer)

◆ testReadoutEle() [5/7]

template<class EnvelopeType>
StatusCode MuonGMR4::MuonChamberToolTest::testReadoutEle ( const ActsTrk::GeometryContext & gctx,
const sTgcReadoutElement & readOutEle,
const EnvelopeType & envelope,
const Acts::Volume & boundVol ) const
private

Definition at line 922 of file MuonChamberToolTest.cxx.

925 {
926
927 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
928 for(unsigned int gasGap = 1; gasGap <= stgc.numLayers(); ++gasGap){
929
930 for(unsigned int nch = 1; nch <= stgc.nChTypes(); ++nch){
931 IdentifierHash gasGapHash = sTgcReadoutElement::createHash(gasGap, nch, 0, 0);
932 const unsigned int nStrips = stgc.numChannels(gasGapHash);
934
935 for(unsigned int strip = 1; strip <= nStrips; ++strip){
936 const Identifier stripId = idHelper.channelID(stgc.identify(), stgc.multilayer(), gasGap, nch, strip);
937 const IdentifierHash stripHash = stgc.measurementHash(stripId);
938 ATH_CHECK(pointInside(gctx, chamber, detVol, stgc.globalChannelPosition(gctx, stripHash), "channel position", stripId));
939
941 ATH_CHECK(pointInside(gctx, chamber, detVol, stgc.rightStripEdge(gctx, stripHash), "channel position", stripId));
942 ATH_CHECK(pointInside(gctx, chamber, detVol, stgc.leftStripEdge(gctx, stripHash), "channel position", stripId));
943 }
944 }
945 }
946 }
947 return StatusCode::SUCCESS;
948
949 }
ReadoutChannelType
ReadoutChannelType to distinguish the available readout channels Pad - pad readout channel Strip - et...
static IdentifierHash createHash(const unsigned gasGap, const unsigned channelType, const unsigned channel, const unsigned wireInGrp=0)
Create a measurement hash from the Identifier fields.
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const

◆ testReadoutEle() [6/7]

template<class EnvelopeType>
StatusCode MuonGMR4::MuonChamberToolTest::testReadoutEle ( const ActsTrk::GeometryContext & gctx,
const TgcReadoutElement & readOutEle,
const EnvelopeType & envelope,
const Acts::Volume & boundVol ) const
private

◆ testReadoutEle() [7/7]

template<class EnevelopeType>
StatusCode MuonGMR4::MuonChamberToolTest::testReadoutEle ( const ActsTrk::GeometryContext & gctx,
const TgcReadoutElement & tgc,
const EnevelopeType & chamber,
const Acts::Volume & detVol ) const

Definition at line 884 of file MuonChamberToolTest.cxx.

887 {
888 for (unsigned int gasGap = 1; gasGap <= tgc.nGasGaps(); ++gasGap){
889 for (bool isStrip : {false}) {
890 const IdentifierHash layHash = tgc.constructHash(0, gasGap, isStrip);
891 const unsigned int nChannel = tgc.numChannels(layHash);
892 for (unsigned int channel = 1; channel <= nChannel ; ++channel) {
893 const IdentifierHash measHash = tgc.constructHash(channel, gasGap, isStrip);
894 ATH_CHECK(pointInside(gctx, chamber, detVol, tgc.channelPosition(gctx, measHash),
895 "center", tgc.measurementId(measHash)));
896 }
897 }
898 }
899 return StatusCode::SUCCESS;
900 }

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 298 of file AthCommonDataStore.h.

298 {
299 for (auto &a : m_vhka) {
301 for (auto k : keys) {
302 k->setOwner(this);
303 }
304 }
305 }

Member Data Documentation

◆ m_detMgr

const MuonDetectorManager* MuonGMR4::MuonChamberToolTest::m_detMgr {nullptr}
private

Definition at line 151 of file MuonChamberToolTest.h.

151{nullptr};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 381 of file AthCommonDataStore.h.

◆ m_dumpObjs

Gaudi::Property<bool> MuonGMR4::MuonChamberToolTest::m_dumpObjs {this, "dumpVolumes" , false}
private

Dump the chambers & sectors as separate obj files.

Definition at line 150 of file MuonChamberToolTest.h.

150{this, "dumpVolumes" , false};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 378 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 108 of file AthCommonAlgorithm.h.

◆ m_geoCtxKey

ActsTrk::GeoContextReadKey_t MuonGMR4::MuonChamberToolTest::m_geoCtxKey {this, "AlignmentKey", "ActsAlignment", "cond handle key"}
private

Definition at line 137 of file MuonChamberToolTest.h.

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

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> MuonGMR4::MuonChamberToolTest::m_idHelperSvc
private
Initial value:
{this, "IdHelperSvc",
"Muon::MuonIdHelperSvc/MuonIdHelperSvc"}

Definition at line 134 of file MuonChamberToolTest.h.

134 {this, "IdHelperSvc",
135 "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_ignoreOutsideSurf

Gaudi::Property<bool> MuonGMR4::MuonChamberToolTest::m_ignoreOutsideSurf {this, "ignoreOutsideSurface", true}
private

The exceeding surfaces does not lead to a failure.

In fact, the tubes are exceeded in BIS78 (TODO)

Definition at line 148 of file MuonChamberToolTest.h.

148{this, "ignoreOutsideSurface", true};

◆ m_ignoreOverlapCh

Gaudi::Property<bool> MuonGMR4::MuonChamberToolTest::m_ignoreOverlapCh {this, "ignoreChamberOverlap", true}
private

The overlap of chamber volumes does not lead to a failure.

In fact, the overlap between the T4 & BIS78 chambers is found to be unavoidable without boolean shapes in the tracking geometry

Definition at line 146 of file MuonChamberToolTest.h.

146{this, "ignoreChamberOverlap", true};

◆ m_overlapChambObj

Gaudi::Property<std::string> MuonGMR4::MuonChamberToolTest::m_overlapChambObj {this, "chamberOverlapFile", "OverlapingChambers.obj"}
private

Name of the chamber output obj file.

Definition at line 143 of file MuonChamberToolTest.h.

143{this, "chamberOverlapFile", "OverlapingChambers.obj"};

◆ m_overlapSamples

Gaudi::Property<unsigned> MuonGMR4::MuonChamberToolTest::m_overlapSamples {this, "overlapSamples", 50}
private

Number of points to scan along the lines between two volume corners to check whether they belong to an another volume.

Definition at line 141 of file MuonChamberToolTest.h.

141{this, "overlapSamples", 50};

◆ m_trackingGeometrySvc

ServiceHandle<ActsTrk::ITrackingGeometrySvc> MuonGMR4::MuonChamberToolTest::m_trackingGeometrySvc {this, "TrackingGeometrySvc","ActsTrackingGeometrySvc"}
private

Definition at line 139 of file MuonChamberToolTest.h.

139{this, "TrackingGeometrySvc","ActsTrackingGeometrySvc"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 387 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 386 of file AthCommonDataStore.h.


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