Source code for molsysmt.native.molecular_mechanics

from molsysmt._private.exceptions import *
from molsysmt import pyunitwizard as puw
from copy import deepcopy

[docs] class MolecularMechanics(): def __init__(self, forcefield=None, water_model=None, implicit_solvent=None, non_bonded_method=None, cutoff_distance=None, switch_distance=None, dispersion_correction=None, ewald_error_tolerance=None, constraints=None, flexible_constraints=None, rigid_water=None, hydrogen_mass=None, salt_concentration=None, kappa=None, solute_dielectric=None, solvent_dielectric=None, formal_charge=None, partial_charge=None): # default values: # non_bonded_method='no_cutoff' # use_dispersion_correction=False # ewald_error_tolerance=0.0001 # flexible_constraints=False # rigid_water=True # ignore_external_bonds=False # implicit_solvent_salt_conc=0.0 mol/L # implicit_solvent_kappa=0.0 1/nm # solute_dielectric=1.0 # solvent_dielectric=78.5 self.formal_charge = formal_charge self.partial_charge = partial_charge self.forcefield = forcefield self.non_bonded_method = non_bonded_method self.cutoff_distance = cutoff_distance self.switch_distance = switch_distance self.dispersion_correction = dispersion_correction self.ewald_error_tolerance = ewald_error_tolerance self.hydrogen_mass = hydrogen_mass self.constraints = constraints self.flexible_constraints = flexible_constraints self.water_model = water_model self.rigid_water = rigid_water #self.residue_templates = residue_templates #self.ignore_external_bonds = ignore_external_bonds self.implicit_solvent = implicit_solvent self.solute_dielectric = solute_dielectric self.solvent_dielectric = solvent_dielectric self.salt_concentration = salt_concentration self.kappa = kappa
[docs] def to_dict(self): tmp_dict = { 'formal_charge': self.formal_charge, 'partial_charge': self.partial_charge, 'forcefield' : self.forcefield, 'non_bonded_method' : self.non_bonded_method, 'cutoff_distance' : self.cutoff_distance, 'switch_distance' : self.switch_distance, 'dispersion_correction' : self.dispersion_correction, 'ewald_error_tolerance' : self.ewald_error_tolerance, 'hydrogen_mass' : self.hydrogen_mass, 'constraints' : self.constraints, 'flexible_constraints' : self.flexible_constraints, 'water_model' : self.water_model, 'rigid_water' : self.rigid_water, 'implicit_solvent' : self.implicit_solvent, 'solute_dielectric' : self.solute_dielectric, 'solvent_dielectric' : self.solvent_dielectric, 'salt_concentration' : self.salt_concentration, 'kappa' : self.kappa, }
[docs] def copy(self): tmp_molecular_mechanics = MolecularMechanics() tmp_molecular_mechanics.formal_charge = deepcopy(self.formal_charge) tmp_molecular_mechanics.partial_charge = deepcopy(self.partial_charge) tmp_molecular_mechanics.forcefield = deepcopy(self.forcefield) tmp_molecular_mechanics.non_bonded_method = deepcopy(self.non_bonded_method) tmp_molecular_mechanics.cutoff_distance = deepcopy(self.cutoff_distance) tmp_molecular_mechanics.switch_distance = deepcopy(self.switch_distance) tmp_molecular_mechanics.dispersion_correction = deepcopy(self.dispersion_correction) tmp_molecular_mechanics.ewald_error_tolerance = deepcopy(self.ewald_error_tolerance) tmp_molecular_mechanics.hydrogen_mass = deepcopy(self.hydrogen_mass) tmp_molecular_mechanics.constraints = deepcopy(self.constraints) tmp_molecular_mechanics.flexible_constraints = deepcopy(self.flexible_constraints) tmp_molecular_mechanics.water_model = deepcopy(self.water_model) tmp_molecular_mechanics.rigid_water = deepcopy(self.rigid_water) tmp_molecular_mechanics.implicit_solvent = deepcopy(self.implicit_solvent) tmp_molecular_mechanics.solute_dielectric = deepcopy(self.solute_dielectric) tmp_molecular_mechanics.solvent_dielectric = deepcopy(self.solvent_dielectric) tmp_molecular_mechanics.salt_concentration = deepcopy(self.salt_concentration) tmp_molecular_mechanics.kappa = deepcopy(self.kappa) return tmp_molecular_mechanics
[docs] def set_parameters(self, return_non_processed=False, **kwargs): for argument, value in kwargs.items(): if argument.lower() in self.__dict__.keys(): self.__dict__[argument]=puw.standardize(value) del(kwargs[argment.lower()]) if return_non_processed: return kwargs else: pass
[docs] def get_leap_parameters(self): from molsysmt.molecular_mechanics.forcefields import get_forcefield_names parameters = {} parameters['forcefield'] = get_forcefield_names(self.forcefield, 'LEaP', water_model=self.water_model, implicit_solvent=self.implicit_solvent) parameters['water_model'] = self.water_model parameters['implicit_solvent'] = self.implicit_solvent return parameters
[docs] def get_openmm_forcefield_names(self): from molsysmt.molecular_mechanics.forcefields import get_forcefield_names return get_forcefield_names(self.forcefield, 'OpenMM', water_model=self.water_model, implicit_solvent=self.implicit_solvent)
[docs] def to_openmm_ForceField(self): from openmm.app import ForceField forcefield_names = self.get_openmm_forcefield_names() forcefield = ForceField(*forcefield_names) return forcefield
[docs] def get_openmm_System_parameters(self): from openmm import app parameters = {} if self.non_bonded_method=='no_cutoff': parameters['nonbondedMethod']=app.NoCutoff elif self.non_bonded_method=='cutoff_non_periodic': parameters['nonbondedMethod']=app.CutoffNonPeriodic elif self.non_bonded_method=='cutoff_periodic': parameters['nonbondedMethod']=app.CutoffPeriodic elif self.non_bonded_method=='Ewald': parameters['nonbondedMethod']=app.Ewald elif self.non_bonded_method=='PME': parameters['nonbondedMethod']=app.PME elif self.non_bonded_method=='LJPME': parameters['nonbondedMethod']=app.LJPME else: raise NotImplementedError() if self.non_bonded_cutoff is not None: parameters['nonbondedCutoff']=puw.convert(self.cutoff_distance, to_form='openmm.unit', to_unit='nm') if self.switch_distance is not None: parameters['switchDistance']=puw.convert(self.switch_distance, to_form='openmm.unit', to_unit='nm') if self.constraints is not None: if self.constraints == 'h_bonds': parameters['constraints']=app.HBonds elif self.constraints == 'all_bonds': parameters['constraints']=app.HBonds elif self.constraints == 'h_angles': parameters['constraints']=app.HAngles else: raise NotImplementedError() else: parameters['constraints']=None parameters['hydrogenMass']=self.hydrogen_mass parameters['rigidWater']=self.rigid_water #parameters['removeCMMotion']=self.remove_cm_motion parameters['residueTemplates']=self.residue_templates parameters['ignoreExternalBonds']=self.ignore_external_bonds parameters['flexibleConstraints']=self.flexible_constraints if self.implicit_solvent is not None: if self.implicit_solvent == 'HCT': parameters['implicitSolvent']=app.HCT elif self.implicit_solvent == 'OBC1': parameters['implicitSolvent']=app.OBC1 elif self.implicit_solvent == 'OBC2': parameters['implicitSolvent']=app.OBC2 elif self.implicit_solvent == 'GBn': parameters['implicitSolvent']=app.GBn elif self.implicit_solvent == 'GBn2': parameters['implicitSolvent']=app.GBn2 else: raise NotImplementedError parameters['implicitSolventSaltConc']=puw.convert(self.salt_concentration, to_unit='mole/liter', to_form='openmm.unit') parameters['implicitSolventKappa']=puw.convert(self.kappa, to_unit='1/nm', to_form='openmm.unit') parameters['soluteDielectric']=self.solute_dielectric parameters['solventDielectric']=self.solvent_dielectric else: parameters['implicitSolvent']=None return parameters