From 4ab79a8892fc861da8f7a70230451351e8741283 Mon Sep 17 00:00:00 2001
From: ext-calvo_p <pedro.calvo@ciemat.es>
Date: Tue, 10 Oct 2023 16:03:07 +0200
Subject: [PATCH] Resolve "Unused degrader attributes"

---
 src/Classic/AbsBeamline/Degrader.cpp      | 41 ++++++++++++++++-------
 src/Classic/AbsBeamline/Degrader.h        | 31 +++++++++--------
 src/Classic/Solvers/ScatteringPhysics.cpp |  2 +-
 src/Elements/OpalDegrader.cpp             | 14 +++++---
 src/Elements/OpalDegrader.h               |  4 +--
 5 files changed, 56 insertions(+), 36 deletions(-)

diff --git a/src/Classic/AbsBeamline/Degrader.cpp b/src/Classic/AbsBeamline/Degrader.cpp
index e62033359..232f9b923 100644
--- a/src/Classic/AbsBeamline/Degrader.cpp
+++ b/src/Classic/AbsBeamline/Degrader.cpp
@@ -2,7 +2,7 @@
 // Class Degrader
 //   Defines the abstract interface for a beam degrader.
 //
-// Copyright (c) 2000 - 2021, Paul Scherrer Institut, Villigen PSI, Switzerland
+// Copyright (c) 2000 - 2023, Paul Scherrer Institut, Villigen PSI, Switzerland
 // All rights reserved.
 //
 // This file is part of OPAL.
@@ -23,10 +23,10 @@
 #include "Solvers/ParticleMatterInteractionHandler.h"
 #include "Utilities/Options.h"
 
+#include <cmath>
 #include <memory>
-#include <string>
 
-extern Inform *gmsg;
+extern Inform* gmsg;
 
 
 Degrader::Degrader():
@@ -42,12 +42,16 @@ Degrader::Degrader(const Degrader& right):
     MomentumY_m(right.MomentumY_m),
     MomentumZ_m(right.MomentumZ_m),
     time_m(right.time_m),
-    id_m(right.id_m)
+    id_m(right.id_m),
+    width_m(right.width_m),
+    height_m(right.height_m)
 {}
 
 Degrader::Degrader(const std::string& name):
