44 std::pair<std::string,std::string> type_name;
45 size_t len = variable.length();
46 size_t pos1 = variable.find_first_of(delim);
47 size_t pos2 = variable.find_first_not_of(delim,pos1);
48 if (pos1 == string::npos) {
49 type_name.first =
"NULL";
50 type_name.second =
"NULL";
52 string type = variable.substr(0,pos1);
53 string name = variable.substr(pos2,len-pos2);
54 type_name.first = type;
55 type_name.second = name;
73 std::pair<EQwHandleType,std::string> type_name;
74 std::pair<std::string,std::string> tmpPair;
89 while ( tmpToken !=
"" ) {
91 if (tmpPair.first==
"Channel") {
98 else if (tmpPair.first ==
"Kind") {
101 else if (tmpPair.first ==
"Chan") {
104 else if (tmpPair.first ==
"Error-Code") {
139 tmpAlarmObject.
value = NULL;
167 const UInt_t* eventcut = NULL;
185 QwWarning <<
"Independent variable for AlarmHandler has unknown type."
189 if (ana_ptr != NULL) {
209 for (size_t dv = 0; dv < fAlarmObjectList.size(); dv++) {
210 // Get the dependent variables
212 const VQwHardwareChannel* dv_ptr = 0;
213 QwVQWK_Channel* new_vqwk = NULL;
214 QwVQWK_Channel* vqwk = NULL;
216 string calc = "calc_";
218 if (fAnalysisType.at(dv)==kHandleTypeAsym || fAnalysisType.at(dv)==kHandleTypeDiff){
219 // Quietly skip the asymmetry or difference types.
221 } else if(fAnalysisType.at(dv) != kHandleTypeMps){
222 QwWarning << "QwAlarmHandler::ConnectChannels(QwSubsystemArrayParity& event): Dependent variable, "
223 << fAnalysisName.at(dv)
224 << ", for MPS alarm handler does not have MPS type, type=="
225 << fAnalysisType.at(dv) << "."<< QwLog::endl;
228 if(fAnalysisName.at(dv).at(0) == '@' ){
229 name = fAnalysisName.at(dv).substr(1,fAnalysisName.at(dv).length());
230 new_vqwk = new QwVQWK_Channel(name, VQwDataElement::kDerived);
232 dv_ptr = event.RequestExternalPointer(fAnalysisName.at(dv));
234 vqwk = dynamic_cast<QwVQWK_Channel*>(dv_ptr);
235 name = vqwk.GetElementName().Data();
236 new_vqwk = new QwVQWK_Channel(*vqwk, VQwDataElement::kDerived);
237 new_vqwk.SetElementName(name);
239 new_vqwk.SetSubsystemName(fName);
244 QwWarning << "Dependent variable " << fAnalysisName.at(dv) << " could not be found, "
245 << "or is not a VQWK channel." << QwLog::endl;
248 //QwMessage << "dv: " << new_vqwk.GetElementName() << QwLog::endl;
250 fAnalysisType.push_back(fAnalysisType.at(dv));
251 fDependentVar.push_back(vqwk);
252 fOutputVar.push_back(new_vqwk);
253 //fDependentVar.push_back(std::make_pair(vqwk, new_vqwk));
256 return 0; // FIXME this won't work, and the pointers are all wrong anyway...
322 std::string tmpAlarmStat =
"OK";
327 if (
fAlarmObjectList.at(numAna).alarmParameterMapStr.count(
"Error-Code") != 0
328 && ((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 ) {
331 tmpAlarmStat =
"Error-Code";
333 else if (
fAlarmObjectList.at(numAna).alarmParameterMap.count(
"Exactly") != 0
337 tmpAlarmStat =
"Not-Exactly";
339 else if (
fAlarmObjectList.at(numAna).alarmParameterMap.count(
"HighHigh") != 0
343 tmpAlarmStat =
"HighHigh";
349 tmpAlarmStat =
"High";
351 else if (
fAlarmObjectList.at(numAna).alarmParameterMap.count(
"LowLow") != 0
355 tmpAlarmStat =
"LowLow";
361 tmpAlarmStat =
"Low";
383 std::ofstream file_out;
410 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)
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.
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)