Calculation of joint density of states (JDoS) from the DFT-calculated constant energy contours (CECs).
import numpy as np
import matplotlib.pyplot as plt
import os
from tqdm import tqdm
# load bandstructure data
dKGM = np.loadtxt('data/CEC_data/KGM_band_ssc.dat')
dKGM.shape
(64000, 4)
print('|M| = ', dKGM[:,0].max(), '1/a_B; |K|=', dKGM[:,1].max(), '1/a_B')
|M| = 0.46284401 1/a_B; |K|= 0.53061986 1/a_B
from masci_tools.util.constants import BOHR_A
a = 21.551001
b = 4.177400
c = 51.152020
2*np.pi/(a/BOHR_A) * 3, 2*np.pi/(b/BOHR_A) * 2/3
(0.4628441819189051, 0.530620078803855)
# import files for constant energy contours
fnames = [i for i in os.listdir('data/CEC_data/') if '_band_ssc.dat' in i and 'KGM' not in i]
d = []
for fname in tqdm(fnames):
tmp = np.loadtxt('data/CEC_data/'+fname)
d += list(tmp)
# format: kx, ky, energy, weight
d = np.array(d)
100%|██████████| 47/47 [00:01<00:00, 31.55it/s]
Here we calculate $$JDOS(\vec{q}) = \int\mathrm{d}^2k\int_{E-\delta_E}^{E+\delta_E}\mathrm{d}E' \ I(\vec{k}; E') I(\vec{k}+\vec{q}; E')$$ where $\delta_E$ defines an energy integration window for the intensities $I(\vec{k}; E)$ on the constant energy contours at energies $E$ that take into account the weight of the wavefunction in the vacuum.
Here $\delta_E=0.05$eV is used.
import numpy as np
from multiprocessing import Pool
from tqdm import tqdm
parallel = False
def get_d_with_symm(E0, dE):
# filter energy cut
dist = abs(d[:,2]-E0)
dd = d[dist<dE]
# use symmetries
d_with_symm = list(dd.copy())
tmp = dd.copy(); tmp[:,0] *= -1
d_with_symm += list(tmp)
tmp = dd.copy(); tmp[:,1] *= -1
d_with_symm += list(tmp)
tmp = dd.copy(); tmp[:,0] *= -1; tmp[:,1] *= -1
d_with_symm += list(tmp)
d_with_symm = np.array(d_with_symm)
return d_with_symm
def calculate_jdos_for_pair(A1, A2, spin=False):
q = A2[:2] - A1[:, :2]
if not spin:
autocorr = A1[:, -1] * A2[-1]
else:
s1 = np.cross(A1[:, :2], [0, 0, 1])
s2 = np.cross([A2[0], A2[1], 0], [0, 0, 1])
# Normalize s1 and s2
s1_norm = np.linalg.norm(s1, axis=1, keepdims=True)
s2_norm = np.linalg.norm(s2)
s1_normalized = s1 / s1_norm
s2_normalized = s2 / s2_norm
# |T^2| ~ 1 + cos(s1, s2)
autocorr = A1[:, -1] * A2[-1] * (1 + np.sum(s1_normalized * s2_normalized, axis=1))
result = np.column_stack((q[:, 0], q[:, 1], autocorr))
return result
def calc_jdos_parallel(d_with_symm, num_processes, spin=False):
jdos_results = []
for A2 in tqdm(d_with_symm):
current_A2_results = calculate_jdos_for_pair(d_with_symm, A2, spin=spin)
jdos_results.extend(current_A2_results)
jdos_array = np.array(jdos_results)
return jdos_array
if not parallel:
def calc_jdos_batch(d_with_symm, ibatch, Nbatch, spin=False):
jdos_results = []
L = len(d_with_symm)//Nbatch
for A2 in tqdm(d_with_symm[ibatch*L:(ibatch+1)*L]):
current_A2_results = calculate_jdos_for_pair(d_with_symm, A2, spin=spin)
jdos_results.extend(current_A2_results)
jdos_array = np.array(jdos_results)
return jdos_array
else:
from concurrent.futures import ThreadPoolExecutor
def calc_jdos_batch(d_with_symm, ibatch, Nbatch, spin=False, num_threads=4):
jdos_results = []
L = len(d_with_symm) // Nbatch
with ThreadPoolExecutor(max_workers=num_threads) as executor:
futures = []
for A2 in tqdm(d_with_symm[ibatch*L:(ibatch+1)*L]):
future = executor.submit(calculate_jdos_for_pair, d_with_symm, A2, spin=spin)
futures.append(future)
for future in tqdm(futures):
current_A2_results = future.result()
jdos_results.extend(current_A2_results)
jdos_array = np.array(jdos_results)
return jdos_array
def get_jdos_hexbin_batch(d_with_symm, Nbatch, grid_size=100, extent=(-0.6, 0.6, -0.6, 0.6), spin=False):
offsets_all = []
arr_all = []
for ibatch in range(Nbatch):
JDOS = calc_jdos_batch(d_with_symm, ibatch, Nbatch, spin=spin)
poly_batch = plt.hexbin(JDOS[:,0], JDOS[:,1], C=JDOS[:,2], reduce_C_function=np.sum,
gridsize=(int(np.sqrt(3)*grid_size), grid_size), extent=extent,
cmap='binary'
)
offsets_batch = poly_batch.get_offsets()
arr_batch = poly_batch.get_array()
offsets_all.extend(offsets_batch)
arr_all.extend(arr_batch)
offsets_all = np.array(offsets_all)
arr_all = np.array(arr_all)
print(offsets_all.shape)
poly = plt.hexbin(offsets_all[:,0], offsets_all[:,1], C=arr_all,
reduce_C_function=np.sum,
gridsize=(int(np.sqrt(3)*grid_size), grid_size), extent=extent,
cmap='binary'
)
return poly
kx_max = dKGM[:,0].max()
def fold_back_x(ddd):
for i, tmp in enumerate(ddd):
if tmp[0]>2*kx_max/3:
ddd[i, 0] *= -1
ddd[i, 0] += 4*kx_max/3
if tmp[0]<-2*kx_max/3:
ddd[i, 0] *= -1
ddd[i, 0] -= 4*kx_max/3
if tmp[0]>kx_max/3:
ddd[i, 0] *= -1
ddd[i, 0] += 2*kx_max/3
if tmp[0]<-kx_max/3:
ddd[i, 0] *= -1
ddd[i, 0] -= 2*kx_max/3
return ddd
def plot_CEC(E0 = -0.5, dE = 2e-2,
verbose=False, nofig=False, noshow=False,
show_dispersion=True, show_CEC=True, s0=1, cmap='binary',
interpol=False, xrange=(-0.5, 0.5), yrange=(-0.6, 0.6), Nx=100, Ny=100, method='linear',
export_name=None, save_fig=None,
joint_density_of_states=False, grid_size=100, extent=(-0.6, 0.6, -0.6, 0.6), recalc_JDOS=False,
num_processes=12,
fft_corr=False,
Nbatch=10,
fold_back = False,
log_intensity=False, clim=None,
spin=False, subplot = (1,2,0)
):
if E0 is not None and dE is not None:
fname_jdos = f'save_jdos_E0={E0:.3f}_dE={dE:.3f}.npz'
if fold_back:
fname_jdos = fname_jdos.replace('jdos', 'jdos_backfolded')
if spin:
fname_jdos = fname_jdos.replace('.npz', '_spin.npz')
if not nofig:
if show_dispersion and show_CEC:
plt.figure(figsize=(16,9))
elif show_dispersion or show_CEC:
plt.figure(figsize=(4,3))
if show_dispersion and show_CEC:
plt.subplot(subplot[0], subplot[1], subplot[2]+1)
if show_dispersion:
ddd = dKGM.copy()
if fold_back:
ddd = fold_back_x(ddd)
plt.scatter(ddd[:,0]-ddd[:,1], ddd[:,2], c=ddd[:,3], s=ddd[:,3], cmap=cmap, rasterized=True)
plt.ylabel(r'$E-E_F$ (eV)')
plt.xlabel(r'$k$')
plt.ylim(-2,1)
if E0 is not None and dE is not None:
ymin, ymax = E0 - dE, E0 + dE
plt.fill_between(x=[-dKGM[:,1].max(), dKGM[:,0].max()],
y1=[ymin, ymin], y2=[ymax, ymax], color='grey', alpha=0.3)
if (show_CEC or
(joint_density_of_states and (fname_jdos not in os.listdir('data/CEC_data/') or recalc_JDOS)) or
(export_name is not None)
):
if verbose:
print('get CEC data')
d_with_symm = get_d_with_symm(E0, dE)
if fold_back:
d_with_symm = fold_back_x(d_with_symm)
if export_name is not None:
if verbose:
print('export CEC data')
from pandas import DataFrame
df = DataFrame.from_dict({'# kx': d_with_symm[:,0], 'ky': d_with_symm[:,1], 'weight': d_with_symm[:,-1]})
with open(export_name, 'w') as _f:
_f.writelines(df.to_csv(header=True, index=False))
if show_dispersion and show_CEC:
plt.subplot(subplot[0], subplot[1], subplot[2]+2)
if show_CEC:
if verbose:
print('plot CEC')
if not interpol:
plt.scatter(d_with_symm[:,0], d_with_symm[:,1], c=d_with_symm[:,-1], s=s0*d_with_symm[:,-1], cmap=cmap)
else:
from scipy.interpolate import griddata
grid_x, grid_y = np.mgrid[-0.5:0.5:100j, -0.6:0.6:200j]
interpol = griddata(points=d_with_symm[:,0:2], values=d_with_symm[:,-1], xi=(grid_x, grid_y), method=method)
plt.pcolormesh(grid_x, grid_y, np.nan_to_num(interpol), cmap=cmap)
if spin:
s1 = np.cross(d_with_symm[:, :2], [0, 0, 1])
s1_norm = np.linalg.norm(s1, axis=1, keepdims=True)
s1_normalized = s1 / s1_norm
plt.quiver(d_with_symm[:,0], d_with_symm[:,1], s1_normalized[:,0], s1_normalized[:,1])
plt.axis('equal')
plt.xlabel(r'$k_x$')
plt.ylabel(r'$k_y$')
plt.title(rf'$E_0={E0:.2f}\,$eV, $\Delta E={dE:.2f}\,$eV')
if (show_dispersion or show_CEC) and save_fig is not None:
plt.savefig(save_fig)
if not noshow and (show_dispersion or show_CEC):
plt.show()
if joint_density_of_states:
if fname_jdos not in os.listdir('data/CEC_data/') or recalc_JDOS:
print('load JDOS and save to ', fname_jdos)
poly = get_jdos_hexbin_batch(d_with_symm, Nbatch, spin=spin, grid_size=grid_size, extent=extent)
offsets = poly.get_offsets()
arr = poly.get_array()
np.savez('data/CEC_data/'+fname_jdos, x=offsets, y=arr)
else:
print('load JDOS from ', fname_jdos)
tmp = np.load('data/CEC_data/'+fname_jdos)
offsets = tmp.get('x')
arr = tmp.get('y')
if verbose:
print('plot JDOS')
if not nofig:
plt.figure()
# plot the hexbins
if log_intensity:
arr = np.log10(arr)
plt.hexbin(offsets[:, 0], offsets[:, 1], C=arr,
gridsize=(int(np.sqrt(3)*grid_size), grid_size), extent=extent,
cmap=cmap
)
plt.axis('equal')
plt.xlabel(r'$q_x$')
plt.ylabel(r'$q_y$')
plt.title(rf'$E_0={E0:.2f}\,$eV, $\Delta E={dE:.2f}\,$eV')
if clim is not None:
try:
plt.clim(clim[0], clim[1])
except:
plt.clim(clim)
if not noshow:
plt.show()
from scipy.interpolate import griddata
from tqdm import tqdm
def get_d_with_zeros(dd, dmin0 = 2e-2):
d0 = []
x = np.linspace(xmin, xmax, 64+1)
y = np.linspace(ymin, ymax, 300)
for ix in x:
for iy in y:
d0.append([ix, 0, iy, 1e-7])
d0 = np.array(d0)
print(d0.shape)
d00 = []
for temp in tqdm(d0):
diffmin = min(np.sqrt((temp[0]-dd[:,0])**2+(temp[2]-dd[:,2])**2))
if diffmin>dmin0:
d00.append(temp)
ddd = np.array(list(dd) + d00)
d00 = np.array(d00)
return ddd, d00
def get_hexbin_data(ddd):
extent = (xmin, xmax, ymin, ymax)
grid_size = 300
poly_batch = plt.hexbin(ddd[:,0], ddd[:,2], C=ddd[:,-1], reduce_C_function=np.sum,
gridsize=(int(np.sqrt(3)*grid_size), grid_size), extent=extent,
cmap='binary')
offsets_batch = poly_batch.get_offsets()
arr_batch = poly_batch.get_array()
return offsets_batch, arr_batch
def interpolate(offsets_batch, arr_batch):
x = offsets_batch[:,0]
y = offsets_batch[:,1]
scalar_values = arr_batch
# interpolation grid
Nx, Ny = 200, 500
xi = np.linspace(xmin, xmax, Nx)
yi = np.linspace(ymin, ymax, Ny)
# Create a meshgrid from the regular grid
XI, YI = np.meshgrid(xi, yi)
interpol = griddata((x, y), scalar_values, (XI, YI), method='linear')
return interpol
extent = (-0.3, 0.3, -0.3, 0.3)
data_all_interpol = []
data_all = []
dE = 0.02
ie = 0
for E0 in [-0.20]: #[-0.25, -0.20, -0.15]:
dd = get_d_with_symm(E0, 0.02)
xmin, xmax, ymin, ymax = dd[:,0].min(), dd[:,0].max(), dd[:,1].min(), dd[:,1].max()
from scipy.interpolate import griddata
from tqdm import tqdm
def get_d_with_zeros(dd, dmin0 = 2e-2, Nx=80, Ny=80):
d0 = []
x = np.linspace(extent[0], extent[1], Nx)
y = np.linspace(extent[2], extent[3], Ny)
for ix in x:
for iy in y:
d0.append([ix, iy, 0, 1e-7])
d0 = np.array(d0)
print(d0.shape)
d00 = []
for temp in tqdm(d0):
diffmin = min(np.sqrt((temp[0]-dd[:,0])**2+(temp[1]-dd[:,1])**2))
if diffmin>dmin0:
d00.append(temp)
ddd = np.array(list(dd) + d00)
d00 = np.array(d00)
return ddd, d00
def get_hexbin_data(ddd, grid_size = 200):
fig_tmp = plt.figure()
poly_batch = plt.hexbin(ddd[:,0], ddd[:,1], C=ddd[:,-1], reduce_C_function=np.sum,
gridsize=(int(np.sqrt(3)*grid_size), grid_size), extent=extent,
cmap='binary')
plt.close(fig_tmp)
offsets_batch = poly_batch.get_offsets()
arr_batch = poly_batch.get_array()
return offsets_batch, arr_batch
def interpolate(offsets_batch, arr_batch, Nx=200, Ny = 200, method='linear'):
x = offsets_batch[:,0]
y = offsets_batch[:,1]
scalar_values = arr_batch
# interpolation grid
xi = np.linspace(xmin, xmax, Nx)
yi = np.linspace(ymin, ymax, Ny)
# Create a meshgrid from the regular grid
XI, YI = np.meshgrid(xi, yi)
interpol = griddata((x, y), scalar_values, (XI, YI),method=method)
return xi, yi, interpol
ddd, d00 = get_d_with_zeros(dd, dmin0 = 2e-2)
offsets_batch, arr_batch = get_hexbin_data(ddd)
offsets_batch0, arr_batch0 = get_hexbin_data(dd)
xi0, yi0, interpol0 = interpolate(offsets_batch0, arr_batch0, method='cubic')
xi, yi, interpol = interpolate(offsets_batch, arr_batch, method='cubic')
data_all_interpol.append([xi, yi, interpol])
data_all.append([offsets_batch, arr_batch])
(6400, 4)
100%|██████████| 6400/6400 [00:01<00:00, 3206.73it/s]
plt.figure(figsize=(8,6))
p = plot_CEC(E0=-0.20, dE=0.02, verbose=True, show_dispersion=True, show_CEC=True,
joint_density_of_states=False, recalc_JDOS=False,
nofig=True, noshow=True, fold_back=False, spin=False, subplot = (2,2,0))
plt.xlim(-0.2, 0.2)
plt.ylim(-0.2, 0.2)
plt.xlabel(r'$k_x$ ($2\pi/a_0$)')
plt.ylabel(r'$k_y$ ($2\pi/a_0$)')
plt.title('')
arrkwargs = dict(arrowprops={'arrowstyle': '<-'}, ha='center', va='center')
plt.annotate(xy=(-0.20, -0.2-0.004+0.03), xytext=(-0.20, -0.2+0.06+0.03+0.005), text=r'$\overline{K}$', **arrkwargs)
plt.annotate(xy=(-0.20-0.004, -0.2+0.03), xytext=(-0.20+0.05+0.01, -0.2+0.03), text=r'$\overline{M}$', **arrkwargs)
plt.subplot(2,2,1)
plt.xlabel(r'$\overline{K} \leftarrow$'+20*' '+r'$k$ ($2\pi/a_0$)'+20*' '+r'$\rightarrow \overline{M}$')
plt.xlim(-0.4, 0.4)
plt.subplot(2,2,3)
plt.pcolormesh(xi0, yi0, interpol0, cmap='binary', rasterized=True)
# plt.colorbar()
plt.clim(0)
plt.plot(offsets_batch0[:,0], offsets_batch0[:,1], '.', ms=1)
# plt.plot(d00[:,0], d00[:,1], '.', ms=1)
plt.axis('equal')
plt.xlabel(r'$k_x$ ($2\pi/a_0$)')
plt.ylabel(r'$k_y$ ($2\pi/a_0$)')
plt.xlim(-0.1, 0.3)
plt.ylim(-0., 0.3)
plt.subplot(2,2,4)
plt.pcolormesh(xi, yi, interpol, cmap='binary', rasterized=True)
# plt.colorbar()
plt.clim(0)
plt.plot(offsets_batch[:,0], offsets_batch[:,1], '.', ms=1)
plt.plot(d00[:,0], d00[:,1], '.', ms=1)
plt.axis('equal')
plt.xlabel(r'$k_x$ ($2\pi/a_0$)')
plt.ylabel(r'$k_y$ ($2\pi/a_0$)')
plt.xlim(-0.1, 0.3)
plt.ylim(-0., 0.3)
plt.tight_layout()
plt.annotate(xy=(0.01, 0.95), text='(a)', xycoords='figure fraction', fontsize=12)
plt.annotate(xy=(0.50, 0.95), text='(b)', xycoords='figure fraction', fontsize=12)
plt.annotate(xy=(0.01, 0.45), text='(c)', xycoords='figure fraction', fontsize=12)
plt.annotate(xy=(0.50, 0.45), text='(d)', xycoords='figure fraction', fontsize=12)
# plt.savefig('FigA2.pdf', dpi=300)
plt.show()
get CEC data plot CEC
plt.figure(figsize=(10, 20))
for i, E0 in enumerate(np.arange(-1.2, 0.4+0.05, 0.05)):
plt.subplot(8,5,1+i)
# dE=0.05 gives an integration window of 0.1 (+/- dE)
plot_CEC(E0=E0, dE=0.05, verbose=True, show_dispersion=False, show_CEC=False,
joint_density_of_states=True, recalc_JDOS=False,
nofig=True, noshow=True, num_processes=12,
Nbatch=30, log_intensity=False, fold_back=False
)
plt.colorbar()
plt.tight_layout()
plt.show()
load JDOS from save_jdos_E0=-1.200_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-1.150_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-1.100_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-1.050_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-1.000_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.950_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.900_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.850_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.800_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.750_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.700_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.650_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.600_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.550_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.500_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.450_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.400_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.350_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.300_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.250_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.200_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.150_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.100_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=-0.050_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=0.000_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=0.050_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=0.100_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=0.150_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=0.200_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=0.250_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=0.300_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=0.350_dE=0.050.npz plot JDOS load JDOS from save_jdos_E0=0.400_dE=0.050.npz plot JDOS
ls data/export_JDOS/
'JDOS_E0=-0.050_dE=0.050.txt' 'JDOS_E0=-0.900_dE=0.050.txt' 'JDOS_E0=-0.100_dE=0.050.txt' 'JDOS_E0=-0.950_dE=0.050.txt' 'JDOS_E0=-0.150_dE=0.050.txt' 'JDOS_E0=-1.000_dE=0.050.txt' 'JDOS_E0=-0.200_dE=0.050.txt' 'JDOS_E0=-1.050_dE=0.050.txt' 'JDOS_E0=-0.250_dE=0.050.txt' 'JDOS_E0=-1.100_dE=0.050.txt' 'JDOS_E0=-0.300_dE=0.050.txt' 'JDOS_E0=-1.150_dE=0.050.txt' 'JDOS_E0=-0.350_dE=0.050.txt' 'JDOS_E0=-1.200_dE=0.050.txt' 'JDOS_E0=-0.400_dE=0.050.txt' 'JDOS_E0=0.000_dE=0.050.txt' 'JDOS_E0=-0.450_dE=0.050.txt' 'JDOS_E0=0.050_dE=0.050.txt' 'JDOS_E0=-0.500_dE=0.050.txt' 'JDOS_E0=0.100_dE=0.050.txt' 'JDOS_E0=-0.550_dE=0.050.txt' 'JDOS_E0=0.150_dE=0.050.txt' 'JDOS_E0=-0.600_dE=0.050.txt' 'JDOS_E0=0.200_dE=0.050.txt' 'JDOS_E0=-0.650_dE=0.050.txt' 'JDOS_E0=0.250_dE=0.050.txt' 'JDOS_E0=-0.700_dE=0.050.txt' 'JDOS_E0=0.300_dE=0.050.txt' 'JDOS_E0=-0.750_dE=0.050.txt' 'JDOS_E0=0.350_dE=0.050.txt' 'JDOS_E0=-0.800_dE=0.050.txt' 'JDOS_E0=0.400_dE=0.050.txt' 'JDOS_E0=-0.850_dE=0.050.txt'
ls data/export_CEC/
'CEC_E0=-0.050_dE=0.050.txt' 'CEC_E0=-0.800_dE=0.050.txt' 'CEC_E0=-0.100_dE=0.050.txt' 'CEC_E0=-0.850_dE=0.050.txt' 'CEC_E0=-0.150_dE=0.020.txt' 'CEC_E0=-0.900_dE=0.050.txt' 'CEC_E0=-0.150_dE=0.050.txt' 'CEC_E0=-0.950_dE=0.050.txt' 'CEC_E0=-0.200_dE=0.020.txt' 'CEC_E0=-1.000_dE=0.050.txt' 'CEC_E0=-0.200_dE=0.050.txt' 'CEC_E0=-1.050_dE=0.050.txt' 'CEC_E0=-0.250_dE=0.020.txt' 'CEC_E0=-1.100_dE=0.050.txt' 'CEC_E0=-0.250_dE=0.050.txt' 'CEC_E0=-1.150_dE=0.050.txt' 'CEC_E0=-0.300_dE=0.050.txt' 'CEC_E0=-1.200_dE=0.050.txt' 'CEC_E0=-0.350_dE=0.050.txt' 'CEC_E0=0.000_dE=0.050.txt' 'CEC_E0=-0.400_dE=0.050.txt' 'CEC_E0=0.050_dE=0.050.txt' 'CEC_E0=-0.450_dE=0.050.txt' 'CEC_E0=0.100_dE=0.050.txt' 'CEC_E0=-0.500_dE=0.050.txt' 'CEC_E0=0.150_dE=0.050.txt' 'CEC_E0=-0.550_dE=0.050.txt' 'CEC_E0=0.200_dE=0.050.txt' 'CEC_E0=-0.600_dE=0.050.txt' 'CEC_E0=0.250_dE=0.050.txt' 'CEC_E0=-0.650_dE=0.050.txt' 'CEC_E0=0.300_dE=0.050.txt' 'CEC_E0=-0.700_dE=0.050.txt' 'CEC_E0=0.350_dE=0.050.txt' 'CEC_E0=-0.750_dE=0.050.txt' 'CEC_E0=0.400_dE=0.050.txt'
ls data/CEC_data/
10_band_ssc.dat 'save_jdos_E0=-0.250_dE=0.050.npz' 12_band_ssc.dat 'save_jdos_E0=-0.300_dE=0.020.npz' 14_band_ssc.dat 'save_jdos_E0=-0.300_dE=0.050.npz' 16_band_ssc.dat 'save_jdos_E0=-0.350_dE=0.020.npz' 18_band_ssc.dat 'save_jdos_E0=-0.350_dE=0.050.npz' 20_band_ssc.dat 'save_jdos_E0=-0.400_dE=0.020.npz' 22_band_ssc.dat 'save_jdos_E0=-0.400_dE=0.050.npz' 24_band_ssc.dat 'save_jdos_E0=-0.450_dE=0.020.npz' 26_band_ssc.dat 'save_jdos_E0=-0.450_dE=0.050.npz' 28_band_ssc.dat 'save_jdos_E0=-0.500_dE=0.020.npz' 2_band_ssc.dat 'save_jdos_E0=-0.500_dE=0.050.npz' 30_band_ssc.dat 'save_jdos_E0=-0.550_dE=0.020.npz' 32_band_ssc.dat 'save_jdos_E0=-0.550_dE=0.050.npz' 34_band_ssc.dat 'save_jdos_E0=-0.600_dE=0.020.npz' 36_band_ssc.dat 'save_jdos_E0=-0.600_dE=0.050.npz' 38_band_ssc.dat 'save_jdos_E0=-0.650_dE=0.020.npz' 40_band_ssc.dat 'save_jdos_E0=-0.650_dE=0.050.npz' 42_band_ssc.dat 'save_jdos_E0=-0.700_dE=0.020.npz' 44_band_ssc.dat 'save_jdos_E0=-0.700_dE=0.050.npz' 46_band_ssc.dat 'save_jdos_E0=-0.750_dE=0.020.npz' 48_band_ssc.dat 'save_jdos_E0=-0.750_dE=0.050.npz' 4_band_ssc.dat 'save_jdos_E0=-0.800_dE=0.020.npz' 50_band_ssc.dat 'save_jdos_E0=-0.800_dE=0.050.npz' 52_band_ssc.dat 'save_jdos_E0=-0.850_dE=0.020.npz' 54_band_ssc.dat 'save_jdos_E0=-0.850_dE=0.050.npz' 56_band_ssc.dat 'save_jdos_E0=-0.900_dE=0.020.npz' 58_band_ssc.dat 'save_jdos_E0=-0.900_dE=0.050.npz' 60_band_ssc.dat 'save_jdos_E0=-0.950_dE=0.020.npz' 62_band_ssc.dat 'save_jdos_E0=-0.950_dE=0.050.npz' 64_band_ssc.dat 'save_jdos_E0=-1.000_dE=0.020.npz' 66_band_ssc.dat 'save_jdos_E0=-1.000_dE=0.050.npz' 68_band_ssc.dat 'save_jdos_E0=-1.050_dE=0.020.npz' 6_band_ssc.dat 'save_jdos_E0=-1.050_dE=0.050.npz' 70_band_ssc.dat 'save_jdos_E0=-1.100_dE=0.020.npz' 72_band_ssc.dat 'save_jdos_E0=-1.100_dE=0.050.npz' 74_band_ssc.dat 'save_jdos_E0=-1.150_dE=0.020.npz' 76_band_ssc.dat 'save_jdos_E0=-1.150_dE=0.050.npz' 78_band_ssc.dat 'save_jdos_E0=-1.200_dE=0.020.npz' 80_band_ssc.dat 'save_jdos_E0=-1.200_dE=0.050.npz' 82_band_ssc.dat 'save_jdos_E0=0.000_dE=0.020.npz' 84_band_ssc.dat 'save_jdos_E0=0.000_dE=0.050.npz' 86_band_ssc.dat 'save_jdos_E0=0.050_dE=0.020.npz' 88_band_ssc.dat 'save_jdos_E0=0.050_dE=0.050.npz' 8_band_ssc.dat 'save_jdos_E0=0.100_dE=0.020.npz' 90_band_ssc.dat 'save_jdos_E0=0.100_dE=0.050.npz' 92_band_ssc.dat 'save_jdos_E0=0.150_dE=0.020.npz' 94_band_ssc.dat 'save_jdos_E0=0.150_dE=0.050.npz' KGM_band_ssc.dat 'save_jdos_E0=0.200_dE=0.020.npz' 'save_jdos_E0=-0.050_dE=0.020.npz' 'save_jdos_E0=0.200_dE=0.050.npz' 'save_jdos_E0=-0.050_dE=0.050.npz' 'save_jdos_E0=0.250_dE=0.020.npz' 'save_jdos_E0=-0.100_dE=0.020.npz' 'save_jdos_E0=0.250_dE=0.050.npz' 'save_jdos_E0=-0.100_dE=0.025.npz' 'save_jdos_E0=0.300_dE=0.020.npz' 'save_jdos_E0=-0.100_dE=0.050.npz' 'save_jdos_E0=0.300_dE=0.050.npz' 'save_jdos_E0=-0.150_dE=0.020.npz' 'save_jdos_E0=0.350_dE=0.020.npz' 'save_jdos_E0=-0.150_dE=0.050.npz' 'save_jdos_E0=0.350_dE=0.050.npz' 'save_jdos_E0=-0.200_dE=0.020.npz' 'save_jdos_E0=0.400_dE=0.020.npz' 'save_jdos_E0=-0.200_dE=0.050.npz' 'save_jdos_E0=0.400_dE=0.050.npz' 'save_jdos_E0=-0.250_dE=0.020.npz'