Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
36962ef
Update version and CHANGELOG for 2026.2.0 development.
lohedges Jun 29, 2026
97ad3fa
Fix restraint pickling and sire.mm/mol circular import ordering.
lohedges Jul 1, 2026
5ed76a0
Merge pull request #454 from OpenBioSim/fix_453
lohedges Jul 1, 2026
ebd0e09
Add optional restricted-bending angle potential to Boresch restraints.
lohedges Jul 1, 2026
7560b0b
Add sire.restraints.boresch_search() for automatic Boresch restraint …
lohedges Jul 2, 2026
7fce3e5
Fix print formatting error.
lohedges Jul 2, 2026
d6cb589
Add restraint_lever option to BoreschRestraints for staged RXRX turn-on.
lohedges Jul 2, 2026
f3b7c04
Merge pull request #456 from OpenBioSim/feature_restricted_bending
lohedges Jul 2, 2026
148e338
Fix NaN in restricted_bending Boresch restraint when angle term scale…
lohedges Jul 4, 2026
5307732
Restraint search returns the least strained structure.
lohedges Jul 4, 2026
a165d42
Fix anchor atom sorting issue in Boresch restraint.
lohedges Jul 4, 2026
a9a0f94
Allow a dynamics object to propagate several independent trajectories.
lohedges Jul 27, 2026
22f60f2
Merge pull request #458 from OpenBioSim/feature_dynamics_cache
lohedges Jul 28, 2026
b01a46b
Add note on cuda-version pinning. [ci skip]
lohedges Jul 28, 2026
501104f
Reimplement lazy importing using importlib.
lohedges Jul 10, 2026
19e4934
Merge pull request #459 from OpenBioSim/fix_biosimspace_545
lohedges Aug 5, 2026
87e3b42
Fix lazy loading of submodules without __all__.
lohedges Aug 5, 2026
bf18e37
Document importlib.reload() limits for lazily-loaded modules.
lohedges Aug 5, 2026
f7f30dd
Fix "double - Complex" subtraction operator. [closes #457]
lohedges Aug 24, 2026
168c1ba
Fix dangling else in setAmberWater/setGromacsWater. [closes #462]
lohedges Aug 24, 2026
2436b1b
Merge pull request #461 from OpenBioSim/fix_457
lohedges Aug 24, 2026
44b76ba
Add determine_bond_orders kwarg to Sire-RDKit conversion function.
lohedges Aug 26, 2026
35efd4a
Merge pull request #465 from OpenBioSim/fix_464
lohedges Aug 26, 2026
9238a0b
Fix issues with multi-molecule REST2 selections.
lohedges Aug 27, 2026
2bd50fe
Remove kwarg from generic .to() method.
lohedges Aug 27, 2026
0b8dd33
Use a set for REST2 atom indices to avoid quadratic membership tests.
lohedges Aug 27, 2026
cadbadc
Add tests for additive and narrowing REST2 selection semantics.
lohedges Aug 27, 2026
6c09d79
Add missing <cstdlib> includes for std::getenv and std::exit.
lohedges Aug 27, 2026
4c75e04
Merge pull request #467 from OpenBioSim/fix_somd2_197
lohedges Aug 27, 2026
0ad7abc
Fix REST2 mask sizing so virtual sites inherit their parent atom's flag.
lohedges Aug 28, 2026
376e9a6
Put virtual sites on non-ghost parents in the non-ghost softcore group.
lohedges Aug 28, 2026
d1aeaff
Merge pull request #470 from OpenBioSim/fix_469
lohedges Aug 28, 2026
ae95d59
Fix typos and inconsistencies. [ci skip]
lohedges Sep 1, 2026
6689d89
Clear the context energy cache after every dynamics block.
lohedges Sep 4, 2026
8c43d7d
Merge pull request #473 from OpenBioSim/fix_472
lohedges Sep 4, 2026
90647b6
Stop test_crash_report swallowing its own assertion failures. [ci skip]
lohedges Sep 4, 2026
1d3960f
Fix data race in AmberParams::validateAndFix() that segfaulted OpenMM…
lohedges Sep 4, 2026
a51ecdd
Merge pull request #476 from OpenBioSim/fix_475
lohedges Sep 4, 2026
5c9bd4b
Fix GROMACS CMAP units.
lohedges Sep 7, 2026
ace6af0
Merge pull request #479 from OpenBioSim/fix_478
lohedges Sep 7, 2026
e85125f
Force crash in test_crash_report with an oversized timestep. [ci skip]
lohedges Sep 7, 2026
f58b038
Release GIL for duration of setLambda.
lohedges Sep 8, 2026
0da99f6
Comment limitations of GIL release policy.
lohedges Sep 8, 2026
535fab1
Merge pull request #481 from OpenBioSim/feature_scoped_gil_release
lohedges Sep 9, 2026
d7051f1
Merge branch 'main' into release_2026.2.0
lohedges Sep 14, 2026
de32ed6
Update version.
lohedges Sep 14, 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
33 changes: 25 additions & 8 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ It is used as a key component of `BioSimSpace <https://biosimspace.org>`__,
and is distributed and supported as an open source community project by
`OpenBioSim <https://openbiosim.org>`__.

For more information about how to use Sire, and about application
built with Sire, please `visit the Sire website <https://sire.openbiosim.org>`__.
For more information about how to use sire, and about applications
built with sire, please `visit the sire website <https://sire.openbiosim.org>`__.

* `Features <https://sire.openbiosim.org/features.html>`__
* `Quick start guide <https://sire.openbiosim.org/quickstart/index.html>`__
Expand All @@ -46,7 +46,7 @@ built with Sire, please `visit the Sire website <https://sire.openbiosim.org>`__
Installation
============

The easiest way to install Sire is using our `conda channel <https://anaconda.org/openbiosim/repo>`__.
The easiest way to install sire is using our `conda channel <https://anaconda.org/openbiosim/repo>`__.
Sire is built using dependencies from `conda-forge <https://conda-forge.org/>`__,
so please ensure that the channel takes strict priority. We recommend using
`miniforge3 <https://github.com/conda-forge/miniforge#miniforge3>`__.
Expand Down Expand Up @@ -135,7 +135,9 @@ Other pixi environments are available depending on your needs:
* ``pixi install -e default`` - core sire dependencies only
* ``pixi install -e obs`` - include downstream OpenBioSim package dependencies
* ``pixi install -e emle`` - include `emle-engine <https://github.com/chemle/emle-engine>`__ dependencies
* ``pixi install -e dev`` - all of the above plus test dependencies
* ``pixi install -e test`` - include test dependencies
* ``pixi install -e full`` - include both the ``obs`` and ``emle`` dependencies
* ``pixi install -e dev`` - all of the above, plus linting tools

Any additional startup commands can be specified in the ``pixi.sh`` file
in the root of the sire repository. This file is automatically sourced when
Expand All @@ -153,13 +155,28 @@ this:
pixi shell -e dev
ln -s /etc/OpenCL/vendors "${CONDA_PREFIX}/etc/OpenCL/vendors/ocl-icd-system"

Note that we don't pin ``cuda-version`` in ``pixi.toml``, which is pulled in
as a transitive dependency of OpenMM. This means that the version you end up
with might not be compatible with the CUDA driver installed on your system. If
you need a specific version, then add it to the ``[dependencies]`` section of
``pixi.toml`` before creating the environment, e.g.:

.. code-block:: toml

[dependencies]
cuda-version = "==12.6"

This is intended as a local development tweak only and shouldn't be committed,
since ``actions/generate_recipe.py`` reads the ``[dependencies]`` section when
generating the conda recipe, so the pin would also end up in our packages.

Support and Development
=======================

Bugs, Comments, Questions
-------------------------
For bug reports/suggestions/complaints please file an issue on
`GitHub <http://github.com/OpenBioSim/sire/issues>`__.
`GitHub <https://github.com/OpenBioSim/sire/issues>`__.

Developers guide
----------------
Expand All @@ -184,14 +201,14 @@ a consistent style without a blanket one-time reformatting.

GitHub actions
--------------
Since sire is quite large, a build can take quite long and might not be neccessary
if a commit is only fixing a couple of typos. Simply add ``ci skip``
Since sire is quite large, a build can take quite a long time and might not be
necessary if a commit is only fixing a couple of typos. Simply add ``ci skip``
to your commit message and GitHub actions will not invoke an autobuild.

Note that every time you commit to devel, it will trigger a build of sire,
full testing, construction of a Conda package and upload to our Anaconda
channel. Please think twice before committing directly to devel. You should
ideally be working in a _feature_ branch, and only commit to devel once you are
ideally be working in a *feature* branch, and only commit to devel once you are
happy the code works on your branch. Use ``ci skip`` until you are happy that
you want to trigger a full build, test and deployment. This full pipeline will
take several hours to complete.
Expand Down
1 change: 0 additions & 1 deletion actions/generate_recipe.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@

RUN_DEPS = {
"gsl",
"lazy_import",
"libnetcdf",
"openmm",
"pandas",
Expand Down
97 changes: 81 additions & 16 deletions corelib/src/libs/SireMM/boreschrestraints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,7 @@ QDataStream &operator>>(QDataStream &ds, BoreschRestraint &borrest)
{
SharedDataStream sds(ds);

sds >> borrest.receptor_atms >> borrest.ligand_atms >> borrest._r0
>> borrest._theta0 >> borrest._phi0 >> borrest._kr >> borrest._ktheta
>> borrest._kphi >> static_cast<Property &>(borrest);
sds >> borrest.receptor_atms >> borrest.ligand_atms >> borrest._r0 >> borrest._theta0 >> borrest._phi0 >> borrest._kr >> borrest._ktheta >> borrest._kphi >> static_cast<Property &>(borrest);
}
else
throw version_error(v, "1", r_borrest, CODELOC);
Expand Down Expand Up @@ -285,7 +283,7 @@ QString BoreschRestraint::toString() const
.arg(k.join(", "))
.arg(_r0.toString())
.arg(t.join(", "))
.arg(p.join(', '));
.arg(p.join(", "));
}
}

Expand Down Expand Up @@ -345,11 +343,11 @@ static const RegisterMetaType<BoreschRestraints> r_borrests;

QDataStream &operator<<(QDataStream &ds, const BoreschRestraints &borrests)
{
writeHeader(ds, r_borrests, 2);
writeHeader(ds, r_borrests, 3);

SharedDataStream sds(ds);

sds << borrests.r << borrests.use_pbc
sds << borrests.r << borrests.use_pbc << borrests.angle_potential << borrests.restraint_lever
<< static_cast<const Restraints &>(borrests);

return ds;
Expand All @@ -364,16 +362,29 @@ QDataStream &operator>>(QDataStream &ds, BoreschRestraints &borrests)
SharedDataStream sds(ds);

sds >> borrests.r >> static_cast<Restraints &>(borrests);

borrests.use_pbc = false;
borrests.angle_potential = "harmonic";
borrests.restraint_lever = "combined";
}
else if (v == 2)
{
SharedDataStream sds(ds);

sds >> borrests.r >> borrests.use_pbc
>> static_cast<Restraints &>(borrests);
sds >> borrests.r >> borrests.use_pbc >> static_cast<Restraints &>(borrests);

borrests.angle_potential = "harmonic";
borrests.restraint_lever = "combined";
}
else if (v == 3)
{
SharedDataStream sds(ds);

sds >> borrests.r >> borrests.use_pbc >> borrests.angle_potential >> borrests.restraint_lever >>
static_cast<Restraints &>(borrests);
}
else
throw version_error(v, "1,2", r_borrests, CODELOC);
throw version_error(v, "1,2,3", r_borrests, CODELOC);

return ds;
}
Expand Down Expand Up @@ -426,7 +437,8 @@ BoreschRestraints::BoreschRestraints(const QString &name,
}

