From ad6e24a3dc734913516fb9ba328faae2aeeabf01 Mon Sep 17 00:00:00 2001 From: Nicholas Styles <nicholas.styles@desy.de> Date: Tue, 16 Apr 2024 23:44:10 +0200 Subject: [PATCH] Make alignable multicopies work without loopvar --- .../GeoModelXml/src/MulticopyProcessor.cxx | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx index 5b9ddccbe..4401360d1 100644 --- a/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx @@ -135,21 +135,22 @@ void MulticopyProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, Ge } } else { // - // If varname not given, we get the CLHEP xForm and raise it to the power i, so NOT applied to first object. - // No transform (i.e. identity) for the first; so one less transform than objects + // If varname not given, we get the CLHEP xForm and apply it (n-1) times sequentially to place the copies + // First copy gets the Identity transform (i.e. placed in "default position" for object) // - GeoTrf::Transform3D hepXf0=GeoTrf::Transform3D::Identity(); - if (alignable) { - geoAXf = dynamic_pointer_cast<GeoAlignableTransform>(xFormProcessor->make(elXf, gmxUtil)); - hepXf0 = geoAXf->getTransform(); - } else { - geoXf = dynamic_pointer_cast<GeoTransform>( xFormProcessor->make(elXf, gmxUtil)); - hepXf0 = geoXf->getTransform(); - } - GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity(); // Identity initially + //Is there a better way to just get the Transform3D? + GeoTrf::Transform3D hepXf0 = dynamic_pointer_cast<GeoTransform>(xFormProcessor->make(elXf, gmxUtil))->getTransform(); + GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity(); // Identity initially for the first copy for (int i = 0; i < nCopies; ++i) { - xfList->push_back(makeTransform(hepXf)); - hepXf = hepXf0 * hepXf; //Is this location correct? + if (alignable){ + geoAXf = make_intrusive<GeoAlignableTransform>(hepXf) ; + xfList->push_back(geoAXf); + } + else{ + geoXf = make_intrusive<GeoTransform>(hepXf) ; + xfList->push_back(geoXf); + } + hepXf = hepXf0 * hepXf; //multiply by hepXf0 again for each copy } } } else { -- GitLab