import numpy as np
import matplotlib.pyplot as plt
from .procarunfold import ProcarUnfolder
from .utilsprocar import UtilsProcar
from .splash import welcome
[docs]def unfold(
fname="PROCAR",
poscar="POSCAR",
outcar="OUTCAR",
supercell_matrix=np.diag([2, 2, 2]),
ispin=None,
efermi=None,
shift_efermi=True,
elimit=(-5, 15),
kticks=[0, 36, 54, 86, 110, 147, 165, 199],
knames=["$\Gamma$", "K", "M", "$\Gamma$", "A", "H", "L", "A"],
print_kpts=False,
show_band=True,
width=4,
color="blue",
savetab="unfold_result.csv",
savefig="unfolded_band.png",
exportplt=False,
repair=True,
code="vasp",
):
"""
Parameters
----------
fname: PROCAR filename.
poscar: POSCAR filename
outcar: OUTCAR filename, for reading fermi energy. You can also use efermi and set outcar=None
supercell_matrix: supercell matrix from primitive cell to supercell
ispin: For non-spin polarized system, ispin=None.
For spin polarized system: ispin=1 is spin up, ispin=2 is spin down.
efermi: Fermi energy
elimit: range of energy to be plotted.
kticks: the indices of K points which has labels given in knames.
knames: see kticks
print_kpts: print all the kpoints to screen. This is to help find the kticks and knames.
show_band: whether to plot the bands before unfolding.
width: the width of the unfolded band.
color: color of the unfoled band.
savetab: the csv file name of which the table of unfolding result will be written into.
savefig: the file name of which the figure will be saved.
exportplt: flag to export plot as matplotlib.pyplot object.
"""
welcome()
if code == "vasp" or code == "abinit":
if repair:
repairhandle = UtilsProcar()
repairhandle.ProcarRepair(fname, fname)
print("PROCAR repaired. Run with repair=False next time.")
# Turn interactive plotting off
plt.ioff()
if efermi is not None:
fermi = efermi
elif outcar is not None:
outcarparser = UtilsProcar()
fermi = outcarparser.FermiOutcar(outcar)
else:
raise Warning("Fermi energy is not given, neither an OUTCAR contains it.")
uf = ProcarUnfolder(
procar=fname, poscar=poscar, supercell_matrix=supercell_matrix, ispin=ispin
)
if print_kpts:
for ik, k in enumerate(uf.procar.kpoints):
print(ik, k)
axes = uf.plot(
efermi=fermi,
ispin=ispin,
shift_efermi=shift_efermi,
ylim=elimit,
ktick=kticks,
kname=knames,
color=color,
width=width,
savetab=savetab,
show_band=show_band,
)
if exportplt:
return plt
else:
if savefig:
plt.savefig(savefig, bbox_inches="tight")
plt.close() # Added by Nicholas Pike to close memory issue of looping and creating many figures
else:
plt.show()
return
# if __name__ == '__main__':
# """
# An example of how to use
# """
# import pyprocar
# import numpy as np
# pyprocar.unfold(
# fname='PROCAR',
# poscar='POSCAR',
# outcar='OUTCAR',
# supercell_matrix=np.diag([2, 2, 2]),
# efermi=None,
# shift_efermi=True,
# ispin=0,
# elimit=(-5, 15),
# kticks=[0, 36, 54, 86, 110, 147, 165, 199],
# knames=['$\Gamma$', 'K', 'M', '$\Gamma$', 'A', 'H', 'L', 'A'],
# print_kpts=False,
# show_band=True,
# savefig='unfolded_band.png')