Atom14 and Atom37: how protein design models write down atoms

AKA why a protein does not naturally fit neatly into a tensor, and how RFdiffusion3, BoltzGen and La-Proteina cope when the amino-acid sequence is not known yet

The problem: proteins are not rectangles

Neural networks like fixed-shape arrays. Proteins are not fixed-shape: the 20 standard amino acids contain between 4 and 14 heavy atoms (hydrogens are usually ignored). Atom14 and Atom37 are two ways of squeezing that variety into a rectangle. For a protein with L residues, both give a coordinate tensor of shape [L, A, 3]: one row per residue, A atom slots, and three Cartesian coordinates per slot. Atom14 uses A = 14 and Atom37 uses A = 37. These are maximum widths, not claims that every residue has that many atoms, so each tensor travels with a mask that marks which slots hold a real atom. [1, 2]

This post first explains the two layouts, then asks the question that matters for generative models: what happens in de novo design, where the sequence, and therefore the list of atoms, is not known in advance? We look at three recent answers: RFdiffusion3, BoltzGen and La-Proteina.

Same backbone, different side chains

Every amino acid shares a backbone of four heavy atoms: N, CA (the alpha carbon), C and O. The side chain starts at CB, the beta carbon, and is what makes each residue type different. Glycine has no side chain at all, serine and cysteine add two atoms, arginine adds seven, and tryptophan adds ten. Any representation must hold the shared backbone and a variable-length side chain at once. [1]

Figure 1. Five residues drawn atom by atom, using the AlphaFold atom names. Backbone atoms have a thick outline. Bonds are schematic and hydrogens are omitted.

Atom14: pack the atoms tightly

Atom14 gives each residue a compact list of 14 slots. The first four are always N, CA, C and O. CB and the side-chain atoms follow in a fixed, residue-specific order, and any leftover slots at the end are padding. Tryptophan, the largest standard residue, is the only one that fills all 14. [2]

The catch is that a slot index has no meaning on its own. Slot 5 is SG for cysteine, OG for serine and CG for arginine and tryptophan, so you must know the residue type to read the tensor. The mask also has to be built from the residue type. Atom14 is compact, but it presupposes a known sequence.

Figure 2. Atom14 slots for the five example residues. Pale dashed cells are padding that the atom mask excludes. The highlighted slot 5 shows how the same index means different atoms in different rows.

Atom37: one slot per atom name

Atom37 takes the opposite approach. It defines one shared vocabulary of 37 atom names, covering every heavy atom that occurs in any standard residue, and gives each name a fixed slot. Slot 0 is always N, slot 1 CA, slot 2 C, slot 3 CB and slot 36 OXT, whatever the residue. Glycine simply has slot 3 masked, while serine, cysteine, arginine and tryptophan have it active.

Figure 3. The same five residues in the Atom37 layout. The atom name above each column is the same for every row; the mask (pale cells) changes with the residue.

How AlphaFold uses both

AlphaFold2 uses both layouts, for different jobs. Its structure module builds each residue’s atoms from a backbone frame and up to four side-chain torsion angles, and it stores the result in the compact Atom14 layout. Before the prediction is returned, a precomputed per-residue index map moves each Atom14 slot to its fixed Atom37 slot, because Atom37 is the standard format for downstream tools. [2]

Figure 4. Converting Atom14 to Atom37 for serine. Six slots are copied to their fixed positions (note that O and CB swap order) and the other 31 Atom37 slots stay masked.

All of this works because AlphaFold is a prediction model: the sequence is an input, so the residue type, the slot meanings and the mask are known from the start.

De novo design: the residue type is not known yet

A de novo design model has to invent the protein, so the sequence is an output, not an input. That causes a problem for any model that wants to generate side-chain atoms. In Atom14 the meaning of each slot depends on the residue type, and in Atom37 the mask does. Both depend on a choice the model has not made yet.

