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)){
73 return StatusCode::SUCCESS;
79 if (writeHandle.isValid()) {
80 ATH_MSG_DEBUG(
"The current readout geometry is still valid.");
81 return StatusCode::SUCCESS;
89 if (!readHandle.isValid()) {
91 return StatusCode::FAILURE;
93 writeHandle.addDependency(readHandle);
94 auto alignStore = std::make_unique<ActsTrk::DetectorAlignStore>(**readHandle);
96 if (alignStore->geoModelAlignment) {
97 alignStore->geoModelAlignment->clearPosCache();
99 alignStore->trackingAlignment = std::make_unique<TrackingAlignment>(alignStore->detType);
100 geoContext.setStore(std::move(alignStore));
106 if (geoContext.getStore(detType)) {
110 geoContext.setStore(std::make_unique<ActsTrk::DetectorAlignStore>(detType));
114 cacheObj.
detMgr = std::make_unique<MuonGM::MuonDetectorManager>();
115 cacheObj.
world = createGeoWorld();
124 std::vector<GeoChildNodeWithTrf> treeTops = getChildrenWithRef(
m_detMgr->
getTreeTop(0),
false);
127 for (
const GeoChildNodeWithTrf& treeTop : treeTops) {
131 cacheObj.
world->add(const_pointer_cast(treeTop.volume));
143 return StatusCode::SUCCESS;
148 const std::string stName{
m_idHelperSvc->stationNameString(stationId)};
153 ATH_MSG_DEBUG(
"Station "<<stName<<
" "<<stEta<<
" "<<stPhi<<
" already exists.");
154 return StatusCode::SUCCESS;
160 const GeoVFullPhysVol* readOutVol = copyMe->getMaterialGeom();
161 PVConstLink parentVolume = readOutVol->getParent();
164 PVLink parentPhysVol{make_intrusive<GeoFullPhysVol>(parentVolume->getLogVol())};
168 const std::vector<GeoChildNodeWithTrf>
children = getChildrenWithRef(parentVolume,
false);
169 double minX{1.e9}, maxX{-1.e9}, minY1{1.e9}, maxY1{-1.e9}, minY2{1.e9}, maxY2{-1.e9}, minZ{1.e9}, maxZ{-1.e9};
170 for (
const GeoChildNodeWithTrf& child :
children) {
171 std::vector<Amg::Vector3D> edges = getPolyShapeEdges(child.volume->getLogVol()->getShape(),
172 readOutVol->getX().inverse() * child.transform);
189 const double shortS = (maxY1 - minY1);
190 const double longS = (maxY2 - minY2);
191 const double lengthR = (maxX - minX);
192 const double lengthZ = (maxZ - minZ);
198 const Amg::Transform3D stationTransform = alignTrf->getDefTransform().inverse()*parentVolume->getX();
200 for (
const GeoChildNodeWithTrf& child :
children) {
202 const GeoVPhysVol &childVolRef = *child.volume;
203 if (
typeid(childVolRef) ==
typeid(GeoFullPhysVol)) {
207 PVLink childVol = const_pointer_cast<GeoVPhysVol>(child.volume);
208 parentPhysVol->add(cacheObj.
newIdTag());
209 parentPhysVol->add(cacheObj.
makeTransform(stationTransform*child.transform));
210 parentPhysVol->add(cloneVolume(childVol));
214 (stationTransform * readOutVol->getX()).inverse();
216 ATH_MSG_VERBOSE(
"stName "<<stName<<
","<<stEta<<
","<<stPhi<<
" -- shortS: "<<shortS<<
", longS: "<<longS
217 <<
", lengthR: "<<lengthR<<
", lengthZ "<<lengthZ
219 <<std::endl<<
"Station transform: "<<
GeoTrf::toString(stationTransform,
true)
220 <<std::endl<<
"Readout transform: "<<
GeoTrf::toString(readOutVol->getX(),
true));
221 auto newStation = std::make_unique<MuonGM::MuonStation>(stName,
222 shortS, lengthR, lengthZ,
223 longS, lengthR, lengthZ,
224 stEta, stPhi,
false);
225 newStation->setPhysVol(parentPhysVol);
226 cacheObj.
detMgr->addMuonStation(std::move(newStation));
230 cacheObj.
world->add(parentPhysVol);
232 return StatusCode::SUCCESS;
239 GeoIntrusivePtr<GeoVFullPhysVol>& physVol,
243 const std::string stName{
m_idHelperSvc->stationNameString(reId)};
244 station = cacheObj.
detMgr->getMuonStation(stName,
250 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
251 parentPhysVol->add(cacheObj.
newIdTag());
252 parentPhysVol->add(cacheObj.
makeTransform(parentPhysVol->getX().inverse() *
255 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
256 physVol = dynamic_pointer_cast<GeoVFullPhysVol>(clonedVol);
257 parentPhysVol->add(physVol);
258 return StatusCode::SUCCESS;
264 const std::vector<const MuonGMR4::RpcReadoutElement*> readoutEles =
m_detMgr->getAllRpcReadoutElements();
265 ATH_MSG_INFO(
"Copy "<<readoutEles.size()<<
" Rpc readout elements to the legacy system");
270 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
273 auto newElement = std::make_unique<MuonGM::RpcReadoutElement>(physVol,
275 1, 1,
false, cacheObj.
detMgr.get());
276 const bool aSide{copyMe->stationEta() > 0};
277 newElement->setDoubletPhi(copyMe->doubletPhi());
278 newElement->setDoubletR(copyMe->doubletR());
279 newElement->setDoubletZ(copyMe->doubletZ());
280 newElement->setIdentifier(reId);
281 newElement->setParentMuonStation(station);
284 newElement->setLongRsize(
pars.halfLength);
285 newElement->setLongSsize(
pars.halfWidth);
286 newElement->setLongZsize(
pars.halfThickness);
287 newElement->setRsize(
pars.halfLength);
288 newElement->setSsize(
pars.halfWidth);
289 newElement->setZsize(
pars.halfThickness);
291 newElement->m_nlayers = copyMe->nGasGaps();
292 newElement->m_phistripwidth = copyMe->stripPhiWidth();
293 newElement->m_etastripwidth = copyMe->stripEtaWidth();
294 newElement->m_phistrippitch = copyMe->stripPhiPitch();
295 newElement->m_etastrippitch = (aSide > 0 ? 1. : -1.) *copyMe->stripEtaPitch();
296 newElement->m_phistriplength = copyMe->stripPhiLength();
297 newElement->m_etastriplength = copyMe->stripEtaLength();
299 newElement->m_nphistripsperpanel = copyMe->nPhiStrips();
300 newElement->m_netastripsperpanel = copyMe->nEtaStrips();
301 newElement->m_nphistrippanels = copyMe->nPhiPanels();
302 newElement->m_hasDEDontop =
true;
303 newElement->m_descratzneg =
false;
306 for (
int doubPhi = copyMe->doubletPhiMax(); doubPhi >= copyMe->doubletPhi(); --doubPhi) {
307 for (
bool measPhi : {
false,
true}) {
309 const Identifier gapId = idHelper.channelID(copyMe->identify(),
314 const Amg::Vector3D locStripPos = copyMe->globalToLocalTrans(gctx) * copyMe->stripPosition(gctx, gapId);
316 newElement->m_gasGap_xPos[
gasGap -1] = locStripPos.x();
319 const int dbPIdx = copyMe->doubletPhi() == 2 ? 1 : doubPhi;
321 newElement->m_first_phistrip_s[dbPIdx -1] = locStripPos.y();
322 newElement->m_phistrip_z = locStripPos.z();
324 newElement->m_first_etastrip_z = locStripPos.z();
325 newElement->m_etastrip_s[dbPIdx-1] = locStripPos.y();
330 newElement->m_mirrored =
true;
331 newElement->fillCache();
332 newElement->m_mirrored =
false;
334 cacheObj.
detMgr->addRpcReadoutElement(std::move(newElement));
336 return StatusCode::SUCCESS;
343 std::vector<const MuonGMR4::TgcReadoutElement*> tgcReadouts{
m_detMgr->getAllTgcReadoutElements()};
344 std::stable_sort(tgcReadouts.begin(), tgcReadouts.end(),
346 return a->stationEta() > b->stationEta();
348 ATH_MSG_INFO(
"Copy "<<tgcReadouts.size()<<
" Tgc readout elements to the legacy system");
352 std::map<std::string, std::shared_ptr<TgcReadoutParams>> readoutParMap{};
356 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
360 auto newRE = std::make_unique<MuonGM::TgcReadoutElement>(physVol,
m_idHelperSvc->stationNameString(reId),
362 newRE->setIdentifier(reId);
363 newRE->setParentMuonStation(station);
365 std::shared_ptr<TgcReadoutParams>& readOutPars = readoutParMap[copyMe->chamberDesign()];
371 std::array<WiregangArray, 3> wires{};
374 bool stripSet{
false};
375 double wirePitch{0.};
380 if (nWireGangs[
gasGap -1]) {
384 for (
int gang = 1; gang <= design.numStrips(); ++gang) {
385 fillMe[gang -1] = design.numWiresInGroup(gang);
392 botMountings[
strip-1] = - design.stripLeftBottom(
strip).x();
393 topMountings[
strip-1] = - design.stripLeftTop(
strip).x();
395 botMountings[nCh] = - design.stripRightBottom(nCh).x();
396 topMountings[nCh] = - design.stripRightTop(nCh).x();
401 readOutPars = std::make_unique<TgcReadoutParams>(copyMe->chamberDesign(),
403 idHelper.stationPhiMax(reId),
404 std::move(nWireGangs),
409 std::move(botMountings),
410 std::move(topMountings),
418 const Amg::Vector3D translation{copyMe->globalToLocalTrans(gctx) * copyMe->center(gctx, layHash)};
419 newRE->setPlaneZ(translation.x(),
gasGap);
421 newRE->setSsize(copyMe->moduleHeight());
422 newRE->setRsize(copyMe->moduleWidthS());
423 newRE->setZsize(copyMe->moduleThickness());
425 newRE->setLongSsize(copyMe->moduleHeight());
426 newRE->setLongRsize(copyMe->moduleWidthL());
427 newRE->setLongZsize(copyMe->moduleThickness());
429 newRE->setReadOutParams(readOutPars);
432 cacheObj.
detMgr->addTgcReadoutElement(std::move(newRE));
435 return StatusCode::SUCCESS;
441 GeoIntrusivePtr<const GeoVFullPhysVol> readOutVol{copyMe->getMaterialGeom()};
444 PVLink clonedVol{cloneVolume(const_pointer_cast<GeoVFullPhysVol>(readOutVol))};
445 GeoIntrusivePtr<GeoFullPhysVol> physVol{dynamic_pointer_cast<GeoFullPhysVol>(clonedVol)};
448 cacheObj.
world->add(physVol);
455 const auto alignStore = alignItr ?
456 static_cast<const MmAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
458 const std::vector<const MuonGMR4::MmReadoutElement*> mmReadouts{
m_detMgr->getAllMmReadoutElements()};
459 ATH_MSG_INFO(
"Copy "<<mmReadouts.size()<<
" Mm readout elements to the legacy system");
463 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, copyMe, cacheObj)};
464 auto newRE = std::make_unique<MuonGM::MMReadoutElement>(physVol,
466 copyMe->stationEta(),
467 copyMe->stationPhi(),
468 copyMe->multilayer(), cacheObj.
detMgr.get(),
469 alignStore ? alignStore->passivation :
nullptr);
475 newRE->m_Xlg[
gasGap] = stripLayer.toOrigin() *
482 designFrom.longHalfHeight(),
483 designFrom.halfWidth(),
484 designFrom.stereoAngle());
487 designTo.inputPitch = designFrom.stripPitch();
488 designTo.inputWidth = designTo.inputPitch *
std::cos(designTo.stereoAngle());
489 designTo.nMissedBottomEta = designTo.nMissedBottomStereo = designFrom.firstStripNumber() - 1;
490 designTo.totalStrips = designFrom.numStrips();
491 designTo.nch = designFrom.numStrips();
493 designTo.setFirstPos(designFrom.firstStripPos().x() + 0.5*designTo.inputPitch);
497 if (alignStore && alignStore->getBLine(reId)) {
498 newRE->setBLinePar(*alignStore->getBLine(reId));
501 cacheObj.
detMgr->addMMReadoutElement(std::move(newRE));
503 return StatusCode::SUCCESS;
509 auto alignStore = alignItr ?
static_cast<const sTgcAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
511 const std::vector<const MuonGMR4::sTgcReadoutElement*> sTgcReadOuts{
m_detMgr->getAllsTgcReadoutElements()};
512 ATH_MSG_INFO(
"Copy "<<sTgcReadOuts.size()<<
" sTgc readout elements to the legacy system");
516 GeoIntrusivePtr<GeoVFullPhysVol> physVol{
cloneNswWedge(gctx, copyMe, cacheObj)};
518 auto newRE = std::make_unique<MuonGM::sTgcReadoutElement>(physVol,
520 copyMe->stationEta(),
521 copyMe->stationPhi(),
522 copyMe->multilayer(),
525 if (alignStore && alignStore->getBLine(reId)) {
526 newRE->setBLinePar(*alignStore->getBLine(reId));
533 copyMe->center(gctx, layerHash));
537 ChannelDesign& etaDesign{newRE->m_etaDesign[
layer-1]};
538 etaDesign.type = ChannelDesign::ChannelType::etaStrip;
540 if (copyEtaDesign.yCutout()) {
541 etaDesign.defineDiamond(copyEtaDesign.shortHalfHeight(),
542 copyEtaDesign.longHalfHeight(),
543 copyEtaDesign.halfWidth(),
544 copyEtaDesign.yCutout());
546 etaDesign.defineTrapezoid(copyEtaDesign.shortHalfHeight(),
547 copyEtaDesign.longHalfHeight(),
548 copyEtaDesign.halfWidth());
550 etaDesign.inputPitch = copyEtaDesign.stripPitch();
551 etaDesign.inputWidth = copyEtaDesign.stripWidth();
552 etaDesign.nch = copyEtaDesign.numStrips();
553 etaDesign.setFirstPos(copyEtaDesign.firstStripPos().x());
558 ChannelDesign& phiDesign{newRE->m_phiDesign[
layer-1]};
559 phiDesign.type = ChannelDesign::ChannelType::phiStrip;
561 if (copyPhiDesign.yCutout() == 0.) {
562 phiDesign.defineTrapezoid(copyPhiDesign.shortHalfHeight(),
563 copyPhiDesign.longHalfHeight(),
564 copyPhiDesign.halfWidth());
566 phiDesign.defineDiamond(copyPhiDesign.shortHalfHeight(),
567 copyPhiDesign.longHalfHeight(),
568 copyPhiDesign.halfWidth(),
569 copyPhiDesign.yCutout());
571 phiDesign.inputPitch = copyPhiDesign.stripPitch();
572 phiDesign.inputWidth = copyPhiDesign.stripWidth();
573 phiDesign.setFirstPos(copyPhiDesign.firstStripPos().x());
574 phiDesign.firstPitch = copyPhiDesign.numWiresInGroup(1);
575 phiDesign.groupWidth = copyPhiDesign.numWiresInGroup(2);
576 phiDesign.nGroups = copyPhiDesign.numStrips();
577 phiDesign.wireCutout = copyPhiDesign.wireCutout();
578 phiDesign.nch = copyPhiDesign.nAllWires();
582 padDesign.
Length = copyMe->chamberHeight();
583 padDesign.sWidth = copyMe->sChamberLength();
584 padDesign.lWidth = copyMe->lChamberLength();
585 padDesign.Size = 2.*copyPadDesign.halfWidth();
586 padDesign.ysFrame = copyMe->sFrameWidth();
587 padDesign.ylFrame = copyMe->lFrameWidth();
588 padDesign.thickness = copyMe->thickness();
589 padDesign.yCutout = copyPadDesign.yCutout();
590 padDesign.setR(copyPadDesign.beamlineRadius());
591 padDesign.sPadWidth = 2.*copyPadDesign.shortHalfHeight();
592 padDesign.lPadWidth = 2.*copyPadDesign.longHalfHeight();
593 padDesign.nPadColumns = copyPadDesign.numPadPhi();
594 padDesign.firstPhiPos = copyPadDesign.firstPadPhiDiv();
595 padDesign.inputPhiPitch = copyPadDesign.anglePadPhi();
596 padDesign.PadPhiShift = copyPadDesign.padPhiShift();
597 padDesign.nPadH = copyPadDesign.numPadEta();
598 padDesign.padEtaMax = copyPadDesign.maxPadEta();
599 padDesign.firstRowPos = copyPadDesign.firstPadHeight();
600 padDesign.inputRowPitch = copyPadDesign.padHeight();
601 padDesign.sectorOpeningAngle = copyPadDesign.sectorAngle();
604 cacheObj.
detMgr->addsTgcReadoutElement(std::move(newRE));
606 return StatusCode::SUCCESS;
613 static_cast<const MdtAlignmentStore*
>(alignItr->internalAlignment.get()) :
nullptr;
615 const std::vector<const MuonGMR4::MdtReadoutElement*> mdtReadOuts{
m_detMgr->getAllMdtReadoutElements()};
616 ATH_MSG_INFO(
"Copy "<<mdtReadOuts.size()<<
" Mdt readout elements to the legacy system");
621 GeoIntrusivePtr<GeoVFullPhysVol> physVol{};
626 auto newElement = std::make_unique<MuonGM::MdtReadoutElement>(physVol,
629 newElement->setIdentifier(reId);
630 newElement->setMultilayer(copyMe->multilayer());
632 newElement->setParentMuonStation(station);
634 newElement->setLongRsize(2*
pars.halfY);
637 newElement->setLongZsize(2*
pars.halfHeight);
638 newElement->setRsize(2*
pars.halfY);
640 newElement->setZsize(2*
pars.halfHeight);
642 newElement->m_nlayers = copyMe->numLayers();
643 newElement->m_ntubesperlayer = copyMe->numTubesInLay();
644 newElement->m_deadlength =
pars.deadLength;
645 newElement->m_endpluglength =
pars.endPlugLength;
646 newElement->m_innerRadius =
pars.tubeInnerRad;
647 newElement->m_tubeWallThickness =
pars.tubeWall;
648 newElement->m_tubepitch =
pars.tubePitch;
654 unsigned int step{1};
655 double lastLength{2.*tubeLay.tubeHalfLength(1)};
656 for (
unsigned tube = 0;
tube < copyMe->numTubesInLay(); ++
tube) {
657 const double currLength = 2.*tubeLay.tubeHalfLength(
tube);
658 if (std::abs(lastLength - currLength) > std::numeric_limits<float>::epsilon() ||
659 tube == copyMe->numTubesInLay() -1) {
660 newElement->m_tubelength[
step-1] = lastLength;
661 newElement->m_tubelength[
step] = currLength;
663 newElement->m_ntubesinastep =
tube;
665 lastLength = currLength;
669 newElement->m_nsteps =
step;
673 double xOffSet{
pars.halfY}, yOffSet{
pars.halfHeight};
674 if (newElement->barrel())
std::swap(xOffSet, yOffSet);
675 for (
unsigned lay = 1; lay <= copyMe->numLayers(); ++lay) {
677 const Amg::Vector3D locTube = globToLoc * copyMe->globalTubePos(gctx, tubeHash);
678 newElement->m_firstwire_x[lay-1] = locTube.z() + xOffSet;
679 newElement->m_firstwire_y[lay-1] = locTube.x() + yOffSet;
684 if (!station->hasMdtAsBuiltParams()){
685 station->setMdtAsBuiltParams(distort.
asBuilt);
687 if (!station->hasBLines()){
688 station->setBline(distort.
bLine);
691 newElement->geoInitDone();
693 newElement->setBLinePar(distort.
bLine);
694 newElement->fillCache();
697 cacheObj.
detMgr->addMdtReadoutElement(std::move(newElement));
699 return StatusCode::SUCCESS;
709 return StatusCode::FAILURE;
714 return StatusCode::FAILURE;
716 return StatusCode::SUCCESS;
724 return StatusCode::SUCCESS;
740 return StatusCode::FAILURE;
744 for (
int strip = stripDesign.firstStripNumber();
strip <= stripDesign.numStrips(); ++
strip) {
752 return StatusCode::FAILURE;
754 const double dist = refStripDir.dot(refStripPos - testStripPos);
759 return StatusCode::FAILURE;
764 return StatusCode::SUCCESS;
772 return StatusCode::SUCCESS;
778 <<std::endl<<
GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform())
782 for (
unsigned int lay = 1; lay <= refEle.
numLayers(); ++lay){
785 if (!refEle.
isValid(tubeHash)) {
800 return StatusCode::FAILURE;
811 std::numeric_limits<float>::epsilon() ) {
813 <<
" layer: "<<lay<<
", tube: "<<
tube<<
" "<<testEle.
tubeLength(lay,
tube)<<
" (new) vs. "
819 return StatusCode::SUCCESS;
826 return StatusCode::SUCCESS;
836 for (
bool measPhi : {
false,
true}) {
848 return StatusCode::FAILURE;
853 if ((refStripPos - testStripPos).
mag() > std::numeric_limits<float>::epsilon()){
858 return StatusCode::FAILURE;
866 return StatusCode::SUCCESS;
873 return StatusCode::SUCCESS;
881 <<std::endl<<
GeoTrf::toString(testEle.getMaterialGeom()->getAbsoluteTransform(),
true)
887 for (
bool isStrip : {
false,
true}) {
898 <<
" are not identical. ");
899 return StatusCode::FAILURE;
910 if ((refChannel - testChannel).
mag() < std::numeric_limits<float>::epsilon()){
913 std::stringstream
msg{};
915 <<
" is not at the same position "<<
Amg::toString(refChannel)
917 <<(refChannel - testChannel).
mag();
919 msg<<std::endl<<
"*** Test *** - wirePitch: "<<testEle.
wirePitch()
924 msg<<std::endl<<
"*** Ref *** - wirePitch: "<<design.stripPitch()
926 <<
", wires to reach "<<design.numPitchesToGroup(
ch)
927 <<
", wires in gang "<<design.numWiresInGroup(
ch);
929 const Amg::Vector3D locRefPos{refLayerTrf.inverse() * refChannel};
930 const Amg::Vector3D locTestPos{refLayerTrf.inverse()* testChannel};
935 return StatusCode::FAILURE;
940 return StatusCode::SUCCESS;
947 return StatusCode::SUCCESS;
956 for (
int chType = sTgcIdHelper::sTgcChannelTypes::Pad;
chType <= sTgcIdHelper::sTgcChannelTypes::Wire; ++
chType) {
957 unsigned int numChannel = 0;
962 case sTgcIdHelper::sTgcChannelTypes::Pad:
963 numChannel = refEle.
numPads(layID);
966 case sTgcIdHelper::sTgcChannelTypes::Strip:
970 case sTgcIdHelper::sTgcChannelTypes::Wire:
985 return StatusCode::FAILURE;
987 if (
chType == sTgcIdHelper::sTgcChannelTypes::Pad) {
992 const std::array<Amg::Vector3D,4> refPadCorners = refEle.
globalPadCorners(gctx, chID);
993 std::array<Amg::Vector3D,4> testPadCorners{make_array<Amg::Vector3D, 4>(
Amg::Vector3D::Zero())};
995 for (
unsigned int cornerIdx = 0; cornerIdx < refPadCorners.size(); ++cornerIdx) {
1001 return StatusCode::FAILURE;
1009 return StatusCode::FAILURE;
1023 return StatusCode::FAILURE;
1031 return StatusCode::SUCCESS;