7 #include <GeoModelKernel/GeoVPhysVol.h>
11 #include <GeoModelKernel/GeoFullPhysVol.h>
37 #include <GaudiKernel/SystemOfUnits.h>
39 #include <GeoModelHelpers/defineWorld.h>
40 #include <GeoModelHelpers/cloneVolume.h>
41 #include <GeoModelHelpers/getChildNodesWithTrf.h>
42 #include <GeoModelHelpers/TransformToStringConverter.h>
43 #include <GeoModelHelpers/GeoShapeUtils.h>
46 #include <GaudiKernel/SystemOfUnits.h>
51 bool hasStationVolume(
const PVConstLink treeTop,
52 const std::set<PVConstLink>& translated) {
53 const unsigned int nCh = treeTop->getNChildVols();
54 for (
unsigned int ch = 0 ;
ch < nCh; ++
ch) {
55 PVConstLink child = treeTop->getChildVol(
ch);
56 if (translated.count(child) ||
57 hasStationVolume(child, translated)){
74 return StatusCode::SUCCESS;
80 if (writeHandle.isValid()) {
81 ATH_MSG_DEBUG(
"The current readout geometry is still valid.");
82 return StatusCode::SUCCESS;
90 if (!readHandle.isValid()) {
92 return StatusCode::FAILURE;
94 writeHandle.addDependency(readHandle);
95 auto alignStore = std::make_unique<ActsTrk::DetectorAlignStore>(**readHandle);
97 if (alignStore->geoModelAlignment) {
98 alignStore->geoModelAlignment->clearPosCache();
100 alignStore->trackingAlignment = std::make_unique<TrackingAlignment>(alignStore->detType);
101 geoContext.setStore(std::move(alignStore));
107 if (geoContext.getStore(detType)) {
111 geoContext.setStore(std::make_unique<ActsTrk::DetectorAlignStore>(detType));
115 cacheObj.
detMgr = std::make_unique<MuonGM::MuonDetectorManager>();
116 cacheObj.
world = createGeoWorld();
125 std::vector<GeoChildNodeWithTrf> treeTops = getChildrenWithRef(
m_detMgr->
getTreeTop(0),
false);
128 for (
const GeoChildNodeWithTrf& treeTop : treeTops) {
132 cacheObj.
world->add(const_pointer_cast(treeTop.volume));
144 return StatusCode::SUCCESS;
149 const std::string stName{
m_idHelperSvc->stationNameString(stationId)};
154 ATH_MSG_DEBUG(
"Station "<<stName<<
" "<<stEta<<
" "<<stPhi<<
" already exists.");
155 return StatusCode::SUCCESS;
161 const GeoVFullPhysVol* readOutVol = copyMe->getMaterialGeom();
162 PVConstLink parentVolume = readOutVol->getParent();
165 PVLink parentPhysVol{make_intrusive<GeoFullPhysVol>(parentVolume->getLogVol())};
169 const std::vector<GeoChildNodeWithTrf>
children = getChildrenWithRef(parentVolume,
false);
170 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};
171 for (
const GeoChildNodeWithTrf& child :
children) {
172 std::vector<Amg::Vector3D> edges = getPolyShapeEdges(child.volume->getLogVol()->getShape(),
173 readOutVol->getX().inverse() * child.transform);
190 const double shortS = (maxY1 - minY1);
191 const double longS = (maxY2 - minY2);
192 const double lengthR = (maxX - minX);
193 const double lengthZ = (maxZ - minZ);
199 const Amg::Transform3D stationTransform = alignTrf->getDefTransform().inverse()*parentVolume->getX();
201 for (
const GeoChildNodeWithTrf& child :
children) {
203 const GeoVPhysVol &childVolRef = *child.volume;
204 if (
typeid(childVolRef) ==
typeid(GeoFullPhysVol)) {
208 PVLink childVol = const_pointer_cast<GeoVPhysVol>(child.volume);
209 parentPhysVol->add(cacheObj.
newIdTag());
210 parentPhysVol->add(cacheObj.makeTransform(stationTransform*child.transform));
211 parentPhysVol->add(cloneVolume(childVol));
215 (stationTransform * readOutVol->getX()).
inverse();
217 ATH_MSG_VERBOSE(
"stName "<<stName<<
","<<stEta<<
","<<stPhi<<
" -- shortS: "<<shortS<<
", longS: "<<longS
218 <<
", lengthR: "<<lengthR<<
", lengthZ "<<lengthZ
220 <<std::endl<<
"Station transform: "<<
GeoTrf::toString(stationTransform,
true)
221 <<std::endl<<
"Readout transform: "<<
GeoTrf::toString(readOutVol->getX(),
true));
222 auto newStation = std::make_unique<MuonGM::MuonStation>(stName,
223 shortS, lengthR, lengthZ,
224 longS, lengthR, lengthZ,
225 stEta, stPhi,
false);
226 newStation->setPhysVol(parentPhysVol);
229 GeoIntrusivePtr<GeoAlignableTransform>
trf = make_intrusive<GeoAlignableTransform>(alignedTransform);
230 newStation->setTransform(
trf);
231 cacheObj.
detMgr->addMuonStation(std::move(newStation));
234 cacheObj.
world->add(parentPhysVol);
236 return StatusCode::SUCCESS;
243 GeoIntrusivePtr<GeoVFullPhysVol>& physVol,
247 const std::string stName{
m_idHelperSvc->stationNameString(reId)};
248 station = cacheObj.
detMgr->getMuonStation(stName,
254 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
255 parentPhysVol->add(cacheObj.
newIdTag());
267 readOutVol->getParent()->getX() * readOutVol->getX()};
272 parentPhysVol->add(cacheObj.makeTransform(stationTrf*alignNodeToRE));
274 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
275 physVol = dynamic_pointer_cast<GeoVFullPhysVol>(clonedVol);
276 parentPhysVol->add(physVol);
277 return StatusCode::SUCCESS;
282 const std::vector<const MuonGMR4::RpcReadoutElement*> readoutEles =
m_detMgr->getAllRpcReadoutElements();
283 ATH_MSG_INFO(
"Copy "<<readoutEles.size()<<
" Rpc readout elements to the legacy system");
288 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
291 auto newElement = std::make_unique<MuonGM::RpcReadoutElement>(physVol,
293 1, 1,
false, cacheObj.
detMgr.get());
294 const bool aSide{copyMe->stationEta() > 0};
295 newElement->setDoubletPhi(copyMe->doubletPhi());
296 newElement->setDoubletR(copyMe->doubletR());
297 newElement->setDoubletZ(copyMe->doubletZ());
298 newElement->setIdentifier(reId);
299 newElement->setParentMuonStation(station);
302 newElement->setLongRsize(
pars.halfLength);
303 newElement->setLongSsize(
pars.halfWidth);
304 newElement->setLongZsize(
pars.halfThickness);
305 newElement->setRsize(
pars.halfLength);
306 newElement->setSsize(
pars.halfWidth);
307 newElement->setZsize(
pars.halfThickness);
309 newElement->m_nlayers = copyMe->nGasGaps();
310 newElement->m_phistripwidth = copyMe->stripPhiWidth();
311 newElement->m_etastripwidth = copyMe->stripEtaWidth();
312 newElement->m_phistrippitch = copyMe->stripPhiPitch();
313 newElement->m_etastrippitch = (aSide > 0 ? 1. : -1.) *copyMe->stripEtaPitch();
314 newElement->m_phistriplength = copyMe->stripPhiLength();
315 newElement->m_etastriplength = copyMe->stripEtaLength();
317 newElement->m_nphistripsperpanel = copyMe->nPhiStrips();
318 newElement->m_netastripsperpanel = copyMe->nEtaStrips();
319 newElement->m_nphistrippanels = copyMe->nPhiPanels();
320 newElement->m_hasDEDontop =
true;
321 newElement->m_descratzneg =
false;
323 std::vector<Identifier> gapIds{};
325 for (
int doubPhi = copyMe->doubletPhiMax(); doubPhi >= copyMe->doubletPhi(); --doubPhi) {
326 for (
bool measPhi : {
false,
true}) {
327 if (measPhi && copyMe->nPhiStrips()==0)
continue;
329 const Identifier gapId = idHelper.channelID(copyMe->identify(),
334 gapIds.push_back(gapId);
335 const Amg::Vector3D locStripPos = copyMe->globalToLocalTrans(gctx) * copyMe->stripPosition(gctx, gapId);
337 newElement->m_gasGap_xPos[
gasGap -1] = locStripPos.x();
340 const int dbPIdx = copyMe->doubletPhi() == 2 ? 1 : doubPhi;
342 newElement->m_first_phistrip_s[dbPIdx -1] = locStripPos.y();
343 newElement->m_phistrip_z = locStripPos.z();
345 newElement->m_first_etastrip_z = locStripPos.z();
346 newElement->m_etastrip_s[dbPIdx-1] = locStripPos.y();
351 newElement->fillCache();
354 const int surfaceHash = newElement->surfaceHash(gapId);
355 const int layerHash = newElement->layerHash(gapId);
357 newElement->m_surfaceData->m_layerTransforms[surfaceHash] = refTrf;
358 newElement->m_surfaceData->m_layerCenters[layerHash] = refTrf.translation();
359 newElement->m_surfaceData->m_layerNormals[layerHash] = refTrf.linear() * Amg::Vector3D::UnitZ();
362 cacheObj.
detMgr->addRpcReadoutElement(std::move(newElement));
364 return StatusCode::SUCCESS;
370 std::vector<const MuonGMR4::TgcReadoutElement*> tgcReadouts{
m_detMgr->getAllTgcReadoutElements()};
371 std::stable_sort(tgcReadouts.begin(), tgcReadouts.end(),
373 return a->stationEta() > b->stationEta();
375 ATH_MSG_INFO(
"Copy "<<tgcReadouts.size()<<
" Tgc readout elements to the legacy system");
379 std::map<std::string, std::shared_ptr<TgcReadoutParams>> readoutParMap{};
383 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
387 auto newRE = std::make_unique<MuonGM::TgcReadoutElement>(physVol,
m_idHelperSvc->stationNameString(reId),
389 newRE->setIdentifier(reId);
390 newRE->setParentMuonStation(station);
392 std::shared_ptr<TgcReadoutParams>& readOutPars = readoutParMap[copyMe->chamberDesign()];
398 std::array<WiregangArray, 3> wires{};
401 bool stripSet{
false};
402 double wirePitch{0.};
407 if (nWireGangs[
gasGap -1]) {
411 for (
int gang = 1; gang <= design.numStrips(); ++gang) {
412 fillMe[gang -1] = design.numWiresInGroup(gang);
418 for (
int strip = 1; strip <= nCh; ++strip) {
419 botMountings[strip-1] = - design.stripLeftBottom(strip).x();
420 topMountings[strip-1] = - design.stripLeftTop(strip).x();
422 botMountings[nCh] = - design.stripRightBottom(nCh).x();
423 topMountings[nCh] = - design.stripRightTop(nCh).x();
428 readOutPars = std::make_unique<TgcReadoutParams>(copyMe->chamberDesign(),
430 idHelper.stationPhiMax(reId),
431 std::move(nWireGangs),
436 std::move(botMountings),
437 std::move(topMountings),
445 const Amg::Vector3D translation{copyMe->globalToLocalTrans(gctx) * copyMe->center(gctx, layHash)};
446 newRE->setPlaneZ(translation.x(),
gasGap);
448 newRE->setSsize(copyMe->moduleHeight());
449 newRE->setRsize(copyMe->moduleWidthS());
450 newRE->setZsize(copyMe->moduleThickness());
452 newRE->setLongSsize(copyMe->moduleHeight());
453 newRE->setLongRsize(copyMe->moduleWidthL());
454 newRE->setLongZsize(copyMe->moduleThickness());
456 newRE->setReadOutParams(readOutPars);
459 cacheObj.
detMgr->addTgcReadoutElement(std::move(newRE));
462 return StatusCode::SUCCESS;
465 GeoIntrusivePtr<GeoVFullPhysVol>
469 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
472 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
473 GeoIntrusivePtr<GeoFullPhysVol> physVol{dynamic_pointer_cast<GeoFullPhysVol>(clonedVol)};
476 cacheObj.
world->add(physVol);
482 const auto alignStore = alignItr ?
483 static_cast<const MmAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
485 const std::vector<const MuonGMR4::MmReadoutElement*> mmReadouts{
m_detMgr->getAllMmReadoutElements()};
486 ATH_MSG_INFO(
"Copy "<<mmReadouts.size()<<
" Mm readout elements to the legacy system");
490 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, copyMe, cacheObj)};
491 auto newRE = std::make_unique<MuonGM::MMReadoutElement>(physVol,
493 copyMe->stationEta(),
494 copyMe->stationPhi(),
495 copyMe->multilayer(), cacheObj.
detMgr.get(),
496 alignStore ? alignStore->passivation :
nullptr);
502 newRE->m_Xlg[
gasGap] = stripLayer.toOrigin() *
509 designFrom.longHalfHeight(),
510 designFrom.halfWidth(),
511 designFrom.stereoAngle());
514 designTo.inputPitch = designFrom.stripPitch();
515 designTo.inputWidth = designTo.inputPitch *
std::cos(designTo.stereoAngle());
516 designTo.nMissedBottomEta = designTo.nMissedBottomStereo = designFrom.firstStripNumber() - 1;
517 designTo.totalStrips = designFrom.numStrips();
518 designTo.nch = designFrom.numStrips();
520 designTo.setFirstPos(designFrom.firstStripPos().x() + 0.5*designTo.inputPitch);
524 if (alignStore && alignStore->getBLine(reId)) {
525 newRE->setBLinePar(*alignStore->getBLine(reId));
528 cacheObj.
detMgr->addMMReadoutElement(std::move(newRE));
530 return StatusCode::SUCCESS;
535 auto alignStore = alignItr ?
static_cast<const sTgcAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
537 const std::vector<const MuonGMR4::sTgcReadoutElement*> sTgcReadOuts{
m_detMgr->getAllsTgcReadoutElements()};
538 ATH_MSG_INFO(
"Copy "<<sTgcReadOuts.size()<<
" sTgc readout elements to the legacy system");
542 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, copyMe, cacheObj)};
544 auto newRE = std::make_unique<MuonGM::sTgcReadoutElement>(physVol,
546 copyMe->stationEta(),
547 copyMe->stationPhi(),
548 copyMe->multilayer(),
551 if (alignStore && alignStore->getBLine(reId)) {
552 newRE->setBLinePar(*alignStore->getBLine(reId));
559 copyMe->center(gctx, layerHash));
563 ChannelDesign& etaDesign{newRE->m_etaDesign[
layer-1]};
564 etaDesign.type = ChannelDesign::ChannelType::etaStrip;
566 if (copyEtaDesign.yCutout()) {
567 etaDesign.defineDiamond(copyEtaDesign.shortHalfHeight(),
568 copyEtaDesign.longHalfHeight(),
569 copyEtaDesign.halfWidth(),
570 copyEtaDesign.yCutout());
572 etaDesign.defineTrapezoid(copyEtaDesign.shortHalfHeight(),
573 copyEtaDesign.longHalfHeight(),
574 copyEtaDesign.halfWidth());
576 etaDesign.inputPitch = copyEtaDesign.stripPitch();
577 etaDesign.inputWidth = copyEtaDesign.stripWidth();
578 etaDesign.nch = copyEtaDesign.numStrips();
579 etaDesign.setFirstPos(copyEtaDesign.firstStripPos().x());
584 ChannelDesign& phiDesign{newRE->m_phiDesign[
layer-1]};
585 phiDesign.type = ChannelDesign::ChannelType::phiStrip;
587 if (copyPhiDesign.yCutout() == 0.) {
588 phiDesign.defineTrapezoid(copyPhiDesign.shortHalfHeight(),
589 copyPhiDesign.longHalfHeight(),
590 copyPhiDesign.halfWidth());
592 phiDesign.defineDiamond(copyPhiDesign.shortHalfHeight(),
593 copyPhiDesign.longHalfHeight(),
594 copyPhiDesign.halfWidth(),
595 copyPhiDesign.yCutout());
597 phiDesign.inputPitch = copyPhiDesign.stripPitch();
598 phiDesign.inputWidth = copyPhiDesign.stripWidth();
599 phiDesign.setFirstPos(copyPhiDesign.firstStripPos().x());
600 phiDesign.firstPitch = copyPhiDesign.numWiresInGroup(1);
601 phiDesign.groupWidth = copyPhiDesign.numWiresInGroup(2);
602 phiDesign.nGroups = copyPhiDesign.numStrips();
603 phiDesign.wireCutout = copyPhiDesign.wireCutout();
604 phiDesign.nch = copyPhiDesign.nAllWires();
608 padDesign.
Length = copyMe->chamberHeight();
609 padDesign.sWidth = copyMe->sChamberLength();
610 padDesign.lWidth = copyMe->lChamberLength();
611 padDesign.Size = 2.*copyPadDesign.halfWidth();
612 padDesign.ysFrame = copyMe->sFrameWidth();
613 padDesign.ylFrame = copyMe->lFrameWidth();
614 padDesign.thickness = copyMe->thickness();
615 padDesign.yCutout = copyPadDesign.yCutout();
616 padDesign.setR(copyPadDesign.beamlineRadius());
617 padDesign.sPadWidth = 2.*copyPadDesign.shortHalfHeight();
618 padDesign.lPadWidth = 2.*copyPadDesign.longHalfHeight();
619 padDesign.nPadColumns = copyPadDesign.numPadPhi();
620 padDesign.firstPhiPos = copyPadDesign.firstPadPhiDiv();
621 padDesign.inputPhiPitch = copyPadDesign.anglePadPhi();
622 padDesign.PadPhiShift = copyPadDesign.padPhiShift();
623 padDesign.nPadH = copyPadDesign.numPadEta();
624 padDesign.padEtaMax = copyPadDesign.maxPadEta();
625 padDesign.firstRowPos = copyPadDesign.firstPadHeight();
626 padDesign.inputRowPitch = copyPadDesign.padHeight();
627 padDesign.sectorOpeningAngle = copyPadDesign.sectorAngle();
631 cacheObj.
detMgr->addsTgcReadoutElement(std::move(newRE));
633 return StatusCode::SUCCESS;
639 static_cast<const MdtAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
641 const std::vector<const MuonGMR4::MdtReadoutElement*> mdtReadOuts{
m_detMgr->getAllMdtReadoutElements()};
642 ATH_MSG_INFO(
"Copy "<<mdtReadOuts.size()<<
" Mdt readout elements to the legacy system");
647 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
652 auto newElement = std::make_unique<MuonGM::MdtReadoutElement>(physVol,
655 newElement->setIdentifier(reId);
656 newElement->setMultilayer(copyMe->multilayer());
657 newElement->setNMdtInStation(
m_idHelperSvc->mdtIdHelper().multilayerMax(reId));
659 newElement->setParentMuonStation(station);
661 newElement->setLongRsize(2*
pars.halfY);
664 newElement->setLongZsize(2*
pars.halfHeight);
665 newElement->setRsize(2*
pars.halfY);
667 newElement->setZsize(2*
pars.halfHeight);
669 newElement->m_nlayers = copyMe->numLayers();
670 newElement->m_ntubesperlayer = copyMe->numTubesInLay();
671 newElement->m_deadlength =
pars.deadLength;
672 newElement->m_endpluglength =
pars.endPlugLength;
673 newElement->m_innerRadius =
pars.tubeInnerRad;
674 newElement->m_tubeWallThickness =
pars.tubeWall;
675 newElement->m_tubepitch =
pars.tubePitch;
681 unsigned int step{1};
682 double lastLength{2.*tubeLay.uncutHalfLength(1)};
683 for (
unsigned tube = 0;
tube < copyMe->numTubesInLay(); ++
tube) {
684 const double currLength = 2.*tubeLay.uncutHalfLength(
tube);
686 if (std::abs(lastLength - currLength) > std::numeric_limits<float>::epsilon() ||
687 tube == copyMe->numTubesInLay() -1) {
688 newElement->m_tubelength[
step-1] = lastLength;
689 newElement->m_tubelength[
step] = currLength;
691 newElement->m_ntubesinastep =
tube;
693 lastLength = currLength;
697 newElement->m_nsteps =
step;
700 double xOffSet{
pars.halfY}, yOffSet{
pars.halfHeight};
701 if (newElement->barrel())
std::swap(xOffSet, yOffSet);
702 for (
unsigned lay = 1; lay <= copyMe->numLayers(); ++lay) {
704 const Amg::Vector3D locTube = copyMe->localTubePos(tubeHash);
705 newElement->m_firstwire_x[lay-1] = locTube.z() + xOffSet;
706 newElement->m_firstwire_y[lay-1] = locTube.x() + yOffSet;
711 if (!station->hasMdtAsBuiltParams()){
712 station->setMdtAsBuiltParams(distort.
asBuilt);
714 if (!station->hasBLines()){
715 station->setBline(distort.
bLine);
717 const Amg::Vector3D refPoint = copyMe->bLineReferencePoint();
718 station->setBlineFixedPointInAmdbLRS(refPoint.x(), refPoint.y(), refPoint.z());
720 newElement->geoInitDone();
721 newElement->setBLinePar(distort.
bLine);
722 newElement->fillCache();
725 cacheObj.
detMgr->addMdtReadoutElement(std::move(newElement));
727 return StatusCode::SUCCESS;
737 return StatusCode::FAILURE;
742 return StatusCode::FAILURE;
744 return StatusCode::SUCCESS;
752 return StatusCode::SUCCESS;
768 return StatusCode::FAILURE;
772 for (
int strip = stripDesign.firstStripNumber(); strip <= stripDesign.numStrips(); ++strip) {
780 return StatusCode::FAILURE;
782 const double dist = refStripDir.dot(refStripPos - testStripPos);
787 return StatusCode::FAILURE;
792 return StatusCode::SUCCESS;
800 return StatusCode::SUCCESS;
806 <<std::endl<<
GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform())
810 for (
unsigned int lay = 1; lay <= refEle.
numLayers(); ++lay){
813 if (!refEle.
isValid(tubeHash)) {
827 <<
GeoTrf::toString(globToLocal*tubePos) <<
" delta: "<<(refPos - tubePos).mag()
828 <<
" Transforms "<<std::endl
831 return StatusCode::FAILURE;
841 std::numeric_limits<float>::epsilon() ) {
845 return StatusCode::FAILURE;
850 return StatusCode::SUCCESS;
857 return StatusCode::SUCCESS;
868 for (
bool measPhi : {
false,
true}) {
869 if (measPhi && !refEle.
nPhiStrips())
continue;
870 for (
int strip = 1; strip <= testEle.
Nstrips(measPhi); ++strip) {
873 doubPhi,
gasGap, measPhi, strip);
882 return StatusCode::FAILURE;
895 if ((refStripPos - testStripPos).
mag() > 2
e-4){
898 <<
" local coordinates -- ref: "<<
Amg::toString(refTrans.inverse()*refStripPos)
899 <<
" test: "<<
Amg::toString(refTrans.inverse()*testStripPos));
900 return StatusCode::FAILURE;
904 <<
", local: "<<
Amg::toString(refTrans.inverse()*refStripPos));
909 return StatusCode::SUCCESS;
916 return StatusCode::SUCCESS;
924 <<std::endl<<
GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform(),
true)
930 for (
bool isStrip : {
false,
true}) {
941 <<
" are not identical. ");
942 return StatusCode::FAILURE;
953 if ((refChannel - testChannel).
mag() < std::numeric_limits<float>::epsilon()){
956 std::stringstream
msg{};
958 <<
" is not at the same position "<<
Amg::toString(refChannel)
960 <<(refChannel - testChannel).
mag();
962 msg<<std::endl<<
"*** Test *** - wirePitch: "<<testEle.
wirePitch()
967 msg<<std::endl<<
"*** Ref *** - wirePitch: "<<design.stripPitch()
969 <<
", wires to reach "<<design.numPitchesToGroup(
ch)
970 <<
", wires in gang "<<design.numWiresInGroup(
ch);
972 const Amg::Vector3D locRefPos{refLayerTrf.inverse() * refChannel};
973 const Amg::Vector3D locTestPos{refLayerTrf.inverse()* testChannel};
978 return StatusCode::FAILURE;
983 return StatusCode::SUCCESS;
990 return StatusCode::SUCCESS;
999 for (
int chType = sTgcIdHelper::sTgcChannelTypes::Pad;
chType <= sTgcIdHelper::sTgcChannelTypes::Wire; ++
chType) {
1000 unsigned int numChannel = 0;
1005 case sTgcIdHelper::sTgcChannelTypes::Pad:
1006 numChannel = refEle.
numPads(layID);
1009 case sTgcIdHelper::sTgcChannelTypes::Strip:
1013 case sTgcIdHelper::sTgcChannelTypes::Wire:
1028 return StatusCode::FAILURE;
1030 if (
chType == sTgcIdHelper::sTgcChannelTypes::Pad) {
1035 const std::array<Amg::Vector3D,4> refPadCorners = refEle.
globalPadCorners(gctx, chID);
1036 std::array<Amg::Vector3D,4> testPadCorners{make_array<Amg::Vector3D, 4>(
Amg::Vector3D::Zero())};
1038 for (
unsigned int cornerIdx = 0; cornerIdx < refPadCorners.size(); ++cornerIdx) {
1044 return StatusCode::FAILURE;
1052 return StatusCode::FAILURE;
1066 return StatusCode::FAILURE;
1074 return StatusCode::SUCCESS;