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 StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
 Get filter decision:
virtual void setFilterPassed (bool state, const EventContext &ctx) const
 Set filter decision:
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

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

Private Types

typedef ServiceHandle< 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;
759 newElement->m_builtFromCnv = true;
762
764 const MuonGMR4::MdtTubeLayer& tubeLay{*pars.tubeLayers[0]};
765 unsigned int step{1};
766 double lastLength{2.*tubeLay.uncutHalfLength(1)};
767 for (unsigned tube = 0; tube < copyMe->numTubesInLay(); ++tube) {
768 const double currLength = 2.*tubeLay.uncutHalfLength(tube);
769 ATH_MSG_VERBOSE(m_idHelperSvc->toString(copyMe->identify())<< ", tube "<<tube<<", length: "<<currLength);
770 if (std::abs(lastLength - currLength) > std::numeric_limits<float>::epsilon() ||
771 tube == copyMe->numTubesInLay() -1) {
772 newElement->m_tubelength[step-1] = lastLength;
773 newElement->m_tubelength[step] = currLength;
774 if (step == 1) {
775 newElement->m_ntubesinastep = tube;
776 }
777 lastLength = currLength;
778 ++step;
779 }
780 }
781 newElement->m_nsteps = step;
782
784 double xOffSet{pars.halfY}, yOffSet{pars.halfHeight};
785 if (newElement->barrel()) std::swap(xOffSet, yOffSet);
786 for (unsigned lay = 1; lay <= copyMe->numLayers(); ++lay) {
787 const IdentifierHash tubeHash{copyMe->measurementHash(lay, 1)};
788 const Amg::Vector3D locTube = copyMe->localTubePos(tubeHash);
789 newElement->m_firstwire_x[lay-1] = locTube.z() + xOffSet;
790 newElement->m_firstwire_y[lay-1] = locTube.x() + yOffSet;
791 }
792 MdtAlignmentStore::chamberDistortions distort = alignStore ? alignStore->getDistortion(reId) :
793 MdtAlignmentStore::chamberDistortions{};
794
795 if (!station->hasMdtAsBuiltParams()){
796 station->setMdtAsBuiltParams(distort.asBuilt);
797 }
798 if (!station->hasBLines()){
799 station->setBline(distort.bLine);
800 }
801 const Amg::Vector3D refPoint = copyMe->bLineReferencePoint();
802 station->setBlineFixedPointInAmdbLRS(refPoint.x(), refPoint.y(), refPoint.z());
803
804 newElement->geoInitDone();
805 newElement->setBLinePar(distort.bLine);
806 newElement->fillCache();
807 ATH_CHECK(dumpAndCompare(gctx, *copyMe, *newElement));
809 cacheObj.detMgr->addMdtReadoutElement(std::move(newElement));
810 }
811 return StatusCode::SUCCESS;
812}
#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

◆ 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

◆ 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 814 of file ReadoutGeomCnvAlg.cxx.

815 {
816
817 if (refEle.identify() != testEle.identify()) {
818 ATH_MSG_FATAL("Two different elements are compared "
819 <<m_idHelperSvc->toString(refEle.identify())<<" vs. "
820 <<m_idHelperSvc->toString(testEle.identify()));
821 return StatusCode::FAILURE;
822 }
823 if (refEle.identHash() != testEle.detectorElementHash()) {
824 ATH_MSG_FATAL("The hashes of the two detector elements "<<m_idHelperSvc->toString(refEle.identify())
825 <<" are completely different "<<refEle.identHash()<<" vs. "<<testEle.detectorElementHash());
826 return StatusCode::FAILURE;
827 }
828 return StatusCode::SUCCESS;
829}
#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 879 of file ReadoutGeomCnvAlg.cxx.