-    Component(name)
-{}
+    Component(name),
+    width_m(0.0),
+    height_m(0.0)
+{ }
 
 Degrader::~Degrader() {
     if(online_m)
@@ -58,11 +62,22 @@ void Degrader::accept(BeamlineVisitor& visitor) const {
     visitor.visitDegrader(*this);
 }
 
-inline bool Degrader::isInMaterial(double z) {
- /**
-     check if the particle is in the degarder material
-  */
-    return ((z > 0.0) && (z <= getElementLength()));
+void Degrader::setDimensions(double xsize, double ysize) {
+    width_m  = xsize;
+    height_m = ysize;
+}
+
+
+bool Degrader::isInside(const Vector_t& R) const {
+    /**
+     check if the particle is in the degrader material
+    */
+    bool hit = false;
+    if ( R(2) > 0.0 && R(2) <= getElementLength() &&
+         (4 * (std::pow(R(0) / width_m, 2) + std::pow(R(1) / height_m, 2)) <= 1) ) {
+        hit = true;
+    }
+    return hit;
 }
 
 bool Degrader::apply(const size_t& i, const double& t, Vector_t& /*E*/, Vector_t& /*B*/) {
@@ -70,7 +85,7 @@ bool Degrader::apply(const size_t& i, const double& t, Vector_t& /*E*/, Vector_t
     const Vector_t& R = RefPartBunch_m->R[i];
     const Vector_t& P = RefPartBunch_m->P[i];
 
-    if (isInMaterial(R(2))) {
+    if ( isInside(R) ) {
         //if particle was already marked as -1 (it means it should have gone into degrader but didn't)
         //set the label to -2 (will not go into degrader and will be deleted when particles per core > 2)
         if (RefPartBunch_m->Bin[i] < 0) {
@@ -99,7 +114,7 @@ bool Degrader::applyToReferenceParticle(const Vector_t& R,
                                         const double& /*t*/,
                                         Vector_t& E,
                                         Vector_t& /*B*/) {
-    if (!isInMaterial(R(2))) return false;
+    if ( !isInside(R) ) return false;
 
     Vector_t updatedP = P;
     bool isDead = getParticleMatterInteraction()->computeEnergyLoss(RefPartBunch_m, updatedP, RefPartBunch_m->getdT(), false);
diff --git a/src/Classic/AbsBeamline/Degrader.h b/src/Classic/AbsBeamline/Degrader.h
index 925bd2777..ef8f27838 100644
--- a/src/Classic/AbsBeamline/Degrader.h
+++ b/src/Classic/AbsBeamline/Degrader.h
@@ -2,7 +2,7 @@
 // Class Degrader
 //   Defines the abstract interface for a beam degrader.
 //
-// Copyright (c) 2000 - 2021, Paul Scherrer Institut, Villigen PSI, Switzerland
+// Copyright (c) 2000 - 2023, Paul Scherrer Institut, Villigen PSI, Switzerland
 // All rights reserved.
 //
 // This file is part of OPAL.
@@ -28,7 +28,6 @@
 class Degrader: public Component {
 
 public:
-
     /// Plane selection.
     enum Plane {
         /// Monitor is off (inactive).
@@ -49,36 +48,37 @@ public:
     virtual ~Degrader();
 
     /// Apply visitor to Degrader.
-    virtual void accept(BeamlineVisitor&) const;
+    virtual void accept(BeamlineVisitor&) const override;
 
-    virtual bool apply(const size_t& i, const double& t, Vector_t& E, Vector_t& B);
+    virtual bool apply(const size_t& i, const double& t, Vector_t& E, Vector_t& B) override;
 
     virtual bool applyToReferenceParticle(const Vector_t& R,
                                           const Vector_t& P,
                                           const double& t,
                                           Vector_t& E,
-                                          Vector_t& B);
+                                          Vector_t& B) override;
 
-    virtual void initialise(PartBunchBase<double, 3>* bunch, double& startField, double& endField);
+    virtual void initialise(PartBunchBase<double, 3>* bunch, double& startField, double& endField) override;
 
     virtual void initialise(PartBunchBase<double, 3>* bunch);
 
-    virtual void finalise();
+    virtual void finalise() override;
 
-    virtual bool bends() const;
+    virtual bool bends() const override;
 
-    virtual void goOnline(const double& kineticEnergy);
+    virtual void goOnline(const double& kineticEnergy) override;
 
-    virtual void goOffline();
+    virtual void goOffline() override;
 
-    virtual ElementType getType() const;
+    virtual ElementType getType() const override;
 
-    virtual void getDimensions(double& zBegin, double& zEnd) const;
+    virtual void getDimensions(double& zBegin, double& zEnd) const override;
 
-    virtual bool isInMaterial(double z);
+    virtual bool isInside(const Vector_t& R) const override;
 
-private:
+    void setDimensions(double xsize, double ysize);
 
+private:
     // Not implemented.
     void operator=(const Degrader&);
 
@@ -90,6 +90,9 @@ private:
     std::vector<double> MomentumZ_m;
     std::vector<double> time_m;
     std::vector<int> id_m;
+
+    double width_m;
+    double height_m;
 };
 
 #endif // CLASSIC_Degrader_HH
diff --git a/src/Classic/Solvers/ScatteringPhysics.cpp b/src/Classic/Solvers/ScatteringPhysics.cpp
index a7a54153d..834b4b02a 100644
--- a/src/Classic/Solvers/ScatteringPhysics.cpp
+++ b/src/Classic/Solvers/ScatteringPhysics.cpp
@@ -54,7 +54,7 @@ namespace {
             deg_m = static_cast<Degrader*>(el);
         }
         bool checkHit(const Vector_t& R) override {
-            return deg_m->isInMaterial(R(2));
+            return deg_m->isInside(R);
         }
     private:
         Degrader* deg_m;
diff --git a/src/Elements/OpalDegrader.cpp b/src/Elements/OpalDegrader.cpp
index cc088c88d..bf8657d76 100644
--- a/src/Elements/OpalDegrader.cpp
+++ b/src/Elements/OpalDegrader.cpp
@@ -2,7 +2,7 @@
 // Class OpalDegrader
 //   The DEGRADER element.
 //
-// Copyright (c) 200x - 2020, Paul Scherrer Institut, Villigen PSI, Switzerland
+// Copyright (c) 200x - 2023, Paul Scherrer Institut, Villigen PSI, Switzerland
 // All rights reserved
 //
 // This file is part of OPAL.
@@ -26,9 +26,10 @@ OpalDegrader::OpalDegrader():
                 "The \"DEGRADER\" element defines a degrader."),
     parmatint_m(nullptr) {
     itsAttr[XSIZE] = Attributes::makeReal
-        ("XSIZE", "not used",0.0);
+        ("XSIZE", "Horizontal axis of the transverse elliptical shape [m]", 1E6);
+
     itsAttr[YSIZE] = Attributes::makeReal
-        ("YSIZE", "not used",0.0);
+        ("YSIZE", "Vertical axis of the transverse elliptical shape [m]", 1E6);
 
     registerOwnership();
 
@@ -57,11 +58,14 @@ OpalDegrader* OpalDegrader::clone(const std::string& name) {
 void OpalDegrader::update() {
     OpalElement::update();
 
-    DegraderRep* deg =
-        dynamic_cast<DegraderRep*>(getElement());
+    DegraderRep* deg = dynamic_cast<DegraderRep*>(getElement());
 
     double length = Attributes::getReal(itsAttr[LENGTH]);
+    double xsize = Attributes::getReal(itsAttr[XSIZE]);
+    double ysize = Attributes::getReal(itsAttr[YSIZE]);
+
     deg->setElementLength(length);
+    deg->setDimensions(xsize, ysize);
 
     if (itsAttr[PARTICLEMATTERINTERACTION] && parmatint_m == nullptr) {
         const std::string matterDescriptor = Attributes::getString(itsAttr[PARTICLEMATTERINTERACTION]);
diff --git a/src/Elements/OpalDegrader.h b/src/Elements/OpalDegrader.h
index 40e15e0f9..a164ddcdb 100644
--- a/src/Elements/OpalDegrader.h
+++ b/src/Elements/OpalDegrader.h
@@ -2,7 +2,7 @@
 // Class OpalDegrader
 //   The DEGRADER element.
 //
-// Copyright (c) 200x - 2020, Paul Scherrer Institut, Villigen PSI, Switzerland
+// Copyright (c) 200x - 2023, Paul Scherrer Institut, Villigen PSI, Switzerland
 // All rights reserved
 //
 // This file is part of OPAL.
@@ -25,7 +25,6 @@ class ParticleMatterInteraction;
 class OpalDegrader: public OpalElement {
 
 public:
-
     /// The attributes of class OpalDegrader.
     enum {
         XSIZE = COMMON,  // not used
@@ -45,7 +44,6 @@ public:
     virtual void update();
 
 private:
-
     // Not implemented.
     OpalDegrader(const OpalDegrader&);
     void operator=(const OpalDegrader&);
-- 
GitLab