def event(self, evt, env): """The event() function is called for every L1Accept transition. @param evt Event data object, a configure object @param env Environment object """ # Increase the event counter, even if this event is to be skipped. self.nshots += 1 if (evt.get("skip_event")): return sifoil = cspad_tbx.env_sifoil(env) if self.check_beam_status and sifoil is None: self.nfail += 1 self.logger.warning("event(): no Si-foil thickness, shot skipped") evt.put(skip_event_flag(), "skip_event") return if (self.sifoil is not None and self.sifoil != sifoil): self.logger.warning("event(): Si-foil changed mid-run: % 8i -> % 8d" % (self.sifoil, sifoil)) self.sifoil = sifoil if self.verbose: self.logger.info("Si-foil thickness: %i" %sifoil) self.evt_time = cspad_tbx.evt_time(evt) # tuple of seconds, milliseconds self.timestamp = cspad_tbx.evt_timestamp(self.evt_time) # human readable format if (self.timestamp is None): self.nfail += 1 self.logger.warning("event(): no timestamp, shot skipped") evt.put(skip_event_flag(), "skip_event") return if self.verbose: self.logger.info(self.timestamp) if self.override_energy is None: self.wavelength = cspad_tbx.evt_wavelength(evt, self.delta_k) if self.wavelength is None: if self.check_beam_status: self.nfail += 1 self.logger.warning("event(): no wavelength, shot skipped") evt.put(skip_event_flag(), "skip_event") return else: self.wavelength = 0 else: self.wavelength = 12398.4187/self.override_energy if self.verbose: self.logger.info("Wavelength: %.4f" %self.wavelength) self.pulse_length = cspad_tbx.evt_pulse_length(evt) if self.pulse_length is None: if self.check_beam_status: self.nfail += 1 self.logger.warning("event(): no pulse length, shot skipped") evt.put(skip_event_flag(), "skip_event") return else: self.pulse_length = 0 if self.verbose: self.logger.info("Pulse length: %s" %self.pulse_length) self.beam_charge = cspad_tbx.evt_beam_charge(evt) if self.beam_charge is None: if self.check_beam_status: self.nfail += 1 self.logger.warning("event(): no beam charge, shot skipped") evt.put(skip_event_flag(), "skip_event") return else: self.beam_charge = 0 if self.verbose: self.logger.info("Beam charge: %s" %self.beam_charge) self.injector_xyz = cspad_tbx.env_injector_xyz(env) #if self.injector_xyz is not None: #self.logger.info("injector_z: %i" %self.injector_xyz[2].value) self.laser_1_status.set_status(cspad_tbx.env_laser_status(env, laser_id=1), self.evt_time) self.laser_4_status.set_status(cspad_tbx.env_laser_status(env, laser_id=4), self.evt_time) self.laser_1_ms_since_change = self.laser_1_status.ms_since_last_status_change(self.evt_time) self.laser_4_ms_since_change = self.laser_4_status.ms_since_last_status_change(self.evt_time) if self.verbose: if self.laser_1_ms_since_change is not None: self.logger.info("ms since laser 1 status change: %i" %self.laser_1_ms_since_change) if self.laser_4_ms_since_change is not None: self.logger.info("ms since laser 4 status change: %i" %self.laser_4_ms_since_change) if self.laser_1_status is not None and self.laser_1_status.status is not None: self.logger.info("Laser 1 status: %i" %int(self.laser_1_status.status)) if self.laser_4_status is not None and self.laser_4_status.status is not None: self.logger.info("Laser 4 status: %i" %int(self.laser_4_status.status))
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. @param evt Event data object, a configure object @param env Environment object """ # Increase the event counter, even if this event is to be skipped. self.nshots += 1 if (evt.get("skip_event")): return sifoil = cspad_tbx.env_sifoil(env) if self.check_beam_status and sifoil is None: self.nfail += 1 self.logger.warning("event(): no Si-foil thickness, shot skipped") evt.put(skip_event_flag(), "skip_event") return if (self.sifoil is not None and self.sifoil != sifoil): self.logger.warning( "event(): Si-foil changed mid-run: % 8i -> % 8d" % (self.sifoil, sifoil)) self.sifoil = sifoil if self.verbose: self.logger.info("Si-foil thickness: %i" % sifoil) self.evt_time = cspad_tbx.evt_time( evt) # tuple of seconds, milliseconds self.timestamp = cspad_tbx.evt_timestamp( self.evt_time) # human readable format if (self.timestamp is None): self.nfail += 1 self.logger.warning("event(): no timestamp, shot skipped") evt.put(skip_event_flag(), "skip_event") return if self.verbose: self.logger.info(self.timestamp) if self.override_energy is None: self.wavelength = cspad_tbx.evt_wavelength(evt, self.delta_k) if self.wavelength is None: if self.check_beam_status: self.nfail += 1 self.logger.warning("event(): no wavelength, shot skipped") evt.put(skip_event_flag(), "skip_event") return else: self.wavelength = 0 else: self.wavelength = 12398.4187 / self.override_energy if self.verbose: self.logger.info("Wavelength: %.4f" % self.wavelength) self.pulse_length = cspad_tbx.evt_pulse_length(evt) if self.pulse_length is None: if self.check_beam_status: self.nfail += 1 self.logger.warning("event(): no pulse length, shot skipped") evt.put(skip_event_flag(), "skip_event") return else: self.pulse_length = 0 if self.verbose: self.logger.info("Pulse length: %s" % self.pulse_length) self.beam_charge = cspad_tbx.evt_beam_charge(evt) if self.beam_charge is None: if self.check_beam_status: self.nfail += 1 self.logger.warning("event(): no beam charge, shot skipped") evt.put(skip_event_flag(), "skip_event") return else: self.beam_charge = 0 if self.verbose: self.logger.info("Beam charge: %s" % self.beam_charge) self.injector_xyz = cspad_tbx.env_injector_xyz(env) #if self.injector_xyz is not None: #self.logger.info("injector_z: %i" %self.injector_xyz[2].value) self.laser_1_status.set_status( cspad_tbx.env_laser_status(env, laser_id=1), self.evt_time) self.laser_4_status.set_status( cspad_tbx.env_laser_status(env, laser_id=4), self.evt_time) self.laser_1_ms_since_change = self.laser_1_status.ms_since_last_status_change( self.evt_time) self.laser_4_ms_since_change = self.laser_4_status.ms_since_last_status_change( self.evt_time) if self.verbose: if self.laser_1_ms_since_change is not None: self.logger.info("ms since laser 1 status change: %i" % self.laser_1_ms_since_change) if self.laser_4_ms_since_change is not None: self.logger.info("ms since laser 4 status change: %i" % self.laser_4_ms_since_change) if self.laser_1_status is not None and self.laser_1_status.status is not None: self.logger.info("Laser 1 status: %i" % int(self.laser_1_status.status)) if self.laser_4_status is not None and self.laser_4_status.status is not None: self.logger.info("Laser 4 status: %i" % int(self.laser_4_status.status))
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
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()