def match_lines(self, linelist, levellist): ''' matches lines with level list , returns line rather than topline atomic_classes ''' new_line = [] for i in range(len(linelist)): ll = None lu = None z = linelist[i].z ion = linelist[i].ion osc = linelist[i].osc gl = linelist[i].g_l gu = linelist[i].g_u wave = linelist[i].wavelength freq = linelist[i].freq islp = linelist[i].islpu jslp = linelist[i].islpl for j in range(len(levellist)): if levellist[j].z == z and levellist[j].ion == ion: if levellist[j].nnstring == linelist[i].conf_u and islp == levellist[j].islp: lu = levellist[j].lvl eu = levellist[j].E elif levellist[j].nnstring == linelist[i].conf_l and jslp == levellist[j].islp: ll = levellist[j].lvl el = levellist[j].E if eu < el: print "Error, el>eu, %s to %s not found in levels" % (linelist[i].conf_u, linelist[i].conf_l) if ll == None or lu == None: print "Error, line %i, %s to %s not found in levels" % (i, linelist[i].conf_u, linelist[i].conf_l) new_line.append( cls.line(z, ion, wave, freq, osc, gl, gu, el, eu, ll, lu) ) return np.array(new_line)
def read_line_list(level_class_array, fname="%s/LINELIST" % default_folder, outname="lines.out", z_select = None, write=True): ''' read_atom_model reads Stuart's data from the ATOM.MODELS file and converts it into an array of cls.level class instances to be written out to file ''' f = open(fname, "r") nions = 0 data = [] for line in f: d = line.split() if len(d) == 4: nions += 1 if len(d) > 0: data.append(d) f.close() print "WE HAVE READ %i lines" % len(data) i = 0 # create a blank array to store classes lines = [] # (l.z, l.ion, l.lvl, l.ionpot, l.E, l.g, l.rad_rate, l.nnstring)) while i < len(data): if len(data[i]) == 3: # we have a summary record z = int(data[i][0]) ion = int(data[i][1]) nlines = int(data[i][2]) for j in range(nlines): i+=1 nline = int(data[i][0]) lower = int(data[i][1]) upper = int(data[i][2]) A_value = float(data[i][3]) # only bother if we want this element if z_select == z or z_select==None: found_lower = False found_upper = False for ilev in range(len(level_class_array)): if level_class_array[ilev].z == z and level_class_array[ilev].ion == ion: if level_class_array[ilev].lvl == lower: El = level_class_array[ilev].E gl = level_class_array[ilev].g found_lower = True if level_class_array[ilev].lvl == upper: Eu = level_class_array[ilev].E gu = level_class_array[ilev].g found_upper = True if found_upper * found_lower == False: print "NOT FOUND! Line %i %i %i %i" % (z, ion, j, nlines) energy_gap = Eu - El freq = energy_gap / HEV # get frequency of line try: wavelength = C / freq / ANGSTROM # get wavelength in ANGSTROMS except ZeroDivisionError: print "ZeroDivisionError: Line %i %i %i %i %8.4e %8.4e" % (z, ion, j, nlines, energy_gap, freq) wavelength = 1e5 #except ZeroDivisionError: #wavelength = 0 # get wavelength in ANGSTROMS # get f value from A value try: f = A_value / A21_CONSTANT / gl * gu / freq / freq except ZeroDivisionError: f = 0.0000 lines.append(cls.line (z, ion, wavelength, freq, f, gl, gu, El, Eu, lower, upper)) i+=1 lines = np.array(lines) # write out the file if write: sub.write_line_file(lines, outname, levmax = 1e50, append = False, z = None, ion = None)