Source code for EventCodeManager
"""
:py:class:`EventCodeManager` class-helper for event selection using event code
==============================================================================
Usage::
from Detector.EventCodeManager import EventCodeManager
evcode = '1,2,4'
ecm = EventCodeManager(evcode, verbos=0)
for evt ds.events() :
if not ecm.select(evt) : continue
Methods:
* :py:meth:`EventCodeManager.set_event_codes`
* :py:meth:`EventCodeManager.select`
This software was developed for the LCLS project.
If you use all or part of it, please give an appropriate acknowledgment.
Created (moved from app/det_ndarr_raw_proc) on 2017-10-20 by Mikhail Dubrovin
"""
#------------------------------
from Detector.EvrDetector import EvrDetector
[docs]class EventCodeManager :
"""Class-helper for event selection using event code.
The string of comma-separated event codes is passed in evcode through option -c, (ex.: -c 1,2,4).
If any of listed event codes are available in evt Evr event codes then method select(evt) returns True, otherwise False.
If any of input event codes is set negative - then all event codes are used to deselect event.
More complicated logical formulaes are not supprorted.
"""
def __init__(self, evcode=None, verbos=0) :
self.verbos = verbos
self.set_event_codes(evcode)
self.evrdet = EvrDetector(':Evr')
self.do_check = self.lst_ec is not None and self.evrdet is not None
if self.verbos & 1 : print '%s: list of requested event codes: %s, do_check=%s' %\
(self.__class__.__name__, str(self.lst_ec), self.do_check)
self.counter = 0
[docs] def set_event_codes(self, evcode) :
"""Splits input (str) for list of integer event codes. Any negative event code inverts selection decision for all event codes."""
if evcode is None or evcode.lower() == 'none' :
self.lst_ec = None
return
try :
lst_ec = [int(field) for field in evcode.split(',')] # convert string to a list of int event codes
except :
self.lst_ec = None
return
self.do_deselect = any((ec<0 for ec in lst_ec)) # set do_deselect switch for any negative event code
self.lst_ec = [abs(ec) for ec in lst_ec] # list of unsigned integer event codes
[docs] def select(self, evt) :
"""Returns True/False to select/deselect event."""
if not self.do_check : return True
evt_codes = self.evrdet.eventCodes(evt)
ec_in_event = any(ec in evt_codes for ec in self.lst_ec)
res = (not ec_in_event) if self.do_deselect else ec_in_event
if self.counter < 20 :
self.counter += 1
if self.verbos & 2 :
print '%s.select: evt_codes=%s, result=%s' % (self.__class__.__name__, str(evt_codes), res)
if self.counter == 20 : print '%s.select: stop printing messages' % (self.__class__.__name__)
return res
#------------------------------