From 2063079560db45b2e2a8960df15f26589964fb62 Mon Sep 17 00:00:00 2001 From: Andrea Dell'Acqua <andrea.dellacqua@cern.ch> Date: Thu, 16 Sep 2021 10:48:56 +0200 Subject: [PATCH] Switch GMX to use Partow's expression evaluator instead of CLHEP --- .../ExpressionEvaluator/IEvaluator.h | 15 ++++++++++++++ .../GeoModelXml/GeoModelXml/Gmx2Geo.h | 4 ++-- .../GeoModelXml/GeoModelXml/GmxUtil.h | 20 +++++++------------ .../GeoModelXml/GeoModelXml/PositionIndex.h | 4 ++-- .../GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx | 2 +- .../GeoModelXML/GeoModelXml/src/GmxUtil.cxx | 2 +- .../GeoModelXml/src/PositionIndex.cxx | 2 +- 7 files changed, 29 insertions(+), 20 deletions(-) diff --git a/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h b/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h index 10c139250..898188f56 100755 --- a/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h +++ b/GeoModelTools/ExpressionEvaluator/ExpressionEvaluator/IEvaluator.h @@ -21,6 +21,21 @@ class IEvaluator { */ ~IEvaluator() {;} + enum { + OK, /**< Everything OK */ + WARNING_EXISTING_VARIABLE, /**< Redefinition of existing variable */ + WARNING_EXISTING_FUNCTION, /**< Redefinition of existing function */ + WARNING_BLANK_STRING, /**< Empty input string */ + ERROR_NOT_A_NAME, /**< Not allowed sysmbol in the name of variable or function */ + ERROR_SYNTAX_ERROR, /**< Systax error */ + ERROR_UNPAIRED_PARENTHESIS, /**< Unpaired parenthesis */ + ERROR_UNEXPECTED_SYMBOL, /**< Unexpected sysbol */ + ERROR_UNKNOWN_VARIABLE, /**< Non-existing variable */ + ERROR_UNKNOWN_FUNCTION, /**< Non-existing function */ + ERROR_EMPTY_PARAMETER, /**< Function call has empty parameter */ + ERROR_CALCULATION_ERROR /**< Error during calculation */ + }; + virtual double evaluate(const char * expression) = 0; virtual int status() const {return 0;} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h index 5cb7628ec..088b1e134 100644 --- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h @@ -51,7 +51,7 @@ XERCES_CPP_NAMESPACE_BEGIN class DOMNode; XERCES_CPP_NAMESPACE_END -class Evaluator; +class IEvaluator; class Gmx2Geo { public: @@ -61,7 +61,7 @@ private: Gmx2Geo(const Gmx2Geo &right); Gmx2Geo & operator=(const Gmx2Geo &right); - int doDefines(xercesc::DOMDocument *doc, Evaluator &eval); + int doDefines(xercesc::DOMDocument *doc, IEvaluator &eval); int doPositionIndex(xercesc::DOMDocument *doc, GmxUtil &gmxUtil); int doReadoutGeometry(xercesc::DOMDocument *doc, GmxUtil &gmxUtil); void addParam(xercesc::DOMNode *node, std::map<std::string, std::string> ¶ms); diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h index 04df4d454..6231baad4 100644 --- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h @@ -9,11 +9,9 @@ // to element handlers instead of a (changing??) list. // #include <string> -#ifndef STANDALONE_GMX -#include "CLHEP/Evaluator/Evaluator.h" -#else -#include "ExpressionEvaluator/Evaluator.h" -#endif + +#include "ExpressionEvaluator/ExprtkEvaluator.h" + #include "GeoModelXml/MaterialManager.h" #include "GeoModelXml/ProcessorRegistry.h" #include "GeoModelXml/Element2GeoItemRegistry.h" @@ -38,9 +36,7 @@ #include "GeoModelXml/MakeTransformationref.h" #include "GeoModelXml/MakeTranslation.h" #include "GeoModelXml/MakeRotation.h" -#ifndef STANDALONE_GMX -#include "GeoModelXml/MakeScaling.h" -#endif +// #include "GeoModelXml/MakeScaling.h" #include "GeoModelXml/shape/MakeSimplePolygonBrep.h" #include "GeoModelXml/shape/MakeEllipticalTube.h" @@ -73,11 +69,9 @@ public: GmxInterface *gmxInterface(); double evaluate(char const *expression); std::string debracket(std::string expression); -#ifndef STANDALONE_GMX - HepTool::Evaluator eval; -#else - Evaluator eval; -#endif + + ExprtkEvaluator eval; + PositionIndex positionIndex; MaterialManager* matManager=0; ProcessorRegistry processorRegistry; diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h index 59a730ac5..bf544162c 100644 --- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h @@ -20,7 +20,7 @@ #include <map> #include <string> -class Evaluator; +class IEvaluator; class PositionIndex { public: @@ -39,7 +39,7 @@ public: std::string formula(std::string name); void setFormula(std::string name, std::string formula); - void indices(std::map<std::string, int> &index, Evaluator &eval); + void indices(std::map<std::string, int> &index, IEvaluator &eval); private: int m_level; diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx index a6f28adb5..e85cd245d 100644 --- a/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx @@ -104,7 +104,7 @@ Gmx2Geo::Gmx2Geo(const string xmlFile, GeoPhysVol *addHere, GmxInterface &gmxInt XMLPlatformUtils::Terminate(); } -int Gmx2Geo::doDefines(DOMDocument *doc, Evaluator &eval) { +int Gmx2Geo::doDefines(DOMDocument *doc, IEvaluator &eval) { // // Add all defines to the CLHEP::Evaluator // diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx index 599efd360..fd4f13816 100644 --- a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx @@ -117,7 +117,7 @@ double GmxUtil::evaluate(char const *expression) { #ifndef STANDALONE_GMX if (eval.status() != HepTool::Evaluator::OK) { #else - if (eval.status() != Evaluator::OK) { + if (eval.status() != IEvaluator::OK) { #endif #ifndef STANDALONE_GMX msglog << MSG::FATAL << "GeoModelXml Error processing Evaluator expression. Error name <" << diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx index 7a2b3ad65..33e1f899b 100644 --- a/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx @@ -68,7 +68,7 @@ void PositionIndex::setFormula(std::string name, std::string formula) { m_formula[name] = formula; } -void PositionIndex::indices(map<string, int> &index, Evaluator &eval) { +void PositionIndex::indices(map<string, int> &index, IEvaluator &eval) { index.clear(); // In case caller uses it many times // // Set Copy Number of each Level (CNL_i) up to current level -- GitLab