The three models below find different ways around it. RFdiffusion3 and BoltzGen both generate a fixed template that does not depend on the residue type: RFdiffusion3 designs the sequence afterwards, while BoltzGen reads the residue type out of the template’s geometry. La-Proteina instead hides the residue type inside a latent variable and only reveals it at the end.

RFdiffusion3: a fixed 14-point template

A quick bit of history first. The original RFdiffusion (2023) only generated the protein backbone, as residue frames built from N, CA and C, and relied on ProteinMPNN to design the sequence afterwards, so it does not use Atom14 at all. [3] RFdiffusion3 (2025) is the version that generates all atoms. [4]

RFdiffusion3 treats every residue as having 4 backbone atoms and 10 side-chain atoms, because tryptophan, the largest standard side chain, has 10. That is the Atom14 idea: 14 points per residue. The difference is in how the unused slots are handled. AlphaFold pads and masks them, whereas RFdiffusion3 fills them with virtual atoms placed on CB (or on CA for glycine). Every slot is therefore a point that can be denoised, whichever residue it will eventually become. Different virtual-atom types let the network tell apart cases that would otherwise look the same, such as the oxygen of serine and the sulfur of cysteine. [4]

The model is not given a sequence. It starts from noisy coordinates for all 14 points of every residue and denoises them together under design conditions such as a motif or a binding target. Residue identities are assigned afterwards: in the workflows reported in the paper, ProteinMPNN (or LigandMPNN when non-protein atoms are involved) designs a sequence for the final structure. Only at that point does a residue have a conventional list of named atoms. Because the paper describes this layout without calling it Atom14, it is safest to say RFdiffusion3 uses an Atom14-style template rather than AlphaFold’s Atom14 itself. [4]

BoltzGen: let the geometry spell the residue type

BoltzGen (Stark et al., 2025, from the team behind Boltz) also starts from a fixed template, and again it is Atom14-like: every designed residue gets exactly 14 atoms, some of which are virtual placeholders. The first four are always the backbone atoms N, CA, C and O, in that order. [5]

What sets it apart is what the spare atoms are for. RFdiffusion3 parks them on CB and brings in a separate sequence model afterwards. BoltzGen instead uses the spare atoms to encode the residue type. The model learns to stack its virtual atoms on top of backbone atoms in a residue-specific pattern. Proline puts 7 virtual atoms on the backbone oxygen. Threonine puts 3 on the nitrogen and 4 on the oxygen, and its three real side-chain atoms (CB, OG1 and CG2) sit in the next three slots. The authors describe this as encoding the residue identity through geometry instead of generating a discrete residue label. [5]

Figure 5. BoltzGen’s 14-point encoding for two residues. Orange cells are virtual atoms, which are stacked on the backbone atoms shown in the drawings. The slot order shown is schematic. The proline and threonine patterns are the two examples given in the paper.

The payoff is that the model never has to predict a categorical label, so generation can run entirely in continuous space. To read out the sequence at the end, you count how many atoms sit within 0.5 Å of each backbone atom. Whatever is not sitting on the backbone is side chain, and the virtual atoms are then discarded, leaving a normal list of named atoms. According to the paper, the amino-acid types are settled in a fairly short window of the denoising trajectory (roughly 0.6 to 0.8 of the way through), so the sampler spends extra steps there. An optional inverse-folding step can still redesign the sequence afterwards. [5]

In the language of this post, BoltzGen replaces Atom14’s residue-dependent mask with a geometric readout. The information that AlphaFold reads from the sequence, namely which atoms exist, is here recovered from the structure itself.

La-Proteina: generate a latent, decode into Atom37

La-Proteina takes a different route and never diffuses a variable list of atoms. It splits the protein into two parts. The Cα coordinates, a tensor of shape [L, 3], are generated explicitly. Everything else, meaning the residue type and all remaining atomistic detail, is packed by an encoder into an 8-dimensional continuous latent vector per residue, a tensor of shape [L, 8]. A flow-matching model generates the Cα coordinates and the latents jointly from noise. Throughout this process every residue has the same number of variables, so there are no atom lists and no masks to worry about. [6]

This is where Atom37 comes in. A decoder takes the latents and Cα coordinates and outputs the residue type as well as a full [L, 37, 3] Atom37 tensor. Atom37 is a good fit because its fixed slots let the decoder output every possible atom position without knowing in advance which ones will be needed. The decoded sequence then selects the appropriate subset of the 37 slots (during training the ground-truth sequence does this job). In other words, the atom mask is the last thing to be determined, not the first. [6]

Figure 6. Three ways to generate an all-atom protein. RFdiffusion3 denoises a fixed 14-point template and a separate sequence model runs afterwards. BoltzGen denoises a similar template and reads the residue type from where the virtual atoms sit. La-Proteina generates Cα positions and latents and decodes the residue type and Atom37 coordinates at the end. The diagram is conceptual, not a literal architecture.

Side by side

 Atom layoutWhat the generative model works onWhere the residue type comes fromAtom mask known
RFdiffusion314 slots: 4 backbone + 10 side-chain points. Unused slots are virtual atoms on CB (Atom14-like, but no padding)Noisy [L, 14, 3] coordinates, denoised directlySeparate step afterwards (ProteinMPNN or LigandMPNN)Not needed to define the template
BoltzGen14 slots: N, CA, C, O first, then real side-chain atoms and virtual atoms stacked on backbone atomsNoisy 14-point coordinates per designed residue, denoised in continuous spaceRead from the final geometry: count atoms within 0.5 Å of each backbone atomRecovered from the geometry at the end
La-ProteinaAtom37 at the decoder outputCα [L, 3] plus 8-dim latent per residue [L, 8], decoded to [L, 37, 3]Decoded from the latent, together with the coordinatesAt the end, from the decoded residue type

The common thread is that Atom14 and Atom37 are residue-aware layouts: they are most useful once the residue type is known. A generative model therefore has to decide how to carry the unknown identity through generation. RFdiffusion3 sidesteps it with a fixed template and adds the sequence afterwards, BoltzGen uses the same kind of template but lets the geometry itself spell out the residue type, and La-Proteina keeps the identity in a latent and decodes it to Atom37 at the end. Other models make other choices. Protpardelle keeps several candidate side chains alive during denoising, and Chroma generates a backbone first and then designs sequence and side chains on top of it. [7, 8]

References

[1] Alberts, B. et al. Molecular Biology of the Cell, 4th ed., Chapter 3: Proteins. Garland Science (2002). https://www.ncbi.nlm.nih.gov/books/NBK26830/

[2] Jumper, J. et al. Highly accurate protein structure prediction with AlphaFold. Nature 596, 583–589 (2021). https://doi.org/10.1038/s41586-021-03819-2. Atom names and slot orders: AlphaFold2 reference implementation, residue_constants.py, https://github.com/google-deepmind/alphafold/blob/main/alphafold/common/residue_constants.py

[3] Watson, J. L. et al. De novo design of protein structure and function with RFdiffusion. Nature 620, 1089–1100 (2023). https://doi.org/10.1038/s41586-023-06415-8

[4] Butcher, J. et al. De novo design of all-atom biomolecular interactions with RFdiffusion3. bioRxiv (2025). https://doi.org/10.1101/2025.09.18.676967

[5] Stark, H. et al. BoltzGen: Toward Universal Binder Design. bioRxiv (2025). https://doi.org/10.1101/2025.11.20.689494

[6] Geffner, T. et al. La-Proteina: Atomistic Protein Generation via Partially Latent Flow Matching. International Conference on Learning Representations (2026). https://arxiv.org/abs/2507.09466

[7] Chu, A. E. et al. An all-atom protein generative model. Proceedings of the National Academy of Sciences 121(27), e2311500121 (2024). https://doi.org/10.1073/pnas.2311500121

