From 592f8cfff2ff0287220d3d00f33df04f6d97d683 Mon Sep 17 00:00:00 2001
From: Johannes Josef Junggeburth <johannes.josef.junggeburth@cern.ch>
Date: Mon, 6 Jan 2025 09:51:15 +0100
Subject: [PATCH 1/2] Intrusive make

---
 .../GeoModelHelpers/src/MaterialManager.cxx    | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/GeoModelCore/GeoModelHelpers/src/MaterialManager.cxx b/GeoModelCore/GeoModelHelpers/src/MaterialManager.cxx
index f9b996e23..70e370fc9 100644
--- a/GeoModelCore/GeoModelHelpers/src/MaterialManager.cxx
+++ b/GeoModelCore/GeoModelHelpers/src/MaterialManager.cxx
@@ -33,15 +33,14 @@ namespace {
 const GeoMaterial* MaterialManager::MaterialFactory::get() const { return m_material; }
 MaterialManager::MaterialFactory::~MaterialFactory() {
     if (!m_material) return;
-    // std::cout<<"MaterialFactory() -- finalize " <<m_material->getName()<<std::endl;
+
     if (m_components.empty()) {
       m_material->lock();
       return;
     }
     const double inv_totalFraction = 1. / m_totFraction;
     for(const auto& [element, fraction] : m_components) {
-      m_material->add(element, 
-                      fraction * element->getA() * inv_totalFraction);
+      m_material->add(element, fraction * element->getA() * inv_totalFraction);
     }
     m_material->lock();
 }
@@ -56,8 +55,7 @@ void MaterialManager::MaterialFactory::addComponent(const ConstMaterialPtr& mat,
         addComponent(elePtr, mat->getFraction(ele) * fraction);
     }
 }
