From ae95a5dc1cc657d4c9d8cd7d394c18a57708d8e0 Mon Sep 17 00:00:00 2001 From: Andreas Suter Date: Fri, 11 Oct 2024 16:34:49 +0200 Subject: [PATCH] implemented unary operator for metaData in functions. --- src/classes/PFunction.cpp | 38 +++++++++++++++++++++++++++------- src/include/PFunctionGrammar.h | 9 +++++--- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/classes/PFunction.cpp b/src/classes/PFunction.cpp index 7dfe7632..922aeda3 100644 --- a/src/classes/PFunction.cpp +++ b/src/classes/PFunction.cpp @@ -188,13 +188,28 @@ void PFunction::FillFuncEvalTree(iter_t const& i, PFuncTreeNode &node) node.fID = PFunctionGrammar::constGammaMuID; // keep the ID node.fDvalue = GAMMA_BAR_MUON; // keep the value } else if (i->value.id() == PFunctionGrammar::constFieldID) { // handle constant field from meta data + str = std::string(i->value.begin(), i->value.end()); // get string + boost::algorithm::trim(str); + if (strstr(str.c_str(), "-")) + node.fSign = true; node.fID = PFunctionGrammar::constFieldID; // keep the ID } else if (i->value.id() == PFunctionGrammar::constEnergyID) { // handle constant energy from meta data + str = std::string(i->value.begin(), i->value.end()); // get string + boost::algorithm::trim(str); + if (strstr(str.c_str(), "-")) + node.fSign = true; node.fID = PFunctionGrammar::constEnergyID; // keep the ID } else if (i->value.id() == PFunctionGrammar::constTempID) { // handle constant temperature from meta data str = std::string(i->value.begin(), i->value.end()); // get string boost::algorithm::trim(str); - status = sscanf(str.c_str(), "T%d", &ivalue); // convert string to temperature index + std::string pstr; + if (strstr(str.c_str(), "-")) { + node.fSign = true; + pstr = "-T%d"; + } else { + pstr = "T%d"; + } + status = sscanf(str.c_str(), pstr.c_str(), &ivalue); // convert string to temperature index node.fID = PFunctionGrammar::constTempID; // keep the ID node.fIvalue = ivalue; // Temp idx } else if (i->value.id() == PFunctionGrammar::parameterID) { // handle parameter number @@ -432,21 +447,30 @@ Double_t PFunction::EvalNode(PFuncTreeNode &node) } else if (node.fID == PFunctionGrammar::constGammaMuID) { return node.fDvalue; } else if (node.fID == PFunctionGrammar::constFieldID) { - return fMetaData.fField; + Double_t dval = fMetaData.fField; + if (node.fSign) + dval *= -1.0; + return dval; } else if (node.fID == PFunctionGrammar::constEnergyID) { if (fMetaData.fEnergy == PMUSR_UNDEFINED) { std::cerr << std::endl << "**PANIC ERROR**: PFunction::EvalNode: energy meta data not available." << std::endl; std::cerr << std::endl; exit(0); } - return fMetaData.fEnergy; + Double_t dval = fMetaData.fEnergy; + if (node.fSign) + dval *= -1.0; + return dval; } else if (node.fID == PFunctionGrammar::constTempID) { if (node.fIvalue >= fMetaData.fTemp.size()) { std::cerr << std::endl << "**PANIC ERROR**: PFunction::EvalNode: Temp idx=" << node.fIvalue << " requested which is >= #Temp(s)=" << fMetaData.fTemp.size() << " available." << std::endl; std::cerr << std::endl; exit(0); } - return fMetaData.fTemp[node.fIvalue]; + Double_t dval = fMetaData.fTemp[node.fIvalue]; + if (node.fSign) + dval *= -1.0; + return dval; } else if (node.fID == PFunctionGrammar::parameterID) { Double_t dval; if (node.fSign) @@ -609,10 +633,10 @@ void PFunction::EvalTreeForStringExpression(iter_t const& i, bool funcFlag) fFuncString += "Pi"; } else if (i->value.id() == PFunctionGrammar::constGammaMuID) { fFuncString += "gamma_mu"; - } else if (i->value.id() == PFunctionGrammar::constFieldID) { - fFuncString += "B"; + } else if (i->value.id() == PFunctionGrammar::constFieldID) { + fFuncString += boost::algorithm::trim_copy(std::string(i->value.begin(), i->value.end())).c_str(); } else if (i->value.id() == PFunctionGrammar::constEnergyID) { - fFuncString += "EN"; + fFuncString += boost::algorithm::trim_copy(std::string(i->value.begin(), i->value.end())).c_str(); } else if (i->value.id() == PFunctionGrammar::constTempID) { assert(i->children.size() == 0); fFuncString += boost::algorithm::trim_copy(std::string(i->value.begin(), i->value.end())).c_str(); diff --git a/src/include/PFunctionGrammar.h b/src/include/PFunctionGrammar.h index 43bdd766..1ebc639a 100644 --- a/src/include/PFunctionGrammar.h +++ b/src/include/PFunctionGrammar.h @@ -82,11 +82,14 @@ struct PFunctionGrammar : public grammar const_gamma_mu = leaf_node_d[ str_p("GAMMA_MU") ]; - const_field = leaf_node_d[ str_p("B") ]; + const_field = leaf_node_d[ str_p("B") ] | + leaf_node_d[ str_p("-B") ]; - const_energy = leaf_node_d[ str_p("EN") ]; + const_energy = leaf_node_d[ str_p("EN") ] | + leaf_node_d[ str_p("-EN") ]; - const_temp = leaf_node_d[ ( lexeme_d[ "T" >> +digit_p ] ) ]; + const_temp = leaf_node_d[ ( lexeme_d[ "T" >> +digit_p ] ) ] | + leaf_node_d[ ( lexeme_d[ "-T" >> +digit_p ] ) ]; fun_label = leaf_node_d[ ( lexeme_d[ "FUN" >> +digit_p ] ) ];