[8] Ingraham, J. et al. Illuminating protein space with a programmable generative model. Nature 623, 1070–1078 (2023). https://doi.org/10.1038/s41586-023-06728-8

Lessons in Bemistry: identifying the signature of a medicinal chemist

Andrew D. Blevins and Ian K. Quigley, co-founders of Leash Bio, released a pre-print last year that I think deserves some more attention. Using a Bemis-Murcko scaffold split, the authors show that it is possible to train a machine learning model to identify which of 1,815 medicinal chemists produced a molecule from its structure alone, achieving a top 5 accuracy of 60% and a top 1 of 27%.

Let’s take a step back. Why aim to predict who made a molecule in the first place? The authors motivate this well, drawing on the story of Clever Hans. Owned and showcased by Wilhelm von Osten in 20th century Germany, Clever Hans was a horse purportedly able to solve mathematical problems, stamping out solutions with his hoof. However, it was quickly realized that Clever Hans could not actually perform arithmetic, but rather read the micro-expressions and posture of those posing the question, stopping his count when the faces of observers revealed the right answer had been reached. The moral? Clever Hans learned how to predict a correlate of a task, which was mistaken for mastery of the task itself.

Continue reading →

Characterising nanobody developability to improve therapeutic design using the Therapeutic Nanobody Profiler

For the final project of my PhD in OPIG, I developed the Therapeutic Nanobody Profiler, or ‘TNP’: a tool to characterise nanobody developability analogous to TAP (the Therapeutic Antibody Profiler). TNP uses 6 metrics, tailored to the unique features of nanobodies, to benchmark the structural and physicochemical properties of a candidate nanobody against 36 clinical-stage examples. In collaboration with Twist Bioscience, we also collected experimental developability assay data for 108 nanobodies expressed as IgG constructs, and examined how these results are related to the TNP guidelines.

More info can be found in the paper published in Communications Biology at: https://www.nature.com/articles/s42003-026-09594-y

The TNP software and datasets are open-source and can be found at: https://opig.stats.ox.ac.uk/webapps/tnp (for the web-app) and https://github.com/oxpig/TNP (for the GitHub repo).

OAS-nano: New Repertoire Database Just Dropped

Those familiar with the immunoinformatics work of our group will know of our Observed Antibody Space (OAS) and Observed T-cell Receptor Space (OTS) databases, which compile and consistently process V(D)J transcriptomics datasets from across a range of studies on natural immune repertoires. These have provided a central community resource of training data for adaptive immune receptor (AIR) large language models, as well as references for studies aiming to identify clones related to particular disease states.

We are now delighted to release the final installment of our natural AIR database series: introducing OAS-nano. This project was enabled by key collaborative contributions from Klara Kropivsek Brumat and Ario de Marco at the University of Nova Gorica and our industrial partners at AstraZeneca: Olga Obrezanova, Erwin de Genst, and Rebecca Croasdale-Wood.

Continue reading →

Le Tour De Farce v13.0

Well by righteous democracy I’m once again given the privilege of inscribing Le Tour De Farce into the annals of history, this year being the 13th consecutive year of OPIG’s summer social cycling pub crawl extravagansa. I will try to recount as much as I can from pieces of other peoples memories (my own is a less reliable source). Here is a reasonable portion of the group standing with steeds at the back of the Stats department as is tradition (Figure 1).

Continue reading →

The First OpenBind Blind Challenge

At OpenBind, we’re working to generate large-scale, open experimental datasets of protein-ligand structures and binding measurements to support the development and evaluation of computational methods for drug discovery. One thing I’m particularly excited about is using these data not just for retrospective benchmarking, but for prospective, blind evaluation.

So, I’m very pleased that we’re launching the first OpenBind blind challenge on 14 October 2026, in partnership with OpenADMET and the ASAP Discovery Consortium. The interim submission deadline is 11 November, with final submissions due by 16 December 2026 at 23:59 UTC.

