def parse_jsonathena(text, filename): """parse a JSON-style athena file""" jsdict = json.loads(text) out = Group() out.__doc__ = """XAFS Data from Athena Project File %s""" % (filename) header = [] athena_names = [] for key, val in jsdict.items(): if key.startswith('_____head'): header.append(val) elif key.startswith('_____journ'): journal = val elif key.startswith('_____order'): athena_names = val out.journal = journal out.header = '\n'.join(header) out.group_names = [] for name in athena_names: label = name dat = jsdict[name] x = np.array(dat['x'], dtype='float64') y = np.array(dat['y'], dtype='float64') this = Group(athena_id=name, energy=x, mu=y, bkg_params=Group(), fft_params=Group(), athena_params=Group()) if 'i0' in dat: this.i0 = np.array(dat['i0'], dtype='float64') if 'signal' in dat: this.signal = np.array(dat['signal'], dtype='float64') if 'stddev' in dat: this.stddev = np.array(dat['stddev'], dtype='float64') if 'args' in dat: for key, val in dat['args'].items(): if key.startswith('bkg_'): setattr(this.bkg_params, key[4:], asfloat(val)) elif key.startswith('fft_'): setattr(this.fft_params, key[4:], asfloat(val)) elif key == 'label': label = this.label = val else: setattr(this.athena_params, key, asfloat(val)) this.__doc__ = """Athena Group Name %s (key='%s')""" % (label, name) name = fix_varname(label) if name.startswith('_'): name = 'd' + name setattr(out, name, this) out.group_names.append(name) return out
def parse_perlathena(text, filename): """ parse old athena file format to Group of Groups """ lines = text.split('\n') athenagroups = [] raw = {'name':''} vline = lines.pop(0) if "Athena project file -- Demeter version" not in vline: raise ValueError("%s '%s': invalid Athena File" % (ERR_MSG, filename)) major, minor, fix = '0', '0', '0' try: vs = vline.split("Athena project file -- Demeter version")[1] major, minor, fix = vs.split('.') except: raise ValueError("%s '%s': cannot read version" % (ERR_MSG, filename)) if int(minor) < 9 or int(fix[:2]) < 21: raise ValueError("%s '%s': file is too old to read" % (ERR_MSG, filename)) header = [vline] journal = {} is_header = True for t in lines: if t.startswith('#') or len(t) < 2 or 'undef' in t: if is_header: header.append(t) continue is_header = False key = t.split(' ')[0].strip() key = key.replace('$', '').replace('@', '') if key == 'old_group': raw['name'] = plarray2json(t) elif key == '[record]': athenagroups.append(raw) raw = {'name':''} elif key == 'journal': journal = plarray2json(t) elif key == 'args': raw['args'] = plarray2json(t) elif key == 'xdi': raw['xdi'] = t elif key in ('x', 'y', 'i0', 'signal', 'stddev'): raw[key] = np.array([float(x) for x in plarray2json(t)]) elif key == '1;': # end of list pass else: print(" do not know what to do with key ", key, raw['name']) out = Group() out.__doc__ = """XAFS Data from Athena Project File %s""" % (filename) out.journal = journal out.group_names = [] out.header = '\n'.join(header) for dat in athenagroups: label = dat.get('name', 'unknown') this = Group(athena_id=label, energy=dat['x'], mu=dat['y'], bkg_params=Group(), fft_params=Group(), athena_params=Group()) if 'i0' in dat: this.i0 = dat['i0'] if 'signal' in dat: this.signal = dat['signal'] if 'stddev' in dat: this.stddev = dat['stddev'] if 'args' in dat: for i in range(len(dat['args'])//2): key = dat['args'][2*i] val = dat['args'][2*i+1] if key.startswith('bkg_'): setattr(this.bkg_params, key[4:], asfloat(val)) elif key.startswith('fft_'): setattr(this.fft_params, key[4:], asfloat(val)) elif key == 'label': label = this.label = val elif key in ('valence', 'lasso_yvalue', 'epsk', 'epsr', 'importance'): setattr(this, key, asfloat(val)) elif key in ('atsym', 'edge', 'provenance'): setattr(this, key, val) else: setattr(this.athena_params, key, asfloat(val)) this.__doc__ = """Athena Group Name %s (key='%s')""" % (label, dat['name']) name = fix_varname(label) if name.startswith('_'): name = 'd' + name setattr(out, name, this) out.group_names.append(name) return out
def parse_perlathena(text, filename): """ parse old athena file format to Group of Groups """ lines = text.split('\n') athenagroups = [] raw = {'name':''} vline = lines.pop(0) if "Athena project file -- " not in vline: raise ValueError("%s '%s': invalid Athena File" % (ERR_MSG, filename)) major, minor, fix = '0', '0', '0' if 'Demeter' in vline: try: vs = vline.split("Athena project file -- Demeter version")[1] major, minor, fix = vs.split('.') except: raise ValueError("%s '%s': cannot read version" % (ERR_MSG, filename)) else: try: vs = vline.split("Athena project file -- Athena version")[1] major, minor, fix = vs.split('.') except: raise ValueError("%s '%s': cannot read version" % (ERR_MSG, filename)) header = [vline] journal = [''] is_header = True for t in lines: if t.startswith('#') or len(t) < 2 or 'undef' in t: if is_header: header.append(t) continue is_header = False key = t.split(' ')[0].strip() key = key.replace('$', '').replace('@', '').replace('%', '').strip() if key == 'old_group': raw['name'] = plarray2json(t) elif key == '[record]': athenagroups.append(raw) raw = {'name':''} elif key == 'journal': journal = parse_arglist(t) elif key == 'args': raw['args'] = parse_arglist(t) elif key == 'xdi': raw['xdi'] = t elif key in ('x', 'y', 'i0', 'signal', 'stddev'): raw[key] = np.array([float(x) for x in plarray2json(t)]) elif key in ('1;', 'indicator', 'lcf_data', 'plot_features'): pass else: print(" do not know what to do with key '%s' at '%s'" % (key, raw['name'])) out = Group() out.__doc__ = """XAFS Data from Athena Project File %s""" % (filename) out.journal = '\n'.join(journal) out.group_names = [] out.header = '\n'.join(header) for dat in athenagroups: label = dat.get('name', 'unknown') this = Group(athena_id=label, energy=dat['x'], mu=dat['y'], bkg_params=Group(), fft_params=Group(), athena_params=Group()) if 'i0' in dat: this.i0 = dat['i0'] if 'signal' in dat: this.signal = dat['signal'] if 'stddev' in dat: this.stddev = dat['stddev'] if 'args' in dat: for i in range(len(dat['args'])//2): key = dat['args'][2*i] val = dat['args'][2*i+1] if key.startswith('bkg_'): setattr(this.bkg_params, key[4:], asfloat(val)) elif key.startswith('fft_'): setattr(this.fft_params, key[4:], asfloat(val)) elif key == 'label': label = this.label = val elif key in ('valence', 'lasso_yvalue', 'epsk', 'epsr', 'importance'): setattr(this, key, asfloat(val)) elif key in ('atsym', 'edge', 'provenance'): setattr(this, key, val) else: setattr(this.athena_params, key, asfloat(val)) this.__doc__ = """Athena Group Name %s (key='%s')""" % (label, dat['name']) name = fix_varname(label) if name.startswith('_'): name = 'd' + name setattr(out, name, this) out.group_names.append(name) return out