881 {
882
883 if (!m_checkGeo) {
884 return StatusCode::SUCCESS;
885 }
886 ATH_CHECK(checkIdCompability(refEle, testEle));
887
888 ATH_MSG_VERBOSE("Detector element "<<m_idHelperSvc->toString(refEle.identify())
889 <<std::endl<<GeoTrf::toString(amdbTransform(gctx, refEle))
890 <<std::endl<<GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform())
891 <<std::endl<<"r-size: "<<testEle.getRsize()<<"/"<<testEle.getLongRsize()
892 <<" s-size: "<<testEle.getSsize()<<"/"<<testEle.getLongSsize()
893 <<" z-size: "<<testEle.getZsize()<<"/"<<testEle.getLongZsize());
894 for (unsigned int lay = 1; lay <= refEle.numLayers(); ++lay){
895 for (unsigned int tube = 1; tube <= refEle.numTubesInLay(); ++tube) {
896 const IdentifierHash tubeHash {refEle.measurementHash(lay,tube)};
897 if (!refEle.isValid(tubeHash)) {
898 ATH_MSG_VERBOSE("SKip layer / tube "<<lay <<","<<tube);
899 continue;
900 }
901 const Amg::Transform3D globToLocal = refEle.globalToLocalTransform(gctx, tubeHash);
902
903 const Amg::Vector3D refPos = refEle.globalTubePos(gctx, tubeHash);
904 const Amg::Vector3D tubePos = testEle.tubePos(lay, tube);
905
906
907 if ( (refPos - tubePos).mag() > Gaudi::Units::micrometer &&
908 (globToLocal*refPos - globToLocal * tubePos).perp() > Gaudi::Units::micrometer) {
909 ATH_MSG_ERROR("Tube positions differ for "<<m_idHelperSvc->toString(refEle.measurementId(tubeHash))
910 <<" reference: "<<GeoTrf::toString(globToLocal*refPos)<<" vs. test: "
911 <<GeoTrf::toString(globToLocal*tubePos) <<" delta: "<<(refPos - tubePos).mag()
912 <<" Transforms "<<std::endl
913 <<" **** "<< GeoTrf::toString(globToLocal.inverse())<<std::endl
914 <<" **** "<< GeoTrf::toString(testEle.transform(lay, tube)));
915 return StatusCode::FAILURE;
916 }
917 ATH_MSG_VERBOSE("Tube positions layer: "<<lay<<", tube: "<<tube
918 <<std::endl<<"reference: "<<GeoTrf::toString(refPos)
919 <<std::endl<<"test: "<<GeoTrf::toString(tubePos)
920 <<std::endl<<testEle.tubeLength(lay, tube)<<"/"<<testEle.getActiveTubeLength(lay, tube)<<"/"
921 <<testEle.getWireLength(lay,tube)<<" vs. "<<refEle.tubeLength(tubeHash)
922 <<"/"<<refEle.activeTubeLength(tubeHash)<<"/"<<refEle.wireLength(tubeHash)
923 <<"/"<<refEle.uncutTubeLength(tubeHash));
924 if (std::abs(testEle.getTubeLengthForCaching(lay,tube) - refEle.uncutTubeLength(tubeHash)) >
925 std::numeric_limits<float>::epsilon() ) {
926 ATH_MSG_FATAL("Different tube length's detected for "<<m_idHelperSvc->toStringDetEl(refEle.identify())
927 << " layer: "<<lay<<", tube: "<<tube<<" -- "<<testEle.getTubeLengthForCaching(lay,tube)<<" (new) vs. "
928 <<refEle.uncutTubeLength(tubeHash)<<" (ref)");
929 return StatusCode::FAILURE;
930 }
931 }
932 }
933
934 return StatusCode::SUCCESS;
935}
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 831 of file ReadoutGeomCnvAlg.cxx.

833 {
834
835 if (!m_checkGeo) {
836 return StatusCode::SUCCESS;
837 }
838 ATH_CHECK(checkIdCompability(refEle, testEle));
839
840 ATH_MSG_VERBOSE("Compare basic readout transforms"<<std::endl
841 <<GeoTrf::toString(testEle.absTransform(),true)<<std::endl
842 <<GeoTrf::toString(amdbTransform(gctx, refEle), true));
843 const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
844 for (unsigned int gasGap = 1; gasGap <= refEle.nGasGaps(); ++ gasGap) {
845 const Identifier gapId = idHelper.channelID(refEle.identify(), refEle.multilayer(), gasGap, 1);
846
847 const Amg::Transform3D& refTrf{refEle.localToGlobalTransform(gctx, gapId)};
848 const Amg::Transform3D& testTrf{testEle.transform(gapId)};
849 if (!Amg::isIdentity(refTrf.inverse()*testTrf)) {
850 ATH_MSG_FATAL("The layer "<<m_idHelperSvc->toStringGasGap(gapId)<<" does not transform equally"
851 <<GeoTrf::toString(refTrf, true) <<" vs. "<<GeoTrf::toString(testTrf, true));
852 return StatusCode::FAILURE;
853 }
854 const MuonGMR4::StripDesign& stripDesign{refEle.stripLayer(gapId).design()};
855
856 for (int strip = stripDesign.firstStripNumber(); strip <= stripDesign.numStrips(); ++strip) {
857 const Identifier stripId = idHelper.channelID(refEle.identify(), refEle.multilayer(), gasGap, strip);
858 const Amg::Vector3D refStripPos{refEle.stripPosition(gctx, stripId)};
859 const Amg::Vector3D refStripDir{refEle.localToGlobalTransform(gctx, refEle.layerHash(stripId)).linear() * Amg::Vector3D::UnitX()};
860
861 Amg::Vector3D testStripPos{Amg::Vector3D::Zero()};
862 if (!testEle.stripGlobalPosition(stripId, testStripPos)) {
863 ATH_MSG_FATAL("Failed to retrieve strip position "<<m_idHelperSvc->toString(stripId));
864 return StatusCode::FAILURE;
865 }
866 const double dist = refStripDir.dot(refStripPos - testStripPos);
867 if (std::abs(dist) > 10. * Gaudi::Units::micrometer) {
868 ATH_MSG_FATAL("The strip "<<Amg::toString(testStripPos)<<" is not describing the same strip as "
869 <<Amg::toString(refStripPos)<<". Channel "<<m_idHelperSvc->toString(stripId)
870 <<" distance: "<<dist<<" "<<(dist / testEle.m_etaDesign[gasGap -1].inputWidth));
871 return StatusCode::FAILURE;
872 }
873 ATH_MSG_VERBOSE("Channel postion "<<m_idHelperSvc->toString(stripId)<<" match between legacy & new");
874 }
875 }
876 return StatusCode::SUCCESS;
877}
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 936 of file ReadoutGeomCnvAlg.cxx.

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

