Example #1
0
    def load(self, filename=None, header_only=False):
        """
    Load emission spectrum from file

    Paramaters:
      filename - filename to load
      header_only - if True, only header is loaded
    """
        if filename is None:
            filename = self.filename
        else:
            self.filename = filename

        headers = []
        with open(filename, 'r') as f:
            pos = f.tell()
            line = f.readline()

            while line:
                if line[0] == "#":
                    headers.append(line[2:])
                elif header_only:
                    break
                else:
                    f.seek(pos)
                    spectrum = np.loadtxt(f)
                    if len(self.spectrum.shape) == 1:
                        spectrum.shape = (1, spectrum.shape[0])

                    self._set_spectrum(spectrum)

                pos = f.tell()
                line = f.readline()

        parser = Parser({
            'Dataset': STRING,
            'Calibration File': STRING,
            'Incident Energy': FLOAT,
            'I0': FLOAT,
            'Solid Angle Map': STRING,
            'Filters': (LIST, STRING),
            'Exposures': (LIST, STRING)
        })
        parsed = parser.parse(headers)
        self.load_errors += parser.errors

        self.dataset_name = parsed.get('Dataset')
        self.calibration_file = parsed.get('Calibration File')
        self.incident_energy = parsed.get('Incident Energy', 0.0)
        self.I0 = parsed.get('I0', 0.0)
        solid_angle_map = parsed.get('Solid Angle Map')
        if solid_angle_map:
            try:
                self._load_solid_angle_map(solid_angle_map)
            except IOError as e:
                self.load_errors.append(e.message)
        self.exposure_files = parsed.get('Exposures')

        # load filters
        for filter_line in parsed.get('Filters', []):
            name, val = filter_line.split(':')
            name = name.strip()
            fltr = get_filter_by_name(name)
            if fltr == None:
                self.load_errors.append("Unknown Filter: '%s' (Ignoring)" %
                                        name)
            else:
                fltr.set_str(val.strip())
                self.filters.append(fltr)

        return len(self.load_errors) == 0
Example #2
0
  def load(self, filename=None, header_only=False):
    """
    Load emission spectrum from file

    Paramaters:
      filename - filename to load
      header_only - if True, only header is loaded
    """
    if filename is None:
      filename = self.filename
    else:
      self.filename = filename

    headers = []
    with open(filename, 'r') as f:
      pos = f.tell()
      line = f.readline()

      while line:
        if line[0] == "#":
          headers.append(line[2:])
        elif header_only:
          break
        else:
          f.seek(pos)
          spectrum = np.loadtxt(f)
          if len(self.spectrum.shape) == 1:
            spectrum.shape = (1,spectrum.shape[0])

          self._set_spectrum(spectrum)

        pos = f.tell()
        line = f.readline()

    parser = Parser({
      'Dataset': STRING,
      'Calibration File': STRING,
      'Incident Energy': FLOAT,
      'I0': FLOAT,
      'Solid Angle Map': STRING,
      'Filters': (LIST, STRING),
      'Exposures': (LIST, STRING)
      })
    parsed = parser.parse(headers)
    self.load_errors += parser.errors

    self.dataset_name = parsed.get('Dataset')
    self.calibration_file = parsed.get('Calibration File')
    self.incident_energy = parsed.get('Incident Energy', 0.0)
    self.I0 = parsed.get('I0', 0.0)
    solid_angle_map = parsed.get('Solid Angle Map')
    if solid_angle_map:
      try:
        self._load_solid_angle_map(solid_angle_map)
      except IOError as e:
        self.load_errors.append(e.message)
    self.exposure_files = parsed.get('Exposures')

    # load filters
    for filter_line in parsed.get('Filters', []):
      name,val = filter_line.split(':')
      name = name.strip()
      fltr = get_filter_by_name(name)
      if fltr == None:
        self.load_errors.append("Unknown Filter: '%s' (Ignoring)" % name)
      else:
        fltr.set_str(val.strip())
        self.filters.append(fltr)

    return len(self.load_errors) == 0
Example #3
0
  def load(self, filename=None, header_only=False):
    """
    Load calibration information from saved file

    Parameters
    ----------
      filename: name of file to load
      header_only: whether to load only the header or full data

    Returns
    -------
      True if load was successful
      False if load encountered an error

      Error messages are stored as strings in the list `Calibration.load_errors`.
    """
    self.load_errors = []

    if filename is None:
      filename = self.filename
    else:
      self.filename = filename

    if not os.path.exists(self.filename):
      self.load_errors.append("Unable to load nonexistant file: '%s'"%filename)
      return False

    parser = Parser({
      'Spectrometer': STRING,
      'Dataset': STRING,
      'Dispersive Direction': STRING,
      'Energies and Exposures': (LIST, (FLOAT, STRING)),
      'Filters': (LIST, STRING),
      'Xtal Boundaries': (LIST, (INT, INT, INT, INT)),
      })

    header = []
    with open(filename, 'r') as f:
      line = f.readline()

      if determine_filetype_from_header(line) != mx.filetype.FILE_CALIBRATION:
        self.load_errors.append("'%s' is not a calibration file" % filename)
        return False

      pos = f.tell()
      line = f.readline()
      while line:
        if line[0] == "#":
          header.append(line[2:])
        elif header_only:
          break
        else:
          f.seek(pos)
          self.calibration_matrix = np.loadtxt(f)
          if len(self.calibration_matrix.shape) == 1:
            self.calibration_matrix.shape = (1,self.spectrum.shape[0])
          break

        pos = f.tell()
        line = f.readline()

    # parse
    parsed = parser.parse(header)
    if parser.errors:
      self.load_errors += parser.errors

    sname = parsed.get('Spectrometer')
    if sname:
      try:
        if sname == os.path.basename(sname):
          spect = Spectrometer(sname)
        else:
          spect = Spectrometer()
          spect.load(sname)

        self.spectrometer = spect
      except Exception as e:
        self.load_errors.append("Error loading spectrometer: %s" % str(e))

    self.dataset = parsed.get('Dataset', '')

    # check dispersive direction
    dirname = parsed.get('Dispersive Direction', mx.DOWN)
    if dirname in mx.DIRECTION_NAMES:
      self.dispersive_direction = mx.DIRECTION_NAMES.index(dirname)
    else:
      self.load_errors.append("Unknown Dispersive Direction: '%s', using default." % dirname)

    # split up energies and exposure files
    key = 'Energies and Exposures'
    if key in parsed.keys():
      self.energies = [ee[0] for ee in parsed[key]]
      self.exposure_files= [ee[1] for ee in parsed[key]]

    # read in filters
    for filter_line in parsed.get('Filters', []):
      name,val = filter_line.split(':')
      name = name.strip()
      fltr = get_filter_by_name(name)
      if fltr == None:
        self.load_errors.append("Unknown Filter: '%s' (Ignoring)" % name)
      else:
        fltr.set_str(val.strip())
        self.filters.append(fltr)

    self.xtals = [
        [[x1,y1],[x2,y2]]
        for x1,y1,x2,y2 in parsed.get('Xtal Boundaries', [])
        ]

    return len(self.load_errors) == 0