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

#include <ReadoutGeomCnvAlg.h>

Inheritance diagram for MuonGMR4::ReadoutGeomCnvAlg:
Collaboration diagram for MuonGMR4::ReadoutGeomCnvAlg:

Classes

struct  ConstructionCache
 Cache object holding the constructed detector manager, and the intermediate GeoModel objects needed to build the legacy readout geometry. More...

Public Member Functions

 ~ReadoutGeomCnvAlg ()=default
StatusCode execute (const EventContext &ctx) const override
StatusCode initialize () override
virtual bool isReEntrant () const override
 Avoid scheduling algorithm multiple times.
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
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
virtual void setFilterPassed (bool state, const EventContext &ctx) const
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< StoreGateSvcStoreGateSvc_t

Private Member Functions

StatusCode buildStation (const ActsTrk::GeometryContext &gctx, const Identifier &stationId, ConstructionCache &cacheObj) const
 builds a station object from readout element.
StatusCode cloneReadoutVolume (const ActsTrk::GeometryContext &gctx, const Identifier &stationId, ConstructionCache &cacheObj, GeoIntrusivePtr< GeoVFullPhysVol > &clonedPhysVol, MuonGM::MuonStation *&station) const
 Clones the fullPhysical volume of the readoutElement and embeds it into the associated station.
GeoIntrusivePtr< GeoVFullPhysVol > cloneNswWedge (const ActsTrk::GeometryContext &gctx, const MuonGMR4::MuonReadoutElement &nswRE, ConstructionCache &cacheObj) const
 Clones the full phyical volume associated to the NSw readout element.
StatusCode buildMdt (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
 Converts all Mdt readout elements from the R4 format into the legacy Trk format.
StatusCode buildRpc (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
 Converts all Rpc readout elements from the R4 format into the legacy Trk format.
StatusCode buildSTGC (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
 Converts all sTgc readout elements from the R4 format into the legacy Trk format.
StatusCode buildMM (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
 Converts all Mm readout elements from the R4 format into the legacy Trk format.
StatusCode buildTgc (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
 Converts all Tgc readout elements from the R4 format into the legacy Trk format.
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::RpcReadoutElement &refEle, const MuonGM::RpcReadoutElement &testEle) const
 Compares the R4 readout element with the constructed Trk readout element.
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::MdtReadoutElement &refEle, const MuonGM::MdtReadoutElement &testEle) const
 Compares the R4 readout element with the constructed Trk readout element.
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::MmReadoutElement &refEle, const MuonGM::MMReadoutElement &testEle) const
 Compares the R4 readout element with the constructed Trk readout element.
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::TgcReadoutElement &refEle, const MuonGM::TgcReadoutElement &testEle) const
 Compares the R4 readout element with the constructed Trk readout element.
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::sTgcReadoutElement &refEle, const MuonGM::sTgcReadoutElement &testEle) const
 Compares the R4 readout element with the constructed Trk readout element.
StatusCode checkIdCompability (const MuonGMR4::MuonReadoutElement &refEle, const MuonGM::MuonReadoutElement &testEle) const
 Checks whether the Identifier fields of both readout elements are identical.
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
SG::WriteCondHandleKey< MuonGM::MuonDetectorManagerm_writeKey {this, "WriteKey", "MuonDetectorManager"}
SG::ReadCondHandleKeyArray< ActsTrk::DetectorAlignStorem_alignStoreKeys {this, "AlignmentKeys", {}, "Alignment key"}
Gaudi::Property< bool > m_checkGeo {this, "checkGeo", false, "Checks the positions of the sensors"}
Gaudi::Property< bool > m_dumpGeo {this, "dumpGeo", false, "Dumps the constructed geometry"}
Gaudi::Property< bool > m_splitTrfCache {this, "splitTrfCache", false, ""}
 Instantiate a new transform cache to ensure lazy transform population in the event processing.
Gaudi::Property< std::string > m_geoDumpName {this,"geoDumpName", "ConvMuonGeoModel.db",}
const MuonGMR4::MuonDetectorManagerm_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 32 of file ReadoutGeomCnvAlg.h.

Member Typedef Documentation

◆ StoreGateSvc_t

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

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ ~ReadoutGeomCnvAlg()

MuonGMR4::ReadoutGeomCnvAlg::~ReadoutGeomCnvAlg ( )
default

Member Function Documentation

◆ buildMdt()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::buildMdt ( const ActsTrk::GeometryContext & gctx,
ConstructionCache & cacheObj ) const
private

Converts all Mdt readout elements from the R4 format into the legacy Trk format.

Parameters
gctxCurrent geometry context carrying the current alignment
cacheObjMutable reference to the GeoModel constuction cache

Access the B-Line and As-built parameters

Build the mother station

1 cm is added as safety margin to the Mdt multilayer envelope

Need to check how to obtain this parameter from the new geometry newElement->m_cutoutShift;

Determine the tube length's

Define the tube staggering

Add the readout element to the detector manager

Definition at line 700 of file ReadoutGeomCnvAlg.cxx.

700 {
702 SubDetAlignment alignItr = gctx.getStore(ActsTrk::DetectorType::Mdt);
703 const MdtAlignmentStore* alignStore = alignItr ?
704 static_cast<const MdtAlignmentStore*>(alignItr->internalAlignment.get()) : nullptr;
705
706 const std::vector<const MuonGMR4::MdtReadoutElement*> mdtReadOuts{m_detMgr->getAllMdtReadoutElements()};
707 ATH_MSG_INFO("Copy "<<mdtReadOuts.size()<<" Mdt readout elements to the legacy system");
708 if (mdtReadOuts.empty()) return StatusCode::SUCCESS;
709 for (const MuonGMR4::MdtReadoutElement* copyMe : mdtReadOuts) {
710 const Identifier reId = copyMe->identify();
711 ATH_MSG_DEBUG("Translate "<<m_idHelperSvc->toStringDetEl(reId));
713 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
714 MuonGM::MuonStation* station{nullptr};
715 ATH_CHECK(cloneReadoutVolume(gctx,reId, cacheObj, physVol, station));
716 if (copyMe->multilayer() == 1) {
717 const MuonGMR4::MdtReadoutElement* otherRE = copyMe->complementaryRE();
718 const double height = std::max(copyMe->moduleHeight(), otherRE->moduleHeight()) -
719 (copyMe->tubePitch() - 2. * copyMe->tubeRadius());
720
721 const double modHalTHickO{0.5*otherRE->moduleThickness()},
722 modHalfThick{-0.5*copyMe->moduleThickness()};
723
724 const double thickness = ( (otherRE->asBuiltRefFrame()*(modHalTHickO* Amg::Vector3D::UnitX())) -
725 (copyMe->asBuiltRefFrame()*(modHalfThick* Amg::Vector3D::UnitX()))).z();
726 if (copyMe->isBarrel()) {
727 station->setMdtZsize(height);
728 station->setMdtRsize(thickness);
729 } else {
730 station->setMdtRsize(height);
731 station->setMdtZsize(thickness);
732 }
733 }
734 const MuonGMR4::MdtReadoutElement::parameterBook& pars{copyMe->getParameters()};
735 auto newElement = std::make_unique<MuonGM::MdtReadoutElement>(physVol,
736 m_idHelperSvc->stationNameString(reId),
737 cacheObj.detMgr.get());
738 newElement->setIdentifier(reId);
739 newElement->setMultilayer(copyMe->multilayer());
740 newElement->setNMdtInStation(m_idHelperSvc->mdtIdHelper().multilayerMax(reId));
741 // cppcheck-suppress invalidLifetime; ok: mgr took ownership.
742 newElement->setParentMuonStation(station);
743
745 newElement->setLongSsize(2*pars.longHalfX - 1._cm);
746 newElement->setSsize(2*pars.shortHalfX - 1._cm);
747 newElement->setLongRsize(2*pars.halfY);
748 newElement->setRsize(2*pars.halfY);
749 newElement->setZsize(2*pars.halfHeight);
750 newElement->setLongZsize(2*pars.halfHeight);
751
752 newElement->m_nlayers = copyMe->numLayers();
753 newElement->m_ntubesperlayer = copyMe->numTubesInLay();
754 newElement->m_deadlength = pars.deadLength;
755 newElement->m_endpluglength = pars.endPlugLength;
756 newElement->m_innerRadius = pars.tubeInnerRad;
757 newElement->m_tubeWallThickness = pars.tubeWall;
758 newElement->m_tubepitch = pars.tubePitch;
761
763 const MuonGMR4::MdtTubeLayer& tubeLay{*pars.tubeLayers[0]};
764 unsigned int step{1};
765 double lastLength{2.*tubeLay.uncutHalfLength(1)};
766 for (unsigned tube = 0; tube < copyMe->numTubesInLay(); ++tube) {
767 const double currLength = 2.*tubeLay.uncutHalfLength(tube);
768 ATH_MSG_VERBOSE(m_idHelperSvc->toString(copyMe->identify())<< ", tube "<<tube<<", length: "<<currLength);
769 if (std::abs(lastLength - currLength) > std::numeric_limits<float>::epsilon() ||
770 tube == copyMe->numTubesInLay() -1) {
771 newElement->m_tubelength[step-1] = lastLength;
772 newElement->m_tubelength[step] = currLength;
773 if (step == 1) {
774 newElement->m_ntubesinastep = tube;
775 }
776 lastLength = currLength;
777 ++step;
778 }
779 }
780 newElement->m_nsteps = step;
781
783 double xOffSet{pars.halfY}, yOffSet{pars.halfHeight};
784 if (newElement->barrel()) std::swap(xOffSet, yOffSet);
785 for (unsigned lay = 1; lay <= copyMe->numLayers(); ++lay) {
786 const IdentifierHash tubeHash{copyMe->measurementHash(lay, 1)};
787 const Amg::Vector3D locTube = copyMe->localTubePos(tubeHash);
788 newElement->m_firstwire_x[lay-1] = locTube.z() + xOffSet;
789 newElement->m_firstwire_y[lay-1] = locTube.x() + yOffSet;
790 }
791 MdtAlignmentStore::chamberDistortions distort = alignStore ? alignStore->getDistortion(reId) :
792 MdtAlignmentStore::chamberDistortions{};
793
794 if (!station->hasMdtAsBuiltParams()){
795 station->setMdtAsBuiltParams(distort.asBuilt);
796 }
797 if (!station->hasBLines()){
798 station->setBline(distort.bLine);
799 }
800 const Amg::Vector3D refPoint = copyMe->bLineReferencePoint();
801 station->setBlineFixedPointInAmdbLRS(refPoint.x(), refPoint.y(), refPoint.z());
802
803 newElement->geoInitDone();
804 newElement->setBLinePar(distort.bLine);
805 newElement->fillCache();
806 ATH_CHECK(dumpAndCompare(gctx, *copyMe, *newElement));
808 cacheObj.detMgr->addMdtReadoutElement(std::move(newElement));
809 }
810 return StatusCode::SUCCESS;
811}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
AlignmentStorePtr & getStore(const DetectorType type)
Returns the mutable alignable store for the ATLAS detector type (Pixel, Mdt, etc.)
chamberDistortions getDistortion(const Identifier &detElId) const
Returns a chamber distortion that's cached for the corresponding Mdt chamber element.
double moduleHeight() const
Returns the height of the chamber (Distance bottom - topWidth)
Amg::Transform3D asBuiltRefFrame() const
Returns the transformation to go into the reference frame of the as-buit & b-line model starting from...
double moduleThickness() const
Returns the thickness of the chamber.
double uncutHalfLength(const unsigned int tube) const
Returns the uncut-half length of the given tube.
StatusCode cloneReadoutVolume(const ActsTrk::GeometryContext &gctx, const Identifier &stationId, ConstructionCache &cacheObj, GeoIntrusivePtr< GeoVFullPhysVol > &clonedPhysVol, MuonGM::MuonStation *&station) const
Clones the fullPhysical volume of the readoutElement and embeds it into the associated station.
StatusCode dumpAndCompare(const ActsTrk::GeometryContext &gctx, const MuonGMR4::RpcReadoutElement &refEle, const MuonGM::RpcReadoutElement &testEle) const
Compares the R4 readout element with the constructed Trk readout element.
const MuonGMR4::MuonDetectorManager * m_detMgr
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
void setBlineFixedPointInAmdbLRS(double s0, double z0, double t0)
bool hasBLines() const
void setMdtAsBuiltParams(const MdtAsBuiltPar *xtomo)
void setMdtRsize(const double rSize)
void setMdtZsize(const double zSize)
void setBline(const BLinePar *bline)
bool hasMdtAsBuiltParams() const
@ Mdt
MuonSpectrometer.
Eigen::Matrix< double, 3, 1 > Vector3D
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)

◆ buildMM()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::buildMM ( const ActsTrk::GeometryContext & gctx,
ConstructionCache & cacheObj ) const
private

Converts all Mm readout elements from the R4 format into the legacy Trk format.

Parameters
gctxCurrent geometry context carrying the current alignment
cacheObjMutable reference to the GeoModel constuction cache

Loop over the gas gaps & efine the

Definition at line 522 of file ReadoutGeomCnvAlg.cxx.

522 {
523
524 SubDetAlignment alignItr = gctx.getStore(ActsTrk::DetectorType::Mm);
525 const auto alignStore = alignItr ?
526 static_cast<const MmAlignmentStore*>(alignItr->internalAlignment.get()) : nullptr;
527
528 if (alignStore) {
529 cacheObj.detMgr->setMMPassivation(alignStore->passivation);
530 }
531 const std::vector<const MuonGMR4::MmReadoutElement*> mmReadouts{m_detMgr->getAllMmReadoutElements()};
532 ATH_MSG_INFO("Copy "<<mmReadouts.size()<<" Mm readout elements to the legacy system");
533
534 if (mmReadouts.empty()) return StatusCode::SUCCESS;
535
536 for (const MuonGMR4::MmReadoutElement* copyMe : mmReadouts) {
537 const Identifier reId = copyMe->identify();
538 GeoIntrusivePtr<GeoVFullPhysVol> physVol{cloneNswWedge(gctx, *copyMe, cacheObj)};
539 auto newRE = std::make_unique<MuonGM::MMReadoutElement>(physVol,
540 m_idHelperSvc->stationNameString(reId),
541 copyMe->stationEta(),
542 copyMe->stationPhi(),
543 copyMe->multilayer(), cacheObj.detMgr.get());
545 for (unsigned int gasGap = 0; gasGap < copyMe->nGasGaps(); ++gasGap) {
546 const MuonGMR4::StripLayer& stripLayer{copyMe->stripLayer(MuonGMR4::MmReadoutElement::createHash(gasGap +1, 0))};
547 const MuonGMR4::StripDesign& designFrom{stripLayer.design()};
548
549 newRE->m_Xlg[gasGap] = stripLayer.toOrigin() *
550 Amg::getRotateZ3D(-designFrom.stereoAngle()) *
551 Amg::getRotateY3D(90. * Gaudi::Units::deg);
552 ATH_MSG_VERBOSE("Layer transform "<<gasGap<<" "<<GeoTrf::toString(newRE->m_Xlg[gasGap], true));
553
554 MuonGM::MuonChannelDesign& designTo{newRE->m_etaDesign[gasGap]};
555 designTo.defineTrapezoid(designFrom.shortHalfHeight(),
556 designFrom.longHalfHeight(),
557 designFrom.halfWidth(),
558 designFrom.stereoAngle());
561 designTo.inputPitch = designFrom.stripPitch();
562 designTo.inputWidth = designTo.inputPitch * std::cos(designTo.stereoAngle());
563 designTo.nMissedBottomEta = designTo.nMissedBottomStereo = designFrom.firstStripNumber() - 1;
564 designTo.totalStrips = designFrom.numStrips();
565 designTo.nch = designFrom.numStrips();
566
567 designTo.setFirstPos(designFrom.firstStripPos().x() + 0.5*designTo.inputPitch);
568 }
569
570 newRE->fillCache();
571 if (alignStore && alignStore->getBLine(reId)) {
572 newRE->setBLinePar(*alignStore->getBLine(reId));
573 }
574 ATH_CHECK(dumpAndCompare(gctx, *copyMe, *newRE));
575 cacheObj.detMgr->addMMReadoutElement(std::move(newRE));
576 }
577 return StatusCode::SUCCESS;
578}
static IdentifierHash createHash(const int gasGap, const int strip)
GeoIntrusivePtr< GeoVFullPhysVol > cloneNswWedge(const ActsTrk::GeometryContext &gctx, const MuonGMR4::MuonReadoutElement &nswRE, ConstructionCache &cacheObj) const
Clones the full phyical volume associated to the NSw readout element.
double halfWidth() const
Returns the half height of the strip panel.
double stereoAngle() const
Returns the value of the stereo angle.
int firstStripNumber() const
Returns the number of the first strip.
const Amg::Vector2D & firstStripPos() const
Vector indicating the first strip position.
double stripPitch() const
Distance between two adjacent strips.
double shortHalfHeight() const
Returns the shorter half height of the panel.
double longHalfHeight() const
Returns the longer half height of the panel.
virtual int numStrips() const
Number of strips on the panel.
const StripDesign & design(bool phiView=false) const
Returns the underlying strip design.
const Amg::Transform3D & toOrigin() const
Returns the transformation to go from the strip layer center to the origin of the Strip chamber.
@ Mm
Maybe not needed in the migration.
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
double stereoAngle() const
returns the stereo angle
void defineTrapezoid(double HalfShortY, double HalfLongY, double HalfHeight)
set the trapezoid dimensions
void setFirstPos(const double pos)
Set the position of the first strip along the x-axis.

◆ buildRpc()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::buildRpc ( const ActsTrk::GeometryContext & gctx,
ConstructionCache & cacheObj ) const
private

Converts all Rpc readout elements from the R4 format into the legacy Trk format.

Parameters
gctxCurrent geometry context carrying the current alignment
cacheObjMutable reference to the GeoModel constuction cache

Define the dimensions

Hack to assign the proper strip positions for REs having doubletPhi =2 in their Identifier

Resignment in face of the rpc readout geometry. Overwrite all the parameters

Definition at line 311 of file ReadoutGeomCnvAlg.cxx.

311 {
312
313 const std::vector<const MuonGMR4::RpcReadoutElement*> readoutEles = m_detMgr->getAllRpcReadoutElements();
314 ATH_MSG_INFO("Copy "<<readoutEles.size()<<" Rpc readout elements to the legacy system");
315 if (readoutEles.empty()) return StatusCode::SUCCESS;
316 const RpcIdHelper& idHelper{m_idHelperSvc->rpcIdHelper()};
317 for (const MuonGMR4::RpcReadoutElement* copyMe : readoutEles) {
318 const Identifier reId = copyMe->identify();
319 const MuonGMR4::RpcReadoutElement::parameterBook& pars{copyMe->getParameters()};
320 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
321 MuonGM::MuonStation* station{nullptr};
322 ATH_CHECK(cloneReadoutVolume(gctx, reId, cacheObj, physVol, station));
323 auto newElement = std::make_unique<MuonGM::RpcReadoutElement>(physVol,
324 m_idHelperSvc->stationNameString(reId),
325 1, 1, false, cacheObj.detMgr.get());
326 newElement->setDoubletPhi(copyMe->doubletPhi());
327 newElement->setDoubletR(copyMe->doubletR());
328 newElement->setDoubletZ(copyMe->doubletZ());
329 newElement->setIdentifier(reId);
330 newElement->setParentMuonStation(station);
331 station->addMuonReadoutElementWithAlTransf(newElement.get(), nullptr, station->nMuonReadoutElements());
332
334 newElement->setLongZsize(2.*pars.halfLength);
335 newElement->setLongSsize(2.*pars.halfWidth);
336 newElement->setLongRsize(2.*pars.halfThickness);
337 newElement->setZsize(2.*pars.halfLength);
338 newElement->setSsize(2.*pars.halfWidth);
339 newElement->setRsize(2.*pars.halfThickness);
340
341 newElement->m_nlayers = copyMe->nGasGaps();
342 newElement->m_phistripwidth = copyMe->stripPhiWidth();
343 newElement->m_etastripwidth = copyMe->stripEtaWidth();
344 newElement->m_phistrippitch = copyMe->stripPhiPitch();
345 newElement->m_etastrippitch = Acts::copySign(1., copyMe->stationEta() -
346 (copyMe->stationEta()==0))*copyMe->stripEtaPitch();
347 newElement->m_phistriplength = copyMe->stripPhiLength();
348 newElement->m_etastriplength = copyMe->stripEtaLength();
349
350 newElement->m_nphistripsperpanel = copyMe->nPhiStrips();
351 newElement->m_netastripsperpanel = copyMe->nEtaStrips();
352 newElement->m_nphistrippanels = copyMe->nPhiPanels();
353 newElement->m_hasDEDontop = true;
354 newElement->m_descratzneg = false;
355
356 std::vector<Identifier> gapIds{};
357 for (unsigned int gasGap = 1; gasGap <= copyMe->nGasGaps(); ++gasGap) {
358 for (int doubPhi = copyMe->doubletPhiMax(); doubPhi >= copyMe->doubletPhi(); --doubPhi) {
359 for (bool measPhi : {false, true}) {
360 if (measPhi && copyMe->nPhiStrips()==0) continue;
361 const int channel = 1;
362 const Identifier gapId = idHelper.channelID(copyMe->identify(),
363 copyMe->doubletZ(),
364 doubPhi, gasGap, measPhi,
365 channel);
366
367 gapIds.push_back(gapId);
368 const Amg::Vector3D locStripPos = amdbTransform(gctx, *copyMe).inverse() * copyMe->stripPosition(gctx, gapId);
369 ATH_MSG_VERBOSE("GasGap "<<m_idHelperSvc->toString(gapId)<<", local strip position: "<<Amg::toString(locStripPos));
370 newElement->m_gasGap_xPos[gasGap -1] = locStripPos.x();
373 const int dbPIdx = copyMe->doubletPhi() == 2 ? 1 : doubPhi;
374 if (measPhi) {
375 newElement->m_first_phistrip_s[dbPIdx -1] = locStripPos.y();
376 newElement->m_phistrip_z = locStripPos.z();
377 } else{
378 newElement->m_first_etastrip_z = locStripPos.z();
379 newElement->m_etastrip_s[dbPIdx-1] = locStripPos.y();
380 }
381 }
382 }
383 }
384 newElement->fillCache();
386 for (const Identifier& gapId : gapIds) {
387 const int surfaceHash = newElement->surfaceHash(gapId);
388 const int layerHash = newElement->layerHash(gapId);
389 const Amg::Transform3D refTrf{copyMe->localToGlobalTransform(gctx, gapId)*
390 (m_idHelperSvc->measuresPhi(gapId) ?
391 Amg::getRotateZ3D(90_degree) :
392 Amg::Transform3D::Identity())};
393 ATH_MSG_VERBOSE("Assign transform: "<<m_idHelperSvc->toString(gapId)<<", "<<Amg::toString(refTrf));
394 newElement->m_surfaceData->m_layerTransforms[surfaceHash] = refTrf;
395 newElement->m_surfaceData->m_layerCenters[layerHash] = refTrf.translation();
396 newElement->m_surfaceData->m_layerNormals[layerHash] = refTrf.linear() * Amg::Vector3D::UnitZ();
397 }
398 ATH_CHECK(dumpAndCompare(gctx, *copyMe, *newElement));
399 cacheObj.detMgr->addRpcReadoutElement(std::move(newElement));
400 }
401 return StatusCode::SUCCESS;
402}
int nMuonReadoutElements() const
void addMuonReadoutElementWithAlTransf(MuonReadoutElement *a, GeoAlignableTransform *ptrsf, int jobIndex)
Identifier channelID(int stationName, int stationEta, int stationPhi, int doubletR, int doubletZ, int doubletPhi, int gasGap, int measuresPhi, int strip) const
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Affine3d Transform3D
IdentifierHash layerHash(const UncalibratedMeasurement *meas)
Returns the layer hash from an uncalibrated meaurement.

◆ buildStation()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::buildStation ( const ActsTrk::GeometryContext & gctx,
const Identifier & stationId,
ConstructionCache & cacheObj ) const
private

builds a station object from readout element.

The parent PhysVol of the readoutElement is interpreted as embedding station volume and all children which are not fullPhysical volumes are attached to the copied clone.

Parameters
gctxCurrent geometry context carrying the current alignment
stationIdIdentifier of the station encoding stName, stEta, stPhi
cacheObjMutable reference to the GeoModel constuction cache

Fetch the readout element to get its parent volume

Retrieve the full phyiscal volume

There is one alignable node in front of the

Check whether the alignable node is displaced from the station

Copy the full physical volume of the muon station

Make sure to copy all the children from the original tree that're not FullPhysVols -> represent They represent the passive material inside the station and are needed for the TrackinGeometry building

Skip the full physical volumes as they represent the readout elements

To create the muon station, we need to extract the dimensions --> Recieve the edge points from the shapes

Fetch the transform of the detector element which is AlignableNode x Station x [relative pos in station]

S / R / Z size

S / R / Z size (long)

Add the physical volume to the world

Definition at line 157 of file ReadoutGeomCnvAlg.cxx.

159 {
160 const std::string stName{m_idHelperSvc->stationNameString(stationId)};
161 const int stEta{m_idHelperSvc->stationEta(stationId)};
162 const int stPhi{m_idHelperSvc->stationPhi(stationId)};
163 MuonGM::MuonStation* station = cacheObj.detMgr->getMuonStation(stName, stEta, stPhi);
164 if (station) {
165 ATH_MSG_DEBUG("Station "<<stName<<", stEta: "<<stEta<<", stPhi: "<<stPhi<<" already exists.");
166 return StatusCode::SUCCESS;
167 }
169 const MuonGMR4::MuonReadoutElement* copyMe = m_detMgr->getReadoutElement(stationId);
170
172 const GeoVFullPhysVol* readOutVol = copyMe->getMaterialGeom();
173 // This is the physical volume that contains the readOutVol as a child.
174 PVConstLink parentVolume = readOutVol->getParent();
175
176 const GeoAlignableTransform* alignTrf{copyMe->alignableTransform()};
177
179 GeoIntrusivePtr<const GeoGraphNode> alignNode{*(parentVolume->getParent()->findChildNode(alignTrf) + 1)};
181 GeoIntrusivePtr<const GeoTransform> stationShiftNode{alignNode != parentVolume ?
182 dynamic_pointer_cast<const GeoTransform>(alignNode) : nullptr};
183
184 cacheObj.translatedStations.insert(parentVolume);
186 PVLink copiedStationVol{};
187 if (!stationShiftNode) {
188 copiedStationVol = make_intrusive<GeoFullPhysVol>(parentVolume->getLogVol());
189 } else {
190 auto volToCopy = parentVolume->getLogVol();
191 auto newShape = cacheObj.cacheShape(make_intrusive<GeoShapeShift>(volToCopy->getShape(),
192 stationShiftNode->getDefTransform()));
193 auto newLogVol = make_intrusive<GeoLogVol>(volToCopy->getName(), newShape, volToCopy->getMaterial());
194 copiedStationVol = make_intrusive<GeoFullPhysVol>(cacheObj.cacheVolume(newLogVol));
195 }
196
199 const std::vector<GeoChildNodeWithTrf> children = getChildrenWithRef(parentVolume, false); // we get the list of child nodes attached to the parent volume
200 double minX{1.e9}, maxX{-1.e9}, minY1{1.e9}, maxY1{-1.e9}, minY2{1.e9}, maxY2{-1.e9}, minZ{1.e9}, maxZ{-1.e9};
201 for (const GeoChildNodeWithTrf& child : children) {
202 std::vector<Amg::Vector3D> edges = getPolyShapeEdges(child.volume->getLogVol()->getShape(), //we are getting corner points of the edges
203 readOutVol->getX().inverse() * child.transform); //getX() returns the transformation from readout physical volume ref to parent physical volume ref. We take the inverse and we chain it with child.transform, which is from child ref to parent ref
204 for (const Amg::Vector3D& edge : edges) {
205 minX = std::min(minX, edge.x());
206 maxX = std::max(maxX, edge.x());
207 minZ = std::min(minZ, edge.z());
208 maxZ = std::max(maxZ, edge.z());
209 if (edge.z() < 0) {
210 minY1 = std::min(minY1, edge.y());
211 maxY1 = std::max(maxY1, edge.y());
212 } else {
213 minY2 = std::min(minY2, edge.y());
214 maxY2 = std::max(maxY2, edge.y());
215 }
216 }
218 const GeoVPhysVol &childVolRef = *child.volume;
219 if (typeid(childVolRef) == typeid(GeoFullPhysVol)) {
220 continue;
221 }
222 // Add the beam lines / foams inside the station volume
223 PVLink childVol = const_pointer_cast<GeoVPhysVol>(child.volume);
224 copiedStationVol->add(cacheObj.newIdTag());
225 if (stationShiftNode) {
226 copiedStationVol->add(const_pointer_cast(stationShiftNode));
227 }
228 copiedStationVol->add(cacheObj.makeTransform(child.transform));
229 copiedStationVol->add(cloneVolume(childVol));
230 }
231
234 const double shortS = (maxY1 - minY1);
235 const double longS = (maxY2 - minY2);
236 const double lengthR = (maxX - minX);
237 const double lengthZ = (maxZ - minZ);
238
240 const Amg::Transform3D alignedTransform = amdbTransform(gctx, *copyMe) *
241 ( ( stationShiftNode ? stationShiftNode->getDefTransform() : Amg::Transform3D::Identity())
242 * readOutVol->getDefX()).inverse();
243
244
245 auto newStation = std::make_unique<MuonGM::MuonStation>(stName,
246 shortS, lengthR, lengthZ,
247 longS, lengthR, lengthZ,
248 stEta, stPhi, false);
249 newStation->setPhysVol(copiedStationVol);
251 cacheObj.world->add(cacheObj.newIdTag());
252 auto copyAlignNode = make_intrusive<GeoAlignableTransform>(alignedTransform);
253 newStation->setTransform(copyAlignNode);
254 newStation->setNominalAmdbLRSToGlobal(copyAlignNode->getTransform());
255
256 ATH_MSG_VERBOSE("stName: "<<stName<<", stEta: "<<stEta<<", stPhi: "<<stPhi
257 <<" -- shortS: "<<shortS<<", longS: "<<longS
258 <<", lengthR: "<<lengthR<<", lengthZ: "<<lengthZ
259 <<std::endl<<"AlignableNode: "<<GeoTrf::toString(alignedTransform, true)
260 <<std::endl<<"Station shift: "<<GeoTrf::toString(stationShiftNode ? stationShiftNode->getDefTransform()
261 : Amg::Transform3D::Identity(), true)
262 <<std::endl<<"AmdLRSToGlobal: "<<GeoTrf::toString(newStation->getNominalAmdbLRSToGlobal(), true)
263 <<std::endl<<"Readout transform: "<<GeoTrf::toString(readOutVol->getX(), true));
264 cacheObj.detMgr->addMuonStation(std::move(newStation));
265 cacheObj.world->add(copyAlignNode);
266 cacheObj.world->add(copiedStationVol);
267 return StatusCode::SUCCESS;
268}
const GeoAlignableTransform * alignableTransform() const
Return the alignable transform node of the readout element.
const std::string & stName(StIndex index)
convert StIndex into a string

◆ buildSTGC()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::buildSTGC ( const ActsTrk::GeometryContext & gctx,
ConstructionCache & cacheObj ) const
private

Converts all sTgc readout elements from the R4 format into the legacy Trk format.

Parameters
gctxCurrent geometry context carrying the current alignment
cacheObjMutable reference to the GeoModel constuction cache

Initialize the eta design

Initialize the phi design

To circumvent the yCutout calculations in padCorner function in MuonPadDesign

Definition at line 580 of file ReadoutGeomCnvAlg.cxx.

580 {
581 SubDetAlignment alignItr = gctx.getStore(ActsTrk::DetectorType::sTgc);
582 auto alignStore = alignItr ? static_cast<const sTgcAlignmentStore*>(alignItr->internalAlignment.get()) : nullptr;
583
584 const std::vector<const MuonGMR4::sTgcReadoutElement*> sTgcReadOuts{m_detMgr->getAllsTgcReadoutElements()};
585 ATH_MSG_INFO("Copy "<<sTgcReadOuts.size()<<" sTgc readout elements to the legacy system");
586
587 if (sTgcReadOuts.empty()) return StatusCode::SUCCESS;
588
589 for (const MuonGMR4::sTgcReadoutElement* copyMe : sTgcReadOuts) {
590 const Identifier reId = copyMe->identify();
591 ATH_MSG_DEBUG("Translate readout element "<<m_idHelperSvc->toStringDetEl(reId)<<".");
592 GeoIntrusivePtr<GeoVFullPhysVol> physVol{cloneNswWedge(gctx, *copyMe, cacheObj)};
593
594 auto newRE = std::make_unique<MuonGM::sTgcReadoutElement>(physVol,
595 m_idHelperSvc->stationNameString(reId).substr(1),
596 copyMe->stationEta(),
597 copyMe->stationPhi(),
598 copyMe->multilayer(),
599 cacheObj.detMgr.get());
600
601 if (alignStore && alignStore->getBLine(reId)) {
602 newRE->setBLinePar(*alignStore->getBLine(reId));
603 }
604 for (unsigned int layer = 1; layer <= copyMe->numLayers(); ++layer) {
606 using ChannelDesign = MuonGM::MuonChannelDesign;
607 const IdentifierHash layerHash = MuonGMR4::sTgcReadoutElement::createHash(layer,channelType::Strip,0);
608
609 const MuonGMR4::StripLayer& stripLayer{copyMe->stripLayer(layerHash)};
610 newRE->m_Xlg[layer -1] = stripLayer.toOrigin() *
611 Amg::getRotateY3D(90._degree) *
612 Amg::getTranslateX3D( layer%2 ? - 0.01 : 0.01 );
613
614 const MuonGMR4::StripDesign& copyEtaDesign{stripLayer.design()};
615 ATH_MSG_VERBOSE("Layer: "<<layer<<" "<<copyEtaDesign);
617 ChannelDesign& etaDesign{newRE->m_etaDesign[layer-1]};
618 etaDesign.type = ChannelDesign::ChannelType::etaStrip;
619 etaDesign.detType = ChannelDesign::DetType::STGC;
620 if (copyEtaDesign.yCutout()) {
621 etaDesign.defineDiamond(copyEtaDesign.shortHalfHeight(),
622 copyEtaDesign.longHalfHeight(),
623 copyEtaDesign.halfWidth(),
624 copyEtaDesign.yCutout());
625 } else {
626 etaDesign.defineTrapezoid(copyEtaDesign.shortHalfHeight(),
627 copyEtaDesign.longHalfHeight(),
628 copyEtaDesign.halfWidth());
629
630 }
631 etaDesign.firstPitch = copyEtaDesign.firstStripPos().x() + 0.5*copyEtaDesign.stripPitch() + copyEtaDesign.halfWidth();
632 etaDesign.inputPitch = copyEtaDesign.stripPitch();
633 etaDesign.inputWidth = copyEtaDesign.stripWidth();
634 etaDesign.nch = copyEtaDesign.numStrips();
635 ATH_MSG_VERBOSE(m_idHelperSvc->toStringDetEl(copyMe->identify())<<", layer: "<<layer<<", eta-design: "<< copyEtaDesign);
636 etaDesign.setFirstPos(copyEtaDesign.firstStripPos().x() + 0.5*copyEtaDesign.stripPitch());
638
639 const MuonGMR4::WireGroupDesign& copyPhiDesign{copyMe->wireDesign(layerHash)};
640
641 ChannelDesign& phiDesign{newRE->m_phiDesign[layer-1]};
642 phiDesign.type = ChannelDesign::ChannelType::phiStrip;
643 phiDesign.detType = ChannelDesign::DetType::STGC;
644 if (copyPhiDesign.yCutout() == 0.) {
645 phiDesign.defineTrapezoid(copyPhiDesign.shortHalfHeight(),
646 copyPhiDesign.longHalfHeight(),
647 copyPhiDesign.halfWidth());
648 } else {
649 phiDesign.defineDiamond(copyPhiDesign.shortHalfHeight(),
650 copyPhiDesign.longHalfHeight(),
651 copyPhiDesign.halfWidth(),
652 copyPhiDesign.yCutout());
653 }
654 phiDesign.inputPitch = copyPhiDesign.stripPitch();
655 phiDesign.inputWidth = copyPhiDesign.stripWidth();
656 ATH_MSG_VERBOSE(m_idHelperSvc->toStringDetEl(copyMe->identify())<<", layer: "<<layer<<", phi-design: "<< copyPhiDesign);
657 phiDesign.setFirstPos(copyPhiDesign.firstStripPos().x()); // Position of 1st wire, accounts for staggering
658 phiDesign.firstPitch = copyPhiDesign.numWiresInGroup(1); // Number of Wires in 1st group, group staggering
659 phiDesign.groupWidth = copyPhiDesign.numWiresInGroup(2); // Number of Wires normal group
660 phiDesign.nGroups = copyPhiDesign.numStrips(); // Number of Wire Groups
661 phiDesign.wireCutout = copyPhiDesign.wireCutout(); // Size of "active" wire region for digits
662 phiDesign.nch = copyPhiDesign.nAllWires();
663 phiDesign.isConvertedFromPhaseII = true;
664
665 const MuonGMR4::PadDesign& copyPadDesign{copyMe->padDesign(layerHash)};
666 MuonGM::MuonPadDesign& padDesign{newRE->m_padDesign[layer-1]};
667 padDesign.Length = copyMe->chamberHeight();
668 padDesign.sWidth = copyMe->sChamberLength();
669 padDesign.lWidth = copyMe->lChamberLength();
670 padDesign.Size = 2.*copyPadDesign.halfWidth();
671 padDesign.ysFrame = copyMe->sFrameWidth();
672 padDesign.ylFrame = copyMe->lFrameWidth();
673 padDesign.thickness = copyMe->thickness();
675 if (copyPadDesign.yCutout()) {
676 padDesign.yCutout = copyPadDesign.halfWidth();
677 }
678 padDesign.setR(copyPadDesign.beamlineRadius());
679 padDesign.sPadWidth = 2.*copyPadDesign.shortHalfHeight();
680 padDesign.lPadWidth = 2.*copyPadDesign.longHalfHeight();
681 padDesign.nPadColumns = copyPadDesign.numPadPhi();
682 padDesign.firstPhiPos = copyPadDesign.firstPadPhiDiv();
683 padDesign.inputPhiPitch = copyPadDesign.anglePadPhi();
684 padDesign.PadPhiShift = copyPadDesign.padPhiShift();
685 padDesign.nPadH = copyPadDesign.numPadEta();
686 padDesign.padEtaMax = copyPadDesign.maxPadEta();
687 padDesign.firstRowPos = copyPadDesign.firstPadHeight();
688 padDesign.inputRowPitch = copyPadDesign.padHeight();
689 padDesign.sectorOpeningAngle = copyPadDesign.sectorAngle();
690 padDesign.isConvertedFromPhaseII = true;
691 padDesign.isLargeSector = !m_idHelperSvc->isSmallChamber(copyMe->identify());
692 }
693 newRE->fillCache();
694 ATH_CHECK(dumpAndCompare(gctx, *copyMe, *newRE));
695 cacheObj.detMgr->addsTgcReadoutElement(std::move(newRE));
696
697 }
698 return StatusCode::SUCCESS;
699}
double beamlineRadius() const
Returns the distance between the gasGap center and the beamline.
int numPadPhi() const
Returns the number of pads in the Phi direction in the given gasGap layer.
int numPadEta() const
Returns the number of pads in the eta direction in the given layer.
double sectorAngle() const
Function gives the angular width of the sector.
double padPhiShift() const
Returns the staggering shift of inner pad edges in the phi direction.
int maxPadEta() const
Returns the maximum number of pads that can be contained in a column of a pad. Used to match the pad ...
double firstPadHeight() const
Returns the height of the pads that are adjacent to the bottom edge of the trapezoid active area.
double anglePadPhi() const
Returns the angular pitch of the pads in the phi direction.
double padHeight() const
Returns the height of all the pads that are not adjacent to the bottom edge of the trapezoid active a...
double firstPadPhiDiv() const
Returns the angle of the first pad outer edge w.r.t. the gasGap center from the beamline.
double yCutout() const
Returns the cutout of the diamond.
double stripWidth() const
Width of a strip.
unsigned int numWiresInGroup(unsigned int groupNum) const
Returns the number of wires in a given group.
double wireCutout() const
Extract the wireCutout for a wireGroup layer.
unsigned int nAllWires() const
Returns the number of all wires.
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.
@ sTgc
Micromegas (NSW)
Amg::Transform3D getTranslateX3D(const double X)
: Returns a shift transformation along the x-axis
@ layer
Definition HitInfo.h:79
void setR(double R)
access to cache

◆ buildTgc()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::buildTgc ( const ActsTrk::GeometryContext & gctx,
ConstructionCache & cacheObj ) const
private

Converts all Tgc readout elements from the R4 format into the legacy Trk format.

Parameters
gctxCurrent geometry context carrying the current alignment
cacheObjMutable reference to the GeoModel constuction cache

Define the local gasGap positions

In the sector frame, the gasGap is oriented along the x-axis

Definition at line 405 of file ReadoutGeomCnvAlg.cxx.

405 {
406
407 std::vector<const MuonGMR4::TgcReadoutElement*> tgcReadouts{m_detMgr->getAllTgcReadoutElements()};
408 std::ranges::stable_sort(tgcReadouts,[](const MuonGMR4::TgcReadoutElement* a, const MuonGMR4::TgcReadoutElement* b){
409 return a->stationEta() > b->stationEta();
410 });
411 ATH_MSG_INFO("Copy "<<tgcReadouts.size()<<" Tgc readout elements to the legacy system");
412 if (tgcReadouts.empty()) return StatusCode::SUCCESS;
413 const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
414
415 using TgcReadoutParams = MuonGM::TgcReadoutParams;
416 std::map<std::string, std::shared_ptr<TgcReadoutParams>> readoutParMap{};
417
418 for (const MuonGMR4::TgcReadoutElement* copyMe: tgcReadouts) {
419 const Identifier reId = copyMe->identify();
420 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
421 MuonGM::MuonStation* station{nullptr};
422 ATH_CHECK(cloneReadoutVolume(gctx,reId, cacheObj, physVol, station));
423
424 auto newRE = std::make_unique<MuonGM::TgcReadoutElement>(physVol, m_idHelperSvc->stationNameString(reId),
425 cacheObj.detMgr.get());
426 newRE->setIdentifier(reId);
427 newRE->setParentMuonStation(station);
428 ATH_MSG_DEBUG("Readout element "<<m_idHelperSvc->toString(reId)<<", design: "<<copyMe->chamberDesign());
429 std::shared_ptr<TgcReadoutParams>& readOutPars = readoutParMap[std::format("{:}_{:}", copyMe->chamberDesign(),
430 copyMe->stationEta()> 0? 'A' : 'C')];
431 if (!readOutPars) {
432 using WiregangArray = TgcReadoutParams::WiregangArray;
433 using StripArray = TgcReadoutParams::StripArray;
434 using GasGapIntArray = TgcReadoutParams::GasGapIntArray;
435
436 std::array<WiregangArray, 3> wires{};
437 GasGapIntArray nWireGangs{}, nStrips{};
438 std::vector<StripArray> botMountings(copyMe->nGasGaps()),
439 topMountings(copyMe->nGasGaps());
440
441 double wirePitch{0.};
442 for (unsigned int gasGap =1; gasGap <= copyMe->nGasGaps(); ++gasGap) {
443 const IdentifierHash gangHash = copyMe->constructHash(0, gasGap, false);
444 const IdentifierHash stripHash = copyMe->constructHash(0, gasGap, true);
445 nWireGangs[gasGap -1] = copyMe->numWireGangs(gangHash);
446 nStrips[gasGap -1] = copyMe->numStrips(stripHash);
447 ATH_MSG_VERBOSE("Assigned wire gangs: "<<nWireGangs[gasGap-1]<<", strips: "<<nStrips[gasGap -1]
448 <<" for gas gap "<<gasGap);
449
450 if (nWireGangs[gasGap -1]) {
451 const MuonGMR4::WireGroupDesign& design{copyMe->wireGangLayout(gangHash)};
452 wirePitch = design.stripPitch();
453 WiregangArray& fillMe{wires[gasGap-1]};
454 for (int gang = 1; gang <= design.numStrips(); ++gang) {
455 fillMe[gang -1] = design.numWiresInGroup(gang);
456 }
457 ATH_MSG_VERBOSE("Gang layout: "<<fillMe);
458 }
459 if (nStrips[gasGap -1]) {
460 const MuonGMR4::RadialStripDesign& design{copyMe->stripLayout(stripHash)};
461 const int nCh = nStrips[gasGap -1];
462 for (int strip = 1; strip <= nCh; ++strip) {
463 botMountings[gasGap-1][strip-1] = - design.stripLeftBottom(strip).x();
464 topMountings[gasGap-1][strip-1] = - design.stripLeftTop(strip).x();
465 }
466 botMountings[gasGap-1][nCh] = - design.stripRightBottom(nCh).x();
467 topMountings[gasGap-1][nCh] = - design.stripRightTop(nCh).x();
468 ATH_MSG_VERBOSE("Strip layout\n bottom: "<<botMountings<<"\n top: "<<topMountings);
469 }
470 }
471 readOutPars = std::make_unique<TgcReadoutParams>(copyMe->chamberDesign(),
472 0, wirePitch,
473 idHelper.stationPhiMax(reId),
474 std::move(nWireGangs),
475 std::move(wires[0]),
476 std::move(wires[1]),
477 std::move(wires[2]),
478 0,
479 std::move(botMountings),
480 std::move(topMountings),
481 std::move(nStrips));
482 }
483
485 for (unsigned int gasGap = 1; gasGap <= copyMe->nGasGaps(); ++gasGap) {
486 const IdentifierHash layHash{copyMe->constructHash(0, gasGap, false)};
488 const Amg::Vector3D translation{amdbTransform(gctx, *copyMe).inverse() * copyMe->center(gctx, layHash)};
489 newRE->setPlaneZ(translation.x(), gasGap);
490 }
491 newRE->setRsize(copyMe->moduleHeight());
492 newRE->setSsize(copyMe->moduleWidthS());
493 newRE->setZsize(copyMe->moduleThickness());
494
495 newRE->setLongRsize(copyMe->moduleHeight());
496 newRE->setLongSsize(copyMe->moduleWidthL());
497 newRE->setLongZsize(copyMe->moduleThickness());
498
499 newRE->setReadOutParams(readOutPars);
500 newRE->fillCache();
501 ATH_CHECK(dumpAndCompare(gctx, *copyMe, *newRE));
502 cacheObj.detMgr->addTgcReadoutElement(std::move(newRE));
503
504 }
505 return StatusCode::SUCCESS;
506}
static Double_t a
Amg::Vector2D stripLeftTop(int stripNumber) const
: Returns the intersection of the left strip edge at the top panel's edge
Amg::Vector2D stripRightTop(int stripNumber) const
: Returns the intersecetion fo the right strip edge at the top panel's edge
Amg::Vector2D stripRightBottom(int stripNumber) const
: Returns the intersecton of the strip right edge at the bottom panel's edge
Amg::Vector2D stripLeftBottom(int stripNumber) const
: Returns the intersection of the left strip edge at the bottom panel's edge
static int stationPhiMax(bool endcap)
int nStrips(const MuonGM::TgcReadoutElement &readoutEle, int layer)
TgcReadoutParams::WiregangArray WiregangArray
TgcReadoutParams::GasGapIntArray GasGapIntArray
TgcReadoutParams::StripArray StripArray

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ checkIdCompability()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::checkIdCompability ( const MuonGMR4::MuonReadoutElement & refEle,
const MuonGM::MuonReadoutElement & testEle ) const
private

Checks whether the Identifier fields of both readout elements are identical.

Parameters
refEleR4 readout element taken as blueprint to build the Trk readout element.
testEleThe constructed Trk readout element that is to be checked

Definition at line 813 of file ReadoutGeomCnvAlg.cxx.

814 {
815
816 if (refEle.identify() != testEle.identify()) {
817 ATH_MSG_FATAL("Two different elements are compared "
818 <<m_idHelperSvc->toString(refEle.identify())<<" vs. "
819 <<m_idHelperSvc->toString(testEle.identify()));
820 return StatusCode::FAILURE;
821 }
822 if (refEle.identHash() != testEle.detectorElementHash()) {
823 ATH_MSG_FATAL("The hashes of the two detector elements "<<m_idHelperSvc->toString(refEle.identify())
824 <<" are completely different "<<refEle.identHash()<<" vs. "<<testEle.detectorElementHash());
825 return StatusCode::FAILURE;
826 }
827 return StatusCode::SUCCESS;
828}
#define ATH_MSG_FATAL(x)
IdentifierHash identHash() const
Returns the hash of the readout element which is identical to the detector element hash provided by t...
Identifier identify() const override final
Return the ATLAS identifier.
IdentifierHash detectorElementHash() const
Returns the IdentifierHash of the detector element.
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.

◆ cloneNswWedge()

GeoIntrusivePtr< GeoVFullPhysVol > MuonGMR4::ReadoutGeomCnvAlg::cloneNswWedge ( const ActsTrk::GeometryContext & gctx,
const MuonGMR4::MuonReadoutElement & nswRE,
ConstructionCache & cacheObj ) const
private

Clones the full phyical volume associated to the NSw readout element.

Parameters
gctxCurrent geometry context carrying the current alignment
nswREReadout element from which the full PhysVol to clone is retrieved
cacheObjMutable reference to the GeoModel constuction cache

Definition at line 509 of file ReadoutGeomCnvAlg.cxx.

511 {
512 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe.getMaterialGeom()};
513 cacheObj.translatedStations.insert(readOutVol->getParent());
514
515 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
516 GeoIntrusivePtr<GeoFullPhysVol> physVol{dynamic_pointer_cast<GeoFullPhysVol>(clonedVol)};
517 cacheObj.world->add(cacheObj.newIdTag());
518 cacheObj.world->add(cacheObj.makeTransform(amdbTransform(gctx, copyMe)));
519 cacheObj.world->add(physVol);
520 return physVol;
521}

◆ cloneReadoutVolume()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::cloneReadoutVolume ( const ActsTrk::GeometryContext & gctx,
const Identifier & stationId,
ConstructionCache & cacheObj,
GeoIntrusivePtr< GeoVFullPhysVol > & clonedPhysVol,
MuonGM::MuonStation *& station ) const
private

Clones the fullPhysical volume of the readoutElement and embeds it into the associated station.

If creations of the needed station fails, failure is returned. The references to the clonedPhysVol & to the station are set if the procedure was successful.

Parameters
gctxCurrent geometry context carrying the current alignment
stationIdIdentifier of the station encoding stName, stEta, stPhi
cacheObjMutable reference to the GeoModel constuction cache
clonedPhysVolMutable reference into which the cloned physical volume is attached
stationMutable reference to the muon station pointer which is filled during the cloning

This is a hack to include the BIL Rpcs into the translation. Recall that the BI-RPCs break the station paradigm Hence, in the new description they have their own alignable transform. However, the legacy geometry tries to sort them into the corresponding Mdt station with the same stName, stEta, stPhi. So quite a lot of gymnastics is now needed to place them accordingly into that frame. getX(Mdt) * delta(Mdt) * X = getX(Rpc) * delta(Rpc) X = [getX(Mdt) * delta(Mdt)]^{-1} * getX(Rpc) * delta(Rpc) The second term is the transform of the transform of the Muon station. The second one needs to be rewritten Y = getX(Rpc) * delta(Rpc) * getX(alignNode -> readoutFrame) X = Y * getX(alignNode -> readoutFrame)^{-1}

Clone the detector element with all of its subvolumes

Definition at line 271 of file ReadoutGeomCnvAlg.cxx.

275 {
276
277 ATH_CHECK(buildStation(gctx, reId, cacheObj));
278 const std::string stName{m_idHelperSvc->stationNameString(reId)};
279 station = cacheObj.detMgr->getMuonStation(stName,
280 m_idHelperSvc->stationEta(reId),
281 m_idHelperSvc->stationPhi(reId));
282
283 PVLink copiedStationVol{station->getPhysVol()};
284 const MuonGMR4::MuonReadoutElement* copyMe = m_detMgr->getReadoutElement(reId);
285 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
286 copiedStationVol->add(cacheObj.newIdTag());
297 const Amg::Transform3D alignNodeToRE{copyMe->alignableTransform()->getDefTransform().inverse() *
298 readOutVol->getParent()->getX() * readOutVol->getX()};
299 const Amg::Transform3D alignedNode{amdbTransform(gctx, *copyMe) * alignNodeToRE.inverse()};
300
301 const Amg::Transform3D stationTrf{copiedStationVol->getX().inverse() * alignedNode};
302
303 copiedStationVol->add(cacheObj.makeTransform(stationTrf*alignNodeToRE));
305 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
306 physVol = dynamic_pointer_cast<GeoVFullPhysVol>(clonedVol);
307 copiedStationVol->add(physVol);
308 return StatusCode::SUCCESS;
309}
StatusCode buildStation(const ActsTrk::GeometryContext &gctx, const Identifier &stationId, ConstructionCache &cacheObj) const
builds a station object from readout element.
PVConstLink getPhysVol() const

◆ 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.

◆ dumpAndCompare() [1/5]

StatusCode MuonGMR4::ReadoutGeomCnvAlg::dumpAndCompare ( const ActsTrk::GeometryContext & gctx,
const MuonGMR4::MdtReadoutElement & refEle,
const MuonGM::MdtReadoutElement & testEle ) const
private

Compares the R4 readout element with the constructed Trk readout element.

Transforms and position of the sensors are required to be identical in both descriptions

Parameters
gctxCurrent geometry context carrying the current alignment
refEleR4 readout element taken as blueprint to build the Trk readout element.
testEleThe constructed Trk readout element that is to be checked

Definition at line 878 of file ReadoutGeomCnvAlg.cxx.

880 {
881
882 if (!m_checkGeo) {
883 return StatusCode::SUCCESS;
884 }
885 ATH_CHECK(checkIdCompability(refEle, testEle));
886
887 ATH_MSG_VERBOSE("Detector element "<<m_idHelperSvc->toString(refEle.identify())
888 <<std::endl<<GeoTrf::toString(amdbTransform(gctx, refEle))
889 <<std::endl<<GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform())
890 <<std::endl<<"r-size: "<<testEle.getRsize()<<"/"<<testEle.getLongRsize()
891 <<" s-size: "<<testEle.getSsize()<<"/"<<testEle.getLongSsize()
892 <<" z-size: "<<testEle.getZsize()<<"/"<<testEle.getLongZsize());
893 for (unsigned int lay = 1; lay <= refEle.numLayers(); ++lay){
894 for (unsigned int tube = 1; tube <= refEle.numTubesInLay(); ++tube) {
895 const IdentifierHash tubeHash {refEle.measurementHash(lay,tube)};
896 if (!refEle.isValid(tubeHash)) {
897 ATH_MSG_VERBOSE("SKip layer / tube "<<lay <<","<<tube);
898 continue;
899 }
900 const Amg::Transform3D globToLocal = refEle.globalToLocalTransform(gctx, tubeHash);
901
902 const Amg::Vector3D refPos = refEle.globalTubePos(gctx, tubeHash);
903 const Amg::Vector3D tubePos = testEle.tubePos(lay, tube);
904
905
906 if ( (refPos - tubePos).mag() > Gaudi::Units::micrometer &&
907 (globToLocal*refPos - globToLocal * tubePos).perp() > Gaudi::Units::micrometer) {
908 ATH_MSG_ERROR("Tube positions differ for "<<m_idHelperSvc->toString(refEle.measurementId(tubeHash))
909 <<" reference: "<<GeoTrf::toString(globToLocal*refPos)<<" vs. test: "
910 <<GeoTrf::toString(globToLocal*tubePos) <<" delta: "<<(refPos - tubePos).mag()
911 <<" Transforms "<<std::endl
912 <<" **** "<< GeoTrf::toString(globToLocal.inverse())<<std::endl
913 <<" **** "<< GeoTrf::toString(testEle.transform(lay, tube)));
914 return StatusCode::FAILURE;
915 }
916 ATH_MSG_VERBOSE("Tube positions layer: "<<lay<<", tube: "<<tube
917 <<std::endl<<"reference: "<<GeoTrf::toString(refPos)
918 <<std::endl<<"test: "<<GeoTrf::toString(tubePos)
919 <<std::endl<<testEle.tubeLength(lay, tube)<<"/"<<testEle.getActiveTubeLength(lay, tube)<<"/"
920 <<testEle.getWireLength(lay,tube)<<" vs. "<<refEle.tubeLength(tubeHash)
921 <<"/"<<refEle.activeTubeLength(tubeHash)<<"/"<<refEle.wireLength(tubeHash)
922 <<"/"<<refEle.uncutTubeLength(tubeHash));
923 if (std::abs(testEle.getTubeLengthForCaching(lay,tube) - refEle.uncutTubeLength(tubeHash)) >
924 std::numeric_limits<float>::epsilon() ) {
925 ATH_MSG_FATAL("Different tube length's detected for "<<m_idHelperSvc->toStringDetEl(refEle.identify())
926 << " layer: "<<lay<<", tube: "<<tube<<" -- "<<testEle.getTubeLengthForCaching(lay,tube)<<" (new) vs. "
927 <<refEle.uncutTubeLength(tubeHash)<<" (ref)");
928 return StatusCode::FAILURE;
929 }
930 }
931 }
932
933 return StatusCode::SUCCESS;
934}
Scalar perp() const
perp method - perpendicular length
Scalar mag() const
mag method
#define ATH_MSG_ERROR(x)
unsigned numLayers() const
Returns how many tube layers are inside the multi layer [1;4].
bool isValid(const IdentifierHash &measHash) const
Checks whether the passed meaurement hash corresponds to a valid tube described by the readout elemen...
Amg::Vector3D globalTubePos(const ActsTrk::GeometryContext &ctx, const Identifier &measId) const
Returns the position of the tube mid point in the ATLAS coordinate frame.
double uncutTubeLength(const IdentifierHash &tubeHash) const
Returns the uncut tube length.
unsigned numTubesInLay() const
Returns the number of tubes in a layer.
static IdentifierHash measurementHash(unsigned layerNumber, unsigned tubeNumber)
Constructs a Measurement hash from layer && tube number.
Identifier measurementId(const IdentifierHash &measHash) const override final
Back conversion of the measurement hash towards a full identifier Tube & layer number are extracted f...
Amg::Transform3D globalToLocalTransform(const ActsTrk::GeometryContext &ctx) const
Returns the transformation from the global ATLAS coordinate system into the local coordinate system o...
StatusCode checkIdCompability(const MuonGMR4::MuonReadoutElement &refEle, const MuonGM::MuonReadoutElement &testEle) const
Checks whether the Identifier fields of both readout elements are identical.
Gaudi::Property< bool > m_checkGeo
double getTubeLengthForCaching(const int tubeLayer, const int tube) const
double getActiveTubeLength(const int tubeLayer, const int tube) const
Amg::Vector3D tubePos(const Identifier &id) const
Returns the global position of the given tube.
virtual const Amg::Transform3D & transform(const Identifier &id) const override final
Return local to global transform associated with this identifier.
double tubeLength(const int tubeLayer, const int tube) const
double getWireLength(const int tubeLayer, const int tube) const

◆ dumpAndCompare() [2/5]

StatusCode MuonGMR4::ReadoutGeomCnvAlg::dumpAndCompare ( const ActsTrk::GeometryContext & gctx,
const MuonGMR4::MmReadoutElement & refEle,
const MuonGM::MMReadoutElement & testEle ) const
private

Compares the R4 readout element with the constructed Trk readout element.

Transforms and position of the sensors are required to be identical in both descriptions

Parameters
gctxCurrent geometry context carrying the current alignment
refEleR4 readout element taken as blueprint to build the Trk readout element.
testEleThe constructed Trk readout element that is to be checked

Definition at line 830 of file ReadoutGeomCnvAlg.cxx.

832 {
833
834 if (!m_checkGeo) {
835 return StatusCode::SUCCESS;
836 }
837 ATH_CHECK(checkIdCompability(refEle, testEle));
838
839 ATH_MSG_VERBOSE("Compare basic readout transforms"<<std::endl
840 <<GeoTrf::toString(testEle.absTransform(),true)<<std::endl
841 <<GeoTrf::toString(amdbTransform(gctx, refEle), true));
842 const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
843 for (unsigned int gasGap = 1; gasGap <= refEle.nGasGaps(); ++ gasGap) {
844 const Identifier gapId = idHelper.channelID(refEle.identify(), refEle.multilayer(), gasGap, 1);
845
846 const Amg::Transform3D& refTrf{refEle.localToGlobalTransform(gctx, gapId)};
847 const Amg::Transform3D& testTrf{testEle.transform(gapId)};
848 if (!Amg::isIdentity(refTrf.inverse()*testTrf)) {
849 ATH_MSG_FATAL("The layer "<<m_idHelperSvc->toStringGasGap(gapId)<<" does not transform equally"
850 <<GeoTrf::toString(refTrf, true) <<" vs. "<<GeoTrf::toString(testTrf, true));
851 return StatusCode::FAILURE;
852 }
853 const MuonGMR4::StripDesign& stripDesign{refEle.stripLayer(gapId).design()};
854
855 for (int strip = stripDesign.firstStripNumber(); strip <= stripDesign.numStrips(); ++strip) {
856 const Identifier stripId = idHelper.channelID(refEle.identify(), refEle.multilayer(), gasGap, strip);
857 const Amg::Vector3D refStripPos{refEle.stripPosition(gctx, stripId)};
858 const Amg::Vector3D refStripDir{refEle.localToGlobalTransform(gctx, refEle.layerHash(stripId)).linear() * Amg::Vector3D::UnitX()};
859
860 Amg::Vector3D testStripPos{Amg::Vector3D::Zero()};
861 if (!testEle.stripGlobalPosition(stripId, testStripPos)) {
862 ATH_MSG_FATAL("Failed to retrieve strip position "<<m_idHelperSvc->toString(stripId));
863 return StatusCode::FAILURE;
864 }
865 const double dist = refStripDir.dot(refStripPos - testStripPos);
866 if (std::abs(dist) > 10. * Gaudi::Units::micrometer) {
867 ATH_MSG_FATAL("The strip "<<Amg::toString(testStripPos)<<" is not describing the same strip as "
868 <<Amg::toString(refStripPos)<<". Channel "<<m_idHelperSvc->toString(stripId)
869 <<" distance: "<<dist<<" "<<(dist / testEle.m_etaDesign[gasGap -1].inputWidth));
870 return StatusCode::FAILURE;
871 }
872 ATH_MSG_VERBOSE("Channel postion "<<m_idHelperSvc->toString(stripId)<<" match between legacy & new");
873 }
874 }
875 return StatusCode::SUCCESS;
876}
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channel) const
const StripLayer & stripLayer(const Identifier &measId) const
unsigned int nGasGaps() const
Returns the number of gas gaps.
int multilayer() const
Returns the multi layer of the element [1-2].
IdentifierHash layerHash(const Identifier &measId) const override final
The layer hash removes the bits from the IdentifierHash corresponding to the measurement's channel nu...
Amg::Vector3D stripPosition(const ActsTrk::GeometryContext &ctx, const Identifier &measId) const
Returns the position of the strip center.
const Amg::Transform3D & localToGlobalTransform(const ActsTrk::GeometryContext &ctx) const
Returns the transformation from the local coordinate system of the readout element into the global AT...
bool stripGlobalPosition(const Identifier &id, Amg::Vector3D &gpos) const
std::array< MuonChannelDesign, 4 > m_etaDesign
virtual const Amg::Transform3D & transform() const override
Return local to global transform.
bool isIdentity(const Amg::Transform3D &trans)
Checks whether the transformation is the Identity transformation.

◆ dumpAndCompare() [3/5]

StatusCode MuonGMR4::ReadoutGeomCnvAlg::dumpAndCompare ( const ActsTrk::GeometryContext & gctx,
const MuonGMR4::RpcReadoutElement & refEle,
const MuonGM::RpcReadoutElement & testEle ) const
private

Compares the R4 readout element with the constructed Trk readout element.

Transforms and position of the sensors are required to be identical in both descriptions

Parameters
gctxCurrent geometry context carrying the current alignment
refEleR4 readout element taken as blueprint to build the Trk readout element.
testEleThe constructed Trk readout element that is to be checked

Definition at line 935 of file ReadoutGeomCnvAlg.cxx.

937 {
938
939 if (!m_checkGeo) {
940 return StatusCode::SUCCESS;
941 }
942 ATH_CHECK(checkIdCompability(refEle, testEle));
943
944 ATH_MSG_VERBOSE("Compare basic readout transforms"<<std::endl
945 <<" ref: "<<GeoTrf::toString(amdbTransform(gctx, refEle), true)<<std::endl
946 <<" test: "<<GeoTrf::toString(testEle.absTransform(),true)<<std::endl
947 <<"delta: "<<GeoTrf::toString(testEle.absTransform().inverse()*amdbTransform(gctx, refEle), true ));
948 const RpcIdHelper& idHelper{m_idHelperSvc->rpcIdHelper()};
949 for (unsigned int gasGap = 1; gasGap <= refEle.nGasGaps(); ++gasGap) {
950 for (int doubPhi = refEle.doubletPhi(); doubPhi <= refEle.doubletPhiMax(); ++doubPhi) {
951 for (bool measPhi : {false, true}) {
952 if (measPhi && !refEle.nPhiStrips()) continue;
953 for (int strip = 1; strip <= testEle.Nstrips(measPhi); ++strip) {
954 const Identifier stripId = idHelper.channelID(refEle.identify(),
955 refEle.doubletZ(),
956 doubPhi, gasGap, measPhi, strip);
957
958 const Amg::Transform3D refTrans{refEle.localToGlobalTransform(gctx, stripId) *
959 (measPhi ? Amg::getRotateZ3D(90_degree) :
960 Amg::Transform3D::Identity())};
961 const Amg::Transform3D& testTrans{testEle.transform(stripId)};
962 if (strip == 1 && !Amg::isIdentity(refTrans.inverse()*testTrans)) {
963 ATH_MSG_ERROR("Transformation for "<<m_idHelperSvc->toString(stripId)<<" - "<<refEle.identHash()<<std::endl
964 <<" *** ref: "<<GeoTrf::toString(refTrans)<<std::endl
965 <<" *** test: "<<GeoTrf::toString(testTrans)<<std::endl
966 <<" -> delta: "<<GeoTrf::toString(refTrans.inverse()*testTrans));
967 return StatusCode::FAILURE;
968 }
969
970 const Amg::Vector3D refStripPos = refEle.stripPosition(gctx, stripId);
971 const Amg::Vector3D testStripPos = testEle.stripPos(stripId);
972 // The threshold here used to be epsilon for a float.
973 // But this was then giving a failure in aarch64,
974 // with a difference of almost exactly 1e-4.
975 // It turned out that that was coming from GeoDeDuplicator,
976 // where to consider two transforms equivalent,
977 // the translations must match to 1e-4. But if the
978 // difference is almost exactly 1e-4, then small FP
979 // differences can be magnified to just about 1e-4.
980 if ((refStripPos - testStripPos).mag() > 2e-4){
981 ATH_MSG_ERROR("Mismatch in strip positions "<<m_idHelperSvc->toString(stripId)
982 <<" ref: "<<Amg::toString(refStripPos)<<" test: "<<Amg::toString(testStripPos)
983 <<" local coordinates -- ref: "<<Amg::toString(refTrans.inverse()*refStripPos)
984 <<" test: "<<Amg::toString(refTrans.inverse()*testStripPos));
985 return StatusCode::FAILURE;
986 }
987 ATH_MSG_VERBOSE("Agreement between new and old geometry for channel "<<m_idHelperSvc->toString(stripId)
988 <<" strip position "<<Amg::toString(refStripPos)
989 <<", local: "<<Amg::toString(refTrans.inverse()*refStripPos));
990 }
991 }
992 }
993 }
994 return StatusCode::SUCCESS;
995}
Eigen::Affine3d Transform3D
unsigned nPhiStrips() const
Number of strips measuring the phi coordinate.
int doubletZ() const
Returns the doublet Z field of the MuonReadoutElement identifier.
int doubletPhi() const
Returns the doublet Phi field of the MuonReadoutElement identifier.
int doubletPhiMax() const
Returns the maximum phi panel.
Amg::Vector3D stripPosition(const ActsTrk::GeometryContext &ctx, const Identifier &measId) const
Returns the position of the strip center.
unsigned nGasGaps() const
Returns the number of gasgaps described by this ReadOutElement (usally 2 or 3)
int Nstrips(bool measphi) const
returns the number of strips for the phi or eta plane

◆ dumpAndCompare() [4/5]

StatusCode MuonGMR4::ReadoutGeomCnvAlg::dumpAndCompare ( const ActsTrk::GeometryContext & gctx,
const MuonGMR4::sTgcReadoutElement & refEle,
const MuonGM::sTgcReadoutElement & testEle ) const
private

Compares the R4 readout element with the constructed Trk readout element.

Transforms and position of the sensors are required to be identical in both descriptions

Parameters
gctxCurrent geometry context carrying the current alignment
refEleR4 readout element taken as blueprint to build the Trk readout element.
testEleThe constructed Trk readout element that is to be checked

wireGroup center is defined to be half a wire pitch off in R4 compared to R3 convention

Definition at line 1073 of file ReadoutGeomCnvAlg.cxx.

1075 {
1076 if (!m_checkGeo) {
1077 return StatusCode::SUCCESS;
1078 }
1079 ATH_CHECK(checkIdCompability(refEle, testEle));
1080
1081 ATH_MSG_VERBOSE("Compare basic readout transforms"<<std::endl
1082 <<GeoTrf::toString(testEle.absTransform(),true)<<std::endl
1083 <<GeoTrf::toString(amdbTransform(gctx, refEle), true));
1084 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
1085 for (unsigned int gasGap = 1; gasGap <= refEle.numLayers(); ++gasGap) {
1089 const IdentifierHash layHash = refEle.createHash(gasGap, chType, 1);
1090 const unsigned int numChannel = refEle.numChannels(layHash);
1091 constexpr unsigned firstCh = 1;
1092 for (unsigned int channel = firstCh; channel < numChannel ; ++channel) {
1093 Identifier chID{};
1094 bool isValid = false;
1096 const int etaIndex = refEle.padDesign(layHash).padNumber(channel).first;
1097 const int phiIndex = refEle.padDesign(layHash).padNumber(channel).second;
1098 chID = idHelper.padID(refEle.identify(),
1099 refEle.multilayer(),
1100 gasGap, chType, etaIndex, phiIndex, isValid);
1101 } else {
1102 chID = idHelper.channelID(refEle.identify(),
1103 refEle.multilayer(),
1104 gasGap, chType, channel, isValid);
1105 }
1106
1107 if(!isValid) {
1108 ATH_MSG_WARNING("Invalid Identifier detected: " << m_idHelperSvc->toString(chID));
1109 return StatusCode::FAILURE;
1110 }
1111 const IdentifierHash measHash = refEle.measurementHash(chID);
1112 Amg::Transform3D refTrans{refEle.localToGlobalTransform(gctx, refEle.layerHash(measHash))*
1114 const Amg::Transform3D& testTrans{testEle.transform(chID)};
1115 if (channel == firstCh && (!Amg::doesNotDeform(testTrans.inverse()*refTrans)
1116 || (testTrans.inverse()*refTrans).translation().perp() >
1117 std::numeric_limits<float>::epsilon() ) ) {
1118 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - Transformation for "
1119 <<m_idHelperSvc->toString(chID)<<std::endl
1120 <<" *** ref: "<<GeoTrf::toString(refTrans, true)<<std::endl
1121 <<" *** test: "<<GeoTrf::toString(testTrans, true));
1122 return StatusCode::FAILURE;
1123 }
1124 const Amg::Vector3D refChannelPos = refEle.globalChannelPosition(gctx, measHash);
1125
1127 const Amg::Transform3D& testPadTrans{testEle.transform(chID)};
1128 Amg::Vector3D testChannelPos(Amg::Vector3D::Zero());
1129 testEle.stripGlobalPosition(chID, testChannelPos);
1130
1131 const std::array<Amg::Vector3D,4> refPadCorners = refEle.globalPadCorners(gctx, measHash);
1132 std::array<Amg::Vector3D,4> testPadCorners{make_array<Amg::Vector3D, 4>(Amg::Vector3D::Zero())};
1133 testEle.padGlobalCorners(chID, testPadCorners);
1134 for (unsigned int cornerIdx = 0; cornerIdx < refPadCorners.size(); ++cornerIdx) {
1135 const double padCornerDiff = (refPadCorners[cornerIdx] - testPadCorners[cornerIdx]).mag();
1136 if (padCornerDiff - 25. > 1. * Gaudi::Units::micrometer){
1137 ATH_MSG_ERROR("Mismatch in pad Corner " << cornerIdx << ": " <<m_idHelperSvc->toString(chID)
1138 <<" ref: "<<Amg::toString(refPadCorners[cornerIdx])<<" test: "<<Amg::toString(testPadCorners[cornerIdx])
1139 <<" difference: " << padCornerDiff
1140 <<" local coordinates -- ref: "<<Amg::toString(refTrans.inverse()*refPadCorners[cornerIdx])
1141 <<" test: "<<Amg::toString(testPadTrans.inverse()*testPadCorners[cornerIdx]));
1142 return StatusCode::FAILURE;
1143 }
1144 }
1145 const double padChannelDiff = (refChannelPos - testChannelPos).mag();
1146 if (padChannelDiff - 25. > 1. * Gaudi::Units::micrometer){
1147 ATH_MSG_ERROR("Mismatch in pad positions "<<m_idHelperSvc->toString(chID)
1148 <<" ref: "<<Amg::toString(refChannelPos)<<" test: "<<Amg::toString(testChannelPos)
1149 <<" difference: " << padChannelDiff
1150 <<" local coordinates -- ref: "<<Amg::toString(refTrans.inverse()*refChannelPos)
1151 <<" test: "<<Amg::toString(testPadTrans.inverse()*testChannelPos));
1152 return StatusCode::FAILURE;
1153 }
1154 ATH_MSG_VERBOSE("Agreement between new and old geometry for channel "<<m_idHelperSvc->toString(chID)
1155 <<" channel position "<<Amg::toString(refChannelPos));
1156 }
1158 Amg::Vector3D testChannelPos{Amg::Vector3D::Zero()};
1159 testEle.stripGlobalPosition(chID, testChannelPos);
1160 if ((refChannelPos - testChannelPos).mag() > 1. * Gaudi::Units::micrometer){
1161 ATH_MSG_ERROR("Mismatch in strip positions "<<m_idHelperSvc->toString(chID)
1162 <<" ref: "<<Amg::toString(refChannelPos)<<" test: "<<Amg::toString(testChannelPos)
1163 <<" local coordinates -- ref: "<<Amg::toString(testTrans.inverse()*refChannelPos)
1164 <<" test: "<<Amg::toString(testTrans.inverse()*testChannelPos));
1165 return StatusCode::FAILURE;
1166 }
1167 ATH_MSG_VERBOSE("Agreement between new and old geometry for channel "<<m_idHelperSvc->toString(chID)
1168 <<" channel position "<<Amg::toString(refChannelPos));
1169 } else { // wire
1170 Amg::Vector3D testChannelPos{Amg::Vector3D::Zero()};
1171 testEle.stripGlobalPosition(chID, testChannelPos);
1172 Amg::Vector3D localRefPos {testTrans.inverse()*refChannelPos};
1173 Amg::Vector3D localTestPos{testTrans.inverse()*testChannelPos};
1175 if((std::abs(localRefPos.x() -localTestPos.x()) > 1.* Gaudi::Units::micrometer)
1176 || (std::abs(refChannelPos.z() -testChannelPos.z()) > 15.* Gaudi::Units::micrometer)){
1177 ATH_MSG_ERROR("Mismatch in wire positions "<<m_idHelperSvc->toString(chID)
1178 <<" ref: "<<Amg::toString(refChannelPos)<<" test: "<<Amg::toString(testChannelPos)
1179 <<" local coordinates -- ref: "<<Amg::toString(testTrans.inverse()*refChannelPos)
1180 <<" test: "<<Amg::toString(testTrans.inverse()*testChannelPos)
1181 <<"delta X: "<<std::abs(localRefPos.x() -localTestPos.x())
1182 <<", delta Z: "<<std::abs(localRefPos.z() -localTestPos.z()));
1183 return StatusCode::FAILURE;
1184 }
1185 }
1186 }
1187 }
1188 }
1189 return StatusCode::SUCCESS;
1190}
constexpr std::array< T, N > make_array(const T &def_val)
Helper function to initialize in-place arrays with non-zero values.
Definition ArrayHelper.h:10
#define ATH_MSG_WARNING(x)
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition AtlasPID.h:878
std::pair< int, int > padNumber(const int SeqChannel) const
Returns the pad (eta,phi) for a given pad number in sequence (1,2,3,...18,19,20......
unsigned numChannels(const IdentifierHash &measHash) const
Returns the number of strips / wires / pads in a given gasGap.
IdentifierHash measurementHash(const Identifier &measId) const override final
Constructs the identifier hash from the full measurement Identifier.
const PadDesign & padDesign(const IdentifierHash &measHash) const
Retrieves the readoutElement Layer given the Identifier/Hash.
int multilayer() const
Returns the multilayer of the sTgcReadoutElement.
globalCornerArray globalPadCorners(const ActsTrk::GeometryContext &ctx, const IdentifierHash &measHash) const
unsigned numLayers() const
Returns the number of gas gap layers.
IdentifierHash layerHash(const Identifier &measId) const override final
Transforms the Identifier into a layer hash.
Amg::Vector3D globalChannelPosition(const ActsTrk::GeometryContext &ctx, const IdentifierHash &measHash) const
Returns the global pad/strip/wireGroup position.
bool stripGlobalPosition(const Identifier &id, Amg::Vector3D &gpos) const
bool padGlobalCorners(const Identifier &id, std::array< Amg::Vector3D, 4 > &gcorners) const
pad global corners
Identifier padID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int padEta, int padPhi) const
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const
bool doesNotDeform(const Amg::Transform3D &trans)
Checks whether the linear part of the transformation rotates or stetches any of the basis vectors.
unsigned int phiIndex(float phi, float binsize)
calculate phi index for a given phi
Definition EtaPhiLUT.cxx:23

◆ dumpAndCompare() [5/5]

StatusCode MuonGMR4::ReadoutGeomCnvAlg::dumpAndCompare ( const ActsTrk::GeometryContext & gctx,
const MuonGMR4::TgcReadoutElement & refEle,
const MuonGM::TgcReadoutElement & testEle ) const
private

Compares the R4 readout element with the constructed Trk readout element.

Transforms and position of the sensors are required to be identical in both descriptions

Parameters
gctxCurrent geometry context carrying the current alignment
refEleR4 readout element taken as blueprint to build the Trk readout element.
testEleThe constructed Trk readout element that is to be checked

Definition at line 996 of file ReadoutGeomCnvAlg.cxx.

998 {
999
1000 if (!m_checkGeo) {
1001 return StatusCode::SUCCESS;
1002 }
1003 ATH_CHECK(checkIdCompability(refEle, testEle));
1004
1005 const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
1006
1007 ATH_MSG_VERBOSE("Detector element "<<m_idHelperSvc->toString(refEle.identify())
1008 <<std::endl<<GeoTrf::toString(amdbTransform(gctx, refEle), true)
1009 <<std::endl<<GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform(), true)
1010 <<std::endl<<"r-size: "<<testEle.getRsize()<<"/"<<testEle.getLongRsize()
1011 <<" s-size: "<<testEle.getSsize()<<"/"<<testEle.getLongSsize()
1012 <<" z-size: "<<testEle.getZsize()<<"/"<<testEle.getLongZsize());
1013
1014 for (unsigned int gasGap = 1; gasGap <= refEle.nGasGaps(); ++gasGap) {
1015 for (bool isStrip : {false, true}) {
1016 const IdentifierHash layHash = refEle.constructHash(0, gasGap, isStrip);
1017
1018 const Identifier layId = idHelper.channelID(refEle.identify(), gasGap, isStrip, 1);
1019 ATH_MSG_VERBOSE("Test layer "<<m_idHelperSvc->toString(layId)<<", nCh: "<<refEle.numChannels(layHash)<<", layHash: "<<layHash);
1020 if (!refEle.numChannels(layHash)) continue;
1021 const Amg::Transform3D refLayerTrf = refEle.localToGlobalTransform(gctx, refEle.constructHash(0, gasGap, false)) *
1022 (!isStrip ? Amg::Transform3D::Identity()
1023 : Amg::getRotateZ3D(-90._degree));
1024 const Amg::Transform3D& testLayerTrf = testEle.transform(layId);
1025 if (!Amg::isIdentity(refLayerTrf.inverse()* testLayerTrf)) {
1026 ATH_MSG_FATAL("The transformations in "<<m_idHelperSvc->toString(layId)
1027 <<std::endl<<"ref : "<<GeoTrf::toString(refLayerTrf,true)
1028 <<std::endl<<"test: "<<GeoTrf::toString(testLayerTrf,true)
1029 <<" are not identical. ");
1030 return StatusCode::FAILURE;
1031 }
1032 ATH_MSG_VERBOSE("Transformations in "<<m_idHelperSvc->toString(layId)
1033 <<std::endl<<"ref : "<<GeoTrf::toString(refLayerTrf,true)
1034 <<std::endl<<"test: "<<GeoTrf::toString(testLayerTrf,true));
1035
1036 for (unsigned int ch = 1; ch <= refEle.numChannels(layHash); ++ch) {
1037 const IdentifierHash measHash = refEle.constructHash(ch, gasGap, isStrip);
1038 const Identifier measId = refEle.measurementId(measHash);
1039 const Amg::Vector3D refChannel = refEle.channelPosition(gctx, measHash);
1040 const Amg::Vector3D testChannel = testEle.channelPos(measId);
1041 if ((refChannel - testChannel).mag() < std::numeric_limits<float>::epsilon()){
1042 continue;
1043 }
1044 std::stringstream msg{};
1045 msg<<"The channel "<<m_idHelperSvc->toString(measId)
1046 << " is not at the same position "<<Amg::toString(refChannel)
1047 <<" vs. "<<Amg::toString(testChannel)<<". Difference: "
1048 <<(refChannel - testChannel).mag();
1049 if (!isStrip) {
1050 msg<<std::endl<<"*** Test *** - wirePitch: "<<testEle.wirePitch()
1051 <<", tot wires "<<testEle.nWires(gasGap)
1052 <<", wires to reach "<<testEle.nPitchesToGang(gasGap, ch)
1053 <<", wires in gang "<<testEle.nWires(gasGap, ch);
1054 const MuonGMR4::WireGroupDesign& design{refEle.wireGangLayout(gasGap)};
1055 msg<<std::endl<<"*** Ref *** - wirePitch: "<<design.stripPitch()
1056 <<", tot wires "<<testEle.nWires(gasGap)
1057 <<", wires to reach "<<design.numPitchesToGroup(ch)
1058 <<", wires in gang "<<design.numWiresInGroup(ch);
1059 } else {
1060 const Amg::Vector3D locRefPos{refLayerTrf.inverse() * refChannel};
1061 const Amg::Vector3D locTestPos{refLayerTrf.inverse()* testChannel};
1062 msg<<std::endl<<"*** Ref **** - "<<Amg::toString(locRefPos)<<std::endl;
1063 msg<<std::endl<<"*** Test **** - "<<Amg::toString(locTestPos)<<std::endl;
1064 }
1065 ATH_MSG_FATAL(msg.str());
1066 return StatusCode::FAILURE;
1067 }
1068
1069 }
1070 }
1071 return StatusCode::SUCCESS;
1072}
Amg::Vector3D channelPosition(const ActsTrk::GeometryContext &ctx, const Identifier &measId) const
Returns the center of the measurement channel eta measurement: wire gang center phi measurement: stri...
Identifier measurementId(const IdentifierHash &measHash) const override final
Back conversion of the measurement hash to a full Athena Identifier The behaviour is undefined if a l...
static IdentifierHash constructHash(unsigned measCh, unsigned gasGap, const bool isStrip)
Constructs the Hash out of the Identifier fields (channel, gasGap, isStrip)
const WireGroupDesign & wireGangLayout(const IdentifierHash &layHash) const
Returns access to the wire group design of the given gasGap [1-3] If the gap does not have a wires an...
unsigned numChannels(const IdentifierHash &measHash) const
Returns the number of readout channels.
unsigned nGasGaps() const
Returns the number of gasgaps described by this ReadOutElement (usally 2 or 3)
unsigned int numPitchesToGroup(unsigned int groupNum) const
Returns the number of wire pitches to reach the given group.
Amg::Vector3D channelPos(const Identifier &id) const
Returns the position of the active channel (wireGang or strip)
double nPitchesToGang(int gasGap, int gang) const
Returns the number of wire pitches that have to be travelled to reach gang i.
int nWires(int gasGap) const
Returns the total number of wires in a given gas gap.
double wirePitch() const
Returns the pitch of the wires.
Identifier channelID(int stationName, int stationEta, int stationPhi, int gasGap, int isStrip, int channel) const

