Symmetry

A set of symmetry operations can be represented in various different ways. Within brille each operation is represented as an integer-valued matrix and a floating-point-valued vector. The matrix must be the identity matrix, a rotation matrix, or a rotoinversion matrix expressed as integer multiples of the real-space basis vectors. The vector is the translation part of the operation expressed in fractional coordinates of the same basis vectors.

Other representations of a symmetry operation are convenient for human interpretation and communication. One such which can be used to specify symmetry operations for Symmetry is CIF xyz, which allows for specifying either a list of matrices and list of vectors or a single CIF xyz string:

>>> s0 = brille._brille.Symmetry([[[1, 0, 0], [0, -1, 0], [0, 0, 1]]], [[0, 1/2, 1/2]])
>>> s1 = brille._brille.Symmetry('x, 1/2-y, 1/2+z')
>>> s0 == s1
True

With a CIF xyz encoded string from, e.g., a CIF file, one can directly create a Direct lattice object with the appropriate symmetry operations without also specifying, e.g., the spacegroup:

basis_lengths, basis_angles, xyz_string = hypothetical_CIF_parser('some_system.cif')
lattice = brille._brille.Direct(basis_lengths, basis_angles)
lattice.spacegroup = brille._brille.Symmetry(xyz_string)

in setting the lattice spacegroup, the generate() method is called, so the provided CIF xyz operators need only be the generators of the spacegroup.

class brille._brille.Symmetry(*args, **kwargs)

One or more symmetry operations of a space group.

A symmetry operation is the combination of a generalised rotation, \(W\), and translation, \(\mathbf{w}\). For any position in space, \(\mathbf{x}\), the operation transforms \(\mathbf{x}\) to another equivalent position

\[\mathbf{x}' = W \mathbf{x} + \mathbf{w} \]

and can equivalently be expressed as \(\mathbf{x}' = \mathscr{M}\mathbf{x}\).

Crystallographic symmetry operations have an order, \(o\), for which \(\mathscr{M}^o = \mathscr{E}\) i.e. \(o\) repeated applications of the operation is equivalent to the identity operator.

A set of symmetry operations can form a group, \(\mathbb{G}\), with the property that \(\mathscr{M}_k = \mathscr{M}_i \mathscr{M}_j\) with \(\mathscr{M}_i,\mathscr{M}_j,\mathscr{M}_k \in \mathbb{G}\).

This class can be used to hold any number of related symmetry operators, and to generate all spacegroup operators from those stored.

Parameters:
  • hall (int) – The integer Hall number for the desired space group operations [[deprecated]].

  • W (arraylike, int) – The generalised rotation (matrix) part of the symmetry operator(s)

  • w (arraylike, float) – The translation (vector) part of the symmetry operator(s)

  • cifxyz (str) – The symmetry operator(s) encoded in CIF xyz format

Note

The overloaded forms of __init__ take one of hall, (W, w), or cifxyz.

Overloaded function.

  1. __init__(self: brille._brille.Symmetry, Hall number: int) -> None

  2. __init__(self: brille._brille.Symmetry, W: numpy.ndarray[numpy.int32], w: numpy.ndarray[numpy.float64]) -> None

  3. __init__(self: brille._brille.Symmetry, CIF xyz string: str) -> None

generate(self: brille._brille.Symmetry) brille._brille.Symmetry
generators(self: brille._brille.Symmetry) brille._brille.Symmetry

Hall Symbol

A more compact representation of a full space group is the Hall symbol which has the advantage of representing all unique crystallographic lattices as an encoded set of generators.

Within brille, HallSymbol can be used to decode an arbitrary Hall symbol. And then its generators can be extracted to create the spacegroup for lattice:

basis_lengths, basis_angles, hall_symbol = hypothetical_CIF_parser('some_system.cif')
lattice = brille._brille.Direct(basis_lengths, basis_angles)
lattice.spacegroup = brille._brille.HallSymbol(hall_symbol).generators
class brille._brille.HallSymbol(self: brille._brille.HallSymbol, Hall_symbol: str)

A crystallographic spacegroup’s symmetries encoded in Hall’s notation

Hall proposed a compact unambiguous notation for the representation of the generators of a spacegroup. Within his notation each motion is comprised of a character with one or more subscripts and superscripts which describe its order, unique axis, and translation. The notation specifies that, depending on the position of a motion and details of any preceding motion, some or all of the sub- and superscripts can be omitted. The HallSymbol has been written to handle the logic necessary to decode a Hall symbol into its equivalent motions. An added complication arises when the Hall symbol is encoded as an ASCII string. Namely, there are no sub- or superscript glyphs and some scheme must be enacted to represent them.

Other classes

class brille._brille.PointSymmetry(*args, **kwargs)

Holds the \(3 \times 3\) rotation matrices \(R\) which comprise a point group symmetry.

A point group describes the local symmetry of a lattice point. It contains all of the generalised rotations of a Symmetry with none of its translations.

Overloaded function.

  1. __init__(self: brille._brille.PointSymmetry, Hall_number: int, time_reversal: int = 0) -> None

  2. __init__(self: brille._brille.PointSymmetry, Symmetry: brille._brille.Symmetry) -> None

nfolds(self: brille._brille.PointSymmetry, arg0: int) brille._brille.PointSymmetry