"""
Utilities to read and write Bragg preprocessor files and dictionaries.
Copied from xoppylib (https://github.com/oasys-kit/xoppylib) so that
crystalpy does not depend on xoppylib.
"""
import numpy
[docs]def bragg_preprocessor_file_v1_write(out_dict, fileout=""):
"""Writes data from dictionary to Bragg-preprocessor file V1.
Parameters
----------
out_dict : dict
Input dictionary to write to file
fileout : str
Filename for output.
"""
if fileout != "":
f = open(fileout, 'wt')
f.write("%i " % out_dict["i_latt"]) # flag ZincBlende
# f.write("%e " % ((1e0 / volume_in_cm3) * (codata_e2_mc2 * 1e2))) # 1/V*electronRadius
f.write("%e " % (out_dict["one_over_volume_times_electron_radius_in_cm"]))
f.write("%e " % out_dict["dspacing_in_cm"])
f.write("\n")
f.write("%i " % out_dict["zeta_a"])
f.write("%i " % out_dict["zeta_b"])
f.write("%e " % out_dict["temper"]) # temperature parameter
f.write("\n")
f.write("(%20.11e,%20.11e ) \n" % (out_dict["ga.real"], out_dict["ga.imag"]))
f.write("(%20.11e,%20.11e ) \n" % (out_dict["ga_bar.real"], out_dict["ga_bar.imag"]))
f.write("(%20.11e,%20.11e ) \n" % (out_dict["gb.real"], out_dict["gb.imag"]))
f.write("(%20.11e,%20.11e ) \n" % (out_dict["gb_bar.real"], out_dict["gb_bar.imag"]))
f.write("%e %e %e \n" % (out_dict["fit_a"][0], out_dict["fit_a"][1], out_dict["fit_a"][2] ))
f.write("%e %e %e \n" % (out_dict["fit_b"][0], out_dict["fit_b"][1], out_dict["fit_b"][2] ))
f.write(("%i \n") % out_dict["npoint"])
for i in range(out_dict["npoint"]):
f.write(("%20.11e %20.11e %20.11e \n %20.11e %20.11e \n") % ( \
out_dict["Energy"][i],
out_dict["F1a"][i],
out_dict["F2a"][i],
out_dict["F1b"][i],
out_dict["F2b"][i]
))
f.close()
print("File written to disk: %s" % fileout)
[docs]def bragg_preprocessor_file_v2_write(output_dictionary, fileout=None):
"""Writes data from dictionary to Bragg-preprocessor file V2.
Parameters
----------
out_dict : dict
Input dictionary to write to file
fileout : str
Filename for output.
"""
txt = ""
txt += "# Bragg version, Data file type\n"
txt += "%s 1\n" % output_dictionary["version"]
txt += "# RN = (e^2/(m c^2))/V) [cm^-2], d spacing [cm]\n"
txt += "%e %e \n" % (output_dictionary["rn"] , output_dictionary["dspacing"])
txt += "# Number of different element-sites in unit cell NBATOM:\n%d \n" % output_dictionary["nbatom"]
txt += "# for each element-site, the number of scattering electrons (Z_i + charge_i)\n"
for i in output_dictionary['atnum']:
txt += "%g "%i
txt += "\n"
txt += "# for each element-site, the occupation factor\n"
for i in output_dictionary["fraction"]:
txt += "%g "%i
txt += "\n"
txt += "# for each element-site, the temperature factor\n" # temperature parameter
for i in output_dictionary["temper"]:
txt += "%g "%i
txt += "\n"
#
# Geometrical part of structure factor: G and G_BAR
#
txt += "# for each type of element-site, COOR_NR=G_0\n"
for i in output_dictionary["G_0"]:
txt += "%g "%i
txt += "\n"
#
txt += "# for each type of element-site, G and G_BAR (both complex)\n"
for i,ga in enumerate(output_dictionary["G"]):
ga_bar = output_dictionary["G_BAR"][i]
txt += "(%g,%g) \n"%(ga.real,ga.imag)
txt += "(%g,%g) \n"%(ga_bar.real,ga_bar.imag)
#
# F0 part
#
txt += "# for each type of element-site, the number of f0 coefficients followed by them\n"
for i in range(len(output_dictionary['f0coeff'])):
coeff = output_dictionary['f0coeff'][i]
nn = len(coeff)
txt += ("%d "%(nn)+"%g "*nn+"\n")%(tuple(coeff))
txt += "# The number of energy points NPOINT: \n"
txt += ("%i \n") % output_dictionary["npoint"]
txt += "# for each energy point, energy, F1(1),F2(1),...,F1(nbatom),F2(nbatom)\n"
for i in range(output_dictionary["npoint"]):
txt += ("%20.11e \n") % (output_dictionary["energy"][i])
for j in range(output_dictionary['nbatom']):
f1a = output_dictionary['f1'][j,i]
f2a = output_dictionary['f2'][j,i]
fcompton = output_dictionary['fcompton'][j,i]
txt += (" %20.11e %20.11e %20.11e \n")%(f1a, f2a, fcompton)
if fileout != None:
with open(fileout,"w") as f:
f.write(txt)
print("File written to disk: %s" % fileout)
return txt
[docs]def bragg_preprocessor_file_v1_read(filename):
"""Reads data from Bragg-preprocessor file V1 to dictionary.
Parameters
----------
filename : str
Filename with input.
Returns
-------
dict
"""
try:
f = open(filename, 'r')
lines = f.read().splitlines()
f.close()
except:
print("Fail to read file: %s " % filename)
raise Exception("Fail to read file: %s " % filename)
out_dict = {}
line_index = 0
variables = __parse_line(lines[line_index])
out_dict["i_latt"] = int(variables[0])
out_dict["one_over_volume_times_electron_radius_in_cm"] = float(variables[1])
out_dict["dspacing_in_cm"] = float(variables[2])
line_index += 1
variables = __parse_line(lines[line_index])
out_dict["zeta_a"] = int(variables[0])
out_dict["zeta_b"] = int(variables[1])
out_dict["temper"] = float(variables[2])
# line_index += 1
line_index += 1
variables = __parse_line(lines[line_index], remove=["(",")",","])
out_dict["ga.real"] = float(variables[0])
out_dict["ga.imag"] = float(variables[1])
line_index += 1
# print(">>>>>>>>>> variables", variables)
variables = __parse_line(lines[line_index], remove=["(", ")", ","])
out_dict["ga_bar.real"] = float(variables[0])
out_dict["ga_bar.imag"] = float(variables[1])
line_index += 1
# print(">>>>>>>>>> variables", variables)
variables = __parse_line(lines[line_index], remove=["(", ")", ","])
out_dict["gb.real"] = float(variables[0])
out_dict["gb.imag"] = float(variables[1])
line_index += 1
line = lines[line_index]
line = line.replace("(", "")
line = line.replace(")", "")
line = line.replace(" ", "")
variables = line.split(",")
# print(">>>>>>>>>> variables", variables)
out_dict["gb_bar.real"] = float(variables[0])
out_dict["gb_bar.imag"] = float(variables[1])
line_index += 1
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> variables", variables)
out_dict["fit_a"] = []
for variable in variables:
out_dict["fit_a"].append(float(variable))
line_index += 1
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> variables", variables)
out_dict["fit_b"] = []
for variable in variables:
out_dict["fit_b"].append(float(variable))
line_index += 1
variables = __parse_line(lines[line_index])
npoint = int(variables[0])
out_dict["npoint"] = npoint
line_index += 1
variables = __parse_line(" ".join(lines[line_index:]))
Energy = numpy.zeros(npoint)
F1a = numpy.zeros(npoint)
F2a = numpy.zeros(npoint)
F1b = numpy.zeros(npoint)
F2b = numpy.zeros(npoint)
iacc = -1
for i in range(npoint):
iacc += 1
Energy[i] = variables[iacc]
iacc += 1
F1a[i] = variables[iacc]
iacc += 1
F2a[i] = variables[iacc]
iacc += 1
F1b[i] = variables[iacc]
iacc += 1
F2b[i] = variables[iacc]
out_dict["Energy"] = Energy
out_dict["F1a"] = F1a
out_dict["F2a"] = F2a
out_dict["F1b"] = F1b
out_dict["F2b"] = F2b
# not in file
out_dict["emin"] = Energy[0]
out_dict["emax"] = Energy[-1]
out_dict["estep"] = Energy[1] - Energy[0]
out_dict["fileout"] = filename
return out_dict
[docs]def bragg_preprocessor_file_v2_read(filename=""):
"""Reads data from Bragg-preprocessor file V2 to dictionary.
Parameters
----------
filename : str
Filename with input.
Returns
-------
dict
"""
f = open(filename, 'r')
lines = f.read().splitlines()
f.close()
out_dict = {}
line_index = 2
line_index += 1 # jump comment
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> variables rn dspacing", variables)
out_dict["rn"] = float(variables[0])
out_dict["dspacing"] = float(variables[1])
line_index += 2 # jump comment
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> variables nbatom", variables)
out_dict["nbatom"] = int(variables[0])
line_index += 2 # jump comment
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> variables atnum", variables)
out_dict["atnum"] = []
for variable in variables:
out_dict["atnum"].append(float(variable))
line_index += 2 # jump comment
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> variables fraction", variables)
out_dict["fraction"] = []
for variable in variables:
out_dict["fraction"].append(float(variable))
line_index += 2 # jump comment
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> temper atnum", variables)
out_dict["temper"] = []
for variable in variables:
out_dict["temper"].append(float(variable))
line_index += 2 # jump comment
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> variables G_0", variables)
out_dict["G_0"] = []
for variable in variables:
out_dict["G_0"].append(int(variable))
line_index += 1
out_dict["G"] = []
out_dict["G_BAR"] = []
for i in range(out_dict["nbatom"]):
line_index += 1
variables_G = __parse_line(lines[line_index], remove=["(",")",","])
# print(">>>>>>>>>> variables G", variables_G)
out_dict["G"].append(float(variables_G[0]) + 1j * float(variables_G[1]))
# print(">>> G: ", out_dict["G"][-1])
line_index += 1
variables_GBAR = __parse_line(lines[line_index], remove=["(", ")", ","])
# print(">>>>>>>>>> variables G_BAR", variables_GBAR)
out_dict["G_BAR"].append(float(variables_GBAR[0]) + 1j * float(variables_GBAR[1]))
# print(">>> G_BAR: ", out_dict["G_BAR"][-1])
line_index += 1 # jump comment
out_dict["f0coeff"] = []
for i in range(out_dict["nbatom"]):
f0_ilist = []
line_index += 1
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> variables f0", variables)
for i in range(int(variables[0])):
f0_ilist.append(float(variables[i+1]))
# print(">>>> f0coeff[i]", f0_ilist)
out_dict["f0coeff"].append((f0_ilist))
line_index += 2
variables = __parse_line(lines[line_index])
# print(">>>>>>>>>> variables npoint", variables)
npoint = int(variables[0])
out_dict["npoint"] = npoint
line_index += 1
Energy = numpy.zeros(npoint)
F1a = numpy.zeros(npoint)
F2a = numpy.zeros(npoint)
F1b = numpy.zeros(npoint)
F2b = numpy.zeros(npoint)
# for j, jj in enumerate(indices_prototypical):
# f1a = xraylib.Fi(list_Zatom[jj], energy * 1e-3)
# f2a = -xraylib.Fii(list_Zatom[jj], energy * 1e-3) # TODO: check the sign!!
# txt += (" %20.11e %20.11e 1.000 \n") % (f1a, f2a)
Energy = numpy.zeros(npoint)
out_f1 = numpy.zeros( (out_dict["nbatom"], npoint) )
out_f2 = numpy.zeros( (out_dict["nbatom"], npoint) )
out_fcompton = numpy.zeros( (out_dict["nbatom"], npoint) )
for i in range(npoint):
line_index += 1
variables = __parse_line(lines[line_index])
Energy[i] = float(variables[0])
for j in range(out_dict["nbatom"]):
line_index += 1
variables = __parse_line(lines[line_index])
out_f1[j,i] = float(variables[0])
out_f2[j,i] = float(variables[1])
out_fcompton[j,i] = float(variables[2])
out_dict["energy"] = Energy
out_dict["f1"] = out_f1
out_dict["f2"] = out_f2
out_dict["fcompton"] = out_fcompton
return out_dict
def __parse_line(line, remove=[]):
if len(remove) > 0:
for str1 in remove:
line = line.replace(str1, " ")
line = " ".join(line.split())
variables = line.split(" ")
return variables