Rule index#
Where each naming rule lives in the code, which rules are written in more than one place, and what else to look at when you change one. Architecture says how a name is built; this page says where the rules are.
How to read this page#
The Blue Book is the IUPAC 2013 Recommendations (web edition). Section numbers and titles below are those of its table of contents. When you cite a rule, cite the level the book defines, and the criterion inside it.
A canonical helper is the function the code treats as the home of a rule. That a helper exists does not mean that every place that needs the rule calls it. For eight rules, part 1 lists the helpers, how widely they are used, and the places that decide the same question beside them.
The counts are pattern counts. They come from a scan of
src/orthonymthat looks for code of a given shape; the shapes are listed at the end of the page. A match is a lead, not a proof of a copy: some matches are right for a reason of their own, and a copy that hides under other names is not seen. Read the site before you act on a count.A rule can live in a place that never runs for your molecule. Before you edit a helper, count its calls on a few molecules of your class (Architecture).
Names are given as the function name and its module, not as a line number.
1. Rules that are written in many places#
Writing locants into a name#
Blue Book: P-14.3 Locants; P-16.2 Punctuation.
The helpers join a list of locants and attach it to a prefix or a suffix, with the multiplier and the enclosing marks. Most code that needs this does not use them.
Helper |
Module |
Used outside its module |
|---|---|---|
|
|
33 calls in 13 other files |
|
|
6 calls in 4 other files |
|
|
467 calls in 44 other files |
Code that writes a locant into a name by hand: 560 places in 243 functions of 70 files (a locant joined with commas or hyphens: 253; an f-string {locant}-...: 365; a locant plus "-": 31; a line can match more than one pattern). 209 of those functions call none of the helpers above. The files with most places: rules/ions.py (63), assembly/composer.py (54), rules/natural_products.py (52), rules/ring_substituents.py (30), rules/heterocycles.py (28). 20 of the comma joins sort the locants inside the join; the others write them in the order they are given.
When you change it:
Look at each place that writes a locant by hand and decide whether your change should reach it. Do not assume that fixing the helper fixes the name.
Most comma joins write the locants in the order the caller gives. A helper that sorts would turn
2,1into1,2for a caller that cites locants in citation order, as some multiplicative names do. Do not add a sort without reading the callers.Not every locant is an integer.
4a, primed locants, Greek letters,N1,1Hand the lambda tokens sort and compare differently. They have renderers of their own (format_lambda_tokeninrules/lambda_convention.py,_render_primed_locantinassembly/composer.py).
Citing and omitting locants#
Blue Book: P-14.3.3 Citation of locants; P-14.3.4 Omission of locants.
The two sections must be read together. P-14.3.3 says that if any locant is essential for the parent structure or for a unit of structure as its enclosing marks define it, all are cited for that unit. P-14.3.4 then lists the cases in which locants are omitted, in six numbered licences (P-14.3.4.1 to P-14.3.4.6). Cite the licence, not the section. The list of exceptions is open: the Blue Book prints prop-2-enamide and the prefix prop-2-enoyl as preferred, and they keep a locant that they could do without.
The code has two homes for this decision, and they overlap: assembly/locant_omission.py (its docstring calls it the one place where the licences are decided) and should_omit_locant_one in assembly/naming_utils.py.
Helper |
Module |
Used outside its module |
|---|---|---|
|
|
5 calls in 4 other files |
|
|
2 calls in 2 other files |
|
|
5 calls in 4 other files |
|
|
4 calls in 3 other files |
|
|
14 calls in 9 other files |
Sites that decide for themselves whether a locant may go:
rules/added_carbon_parent.py: omits locants for a one-atom parent, with no licence list.rules/multiplicative.py: decidesomit_locant_onelocally and callsl5_uniform_completeforomit_all_locants.rules/skeletal_replacement.py: decidesomit_all_locantsandomit_locantslocally.rules/polyazane.py,_ene_locant_is_unambiguous: its own test for a double bond that needs no locant.assembly/handlers/_handler_shared.py,_l5_prefix_locants_omitted: one of four adapters (_l3_...,_l4_...,_l5_...,_l6_...) that call the licence checkers.
When you change it: change the licence checker, not the name. A rule that removes a locant from one class can remove it from another that needs it. The spelling checks in validation/spelling/ (locant_omission_check in checks_locants.py among them) re-encode the licences and read the finished name without any naming code, so a change to locant_omission.py does not change them. They are a second, independent reading of the rule; keep them that way.
Enclosing marks#
Blue Book: P-16.5 Enclosing Marks.
The helpers decide whether a prefix needs brackets, which bracket, and how marks nest ( ) then [ ] then { }.
Helper |
Module |
Used outside its module |
|---|---|---|
|
|
132 calls in 30 other files |
|
|
164 calls in 44 other files |
|
|
28 calls in 8 other files |
|
|
43 calls in 20 other files |
|
|
2 calls in 2 other files |
|
|
2 calls in 2 other files |
|
|
3 calls in 3 other files |
Beside them: 82 f-strings of the form f"({x})" (or with [ ], { }) and 7 concatenations "(" + x + ")" in 37 files, and 10 loops that count brackets in a finished name, in 8 files. A few of the wraps are fixed syntax (an oxidation number, a fusion descriptor, an added-hydrogen bracket) and are correct as they are. Local helpers that make the same decision:
assembly/composer.py,_wrap: wraps in round brackets only; never moves to square brackets.assembly/composer.py,_is_compound_prefix: its own character class, and a carve-out for italic prefixes.assembly/general_engine.py,_is_complex_prefix: needs_brackets or is_complex_substituent, plus a carve-out.assembly/handlers/azine.py,_enclose: round brackets when is_complex_substituent says so.rules/ring_substituents.py,_is_complex_prefix: its own list of endings.rules/polyfunctional.py,_enclose: adds the outermost mark only when one is missing.rules/oxoacid_group_prefix.py,_enclose: thin wrapper over apply_enclosing_marks.rules/ring_assemblies.py,_enclose_component: a different rule that shares the glyph: von Baeyer brackets after ‘bi’.rules/heterocycles.py,_fully_enclosed: reads round brackets only.rules/oxoacid_group_prefix.py,_fully_enclosed: delegates to the shared scanner.
When you change it:
Some local helpers apply a different rule on purpose.
_enclose_componentinrules/ring_assemblies.pywrites the brackets of a von Baeyer name, and fixed-syntax brackets (oxidation numbers, fusion descriptors, added hydrogen) must never go through the marks helper.A producer may hand over a prefix that is already enclosed (the docstring of
_encloseinrules/polyfunctional.pysays so). Enclosing it again gives((x)y).Replacing a round-bracket-only wrapper by the helper can change a nested name from
((x)y)to[(x)y]. That is the correct form of P-16.5.4, and still a different name.An italic prefix such as
tert-butylis treated as bare by some predicates and as complex by others.
Multiplying prefixes#
Blue Book: P-14.2 Multiplicative Prefixes; P-16.3 Multiplicative prefixes ‘di’, ‘tri’, etc. vs. ‘bis’, ‘tris’, etc.
di, tri, … for simple prefixes and bis, tris, … for compound ones. The choice between the two series is made from the name of the multiplied part (get_multiplier_prefix), or fixed by the class.
Helper |
Module |
Used outside its module |
|---|---|---|
|
|
81 reads in 28 other files |
|
|
33 reads in 15 other files |
|
|
92 calls in 46 other files |
|
|
36 calls in 16 other files |
|
|
9 calls in 6 other files |
|
|
23 calls in 10 other files |
|
|
7 calls in 5 other files |
Beside them: 4 dictionary literals that map integers to di, tri, … (3) or bis, tris, … (1) in 3 files, including the two canonical tables. 2 of them stop at 10 or below; the canonical tables go to 20. Key 1 is absent from 2 of them, maps to the empty string in 2. What a copy does above its own range can differ by site (for example a KeyError, an empty string, or no name).
When you change it: the tables for the suffix words diyl, triyl, tetrayl (_POLYOL_VALENCE in rules/esters.py, _VALENCE_WORD in rules/multiplicative_general.py) are not prefix tables. Replacing a copy by the canonical table can let that site name a molecule with more repeated groups than before, which is a change of names and not a tidy-up; do it in a change of its own.
Numbering: lowest locants#
Blue Book: P-14.4 Numbering.
The first point of difference decides between two sets of locants. compare_locant_sets implements it, with the rule for letters such as 4a.
Helper |
Module |
Used outside its module |
|---|---|---|
|
|
38 calls in 14 other files |
|
|
4 calls in 4 other files |
Functions named locant_sort_key or _locant_sort_key: 9. 6 are defined at module level, in assembly/name_comparison.py, assembly/naming_utils.py, assembly/universal_substituent.py, rules/isotopes.py, rules/p44_scorer.py, rules/spiro.py. 3 are nested inside another function, in assembly/composer.py, rules/fused_rings.py, rules/partial_saturation.py. Other sites that compare locant sets:
perception/chains.py,_compare_locants: first point of difference, re-written; breaks ties withlen <=.assembly/form_choice.py,lower_locants: compares the locant roles of two finished names of one species, a different object.
When you change it: most code that compares sets of locants calls compare_locant_sets, but the criteria of P-14.4 are not held in one function. Ring numbering is decided inside each ring-system module, and the order of the criteria is spread over the parent-selection and ring modules. The small locant_sort_key functions are twins, not one function.
Elision of vowels#
Blue Book: P-16.7 Elision of Vowels.
apply_vowel_elision is the canonical helper.
Helper |
Module |
Used outside its module |
|---|---|---|
|
|
6 calls in 4 other files |
|
|
3 reads in 2 other files |
Vowel sets written out in the code: 24 in 17 files (aeiou: 11, aeiouy: 11, aiouy: 2). The canonical helper uses aiouy: it does not elide a final e before another e (apply_vowel_elision("butane", "ene") gives butaneene). The Blue Book rule P-16.7.1 (a) lists e among the letters before which a final e is elided, and most of the other sets contain it. A change of the set can change a name only where a stem that ends in e meets a suffix that begins with e. Sites that decide the same question:
rules/multiplicative_general.py,_elide: the same vowel set as the canonical helper, and true for an empty suffix.rules/spiro.py: strips the terminal ‘e’ before ‘ene’ with its own code (P-31.1.5.2.1 spiro names).rules/heterocycles.py: its own vowel sets for Hantzsch-Widman stems and endings.assembly/general_engine.py,_elide_before_ionic_suffix: the setaeiouy, which includes ‘e’.rules/mononuclear_hydrides.py,_apply_hydride_suffix: the setaeiouy, which includes ‘e’.rules/ions.py,_elide_terminal_e: drops a final ‘e’ without looking at the next letter.
When you change it: P-31.1.5.2.1 prints a spiro name in which the final e of a saturated name is elided before the ending ene (2,2'-spirobi[bicyclo[2.2.1]heptan]-5-ene). The code that writes that name, in rules/spiro.py (if not _mult and component.endswith('e')), strips the e itself and does not call the helper. If you make it call the helper as it is, the name becomes ...heptane]-5-ene. Widen the helper’s vowel set first, and check both.
Hydro prefixes, indicated and added hydrogen#
Blue Book: P-14.7 Indicated and ‘Added Indicated’ Hydrogen; P-31.2 Substituent Groups Modified by the Prefixes ‘hydro’ or ‘dehydro’.
rules/ring_hydrogen.py holds the shared description of the hydrogen of a ring system whose atoms carry a double bond to an atom outside the ring (a ketone, an imine, an oxo prefix). Its docstring quotes the sections of the Blue Book that govern it.
Helper |
Module |
Used outside its module |
|---|---|---|
|
|
11 calls in 5 other files |
|
|
2 calls in 2 other files |
|
|
2 calls in 2 other files |
|
|
5 calls in 3 other files |
|
|
7 calls in 3 other files |
The placement itself is computed by rules/bridged_fused_pin/hydro.py; ring_hydrogen is the entry that other producers call. Producers that write hydro prefixes or indicated hydrogen without it, or on only some of their paths:
rules/partial_saturation.py: writes{locant}H-parents itself.rules/purine.py: writes{indicated hydrogen}H-purineitself.rules/ring_substituents.py: writes hydro and indicated-hydrogen strings itself and never calls the helpers.rules/fused_rings.py: uses the helpers on some paths and writeshydroandHstrings directly on others.rules/heterocycles.py: uses the helpers on some paths and writeshydroandHstrings directly on others.
When you change it: a producer that writes <locants>-<multiplier>hydro or {locant}H- itself is not changed by a change to the helpers. Search for the strings, not only for the function.
Alphanumerical order#
Blue Book: P-14.5 Alphanumerical Order.
alpha_sort_key is the canonical key. It leaves out multiplying prefixes, stereodescriptors and Greek letters, and it keeps iso, neo and cyclo (they are part of the name). sec- and tert- are not part of the primary key: P-14.5.3 makes italicised letters a last tie-break, so 3-tert-butyl-1-(1-methylpropyl)benzene comes out right. It is used widely.
Helper |
Module |
Used outside its module |
|---|---|---|
|
|
149 calls in 37 other files |
|
|
2 calls in 2 other files |
|
|
5 calls in 4 other files |
|
|
10 calls in 4 other files |
Orderings of names that do not go through alpha_sort_key:
rules/benzene.py,_alphanumerical_name_key: letters only; no multiplier or italic handling (a P-45.5 variant).rules/spiro.py,_component_alpha_key: orders ring-component names.rules/spiro.py,_pin_component_alpha_key: orders ring-component names; adds a locant tie-break.rules/spiro.py,_spiro_component_alpha_key: orders ring-component names; strips every bracketed group.rules/lipids.py,_alpha_key: strip_alphanumerical_noise only.
When you change it: sorting a list of names with Python’s sorted is not alphanumerical order; it differs for names with tert-, multiplying prefixes, Greek letters or italic N-. When you meet a sort of name strings, look for the key.
2. Where each kind of rule lives#
An entry point is the function that the dispatch tables or the handlers call. Most of the modules hold many more functions; the internals pages list them all.
Kind of rule (Blue Book section) |
Where it lives |
|---|---|
Which group is the principal characteristic group (the suffix) |
|
Ring or chain as the parent |
|
Which ring system, which chain |
|
Lowest locants, choice of numbering |
|
Monocyclic heterocycles (Hantzsch-Widman names) |
|
Von Baeyer polycyclic parents |
|
Spiro systems |
|
Fused ring systems |
|
Phanes |
|
Ring assemblies |
|
Benzene derivatives |
|
Hydro prefixes, indicated and added hydrogen |
|
Substituent prefixes |
|
Multiplicative nomenclature |
|
Esters |
|
Amides, nitriles |
|
Acid halides, anhydrides, lactones, lactams |
|
Molecules with several kinds of group |
|
Ions, salts, zwitterions, radicals, adducts |
|
Hydrides of the other main-group elements, inorganic acids |
|
Organometallic compounds |
|
Isotopic modification |
|
Stereodescriptors: finding them, writing them |
|
Natural products, sugars, amino acids, peptides, lipids |
|
Skeletal replacement (‘a’ nomenclature) in chains |
|
Naming a large molecule from its fragments |
|
From a handler id to its code#
orthonym "SMILES" --dispatch-stats prints ids of these two tables, and --dump-tree prints an inner handler id. The tables say which file holds the code. The outer table is walked in priority order and the first class that fits is used; the inner table is walked in priority order and the first handler that succeeds is used (Architecture).
Outer classes#
A class handler is a short shim in routing/dispatch_table.py that calls the code named in the last column.
Priority |
Class id |
What it names |
Code |
|---|---|---|---|
40 |
|
Free inorganic oxoacids with a retained name (sulfuric, phosphoric, carbonic, silicic acid) |
|
45 |
|
Mononuclear hydrides with a halogen-only or organyl hub (sulfur hexafluoride, trichlorophosphane, trimethylarsane) |
|
46 |
|
Chains of O, S, Se or Te atoms (disulfane, trioxidane) |
|
46.5 |
|
Oxides of chalcogen chains (disulfane dione) |
|
47 |
|
Hydrazine, diazene, triazane and relatives |
|
47.5 |
|
Alternating Group 14 and 15 chains (disiloxane, disilazane) |
|
47.55 |
|
Chalcogen-only skeletal chains (dithioxane) |
|
47.6 |
|
Chains of one Group 15 element (diphosphane, pentaarsane) |
|
47.65 |
|
Carboxylic acids on P, As or Sb hydrides (phosphanecarboxylic acid) |
|
47.66 |
|
Carbaldehydes and carbonitriles on Si, Ge, Sn, Pb, P, As, Sb, Bi hydrides (silanecarbonitrile) |
|
47.7 |
|
Chains of one Group 14 element (disilane, digermene) |
|
48 |
|
Two-atom Group 14 and 15 hydrides (silylarsane) |
|
48.3 |
|
Azinic acids (ethylideneazinic acid) |
|
48.35 |
|
Zwitterions with onium and ide centres on one heteroatom chain |
|
48.36 |
|
Ylides: an onium cation next to a carbanion |
|
48.4 |
|
Heterones of Si, Ge, P, As (dimethylsilanone) |
|
48.5 |
|
Sulfines (thiocarbonyl S-oxides) |
|
48.6 |
|
Acyl groups on Si, Ge, P or As |
|
48.65 |
|
Acyl groups on a chalcogen chain of three or more atoms |
|
48.66 |
|
Phosphanimines at lambda-5 |
|
48.7 |
|
Imines on a P, As or Si hydride |
|
48.75 |
|
Sulfane imides and oxides at lambda-4 and lambda-6 |
|
49 |
|
Ketenes (ethenone and its halogen derivatives) |
|
49.5 |
|
Oxides of ring chalcogens (dibenzo[b,d]thiophene 5-oxide) |
|
49.6 |
|
Peroxols on partly hydrogenated fused carbocycles |
|
49.7 |
|
Acyclic thioimides |
|
49.75 |
|
Nitramides with N-substituents |
|
49.8 |
|
Lactides and other cyclic di- or polyesters (glycolide) |
|
50 |
|
Metal-carbon compounds and sandwich complexes |
|
100 |
|
Salts of several components |
|
200 |
|
Radicals |
|
250 |
|
Lipids built on glycerol, phosphoglycerol or a sphingoid base |
|
300 |
|
Zwitterions with net charge zero |
|
301 |
|
Net-charged ester-anion zwitterions (choline-type phosphate esters) |
|
302 |
|
Net-charged ions with both cation and anion sites |
|
400 |
|
Anions with a retained name (acetate, benzoate) |
|
480 |
|
Quaternary ammonium cations |
|
490 |
|
Atoms, ions and isotopes of a metal the scope table admits (zinc, zinc(2+), (65Zn)zinc) |
|
500 |
|
Cations with a retained name |
|
600 |
|
Single anions of up to 25 heavy atoms |
|
700 |
|
Anions with two or more anionic sites |
|
800 |
|
Neutral co-crystals and solvates, each component named in turn |
|
900 |
|
Symmetric molecules joined by a central group (multiplicative names) |
|
1000 |
|
Carbohydrates: table lookup, then anomer and configuration |
|
1100 |
|
Steroids, alkaloids and terpenes |
|
1200 |
|
Peptides |
|
1300 |
|
Whole molecules that have a retained name (naphthalene) |
|
1400 |
|
Amino acids |
|
1500 |
|
Chains with heteroatoms in the skeleton (‘a’ nomenclature) |
|
1600 |
|
Cyclophanes |
|
1700 |
|
Inositols (cyclitols) |
|
1800 |
|
Nucleosides and nucleotides with a decoration (phosphates, acyl esters) |
|
99000 |
|
Naming a large molecule from its fragments; may decline, and the pipeline goes on |
|
99999 |
|
Catch-all. It returns nothing on purpose, and |
|
Inner handlers#
Priority |
Handler id |
What it names |
File |
|---|---|---|---|
50 |
|
Ions, salts, zwitterions and radicals, before the candidate pool |
|
100 |
|
Oximes |
|
200 |
|
Hydrazones |
|
300 |
|
N-oxides |
|
400 |
|
Isocyanates |
|
500 |
|
Isothiocyanates |
|
600 |
|
Carbamic acids |
|
700 |
|
Carbamates |
|
800 |
|
Ureas |
|
810 |
|
Thioureas and chalcogen ureas |
|
900 |
|
Guanidines |
|
950 |
|
Cyanamides |
|
975 |
|
Nitrile oxides |
|
1000 |
|
Boronic acids |
|
1100 |
|
Acyl halides |
|
1150 |
|
Sulfonyl and sulfinyl halides |
|
1175 |
|
Imidoyl, thioyl and selenoyl halides |
|
1200 |
|
Acid anhydrides |
|
1300 |
|
Monocyclic lactones |
|
1400 |
|
Monocyclic lactams |
|
1450 |
|
Ester groups on a ring parent (acyloxy prefix) |
|
1490 |
|
Chain diamides, with N-substituents |
|
1495 |
|
Esters of non-carbon acids (sulfonic, sulfinic, pseudoesters) |
|
1500 |
|
Polyfunctional molecules, multiple esters and esters, tried in that order. Names many molecules that are not esters |
|
1800 |
|
Sulfoxides |
|
1801 |
|
Selenoxides |
|
1802 |
|
Telluroxides |
|
1900 |
|
Sulfones |
|
1901 |
|
Selenones |
|
1902 |
|
Telluroxones |
|
2000 |
|
Sulfides (thioethers) |
|
2100 |
|
Phosphine oxides |
|
2200 |
|
Phosphate esters |
|
2205 |
|
Sulfate esters |
|
2210 |
|
Esters of phosphinic, arsinic and stibinic acids |
|
2300 |
|
Phosphines |
|
2350 |
|
Phosphonic acids |
|
2352 |
|
Arsonic acids |
|
2354 |
|
Arsinic acids |
|
2356 |
|
Stibonic acids |
|
2358 |
|
Stibinic acids |
|
2360 |
|
Phosphonous acids |
|
2362 |
|
Phosphinous acids |
|
2364 |
|
Arsonous acids |
|
2366 |
|
Arsinous acids |
|
2368 |
|
Stibonous acids |
|
2370 |
|
Stibinous acids |
|
2400 |
|
Phosphinic acids |
|
2500 |
|
Ring assemblies (biphenyl and the like) |
|
2600 |
|
Polycyclic aromatic hydrocarbons with a retained name |
|
2700 |
|
Partly saturated carbocycles (tetralin shape) |
|
2800 |
|
Single atoms, noble gases, small simple molecules |
|
2900 |
|
Imidates (iminoesters) |
|
2950 |
|
Selenium and tellurium esters |
|
2960 |
|
Nitrite esters |
|
2962 |
|
Nitrate esters |
|
2965 |
|
Thiocyanates |
|
2970 |
|
N-substituted sulfonamides |
|
4500 |
|
The ring cascade: complex rings, polycycles, partly saturated rings, heterocycles, benzene, then a chain; picks among the candidates |
|
5100 |
|
Nitriles on a ring |
|
5200 |
|
Amides with one amide group |
|
5210 |
|
Hydroxamic acids |
|
5211 |
|
Hydroximic acids |
|
5212 |
|
N-hydroxy sulfonimidic acids |
|
5240 |
|
Azines |
|
5250 |
|
Substituted hydroxylamines |
|
5290 |
|
N-substituted acyclic imines |
|
5300 |
|
Secondary and tertiary amines |
|
99999 |
|
Catch-all for chains and ring substituents; always returns a name or raises |
|
Where the code mentions each Blue Book section#
The number of times the code (comments, docstrings and strings) mentions a section, with the modules that mention it most. A mention is not a promise that the module implements the section, and a number copied into a comment can be wrong. Use the table to find the neighbourhood of a rule, then read.
Section |
Title |
Mentions |
Modules that mention it most |
|---|---|---|---|
P-14 |
General Rules |
1446 |
|
P-15 |
Types of Nomenclature |
276 |
|
P-16 |
Name Writing |
1026 |
|
P-21 |
Mononuclear and Acyclic Polynuclear Parent Hydrides |
108 |
|
P-22 |
Monocyclic Parent Hydrides |
200 |
|
P-23 |
Polyalicyclic Parent Hydrides (Extended von Baeyer System) |
199 |
|
P-24 |
Spiro Ring Systems |
262 |
|
P-25 |
Fused and Bridged Fused Ring Systems |
635 |
|
P-26 |
Phane Nomenclature |
60 |
|
P-28 |
Ring Assemblies |
140 |
|
P-29 |
Prefixes Denoting Substituent Groups Derived from Parent Hydrides |
359 |
|
P-31 |
Modification of the Degree of Hydrogenation of Parent Hydrides |
416 |
|
P-35 |
Prefixes Corresponding to Characteristic Groups |
61 |
|
P-41 |
Seniority Order for Classes |
220 |
|
P-44 |
Seniority order for parent structures |
448 |
|
P-45 |
Selection of the Preferred IUPAC Name |
175 |
|
P-46 |
The Principal Chain in Substituent Groups |
70 |
|
P-51 |
Selecting the Preferred Type of IUPAC Nomenclature |
104 |
|
P-52 |
Selecting Preferred IUPAC Names and Preselected Names for Parent Hydrides |
100 |
|
P-54 |
Selecting the Preferred Method for Modifying the Degree of Hydrogenation |
44 |
|
P-58 |
Selecting Preferred IUPAC Names |
139 |
|
P-59 |
Name Construction |
91 |
|
P-61 |
Substitutive Nomenclature: Prefix Mode |
73 |
|
P-62 |
Amines and Imines |
146 |
|
P-63 |
Hydroxy Compounds, Ethers, Peroxols, Peroxides, and Chalcogen Analogues |
327 |
|
P-64 |
Ketones, Pseudoketones, Heterones, and Chalcogen Analogues |
137 |
|
P-65 |
Acids, Acyl Halides and Pseudohalides, Salts, Esters, and Anhydrides |
903 |
|
P-66 |
Amides, Imides, Hydrazides, Nitriles, and Aldehydes |
809 |
|
P-67 |
Mononuclear and Polynuclear Noncarbon Acids and their Functional Replacement Analogues as Functional Parents for Naming Organic Compounds |
414 |
|
P-68 |
Nomenclature of Organic Compounds of the Group 13, 14, 15, 16, and 17 Elements not Included in Sections P-62 through P-67 |
341 |
|
P-69 |
Nomenclature for Organometallic Compounds |
147 |
|
P-71 |
Radicals |
132 |
|
P-72 |
Anions |
233 |
|
P-73 |
Cations |
279 |
|
P-74 |
Zwitterions |
237 |
|
P-82 |
Isotopically Substituted Compounds |
285 |
|
P-91 |
Stereoisomer Graphical Representation and Naming |
110 |
|
P-93 |
Configuration Specification |
70 |
|
P-101 |
Nomenclature for Natural Products Based on Parent Hydrides (Alkaloids, Steroids, Terpenes, Carotenes, Corrinoids, Tetrapyrroles, and Similar Compounds) |
55 |
|
P-102 |
Carbohydrate Nomenclature |
150 |
|
P-103 |
Amino Acids and Peptides |
97 |
|
Naming tables#
The tables are Python modules in src/orthonym/data/, and the retained names written by hand take precedence over the tables imported from OPSIN’s resource files (data/opsin_imports/).
Module |
What it holds (first line of its docstring) |
|---|---|
|
Amino acid data for trivial name lookups |
|
Retained names and data for bicyclic ring systems |
|
Blue Book tier-3 corpus: names the Blue Book marks |
|
Element -> cation word table for salt composition (IUPAC 2013 P-65.6.2.1) |
|
Centralized IUPAC chain naming module |
|
Retained-name table for N-coordinated metal-tetrapyrrole macrocycles |
|
Retained names for fused heterocyclic systems |
|
Monocyclic component registry for algorithmic fused ring naming |
|
Phase 169 Plan-01: Group-split topology-table loader |
|
Hantzsch-Widman heteroatom prefix data for systematic heterocycle naming |
|
Hantzsch-Widman stem suffix data for systematic heterocycle naming |
|
Retained names for common ions used in IUPAC nomenclature |
|
Which metals the engine names beside organic ions, and by which mechanism |
|
The multiplying prefixes: |
|
Natural product scaffold data and derivative lookup tables |
|
Retained names + lookup tables for IUPAC P-69 organometallic compounds |
|
Aromatic reference templates for partial saturation detection |
|
Single loader for the curated IUPAC-2013 PIN allow/deny list |
|
Polycyclic Aromatic Hydrocarbon (PAH) data for IUPAC naming |
|
Resonance-shifted (bond_orders, charges) chain templates for terminal |
|
Retained (trivial) names that are preferred over systematic names |
|
Sugar retained names lookup table and glycosyloxy prefix formatting |
|
Acid name to acylate (-ate/-oate) conversion for ester naming |
|
Phase 168 Plan-01: Triviality-controller seed-table loader |
|
Xanthine derivatives data module for purine-based alkaloids |
How the counts were made#
Each count is made by walking the syntax trees of the modules under src/orthonym with Python’s ast module. Modules of validation/ are left out of the copy counts: the spelling checkers there re-encode the rules on purpose.
Count |
Pattern |
|---|---|
Calls and reads of a helper |
Calls of a function by name (a constant: reads of its name), outside the module that defines it |
Locants written by hand |
A string |
Wraps in brackets |
An f-string that is exactly |
Multiplier tables |
A dictionary literal whose keys are all integers and whose values include |
Vowel sets |
A string of at least four vowels from |
Citations of a section |
The text |