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

Public Member Functions

 ~ReadoutGeomCnvAlg ()=default
StatusCode execute (const EventContext &ctx) const override
StatusCode initialize () override
virtual bool isReEntrant () const override
 Avoid scheduling algorithm multiple times.
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
virtual void setFilterPassed (bool state, const EventContext &ctx) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

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

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

StatusCode buildStation (const ActsTrk::GeometryContext &gctx, const Identifier &stationId, ConstructionCache &cacheObj) const
 builds a station object from readout element.
StatusCode cloneReadoutVolume (const ActsTrk::GeometryContext &gctx, const Identifier &stationId, ConstructionCache &cacheObj, GeoIntrusivePtr< GeoVFullPhysVol > &clonedPhysVol, MuonGM::MuonStation *&station) const
 Clones the fullPhysical volume of the readoutElement and embeds it into the associated station.
GeoIntrusivePtr< GeoVFullPhysVol > cloneNswWedge (const ActsTrk::GeometryContext &gctx, const MuonGMR4::MuonReadoutElement *nswRE, ConstructionCache &cacheObj) const
 Clones the fullPhysicalVolume of the.
StatusCode buildMdt (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
StatusCode buildRpc (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
StatusCode buildSTGC (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
StatusCode buildMM (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
StatusCode buildTgc (const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::RpcReadoutElement &refEle, const MuonGM::RpcReadoutElement &testEle) const
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::MdtReadoutElement &refEle, const MuonGM::MdtReadoutElement &testEle) const
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::MmReadoutElement &refEle, const MuonGM::MMReadoutElement &testEle) const
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::TgcReadoutElement &refEle, const MuonGM::TgcReadoutElement &testEle) const
StatusCode dumpAndCompare (const ActsTrk::GeometryContext &gctx, const MuonGMR4::sTgcReadoutElement &refEle, const MuonGM::sTgcReadoutElement &testEle) const
StatusCode checkIdCompability (const MuonGMR4::MuonReadoutElement &refEle, const MuonGM::MuonReadoutElement &testEle) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

ServiceHandle< Muon::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< 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

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

690 {
692 SubDetAlignment alignItr = gctx.getStore(ActsTrk::DetectorType::Mdt);
693 const MdtAlignmentStore* alignStore = alignItr ?
694 static_cast<const MdtAlignmentStore*>(alignItr->internalAlignment.get()) : nullptr;
695
696 const std::vector<const MuonGMR4::MdtReadoutElement*> mdtReadOuts{m_detMgr->getAllMdtReadoutElements()};
697 ATH_MSG_INFO("Copy "<<mdtReadOuts.size()<<" Mdt readout elements to the legacy system");
698 for (const MuonGMR4::MdtReadoutElement* copyMe : mdtReadOuts) {
699 const Identifier reId = copyMe->identify();
700 ATH_MSG_DEBUG("Translate "<<m_idHelperSvc->toStringDetEl(reId));
702 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
703 MuonGM::MuonStation* station{nullptr};
704 ATH_CHECK(cloneReadoutVolume(gctx,reId, cacheObj, physVol, station));
705 if (copyMe->multilayer() == 1) {
706 const MuonGMR4::MdtReadoutElement* otherRE = copyMe->complementaryRE();
707 const double height = std::max(copyMe->moduleHeight(), otherRE->moduleHeight()) -
708 (copyMe->tubePitch() - 2. * copyMe->tubeRadius());
709
710 const double modHalTHickO{0.5*otherRE->moduleThickness()},
711 modHalfThick{-0.5*copyMe->moduleThickness()};
712
713 const double thickness = ( (otherRE->asBuiltRefFrame()*(modHalTHickO* Amg::Vector3D::UnitX())) -
714 (copyMe->asBuiltRefFrame()*(modHalfThick* Amg::Vector3D::UnitX()))).z();
715 if (copyMe->isBarrel()) {
716 station->setMdtZsize(height);
717 station->setMdtRsize(thickness);
718 } else {
719 station->setMdtRsize(height);
720 station->setMdtZsize(thickness);
721 }
722 }
723 const MuonGMR4::MdtReadoutElement::parameterBook& pars{copyMe->getParameters()};
724 auto newElement = std::make_unique<MuonGM::MdtReadoutElement>(physVol,
725 m_idHelperSvc->stationNameString(reId),
726 cacheObj.detMgr.get());
727 newElement->setIdentifier(reId);
728 newElement->setMultilayer(copyMe->multilayer());
729 newElement->setNMdtInStation(m_idHelperSvc->mdtIdHelper().multilayerMax(reId));
730 // cppcheck-suppress invalidLifetime; ok: mgr took ownership.
731 newElement->setParentMuonStation(station);
732
734 newElement->setLongSsize(2*pars.longHalfX - 1._cm);
735 newElement->setSsize(2*pars.shortHalfX - 1._cm);
736 newElement->setLongRsize(2*pars.halfY);
737 newElement->setRsize(2*pars.halfY);
738 newElement->setZsize(2*pars.halfHeight);
739 newElement->setLongZsize(2*pars.halfHeight);
740
741 newElement->m_nlayers = copyMe->numLayers();
742 newElement->m_ntubesperlayer = copyMe->numTubesInLay();
743 newElement->m_deadlength = pars.deadLength;
744 newElement->m_endpluglength = pars.endPlugLength;
745 newElement->m_innerRadius = pars.tubeInnerRad;
746 newElement->m_tubeWallThickness = pars.tubeWall;
747 newElement->m_tubepitch = pars.tubePitch;
750
752 const MuonGMR4::MdtTubeLayer& tubeLay{*pars.tubeLayers[0]};
753 unsigned int step{1};
754 double lastLength{2.*tubeLay.uncutHalfLength(1)};
755 for (unsigned tube = 0; tube < copyMe->numTubesInLay(); ++tube) {
756 const double currLength = 2.*tubeLay.uncutHalfLength(tube);
757 ATH_MSG_VERBOSE(m_idHelperSvc->toString(copyMe->identify())<< ", tube "<<tube<<", length: "<<currLength);
758 if (std::abs(lastLength - currLength) > std::numeric_limits<float>::epsilon() ||
759 tube == copyMe->numTubesInLay() -1) {
760 newElement->m_tubelength[step-1] = lastLength;
761 newElement->m_tubelength[step] = currLength;
762 if (step == 1) {
763 newElement->m_ntubesinastep = tube;
764 }
765 lastLength = currLength;
766 ++step;
767 }
768 }
769 newElement->m_nsteps = step;
770
772 double xOffSet{pars.halfY}, yOffSet{pars.halfHeight};
773 if (newElement->barrel()) std::swap(xOffSet, yOffSet);
774 for (unsigned lay = 1; lay <= copyMe->numLayers(); ++lay) {
775 const IdentifierHash tubeHash{copyMe->measurementHash(lay, 1)};
776 const Amg::Vector3D locTube = copyMe->localTubePos(tubeHash);
777 newElement->m_firstwire_x[lay-1] = locTube.z() + xOffSet;
778 newElement->m_firstwire_y[lay-1] = locTube.x() + yOffSet;
779 }
780 MdtAlignmentStore::chamberDistortions distort = alignStore ? alignStore->getDistortion(reId) :
781 MdtAlignmentStore::chamberDistortions{};
782
783 if (!station->hasMdtAsBuiltParams()){
784 station->setMdtAsBuiltParams(distort.asBuilt);
785 }
786 if (!station->hasBLines()){
787 station->setBline(distort.bLine);
788 }
789 const Amg::Vector3D refPoint = copyMe->bLineReferencePoint();
790 station->setBlineFixedPointInAmdbLRS(refPoint.x(), refPoint.y(), refPoint.z());
791
792 newElement->geoInitDone();
793 newElement->setBLinePar(distort.bLine);
794 newElement->fillCache();
795 ATH_CHECK(dumpAndCompare(gctx, *copyMe, *newElement));
797 cacheObj.detMgr->addMdtReadoutElement(std::move(newElement));
798 }
799 return StatusCode::SUCCESS;
800}
#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
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

Loop over the gas gaps & efine the

Definition at line 517 of file ReadoutGeomCnvAlg.cxx.

517 {
518
519 SubDetAlignment alignItr = gctx.getStore(ActsTrk::DetectorType::Mm);
520 const auto alignStore = alignItr ?
521 static_cast<const MmAlignmentStore*>(alignItr->internalAlignment.get()) : nullptr;
522
523 if (alignStore) {
524 cacheObj.detMgr->setMMPassivation(alignStore->passivation);
525 }
526 const std::vector<const MuonGMR4::MmReadoutElement*> mmReadouts{m_detMgr->getAllMmReadoutElements()};
527 ATH_MSG_INFO("Copy "<<mmReadouts.size()<<" Mm readout elements to the legacy system");
528
529 for (const MuonGMR4::MmReadoutElement* copyMe : mmReadouts) {
530 const Identifier reId = copyMe->identify();
531 GeoIntrusivePtr<GeoVFullPhysVol> physVol{cloneNswWedge(gctx, copyMe, cacheObj)};
532 auto newRE = std::make_unique<MuonGM::MMReadoutElement>(physVol,
533 m_idHelperSvc->stationNameString(reId),
534 copyMe->stationEta(),
535 copyMe->stationPhi(),
536 copyMe->multilayer(), cacheObj.detMgr.get());
538 for (unsigned int gasGap = 0; gasGap < copyMe->nGasGaps(); ++gasGap) {
539 const MuonGMR4::StripLayer& stripLayer{copyMe->stripLayer(MuonGMR4::MmReadoutElement::createHash(gasGap +1, 0))};
540 const MuonGMR4::StripDesign& designFrom{stripLayer.design()};
541
542 newRE->m_Xlg[gasGap] = stripLayer.toOrigin() *
543 Amg::getRotateZ3D(-designFrom.stereoAngle()) *
544 Amg::getRotateY3D(90. * Gaudi::Units::deg);
545 ATH_MSG_VERBOSE("Layer transform "<<gasGap<<" "<<GeoTrf::toString(newRE->m_Xlg[gasGap], true));
546
547 MuonGM::MuonChannelDesign& designTo{newRE->m_etaDesign[gasGap]};
548 designTo.defineTrapezoid(designFrom.shortHalfHeight(),
549 designFrom.longHalfHeight(),
550 designFrom.halfWidth(),
551 designFrom.stereoAngle());
554 designTo.inputPitch = designFrom.stripPitch();
555 designTo.inputWidth = designTo.inputPitch * std::cos(designTo.stereoAngle());
556 designTo.nMissedBottomEta = designTo.nMissedBottomStereo = designFrom.firstStripNumber() - 1;
557 designTo.totalStrips = designFrom.numStrips();
558 designTo.nch = designFrom.numStrips();
559
560 designTo.setFirstPos(designFrom.firstStripPos().x() + 0.5*designTo.inputPitch);
561 }
562
563 newRE->fillCache();
564 if (alignStore && alignStore->getBLine(reId)) {
565 newRE->setBLinePar(*alignStore->getBLine(reId));
566 }
567 ATH_CHECK(dumpAndCompare(gctx, *copyMe, *newRE));
568 cacheObj.detMgr->addMMReadoutElement(std::move(newRE));
569 }
570 return StatusCode::SUCCESS;
571}
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 fullPhysicalVolume of the.
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

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

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

◆ buildStation()

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

builds a station object from readout element.

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

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

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

Initialize the eta design

Initialize the phi design

To circumvent the yCutout calculations in padCorner function in MuonPadDesign

Definition at line 573 of file ReadoutGeomCnvAlg.cxx.

573 {
574 SubDetAlignment alignItr = gctx.getStore(ActsTrk::DetectorType::sTgc);
575 auto alignStore = alignItr ? static_cast<const sTgcAlignmentStore*>(alignItr->internalAlignment.get()) : nullptr;
576
577 const std::vector<const MuonGMR4::sTgcReadoutElement*> sTgcReadOuts{m_detMgr->getAllsTgcReadoutElements()};
578 ATH_MSG_INFO("Copy "<<sTgcReadOuts.size()<<" sTgc readout elements to the legacy system");
579
580 for (const MuonGMR4::sTgcReadoutElement* copyMe : sTgcReadOuts) {
581 const Identifier reId = copyMe->identify();
582 ATH_MSG_DEBUG("Translate readout element "<<m_idHelperSvc->toStringDetEl(reId)<<".");
583 GeoIntrusivePtr<GeoVFullPhysVol> physVol{cloneNswWedge(gctx, copyMe, cacheObj)};
584
585 auto newRE = std::make_unique<MuonGM::sTgcReadoutElement>(physVol,
586 m_idHelperSvc->stationNameString(reId).substr(1),
587 copyMe->stationEta(),
588 copyMe->stationPhi(),
589 copyMe->multilayer(),
590 cacheObj.detMgr.get());
591
592 if (alignStore && alignStore->getBLine(reId)) {
593 newRE->setBLinePar(*alignStore->getBLine(reId));
594 }
595 for (unsigned int layer = 1; layer <= copyMe->numLayers(); ++layer) {
597 using ChannelDesign = MuonGM::MuonChannelDesign;
598 const IdentifierHash layerHash = MuonGMR4::sTgcReadoutElement::createHash(layer,channelType::Strip,0);
599
600 const MuonGMR4::StripLayer& stripLayer{copyMe->stripLayer(layerHash)};
601 newRE->m_Xlg[layer -1] = stripLayer.toOrigin() *
602 Amg::getRotateY3D(90._degree) *
603 Amg::getTranslateX3D( layer%2 ? - 0.01 : 0.01 );
604
605 const MuonGMR4::StripDesign& copyEtaDesign{stripLayer.design()};
606 ATH_MSG_VERBOSE("Layer: "<<layer<<" "<<copyEtaDesign);
608 ChannelDesign& etaDesign{newRE->m_etaDesign[layer-1]};
609 etaDesign.type = ChannelDesign::ChannelType::etaStrip;
610 etaDesign.detType = ChannelDesign::DetType::STGC;
611 if (copyEtaDesign.yCutout()) {
612 etaDesign.defineDiamond(copyEtaDesign.shortHalfHeight(),
613 copyEtaDesign.longHalfHeight(),
614 copyEtaDesign.halfWidth(),
615 copyEtaDesign.yCutout());
616 } else {
617 etaDesign.defineTrapezoid(copyEtaDesign.shortHalfHeight(),
618 copyEtaDesign.longHalfHeight(),
619 copyEtaDesign.halfWidth());
620
621 }
622 etaDesign.firstPitch = copyEtaDesign.firstStripPos().x() + 0.5*copyEtaDesign.stripPitch() + copyEtaDesign.halfWidth();
623 etaDesign.inputPitch = copyEtaDesign.stripPitch();
624 etaDesign.inputWidth = copyEtaDesign.stripWidth();
625 etaDesign.nch = copyEtaDesign.numStrips();
626 ATH_MSG_VERBOSE(m_idHelperSvc->toStringDetEl(copyMe->identify())<<", layer: "<<layer<<", eta-design: "<< copyEtaDesign);
627 etaDesign.setFirstPos(copyEtaDesign.firstStripPos().x() + 0.5*copyEtaDesign.stripPitch());
629
630 const MuonGMR4::WireGroupDesign& copyPhiDesign{copyMe->wireDesign(layerHash)};
631
632 ChannelDesign& phiDesign{newRE->m_phiDesign[layer-1]};
633 phiDesign.type = ChannelDesign::ChannelType::phiStrip;
634 phiDesign.detType = ChannelDesign::DetType::STGC;
635 if (copyPhiDesign.yCutout() == 0.) {
636 phiDesign.defineTrapezoid(copyPhiDesign.shortHalfHeight(),
637 copyPhiDesign.longHalfHeight(),
638 copyPhiDesign.halfWidth());
639 } else {
640 phiDesign.defineDiamond(copyPhiDesign.shortHalfHeight(),
641 copyPhiDesign.longHalfHeight(),
642 copyPhiDesign.halfWidth(),
643 copyPhiDesign.yCutout());
644 }
645 phiDesign.inputPitch = copyPhiDesign.stripPitch();
646 phiDesign.inputWidth = copyPhiDesign.stripWidth();
647 ATH_MSG_VERBOSE(m_idHelperSvc->toStringDetEl(copyMe->identify())<<", layer: "<<layer<<", phi-design: "<< copyPhiDesign);
648 phiDesign.setFirstPos(copyPhiDesign.firstStripPos().x()); // Position of 1st wire, accounts for staggering
649 phiDesign.firstPitch = copyPhiDesign.numWiresInGroup(1); // Number of Wires in 1st group, group staggering
650 phiDesign.groupWidth = copyPhiDesign.numWiresInGroup(2); // Number of Wires normal group
651 phiDesign.nGroups = copyPhiDesign.numStrips(); // Number of Wire Groups
652 phiDesign.wireCutout = copyPhiDesign.wireCutout(); // Size of "active" wire region for digits
653 phiDesign.nch = copyPhiDesign.nAllWires();
654 phiDesign.isConvertedFromPhaseII = true;
655
656 const MuonGMR4::PadDesign& copyPadDesign{copyMe->padDesign(layerHash)};
657 MuonGM::MuonPadDesign& padDesign{newRE->m_padDesign[layer-1]};
658 padDesign.Length = copyMe->chamberHeight();
659 padDesign.sWidth = copyMe->sChamberLength();
660 padDesign.lWidth = copyMe->lChamberLength();
661 padDesign.Size = 2.*copyPadDesign.halfWidth();
662 padDesign.ysFrame = copyMe->sFrameWidth();
663 padDesign.ylFrame = copyMe->lFrameWidth();
664 padDesign.thickness = copyMe->thickness();
666 if (copyPadDesign.yCutout()) {
667 padDesign.yCutout = copyPadDesign.halfWidth();
668 }
669 padDesign.setR(copyPadDesign.beamlineRadius());
670 padDesign.sPadWidth = 2.*copyPadDesign.shortHalfHeight();
671 padDesign.lPadWidth = 2.*copyPadDesign.longHalfHeight();
672 padDesign.nPadColumns = copyPadDesign.numPadPhi();
673 padDesign.firstPhiPos = copyPadDesign.firstPadPhiDiv();
674 padDesign.inputPhiPitch = copyPadDesign.anglePadPhi();
675 padDesign.PadPhiShift = copyPadDesign.padPhiShift();
676 padDesign.nPadH = copyPadDesign.numPadEta();
677 padDesign.padEtaMax = copyPadDesign.maxPadEta();
678 padDesign.firstRowPos = copyPadDesign.firstPadHeight();
679 padDesign.inputRowPitch = copyPadDesign.padHeight();
680 padDesign.sectorOpeningAngle = copyPadDesign.sectorAngle();
681 padDesign.isConvertedFromPhaseII = true;
682 }
683 newRE->fillCache();
684 ATH_CHECK(dumpAndCompare(gctx, *copyMe, *newRE));
685 cacheObj.detMgr->addsTgcReadoutElement(std::move(newRE));
686
687 }
688 return StatusCode::SUCCESS;
689}
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

Define the local gasGap positions

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

Definition at line 401 of file ReadoutGeomCnvAlg.cxx.

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

◆ cardinality()

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

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

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ checkIdCompability()

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

Definition at line 802 of file ReadoutGeomCnvAlg.cxx.

803 {
804
805 if (refEle.identify() != testEle.identify()) {
806 ATH_MSG_FATAL("Two different elements are compared "
807 <<m_idHelperSvc->toString(refEle.identify())<<" vs. "
808 <<m_idHelperSvc->toString(testEle.identify()));
809 return StatusCode::FAILURE;
810 }
811 if (refEle.identHash() != testEle.detectorElementHash()) {
812 ATH_MSG_FATAL("The hashes of the two detector elements "<<m_idHelperSvc->toString(refEle.identify())
813 <<" are completely different "<<refEle.identHash()<<" vs. "<<testEle.detectorElementHash());
814 return StatusCode::FAILURE;
815 }
816 return StatusCode::SUCCESS;
817}
#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 fullPhysicalVolume of the.

Definition at line 504 of file ReadoutGeomCnvAlg.cxx.

506 {
507 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
508 cacheObj.translatedStations.insert(readOutVol->getParent());
509
510 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
511 GeoIntrusivePtr<GeoFullPhysVol> physVol{dynamic_pointer_cast<GeoFullPhysVol>(clonedVol)};
512 cacheObj.world->add(cacheObj.newIdTag());
513 cacheObj.world->add(cacheObj.makeTransform(amdbTransform(gctx, *copyMe)));
514 cacheObj.world->add(physVol);
515 return physVol;
516}

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

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

272 {
273
274 ATH_CHECK(buildStation(gctx, reId, cacheObj));
275 const std::string stName{m_idHelperSvc->stationNameString(reId)};
276 station = cacheObj.detMgr->getMuonStation(stName,
277 m_idHelperSvc->stationEta(reId),
278 m_idHelperSvc->stationPhi(reId));
279
280 PVLink copiedStationVol{station->getPhysVol()};
281 const MuonGMR4::MuonReadoutElement* copyMe = m_detMgr->getReadoutElement(reId);
282 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
283 copiedStationVol->add(cacheObj.newIdTag());
294 const Amg::Transform3D alignNodeToRE{copyMe->alignableTransform()->getDefTransform().inverse() *
295 readOutVol->getParent()->getX() * readOutVol->getX()};
296 const Amg::Transform3D alignedNode{amdbTransform(gctx, *copyMe) * alignNodeToRE.inverse()};
297
298 const Amg::Transform3D stationTrf{copiedStationVol->getX().inverse() * alignedNode};
299
300 copiedStationVol->add(cacheObj.makeTransform(stationTrf*alignNodeToRE));
302 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
303 physVol = dynamic_pointer_cast<GeoVFullPhysVol>(clonedVol);
304 copiedStationVol->add(physVol);
305 return StatusCode::SUCCESS;
306}
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

Definition at line 867 of file ReadoutGeomCnvAlg.cxx.

869 {
870
871 if (!m_checkGeo) {
872 return StatusCode::SUCCESS;
873 }
874 ATH_CHECK(checkIdCompability(refEle, testEle));
875
876 ATH_MSG_VERBOSE("Detector element "<<m_idHelperSvc->toString(refEle.identify())
877 <<std::endl<<GeoTrf::toString(amdbTransform(gctx, refEle))
878 <<std::endl<<GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform())
879 <<std::endl<<"r-size: "<<testEle.getRsize()<<"/"<<testEle.getLongRsize()
880 <<" s-size: "<<testEle.getSsize()<<"/"<<testEle.getLongSsize()
881 <<" z-size: "<<testEle.getZsize()<<"/"<<testEle.getLongZsize());
882 for (unsigned int lay = 1; lay <= refEle.numLayers(); ++lay){
883 for (unsigned int tube = 1; tube <= refEle.numTubesInLay(); ++tube) {
884 const IdentifierHash tubeHash {refEle.measurementHash(lay,tube)};
885 if (!refEle.isValid(tubeHash)) {
886 ATH_MSG_VERBOSE("SKip layer / tube "<<lay <<","<<tube);
887 continue;
888 }
889 const Amg::Transform3D globToLocal = refEle.globalToLocalTrans(gctx, tubeHash);
890
891 const Amg::Vector3D refPos = refEle.globalTubePos(gctx, tubeHash);
892 const Amg::Vector3D tubePos = testEle.tubePos(lay, tube);
893
894
895 if ( (refPos - tubePos).mag() > Gaudi::Units::micrometer &&
896 (globToLocal*refPos - globToLocal * tubePos).perp() > Gaudi::Units::micrometer) {
897 ATH_MSG_ERROR("Tube positions differ for "<<m_idHelperSvc->toString(refEle.measurementId(tubeHash))
898 <<" reference: "<<GeoTrf::toString(globToLocal*refPos)<<" vs. test: "
899 <<GeoTrf::toString(globToLocal*tubePos) <<" delta: "<<(refPos - tubePos).mag()
900 <<" Transforms "<<std::endl
901 <<" **** "<< GeoTrf::toString(globToLocal.inverse())<<std::endl
902 <<" **** "<< GeoTrf::toString(testEle.transform(lay, tube)));
903 return StatusCode::FAILURE;
904 }
905 ATH_MSG_VERBOSE("Tube positions layer: "<<lay<<", tube: "<<tube
906 <<std::endl<<"reference: "<<GeoTrf::toString(refPos)
907 <<std::endl<<"test: "<<GeoTrf::toString(tubePos)
908 <<std::endl<<testEle.tubeLength(lay, tube)<<"/"<<testEle.getActiveTubeLength(lay, tube)<<"/"
909 <<testEle.getWireLength(lay,tube)<<" vs. "<<refEle.tubeLength(tubeHash)
910 <<"/"<<refEle.activeTubeLength(tubeHash)<<"/"<<refEle.wireLength(tubeHash)
911 <<"/"<<refEle.uncutTubeLength(tubeHash));
912 if (std::abs(testEle.getTubeLengthForCaching(lay,tube) - refEle.uncutTubeLength(tubeHash)) >
913 std::numeric_limits<float>::epsilon() ) {
914 ATH_MSG_FATAL("Different tube length's detected for "<<m_idHelperSvc->toStringDetEl(refEle.identify())
915 << " layer: "<<lay<<", tube: "<<tube<<" -- "<<testEle.getTubeLengthForCaching(lay,tube)<<" (new) vs. "
916 <<refEle.uncutTubeLength(tubeHash)<<" (ref)");
917 return StatusCode::FAILURE;
918 }
919 }
920 }
921
922 return StatusCode::SUCCESS;
923}
Scalar perp() const
perp method - perpendicular length
Scalar mag() const
mag method
#define ATH_MSG_ERROR(x)
static IdentifierHash measurementHash(unsigned int layerNumber, unsigned int tubeNumber)
Transform the layer and tube number to the measurementHash.
bool isValid(const IdentifierHash &measHash) const
Amg::Vector3D globalTubePos(const ActsTrk::GeometryContext &ctx, const Identifier &measId) const
Returns the global position of the tube center.
unsigned int numTubesInLay() const
Returns the number of tubes per layer.
double uncutTubeLength(const IdentifierHash &tubeHash) const
Returns the uncut tube length.
Identifier measurementId(const IdentifierHash &measHash) const override final
Converts the measurement hash back to the full Identifier.
unsigned int numLayers() const
Returns the number of tube layer.
Amg::Transform3D globalToLocalTrans(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
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

Definition at line 819 of file ReadoutGeomCnvAlg.cxx.

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

Definition at line 924 of file ReadoutGeomCnvAlg.cxx.

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

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

Definition at line 1062 of file ReadoutGeomCnvAlg.cxx.

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

◆ dumpAndCompare() [5/5]

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

Definition at line 985 of file ReadoutGeomCnvAlg.cxx.

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

◆ evtStore()

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

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

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

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

Prepare the Geometry context

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

Create the cache and populate it with the geoWolds

Build the chamber technologies

Finally add the passives

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

Final check that all elements are cached properly

Definition at line 86 of file ReadoutGeomCnvAlg.cxx.

86 {
87 SG::WriteCondHandle writeHandle{m_writeKey, ctx};
88 if (writeHandle.isValid()) {
89 ATH_MSG_DEBUG("The current readout geometry is still valid.");
90 return StatusCode::SUCCESS;
91 }
94 ActsTrk::GeometryContext geoContext{};
95 using TrackingAlignment = ActsTrk::DetectorAlignStore::TrackingAlignStore;
96 for (const SG::ReadCondHandleKey<ActsTrk::DetectorAlignStore>& key : m_alignStoreKeys) {
97 SG::ReadCondHandle readHandle{key, ctx};
98 if (!readHandle.isValid()) {
99 ATH_MSG_FATAL("Failed to retrieve alignment store "<<key.fullKey());
100 return StatusCode::FAILURE;
101 }
102 writeHandle.addDependency(readHandle);
103 geoContext.setStore(copyDeltas(**readHandle));
104 }
107 std::vector<ActsTrk::DetectorType> presentTechs = m_detMgr->getDetectorTypes();
108 for (const ActsTrk::DetectorType detType : presentTechs) {
109 if (geoContext.getStore(detType)) {
110 continue;
111 }
112 ATH_MSG_WARNING("No external detector alignment has been defined for technology "<<ActsTrk::to_string(detType));
113 geoContext.setStore(std::make_unique<ActsTrk::DetectorAlignStore>(detType));
114 }
116 ConstructionCache cacheObj;
117 cacheObj.detMgr = std::make_unique<MuonGM::MuonDetectorManager>();
118 cacheObj.world = createGeoWorld();
119 cacheObj.detMgr->addTreeTop(cacheObj.world);
121 ATH_CHECK(buildMdt(geoContext, cacheObj));
122 ATH_CHECK(buildTgc(geoContext, cacheObj));
123 ATH_CHECK(buildRpc(geoContext, cacheObj));
124 ATH_CHECK(buildSTGC(geoContext, cacheObj));
125 ATH_CHECK(buildMM(geoContext, cacheObj));
127 std::vector<GeoChildNodeWithTrf> treeTops = getChildrenWithRef(m_detMgr->getTreeTop(0), false);
128
130 for (const GeoChildNodeWithTrf& treeTop : treeTops) {
131 if (hasStationVolume(treeTop.volume, cacheObj.translatedStations)) {
132 continue;
133 }
134 ATH_MSG_VERBOSE("Detected passive volume "<<treeTop.nodeName);
135
136 cacheObj.world->add(const_pointer_cast(treeTop.volume));
137 }
138
140 if (m_checkGeo) {
141 const std::vector<const MuonGMR4::MuonReadoutElement*> refEles{m_detMgr->getAllReadoutElements()};
142 for (const MuonGMR4::MuonReadoutElement* refEle : refEles) {
143 ATH_CHECK(checkIdCompability(*refEle, *cacheObj.detMgr->getReadoutElement(refEle->identify())));
144 }
145 }
146 if (m_dumpGeo) {
147 ATH_MSG_DEBUG("Save geometry to SqLite file "<<m_geoDumpName);
148 GeoModelIO::IO::saveToDB(cacheObj.world, m_geoDumpName, 0 , true);
149 }
150
151 ATH_CHECK(writeHandle.record(std::move(cacheObj.detMgr)));
152 return StatusCode::SUCCESS;
153}
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
SG::WriteCondHandleKey< MuonGM::MuonDetectorManager > m_writeKey
StatusCode buildRpc(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
StatusCode buildTgc(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Gaudi::Property< bool > m_dumpGeo
StatusCode buildSTGC(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
StatusCode buildMM(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
SG::ReadCondHandleKeyArray< ActsTrk::DetectorAlignStore > m_alignStoreKeys
void addDependency(const EventIDRange &range)
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
std::string to_string(const DetectorType &type)
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.
std::unique_ptr< ActsTrk::DetectorAlignStore > copyDeltas(const ActsTrk::DetectorAlignStore &inStore)
Copy the alignment deltas from the inStore to a new alignment store.
std::unique_ptr< MuonGM::MuonDetectorManager > detMgr
Pointer to the legacy MuonDetectorManager.

◆ extraDeps_update_handler()

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

Add StoreName to extra input/output deps as needed.

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

◆ extraOutputDeps()

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

Return the list of extra output dependencies.

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

Definition at line 94 of file AthCommonReentrantAlgorithm.cxx.

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

◆ filterPassed()

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

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

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

◆ initialize()

StatusCode MuonGMR4::ReadoutGeomCnvAlg::initialize ( )
override

Definition at line 77 of file ReadoutGeomCnvAlg.cxx.

77 {
78 ATH_CHECK(m_idHelperSvc.retrieve());
79 ATH_CHECK(m_writeKey.initialize());
80 ATH_CHECK(m_alignStoreKeys.initialize());
82 return StatusCode::SUCCESS;
83}
const ServiceHandle< StoreGateSvc > & detStore() const
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ inputHandles()

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

Return this algorithm's input handles.

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

◆ isClonable()

◆ isReEntrant()

virtual bool AthCondAlgorithm::isReEntrant ( ) const
inlineoverridevirtualinherited

Avoid scheduling algorithm multiple times.

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

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

See also
ATEAM-836

Definition at line 39 of file AthCondAlgorithm.h.

39{ return false; }

◆ msg()

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

Definition at line 24 of file AthCommonMsg.h.

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

◆ msgLvl()

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

Definition at line 30 of file AthCommonMsg.h.

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

◆ outputHandles()

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

Return this algorithm's output handles.

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

◆ renounce()

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

Definition at line 380 of file AthCommonDataStore.h.

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

◆ renounceArray()

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

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

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

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

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

◆ sysExecute()

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

Execute an algorithm.

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

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

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

◆ sysInitialize()

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

Override sysInitialize.

Override sysInitialize from the base class.

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

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

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

Reimplemented in HypoBase, and InputMakerBase.

Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.

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

◆ sysStart()

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

Handle START transition.

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

◆ updateVHKA()

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

Definition at line 308 of file AthCommonDataStore.h.

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

Member Data Documentation

◆ m_alignStoreKeys

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

Definition at line 123 of file ReadoutGeomCnvAlg.h.

123{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 125 of file ReadoutGeomCnvAlg.h.

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

◆ m_detMgr

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

Definition at line 128 of file ReadoutGeomCnvAlg.h.

128{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 126 of file ReadoutGeomCnvAlg.h.

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

◆ m_evtStore

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

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

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

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

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_geoDumpName

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

Definition at line 127 of file ReadoutGeomCnvAlg.h.

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

◆ m_idHelperSvc

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

Definition at line 119 of file ReadoutGeomCnvAlg.h.

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

◆ 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 121 of file ReadoutGeomCnvAlg.h.

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

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