BoreschRestraints::BoreschRestraints(const BoreschRestraints &other)
: ConcreteProperty<BoreschRestraints, Restraints>(other), r(other.r), use_pbc(other.use_pbc)
: ConcreteProperty<BoreschRestraints, Restraints>(other), r(other.r), use_pbc(other.use_pbc),
angle_potential(other.angle_potential), restraint_lever(other.restraint_lever)
{
}

Expand All @@ -438,14 +450,17 @@ BoreschRestraints &BoreschRestraints::operator=(const BoreschRestraints &other)
{
r = other.r;
use_pbc = other.use_pbc;
angle_potential = other.angle_potential;
restraint_lever = other.restraint_lever;
Restraints::operator=(other);
return *this;
}

bool BoreschRestraints::operator==(const BoreschRestraints &other) const
{
return r == other.r and Restraints::operator==(other) and
use_pbc == other.use_pbc;
use_pbc == other.use_pbc and angle_potential == other.angle_potential and
restraint_lever == other.restraint_lever;
}

bool BoreschRestraints::operator!=(const BoreschRestraints &other) const
Expand Down Expand Up @@ -499,11 +514,14 @@ QString BoreschRestraints::toString() const
}
}

return QObject::tr("BoreschRestraints( name=%1, size=%2, use_pbc=%3\n%4\n)")
.arg(this->name())
.arg(n)
.arg(this->use_pbc ? "true" : "false")
.arg(parts.join("\n"));
return QObject::tr("BoreschRestraints( name=%1, size=%2, use_pbc=%3, angle_potential=%4, "
"restraint_lever=%5\n%6\n)")
.arg(this->name())
.arg(n)
.arg(this->use_pbc ? "true" : "false")
.arg(this->angle_potential)
.arg(this->restraint_lever)
.arg(parts.join("\n"));
}

