Example #1
0
	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)
Example #2
0
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)