diff --git a/CHANGELOG.md b/CHANGELOG.md index 1339faf7..7a6c377a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ The rules for this file: talagayev ### Added +- Addition of force field version selection for `GAFF` & `SMINROFF` (2025-12-15, PR #169) - Addition of `CHARM2024` forcefield (2025-11-03, PR #163) ### Fixed diff --git a/openmmdl/openmmdl_setup/openmmdlsetup.py b/openmmdl/openmmdl_setup/openmmdlsetup.py index 94d17b39..70b6c5fa 100644 --- a/openmmdl/openmmdl_setup/openmmdlsetup.py +++ b/openmmdl/openmmdl_setup/openmmdlsetup.py @@ -107,6 +107,12 @@ def configureFiles(): session["ml_forcefield"] = request.form.get("ml_forcefield", "") session["waterModel"] = request.form.get("waterModel", "") session["smallMoleculeForceField"] = request.form.get("smallMoleculeForceField", "") + smallMoleculeFF = session["smallMoleculeForceField"] + if smallMoleculeFF == "smirnoff": + session["smallMoleculeForceFieldVersion"] = request.form.get("openffVersion", "") + else: + # Treat "" the same as GAFF (because GAFF is your UI default) + session["smallMoleculeForceFieldVersion"] = request.form.get("gaffVersion", "") session["ligandMinimization"] = request.form.get("ligandMinimization", "") session["ligandSanitization"] = request.form.get("ligandSanitization", "") session["sdfFile"] = uploadedFiles["sdfFile"][0][1] @@ -1069,6 +1075,7 @@ def write(self, string): script.append('ligand_name = "UNK"') script.append("minimization = %s" % session["ligandMinimization"]) script.append("smallMoleculeForceField = '%s'" % session["smallMoleculeForceField"]) + script.append("smallMoleculeForceFieldVersion = '%s'" % session["smallMoleculeForceFieldVersion"]) script.append("sanitization = %s" % session["ligandSanitization"]) water = session["waterModel"] elif fileType == "amber": @@ -1305,8 +1312,8 @@ def write(self, string): model_water = water_model_selection(water=water,forcefield_selection=ff_selection(ff)) print("Forcefield and Water Model Selected") if add_membrane: - transitional_forcefield = generate_transitional_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, rdkit_mol=ligand_prepared) -forcefield = generate_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, rdkit_mol=ligand_prepared) + transitional_forcefield = generate_transitional_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, smallMoleculeForceFieldVersion=smallMoleculeForceFieldVersion, rdkit_mol=ligand_prepared) +forcefield = generate_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, smallMoleculeForceFieldVersion=smallMoleculeForceFieldVersion, rdkit_mol=ligand_prepared) complex_topology, complex_positions = merge_protein_and_ligand(protein_pdb, omm_ligand) print("Complex topology has", complex_topology.getNumAtoms(), "atoms.") """ ) @@ -1319,16 +1326,16 @@ def write(self, string): model_water = water_model_selection(water=water,forcefield_selection=ff_selection(ff)) print("Forcefield and Water Model Selected") if water_selected != None: - forcefield = generate_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, rdkit_mol=None) + forcefield = generate_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, smallMoleculeForceFieldVersion=smallMoleculeForceFieldVersion, rdkit_mol=None) else: forcefield = app.ForceField(forcefield_selected) if add_membrane: - transitional_forcefield = generate_transitional_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, rdkit_mol=None) """ + transitional_forcefield = generate_transitional_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, smallMoleculeForceFieldVersion=smallMoleculeForceFieldVersion, rdkit_mol=None) """ ) if session["sdfFile"] == "": script.append( """ -forcefield = generate_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, rdkit_mol=None) +forcefield = generate_forcefield(protein_ff=forcefield_selected, solvent_ff=water_selected, add_membrane=add_membrane, smallMoleculeForceField=smallMoleculeForceField, smallMoleculeForceFieldVersion=smallMoleculeForceFieldVersion, rdkit_mol=None) modeller = app.Modeller(protein_pdb.topology, protein_pdb.positions) if add_membrane: membrane_builder(ff, model_water, forcefield, transitional_forcefield, protein_pdb, modeller, membrane_lipid_type, membrane_padding, membrane_positive_ion, membrane_negative_ion, membrane_ionicstrength, protein) diff --git a/openmmdl/openmmdl_setup/templates/configurePdbFile.html b/openmmdl/openmmdl_setup/templates/configurePdbFile.html index 9403e9f3..b2df7387 100644 --- a/openmmdl/openmmdl_setup/templates/configurePdbFile.html +++ b/openmmdl/openmmdl_setup/templates/configurePdbFile.html @@ -54,6 +54,29 @@ + + + + +