7#include <GeoModelKernel/GeoVPhysVol.h>
11#include <GeoModelKernel/GeoFullPhysVol.h>
12#include <GeoModelKernel/GeoShapeShift.h>
13#include <GeoModelHelpers/printVolume.h>
39#include <GaudiKernel/SystemOfUnits.h>
41#include <GeoModelHelpers/defineWorld.h>
42#include <GeoModelHelpers/cloneVolume.h>
43#include <GeoModelHelpers/getChildNodesWithTrf.h>
44#include <GeoModelHelpers/TransformToStringConverter.h>
45#include <GeoModelHelpers/GeoShapeUtils.h>
46#include <GeoModelIOHelpers/GMIO.h>
51#include "Acts/Definitions/Units.hpp"
52using namespace Acts::UnitLiterals;
56 bool hasStationVolume(
const PVConstLink treeTop,
57 const std::set<PVConstLink>& translated) {
58 const unsigned int nCh = treeTop->getNChildVols();
59 for (
unsigned int ch = 0 ;
ch < nCh; ++
ch) {
60 PVConstLink child = treeTop->getChildVol(ch);
61 if (translated.count(child) ||
62 hasStationVolume(child, translated)){
82 return StatusCode::SUCCESS;
89 ATH_MSG_DEBUG(
"The current readout geometry is still valid.");
90 return StatusCode::SUCCESS;
98 ATH_MSG_FATAL(
"Failed to retrieve alignment store "<<key.fullKey());
99 return StatusCode::FAILURE;
105 geoContext.
setStore(std::make_unique<ActsTrk::DetectorAlignStore>(**readHandle));
110 std::vector<ActsTrk::DetectorType> presentTechs =
m_detMgr->getDetectorTypes();
116 geoContext.
setStore(std::make_unique<ActsTrk::DetectorAlignStore>(detType));
120 cacheObj.
detMgr = std::make_unique<MuonGM::MuonDetectorManager>();
121 cacheObj.
world = createGeoWorld();
130 std::vector<GeoChildNodeWithTrf> treeTops = getChildrenWithRef(
m_detMgr->getTreeTop(0),
false);
133 for (
const GeoChildNodeWithTrf& treeTop : treeTops) {
139 cacheObj.
world->add(const_pointer_cast(treeTop.volume));
144 const std::vector<const MuonGMR4::MuonReadoutElement*> refEles{
m_detMgr->getAllReadoutElements()};
155 return StatusCode::SUCCESS;
160 const std::string stName{
m_idHelperSvc->stationNameString(stationId)};
165 ATH_MSG_DEBUG(
"Station "<<stName<<
", stEta: "<<stEta<<
", stPhi: "<<stPhi<<
" already exists.");
166 return StatusCode::SUCCESS;
172 const GeoVFullPhysVol* readOutVol = copyMe->getMaterialGeom();
174 PVConstLink parentVolume = readOutVol->getParent();
179 GeoIntrusivePtr<const GeoGraphNode> alignNode{*(parentVolume->getParent()->findChildNode(alignTrf) + 1)};
181 GeoIntrusivePtr<const GeoTransform> stationShiftNode{alignNode != parentVolume ?
182 dynamic_pointer_cast<const GeoTransform>(alignNode) :
nullptr};
186 PVLink copiedStationVol{};
187 if (!stationShiftNode) {
188 copiedStationVol = make_intrusive<GeoFullPhysVol>(parentVolume->getLogVol());
190 auto volToCopy = parentVolume->getLogVol();
191 auto newShape = cacheObj.cacheShape(make_intrusive<GeoShapeShift>(volToCopy->getShape(),
192 stationShiftNode->getDefTransform()));
193 auto newLogVol = make_intrusive<GeoLogVol>(volToCopy->getName(), newShape, volToCopy->getMaterial());
194 copiedStationVol = make_intrusive<GeoFullPhysVol>(cacheObj.cacheVolume(newLogVol));
199 const std::vector<GeoChildNodeWithTrf> children = getChildrenWithRef(parentVolume,
false);
200 double minX{1.e9}, maxX{-1.e9}, minY1{1.e9}, maxY1{-1.e9}, minY2{1.e9}, maxY2{-1.e9}, minZ{1.e9}, maxZ{-1.e9};
201 for (
const GeoChildNodeWithTrf& child : children) {
202 std::vector<Amg::Vector3D> edges = getPolyShapeEdges(child.volume->getLogVol()->getShape(),
203 readOutVol->getX().inverse() * child.transform);
205 minX = std::min(minX, edge.x());
206 maxX = std::max(maxX, edge.x());
207 minZ = std::min(minZ, edge.z());
208 maxZ = std::max(maxZ, edge.z());
210 minY1 = std::min(minY1, edge.y());
211 maxY1 = std::max(maxY1, edge.y());
213 minY2 = std::min(minY2, edge.y());
214 maxY2 = std::max(maxY2, edge.y());
218 const GeoVPhysVol &childVolRef = *child.volume;
219 if (
typeid(childVolRef) ==
typeid(GeoFullPhysVol)) {
223 PVLink childVol = const_pointer_cast<GeoVPhysVol>(child.volume);
224 copiedStationVol->add(cacheObj.
newIdTag());
225 if (stationShiftNode) {
226 copiedStationVol->add(const_pointer_cast(stationShiftNode));
228 copiedStationVol->add(cacheObj.makeTransform(child.transform));
229 copiedStationVol->add(cloneVolume(childVol));
234 const double shortS = (maxY1 - minY1);
235 const double longS = (maxY2 - minY2);
236 const double lengthR = (maxX - minX);
237 const double lengthZ = (maxZ - minZ);
241 ( ( stationShiftNode ? stationShiftNode->getDefTransform() : Amg::Transform3D::Identity())
242 * readOutVol->getDefX()).inverse();
245 auto newStation = std::make_unique<MuonGM::MuonStation>(stName,
246 shortS, lengthR, lengthZ,
247 longS, lengthR, lengthZ,
248 stEta, stPhi,
false);
249 newStation->setPhysVol(copiedStationVol);
252 auto copyAlignNode = make_intrusive<GeoAlignableTransform>(alignedTransform);
253 newStation->setTransform(copyAlignNode);
254 newStation->setNominalAmdbLRSToGlobal(copyAlignNode->getTransform());
256 ATH_MSG_VERBOSE(
"stName: "<<stName<<
", stEta: "<<stEta<<
", stPhi: "<<stPhi
257 <<
" -- shortS: "<<shortS<<
", longS: "<<longS
258 <<
", lengthR: "<<lengthR<<
", lengthZ: "<<lengthZ
259 <<std::endl<<
"AlignableNode: "<<GeoTrf::toString(alignedTransform,
true)
260 <<std::endl<<
"Station shift: "<<GeoTrf::toString(stationShiftNode ? stationShiftNode->getDefTransform()
261 : Amg::Transform3D::Identity(),
true)
262 <<std::endl<<
"AmdLRSToGlobal: "<<GeoTrf::toString(newStation->getNominalAmdbLRSToGlobal(),
true)
263 <<std::endl<<
"Readout transform: "<<GeoTrf::toString(readOutVol->getX(),
true));
265 cacheObj.
world->add(copyAlignNode);
266 cacheObj.
world->add(copiedStationVol);
267 return StatusCode::SUCCESS;
274 GeoIntrusivePtr<GeoVFullPhysVol>& physVol,
278 const std::string stName{
m_idHelperSvc->stationNameString(reId)};
283 PVLink copiedStationVol{station->
getPhysVol()};
285 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
286 copiedStationVol->add(cacheObj.
newIdTag());
298 readOutVol->getParent()->getX() * readOutVol->getX()};
299 const Amg::Transform3D alignedNode{amdbTransform(gctx, *copyMe) * alignNodeToRE.inverse()};
301 const Amg::Transform3D stationTrf{copiedStationVol->getX().inverse() * alignedNode};
303 copiedStationVol->add(cacheObj.makeTransform(stationTrf*alignNodeToRE));
305 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
306 physVol = dynamic_pointer_cast<GeoVFullPhysVol>(clonedVol);
307 copiedStationVol->add(physVol);
308 return StatusCode::SUCCESS;
313 const std::vector<const MuonGMR4::RpcReadoutElement*> readoutEles =
m_detMgr->getAllRpcReadoutElements();
314 ATH_MSG_INFO(
"Copy "<<readoutEles.size()<<
" Rpc readout elements to the legacy system");
315 if (readoutEles.empty())
return StatusCode::SUCCESS;
320 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
323 auto newElement = std::make_unique<MuonGM::RpcReadoutElement>(physVol,
325 1, 1,
false, cacheObj.
detMgr.get());
326 newElement->setDoubletPhi(copyMe->doubletPhi());
327 newElement->setDoubletR(copyMe->doubletR());
328 newElement->setDoubletZ(copyMe->doubletZ());
329 newElement->setIdentifier(reId);
330 newElement->setParentMuonStation(station);
334 newElement->setLongZsize(2.*pars.halfLength);
335 newElement->setLongSsize(2.*pars.halfWidth);
336 newElement->setLongRsize(2.*pars.halfThickness);
337 newElement->setZsize(2.*pars.halfLength);
338 newElement->setSsize(2.*pars.halfWidth);
339 newElement->setRsize(2.*pars.halfThickness);
341 newElement->m_nlayers = copyMe->nGasGaps();
342 newElement->m_phistripwidth = copyMe->stripPhiWidth();
343 newElement->m_etastripwidth = copyMe->stripEtaWidth();
344 newElement->m_phistrippitch = copyMe->stripPhiPitch();
345 newElement->m_etastrippitch = Acts::copySign(1., copyMe->stationEta() -
346 (copyMe->stationEta()==0))*copyMe->stripEtaPitch();
347 newElement->m_phistriplength = copyMe->stripPhiLength();
348 newElement->m_etastriplength = copyMe->stripEtaLength();
350 newElement->m_nphistripsperpanel = copyMe->nPhiStrips();
351 newElement->m_netastripsperpanel = copyMe->nEtaStrips();
352 newElement->m_nphistrippanels = copyMe->nPhiPanels();
353 newElement->m_hasDEDontop =
true;
354 newElement->m_descratzneg =
false;
356 std::vector<Identifier> gapIds{};
357 for (
unsigned int gasGap = 1; gasGap <= copyMe->nGasGaps(); ++gasGap) {
358 for (
int doubPhi = copyMe->doubletPhiMax(); doubPhi >= copyMe->doubletPhi(); --doubPhi) {
359 for (
bool measPhi : {
false,
true}) {
360 if (measPhi && copyMe->nPhiStrips()==0)
continue;
361 const int channel = 1;
364 doubPhi, gasGap, measPhi,
367 gapIds.push_back(gapId);
368 const Amg::Vector3D locStripPos = amdbTransform(gctx, *copyMe).inverse() * copyMe->stripPosition(gctx, gapId);
370 newElement->m_gasGap_xPos[gasGap -1] = locStripPos.x();
373 const int dbPIdx = copyMe->doubletPhi() == 2 ? 1 : doubPhi;
375 newElement->m_first_phistrip_s[dbPIdx -1] = locStripPos.y();
376 newElement->m_phistrip_z = locStripPos.z();
378 newElement->m_first_etastrip_z = locStripPos.z();
379 newElement->m_etastrip_s[dbPIdx-1] = locStripPos.y();
384 newElement->fillCache();
387 const int surfaceHash = newElement->surfaceHash(gapId);
388 const int layerHash = newElement->layerHash(gapId);
392 Amg::Transform3D::Identity())};
394 newElement->m_surfaceData->m_layerTransforms[surfaceHash] = refTrf;
395 newElement->m_surfaceData->m_layerCenters[layerHash] = refTrf.translation();
396 newElement->m_surfaceData->m_layerNormals[layerHash] = refTrf.linear() * Amg::Vector3D::UnitZ();
401 return StatusCode::SUCCESS;
407 std::vector<const MuonGMR4::TgcReadoutElement*> tgcReadouts{
m_detMgr->getAllTgcReadoutElements()};
409 return a->stationEta() > b->stationEta();
411 ATH_MSG_INFO(
"Copy "<<tgcReadouts.size()<<
" Tgc readout elements to the legacy system");
412 if (tgcReadouts.empty())
return StatusCode::SUCCESS;
416 std::map<std::string, std::shared_ptr<TgcReadoutParams>> readoutParMap{};
420 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
424 auto newRE = std::make_unique<MuonGM::TgcReadoutElement>(physVol,
m_idHelperSvc->stationNameString(reId),
426 newRE->setIdentifier(reId);
427 newRE->setParentMuonStation(station);
429 std::shared_ptr<TgcReadoutParams>& readOutPars = readoutParMap[std::format(
"{:}_{:}", copyMe->chamberDesign(),
430 copyMe->stationEta()> 0?
'A' :
'C')];
432 using WiregangArray = TgcReadoutParams::WiregangArray;
433 using StripArray = TgcReadoutParams::StripArray;
434 using GasGapIntArray = TgcReadoutParams::GasGapIntArray;
436 std::array<WiregangArray, 3> wires{};
437 GasGapIntArray nWireGangs{}, nStrips{};
438 std::vector<StripArray> botMountings(copyMe->nGasGaps()),
439 topMountings(copyMe->nGasGaps());
441 double wirePitch{0.};
442 for (
unsigned int gasGap =1; gasGap <= copyMe->nGasGaps(); ++gasGap) {
443 const IdentifierHash gangHash = copyMe->constructHash(0, gasGap,
false);
444 const IdentifierHash stripHash = copyMe->constructHash(0, gasGap,
true);
445 nWireGangs[gasGap -1] = copyMe->numWireGangs(gangHash);
446 nStrips[gasGap -1] = copyMe->numStrips(stripHash);
447 ATH_MSG_VERBOSE(
"Assigned wire gangs: "<<nWireGangs[gasGap-1]<<
", strips: "<<nStrips[gasGap -1]
448 <<
" for gas gap "<<gasGap);
450 if (nWireGangs[gasGap -1]) {
453 WiregangArray& fillMe{wires[gasGap-1]};
454 for (
int gang = 1; gang <= design.
numStrips(); ++gang) {
459 if (nStrips[gasGap -1]) {
461 const int nCh = nStrips[gasGap -1];
467 topMountings[gasGap-1][nCh] = - design.
stripRightTop(nCh).x();
468 ATH_MSG_VERBOSE(
"Strip layout\n bottom: "<<botMountings<<
"\n top: "<<topMountings);
471 readOutPars = std::make_unique<TgcReadoutParams>(copyMe->chamberDesign(),
474 std::move(nWireGangs),
479 std::move(botMountings),
480 std::move(topMountings),
485 for (
unsigned int gasGap = 1; gasGap <= copyMe->nGasGaps(); ++gasGap) {
486 const IdentifierHash layHash{copyMe->constructHash(0, gasGap,
false)};
488 const Amg::Vector3D translation{amdbTransform(gctx, *copyMe).inverse() * copyMe->center(gctx, layHash)};
489 newRE->setPlaneZ(translation.x(), gasGap);
491 newRE->setRsize(copyMe->moduleHeight());
492 newRE->setSsize(copyMe->moduleWidthS());
493 newRE->setZsize(copyMe->moduleThickness());
495 newRE->setLongRsize(copyMe->moduleHeight());
496 newRE->setLongSsize(copyMe->moduleWidthL());
497 newRE->setLongZsize(copyMe->moduleThickness());
499 newRE->setReadOutParams(readOutPars);
505 return StatusCode::SUCCESS;
508GeoIntrusivePtr<GeoVFullPhysVol>
512 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe.getMaterialGeom()};
515 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
516 GeoIntrusivePtr<GeoFullPhysVol> physVol{dynamic_pointer_cast<GeoFullPhysVol>(clonedVol)};
518 cacheObj.
world->add(cacheObj.makeTransform(amdbTransform(gctx, copyMe)));
519 cacheObj.
world->add(physVol);
525 const auto alignStore = alignItr ?
526 static_cast<const MmAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
531 const std::vector<const MuonGMR4::MmReadoutElement*> mmReadouts{
m_detMgr->getAllMmReadoutElements()};
532 ATH_MSG_INFO(
"Copy "<<mmReadouts.size()<<
" Mm readout elements to the legacy system");
534 if (mmReadouts.empty())
return StatusCode::SUCCESS;
538 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, *copyMe, cacheObj)};
539 auto newRE = std::make_unique<MuonGM::MMReadoutElement>(physVol,
541 copyMe->stationEta(),
542 copyMe->stationPhi(),
543 copyMe->multilayer(), cacheObj.
detMgr.get());
545 for (
unsigned int gasGap = 0; gasGap < copyMe->nGasGaps(); ++gasGap) {
549 newRE->m_Xlg[gasGap] = stripLayer.
toOrigin() *
552 ATH_MSG_VERBOSE(
"Layer transform "<<gasGap<<
" "<<GeoTrf::toString(newRE->m_Xlg[gasGap],
true));
571 if (alignStore && alignStore->getBLine(reId)) {
572 newRE->setBLinePar(*alignStore->getBLine(reId));
577 return StatusCode::SUCCESS;
582 auto alignStore = alignItr ?
static_cast<const sTgcAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
584 const std::vector<const MuonGMR4::sTgcReadoutElement*> sTgcReadOuts{
m_detMgr->getAllsTgcReadoutElements()};
585 ATH_MSG_INFO(
"Copy "<<sTgcReadOuts.size()<<
" sTgc readout elements to the legacy system");
587 if (sTgcReadOuts.empty())
return StatusCode::SUCCESS;
592 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, *copyMe, cacheObj)};
594 auto newRE = std::make_unique<MuonGM::sTgcReadoutElement>(physVol,
596 copyMe->stationEta(),
597 copyMe->stationPhi(),
598 copyMe->multilayer(),
601 if (alignStore && alignStore->getBLine(reId)) {
602 newRE->setBLinePar(*alignStore->getBLine(reId));
604 for (
unsigned int layer = 1; layer <= copyMe->numLayers(); ++layer) {
610 newRE->m_Xlg[layer -1] = stripLayer.
toOrigin() *
617 ChannelDesign& etaDesign{newRE->m_etaDesign[layer-1]};
618 etaDesign.type = ChannelDesign::ChannelType::etaStrip;
619 etaDesign.detType = ChannelDesign::DetType::STGC;
632 etaDesign.inputPitch = copyEtaDesign.
stripPitch();
633 etaDesign.inputWidth = copyEtaDesign.
stripWidth();
634 etaDesign.nch = copyEtaDesign.
numStrips();
641 ChannelDesign& phiDesign{newRE->m_phiDesign[layer-1]};
642 phiDesign.type = ChannelDesign::ChannelType::phiStrip;
643 phiDesign.detType = ChannelDesign::DetType::STGC;
644 if (copyPhiDesign.
yCutout() == 0.) {
654 phiDesign.inputPitch = copyPhiDesign.
stripPitch();
655 phiDesign.inputWidth = copyPhiDesign.
stripWidth();
660 phiDesign.nGroups = copyPhiDesign.
numStrips();
661 phiDesign.wireCutout = copyPhiDesign.
wireCutout();
662 phiDesign.nch = copyPhiDesign.
nAllWires();
663 phiDesign.isConvertedFromPhaseII =
true;
667 padDesign.
Length = copyMe->chamberHeight();
668 padDesign.
sWidth = copyMe->sChamberLength();
669 padDesign.
lWidth = copyMe->lChamberLength();
671 padDesign.
ysFrame = copyMe->sFrameWidth();
672 padDesign.
ylFrame = copyMe->lFrameWidth();
673 padDesign.
thickness = copyMe->thickness();
697 return StatusCode::SUCCESS;
703 static_cast<const MdtAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
705 const std::vector<const MuonGMR4::MdtReadoutElement*> mdtReadOuts{
m_detMgr->getAllMdtReadoutElements()};
706 ATH_MSG_INFO(
"Copy "<<mdtReadOuts.size()<<
" Mdt readout elements to the legacy system");
707 if (mdtReadOuts.empty())
return StatusCode::SUCCESS;
712 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
715 if (copyMe->multilayer() == 1) {
717 const double height = std::max(copyMe->moduleHeight(), otherRE->
moduleHeight()) -
718 (copyMe->tubePitch() - 2. * copyMe->tubeRadius());
721 modHalfThick{-0.5*copyMe->moduleThickness()};
723 const double thickness = ( (otherRE->
asBuiltRefFrame()*(modHalTHickO* Amg::Vector3D::UnitX())) -
724 (copyMe->asBuiltRefFrame()*(modHalfThick* Amg::Vector3D::UnitX()))).z();
725 if (copyMe->isBarrel()) {
734 auto newElement = std::make_unique<MuonGM::MdtReadoutElement>(physVol,
737 newElement->setIdentifier(reId);
738 newElement->setMultilayer(copyMe->multilayer());
739 newElement->setNMdtInStation(
m_idHelperSvc->mdtIdHelper().multilayerMax(reId));
741 newElement->setParentMuonStation(station);
744 newElement->setLongSsize(2*pars.longHalfX - 1._cm);
745 newElement->setSsize(2*pars.shortHalfX - 1._cm);
746 newElement->setLongRsize(2*pars.halfY);
747 newElement->setRsize(2*pars.halfY);
748 newElement->setZsize(2*pars.halfHeight);
749 newElement->setLongZsize(2*pars.halfHeight);
751 newElement->m_nlayers = copyMe->numLayers();
752 newElement->m_ntubesperlayer = copyMe->numTubesInLay();
753 newElement->m_deadlength = pars.deadLength;
754 newElement->m_endpluglength = pars.endPlugLength;
755 newElement->m_innerRadius = pars.tubeInnerRad;
756 newElement->m_tubeWallThickness = pars.tubeWall;
757 newElement->m_tubepitch = pars.tubePitch;
763 unsigned int step{1};
765 for (
unsigned tube = 0; tube < copyMe->numTubesInLay(); ++tube) {
768 if (std::abs(lastLength - currLength) > std::numeric_limits<float>::epsilon() ||
769 tube == copyMe->numTubesInLay() -1) {
770 newElement->m_tubelength[step-1] = lastLength;
771 newElement->m_tubelength[step] = currLength;
773 newElement->m_ntubesinastep = tube;
775 lastLength = currLength;
779 newElement->m_nsteps = step;
782 double xOffSet{pars.halfY}, yOffSet{pars.halfHeight};
783 if (newElement->barrel())
std::swap(xOffSet, yOffSet);
784 for (
unsigned lay = 1; lay <= copyMe->numLayers(); ++lay) {
786 const Amg::Vector3D locTube = copyMe->localTubePos(tubeHash);
787 newElement->m_firstwire_x[lay-1] = locTube.z() + xOffSet;
788 newElement->m_firstwire_y[lay-1] = locTube.x() + yOffSet;
799 const Amg::Vector3D refPoint = copyMe->bLineReferencePoint();
802 newElement->geoInitDone();
803 newElement->setBLinePar(distort.
bLine);
804 newElement->fillCache();
809 return StatusCode::SUCCESS;
819 return StatusCode::FAILURE;
824 return StatusCode::FAILURE;
826 return StatusCode::SUCCESS;
834 return StatusCode::SUCCESS;
839 <<GeoTrf::toString(testEle.
absTransform(),
true)<<std::endl
840 <<GeoTrf::toString(amdbTransform(gctx, refEle),
true));
842 for (
unsigned int gasGap = 1; gasGap <= refEle.
nGasGaps(); ++ gasGap) {
849 <<GeoTrf::toString(refTrf,
true) <<
" vs. "<<GeoTrf::toString(testTrf,
true));
850 return StatusCode::FAILURE;
862 return StatusCode::FAILURE;
864 const double dist = refStripDir.dot(refStripPos - testStripPos);
865 if (std::abs(dist) > 10. * Gaudi::Units::micrometer) {
868 <<
" distance: "<<dist<<
" "<<(dist / testEle.
m_etaDesign[gasGap -1].inputWidth));
869 return StatusCode::FAILURE;
874 return StatusCode::SUCCESS;
882 return StatusCode::SUCCESS;
887 <<std::endl<<GeoTrf::toString(amdbTransform(gctx, refEle))
888 <<std::endl<<GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform())
892 for (
unsigned int lay = 1; lay <= refEle.
numLayers(); ++lay){
893 for (
unsigned int tube = 1; tube <= refEle.
numTubesInLay(); ++tube) {
895 if (!refEle.
isValid(tubeHash)) {
905 if ( (refPos - tubePos).
mag() > Gaudi::Units::micrometer &&
906 (globToLocal*refPos - globToLocal * tubePos).
perp() > Gaudi::Units::micrometer) {
908 <<
" reference: "<<GeoTrf::toString(globToLocal*refPos)<<
" vs. test: "
909 <<GeoTrf::toString(globToLocal*tubePos) <<
" delta: "<<(refPos - tubePos).mag()
910 <<
" Transforms "<<std::endl
911 <<
" **** "<< GeoTrf::toString(globToLocal.inverse())<<std::endl
912 <<
" **** "<< GeoTrf::toString(testEle.
transform(lay, tube)));
913 return StatusCode::FAILURE;
916 <<std::endl<<
"reference: "<<GeoTrf::toString(refPos)
917 <<std::endl<<
"test: "<<GeoTrf::toString(tubePos)
923 std::numeric_limits<float>::epsilon() ) {
927 return StatusCode::FAILURE;
932 return StatusCode::SUCCESS;
939 return StatusCode::SUCCESS;
944 <<
" ref: "<<GeoTrf::toString(amdbTransform(gctx, refEle),
true)<<std::endl
945 <<
" test: "<<GeoTrf::toString(testEle.
absTransform(),
true)<<std::endl
946 <<
"delta: "<<GeoTrf::toString(testEle.
absTransform().inverse()*amdbTransform(gctx, refEle),
true ));
948 for (
unsigned int gasGap = 1; gasGap <= refEle.
nGasGaps(); ++gasGap) {
950 for (
bool measPhi : {
false,
true}) {
951 if (measPhi && !refEle.
nPhiStrips())
continue;
955 doubPhi, gasGap, measPhi,
strip);
959 Amg::Transform3D::Identity())};
963 <<
" *** ref: "<<GeoTrf::toString(refTrans)<<std::endl
964 <<
" *** test: "<<GeoTrf::toString(testTrans)<<std::endl
965 <<
" -> delta: "<<GeoTrf::toString(refTrans.inverse()*testTrans));
966 return StatusCode::FAILURE;
979 if ((refStripPos - testStripPos).
mag() > 2e-4){
982 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refStripPos)
983 <<
" test: "<<
Amg::toString(refTrans.inverse()*testStripPos));
984 return StatusCode::FAILURE;
988 <<
", local: "<<
Amg::toString(refTrans.inverse()*refStripPos));
993 return StatusCode::SUCCESS;
1000 return StatusCode::SUCCESS;
1007 <<std::endl<<GeoTrf::toString(amdbTransform(gctx, refEle),
true)
1008 <<std::endl<<GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform(),
true)
1013 for (
unsigned int gasGap = 1; gasGap <= refEle.
nGasGaps(); ++gasGap) {
1014 for (
bool isStrip : {
false,
true}) {
1021 (!isStrip ? Amg::Transform3D::Identity()
1026 <<std::endl<<
"ref : "<<GeoTrf::toString(refLayerTrf,
true)
1027 <<std::endl<<
"test: "<<GeoTrf::toString(testLayerTrf,
true)
1028 <<
" are not identical. ");
1029 return StatusCode::FAILURE;
1032 <<std::endl<<
"ref : "<<GeoTrf::toString(refLayerTrf,
true)
1033 <<std::endl<<
"test: "<<GeoTrf::toString(testLayerTrf,
true));
1035 for (
unsigned int ch = 1; ch <= refEle.
numChannels(layHash); ++ch) {
1040 if ((refChannel - testChannel).
mag() < std::numeric_limits<float>::epsilon()){
1043 std::stringstream
msg{};
1045 <<
" is not at the same position "<<
Amg::toString(refChannel)
1047 <<(refChannel - testChannel).
mag();
1049 msg<<std::endl<<
"*** Test *** - wirePitch: "<<testEle.
wirePitch()
1050 <<
", tot wires "<<testEle.
nWires(gasGap)
1052 <<
", wires in gang "<<testEle.
nWires(gasGap, ch);
1054 msg<<std::endl<<
"*** Ref *** - wirePitch: "<<design.
stripPitch()
1055 <<
", tot wires "<<testEle.
nWires(gasGap)
1059 const Amg::Vector3D locRefPos{refLayerTrf.inverse() * refChannel};
1060 const Amg::Vector3D locTestPos{refLayerTrf.inverse()* testChannel};
1065 return StatusCode::FAILURE;
1070 return StatusCode::SUCCESS;
1076 return StatusCode::SUCCESS;
1081 <<GeoTrf::toString(testEle.
absTransform(),
true)<<std::endl
1082 <<GeoTrf::toString(amdbTransform(gctx, refEle),
true));
1084 for (
unsigned int gasGap = 1; gasGap <= refEle.
numLayers(); ++gasGap) {
1089 const unsigned int numChannel = refEle.
numChannels(layHash);
1090 constexpr unsigned firstCh = 1;
1091 for (
unsigned int channel = firstCh; channel < numChannel ; ++channel) {
1108 return StatusCode::FAILURE;
1115 || (testTrans.inverse()*refTrans).translation().perp() >
1116 std::numeric_limits<float>::epsilon() ) ) {
1117 ATH_MSG_ERROR(__func__<<
"() "<<__LINE__<<
" - Transformation for "
1119 <<
" *** ref: "<<GeoTrf::toString(refTrans,
true)<<std::endl
1120 <<
" *** test: "<<GeoTrf::toString(testTrans,
true));
1121 return StatusCode::FAILURE;
1130 const std::array<Amg::Vector3D,4> refPadCorners = refEle.
globalPadCorners(gctx, measHash);
1133 for (
unsigned int cornerIdx = 0; cornerIdx < refPadCorners.size(); ++cornerIdx) {
1134 const double padCornerDiff = (refPadCorners[cornerIdx] - testPadCorners[cornerIdx]).
mag();
1135 if (padCornerDiff - 25. > 1. * Gaudi::Units::micrometer){
1138 <<
" difference: " << padCornerDiff
1139 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refPadCorners[cornerIdx])
1140 <<
" test: "<<
Amg::toString(testPadTrans.inverse()*testPadCorners[cornerIdx]));
1141 return StatusCode::FAILURE;
1144 const double padChannelDiff = (refChannelPos - testChannelPos).
mag();
1145 if (padChannelDiff - 25. > 1. * Gaudi::Units::micrometer){
1148 <<
" difference: " << padChannelDiff
1149 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refChannelPos)
1150 <<
" test: "<<
Amg::toString(testPadTrans.inverse()*testChannelPos));
1151 return StatusCode::FAILURE;
1159 if ((refChannelPos - testChannelPos).
mag() > 1. * Gaudi::Units::micrometer){
1162 <<
" local coordinates -- ref: "<<
Amg::toString(testTrans.inverse()*refChannelPos)
1163 <<
" test: "<<
Amg::toString(testTrans.inverse()*testChannelPos));
1164 return StatusCode::FAILURE;
1171 Amg::Vector3D localRefPos {testTrans.inverse()*refChannelPos};
1172 Amg::Vector3D localTestPos{testTrans.inverse()*testChannelPos};
1174 if((std::abs(localRefPos.x() -localTestPos.x()) > 1.* Gaudi::Units::micrometer)
1175 || (std::abs(refChannelPos.z() -testChannelPos.z()) > 15.* Gaudi::Units::micrometer)){
1178 <<
" local coordinates -- ref: "<<
Amg::toString(testTrans.inverse()*refChannelPos)
1179 <<
" test: "<<
Amg::toString(testTrans.inverse()*testChannelPos)
1180 <<
"delta X: "<<std::abs(localRefPos.x() -localTestPos.x())
1181 <<
", delta Z: "<<std::abs(localRefPos.z() -localTestPos.z()));
1182 return StatusCode::FAILURE;
1188 return StatusCode::SUCCESS;
Scalar perp() const
perp method - perpendicular length
Scalar mag() const
mag method
constexpr std::array< T, N > make_array(const T &def_val)
Helper function to initialize in-place arrays with non-zero values.
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#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.
sTgcIdHelper::sTgcChannelTypes chType
GeoModel::TransientConstSharedPtr< AlignmentStore > AlignmentStorePtr
AlignmentStorePtr & getStore(const DetectorType type)
Returns the mutable alignable store for the ATLAS detector type (Pixel, Mdt, etc.)
void setStore(AlignmentStorePtr store)
Adds the store to the Geometry context.
virtual DetectorType detectorType() const =0
Returns the detector element type.
const ServiceHandle< StoreGateSvc > & detStore() const
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
This is a "hash" representation of an Identifier.
Helper struct to cache simulatenously the As-built and the BLine corrections of the Mdts for fast acc...
chamberDistortions getDistortion(const Identifier &detElId) const
Returns a chamber distortion that's cached for the corresponding Mdt chamber element.
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channel) const
Readout element to describe the Monitored Drift Tube (Mdt) chambers Mdt chambers usually comrpise out...
double wireLength(const IdentifierHash &hash) const
double activeTubeLength(const IdentifierHash &hash) const
double tubeLength(const IdentifierHash &hash) const
unsigned numLayers() const
Returns how many tube layers are inside the multi layer [1;4].
bool isValid(const IdentifierHash &measHash) const
Checks whether the passed meaurement hash corresponds to a valid tube described by the readout elemen...
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...
Amg::Vector3D globalTubePos(const ActsTrk::GeometryContext &ctx, const Identifier &measId) const
Returns the position of the tube mid point in the ATLAS coordinate frame.
double moduleThickness() const
Returns the thickness of the chamber.
double uncutTubeLength(const IdentifierHash &tubeHash) const
Returns the uncut tube length.
unsigned numTubesInLay() const
Returns the number of tubes in a layer.
const MdtReadoutElement * complementaryRE() const
Returns the pointer to the other readout element inside the muon station.
static IdentifierHash measurementHash(unsigned layerNumber, unsigned tubeNumber)
Constructs a Measurement hash from layer && tube number.
Identifier measurementId(const IdentifierHash &measHash) const override final
Back conversion of the measurement hash towards a full identifier Tube & layer number are extracted f...
Helper struct to retrieve the tube lengths and the tube centers directly from the GeoModel tree.
double uncutHalfLength(const unsigned int tube) const
Returns the uncut-half length of the given tube.
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.
static IdentifierHash createHash(const int gasGap, const int strip)
MuonReadoutElement is an abstract class representing the geometry of a muon detector.
const Amg::Transform3D & localToGlobalTransform(const ActsTrk::GeometryContext &ctx) const
Returns the transformation from the local coordinate system of the readout element into the global AT...
Amg::Transform3D globalToLocalTransform(const ActsTrk::GeometryContext &ctx) const
Returns the transformation from the global ATLAS coordinate system into the local coordinate system o...
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.
const GeoAlignableTransform * alignableTransform() const
Return the alignable transform node of the readout element.
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.
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......
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.
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
StatusCode buildStation(const ActsTrk::GeometryContext &gctx, const Identifier &stationId, ConstructionCache &cacheObj) const
builds a station object from readout element.
Gaudi::Property< std::string > m_geoDumpName
StatusCode buildMdt(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all Mdt readout elements from the R4 format into the legacy Trk format.
StatusCode initialize() override
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 execute(const EventContext &ctx) const override
SG::WriteCondHandleKey< MuonGM::MuonDetectorManager > m_writeKey
Gaudi::Property< bool > m_splitTrfCache
Instantiate a new transform cache to ensure lazy transform population in the event processing.
GeoIntrusivePtr< GeoVFullPhysVol > cloneNswWedge(const ActsTrk::GeometryContext &gctx, const MuonGMR4::MuonReadoutElement &nswRE, ConstructionCache &cacheObj) const
Clones the full phyical volume associated to the NSw readout element.
StatusCode buildRpc(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all Rpc readout elements from the R4 format into the legacy Trk format.
StatusCode buildTgc(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all Tgc readout elements from the R4 format into the legacy Trk format.
Gaudi::Property< bool > m_dumpGeo
StatusCode buildSTGC(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all sTgc readout elements from the R4 format into the legacy Trk format.
StatusCode dumpAndCompare(const ActsTrk::GeometryContext &gctx, const MuonGMR4::RpcReadoutElement &refEle, const MuonGM::RpcReadoutElement &testEle) const
Compares the R4 readout element with the constructed Trk readout element.
StatusCode checkIdCompability(const MuonGMR4::MuonReadoutElement &refEle, const MuonGM::MuonReadoutElement &testEle) const
Checks whether the Identifier fields of both readout elements are identical.
StatusCode buildMM(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Converts all Mm readout elements from the R4 format into the legacy Trk format.
SG::ReadCondHandleKeyArray< ActsTrk::DetectorAlignStore > m_alignStoreKeys
const MuonGMR4::MuonDetectorManager * m_detMgr
Gaudi::Property< bool > m_checkGeo
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
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)
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 yCutout() const
Returns the cutout of the diamond.
double stripPitch() const
Distance between two adjacent strips.
double stripWidth() const
Width of a strip.
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.
The StripLayer interfaces the 2D description of the strip plane layout with the 3D description of the...
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.
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 numWiresInGroup(unsigned int groupNum) const
Returns the number of wires in a given group.
unsigned int numPitchesToGroup(unsigned int groupNum) const
Returns the number of wire pitches to reach the given group.
double wireCutout() const
Extract the wireCutout for a wireGroup layer.
unsigned int nAllWires() const
Returns the number of all wires.
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.
ReadoutChannelType
ReadoutChannelType to distinguish the available readout channels Pad - pad readout channel Strip - et...
Amg::Vector3D globalChannelPosition(const ActsTrk::GeometryContext &ctx, const IdentifierHash &measHash) const
Returns the global pad/strip/wireGroup position.
static IdentifierHash createHash(const unsigned gasGap, const unsigned channelType, const unsigned channel, const unsigned wireInGrp=0)
Create a measurement hash from the Identifier fields.
An MMReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station con...
bool stripGlobalPosition(const Identifier &id, Amg::Vector3D &gpos) const
std::array< MuonChannelDesign, 4 > m_etaDesign
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
virtual const Amg::Transform3D & transform() const override
Return local to global transform.
const MuonReadoutElement * getReadoutElement(const Identifier &id) const
Get any read out element.
void addsTgcReadoutElement(std::unique_ptr< sTgcReadoutElement > &&reEle)
store the sTGCReadoutElement using as "key" the identifier
void addRpcReadoutElement(std::unique_ptr< RpcReadoutElement > &&reEle)
store the RpcReadoutElement using as "key" the identifier
void setMMPassivation(const NswPassivationDbData *passiv)
const MuonStation * getMuonStation(const std::string &stName, int eta, int phi) const
void addMdtReadoutElement(std::unique_ptr< MdtReadoutElement > &&reEle)
store the MdtReadoutElement using as "key" the identifier
void addMuonStation(std::unique_ptr< MuonStation > &&mst)
void addTgcReadoutElement(std::unique_ptr< TgcReadoutElement > &&reEle)
store the TgcReadoutElement using as "key" the identifier
void addMMReadoutElement(std::unique_ptr< MMReadoutElement > &&reEle)
store the MMReadoutElement using as "key" the identifier
Base class for the XxxReadoutElement, with Xxx = Mdt, Rpc, Tgc, Csc.
IdentifierHash detectorElementHash() const
Returns the IdentifierHash of the detector element.
double getLongZsize() const
double getLongRsize() const
const Amg::Transform3D & absTransform() const
double getLongSsize() const
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
void setBlineFixedPointInAmdbLRS(double s0, double z0, double t0)
PVConstLink getPhysVol() const
void setMdtAsBuiltParams(const MdtAsBuiltPar *xtomo)
void setMdtRsize(const double rSize)
int nMuonReadoutElements() const
void addMuonReadoutElementWithAlTransf(MuonReadoutElement *a, GeoAlignableTransform *ptrsf, int jobIndex)
void setMdtZsize(const double zSize)
void setBline(const BLinePar *bline)
bool hasMdtAsBuiltParams() const
An RpcReadoutElement corresponds to a single RPC module; therefore typicaly a barrel muon station con...
Amg::Vector3D stripPos(const Identifier &id) const
int Nstrips(bool measphi) const
returns the number of strips for the phi or eta plane
A TgcReadoutElement corresponds to a single TGC chamber; therefore typically a TGC station contains s...
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.
An sTgcReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station c...
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 channelID(int stationName, int stationEta, int stationPhi, int doubletR, int doubletZ, int doubletPhi, int gasGap, int measuresPhi, int strip) const
void addDependency(const EventIDRange &range)
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
static int stationPhiMax(bool endcap)
Identifier channelID(int stationName, int stationEta, int stationPhi, int gasGap, int isStrip, int channel) const
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
std::string to_string(const DetectorType &type)
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.
@ Mm
Maybe not needed in the migration.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
bool isIdentity(const Amg::Transform3D &trans)
Checks whether the transformation is the Identity transformation.
bool doesNotDeform(const Amg::Transform3D &trans)
Checks whether the linear part of the transformation rotates or stetches any of the basis vectors.
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Eigen::Affine3d Transform3D
Amg::Transform3D getTranslateX3D(const double X)
: Returns a shift transformation along the x-axis
Eigen::Matrix< double, 3, 1 > Vector3D
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
Amg::Transform3D rotationToAMDB(const ActsTrk::DetectorType type)
Returns the rotation matrix from the readout element coordinate system into the AMDB coordinate syste...
The ReadoutGeomCnvAlg converts the Run4 Readout geometry build from the GeoModelXML into the legacy M...
std::unique_ptr< ActsTrk::DetectorAlignStore > copyDeltas(const ActsTrk::DetectorAlignStore &inStore)
Copy the alignment deltas from the inStore to a new alignment store.
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)
Helper struct to store the pointer to the Mdt distrotion parameters, namely the As-built and the BLin...
const MdtAsBuiltPar * asBuilt
Set of parameters to describe a MDT chamber.
Cache object holding the constructed detector manager, and the intermediate GeoModel objects needed t...
PVLink world
Pointer to the world.
std::unique_ptr< MuonGM::MuonDetectorManager > detMgr
Pointer to the legacy MuonDetectorManager.
GeoIntrusivePtr< GeoIdentifierTag > newIdTag()
Returns an identifier tag.
std::set< PVConstLink > translatedStations
Set of all translated Physical volumes.
Set of parameters to describe a RPC chamber.
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.
Parameters defining the design of the readout sTGC pads.
double sectorOpeningAngle
bool isConvertedFromPhaseII
void setR(double R)
access to cache