Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
41dafbc
Update Sire development version.
lohedges Feb 17, 2026
7ca8c75
Fix ring-break/change detection logic by using paths only.
lohedges Feb 24, 2026
0d46769
Add unit tests for ring break and size change detection.
lohedges Feb 24, 2026
7ea22b1
Add missing test guards.
lohedges Feb 25, 2026
0a04a75
Merge pull request #502 from OpenBioSim/fix_ring_break_detection
lohedges Feb 25, 2026
fbf972a
Update pre-commit. [ci skip]
lohedges Mar 5, 2026
99cef0d
Autoformat. [ci skip]
lohedges Mar 5, 2026
a8f2515
Added functionality for adding ions to a system.
lohedges Mar 5, 2026
9e22a86
Add ion_conc option to addIons and standardise with solvate.
lohedges Mar 9, 2026
1e67e0b
Clarify ion_conc parameter for addIons function.
lohedges Mar 9, 2026
3385d7f
Allow user to specify counterion.
lohedges Mar 10, 2026
e2f0b9a
Handle intrascale merging for GLYCAM molecules.
lohedges Mar 12, 2026
379e51a
Optimisations for ring breaking / growing checks.
lohedges Mar 13, 2026
9c880ba
Apply intrascale and ring break check optimisations to sandpit.
lohedges Mar 16, 2026
47e6772
Duplicate parameterised merge test in sandpit.
lohedges Mar 16, 2026
5db39f1
Merge pull request #506 from OpenBioSim/fix_glycam
lohedges Mar 18, 2026
db81b4c
Add support for merging CMAP terms.
lohedges Mar 18, 2026
f6c9979
Merge pull request #508 from OpenBioSim/feature_perturbable_cmap
lohedges Mar 18, 2026
c7ae572
Handle normalised lambda and lambda_grad metadata entries.
lohedges Mar 25, 2026
337de4a
Handle normalisation in a backwards compatible way.
lohedges Mar 25, 2026
d107138
Normalise to floats for simplicity.
lohedges Mar 25, 2026
0130f10
Merge pull request #510 from OpenBioSim/fix_lambda_grad_format
lohedges Mar 25, 2026
0908b42
Add backwards compatible normalisation function.
lohedges Mar 26, 2026
74f60d4
Restrict to energy trajectory parquet files.
lohedges Apr 15, 2026
b8ce6c9
Add regression test for ring-breaking intrascale fix.
lohedges Apr 17, 2026
38ed3b3
Merge pull request #513 from OpenBioSim/fix_intrascale_merge
lohedges Apr 17, 2026
5bc1561
Update mergeIntrascale function call.
lohedges Apr 20, 2026
9e5b68f
Add ring-breaking intrascale connectivity regression test.
lohedges Apr 20, 2026
3b50ecc
Merge pull request #514 from OpenBioSim/fix_ring_break_merge
lohedges Apr 20, 2026
945cc85
Add missing test guards.
lohedges Apr 20, 2026
dc85557
Formatting tweak. [ci skip]
lohedges Apr 20, 2026
d074644
Add workaround for Windows ROI merge performance issue.
lohedges Apr 20, 2026
28a1c27
Switch to simplified patchIntrascale wrapper function.
lohedges Apr 20, 2026
844f7ab
Write SOMD1 and SOMD2 input. [ci skip]
lohedges Apr 22, 2026
24a9144
Merge pull request #516 from OpenBioSim/feature_somd2_preparefep
lohedges Apr 23, 2026
4355ec1
Cleanup cross-bond terms for ring-breaking merges.
lohedges May 7, 2026
ab412bf
Merge pull request #517 from OpenBioSim/fix_ring_break_merge
lohedges May 7, 2026
d7d3fc8
Skip pyarrow test on Windows.
lohedges May 7, 2026
9410577
Store ring-breaking and ring-making bond pairs as molecule properties.
lohedges May 8, 2026
f97ae7a
Merge branch 'feature_add_ions' into feature_ring_break_softcore
lohedges May 12, 2026
769a957
Merge pull request #518 from OpenBioSim/feature_ring_break_softcore
lohedges May 13, 2026
9934335
Filter pairs to remove ghost atoms.
lohedges May 14, 2026
8e9c6ba
Expose max_path and max_ring_size kwargs.
lohedges Jun 15, 2026
329cf76
Merge pull request #520 from OpenBioSim/fix_519
lohedges Jun 15, 2026
7a3acf9
Try pinning to a recent openff-interchange-base.
lohedges Jun 26, 2026
f4804c0
Use pre-parameterised inputs to avoid SQM issue.
lohedges Jun 26, 2026
c0193ed
Conditionally pin for Python 3.11+.
lohedges Jun 26, 2026
90a479e
OpenFF requires setuptools for Python 3.10.
lohedges Jun 26, 2026
dde861c
Add guard.
lohedges Jun 26, 2026
10e0835
Pin setuptools to <82.
lohedges Jun 26, 2026
07765cb
Merge pull request #524 from OpenBioSim/fix_523
lohedges Jun 26, 2026
1853596
Add support for custom region of interest mapping in matchAtoms function
akalpokas Jun 25, 2026
4343bed
Update protein mutation tutorial with a proline mutation case
akalpokas Jun 25, 2026
77c4bc1
Polish formatting within the rendered protein fep tutorial
akalpokas Jun 25, 2026
d3dab96
blacken
akalpokas Jun 25, 2026
c56600d
Add pytest guard to avoid running test_custom_roi_ring_break_merge if…
akalpokas Jun 26, 2026
6fe7759
Address requested changes regarding custom_roi_mapping
akalpokas Jun 29, 2026
86174cb
Merge pull request #522 from akalpokas/feature_custom_ROI_maps
lohedges Jun 29, 2026
7e51432
Merge branch 'main' into release_2026.1.0
lohedges Jun 29, 2026
f9c4bed
Update Sire version.
lohedges Jun 29, 2026
5b7c748
Update CHANGELOG.
lohedges Jun 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion doc/source/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,25 @@ company supporting open-source development of fostering academic/industrial coll
within the biomolecular simulation community. Our software is hosted via the `OpenBioSim`
`GitHub <https://github.com/OpenBioSim/biosimspace>`__ organisation.

`2026.1.0 <https://github.com/openbiosim/biosimspace/compare/2025.4.0...2026.1.0>`_ - Jun 29 2026
-------------------------------------------------------------------------------------------------

* Improve ring break and size change detection during molecule merging (`#502 <https://github.com/OpenBioSim/biosimspace/pull/502>`__).
* Add support for merging molecules with non-default intramolecular scaling factors (`#506 <https://github.com/OpenBioSim/biosimspace/pull/506>`__).
* Add support for perturbable CMAP terms during molecule merging (`#508 <https://github.com/OpenBioSim/biosimspace/pull/508>`__).
* Normalise ``SOMD2`` Parquet file metadata to avoid rounding issues (`#510 <https://github.com/OpenBioSim/biosimspace/pull/510>`__).
* Update the ``prepareFEP`` helper script to generate ``SOMD1`` and ``SOMD2`` inputs simultaneously (`#516 <https://github.com/OpenBioSim/biosimspace/pull/516>`__).
* Remove cross-bond angle and torsion terms for ring-making/breaking perturbations (`#517 <https://github.com/OpenBioSim/biosimspace/pull/517>`__).
* Added functionaltiy for adding ions to an existing system (`#518 <https://github.com/OpenBioSim/biosimspace/pull/518>`__).
* Expose the ``max_path`` and ``max_ring_size`` kwargs used for ring break and size change detection in the :func:`BioSimSpace.Align.generateNetwork <BioSimSpace.Align.merge>` function (`#520 <https://github.com/OpenBioSim/biosimspace/pull/520>`__).
* Add support for user-defined "region-of-interest" merges (`#522 <https://github.com/OpenBioSim/biosimspace/pull/522>`__).
* Add pins to handle OpenForceField Python version deprecations (`#524 <https://github.com/OpenBioSim/biosimspace/pull/524>`__).

