Cage builders¶
CageBuilder is the base class every topology-specific builder inherits
from; it holds the full build, optimise, enumerate, functionalise, save, and
statistics API. Topology-specific classes (Tri4Di6CageBuilder,
M6L12CubeCageBuilder, ...) only override the topology graph and the
point-group transformation library - see Topologies for
the full list.
CageBuilder ¶
CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: ABC
Abstract base class for building cage structures with isomer enumeration.
Each subclass hard-codes one STK topology graph and its symmetry transformation library. The shared workflow (build → functionalise → enumerate → statistics → SMILES) lives here.
Typical usage
cage = Tet2Di4CageBuilder(linker_smiles='Nc1ccc(N)cc1') cage.build() cage.functionalise() isomers = cage.enumerate_isomers(output_path='Tet2Di4_isomers') stats = cage.get_statistics() smi = cage.to_smiles()
For cages without an STK builder (e.g. Tet6Di12):
cage = Tet6Di12CageBuilder.load_from_file('base_structure/Tet6Di12.pdb') cage.functionalise()
Initialize a cage builder.
The linker and node may be provided as a SMILES string, an ASE
Atoms object, or a molecular structure file readable by ASE
(e.g. .xyz, .mol, .mol2, .sdf, .pdb or .cif).
Functional groups are assigned automatically using the following priority:
1. **Single atom** (nodes only)
If the node represents a single atom (e.g. ``"[Zn]"`` or an
ASE object containing one atom), an ``stk.SingleAtom``
building block is created automatically.
2. **Dummy atoms**
If dummy atoms (``[*]`` or ``[#0]``) are present, the SMARTS
factory
``[#0][*]``
is used automatically.
3. **User-specified factory**
If ``linker_fg`` or ``node_fg`` is supplied, that factory is
used.
4. **Automatic factory detection**
If no factory is supplied, all factories in
``FG_FACTORY_MAP`` are searched until a compatible functional
group is found.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
linker
|
MoleculeInput
|
Linker building block. May be one of
Defaults to |
None
|
node
|
MoleculeInput
|
Cage node. May be one of
Defaults to |
None
|
linker_fg
|
str or FunctionalGroupFactory
|
Functional group factory assigned to the linker. May be
Defaults to |
None
|
node_fg
|
str or FunctionalGroupFactory
|
Functional group factory assigned to the node. Use Defaults to |
None
|
node_fg_count
|
int
|
Number of functional groups assigned to a single-atom node. Ignored for multi-atom nodes. Defaults to |
None
|
smarts_pattern
|
str
|
SMARTS pattern used when |
None
|
optimizer_step
|
float
|
Step size used by the STK |
0.01
|
distance_threshold
|
float
|
Distance threshold (Å) supplied to the STK |
5.0
|
scale_multiplier
|
float
|
Forwarded to the STK topology graph's own Rule of thumb: build once at the default 1.0, note the resulting
node-to-node distance |
1.0
|
expansion_factor
|
float
|
After STK assembly, each building-block subunit is translated rigidly so that its distance from the cage centroid is multiplied by this factor. Internal geometries are preserved exactly. Use values slightly above 1.0 when bulky multi-atom nodes (e.g. Zr6 clusters with CH3-capped peripheral connections) physically overlap their neighbours in the initial STK placement. A value too large will leave a visible gap between the node and linker bond sites; use the smallest value that eliminates the clash. Rule of thumb: if the node's outer radius is |
1.0
|
linker_smiles
|
str
|
Deprecated alias for Included for backwards compatibility with earlier releases. |
None
|
node_smiles
|
str
|
Deprecated alias for Included for backwards compatibility with earlier releases. |
None
|
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
build ¶
Build the cage using the configured node and linker.
Returns:
| Type | Description |
|---|---|
ConstructedMolecule
|
Constructed STK cage. |
Notes
Building blocks are generated automatically from the supplied node
and linker inputs before constructing the topology graph.
If expansion_factor > 1, each subunit is translated rigidly
outward after assembly (see :meth:_expand_cage_rigid).
Source code in cage_isomer_builder/cage/base.py
count_unique_isomers_burnside ¶
Count unique isomers via Burnside's lemma without full enumeration. Useful for large cages where iterating over 4^n_linkers is impractical.
Returns:
| Name | Type | Description |
|---|---|---|
n_unique |
int
|
|
Source code in cage_isomer_builder/cage/base.py
enumerate_isomers ¶
Enumerate symmetry-unique isomers using the transformation library.
Walks candidate isomers with iter_unique_isomers, which checks each candidate directly against its own symmetry orbit instead of allocating a fg_per_linker**n_linkers flag array - the array is what used to raise MemoryError on a periodic structure with more than a couple dozen linkers (see docs/isomers.md). Memory use here is O(1) in n_linkers regardless of limit; runtime is unchanged (still one orbit check per raw combination visited) unless you pass limit, which stops early instead of walking the full space.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
output_path
|
str
|
Directory to write XYZ structure files. No files are written if None or if generate_files is False. |
None
|
generate_files
|
bool
|
Write one XYZ file per unique isomer (default True). |
True
|
limit
|
int
|
Stop after this many unique isomers instead of walking the entire fg_per_linkern_linkers space. Use this for cages/MOFs where the full count (from count_unique_isomers_burnside) is too large to fully enumerate - canonical representatives occur roughly 1-in-|symmetry group order| along the walk, not 1-in-fg_per_linkern_linkers, so a modest limit is normally fast even when the full space isn't. |
None
|
Returns:
| Name | Type | Description |
|---|---|---|
unique_isomers |
list of list of int
|
Each element is a base-4 isomer descriptor. |
Source code in cage_isomer_builder/cage/base.py
1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 | |
functionalise ¶
Functionalise the cage and identify functional-group anchor sites.
Returns:
| Name | Type | Description |
|---|---|---|
fg_anchors |
Atoms
|
Functionalised ASE structure containing the generated anchor atoms. |
fg_anchor_indices |
list[int]
|
Indices of the anchor atoms used for isomer enumeration. |
Source code in cage_isomer_builder/cage/base.py
get_bond_matrix ¶
This cage's bond-order matrix, taken directly from the STK construction rather than re-perceived from geometry - the same matrix write_run/write_gulp_gin use, for the same reason: a real bond order survives even where two bonded atoms sit unusually far apart, which a distance-based guess on the whole structure can miss (or, on a larger assembly like a host-guest complex, wrongly add between atoms that are merely close together but not bonded).
Needed by anything building on top of this cage's own bonding without re-perceiving it - e.g. utils.functionalise.place_guest_in_host's host_bond_matrix parameter, which keeps the host's real bonds and the union of each guest's own (separately, safely perceived) internal bonds, rather than running one neighbour-list pass over the merged host+guest structure.
Returns:
| Type | Description |
|---|---|
(ndarray, shape(n_atoms, n_atoms))
|
|
Raises:
| Type | Description |
|---|---|
RuntimeError
|
If build() hasn't been called - a structure loaded via load_from_file() has no STK-derived bond order information. |
Source code in cage_isomer_builder/cage/base.py
get_statistics ¶
Compute FG-to-FG distance statistics and a Gaussian KDE for this cage.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
n_kde_bins
|
int
|
Number of evaluation points for the KDE curve (default 200). |
200
|
Returns:
| Name | Type | Description |
|---|---|---|
stats |
CageStatistics
|
|
Source code in cage_isomer_builder/cage/base.py
load_from_file
classmethod
¶
Create a builder from an existing molecular structure.
This method bypasses STK construction and instead loads an existing cage structure directly into the builder. The loaded structure may subsequently be functionalised, analysed, or enumerated.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
path
|
str or Path
|
Path to a molecular structure readable by ASE (e.g. PDB, CIF, XYZ, MOL or SDF). |
required |
**init_kwargs
|
Additional keyword arguments forwarded to the constructor. |
{}
|
Returns:
| Type | Description |
|---|---|
CageBuilder
|
Builder initialized from the supplied structure. |
Source code in cage_isomer_builder/cage/base.py
optimise ¶
optimise(fmax: float = 0.05, steps: int = 500, optimizer_cls=None, trajectory: Optional[str] = None, rigid_sbus: bool = True, include_charges: bool = True, charge: float = 0.0, method: str = 'UFF4MOF') -> Atoms
Run ASE geometry optimisation on the cage.
Two backends are available, selected via method:
"UFF4MOF"(default) - a classical force field evaluated from the STK bond matrix and explicit UFF atom types (see :mod:cage_isomer_builder.utils.optimise). Bond connectivity is taken from the STK-constructed cage and respected exactly, which matters when inter-atomic distances in the initial geometry are atypical (bulky multi-atom nodes, an expanded cage, ...) and would confuse a distance-only bond perception."GFN1-xTB"/"GFN2-xTB"- a tblite GFN-xTB electronic structure calculation. Unlike UFF4MOF, xTB needs no explicit bond-order matrix or atom typing - it derives its own electronic structure directly from atomic numbers and positions - but for the same reason it cannot be told to honour a specific bond matrix.
Call this after :meth:build and before :meth:functionalise.
If called after :meth:functionalise, the At marker atoms are
stripped before optimisation (they are not real chemistry) and
:meth:functionalise should be re-run afterwards.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
fmax
|
float
|
Force convergence threshold in eV/Å. |
0.05
|
steps
|
int
|
Maximum number of optimisation steps. |
500
|
optimizer_cls
|
ASE optimizer class
|
Any |
None
|
trajectory
|
str
|
Path for an ASE |
None
|
rigid_sbus
|
bool
|
Treat every node/linker SBU as a rigid body (see
:class: |
False
|
include_charges
|
bool
|
Store per-atom partial charges on the returned |
True
|
charge
|
float
|
Total charge of the structure, passed to tblite - either as the
xTB optimisation's own charge, or (for |
0.0
|
method
|
str
|
|
"UFF4MOF"
|
Returns:
| Type | Description |
|---|---|
Atoms
|
Optimised cage structure. |
Source code in cage_isomer_builder/cage/base.py
1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 | |
save ¶
Save the cage structure to file.
If the cage was built with STK, STK's writer is used for PDB files.
Otherwise, the ASE structure is written using ase.io.write.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
path
|
str
|
Output file path, e.g. |
required |
Source code in cage_isomer_builder/cage/base.py
to_ase ¶
Return the cage as an ASE Atoms object. Converts from the STK cage if not already done.
Source code in cage_isomer_builder/cage/base.py
to_smiles ¶
Convert the cage to a SMILES string using mofstructure (OpenBabel).
Returns:
| Name | Type | Description |
|---|---|---|
smiles |
str
|
|
write_ams_run ¶
Write an AMS geometry-optimisation run script for this cage.
The generated .run file contains:
Task GeometryOptimization- Cartesian coordinates under
System / Atoms - Bond orders under
System / BondOrders(from the STK bond matrix) - Lattice vectors if the structure is periodic
Engine DFTBblock
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
path
|
str or Path
|
Output file path, e.g. |
required |
Raises:
| Type | Description |
|---|---|
RuntimeError
|
If :meth: |
Source code in cage_isomer_builder/cage/base.py
write_gulp_gin ¶
Write a GULP molecular-mechanics input file for this cage.
Uses gulp_setup - the same UFF4MOF atom-typing backend behind
optimise(method="UFF4MOF") - to assign UFF4MOF atom types and
write a ready-to-run .gin file: cartesian coordinates, explicit
connect bond records taken from the STK bond matrix (so bond
order is respected exactly rather than re-perceived from geometry),
and a uff4mof species/library block.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
path
|
str or Path
|
Output file path, e.g. |
required |
lattice
|
str
|
GULP lattice-optimisation keyword: |
"conv"
|
mechanical
|
bool
|
Use |
False
|
Raises:
| Type | Description |
|---|---|
RuntimeError
|
If :meth: |
Notes
gulp_setup.mmanalysis.write_gin maps each bond order to a GULP
bond-type keyword via a fixed lookup ({4, 3, 2, 1.5, 1, 0.5, 0.25});
a bond order outside that set raises KeyError. The STK bond
matrix normally only contains integer orders (plus 1.5 for
perceived aromaticity), so this doesn't come up in practice.
Source code in cage_isomer_builder/cage/base.py
CageStatistics
dataclass
¶
CageStatistics(n_linkers: int, n_fg_slots: int, n_unique_isomers: int, distance_keys: list, total_fg_pairs: list, endo_endo_pairs: list, endo_exo_pairs: list, exo_exo_pairs: list, kde_x: ndarray, kde_y: ndarray)
Statistics for a cage topology computed after functionalisation.
Attributes:
| Name | Type | Description |
|---|---|---|
n_linkers |
int
|
Number of ditopic linkers in the cage. |
n_fg_slots |
int
|
Total number of functional group anchor slots (n_linkers × 4). |
n_unique_isomers |
int
|
Number of symmetry-unique isomers (Burnside's lemma result). |
distance_keys |
list of float
|
Sorted unique inter-linker FG-to-FG distances in Angstroms. |
total_fg_pairs |
list of int
|
Total active FG pair count at each distance. |
endo_endo_pairs |
list of int
|
Pair counts where both anchors point inward (endo-endo). |
endo_exo_pairs |
list of int
|
Pair counts with one inward and one outward anchor (endo-exo). |
exo_exo_pairs |
list of int
|
Pair counts where both anchors point outward (exo-exo). |
kde_x |
ndarray
|
Distance grid at which the KDE was evaluated. |
kde_y |
ndarray
|
KDE density values rescaled to total pair count. |
Topology-specific builders¶
Tet2Di4CageBuilder ¶
Tet2Di4CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tet2Di4 — 2 tetratopic nodes + 4 ditopic linkers (TwoPlusFour). D4h.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tet3_3Di3CageBuilder ¶
Tet3_3Di3CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tet3-3Di3 — 3 tetratopic nodes + 6 ditopic linkers (_ThreePlusSix). D3h.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tet4_4Di8CageBuilder ¶
Tet4_4Di8CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tet4-4Di8 — 4 tetratopic nodes + 8 ditopic linkers (FourPlusEight). D4h.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tet5Di10CageBuilder ¶
Tet5Di10CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tet5Di10 — 5 tetratopic nodes (pentagonal arrangement) + 10 ditopic linkers (FivePlusTen). D5h.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tet6Di12CageBuilder ¶
Tet6Di12CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tet6Di12 — 6 tetratopic nodes + 12 ditopic linkers (SixPlusTwelve). Oh.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tet8Di16CageBuilder ¶
Tet8Di16CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tet8Di16 — 8 tetratopic nodes + 16 ditopic linkers (EightPlusSixteen). D4d.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tet16Di32CageBuilder ¶
Bases: CageBuilder
Tet16Di32 — M12L24, 12 tetratopic nodes + 24 ditopic linkers. D4h.
Source code in cage_isomer_builder/cage/library.py
Tet24Di48CageBuilder ¶
Tet24Di48CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tet24Di48 — M24L48, 24 tetratopic nodes + 48 ditopic linkers. Oh.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tri2Di3CageBuilder ¶
Tri2Di3CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tri2Di3 — 2 tritopic (triamine) nodes + 3 ditopic linkers (_TwoPlusThree). D3h.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tri4Di6CageBuilder ¶
Tri4Di6CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tri4Di6 — 4 tritopic nodes + 6 ditopic linkers (FourPlusSix). Td.
Symmetry is derived from the 4 node CoMs via universal_transformation_library (base-class default), so multi-atom SBU nodes (e.g. Zr6 clusters) work correctly without the BFS-overlap problem that affects point-atom detection.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tri4_2Di6CageBuilder ¶
Tri4_2Di6CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tri4-2Di6 — 4 tritopic nodes + 6 ditopic linkers (FourPlusSix2 isomeric variant). D2h.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tri6Di9CageBuilder ¶
Tri6Di9CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tri6Di9 — 6 tritopic nodes + 9 ditopic linkers (SixPlusNine). D3h.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tri8Di12CageBuilder ¶
Tri8Di12CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tri8Di12 — 8 tritopic nodes + 12 ditopic linkers (EightPlusTwelve). Oh.
Symmetry derived from 8 node CoMs via universal_transformation_library.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tri20Di30CageBuilder ¶
Tri20Di30CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tri20Di30 — 20 tritopic nodes + 30 ditopic linkers (TwentyPlusThirty). Ih.
Full enumeration of 4^30 isomers is impractical; use count_unique_isomers_burnside() instead.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tet6Tri8CageBuilder ¶
Tet6Tri8CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tet6Tri8 — 6 tetratopic nodes + 8 tritopic linkers (SixPlusEight). Oh.
Isomer enumeration is not supported (tritopic linkers break the FG-per-linker assumption).
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tri4Tri4CageBuilder ¶
Tri4Tri4CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tri4Tri4 — 4 + 4 tritopic building blocks (FourPlusFour). Td.
Isomer enumeration not yet supported.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tri1Tri1CageBuilder ¶
Tri1Tri1CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tri1Tri1 — 1 + 1 tritopic building blocks (OnePlusOne). C3v.
Isomer enumeration not yet supported.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
Tri2_2Tri2CageBuilder ¶
Tri2_2Tri2CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
Tri2²Tri2 — 2 + 2 tritopic building blocks (TwoPlusTwo). D2h.
Isomer enumeration not yet supported.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
M2L4LanternCageBuilder ¶
M2L4LanternCageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
M2L4Lantern — 2 tetratopic nodes + 4 ditopic linkers. D4h.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
M3L6CageBuilder ¶
M3L6CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
M3L6 — 3 tetratopic nodes + 6 ditopic linkers. D3h.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
M4L6TetrahedronSpacerCageBuilder ¶
M4L6TetrahedronSpacerCageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
M4L6TetrahedronSpacer — 4 tritopic nodes + 6 ditopic (spacered) linkers. Td.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
M4L8CageBuilder ¶
M4L8CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
M4L8 — 4 tetratopic nodes + 8 ditopic linkers. D2d.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
M4L82CageBuilder ¶
M4L82CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
M4L82 — 4 tetratopic nodes + 8 ditopic linkers (M4L8 vertex-arrangement isomer). D2d.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
M4L8xCageBuilder ¶
M4L8xCageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
M4L8x — 4 tetratopic nodes + 8 ditopic linkers (M4L8 vertex-arrangement isomer). D2d.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
M6L12CubeCageBuilder ¶
M6L12CubeCageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
M6L12Cube — 6 tetratopic nodes + 12 ditopic linkers. Oh.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
M8L6CubeCageBuilder ¶
M8L6CubeCageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
M8L6Cube — 8 tritopic corner nodes + 6 tetratopic face linkers. Oh.
Unlike most other topologies here, linker must be tetratopic (4
functional groups), not ditopic - it caps a cube face, not an edge.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
M9L18CageBuilder ¶
M9L18CageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
M9L18 — 9 tetratopic nodes + 18 ditopic linkers.
Isomer enumeration is not supported: with 9 metal nodes, universal_transformation_library's node-permutation search (N! permutations) is past the practical limit (see its docstring).
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
TenPlusTwentyCageBuilder ¶
TenPlusTwentyCageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
TenPlusTwenty — 10 tetratopic nodes + 20 ditopic linkers.
Isomer enumeration not supported - see M9L18.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |
TwelvePlusThirtyCageBuilder ¶
TwelvePlusThirtyCageBuilder(linker: MoleculeInput = None, node: MoleculeInput = None, linker_fg=None, node_fg=None, node_fg_count: int = None, smarts_pattern: str = None, optimizer_step: float = 0.01, distance_threshold: float = 5.0, expansion_factor: float = 1.0, scale_multiplier: float = 1.0, linker_smiles: str = None, node_smiles: str = None)
Bases: CageBuilder
TwelvePlusThirty — 12 pentatopic nodes + 30 ditopic linkers. Ih.
Isomer enumeration not supported - see M9L18.
Source code in cage_isomer_builder/cage/base.py
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 | |