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]

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.

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.

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]

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]

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]

Side by side
| Atom layout | What the generative model works on | Where the residue type comes from | Atom mask known | |
| RFdiffusion3 | 14 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 directly | Separate step afterwards (ProteinMPNN or LigandMPNN) | Not needed to define the template |
| BoltzGen | 14 slots: N, CA, C, O first, then real side-chain atoms and virtual atoms stacked on backbone atoms | Noisy 14-point coordinates per designed residue, denoised in continuous space | Read from the final geometry: count atoms within 0.5 Å of each backbone atom | Recovered from the geometry at the end |
| La-Proteina | Atom37 at the decoder output | Cα [L, 3] plus 8-dim latent per residue [L, 8], decoded to [L, 37, 3] | Decoded from the latent, together with the coordinates | At 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





