""" Generated by CHARMM-GUI (http://www.charmm-gui.org) omm_readinputs.py This module is for reading inputs in OpenMM. Correspondance: jul316@lehigh.edu or wonpil@lehigh.edu Last update: February 5, 2025 """ from openmm import * from openmm.app import * from openmm.unit import * class _OpenMMReadInputs: def __init__(self): self.mini_nstep = 0 # Number of steps for minimization self.mini_Tol = 1.0 # Minimization energy tolerance self.gen_vel = "no" # Generate initial velocities self.gen_temp = 300.0 # Temperature for generating initial velocities (K) self.gen_seed = None # Seed for generating initial velocities self.nstep = 0 # Number of steps to run self.dt = 0.002 # Time-step (ps) self.nstout = 100 # Writing output frequency (steps) self.nstdcd = 0 # Wrtiing coordinates trajectory frequency (steps) self.coulomb = PME # Electrostatic cut-off method self.ewald_Tol = 0.0005 # Ewald error tolerance self.vdw = "Force-switch" # vdW cut-off method self.r_on = 1.0 # Switch-on distance (nm) self.r_off = 1.2 # Switch-off distance (nm) self.lj_lrc = "no" # Turn on/off LJ long-range correction self.e14scale = 1.0 # 1-4 electrostatic interaction scaling self.temp = 300.0 # Temperature (K) self.fric_coeff = 1 # Friction coefficient for Langevin dynamics self.pcouple = "no" # Turn on/off pressure coupling self.p_ref = 1.0 # Pressure (Pref or Pxx, Pyy, Pzz; bar) self.p_type = "membrane" # MonteCarloBarotat type self.p_scale = True, True, True # For MonteCarloAnisotropicBarostat self.p_XYMode = ( MonteCarloMembraneBarostat.XYIsotropic ) # For MonteCarloMembraneBarostat self.p_ZMode = ( MonteCarloMembraneBarostat.ZFree ) # For MonteCarloMembraneBarostat self.p_tens = 0.0 # Sulface tension for MonteCarloMembraneBarostat (dyne/cm) self.p_freq = 15 # Pressure coupling frequency (steps) self.cons = HBonds # Constraints method self.rest = "no" # Turn on/off restraints self.fc_bb = 0.0 # Positional restraint force constant for protein backbone (kJ/mol/nm^2) self.fc_sc = 0.0 # Positional restraint force constant for protein side-chain (kJ/mol/nm^2) self.fc_mpos = ( 0.0 # Positional restraint force constant for micelle lipids (kJ/mol/nm^2) ) self.fc_lpos = ( 0.0 # Positional restraint force constant for lipids (kJ/mol/nm^2) ) self.fc_hmmm = 0.0 # Planar restraint force constant for HMMM (kJ/mol/nm^2) self.fc_dcle = 0.0 # Flat-bottomed positional restraint force constant for HMMM DCLE (kJ/mol/nm^2) self.fc_ldih = ( 0.0 # Dihedral restraint force constant for lipids (kJ/mol/rad^2) ) self.fc_cdih = ( 0.0 # Dihedral restraint force constant for carbohydrates (kJ/mol/rad^2) ) self.fbres_rfb = ( 1.0 # Distance from the center for flat-bottomed positional restraint (nm) ) self.annealing = "no" # Turn on/off simulated annealing self.temp_init = 0.0 # Inital temperature of simulated annealing self.interval = 0.0 # Annealing temperature increment self.implicitSolvent = None self.implicit_salt = 0.0 self.solut_diele = 0.0 self.solve_diele = 0.0 self.gbsamodel = None def read(self, inputFile): for line in open(inputFile, "r"): if line.find("#") >= 0: line = line.split("#")[0] line = line.strip() if len(line) > 0: segments = line.split("=") input_param = segments[0].upper().strip() try: input_value = segments[1].strip() except: input_value = None if input_value: if input_param == "MINI_NSTEP": self.mini_nstep = int(input_value) if input_param == "MINI_TOL": self.mini_Tol = float(input_value) if input_param == "GEN_VEL": if input_value.upper() == "YES": self.gen_vel = "yes" if input_value.upper() == "NO": self.gen_vel = "no" if input_param == "GEN_TEMP": self.gen_temp = float(input_value) if input_param == "GEN_SEED": self.gen_seed = int(input_value) if input_param == "NSTEP": self.nstep = int(input_value) if input_param == "DT": self.dt = float(input_value) if input_param == "NSTOUT": self.nstout = int(input_value) if input_param == "NSTDCD": self.nstdcd = int(input_value) if input_param == "COULOMB": if input_value.upper() == "NOCUTOFF": self.coulomb = NoCutoff if input_value.upper() == "CUTOFFNONPERIODIC": self.coulomb = CutoffNonPeriodic if input_value.upper() == "CUTOFFPERIODIC": self.coulomb = CutoffPeriodic if input_value.upper() == "EWALD": self.coulomb = Ewald if input_value.upper() == "PME": self.coulomb = PME if input_param == "EWALD_TOL": self.ewald_Tol = float(input_value) if input_param == "VDW": if input_value.upper() == "NOCUTOFF": self.vdw = "NoCutoff" if input_value.upper() == "CUTOFFPERIODIC": self.vdw = "CutoffPeriodic" if input_value.upper() == "FORCE-SWITCH": self.vdw = "Force-switch" if input_value.upper() == "SWITCH": self.vdw = "Switch" if input_value.upper() == "LJPME": self.vdw = "LJPME" if input_param == "R_ON": self.r_on = float(input_value) if input_param == "R_OFF": self.r_off = float(input_value) if input_param == "LJ_LRC": if input_value.upper() == "YES": self.lj_lrc = "yes" if input_value.upper() == "NO": self.lj_lrc = "no" if input_param == "E14SCALE": self.e14scale = float(input_value) if input_param == "TEMP": self.temp = float(input_value) if input_param == "FRIC_COEFF": self.fric_coeff = float(input_value) if input_param == "PCOUPLE": if input_value.upper() == "YES": self.pcouple = "yes" if input_value.upper() == "NO": self.pcouple = "no" if input_param == "P_REF": if input_value.find(",") < 0: self.p_ref = float(input_value) else: Pxx = float(input_value.split(",")[0]) Pyy = float(input_value.split(",")[1]) Pzz = float(input_value.split(",")[2]) self.p_ref = Pxx, Pyy, Pzz if input_param == "P_TYPE": if input_value.upper() == "ISOTROPIC": self.p_type = "isotropic" if input_value.upper() == "MEMBRANE": self.p_type = "membrane" if input_value.upper() == "ANISOTROPIC": self.p_type = "anisotropic" if input_param == "P_SCALE": scaleX = True scaleY = True scaleZ = True if input_value.upper().find("X") < 0: scaleX = False if input_value.upper().find("Y") < 0: scaleY = False if input_value.upper().find("Z") < 0: scaleZ = False self.p_scale = scaleX, scaleY, scaleZ if input_param == "P_XYMODE": if input_value.upper() == "XYISOTROPIC": self.p_XYMode = MonteCarloMembraneBarostat.XYIsotropic if input_value.upper() == "XYANISOTROPIC": self.p_XYMode = MonteCarloMembraneBarostat.XYAnisotropic if input_param == "P_ZMODE": if input_value.upper() == "ZFREE": self.p_ZMode = MonteCarloMembraneBarostat.ZFree if input_value.upper() == "ZFIXED": self.p_ZMode = MonteCarloMembraneBarostat.ZFixed if input_value.upper() == "CONSTANTVOLUME": self.p_ZMode = MonteCarloMembraneBarostat.ConstantVolume if input_param == "P_TENS": self.p_tens = float(input_value) if input_param == "P_FREQ": self.p_freq = int(input_value) if input_param == "CONS": if input_value.upper() == "NONE": self.cons = None if input_value.upper() == "HBONDS": self.cons = HBonds if input_value.upper() == "ALLBONDS": self.cons = AllBonds if input_value.upper() == "HANGLES": self.cons = HAngles if input_param == "REST": if input_value.upper() == "YES": self.rest = "yes" if input_value.upper() == "NO": self.rest = "no" if input_param == "FC_BB": self.fc_bb = float(input_value) if input_param == "FC_SC": self.fc_sc = float(input_value) if input_param == "FC_MPOS": self.fc_mpos = float(input_value) if input_param == "FC_LPOS": self.fc_lpos = float(input_value) if input_param == "FC_HMMM": self.fc_hmmm = float(input_value) if input_param == "FC_DCLE": self.fc_dcle = float(input_value) if input_param == "FC_LDIH": self.fc_ldih = float(input_value) if input_param == "FC_CDIH": self.fc_cdih = float(input_value) if input_param == "FBRES_RFB": self.fbres_rfb = float(input_value) if input_param == "ANNEALING": if input_value.upper() == "YES": self.annealing = "yes" if input_param == "TEMP_INIT": self.temp_init = float(input_value) if input_param == "INTERVAL": self.interval = float(input_value) if input_param == "IMPLICIT": if input_value.upper() == "HCT": self.implicitSolvent = HCT if input_value.upper() == "OBC1": self.implicitSolvent = OBC1 if input_value.upper() == "OBC2": self.implicitSolvent = OBC2 if input_value.upper() == "GBN": self.implicitSolvent = GBn if input_value.upper() == "GBN2": self.implicitSolvent = GBn2 if input_param == "IMPLIC_SALT": self.implicit_salt = float(input_value) if input_param == "SOLUT_DIELE": self.solut_diele = float(input_value) if input_param == "SOLVE_DIELE": self.solve_diele = float(input_value) if input_param == "GBSAMODEL": if input_value.upper() == "ACE": self.gbsamodel = "ACE" if input_value.upper() == "NONE": self.gbsamodel = None return self def read_inputs(inputFile): return _OpenMMReadInputs().read(inputFile)