Exemplo n.º 1
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()
Exemplo n.º 2
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()
Exemplo n.º 3
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
Exemplo n.º 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