-void MaterialManager::MaterialFactory::addComponent(const ConstElementPtr& ele, 
-                                                    double fraction) {
+void MaterialManager::MaterialFactory::addComponent(const ConstElementPtr& ele, double fraction) {
     m_components.emplace_back(std::make_pair(ele, fraction));
     m_totFraction += fraction;
 }
@@ -135,7 +133,7 @@ void MaterialManager::printAll() const {
 }
 
 void MaterialManager::addElement(const std::string &name, const std::string &symbol, double z, double a) {
-    GeoIntrusivePtr<GeoElement> newElement{new GeoElement(name,symbol,z,a*atomicDensity)};
+    GeoIntrusivePtr<GeoElement> newElement{make_intrusive<GeoElement>(name,symbol,z,a*atomicDensity)};
     addElement(newElement);
 }
 
@@ -158,7 +156,7 @@ void MaterialManager::setMaterialNamespace(const std::string &name) {
 void MaterialManager::lockMaterial() { m_factory.reset(); }
 
 void MaterialManager::addMaterial(const std::string &name, double density) {
-    MaterialPtr newMat{new GeoMaterial(name, density * volDensity)};
+    MaterialPtr newMat{make_intrusive<GeoMaterial>(name, density * volDensity)};
     addMaterial(newMat);
 }
 
@@ -200,14 +198,14 @@ void MaterialManager::addMatComponent(const std::string &name, double fraction)
 }
 void MaterialManager::buildSpecialMaterials() {
   // Ether  
-  GeoIntrusivePtr<GeoElement> ethElement{new GeoElement("Ether","ET",500.0,0.0)};
+  GeoIntrusivePtr<GeoElement> ethElement{make_intrusive<GeoElement>("Ether","ET",500.0,0.0)};
   m_elements.insert(std::make_pair("Ether",ethElement));
-  GeoIntrusivePtr<GeoMaterial> ether{new GeoMaterial("special::Ether",0.0)};
+  GeoIntrusivePtr<GeoMaterial> ether{make_intrusive<GeoMaterial>("special::Ether",0.0)};
   ether->add(ethElement,1.);
   ether->lock();
   m_materials.insert(std::make_pair("special::Ether", ether));
   // HyperUranium
-  GeoIntrusivePtr<GeoMaterial> hu{new GeoMaterial("special::HyperUranium",0.0)};
+  GeoIntrusivePtr<GeoMaterial> hu{make_intrusive<GeoMaterial>("special::HyperUranium",0.0)};
   hu->add(ethElement,1.);
   hu->lock();
   m_materials.insert(std::make_pair("special::HyperUranium", hu));
-- 
GitLab


From 1ef1f60e5730daac58cda53b62b09bbaa56b001e Mon Sep 17 00:00:00 2001
From: Johannes Josef Junggeburth <johannes.josef.junggeburth@cern.ch>
Date: Mon, 6 Jan 2025 10:21:33 +0100
Subject: [PATCH 2/2] Implement tube & torus in polygon edges

---
 .../GeoModelHelpers/src/GeoShapeUtils.cxx     | 46 ++++++++++++++++++-
 1 file changed, 45 insertions(+), 1 deletion(-)

diff --git a/GeoModelCore/GeoModelHelpers/src/GeoShapeUtils.cxx b/GeoModelCore/GeoModelHelpers/src/GeoShapeUtils.cxx
index e026be00a..dd0aaa32d 100644
--- a/GeoModelCore/GeoModelHelpers/src/GeoShapeUtils.cxx
+++ b/GeoModelCore/GeoModelHelpers/src/GeoShapeUtils.cxx
@@ -28,6 +28,10 @@
 
 #include <vector>
 
+namespace{
+    constexpr unsigned tubeApproxEdges = 8;
+}
+
 std::pair<const GeoShape* , const GeoShape*> getOps(const GeoShape* composed) {
     if (composed->typeID() == GeoShapeUnion::getClassTypeID()) {
         const GeoShapeUnion* unionShape = dynamic_cast<const GeoShapeUnion*>(composed);
@@ -48,7 +52,7 @@ std::pair<const GeoShape* , const GeoShape*> getOps(const GeoShape* composed) {
 unsigned int countComposedShapes(const GeoShape* shape) {
     std::pair<const GeoShape*, const GeoShape*> ops = getOps(shape);
     return 1 + (ops.first ? countComposedShapes(ops.first) : 0) +
-                (ops.second ? countComposedShapes(ops.second) : 0);
+               (ops.second ? countComposedShapes(ops.second) : 0);
 }
 
 GeoIntrusivePtr<const GeoShape> compressShift(const GeoShape* shift) {    
@@ -229,6 +233,46 @@ std::vector<GeoTrf::Vector3D> getPolyShapeEdges(const GeoShape* shape,
             
             }
         }
+    } else if (shape->typeID() == GeoTube::getClassTypeID()) {
+        constexpr double stepLength = 2.*M_PI / tubeApproxEdges;
+        const GeoTube* tube = static_cast<const GeoTube*>(shape);
+        for (const double z :{-1., 1.}){
+            for (unsigned int e = 0; e < tubeApproxEdges; ++e) {
+                edgePoints.emplace_back(tube->getRMax()*std::cos(stepLength*e),
+                                        tube->getRMax()*std::sin(stepLength*e),
+                                        z*tube->getZHalfLength());
+            }
+        }
+    } else if (shape->typeID() == GeoTubs::getClassTypeID()) {
+        const GeoTubs* tubs = static_cast<const GeoTubs*>(shape);
+        const double stepSize = tubs->getDPhi() / tubeApproxEdges;
+        for (const double z : {-1., 1.}) {
+            for (unsigned e = 0; e <= tubeApproxEdges; ++e) {
+                edgePoints.emplace_back(tubs->getRMax()*std::cos(tubs->getSPhi() + stepSize*e), 
+                                        tubs->getRMax()*std::sin(tubs->getSPhi() + stepSize*e), 
+                                        z*tubs->getZHalfLength());
+            }
+        }
+    } else if (shape->typeID() == GeoEllipticalTube::getClassTypeID()) {
+        const GeoEllipticalTube* tube = static_cast<const GeoEllipticalTube*>(shape);
+        constexpr double stepSize = 2.*M_PI / tubeApproxEdges;
+        for (const double z : {-1.,1.}) {
+            for (unsigned e = 0; e<tubeApproxEdges; ++e){
+                edgePoints.emplace_back(tube->getXHalfLength()*std::cos(stepSize*e),
+                                        tube->getYHalfLength()*std::sin(stepSize*e),
+                                        z* tube->getZHalfLength());
+            }
+        }
+    } else if (shape->typeID() == GeoTorus::getClassTypeID()) {
+        constexpr double stepSize = 2.*M_PI / tubeApproxEdges;
+        const GeoTorus* torus = static_cast<const GeoTorus*>(shape);
+        for (unsigned int donut =0; donut < tubeApproxEdges; ++donut) {
+            for (unsigned int slice =0; slice < tubeApproxEdges; ++slice) {
+                edgePoints.emplace_back((torus->getRTor() + torus->getRMax()* std::cos(slice *stepSize))*std::cos(donut*stepSize),
+                                        (torus->getRTor() + torus->getRMax()* std::cos(slice *stepSize))*std::sin(donut*stepSize),
+                                         torus->getRMax()* std::sin(slice*stepSize));
+            }
+        }
     } else {
         THROW_EXCEPTION("The shape "<<shape->type()<<" is not supported. Please add it to the list");
     }
-- 
GitLab