#include #include #include "TclUtils/EventListModule.hh" #include "TclUtils/EventNumSet.hh" #include "AbsEnv/AbsEnv.hh" #define tcl_require_argc(N) do {\ if (argc != N)\ {\ Tcl_SetResult(interp, "wrong # of arguments", TCL_VOLATILE);\ return TCL_ERROR;\ }\ } while(0); #define get_counter_value(varname) do {\ char buf[32];\ tcl_require_argc(1);\ sprintf(buf, "%u", (unsigned) varname);\ Tcl_SetResult(interp, buf, TCL_VOLATILE);\ return TCL_OK;\ } while(0); EventListModule::EventListModule(const char* const theName, const char* const theDescription) : APPFilterModule(theName, theDescription), TclModule(theName, theDescription), // Parameters _filter(false), _allowDuplicates(true), // Variables _eventCount(0), _eventsPassed(0), _duplicateCount(0) { setup_tcl_parameter(_filter); setup_tcl_parameter(_allowDuplicates); _events = new EventNumSet(); _duplicates = new EventNumSet(); _passed = new EventNumSet(); } EventListModule::~EventListModule() { delete _passed; delete _duplicates; delete _events; } int EventListModule::parseCommand(Tcl_Interp * const interp, int argc, char *argv[]) { if (argc > 0) { if (strcmp(argv[0], "addEvent") == 0) return _events->addEvent(interp, argc, argv); else if (strcmp(argv[0], "removeEvent") == 0) return _events->removeEvent(interp, argc, argv); else if (strcmp(argv[0], "setEventList") == 0) return _events->setAll(interp, argc, argv); else if (strcmp(argv[0], "eventList") == 0) return _events->getAll(interp, argc, argv); else if (strcmp(argv[0], "duplicateList") == 0) return _duplicates->getAll(interp, argc, argv); else if (strcmp(argv[0], "passedList") == 0) { if (_filter) return _passed->getAll(interp, argc, argv); else return _events->getAll(interp, argc, argv); } else if (strcmp(argv[0], "clearEventList") == 0) { tcl_require_argc(1); _events->clear(); return TCL_OK; } else if (strcmp(argv[0], "eventCount") == 0) { get_counter_value(_eventCount); } else if (strcmp(argv[0], "eventsPassed") == 0) { get_counter_value(_eventCount); } else if (strcmp(argv[0], "duplicateCount") == 0) { get_counter_value(_eventCount); } else if (strcmp(argv[0], "methods") == 0 && argc == 1) { Tcl_AppendElement(interp, "addEvent"); Tcl_AppendElement(interp, "removeEvent"); Tcl_AppendElement(interp, "setEventList"); Tcl_AppendElement(interp, "clearEventList"); Tcl_AppendElement(interp, "eventList"); Tcl_AppendElement(interp, "duplicateList"); Tcl_AppendElement(interp, "passedList"); Tcl_AppendElement(interp, "eventCount"); Tcl_AppendElement(interp, "eventsPassed"); Tcl_AppendElement(interp, "duplicateCount"); } } return TclModule::parseCommand(interp, argc, argv); } AppResult EventListModule::event(AbsEvent* anEvent) { const int run = AbsEnv::instance()->runNumber(); const int trigNum = AbsEnv::instance()->trigNumber(); const bool isInSet = _events->eventInSet(run, trigNum); if (_filter) { // Filter mode. _events is the list of events to pass. // Fill _passed set. if (isInSet) { if (_passed->eventInSet(run, trigNum)) { _duplicates->addEvent(run, trigNum); ++_duplicateCount; if (_allowDuplicates) { setPassed(true); ++_eventsPassed; } else setPassed(false); } else { setPassed(true); ++_eventsPassed; _passed->addEvent(run, trigNum); } } else setPassed(false); } else { // Not a filter mode. _events is the list of all events. // Do not fill _passed set. if (isInSet) { _duplicates->addEvent(run, trigNum); ++_duplicateCount; if (_allowDuplicates) { setPassed(true); ++_eventsPassed; } else setPassed(false); } else { setPassed(true); ++_eventsPassed; _events->addEvent(run, trigNum); } } ++_eventCount; return AppResult::OK; }