def event (self, evt, env) : if (evt.get("skip_event")) : return self.nshots += 1 s = None t = evt.getTime() if (t is not None): s = t.seconds() + (t.nanoseconds() / 1000000000) else : self.nfail += 1 self.logger.warning("event(): no timestamp, shot skipped") evt.put(skip_event_flag(), "skip_event") return if (not isinstance(s, float)) : raise RuntimeError("Wrong type for 's': %s" % type(s).__name__) # XXX This hardcodes the address for the front detector! det_z = cspad_tbx.env_detz('CxiDs1-0|Cspad-0', env) if (det_z is None): self.nfail += 1 self.logger.warning("event(): no distance, shot skipped") evt.put(skip_event_flag(), "skip_event") return laser01 = cspad_tbx.env_laser_status(env, 1) if laser01 is None: self.nfail += 1 self.logger.warning("event(): no status for laser 1, shot skipped") evt.put(skip_event_flag(), 'skip_event') return laser04 = cspad_tbx.env_laser_status(env, 4) if laser04 is None: self.nfail += 1 self.logger.warning("event(): no status for laser 4, shot skipped") evt.put(skip_event_flag(), 'skip_event') return # Laser power for fourth laser. The control name was provided by # Jan Kern. XXX Move to its own function in cspad_tbx? laser04_power = None if env is not None: pv = env.epicsStore().value('CXI:LAS:MMN:02:ROT.RBV') if pv is not None and len(pv.values) == 1: laser04_power = pv.values[0] if laser04_power is None: self.nfail += 1 self.logger.warning("event(): no power for laser 4, shot skipped") evt.put(skip_event_flag(), 'skip_event') return si_foil = cspad_tbx.env_sifoil(env) if (si_foil is None): self.nfail += 1 self.logger.warning("event(): no Si-foil thickness, shot skipped") evt.put(skip_event_flag(), "skip_event") return if (not (isinstance(si_foil, float) or isinstance(si_foil, int))) : raise RuntimeError("Wrong type for 'si_foil': %s"% type(si_foil).__name__) wavelength = cspad_tbx.evt_wavelength(evt) if (wavelength is None): self.nfail += 1 self.logger.warning("event(): no wavelength, shot skipped") evt.put(skip_event_flag(), "skip_event") return # In order to keep all arrays the same length, only append once # all values have been successfully obtained. XXX Still bugs: see # June run 119. self._t.append(s) self._si_foil.append(si_foil) self._wavelength.append(wavelength) self._det_z.append(det_z) self._laser01.append(laser01) self._laser04.append(laser04) self._laser04_power.append(laser04_power) if (self.nshots % 120 == 0) : self.update_plot()
def event(self, evt, env): if (evt.get("skip_event")): return self.nshots += 1 s = None t = evt.getTime() if (t is not None): s = t.seconds() + (t.nanoseconds() / 1000000000) else: self.nfail += 1 self.logger.warning("event(): no timestamp, shot skipped") evt.put(skip_event_flag(), "skip_event") return if (not isinstance(s, float)): raise RuntimeError("Wrong type for 's': %s" % type(s).__name__) # XXX This hardcodes the address for the front detector! det_z = cspad_tbx.env_detz('CxiDs1-0|Cspad-0', env) if (det_z is None): self.nfail += 1 self.logger.warning("event(): no distance, shot skipped") evt.put(skip_event_flag(), "skip_event") return laser01 = cspad_tbx.env_laser_status(env, 1) if laser01 is None: self.nfail += 1 self.logger.warning("event(): no status for laser 1, shot skipped") evt.put(skip_event_flag(), 'skip_event') return laser04 = cspad_tbx.env_laser_status(env, 4) if laser04 is None: self.nfail += 1 self.logger.warning("event(): no status for laser 4, shot skipped") evt.put(skip_event_flag(), 'skip_event') return # Laser power for fourth laser. The control name was provided by # Jan Kern. XXX Move to its own function in cspad_tbx? laser04_power = None if env is not None: pv = env.epicsStore().value('CXI:LAS:MMN:02:ROT.RBV') if pv is not None and len(pv.values) == 1: laser04_power = pv.values[0] if laser04_power is None: self.nfail += 1 self.logger.warning("event(): no power for laser 4, shot skipped") evt.put(skip_event_flag(), 'skip_event') return si_foil = cspad_tbx.env_sifoil(env) if (si_foil is None): self.nfail += 1 self.logger.warning("event(): no Si-foil thickness, shot skipped") evt.put(skip_event_flag(), "skip_event") return if (not (isinstance(si_foil, float) or isinstance(si_foil, int))): raise RuntimeError("Wrong type for 'si_foil': %s" % type(si_foil).__name__) wavelength = cspad_tbx.evt_wavelength(evt) if (wavelength is None): self.nfail += 1 self.logger.warning("event(): no wavelength, shot skipped") evt.put(skip_event_flag(), "skip_event") return # In order to keep all arrays the same length, only append once # all values have been successfully obtained. XXX Still bugs: see # June run 119. self._t.append(s) self._si_foil.append(si_foil) self._wavelength.append(wavelength) self._det_z.append(det_z) self._laser01.append(laser01) self._laser04.append(laser04) self._laser04_power.append(laser04_power) if (self.nshots % 120 == 0): self.update_plot()
def event(self, evt, env): """The event() function is called for every L1Accept transition. The event() function does not log shots skipped due to incompleteness in order to keep the output streams clean. Instead, the number of skipped shots is reported by endjob(). @param evt Event data object, a configure object @param env Environment object """ if (evt.get("skip_event")): return # XXX This hardcodes the address for the front detector! detz = cspad_tbx.env_detz('CxiDs1-0|Cspad-0', env) if (detz is None): self.m_no_detz += 1 sifoil = cspad_tbx.env_sifoil(env) if (sifoil is None): self.m_no_sifoil += 1 timestamp = cspad_tbx.evt_timestamp(cspad_tbx.evt_time(evt)) if (timestamp is None): self.m_no_timestamp += 1 wavelength = cspad_tbx.evt_wavelength(evt) if (wavelength is None): self.m_no_wavelength += 1 if (detz is None or sifoil is None or timestamp is None or wavelength is None): self.m_nfail += 1 return if (detz != self.m_detz): if (self.m_detz is None): self.m_logger.info("%s: initial detz % 8.4f" % (timestamp, detz)) else: self.m_logger.info("%s: detz % 8.4f -> % 8.4f" % (timestamp, self.m_detz, detz)) self.m_detz = detz if (self.m_detz_max is None or detz > self.m_detz_max): self.m_detz_max = detz if (self.m_detz_min is None or detz < self.m_detz_min): self.m_detz_min = detz if (sifoil != self.m_sifoil): if (self.m_sifoil is None): self.m_logger.info("%s: initial Si-foil % 8d" % (timestamp, sifoil)) else: self.m_logger.info("%s: Si-foil % 8d -> % 8d" % (timestamp, self.m_sifoil, sifoil)) self.m_sifoil = sifoil if (self.m_sifoil_max is None or sifoil > self.m_sifoil_max): self.m_sifoil_max = sifoil if (self.m_sifoil_min is None or sifoil < self.m_sifoil_min): self.m_sifoil_min = sifoil # Accumulate the sum and the squared sum of the shifted the # wavelength. The shift is taken as the first wavelength # encountered. This may be more accurate than accumulating raw # values [Chan et al. (1983) Am. Stat. 37, 242-247]. if (self.m_nmemb == 0): self.m_wavelength_shift = wavelength self.m_wavelength_sum = (wavelength - self.m_wavelength_shift) self.m_wavelength_sumsq = (wavelength - self.m_wavelength_shift)**2 self.m_nmemb = 1 else: self.m_wavelength_sum += (wavelength - self.m_wavelength_shift) self.m_wavelength_sumsq += (wavelength - self.m_wavelength_shift)**2 self.m_nmemb += 1