The challenge asks participants to predict protein-ligand complexes of 400 compounds bound to Zika virus NS2B-NS3 protease, ranging from small fragments to larger, lead-like molecules.

A key challenge will be using the structural information that already exists to accurately predict the binding modes of new, unseen ligands. There are already a number of publicly available structures of Zika NS2B-NS3 protease in the PDB that participants can use.

We’re also setting a high bar for success. While many protein-ligand benchmarks use an RMSD threshold of 2 Å, we’re tightening this to 1.5 Å, along with additional checks on interaction accuracy (lDDT-PLI > 0.8) and physical validity (PoseBusters validity checks). I’m particularly excited to see how docking, cofolding, and other approaches compare!

If you work on protein-ligand structure prediction, I’d strongly encourage you to join the challenge. You can find all the details, including how to register and join the challenge Discord, in the OpenBind announcement.

Update: We’re now live! Check out the challenge on Hugging Face.

AI can remove typing. It cannot remove thinking.​

Students new to programming may wonder why they even need to learn to code any more. They can ask the reasonable question: “Why can’t we just use AI for all our programming?” It’s a fair question. The Genie is out of the bottle. We aren’t putting it back. It absolutely does have its uses. But it also can’t be trusted.

For a new programmer, the important skill is no longer remembering syntax, nor is it learning how to make an AI produce code. It’s learning how to solve problems in a systematic way that they understand well enough to trust.

When getting started with AI, use it to help think through the problem, break the work into manageable pieces, elaborate how the pieces interact and only then start to code.

There’s the old adage “Garbage in, garbage out”. If you aren’t able to articulate your problem in an AI-friendly way, we’re well into garbage out territory. The other part of the problem is whilst AI will certainly generate you some code, if you don’t understand what it’s giving back, you can’t trust it to be correct. If you carry on just accepting what it’s saying, it’s like going on a date in a foreign country and putting all your faith in your translation app. Sooner or later you’re unwittingly going to say something that will earn you a slap.

So, instead of just telling it what you want, try:

Continue reading →

Finally solving drug discovery with a Fly

As I was sitting down this morning, trying to enjoy my rather excellent breakfast, I was suddenly attacked by a fly. Unfortunately for me, my lazy hand swats proved no match for the nimble little thing, who was evidently pretty hungry too. And as I watched the acrobatics this tiny creature could effortlessly pull off in pursuit of my sandwich, I was left wondering: if only we could put these skills to better use.

Open-sourcing a fly

Luckily, I’m not the only one who has been staring at a fly and wondering. A couple of weeks ago, HHMI Janelia, the University of Cambridge and Google Research published a paper in the Cell describing the complete wiring diagram of a male fruit fly’s central nervous system: the brain and the nerve cord, the whole thing, down to individual synapses. To be fair, this isn’t the first time someone has done this. The FlyWire project gave us a complete female fly brain back in 2024, and Janelia had already released half a female brain in 2020. But this one comes with the body wiring attached, and, for whatever reason, this is the one the internet decided to notice.

What the internet did with it

Now, the video games. My question at the top was whether these skills could be put to better use, so here they are:

Continue reading →

One Year Down: Wisdom from a Former OPIG Newbie

With a new cohort of PhD students arriving imminently and my first year coming to a close, I am about to achieve an important milestone: I will no longer be the newest full-time OPIGlet in the group!

Naturally, this makes me extremely qualified to impart wisdom.

In all seriousness, the first year of a PhD has been a strange and wonderful adjustment. I have learned a lot about nanobodies, of course, but I have also learned quite a bit about how to actually do a PhD. So, for the incoming OPIGlets—or anyone else embarking on their first year—here are a few things I wish I had fully appreciated when I started.

Give some structure to all that freedom

One of the strangest things about starting a PhD is suddenly having an almost completely self-guided schedule. It is not something most of us have had to deal with before. Undergrad comes with lectures, tutorials, deadlines, and exams. Most jobs come with meetings, working hours, and someone telling you what needs to be done.

Continue reading →