Source code for jarvis.core.spectrum

"""Module to process spectrum like data."""

import numpy as np
from jarvis.core.utils import lorentzian
from scipy.signal import find_peaks_cwt


[docs]class Spectrum(object): """Module for spectrum like data, e.g. IR, Raman, DOS, epsilon.""" def __init__(self, x=[], y=[], linewidth=5.0, resolution=0.1): """Initialize the class.""" self.x = np.array(x) self.y = np.array(y) self.resolution = resolution self.linewidth = linewidth
[docs] def rescale(self, mode="max", scaling_factor=1.0): """Rescale the spectrum.""" if mode == "sum": const = np.sum(self.y, axis=0) if mode == "max": const = np.max(self.y, axis=0) return self.y * scaling_factor / const
@property def num_modes(self): """Get number of modes.""" return len(self.x) @property def min_x(self): """Get minimum mode frequency.""" return min(self.x) @property def max_x(self): """Get maximum mode frequency.""" return max(self.x)
[docs] def get_peak_indices(self, window=np.arange(1, 10)): """Get peak indices for non-zero peaks.""" return find_peaks_cwt(self.y, window)
[docs] def smoothen_spiky_spectrum(self): """Smoothen peak for delta function like peaks.""" lwidth_list = [float(self.linewidth) for i in range(self.num_modes)] spect_x = np.arange( self.min_x, self.max_x + self.resolution, self.resolution, dtype="float", ) spect_y = np.zeros_like(spect_x, dtype="float") for i, j, k in zip(self.x, self.y, lwidth_list): spect_y += lorentzian(spect_x, j, i, k) return spect_x, spect_y
[docs] def get_interpolated_values(self, new_dist=np.arange(0, 15, 0.05)): """Get interpolated grid on a fixed grid.""" interp = np.interp(new_dist, self.x, self.y) return interp
""" from jarvis.io.vasp.outputs import Vasprun, Outcar from jarvis.analysis.phonon.ir import ir_intensity import os out = Outcar( os.path.join(os.path.dirname(__file__), "../tests/testfiles/io/vasp/OUTCAR.JVASP-39") ) vrun = Vasprun( os.path.join( os.path.dirname(__file__), "../tests/testfiles/io/vasp/vasprun.xml.JVASP-39" ) ) phonon_eigenvectors = vrun.dfpt_data["phonon_eigenvectors"] vrun_eigs = vrun.dfpt_data["phonon_eigenvalues"] phonon_eigenvalues = out.phonon_eigenvalues masses = vrun.dfpt_data["masses"] born_charges = vrun.dfpt_data["born_charges"] x, y = ir_intensity( phonon_eigenvectors=phonon_eigenvectors, phonon_eigenvalues=phonon_eigenvalues, masses=masses, born_charges=born_charges, ) assert x[0] == 713.8676686817399 sp=Spectrum(x=x,y=y) xx,yy=sp.smoothen_spiky_spectrum() print (sp.get_peak_indices()) #print (xx.tolist()) print () #print (yy.tolist()) """