#include #include "TclUtils/TclScriptsModule.hh" #include "AbsEnv/AbsEnv.hh" TclScriptsModule::TclScriptsModule(const char* const theName, const char* const theDescription, const char* const className) : AppModule(theName, theDescription), TclModule(theName, theDescription, className), _beginJobScript(""), _beginRunScript(""), _eventScript(""), _endRunScript(""), _endJobScript(""), _abortJobScript(""), _eventCounter(0), _eventScriptPeriod(1) { setup_tcl_parameter(_beginJobScript); setParameterDescription("beginJobScript", "Script executed at the beginning of a job"); setup_tcl_parameter(_beginRunScript); setParameterDescription("beginRunScript", "Script executed at the beginning of a run"); setup_tcl_parameter(_eventScript); setParameterDescription("eventScript", "Script executed every eventScriptPeriod events"); setup_tcl_parameter(_eventScriptPeriod); setParameterDescription("eventScriptPeriod", "Event script period. Make it 0 or negative to disable the event script"); setup_tcl_parameter(_endRunScript); setParameterDescription("endRunScript", "Script executed when the end of a run is encountered"); setup_tcl_parameter(_endJobScript); setParameterDescription("endJobScript", "Script executed at the end of a job"); setup_tcl_parameter(_abortJobScript); setParameterDescription("abortJobScript", "Script executed when a job is aborted"); setup_tcl_parameter(_eventCounter); setParameterDescription("eventCounter", "The count of processed events"); } AppResult TclScriptsModule::beginJob(AbsEvent* aJob) { return _executeScript(_beginJobScript, "begin job"); } AppResult TclScriptsModule::beginRun(AbsEvent* anEvent) { return _executeScript(_beginRunScript, "begin run"); } AppResult TclScriptsModule::event(AbsEvent* anEvent) { AppResult status(AppResult::OK); if (_eventScriptPeriod > 0) if (_eventCounter % _eventScriptPeriod == _eventScriptPeriod - 1) status = _executeScript(_eventScript, "event"); ++_eventCounter; return status; } AppResult TclScriptsModule::endRun(AbsEvent* anEvent) { return _executeScript(_endRunScript, "end run"); } AppResult TclScriptsModule::endJob(AbsEvent* aJob) { return _executeScript(_endJobScript, "end job"); } AppResult TclScriptsModule::abortJob(AbsEvent* anEvent) { return _executeScript(_abortJobScript, "abort job"); } AppResult TclScriptsModule::_executeScript(std::string& script, const char *where) { if (script.size() > 0) { if (Tcl_Eval(modInterp(), const_cast(script.c_str())) != TCL_OK) { std::cerr << name() << ' ' << where << " script failed"; #if (TCL_MAJOR_VERSION > 7) char *result = Tcl_GetStringResult(modInterp()); #else char *result = modInterp()->result; #endif if (result) if (*result) std::cerr << ":\n" << result; std::cerr << std::endl; return AppResult::ERROR; } } return AppResult::OK; } int TclScriptsModule::parseCommand(Tcl_Interp * const interp, int argc, char *argv[]) { if (argc > 0) { if (strcmp(argv[0], "runNumber") == 0) { char buf[32]; sprintf(buf, "%d", AbsEnv::instance()->runNumber()); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } else if (strcmp(argv[0], "eventNumber") == 0) { char buf[32]; sprintf(buf, "%d", AbsEnv::instance()->trigNumber()); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; } else if (strcmp(argv[0], "monteFlag") == 0) { if (AbsEnv::instance()->monteFlag()) Tcl_SetResult(interp, "1", TCL_VOLATILE); else Tcl_SetResult(interp, "0", TCL_VOLATILE); return TCL_OK; } else if (strcmp(argv[0], "methods") == 0 && argc == 1) { Tcl_AppendElement(interp, "runNumber"); Tcl_AppendElement(interp, "eventNumber"); Tcl_AppendElement(interp, "monteFlag"); } else if (strcmp(argv[0], "help") == 0) { if (argc == 1) { Tcl_AppendElement(interp, "runNumber"); Tcl_AppendElement(interp, "eventNumber"); Tcl_AppendElement(interp, "monteFlag"); } else if (argc == 2) { if (strcmp(argv[1], "runNumber") == 0) { Tcl_AppendResult( interp, "\n* Usage: ", getTclHandle(), " ", argv[1], "\nReturns current run number.\n", 0); return TCL_OK; } else if (strcmp(argv[1], "eventNumber") == 0) { Tcl_AppendResult( interp, "\n* Usage: ", getTclHandle(), " ", argv[1], "\nReturns current event number.\n", 0); return TCL_OK; } else if (strcmp(argv[1], "monteFlag") == 0) { Tcl_AppendResult( interp, "\n* Usage: ", getTclHandle(), " ", argv[1], "\nReturns 1 if MC flag is set for", " the current event, otherwise returns 0.\n", 0); return TCL_OK; } } } } return TclModule::parseCommand(interp, argc, argv); }