47 std::pair<std::string,std::string> type_name;
48 size_t len = variable.length();
49 size_t pos1 = variable.find_first_of(delim);
50 size_t pos2 = variable.find_first_not_of(delim,pos1);
51 if (pos1 == string::npos) {
52 type_name.first =
"NULL";
53 type_name.second =
"NULL";
55 string type = variable.substr(0,pos1);
56 string name = variable.substr(pos2,len-pos2);
57 type_name.first = type;
58 type_name.second = name;
76 std::pair<EQwHandleType,std::string> type_name;
77 std::pair<std::string,std::string> tmpPair;
92 while ( tmpToken !=
"" ) {
94 if (tmpPair.first==
"Channel") {
101 else if (tmpPair.first ==
"Kind") {
104 else if (tmpPair.first ==
"Chan") {
107 else if (tmpPair.first ==
"Error-Code") {
142 tmpAlarmObject.
value = NULL;
170 const UInt_t* eventcut = NULL;
188 QwWarning <<
"Independent variable for AlarmHandler has unknown type."
192 if (ana_ptr != NULL) {
212 for (size_t dv = 0; dv < fAlarmObjectList.size(); dv++) {
213 // Get the dependent variables
215 const VQwHardwareChannel* dv_ptr = 0;
216 QwVQWK_Channel* new_vqwk = NULL;
217 QwVQWK_Channel* vqwk = NULL;
219 string calc = "calc_";
221 if (fAnalysisType.at(dv)==kHandleTypeAsym || fAnalysisType.at(dv)==kHandleTypeDiff){
222 // Quietly skip the asymmetry or difference types.
224 } else if(fAnalysisType.at(dv) != kHandleTypeMps){
225 QwWarning << "QwAlarmHandler::ConnectChannels(QwSubsystemArrayParity& event): Dependent variable, "
226 << fAnalysisName.at(dv)
227 << ", for MPS alarm handler does not have MPS type, type=="
228 << fAnalysisType.at(dv) << "."<< QwLog::endl;
231 if(fAnalysisName.at(dv).at(0) == '@' ){
232 name = fAnalysisName.at(dv).substr(1,fAnalysisName.at(dv).length());
233 new_vqwk = new QwVQWK_Channel(name, VQwDataElement::kDerived);
235 dv_ptr = event.RequestExternalPointer(fAnalysisName.at(dv));
237 vqwk = dynamic_cast<QwVQWK_Channel*>(dv_ptr);
238 name = vqwk.GetElementName().Data();
239 new_vqwk = new QwVQWK_Channel(*vqwk, VQwDataElement::kDerived);
240 new_vqwk.SetElementName(name);
242 new_vqwk.SetSubsystemName(fName);
247 QwWarning << "Dependent variable " << fAnalysisName.at(dv) << " could not be found, "
248 << "or is not a VQWK channel." << QwLog::endl;
251 //QwMessage << "dv: " << new_vqwk.GetElementName() << QwLog::endl;
253 fAnalysisType.push_back(fAnalysisType.at(dv));
254 fDependentVar.push_back(vqwk);
255 fOutputVar.push_back(new_vqwk);
256 //fDependentVar.push_back(std::make_pair(vqwk, new_vqwk));
259 return 0; // FIXME this won't work, and the pointers are all wrong anyway...
325 std::string tmpAlarmStat =
"OK";
330 if (
fAlarmObjectList.at(numAna).alarmParameterMapStr.count(
"Error-Code") != 0
331 && ((TString)
fAlarmObjectList.at(numAna).alarmParameterMapStr.at(
"Error-Code")).IsHex() && ((std::stoul(
fAlarmObjectList.at(numAna).alarmParameterMapStr.at(
"Error-Code"),
nullptr,16)) & *
fAlarmObjectList.at(numAna).eventcutErrorFlag) != 0 ) {
334 tmpAlarmStat =
"Error-Code";
336 else if (
fAlarmObjectList.at(numAna).alarmParameterMap.count(
"Exactly") != 0
340 tmpAlarmStat =
"Not-Exactly";
342 else if (
fAlarmObjectList.at(numAna).alarmParameterMap.count(
"HighHigh") != 0
346 tmpAlarmStat =
"HighHigh";
352 tmpAlarmStat =
"High";
354 else if (
fAlarmObjectList.at(numAna).alarmParameterMap.count(
"LowLow") != 0
358 tmpAlarmStat =
"LowLow";
364 tmpAlarmStat =
"Low";
386 std::ofstream file_out;
413 file_out<<
fAlarmObjectList.at(ite).alarmParameterMapStr.at(
"Kind")<<
","<<
fAlarmObjectList.at(ite).alarmParameterMapStr.at(
"Chan")<<
","<<
fAlarmObjectList.at(ite).alarmParameterMapStr.at(
"Analysis")<<
","<<jte.first<<
","<<jte.second<<std::endl;
#define QwError
Predefined log drain for errors.
#define QwWarning
Predefined log drain for warnings.
Parameter file parsing and management.
Definition of the pure virtual base class of all data elements.
Decoding and management for VQWK ADC channels (6x32-bit datawords)
#define REGISTER_DATA_HANDLER_FACTORY(A)
Alarm handling data handler for monitoring system alerts.
Helicity pattern analysis and management.
virtual const VQwHardwareChannel * ReturnInternalValue(const TString &name) const
Retrieve an internal variable by name (pointer version) Searches for the named variable among publish...
static std::ostream & endl(std::ostream &)
End of the line.
Configuration file parser with flexible tokenization and search capabilities.
Bool_t PopValue(const std::string keyname, T &retvalue)
void TrimWhitespace(TString::EStripType head_tail=TString::kBoth)
void TrimComment(const char commentchar)
std::string GetNextToken(const std::string &separatorchars)
Get next token as a string.
Abstract base for concrete hardware channels implementing dual-operator pattern.
Data handler that evaluates alarm conditions and writes status outputs.
std::string fAlarmOutputFile
void ParseConfigFile(QwParameterFile &) override
std::vector< alarmObject > fAlarmObjectList
QwAlarmHandler()
Default constructor (Protected for child class access)
QwAlarmHandler(const TString &name)
Constructor with name.
std::pair< std::string, std::string > ParseAlarmMapVariable(const string &, char)
void ProcessData() override
Process a single event: update alarm states and outputs.
Int_t ConnectChannels(QwSubsystemArrayParity &yield, QwSubsystemArrayParity &asym, QwSubsystemArrayParity &diff) override
Connect to Channels (event only)
const VQwHardwareChannel * value
VQwDataHandler::EQwHandleType analysisType
const UInt_t * eventcutErrorFlag
std::map< std::string, double > alarmParameterMap
std::map< std::string, std::string > alarmParameterMapStr
Subsystem array container specialized for parity analysis with asymmetry calculations.
const UInt_t * GetEventcutErrorFlagPointer() const
void SetEventcutErrorFlagPointer(const UInt_t *errorflagptr)
virtual void ParseConfigFile(QwParameterFile &file)
VQwDataHandler(const TString &name)
std::string ParseSeparator
std::pair< EQwHandleType, std::string > ParseHandledVariable(const std::string &variable)