`2025.4.0 <https://github.com/openbiosim/biosimspace/compare/2025.3.0...2025.4.0>`_ - Feb 17 2026
-------------------------------------------------------------------------------------------------

* Fixed centre of mass restraints for alchemical transfer method (ATM) simulations (`@mb2055 <https://github.com/mb2055>`__) (`#471 <https://github.com/OpenBioSim/biosimspace/pull/471>`__).
* Add experimental :class:`ReplicaSystem` class to speed up handling of replica exchange simulations (`#473 <https://github.com/OpenBioSim/biosimspace/pull/473>`__).
* Add experimental :class:`ReplicaSystem` class to speed up handling of replica exchange simulations (`#473 <https://github.com/OpenBioSim/biosimspace/pull/473>`__).
* Removed lazy imports from sub-modules that don't use Sire (`#475 <https://github.com/OpenBioSim/biosimspace/pull/475>`__).
* Allow translation of a custom ``coordinates`` property for perturbable molecules (`#477 <https://github.com/OpenBioSim/biosimspace/pull/477>`__).
* Added a kwarg to make zeroing of LJ sigma values for ghost atoms optional (`#482 <https://github.com/OpenBioSim/biosimspace/pull/482>`__).
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
168 changes: 167 additions & 1 deletion doc/source/tutorials/protein_mutations.rst
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ figure out the residue index of our residue of interest (ROI):

We can see that the residue with the index value of 8 are different
between the two proteins. Let’s pass this value to the
```BioSimSpace.Align.matchAtoms`` <https://biosimspace.openbiosim.org/api/generated/BioSimSpace.Align.matchAtoms.html#BioSimSpace.Align.matchAtoms>`__
`BioSimSpace.Align.matchAtoms <https://biosimspace.openbiosim.org/api/generated/BioSimSpace.Align.matchAtoms.html>`__
function:

.. code:: ipython3
Expand Down Expand Up @@ -398,3 +398,169 @@ simulations <https://github.com/OpenBioSim/biosimspace_tutorials/tree/main/04_fe
solvated_system = BSS.Solvent.tip3p(molecule=merged_system, box=box, angles=angles, ion_conc=0.15)

BSS.IO.saveMolecules("holo_aldose_reductase_v47i", solvated_system, ["gro87", "grotop"])

Advanced Case - Bond Creation/Annihilation Transformations
==========================================================

In this tutorial we will use BioSimSpace’s mapping functionality to set
up alchemical calculations involving proline mutations in a protein.
Specifically, we will look at the Leu-to-Pro mutations in OMTKY3 to its
receptors as `detailed in this
study <https://pubs.acs.org/doi/full/10.1021/acs.jctc.1c00214>`__.

.. code:: ipython3

wt = BSS.IO.readMolecules(
BSS.IO.expand(BSS.tutorialUrl(), f"1choFH_apo_wt_flare_processed.pdb")
)[0]
mut = BSS.IO.readMolecules(
BSS.IO.expand(BSS.tutorialUrl(), f"1choFH_apo_mut_flare_processed.pdb")
)[0]

wt = BSS.Parameters.ff14SB(wt, ensure_compatible=False).getMolecule()
mut = BSS.Parameters.ff14SB(mut, ensure_compatible=False).getMolecule()



Comparing the residues between two proteins shows us that the residues
at index 15 are different between the proteins

.. code:: ipython3

roi = []
for i, res in enumerate(wt.getResidues()):
if res.name() != mut.getResidues()[i].name():
print(res, mut.getResidues()[i])
roi.append(res.index())


.. parsed-literal::

<BioSimSpace.Residue: name='LEU', molecule=5, index=15, nAtoms=19> <BioSimSpace.Residue: name='PRO', molecule=7, index=15, nAtoms=14>


