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)){
77 return StatusCode::SUCCESS;
84 ATH_MSG_DEBUG(
"The current readout geometry is still valid.");
85 return StatusCode::SUCCESS;
94 ATH_MSG_FATAL(
"Failed to retrieve alignment store "<<key.fullKey());
95 return StatusCode::FAILURE;
98 auto alignStore = std::make_unique<ActsTrk::DetectorAlignStore>(**readHandle);
100 if (alignStore->geoModelAlignment) {
101 alignStore->geoModelAlignment->clearPosCache();
103 alignStore->trackingAlignment = std::make_unique<TrackingAlignment>(alignStore->detType);
104 geoContext.
setStore(std::move(alignStore));
108 std::vector<ActsTrk::DetectorType> presentTechs =
m_detMgr->getDetectorTypes();
114 geoContext.
setStore(std::make_unique<ActsTrk::DetectorAlignStore>(detType));
118 cacheObj.
detMgr = std::make_unique<MuonGM::MuonDetectorManager>();
119 cacheObj.
world = createGeoWorld();
128 std::vector<GeoChildNodeWithTrf> treeTops = getChildrenWithRef(
m_detMgr->getTreeTop(0),
false);
131 for (
const GeoChildNodeWithTrf& treeTop : treeTops) {
135 cacheObj.
world->add(const_pointer_cast(treeTop.volume));
140 const std::vector<const MuonGMR4::MuonReadoutElement*> refEles{
m_detMgr->getAllReadoutElements()};
151 return StatusCode::SUCCESS;
156 const std::string stName{
m_idHelperSvc->stationNameString(stationId)};
161 ATH_MSG_DEBUG(
"Station "<<stName<<
", stEta: "<<stEta<<
", stPhi: "<<stPhi<<
" already exists.");
162 return StatusCode::SUCCESS;
168 const GeoVFullPhysVol* readOutVol = copyMe->getMaterialGeom();
170 PVConstLink parentVolume = readOutVol->getParent();
175 GeoIntrusivePtr<const GeoGraphNode> alignNode{*(parentVolume->getParent()->findChildNode(alignTrf) + 1)};
177 GeoIntrusivePtr<const GeoTransform> stationShiftNode{alignNode != parentVolume ?
178 dynamic_pointer_cast<const GeoTransform>(alignNode) :
nullptr};
182 PVLink copiedStationVol{};
183 if (!stationShiftNode) {
184 copiedStationVol = make_intrusive<GeoFullPhysVol>(parentVolume->getLogVol());
186 auto volToCopy = parentVolume->getLogVol();
187 auto newShape = cacheObj.cacheShape(make_intrusive<GeoShapeShift>(volToCopy->getShape(),
188 stationShiftNode->getDefTransform()));
189 auto newLogVol = make_intrusive<GeoLogVol>(volToCopy->getName(), newShape, volToCopy->getMaterial());
190 copiedStationVol = make_intrusive<GeoFullPhysVol>(cacheObj.cacheVolume(newLogVol));
195 const std::vector<GeoChildNodeWithTrf> children = getChildrenWithRef(parentVolume,
false);
196 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};
197 for (
const GeoChildNodeWithTrf& child : children) {
198 std::vector<Amg::Vector3D> edges = getPolyShapeEdges(child.volume->getLogVol()->getShape(),
199 readOutVol->getX().inverse() * child.transform);
201 minX = std::min(minX, edge.x());
202 maxX = std::max(maxX, edge.x());
203 minZ = std::min(minZ, edge.z());
204 maxZ = std::max(maxZ, edge.z());
206 minY1 = std::min(minY1, edge.y());
207 maxY1 = std::max(maxY1, edge.y());
209 minY2 = std::min(minY2, edge.y());
210 maxY2 = std::max(maxY2, edge.y());
214 const GeoVPhysVol &childVolRef = *child.volume;
215 if (
typeid(childVolRef) ==
typeid(GeoFullPhysVol)) {
219 PVLink childVol = const_pointer_cast<GeoVPhysVol>(child.volume);
220 copiedStationVol->add(cacheObj.
newIdTag());
221 if (stationShiftNode) {
222 copiedStationVol->add(const_pointer_cast(stationShiftNode));
224 copiedStationVol->add(cacheObj.makeTransform(child.transform));
225 copiedStationVol->add(cloneVolume(childVol));
230 const double shortS = (maxY1 - minY1);
231 const double longS = (maxY2 - minY2);
232 const double lengthR = (maxX - minX);
233 const double lengthZ = (maxZ - minZ);
237 ( ( stationShiftNode ? stationShiftNode->getDefTransform() : Amg::Transform3D::Identity())
238 * readOutVol->getDefX()).inverse();
241 auto newStation = std::make_unique<MuonGM::MuonStation>(stName,
242 shortS, lengthR, lengthZ,
243 longS, lengthR, lengthZ,
244 stEta, stPhi,
false);
245 newStation->setPhysVol(copiedStationVol);
248 auto copyAlignNode = make_intrusive<GeoAlignableTransform>(alignedTransform);
249 newStation->setTransform(copyAlignNode);
250 newStation->setNominalAmdbLRSToGlobal(copyAlignNode->getTransform());
252 ATH_MSG_VERBOSE(
"stName: "<<stName<<
", stEta: "<<stEta<<
", stPhi: "<<stPhi
253 <<
" -- shortS: "<<shortS<<
", longS: "<<longS
254 <<
", lengthR: "<<lengthR<<
", lengthZ: "<<lengthZ
255 <<std::endl<<
"AlignableNode: "<<GeoTrf::toString(alignedTransform,
true)
256 <<std::endl<<
"Station shift: "<<GeoTrf::toString(stationShiftNode ? stationShiftNode->getDefTransform()
257 : Amg::Transform3D::Identity(),
true)
258 <<std::endl<<
"AmdLRSToGlobal: "<<GeoTrf::toString(newStation->getNominalAmdbLRSToGlobal(),
true)
259 <<std::endl<<
"Readout transform: "<<GeoTrf::toString(readOutVol->getX(),
true));
261 cacheObj.
world->add(copyAlignNode);
262 cacheObj.
world->add(copiedStationVol);
263 return StatusCode::SUCCESS;
270 GeoIntrusivePtr<GeoVFullPhysVol>& physVol,
274 const std::string stName{
m_idHelperSvc->stationNameString(reId)};
279 PVLink copiedStationVol{station->
getPhysVol()};
281 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
282 copiedStationVol->add(cacheObj.
newIdTag());
294 readOutVol->getParent()->getX() * readOutVol->getX()};
297 const Amg::Transform3D stationTrf{copiedStationVol->getX().inverse() * alignedNode};
299 copiedStationVol->add(cacheObj.makeTransform(stationTrf*alignNodeToRE));
301 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
302 physVol = dynamic_pointer_cast<GeoVFullPhysVol>(clonedVol);
303 copiedStationVol->add(physVol);
304 return StatusCode::SUCCESS;
309 const std::vector<const MuonGMR4::RpcReadoutElement*> readoutEles =
m_detMgr->getAllRpcReadoutElements();
310 ATH_MSG_INFO(
"Copy "<<readoutEles.size()<<
" Rpc readout elements to the legacy system");
315 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
318 auto newElement = std::make_unique<MuonGM::RpcReadoutElement>(physVol,
320 1, 1,
false, cacheObj.
detMgr.get());
321 newElement->setDoubletPhi(copyMe->doubletPhi());
322 newElement->setDoubletR(copyMe->doubletR());
323 newElement->setDoubletZ(copyMe->doubletZ());
324 newElement->setIdentifier(reId);
325 newElement->setParentMuonStation(station);
329 newElement->setLongZsize(2.*pars.halfLength);
330 newElement->setLongSsize(2.*pars.halfWidth);
331 newElement->setLongRsize(2.*pars.halfThickness);
332 newElement->setZsize(2.*pars.halfLength);
333 newElement->setSsize(2.*pars.halfWidth);
334 newElement->setRsize(2.*pars.halfThickness);
336 newElement->m_nlayers = copyMe->nGasGaps();
337 newElement->m_phistripwidth = copyMe->stripPhiWidth();
338 newElement->m_etastripwidth = copyMe->stripEtaWidth();
339 newElement->m_phistrippitch = copyMe->stripPhiPitch();
340 newElement->m_etastrippitch = Acts::copySign(1., copyMe->stationEta() -
341 (copyMe->stationEta()==0))*copyMe->stripEtaPitch();
342 newElement->m_phistriplength = copyMe->stripPhiLength();
343 newElement->m_etastriplength = copyMe->stripEtaLength();
345 newElement->m_nphistripsperpanel = copyMe->nPhiStrips();
346 newElement->m_netastripsperpanel = copyMe->nEtaStrips();
347 newElement->m_nphistrippanels = copyMe->nPhiPanels();
348 newElement->m_hasDEDontop =
true;
349 newElement->m_descratzneg =
false;
351 std::vector<Identifier> gapIds{};
352 for (
unsigned int gasGap = 1; gasGap <= copyMe->nGasGaps(); ++gasGap) {
353 for (
int doubPhi = copyMe->doubletPhiMax(); doubPhi >= copyMe->doubletPhi(); --doubPhi) {
354 for (
bool measPhi : {
false,
true}) {
355 if (measPhi && copyMe->nPhiStrips()==0)
continue;
356 const int channel = 1;
359 doubPhi, gasGap, measPhi,
362 gapIds.push_back(gapId);
363 const Amg::Vector3D locStripPos = copyMe->globalToLocalTrans(gctx) * copyMe->stripPosition(gctx, gapId);
365 newElement->m_gasGap_xPos[gasGap -1] = locStripPos.x();
368 const int dbPIdx = copyMe->doubletPhi() == 2 ? 1 : doubPhi;
370 newElement->m_first_phistrip_s[dbPIdx -1] = locStripPos.y();
371 newElement->m_phistrip_z = locStripPos.z();
373 newElement->m_first_etastrip_z = locStripPos.z();
374 newElement->m_etastrip_s[dbPIdx-1] = locStripPos.y();
379 newElement->fillCache();
382 const int surfaceHash = newElement->surfaceHash(gapId);
383 const int layerHash = newElement->layerHash(gapId);
387 Amg::Transform3D::Identity())};
389 newElement->m_surfaceData->m_layerTransforms[surfaceHash] = refTrf;
390 newElement->m_surfaceData->m_layerCenters[layerHash] = refTrf.translation();
391 newElement->m_surfaceData->m_layerNormals[layerHash] = refTrf.linear() * Amg::Vector3D::UnitZ();
396 return StatusCode::SUCCESS;
402 std::vector<const MuonGMR4::TgcReadoutElement*> tgcReadouts{
m_detMgr->getAllTgcReadoutElements()};
404 return a->stationEta() > b->stationEta();
406 ATH_MSG_INFO(
"Copy "<<tgcReadouts.size()<<
" Tgc readout elements to the legacy system");
410 std::map<std::string, std::shared_ptr<TgcReadoutParams>> readoutParMap{};
414 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
418 auto newRE = std::make_unique<MuonGM::TgcReadoutElement>(physVol,
m_idHelperSvc->stationNameString(reId),
420 newRE->setIdentifier(reId);
421 newRE->setParentMuonStation(station);
423 std::shared_ptr<TgcReadoutParams>& readOutPars = readoutParMap[std::format(
"{:}_{:}", copyMe->chamberDesign(),
424 copyMe->stationEta()> 0?
'A' :
'C')];
426 using WiregangArray = TgcReadoutParams::WiregangArray;
427 using StripArray = TgcReadoutParams::StripArray;
428 using GasGapIntArray = TgcReadoutParams::GasGapIntArray;
430 std::array<WiregangArray, 3> wires{};
431 GasGapIntArray nWireGangs{}, nStrips{};
432 std::vector<StripArray> botMountings(copyMe->nGasGaps()),
433 topMountings(copyMe->nGasGaps());
435 double wirePitch{0.};
436 for (
unsigned int gasGap =1; gasGap <= copyMe->nGasGaps(); ++gasGap) {
437 const IdentifierHash gangHash = copyMe->constructHash(0, gasGap,
false);
438 const IdentifierHash stripHash = copyMe->constructHash(0, gasGap,
true);
439 nWireGangs[gasGap -1] = copyMe->numWireGangs(gangHash);
440 nStrips[gasGap -1] = copyMe->numStrips(stripHash);
441 ATH_MSG_VERBOSE(
"Assigned wire gangs: "<<nWireGangs[gasGap-1]<<
", strips: "<<nStrips[gasGap -1]
442 <<
" for gas gap "<<gasGap);
444 if (nWireGangs[gasGap -1]) {
447 WiregangArray& fillMe{wires[gasGap-1]};
448 for (
int gang = 1; gang <= design.
numStrips(); ++gang) {
453 if (nStrips[gasGap -1]) {
455 const int nCh = nStrips[gasGap -1];
461 topMountings[gasGap-1][nCh] = - design.
stripRightTop(nCh).x();
462 ATH_MSG_VERBOSE(
"Strip layout\n bottom: "<<botMountings<<
"\n top: "<<topMountings);
465 readOutPars = std::make_unique<TgcReadoutParams>(copyMe->chamberDesign(),
468 std::move(nWireGangs),
473 std::move(botMountings),
474 std::move(topMountings),
479 for (
unsigned int gasGap = 1; gasGap <= copyMe->nGasGaps(); ++gasGap) {
480 const IdentifierHash layHash{copyMe->constructHash(0, gasGap,
false)};
482 const Amg::Vector3D translation{copyMe->globalToLocalTrans(gctx) * copyMe->center(gctx, layHash)};
483 newRE->setPlaneZ(translation.x(), gasGap);
485 newRE->setRsize(copyMe->moduleHeight());
486 newRE->setSsize(copyMe->moduleWidthS());
487 newRE->setZsize(copyMe->moduleThickness());
489 newRE->setLongRsize(copyMe->moduleHeight());
490 newRE->setLongSsize(copyMe->moduleWidthL());
491 newRE->setLongZsize(copyMe->moduleThickness());
493 newRE->setReadOutParams(readOutPars);
499 return StatusCode::SUCCESS;
502GeoIntrusivePtr<GeoVFullPhysVol>
506 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
509 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
510 GeoIntrusivePtr<GeoFullPhysVol> physVol{dynamic_pointer_cast<GeoFullPhysVol>(clonedVol)};
513 cacheObj.
world->add(physVol);
519 const auto alignStore = alignItr ?
520 static_cast<const MmAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
525 const std::vector<const MuonGMR4::MmReadoutElement*> mmReadouts{
m_detMgr->getAllMmReadoutElements()};
526 ATH_MSG_INFO(
"Copy "<<mmReadouts.size()<<
" Mm readout elements to the legacy system");
530 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, copyMe, cacheObj)};
531 auto newRE = std::make_unique<MuonGM::MMReadoutElement>(physVol,
533 copyMe->stationEta(),
534 copyMe->stationPhi(),
535 copyMe->multilayer(), cacheObj.
detMgr.get());
537 for (
unsigned int gasGap = 0; gasGap < copyMe->nGasGaps(); ++gasGap) {
541 newRE->m_Xlg[gasGap] = stripLayer.
toOrigin() *
544 ATH_MSG_VERBOSE(
"Layer transform "<<gasGap<<
" "<<GeoTrf::toString(newRE->m_Xlg[gasGap],
true));
563 if (alignStore && alignStore->getBLine(reId)) {
564 newRE->setBLinePar(*alignStore->getBLine(reId));
569 return StatusCode::SUCCESS;
574 auto alignStore = alignItr ?
static_cast<const sTgcAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
576 const std::vector<const MuonGMR4::sTgcReadoutElement*> sTgcReadOuts{
m_detMgr->getAllsTgcReadoutElements()};
577 ATH_MSG_INFO(
"Copy "<<sTgcReadOuts.size()<<
" sTgc readout elements to the legacy system");
582 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, copyMe, cacheObj)};
584 auto newRE = std::make_unique<MuonGM::sTgcReadoutElement>(physVol,
586 copyMe->stationEta(),
587 copyMe->stationPhi(),
588 copyMe->multilayer(),
591 if (alignStore && alignStore->getBLine(reId)) {
592 newRE->setBLinePar(*alignStore->getBLine(reId));
594 for (
unsigned int layer = 1; layer <= copyMe->numLayers(); ++layer) {
600 newRE->m_Xlg[layer -1] = stripLayer.
toOrigin() *
607 ChannelDesign& etaDesign{newRE->m_etaDesign[layer-1]};
608 etaDesign.type = ChannelDesign::ChannelType::etaStrip;
609 etaDesign.detType = ChannelDesign::DetType::STGC;
622 etaDesign.inputPitch = copyEtaDesign.
stripPitch();
623 etaDesign.inputWidth = copyEtaDesign.
stripWidth();
624 etaDesign.nch = copyEtaDesign.
numStrips();
631 ChannelDesign& phiDesign{newRE->m_phiDesign[layer-1]};
632 phiDesign.type = ChannelDesign::ChannelType::phiStrip;
633 phiDesign.detType = ChannelDesign::DetType::STGC;
634 if (copyPhiDesign.
yCutout() == 0.) {
644 phiDesign.inputPitch = copyPhiDesign.
stripPitch();
645 phiDesign.inputWidth = copyPhiDesign.
stripWidth();
650 phiDesign.nGroups = copyPhiDesign.
numStrips();
651 phiDesign.wireCutout = copyPhiDesign.
wireCutout();
652 phiDesign.nch = copyPhiDesign.
nAllWires();
653 phiDesign.isConvertedFromPhaseII =
true;
657 padDesign.
Length = copyMe->chamberHeight();
658 padDesign.
sWidth = copyMe->sChamberLength();
659 padDesign.
lWidth = copyMe->lChamberLength();
661 padDesign.
ysFrame = copyMe->sFrameWidth();
662 padDesign.
ylFrame = copyMe->lFrameWidth();
663 padDesign.
thickness = copyMe->thickness();
687 return StatusCode::SUCCESS;
693 static_cast<const MdtAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
695 const std::vector<const MuonGMR4::MdtReadoutElement*> mdtReadOuts{
m_detMgr->getAllMdtReadoutElements()};
696 ATH_MSG_INFO(
"Copy "<<mdtReadOuts.size()<<
" Mdt readout elements to the legacy system");
701 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
704 if (copyMe->multilayer() == 1) {
706 const double height = std::max(copyMe->moduleHeight(), otherRE->
moduleHeight()) -
707 (copyMe->tubePitch() - 2. * copyMe->tubeRadius());
710 modHalfThick{-0.5*copyMe->moduleThickness()};
712 const double thickness = ( (otherRE->
asBuiltRefFrame()*(modHalTHickO* Amg::Vector3D::UnitX())) -
713 (copyMe->asBuiltRefFrame()*(modHalfThick* Amg::Vector3D::UnitX()))).z();
714 if (copyMe->isBarrel()) {
723 auto newElement = std::make_unique<MuonGM::MdtReadoutElement>(physVol,
726 newElement->setIdentifier(reId);
727 newElement->setMultilayer(copyMe->multilayer());
728 newElement->setNMdtInStation(
m_idHelperSvc->mdtIdHelper().multilayerMax(reId));
730 newElement->setParentMuonStation(station);
733 newElement->setLongSsize(2*pars.longHalfX - 1._cm);
734 newElement->setSsize(2*pars.shortHalfX - 1._cm);
735 newElement->setLongRsize(2*pars.halfY);
736 newElement->setRsize(2*pars.halfY);
737 newElement->setZsize(2*pars.halfHeight);
738 newElement->setLongZsize(2*pars.halfHeight);
740 newElement->m_nlayers = copyMe->numLayers();
741 newElement->m_ntubesperlayer = copyMe->numTubesInLay();
742 newElement->m_deadlength = pars.deadLength;
743 newElement->m_endpluglength = pars.endPlugLength;
744 newElement->m_innerRadius = pars.tubeInnerRad;
745 newElement->m_tubeWallThickness = pars.tubeWall;
746 newElement->m_tubepitch = pars.tubePitch;
752 unsigned int step{1};
754 for (
unsigned tube = 0; tube < copyMe->numTubesInLay(); ++tube) {
757 if (std::abs(lastLength - currLength) > std::numeric_limits<float>::epsilon() ||
758 tube == copyMe->numTubesInLay() -1) {
759 newElement->m_tubelength[step-1] = lastLength;
760 newElement->m_tubelength[step] = currLength;
762 newElement->m_ntubesinastep = tube;
764 lastLength = currLength;
768 newElement->m_nsteps = step;
771 double xOffSet{pars.halfY}, yOffSet{pars.halfHeight};
772 if (newElement->barrel())
std::swap(xOffSet, yOffSet);
773 for (
unsigned lay = 1; lay <= copyMe->numLayers(); ++lay) {
775 const Amg::Vector3D locTube = copyMe->localTubePos(tubeHash);
776 newElement->m_firstwire_x[lay-1] = locTube.z() + xOffSet;
777 newElement->m_firstwire_y[lay-1] = locTube.x() + yOffSet;
788 const Amg::Vector3D refPoint = copyMe->bLineReferencePoint();
791 newElement->geoInitDone();
792 newElement->setBLinePar(distort.
bLine);
793 newElement->fillCache();
798 return StatusCode::SUCCESS;
808 return StatusCode::FAILURE;
813 return StatusCode::FAILURE;
815 return StatusCode::SUCCESS;
823 return StatusCode::SUCCESS;
828 <<GeoTrf::toString(testEle.
absTransform(),
true)<<std::endl
831 for (
unsigned int gasGap = 1; gasGap <= refEle.
nGasGaps(); ++ gasGap) {
838 <<GeoTrf::toString(refTrf,
true) <<
" vs. "<<GeoTrf::toString(testTrf,
true));
839 return StatusCode::FAILURE;
851 return StatusCode::FAILURE;
853 const double dist = refStripDir.dot(refStripPos - testStripPos);
854 if (std::abs(dist) > 10. * Gaudi::Units::micrometer) {
857 <<
" distance: "<<dist<<
" "<<(dist / testEle.
m_etaDesign[gasGap -1].inputWidth));
858 return StatusCode::FAILURE;
863 return StatusCode::SUCCESS;
871 return StatusCode::SUCCESS;
877 <<std::endl<<GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform())
881 for (
unsigned int lay = 1; lay <= refEle.
numLayers(); ++lay){
882 for (
unsigned int tube = 1; tube <= refEle.
numTubesInLay(); ++tube) {
884 if (!refEle.
isValid(tubeHash)) {
894 if ( (refPos - tubePos).
mag() > Gaudi::Units::micrometer &&
895 (globToLocal*refPos - globToLocal * tubePos).
perp() > Gaudi::Units::micrometer) {
897 <<
" reference: "<<GeoTrf::toString(globToLocal*refPos)<<
" vs. test: "
898 <<GeoTrf::toString(globToLocal*tubePos) <<
" delta: "<<(refPos - tubePos).mag()
899 <<
" Transforms "<<std::endl
900 <<
" **** "<< GeoTrf::toString(globToLocal.inverse())<<std::endl
901 <<
" **** "<< GeoTrf::toString(testEle.
transform(lay, tube)));
902 return StatusCode::FAILURE;
905 <<std::endl<<
"reference: "<<GeoTrf::toString(refPos)
906 <<std::endl<<
"test: "<<GeoTrf::toString(tubePos)
912 std::numeric_limits<float>::epsilon() ) {
916 return StatusCode::FAILURE;
921 return StatusCode::SUCCESS;
928 return StatusCode::SUCCESS;
934 <<
" test: "<<GeoTrf::toString(testEle.
absTransform(),
true)<<std::endl
937 for (
unsigned int gasGap = 1; gasGap <= refEle.
nGasGaps(); ++gasGap) {
939 for (
bool measPhi : {
false,
true}) {
940 if (measPhi && !refEle.
nPhiStrips())
continue;
944 doubPhi, gasGap, measPhi,
strip);
948 Amg::Transform3D::Identity())};
952 <<
" *** ref: "<<GeoTrf::toString(refTrans)<<std::endl
953 <<
" *** test: "<<GeoTrf::toString(testTrans)<<std::endl
954 <<
" -> delta: "<<GeoTrf::toString(refTrans.inverse()*testTrans));
955 return StatusCode::FAILURE;
968 if ((refStripPos - testStripPos).
mag() > 2e-4){
971 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refStripPos)
972 <<
" test: "<<
Amg::toString(refTrans.inverse()*testStripPos));
973 return StatusCode::FAILURE;
977 <<
", local: "<<
Amg::toString(refTrans.inverse()*refStripPos));
982 return StatusCode::SUCCESS;
989 return StatusCode::SUCCESS;
997 <<std::endl<<GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform(),
true)
1002 for (
unsigned int gasGap = 1; gasGap <= refEle.
nGasGaps(); ++gasGap) {
1003 for (
bool isStrip : {
false,
true}) {
1010 (!isStrip ? Amg::Transform3D::Identity()
1015 <<std::endl<<
"ref : "<<GeoTrf::toString(refLayerTrf,
true)
1016 <<std::endl<<
"test: "<<GeoTrf::toString(testLayerTrf,
true)
1017 <<
" are not identical. ");
1018 return StatusCode::FAILURE;
1021 <<std::endl<<
"ref : "<<GeoTrf::toString(refLayerTrf,
true)
1022 <<std::endl<<
"test: "<<GeoTrf::toString(testLayerTrf,
true));
1024 for (
unsigned int ch = 1; ch <= refEle.
numChannels(layHash); ++ch) {
1029 if ((refChannel - testChannel).
mag() < std::numeric_limits<float>::epsilon()){
1032 std::stringstream
msg{};
1034 <<
" is not at the same position "<<
Amg::toString(refChannel)
1036 <<(refChannel - testChannel).
mag();
1038 msg<<std::endl<<
"*** Test *** - wirePitch: "<<testEle.
wirePitch()
1039 <<
", tot wires "<<testEle.
nWires(gasGap)
1041 <<
", wires in gang "<<testEle.
nWires(gasGap, ch);
1043 msg<<std::endl<<
"*** Ref *** - wirePitch: "<<design.
stripPitch()
1044 <<
", tot wires "<<testEle.
nWires(gasGap)
1048 const Amg::Vector3D locRefPos{refLayerTrf.inverse() * refChannel};
1049 const Amg::Vector3D locTestPos{refLayerTrf.inverse()* testChannel};
1054 return StatusCode::FAILURE;
1059 return StatusCode::SUCCESS;
1065 return StatusCode::SUCCESS;
1070 <<GeoTrf::toString(testEle.
absTransform(),
true)<<std::endl
1073 for (
unsigned int gasGap = 1; gasGap <= refEle.
numLayers(); ++gasGap) {
1078 const unsigned int numChannel = refEle.
numChannels(layHash);
1079 constexpr unsigned firstCh = 1;
1080 for (
unsigned int channel = firstCh; channel < numChannel ; ++channel) {
1097 return StatusCode::FAILURE;
1104 || (testTrans.inverse()*refTrans).translation().perp() >
1105 std::numeric_limits<float>::epsilon() ) ) {
1106 ATH_MSG_ERROR(__func__<<
"() "<<__LINE__<<
" - Transformation for "
1108 <<
" *** ref: "<<GeoTrf::toString(refTrans,
true)<<std::endl
1109 <<
" *** test: "<<GeoTrf::toString(testTrans,
true));
1110 return StatusCode::FAILURE;
1119 const std::array<Amg::Vector3D,4> refPadCorners = refEle.
globalPadCorners(gctx, measHash);
1122 for (
unsigned int cornerIdx = 0; cornerIdx < refPadCorners.size(); ++cornerIdx) {
1123 const double padCornerDiff = (refPadCorners[cornerIdx] - testPadCorners[cornerIdx]).
mag();
1124 if (padCornerDiff - 25. > 1. * Gaudi::Units::micrometer){
1127 <<
" difference: " << padCornerDiff
1128 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refPadCorners[cornerIdx])
1129 <<
" test: "<<
Amg::toString(testPadTrans.inverse()*testPadCorners[cornerIdx]));
1130 return StatusCode::FAILURE;
1133 const double padChannelDiff = (refChannelPos - testChannelPos).
mag();
1134 if (padChannelDiff - 25. > 1. * Gaudi::Units::micrometer){
1137 <<
" difference: " << padChannelDiff
1138 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refChannelPos)
1139 <<
" test: "<<
Amg::toString(testPadTrans.inverse()*testChannelPos));
1140 return StatusCode::FAILURE;
1148 if ((refChannelPos - testChannelPos).
mag() > 1. * Gaudi::Units::micrometer){
1151 <<
" local coordinates -- ref: "<<
Amg::toString(testTrans.inverse()*refChannelPos)
1152 <<
" test: "<<
Amg::toString(testTrans.inverse()*testChannelPos));
1153 return StatusCode::FAILURE;
1160 Amg::Vector3D localRefPos {testTrans.inverse()*refChannelPos};
1161 Amg::Vector3D localTestPos{testTrans.inverse()*testChannelPos};
1163 if((std::abs(localRefPos.x() -localTestPos.x()) > 1.* Gaudi::Units::micrometer)
1164 || (std::abs(refChannelPos.z() -testChannelPos.z()) > 15.* Gaudi::Units::micrometer)){
1167 <<
" local coordinates -- ref: "<<
Amg::toString(testTrans.inverse()*refChannelPos)
1168 <<
" test: "<<
Amg::toString(testTrans.inverse()*testChannelPos)
1169 <<
"delta X: "<<std::abs(localRefPos.x() -localTestPos.x())
1170 <<
", delta Z: "<<std::abs(localRefPos.z() -localTestPos.z()));
1171 return StatusCode::FAILURE;
1177 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
Store holding the transfomations used by the Acts algorithms.
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.
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
double wireLength(const IdentifierHash &hash) const
static IdentifierHash measurementHash(unsigned int layerNumber, unsigned int tubeNumber)
Transform the layer and tube number to the measurementHash.
double activeTubeLength(const IdentifierHash &hash) const
double tubeLength(const IdentifierHash &hash) const
bool isValid(const IdentifierHash &measHash) const
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 global position of the tube center.
unsigned int numTubesInLay() const
Returns the number of tubes per layer.
double moduleThickness() const
Returns the thickness of the chamber.
double uncutTubeLength(const IdentifierHash &tubeHash) const
Returns the uncut tube length.
const MdtReadoutElement * complementaryRE() const
Returns the pointer to the other readout element inside the muon station.
Identifier measurementId(const IdentifierHash &measHash) const override final
Converts the measurement hash back to the full Identifier.
unsigned int numLayers() const
Returns the number of tube layer.
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
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)
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
const Amg::Transform3D & localToGlobalTrans(const ActsTrk::GeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
IdentifierHash identHash() const
Returns the Identifier has of the Element that is Identical to the detElHash from the id_helper class...
Identifier identify() const override final
Return the athena identifier.
const GeoAlignableTransform * alignableTransform() const
Returnsthe alignable transform of the readout element.
Amg::Transform3D globalToLocalTrans(const ActsTrk::GeometryContext &ctx) const
Transformations to translate between local <-> global coordinates.
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
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
StatusCode buildRpc(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
GeoIntrusivePtr< GeoVFullPhysVol > cloneNswWedge(const ActsTrk::GeometryContext &gctx, const MuonGMR4::MuonReadoutElement *nswRE, ConstructionCache &cacheObj) const
Clones the fullPhysicalVolume of the.
StatusCode buildTgc(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
Gaudi::Property< bool > m_dumpGeo
StatusCode buildSTGC(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
StatusCode dumpAndCompare(const ActsTrk::GeometryContext &gctx, const MuonGMR4::RpcReadoutElement &refEle, const MuonGM::RpcReadoutElement &testEle) const
StatusCode checkIdCompability(const MuonGMR4::MuonReadoutElement &refEle, const MuonGM::MuonReadoutElement &testEle) const
StatusCode buildMM(const ActsTrk::GeometryContext &gctx, ConstructionCache &cacheObj) const
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
Converts the measurement hash back to the full Identifier.
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
The ReadoutGeomCnvAlg converts the Run4 Readout geometry build from the GeoModelXML into the legacy M...
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.
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