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
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
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