1076 {
1077 if (!m_checkGeo) {
1078 return StatusCode::SUCCESS;
1079 }
1080 ATH_CHECK(checkIdCompability(refEle, testEle));
1081
1082 ATH_MSG_VERBOSE("Compare basic readout transforms"<<std::endl
1083 <<GeoTrf::toString(testEle.absTransform(),true)<<std::endl
1084 <<GeoTrf::toString(amdbTransform(gctx, refEle), true));
1085 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
1086 for (unsigned int gasGap = 1; gasGap <= refEle.numLayers(); ++gasGap) {
1090 const IdentifierHash layHash = refEle.createHash(gasGap, chType, 1);
1091 const unsigned int numChannel = refEle.numChannels(layHash);
1092 constexpr unsigned firstCh = 1;
1093 for (unsigned int channel = firstCh; channel < numChannel ; ++channel) {
1094 Identifier chID{};
1095 bool isValid = false;
1097 const int etaIndex = refEle.padDesign(layHash).padNumber(channel).first;
1098 const int phiIndex = refEle.padDesign(layHash).padNumber(channel).second;
1099 chID = idHelper.padID(refEle.identify(),
1100 refEle.multilayer(),
1101 gasGap, chType, etaIndex, phiIndex, isValid);
1102 } else {
1103 chID = idHelper.channelID(refEle.identify(),
1104 refEle.multilayer(),
1105 gasGap, chType, channel, isValid);
1106 }
1107
1108 if(!isValid) {
1109 ATH_MSG_WARNING("Invalid Identifier detected: " << m_idHelperSvc->toString(chID));
1110 return StatusCode::FAILURE;
1111 }
1112 const IdentifierHash measHash = refEle.measurementHash(chID);
1113 Amg::Transform3D refTrans{refEle.localToGlobalTransform(gctx, refEle.layerHash(measHash))*
1115 const Amg::Transform3D& testTrans{testEle.transform(chID)};
1116 if (channel == firstCh && (!Amg::doesNotDeform(testTrans.inverse()*refTrans)
1117 || (testTrans.inverse()*refTrans).translation().perp() >
1118 std::numeric_limits<float>::epsilon() ) ) {
1119 ATH_MSG_ERROR(__func__<<"() "<<__LINE__<<" - Transformation for "
1120 <<m_idHelperSvc->toString(chID)<<std::endl
1121 <<" *** ref: "<<GeoTrf::toString(refTrans, true)<<std::endl
1122 <<" *** test: "<<GeoTrf::toString(testTrans, true));
1123 return StatusCode::FAILURE;
1124 }
1125 const Amg::Vector3D refChannelPos = refEle.globalChannelPosition(gctx, measHash);
1126
1128 const Amg::Transform3D& testPadTrans{testEle.transform(chID)};
1129 Amg::Vector3D testChannelPos(Amg::Vector3D::Zero());
1130 testEle.stripGlobalPosition(chID, testChannelPos);
1131
1132 const std::array<Amg::Vector3D,4> refPadCorners = refEle.globalPadCorners(gctx, measHash);
1133 std::array<Amg::Vector3D,4> testPadCorners{make_array<Amg::Vector3D, 4>(Amg::Vector3D::Zero())};
1134 testEle.padGlobalCorners(chID, testPadCorners);
1135 for (unsigned int cornerIdx = 0; cornerIdx < refPadCorners.size(); ++cornerIdx) {
1136 const double padCornerDiff = (refPadCorners[cornerIdx] - testPadCorners[cornerIdx]).mag();
1137 if (padCornerDiff - 25. > 1. * Gaudi::Units::micrometer){
1138 ATH_MSG_ERROR("Mismatch in pad Corner " << cornerIdx << ": " <<m_idHelperSvc->toString(chID)
1139 <<" ref: "<<Amg::toString(refPadCorners[cornerIdx])<<" test: "<<Amg::toString(testPadCorners[cornerIdx])
1140 <<" difference: " << padCornerDiff
1141 <<" local coordinates -- ref: "<<Amg::toString(refTrans.inverse()*refPadCorners[cornerIdx])
1142 <<" test: "<<Amg::toString(testPadTrans.inverse()*testPadCorners[cornerIdx]));
1143 return StatusCode::FAILURE;
1144 }
1145 }
1146 const double padChannelDiff = (refChannelPos - testChannelPos).mag();
1147 if (padChannelDiff - 25. > 1. * Gaudi::Units::micrometer){
1148 ATH_MSG_ERROR("Mismatch in pad positions "<<m_idHelperSvc->toString(chID)
1149 <<" ref: "<<Amg::toString(refChannelPos)<<" test: "<<Amg::toString(testChannelPos)
1150 <<" difference: " << padChannelDiff
1151 <<" local coordinates -- ref: "<<Amg::toString(refTrans.inverse()*refChannelPos)
1152 <<" test: "<<Amg::toString(testPadTrans.inverse()*testChannelPos));
1153 return StatusCode::FAILURE;
1154 }
1155 ATH_MSG_VERBOSE("Agreement between new and old geometry for channel "<<m_idHelperSvc->toString(chID)
1156 <<" channel position "<<Amg::toString(refChannelPos));
1157 }
1159 Amg::Vector3D testChannelPos{Amg::Vector3D::Zero()};
1160 testEle.stripGlobalPosition(chID, testChannelPos);
1161 if ((refChannelPos - testChannelPos).mag() > 1. * Gaudi::Units::micrometer){
1162 ATH_MSG_ERROR("Mismatch in strip positions "<<m_idHelperSvc->toString(chID)
1163 <<" ref: "<<Amg::toString(refChannelPos)<<" test: "<<Amg::toString(testChannelPos)
1164 <<" local coordinates -- ref: "<<Amg::toString(testTrans.inverse()*refChannelPos)
1165 <<" test: "<<Amg::toString(testTrans.inverse()*testChannelPos));
1166 return StatusCode::FAILURE;
1167 }
1168 ATH_MSG_VERBOSE("Agreement between new and old geometry for channel "<<m_idHelperSvc->toString(chID)
1169 <<" channel position "<<Amg::toString(refChannelPos));
1170 } else { // wire
1171 Amg::Vector3D testChannelPos{Amg::Vector3D::Zero()};
1172 testEle.stripGlobalPosition(chID, testChannelPos);
1173 Amg::Vector3D localRefPos {testTrans.inverse()*refChannelPos};
1174 Amg::Vector3D localTestPos{testTrans.inverse()*testChannelPos};
1176 if((std::abs(localRefPos.x() -localTestPos.x()) > 1.* Gaudi::Units::micrometer)
1177 || (std::abs(refChannelPos.z() -testChannelPos.z()) > 15.* Gaudi::Units::micrometer)){
1178 ATH_MSG_ERROR("Mismatch in wire positions "<<m_idHelperSvc->toString(chID)
1179 <<" ref: "<<Amg::toString(refChannelPos)<<" test: "<<Amg::toString(testChannelPos)
1180 <<" local coordinates -- ref: "<<Amg::toString(testTrans.inverse()*refChannelPos)
1181 <<" test: "<<Amg::toString(testTrans.inverse()*testChannelPos)
1182 <<"delta X: "<<std::abs(localRefPos.x() -localTestPos.x())
1183 <<", delta Z: "<<std::abs(localRefPos.z() -localTestPos.z()));
1184 return StatusCode::FAILURE;
1185 }
1186 }
1187 }
1188 }
1189 }
1190 return StatusCode::SUCCESS;
1191}
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)
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 997 of file ReadoutGeomCnvAlg.cxx.

