def mock_force_field(parameters: List[SMIRNOFFParameter]): """Mock a ForceBalance forcefield directory.""" # Create the force field directory. force_field = ForceField("openff-1.2.0.offxml") parameters_to_fit = defaultdict(lambda: defaultdict(list)) for parameter in parameters: parameters_to_fit[parameter.handler][parameter.smirks].append( parameter.attribute) for handler_name in parameters_to_fit: handler = force_field.get_parameter_handler(handler_name) for smirks in parameters_to_fit[handler_name]: openff_parameter = handler.parameters[smirks] attributes_string = ", ".join( parameters_to_fit[handler_name][smirks]) openff_parameter.add_cosmetic_attribute("parameterize", attributes_string) os.makedirs("forcefield", exist_ok=True) force_field.to_file(os.path.join("forcefield", "forcefield.offxml"))
from openforcefield.typing.engines.smirnoff import ForceField ff = ForceField('param_valence.offxml', allow_cosmetic_attributes=True) for handler in ff.registered_parameter_handlers: print(handler) if len(ff[handler].parameters) == 0: continue print(ff[handler].parameters) for par in ff[handler].parameters: if hasattr(par, '_parameterize'): par.delete_cosmetic_attribute('parameterize') #if hasattr(ff[handler].parameters[0], '_parameterize'): #ff[handler].parameters[0].delete_cosmetic_attribute('parameterize') print(ff) #<Proper smirks="[*:1]~[#6X3:2]-[#7X3:3]-[#6X4,#1:4]" periodicity1="2" phase1="180.0 * degree" k1_bondorder1="1*kilocalories_per_mole" k1_bondorder2="10*kilocalories_per_mole" id="TIG9" idivf1="1.0"></Proper> torsionhandler = ff['ProperTorsions'] torsionhandler.add_parameter({ 'smirks': '[*:1]~[*:2]~[*:3]~[*:4]', 'periodicity1': 2, 'phase1': '180.0 * degree', 'k1_bondorder1': '1 * kilocalories_per_mole', 'k1_bondorder2': '1 * kilocalories_per_mole', 'id': 'TIG0', 'idivf1': 1 }) torsionhandler.parameters[-1].add_cosmetic_attribute( 'parameterize', 'k1_bondorder1,k1_bondorder2') ff.to_file('test.offxml')
ff = ForceField() ff._set_aromaticity_model('OEAroModel_MDL') # Loop over the parameters to convert and their corresponding SMIRNOFF header tags for smirnoff_tag, param_dicts in { "Bonds": bond_dicts, "Angles": angle_dicts, "ProperTorsions": proper_dicts, "AmberImproperTorsions": improper_dicts, #'LibraryCharges': charge_dicts, #'vdW': nonbond_dicts }.items(): # Get the parameter handler for the given tag. The # "get_parameter_handler" method will initialize an # empty handler if none exists yet (as is the case here). handler = ff.get_parameter_handler(smirnoff_tag) # Loop over the list of parameter dictionaries, using each one as an input to # handler.add_parameter. This mimics deserializing an OFFXML into a ForceField # object, and will do any sanitization that we might otherwise miss from openforcefield.typing.engines.smirnoff.parameters import DuplicateParameterError for param_dict in param_dicts: try: handler.add_parameter(param_dict) except DuplicateParameterError: continue # Add the ElectrostaticsHandler, with the proper 1-4 scaling factors handler = ff.get_parameter_handler('Electrostatics') # Write the now-populated forcefield out to OFFXML ff.to_file('result_backbone.offxml')
from openforcefield.typing.engines.smirnoff import ForceField from amberimpropertorsionhandler import AmberImproperTorsionHandler ff = ForceField('result_residues.offxml', 'result_backbone.offxml') ff.to_file('result_merged.offxml')
from openforcefield.typing.engines.smirnoff import ForceField ff = ForceField() ff._set_aromaticity_model('OEAroModel_MDL') # Loop over the parameters to convert and their corresponding SMIRNOFF header tags for smirnoff_tag, param_dicts in { "Bonds": bond_dicts, "Angles": angle_dicts, "ProperTorsions": proper_dicts, "AmberImproperTorsions": improper_dicts, 'LibraryCharges': charge_dicts, 'vdW': nonbond_dicts}.items(): # Get the parameter handler for the given tag. The # "get_parameter_handler" method will initialize an # empty handler if none exists yet (as is the case here). handler = ff.get_parameter_handler(smirnoff_tag) # Loop over the list of parameter dictionaries, using each one as an input to # handler.add_parameter. This mimics deserializing an OFFXML into a ForceField # object, and will do any sanitization that we might otherwise miss from openforcefield.typing.engines.smirnoff.parameters import DuplicateParameterError for param_dict in param_dicts: try: handler.add_parameter(param_dict) except DuplicateParameterError: continue # Add the ElectrostaticsHandler, with the proper 1-4 scaling factors handler = ff.get_parameter_handler('Electrostatics') # Write the now-populated forcefield out to OFFXML ff.to_file('result_residues.offxml')