By default, the
`BioSimSpace.Align.matchAtoms <https://biosimspace.openbiosim.org/api/generated/BioSimSpace.Align.matchAtoms.html>`__
would fail to create a mapping for the ROI region, as the underlying
RDKit MCS algorithm would be unable to determine a mapping between two
molecular graphs with a fundamental topological mismatch. Because
Proline’s sidechain forms a cyclic system with the backbone, its atoms
exist in a ring topology. The algorithm restricts the mapping of cyclic
atoms to acyclic atoms (a behavior governed by parameters like
``ringMatchesRingOnly``) to preserve the chemical integrity of the
substructure. Consequently, a 1:1 mapping between the ring-bound
sidechain of Proline and the acyclic sidechain of the Leucine residue
cannot be determined.

Instead we can use the ``custom_roi_map`` argument of the
`BioSimSpace.Align.matchAtoms <https://biosimspace.openbiosim.org/api/generated/BioSimSpace.Align.matchAtoms.html>`__
to override the RDKit MCS mapping. For example we can force an empty
mapping between the two residues:

.. code:: ipython3

mapping = BSS.Align.matchAtoms(molecule0=wt, molecule1=mut, roi=[15], custom_roi_map={})

.. code:: ipython3

BSS.Align.viewMapping(wt, mut, mapping, roi=15, pixels=500)



.. image:: images/custom_roi_no_map.png
:width: 800


If we know the correct 1:1 atom mapping between the two residues, we can
pass that to the ``custom_roi_map`` which will allows us to setup an
alchemical bond transformation for mutating the leucine residue to
proline. Note that **absolute atom indices need to be passed, i.e the
indices of the residues in the context of the whole protein**. We can
use something like PyMol to help us map the atoms in the right order:

.. image:: images/1choFH_mapping_pymol.png
:width: 800

.. code:: ipython3

mapping = BSS.Align.matchAtoms(molecule0=wt, molecule1=mut, roi=[15], custom_roi_map={204:204,205:205,203:203,202:202,211:208,206:206,213:210,207:207,214:211,210:213})

.. code:: ipython3

BSS.Align.viewMapping(wt, mut, mapping, roi=15, pixels=500)



.. image:: images/custom_roi_ring_break_map.png
:width: 800


We can then use ``allow_ring_breaking=True`` argument of the
`BioSimSpace.Align.merge <https://biosimspace.openbiosim.org/api/generated/BioSimSpace.Align.merge.html>`__
to create the required alchemical transformation:

.. code:: ipython3

aligned_wt = BSS.Align.rmsdAlign(molecule0=wt, mapping=mapping, molecule1=mut)
merged_protein = BSS.Align.merge(aligned_wt, mut, mapping, allow_ring_breaking=True, roi=[15])

But how do we actually know that the merge has built a perturbable
molecule that now has a bond annihilation or creation involved? We can
use Sire’s conversion features to check what kinds of alchemical
modifications are happening in our perturbable molecule. You can check
out the corresponding `Sire
tutorial <https://sire.openbiosim.org/tutorial/part07/04_merge.html>`__
for more details.

.. code:: ipython3

merged_protein_sire = merged_protein._sire_object
pert = merged_protein_sire.perturbation()
pert_omm = pert.to_openmm(map={"coordinates":"coordinates0"})

pert_omm.changed_bonds(to_pandas=True)





.. raw:: html

<div>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>bond</th>
<th>length0</th>
<th>length1</th>
<th>k0</th>
<th>k1</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>N:203-H:211</td>
<td>0.1010</td>
<td>0.1449</td>
<td>363171.2</td>
<td>282001.6</td>
</tr>
<tr>
<th>1</th>
<td>CG:208-H:211</td>
<td>0.1526</td>
<td>0.1526</td>
<td>0.0</td>
<td>259408.0</td>
</tr>
</tbody>
</table>
</div>



By comparing the ``k0`` and ``k1`` values in the changed bond dataframe,
we can see that the transformation is going to result in a bond being
created.
Loading
Loading