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()
Beispiel #3
0
    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))
Beispiel #4
0
    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
Beispiel #5
0
    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()
Beispiel #6
0
  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