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 @@
+