/** Return whether or not this is empty */
Expand Down Expand Up @@ -610,3 +628,50 @@ bool BoreschRestraints::usesPbc() const
{
return this->use_pbc;
}

/** Set the functional form used for the two Boresch angle restraint terms.
* Must be either "harmonic" (the default) or "restricted_bending". */
void BoreschRestraints::setAnglePotential(const QString &angle_potential)
{
if (angle_potential != "harmonic" and angle_potential != "restricted_bending")
{
throw SireError::invalid_arg(QObject::tr(
"'angle_potential' must be either 'harmonic' or "
"'restricted_bending', got '%1'.")
.arg(angle_potential),
CODELOC);
}

this->angle_potential = angle_potential;
}

/** Return the functional form used for the two Boresch angle restraint terms,
* either "harmonic" or "restricted_bending". */
QString BoreschRestraints::anglePotential() const
{
return this->angle_potential;
}

/** Set how the restraint's six degrees of freedom are grouped into
* lambda-addressable OpenMM Forces. Must be either "combined" (the
* default) or "split". */
void BoreschRestraints::setRestraintLever(const QString &restraint_lever)
{
if (restraint_lever != "combined" and restraint_lever != "split")
{
throw SireError::invalid_arg(QObject::tr(
"'restraint_lever' must be either 'combined' or "
"'split', got '%1'.")
.arg(restraint_lever),
CODELOC);
}

this->restraint_lever = restraint_lever;
}

