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

Author