Posts for the month of October 2025

Saturate and Bondify

The one action I use the most is "saturate-atoms". You select a number of atoms and then activate it: It will add hydrogen atoms including bonds to each selected atom depending on the remaining valence of the atom.

In the following images I have added an oxygen atom and used saturate-atoms: once with "outer shell" option activate, the second time without.

saturate-atoms actions, before outer-shell saturate-atoms actions, after outer-shell saturate-atoms actions, before no outer-shell saturate-atoms actions, after no outer-shell

You see that using "outer shell", two hydrogens are added in approximately the typical bond angle for a water molecule. Without the option, it's also two hydrogens but they are no longer added in the typical angle. In the first case, molecuilder is aware that there are 4 orbitals in the outer shell, two of which are unoccupied. Hence, it finds two empty spots in the corners of a tetrahedron, resulting in the typical angle. In the latter case, there are two orbitals to fill and without any knowledge about the outer shell, molecuilder simply adds the hydrogens with greatest spatial separation to each other. Therefore, they lie on a line with the oxygen atom in the middle.

Note that in v1.7.0 the internal polyhedra have been improved and the saturate action should be even more useful. For example, it is used at the core of walking-organic-chemical-space's algorithm.

---

Additionally, there is now also an action for the opposite effect: bondify-atoms.

This action will look for atoms in the vicinity of tabulated bonding distances (see data/bondtables/bondtable.dat) given some slack ([-0.4, 0.4] angstroem) and replaces up to as many hydrogens as stated in the action's option and replaces it with a bond to the atom that bonded to the hydrogen.

In the following image we have a carbon atom, fully saturated with four hydrogen atoms bonded to it and one lone carbon atom without bonds: If we then call "bondify-atoms" on the lone carbon requesting to remove up to one, two or three hydrogens, then we see that as many hydrogens are removed from the neighboring saturated carbon atoms and they are replaced by a single, double or triple bond to the lone carbon atom.

bondify-atoms action, before bondify-atoms action, single bond bondify-atoms action, double bond bondify-atoms action, triple bond

Version v1.7.0 Makes Empirical Potentials First-Class Citizens

It's been 7 years since the last version was released: Now v1.7.0 is out! (see docker, source tarballs, and handbook)

(NOTE: ... and it sadly had an awful bug that made the GUI almost unusable. Please use v1.7.1! )

I was working on walking the chemical space and subsequently on fixing so called "compound potentials" from ab-initio calculations. This necessitated some changes and also fixes which you find in a bit more detail below.

I plan to follow-up till the end of the year with a series of small posts where I highlight the more important changes. I want to end the series with a detailed explanation on how to fit your own set of empirical potentials for a given molecular system. Note that there are projects like https://openkim.org/ whose goal is to create a database of potential parameters that have been tested in deriving specific macroscopic quantities. I see the potentials more as a mean of saving computational effort: As the BOSSANOVA fragmentation approach is at the core of molecuilder, we end up running a lot of repetitive computations whose result we already know. In principle, the Born-Oppenheimer Surface (BOS) whose dynamics we compute can be very complex (narrow tunnels or deep potential holes). However, the empirical potentials keep it simple and we rely on the assumption that interactions are simple but their combined effects can be complex, i.e., it's the geometry that causes complexity.

List of Changes

Major

  • saturate (fixes to polyhedra and scaling) and bondify (new)
  • potentials are first class citizens
  • proper path from molecule, to automated fragmentation, computation, homologies and finally potential training (and visualizing in the UI).
  • convenience changes in the UI: bigger icons, context menu in gl view, potential tab with plotting
  • enhancements to python scripting: numpy compatibility, wait returns status, python3
  • works inside jupyter notebooks.
  • can be deployed to k8s for large-scale computations.
  • graph6 strings, evaluating stability and chemical space evaluation
  • more selection actions

Minor

  • switch to simpler kubernetes-aimed worker-server setup (health probes, workers don't register but accessed through load balancer)
  • potential list shown in UI, new actions to add and remove, also potential curves are plotted in UI
  • general fixes to potential setup to make them work as compound potentials
  • undomark action
  • context menu (right-click) in gl view to manipulate atoms directly
  • docker file contained in repo
  • bondify has undo/redo
  • switched all python to python3
  • graph6 fixes and writing strings
  • generatePotentialAction generates all combinations
  • full numpy getter and setter to atom position, velocities, and forces.
  • saturate action allows for just using outer shell (unocc and occ orbitals, only unocc used for adding hydrogens)
  • stretch bond falls back to tabled distances for element pairs on zero length
  • select atom's bond neighbors
  • select atoms randomly
  • calculate pair correlation between element and selected atoms.

Fixes

  • corrected units and computation in SaveEnergies, renamed from SaveTemperatures
  • InputAction will also save that file on exit