# Isotope Support

**URL:** <https://discuss.avogadro.cc/t/isotope-support/7211>\
**Category:** Development\
**Created:** [November 3, 2025, 4:14pm UTC](https://discuss.avogadro.cc/t/isotope-support/7211 "2025-11-03T16:14:26Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![ghutchis](https://discuss.avogadro.cc/user_avatar/discuss.avogadro.cc/ghutchis/32/456_2.png) [@ghutchis](https://discuss.avogadro.cc/u/ghutchis)\
**Post date:** [November 3, 2025, 4:14pm UTC](https://discuss.avogadro.cc/t/isotope-support/7211/1 "2025-11-03T16:14:26Z")

</div>

Okay, I’m starting a [branch](https://github.com/OpenChemistry/avogadrolibs/pull/2378) for isotope support, in part based on @Juanes recent question.

Here’s the “to do”

- read / write in CML and CJSON files including tests
- checking other formats for isotope support (e.g., reading output files, Molden, etc.)
- support for isotopes in mass calculations, including calculating exact isotopic mass
- set / unset isotopes (e.g., in the atom properties)
- support for isotopes in formulas (e.g. printing \ce{CDCl3} or \ce{^{13}CH3})
  - should include returning “D” or “T” for hydrogen atoms with appropriate isotopes

- support for isotopes in input generators

As far as mass, the default isotope is “0” (i.e., the most abundant isotope for that element).

I can think of two possible ways to handle the default average mass calculation:

- all atoms return the average mass for the element unless an isotope is set (e.g., \ce{CDH3})
- once an isotope is set, every other atom returns the most abundant isotope for that element

I’m leaning towards behavior #1 since isotopic substitution at one place does not mean you cannot get isotopomers on the other atoms.

Thoughts? What else am I missing?

---

<div class="post-metadata">

**Author:** ![Thomas](https://discuss.avogadro.cc/user_avatar/discuss.avogadro.cc/thomas/32/3403_2.png) [@Thomas](https://discuss.avogadro.cc/u/Thomas)\
**Post date:** [November 3, 2025, 8:55pm UTC](https://discuss.avogadro.cc/t/isotope-support/7211/2 "2025-11-03T20:55:10Z")

</div>

I’m in favour of option 1), one explicit exchange for an isotope only changes one atom. A brief note somewhere in the documentation, a reference (perhaps with an active internet hyperlink) to the relevant reference implemented. Which could be another page curated by GP Moss [here](https://iupac.qmul.ac.uk/AtWt/), or e.g., IUAPC’s 2021 report ([Standard atomic weights of the elements 2021 (IUPAC Techn...](https://doi.org/10.1515/pac-2019-0603), open access, table 1, column 7).

Option 2) could be/become an optional extension to Avogadro though if one wants an isotopic pattern for mass spectrometry, editors like ChemDraw have the advantage to display _multiple_ molecules/fragments and their m/z at once.

---

<div class="post-metadata">

**Author:** ![ghutchis](https://discuss.avogadro.cc/user_avatar/discuss.avogadro.cc/ghutchis/32/456_2.png) [@ghutchis](https://discuss.avogadro.cc/u/ghutchis)\
**Post date:** [November 3, 2025, 8:59pm UTC](https://discuss.avogadro.cc/t/isotope-support/7211/3 "2025-11-03T20:59:47Z")

</div>

I’ll mention that I _absolutely_ could use some help digging up syntax for isotopes for input generators.

- CP2K
- Dalton
- GAMESS
- GAMESS-UK
- Gaussian (e.g., add `C(Iso=13)` to the atom symbol
- ORCA (e.g., add `M <mass>` to the end of the XYZ line
- Molpro
- NWChem
- Psi
- PySCF
- Q-Chem
- Terachem

---

<div class="post-metadata">

**Author:** ![Thomas](https://discuss.avogadro.cc/user_avatar/discuss.avogadro.cc/thomas/32/3403_2.png) [@Thomas](https://discuss.avogadro.cc/u/Thomas)\
**Post date:** [November 3, 2025, 9:29pm UTC](https://discuss.avogadro.cc/t/isotope-support/7211/4 "2025-11-03T21:29:48Z")

</div>

While I do not qualify as «trained user» in any of these programs, I relayed the question to the robot of [https://chat.mistral.ai/chat](https://chat.mistral.ai/chat). Subject to review (some of the answers added a link to the manual), the output is the Markdown attached below.

[isotopes.md.tar.gz](https://discuss.avogadro.cc/uploads/short-url/mxt60rOEP8hHIwKKKQ5ZB4aA3rJ.gz) (1.9 KB)

---

<div class="post-metadata">

**Author:** ![matterhorn103](https://discuss.avogadro.cc/user_avatar/discuss.avogadro.cc/matterhorn103/32/1751_2.png) [@matterhorn103](https://discuss.avogadro.cc/u/matterhorn103)\
**Post date:** [November 4, 2025, 3:23am UTC](https://discuss.avogadro.cc/t/isotope-support/7211/5 "2025-11-04T03:23:48Z")

</div>

I’d agree that option 1 makes more sense.

---

<div class="post-metadata">

**Author:** ![ghutchis](https://discuss.avogadro.cc/user_avatar/discuss.avogadro.cc/ghutchis/32/456_2.png) [@ghutchis](https://discuss.avogadro.cc/u/ghutchis)\
**Post date:** [November 4, 2025, 5:36pm UTC](https://discuss.avogadro.cc/t/isotope-support/7211/6 "2025-11-04T17:36:20Z")

</div>

> [@ghutchis](#):
>
> I’ll mention that I _absolutely_ could use some help digging up syntax for isotopes for input generators.

This will require a bit of work because in most cases, this involves tweaking the coordinate block. At the moment, most of the input generators use “shortcuts” to do that like `S_xyz` handled by Avogadro.

I think the best solution for this is to add an optional _second_ line indicating how atoms with isotopes are handled, e.g. `S_xyz_M $mass` or `S(Iso=$I)_xyz` or similar syntax.

> [@Thomas](#):
>
> I relayed the question to the robot of [https://chat.mistral.ai/chat](https://chat.mistral.ai/chat).

I’ll put that in the possibly helpful use of AI, although verification is absolutely needed when there isn’t a link to the manual.
