This page documents an OPTIMADE Property Definition. See https://schemas.optimade.org/ for more information.
ID: https://schemas.httk.org/defs/v0.1/properties/transformations/transformations_per_hm_entry
Definition name: transformations_per_hm_entry
Property name: Transformations per H-M entry
Description: Transformation data grouped by H-M entry.
Type: list
Each list item contains the H-M entry as ordinary data together with all transformation sections generated for that setting.
This representation avoids using H-M entries as JSON dictionary keys in the OPTIMADE-described payload.
The accompanying hall_entry field identifies the Hall symbol used to compute the symmetry operations and normalizer data.
The centering_translations field gives the setting's centering translations directly in each record, so modulo-centering operation lists can be interpreted without joining against another dataset.
Requirements/Conventions:
hm_entry.hall_entry and the generated transformation sections for that setting.euclidean_normalizer.symops_mod_centering is present, the same dictionary SHOULD contain centering_translations.Examples:
[{"hm_entry": "P 1", "hall_entry": "p_1", "centering_translations": [["0", "0", "0"]], "baernighausen": []}]JSON definition:
{
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/transformations_per_hm_entry",
"$schema": "https://schemas.optimade.org/meta/v1.3/optimade/property_definition.json",
"title": "Transformations per H-M entry",
"x-optimade-type": "list",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "transformations_per_hm_entry",
"label": "transformations_per_hm_entry_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Transformation data grouped by H-M entry.\n\nEach list item contains the H-M entry as ordinary data together with all transformation sections generated for that setting.\nThis representation avoids using H-M entries as JSON dictionary keys in the OPTIMADE-described payload.\nThe accompanying `hall_entry` field identifies the Hall symbol used to compute the symmetry operations and normalizer data.\nThe `centering_translations` field gives the setting's centering translations directly in each record, so modulo-centering operation lists can be interpreted without joining against another dataset.\n\n**Requirements/Conventions**:\n\n- It MUST be a list of dictionaries.\n- Each dictionary MUST contain `hm_entry`.\n- Each dictionary SHOULD contain `hall_entry` and the generated transformation sections for that setting.\n- If `euclidean_normalizer.symops_mod_centering` is present, the same dictionary SHOULD contain `centering_translations`.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "Transformation record for one H-M entry.",
"required": [
"hm_entry"
],
"properties": {
"hm_entry": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/hm_entry",
"title": "Hermann-Mauguin entry",
"x-optimade-type": "string",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "hm_entry",
"label": "hm_entry_spacegroups"
},
"type": [
"string",
"null"
],
"description": "The Hermann-Mauguin entry label for a conventional space-group setting from table A1.4.2.7 of the [International Tables for Crystallography (2006). Volume B, Reciprocal space. ISBN: 978-0-7923-6592-1, doi:10.1107/97809553602060000102](https://doi.org/10.1107/97809553602060000102).\n\nThe symbol is a full Hermann-Mauguin-style setting label, except that:\n\n* The older glide-plane letters are used, rather than the newer `e` notation introduced in the Fourth Edition of the International Tables for Crystallography (1995) for the space groups Aem2 (39), Aea2 (41), Cmce (64), Cmme (67) and Ccce (68).\n* When necessary to disambiguate the 530 conventional settings, an origin-choice suffix (`:1`, `:2`) is used.\n\n**Requirements/Conventions**:\n\n- The value MUST be written as a plain string with spaces between Hermann-Mauguin symbol parts.\n- The disambiguation suffix MUST be a colon `:` and an integer appended to the string without whitespace, for example `:1` or `:2`.\n\nThis lookup key preserves capitalization and spaces: unlike `hall_entry`, it is not lowercased or underscore-normalized.\nH-M entries and their aliases are resolved through the dataset's H-M-entry index; more than one conventional label can identify the same generated Hall record.\nThis label selects a setting convention; use the embedded affine operations to perform coordinate transformations.",
"x-optimade-unit": "inapplicable",
"examples": [
"P 1",
"C c c a:1",
"C c c b:2"
]
},
"hall_entry": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/hall_entry",
"title": "Hall entry",
"x-optimade-type": "string",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "hall_entry",
"label": "hall_entry_spacegroups"
},
"type": [
"string",
"null"
],
"description": "Normalized Hall-table entry key used internally by the generated datasets.\n\nThe value is derived from the Hall symbol by using lowercase letters and underscores in place of spaces. It is stable for lookup within these data files, while the display Hall symbol is provided separately by `hall` and its formatted variants.\n\n**Requirements/Conventions**:\n\n- This field identifies a concrete Hall setting, not only an IT space-group type.\n- The same value is normally used as the key of the containing `spacegroups` map.\n\nThe normalization is `hall.strip().replace(\" \", \"_\").lower()`; signs, quotes, asterisks, and origin-shift notation are retained.\nThe key is a coordinate-setting identifier, not a numeric spglib Hall number.\nDifferent conventional H-M entry labels can resolve to the same Hall-entry record.",
"x-optimade-unit": "inapplicable",
"examples": [
"p_1",
"-p_1"
]
},
"centering_translations": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/centering_translations",
"title": "Centering translations",
"x-optimade-type": "list",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "centering_translations",
"label": "centering_translations_spacegroups"
},
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Centering translations of the conventional cell.\n\nEach list member is one exact fractional-coordinate centering translation as defined by `/properties/symmetry/centering_translation`.\nThe zero translation `(0,0,0)` is listed first.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/centering_translation",
"title": "Centering translation",
"x-optimade-type": "list",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "centering_translation",
"label": "centering_translation_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "One centering translation of a conventional crystallographic cell.\n\nThe translation is represented in fractional coordinates using exact fraction strings.\n\n**Requirements/Conventions**:\n\n- It MUST be a list of three exact fractional-coordinate components.\n- The zero translation is included in centering-translation lists and is normally listed first.\n\nThe components are coefficients of the recorded cell basis vectors, not Cartesian lengths.\nTranslations differing by an integer vector represent the same centering class; the generated list uses representatives modulo integer cell translations.",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
},
"examples": [
[
"0",
"0",
"0"
],
[
"1/2",
"1/2",
"0"
]
]
},
"examples": [
[
[
"0",
"0",
"0"
]
],
[
[
"0",
"0",
"0"
],
[
"1/2",
"1/2",
"0"
]
]
]
},
"euclidean_normalizer": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/euclidean_normalizer",
"title": "Euclidean normalizer",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "euclidean_normalizer",
"label": "euclidean_normalizer_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Finite Euclidean normalizer operations for one crystallographic space-group setting.\n\nThe Euclidean normalizer consists of metric-preserving affine operations that normalize the space group in the chosen setting.\nThese operations are useful for algorithms that need to compare or enumerate equivalent descriptions of the same setting under rigid crystallographic changes of coordinates.\n\nThis object is generated from the finite Euclidean normalizer operations exposed by cctbx.\nIt is not a bounded candidate search table.\nTherefore fields such as `candidate_set`, `candidate_sets`, and bounded-search `bounds` do not belong to this property.\n\nThis property is one of three related normalizer tables for a setting:\nthis property holds the finite Euclidean normalizer operations obtained from cctbx,\n`orthogonal_affine_normalizer` holds the older bounded coset table restricted to signed-permutation linear parts,\nand `affine_normalizer` holds the bounded coset table generated from unimodular integer linear parts.\nContinuous origin-shift freedoms are described separately by `continuous_normalizer`.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **normalizer\\_kind**: REQUIRED; String.\n Kind label for this normalizer contribution.\n For this property the value is `euclidean`.\n\n - **n\\_centering\\_translations**: REQUIRED; Integer.\n Number of centering translations represented in the underlying Euclidean normalizer operation construction.\n\n - **n\\_pointgroup\\_symops**: REQUIRED; Integer.\n Number of point-group symmetry operations represented before centering translations are combined with them.\n\n - **n\\_symops**: REQUIRED; Integer.\n Number of Euclidean normalizer operations listed in `symops`.\n This value MUST equal the length of `symops`.\n\n - **n\\_linear\\_parts**: REQUIRED; Integer.\n Number of distinct linear matrix parts represented in `symops`.\n\n - **symops**: REQUIRED; List of dictionaries.\n Finite Euclidean normalizer operations for the setting.\n Each item follows `/defs/v0.1/properties/symmetry/op`.\n\n - **symops\\_mod\\_centering**: REQUIRED; List of dictionaries.\n Euclidean normalizer operations factorized modulo the centering translations of the setting.\n This keeps one operation for each linear part and translation class modulo centering, while `symops` keeps the complete operation list.\n Each item follows `/defs/v0.1/properties/symmetry/op`.\n\nThis is the finite operation list of the group obtained by expanding cctbx's additional Euclidean-normalizer generators, represented modulo integer translations of the recorded cell.\nIt includes the original space-group operations and the identity, unlike the nontrivial coset lists in the two affine-normalizer properties.\nThe normalizer's `n_centering_translations` counts its own pure-translation representatives, which can outnumber the centering translations of the original space group.\nIts `n_pointgroup_symops` equals `n_linear_parts`, and `n_symops = n_centering_translations * n_pointgroup_symops`.\nHowever, `symops_mod_centering` is factored by the original space group's `centering_translations` supplied in the containing H-M record.\nIts length is therefore `n_symops` divided by the length of that outer list and need not equal the normalizer's `n_pointgroup_symops`.",
"properties": {
"normalizer_kind": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Kind label for this normalizer contribution.",
"enum": [
"euclidean",
null
]
},
"n_centering_translations": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/n_centering_translations",
"title": "Number of centering translations",
"x-optimade-type": "integer",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "n_centering_translations",
"label": "n_centering_translations_spacegroups"
},
"type": [
"integer",
"null"
],
"description": "Number of centering translations in the conventional cell of the space-group setting.\n\nWhen the entry contains a `centering_translations` list, this value MUST equal its length.",
"x-optimade-unit": "inapplicable",
"examples": [
1,
2
]
},
"n_pointgroup_symops": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/pointgroups/n_pointgroup_symops",
"title": "Number of point-group operations",
"x-optimade-type": "integer",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "n_pointgroup_symops",
"label": "n_pointgroup_symops_pointgroups"
},
"type": [
"integer",
"null"
],
"description": "Number of point-group symmetry operations.\n\nFor a space-group entry this is the number of operations of the point group of the space group, and it MUST equal the length of the `symops_representative` list when present.\n\nPoint-group entries do not carry this field; their operation count is `order`.\nFor a space-group entry it is the order of the quotient by the full translation subgroup and MUST equal `n_symops / n_centering_translations`.\nInversion and other improper point operations are included.",
"x-optimade-unit": "inapplicable",
"examples": [
1,
2
]
},
"n_symops": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/n_symops",
"title": "Number of symops",
"x-optimade-type": "integer",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "n_symops",
"label": "n_symops_spacegroups"
},
"type": [
"integer",
"null"
],
"description": "Number of symmetry operations in the finite operation list of the generated entry.\n\nWhen the entry contains a `symops` list, this value MUST equal its length.",
"x-optimade-unit": "inapplicable",
"examples": [
1,
2
]
},
"n_linear_parts": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/n_linear_parts",
"title": "Number of linear parts",
"x-optimade-type": "integer",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "n_linear_parts",
"label": "n_linear_parts_transformations"
},
"type": [
"integer",
"null"
],
"description": "Number of distinct linear matrix parts represented in a normalizer or transform table.\n\nDistinctness is determined by exact element-wise comparison of the 3 by 3 matrix parts of the listed operations.\n\nThis value MUST equal the number of distinct `affine_transformation.matrix` values in the containing `symops` list when that list is present; translation differences do not increase it.",
"x-optimade-unit": "inapplicable",
"examples": [
2,
4
]
},
"symops": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Finite Euclidean normalizer operations for the setting.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/op",
"title": "Operation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "op",
"label": "op_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Information related to a crystallographic operation acting within one coordinate setting.\n\nRepresents an affine_transformation that is a crystallographic operation within one setting.\nThe affine map itself is stored in the embedded `affine_transformation` field.\nThe remaining fields classify the operation crystallographically, for example by rotation type, axis, sense, and screw or glide component.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **affine\\_transformation**: REQUIRED; Dictionary.\n Exact affine map for the operation.\n It MUST follow `/defs/v0.1/properties/symmetry/affine_transformation`.\n\n - **operation\\_kind**: OPTIONAL; String.\n The value `euclidean` identifies an operation emitted within a Euclidean-normalizer table; ordinary point-group and space-group operation records omit it.\n\n - **rot\\_type**: OPTIONAL; String.\n Crystallographic operation-type label for the linear part.\n\n - **axis**: OPTIONAL; List of 3 Integers.\n Operation axis or invariant direction using the integer-vector convention returned by the generator.\n\n - **sense**: OPTIONAL; Integer.\n Rotation sense/sign convention returned by the generator; `0` is used when no handed rotation sense is applicable.\n\n - **screw\\_glide**: OPTIONAL; List of 3 Fractions (String).\n Screw-axis or glide-plane component associated with a space-group affine operation.\n\n - **origin\\_shift**: OPTIONAL; List of 3 Fractions (String).\n Origin shift associated with the screw/glide decomposition of a space-group affine operation.\n\n- Whether the operation is proper follows from the sign of the `det` field of `affine_transformation`; no separate properness flag is stored.\n\nWriting the affine part as `(W,w)`, the intrinsic translation `screw_glide = v` is defined by `(W,w)^n = (I,n*v)`, where `n` is the order of `W`.\nThe reported `origin_shift = q` satisfies `(I-W)*q = w-v`; moving the coordinate origin to `q` leaves the intrinsic translation `v`.\nIt locates the symmetry element and is not a second translation to add to `w`.\nFor a proper rotation, `axis` is the integer direction fixed by `W`; for a rotoinversion it is the rotation axis fixed by `-W`, hence for a mirror it is the plane-normal direction.\nThese are direct-lattice direction components, not Cartesian unit vectors or reciprocal-plane indices.\nThe identity and inversion use `[0,0,0]` because neither has a unique axis.\nThe signed `sense` follows cctbx's rotation/rotoinversion convention about that reported axis; converting a rotoinversion to a Schoenflies rotation-reflection symbol can reverse the rotation sense.",
"properties": {
"affine_transformation": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/affine_transformation",
"title": "Affine transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "affine_transformation",
"label": "affine_transformation_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "An affine transformation acting on fractional crystallographic coordinates.\n\nAn invertible affine transformation preserves collinearity and parallelism, but need not preserve Euclidean distances or angles.\nA singular affine map can collapse a line or plane to a lower-dimensional image.\nThe transformation is represented by a 3 by 3 matrix and a 3-vector, both serialized with exact string entries.\nWith column vectors, the map is `u_out = matrix * u_in + vector`; matrix rows specify the three output components.\nThe containing property identifies whether `u_in` denotes fractional coordinates or abstract Wyckoff parameters and identifies the input and output settings.\nNo wrapping modulo lattice translations is implicit in this equation; apply any required periodic reduction only in the specified output setting.\nThe transformation may, for example, represent an operation within one setting, a setting transform, a subgroup embedding, a normalizer representative, or a parametric coordinate map for a Wyckoff-position orbit representative.\nWhen used as a parametric coordinate map, the matrix may be singular because special Wyckoff positions can constrain or identify parameters.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **matrix**: REQUIRED; Exact 3x3 matrix.\n Matrix part of the affine transformation.\n It MUST be represented as a list of three row lists, each containing three exact rational entries represented as strings.\n\n - **vector**: REQUIRED; List of 3 Fractions (String).\n Translation or origin-shift vector of the affine transformation in fractional coordinates.\n\n - **xyz**: OPTIONAL; String.\n Coordinate expression for the affine transformation in `x,y,z` notation when available.\n It MUST express the same affine map as `matrix` and `vector`, using `x,y,z` for the input components.\n\n - **det**: OPTIONAL; Integer.\n Determinant of `matrix` when the generator emits it.\n\n - **is\\_orthogonal**: OPTIONAL; Boolean.\n Whether the linear part preserves the crystallographic metric family specified by the containing setting; this is not a test of the fractional matrix against the Cartesian identity metric.",
"properties": {
"matrix": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_lattice"
],
"sizes": [
3,
3
]
},
"type": [
"array",
"null"
],
"description": "Exact 3 by 3 matrix part of the affine transformation.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One row of the exact 3 by 3 matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"vector": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Exact fractional-coordinate vector part of the affine transformation.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
},
"xyz": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/op_xyz",
"title": "Operation xyz",
"x-optimade-type": "string",
"x-compatibility": [
"https://schemas.optimade.org/defs/v1.2/properties/optimade/common/symmetry_operation_xyz",
"https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html"
],
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "op_xyz",
"label": "op_xyz_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Coordinate operation expressed in the algebraic xyz form, also known as Jones' faithful representation (Bradley & Cracknell, 1972: pp. 35-37; adapted for computer strings).\n\nThe following definition is adapted from (and meant to be compatible with) the IUCr symCIF version 1.0.1 dictionary definition of `_space_group_symop.operation_xyz` referenced to: International Tables for Crystallography (2002). Volume A, Space-group symmetry, edited by Th. Hahn, 5th. ed. (Kluwer Academic Publishers).\nIt is available at: https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html\n\nIf W is a matrix representation of the rotational part of the symmetry operation defined by the positions and signs of x, y and z, and w is a column of translations defined by the fractions, an equivalent position X' is generated from a given position X by the equation: X' = WX + w.",
"x-undef-pattern": "^([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?)$",
"examples": [
"-x,-y,z",
"x,1/2-y,1/2+z"
]
},
"det": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Determinant of the matrix part when emitted by the generator.\nThis optional integer annotation MUST equal the exact determinant of `matrix`; its absence does not imply determinant one.\nRational matrices can have noninteger determinants, in which case this integer annotation is omitted."
},
"is_orthogonal": {
"x-optimade-type": "boolean",
"x-optimade-unit": "inapplicable",
"type": [
"boolean",
"null"
],
"description": "Whether the matrix part is an isometry of the setting's metric, i.e. it preserves every metric tensor of the setting's crystal family expressed in this basis.\nFor a same-setting matrix `M` and metric tensor `g`, the criterion is `M^T g M = g` for every positive-definite metric in that family.\nThis is orthogonality with respect to the actual (generally non-Cartesian) lattice metric, not orthogonality of the matrix as a plain array: hexagonal sixfold rotations are isometries, whereas a cell-enlarging transform is not."
}
},
"examples": [
{
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,z",
"det": 1,
"is_orthogonal": true
}
]
},
"operation_kind": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"enum": [
"euclidean"
],
"description": "Euclidean-normalizer context when present; this does not change the operation's affine action."
},
"rot_type": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Symbolic crystallographic operation-type label for the linear part.",
"enum": [
"1",
"-1",
"2",
"m",
"3",
"-3",
"4",
"-4",
"6",
"-6",
null
]
},
"axis": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Integer-vector axis or invariant-direction descriptor for the operation.",
"items": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer"
],
"description": "One integer component of the axis vector."
}
},
"sense": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Rotation sense/sign convention returned by the generator; zero for identity, inversion, twofold rotation, and mirror operations.",
"enum": [
-1,
0,
1,
null
]
},
"screw_glide": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Screw-axis or glide-plane component represented exactly as a list of fraction strings.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
},
"origin_shift": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Origin-shift descriptor represented exactly as a list of fraction strings.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"examples": [
{
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,z",
"det": 1,
"is_orthogonal": true
},
"rot_type": "2",
"sense": 0,
"axis": [
0,
0,
1
],
"screw_glide": [
"0",
"0",
"0"
],
"origin_shift": [
"0",
"0",
"0"
]
}
]
}
},
"symops_mod_centering": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/symops_mod_centering",
"title": "Symmetry operations modulo centering translations",
"x-optimade-type": "list",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "symops_mod_centering",
"label": "symops_mod_centering_spacegroups"
},
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Representative symmetry-operation descriptors modulo centering translations.\n\nEach list member is an operation on the format defined by the property definition: https://schemas.httk.org/defs/v0.1/properties/symmetry/op\n\nTwo listed full operations are equivalent here when their matrices agree and their translation vectors differ by a centering translation modulo integer cell translations.\nThere is one representative for each point-group operation, including inversion-related operations.\nFor a space-group record, the list length MUST equal `n_pointgroup_symops`.\nCombining each representative with every `centering_translations` vector and reducing translations modulo integers recovers `symops` as a set.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/op",
"title": "Operation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "op",
"label": "op_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Information related to a crystallographic operation acting within one coordinate setting.\n\nRepresents an affine_transformation that is a crystallographic operation within one setting.\nThe affine map itself is stored in the embedded `affine_transformation` field.\nThe remaining fields classify the operation crystallographically, for example by rotation type, axis, sense, and screw or glide component.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **affine\\_transformation**: REQUIRED; Dictionary.\n Exact affine map for the operation.\n It MUST follow `/defs/v0.1/properties/symmetry/affine_transformation`.\n\n - **operation\\_kind**: OPTIONAL; String.\n The value `euclidean` identifies an operation emitted within a Euclidean-normalizer table; ordinary point-group and space-group operation records omit it.\n\n - **rot\\_type**: OPTIONAL; String.\n Crystallographic operation-type label for the linear part.\n\n - **axis**: OPTIONAL; List of 3 Integers.\n Operation axis or invariant direction using the integer-vector convention returned by the generator.\n\n - **sense**: OPTIONAL; Integer.\n Rotation sense/sign convention returned by the generator; `0` is used when no handed rotation sense is applicable.\n\n - **screw\\_glide**: OPTIONAL; List of 3 Fractions (String).\n Screw-axis or glide-plane component associated with a space-group affine operation.\n\n - **origin\\_shift**: OPTIONAL; List of 3 Fractions (String).\n Origin shift associated with the screw/glide decomposition of a space-group affine operation.\n\n- Whether the operation is proper follows from the sign of the `det` field of `affine_transformation`; no separate properness flag is stored.\n\nWriting the affine part as `(W,w)`, the intrinsic translation `screw_glide = v` is defined by `(W,w)^n = (I,n*v)`, where `n` is the order of `W`.\nThe reported `origin_shift = q` satisfies `(I-W)*q = w-v`; moving the coordinate origin to `q` leaves the intrinsic translation `v`.\nIt locates the symmetry element and is not a second translation to add to `w`.\nFor a proper rotation, `axis` is the integer direction fixed by `W`; for a rotoinversion it is the rotation axis fixed by `-W`, hence for a mirror it is the plane-normal direction.\nThese are direct-lattice direction components, not Cartesian unit vectors or reciprocal-plane indices.\nThe identity and inversion use `[0,0,0]` because neither has a unique axis.\nThe signed `sense` follows cctbx's rotation/rotoinversion convention about that reported axis; converting a rotoinversion to a Schoenflies rotation-reflection symbol can reverse the rotation sense.",
"properties": {
"affine_transformation": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/affine_transformation",
"title": "Affine transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "affine_transformation",
"label": "affine_transformation_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "An affine transformation acting on fractional crystallographic coordinates.\n\nAn invertible affine transformation preserves collinearity and parallelism, but need not preserve Euclidean distances or angles.\nA singular affine map can collapse a line or plane to a lower-dimensional image.\nThe transformation is represented by a 3 by 3 matrix and a 3-vector, both serialized with exact string entries.\nWith column vectors, the map is `u_out = matrix * u_in + vector`; matrix rows specify the three output components.\nThe containing property identifies whether `u_in` denotes fractional coordinates or abstract Wyckoff parameters and identifies the input and output settings.\nNo wrapping modulo lattice translations is implicit in this equation; apply any required periodic reduction only in the specified output setting.\nThe transformation may, for example, represent an operation within one setting, a setting transform, a subgroup embedding, a normalizer representative, or a parametric coordinate map for a Wyckoff-position orbit representative.\nWhen used as a parametric coordinate map, the matrix may be singular because special Wyckoff positions can constrain or identify parameters.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **matrix**: REQUIRED; Exact 3x3 matrix.\n Matrix part of the affine transformation.\n It MUST be represented as a list of three row lists, each containing three exact rational entries represented as strings.\n\n - **vector**: REQUIRED; List of 3 Fractions (String).\n Translation or origin-shift vector of the affine transformation in fractional coordinates.\n\n - **xyz**: OPTIONAL; String.\n Coordinate expression for the affine transformation in `x,y,z` notation when available.\n It MUST express the same affine map as `matrix` and `vector`, using `x,y,z` for the input components.\n\n - **det**: OPTIONAL; Integer.\n Determinant of `matrix` when the generator emits it.\n\n - **is\\_orthogonal**: OPTIONAL; Boolean.\n Whether the linear part preserves the crystallographic metric family specified by the containing setting; this is not a test of the fractional matrix against the Cartesian identity metric.",
"properties": {
"matrix": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_lattice"
],
"sizes": [
3,
3
]
},
"type": [
"array",
"null"
],
"description": "Exact 3 by 3 matrix part of the affine transformation.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One row of the exact 3 by 3 matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"vector": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Exact fractional-coordinate vector part of the affine transformation.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
},
"xyz": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/op_xyz",
"title": "Operation xyz",
"x-optimade-type": "string",
"x-compatibility": [
"https://schemas.optimade.org/defs/v1.2/properties/optimade/common/symmetry_operation_xyz",
"https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html"
],
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "op_xyz",
"label": "op_xyz_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Coordinate operation expressed in the algebraic xyz form, also known as Jones' faithful representation (Bradley & Cracknell, 1972: pp. 35-37; adapted for computer strings).\n\nThe following definition is adapted from (and meant to be compatible with) the IUCr symCIF version 1.0.1 dictionary definition of `_space_group_symop.operation_xyz` referenced to: International Tables for Crystallography (2002). Volume A, Space-group symmetry, edited by Th. Hahn, 5th. ed. (Kluwer Academic Publishers).\nIt is available at: https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html\n\nIf W is a matrix representation of the rotational part of the symmetry operation defined by the positions and signs of x, y and z, and w is a column of translations defined by the fractions, an equivalent position X' is generated from a given position X by the equation: X' = WX + w.",
"x-undef-pattern": "^([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?)$",
"examples": [
"-x,-y,z",
"x,1/2-y,1/2+z"
]
},
"det": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Determinant of the matrix part when emitted by the generator.\nThis optional integer annotation MUST equal the exact determinant of `matrix`; its absence does not imply determinant one.\nRational matrices can have noninteger determinants, in which case this integer annotation is omitted."
},
"is_orthogonal": {
"x-optimade-type": "boolean",
"x-optimade-unit": "inapplicable",
"type": [
"boolean",
"null"
],
"description": "Whether the matrix part is an isometry of the setting's metric, i.e. it preserves every metric tensor of the setting's crystal family expressed in this basis.\nFor a same-setting matrix `M` and metric tensor `g`, the criterion is `M^T g M = g` for every positive-definite metric in that family.\nThis is orthogonality with respect to the actual (generally non-Cartesian) lattice metric, not orthogonality of the matrix as a plain array: hexagonal sixfold rotations are isometries, whereas a cell-enlarging transform is not."
}
},
"examples": [
{
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,z",
"det": 1,
"is_orthogonal": true
}
]
},
"operation_kind": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"enum": [
"euclidean"
],
"description": "Euclidean-normalizer context when present; this does not change the operation's affine action."
},
"rot_type": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Symbolic crystallographic operation-type label for the linear part.",
"enum": [
"1",
"-1",
"2",
"m",
"3",
"-3",
"4",
"-4",
"6",
"-6",
null
]
},
"axis": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Integer-vector axis or invariant-direction descriptor for the operation.",
"items": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer"
],
"description": "One integer component of the axis vector."
}
},
"sense": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Rotation sense/sign convention returned by the generator; zero for identity, inversion, twofold rotation, and mirror operations.",
"enum": [
-1,
0,
1,
null
]
},
"screw_glide": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Screw-axis or glide-plane component represented exactly as a list of fraction strings.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
},
"origin_shift": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Origin-shift descriptor represented exactly as a list of fraction strings.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"examples": [
{
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,z",
"det": 1,
"is_orthogonal": true
},
"rot_type": "2",
"sense": 0,
"axis": [
0,
0,
1
],
"screw_glide": [
"0",
"0",
"0"
],
"origin_shift": [
"0",
"0",
"0"
]
}
]
},
"examples": [
[
{
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "x,y,z"
},
"rot_type": "1",
"sense": 0,
"axis": [
0,
0,
0
],
"screw_glide": [
"0",
"0",
"0"
],
"origin_shift": [
"0",
"0",
"0"
]
}
]
]
}
},
"examples": [
{
"normalizer_kind": "euclidean",
"n_centering_translations": 1,
"n_pointgroup_symops": 2,
"n_symops": 2,
"n_linear_parts": 2,
"symops": [
{
"rot_type": "-1",
"sense": 0,
"axis": [
0,
0,
0
],
"screw_glide": [
"0",
"0",
"0"
],
"origin_shift": [
"0",
"0",
"0"
],
"operation_kind": "euclidean",
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"-1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,-z",
"det": -1,
"is_orthogonal": true
}
},
{
"rot_type": "1",
"sense": 0,
"axis": [
0,
0,
0
],
"screw_glide": [
"0",
"0",
"0"
],
"origin_shift": [
"0",
"0",
"0"
],
"operation_kind": "euclidean",
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "x,y,z",
"det": 1,
"is_orthogonal": true
}
}
],
"symops_mod_centering": [
{
"rot_type": "-1",
"sense": 0,
"axis": [
0,
0,
0
],
"screw_glide": [
"0",
"0",
"0"
],
"origin_shift": [
"0",
"0",
"0"
],
"operation_kind": "euclidean",
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"-1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,-z",
"det": -1,
"is_orthogonal": true
}
},
{
"rot_type": "1",
"sense": 0,
"axis": [
0,
0,
0
],
"screw_glide": [
"0",
"0",
"0"
],
"origin_shift": [
"0",
"0",
"0"
],
"operation_kind": "euclidean",
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "x,y,z",
"det": 1,
"is_orthogonal": true
}
}
]
}
]
},
"hall_to_it_std_transform": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/hall_to_it_std_transform",
"title": "Hall to IT standard transform",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "hall_to_it_std_transform",
"label": "hall_to_it_std_transform_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Exact basis and origin transform from one stored Hall setting to the International Tables standard Hall setting of the same space-group type.\n\nThis transform is useful when data generated or detected in an arbitrary Hall setting needs to be compared with a conventional IT-standard reference setting.\nThe transform is represented by `matrix` and `vector`, following the same affine-transformation convention as the other generated transformation tables.\n\nIf `x_to_ref_hall` is a fractional coordinate column vector in the target IT-standard Hall setting, and `x_from_hall` is the corresponding fractional coordinate column vector in the source Hall setting keyed by the containing map, then the stored transform satisfies:\n`x_from_hall = matrix * x_to_ref_hall + vector`.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary describing one exact transform from the containing Hall setting to the IT-standard Hall setting of the same `it_number`.\n- The `index` value is always `1`, because this is a same-space-group setting transform rather than a proper subgroup transform.\n- Matrix and vector entries MUST be exact strings, using integer strings or fraction strings as appropriate.\n- It MUST be a dictionary with the following keys:\n\n - **hall\\_entry**: REQUIRED; String.\n Source Hall-entry key for the setting transformed by this object.\n\n - **it\\_number**: REQUIRED; Integer.\n International Tables space-group number shared by the source and target Hall settings.\n\n - **to\\_hall\\_entry**: REQUIRED; String.\n Target Hall-entry key for the IT-standard Hall setting of the same space-group type.\n\n - **index**: REQUIRED; Integer.\n Transform index.\n For this table the value is `1` because the transform maps between settings of the same space group.\n\n - **affine\\_transformation**: REQUIRED; Dictionary.\n Exact affine map for this setting transform.\n It MUST follow `/defs/v0.1/properties/symmetry/affine_transformation`.\n The transform convention is `x_from_hall = matrix * x_to_ref_hall + vector`, where `matrix` and `vector` are the fields inside `affine_transformation`.\n\nDespite the source-to-standard purpose of the record, the stored affine map sends target-standard coordinates to source coordinates.\nTo convert a source coordinate to the standard setting, evaluate `matrix^-1 * (x_from_hall-vector)`.\nWith cell basis vectors arranged as columns, `B_standard = B_source * matrix`.\nThe transformed operation is `W_standard = matrix^-1*W_source*matrix` with translation `matrix^-1*(W_source*vector + w_source - vector)`.\nChanging between centered and primitive descriptions can change the determinant without changing the group index.",
"properties": {
"hall_entry": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/hall_entry",
"title": "Hall entry",
"x-optimade-type": "string",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "hall_entry",
"label": "hall_entry_spacegroups"
},
"type": [
"string",
"null"
],
"description": "Normalized Hall-table entry key used internally by the generated datasets.\n\nThe value is derived from the Hall symbol by using lowercase letters and underscores in place of spaces. It is stable for lookup within these data files, while the display Hall symbol is provided separately by `hall` and its formatted variants.\n\n**Requirements/Conventions**:\n\n- This field identifies a concrete Hall setting, not only an IT space-group type.\n- The same value is normally used as the key of the containing `spacegroups` map.\n\nThe normalization is `hall.strip().replace(\" \", \"_\").lower()`; signs, quotes, asterisks, and origin-shift notation are retained.\nThe key is a coordinate-setting identifier, not a numeric spglib Hall number.\nDifferent conventional H-M entry labels can resolve to the same Hall-entry record.",
"x-optimade-unit": "inapplicable",
"examples": [
"p_1",
"-p_1"
]
},
"it_number": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/it_number",
"title": "International Tables space-group number",
"x-optimade-type": "integer",
"x-compatibility": [
"https://schemas.optimade.org/defs/v1.2/properties/optimade/structures/space_group_it_number"
],
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "it_number",
"label": "it_number_spacegroups"
},
"type": [
"integer",
"null"
],
"description": "The International Tables space-group number.\n\nThis integer identifies the space-group type numbered 1 through 230 in International Tables for Crystallography. Multiple Hall settings can share the same `it_number`.",
"x-optimade-unit": "inapplicable",
"examples": [
1,
5
]
},
"to_hall_entry": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/to_hall_entry",
"title": "To Hall entry",
"x-optimade-type": "string",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "to_hall_entry",
"label": "to_hall_entry_transformations"
},
"type": [
"string",
"null"
],
"description": "Target Hall-entry key to which a setting transform maps the current Hall setting.\n\nThe value is a normalized Hall-entry key following the same convention as `/defs/v0.1/properties/spacegroups/hall_entry`, i.e., derived from the Hall symbol by using lowercase letters and underscores in place of spaces.\nThe corresponding display Hall symbol can be recovered by looking up the key in the spacegroups dataset.",
"x-optimade-unit": "inapplicable",
"examples": [
"p_1",
"-p_1"
]
},
"index": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/index",
"title": "Subgroup or transform index",
"x-optimade-type": "integer",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "index",
"label": "index_transformations"
},
"type": [
"integer",
"null"
],
"description": "Subgroup or transform index.\n\nFor subgroup transforms it is the crystallographic subgroup index `[G:H]`, equal to the determinant factor of the basis transformation when applicable.\n\nFor the column-vector convention `x_G = P*x_H + p`, the exact index formula is `[G:H] = abs(det(P)) * n_symops(G) / n_symops(H)`.\nEquivalently it is the product of the translation index `i_T = abs(det(P))*n_centering_translations(G)/n_centering_translations(H)` and the point-group index `i_P = n_pointgroup_symops(G)/n_pointgroup_symops(H)`.\nThus a point-symmetry reduction can have index greater than one even when `det(P) = 1`.\nIn `hall_to_it_std_transform` the value is one even if the two cell conventions have different volumes; an ordinal index in another table must be interpreted as documented by that parent property.",
"x-optimade-unit": "inapplicable",
"examples": [
2,
4
]
},
"affine_transformation": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/affine_transformation",
"title": "Affine transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "affine_transformation",
"label": "affine_transformation_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "An affine transformation acting on fractional crystallographic coordinates.\n\nAn invertible affine transformation preserves collinearity and parallelism, but need not preserve Euclidean distances or angles.\nA singular affine map can collapse a line or plane to a lower-dimensional image.\nThe transformation is represented by a 3 by 3 matrix and a 3-vector, both serialized with exact string entries.\nWith column vectors, the map is `u_out = matrix * u_in + vector`; matrix rows specify the three output components.\nThe containing property identifies whether `u_in` denotes fractional coordinates or abstract Wyckoff parameters and identifies the input and output settings.\nNo wrapping modulo lattice translations is implicit in this equation; apply any required periodic reduction only in the specified output setting.\nThe transformation may, for example, represent an operation within one setting, a setting transform, a subgroup embedding, a normalizer representative, or a parametric coordinate map for a Wyckoff-position orbit representative.\nWhen used as a parametric coordinate map, the matrix may be singular because special Wyckoff positions can constrain or identify parameters.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **matrix**: REQUIRED; Exact 3x3 matrix.\n Matrix part of the affine transformation.\n It MUST be represented as a list of three row lists, each containing three exact rational entries represented as strings.\n\n - **vector**: REQUIRED; List of 3 Fractions (String).\n Translation or origin-shift vector of the affine transformation in fractional coordinates.\n\n - **xyz**: OPTIONAL; String.\n Coordinate expression for the affine transformation in `x,y,z` notation when available.\n It MUST express the same affine map as `matrix` and `vector`, using `x,y,z` for the input components.\n\n - **det**: OPTIONAL; Integer.\n Determinant of `matrix` when the generator emits it.\n\n - **is\\_orthogonal**: OPTIONAL; Boolean.\n Whether the linear part preserves the crystallographic metric family specified by the containing setting; this is not a test of the fractional matrix against the Cartesian identity metric.",
"properties": {
"matrix": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_lattice"
],
"sizes": [
3,
3
]
},
"type": [
"array",
"null"
],
"description": "Exact 3 by 3 matrix part of the affine transformation.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One row of the exact 3 by 3 matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"vector": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Exact fractional-coordinate vector part of the affine transformation.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
},
"xyz": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/op_xyz",
"title": "Operation xyz",
"x-optimade-type": "string",
"x-compatibility": [
"https://schemas.optimade.org/defs/v1.2/properties/optimade/common/symmetry_operation_xyz",
"https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html"
],
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "op_xyz",
"label": "op_xyz_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Coordinate operation expressed in the algebraic xyz form, also known as Jones' faithful representation (Bradley & Cracknell, 1972: pp. 35-37; adapted for computer strings).\n\nThe following definition is adapted from (and meant to be compatible with) the IUCr symCIF version 1.0.1 dictionary definition of `_space_group_symop.operation_xyz` referenced to: International Tables for Crystallography (2002). Volume A, Space-group symmetry, edited by Th. Hahn, 5th. ed. (Kluwer Academic Publishers).\nIt is available at: https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html\n\nIf W is a matrix representation of the rotational part of the symmetry operation defined by the positions and signs of x, y and z, and w is a column of translations defined by the fractions, an equivalent position X' is generated from a given position X by the equation: X' = WX + w.",
"x-undef-pattern": "^([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?)$",
"examples": [
"-x,-y,z",
"x,1/2-y,1/2+z"
]
},
"det": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Determinant of the matrix part when emitted by the generator.\nThis optional integer annotation MUST equal the exact determinant of `matrix`; its absence does not imply determinant one.\nRational matrices can have noninteger determinants, in which case this integer annotation is omitted."
},
"is_orthogonal": {
"x-optimade-type": "boolean",
"x-optimade-unit": "inapplicable",
"type": [
"boolean",
"null"
],
"description": "Whether the matrix part is an isometry of the setting's metric, i.e. it preserves every metric tensor of the setting's crystal family expressed in this basis.\nFor a same-setting matrix `M` and metric tensor `g`, the criterion is `M^T g M = g` for every positive-definite metric in that family.\nThis is orthogonality with respect to the actual (generally non-Cartesian) lattice metric, not orthogonality of the matrix as a plain array: hexagonal sixfold rotations are isometries, whereas a cell-enlarging transform is not."
}
},
"examples": [
{
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,z",
"det": 1,
"is_orthogonal": true
}
]
}
},
"examples": [
{
"hall_entry": "p_1",
"it_number": 1,
"to_hall_entry": "p_1",
"index": 1,
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
]
}
}
]
},
"orthogonal_affine_normalizer": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/orthogonal_affine_normalizer",
"title": "Orthogonal affine normalizer",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "orthogonal_affine_normalizer",
"label": "orthogonal_affine_normalizer_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Orthogonal affine normalizer coset representatives for one crystallographic space-group setting.\n\nThe representatives are listed modulo the space group itself, so each listed operation represents an equivalence class of affine normalizer operations rather than every operation in that class.\nThis property contains the signed-permutation subset of affine normalizer representatives.\n\nThe `candidate_set` field belongs in this property because the listed representatives are produced from a deliberately restricted finite candidate set.\nFor this property `candidate_set` is `signed_permutation_matrices`, meaning 3 by 3 integer matrices with exactly one nonzero entry in each row and column and each nonzero entry equal to `-1` or `1`.\nThe plural field `candidate_sets` is not part of the emitted data and MUST NOT be used here.\n\nThis property is one of three related normalizer tables for a setting:\n`euclidean_normalizer` holds the finite Euclidean normalizer operations obtained from cctbx,\nthis property holds the older bounded table restricted to signed-permutation linear parts,\nand `affine_normalizer` holds the bounded table generated from unimodular integer linear parts, whose linear candidate set contains the signed-permutation set.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **normalizer\\_kind**: REQUIRED; String.\n Kind label for this normalizer contribution.\n\n - **representation**: REQUIRED; String.\n Representation label for the listed data.\n\n - **candidate\\_set**: REQUIRED; String.\n Name of the finite linear candidate set used for generation.\n\n - **n\\_symops**: REQUIRED; Integer.\n Number of listed coset representatives after metric-compatibility filtering.\n It MUST equal the length of `symops`.\n\n - **n\\_linear\\_parts**: REQUIRED; Integer.\n Number of distinct exact linear matrix parts represented in `symops`.\n This count ignores translation differences and can be smaller than `n_symops`.\n\n - **n\\_raw\\_candidates**: REQUIRED; Integer.\n Number of accepted affine normalizer candidates generated before quotienting by the space group and metric filtering; the candidate list itself is not stored.\n\n - **n\\_unique\\_candidates**: OPTIONAL; Integer.\n Legacy count of unique affine candidates before quotienting by the space group.\n The current canonical-coset composition does not emit this field; it is retained to describe older records.\n\n - **n\\_coset\\_representatives**: REQUIRED; Integer.\n Number of non-trivial coset representatives before metric-compatibility filtering.\n\n - **bounds**: REQUIRED; Dictionary.\n Simple numerical bounds satisfied by the signed-permutation candidate matrices.\n\n - **symops**: REQUIRED; List of dictionaries.\n Listed orthogonal affine normalizer coset representatives.\n Each item follows `/defs/v0.1/properties/symmetry/basis_transform`.\n Each item MUST carry `compatible_systems`, the list of reference-setting metric families whose every metric tensor is preserved after transport to the actual setting basis.\n\nFor the infinite space group G, an affine map A normalizes G when `A*G*A^-1 = G`, including its full translation lattice.\nRepresentatives differing by multiplication by an element of G describe the same coset.\nThe identity coset G itself is omitted, but a nonzero pure translation can represent a nontrivial coset and MUST NOT be discarded just because its matrix is identity.\nContinuous origin shifts are represented separately by `continuous_normalizer`; this finite list is not all of `N_A(G)/G`.\nA nonempty `compatible_systems` list means the linear part preserves every metric in at least one listed reference-setting family after transport to the recorded Hall basis.\nIt need not preserve the actual setting's general metric; that distinction is recorded by `affine_transformation.is_orthogonal`.\nThe signed-permutation candidate set is contained in the bounded integer candidate set, but independently chosen coset representatives need not appear as identical affine matrices and vectors in both lists.\n\nThe historical word orthogonal names the signed-permutation search: `M^T*M = I` as a numerical matrix condition.\nIn a fractional basis this is not sufficient for physical orthogonality, which instead requires `M^T*g*M = g` for the relevant lattice metric g.\n\nThe example is the nontrivial half-cell origin-shift coset for Pm-3m (No. 221); multiplication by inversion in the space group explains the displayed linear part `-I`.",
"properties": {
"normalizer_kind": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Kind label for this normalizer contribution.",
"enum": [
"orthogonal_affine",
null
]
},
"representation": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Representation label for the listed normalizer data.",
"enum": [
"orthogonal_coset_representatives",
null
]
},
"candidate_set": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Name of the finite linear candidate set used for generation.",
"enum": [
"signed_permutation_matrices",
null
]
},
"n_symops": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/n_symops",
"title": "Number of symops",
"x-optimade-type": "integer",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "n_symops",
"label": "n_symops_spacegroups"
},
"type": [
"integer",
"null"
],
"description": "Number of symmetry operations in the finite operation list of the generated entry.\n\nWhen the entry contains a `symops` list, this value MUST equal its length.",
"x-optimade-unit": "inapplicable",
"examples": [
1,
2
]
},
"n_linear_parts": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/n_linear_parts",
"title": "Number of linear parts",
"x-optimade-type": "integer",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "n_linear_parts",
"label": "n_linear_parts_transformations"
},
"type": [
"integer",
"null"
],
"description": "Number of distinct linear matrix parts represented in a normalizer or transform table.\n\nDistinctness is determined by exact element-wise comparison of the 3 by 3 matrix parts of the listed operations.\n\nThis value MUST equal the number of distinct `affine_transformation.matrix` values in the containing `symops` list when that list is present; translation differences do not increase it.",
"x-optimade-unit": "inapplicable",
"examples": [
2,
4
]
},
"n_raw_candidates": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Number of accepted affine normalizer candidates generated before quotienting by the space group and metric filtering; the candidate list itself is not stored."
},
"n_unique_candidates": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Legacy count of unique affine candidates before quotienting by the space group; omitted by the current generator."
},
"n_coset_representatives": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Number of non-trivial coset representatives before metric-compatibility filtering."
},
"bounds": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Simple numerical bounds satisfied by the signed-permutation candidate matrices.",
"properties": {
"det_abs": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Absolute determinant of every signed-permutation candidate matrix."
},
"max_abs_linear_entry": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Maximum absolute entry value in the signed-permutation candidate matrices."
}
}
},
"symops": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Listed orthogonal affine normalizer coset representatives.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/basis_transform",
"title": "Basis transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "basis_transform",
"label": "basis_transform_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "One crystallographic transform between coordinate descriptions, settings, cells, or related group embeddings.\n\nThe affine map itself is stored in the embedded `affine_transformation` field.\nThe parent property defines the source and target coordinate systems and the precise role of the transform.\nFor a subgroup embedding the convention is `x_G = P*x_H + p`, where `P = affine_transformation.matrix` and `p = affine_transformation.vector`.\nThe columns of `P` are the subgroup cell vectors expressed in the parent fractional basis, and `p` is the subgroup origin expressed in that basis.\nThus conversion of parent coordinates to subgroup coordinates uses `x_H = P^-1*(x_G-p)`, not the forward affine map.\nUseful, for example, for representing setting changes, subgroup embeddings, isomorphic subgroup transforms, normalizer representatives, and same-space-group affine images.\nThis property is not limited to symmetry operations within one fixed setting; the matrix may be non-orthogonal or have determinant different from one when the transform changes cell or basis.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **affine\\_transformation**: REQUIRED; Dictionary.\n Exact affine map for the transform, using exact rational matrix and vector entries.\n The coordinate convention and source/target interpretation are supplied by the parent property.\n\n - **index**: OPTIONAL; Integer or null.\n Index metadata whose interpretation is defined by the parent property.\n Common uses include the subgroup index for subgroup embeddings, the cell index for isomorphic subgroup transforms, or an ordinal representative index in a finite transform table.\n\n - **subgroup\\_type**: OPTIONAL; String.\n Translation/point-symmetry classification when supplied for a subgroup embedding.\n The value MUST be `t` for a translationengleiche subgroup or `k` for a klassengleiche subgroup.\n It MUST be omitted for identity embeddings and general subgroups that lose both translations and point symmetry, and for transforms that are not subgroup embeddings.\n Presence of `t` or `k` alone does not certify maximality; the containing relation table supplies that information.\n\n - **k\\_subtype**: OPTIONAL; String or null.\n Klassengleiche subtype when the transform describes a klassengleiche subgroup relation.\n The value MUST be `loss_of_centering_translation` or `enlarged_unit_cell` for klassengleiche relations and null or omitted otherwise.\n\n - **compatible\\_systems**: OPTIONAL; List of strings.\n Reference-setting metric families whose every metric tensor is preserved by the linear part after transport to the actual setting basis.\n This is used for bounded affine normalizer representatives.\n\n - **operation\\_kind**: OPTIONAL; String.\n Categorical label for normalizer-type representatives.\n The value MUST be `euclidean` for Euclidean normalizer operations, `orthogonal_affine` for the signed-permutation affine normalizer subset, or `affine` for the bounded unimodular affine normalizer table.\n It MUST be omitted when the transform is a setting transform, subgroup embedding, or other transform for which no normalizer operation class applies.\n\n - **wyckoff\\_splitting**: OPTIONAL; List.\n Wyckoff-position splitting metadata induced by the transform when available.\n The list is grouped by explicit parent Wyckoff letter.\n\n - **criteria**: OPTIONAL; List.\n Backward-lift constraint metadata induced by the transform when available.\n The list is grouped by explicit parent Wyckoff letter.",
"properties": {
"affine_transformation": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/affine_transformation",
"title": "Affine transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "affine_transformation",
"label": "affine_transformation_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "An affine transformation acting on fractional crystallographic coordinates.\n\nAn invertible affine transformation preserves collinearity and parallelism, but need not preserve Euclidean distances or angles.\nA singular affine map can collapse a line or plane to a lower-dimensional image.\nThe transformation is represented by a 3 by 3 matrix and a 3-vector, both serialized with exact string entries.\nWith column vectors, the map is `u_out = matrix * u_in + vector`; matrix rows specify the three output components.\nThe containing property identifies whether `u_in` denotes fractional coordinates or abstract Wyckoff parameters and identifies the input and output settings.\nNo wrapping modulo lattice translations is implicit in this equation; apply any required periodic reduction only in the specified output setting.\nThe transformation may, for example, represent an operation within one setting, a setting transform, a subgroup embedding, a normalizer representative, or a parametric coordinate map for a Wyckoff-position orbit representative.\nWhen used as a parametric coordinate map, the matrix may be singular because special Wyckoff positions can constrain or identify parameters.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **matrix**: REQUIRED; Exact 3x3 matrix.\n Matrix part of the affine transformation.\n It MUST be represented as a list of three row lists, each containing three exact rational entries represented as strings.\n\n - **vector**: REQUIRED; List of 3 Fractions (String).\n Translation or origin-shift vector of the affine transformation in fractional coordinates.\n\n - **xyz**: OPTIONAL; String.\n Coordinate expression for the affine transformation in `x,y,z` notation when available.\n It MUST express the same affine map as `matrix` and `vector`, using `x,y,z` for the input components.\n\n - **det**: OPTIONAL; Integer.\n Determinant of `matrix` when the generator emits it.\n\n - **is\\_orthogonal**: OPTIONAL; Boolean.\n Whether the linear part preserves the crystallographic metric family specified by the containing setting; this is not a test of the fractional matrix against the Cartesian identity metric.",
"properties": {
"matrix": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_lattice"
],
"sizes": [
3,
3
]
},
"type": [
"array",
"null"
],
"description": "Exact 3 by 3 matrix part of the affine transformation.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One row of the exact 3 by 3 matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"vector": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Exact fractional-coordinate vector part of the affine transformation.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
},
"xyz": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/op_xyz",
"title": "Operation xyz",
"x-optimade-type": "string",
"x-compatibility": [
"https://schemas.optimade.org/defs/v1.2/properties/optimade/common/symmetry_operation_xyz",
"https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html"
],
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "op_xyz",
"label": "op_xyz_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Coordinate operation expressed in the algebraic xyz form, also known as Jones' faithful representation (Bradley & Cracknell, 1972: pp. 35-37; adapted for computer strings).\n\nThe following definition is adapted from (and meant to be compatible with) the IUCr symCIF version 1.0.1 dictionary definition of `_space_group_symop.operation_xyz` referenced to: International Tables for Crystallography (2002). Volume A, Space-group symmetry, edited by Th. Hahn, 5th. ed. (Kluwer Academic Publishers).\nIt is available at: https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html\n\nIf W is a matrix representation of the rotational part of the symmetry operation defined by the positions and signs of x, y and z, and w is a column of translations defined by the fractions, an equivalent position X' is generated from a given position X by the equation: X' = WX + w.",
"x-undef-pattern": "^([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?)$",
"examples": [
"-x,-y,z",
"x,1/2-y,1/2+z"
]
},
"det": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Determinant of the matrix part when emitted by the generator.\nThis optional integer annotation MUST equal the exact determinant of `matrix`; its absence does not imply determinant one.\nRational matrices can have noninteger determinants, in which case this integer annotation is omitted."
},
"is_orthogonal": {
"x-optimade-type": "boolean",
"x-optimade-unit": "inapplicable",
"type": [
"boolean",
"null"
],
"description": "Whether the matrix part is an isometry of the setting's metric, i.e. it preserves every metric tensor of the setting's crystal family expressed in this basis.\nFor a same-setting matrix `M` and metric tensor `g`, the criterion is `M^T g M = g` for every positive-definite metric in that family.\nThis is orthogonality with respect to the actual (generally non-Cartesian) lattice metric, not orthogonality of the matrix as a plain array: hexagonal sixfold rotations are isometries, whereas a cell-enlarging transform is not."
}
},
"examples": [
{
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,z",
"det": 1,
"is_orthogonal": true
}
]
},
"index": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Index metadata whose interpretation is supplied by the parent property."
},
"subgroup_type": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "International Tables subgroup-type label when applicable.",
"enum": [
"t",
"k"
]
},
"k_subtype": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Klassengleiche subtype when applicable; follows the cell-dependent convention defined in `/defs/v0.1/properties/transformations/k_subtype`.",
"enum": [
"loss_of_centering_translation",
"enlarged_unit_cell",
null
]
},
"compatible_systems": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Crystal metric families, named by reference-setting crystal system, whose metric tensors are all preserved by the transform.\nEach family is the full linear space of metric tensors of that crystal system in the reference setting (including unconstrained cross terms), transported to the basis of the actual setting.\nMonoclinic reference metrics use unique axis b; trigonal and hexagonal reference metrics both use hexagonal axes with a = b and gamma = 120 degrees.\nThese labels describe the tested metric families, not a reassignment of the space group's crystal system or the accidental metric symmetry of a particular specimen.",
"items": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "One compatible crystal-system label.",
"enum": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
]
}
},
"operation_kind": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Categorical label for normalizer-type representatives.",
"enum": [
"euclidean",
"orthogonal_affine",
"affine"
]
},
"wyckoff_splitting": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/wyckoff_splitting",
"title": "Wyckoff splitting",
"x-optimade-type": "list",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "wyckoff_splitting",
"label": "wyckoff_splitting_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Wyckoff-position splitting data associated with a subgroup or same-space-group transform.\n\nEach list item gives the split of one parent Wyckoff position.\nThe parent Wyckoff letter is stored in the `parent` field rather than as a JSON dictionary key.\n\n**Requirements/Conventions**:\n\n- It MUST be a list of dictionaries.\n- Each dictionary MUST contain `parent`, the Wyckoff letter in the parent setting.\n- Each dictionary MUST contain `splits`, an ordered list of subgroup Wyckoff-position assignments, each carrying its target representative expression and exact affine map.\n\nFor an embedding `x_G = P*x_H + p`, the split records partition the parent orbit, expressed in the subgroup cell, into distinct subgroup orbits.\nFor each piece let `A` be the first three columns of `affine` and `b` its last column.\nThen `q_H = A*q_G + b`, where `q_G` is a fractional coordinate on the parent's published `first_orbit` branch and `q_H` is on the child's published representative branch.\nThe input is the actual parent representative coordinate, not its free-parameter vector; first evaluate the parent's `orbit[0]` map when starting from parameters.\nThe piece's `xyz` names the child representative branch and MUST equal that child's `first_orbit`; it is not a rendering of the piece's `affine` map on parent coordinates.\nRepeated child letters are meaningful: they identify different child orbits with the same Wyckoff type and MUST NOT be deduplicated by letter.\nFor generic parent parameters, expanding all split pieces under the subgroup gives disjoint orbits whose union is the transformed parent orbit in the subgroup cell.\nTheir multiplicities sum to `abs(det(P)) * parent_multiplicity`; this factor accounts for the cells and is not generally the full subgroup index.\nKeep the exact affine offsets when evaluating the maps; wrapping parent coordinates before applying a non-unimodular map can select a different child orbit.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "Splitting data for one parent Wyckoff position.",
"required": [
"parent",
"splits"
],
"properties": {
"parent": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Parent Wyckoff letter."
},
"splits": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Ordered split records for this parent Wyckoff letter.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One Wyckoff split record.",
"required": [
"letter",
"xyz",
"affine"
],
"properties": {
"letter": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Subgroup Wyckoff letter assigned by this split branch."
},
"xyz": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Coordinate expression for the split branch."
},
"affine": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_affine"
],
"sizes": [
3,
4
]
},
"type": [
"array"
],
"description": "Exact affine representation for the split branch as a 3 by 4 augmented matrix.\nEach row holds the three linear coefficients followed by the translation component, all as exact fraction strings.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_affine"
],
"sizes": [
4
]
},
"type": [
"array"
],
"description": "One row of the augmented affine matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
}
}
}
}
},
"examples": [
[
{
"parent": "a",
"splits": [
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"0"
]
]
},
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"1/2"
]
]
}
]
}
]
]
},
"criteria": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Backward-lift constraints for each parent Wyckoff position under this particular subgroup embedding.\nFor a fixed parent entry, every constraint MUST hold on the assigned subgroup representative coordinates modulo integer cell translations.\nThese are geometric coordinate conditions, conditional on the specified split roles and their Wyckoff branches; chemical species, occupancies, and matching an entire structure require separate checks.\nAn empty `constraints` list means no additional equations beyond the selected subgroup branches; it does not mean that no split roles are needed.\nThe first example is the generated I4/mmm (139) to P4/mmm (123) index-2 embedding: parent `a` splits into `a` and `d` with no equations, and parent `n` splits into `s` and `t` whose x and z coordinates must differ by 1/2 modulo 1.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "Backward-lift constraints for one parent Wyckoff position.",
"required": [
"parent",
"constraints"
],
"properties": {
"parent": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Parent Wyckoff letter."
},
"constraints": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Constraint records for this parent Wyckoff letter.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One modular equation `sum_i dot(coeffs[i][0], q_i) = target[0] (mod 1)`.\nHere `q_i` is the three-component fractional coordinate on the published subgroup representative branch selected by `roles[i]`, not a local parameter vector or an arbitrary symmetry-equivalent site.\nThe current generator emits one scalar equation per record: `target` has length one, `coeffs` has one item per role, and each item contains one three-component row.\nThe coefficient entries are integer-valued exact strings, which makes the equation invariant under independent integer translations of the role coordinates.",
"properties": {
"roles": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Wyckoff-position role references entering the constraint.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One role reference.",
"required": [
"letter",
"index"
],
"properties": {
"letter": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Wyckoff letter for the referenced role."
},
"index": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer"
],
"description": "Zero-based occurrence index among split pieces having this same letter in the corresponding parent's ordered `splits` list, not an index into all pieces or into the overall Wyckoff table."
}
}
}
},
"coeffs": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Exact integer-valued coefficient rows, in the same order as `roles`.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Coefficients associated with one role.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One exact coefficient vector.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
},
"target": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "One-element list containing the exact right-hand side modulo one, normalized to the interval [0,1).",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
}
}
}
}
}
},
"examples": [
{
"index": 2,
"subgroup_type": "k",
"k_subtype": "loss_of_centering_translation",
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "x,y,z"
},
"wyckoff_splitting": [
{
"parent": "a",
"splits": [
{
"letter": "a",
"xyz": "0,0,0",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1",
"0"
]
]
},
{
"letter": "d",
"xyz": "1/2,1/2,1/2",
"affine": [
[
"1",
"0",
"0",
"1/2"
],
[
"0",
"1",
"0",
"1/2"
],
[
"0",
"0",
"1",
"1/2"
]
]
}
]
},
{
"parent": "n",
"splits": [
{
"letter": "s",
"xyz": "x,0,z",
"affine": [
[
"0",
"-1",
"0",
"0"
],
[
"-1",
"0",
"0",
"0"
],
[
"0",
"0",
"-1",
"0"
]
]
},
{
"letter": "t",
"xyz": "x,1/2,z",
"affine": [
[
"0",
"-1",
"0",
"1/2"
],
[
"-1",
"0",
"0",
"1/2"
],
[
"0",
"0",
"-1",
"1/2"
]
]
}
]
}
],
"criteria": [
{
"parent": "a",
"constraints": []
},
{
"parent": "n",
"constraints": [
{
"roles": [
{
"letter": "s",
"index": 0
},
{
"letter": "t",
"index": 0
}
],
"coeffs": [
[
[
"0",
"0",
"1"
]
],
[
[
"0",
"0",
"-1"
]
]
],
"target": [
"1/2"
]
},
{
"roles": [
{
"letter": "s",
"index": 0
},
{
"letter": "t",
"index": 0
}
],
"coeffs": [
[
[
"1",
"0",
"0"
]
],
[
[
"-1",
"0",
"0"
]
]
],
"target": [
"1/2"
]
}
]
}
]
},
{
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"-1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,-z",
"det": -1,
"is_orthogonal": true
},
"compatible_systems": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
],
"operation_kind": "affine"
}
]
}
}
},
"examples": [
{
"normalizer_kind": "orthogonal_affine",
"representation": "orthogonal_coset_representatives",
"candidate_set": "signed_permutation_matrices",
"n_symops": 1,
"n_linear_parts": 1,
"n_raw_candidates": 96,
"n_coset_representatives": 1,
"bounds": {
"det_abs": 1,
"max_abs_linear_entry": 1
},
"symops": [
{
"compatible_systems": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
],
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"-1"
]
],
"vector": [
"1/2",
"1/2",
"1/2"
],
"xyz": "-x+1/2,-y+1/2,-z+1/2",
"det": -1,
"is_orthogonal": true
},
"operation_kind": "orthogonal_affine"
}
]
}
]
},
"affine_normalizer": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/affine_normalizer",
"title": "Affine normalizer",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "affine_normalizer",
"label": "affine_normalizer_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Affine normalizer coset representatives for one crystallographic space-group setting.\n\nThe representatives are listed modulo the space group itself, so each listed operation represents an equivalence class of affine normalizer operations rather than every operation in that class.\nThis property contains representatives generated from bounded unimodular integer linear parts. It is a finite bounded representative table, not a complete infinite affine normalizer.\n\nThe `candidate_set` field belongs in this property because the listed representatives are produced from a deliberately restricted finite candidate set.\nFor this property `candidate_set` is `bounded_unimodular_integer_matrices`, meaning unimodular 3 by 3 integer matrices satisfying the recorded `bounds`.\nThe plural field `candidate_sets` is not part of the emitted data and MUST NOT be used here.\n\nThis property is one of three related normalizer tables for a setting:\n`euclidean_normalizer` holds the finite Euclidean normalizer operations obtained from cctbx,\n`orthogonal_affine_normalizer` holds the older bounded table restricted to signed-permutation linear parts,\nand this property holds the bounded table generated from unimodular integer linear parts, whose linear candidate set contains the signed-permutation set.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **normalizer\\_kind**: REQUIRED; String.\n Kind label for this normalizer contribution.\n\n - **representation**: REQUIRED; String.\n Representation label for the listed data.\n\n - **candidate\\_set**: REQUIRED; String.\n Name of the finite linear candidate set used for generation.\n\n - **n\\_symops**: REQUIRED; Integer.\n Number of listed coset representatives after metric-compatibility filtering.\n It MUST equal the length of `symops`.\n\n - **n\\_linear\\_parts**: REQUIRED; Integer.\n Number of distinct exact linear matrix parts represented in `symops`.\n This count ignores translation differences and can be smaller than `n_symops`.\n\n - **n\\_raw\\_candidates**: REQUIRED; Integer.\n Number of accepted affine normalizer candidates generated before quotienting by the space group and metric filtering; the candidate list itself is not stored.\n\n - **n\\_unique\\_candidates**: OPTIONAL; Integer.\n Legacy count of unique affine candidates before quotienting by the space group.\n The current canonical-coset composition does not emit this field; it is retained to describe older records.\n\n - **n\\_coset\\_representatives**: REQUIRED; Integer.\n Number of non-trivial coset representatives before metric-compatibility filtering.\n\n - **bounds**: REQUIRED; Dictionary.\n Simple numerical bounds defining the bounded unimodular integer candidate matrices.\n\n - **symops**: REQUIRED; List of dictionaries.\n Listed affine normalizer coset representatives.\n Each item follows `/defs/v0.1/properties/symmetry/basis_transform`.\n Each item MUST carry `compatible_systems`, the list of reference-setting metric families (transported to the actual setting's basis) whose every metric tensor is preserved by the representative's linear part.\n\nFor the infinite space group G, an affine map A normalizes G when `A*G*A^-1 = G`, including its full translation lattice.\nRepresentatives differing by multiplication by an element of G describe the same coset.\nThe identity coset G itself is omitted, but a nonzero pure translation can represent a nontrivial coset and MUST NOT be discarded just because its matrix is identity.\nContinuous origin shifts are represented separately by `continuous_normalizer`; this finite list is not all of `N_A(G)/G`.\nA nonempty `compatible_systems` list means the linear part preserves every metric in at least one listed reference-setting family after transport to the recorded Hall basis.\nIt need not preserve the actual setting's general metric; that distinction is recorded by `affine_transformation.is_orthogonal`.\nThe signed-permutation candidate set is contained in the bounded integer candidate set, but independently chosen coset representatives need not appear as identical affine matrices and vectors in both lists.\n\nThe example is the nontrivial half-cell origin-shift coset for Pm-3m (No. 221); multiplication by inversion in the space group explains the displayed linear part `-I`.",
"properties": {
"normalizer_kind": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Kind label for this normalizer contribution.",
"enum": [
"affine",
null
]
},
"representation": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Representation label for the listed normalizer data.",
"enum": [
"coset_representatives",
null
]
},
"candidate_set": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Name of the finite linear candidate set used for generation.",
"enum": [
"bounded_unimodular_integer_matrices",
null
]
},
"n_symops": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/spacegroups/n_symops",
"title": "Number of symops",
"x-optimade-type": "integer",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "n_symops",
"label": "n_symops_spacegroups"
},
"type": [
"integer",
"null"
],
"description": "Number of symmetry operations in the finite operation list of the generated entry.\n\nWhen the entry contains a `symops` list, this value MUST equal its length.",
"x-optimade-unit": "inapplicable",
"examples": [
1,
2
]
},
"n_linear_parts": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/n_linear_parts",
"title": "Number of linear parts",
"x-optimade-type": "integer",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "n_linear_parts",
"label": "n_linear_parts_transformations"
},
"type": [
"integer",
"null"
],
"description": "Number of distinct linear matrix parts represented in a normalizer or transform table.\n\nDistinctness is determined by exact element-wise comparison of the 3 by 3 matrix parts of the listed operations.\n\nThis value MUST equal the number of distinct `affine_transformation.matrix` values in the containing `symops` list when that list is present; translation differences do not increase it.",
"x-optimade-unit": "inapplicable",
"examples": [
2,
4
]
},
"n_raw_candidates": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Number of accepted affine normalizer candidates generated before quotienting by the space group and metric filtering; the candidate list itself is not stored."
},
"n_unique_candidates": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Legacy count of unique affine candidates before quotienting by the space group; omitted by the current generator."
},
"n_coset_representatives": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Number of non-trivial coset representatives before metric-compatibility filtering."
},
"bounds": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Simple numerical bounds defining the bounded unimodular integer candidate matrices.",
"properties": {
"det_abs": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Required absolute determinant of every candidate matrix."
},
"max_abs_linear_entry": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Maximum absolute entry value allowed in candidate matrices."
}
}
},
"symops": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Listed affine normalizer coset representatives.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/basis_transform",
"title": "Basis transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "basis_transform",
"label": "basis_transform_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "One crystallographic transform between coordinate descriptions, settings, cells, or related group embeddings.\n\nThe affine map itself is stored in the embedded `affine_transformation` field.\nThe parent property defines the source and target coordinate systems and the precise role of the transform.\nFor a subgroup embedding the convention is `x_G = P*x_H + p`, where `P = affine_transformation.matrix` and `p = affine_transformation.vector`.\nThe columns of `P` are the subgroup cell vectors expressed in the parent fractional basis, and `p` is the subgroup origin expressed in that basis.\nThus conversion of parent coordinates to subgroup coordinates uses `x_H = P^-1*(x_G-p)`, not the forward affine map.\nUseful, for example, for representing setting changes, subgroup embeddings, isomorphic subgroup transforms, normalizer representatives, and same-space-group affine images.\nThis property is not limited to symmetry operations within one fixed setting; the matrix may be non-orthogonal or have determinant different from one when the transform changes cell or basis.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **affine\\_transformation**: REQUIRED; Dictionary.\n Exact affine map for the transform, using exact rational matrix and vector entries.\n The coordinate convention and source/target interpretation are supplied by the parent property.\n\n - **index**: OPTIONAL; Integer or null.\n Index metadata whose interpretation is defined by the parent property.\n Common uses include the subgroup index for subgroup embeddings, the cell index for isomorphic subgroup transforms, or an ordinal representative index in a finite transform table.\n\n - **subgroup\\_type**: OPTIONAL; String.\n Translation/point-symmetry classification when supplied for a subgroup embedding.\n The value MUST be `t` for a translationengleiche subgroup or `k` for a klassengleiche subgroup.\n It MUST be omitted for identity embeddings and general subgroups that lose both translations and point symmetry, and for transforms that are not subgroup embeddings.\n Presence of `t` or `k` alone does not certify maximality; the containing relation table supplies that information.\n\n - **k\\_subtype**: OPTIONAL; String or null.\n Klassengleiche subtype when the transform describes a klassengleiche subgroup relation.\n The value MUST be `loss_of_centering_translation` or `enlarged_unit_cell` for klassengleiche relations and null or omitted otherwise.\n\n - **compatible\\_systems**: OPTIONAL; List of strings.\n Reference-setting metric families whose every metric tensor is preserved by the linear part after transport to the actual setting basis.\n This is used for bounded affine normalizer representatives.\n\n - **operation\\_kind**: OPTIONAL; String.\n Categorical label for normalizer-type representatives.\n The value MUST be `euclidean` for Euclidean normalizer operations, `orthogonal_affine` for the signed-permutation affine normalizer subset, or `affine` for the bounded unimodular affine normalizer table.\n It MUST be omitted when the transform is a setting transform, subgroup embedding, or other transform for which no normalizer operation class applies.\n\n - **wyckoff\\_splitting**: OPTIONAL; List.\n Wyckoff-position splitting metadata induced by the transform when available.\n The list is grouped by explicit parent Wyckoff letter.\n\n - **criteria**: OPTIONAL; List.\n Backward-lift constraint metadata induced by the transform when available.\n The list is grouped by explicit parent Wyckoff letter.",
"properties": {
"affine_transformation": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/affine_transformation",
"title": "Affine transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "affine_transformation",
"label": "affine_transformation_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "An affine transformation acting on fractional crystallographic coordinates.\n\nAn invertible affine transformation preserves collinearity and parallelism, but need not preserve Euclidean distances or angles.\nA singular affine map can collapse a line or plane to a lower-dimensional image.\nThe transformation is represented by a 3 by 3 matrix and a 3-vector, both serialized with exact string entries.\nWith column vectors, the map is `u_out = matrix * u_in + vector`; matrix rows specify the three output components.\nThe containing property identifies whether `u_in` denotes fractional coordinates or abstract Wyckoff parameters and identifies the input and output settings.\nNo wrapping modulo lattice translations is implicit in this equation; apply any required periodic reduction only in the specified output setting.\nThe transformation may, for example, represent an operation within one setting, a setting transform, a subgroup embedding, a normalizer representative, or a parametric coordinate map for a Wyckoff-position orbit representative.\nWhen used as a parametric coordinate map, the matrix may be singular because special Wyckoff positions can constrain or identify parameters.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **matrix**: REQUIRED; Exact 3x3 matrix.\n Matrix part of the affine transformation.\n It MUST be represented as a list of three row lists, each containing three exact rational entries represented as strings.\n\n - **vector**: REQUIRED; List of 3 Fractions (String).\n Translation or origin-shift vector of the affine transformation in fractional coordinates.\n\n - **xyz**: OPTIONAL; String.\n Coordinate expression for the affine transformation in `x,y,z` notation when available.\n It MUST express the same affine map as `matrix` and `vector`, using `x,y,z` for the input components.\n\n - **det**: OPTIONAL; Integer.\n Determinant of `matrix` when the generator emits it.\n\n - **is\\_orthogonal**: OPTIONAL; Boolean.\n Whether the linear part preserves the crystallographic metric family specified by the containing setting; this is not a test of the fractional matrix against the Cartesian identity metric.",
"properties": {
"matrix": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_lattice"
],
"sizes": [
3,
3
]
},
"type": [
"array",
"null"
],
"description": "Exact 3 by 3 matrix part of the affine transformation.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One row of the exact 3 by 3 matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"vector": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Exact fractional-coordinate vector part of the affine transformation.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
},
"xyz": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/op_xyz",
"title": "Operation xyz",
"x-optimade-type": "string",
"x-compatibility": [
"https://schemas.optimade.org/defs/v1.2/properties/optimade/common/symmetry_operation_xyz",
"https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html"
],
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "op_xyz",
"label": "op_xyz_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Coordinate operation expressed in the algebraic xyz form, also known as Jones' faithful representation (Bradley & Cracknell, 1972: pp. 35-37; adapted for computer strings).\n\nThe following definition is adapted from (and meant to be compatible with) the IUCr symCIF version 1.0.1 dictionary definition of `_space_group_symop.operation_xyz` referenced to: International Tables for Crystallography (2002). Volume A, Space-group symmetry, edited by Th. Hahn, 5th. ed. (Kluwer Academic Publishers).\nIt is available at: https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html\n\nIf W is a matrix representation of the rotational part of the symmetry operation defined by the positions and signs of x, y and z, and w is a column of translations defined by the fractions, an equivalent position X' is generated from a given position X by the equation: X' = WX + w.",
"x-undef-pattern": "^([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?)$",
"examples": [
"-x,-y,z",
"x,1/2-y,1/2+z"
]
},
"det": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Determinant of the matrix part when emitted by the generator.\nThis optional integer annotation MUST equal the exact determinant of `matrix`; its absence does not imply determinant one.\nRational matrices can have noninteger determinants, in which case this integer annotation is omitted."
},
"is_orthogonal": {
"x-optimade-type": "boolean",
"x-optimade-unit": "inapplicable",
"type": [
"boolean",
"null"
],
"description": "Whether the matrix part is an isometry of the setting's metric, i.e. it preserves every metric tensor of the setting's crystal family expressed in this basis.\nFor a same-setting matrix `M` and metric tensor `g`, the criterion is `M^T g M = g` for every positive-definite metric in that family.\nThis is orthogonality with respect to the actual (generally non-Cartesian) lattice metric, not orthogonality of the matrix as a plain array: hexagonal sixfold rotations are isometries, whereas a cell-enlarging transform is not."
}
},
"examples": [
{
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,z",
"det": 1,
"is_orthogonal": true
}
]
},
"index": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Index metadata whose interpretation is supplied by the parent property."
},
"subgroup_type": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "International Tables subgroup-type label when applicable.",
"enum": [
"t",
"k"
]
},
"k_subtype": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Klassengleiche subtype when applicable; follows the cell-dependent convention defined in `/defs/v0.1/properties/transformations/k_subtype`.",
"enum": [
"loss_of_centering_translation",
"enlarged_unit_cell",
null
]
},
"compatible_systems": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Crystal metric families, named by reference-setting crystal system, whose metric tensors are all preserved by the transform.\nEach family is the full linear space of metric tensors of that crystal system in the reference setting (including unconstrained cross terms), transported to the basis of the actual setting.\nMonoclinic reference metrics use unique axis b; trigonal and hexagonal reference metrics both use hexagonal axes with a = b and gamma = 120 degrees.\nThese labels describe the tested metric families, not a reassignment of the space group's crystal system or the accidental metric symmetry of a particular specimen.",
"items": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "One compatible crystal-system label.",
"enum": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
]
}
},
"operation_kind": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Categorical label for normalizer-type representatives.",
"enum": [
"euclidean",
"orthogonal_affine",
"affine"
]
},
"wyckoff_splitting": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/wyckoff_splitting",
"title": "Wyckoff splitting",
"x-optimade-type": "list",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "wyckoff_splitting",
"label": "wyckoff_splitting_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Wyckoff-position splitting data associated with a subgroup or same-space-group transform.\n\nEach list item gives the split of one parent Wyckoff position.\nThe parent Wyckoff letter is stored in the `parent` field rather than as a JSON dictionary key.\n\n**Requirements/Conventions**:\n\n- It MUST be a list of dictionaries.\n- Each dictionary MUST contain `parent`, the Wyckoff letter in the parent setting.\n- Each dictionary MUST contain `splits`, an ordered list of subgroup Wyckoff-position assignments, each carrying its target representative expression and exact affine map.\n\nFor an embedding `x_G = P*x_H + p`, the split records partition the parent orbit, expressed in the subgroup cell, into distinct subgroup orbits.\nFor each piece let `A` be the first three columns of `affine` and `b` its last column.\nThen `q_H = A*q_G + b`, where `q_G` is a fractional coordinate on the parent's published `first_orbit` branch and `q_H` is on the child's published representative branch.\nThe input is the actual parent representative coordinate, not its free-parameter vector; first evaluate the parent's `orbit[0]` map when starting from parameters.\nThe piece's `xyz` names the child representative branch and MUST equal that child's `first_orbit`; it is not a rendering of the piece's `affine` map on parent coordinates.\nRepeated child letters are meaningful: they identify different child orbits with the same Wyckoff type and MUST NOT be deduplicated by letter.\nFor generic parent parameters, expanding all split pieces under the subgroup gives disjoint orbits whose union is the transformed parent orbit in the subgroup cell.\nTheir multiplicities sum to `abs(det(P)) * parent_multiplicity`; this factor accounts for the cells and is not generally the full subgroup index.\nKeep the exact affine offsets when evaluating the maps; wrapping parent coordinates before applying a non-unimodular map can select a different child orbit.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "Splitting data for one parent Wyckoff position.",
"required": [
"parent",
"splits"
],
"properties": {
"parent": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Parent Wyckoff letter."
},
"splits": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Ordered split records for this parent Wyckoff letter.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One Wyckoff split record.",
"required": [
"letter",
"xyz",
"affine"
],
"properties": {
"letter": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Subgroup Wyckoff letter assigned by this split branch."
},
"xyz": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Coordinate expression for the split branch."
},
"affine": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_affine"
],
"sizes": [
3,
4
]
},
"type": [
"array"
],
"description": "Exact affine representation for the split branch as a 3 by 4 augmented matrix.\nEach row holds the three linear coefficients followed by the translation component, all as exact fraction strings.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_affine"
],
"sizes": [
4
]
},
"type": [
"array"
],
"description": "One row of the augmented affine matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
}
}
}
}
},
"examples": [
[
{
"parent": "a",
"splits": [
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"0"
]
]
},
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"1/2"
]
]
}
]
}
]
]
},
"criteria": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Backward-lift constraints for each parent Wyckoff position under this particular subgroup embedding.\nFor a fixed parent entry, every constraint MUST hold on the assigned subgroup representative coordinates modulo integer cell translations.\nThese are geometric coordinate conditions, conditional on the specified split roles and their Wyckoff branches; chemical species, occupancies, and matching an entire structure require separate checks.\nAn empty `constraints` list means no additional equations beyond the selected subgroup branches; it does not mean that no split roles are needed.\nThe first example is the generated I4/mmm (139) to P4/mmm (123) index-2 embedding: parent `a` splits into `a` and `d` with no equations, and parent `n` splits into `s` and `t` whose x and z coordinates must differ by 1/2 modulo 1.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "Backward-lift constraints for one parent Wyckoff position.",
"required": [
"parent",
"constraints"
],
"properties": {
"parent": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Parent Wyckoff letter."
},
"constraints": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Constraint records for this parent Wyckoff letter.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One modular equation `sum_i dot(coeffs[i][0], q_i) = target[0] (mod 1)`.\nHere `q_i` is the three-component fractional coordinate on the published subgroup representative branch selected by `roles[i]`, not a local parameter vector or an arbitrary symmetry-equivalent site.\nThe current generator emits one scalar equation per record: `target` has length one, `coeffs` has one item per role, and each item contains one three-component row.\nThe coefficient entries are integer-valued exact strings, which makes the equation invariant under independent integer translations of the role coordinates.",
"properties": {
"roles": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Wyckoff-position role references entering the constraint.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One role reference.",
"required": [
"letter",
"index"
],
"properties": {
"letter": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Wyckoff letter for the referenced role."
},
"index": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer"
],
"description": "Zero-based occurrence index among split pieces having this same letter in the corresponding parent's ordered `splits` list, not an index into all pieces or into the overall Wyckoff table."
}
}
}
},
"coeffs": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Exact integer-valued coefficient rows, in the same order as `roles`.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Coefficients associated with one role.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One exact coefficient vector.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
},
"target": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "One-element list containing the exact right-hand side modulo one, normalized to the interval [0,1).",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
}
}
}
}
}
},
"examples": [
{
"index": 2,
"subgroup_type": "k",
"k_subtype": "loss_of_centering_translation",
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "x,y,z"
},
"wyckoff_splitting": [
{
"parent": "a",
"splits": [
{
"letter": "a",
"xyz": "0,0,0",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1",
"0"
]
]
},
{
"letter": "d",
"xyz": "1/2,1/2,1/2",
"affine": [
[
"1",
"0",
"0",
"1/2"
],
[
"0",
"1",
"0",
"1/2"
],
[
"0",
"0",
"1",
"1/2"
]
]
}
]
},
{
"parent": "n",
"splits": [
{
"letter": "s",
"xyz": "x,0,z",
"affine": [
[
"0",
"-1",
"0",
"0"
],
[
"-1",
"0",
"0",
"0"
],
[
"0",
"0",
"-1",
"0"
]
]
},
{
"letter": "t",
"xyz": "x,1/2,z",
"affine": [
[
"0",
"-1",
"0",
"1/2"
],
[
"-1",
"0",
"0",
"1/2"
],
[
"0",
"0",
"-1",
"1/2"
]
]
}
]
}
],
"criteria": [
{
"parent": "a",
"constraints": []
},
{
"parent": "n",
"constraints": [
{
"roles": [
{
"letter": "s",
"index": 0
},
{
"letter": "t",
"index": 0
}
],
"coeffs": [
[
[
"0",
"0",
"1"
]
],
[
[
"0",
"0",
"-1"
]
]
],
"target": [
"1/2"
]
},
{
"roles": [
{
"letter": "s",
"index": 0
},
{
"letter": "t",
"index": 0
}
],
"coeffs": [
[
[
"1",
"0",
"0"
]
],
[
[
"-1",
"0",
"0"
]
]
],
"target": [
"1/2"
]
}
]
}
]
},
{
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"-1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,-z",
"det": -1,
"is_orthogonal": true
},
"compatible_systems": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
],
"operation_kind": "affine"
}
]
}
}
},
"examples": [
{
"normalizer_kind": "affine",
"representation": "coset_representatives",
"candidate_set": "bounded_unimodular_integer_matrices",
"n_symops": 1,
"n_linear_parts": 1,
"n_raw_candidates": 96,
"n_coset_representatives": 1,
"bounds": {
"det_abs": 1,
"max_abs_linear_entry": 1
},
"symops": [
{
"compatible_systems": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
],
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"-1"
]
],
"vector": [
"1/2",
"1/2",
"1/2"
],
"xyz": "-x+1/2,-y+1/2,-z+1/2",
"det": -1,
"is_orthogonal": true
},
"operation_kind": "affine"
}
]
}
]
},
"continuous_normalizer": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/continuous_normalizer",
"title": "Continuous normalizer",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "continuous_normalizer",
"label": "continuous_normalizer_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Parameterized continuous normalizer subspace for a setting.\n\nIt describes continuous origin-shift freedoms by dimension and fractional-coordinate basis vectors rather than by enumerating infinitely many operations.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **dimension**: OPTIONAL; Integer.\n Dimension of the continuous parameter subspace.\n When present, it MUST equal the length of `basis_vectors`.\n\n - **basis\\_vectors**: REQUIRED; List of vectors.\n Basis vectors spanning the continuous normalizer parameter space.\n Each basis vector is represented as exact fractional-coordinate components.\n\n - **coordinate\\_system**: OPTIONAL; String.\n Coordinate system used for the parameter vectors.\n\n - **representation**: OPTIONAL; String.\n Textual description of the parameterized representation.\n\nThe represented shifts are `t = sum_i u_i*basis_vectors[i]`, with arbitrary real coefficients `u_i`, acting on fractional coordinates as `x -> x+t`.\nTheir span is the common fixed subspace of all space-group rotations: `(W-I)*t = 0` for every linear part `W`.\nThe basis vectors are exact and independent but need not be normalized or orthogonal.\nA dimension of zero and an empty basis list mean there is no continuous origin-shift freedom; discrete allowed shifts can still exist.\nThis property describes continuous translations only, not arbitrary continuous rotations, strains, or the full affine normalizer.",
"properties": {
"dimension": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Dimension of the continuous parameter subspace. When present, it MUST equal the length of `basis_vectors`."
},
"basis_vectors": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Basis vectors spanning the continuous normalizer parameter space.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One basis vector in fractional coordinates.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"coordinate_system": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Coordinate system used for the parameter vectors; fractional components in the containing setting's cell.",
"enum": [
"fractional",
null
]
},
"representation": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Textual description of the parameterized representation."
}
},
"examples": [
{
"dimension": 3,
"coordinate_system": "fractional",
"basis_vectors": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
]
}
]
},
"isomorphic_subgroups": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/isomorphic_subgroups",
"title": "Isomorphic subgroup transforms",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "isomorphic_subgroups",
"label": "isomorphic_subgroups_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "Isomorphic subgroup transforms of bounded index for one parent setting or space-group type.\n\nAn isomorphic subgroup has the same space-group type as the parent but is embedded with a finite index, usually corresponding to an enlarged unit cell or a sublattice choice.\nThese transforms are useful for algorithms that need to enumerate same-type subgroup embeddings, compare structures under supercell changes, or construct bounded same-space-group refinement paths.\n\nThe transform records use `x_parent = P*x_subgroup + p`, with `P` and `p` stored inside `affine_transformation` as `matrix` and `vector`.\nThe `index` field is the subgroup index and equals `abs(det(P))` because both sides use the same space-group setting and centering convention.\nIndex one is allowed and does not describe a proper subgroup.\nThe generator currently searches indices up to its configured maximum index (default 9), with bounded candidate bases, and deduplicates the embedded translation lattice and operation cosets under the finite cctbx Euclidean normalizer.\nOnly the first valid origin in the tested origin pool is retained for each linear candidate.\nThe result is a bounded embedding table, not all possible origin or subgroup conjugacy classes; different sublattices must not be identified merely because their point-group operations agree.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary containing an `items` list.\n- Each item in `items` MUST describe one exact isomorphic subgroup transform.\n- Matrix and vector entries MUST be exact strings, using integer strings or fraction strings as appropriate.",
"properties": {
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Isomorphic subgroup transform records for one parent key.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/basis_transform",
"title": "Basis transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "basis_transform",
"label": "basis_transform_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "One crystallographic transform between coordinate descriptions, settings, cells, or related group embeddings.\n\nThe affine map itself is stored in the embedded `affine_transformation` field.\nThe parent property defines the source and target coordinate systems and the precise role of the transform.\nFor a subgroup embedding the convention is `x_G = P*x_H + p`, where `P = affine_transformation.matrix` and `p = affine_transformation.vector`.\nThe columns of `P` are the subgroup cell vectors expressed in the parent fractional basis, and `p` is the subgroup origin expressed in that basis.\nThus conversion of parent coordinates to subgroup coordinates uses `x_H = P^-1*(x_G-p)`, not the forward affine map.\nUseful, for example, for representing setting changes, subgroup embeddings, isomorphic subgroup transforms, normalizer representatives, and same-space-group affine images.\nThis property is not limited to symmetry operations within one fixed setting; the matrix may be non-orthogonal or have determinant different from one when the transform changes cell or basis.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **affine\\_transformation**: REQUIRED; Dictionary.\n Exact affine map for the transform, using exact rational matrix and vector entries.\n The coordinate convention and source/target interpretation are supplied by the parent property.\n\n - **index**: OPTIONAL; Integer or null.\n Index metadata whose interpretation is defined by the parent property.\n Common uses include the subgroup index for subgroup embeddings, the cell index for isomorphic subgroup transforms, or an ordinal representative index in a finite transform table.\n\n - **subgroup\\_type**: OPTIONAL; String.\n Translation/point-symmetry classification when supplied for a subgroup embedding.\n The value MUST be `t` for a translationengleiche subgroup or `k` for a klassengleiche subgroup.\n It MUST be omitted for identity embeddings and general subgroups that lose both translations and point symmetry, and for transforms that are not subgroup embeddings.\n Presence of `t` or `k` alone does not certify maximality; the containing relation table supplies that information.\n\n - **k\\_subtype**: OPTIONAL; String or null.\n Klassengleiche subtype when the transform describes a klassengleiche subgroup relation.\n The value MUST be `loss_of_centering_translation` or `enlarged_unit_cell` for klassengleiche relations and null or omitted otherwise.\n\n - **compatible\\_systems**: OPTIONAL; List of strings.\n Reference-setting metric families whose every metric tensor is preserved by the linear part after transport to the actual setting basis.\n This is used for bounded affine normalizer representatives.\n\n - **operation\\_kind**: OPTIONAL; String.\n Categorical label for normalizer-type representatives.\n The value MUST be `euclidean` for Euclidean normalizer operations, `orthogonal_affine` for the signed-permutation affine normalizer subset, or `affine` for the bounded unimodular affine normalizer table.\n It MUST be omitted when the transform is a setting transform, subgroup embedding, or other transform for which no normalizer operation class applies.\n\n - **wyckoff\\_splitting**: OPTIONAL; List.\n Wyckoff-position splitting metadata induced by the transform when available.\n The list is grouped by explicit parent Wyckoff letter.\n\n - **criteria**: OPTIONAL; List.\n Backward-lift constraint metadata induced by the transform when available.\n The list is grouped by explicit parent Wyckoff letter.",
"properties": {
"affine_transformation": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/affine_transformation",
"title": "Affine transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "affine_transformation",
"label": "affine_transformation_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "An affine transformation acting on fractional crystallographic coordinates.\n\nAn invertible affine transformation preserves collinearity and parallelism, but need not preserve Euclidean distances or angles.\nA singular affine map can collapse a line or plane to a lower-dimensional image.\nThe transformation is represented by a 3 by 3 matrix and a 3-vector, both serialized with exact string entries.\nWith column vectors, the map is `u_out = matrix * u_in + vector`; matrix rows specify the three output components.\nThe containing property identifies whether `u_in` denotes fractional coordinates or abstract Wyckoff parameters and identifies the input and output settings.\nNo wrapping modulo lattice translations is implicit in this equation; apply any required periodic reduction only in the specified output setting.\nThe transformation may, for example, represent an operation within one setting, a setting transform, a subgroup embedding, a normalizer representative, or a parametric coordinate map for a Wyckoff-position orbit representative.\nWhen used as a parametric coordinate map, the matrix may be singular because special Wyckoff positions can constrain or identify parameters.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **matrix**: REQUIRED; Exact 3x3 matrix.\n Matrix part of the affine transformation.\n It MUST be represented as a list of three row lists, each containing three exact rational entries represented as strings.\n\n - **vector**: REQUIRED; List of 3 Fractions (String).\n Translation or origin-shift vector of the affine transformation in fractional coordinates.\n\n - **xyz**: OPTIONAL; String.\n Coordinate expression for the affine transformation in `x,y,z` notation when available.\n It MUST express the same affine map as `matrix` and `vector`, using `x,y,z` for the input components.\n\n - **det**: OPTIONAL; Integer.\n Determinant of `matrix` when the generator emits it.\n\n - **is\\_orthogonal**: OPTIONAL; Boolean.\n Whether the linear part preserves the crystallographic metric family specified by the containing setting; this is not a test of the fractional matrix against the Cartesian identity metric.",
"properties": {
"matrix": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_lattice"
],
"sizes": [
3,
3
]
},
"type": [
"array",
"null"
],
"description": "Exact 3 by 3 matrix part of the affine transformation.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One row of the exact 3 by 3 matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"vector": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Exact fractional-coordinate vector part of the affine transformation.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
},
"xyz": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/op_xyz",
"title": "Operation xyz",
"x-optimade-type": "string",
"x-compatibility": [
"https://schemas.optimade.org/defs/v1.2/properties/optimade/common/symmetry_operation_xyz",
"https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html"
],
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "op_xyz",
"label": "op_xyz_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Coordinate operation expressed in the algebraic xyz form, also known as Jones' faithful representation (Bradley & Cracknell, 1972: pp. 35-37; adapted for computer strings).\n\nThe following definition is adapted from (and meant to be compatible with) the IUCr symCIF version 1.0.1 dictionary definition of `_space_group_symop.operation_xyz` referenced to: International Tables for Crystallography (2002). Volume A, Space-group symmetry, edited by Th. Hahn, 5th. ed. (Kluwer Academic Publishers).\nIt is available at: https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html\n\nIf W is a matrix representation of the rotational part of the symmetry operation defined by the positions and signs of x, y and z, and w is a column of translations defined by the fractions, an equivalent position X' is generated from a given position X by the equation: X' = WX + w.",
"x-undef-pattern": "^([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?)$",
"examples": [
"-x,-y,z",
"x,1/2-y,1/2+z"
]
},
"det": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Determinant of the matrix part when emitted by the generator.\nThis optional integer annotation MUST equal the exact determinant of `matrix`; its absence does not imply determinant one.\nRational matrices can have noninteger determinants, in which case this integer annotation is omitted."
},
"is_orthogonal": {
"x-optimade-type": "boolean",
"x-optimade-unit": "inapplicable",
"type": [
"boolean",
"null"
],
"description": "Whether the matrix part is an isometry of the setting's metric, i.e. it preserves every metric tensor of the setting's crystal family expressed in this basis.\nFor a same-setting matrix `M` and metric tensor `g`, the criterion is `M^T g M = g` for every positive-definite metric in that family.\nThis is orthogonality with respect to the actual (generally non-Cartesian) lattice metric, not orthogonality of the matrix as a plain array: hexagonal sixfold rotations are isometries, whereas a cell-enlarging transform is not."
}
},
"examples": [
{
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,z",
"det": 1,
"is_orthogonal": true
}
]
},
"index": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Index metadata whose interpretation is supplied by the parent property."
},
"subgroup_type": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "International Tables subgroup-type label when applicable.",
"enum": [
"t",
"k"
]
},
"k_subtype": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Klassengleiche subtype when applicable; follows the cell-dependent convention defined in `/defs/v0.1/properties/transformations/k_subtype`.",
"enum": [
"loss_of_centering_translation",
"enlarged_unit_cell",
null
]
},
"compatible_systems": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Crystal metric families, named by reference-setting crystal system, whose metric tensors are all preserved by the transform.\nEach family is the full linear space of metric tensors of that crystal system in the reference setting (including unconstrained cross terms), transported to the basis of the actual setting.\nMonoclinic reference metrics use unique axis b; trigonal and hexagonal reference metrics both use hexagonal axes with a = b and gamma = 120 degrees.\nThese labels describe the tested metric families, not a reassignment of the space group's crystal system or the accidental metric symmetry of a particular specimen.",
"items": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "One compatible crystal-system label.",
"enum": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
]
}
},
"operation_kind": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Categorical label for normalizer-type representatives.",
"enum": [
"euclidean",
"orthogonal_affine",
"affine"
]
},
"wyckoff_splitting": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/wyckoff_splitting",
"title": "Wyckoff splitting",
"x-optimade-type": "list",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "wyckoff_splitting",
"label": "wyckoff_splitting_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Wyckoff-position splitting data associated with a subgroup or same-space-group transform.\n\nEach list item gives the split of one parent Wyckoff position.\nThe parent Wyckoff letter is stored in the `parent` field rather than as a JSON dictionary key.\n\n**Requirements/Conventions**:\n\n- It MUST be a list of dictionaries.\n- Each dictionary MUST contain `parent`, the Wyckoff letter in the parent setting.\n- Each dictionary MUST contain `splits`, an ordered list of subgroup Wyckoff-position assignments, each carrying its target representative expression and exact affine map.\n\nFor an embedding `x_G = P*x_H + p`, the split records partition the parent orbit, expressed in the subgroup cell, into distinct subgroup orbits.\nFor each piece let `A` be the first three columns of `affine` and `b` its last column.\nThen `q_H = A*q_G + b`, where `q_G` is a fractional coordinate on the parent's published `first_orbit` branch and `q_H` is on the child's published representative branch.\nThe input is the actual parent representative coordinate, not its free-parameter vector; first evaluate the parent's `orbit[0]` map when starting from parameters.\nThe piece's `xyz` names the child representative branch and MUST equal that child's `first_orbit`; it is not a rendering of the piece's `affine` map on parent coordinates.\nRepeated child letters are meaningful: they identify different child orbits with the same Wyckoff type and MUST NOT be deduplicated by letter.\nFor generic parent parameters, expanding all split pieces under the subgroup gives disjoint orbits whose union is the transformed parent orbit in the subgroup cell.\nTheir multiplicities sum to `abs(det(P)) * parent_multiplicity`; this factor accounts for the cells and is not generally the full subgroup index.\nKeep the exact affine offsets when evaluating the maps; wrapping parent coordinates before applying a non-unimodular map can select a different child orbit.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "Splitting data for one parent Wyckoff position.",
"required": [
"parent",
"splits"
],
"properties": {
"parent": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Parent Wyckoff letter."
},
"splits": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Ordered split records for this parent Wyckoff letter.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One Wyckoff split record.",
"required": [
"letter",
"xyz",
"affine"
],
"properties": {
"letter": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Subgroup Wyckoff letter assigned by this split branch."
},
"xyz": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Coordinate expression for the split branch."
},
"affine": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_affine"
],
"sizes": [
3,
4
]
},
"type": [
"array"
],
"description": "Exact affine representation for the split branch as a 3 by 4 augmented matrix.\nEach row holds the three linear coefficients followed by the translation component, all as exact fraction strings.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_affine"
],
"sizes": [
4
]
},
"type": [
"array"
],
"description": "One row of the augmented affine matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
}
}
}
}
},
"examples": [
[
{
"parent": "a",
"splits": [
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"0"
]
]
},
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"1/2"
]
]
}
]
}
]
]
},
"criteria": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Backward-lift constraints for each parent Wyckoff position under this particular subgroup embedding.\nFor a fixed parent entry, every constraint MUST hold on the assigned subgroup representative coordinates modulo integer cell translations.\nThese are geometric coordinate conditions, conditional on the specified split roles and their Wyckoff branches; chemical species, occupancies, and matching an entire structure require separate checks.\nAn empty `constraints` list means no additional equations beyond the selected subgroup branches; it does not mean that no split roles are needed.\nThe first example is the generated I4/mmm (139) to P4/mmm (123) index-2 embedding: parent `a` splits into `a` and `d` with no equations, and parent `n` splits into `s` and `t` whose x and z coordinates must differ by 1/2 modulo 1.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "Backward-lift constraints for one parent Wyckoff position.",
"required": [
"parent",
"constraints"
],
"properties": {
"parent": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Parent Wyckoff letter."
},
"constraints": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Constraint records for this parent Wyckoff letter.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One modular equation `sum_i dot(coeffs[i][0], q_i) = target[0] (mod 1)`.\nHere `q_i` is the three-component fractional coordinate on the published subgroup representative branch selected by `roles[i]`, not a local parameter vector or an arbitrary symmetry-equivalent site.\nThe current generator emits one scalar equation per record: `target` has length one, `coeffs` has one item per role, and each item contains one three-component row.\nThe coefficient entries are integer-valued exact strings, which makes the equation invariant under independent integer translations of the role coordinates.",
"properties": {
"roles": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Wyckoff-position role references entering the constraint.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One role reference.",
"required": [
"letter",
"index"
],
"properties": {
"letter": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Wyckoff letter for the referenced role."
},
"index": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer"
],
"description": "Zero-based occurrence index among split pieces having this same letter in the corresponding parent's ordered `splits` list, not an index into all pieces or into the overall Wyckoff table."
}
}
}
},
"coeffs": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Exact integer-valued coefficient rows, in the same order as `roles`.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Coefficients associated with one role.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One exact coefficient vector.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
},
"target": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "One-element list containing the exact right-hand side modulo one, normalized to the interval [0,1).",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
}
}
}
}
}
},
"examples": [
{
"index": 2,
"subgroup_type": "k",
"k_subtype": "loss_of_centering_translation",
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "x,y,z"
},
"wyckoff_splitting": [
{
"parent": "a",
"splits": [
{
"letter": "a",
"xyz": "0,0,0",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1",
"0"
]
]
},
{
"letter": "d",
"xyz": "1/2,1/2,1/2",
"affine": [
[
"1",
"0",
"0",
"1/2"
],
[
"0",
"1",
"0",
"1/2"
],
[
"0",
"0",
"1",
"1/2"
]
]
}
]
},
{
"parent": "n",
"splits": [
{
"letter": "s",
"xyz": "x,0,z",
"affine": [
[
"0",
"-1",
"0",
"0"
],
[
"-1",
"0",
"0",
"0"
],
[
"0",
"0",
"-1",
"0"
]
]
},
{
"letter": "t",
"xyz": "x,1/2,z",
"affine": [
[
"0",
"-1",
"0",
"1/2"
],
[
"-1",
"0",
"0",
"1/2"
],
[
"0",
"0",
"-1",
"1/2"
]
]
}
]
}
],
"criteria": [
{
"parent": "a",
"constraints": []
},
{
"parent": "n",
"constraints": [
{
"roles": [
{
"letter": "s",
"index": 0
},
{
"letter": "t",
"index": 0
}
],
"coeffs": [
[
[
"0",
"0",
"1"
]
],
[
[
"0",
"0",
"-1"
]
]
],
"target": [
"1/2"
]
},
{
"roles": [
{
"letter": "s",
"index": 0
},
{
"letter": "t",
"index": 0
}
],
"coeffs": [
[
[
"1",
"0",
"0"
]
],
[
[
"-1",
"0",
"0"
]
]
],
"target": [
"1/2"
]
}
]
}
]
},
{
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"-1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,-z",
"det": -1,
"is_orthogonal": true
},
"compatible_systems": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
],
"operation_kind": "affine"
}
]
}
}
},
"examples": [
{
"items": [
{
"index": 2,
"wyckoff_splitting": [
{
"parent": "a",
"splits": [
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"0"
]
]
},
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"1/2"
]
]
}
]
}
],
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"2"
]
],
"vector": [
"0",
"0",
"0"
]
}
}
]
}
]
},
"baernighausen": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/baernighausen",
"title": "B\u00e4rnighausen subgroup transforms",
"x-optimade-type": "list",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "baernighausen",
"label": "baernighausen_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "B\u00e4rnighausen subgroup transform table for one parent setting or space-group type.\n\nEntries describe generated embeddings of subgroup settings into the containing parent setting.\nEach list item groups transform records for one target subgroup, with the target stored as ordinary data rather than as a JSON dictionary key.\nTransform records follow `/defs/v0.1/properties/symmetry/basis_transform`.\n\n**Requirements/Conventions**:\n\n- It MUST be a list of dictionaries.\n- Each dictionary MUST contain either `target_hall_entry` or `target_it_number`, depending on whether the containing dataset is Hall-setting keyed or IT-number keyed.\n- Each dictionary MUST contain `transforms`, a list of basis-transform records.\n\nWriting the parent as G and the subgroup as H, the stored convention is `x_G = P*x_H + p` with column coordinate vectors.\nThe group index is `[G:H] = abs(det(P)) * n_symops(G) / n_symops(H)`, using the finite operation counts in each recorded cell.\nThe standard generation follows the maximal non-isomorphic type/index relations and retains the selected transform for each covered triple; it does not enumerate every conjugacy class of embedded subgroups.\nThe underlying search covers selected indices `{1,2,3,4,5,7,9}`, bounded basis candidates, and a finite pool of origins, with documented editorial choices selecting representatives.\nAn absent transform means none is supplied within this generation scope, not a proof that no subgroup embedding exists.\n`wyckoff_splitting` uses the published representative conventions in both settings, including when a Hall-setting row is transported from the standard setting.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "B\u00e4rnighausen transform group for one target subgroup.",
"required": [
"transforms"
],
"properties": {
"target_hall_entry": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Target Hall entry when the containing dataset is Hall-setting keyed."
},
"target_it_number": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Target International Tables number when the containing dataset is IT-number keyed."
},
"transforms": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Basis transforms for this target subgroup.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/basis_transform",
"title": "Basis transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "basis_transform",
"label": "basis_transform_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "One crystallographic transform between coordinate descriptions, settings, cells, or related group embeddings.\n\nThe affine map itself is stored in the embedded `affine_transformation` field.\nThe parent property defines the source and target coordinate systems and the precise role of the transform.\nFor a subgroup embedding the convention is `x_G = P*x_H + p`, where `P = affine_transformation.matrix` and `p = affine_transformation.vector`.\nThe columns of `P` are the subgroup cell vectors expressed in the parent fractional basis, and `p` is the subgroup origin expressed in that basis.\nThus conversion of parent coordinates to subgroup coordinates uses `x_H = P^-1*(x_G-p)`, not the forward affine map.\nUseful, for example, for representing setting changes, subgroup embeddings, isomorphic subgroup transforms, normalizer representatives, and same-space-group affine images.\nThis property is not limited to symmetry operations within one fixed setting; the matrix may be non-orthogonal or have determinant different from one when the transform changes cell or basis.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **affine\\_transformation**: REQUIRED; Dictionary.\n Exact affine map for the transform, using exact rational matrix and vector entries.\n The coordinate convention and source/target interpretation are supplied by the parent property.\n\n - **index**: OPTIONAL; Integer or null.\n Index metadata whose interpretation is defined by the parent property.\n Common uses include the subgroup index for subgroup embeddings, the cell index for isomorphic subgroup transforms, or an ordinal representative index in a finite transform table.\n\n - **subgroup\\_type**: OPTIONAL; String.\n Translation/point-symmetry classification when supplied for a subgroup embedding.\n The value MUST be `t` for a translationengleiche subgroup or `k` for a klassengleiche subgroup.\n It MUST be omitted for identity embeddings and general subgroups that lose both translations and point symmetry, and for transforms that are not subgroup embeddings.\n Presence of `t` or `k` alone does not certify maximality; the containing relation table supplies that information.\n\n - **k\\_subtype**: OPTIONAL; String or null.\n Klassengleiche subtype when the transform describes a klassengleiche subgroup relation.\n The value MUST be `loss_of_centering_translation` or `enlarged_unit_cell` for klassengleiche relations and null or omitted otherwise.\n\n - **compatible\\_systems**: OPTIONAL; List of strings.\n Reference-setting metric families whose every metric tensor is preserved by the linear part after transport to the actual setting basis.\n This is used for bounded affine normalizer representatives.\n\n - **operation\\_kind**: OPTIONAL; String.\n Categorical label for normalizer-type representatives.\n The value MUST be `euclidean` for Euclidean normalizer operations, `orthogonal_affine` for the signed-permutation affine normalizer subset, or `affine` for the bounded unimodular affine normalizer table.\n It MUST be omitted when the transform is a setting transform, subgroup embedding, or other transform for which no normalizer operation class applies.\n\n - **wyckoff\\_splitting**: OPTIONAL; List.\n Wyckoff-position splitting metadata induced by the transform when available.\n The list is grouped by explicit parent Wyckoff letter.\n\n - **criteria**: OPTIONAL; List.\n Backward-lift constraint metadata induced by the transform when available.\n The list is grouped by explicit parent Wyckoff letter.",
"properties": {
"affine_transformation": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/affine_transformation",
"title": "Affine transformation",
"x-optimade-type": "dictionary",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "affine_transformation",
"label": "affine_transformation_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"object",
"null"
],
"description": "An affine transformation acting on fractional crystallographic coordinates.\n\nAn invertible affine transformation preserves collinearity and parallelism, but need not preserve Euclidean distances or angles.\nA singular affine map can collapse a line or plane to a lower-dimensional image.\nThe transformation is represented by a 3 by 3 matrix and a 3-vector, both serialized with exact string entries.\nWith column vectors, the map is `u_out = matrix * u_in + vector`; matrix rows specify the three output components.\nThe containing property identifies whether `u_in` denotes fractional coordinates or abstract Wyckoff parameters and identifies the input and output settings.\nNo wrapping modulo lattice translations is implicit in this equation; apply any required periodic reduction only in the specified output setting.\nThe transformation may, for example, represent an operation within one setting, a setting transform, a subgroup embedding, a normalizer representative, or a parametric coordinate map for a Wyckoff-position orbit representative.\nWhen used as a parametric coordinate map, the matrix may be singular because special Wyckoff positions can constrain or identify parameters.\n\n**Requirements/Conventions**:\n\n- It MUST be a dictionary with the following keys:\n\n - **matrix**: REQUIRED; Exact 3x3 matrix.\n Matrix part of the affine transformation.\n It MUST be represented as a list of three row lists, each containing three exact rational entries represented as strings.\n\n - **vector**: REQUIRED; List of 3 Fractions (String).\n Translation or origin-shift vector of the affine transformation in fractional coordinates.\n\n - **xyz**: OPTIONAL; String.\n Coordinate expression for the affine transformation in `x,y,z` notation when available.\n It MUST express the same affine map as `matrix` and `vector`, using `x,y,z` for the input components.\n\n - **det**: OPTIONAL; Integer.\n Determinant of `matrix` when the generator emits it.\n\n - **is\\_orthogonal**: OPTIONAL; Boolean.\n Whether the linear part preserves the crystallographic metric family specified by the containing setting; this is not a test of the fractional matrix against the Cartesian identity metric.",
"properties": {
"matrix": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_lattice"
],
"sizes": [
3,
3
]
},
"type": [
"array",
"null"
],
"description": "Exact 3 by 3 matrix part of the affine transformation.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One row of the exact 3 by 3 matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
},
"vector": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array",
"null"
],
"description": "Exact fractional-coordinate vector part of the affine transformation.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
},
"xyz": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/symmetry/op_xyz",
"title": "Operation xyz",
"x-optimade-type": "string",
"x-compatibility": [
"https://schemas.optimade.org/defs/v1.2/properties/optimade/common/symmetry_operation_xyz",
"https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html"
],
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "op_xyz",
"label": "op_xyz_symmetry"
},
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Coordinate operation expressed in the algebraic xyz form, also known as Jones' faithful representation (Bradley & Cracknell, 1972: pp. 35-37; adapted for computer strings).\n\nThe following definition is adapted from (and meant to be compatible with) the IUCr symCIF version 1.0.1 dictionary definition of `_space_group_symop.operation_xyz` referenced to: International Tables for Crystallography (2002). Volume A, Space-group symmetry, edited by Th. Hahn, 5th. ed. (Kluwer Academic Publishers).\nIt is available at: https://www.iucr.org/__data/iucr/cifdic_html/2/cif_sym.dic/Ispace_group_symop.operation_xyz.html\n\nIf W is a matrix representation of the rotational part of the symmetry operation defined by the positions and signs of x, y and z, and w is a column of translations defined by the fractions, an equivalent position X' is generated from a given position X by the equation: X' = WX + w.",
"x-undef-pattern": "^([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?),([-+]?[xyz]([-+][xyz])?([-+](1/2|[12]/3|[1-3]/4|[1-5]/6))?|[-+]?(1/2|[12]/3|[1-3]/4|[1-5]/6)([-+][xyz]([-+][xyz])?)?)$",
"examples": [
"-x,-y,z",
"x,1/2-y,1/2+z"
]
},
"det": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Determinant of the matrix part when emitted by the generator.\nThis optional integer annotation MUST equal the exact determinant of `matrix`; its absence does not imply determinant one.\nRational matrices can have noninteger determinants, in which case this integer annotation is omitted."
},
"is_orthogonal": {
"x-optimade-type": "boolean",
"x-optimade-unit": "inapplicable",
"type": [
"boolean",
"null"
],
"description": "Whether the matrix part is an isometry of the setting's metric, i.e. it preserves every metric tensor of the setting's crystal family expressed in this basis.\nFor a same-setting matrix `M` and metric tensor `g`, the criterion is `M^T g M = g` for every positive-definite metric in that family.\nThis is orthogonality with respect to the actual (generally non-Cartesian) lattice metric, not orthogonality of the matrix as a plain array: hexagonal sixfold rotations are isometries, whereas a cell-enlarging transform is not."
}
},
"examples": [
{
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,z",
"det": 1,
"is_orthogonal": true
}
]
},
"index": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer",
"null"
],
"description": "Index metadata whose interpretation is supplied by the parent property."
},
"subgroup_type": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "International Tables subgroup-type label when applicable.",
"enum": [
"t",
"k"
]
},
"k_subtype": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string",
"null"
],
"description": "Klassengleiche subtype when applicable; follows the cell-dependent convention defined in `/defs/v0.1/properties/transformations/k_subtype`.",
"enum": [
"loss_of_centering_translation",
"enlarged_unit_cell",
null
]
},
"compatible_systems": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Crystal metric families, named by reference-setting crystal system, whose metric tensors are all preserved by the transform.\nEach family is the full linear space of metric tensors of that crystal system in the reference setting (including unconstrained cross terms), transported to the basis of the actual setting.\nMonoclinic reference metrics use unique axis b; trigonal and hexagonal reference metrics both use hexagonal axes with a = b and gamma = 120 degrees.\nThese labels describe the tested metric families, not a reassignment of the space group's crystal system or the accidental metric symmetry of a particular specimen.",
"items": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "One compatible crystal-system label.",
"enum": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
]
}
},
"operation_kind": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Categorical label for normalizer-type representatives.",
"enum": [
"euclidean",
"orthogonal_affine",
"affine"
]
},
"wyckoff_splitting": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/transformations/wyckoff_splitting",
"title": "Wyckoff splitting",
"x-optimade-type": "list",
"x-optimade-definition": {
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "wyckoff_splitting",
"label": "wyckoff_splitting_transformations"
},
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Wyckoff-position splitting data associated with a subgroup or same-space-group transform.\n\nEach list item gives the split of one parent Wyckoff position.\nThe parent Wyckoff letter is stored in the `parent` field rather than as a JSON dictionary key.\n\n**Requirements/Conventions**:\n\n- It MUST be a list of dictionaries.\n- Each dictionary MUST contain `parent`, the Wyckoff letter in the parent setting.\n- Each dictionary MUST contain `splits`, an ordered list of subgroup Wyckoff-position assignments, each carrying its target representative expression and exact affine map.\n\nFor an embedding `x_G = P*x_H + p`, the split records partition the parent orbit, expressed in the subgroup cell, into distinct subgroup orbits.\nFor each piece let `A` be the first three columns of `affine` and `b` its last column.\nThen `q_H = A*q_G + b`, where `q_G` is a fractional coordinate on the parent's published `first_orbit` branch and `q_H` is on the child's published representative branch.\nThe input is the actual parent representative coordinate, not its free-parameter vector; first evaluate the parent's `orbit[0]` map when starting from parameters.\nThe piece's `xyz` names the child representative branch and MUST equal that child's `first_orbit`; it is not a rendering of the piece's `affine` map on parent coordinates.\nRepeated child letters are meaningful: they identify different child orbits with the same Wyckoff type and MUST NOT be deduplicated by letter.\nFor generic parent parameters, expanding all split pieces under the subgroup gives disjoint orbits whose union is the transformed parent orbit in the subgroup cell.\nTheir multiplicities sum to `abs(det(P)) * parent_multiplicity`; this factor accounts for the cells and is not generally the full subgroup index.\nKeep the exact affine offsets when evaluating the maps; wrapping parent coordinates before applying a non-unimodular map can select a different child orbit.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "Splitting data for one parent Wyckoff position.",
"required": [
"parent",
"splits"
],
"properties": {
"parent": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Parent Wyckoff letter."
},
"splits": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Ordered split records for this parent Wyckoff letter.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One Wyckoff split record.",
"required": [
"letter",
"xyz",
"affine"
],
"properties": {
"letter": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Subgroup Wyckoff letter assigned by this split branch."
},
"xyz": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Coordinate expression for the split branch."
},
"affine": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice",
"dim_affine"
],
"sizes": [
3,
4
]
},
"type": [
"array"
],
"description": "Exact affine representation for the split branch as a 3 by 4 augmented matrix.\nEach row holds the three linear coefficients followed by the translation component, all as exact fraction strings.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_affine"
],
"sizes": [
4
]
},
"type": [
"array"
],
"description": "One row of the augmented affine matrix.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
}
}
}
}
},
"examples": [
[
{
"parent": "a",
"splits": [
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"0"
]
]
},
{
"letter": "a",
"xyz": "x,y,z",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1/2",
"1/2"
]
]
}
]
}
]
]
},
"criteria": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array",
"null"
],
"description": "Backward-lift constraints for each parent Wyckoff position under this particular subgroup embedding.\nFor a fixed parent entry, every constraint MUST hold on the assigned subgroup representative coordinates modulo integer cell translations.\nThese are geometric coordinate conditions, conditional on the specified split roles and their Wyckoff branches; chemical species, occupancies, and matching an entire structure require separate checks.\nAn empty `constraints` list means no additional equations beyond the selected subgroup branches; it does not mean that no split roles are needed.\nThe first example is the generated I4/mmm (139) to P4/mmm (123) index-2 embedding: parent `a` splits into `a` and `d` with no equations, and parent `n` splits into `s` and `t` whose x and z coordinates must differ by 1/2 modulo 1.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "Backward-lift constraints for one parent Wyckoff position.",
"required": [
"parent",
"constraints"
],
"properties": {
"parent": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Parent Wyckoff letter."
},
"constraints": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Constraint records for this parent Wyckoff letter.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One modular equation `sum_i dot(coeffs[i][0], q_i) = target[0] (mod 1)`.\nHere `q_i` is the three-component fractional coordinate on the published subgroup representative branch selected by `roles[i]`, not a local parameter vector or an arbitrary symmetry-equivalent site.\nThe current generator emits one scalar equation per record: `target` has length one, `coeffs` has one item per role, and each item contains one three-component row.\nThe coefficient entries are integer-valued exact strings, which makes the equation invariant under independent integer translations of the role coordinates.",
"properties": {
"roles": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Wyckoff-position role references entering the constraint.",
"items": {
"x-optimade-type": "dictionary",
"x-optimade-unit": "inapplicable",
"type": [
"object"
],
"description": "One role reference.",
"required": [
"letter",
"index"
],
"properties": {
"letter": {
"x-optimade-type": "string",
"x-optimade-unit": "inapplicable",
"type": [
"string"
],
"description": "Wyckoff letter for the referenced role."
},
"index": {
"x-optimade-type": "integer",
"x-optimade-unit": "inapplicable",
"type": [
"integer"
],
"description": "Zero-based occurrence index among split pieces having this same letter in the corresponding parent's ordered `splits` list, not an index into all pieces or into the overall Wyckoff table."
}
}
}
},
"coeffs": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Exact integer-valued coefficient rows, in the same order as `roles`.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "Coefficients associated with one role.",
"items": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"x-optimade-dimensions": {
"names": [
"dim_lattice"
],
"sizes": [
3
]
},
"type": [
"array"
],
"description": "One exact coefficient vector.",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
},
"target": {
"x-optimade-type": "list",
"x-optimade-unit": "inapplicable",
"type": [
"array"
],
"description": "One-element list containing the exact right-hand side modulo one, normalized to the interval [0,1).",
"items": {
"$id": "https://schemas.httk.org/defs/v0.1/properties/core/fraction",
"title": "Fraction",
"x-optimade-type": "string",
"x-optimade-definition": {
"label": "fraction_core",
"kind": "property",
"version": "0.1.0",
"format": "1.3",
"name": "fraction"
},
"type": [
"string",
"null"
],
"description": "A numerical representation formed as the quotient of two numbers represented as a string.",
"examples": [
"2/3",
"5/42",
"10",
"0"
],
"x-optimade-unit": "inapplicable"
}
}
}
}
}
}
}
}
},
"examples": [
{
"index": 2,
"subgroup_type": "k",
"k_subtype": "loss_of_centering_translation",
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "x,y,z"
},
"wyckoff_splitting": [
{
"parent": "a",
"splits": [
{
"letter": "a",
"xyz": "0,0,0",
"affine": [
[
"1",
"0",
"0",
"0"
],
[
"0",
"1",
"0",
"0"
],
[
"0",
"0",
"1",
"0"
]
]
},
{
"letter": "d",
"xyz": "1/2,1/2,1/2",
"affine": [
[
"1",
"0",
"0",
"1/2"
],
[
"0",
"1",
"0",
"1/2"
],
[
"0",
"0",
"1",
"1/2"
]
]
}
]
},
{
"parent": "n",
"splits": [
{
"letter": "s",
"xyz": "x,0,z",
"affine": [
[
"0",
"-1",
"0",
"0"
],
[
"-1",
"0",
"0",
"0"
],
[
"0",
"0",
"-1",
"0"
]
]
},
{
"letter": "t",
"xyz": "x,1/2,z",
"affine": [
[
"0",
"-1",
"0",
"1/2"
],
[
"-1",
"0",
"0",
"1/2"
],
[
"0",
"0",
"-1",
"1/2"
]
]
}
]
}
],
"criteria": [
{
"parent": "a",
"constraints": []
},
{
"parent": "n",
"constraints": [
{
"roles": [
{
"letter": "s",
"index": 0
},
{
"letter": "t",
"index": 0
}
],
"coeffs": [
[
[
"0",
"0",
"1"
]
],
[
[
"0",
"0",
"-1"
]
]
],
"target": [
"1/2"
]
},
{
"roles": [
{
"letter": "s",
"index": 0
},
{
"letter": "t",
"index": 0
}
],
"coeffs": [
[
[
"1",
"0",
"0"
]
],
[
[
"-1",
"0",
"0"
]
]
],
"target": [
"1/2"
]
}
]
}
]
},
{
"affine_transformation": {
"matrix": [
[
"-1",
"0",
"0"
],
[
"0",
"-1",
"0"
],
[
"0",
"0",
"-1"
]
],
"vector": [
"0",
"0",
"0"
],
"xyz": "-x,-y,-z",
"det": -1,
"is_orthogonal": true
},
"compatible_systems": [
"triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
"trigonal",
"hexagonal",
"cubic"
],
"operation_kind": "affine"
}
]
}
}
}
},
"examples": [
[
{
"target_hall_entry": "p_1",
"transforms": [
{
"index": 2,
"subgroup_type": "t",
"affine_transformation": {
"matrix": [
[
"1",
"0",
"0"
],
[
"0",
"1",
"0"
],
[
"0",
"0",
"1"
]
],
"vector": [
"0",
"0",
"0"
]
}
}
]
}
]
]
}
}
},
"examples": [
[
{
"hm_entry": "P 1",
"hall_entry": "p_1",
"centering_translations": [
[
"0",
"0",
"0"
]
],
"baernighausen": []
}
]
]
}