def __init__(self,options,tgt_opts,forcefield): super(BindingEnergy,self).__init__(options,tgt_opts,forcefield) self.set_option(None, None, 'inter_txt', os.path.join(self.tgtdir,tgt_opts['inter_txt'])) self.global_opts, self.sys_opts, self.inter_opts = parse_interactions(self.inter_txt) # If the global option doesn't exist in the system / interaction, then it is copied over. for opt in self.global_opts: for sys in self.sys_opts: if opt not in self.sys_opts[sys]: self.sys_opts[sys][opt] = self.global_opts[opt] for inter in self.inter_opts: if opt not in self.inter_opts[inter]: self.inter_opts[inter][opt] = self.global_opts[opt] for inter in self.inter_opts: if 'energy_unit' in self.inter_opts[inter] and self.inter_opts[inter]['energy_unit'].lower() not in ['kilocalorie_per_mole', 'kilocalories_per_mole']: logger.error('Usage of physical units is has been removed, please provide all binding energies in kcal/mole\n') raise RuntimeError self.inter_opts[inter]['reference_physical'] = self.inter_opts[inter]['energy'] if tgt_opts['energy_denom'] == 0.0: self.set_option(None, None, 'energy_denom', val=np.std(np.array([val['reference_physical'] for val in self.inter_opts.values()]))) else: self.set_option(None, None, 'energy_denom', val=tgt_opts['energy_denom']) self.set_option(None, None, 'rmsd_denom', val=tgt_opts['rmsd_denom']) self.set_option(tgt_opts,'cauchy') self.set_option(tgt_opts,'attenuate') ## LPW 2018-02-11: This is set to True if the target calculates ## a single-point property over several existing snapshots. self.loop_over_snapshots = False logger.info("The energy denominator is: %s\n" % str(self.energy_denom)) logger.info("The RMSD denominator is: %s\n" % str(self.rmsd_denom)) if self.cauchy: logger.info("Each contribution to the interaction energy objective function will be scaled by 1.0 / ( denom**2 + reference**2 )\n") if self.attenuate: logger.error('attenuate and cauchy are mutually exclusive\n') raise RuntimeError elif self.attenuate: logger.info("Repulsive interactions beyond energy_denom will be scaled by 1.0 / ( denom**2 + (reference-denom)**2 )\n") ## Build keyword dictionaries to pass to engine. engine_args = OrderedDict(list(self.OptionDict.items()) + list(options.items())) del engine_args['name'] ## Create engine objects. self.engines = OrderedDict() for sysname,sysopt in self.sys_opts.items(): M = Molecule(os.path.join(self.root, self.tgtdir, sysopt['geometry'])) if 'select' in sysopt: atomselect = np.array(uncommadash(sysopt['select'])) M = M.atom_select(atomselect) if self.FF.rigid_water: M.rigid_water() self.engines[sysname] = self.engine_(target=self, mol=M, name=sysname, tinker_key=os.path.join(sysopt['keyfile']), **engine_args)
def __init__(self,options,tgt_opts,forcefield): super(BindingEnergy,self).__init__(options,tgt_opts,forcefield) self.set_option(None, None, 'inter_txt', os.path.join(self.tgtdir,tgt_opts['inter_txt'])) self.global_opts, self.sys_opts, self.inter_opts = parse_interactions(self.inter_txt) # If the global option doesn't exist in the system / interaction, then it is copied over. for opt in self.global_opts: for sys in self.sys_opts: if opt not in self.sys_opts[sys]: self.sys_opts[sys][opt] = self.global_opts[opt] for inter in self.inter_opts: if opt not in self.inter_opts[inter]: self.inter_opts[inter][opt] = self.global_opts[opt] for inter in self.inter_opts: if 'energy_unit' in self.inter_opts[inter] and self.inter_opts[inter]['energy_unit'].lower() not in ['kilocalorie_per_mole', 'kilocalories_per_mole']: logger.error('Usage of physical units is has been removed, please provide all binding energies in kcal/mole\n') raise RuntimeError self.inter_opts[inter]['reference_physical'] = self.inter_opts[inter]['energy'] if tgt_opts['energy_denom'] == 0.0: self.set_option(None, None, 'energy_denom', val=np.std(np.array([val['reference_physical'] for val in self.inter_opts.values()]))) else: self.set_option(None, None, 'energy_denom', val=tgt_opts['energy_denom']) self.set_option(None, None, 'rmsd_denom', val=tgt_opts['rmsd_denom']) self.set_option(tgt_opts,'cauchy') self.set_option(tgt_opts,'attenuate') logger.info("The energy denominator is: %s\n" % str(self.energy_denom)) logger.info("The RMSD denominator is: %s\n" % str(self.rmsd_denom)) if self.cauchy: logger.info("Each contribution to the interaction energy objective function will be scaled by 1.0 / ( denom**2 + reference**2 )\n") if self.attenuate: logger.error('attenuate and cauchy are mutually exclusive\n') raise RuntimeError elif self.attenuate: logger.info("Repulsive interactions beyond energy_denom will be scaled by 1.0 / ( denom**2 + (reference-denom)**2 )\n") ## Build keyword dictionaries to pass to engine. engine_args = OrderedDict(self.OptionDict.items() + options.items()) del engine_args['name'] ## Create engine objects. self.engines = OrderedDict() for sysname,sysopt in self.sys_opts.items(): M = Molecule(os.path.join(self.root, self.tgtdir, sysopt['geometry'])) if 'select' in sysopt: atomselect = np.array(uncommadash(sysopt['select'])) M = M.atom_select(atomselect) if self.FF.rigid_water: M.rigid_water() self.engines[sysname] = self.engine_(target=self, mol=M, name=sysname, tinker_key=os.path.join(sysopt['keyfile']), **engine_args)
def __init__(self,options,tgt_opts,forcefield): super(BindingEnergy,self).__init__(options,tgt_opts,forcefield) self.set_option(None, None, 'inter_txt', os.path.join(self.tgtdir,tgt_opts['inter_txt'])) self.global_opts, self.sys_opts, self.inter_opts = parse_interactions(self.inter_txt) # If the global option doesn't exist in the system / interaction, then it is copied over. for opt in self.global_opts: for sys in self.sys_opts: if opt not in self.sys_opts[sys]: self.sys_opts[sys][opt] = self.global_opts[opt] for inter in self.inter_opts: if opt not in self.inter_opts[inter]: self.inter_opts[inter][opt] = self.global_opts[opt] for inter in self.inter_opts: if 'energy_unit' in self.inter_opts[inter] and self.inter_opts[inter]['energy_unit'].lower() not in ['kilocalorie_per_mole', 'kilocalories_per_mole']: logger.error('Usage of physical units is has been removed, please provide all binding energies in kcal/mole\n') raise RuntimeError self.inter_opts[inter]['reference_physical'] = self.inter_opts[inter]['energy'] if tgt_opts['energy_denom'] == 0.0: self.set_option(None, None, 'energy_denom', val=np.std(np.array([val['reference_physical'] for val in self.inter_opts.values()]))) else: self.set_option(None, None, 'energy_denom', val=tgt_opts['energy_denom']) self.set_option(None, None, 'rmsd_denom', val=tgt_opts['rmsd_denom']) self.set_option(tgt_opts,'attenuate') ## LPW 2018-02-11: This is set to True if the target calculates ## a single-point property over several existing snapshots. self.loop_over_snapshots = False logger.info("The energy denominator is: %s\n" % str(self.energy_denom)) logger.info("The RMSD denominator is: %s\n" % str(self.rmsd_denom)) if self.attenuate: denom = self.energy_denom logger.info("Interaction energies more positive than %.1f will have reduced weight going as: 1.0 / (%.1f^2 + (energy-%.1f)^2)\n" % (denom, denom, denom)) ## Build keyword dictionaries to pass to engine. engine_args = OrderedDict(list(self.OptionDict.items()) + list(options.items())) engine_args.pop('name', None) ## Create engine objects. self.engines = OrderedDict() for sysname,sysopt in self.sys_opts.items(): M = Molecule(os.path.join(self.root, self.tgtdir, sysopt['geometry'])) if 'select' in sysopt: atomselect = np.array(uncommadash(sysopt['select'])) M = M.atom_select(atomselect) if self.FF.rigid_water: M.rigid_water() self.engines[sysname] = self.engine_(target=self, mol=M, name=sysname, tinker_key=os.path.join(sysopt['keyfile']), **engine_args)