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;
Decoding and management for VQWK ADC channels (6x32-bit datawords)
Definition of the pure virtual base class of all data elements.
#define QwError
Predefined log drain for errors.
#define QwWarning
Predefined log drain for warnings.
Parameter file parsing and management.
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)