999 {
1000
1001 if (!m_checkGeo) {
1002 return StatusCode::SUCCESS;
1003 }
1004 ATH_CHECK(checkIdCompability(refEle, testEle));
1005
1006 const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
1007
1008 ATH_MSG_VERBOSE("Detector element "<<m_idHelperSvc->toString(refEle.identify())
1009 <<std::endl<<GeoTrf::toString(amdbTransform(gctx, refEle), true)
1010 <<std::endl<<GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform(), true)
1011 <<std::endl<<"r-size: "<<testEle.getRsize()<<"/"<<testEle.getLongRsize()
1012 <<" s-size: "<<testEle.getSsize()<<"/"<<testEle.getLongSsize()
1013 <<" z-size: "<<testEle.getZsize()<<"/"<<testEle.getLongZsize());
1014
1015 for (unsigned int gasGap = 1; gasGap <= refEle.nGasGaps(); ++gasGap) {
1016 for (bool isStrip : {false, true}) {
1017 const IdentifierHash layHash = refEle.constructHash(0, gasGap, isStrip);
1018
1019 const Identifier layId = idHelper.channelID(refEle.identify(), gasGap, isStrip, 1);
1020 ATH_MSG_VERBOSE("Test layer "<<m_idHelperSvc->toString(layId)<<", nCh: "<<refEle.numChannels(layHash)<<", layHash: "<<layHash);
1021 if (!refEle.numChannels(layHash)) continue;
1022 const Amg::Transform3D refLayerTrf = refEle.localToGlobalTransform(gctx, refEle.constructHash(0, gasGap, false)) *
1023 (!isStrip ? Amg::Transform3D::Identity()
1024 : Amg::getRotateZ3D(-90._degree));
1025 const Amg::Transform3D& testLayerTrf = testEle.transform(layId);
1026 if (!Amg::isIdentity(refLayerTrf.inverse()* testLayerTrf)) {
1027 ATH_MSG_FATAL("The transformations in "<<m_idHelperSvc->toString(layId)
1028 <<std::endl<<"ref : "<<GeoTrf::toString(refLayerTrf,true)
1029 <<std::endl<<"test: "<<GeoTrf::toString(testLayerTrf,true)
1030 <<" are not identical. ");
1031 return StatusCode::FAILURE;
1032 }
1033 ATH_MSG_VERBOSE("Transformations in "<<m_idHelperSvc->toString(layId)
1034 <<std::endl<<"ref : "<<GeoTrf::toString(refLayerTrf,true)
1035 <<std::endl<<"test: "<<GeoTrf::toString(testLayerTrf,true));
1036
1037 for (unsigned int ch = 1; ch <= refEle.numChannels(layHash); ++ch) {
1038 const IdentifierHash measHash = refEle.constructHash(ch, gasGap, isStrip);
1039 const Identifier measId = refEle.measurementId(measHash);
1040 const Amg::Vector3D refChannel = refEle.channelPosition(gctx, measHash);
1041 const Amg::Vector3D testChannel = testEle.channelPos(measId);
1042 if ((refChannel - testChannel).mag() < std::numeric_limits<float>::epsilon()){
1043 continue;
1044 }
1045 std::stringstream msg{};
1046 msg<<"The channel "<<m_idHelperSvc->toString(measId)
1047 << " is not at the same position "<<Amg::toString(refChannel)
1048 <<" vs. "<<Amg::toString(testChannel)<<". Difference: "
1049 <<(refChannel - testChannel).mag();
1050 if (!isStrip) {
1051 msg<<std::endl<<"*** Test *** - wirePitch: "<<testEle.wirePitch()
1052 <<", tot wires "<<testEle.nWires(gasGap)
1053 <<", wires to reach "<<testEle.nPitchesToGang(gasGap, ch)
1054 <<", wires in gang "<<testEle.nWires(gasGap, ch);
1055 const MuonGMR4::WireGroupDesign& design{refEle.wireGangLayout(gasGap)};
1056 msg<<std::endl<<"*** Ref *** - wirePitch: "<<design.stripPitch()
1057 <<", tot wires "<<testEle.nWires(gasGap)
1058 <<", wires to reach "<<design.numPitchesToGroup(ch)
1059 <<", wires in gang "<<design.numWiresInGroup(ch);
1060 } else {
1061 const Amg::Vector3D locRefPos{refLayerTrf.inverse() * refChannel};
1062 const Amg::Vector3D locTestPos{refLayerTrf.inverse()* testChannel};
1063 msg<<std::endl<<"*** Ref **** - "<<Amg::toString(locRefPos)<<std::endl;
1064 msg<<std::endl<<"*** Test **** - "<<Amg::toString(locTestPos)<<std::endl;
1065 }
1066 ATH_MSG_FATAL(msg.str());
1067 return StatusCode::FAILURE;
1068 }
1069
1070 }
1071 }
1072 return StatusCode::SUCCESS;
1073}
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
for(size_t i=0;i< m_blockFillers.size();i++)
Fill one block.

