import numpy as np
import pandas as pd
import warnings
def find_row(fname, string1, string2='', num_row=False):
""" Description """
with open(fname, encoding='ISO-8859-1') as f:
n = 0
for line in f:
n += 1
if string1 in line and string2 in line:
break
if num_row:
return n-1
else:
return line
def oscillator_strengths(fname):
""" Description """
args = {}
args['header'] = None
args['index_col'] = False
args['sep'] = '\s*\|\s*|-?\s+-?|(?<=[^ED\s])-(?=[^\s])'
args['skiprows'] = find_row(fname, "Transition", "Lam", num_row=True) +1
n = find_row(fname, "Number of transitions").split()[0]
args['nrows'] = int(n)
columns = ['State A', 'State B', 'f', 'A', 'Lam(A)', 'i', 'j', 'Lam(obs)', '% Acc']
try:
data = pd.read_csv(fname, **args)
except pd.errors.EmptyDataError:
data = pd.DataFrame(columns=columns)
warnings.warn('Empty table')
# Assign column names by file content
if data.shape[1] == 9:
data.columns = columns
elif data.shape[1] == 10: # This shouldn't happen (e.g. si2_osc_kurucz)
data.columns = columns + ['?']
data = data.drop(columns=['?'])
elif data.shape[1] == 8:
data.columns = columns[:-2] + ['#']
data = data.drop(columns=['#'])
data['Lam(obs)'] = np.nan
data['% Acc'] = np.nan
else:
warnings.warn('Inconsistent number of columns')
# Fix for Fortran float type 'D'
if data.shape[0] > 0 and 'D' in str(data['f'][0]):
data['f'] = data['f'].str.replace('D', 'E').map(np.float)
data['A'] = data['A'].str.replace('D', 'E').map(np.float)
return data
oscillator_strengths('../CMFGEN/atomic/FE/VI/8may97/fevi_osc_kb_rk.dat').head(20)