Source code for phlab.model

from phlab.model import spec
from phlab.model import kernel_single_osc
from phlab.model import kernel_double_osc
from phlab.model import kernel_dist_disp_osc
from phlab.model.input_handler import input_handler
from phlab.model import kernel_converge
from phlab.model import kernel_fit

from lmfit import Minimizer, Parameters, report_fit,Model
import numpy as np
import json
import os



[docs]class single_osc(object): """ Creates object for 1D harmonic oscillator model. Args: inp_dir: str name of the input directory. out_dir: str name of the output directory. nmodel: int id number of the model. name: str name of the model. Attributes: input_default: dict dictionary with default input parameters. input: dict dictionary with current input parameters. npoints: int number of points in the spectrum. spec_max: float max limt of enrgy loss. spec_min: float min limt of enrgy loss. param2fit: object parameters to fit. nruns: int number of runs. color: str color of the line input_class: object returns input_handler for this model. x: float energy loss in eV for the phonon contribution. y: float rixs intensity (arb. units) for the phonon contribution. y_norm: float normalized rixs intensity (arb. units) for the phonon contribution. """ def __init__(self, inp_dir = './_input/', out_dir = './_output/', nmodel = 0, name = '' ): super(single_osc, self).__init__() self.input_default = { 'problem_type': 'rixs', 'method': 'fc', "coupling": 0.1, "omega_ph": 0.195, "nf": 10.0, "nm": 100.0, "energy_ex": 10.0, "omega_in": 10.0, "gamma": 0.105, "gamma_ph": 0.05, "alpha_exp": 0.01 } self.npoints = 1000 self.spec_max = 1. self.spec_min= -0.1 self.inp_dir = inp_dir self.out_dir = out_dir self.nmodel = nmodel self.name = name self.param2fit = parameters2fit() self.nruns=0 self.color='' self.input_class=input_handler(input_default = self.input_default, inp_dir = self.inp_dir, nmodel = self.nmodel) self.input = self.input_class.input print('number of models : {nm}'.format(nm = self.nmodel)) def run(self): self.input_class.input_update(self.input) self.nruns+=1 results=execute(kernel = kernel_single_osc, local = self) self.x,self.y=np.transpose(np.loadtxt(self.out_dir\ +'/{nr}_rixs_phonons.csv'.format(\ nm = self.nmodel, nr = self.nruns))) self.y_norm=self.y/max(self.y) def converge(self,parameter = 'nm', pmin =0 , pmax= 1,steps = 100): self.input_class.input_update(self.input) self.param = { 'parameter' : parameter, 'pmin': pmin, 'pmax': pmax, 'steps' : steps} res = kernel_converge.execute(kernel = kernel_single_osc, local = self ) print(res.kernel) self.conv_arr = res.conv_arr self.param_space = res.param_space def fit(self, experiment={}, method = 'brute' ,verbose = True): self.param = { 'experiment' : experiment, 'method': method, 'verbose': verbose} results = kernel_fit.execute(kernel = kernel_single_osc, local =self) self.fit_report=results.fit_report
[docs]class double_osc(object): """ Creates object for 2D harmonic oscillator model. Args: inp_dir: str name of the input directory. out_dir: str name of the output directory. nmodel: int id number of the model. name: str name of the model. Attributes: input_default: dict dictionary with default input parameters. input: dict dictionary with current input parameters. npoints: int number of points in the spectrum. spec_max: float max limt of enrgy loss. spec_min: float min limt of enrgy loss. param2fit: object parameters to fit. nruns: int number of runs. color: str color of the line. input_class: object returns input_handler for this model. x: float energy loss in eV for the phonon contribution. y: float rixs intensities (arb. units) for the phonon contribution. y_norm: float normalized rixs intensities (arb. units) for the phonon contribution. """ def __init__(self, inp_dir = './_input/', out_dir = './_output/', nmodel = 0, name = '' ): super(double_osc, self).__init__() self.input_default = { 'problem_type': 'rixs', 'method': 'fc', "coupling0": 0.1, "omega_ph0": 0.1, "coupling1": 0.03, "omega_ph1": 0.03, "nf": 10.0, "nm": 3.0, "energy_ex": 10.0, "omega_in": 10.0, "gamma": 0.1, "gamma_ph": 0.01, "alpha_exp": 0.01, } self.npoints = 1000 self.spec_max = 1. self.spec_min= -0.1 self.inp_dir = inp_dir self.out_dir = out_dir self.nmodel = nmodel self.nruns=0 self.color='r' self.name = name self.param2fit = parameters2fit() self.input_class=input_handler(input_default = self.input_default, inp_dir = self.inp_dir, nmodel = self.nmodel, model_name = '2d_osc') self.input = self.input_class.input print('number of models : {nm}'.format(nm = self.nmodel)) def run(self): self.input_class.input_update(self.input) self.nruns+=1 results=execute(kernel = kernel_double_osc, local = self) self.x,self.y=np.transpose(np.loadtxt(self.out_dir\ +'/{nr}_rixs_phonons.csv'.format(\ nm = self.nmodel, nr = self.nruns))) self.y_norm=self.y/max(self.y) def converge(self,parameter = 'nm', pmin =0 , pmax= 1,steps = 100): self.input_class.input_update(self.input) self.param = { 'parameter' : parameter, 'pmin': pmin, 'pmax': pmax, 'steps' : steps} res = kernel_converge.execute(kernel = kernel_double_osc, local = self ) print(res.kernel) self.conv_arr = res.conv_arr self.param_space = res.param_space def fit(self, experiment={}, method = 'brute' ,verbose = True): self.param = { 'experiment' : experiment, 'method': method, 'verbose': verbose} results = kernel_fit.execute(kernel = kernel_double_osc, local =self) self.fit_report=results.fit_report
[docs]class dist_disp_osc(object): """ Creates object for distorted and displaced harmonic oscillator model. Args: inp_dir: str name of the input directory. out_dir: str name of the output directory. nmodel: int serial number of the model. name: str name of the model. Attributes: input_default: dict dictionary with default input parameters. input: dict dictionary with current input parameters. npoints: int number of points in the spectrum. spec_max: float max limt of enrgy loss. spec_min: float min limt of enrgy loss. param2fit: object parameters to fit. nruns: int number of runs. color: str color of the line. input_class: object returns input_handler for this model. x: float energy loss in eV for the phonon contribution. y: float rixs intensities (arb. units) for the phonon contribution. y_norm: float normalized rixs intensities (arb. units) for the phonon contribution. """ def __init__(self, inp_dir = './_input/', out_dir = './_output/', nmodel = 0, name = '' ): super(dist_disp_osc, self).__init__() self.input_default = { 'problem_type': 'rixs', 'method': 'fc', "coupling": 0.1, "omega_ph": 0.195, 'omega_ph_ex':0.1, "nf": 10.0, "nm": 3.0, "energy_ex": 10.0, "omega_in": 10.0, "gamma": 0.1, "gamma_ph": 0.05, "alpha_exp": 0.01, } self.npoints = 1000 self.spec_max = 1. self.spec_min= -0.1 self.inp_dir = inp_dir self.out_dir = out_dir self.nmodel = nmodel self.name = name self.nruns=0 self.color='r' self.param2fit = parameters2fit() self.input_class=input_handler(input_default = self.input_default, inp_dir = self.inp_dir, nmodel = self.nmodel, model_name = 'dd_osc') self.input = self.input_class.input print('number of models : {nm}'.format(nm = self.nmodel)) def run(self): self.input_class.input_update(self.input) self.nruns+=1 results=execute(kernel = kernel_dist_disp_osc, local = self) self.x,self.y=np.transpose(np.loadtxt(self.out_dir\ +'/{nr}_rixs_phonons.csv'.format(\ nm = self.nmodel, nr = self.nruns))) self.y_norm=self.y/max(self.y) def converge(self,parameter = 'nm', pmin =0 , pmax= 1, steps = 100): self.input_class.input_update(self.input) self.param = { 'parameter' : parameter, 'pmin': pmin, 'pmax': pmax, 'steps' : steps} res = kernel_converge.execute(kernel = kernel_dist_disp_osc, local = self ) self.conv_arr = res.conv_arr self.param_space = res.param_space def fit(self, experiment={}, method = 'brute' ,verbose = True): self.param = { 'experiment' : experiment, 'method': method, 'verbose': verbose} results = kernel_fit.execute(kernel = kernel_dist_disp_osc, local =self) self.fit_report=results.fit_report
# support classes
[docs]class parameters2fit(object): """ Defines paramters to fit. Attributes: dict: dict dictionary with parameters to fit """ def __init__(self): super(parameters2fit, self).__init__() self.dict = {} def add(self, name = '', ivalue = 0, range=[0,1]): self.dict[name]={'value':ivalue,'range':range}
[docs]class execute(object): """docstring for execute.""" def __init__(self, kernel = '', local = ''): super(execute, self).__init__() self.local = local self.kernel = kernel self.kernel.kernel(self.local.input, nruns = self.local.nruns, nmodel = self.local.nmodel, out_dir = self.local.out_dir).cross_section() spec.spec(self.local.input, nruns = self.local.nruns, nmodel = self.local.nmodel, out_dir = self.local.out_dir, npoints = self.local.npoints, spec_max = self.local.spec_max, spec_min= self.local.spec_min).run_broad()