From: <ro...@us...> - 2009-08-07 11:00:50
|
Revision: 1619 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1619&view=rev Author: ron-fox Date: 2009-08-07 11:00:40 +0000 (Fri, 07 Aug 2009) Log Message: ----------- I screwed up and wrote the right code into the wrong modules. Modified Paths: -------------- trunk/plugins/const/CConstCommand.cpp trunk/plugins/const/CConstCommand.h trunk/plugins/const/CConstProcessor.cpp trunk/plugins/const/CConstProcessor.h Modified: trunk/plugins/const/CConstCommand.cpp =================================================================== --- trunk/plugins/const/CConstCommand.cpp 2009-08-07 10:43:42 UTC (rev 1618) +++ trunk/plugins/const/CConstCommand.cpp 2009-08-07 11:00:40 UTC (rev 1619) @@ -0,0 +1,272 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#include <config.h> +#include "CConstProcessor.h" +#include "CConstData.h" +#include <TCLInterpreter.h> +#include <TCLObject.h> +#include <stdlib.h> + + + +using namespace std; + +/////////////////////////////////////////////////////////////////////////////// + +/*! + Construction - the name of the command is hardwired to 'const' and the + command is registered. + + @param interp - Reference to the interpreter on which the command will be + registered. +*/ +CConstProcessor::CConstProcessor(CTCLInterpreter& interp) : + CTCLObjectProcessor(interp, string("const"), true) +{} + +/*! + Destructor just passes up the inheritance chain as we have no object specific + dynamic data: +*/ +CConstProcessor::~CConstProcessor() +{} + +/////////////////////////////////////////////////////////////////////////////// + +/*! + + Dispatch the command to create, destroy or usage in the case of errors. + - Commands must have at least 3 words, else usage() is called to get the + error message which is then returned as the command value along with TCL_ERROR + - If the second command word is -delete, control is passed to the destroy() + method, else to the create() method. These methods can set the interpreter + result and the status which are passed back to the caller without further + interpretation. + - Any exception processing must either be done in the detailed processors + or in the caller chain, as none is done at this level. + + @param interp (CTCLInterpreter&) Reference to the interpreter that is running + this command. + @param objv (vector<CTCLObject>&) Reference to a vector of encapsulated + Tcl_Obj's that make up the command. objv[0] is the command + word ("const"). + @return int + @retval TCL_OK - The command executed without error. The result is the + name of the new parameter. + @retval TCL_ERROR - The command failed and the reason for the failure is + the interpreter result (error message). +*/ +int +CConstProcessor::operator()(CTCLInterpreter& interp, + std::vector<CTCLObject>& objv) +{ + // Check for the minimum number of command words: + + if (objv.size() < 3) { + string result = "Too few command parameters\n"; + result += usage(); + interp.setResult(result); + return TCL_ERROR; + } + + // Bind all the command words to this interpreter enabling more advanced functionality + // of each CTCTLObject: + + for(int i=0; i < objv.size(); i++) { + objv[i].Bind(interp); + } + + // Dispatch the command: + + string keyword(objv[1]); // is this -delete? + + if (keyword == string("-delete")) { + return destroy(interp, objv); + } + else { + return create(interp, objv); + } +} + + +////////////////////////////////////////////////////////////////////////////// + +/* + * Create a new variable. + * - There can be only 4 or 5 parameters. + * - If there are 5 parameters, the second word must be "-and" and we will create an and + * processor. + * - If there are 4 parameters we're creating an or processor. + * - The outvalue must parse as a double. + * - The call to the appropriate add function in CConstData must not throw + * an exception (the exception string will be turned into the result and result in a + * TCL_ERROR + * Parameters: + * interp - Intepreter that's running this command. + * objv - Array of encapsulated objects (Tcl_Obj) that define the command. + * Return: + * TCL_OK - A new parameter was created successfully. Result string is the name + * of the parameter. + * TCL_ERROR- The parameter creation failed and the result string is the + * reason for the failure. + */ +int +CConstProcessor::create(CTCLInterpreter& interp, vector<CTCLObject>& objv) const +{ + // All errors are turned into string exceptions: + + try { + size_t wordCount = objv.size(); + int nameIndex = 1; + bool and(false); + + // Must be 4 or 5 words: + + if (wordCount != 5 && wordCount != 4) { + throw string("Incorrect number of command paramters"); + } + // If 5 first parameter must be '-and'. + + if (wordCount == 5) { + if (objv[1] != string("-and")) { + throw string("If there are 5 command words the second must be '-and'"); + } + and = true; + nameIndex = 2; + } + // at this point, and is true if we are doing an and and outparam is at + // the index in nameIndex. The rest is nice common code until the + // actual attempt to create: + + string name(objv[nameIndex]); + + // validate the value: + + string value(objv[nameIndex+1]); + char* endPointer; + double fValue = strotod(value.c_str(), &endPointer); + if (endPointer == value.c_str()) { + throw string("The value parameter is not evaluating to a floating point number"); + } + // Pull the input params into a list of strings: + + try { + vector<CTCLObject> inputParameters = objv[nameIndex + 2].getListElments(); + } + catch (...) { + throw string("The input parameters are not a correctly formatted TCL list"); + } + + vector<string> inputParameterNames; + for( int i=0; i < inputParameters.size(); i++) { + inputParameters[i].Bind(interp); + inputParameterNames.push_back(string(inputParameters[i])); + } + + CConstData& data(CConstData::getInstance()); + if (and) { + data.addAndParameter(name, fValue, inputParameterNames); + } + else { + data.addOrParameter(name, fValue, inputParameterNames); + } + + // We survived so we can set the result and return TCL_OK. + + interp.setResult(name); + return TCL_OK; + + } + + // All errors are turned into exceptions: + + catch(string msg) { + mst += '\n'; + msg += usage(); + interp.setResult(msg); + return TCL_ERROR; + } +} + + +/* + * Delete an existing variable. + * - There must be exactly three command words. + * - The last command word is passed to the data manager's + * deleteParameter function + * Parameters: + * interp - Intepreter that's running this command. + * objv - Array of encapsulated objects (Tcl_Obj) that define the command. + * Return: + * TCL_OK - The parameter was deleted. No result is set. + * TCL_ERROR - Parameter deletion failed and the result is an error message. + */ +int +CConstProcessor::destroy(CTCLInterpreter& interp, vector<CTCLObject>& objv) const +{ + // All errors get mapped to string exceptions: + + try { + if (objv.size() != 3) { + throw string("const -delete has the wrong number of command words"); + } + string name = objv[2]; + CConstData& data(CConstData::getInstance()); + + data.deleteParameter(name); + + return TCL_OK; + + } + catch (string msg) { + msg += "\n"; + msg += usage(); + interp.setResult(msg); + return TCL_ERROR; + } + + +} +/* + * Provides information about how to use the const command: + */ +string +CConstProcessor::usage() const +{ + string result = "Usage:\n"; + result += " const ?-and? outname outvalue [list innames]\n"; + result += " const -delete outname\n"; + result += "Where:\n"; + result += " The first form creates a new parameter:\n"; + result += " -and if present indicates all input parameters must be defined\n"; + result += " outname is the name of the new parameter\n"; + result += " outvalue is the value the outname parameter will be given\n"; + result += " innames are the input parameter names. If -and was not\n"; + result += " present, outname will be assigned outvalue if any of the\n"; + result += " innames were assigned values in the event.\n"; + result += " If -and was present, all innames must have been assigned values\n"; + result += " for outname to be assigned outvalue\n"; + result += " The second form deletes an existing const parameter named outname\n"; + result += " it is an error to attempt to use this to delete anything but a\n"; + result += " const param\n"; + result += "WARNING:\n"; + result += " Deleting a const parameter via 'parameter -delete' is dangerous as\n"; + result += " the const event processor will continue to try to compute the parameter"; + + return result; +} + Modified: trunk/plugins/const/CConstCommand.h =================================================================== --- trunk/plugins/const/CConstCommand.h 2009-08-07 10:43:42 UTC (rev 1618) +++ trunk/plugins/const/CConstCommand.h 2009-08-07 11:00:40 UTC (rev 1619) @@ -0,0 +1,71 @@ +#ifndef __CCONSTPROCESSOR_H +#define __CCONSTPROCESSOR_H + +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + + +#ifndef __TCLOBJECTPROCESSOR_H +#include <TCLObjectProcessor.h> +#endif + +/*! + Class that implements the const command. This has the following forms: + +\literal + const ?-and? outparam outvalue [list inputparams] + const -delete outparam +\endliteral + The first form of the command creates a new const parameter. If -and is present, + all of the inputparams must be present to define the outparam, else any of the inputparams + being present will define outparam. When defined, outparam will have the value outvalue. + For many applications, this value will be 1, which will allow rate computations to be + performed. + +*/ +class CConstProcessor : public CTCLInterpreterObject +{ + // Constructors and canonicals: +public: + CConstProcessor(CTCLInterpreter& interp); + virtual ~CConstProcessor(); + + // illegal canonicals: + +private: + CConstProcessor(const CConstProcessor& rhs); + CConstProcessor& operator=(const CConstProcessor& rhs); + int operator==(const CConstProcessor& rhs) const; + int operator!=(const CConstProcessor& rhs) const; + + // Dispatcher for the commands: + +protected: + int operator()(CTCLInterpreter& interp, + std::vector<CTCLObject>& objv); + + // Helpers: + +private: + int create(CTCLInterpreter& interp, + std::vector<CTCLObject>& objv) const; + int destroy(CTCLInterpreter& interp, + std::vector<CTCLObject>& objv) const; + + static std::string usage() const; +}; + +#endif Modified: trunk/plugins/const/CConstProcessor.cpp =================================================================== --- trunk/plugins/const/CConstProcessor.cpp 2009-08-07 10:43:42 UTC (rev 1618) +++ trunk/plugins/const/CConstProcessor.cpp 2009-08-07 11:00:40 UTC (rev 1619) @@ -1,271 +0,0 @@ -/* - This software is Copyright by the Board of Trustees of Michigan - State University (c) Copyright 2008 - - You may use this software under the terms of the GNU public license - (GPL). The terms of this license are described at: - - http://www.gnu.org/licenses/gpl.txt - - Author: - Ron Fox - NSCL - Michigan State University - East Lansing, MI 48824-1321 -*/ - -#include <config.h> -#include "CConstProcessor.h" -#include "CConstData.h" -#include <TCLInterpreter.h> -#include <TCLObject.h> -#include <stdlib.h> - - - -using namespace std; - -/////////////////////////////////////////////////////////////////////////////// - -/*! - Construction - the name of the command is hardwired to 'const' and the - command is registered. - - @param interp - Reference to the interpreter on which the command will be - registered. -*/ -CConstProcessor::CConstProcessor(CTCLInterpreter& interp) : - CTCLObjectProcessor(interp, string("const"), true) -{} - -/*! - Destructor just passes up the inheritance chain as we have no object specific - dynamic data: -*/ -CConstProcessor::~CConstProcessor() -{} - -/////////////////////////////////////////////////////////////////////////////// - -/*! - - Dispatch the command to create, destroy or usage in the case of errors. - - Commands must have at least 3 words, else usage() is called to get the - error message which is then returned as the command value along with TCL_ERROR - - If the second command word is -delete, control is passed to the destroy() - method, else to the create() method. These methods can set the interpreter - result and the status which are passed back to the caller without further - interpretation. - - Any exception processing must either be done in the detailed processors - or in the caller chain, as none is done at this level. - - @param interp (CTCLInterpreter&) Reference to the interpreter that is running - this command. - @param objv (vector<CTCLObject>&) Reference to a vector of encapsulated - Tcl_Obj's that make up the command. objv[0] is the command - word ("const"). - @return int - @retval TCL_OK - The command executed without error. The result is the - name of the new parameter. - @retval TCL_ERROR - The command failed and the reason for the failure is - the interpreter result (error message). -*/ -int -CConstProcessor::operator()(CTCLInterpreter& interp, - std::vector<CTCLObject>& objv) -{ - // Check for the minimum number of command words: - - if (objv.size() < 3) { - string result = "Too few command parameters\n"; - result += usage(); - interp.setResult(result); - return TCL_ERROR; - } - - // Bind all the command words to this interpreter enabling more advanced functionality - // of each CTCTLObject: - - for(int i=0; i < objv.size(); i++) { - objv[i].Bind(interp); - } - - // Dispatch the command: - - string keyword(objv[1]); // is this -delete? - - if (keyword == string("-delete")) { - return destroy(interp, objv); - } - else { - return create(interp, objv); - } -} - - -////////////////////////////////////////////////////////////////////////////// - -/* - * Create a new variable. - * - There can be only 4 or 5 parameters. - * - If there are 5 parameters, the second word must be "-and" and we will create an and - * processor. - * - If there are 4 parameters we're creating an or processor. - * - The outvalue must parse as a double. - * - The call to the appropriate add function in CConstData must not throw - * an exception (the exception string will be turned into the result and result in a - * TCL_ERROR - * Parameters: - * interp - Intepreter that's running this command. - * objv - Array of encapsulated objects (Tcl_Obj) that define the command. - * Return: - * TCL_OK - A new parameter was created successfully. Result string is the name - * of the parameter. - * TCL_ERROR- The parameter creation failed and the result string is the - * reason for the failure. - */ -int -CConstProcessor::create(CTCLInterpreter& interp, vector<CTCLObject>& objv) const -{ - // All errors are turned into string exceptions: - - try { - size_t wordCount = objv.size(); - int nameIndex = 1; - bool and(false); - - // Must be 4 or 5 words: - - if (wordCount != 5 && wordCount != 4) { - throw string("Incorrect number of command paramters"); - } - // If 5 first parameter must be '-and'. - - if (wordCount == 5) { - if (objv[1] != string("-and")) { - throw string("If there are 5 command words the second must be '-and'"); - } - and = true; - nameIndex = 2; - } - // at this point, and is true if we are doing an and and outparam is at - // the index in nameIndex. The rest is nice common code until the - // actual attempt to create: - - string name(objv[nameIndex]); - - // validate the value: - - string value(objv[nameIndex+1]); - char* endPointer; - double fValue = strotod(value.c_str(), &endPointer); - if (endPointer == value.c_str()) { - throw string("The value parameter is not evaluating to a floating point number"); - } - // Pull the input params into a list of strings: - - try { - vector<CTCLObject> inputParameters = objv[nameIndex + 2].getListElments(); - } - catch (...) { - throw string("The input parameters are not a correctly formatted TCL list"); - } - - vector<string> inputParameterNames; - for( int i=0; i < inputParameters.size(); i++) { - inputParameters[i].Bind(interp); - inputParameterNames.push_back(string(inputParameters[i])); - } - - CConstData& data(CConstData::getInstance()); - if (and) { - data.addAndParameter(name, fValue, inputParameterNames); - } - else { - data.addOrParameter(name, fValue, inputParameterNames); - } - - // We survived so we can set the result and return TCL_OK. - - interp.setResult(name); - return TCL_OK; - - } - - // All errors are turned into exceptions: - - catch(string msg) { - mst += '\n'; - msg += usage(); - interp.setResult(msg); - return TCL_ERROR; - } -} - - -/* - * Delete an existing variable. - * - There must be exactly three command words. - * - The last command word is passed to the data manager's - * deleteParameter function - * Parameters: - * interp - Intepreter that's running this command. - * objv - Array of encapsulated objects (Tcl_Obj) that define the command. - * Return: - * TCL_OK - The parameter was deleted. No result is set. - * TCL_ERROR - Parameter deletion failed and the result is an error message. - */ -int -CConstProcessor::destroy(CTCLInterpreter& interp, vector<CTCLObject>& objv) const -{ - // All errors get mapped to string exceptions: - - try { - if (objv.size() != 3) { - throw string("const -delete has the wrong number of command words"); - } - string name = objv[2]; - CConstData& data(CConstData::getInstance()); - - data.deleteParameter(name); - - return TCL_OK; - - } - catch (string msg) { - msg += "\n"; - msg += usage(); - interp.setResult(msg); - return TCL_ERROR; - } - - -} -/* - * Provides information about how to use the const command: - */ -string -CConstProcessor::usage() const -{ - string result = "Usage:\n"; - result += " const ?-and? outname outvalue [list innames]\n"; - result += " const -delete outname\n"; - result += "Where:\n"; - result += " The first form creates a new parameter:\n"; - result += " -and if present indicates all input parameters must be defined\n"; - result += " outname is the name of the new parameter\n"; - result += " outvalue is the value the outname parameter will be given\n"; - result += " innames are the input parameter names. If -and was not\n"; - result += " present, outname will be assigned outvalue if any of the\n"; - result += " innames were assigned values in the event.\n"; - result += " If -and was present, all innames must have been assigned values\n"; - result += " for outname to be assigned outvalue\n"; - result += " The second form deletes an existing const parameter named outname\n"; - result += " it is an error to attempt to use this to delete anything but a\n"; - result += " const param\n"; - result += "WARNING:\n"; - result += " Deleting a const parameter via 'parameter -delete' is dangerous as\n"; - result += " the const event processor will continue to try to compute the parameter"; - - return result; -} Modified: trunk/plugins/const/CConstProcessor.h =================================================================== --- trunk/plugins/const/CConstProcessor.h 2009-08-07 10:43:42 UTC (rev 1618) +++ trunk/plugins/const/CConstProcessor.h 2009-08-07 11:00:40 UTC (rev 1619) @@ -1,71 +0,0 @@ -#ifndef __CCONSTPROCESSOR_H -#define __CCONSTPROCESSOR_H - -/* - This software is Copyright by the Board of Trustees of Michigan - State University (c) Copyright 2008 - - You may use this software under the terms of the GNU public license - (GPL). The terms of this license are described at: - - http://www.gnu.org/licenses/gpl.txt - - Author: - Ron Fox - NSCL - Michigan State University - East Lansing, MI 48824-1321 -*/ - - -#ifndef __TCLOBJECTPROCESSOR_H -#include <TCLObjectProcessor.h> -#endif - -/*! - Class that implements the const command. This has the following forms: - -\literal - const ?-and? outparam outvalue [list inputparams] - const -delete outparam -\endliteral - The first form of the command creates a new const parameter. If -and is present, - all of the inputparams must be present to define the outparam, else any of the inputparams - being present will define outparam. When defined, outparam will have the value outvalue. - For many applications, this value will be 1, which will allow rate computations to be - performed. - -*/ -class CConstProcessor : public CTCLInterpreterObject -{ - // Constructors and canonicals: -public: - CConstProcessor(CTCLInterpreter& interp); - virtual ~CConstProcessor(); - - // illegal canonicals: - -private: - CConstProcessor(const CConstProcessor& rhs); - CConstProcessor& operator=(const CConstProcessor& rhs); - int operator==(const CConstProcessor& rhs) const; - int operator!=(const CConstProcessor& rhs) const; - - // Dispatcher for the commands: - -protected: - int operator()(CTCLInterpreter& interp, - std::vector<CTCLObject>& objv); - - // Helpers: - -private: - int create(CTCLInterpreter& interp, - std::vector<CTCLObject>& objv) const; - int destroy(CTCLInterpreter& interp, - std::vector<CTCLObject>& objv) const; - - static std::string usage() const; -}; - -#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-08-07 11:25:35
|
Revision: 1620 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1620&view=rev Author: ron-fox Date: 2009-08-07 11:25:28 +0000 (Fri, 07 Aug 2009) Log Message: ----------- Coded CConstProcessor Fixed up CConstCommand (corrected class name) No header needed for the package file. Modified Paths: -------------- trunk/plugins/const/CConstCommand.cpp trunk/plugins/const/CConstCommand.h trunk/plugins/const/CConstProcessor.cpp trunk/plugins/const/CConstProcessor.h Removed Paths: ------------- trunk/plugins/const/CConstPackage.h Modified: trunk/plugins/const/CConstCommand.cpp =================================================================== --- trunk/plugins/const/CConstCommand.cpp 2009-08-07 11:00:40 UTC (rev 1619) +++ trunk/plugins/const/CConstCommand.cpp 2009-08-07 11:25:28 UTC (rev 1620) @@ -15,7 +15,7 @@ */ #include <config.h> -#include "CConstProcessor.h" +#include "CConstCommand.h" #include "CConstData.h" #include <TCLInterpreter.h> #include <TCLObject.h> @@ -34,7 +34,7 @@ @param interp - Reference to the interpreter on which the command will be registered. */ -CConstProcessor::CConstProcessor(CTCLInterpreter& interp) : +CConstCommand::CConstCommand(CTCLInterpreter& interp) : CTCLObjectProcessor(interp, string("const"), true) {} @@ -42,7 +42,7 @@ Destructor just passes up the inheritance chain as we have no object specific dynamic data: */ -CConstProcessor::~CConstProcessor() +CConstCommand::~CConstCommand() {} /////////////////////////////////////////////////////////////////////////////// @@ -71,7 +71,7 @@ the interpreter result (error message). */ int -CConstProcessor::operator()(CTCLInterpreter& interp, +CConstCommand::operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv) { // Check for the minimum number of command words: @@ -125,7 +125,7 @@ * reason for the failure. */ int -CConstProcessor::create(CTCLInterpreter& interp, vector<CTCLObject>& objv) const +CConstCommand::create(CTCLInterpreter& interp, vector<CTCLObject>& objv) const { // All errors are turned into string exceptions: @@ -216,7 +216,7 @@ * TCL_ERROR - Parameter deletion failed and the result is an error message. */ int -CConstProcessor::destroy(CTCLInterpreter& interp, vector<CTCLObject>& objv) const +CConstCommand::destroy(CTCLInterpreter& interp, vector<CTCLObject>& objv) const { // All errors get mapped to string exceptions: @@ -245,7 +245,7 @@ * Provides information about how to use the const command: */ string -CConstProcessor::usage() const +CConstCommand::usage() const { string result = "Usage:\n"; result += " const ?-and? outname outvalue [list innames]\n"; Modified: trunk/plugins/const/CConstCommand.h =================================================================== --- trunk/plugins/const/CConstCommand.h 2009-08-07 11:00:40 UTC (rev 1619) +++ trunk/plugins/const/CConstCommand.h 2009-08-07 11:25:28 UTC (rev 1620) @@ -1,5 +1,5 @@ -#ifndef __CCONSTPROCESSOR_H -#define __CCONSTPROCESSOR_H +#ifndef __CCONSTCOMMAND_H +#define __CCONSTCOMMAND_H /* This software is Copyright by the Board of Trustees of Michigan @@ -36,20 +36,20 @@ performed. */ -class CConstProcessor : public CTCLInterpreterObject +class CConstCommand : public CTCLInterpreterObject { // Constructors and canonicals: public: - CConstProcessor(CTCLInterpreter& interp); - virtual ~CConstProcessor(); + CConstCommand(CTCLInterpreter& interp); + virtual ~CConstCommand(); // illegal canonicals: private: - CConstProcessor(const CConstProcessor& rhs); - CConstProcessor& operator=(const CConstProcessor& rhs); - int operator==(const CConstProcessor& rhs) const; - int operator!=(const CConstProcessor& rhs) const; + CConstCommand(const CConstCommand& rhs); + CConstCommand& operator=(const CConstCommand& rhs); + int operator==(const CConstCommand& rhs) const; + int operator!=(const CConstCommand& rhs) const; // Dispatcher for the commands: Modified: trunk/plugins/const/CConstProcessor.cpp =================================================================== --- trunk/plugins/const/CConstProcessor.cpp 2009-08-07 11:00:40 UTC (rev 1619) +++ trunk/plugins/const/CConstProcessor.cpp 2009-08-07 11:25:28 UTC (rev 1620) @@ -0,0 +1,117 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ +#include <config.h> +#include "CConstProcessor.h" +#include "CConstData.h" + +using namespace std; + +static void processAndParameters(CEvent& event, + CConstData::ParameterIterator start, + CConstData::ParameterIterator stop); +static void processOrParameters(CEvent& event, + CConstData::ParameterIterator start, + CConstData::ParameterIterator stop); + +static bool assigned(CEvent& event, UInt_t index); + +/*! + Process events. + @param pEvent - Pointer to the raw event, unused. + @param rEvent - Reference to the output parameters.. this is read/write. + @param rAnalyzer - Reference to the analyzer unused. + @param rDecoder - Reference to the buffer decoder, unused. + @return Bool_t + @retval kfTRUE +*/ +Bool_t +CConstProcessor:: operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + CConstData& data(CConstData::getInstance()); + + processAndParameters(rEvent, data.andBegin(), data.andEnd()); + procesOrParameter(rEvent, data.orBegin(), data.orEnd()); + + return kfTRUE; +} + +/* + * Static function that returns true if a parameter has beena ssigned to. + * + * Parameters: + * event - Reference to the parameter array. + * index - Number of the paramter to check + */ +bool +assigned(CEvent& event, UInt_t index) +{ + return (index < event.size()) && (event[index].isValid()); +} +/* + * Process the and parameters. The output parameter is set + * iff all of the input parameters have values. + * Parameters: + * event - Output event + * start - Iterator to first ParameterDefinition + * stop - Iterator off the end of the parameter definition container. + */ +void processAndParameters(CEvent& event, + CConstData::ParameterIterator start, + CConstData::ParameterIterator stop) +{ + while(start != stop) { + bool increment = true; + for (int i=0; i < start->s_inputParameters.size(); i++) { + if (!assigned(event, start->s_inputParameters[i])) { + increment = false; + break; + } + } + + if (increment) { + event[start->s_outParameterId] = start->outValue; + } + + stop++; + } +} +/* + * Same as processAnd parameters but the output value is set + * if any of the input parameters are defined. + */ +void processOrParameters(CEvent& event, + CConstData::ParameterIterator start, + CConstData::ParameterIterator stop) +{ + while(start != stop) { + bool increment = false; + for (int i=0; i < start->s_inputParameters.size(); i++) { + if (assigned(event, start->s_inputParameters[i])) { + increment = true; + break; + } + } + + if (increment) { + event[start->s_outParameterId] = start->outValue; + } + + stop++; + } +} Modified: trunk/plugins/const/CConstProcessor.h =================================================================== --- trunk/plugins/const/CConstProcessor.h 2009-08-07 11:00:40 UTC (rev 1619) +++ trunk/plugins/const/CConstProcessor.h 2009-08-07 11:25:28 UTC (rev 1620) @@ -0,0 +1,42 @@ +#ifndef __CCONSTPROCESSOR_H +#define __CCONSTPROCESSOR_H + +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ +#ifndef __EVENTPROCESSOR_H +#include <EventProcessor.h> +#endif + + + +/*! + This event processor performs the calculation of const parameters. + It is driven by the data in the current event and the data structures that + are encapsulated by CConstData. +*/ +class CConstProcessor : public CEventProcessor +{ + // only need the function call operator. + +public: + virtual Bool_t operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); // Physics Event. +} + + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-08-13 10:40:39
|
Revision: 1624 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1624&view=rev Author: ron-fox Date: 2009-08-13 10:40:24 +0000 (Thu, 13 Aug 2009) Log Message: ----------- Register the event processor on first parameter.. ensure it's at the end of the pipeline whenever a new const is created. Modified Paths: -------------- trunk/plugins/const/CConstCommand.cpp trunk/plugins/const/CConstCommand.h trunk/plugins/const/CConstData.cpp trunk/plugins/const/CConstData.h trunk/plugins/const/CConstPackage.cpp trunk/plugins/const/CConstProcessor.cpp trunk/plugins/const/CConstProcessor.h trunk/plugins/const/Makefile.am Added Paths: ----------- trunk/plugins/const/AUTHORS trunk/plugins/const/ChangeLog trunk/plugins/const/NEWS trunk/plugins/const/README trunk/plugins/const/bootstrap trunk/plugins/const/configure.in Modified: trunk/plugins/const/CConstCommand.cpp =================================================================== --- trunk/plugins/const/CConstCommand.cpp 2009-08-13 10:26:17 UTC (rev 1623) +++ trunk/plugins/const/CConstCommand.cpp 2009-08-13 10:40:24 UTC (rev 1624) @@ -132,23 +132,23 @@ try { size_t wordCount = objv.size(); int nameIndex = 1; - bool and(false); + bool And(false); // Must be 4 or 5 words: if (wordCount != 5 && wordCount != 4) { - throw string("Incorrect number of command paramters"); + throw string("Incorrect number of commAnd paramters"); } // If 5 first parameter must be '-and'. if (wordCount == 5) { - if (objv[1] != string("-and")) { - throw string("If there are 5 command words the second must be '-and'"); + if (string(objv[1]) != string("-and")) { + throw string("If there are 5 commAnd words the second must be '-and'"); } - and = true; + And = true; nameIndex = 2; } - // at this point, and is true if we are doing an and and outparam is at + // at this point, And is true if we are doing an And And outparam is at // the index in nameIndex. The rest is nice common code until the // actual attempt to create: @@ -158,14 +158,15 @@ string value(objv[nameIndex+1]); char* endPointer; - double fValue = strotod(value.c_str(), &endPointer); + double fValue = strtod(value.c_str(), &endPointer); if (endPointer == value.c_str()) { throw string("The value parameter is not evaluating to a floating point number"); } // Pull the input params into a list of strings: + vector<CTCLObject> inputParameters; try { - vector<CTCLObject> inputParameters = objv[nameIndex + 2].getListElments(); + inputParameters = objv[nameIndex + 2].getListElements(); } catch (...) { throw string("The input parameters are not a correctly formatted TCL list"); @@ -178,14 +179,14 @@ } CConstData& data(CConstData::getInstance()); - if (and) { + if (And) { data.addAndParameter(name, fValue, inputParameterNames); } else { data.addOrParameter(name, fValue, inputParameterNames); } - // We survived so we can set the result and return TCL_OK. + // We survived so we can set the result And return TCL_OK. interp.setResult(name); return TCL_OK; @@ -195,7 +196,7 @@ // All errors are turned into exceptions: catch(string msg) { - mst += '\n'; + msg += '\n'; msg += usage(); interp.setResult(msg); return TCL_ERROR; @@ -205,15 +206,15 @@ /* * Delete an existing variable. - * - There must be exactly three command words. - * - The last command word is passed to the data manager's + * - There must be exactly three commAnd words. + * - The last commAnd word is passed to the data manager's * deleteParameter function * Parameters: - * interp - Intepreter that's running this command. - * objv - Array of encapsulated objects (Tcl_Obj) that define the command. + * interp - Intepreter that's running this commAnd. + * objv - Array of encapsulated objects (Tcl_Obj) that define the commAnd. * Return: * TCL_OK - The parameter was deleted. No result is set. - * TCL_ERROR - Parameter deletion failed and the result is an error message. + * TCL_ERROR - Parameter deletion failed And the result is an error message. */ int CConstCommand::destroy(CTCLInterpreter& interp, vector<CTCLObject>& objv) const @@ -222,7 +223,7 @@ try { if (objv.size() != 3) { - throw string("const -delete has the wrong number of command words"); + throw string("const -delete has the wrong number of commAnd words"); } string name = objv[2]; CConstData& data(CConstData::getInstance()); @@ -242,10 +243,10 @@ } /* - * Provides information about how to use the const command: + * Provides information about how to use the const commAnd: */ string -CConstCommand::usage() const +CConstCommand::usage() { string result = "Usage:\n"; result += " const ?-and? outname outvalue [list innames]\n"; Modified: trunk/plugins/const/CConstCommand.h =================================================================== --- trunk/plugins/const/CConstCommand.h 2009-08-13 10:26:17 UTC (rev 1623) +++ trunk/plugins/const/CConstCommand.h 2009-08-13 10:40:24 UTC (rev 1624) @@ -36,7 +36,7 @@ performed. */ -class CConstCommand : public CTCLInterpreterObject +class CConstCommand : public CTCLObjectProcessor { // Constructors and canonicals: public: @@ -65,7 +65,7 @@ int destroy(CTCLInterpreter& interp, std::vector<CTCLObject>& objv) const; - static std::string usage() const; + static std::string usage(); }; #endif Modified: trunk/plugins/const/CConstData.cpp =================================================================== --- trunk/plugins/const/CConstData.cpp 2009-08-13 10:26:17 UTC (rev 1623) +++ trunk/plugins/const/CConstData.cpp 2009-08-13 10:40:24 UTC (rev 1624) @@ -15,6 +15,7 @@ */ #include <config.h> // SpecTcl configuration file. #include "CConstData.h" // my class. +#include "CConstProcessor.h" #include <SpecTcl.h> // SpecTcl API. @@ -23,8 +24,11 @@ // Class level data: -CConstData* CConstData::m_pInstance(0); // Singleton pointer. +CConstData* CConstData::m_pInstance(0); // Singleton pointer. +CConstProcessor* CConstData::m_pProcessor(0); +static const char* ProcessorName = "ConstEventProcessor"; + /////////////////////////////////////////////////////////////////////// /* * Constructor is private: @@ -46,6 +50,8 @@ if (!m_pInstance) { new CConstData(); // Stores the instance pointer. } + + return *m_pInstance; } @@ -65,8 +71,8 @@ std::vector<std::string> inputs) { addParameter(m_andParameters, - std::string name, double value, - std::vector<std::string> inputs); + name, value, + inputs); } /*! Adds an or parameter. @@ -80,12 +86,13 @@ @throw string - One of the input parameters does not exist. */ void -ConstData:: addOrParameter(std::string name, double value, +CConstData:: addOrParameter(std::string name, double value, std::vector<std::string> inputs) { addParameter(m_orParameters, - std::string name, double value, - std::vector<std::string> inputs); + name, + value, + inputs); } /*! @@ -99,14 +106,14 @@ @throw string - If parameter is not a const parameter. */ void -ConstData::deleteParameter(std::string name) +CConstData::deleteParameter(std::string name) { DictionaryIterator p = m_dictionary.find(name); if (p == m_dictionary.end()) { throwParameterNotConst(name); } else { - p->second.s_pList.erase(p->second.s_pParam); // Erase from list. + p->second.s_pList->erase(p->second.s_pParam); // Erase from list. m_dictionary.erase(p); SpecTcl* pApi = SpecTcl::getInstance(); pApi->RemoveParameter(name); @@ -127,7 +134,7 @@ CConstData::ParameterIterator CConstData::andEnd() { - return m_andParameterse.end(); + return m_andParameters.end(); } CConstData::ParameterIterator @@ -166,14 +173,14 @@ // First validate the output and input parameters. // if they are not valid, call the appropriate thrower method: - pParameter = pApi=>FindParameter(name); + pParameter = pApi->FindParameter(name); if(pParameter) { throwParameterExists(name); } for (int i =0; i < inputs.size(); i++) { pParameter = pApi->FindParameter(inputs[i]); if (!pParameter) { - throw ParameterDoesNotExist(inputs[i]); + throwParameterDoesNotExist(inputs[i]); } def.s_inputParameters.push_back(pParameter->getNumber()); } @@ -181,13 +188,25 @@ // input parameters. make the output parameter: def.s_outParameterId = pApi->AssignParameterId(); - def.outValue = value; + def.s_outValue = value; pApi->AddParameter(name,def.s_outParameterId, string("")); which.push_back(def); dict.s_pList = &which; - dict.s_pParam = which.back(); + dict.s_pParam = which.end() - 1; + + // Finally if the event processor is not yet registered, register it. + // if it is registered, move it to the back of the processing list: + + if(m_pProcessor) { + pApi->RemoveEventProcessor(string(ProcessorName)); + } + else { + m_pProcessor = new CConstProcessor; + } + pApi->AddEventProcessor(*m_pProcessor, ProcessorName); + } @@ -209,7 +228,7 @@ void CConstData::throwParameterDoesNotExist(std::string name) { - string exception embedName("There is no parameter named",name, + string exception = embedName("There is no parameter named",name, "defined in SpecTcl"); throw exception; } @@ -220,7 +239,7 @@ void CConstData::throwParameterNotConst(std::string name) { - string exception embedName("", name, + string exception = embedName("", name, "is not an existing 'const' parameter"); throw exception; } @@ -232,8 +251,10 @@ CConstData::embedName(const char* prefix, std::string name, const char* suffix) { string output(prefix); - prefix += ' '; - prefix += name; - prefix += ' '; - prefix += suffix; + output += ' '; + output += name; + output += ' '; + output += suffix; + + return output; } Modified: trunk/plugins/const/CConstData.h =================================================================== --- trunk/plugins/const/CConstData.h 2009-08-13 10:26:17 UTC (rev 1623) +++ trunk/plugins/const/CConstData.h 2009-08-13 10:40:24 UTC (rev 1624) @@ -37,6 +37,8 @@ #endif #endif +class CConstProcessor; + /*! This class contains the data used to drive the const event processor. The data maintenance functions are called by the command processor or @@ -66,7 +68,7 @@ typedef std::vector<ParameterDefinition> ParameterDefinitions; typedef ParameterDefinitions::iterator ParameterIterator; - typdef struct _DictionaryEntry { + typedef struct _DictionaryEntry { ParameterDefinitions* s_pList; ParameterIterator s_pParam; } DictionaryEntry; @@ -83,7 +85,8 @@ // Singleton instance - static CConstData* m_pInstance; + static CConstData* m_pInstance; + static CConstProcessor* m_pProcessor; // Constructors...and canonicals.. remember this is a singleton: Modified: trunk/plugins/const/CConstPackage.cpp =================================================================== --- trunk/plugins/const/CConstPackage.cpp 2009-08-13 10:26:17 UTC (rev 1623) +++ trunk/plugins/const/CConstPackage.cpp 2009-08-13 10:40:24 UTC (rev 1624) @@ -22,7 +22,7 @@ using namespace std; -static char* version = "0.1"; +static const char* version = "1.0"; /*! The package inintialization is done here. Modified: trunk/plugins/const/CConstProcessor.cpp =================================================================== --- trunk/plugins/const/CConstProcessor.cpp 2009-08-13 10:26:17 UTC (rev 1623) +++ trunk/plugins/const/CConstProcessor.cpp 2009-08-13 10:40:24 UTC (rev 1624) @@ -14,11 +14,15 @@ East Lansing, MI 48824-1321 */ #include <config.h> + #include "CConstProcessor.h" #include "CConstData.h" +#include <SpecTcl.h> +#include "Event.h" using namespace std; + static void processAndParameters(CEvent& event, CConstData::ParameterIterator start, CConstData::ParameterIterator stop); @@ -28,6 +32,8 @@ static bool assigned(CEvent& event, UInt_t index); + + /*! Process events. @param pEvent - Pointer to the raw event, unused. @@ -46,7 +52,7 @@ CConstData& data(CConstData::getInstance()); processAndParameters(rEvent, data.andBegin(), data.andEnd()); - procesOrParameter(rEvent, data.orBegin(), data.orEnd()); + processOrParameters(rEvent, data.orBegin(), data.orEnd()); return kfTRUE; } @@ -85,7 +91,7 @@ } if (increment) { - event[start->s_outParameterId] = start->outValue; + event[start->s_outParameterId] = start->s_outValue; } stop++; @@ -109,7 +115,7 @@ } if (increment) { - event[start->s_outParameterId] = start->outValue; + event[start->s_outParameterId] = start->s_outValue; } stop++; Modified: trunk/plugins/const/CConstProcessor.h =================================================================== --- trunk/plugins/const/CConstProcessor.h 2009-08-13 10:26:17 UTC (rev 1623) +++ trunk/plugins/const/CConstProcessor.h 2009-08-13 10:40:24 UTC (rev 1624) @@ -29,6 +29,12 @@ */ class CConstProcessor : public CEventProcessor { + // Realize the singleton pattern: + + +public: + static CConstProcessor* getInstance(); + // only need the function call operator. public: @@ -36,7 +42,7 @@ CEvent& rEvent, CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder); // Physics Event. -} +}; #endif Modified: trunk/plugins/const/Makefile.am =================================================================== --- trunk/plugins/const/Makefile.am 2009-08-13 10:26:17 UTC (rev 1623) +++ trunk/plugins/const/Makefile.am 2009-08-13 10:40:24 UTC (rev 1624) @@ -0,0 +1,21 @@ +lib_LTLIBRARIES = libconstparam.la + +libconstparam_la_SOURCES = CConstCommand.cpp \ + CConstData.cpp \ + CConstPackage.cpp \ + CConstProcessor.cpp + +noinst_HEADERS = CConstCommand.h \ + CConstData.h \ + CConstProcessor.h + +INCLUDES = -I. $(SPECTCLCCSW) \ + $(TCLCCSW) + + + +install-exec-local: + $(mkinstalldirs) $(prefix)/TclLibs $(prefix)/TclLibs/constparam + for f in .libs/lib*; do $(INSTALL_PROGRAM) $$f $(prefix)/TclLibs/constparam; done + echo package ifneeded constparam 1.0 [list load [file join '$$dir' libconstparam.so]] > $(prefix)/TclLibs/constparam/pkgIndex.tcl + Added: trunk/plugins/const/bootstrap =================================================================== --- trunk/plugins/const/bootstrap (rev 0) +++ trunk/plugins/const/bootstrap 2009-08-13 10:40:24 UTC (rev 1624) @@ -0,0 +1,10 @@ +#!/bin/sh + +set -x +find . -name .deps -exec rm -rf {} \; +find . -name "*.o" -exec rm {} \; +aclocal -I config +libtoolize --force --copy +autoheader +automake --add-missing --copy +autoconf --warnings=none Property changes on: trunk/plugins/const/bootstrap ___________________________________________________________________ Added: svn:executable + * Added: trunk/plugins/const/configure.in =================================================================== --- trunk/plugins/const/configure.in (rev 0) +++ trunk/plugins/const/configure.in 2009-08-13 10:40:24 UTC (rev 1624) @@ -0,0 +1,143 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + + +AC_INIT(constparam, 1.0, fo...@ns...) +AC_CONFIG_AUX_DIR(config) +AM_CONFIG_HEADER([configure.h]) +AC_CANONICAL_HOST +AM_INIT_AUTOMAKE() + +AC_EXEEXT +AC_OBJEXT + +# Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_LIBTOOL + + +# Checks for typedefs, structures, and compiler characteristics. + +AC_C_CONST + + +# Checks for libraries. + +# Checks for header files. + + +tcl_versions="8.5 8.4 8.3 8.2 8.1 8.0" # First match; so order new -> old. + + + +tcl_header_dir="" +AC_MSG_CHECKING([for tcl header directory]) + +AC_ARG_WITH(tcl-header-dir, + [ --with-tcl-header-dir=path Path to tcl headers], + [tcl_header_dir=$withval ; + tcl_headers_found="yes"],[tcl_headers_found="no"]) + + +# +# Look for tcl.h in the following places: +# Note that the order is important for Darwin and OSF1. + # + # /sw/include (Best for darwin). + # /usr/local/tcl/include (Best for NSCL Cygwin). + # /usr/local/include (Best for NSCL OSF1) + # /usr/include (Best for e.g. Linux). + # + # For all of these directories, + # look for tcl.h in: + # - the directory itself. + # - a tcl subdirectory to the directory. + # - subdirectories of the form tcl${version} where + # version is chosein from tcl_versions. + # + +tcl_h_testdirs="/sw/include /usr/local/tcl/include /usr/local/include \ + /usr/include" + +if test $tcl_headers_found = "no" +then + for d in $tcl_h_testdirs + do + for v in ${tcl_versions}; + do + if test $tcl_headers_found = "no" + then + AC_CHECK_FILE([${d}/tcl${v}/tcl.h], + [tcl_header_dir=${d}/tcl${v} + tcl_headers_found="yes"]) + fi + done + if test $tcl_headers_found = "no" + then + AC_CHECK_FILE([${d}/tcl.h], + [tcl_header_dir=$d + tcl_headers_found="yes"]) + fi + if test $tcl_headers_found = "no" + then + AC_CHECK_FILE([${d}/tcl/tcl.h], + [tcl_header_dir=${d}/tcl + tcl_headers_found="yes"]) + fi + done +fi + +if test $tcl_headers_found = "yes"; then + TCLINCDIR=${tcl_header_dir} + AC_MSG_RESULT(Using path $tcl_header_dir) +else + AC_MSG_ERROR([can't find tcl.h try using --with-tcl-header-dir to help me]) +fi + + +# --prefix is assumed to be where spectcl is unless overidden +# with --with-spectcl-home +# + +AC_ARG_WITH(spectcl-home, + [ --with-spectcl-home=path Path to SpecTcl installatino], + [SPECTCLHOME=$withval], + [SPECTCLHOME=$prefix]) + + + +# In order to make documentation, we need a docbooktopdf +# installed. If it's not installed, we'll make some substitutions +# that will make the build succeed. + +AC_PATH_PROG([DOCBOOK], [docbook2pdf], + [docbook2pdf], [touch $$@]) + +# Makefile macros exported: + + # TCL: + + + TCLCCSW="-I${TCLINCDIR}" + AC_SUBST(TCLCCSW) + + # SpecTcl: + + SPECTCLCCSW="-I${SPECTCLHOME}/include" + AC_SUBST(SPECTCLCCSW) + + # Documentation: + + AC_SUBST(DOCBOOK) + + + +# Checks for library functions. + + +AC_OUTPUT(Makefile) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2009-08-27 10:33:03
|
Revision: 1630 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1630&view=rev Author: ron-fox Date: 2009-08-27 10:32:52 +0000 (Thu, 27 Aug 2009) Log Message: ----------- Add documentation for the plugin. Modified Paths: -------------- trunk/plugins/const/Makefile.am Added Paths: ----------- trunk/plugins/const/const.xml Modified: trunk/plugins/const/Makefile.am =================================================================== --- trunk/plugins/const/Makefile.am 2009-08-14 10:49:29 UTC (rev 1629) +++ trunk/plugins/const/Makefile.am 2009-08-27 10:32:52 UTC (rev 1630) @@ -19,3 +19,10 @@ for f in .libs/lib*; do $(INSTALL_PROGRAM) $$f $(prefix)/TclLibs/constparam; done echo package ifneeded constparam 1.0 [list load [file join '$$dir' libconstparam.so]] > $(prefix)/TclLibs/constparam/pkgIndex.tcl +EXTRA_DIST = const.xml + +const.pdf: const.xml + @DOCBOOK@ const.xml + + +docs: const.pdf \ No newline at end of file Added: trunk/plugins/const/const.xml =================================================================== --- trunk/plugins/const/const.xml (rev 0) +++ trunk/plugins/const/const.xml 2009-08-27 10:32:52 UTC (rev 1630) @@ -0,0 +1,453 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" + "file:///usr/share/xml/docbook/schema/dtd/4.3/docbookx.dtd" +> +<book> + <bookinfo> + <title>const parameter plugin</title> + <author><firstname>Ron</firstname><surname>Fox</surname></author> + <revhistory> + <revision> + <revnumber>1.0</revnumber> + <date>August 27, 2009</date> + <authorinitials>RF</authorinitials> + <revremark>Original Release</revremark> + </revision> + </revhistory> + </bookinfo> + + +<chapter> + <title>Introduction and installation.</title> + <para> + The <application>const</application> plugin allows you to create a new + SpecTcl parameter that has a constant value if either one of a set of + parameters is defined or all of a set of parameters is defined in an event. + The plugin adds the <command>const</command> command to SpecTcl, as well + as an event processor that computes the parameters created by the + <command>const</command> command. + </para> + <para> + The const plugin facilitates the production of rate/stripchart spectra. + Suppose you already have a parameter that represents time. You want to + know the rate at which you are getting at least one hit in a set of detectors. + You can create a const parameter based on some parameter that indicates one + of those detectors is hit (such as a timing parameter), and plot that const + parameter against your time in a stripchart spectrum. + </para> + <para> + The remainder of this chapter describges: + </para> + <orderedlist> + <listitem> + <para> + How to obtain the <application>const</application> parameter + plugin. + </para> + </listitem> + <listitem> + <para> + How to install the plugin + </para> + </listitem> + </orderedlist> + <para> + The second chapter <link linkend='chap.usage'>Using the const plugin</link> + describes how to use the plugin and provides a reference page for the + <command>const</command> command. + </para> + <section> + <title>Obtaining the plugin.</title> + <para> + The plugin can be obtained from the SourceForge NSCL SpecTcl project + site (<ulink url='http://www.sourceforge.net/projects/nsclspectcl'>http://www.sourceforge.net/projects/nsclspectcl</ulink>). + As Sourceforge has been changing the appearance of the site precise + click by click instructions are not possible. What can be said is that + the downloads are organized by package. Each package has a set of + releases, and each release has a set of files. All plugins are + in the plugins package. Go to the latest release and download the + file with a name that begins <filename>constparam</filename>. + The filename will be of the form <filename>constparam</filename><replaceable>-a.b-nnn</replaceable><filename>.tar.gz</filename>. + Where <replaceable>a.b-nnn</replaceable> will be the plug in version number. + </para> + </section> + <section> + <title>Installing the plugin</title> + <para> + We will assume that you have downloaded a tarball named + <filename>constparam-1.0-001.tar.gz</filename> in the sample commands + below. Substitute the actual name of the tarball where appropriate + in the example commands. + </para> + <para> + Unwrap the tarball into a new directory: + </para> + <informalexample> + <programlisting> +tar xzf constparam-1.0-001.tar.gz + </programlisting> + </informalexample> + <para> + This should create a new directory tree under your current working + director named <filename>constparam-1.0-001</filename>. + enter that directory + </para> + <informalexample> + <programlisting> +cd constparam-1.0-001 + </programlisting> + </informalexample> + <para> + Plugin installation follows the 'usual' GNU software approach of + running a configuration script and then using the Unix + <command>make</command> command to build and install the + software. + </para> + <para> + The plugin configuration will need to know several things. These + can be provided via a set of command line switches to the + <command>configure</command> script, defaulted or, in some cases + searched for by the script: + </para> + <variablelist> + <varlistentry> + <term><option>--prefix</option>=<replaceable>path</replaceable></term> + <listitem> + <para> + Describes the top level directory in which the plugin + should be installed. The actual plugin files will be + installed in the <filename>TclLibs</filename> directory + within that <parameter>path</parameter>. + </para> + <para> + Normally plugins are installed in the installation + directory tree of a specific SpecTcl installation. + For example at the NSCL, for SpecTcl 3.3, + <parameter>path</parameter> is + <filename>/usr/opt/spectcl/3.3</filename>. + see the <option>--with-spectcl-home</option> + switch below, however. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>--with-spectcl-home</option>=<replaceable>path</replaceable></term> + <listitem> + <para> + Provides the top leve of the SpecTcl installation directory. + This must be where a specific version of SpecTcl is installed. + If not provided, this defaults to the value of the + <option>--prefix</option> option. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>--with-tcl-header-dir</option>=<replaceable>path</replaceable></term> + <listitem> + <para> + In most cases, the configuration script is able to locate + the Tcl C API headers. If, however this search fails, + you can explicitly point the configuration at the + directory that contains <filename>tcl.h</filename> by + using the <option>--with-tcl-header-dir</option> + switch. + </para> + </listitem> + </varlistentry> + </variablelist> + <para> + The <command>configure</command> script provides quite a few additional. + switches and listens to several environment variables. To get a + listing of these invoke the script with the <option>--help</option> + switch. + </para> + <para> + The sample line below configures the plugin to be installed in the + <filename>TclLibs</filename> directory tree of SpecTcl-3.2 at the + NSCL: + </para> + <informalexample> + <programlisting> +./configure --prefix=/usr/opt/spectcl/3.2 + </programlisting> + </informalexample> + <para> + Once configured, you use <command>make</command> to build and + install the software: + </para> + <informalexample> + <programlisting> +make install + </programlisting> + </informalexample> + <para> + The example below pulls all of this together to show a + typical installation command set. + </para> + <example> + <title>Installation example</title> + <programlisting> +tar xzf constparam-1.0-001.tar.gz +cd constparam +./configure --prefix=/usr/opt/spectcl/3.2 +make install + </programlisting> + </example> + </section> +</chapter> +<chapter id='chap.usage'> + <title>Using the const plugin</title> + <para> + This chapter describes how to use the const plugin within your tailored + SpecTcl. We will assume that you've installed the plugin in the + SpecTcl installation directory tree, however it should be clear how + to modify these instructions if you've installed the plugin elsewhere. + </para> + <para> + This chapter specifically contains: + </para> + <orderedlist> + <listitem> + <para>Instructions for loading the plugin into a running SpecTcl</para> + </listitem> + <listitem> + <para>Instructions for createing and deleting const parameters. + </para> + </listitem> + <listitem> + <para>Reference information for the <command>const</command> command + created by the plugin. + </para> + </listitem> + </orderedlist> + <section> + <title>Loading the plugin</title> + <para> + SpecTcl plugins look like Tcl loadable packages to SpecTcl. + To load a plugin you therefore must ensure that the + directory tree containing the plugin is part of the Tcl + <varname>auto_path</varname> search list global variable. + </para> + <para> + Again, assuming you are using SpecTcl 3.2, as installed at + the NSCL, you can do this by adding the following line to your + <filename>SpecTclRC.tcl</filename> intialization file: + </para> + <informalexample> + <programlisting> +lappend auto_path /usr/opt/spectcl/3.2/TclLibs + </programlisting> + </informalexample> + <para> + The Tcl <command>package</command> command can then be used to + load the plugin by name. Once more the command below can be + added to your <filename>SpecTclRC.tcl</filename> initialization + script: + </para> + <informalexample> + <programlisting> +package require constparam + </programlisting> + </informalexample> + <para> + You can verify interactively that the package loaded successfully + by asking Tcl if it knows about the const command. + </para> + <informalexample> + <programlisting> +info commands const + </programlisting> + </informalexample> + <para> + If the package loaded successfully, you Tcl will echo back + <literal>const</literal>. If not, Tcl will echo back an empty + result. If the load has failed, try loading the package interactively + and see if the error messages issued help you figure out what went + wrong. + </para> + </section> + <section> + <title>Using the plugin</title> + <para> + The plugin add the <command>const</command> command to SpecTcl. + You can use this command to create and delete parameters managed + by the plugin. Parameters created by the <command>const</command> + command are just like any other SpecTcl parameter, gates can depend + on them, Spectra can be made from them, psuedo parameters can + bge defined that depend on them and so on. + </para> + <para> + However, in order to ensure that all parameters required by a + const parameter have been defined or not when the const parameters + are computed, each time you define a const parameter, the event + processor responsible for computing all const parameters is shifted + to the end of the event processor pipeline. + </para> + <para> + Const parameters depend on a list of existing parameters. + There are two types of const parameters. The default type + is an <literal>or</literal> parameter. It is defined if + any of the parameters it depends on has been given a value in + that event. You can also define an <literal>and</literal> parameter + which is only defined if <emphasis>all</emphasis> of the parameters + it depends on have been given a value. + </para> + <para> + The commands below define first an or and then an and parameter: + </para> + <informalexample> + <programlisting> +const anorparameter 1 [list p1 p2 p3 p4] +const -and anandparameter 1 [list p5 p6 p7] + </programlisting> + </informalexample> + <para> + As you can see, the only difference between the form of the two + commands is the presence of the <option>-and</option> option + on the second, and parameter definition. + </para> + <para> + The command line parameters are: + <orderedlist> + <listitem> + <para>The name of the parameter to be created</para> + </listitem> + <listitem> + <para> + The value to be assigned the new parameter if it should + be defined. + </para> + </listitem> + <listitem> + <para> + The list of parameters the new parameter depends on. + </para> + </listitem> + </orderedlist> + </para> + <para> + While the SpecTcl <command>parameter -delete</command> command + can be used to delete the definition of a const parameter, + the event processor that computes these parameters will not be aware + of that fact. You should therefore always delete (if necessary) + const parameters via the <command>const</command> command. + </para> + <para> + The sample below deletes the and parameter we created: + </para> + <informalexample> + <programlisting> +const -delete anandparameter + </programlisting> + </informalexample> + + </section> + <section> + <title>The <command>const</command> command reference</title> +<refentry id="manpage.const"> + <refmeta> + <refentrytitle>const</refentrytitle> + <manvolnum>1spectcl</manvolnum> + </refmeta> + <refnamediv> + <refname>const</refname> + <refpurpose>Create/Delete const parameters</refpurpose> + </refnamediv> + + <refsynopsisdiv> + <cmdsynopsis> + <command> +const ?-and? outparam outvalue list-of-input-parameters + </command> + </cmdsynopsis> +<cmdsynopsis> + <command> +const -delete outparam + </command> +</cmdsynopsis> + + </refsynopsisdiv> + <refsect1> + <title>DESCRIPTION</title> + <para> + The <command>const</command> command is added to the set of SpecTcl commands + by loading the const plugin. It allows you to create or delete constant + parameters. A constant parameter is one that is conditionally assigned + a constant value depending on the presence or absence of previously define + SpecTcl parameters. + </para> + <para> + Two types of constant paramters can be defined. <literal>Or</literal> + parameters are defined if at least one of the parameters they depend + on were given values. <literal>And</literal> parameters are only defined + if all of the parameters they depend on have been assigned values. + </para> + <para> + The first form of the command in the SYNOPSIS section creates a new + parameter. If the <option>-and</option> option is present, an + <literal>And</literal> parameter is created as described in the + previous paragraph. The new parameter will be named + <parameter>outparam</parameter>. When defined it will be given the + value <parameter>outvalue</parameter> which must evaluate to a + floating point constant. <parameter>list-of-input-parameters</parameter> + is a properly formatted Tcl list of existing SpecTcl parameter names + that provide the parameters required to define the + <parameter>outparam</parameter> for each event. You can use the + Tcl <command>list</command> command to generate this list. + </para> + <para> + The second form of the parameter deletes the constant parameter + named <parameter>outparam</parameter>. No action will be taken, and an + error will be emitted if <parameter>outparam</parameter> is not + a constant parameter (created by <parameter>const</parameter>). + </para> + </refsect1> + <refsect1> + <title> + OPTIONS + </title> + <variablelist> + <varlistentry> + <term><option>-and</option> </term> + <listitem> + <para> + Used when creating a new constant parameter to require that all + the parameters in the <parameter>list-of-input-parameters</parameter> + must be given a value in order to give a value to the output + parameter. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-delete</option></term> + <listitem> + <para> + Used after the <command>const</command> command to indicate the + command is deleting the <parameter>outparam</parameter> + </para> + </listitem> + </varlistentry> + </variablelist> + </refsect1> + <refsect1> + <title>EXAMPLES</title> + <example> + <title>Creating or and and parameters</title> + <programlisting> +const anorparameter 1 [list p1 p2 p3 p4] +const -and anandparameter 1 [list p5 p6 p7] </programlisting> + </example> + <example> + <title>Deleting an existing const parameter</title> + <programlisting> +const -delete anorparameter + </programlisting> + </example> + + </refsect1> + +</refentry> + + </section> +</chapter> +</book> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-04-28 17:01:50
|
Revision: 2174 http://sourceforge.net/p/nsclspectcl/code/2174 Author: ron-fox Date: 2014-04-28 17:01:46 +0000 (Mon, 28 Apr 2014) Log Message: ----------- * configure.in -> configure.ac * In Makefile.am INCLUDES -> AM_CPPFLAGS Modified Paths: -------------- trunk/plugins/const/Makefile.am Added Paths: ----------- trunk/plugins/const/configure.ac Removed Paths: ------------- trunk/plugins/const/configure.in Modified: trunk/plugins/const/Makefile.am =================================================================== --- trunk/plugins/const/Makefile.am 2014-04-28 17:01:16 UTC (rev 2173) +++ trunk/plugins/const/Makefile.am 2014-04-28 17:01:46 UTC (rev 2174) @@ -9,7 +9,7 @@ CConstData.h \ CConstProcessor.h -INCLUDES = -I. $(SPECTCLCCSW) \ +AM_CPPFLAGS = -I. $(SPECTCLCCSW) \ $(TCLCCSW) @@ -25,4 +25,4 @@ @DOCBOOK@ const.xml -docs: const.pdf \ No newline at end of file +docs: const.pdf Copied: trunk/plugins/const/configure.ac (from rev 2170, trunk/plugins/const/configure.in) =================================================================== --- trunk/plugins/const/configure.ac (rev 0) +++ trunk/plugins/const/configure.ac 2014-04-28 17:01:46 UTC (rev 2174) @@ -0,0 +1,143 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + + +AC_INIT(constparam, 1.0, fo...@ns...) +AC_CONFIG_AUX_DIR(config) +AM_CONFIG_HEADER([configure.h]) +AC_CANONICAL_HOST +AM_INIT_AUTOMAKE() + +AC_EXEEXT +AC_OBJEXT + +# Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_LIBTOOL + + +# Checks for typedefs, structures, and compiler characteristics. + +AC_C_CONST + + +# Checks for libraries. + +# Checks for header files. + + +tcl_versions="8.5 8.4 8.3 8.2 8.1 8.0" # First match; so order new -> old. + + + +tcl_header_dir="" +AC_MSG_CHECKING([for tcl header directory]) + +AC_ARG_WITH(tcl-header-dir, + [ --with-tcl-header-dir=path Path to tcl headers], + [tcl_header_dir=$withval ; + tcl_headers_found="yes"],[tcl_headers_found="no"]) + + +# +# Look for tcl.h in the following places: +# Note that the order is important for Darwin and OSF1. + # + # /sw/include (Best for darwin). + # /usr/local/tcl/include (Best for NSCL Cygwin). + # /usr/local/include (Best for NSCL OSF1) + # /usr/include (Best for e.g. Linux). + # + # For all of these directories, + # look for tcl.h in: + # - the directory itself. + # - a tcl subdirectory to the directory. + # - subdirectories of the form tcl${version} where + # version is chosein from tcl_versions. + # + +tcl_h_testdirs="/sw/include /usr/local/tcl/include /usr/local/include \ + /usr/include" + +if test $tcl_headers_found = "no" +then + for d in $tcl_h_testdirs + do + for v in ${tcl_versions}; + do + if test $tcl_headers_found = "no" + then + AC_CHECK_FILE([${d}/tcl${v}/tcl.h], + [tcl_header_dir=${d}/tcl${v} + tcl_headers_found="yes"]) + fi + done + if test $tcl_headers_found = "no" + then + AC_CHECK_FILE([${d}/tcl.h], + [tcl_header_dir=$d + tcl_headers_found="yes"]) + fi + if test $tcl_headers_found = "no" + then + AC_CHECK_FILE([${d}/tcl/tcl.h], + [tcl_header_dir=${d}/tcl + tcl_headers_found="yes"]) + fi + done +fi + +if test $tcl_headers_found = "yes"; then + TCLINCDIR=${tcl_header_dir} + AC_MSG_RESULT(Using path $tcl_header_dir) +else + AC_MSG_ERROR([can't find tcl.h try using --with-tcl-header-dir to help me]) +fi + + +# --prefix is assumed to be where spectcl is unless overidden +# with --with-spectcl-home +# + +AC_ARG_WITH(spectcl-home, + [ --with-spectcl-home=path Path to SpecTcl installatino], + [SPECTCLHOME=$withval], + [SPECTCLHOME=$prefix]) + + + +# In order to make documentation, we need a docbooktopdf +# installed. If it's not installed, we'll make some substitutions +# that will make the build succeed. + +AC_PATH_PROG([DOCBOOK], [docbook2pdf], + [docbook2pdf], [touch $$@]) + +# Makefile macros exported: + + # TCL: + + + TCLCCSW="-I${TCLINCDIR}" + AC_SUBST(TCLCCSW) + + # SpecTcl: + + SPECTCLCCSW="-I${SPECTCLHOME}/include" + AC_SUBST(SPECTCLCCSW) + + # Documentation: + + AC_SUBST(DOCBOOK) + + + +# Checks for library functions. + + +AC_OUTPUT(Makefile) Deleted: trunk/plugins/const/configure.in =================================================================== --- trunk/plugins/const/configure.in 2014-04-28 17:01:16 UTC (rev 2173) +++ trunk/plugins/const/configure.in 2014-04-28 17:01:46 UTC (rev 2174) @@ -1,143 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - - -AC_INIT(constparam, 1.0, fo...@ns...) -AC_CONFIG_AUX_DIR(config) -AM_CONFIG_HEADER([configure.h]) -AC_CANONICAL_HOST -AM_INIT_AUTOMAKE() - -AC_EXEEXT -AC_OBJEXT - -# Checks for programs. -AC_PROG_CXX -AC_PROG_CC -AC_PROG_CPP -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET -AC_PROG_LIBTOOL - - -# Checks for typedefs, structures, and compiler characteristics. - -AC_C_CONST - - -# Checks for libraries. - -# Checks for header files. - - -tcl_versions="8.5 8.4 8.3 8.2 8.1 8.0" # First match; so order new -> old. - - - -tcl_header_dir="" -AC_MSG_CHECKING([for tcl header directory]) - -AC_ARG_WITH(tcl-header-dir, - [ --with-tcl-header-dir=path Path to tcl headers], - [tcl_header_dir=$withval ; - tcl_headers_found="yes"],[tcl_headers_found="no"]) - - -# -# Look for tcl.h in the following places: -# Note that the order is important for Darwin and OSF1. - # - # /sw/include (Best for darwin). - # /usr/local/tcl/include (Best for NSCL Cygwin). - # /usr/local/include (Best for NSCL OSF1) - # /usr/include (Best for e.g. Linux). - # - # For all of these directories, - # look for tcl.h in: - # - the directory itself. - # - a tcl subdirectory to the directory. - # - subdirectories of the form tcl${version} where - # version is chosein from tcl_versions. - # - -tcl_h_testdirs="/sw/include /usr/local/tcl/include /usr/local/include \ - /usr/include" - -if test $tcl_headers_found = "no" -then - for d in $tcl_h_testdirs - do - for v in ${tcl_versions}; - do - if test $tcl_headers_found = "no" - then - AC_CHECK_FILE([${d}/tcl${v}/tcl.h], - [tcl_header_dir=${d}/tcl${v} - tcl_headers_found="yes"]) - fi - done - if test $tcl_headers_found = "no" - then - AC_CHECK_FILE([${d}/tcl.h], - [tcl_header_dir=$d - tcl_headers_found="yes"]) - fi - if test $tcl_headers_found = "no" - then - AC_CHECK_FILE([${d}/tcl/tcl.h], - [tcl_header_dir=${d}/tcl - tcl_headers_found="yes"]) - fi - done -fi - -if test $tcl_headers_found = "yes"; then - TCLINCDIR=${tcl_header_dir} - AC_MSG_RESULT(Using path $tcl_header_dir) -else - AC_MSG_ERROR([can't find tcl.h try using --with-tcl-header-dir to help me]) -fi - - -# --prefix is assumed to be where spectcl is unless overidden -# with --with-spectcl-home -# - -AC_ARG_WITH(spectcl-home, - [ --with-spectcl-home=path Path to SpecTcl installatino], - [SPECTCLHOME=$withval], - [SPECTCLHOME=$prefix]) - - - -# In order to make documentation, we need a docbooktopdf -# installed. If it's not installed, we'll make some substitutions -# that will make the build succeed. - -AC_PATH_PROG([DOCBOOK], [docbook2pdf], - [docbook2pdf], [touch $$@]) - -# Makefile macros exported: - - # TCL: - - - TCLCCSW="-I${TCLINCDIR}" - AC_SUBST(TCLCCSW) - - # SpecTcl: - - SPECTCLCCSW="-I${SPECTCLHOME}/include" - AC_SUBST(SPECTCLCCSW) - - # Documentation: - - AC_SUBST(DOCBOOK) - - - -# Checks for library functions. - - -AC_OUTPUT(Makefile) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |