Source code for esteem.wrappers.specpycode

#!/usr/bin/env python
# coding: utf-8

# In[1]:


"""Defines the SpecPyCodeWrapper Class"""

import numpy as np
import sys

from esteem.tasks.spectra import wavelength_eV_conv as hc

[docs]class SpecPyCodeWrapper(): """ Writes input files for Spectroscopy Python Code, runs them, and reads results :ivar input_filename: default value: "input_file" :ivar rootname: name given to all trajX.dat files - default value: "rootname" :ivar rootname: default "rootname" :ivar input_filename: default "input_file" :ivar third_order_cumulant: default TRUE :ivar num_steps: default 1000 :ivar max_t: default 300.0 :ivar correlation_length_3rd: default 300 :ivar decay_length: default 500 :ivar num_trajs: default 0 :ivar task: default "ABSORPTION" :ivar temperature: default 300.0 :ivar method: default "CUMULANT" :ivar spectral_window: default 1.5 :ivar md_step: default 0.5 :ivar chromophore_model: default "MD" :ivar exec_path: default "/storage/nanosim/Spectroscopy_python_code/" :ivar ncores: default 4 :ivar solvent_model: default "NONE" :ivar solvent_reorg: default 0.0 """ def __init__(self, solvent_model="NONE", solvent_reorg="0.0", rootname="rootname", input_filename="input_file", third_order_cumulant="TRUE", num_steps=1000, max_t=300.0, correlation_length_3rd=300, decay_length=500, num_trajs=0, task="ABSORPTION", temperature=300.0, method="CUMULANT", spectral_window=1.5, md_step=0.5, chromophore_model="MD", exec_path="/storage/nanosim/Spectroscopy_python_code/", ncores=4): self.input_filename = input_filename self.rootname = rootname self.ncores = ncores self.num_trajs = 0 self.solvent_model = solvent_model self.solvent_reorg = solvent_reorg self.rootname = rootname self.third_order_cumulant = third_order_cumulant self.num_steps = num_steps self.max_t = max_t self.correlation_length_3rd = correlation_length_3rd self.decay_length = decay_length self.task = task self.temperature = temperature self.num_trajs = num_trajs self.method = method self.spectral_window = spectral_window self.md_step = md_step self.chromophore_model = chromophore_model sys.path.append(exec_path) # Initialise data to empty list self.data = [] def write_input_file(self): inpf = open(self.input_filename,"w") self.args = {"SOLVENT_MODEL": str(self.solvent_model).upper(), "SOLVENT_REORG": self.solvent_reorg, "MD_ROOTNAME": self.rootname+"_", "THIRD_ORDER_CUMULANT": str(self.third_order_cumulant).upper(), "NUM_STEPS": self.num_steps, "MAX_T": self.max_t, "CORRELATION_LENGTH_3RD": self.correlation_length_3rd, "DECAY_LENGTH": self.decay_length, "TASK": str(self.task).upper(), "TEMPERATURE": self.temperature, "NUM_TRAJS": self.num_trajs, "METHOD": str(self.method).upper(), "SPECTRAL_WINDOW": self.spectral_window, "MD_STEP": self.md_step, "CHROMOPHORE_MODEL": str(self.chromophore_model).upper()} for arg in self.args: inpf.write(f"{arg} {self.args[arg]}\n") inpf.close() def run(self): import importlib store_argv = sys.argv sys.argv = ['generate_spectra.py',self.input_filename,self.ncores] print(f'# Executing Spectroscopy Python Code from input file {self.input_filename} with parameters:') print('#',self.args) reload = True if "generate_spectra" in sys.modules else False import generate_spectra if reload: print("Attempting to reload...") importlib.reload(generate_spectra) sys.argv = store_argv def trajs_exist(self): from os import path all_trajs_exist = True for i in range(self.num_trajs): filename = f'{self.rootname}_traj{str(i+1)}.dat' if not path.exists(filename): all_trajs_exist = False print(f'# No file found: {filename}') return all_trajs_exist def results_exist(self): from os import path if self.method=="CUMULANT": results_file = f"{self.rootname}_MD_cumulant_spectrum.dat" else: results_file = f"{self.rootname}_MD_ensemble_spectrum.dat" return True if path.exists(results_file) else False def read(self): if self.method=="CUMULANT": results_file = f"{self.rootname}_MD_cumulant_spectrum.dat" else: results_file = f"{self.rootname}_MD_ensemble_spectrum.dat" if not self.results_exist(): print(f"Results file {results_file} not found") #raise Exception(f"Results file {results_file} not found") try: spec = np.loadtxt(results_file,usecols=(0,1)) spec[:,0] = hc/spec[:,0] if spec.shape==(2,): spec = np.array([spec],ndmin=2) except: spec = None return spec def write_excitations(self,excitations): filename = f'{self.rootname}_traj{str(self.num_trajs+1)}.dat' print(f'# Writing to excitations to {filename}') excf = open(filename,"w") for e in excitations: excf.write(f'{e[0][1]} {e[0][2]}\n') self.num_trajs += 1 excf.close()
# In[ ]: