 |
ATLAS Offline Software
|
#include <ReadoutGeomCnvAlg.h>
|
| ~ReadoutGeomCnvAlg ()=default |
|
StatusCode | execute (const EventContext &ctx) const override |
|
StatusCode | initialize () override |
|
bool | isReEntrant () const override |
|
virtual StatusCode | sysInitialize () override |
| Override sysInitialize. More...
|
|
virtual bool | isClonable () const override |
| Specify if the algorithm is clonable. More...
|
|
virtual unsigned int | cardinality () const override |
| Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant. More...
|
|
virtual StatusCode | sysExecute (const EventContext &ctx) override |
| Execute an algorithm. More...
|
|
virtual const DataObjIDColl & | extraOutputDeps () const override |
| Return the list of extra output dependencies. More...
|
|
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 . More...
|
|
const ServiceHandle< StoreGateSvc > & | evtStore () const |
| The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
const ServiceHandle< StoreGateSvc > & | detStore () const |
| The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
virtual StatusCode | sysStart () override |
| Handle START transition. More...
|
|
virtual std::vector< Gaudi::DataHandle * > | inputHandles () const override |
| Return this algorithm's input handles. More...
|
|
virtual std::vector< Gaudi::DataHandle * > | outputHandles () const override |
| Return this algorithm's output handles. More...
|
|
Gaudi::Details::PropertyBase & | declareProperty (Gaudi::Property< T, V, H > &t) |
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleKey &hndl, const std::string &doc, const SG::VarHandleKeyType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleBase &hndl, const std::string &doc, const SG::VarHandleType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleKeyArray &hndArr, const std::string &doc, const SG::VarHandleKeyArrayType &) |
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, T &property, const std::string &doc, const SG::NotHandleType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, T &property, const std::string &doc="none") |
| Declare a new Gaudi property. More...
|
|
void | updateVHKA (Gaudi::Details::PropertyBase &) |
|
MsgStream & | msg () const |
|
MsgStream & | msg (const MSG::Level lvl) const |
|
bool | msgLvl (const MSG::Level lvl) const |
|
|
StatusCode | buildStation (const ActsGeometryContext &gctx, const Identifier &stationId, ConstructionCache &cacheObj) const |
| builds a station object from readout element. More...
|
|
StatusCode | cloneReadoutVolume (const ActsGeometryContext &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. More...
|
|
GeoIntrusivePtr< GeoVFullPhysVol > | cloneNswWedge (const ActsGeometryContext &gctx, const MuonGMR4::MuonReadoutElement *nswRE, ConstructionCache &cacheObj) const |
| Clones the fullPhysicalVolume of the
More...
|
|
StatusCode | buildMdt (const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const |
|
StatusCode | buildRpc (const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const |
|
StatusCode | buildSTGC (const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const |
|
StatusCode | buildMM (const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const |
|
StatusCode | buildTgc (const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const |
|
StatusCode | dumpAndCompare (const ActsGeometryContext &gctx, const MuonGMR4::RpcReadoutElement &refEle, const MuonGM::RpcReadoutElement &testEle) const |
|
StatusCode | dumpAndCompare (const ActsGeometryContext &gctx, const MuonGMR4::MdtReadoutElement &refEle, const MuonGM::MdtReadoutElement &testEle) const |
|
StatusCode | dumpAndCompare (const ActsGeometryContext &gctx, const MuonGMR4::MmReadoutElement &refEle, const MuonGM::MMReadoutElement &testEle) const |
|
StatusCode | dumpAndCompare (const ActsGeometryContext &gctx, const MuonGMR4::TgcReadoutElement &refEle, const MuonGM::TgcReadoutElement &testEle) const |
|
StatusCode | dumpAndCompare (const ActsGeometryContext &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> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyArrayType &) |
| specialization for handling Gaudi::Property<SG::VarHandleKeyArray> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleType &) |
| specialization for handling Gaudi::Property<SG::VarHandleBase> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T, V, H > &t, const SG::NotHandleType &) |
| specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray> More...
|
|
|
ServiceHandle< Muon::IMuonIdHelperSvc > | m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"} |
|
SG::WriteCondHandleKey< MuonGM::MuonDetectorManager > | m_writeKey {this, "WriteKey", "MuonDetectorManager"} |
|
SG::ReadCondHandleKeyArray< ActsTrk::DetectorAlignStore > | m_alignStoreKeys {this, "AlignmentKeys", {}, "Alignment key"} |
|
Gaudi::Property< bool > | m_checkGeo {this, "checkGeo", false, "Checks the positions of the sensors"} |
|
const MuonGMR4::MuonDetectorManager * | m_detMgr {nullptr} |
|
DataObjIDColl | m_extendedExtraObjects |
| Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks. More...
|
|
StoreGateSvc_t | m_evtStore |
| Pointer to StoreGate (event store by default) More...
|
|
StoreGateSvc_t | m_detStore |
| Pointer to StoreGate (detector store by default) More...
|
|
std::vector< SG::VarHandleKeyArray * > | m_vhka |
|
bool | m_varHandleArraysDeclared |
|
Definition at line 32 of file ReadoutGeomCnvAlg.h.
◆ StoreGateSvc_t
◆ ~ReadoutGeomCnvAlg()
MuonGMR4::ReadoutGeomCnvAlg::~ReadoutGeomCnvAlg |
( |
| ) |
|
|
default |
◆ buildMdt()
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 657 of file ReadoutGeomCnvAlg.cxx.
661 static_cast<const MdtAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
663 const std::vector<const MuonGMR4::MdtReadoutElement*> mdtReadOuts{
m_detMgr->getAllMdtReadoutElements()};
664 ATH_MSG_INFO(
"Copy "<<mdtReadOuts.size()<<
" Mdt readout elements to the legacy system");
669 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
672 if (copyMe->multilayer() == 1) {
675 (copyMe->tubePitch() - 2. * copyMe->tubeRadius());
678 modHalfThick{-0.5*copyMe->moduleThickness()};
680 const double thickness = ( (otherRE->
asBuiltRefFrame()*(modHalTHickO* Amg::Vector3D::UnitX())) -
681 (copyMe->asBuiltRefFrame()*(modHalfThick* Amg::Vector3D::UnitX()))).
z();
682 if (copyMe->isBarrel()) {
683 station->setMdtZsize(height);
684 station->setMdtRsize(thickness);
686 station->setMdtRsize(height);
687 station->setMdtZsize(thickness);
691 auto newElement = std::make_unique<MuonGM::MdtReadoutElement>(physVol,
693 cacheObj.detMgr.get());
694 newElement->setIdentifier(reId);
695 newElement->setMultilayer(copyMe->multilayer());
696 newElement->setNMdtInStation(
m_idHelperSvc->mdtIdHelper().multilayerMax(reId));
698 newElement->setParentMuonStation(station);
703 newElement->setLongRsize(2*
pars.halfY);
704 newElement->setRsize(2*
pars.halfY);
705 newElement->setZsize(2*
pars.halfHeight);
706 newElement->setLongZsize(2*
pars.halfHeight);
708 newElement->m_nlayers = copyMe->numLayers();
709 newElement->m_ntubesperlayer = copyMe->numTubesInLay();
710 newElement->m_deadlength =
pars.deadLength;
711 newElement->m_endpluglength =
pars.endPlugLength;
712 newElement->m_innerRadius =
pars.tubeInnerRad;
713 newElement->m_tubeWallThickness =
pars.tubeWall;
714 newElement->m_tubepitch =
pars.tubePitch;
720 unsigned int step{1};
721 double lastLength{2.*tubeLay.uncutHalfLength(1)};
722 for (
unsigned tube = 0;
tube < copyMe->numTubesInLay(); ++
tube) {
723 const double currLength = 2.*tubeLay.uncutHalfLength(
tube);
725 if (std::abs(lastLength - currLength) > std::numeric_limits<float>::epsilon() ||
726 tube == copyMe->numTubesInLay() -1) {
727 newElement->m_tubelength[
step-1] = lastLength;
728 newElement->m_tubelength[
step] = currLength;
730 newElement->m_ntubesinastep =
tube;
732 lastLength = currLength;
736 newElement->m_nsteps =
step;
739 double xOffSet{
pars.halfY}, yOffSet{
pars.halfHeight};
740 if (newElement->barrel())
std::swap(xOffSet, yOffSet);
741 for (
unsigned lay = 1; lay <= copyMe->numLayers(); ++lay) {
743 const Amg::Vector3D locTube = copyMe->localTubePos(tubeHash);
744 newElement->m_firstwire_x[lay-1] = locTube.z() + xOffSet;
745 newElement->m_firstwire_y[lay-1] = locTube.x() + yOffSet;
750 if (!station->hasMdtAsBuiltParams()){
751 station->setMdtAsBuiltParams(distort.
asBuilt);
753 if (!station->hasBLines()){
754 station->setBline(distort.
bLine);
756 const Amg::Vector3D refPoint = copyMe->bLineReferencePoint();
757 station->setBlineFixedPointInAmdbLRS(refPoint.x(), refPoint.y(), refPoint.z());
759 newElement->geoInitDone();
760 newElement->setBLinePar(distort.
bLine);
761 newElement->fillCache();
764 cacheObj.detMgr->addMdtReadoutElement(std::move(newElement));
766 return StatusCode::SUCCESS;
◆ buildMM()
Loop over the gas gaps & efine the
Definition at line 486 of file ReadoutGeomCnvAlg.cxx.
489 const auto alignStore = alignItr ?
490 static_cast<const MmAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
493 cacheObj.detMgr->setMMPassivation(alignStore->passivation);
495 const std::vector<const MuonGMR4::MmReadoutElement*> mmReadouts{
m_detMgr->getAllMmReadoutElements()};
496 ATH_MSG_INFO(
"Copy "<<mmReadouts.size()<<
" Mm readout elements to the legacy system");
500 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, copyMe, cacheObj)};
501 auto newRE = std::make_unique<MuonGM::MMReadoutElement>(physVol,
503 copyMe->stationEta(),
504 copyMe->stationPhi(),
505 copyMe->multilayer(), cacheObj.detMgr.get());
511 newRE->m_Xlg[
gasGap] = stripLayer.toOrigin() *
518 designFrom.longHalfHeight(),
519 designFrom.halfWidth(),
520 designFrom.stereoAngle());
523 designTo.inputPitch = designFrom.stripPitch();
524 designTo.inputWidth = designTo.inputPitch *
std::cos(designTo.stereoAngle());
525 designTo.nMissedBottomEta = designTo.nMissedBottomStereo = designFrom.firstStripNumber() - 1;
526 designTo.totalStrips = designFrom.numStrips();
527 designTo.nch = designFrom.numStrips();
529 designTo.setFirstPos(designFrom.firstStripPos().x() + 0.5*designTo.inputPitch);
533 if (alignStore && alignStore->getBLine(reId)) {
534 newRE->setBLinePar(*alignStore->getBLine(reId));
537 cacheObj.detMgr->addMMReadoutElement(std::move(newRE));
539 return StatusCode::SUCCESS;
◆ buildRpc()
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 281 of file ReadoutGeomCnvAlg.cxx.
283 const std::vector<const MuonGMR4::RpcReadoutElement*> readoutEles =
m_detMgr->getAllRpcReadoutElements();
284 ATH_MSG_INFO(
"Copy "<<readoutEles.size()<<
" Rpc readout elements to the legacy system");
289 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
292 auto newElement = std::make_unique<MuonGM::RpcReadoutElement>(physVol,
294 1, 1,
false, cacheObj.detMgr.get());
295 const bool aSide{copyMe->stationEta() > 0};
296 newElement->setDoubletPhi(copyMe->doubletPhi());
297 newElement->setDoubletR(copyMe->doubletR());
298 newElement->setDoubletZ(copyMe->doubletZ());
299 newElement->setIdentifier(reId);
300 newElement->setParentMuonStation(station);
301 station->addMuonReadoutElementWithAlTransf(newElement.get(),
nullptr, station->nMuonReadoutElements());
304 newElement->setLongZsize(2.*
pars.halfLength);
305 newElement->setLongSsize(2.*
pars.halfWidth);
306 newElement->setLongRsize(2.*
pars.halfThickness);
307 newElement->setZsize(2.*
pars.halfLength);
308 newElement->setSsize(2.*
pars.halfWidth);
309 newElement->setRsize(2.*
pars.halfThickness);
311 newElement->m_nlayers = copyMe->nGasGaps();
312 newElement->m_phistripwidth = copyMe->stripPhiWidth();
313 newElement->m_etastripwidth = copyMe->stripEtaWidth();
314 newElement->m_phistrippitch = copyMe->stripPhiPitch();
315 newElement->m_etastrippitch = (aSide > 0 ? 1. : -1.) *copyMe->stripEtaPitch();
316 newElement->m_phistriplength = copyMe->stripPhiLength();
317 newElement->m_etastriplength = copyMe->stripEtaLength();
319 newElement->m_nphistripsperpanel = copyMe->nPhiStrips();
320 newElement->m_netastripsperpanel = copyMe->nEtaStrips();
321 newElement->m_nphistrippanels = copyMe->nPhiPanels();
322 newElement->m_hasDEDontop =
true;
323 newElement->m_descratzneg =
false;
325 std::vector<Identifier> gapIds{};
327 for (
int doubPhi = copyMe->doubletPhiMax(); doubPhi >= copyMe->doubletPhi(); --doubPhi) {
328 for (
bool measPhi : {
false,
true}) {
329 if (measPhi && copyMe->nPhiStrips()==0)
continue;
331 const Identifier gapId = idHelper.channelID(copyMe->identify(),
336 gapIds.push_back(gapId);
337 const Amg::Vector3D locStripPos = copyMe->globalToLocalTrans(gctx) * copyMe->stripPosition(gctx, gapId);
339 newElement->m_gasGap_xPos[
gasGap -1] = locStripPos.x();
342 const int dbPIdx = copyMe->doubletPhi() == 2 ? 1 : doubPhi;
344 newElement->m_first_phistrip_s[dbPIdx -1] = locStripPos.y();
345 newElement->m_phistrip_z = locStripPos.z();
347 newElement->m_first_etastrip_z = locStripPos.z();
348 newElement->m_etastrip_s[dbPIdx-1] = locStripPos.y();
353 newElement->fillCache();
356 const int surfaceHash = newElement->surfaceHash(gapId);
357 const int layerHash = newElement->layerHash(gapId);
359 newElement->m_surfaceData->m_layerTransforms[surfaceHash] = refTrf;
360 newElement->m_surfaceData->m_layerCenters[layerHash] = refTrf.translation();
361 newElement->m_surfaceData->m_layerNormals[layerHash] = refTrf.linear() * Amg::Vector3D::UnitZ();
364 cacheObj.detMgr->addRpcReadoutElement(std::move(newElement));
366 return StatusCode::SUCCESS;
◆ buildStation()
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
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
To create the muon station, we need to extract the dimensions --> Recieve the edge points from the shapes
Transformation to reach from the alignable point to the Muon station
Skip the full physical volumes as they represent the readout elements
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 145 of file ReadoutGeomCnvAlg.cxx.
153 ATH_MSG_DEBUG(
"Station "<<
stName<<
", stEta: "<<stEta<<
", stPhi: "<<stPhi<<
" already exists.");
154 return StatusCode::SUCCESS;
160 const GeoVFullPhysVol* readOutVol = copyMe->getMaterialGeom();
161 PVConstLink parentVolume = readOutVol->getParent();
162 cacheObj.translatedStations.insert(parentVolume);
164 PVLink parentPhysVol{make_intrusive<GeoFullPhysVol>(parentVolume->getLogVol())};
168 const std::vector<GeoChildNodeWithTrf>
children = getChildrenWithRef(parentVolume,
false);
169 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};
170 for (
const GeoChildNodeWithTrf& child :
children) {
171 std::vector<Amg::Vector3D> edges = getPolyShapeEdges(child.volume->getLogVol()->getShape(),
172 readOutVol->getX().inverse() * child.transform);
189 const double shortS = (maxY1 - minY1);
190 const double longS = (maxY2 - minY2);
191 const double lengthR = (maxX - minX);
192 const double lengthZ = (maxZ - minZ);
196 const Amg::Transform3D stationTransform = alignTrf->getDefTransform().inverse()*parentVolume->getX();
198 for (
const GeoChildNodeWithTrf& child :
children) {
200 const GeoVPhysVol &childVolRef = *child.volume;
201 if (
typeid(childVolRef) ==
typeid(GeoFullPhysVol)) {
205 PVLink childVol = const_pointer_cast<GeoVPhysVol>(child.volume);
206 parentPhysVol->add(cacheObj.newIdTag());
207 parentPhysVol->add(cacheObj.makeTransform(stationTransform*child.transform));
208 parentPhysVol->add(cloneVolume(childVol));
212 (stationTransform * readOutVol->getX()).inverse();
215 <<
" -- shortS: "<<shortS<<
", longS: "<<longS
216 <<
", lengthR: "<<lengthR<<
", lengthZ: "<<lengthZ
218 <<std::endl<<
"Station transform: "<<
GeoTrf::toString(stationTransform,
true)
219 <<std::endl<<
"Readout transform: "<<
GeoTrf::toString(readOutVol->getX(),
true));
220 auto newStation = std::make_unique<MuonGM::MuonStation>(
stName,
221 shortS, lengthR, lengthZ,
222 longS, lengthR, lengthZ,
223 stEta, stPhi,
false);
224 newStation->setPhysVol(parentPhysVol);
226 cacheObj.world->add(cacheObj.newIdTag());
227 GeoIntrusivePtr<GeoAlignableTransform>
trf = make_intrusive<GeoAlignableTransform>(alignedTransform);
228 newStation->setTransform(
trf);
230 newStation->setNominalAmdbLRSToGlobal(
trf->getTransform());
232 cacheObj.detMgr->addMuonStation(std::move(newStation));
234 cacheObj.world->add(
trf);
235 cacheObj.world->add(parentPhysVol);
237 return StatusCode::SUCCESS;
◆ buildSTGC()
Initialize the eta design
Initialize the phi design
To circumvent the yCutout calculations in padCorner function in MuonPadDesign
Definition at line 542 of file ReadoutGeomCnvAlg.cxx.
544 auto alignStore = alignItr ?
static_cast<const sTgcAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
546 const std::vector<const MuonGMR4::sTgcReadoutElement*> sTgcReadOuts{
m_detMgr->getAllsTgcReadoutElements()};
547 ATH_MSG_INFO(
"Copy "<<sTgcReadOuts.size()<<
" sTgc readout elements to the legacy system");
552 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, copyMe, cacheObj)};
554 auto newRE = std::make_unique<MuonGM::sTgcReadoutElement>(physVol,
556 copyMe->stationEta(),
557 copyMe->stationPhi(),
558 copyMe->multilayer(),
559 cacheObj.detMgr.get());
561 if (alignStore && alignStore->getBLine(reId)) {
562 newRE->setBLinePar(*alignStore->getBLine(reId));
575 ChannelDesign& etaDesign{newRE->m_etaDesign[
layer-1]};
576 etaDesign.type = ChannelDesign::ChannelType::etaStrip;
578 if (copyEtaDesign.yCutout()) {
579 etaDesign.defineDiamond(copyEtaDesign.shortHalfHeight(),
580 copyEtaDesign.longHalfHeight(),
581 copyEtaDesign.halfWidth(),
582 copyEtaDesign.yCutout());
584 etaDesign.defineTrapezoid(copyEtaDesign.shortHalfHeight(),
585 copyEtaDesign.longHalfHeight(),
586 copyEtaDesign.halfWidth());
589 etaDesign.firstPitch = copyEtaDesign.firstStripPos().x() + 0.5*copyEtaDesign.stripPitch() + copyEtaDesign.halfWidth();
590 etaDesign.inputPitch = copyEtaDesign.stripPitch();
591 etaDesign.inputWidth = copyEtaDesign.stripWidth();
592 etaDesign.nch = copyEtaDesign.numStrips();
594 etaDesign.setFirstPos(copyEtaDesign.firstStripPos().x() + 0.5*copyEtaDesign.stripPitch());
599 ChannelDesign& phiDesign{newRE->m_phiDesign[
layer-1]};
600 phiDesign.type = ChannelDesign::ChannelType::phiStrip;
602 if (copyPhiDesign.yCutout() == 0.) {
603 phiDesign.defineTrapezoid(copyPhiDesign.shortHalfHeight(),
604 copyPhiDesign.longHalfHeight(),
605 copyPhiDesign.halfWidth());
607 phiDesign.defineDiamond(copyPhiDesign.shortHalfHeight(),
608 copyPhiDesign.longHalfHeight(),
609 copyPhiDesign.halfWidth(),
610 copyPhiDesign.yCutout());
612 phiDesign.inputPitch = copyPhiDesign.stripPitch();
613 phiDesign.inputWidth = copyPhiDesign.stripWidth();
615 phiDesign.setFirstPos(copyPhiDesign.firstStripPos().x());
616 phiDesign.firstPitch = copyPhiDesign.numWiresInGroup(1);
617 phiDesign.groupWidth = copyPhiDesign.numWiresInGroup(2);
618 phiDesign.nGroups = copyPhiDesign.numStrips();
619 phiDesign.wireCutout = copyPhiDesign.wireCutout();
620 phiDesign.nch = copyPhiDesign.nAllWires();
621 phiDesign.isConvertedFromPhaseII =
true;
625 padDesign.
Length = copyMe->chamberHeight();
626 padDesign.sWidth = copyMe->sChamberLength();
627 padDesign.lWidth = copyMe->lChamberLength();
628 padDesign.Size = 2.*copyPadDesign.halfWidth();
629 padDesign.ysFrame = copyMe->sFrameWidth();
630 padDesign.ylFrame = copyMe->lFrameWidth();
631 padDesign.thickness = copyMe->thickness();
633 if (copyPadDesign.yCutout()) {
634 padDesign.yCutout = copyPadDesign.halfWidth();
636 padDesign.setR(copyPadDesign.beamlineRadius());
637 padDesign.sPadWidth = 2.*copyPadDesign.shortHalfHeight();
638 padDesign.lPadWidth = 2.*copyPadDesign.longHalfHeight();
639 padDesign.nPadColumns = copyPadDesign.numPadPhi();
640 padDesign.firstPhiPos = copyPadDesign.firstPadPhiDiv();
641 padDesign.inputPhiPitch = copyPadDesign.anglePadPhi();
642 padDesign.PadPhiShift = copyPadDesign.padPhiShift();
643 padDesign.nPadH = copyPadDesign.numPadEta();
644 padDesign.padEtaMax = copyPadDesign.maxPadEta();
645 padDesign.firstRowPos = copyPadDesign.firstPadHeight();
646 padDesign.inputRowPitch = copyPadDesign.padHeight();
647 padDesign.sectorOpeningAngle = copyPadDesign.sectorAngle();
648 padDesign.isConvertedFromPhaseII =
true;
652 cacheObj.detMgr->addsTgcReadoutElement(std::move(newRE));
655 return StatusCode::SUCCESS;
◆ buildTgc()
Define the local gasGap positions
In the sector frame, the gasGap is oriented along the x-axis
Definition at line 370 of file ReadoutGeomCnvAlg.cxx.
372 std::vector<const MuonGMR4::TgcReadoutElement*> tgcReadouts{
m_detMgr->getAllTgcReadoutElements()};
374 return a->stationEta() >
b->stationEta();
376 ATH_MSG_INFO(
"Copy "<<tgcReadouts.size()<<
" Tgc readout elements to the legacy system");
380 std::map<std::string, std::shared_ptr<TgcReadoutParams>> readoutParMap{};
384 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
388 auto newRE = std::make_unique<MuonGM::TgcReadoutElement>(physVol,
m_idHelperSvc->stationNameString(reId),
389 cacheObj.detMgr.get());
390 newRE->setIdentifier(reId);
391 newRE->setParentMuonStation(station);
393 std::shared_ptr<TgcReadoutParams>& readOutPars = readoutParMap[
std::format(
"{:}_{:}", copyMe->chamberDesign(),
394 copyMe->stationEta()> 0?
'A' :
'C')];
400 std::array<WiregangArray, 3> wires{};
402 std::vector<StripArray> botMountings(copyMe->nGasGaps()),
403 topMountings(copyMe->nGasGaps());
405 double wirePitch{0.};
409 nWireGangs[
gasGap -1] = copyMe->numWireGangs(gangHash);
412 <<
" for gas gap "<<
gasGap);
414 if (nWireGangs[
gasGap -1]) {
418 for (
int gang = 1; gang <= design.numStrips(); ++gang) {
419 fillMe[gang -1] = design.numWiresInGroup(gang);
427 botMountings[
gasGap-1][
strip-1] = - design.stripLeftBottom(strip).x();
428 topMountings[
gasGap-1][
strip-1] = - design.stripLeftTop(strip).x();
430 botMountings[
gasGap-1][nCh] = - design.stripRightBottom(nCh).x();
431 topMountings[
gasGap-1][nCh] = - design.stripRightTop(nCh).x();
432 ATH_MSG_VERBOSE(
"Strip layout\n bottom: "<<botMountings<<
"\n top: "<<topMountings);
435 readOutPars = std::make_unique<TgcReadoutParams>(copyMe->chamberDesign(),
437 idHelper.stationPhiMax(reId),
438 std::move(nWireGangs),
443 std::move(botMountings),
444 std::move(topMountings),
452 const Amg::Vector3D translation{copyMe->globalToLocalTrans(gctx) * copyMe->center(gctx, layHash)};
453 newRE->setPlaneZ(translation.x(),
gasGap);
455 newRE->setRsize(copyMe->moduleHeight());
456 newRE->setSsize(copyMe->moduleWidthS());
457 newRE->setZsize(copyMe->moduleThickness());
459 newRE->setLongRsize(copyMe->moduleHeight());
460 newRE->setLongSsize(copyMe->moduleWidthL());
461 newRE->setLongZsize(copyMe->moduleThickness());
463 newRE->setReadOutParams(readOutPars);
466 cacheObj.detMgr->addTgcReadoutElement(std::move(newRE));
469 return StatusCode::SUCCESS;
◆ cardinality()
Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
Override this to return 0 for reentrant algorithms.
Override this to return 0 for reentrant algorithms.
Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.
◆ checkIdCompability()
Definition at line 769 of file ReadoutGeomCnvAlg.cxx.
776 return StatusCode::FAILURE;
781 return StatusCode::FAILURE;
783 return StatusCode::SUCCESS;
◆ cloneNswWedge()
Clones the fullPhysicalVolume of the
Definition at line 473 of file ReadoutGeomCnvAlg.cxx.
476 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
477 cacheObj.translatedStations.insert(readOutVol->getParent());
479 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
480 GeoIntrusivePtr<GeoFullPhysVol> physVol{dynamic_pointer_cast<GeoFullPhysVol>(clonedVol)};
481 cacheObj.world->add(cacheObj.newIdTag());
482 cacheObj.world->add(cacheObj.makeTransform(copyMe->localToGlobalTrans(gctx)));
483 cacheObj.world->add(physVol);
◆ cloneReadoutVolume()
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 241 of file ReadoutGeomCnvAlg.cxx.
249 station = cacheObj.detMgr->getMuonStation(
stName,
255 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
256 parentPhysVol->add(cacheObj.newIdTag());
268 readOutVol->getParent()->getX() * readOutVol->getX()};
273 parentPhysVol->add(cacheObj.makeTransform(stationTrf*alignNodeToRE));
275 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
276 physVol = dynamic_pointer_cast<GeoVFullPhysVol>(clonedVol);
277 parentPhysVol->add(physVol);
278 return StatusCode::SUCCESS;
◆ declareGaudiProperty() [1/4]
specialization for handling Gaudi::Property<SG::VarHandleKeyArray>
Definition at line 170 of file AthCommonDataStore.h.
175 hndl.documentation());
◆ declareGaudiProperty() [2/4]
specialization for handling Gaudi::Property<SG::VarHandleKey>
Definition at line 156 of file AthCommonDataStore.h.
161 hndl.documentation());
◆ declareGaudiProperty() [3/4]
specialization for handling Gaudi::Property<SG::VarHandleBase>
Definition at line 184 of file AthCommonDataStore.h.
189 hndl.documentation());
◆ declareGaudiProperty() [4/4]
◆ declareProperty() [1/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
hndl | Object holding the property value. |
doc | Documentation string for the property. |
This is the version for types that derive from SG::VarHandleBase
. The property value object is put on the input and output lists as appropriate; then we forward to the base class.
Definition at line 245 of file AthCommonDataStore.h.
250 this->declare(hndl.
vhKey());
251 hndl.
vhKey().setOwner(
this);
◆ declareProperty() [2/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
hndl | Object holding the property value. |
doc | Documentation string for the property. |
This is the version for types that derive from SG::VarHandleKey
. The property value object is put on the input and output lists as appropriate; then we forward to the base class.
Definition at line 221 of file AthCommonDataStore.h.
◆ declareProperty() [3/6]
◆ declareProperty() [4/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
property | Object holding the property value. |
doc | Documentation string for the property. |
This is the generic version, for types that do not derive from SG::VarHandleKey
. It just forwards to the base class version of declareProperty
.
Definition at line 333 of file AthCommonDataStore.h.
◆ declareProperty() [5/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
property | Object holding the property value. |
doc | Documentation string for the property. |
This dispatches to either the generic declareProperty
or the one for VarHandle/Key/KeyArray.
Definition at line 352 of file AthCommonDataStore.h.
◆ declareProperty() [6/6]
◆ detStore()
◆ dumpAndCompare() [1/5]
Definition at line 834 of file ReadoutGeomCnvAlg.cxx.
839 return StatusCode::SUCCESS;
845 <<std::endl<<
GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform())
849 for (
unsigned int lay = 1; lay <= refEle.
numLayers(); ++lay){
852 if (!refEle.
isValid(tubeHash)) {
866 <<
GeoTrf::toString(globToLocal*tubePos) <<
" delta: "<<(refPos - tubePos).mag()
867 <<
" Transforms "<<std::endl
870 return StatusCode::FAILURE;
880 std::numeric_limits<float>::epsilon() ) {
884 return StatusCode::FAILURE;
889 return StatusCode::SUCCESS;
◆ dumpAndCompare() [2/5]
Definition at line 786 of file ReadoutGeomCnvAlg.cxx.
791 return StatusCode::SUCCESS;
807 return StatusCode::FAILURE;
811 for (
int strip = stripDesign.firstStripNumber(); strip <= stripDesign.numStrips(); ++strip) {
819 return StatusCode::FAILURE;
821 const double dist = refStripDir.dot(refStripPos - testStripPos);
826 return StatusCode::FAILURE;
831 return StatusCode::SUCCESS;
◆ dumpAndCompare() [3/5]
Definition at line 891 of file ReadoutGeomCnvAlg.cxx.
896 return StatusCode::SUCCESS;
907 for (
bool measPhi : {
false,
true}) {
908 if (measPhi && !refEle.
nPhiStrips())
continue;
912 doubPhi,
gasGap, measPhi, strip);
921 return StatusCode::FAILURE;
934 if ((refStripPos - testStripPos).
mag() > 2
e-4){
937 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refStripPos)
938 <<
" test: "<<
Amg::toString(refTrans.inverse()*testStripPos));
939 return StatusCode::FAILURE;
943 <<
", local: "<<
Amg::toString(refTrans.inverse()*refStripPos));
948 return StatusCode::SUCCESS;
◆ dumpAndCompare() [4/5]
wireGroup center is defined to be half a wire pitch off in R4 compared to R3 convention
Definition at line 1025 of file ReadoutGeomCnvAlg.cxx.
1029 return StatusCode::SUCCESS;
1038 for (
int chType : {sTgcIdHelper::sTgcChannelTypes::Pad , sTgcIdHelper::sTgcChannelTypes::Strip, sTgcIdHelper::sTgcChannelTypes::Wire}) {
1042 const unsigned int numChannel = refEle.
numChannels(layID);
1043 constexpr
unsigned firstCh = 1;
1047 if(
chType == sTgcIdHelper::sTgcChannelTypes::Pad) {
1050 chID = idHelper.padID(refEle.
identify(),
1054 chID = idHelper.channelID(refEle.
identify(),
1066 || (testTrans.inverse()*refTrans).translation().perp() > std::numeric_limits<float>::epsilon() ) ) {
1070 return StatusCode::FAILURE;
1072 if (
chType == sTgcIdHelper::sTgcChannelTypes::Pad) {
1078 const std::array<Amg::Vector3D,4> refPadCorners = refEle.
globalPadCorners(gctx, chID);
1079 std::array<Amg::Vector3D,4> testPadCorners{make_array<Amg::Vector3D, 4>(
Amg::Vector3D::Zero())};
1081 for (
unsigned int cornerIdx = 0; cornerIdx < refPadCorners.size(); ++cornerIdx) {
1082 const double padCornerDiff = (refPadCorners[cornerIdx] - testPadCorners[cornerIdx]).
mag();
1086 <<
" difference: " << padCornerDiff
1087 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refPadCorners[cornerIdx])
1088 <<
" test: "<<
Amg::toString(testPadTrans.inverse()*testPadCorners[cornerIdx]));
1089 return StatusCode::FAILURE;
1092 const double padChannelDiff = (refChannelPos - testChannelPos).
mag();
1096 <<
" difference: " << padChannelDiff
1097 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refChannelPos)
1098 <<
" test: "<<
Amg::toString(testPadTrans.inverse()*testChannelPos));
1099 return StatusCode::FAILURE;
1104 else if (
chType == sTgcIdHelper::sTgcChannelTypes::Strip){
1111 <<
" local coordinates -- ref: "<<
Amg::toString(testTrans.inverse()*refChannelPos)
1112 <<
" test: "<<
Amg::toString(testTrans.inverse()*testChannelPos));
1113 return StatusCode::FAILURE;
1121 Amg::Vector3D localRefPos {testTrans.inverse()*refChannelPos};
1122 Amg::Vector3D localTestPos{testTrans.inverse()*testChannelPos};
1128 <<
" local coordinates -- ref: "<<
Amg::toString(testTrans.inverse()*refChannelPos)
1129 <<
" test: "<<
Amg::toString(testTrans.inverse()*testChannelPos)
1130 <<
"delta X: "<<std::abs(localRefPos.x() -localTestPos.x())
1131 <<
", delta Z: "<<std::abs(localRefPos.z() -localTestPos.z()));
1132 return StatusCode::FAILURE;
1138 return StatusCode::SUCCESS;
◆ dumpAndCompare() [5/5]
Definition at line 950 of file ReadoutGeomCnvAlg.cxx.
955 return StatusCode::SUCCESS;
963 <<std::endl<<
GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform(),
true)
969 for (
bool isStrip : {
false,
true}) {
981 <<
" are not identical. ");
982 return StatusCode::FAILURE;
993 if ((refChannel - testChannel).
mag() < std::numeric_limits<float>::epsilon()){
996 std::stringstream
msg{};
998 <<
" is not at the same position "<<
Amg::toString(refChannel)
1000 <<(refChannel - testChannel).
mag();
1002 msg<<std::endl<<
"*** Test *** - wirePitch: "<<testEle.
wirePitch()
1007 msg<<std::endl<<
"*** Ref *** - wirePitch: "<<design.stripPitch()
1009 <<
", wires to reach "<<design.numPitchesToGroup(
ch)
1010 <<
", wires in gang "<<design.numWiresInGroup(
ch);
1012 const Amg::Vector3D locRefPos{refLayerTrf.inverse() * refChannel};
1013 const Amg::Vector3D locTestPos{refLayerTrf.inverse()* testChannel};
1018 return StatusCode::FAILURE;
1023 return StatusCode::SUCCESS;
◆ evtStore() [1/2]
◆ evtStore() [2/2]
◆ execute()
StatusCode MuonGMR4::ReadoutGeomCnvAlg::execute |
( |
const EventContext & |
ctx | ) |
const |
|
override |
Prepare the Geometry context
Ensure that the position & tracking alignment caches are split from the conditions object
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 77 of file ReadoutGeomCnvAlg.cxx.
79 if (writeHandle.isValid()) {
80 ATH_MSG_DEBUG(
"The current readout geometry is still valid.");
81 return StatusCode::SUCCESS;
89 if (!readHandle.isValid()) {
91 return StatusCode::FAILURE;
93 writeHandle.addDependency(readHandle);
94 auto alignStore = std::make_unique<ActsTrk::DetectorAlignStore>(**readHandle);
96 if (alignStore->geoModelAlignment) {
97 alignStore->geoModelAlignment->clearPosCache();
99 alignStore->trackingAlignment = std::make_unique<TrackingAlignment>(alignStore->detType);
100 geoContext.setStore(std::move(alignStore));
106 if (geoContext.getStore(detType)) {
110 geoContext.setStore(std::make_unique<ActsTrk::DetectorAlignStore>(detType));
113 ConstructionCache cacheObj;
114 cacheObj.detMgr = std::make_unique<MuonGM::MuonDetectorManager>();
115 cacheObj.world = createGeoWorld();
116 cacheObj.detMgr->addTreeTop(cacheObj.world);
124 std::vector<GeoChildNodeWithTrf> treeTops = getChildrenWithRef(
m_detMgr->
getTreeTop(0),
false);
127 for (
const GeoChildNodeWithTrf& treeTop : treeTops) {
128 if (hasStationVolume(treeTop.volume, cacheObj.translatedStations))
continue;
131 cacheObj.world->add(const_pointer_cast(treeTop.volume));
142 ATH_CHECK(writeHandle.record(std::move(cacheObj.detMgr)));
143 return StatusCode::SUCCESS;
◆ extraDeps_update_handler()
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()
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.
◆ filterPassed()
◆ initialize()
StatusCode MuonGMR4::ReadoutGeomCnvAlg::initialize |
( |
| ) |
|
|
override |
◆ inputHandles()
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()
bool MuonGMR4::ReadoutGeomCnvAlg::isReEntrant |
( |
| ) |
const |
|
inlineoverride |
◆ msg() [1/2]
◆ msg() [2/2]
◆ msgLvl()
◆ outputHandles()
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()
◆ renounceArray()
◆ setFilterPassed()
◆ sysExecute()
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.
◆ sysInitialize()
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 InputMakerBase, and HypoBase.
Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.
110 if (
sc.isFailure()) {
118 if ( cs.retrieve().isFailure() ) {
120 return StatusCode::SUCCESS;
122 if (cs->regHandle(
this,*
h).isFailure()) {
123 sc = StatusCode::FAILURE;
124 ATH_MSG_ERROR(
"unable to register WriteCondHandle " <<
h->fullKey()
◆ sysStart()
Handle START transition.
We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.
◆ updateVHKA()
◆ m_alignStoreKeys
◆ m_checkGeo
Gaudi::Property<bool> MuonGMR4::ReadoutGeomCnvAlg::m_checkGeo {this, "checkGeo", false, "Checks the positions of the sensors"} |
|
private |
◆ m_detMgr
◆ m_detStore
◆ m_evtStore
◆ m_extendedExtraObjects
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_idHelperSvc
◆ m_varHandleArraysDeclared
◆ m_vhka
◆ m_writeKey
The documentation for this class was generated from the following files:
def retrieve(aClass, aKey=None)
StatusCode buildSTGC(const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const
int doubletPhiMax() const
Returns the maximum phi panel.
StatusCode buildMdt(const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const
StatusCode dumpAndCompare(const ActsGeometryContext &gctx, const MuonGMR4::RpcReadoutElement &refEle, const MuonGM::RpcReadoutElement &testEle) const
Parameters defining the design of the readout sTGC pads.
int multilayer() const
Returns the multilayer of the sTgcReadoutElement.
virtual const Amg::Transform3D & transform() const override
Return local to global transform.
std::vector< ActsTrk::DetectorType > getDetectorTypes() const
Returns a list of all detector types.
Amg::Transform3D asBuiltRefFrame() const
Returns the transformation to go into the reference frame of the as-buit & b-line model starting from...
static IdentifierHash createHash(const int gasGap, const int strip)
const Amg::Transform3D & absTransform() const
StatusCode cloneReadoutVolume(const ActsGeometryContext &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.
unsigned int nGasGaps() const
Returns the number of gas gaps.
unsigned nGasGaps() const
Returns the number of gasgaps described by this ReadOutElement (usally 2 or 3)
double tubeLength(const int tubeLayer, const int tube) const
unsigned int numTubesInLay() const
Returns the number of tubes per layer.
StatusCode buildStation(const ActsGeometryContext &gctx, const Identifier &stationId, ConstructionCache &cacheObj) const
builds a station object from readout element.
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.
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......
StatusCode buildTgc(const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const
Scalar perp() const
perp method - perpenticular length
PVConstLink getPhysVol() const
void defineTrapezoid(double HalfShortY, double HalfLongY, double HalfHeight)
set the trapezoid dimensions
unsigned int numChannels(const Identifier &measId) const
Returns the number of strips / wires / pads in a given gasGap.
Store holding the transfomations used by the Acts algorithms.
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...
double tubeLength(const IdentifierHash &hash) const
double moduleThickness() const
Returns the thickness of the chamber.
TgcReadoutParams::GasGapIntArray GasGapIntArray
static IdentifierHash measurementHash(unsigned int layerNumber, unsigned int tubeNumber)
Transform the layer and tube number to the measurementHash.
const std::string & stName(StIndex index)
convert StIndex into a string
Amg::Transform3D getTransform() const
Amg::Vector3D channelPosition(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the center of the measurement channel eta measurement: wire gang center phi measurement: stri...
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)
const Amg::Transform3D & toOrigin() const
Returns the transformation to go from the strip layer center to the origin of the Strip chamber.
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
double activeTubeLength(const IdentifierHash &hash) const
IdentifierHash detectorElementHash() const
Returns the IdentifierHash of the detector element.
StoreGateSvc_t m_evtStore
Pointer to StoreGate (event store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
ReadoutChannelType
ReadoutChannelType to distinguish the available readout channels Pad - pad readout channel Strip - et...
Helper struct to retrieve the tube lengths and the tube centers directly from the GeoModel tree.
std::vector< const MuonReadoutElement * > getAllReadoutElements() const
Returns the list of all detector elements.
double getTubeLengthForCaching(const int tubeLayer, const int tube) const
Amg::Transform3D globalToLocalTrans(const ActsGeometryContext &ctx) const
Transformations to translate between local <-> global coordinates.
#define ATH_MSG_VERBOSE(x)
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
SG::ReadCondHandleKeyArray< ActsTrk::DetectorAlignStore > m_alignStoreKeys
StatusCode buildMM(const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const
double getLongSsize() const
Gaudi::Property< bool > m_checkGeo
StatusCode buildRpc(const ActsGeometryContext &gctx, ConstructionCache &cacheObj) const
unsigned nGasGaps() const
Returns the number of gasgaps described by this ReadOutElement (usally 2 or 3)
TgcReadoutParams::WiregangArray WiregangArray
bool padGlobalCorners(const Identifier &id, std::array< Amg::Vector3D, 4 > &gcorners) const
pad global corners
Set of parameters to describe a RPC chamber.
Amg::Vector3D channelPos(const Identifier &id) const
Returns the position of the active channel (wireGang or strip)
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual void setOwner(IDataHandleHolder *o)=0
StatusCode checkIdCompability(const MuonGMR4::MuonReadoutElement &refEle, const MuonGM::MuonReadoutElement &testEle) const
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
double getLongRsize() const
Identifier measurementId(const IdentifierHash &measHash) const override final
Converts the measurement hash back to the full Identifier.
Helper struct to cache simulatenously the As-built and the BLine corrections of the Mdts for fast acc...
double wireLength(const IdentifierHash &hash) const
double getWireLength(const int tubeLayer, const int tube) const
chamberDistortions getDistortion(const Identifier &detElId) const
Returns a chamber distortion that's cached for the corresponding Mdt chamber element.
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>
AlignmentStorePtr & getStore(const DetectorType type)
Returns the mutable alignable store for the ATLAS detector type (Pixel, Mdt, etc.)
GeoIntrusivePtr< GeoVFullPhysVol > cloneNswWedge(const ActsGeometryContext &gctx, const MuonGMR4::MuonReadoutElement *nswRE, ConstructionCache &cacheObj) const
Clones the fullPhysicalVolume of the
virtual const DataObjIDColl & extraOutputDeps() const override
Return the list of extra output dependencies.
double uncutTubeLength(const IdentifierHash &tubeHash) const
Returns the uncut tube length.
static IdentifierHash createHash(const unsigned int gasGap, const unsigned int channelType, const unsigned int channel, const unsigned int wireInGrp=0)
Create a measurement hash from the Identifier fields.
Helper struct to store the pointer to the Mdt distrotion parameters, namely the As-built and the BLin...
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
int multilayer() const
Returns the multi layer of the element [1-2].
double nPitchesToGang(int gasGap, int gang) const
Returns the number of wire pitches that have to be travelled to reach gang i.
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override
Return this algorithm's output handles.
Amg::Vector3D stripPosition(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the position of the strip center.
@ Mm
Maybe not needed in the migration.
Set of parameters to describe a MDT chamber.
double getLongZsize() const
::StatusCode StatusCode
StatusCode definition for legacy code.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
int nWires(int gasGap) const
Returns the total number of wires in a given gas gap.
bool stripGlobalPosition(const Identifier &id, Amg::Vector3D &gpos) const
int doubletPhi() const
Returns the doublet Phi field of the MuonReadoutElement identifier.
double getActiveTubeLength(const int tubeLayer, const int tube) const
virtual StatusCode sysExecute(const EventContext &ctx) override
Execute an algorithm.
unsigned int numLayers() const
Returns the number of tube layer.
Eigen::Affine3d Transform3D
bool doesNotDeform(const Amg::Transform3D &trans)
Checks whether the linear part of the transformation rotates or stetches any of the basis vectors.
Amg::Vector3D stripPosition(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the position of the strip center.
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
Identifier measurementId(const IdentifierHash &measHash) const override final
Converts the measurement hash back to the full Identifier.
int doubletZ() const
Returns the doublet Z field of the MuonReadoutElement identifier.
bool isIdentity(const Amg::Transform3D &trans)
Checks whether the transformation is the Identity transformation.
StoreGateSvc_t m_detStore
Pointer to StoreGate (detector store by default)
IdentifierHash identHash() const
Returns the Identifier has of the Element that is Identical to the detElHash from the id_helper class...
Include the GeoPrimitives which need to be put first.
const StripDesign & design(bool phiView=false) const
Returns the underlying strip design.
virtual void renounce()=0
std::conditional< std::is_base_of< SG::VarHandleKeyArray, T >::value, VarHandleKeyArrayType, type2 >::type type
const StripLayer & stripLayer(const Identifier &measId) const
int nStrips(const MuonGM::TgcReadoutElement &readoutEle, int layer)
double moduleHeight() const
Returns the height of the chamber (Distance bottom - topWidth)
PVConstLink getTreeTop(unsigned int i) const override final
Returns the i-the tree top GeoModel volume.
const MdtAsBuiltPar * asBuilt
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
std::array< MuonChannelDesign, 4 > m_etaDesign
Amg::Vector3D globalChannelPosition(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the global pad/strip/wireGroup position.
std::string to_string(const DetectorType &type)
const GeoAlignableTransform * alignableTransform() const
Returnsthe alignable transform of the readout element.
Amg::Vector3D stripPos(const Identifier &id) const
bool stripGlobalPosition(const Identifier &id, Amg::Vector3D &gpos) const
StatusCode initialize(bool used=true)
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
Identifier identify() const override final
Return the athena identifier.
Eigen::Matrix< double, 3, 1 > Vector3D
double wirePitch() const
Returns the pitch of the wires.
unsigned int numLayers() const
Returns the number of gas gap layers.
const PadDesign & padDesign(const Identifier &measId) const
Retrieves the readoutElement Layer given the Identifier/Hash.
unsigned int phiIndex(float phi, float binsize)
calculate phi index for a given phi
TgcReadoutParams::StripArray StripArray
The StripLayer interfaces the 2D description of the strip plane layout with the 3D description of the...
Amg::Vector3D tubePos(const Identifier &id) const
Returns the global position of the given tube.
IdentifierHash layerHash(const Identifier &measId) const override final
#define ATH_MSG_WARNING(x)
globalCornerArray globalPadCorners(const ActsGeometryContext &ctx, const Identifier &measId) const
static IdentifierHash constructHash(unsigned measCh, unsigned gasGap, const bool isStrip)
Constructs the Hash out of the Identifier fields (channel, gasGap, isStrip)
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
int Nstrips(bool measphi) const
returns the number of strips for the phi or eta plane
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
Amg::Vector3D globalTubePos(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the global position of the tube center.
virtual StatusCode sysInitialize() override
Override sysInitialize.
const MdtReadoutElement * complementaryRE() const
Returns the pointer to the other readout element inside the muon station.
double stripPitch() const
Distance between two adjacent strips.
virtual const Amg::Transform3D & transform(const Identifier &id) const override final
Return local to global transform associated with this identifier.
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
unsigned numChannels(const IdentifierHash &measHash) const
Returns the number of readout channels.
DataObjIDColl m_extendedExtraObjects
Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
SG::WriteCondHandleKey< MuonGM::MuonDetectorManager > m_writeKey
Amg::Transform3D getTranslateX3D(const double X)
: Returns a shift transformation along the x-axis
bool isValid(const IdentifierHash &measHash) const
Scalar mag() const
mag method
unsigned nPhiStrips() const
Number of strips measuring the phi coordinate.
const MuonGMR4::MuonDetectorManager * m_detMgr
const MuonReadoutElement * getReadoutElement(const Identifier &id) const
Returns a generic Muon readout element.