◆ 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::ReadoutGeomCnvAlg::execute ( const EventContext & ctx) const
override

Prepare the Geometry context

Check that for every detector technology there's an DetectorAlignStore in the geometry context Otherwise create an empty one.

Create the cache and populate it with the geoWolds

Build the chamber technologies

Finally add the passives

Move the passives also onto the new world tree...

Final check that all elements are cached properly

Definition at line 86 of file ReadoutGeomCnvAlg.cxx.

86 {
87 SG::WriteCondHandle writeHandle{m_writeKey, ctx};
88 if (writeHandle.isValid()) {
89 ATH_MSG_DEBUG("The current readout geometry is still valid.");
90 return StatusCode::SUCCESS;
91 }
94 ActsTrk::GeometryContext geoContext{};
95 for (const SG::ReadCondHandleKey<ActsTrk::DetectorAlignStore>& key : m_alignStoreKeys) {
96 SG::ReadCondHandle readHandle{key, ctx};
97 if (!readHandle.isValid()) {
98 ATH_MSG_FATAL("Failed to retrieve alignment store "<<key.fullKey());
99 return StatusCode::FAILURE;
100 }
101 writeHandle.addDependency(readHandle);
102 if (m_splitTrfCache) {
103 geoContext.setStore(copyDeltas(**readHandle));
104 } else {
105 geoContext.setStore(std::make_unique<ActsTrk::DetectorAlignStore>(**readHandle));
106 }
107 }
110 std::vector<ActsTrk::DetectorType> presentTechs = m_detMgr->getDetectorTypes();
111 for (const ActsTrk::DetectorType detType : presentTechs) {
112 if (geoContext.getStore(detType)) {
113 continue;
114 }
115 ATH_MSG_WARNING("No external detector alignment has been defined for technology "<<ActsTrk::to_string(detType));
116 geoContext.setStore(std::make_unique<ActsTrk::DetectorAlignStore>(detType));
117 }
119 ConstructionCache cacheObj;
120 cacheObj.detMgr = std::make_unique<MuonGM::MuonDetectorManager>();
121 cacheObj.world = createGeoWorld();
122 cacheObj.detMgr->addTreeTop(cacheObj.world);
124 ATH_CHECK(buildMdt(geoContext, cacheObj));
125 ATH_CHECK(buildTgc(geoContext, cacheObj));
126 ATH_CHECK(buildRpc(geoContext, cacheObj));
127 ATH_CHECK(buildSTGC(geoContext, cacheObj));
128 ATH_CHECK(buildMM(geoContext, cacheObj));
130 std::vector<GeoChildNodeWithTrf> treeTops = getChildrenWithRef(m_detMgr->getTreeTop(0), false);
131
133 for (const GeoChildNodeWithTrf& treeTop : treeTops) {
134 if (hasStationVolume(treeTop.volume, cacheObj.translatedStations)) {
135 continue;
136 }
137 ATH_MSG_VERBOSE("Detected passive volume "<<treeTop.nodeName);
138
139 cacheObj.world->add(const_pointer_cast(treeTop.volume));
140 }
141
143 if (m_checkGeo) {
144 const std::vector<const MuonGMR4::MuonReadoutElement*> refEles{m_detMgr->getAllReadoutElements()};
145 for (const MuonGMR4::MuonReadoutElement* refEle : refEles) {
146 ATH_CHECK(checkIdCompability(*refEle, *cacheObj.detMgr->getReadoutElement(refEle->identify())));
147 }
148 }
149 if (m_dumpGeo) {
150 ATH_MSG_DEBUG("Save geometry to SqLite file "<<m_geoDumpName);
151 GeoModelIO::IO::saveToDB(cacheObj.world, m_geoDumpName, 0 , true);
152 }
153
154 ATH_CHECK(writeHandle.record(std::move(cacheObj.detMgr)));
155 return StatusCode::SUCCESS;
156}
void setStore(AlignmentStorePtr store)
Adds the store to the Geometry context.
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
Gaudi::Property< std::string > m_geoDumpName
StatusCode buildMdt(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all Mdt readout elements from the R4 format into the legacy Trk format.
SG::WriteCondHandleKey< MuonGM::MuonDetectorManager > m_writeKey
Gaudi::Property< bool > m_splitTrfCache
Instantiate a new transform cache to ensure lazy transform population in the event processing.
StatusCode buildRpc(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all Rpc readout elements from the R4 format into the legacy Trk format.
StatusCode buildTgc(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all Tgc readout elements from the R4 format into the legacy Trk format.
Gaudi::Property< bool > m_dumpGeo
StatusCode buildSTGC(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all sTgc readout elements from the R4 format into the legacy Trk format.
StatusCode buildMM(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all Mm readout elements from the R4 format into the legacy Trk format.
SG::ReadCondHandleKeyArray< ActsTrk::DetectorAlignStore > m_alignStoreKeys
void addDependency(const EventIDRange &range)
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
std::string to_string(const DetectorType &type)
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.
std::unique_ptr< ActsTrk::DetectorAlignStore > copyDeltas(const ActsTrk::DetectorAlignStore &inStore)
Copy the alignment deltas from the inStore to a new alignment store.
Cache object holding the constructed detector manager, and the intermediate GeoModel objects needed t...
std::unique_ptr< MuonGM::MuonDetectorManager > detMgr
Pointer to the legacy MuonDetectorManager.

◆ 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 & AthCommonReentrantAlgorithm< 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 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ filterPassed()

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

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ initialize()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::initialize ( )
override

Definition at line 77 of file ReadoutGeomCnvAlg.cxx.

77 {
78 ATH_CHECK(m_idHelperSvc.retrieve());
79 ATH_CHECK(m_writeKey.initialize());
80 ATH_CHECK(m_alignStoreKeys.initialize());
81 ATH_CHECK(detStore()->retrieve(m_detMgr));
82 return StatusCode::SUCCESS;
83}
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()

◆ isReEntrant()

virtual bool AthCondAlgorithm::isReEntrant ( ) const
inlineoverridevirtualinherited

Avoid scheduling algorithm multiple times.

With multiple concurrent events, conditions objects often expire simultaneously for all slots. To avoid that the scheduler runs the CondAlg in each slot, we declare it as "non-reentrant". This ensures that the conditions objects are only created once.

In case a particular CondAlg should behave differently, it can override this method again and return true.

See also
ATEAM-836

Definition at line 39 of file AthCondAlgorithm.h.

39{ 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.

◆ 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 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
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 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

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

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< 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.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode AthCommonReentrantAlgorithm< 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 HypoBase, and InputMakerBase.

Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.

107 {
109
110 if (sc.isFailure()) {
111 return sc;
112 }
113
114 ServiceHandle<ICondSvc> cs("CondSvc",name());
115 for (auto h : outputHandles()) {
116 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
117 // do this inside the loop so we don't create the CondSvc until needed
118 if ( cs.retrieve().isFailure() ) {
119 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
120 return StatusCode::SUCCESS;
121 }
122 if (cs->regHandle(this,*h).isFailure()) {
124 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
125 << " with CondSvc");
126 }
127 }
128 }
129 return sc;
130}
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.

◆ updateVHKA()

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

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ m_alignStoreKeys

SG::ReadCondHandleKeyArray<ActsTrk::DetectorAlignStore> MuonGMR4::ReadoutGeomCnvAlg::m_alignStoreKeys {this, "AlignmentKeys", {}, "Alignment key"}
private

Definition at line 182 of file ReadoutGeomCnvAlg.h.

182{this, "AlignmentKeys", {}, "Alignment key"};

◆ m_checkGeo

Gaudi::Property<bool> MuonGMR4::ReadoutGeomCnvAlg::m_checkGeo {this, "checkGeo", false, "Checks the positions of the sensors"}
private

Definition at line 184 of file ReadoutGeomCnvAlg.h.

184{this, "checkGeo", false, "Checks the positions of the sensors"};

◆ m_detMgr

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

Definition at line 189 of file ReadoutGeomCnvAlg.h.

189{nullptr};

◆ m_detStore

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

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_dumpGeo

Gaudi::Property<bool> MuonGMR4::ReadoutGeomCnvAlg::m_dumpGeo {this, "dumpGeo", false, "Dumps the constructed geometry"}
private

Definition at line 185 of file ReadoutGeomCnvAlg.h.

185{this, "dumpGeo", false, "Dumps the constructed geometry"};

◆ m_evtStore

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

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

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

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

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_geoDumpName

Gaudi::Property<std::string> MuonGMR4::ReadoutGeomCnvAlg::m_geoDumpName {this,"geoDumpName", "ConvMuonGeoModel.db",}
private

Definition at line 188 of file ReadoutGeomCnvAlg.h.

188{this,"geoDumpName", "ConvMuonGeoModel.db",};

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> MuonGMR4::ReadoutGeomCnvAlg::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
private

Definition at line 178 of file ReadoutGeomCnvAlg.h.

178{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_splitTrfCache

Gaudi::Property<bool> MuonGMR4::ReadoutGeomCnvAlg::m_splitTrfCache {this, "splitTrfCache", false, ""}
private

Instantiate a new transform cache to ensure lazy transform population in the event processing.

Definition at line 187 of file ReadoutGeomCnvAlg.h.

187{this, "splitTrfCache", false, ""};

◆ m_varHandleArraysDeclared

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

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

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

Definition at line 398 of file AthCommonDataStore.h.

◆ m_writeKey

SG::WriteCondHandleKey<MuonGM::MuonDetectorManager> MuonGMR4::ReadoutGeomCnvAlg::m_writeKey {this, "WriteKey", "MuonDetectorManager"}
private

Definition at line 180 of file ReadoutGeomCnvAlg.h.

180{this, "WriteKey", "MuonDetectorManager"};

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