/** Return how the restraint's six degrees of freedom are grouped into
* lambda-addressable OpenMM Forces, either "combined" or "split". */
QString BoreschRestraints::restraintLever() const
{
return this->restraint_lever;
}
23 changes: 23 additions & 0 deletions corelib/src/libs/SireMM/boreschrestraints.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,12 +197,35 @@ namespace SireMM
void setUsesPbc(bool use_pbc);
bool usesPbc() const;

void setAnglePotential(const QString &angle_potential);
QString anglePotential() const;

void setRestraintLever(const QString &restraint_lever);
QString restraintLever() const;

private:
/** The actual list of restraints*/
QList<BoreschRestraint> r;

/** Whether the restraints use periodic boundary conditions */
bool use_pbc = false;

/** The functional form used for the two Boresch angle restraint
* terms (thetaA, thetaB). Either "harmonic" (default) or
* "restricted_bending" - the latter uses
* k*(cos(theta)-cos(theta0))^2/sin(theta)^2, which diverges as
* theta approaches 0 or pi, preventing the restraint angles from
* ever reaching the Boresch collinearity singularity. */
QString angle_potential = "harmonic";

/** How the restraint's six degrees of freedom are grouped into
* lambda-addressable OpenMM Forces. Either "combined" (default,
* all six terms share a single scale factor / lever) or "split"
* (the distance and two angle terms share one scale factor, the
* three dihedral terms share a second, independent scale factor -
* allowing them to be turned on according to different lambda
* schedules). */
QString restraint_lever = "combined";
};

}
Expand Down
6 changes: 0 additions & 6 deletions doc/source/acknowledgements.rst
Original file line number Diff line number Diff line change
Expand Up @@ -475,12 +475,6 @@ The header documentation reads;
imshow does not plot axis yet.
make a correct documentation

lazy_import
-----------

:mod:`sire` uses `lazy_import <https://github.com/mnmelo/lazy_import>`__ to
lazy load the modules. This is licensed under the GPLv3.

rich
----

Expand Down
Loading
Loading