◆ 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 "<<detType);
116 geoContext.setStore(std::make_unique<ActsTrk::DetectorAlignStore>(detType, ActsTrk::DetectorAlignStore::Mode::LazyFill));
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
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 & AthCommonAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

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

Definition at line 89 of file AthCommonAlgorithm.cxx.

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

◆ filterPassed()

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

Get filter decision:

Definition at line 93 of file AthCommonAlgorithm.h.

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

◆ 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()

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

Specify if the algorithm is clonable.

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

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

Definition at line 68 of file AthCommonAlgorithm.h.

68 {
69 return true;
70 }

◆ isReEntrant()

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 AthCommonAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Set filter decision:

Reimplemented in AthFilterAlgorithm.

Definition at line 99 of file AthCommonAlgorithm.h.

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

◆ sysExecute()

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

Execute an algorithm.

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

Reimplemented in AthAnalysisAlgorithm.

Definition at line 80 of file AthCommonAlgorithm.cxx.

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

◆ sysInitialize()

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

Override sysInitialize.

Override sysInitialize from the base class.

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

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

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

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

Definition at line 60 of file AthCommonAlgorithm.cxx.

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

◆ sysStart()

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

Handle START transition.

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

◆ 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 AthCommonAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

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

Empty if no symlinks were found.

Definition at line 108 of file AthCommonAlgorithm.h.

◆ m_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: