diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index c12cce5..aea9292 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -3,7 +3,8 @@
"name": "Python 3 Developer Container",
"build": {
"dockerfile": "../Dockerfile",
- "target": "developer"
+ "target": "developer",
+ "platform": "linux/amd64"
},
"remoteEnv": {
// Allow X11 apps to run inside the container
@@ -63,7 +64,25 @@
"source": "devcontainer-shared-cache",
"target": "/cache",
"type": "volume"
- }
+ },
+ {
+ "source": "${localEnv:HOME}${localEnv:USERPROFILE}",
+ "target": "/host-home",
+ "type": "bind"
+ },
+ // Mount facility directories if present on the host (Docker will create
+ // the host directory if it does not exist). These ensure /dls and
+ // /dls_sw are available inside the container when present on the host.
+ // {
+ // "source": "/dls/i15-1/data",
+ // "target": "/dls/i15-1/data",
+ // "type": "bind"
+ // },
+ // {
+ // "source": "/dls_sw",
+ // "target": "/dls_sw",
+ // "type": "bind"
+ // }
],
// Mount the parent as /workspaces so we can pip install peers as editable
"workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind",
diff --git a/.gitignore b/.gitignore
index 0f33bf2..b45c699 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,16 @@ __pycache__/
# C extensions
*.so
+#h5 files, but not hdf5
+*.h5
+
+# output of running reduction
+*.xye
+**/processed/
+
+#binary files used for ang cal
+*.obj
+
# Distribution / packaging
.Python
env/
@@ -69,3 +79,6 @@ lockfiles/
# ruff cache
.ruff_cache/
+
+#mac items
+*.DS_Store
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a43ed57..d158bd1 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -3,7 +3,7 @@ repos:
rev: v5.0.0
hooks:
- id: check-added-large-files
- exclude: ^uv.lock
+ exclude: (^uv\.lock$|\.hdf5$)
- id: check-yaml
- id: check-merge-conflict
- id: end-of-file-fixer
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 101c75f..118c8f8 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,5 +1,6 @@
{
"python.testing.unittestEnabled": false,
+ "python.analysis.nodeExecutable": "auto",
"python.testing.pytestEnabled": true,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
@@ -9,4 +10,6 @@
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
},
+ "python-envs.defaultEnvManager": "ms-python.python:system",
+ "python-envs.pythonProjects": [],
}
diff --git a/Dockerfile b/Dockerfile
index 4b99b9c..c2e6eb1 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -5,7 +5,28 @@ FROM ghcr.io/diamondlightsource/ubuntu-devcontainer:noble AS developer
# Add any system dependencies for the developer/build environment here
RUN apt-get update -y && apt-get install -y --no-install-recommends \
graphviz \
- && apt-get dist-clean
+ && apt-get dist-clean
+
+RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 libgl1 libegl1 -y
+RUN apt-get update && apt-get install -y \
+ libx11-xcb-dev \
+ libglu1-mesa-dev \
+ libxrender-dev \
+ libxi-dev \
+ libxkbcommon-dev \
+ libxkbcommon-x11-dev \
+ libegl1 \
+ libxcb-cursor0 -y
+
+RUN apt-get update && apt-get install -y \
+ libxcb-icccm4 \
+ libxcb-keysyms1 \
+ libxcb-render-util0 \
+ libxcb-xinerama0 \
+ libxcb-xkb1 \
+ libxkbcommon-x11-0
+
+RUN apt-get install fonts-noto-color-emoji -y
# The build stage installs the context into the venv
FROM developer AS build
@@ -29,7 +50,7 @@ FROM ubuntu:noble AS runtime
# Add apt-get system dependecies for runtime here if needed
# RUN apt-get update -y && apt-get install -y --no-install-recommends \
-# some-library \
+# some-dependecies \
# && apt-get dist-clean
# Copy the python installation from the build stage
@@ -42,3 +63,6 @@ ENV PATH=/app/.venv/bin:$PATH
# change this entrypoint if it is not the same as the repo
ENTRYPOINT ["XRPD-Toolbox"]
CMD ["--version"]
+
+ENV MPLCONFIGDIR=/tmp/matplotlib
+RUN export DISPLAY=:0
diff --git a/cifs/CeO2.cif b/cifs/CeO2.cif
new file mode 100644
index 0000000..cb1cae4
--- /dev/null
+++ b/cifs/CeO2.cif
@@ -0,0 +1,267 @@
+
+#(C) 2026 by FIZ Karlsruhe - Leibniz Institute for Information Infrastructure. All rights reserved.
+data_24887-ICSD
+_database_code_ICSD 24887
+_audit_creation_date 2021-08-01
+_chemical_name_common Ceria
+_chemical_formula_structural 'Ce O2'
+_chemical_formula_sum 'Ce1 O2'
+_chemical_name_structure_type CaF2
+_exptl_crystal_density_diffrn 7.19
+_citation_title
+
+;
+Introducing highly redox-active atomic centers into insertion-type electrodes
+for lithium-ion batteries
+;
+loop_
+_citation_id
+_citation_journal_full
+_citation_year
+_citation_journal_volume
+_citation_page_first
+_citation_page_last
+_citation_journal_id_ASTM
+primary 'Advanced Energy Materials' 2020 10 1 14 ADEMBC
+loop_
+_citation_author_citation_id
+_citation_author_name
+primary 'Ma, Yanjiao'
+primary 'Ma, Yuan'
+primary 'Giuli, Gabriele'
+primary 'Euchner, Holger'
+primary 'Gross, Axel'
+primary 'Lepore, Giovanni Orazio'
+primary "d'Acapito, Francesco"
+primary 'Geiger, Dorin'
+primary 'Biskupek, Johannes'
+primary 'Kaiser, Ute'
+primary 'Schütz, Hanno M.'
+primary 'Carlsson, Anna'
+primary 'Diemant, Thomas'
+primary 'Behm, Rolf Jürgen'
+primary 'Kuenzel, Matthias'
+primary 'Passerini, Stef'
+_cell_length_a 5.4178(1)
+_cell_length_b 5.4178(1)
+_cell_length_c 5.4178(1)
+_cell_angle_alpha 90.
+_cell_angle_beta 90.
+_cell_angle_gamma 90.
+_cell_volume 159.03
+_cell_formula_units_Z 4
+_space_group_name_H-M_alt 'F m -3 m'
+_space_group_IT_number 225
+loop_
+_space_group_symop_id
+_space_group_symop_operation_xyz
+1 'z, y, -x'
+2 'y, x, -z'
+3 'x, z, -y'
+4 'z, x, -y'
+5 'y, z, -x'
+6 'x, y, -z'
+7 'z, -y, x'
+8 'y, -x, z'
+9 'x, -z, y'
+10 'z, -x, y'
+11 'y, -z, x'
+12 'x, -y, z'
+13 '-z, y, x'
+14 '-y, x, z'
+15 '-x, z, y'
+16 '-z, x, y'
+17 '-y, z, x'
+18 '-x, y, z'
+19 '-z, -y, -x'
+20 '-y, -x, -z'
+21 '-x, -z, -y'
+22 '-z, -x, -y'
+23 '-y, -z, -x'
+24 '-x, -y, -z'
+25 '-z, -y, x'
+26 '-y, -x, z'
+27 '-x, -z, y'
+28 '-z, -x, y'
+29 '-y, -z, x'
+30 '-x, -y, z'
+31 '-z, y, -x'
+32 '-y, x, -z'
+33 '-x, z, -y'
+34 '-z, x, -y'
+35 '-y, z, -x'
+36 '-x, y, -z'
+37 'z, -y, -x'
+38 'y, -x, -z'
+39 'x, -z, -y'
+40 'z, -x, -y'
+41 'y, -z, -x'
+42 'x, -y, -z'
+43 'z, y, x'
+44 'y, x, z'
+45 'x, z, y'
+46 'z, x, y'
+47 'y, z, x'
+48 'x, y, z'
+49 'z, y+1/2, -x+1/2'
+50 'y, x+1/2, -z+1/2'
+51 'x, z+1/2, -y+1/2'
+52 'z, x+1/2, -y+1/2'
+53 'y, z+1/2, -x+1/2'
+54 'x, y+1/2, -z+1/2'
+55 'z, -y+1/2, x+1/2'
+56 'y, -x+1/2, z+1/2'
+57 'x, -z+1/2, y+1/2'
+58 'z, -x+1/2, y+1/2'
+59 'y, -z+1/2, x+1/2'
+60 'x, -y+1/2, z+1/2'
+61 '-z, y+1/2, x+1/2'
+62 '-y, x+1/2, z+1/2'
+63 '-x, z+1/2, y+1/2'
+64 '-z, x+1/2, y+1/2'
+65 '-y, z+1/2, x+1/2'
+66 '-x, y+1/2, z+1/2'
+67 '-z, -y+1/2, -x+1/2'
+68 '-y, -x+1/2, -z+1/2'
+69 '-x, -z+1/2, -y+1/2'
+70 '-z, -x+1/2, -y+1/2'
+71 '-y, -z+1/2, -x+1/2'
+72 '-x, -y+1/2, -z+1/2'
+73 '-z, -y+1/2, x+1/2'
+74 '-y, -x+1/2, z+1/2'
+75 '-x, -z+1/2, y+1/2'
+76 '-z, -x+1/2, y+1/2'
+77 '-y, -z+1/2, x+1/2'
+78 '-x, -y+1/2, z+1/2'
+79 '-z, y+1/2, -x+1/2'
+80 '-y, x+1/2, -z+1/2'
+81 '-x, z+1/2, -y+1/2'
+82 '-z, x+1/2, -y+1/2'
+83 '-y, z+1/2, -x+1/2'
+84 '-x, y+1/2, -z+1/2'
+85 'z, -y+1/2, -x+1/2'
+86 'y, -x+1/2, -z+1/2'
+87 'x, -z+1/2, -y+1/2'
+88 'z, -x+1/2, -y+1/2'
+89 'y, -z+1/2, -x+1/2'
+90 'x, -y+1/2, -z+1/2'
+91 'z, y+1/2, x+1/2'
+92 'y, x+1/2, z+1/2'
+93 'x, z+1/2, y+1/2'
+94 'z, x+1/2, y+1/2'
+95 'y, z+1/2, x+1/2'
+96 'x, y+1/2, z+1/2'
+97 'z+1/2, y, -x+1/2'
+98 'y+1/2, x, -z+1/2'
+99 'x+1/2, z, -y+1/2'
+100 'z+1/2, x, -y+1/2'
+101 'y+1/2, z, -x+1/2'
+102 'x+1/2, y, -z+1/2'
+103 'z+1/2, -y, x+1/2'
+104 'y+1/2, -x, z+1/2'
+105 'x+1/2, -z, y+1/2'
+106 'z+1/2, -x, y+1/2'
+107 'y+1/2, -z, x+1/2'
+108 'x+1/2, -y, z+1/2'
+109 '-z+1/2, y, x+1/2'
+110 '-y+1/2, x, z+1/2'
+111 '-x+1/2, z, y+1/2'
+112 '-z+1/2, x, y+1/2'
+113 '-y+1/2, z, x+1/2'
+114 '-x+1/2, y, z+1/2'
+115 '-z+1/2, -y, -x+1/2'
+116 '-y+1/2, -x, -z+1/2'
+117 '-x+1/2, -z, -y+1/2'
+118 '-z+1/2, -x, -y+1/2'
+119 '-y+1/2, -z, -x+1/2'
+120 '-x+1/2, -y, -z+1/2'
+121 '-z+1/2, -y, x+1/2'
+122 '-y+1/2, -x, z+1/2'
+123 '-x+1/2, -z, y+1/2'
+124 '-z+1/2, -x, y+1/2'
+125 '-y+1/2, -z, x+1/2'
+126 '-x+1/2, -y, z+1/2'
+127 '-z+1/2, y, -x+1/2'
+128 '-y+1/2, x, -z+1/2'
+129 '-x+1/2, z, -y+1/2'
+130 '-z+1/2, x, -y+1/2'
+131 '-y+1/2, z, -x+1/2'
+132 '-x+1/2, y, -z+1/2'
+133 'z+1/2, -y, -x+1/2'
+134 'y+1/2, -x, -z+1/2'
+135 'x+1/2, -z, -y+1/2'
+136 'z+1/2, -x, -y+1/2'
+137 'y+1/2, -z, -x+1/2'
+138 'x+1/2, -y, -z+1/2'
+139 'z+1/2, y, x+1/2'
+140 'y+1/2, x, z+1/2'
+141 'x+1/2, z, y+1/2'
+142 'z+1/2, x, y+1/2'
+143 'y+1/2, z, x+1/2'
+144 'x+1/2, y, z+1/2'
+145 'z+1/2, y+1/2, -x'
+146 'y+1/2, x+1/2, -z'
+147 'x+1/2, z+1/2, -y'
+148 'z+1/2, x+1/2, -y'
+149 'y+1/2, z+1/2, -x'
+150 'x+1/2, y+1/2, -z'
+151 'z+1/2, -y+1/2, x'
+152 'y+1/2, -x+1/2, z'
+153 'x+1/2, -z+1/2, y'
+154 'z+1/2, -x+1/2, y'
+155 'y+1/2, -z+1/2, x'
+156 'x+1/2, -y+1/2, z'
+157 '-z+1/2, y+1/2, x'
+158 '-y+1/2, x+1/2, z'
+159 '-x+1/2, z+1/2, y'
+160 '-z+1/2, x+1/2, y'
+161 '-y+1/2, z+1/2, x'
+162 '-x+1/2, y+1/2, z'
+163 '-z+1/2, -y+1/2, -x'
+164 '-y+1/2, -x+1/2, -z'
+165 '-x+1/2, -z+1/2, -y'
+166 '-z+1/2, -x+1/2, -y'
+167 '-y+1/2, -z+1/2, -x'
+168 '-x+1/2, -y+1/2, -z'
+169 '-z+1/2, -y+1/2, x'
+170 '-y+1/2, -x+1/2, z'
+171 '-x+1/2, -z+1/2, y'
+172 '-z+1/2, -x+1/2, y'
+173 '-y+1/2, -z+1/2, x'
+174 '-x+1/2, -y+1/2, z'
+175 '-z+1/2, y+1/2, -x'
+176 '-y+1/2, x+1/2, -z'
+177 '-x+1/2, z+1/2, -y'
+178 '-z+1/2, x+1/2, -y'
+179 '-y+1/2, z+1/2, -x'
+180 '-x+1/2, y+1/2, -z'
+181 'z+1/2, -y+1/2, -x'
+182 'y+1/2, -x+1/2, -z'
+183 'x+1/2, -z+1/2, -y'
+184 'z+1/2, -x+1/2, -y'
+185 'y+1/2, -z+1/2, -x'
+186 'x+1/2, -y+1/2, -z'
+187 'z+1/2, y+1/2, x'
+188 'y+1/2, x+1/2, z'
+189 'x+1/2, z+1/2, y'
+190 'z+1/2, x+1/2, y'
+191 'y+1/2, z+1/2, x'
+192 'x+1/2, y+1/2, z'
+loop_
+_atom_type_symbol
+_atom_type_oxidation_number
+Ce4+ 4
+O2- -2
+loop_
+_atom_site_label
+_atom_site_type_symbol
+_atom_site_symmetry_multiplicity
+_atom_site_Wyckoff_symbol
+_atom_site_fract_x
+_atom_site_fract_y
+_atom_site_fract_z
+_atom_site_U_iso_or_equiv
+_atom_site_occupancy
+Ce1 Ce4+ 4 a 0 0 0 0.00078 1.
+O1 O2- 8 c 0.25 0.25 0.25 0.005 1.
+#End of TTdata_24887-ICSD
diff --git a/cifs/Lab6.cif b/cifs/Lab6.cif
new file mode 100644
index 0000000..798c1cb
--- /dev/null
+++ b/cifs/Lab6.cif
@@ -0,0 +1,165 @@
+#------------------------------------------------------------------------------
+#$Date: 2017-01-29 23:22:55 +0200 (Sun, 29 Jan 2017) $
+#$Revision: 191079 $
+#$URL: file:///home/coder/svn-repositories/_RELOADED_COD/cod-reloaded/cif/2/10/47/2104736.cif $
+#------------------------------------------------------------------------------
+#
+# This file is available in the Crystallography Open Database (COD),
+# http://www.crystallography.net/. The original data for this entry
+# were provided by IUCr Journals, http://journals.iucr.org/.
+#
+# The file may be used within the scientific community so long as
+# proper attribution is given to the journal article from which the
+# data were obtained.
+#
+data_2104736
+loop_
+_publ_author_name
+'Elliot, Alexander Dean'
+_publ_section_title
+;
+ Structure of pyrrhotite 5C (Fe~9~S~10~)
+;
+_journal_coeditor_code KD5037
+_journal_issue 3
+_journal_name_full 'Acta Crystallographica Section B'
+_journal_page_first 271
+_journal_page_last 279
+_journal_paper_doi 10.1107/S0108768110011845
+_journal_volume 66
+_journal_year 2010
+_chemical_formula_sum 'B6 La'
+_chemical_formula_weight 203.772
+_chemical_name_common 'Lanthanum Hexaboride'
+_space_group_crystal_system cubic
+_space_group_IT_number 221
+_space_group_name_Hall '-P 4 2 3'
+_space_group_name_H-M_alt 'P m -3 m'
+_symmetry_space_group_name_Hall '-P 4 2 3'
+_symmetry_space_group_name_H-M 'P m -3 m'
+_cell_angle_alpha 90
+_cell_angle_beta 90
+_cell_angle_gamma 90
+_cell_formula_units_Z 1
+_cell_length_a 4.15706(1)
+_cell_length_b 4.15706(1)
+_cell_length_c 4.15706(1)
+_cell_volume 71.8388(3)
+_exptl_absorpt_coefficient_mu 21.62738(11)
+_exptl_crystal_density_diffrn 4.71028(2)
+_pd_block_id 2010-05-12T23:22|LaB6|A.Elliot|5Ca2
+_pd_proc_ls_profile_function
+;
+Crystallite size and strain modelled with Lorentzian and
+Gaussian component convolutions
+LaB6 Phase
+ CS_L(@, 3584.60821`_117.29623 min 1000 max 50000)
+;
+_refine_ls_R_I_factor 0.02147
+_cod_data_source_file kd5037.cif
+_cod_data_source_block (5Ca2)_LaB6
+_cod_depositor_comments
+;
+ Moving _atom_site_aniso_U_* data items from the _atom_site loop to the
+ _atom_site_aniso loop and adding the _atom_site_aniso_label data item.
+
+ Antanas Vaitkus,
+ 2017-01-29
+;
+_cod_database_code 2104736
+loop_
+_symmetry_equiv_pos_as_xyz
+'-x, -y, -z'
+'-x, -y, z'
+'-x, -z, -y'
+'-x, -z, y'
+'-x, z, -y'
+'-x, z, y'
+'-x, y, -z'
+'-x, y, z'
+'-y, -x, -z'
+'-y, -x, z'
+'-y, -z, -x'
+'-y, -z, x'
+'-y, z, -x'
+'-y, z, x'
+'-y, x, -z'
+'-y, x, z'
+'-z, -x, -y'
+'-z, -x, y'
+'-z, -y, -x'
+'-z, -y, x'
+'-z, y, -x'
+'-z, y, x'
+'-z, x, -y'
+'-z, x, y'
+'z, -x, -y'
+'z, -x, y'
+'z, -y, -x'
+'z, -y, x'
+'z, y, -x'
+'z, y, x'
+'z, x, -y'
+'z, x, y'
+'y, -x, -z'
+'y, -x, z'
+'y, -z, -x'
+'y, -z, x'
+'y, z, -x'
+'y, z, x'
+'y, x, -z'
+'y, x, z'
+'x, -y, -z'
+'x, -y, z'
+'x, -z, -y'
+'x, -z, y'
+'x, z, -y'
+'x, z, y'
+'x, y, -z'
+'x, y, z'
+loop_
+_atom_site_aniso_label
+_atom_site_aniso_U_11
+_atom_site_aniso_U_22
+_atom_site_aniso_U_33
+_atom_site_aniso_U_12
+_atom_site_aniso_U_13
+_atom_site_aniso_U_23
+La1 0.00338(5) 0.00338(5) 0.00338(5) 0 0 0
+B1 0.00535(94) 0.00000(45) 0.00000(45) 0 0 0
+loop_
+_atom_site_label
+_atom_site_type_symbol
+_atom_site_symmetry_multiplicity
+_atom_site_fract_x
+_atom_site_fract_y
+_atom_site_fract_z
+_atom_site_occupancy
+La1 La 1 0 0 0 1
+B1 B 6 0.19853(40) 0.5 0.5 1
+loop_
+_atom_type_symbol
+_atom_type_description
+_atom_type_scat_dispersion_real
+_atom_type_scat_dispersion_imag
+_atom_type_scat_source
+La La 57.085 3.411 'Default dataset used by TOPAS R3'
+B B 5.002 0.0010 'Default dataset used by TOPAS R3'
+loop_
+_citation_title
+_citation_page_first
+_citation_page_last
+_citation_year
+_citation_journal_abbrev
+_citation_journal_volume
+_citation_journal_id_ISSN
+; X-ray structural investigation of single crystals of lanthanum,
+cerium, and samarium hexaborides
+;
+803 805 1986
+;
+;
+;
+;
+;
+;
diff --git a/cifs/Si.cif b/cifs/Si.cif
new file mode 100644
index 0000000..3befb8c
--- /dev/null
+++ b/cifs/Si.cif
@@ -0,0 +1,226 @@
+data_global
+_chemical_name_mineral 'Silicon'
+loop_
+_publ_author_name
+'Wyckoff R W G'
+_journal_name_full 'Crystal Structures'
+_journal_volume 1
+_journal_year 1963
+_journal_page_first 7
+_journal_page_last 83
+_publ_section_title
+;
+ Second edition. Interscience Publishers, New York, New York
+ Sample at T = 300 K
+;
+_database_code_amcsd 0011243
+_chemical_formula_sum 'Si'
+_cell_length_a 5.43070
+_cell_length_b 5.43070
+_cell_length_c 5.43070
+_cell_angle_alpha 90
+_cell_angle_beta 90
+_cell_angle_gamma 90
+_cell_volume 160.165
+_exptl_crystal_density_diffrn 2.329
+_symmetry_space_group_name_H-M 'F d 3 m'
+loop_
+_space_group_symop_operation_xyz
+ 'x,y,z'
+ 'x,1/2+y,1/2+z'
+ '1/2+x,y,1/2+z'
+ '1/2+x,1/2+y,z'
+ '3/4+z,3/4-x,1/4+y'
+ '3/4+z,1/4-x,3/4+y'
+ '1/4+z,3/4-x,3/4+y'
+ '1/4+z,1/4-x,1/4+y'
+ '-y,1/2+z,1/2-x'
+ '-y,+z,-x'
+ '1/2-y,1/2+z,-x'
+ '1/2-y,+z,1/2-x'
+ '3/4+x,3/4-y,1/4+z'
+ '3/4+x,1/4-y,3/4+z'
+ '1/4+x,3/4-y,3/4+z'
+ '1/4+x,1/4-y,1/4+z'
+ '-z,1/2+x,1/2-y'
+ '-z,+x,-y'
+ '1/2-z,1/2+x,-y'
+ '1/2-z,+x,1/2-y'
+ '3/4+y,3/4-z,1/4+x'
+ '3/4+y,1/4-z,3/4+x'
+ '1/4+y,3/4-z,3/4+x'
+ '1/4+y,1/4-z,1/4+x'
+ '-x,1/2+y,1/2-z'
+ '-x,+y,-z'
+ '1/2-x,1/2+y,-z'
+ '1/2-x,+y,1/2-z'
+ '1/2+x,-z,1/2-y'
+ '1/2+x,1/2-z,-y'
+ '+x,-z,-y'
+ '+x,1/2-z,1/2-y'
+ '3/4-z,3/4+y,1/4+x'
+ '3/4-z,1/4+y,3/4+x'
+ '1/4-z,3/4+y,3/4+x'
+ '1/4-z,1/4+y,1/4+x'
+ '1/2+y,-x,1/2-z'
+ '1/2+y,1/2-x,-z'
+ '+y,-x,-z'
+ '+y,1/2-x,1/2-z'
+ '3/4-x,3/4+z,1/4+y'
+ '3/4-x,1/4+z,3/4+y'
+ '1/4-x,3/4+z,3/4+y'
+ '1/4-x,1/4+z,1/4+y'
+ '1/2+z,-y,1/2-x'
+ '1/2+z,1/2-y,-x'
+ '+z,-y,-x'
+ '+z,1/2-y,1/2-x'
+ '3/4-y,3/4+x,1/4+z'
+ '3/4-y,1/4+x,3/4+z'
+ '1/4-y,3/4+x,3/4+z'
+ '1/4-y,1/4+x,1/4+z'
+ 'x,1/2+z,1/2+y'
+ 'x,+z,+y'
+ '1/2+x,1/2+z,+y'
+ '1/2+x,+z,1/2+y'
+ '1/4-z,3/4-y,3/4-x'
+ '1/4-z,1/4-y,1/4-x'
+ '3/4-z,3/4-y,1/4-x'
+ '3/4-z,1/4-y,3/4-x'
+ 'y,1/2+x,1/2+z'
+ 'y,+x,+z'
+ '1/2+y,1/2+x,+z'
+ '1/2+y,+x,1/2+z'
+ '1/4-x,3/4-z,3/4-y'
+ '1/4-x,1/4-z,1/4-y'
+ '3/4-x,3/4-z,1/4-y'
+ '3/4-x,1/4-z,3/4-y'
+ 'z,1/2+y,1/2+x'
+ 'z,+y,+x'
+ '1/2+z,1/2+y,+x'
+ '1/2+z,+y,1/2+x'
+ '1/4-y,3/4-x,3/4-z'
+ '1/4-y,1/4-x,1/4-z'
+ '3/4-y,3/4-x,1/4-z'
+ '3/4-y,1/4-x,3/4-z'
+ '3/4+z,1/4+x,3/4-y'
+ '3/4+z,3/4+x,1/4-y'
+ '1/4+z,1/4+x,1/4-y'
+ '1/4+z,3/4+x,3/4-y'
+ '-y,1/2-z,1/2+x'
+ '-y,-z,+x'
+ '1/2-y,1/2-z,+x'
+ '1/2-y,-z,1/2+x'
+ '3/4+x,1/4+y,3/4-z'
+ '3/4+x,3/4+y,1/4-z'
+ '1/4+x,1/4+y,1/4-z'
+ '1/4+x,3/4+y,3/4-z'
+ '-z,1/2-x,1/2+y'
+ '-z,-x,+y'
+ '1/2-z,1/2-x,+y'
+ '1/2-z,-x,1/2+y'
+ '3/4+y,1/4+z,3/4-x'
+ '3/4+y,3/4+z,1/4-x'
+ '1/4+y,1/4+z,1/4-x'
+ '1/4+y,3/4+z,3/4-x'
+ '-x,1/2-y,1/2+z'
+ '-x,-y,+z'
+ '1/2-x,1/2-y,+z'
+ '1/2-x,-y,1/2+z'
+ '1/4-z,3/4+x,3/4+y'
+ '1/4-z,1/4+x,1/4+y'
+ '3/4-z,3/4+x,1/4+y'
+ '3/4-z,1/4+x,3/4+y'
+ 'y,-z,-x'
+ 'y,1/2-z,1/2-x'
+ '1/2+y,-z,1/2-x'
+ '1/2+y,1/2-z,-x'
+ '1/4-x,3/4+y,3/4+z'
+ '1/4-x,1/4+y,1/4+z'
+ '3/4-x,3/4+y,1/4+z'
+ '3/4-x,1/4+y,3/4+z'
+ 'z,-x,-y'
+ 'z,1/2-x,1/2-y'
+ '1/2+z,-x,1/2-y'
+ '1/2+z,1/2-x,-y'
+ '1/4-y,3/4+z,3/4+x'
+ '1/4-y,1/4+z,1/4+x'
+ '3/4-y,3/4+z,1/4+x'
+ '3/4-y,1/4+z,3/4+x'
+ 'x,-y,-z'
+ 'x,1/2-y,1/2-z'
+ '1/2+x,-y,1/2-z'
+ '1/2+x,1/2-y,-z'
+ '1/2-x,1/2+z,-y'
+ '1/2-x,+z,1/2-y'
+ '-x,1/2+z,1/2-y'
+ '-x,+z,-y'
+ '1/4+z,3/4-y,3/4+x'
+ '1/4+z,1/4-y,1/4+x'
+ '3/4+z,3/4-y,1/4+x'
+ '3/4+z,1/4-y,3/4+x'
+ '1/2-y,1/2+x,-z'
+ '1/2-y,+x,1/2-z'
+ '-y,1/2+x,1/2-z'
+ '-y,+x,-z'
+ '1/4+x,3/4-z,3/4+y'
+ '1/4+x,1/4-z,1/4+y'
+ '3/4+x,3/4-z,1/4+y'
+ '3/4+x,1/4-z,3/4+y'
+ '1/2-z,1/2+y,-x'
+ '1/2-z,+y,1/2-x'
+ '-z,1/2+y,1/2-x'
+ '-z,+y,-x'
+ '1/4+y,3/4-x,3/4+z'
+ '1/4+y,1/4-x,1/4+z'
+ '3/4+y,3/4-x,1/4+z'
+ '3/4+y,1/4-x,3/4+z'
+ '-x,-z,y'
+ '-x,1/2-z,1/2+y'
+ '1/2-x,-z,1/2+y'
+ '1/2-x,1/2-z,y'
+ '3/4+z,3/4+y,1/4-x'
+ '3/4+z,1/4+y,3/4-x'
+ '1/4+z,3/4+y,3/4-x'
+ '1/4+z,1/4+y,1/4-x'
+ '-y,-x,z'
+ '-y,1/2-x,1/2+z'
+ '1/2-y,-x,1/2+z'
+ '1/2-y,1/2-x,z'
+ '3/4+x,3/4+z,1/4-y'
+ '3/4+x,1/4+z,3/4-y'
+ '1/4+x,3/4+z,3/4-y'
+ '1/4+x,1/4+z,1/4-y'
+ '-z,-y,x'
+ '-z,1/2-y,1/2+x'
+ '1/2-z,-y,1/2+x'
+ '1/2-z,1/2-y,x'
+ '3/4+y,3/4+x,1/4-z'
+ '3/4+y,1/4+x,3/4-z'
+ '1/4+y,3/4+x,3/4-z'
+ '1/4+y,1/4+x,1/4-z'
+ '1/4-z,1/4-x,1/4-y'
+ '1/4-z,3/4-x,3/4-y'
+ '3/4-z,1/4-x,3/4-y'
+ '3/4-z,3/4-x,1/4-y'
+ 'y,z,x'
+ 'y,1/2+z,1/2+x'
+ '1/2+y,z,1/2+x'
+ '1/2+y,1/2+z,x'
+ '1/4-x,1/4-y,1/4-z'
+ '1/4-x,3/4-y,3/4-z'
+ '3/4-x,1/4-y,3/4-z'
+ '3/4-x,3/4-y,1/4-z'
+ 'z,x,y'
+ 'z,1/2+x,1/2+y'
+ '1/2+z,x,1/2+y'
+ '1/2+z,1/2+x,y'
+ '1/4-y,1/4-z,1/4-x'
+ '1/4-y,3/4-z,3/4-x'
+ '3/4-y,1/4-z,3/4-x'
+ '3/4-y,3/4-z,1/4-x'
+loop_
+_atom_site_label
+_atom_site_fract_x
+_atom_site_fract_y
+_atom_site_fract_z
+Si 0.00000 0.00000 0.00000
diff --git a/cifs/si_data.txt b/cifs/si_data.txt
new file mode 100644
index 0000000..122f66e
--- /dev/null
+++ b/cifs/si_data.txt
@@ -0,0 +1,62 @@
+ h k l d (Å) F(real) F(imag) |F| 2θ I M ID(λ) Phase
+ 1 1 1 3.135416 42.918529 -42.174846 60.1724 15.02750 100.00000 8 1 1
+ 2 2 0 1.920042 70.526914 0.743683 70.5308 24.65942 78.42871 12 1 1
+ 3 1 1 1.637418 32.703565 33.447248 46.7786 29.00169 50.63669 24 1 1
+ 2 2 2 1.567708 0.000000 0.000000 1.19071e-14 30.32153 0.00000 8 1 1
+ 4 0 0 1.357675 60.911197 0.743683 60.9157 35.15396 14.98810 6 1 1
+ 3 3 1 1.245888 29.531380 -28.787697 41.2412 38.42620 23.36149 24 1 1
+ 4 2 2 1.108537 54.470432 0.743683 54.4755 43.41358 32.79720 24 1 1
+ 3 3 3 1.045139 25.810943 26.554626 37.0318 46.19443 4.53580 8 1 1
+ 5 1 1 1.045139 26.554626 -25.810943 37.0318 46.19443 13.60741 24 1 1
+ 4 4 0 0.960021 49.131451 0.743683 49.1371 50.56401 10.28179 12 1 1
+ 5 3 1 0.917956 23.296877 24.040560 33.4768 53.05721 17.63877 48 1 1
+ 4 4 2 0.905117 0.000000 0.000000 3.51177e-14 53.87012 0.00000 24 1 1
+ 6 2 0 0.858669 44.566753 0.743683 44.573 57.04230 13.93074 24 1 1
+ 5 3 3 0.828174 21.884712 -21.141029 30.4283 59.34808 6.10721 24 1 1
+ 6 2 2 0.818709 0.000000 -0.000000 2.46608e-14 60.10437 0.00000 24 1 1
+ 4 4 4 0.783854 40.642055 0.743683 40.6489 63.07501 3.31776 8 1 1
+ 5 5 1 0.760450 20.029115 -19.285433 27.8046 65.25219 4.43553 24 1 1
+ 7 1 1 0.760450 19.285433 20.029115 27.8046 65.25219 4.43553 24 1 1
+ 6 4 2 0.725708 37.258653 0.743683 37.2661 68.79982 14.81350 48 1 1
+ 5 5 3 0.707017 17.684316 18.427999 25.5407 70.88720 3.34445 24 1 1
+ 7 3 1 0.707017 18.427999 -17.684316 25.5407 70.88720 6.68890 48 1 1
+ 8 0 0 0.678837 34.334848 0.743683 34.3429 74.31006 1.42454 6 1 1
+ 7 3 3 0.663466 16.299420 17.043102 23.5826 76.33569 2.60181 24 1 1
+ 6 4 4 0.658569 0.000000 -0.000000 4.64906e-16 77.00692 0.00000 24 1 1
+ 6 6 0 0.640014 31.801918 0.743683 31.8106 79.67477 2.25527 12 1 1
+ 8 2 2 0.640014 31.801918 0.743683 31.8106 79.67477 4.51054 24 1 1
+ 7 5 1 0.627083 15.098512 15.842195 21.8847 81.66058 4.15966 48 1 1
+ 5 5 5 0.627083 15.842195 -15.098512 21.8847 81.66058 0.69328 8 1 1
+ 6 6 2 0.622944 -0.000000 0.000000 5.40295e-14 82.32017 0.00000 24 1 1
+ 8 4 0 0.607171 29.601901 0.743683 29.6112 84.94918 3.66200 24 1 1
+ 7 5 3 0.596097 14.798082 -14.054399 20.4086 86.91366 3.40727 48 1 1
+ 9 1 1 0.596097 14.798082 -14.054399 20.4086 86.91366 1.70364 24 1 1
+ 8 4 2 0.592538 0.000000 -0.000000 7.30012e-16 87.56756 0.00000 48 1 1
+ 6 6 4 0.578915 27.685862 0.743683 27.6958 90.18087 3.04264 24 1 1
+ 9 3 1 0.569292 13.144111 13.887794 19.1217 92.14080 2.85447 48 1 1
+ 8 4 4 0.554268 26.012448 0.743683 26.0231 95.41407 2.58336 24 1 1
+ 7 5 5 0.545806 12.348234 13.091917 17.9966 97.38589 1.22136 24 1 1
+ 7 7 1 0.545806 13.091917 -12.348234 17.9966 97.38589 1.22136 24 1 1
+ 9 3 3 0.545806 13.091917 -12.348234 17.9966 97.38589 1.22136 24 1 1
+ 8 6 2 0.532524 24.546686 0.743683 24.5579 100.69313 4.47884 48 1 1
+ 10 2 0 0.532524 24.546686 0.743683 24.5579 100.69313 2.23942 24 1 1
+ 7 7 3 0.525006 11.650341 12.394024 17.0101 102.69420 1.06691 24 1 1
+ 9 5 1 0.525006 12.394024 -11.650341 17.0101 102.69420 2.13382 48 1 1
+ 6 6 6 0.522569 0.000000 -0.000000 1.86795e-14 103.36460 0.00000 8 1 1
+ 10 2 2 0.522569 -0.000000 0.000000 4.20017e-14 103.36460 0.00000 24 1 1
+ 9 5 3 0.506415 11.036517 11.780200 16.1424 108.11610 1.90265 48 1 1
+ 8 6 4 0.504228 -0.000000 0.000000 2.26115e-14 108.80468 0.00000 48 1 1
+ 10 4 2 0.495753 22.124179 0.743683 22.1367 111.58869 3.58024 48 1 1
+ 11 1 1 0.489670 10.494964 11.238646 15.377 113.71200 0.86647 24 1 1
+ 7 7 5 0.489670 11.238646 -10.494964 15.377 113.71200 0.86647 24 1 1
+ 8 8 0 0.480011 21.121037 0.743683 21.1341 117.33144 0.82680 12 1 1
+ 9 7 1 0.474482 10.015665 10.759348 14.6996 119.56006 1.61519 48 1 1
+ 11 3 1 0.474482 10.759348 -10.015665 14.6996 119.56006 1.61519 48 1 1
+ 9 5 5 0.474482 10.759348 -10.015665 14.6996 119.56006 0.80760 24 1 1
+ 8 8 2 0.472682 -0.000000 0.000000 2.06166e-14 120.31377 0.00000 24 1 1
+ 10 4 4 0.472682 -0.000000 0.000000 2.06166e-14 120.31377 0.00000 24 1 1
+ 10 6 0 0.465679 20.231441 0.743683 20.2451 123.38987 1.56629 24 1 1
+ 8 6 6 0.465679 20.231441 0.743683 20.2451 123.38987 1.56629 24 1 1
+ 9 7 3 0.460626 10.333790 -9.590107 14.0981 125.76991 1.54628 48 1 1
+ 11 3 3 0.460626 9.590107 10.333790 14.0981 125.76991 0.77314 24 1 1
+ 10 6 2 0.458978 -0.000000 -0.000000 1.56336e-14 126.57904 0.00000 48 1 1
diff --git a/config/i11/bad_channels.txt b/config/i11/bad_channels.txt
new file mode 100644
index 0000000..7072e52
--- /dev/null
+++ b/config/i11/bad_channels.txt
@@ -0,0 +1,2990 @@
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+165
+252
+377
+444
+464
+599
+1188
+1238
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1310
+1365
+1603
+1864
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2671
+2795
+3277
+3319
+3321
+3327
+3369
+3370
+3371
+3375
+3666
+3681
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+4528
+4534
+4618
+4624
+4639
+4640
+4650
+4740
+5019
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5940
+6245
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
+6409
+6410
+6411
+6412
+6413
+6414
+6965
+6982
+6983
+6984
+7665
+7666
+7667
+7668
+7669
+7670
+7671
+7672
+7673
+7674
+7675
+7676
+7677
+7678
+7679
+7680
+7681
+7682
+7683
+7684
+7685
+7686
+7687
+7688
+7689
+7690
+7691
+7692
+7693
+7694
+7711
+7712
+7726
+8132
+8133
+8134
+8135
+8482
+8499
+8671
+8676
+8683
+8945
+8946
+8947
+8948
+8949
+8950
+8951
+8952
+8953
+8954
+8955
+8956
+8957
+8958
+8959
+8960
+8961
+8962
+8963
+8964
+8965
+8966
+8967
+8968
+8969
+8970
+8971
+8972
+8973
+8974
+10074
+10225
+10226
+10227
+10228
+10229
+10230
+10231
+10232
+10233
+10234
+10235
+10236
+10237
+10238
+10239
+10240
+10241
+10242
+10243
+10244
+10245
+10246
+10247
+10248
+10249
+10250
+10251
+10252
+10253
+10254
+11065
+11066
+11505
+11506
+11507
+11508
+11509
+11510
+11511
+11512
+11513
+11514
+11515
+11516
+11517
+11518
+11519
+11520
+11521
+11522
+11523
+11524
+11525
+11526
+11527
+11528
+11529
+11530
+11531
+11532
+11533
+11534
+11579
+11683
+11726
+11750
+11952
+12133
+12525
+12744
+12745
+12767
+12781
+12784
+12785
+12786
+12787
+12788
+12789
+12790
+12791
+12792
+12793
+12794
+12795
+12796
+12797
+12798
+12799
+12800
+12801
+12802
+12803
+12804
+12805
+12806
+12807
+12808
+12809
+12810
+12811
+12812
+12813
+12814
+12855
+12994
+13199
+13478
+13479
+13480
+13581
+13582
+13837
+13838
+13953
+13954
+13955
+13975
+13978
+14065
+14066
+14067
+14068
+14069
+14070
+14071
+14072
+14073
+14074
+14075
+14076
+14077
+14078
+14079
+14080
+14081
+14082
+14083
+14084
+14085
+14086
+14087
+14088
+14089
+14090
+14091
+14092
+14093
+14094
+14095
+14096
+14097
+14098
+14099
+14100
+14101
+14102
+14103
+14104
+14105
+14106
+14107
+14108
+14109
+14110
+14111
+14112
+14113
+14114
+14115
+14116
+14117
+14118
+14119
+14120
+14121
+14122
+14123
+14124
+14125
+14126
+14127
+14128
+14129
+14130
+14131
+14132
+14133
+14134
+14135
+14136
+14137
+14138
+14139
+14140
+14141
+14142
+14143
+14144
+14145
+14146
+14147
+14148
+14149
+14150
+14151
+14152
+14153
+14154
+14155
+14156
+14157
+14158
+14159
+14160
+14161
+14162
+14163
+14164
+14165
+14166
+14167
+14168
+14169
+14170
+14171
+14172
+14173
+14174
+14175
+14176
+14177
+14178
+14179
+14180
+14181
+14182
+14183
+14184
+14185
+14186
+14187
+14188
+14189
+14190
+14191
+14192
+14193
+14194
+14195
+14196
+14197
+14198
+14199
+14200
+14201
+14202
+14203
+14204
+14205
+14206
+14207
+14208
+14209
+14210
+14211
+14212
+14213
+14214
+14215
+14216
+14217
+14218
+14219
+14220
+14221
+14222
+14223
+14224
+14225
+14226
+14227
+14228
+14229
+14230
+14231
+14232
+14233
+14234
+14235
+14236
+14237
+14238
+14239
+14240
+14241
+14242
+14243
+14244
+14245
+14246
+14247
+14248
+14249
+14250
+14251
+14252
+14253
+14254
+14255
+14256
+14257
+14258
+14259
+14260
+14261
+14262
+14263
+14264
+14265
+14266
+14267
+14268
+14269
+14270
+14271
+14272
+14273
+14274
+14275
+14276
+14277
+14278
+14279
+14280
+14281
+14282
+14283
+14284
+14285
+14286
+14287
+14288
+14289
+14290
+14291
+14292
+14293
+14294
+14295
+14296
+14297
+14298
+14299
+14300
+14301
+14302
+14303
+14304
+14305
+14306
+14307
+14308
+14309
+14310
+14311
+14312
+14313
+14314
+14315
+14316
+14317
+14318
+14319
+14320
+14321
+14322
+14323
+14324
+14325
+14326
+14327
+14328
+14329
+14330
+14331
+14332
+14333
+14334
+14335
+14406
+14441
+14480
+14552
+14617
+14618
+14619
+14620
+14621
+14622
+14623
+14624
+14625
+14626
+14627
+14628
+14629
+14630
+14631
+14632
+14633
+14634
+14635
+14834
+15104
+15128
+15200
+15201
+15285
+15345
+15346
+15347
+15348
+15349
+15350
+15351
+15352
+15353
+15354
+15355
+15356
+15357
+15358
+15359
+15360
+15361
+15362
+15363
+15364
+15365
+15366
+15367
+15368
+15369
+15370
+15371
+15372
+15373
+15374
+15379
+15437
+15822
+15826
+15845
+15883
+15932
+15944
+16135
+16136
+16137
+16138
+16139
+16140
+16141
+16142
+16143
+16310
+16311
+16312
+16313
+16314
+16315
+16316
+16317
+16318
+16319
+16320
+16321
+16322
+16395
+16396
+16397
+16398
+16399
+16400
+16401
+16402
+16403
+16404
+16522
+16524
+16625
+16626
+16627
+16628
+16629
+16630
+16631
+16632
+16633
+16634
+16635
+16636
+16637
+16638
+16639
+16640
+16641
+16642
+16643
+16644
+16645
+16646
+16647
+16648
+16649
+16650
+16651
+16652
+16653
+16654
+16659
+17044
+17905
+17906
+17907
+17908
+17909
+17910
+17911
+17912
+17913
+17914
+17915
+17916
+17917
+17918
+17919
+17920
+17921
+17922
+17923
+17924
+17925
+17926
+17927
+17928
+17929
+17930
+17931
+17932
+17933
+17934
+17990
+18073
+18074
+18075
+18076
+18498
+18525
+18819
+18931
+18933
+18942
+19012
+19014
+19015
+19016
+19018
+19068
+19070
+19099
+19185
+19186
+19187
+19188
+19189
+19190
+19191
+19192
+19193
+19194
+19195
+19196
+19197
+19198
+19199
+19200
+19201
+19202
+19203
+19204
+19205
+19206
+19207
+19208
+19209
+19210
+19211
+19212
+19213
+19214
+19294
+19302
+19326
+19889
+19926
+19943
+19945
+19966
+20162
+20190
+20276
+20289
+20443
+20445
+20446
+20455
+20457
+20465
+20466
+20467
+20468
+20469
+20470
+20471
+20472
+20473
+20474
+20475
+20476
+20477
+20478
+20479
+20480
+20481
+20482
+20483
+20484
+20485
+20486
+20487
+20488
+20489
+20490
+20491
+20492
+20493
+20494
+20689
+21266
+21419
+21471
+21473
+21670
+21745
+21746
+21747
+21748
+21749
+21750
+21751
+21752
+21753
+21754
+21755
+21756
+21757
+21758
+21759
+21760
+21761
+21762
+21763
+21764
+21765
+21766
+21767
+21768
+21769
+21770
+21771
+21772
+21773
+21774
+21775
+21776
+21777
+21778
+21779
+21780
+21781
+21782
+21783
+21784
+21785
+21786
+21787
+21788
+21789
+21790
+21791
+21792
+21793
+21794
+21795
+21796
+21797
+21798
+21799
+21800
+21801
+21802
+21803
+21804
+21805
+21806
+21807
+21808
+21809
+21810
+21811
+21812
+21813
+21814
+21815
+21816
+21817
+21818
+21819
+21820
+21821
+21822
+21823
+21824
+21825
+21826
+21827
+21828
+21829
+21830
+21831
+21832
+21833
+21834
+21835
+21836
+21837
+21838
+21839
+21840
+21841
+21842
+21843
+21844
+21845
+21846
+21847
+21848
+21849
+21850
+21851
+21852
+21853
+21854
+21855
+21856
+21857
+21858
+21859
+21860
+21861
+21862
+21863
+21864
+21865
+21866
+21867
+21868
+21869
+21870
+21871
+21872
+21873
+21874
+21875
+21876
+21877
+21878
+21879
+21880
+21881
+21882
+21883
+21884
+21885
+21886
+21887
+21888
+21889
+21890
+21891
+21892
+21893
+21894
+21895
+21896
+21897
+21898
+21899
+21900
+21901
+21902
+21903
+21904
+21905
+21906
+21907
+21908
+21909
+21910
+21911
+21912
+21913
+21914
+21915
+21916
+21917
+21918
+21919
+21920
+21921
+21922
+21923
+21924
+21925
+21926
+21927
+21928
+21929
+21930
+21931
+21932
+21933
+21934
+21935
+21936
+21937
+21938
+21939
+21940
+21941
+21942
+21943
+21944
+21945
+21946
+21947
+21948
+21949
+21950
+21951
+21952
+21953
+21954
+21955
+21956
+21957
+21958
+21959
+21960
+21961
+21962
+21963
+21964
+21965
+21966
+21967
+21968
+21969
+21970
+21971
+21972
+21973
+21974
+21975
+21976
+21977
+21978
+21979
+21980
+21981
+21982
+21983
+21984
+21985
+21986
+21987
+21988
+21989
+21990
+21991
+21992
+21993
+21994
+21995
+21996
+21997
+21998
+21999
+22000
+22001
+22002
+22003
+22004
+22005
+22006
+22007
+22008
+22009
+22010
+22011
+22012
+22013
+22014
+22015
+22016
+22017
+22018
+22019
+22020
+22021
+22022
+22023
+22024
+22025
+22026
+22027
+22028
+22029
+22030
+22031
+22032
+22033
+22034
+22035
+22036
+22037
+22038
+22039
+22040
+22041
+22042
+22043
+22044
+22045
+22046
+22047
+22048
+22049
+22050
+22051
+22052
+22053
+22054
+22055
+22056
+22057
+22058
+22059
+22060
+22061
+22062
+22063
+22064
+22065
+22066
+22067
+22068
+22069
+22070
+22071
+22072
+22073
+22074
+22075
+22076
+22077
+22078
+22079
+22080
+22081
+22082
+22083
+22084
+22085
+22086
+22087
+22088
+22089
+22090
+22091
+22092
+22093
+22094
+22095
+22096
+22097
+22098
+22099
+22100
+22101
+22102
+22103
+22104
+22105
+22106
+22107
+22108
+22109
+22110
+22111
+22112
+22113
+22114
+22115
+22116
+22117
+22118
+22119
+22120
+22121
+22122
+22123
+22124
+22125
+22126
+22127
+22128
+22129
+22130
+22131
+22132
+22133
+22134
+22135
+22136
+22137
+22138
+22139
+22140
+22141
+22142
+22143
+22144
+22145
+22146
+22147
+22148
+22149
+22150
+22151
+22152
+22153
+22154
+22155
+22156
+22157
+22158
+22159
+22160
+22161
+22162
+22163
+22164
+22165
+22166
+22167
+22168
+22169
+22170
+22171
+22172
+22173
+22174
+22175
+22176
+22177
+22178
+22179
+22180
+22181
+22182
+22183
+22184
+22185
+22186
+22187
+22188
+22189
+22190
+22191
+22192
+22193
+22194
+22195
+22196
+22197
+22198
+22199
+22200
+22201
+22202
+22203
+22204
+22205
+22206
+22207
+22208
+22209
+22210
+22211
+22212
+22213
+22214
+22215
+22216
+22217
+22218
+22219
+22220
+22221
+22222
+22223
+22224
+22225
+22226
+22227
+22228
+22229
+22230
+22231
+22232
+22233
+22234
+22235
+22236
+22237
+22238
+22239
+22240
+22241
+22242
+22243
+22244
+22245
+22246
+22247
+22248
+22249
+22250
+22251
+22252
+22253
+22254
+22255
+22256
+22257
+22258
+22259
+22260
+22261
+22262
+22263
+22264
+22265
+22266
+22267
+22268
+22269
+22270
+22271
+22272
+22273
+22274
+22275
+22276
+22277
+22278
+22279
+22280
+22281
+22282
+22283
+22284
+22285
+22286
+22287
+22288
+22289
+22290
+22291
+22292
+22293
+22294
+22295
+22296
+22297
+22298
+22299
+22300
+22301
+22302
+22303
+22304
+22305
+22306
+22307
+22308
+22309
+22310
+22311
+22312
+22313
+22314
+22315
+22316
+22317
+22318
+22319
+22320
+22321
+22322
+22323
+22324
+22325
+22326
+22327
+22328
+22329
+22330
+22331
+22332
+22333
+22334
+22335
+22336
+22337
+22338
+22339
+22340
+22341
+22342
+22343
+22344
+22345
+22346
+22347
+22348
+22349
+22350
+22351
+22352
+22353
+22354
+22355
+22356
+22357
+22358
+22359
+22360
+22361
+22362
+22363
+22364
+22365
+22366
+22367
+22368
+22369
+22370
+22371
+22372
+22373
+22374
+22375
+22376
+22377
+22378
+22379
+22380
+22381
+22382
+22383
+22384
+22385
+22386
+22387
+22388
+22389
+22390
+22391
+22392
+22393
+22394
+22395
+22396
+22397
+22398
+22399
+22400
+22401
+22402
+22403
+22404
+22405
+22406
+22407
+22408
+22409
+22410
+22411
+22412
+22413
+22414
+22415
+22416
+22417
+22418
+22419
+22420
+22421
+22422
+22423
+22424
+22425
+22426
+22427
+22428
+22429
+22430
+22431
+22432
+22433
+22434
+22435
+22436
+22437
+22438
+22439
+22440
+22441
+22442
+22443
+22444
+22445
+22446
+22447
+22448
+22449
+22450
+22451
+22452
+22453
+22454
+22455
+22456
+22457
+22458
+22459
+22460
+22461
+22462
+22463
+22464
+22465
+22466
+22467
+22468
+22469
+22470
+22471
+22472
+22473
+22474
+22475
+22476
+22477
+22478
+22479
+22480
+22481
+22482
+22483
+22484
+22485
+22486
+22487
+22488
+22489
+22490
+22491
+22492
+22493
+22494
+22495
+22496
+22497
+22498
+22499
+22500
+22501
+22502
+22503
+22504
+22505
+22506
+22507
+22508
+22509
+22510
+22511
+22512
+22513
+22514
+22515
+22516
+22517
+22518
+22519
+22520
+22521
+22522
+22523
+22524
+22525
+22526
+22527
+22528
+22529
+22530
+22531
+22532
+22533
+22534
+22535
+22536
+22537
+22538
+22539
+22540
+22541
+22542
+22543
+22544
+22545
+22546
+22547
+22548
+22549
+22550
+22551
+22552
+22553
+22554
+22555
+22556
+22557
+22558
+22559
+22560
+22561
+22562
+22563
+22564
+22565
+22566
+22567
+22568
+22569
+22570
+22571
+22572
+22573
+22574
+22575
+22576
+22577
+22578
+22579
+22580
+22581
+22582
+22583
+22584
+22585
+22586
+22587
+22588
+22589
+22590
+22591
+22592
+22593
+22594
+22595
+22596
+22597
+22598
+22599
+22600
+22601
+22602
+22603
+22604
+22605
+22606
+22607
+22608
+22609
+22610
+22611
+22612
+22613
+22614
+22615
+22616
+22617
+22618
+22619
+22620
+22621
+22622
+22623
+22624
+22625
+22626
+22627
+22628
+22629
+22630
+22631
+22632
+22633
+22634
+22635
+22636
+22637
+22638
+22639
+22640
+22641
+22642
+22643
+22644
+22645
+22646
+22647
+22648
+22649
+22650
+22651
+22652
+22653
+22654
+22655
+22656
+22657
+22658
+22659
+22660
+22661
+22662
+22663
+22664
+22665
+22666
+22667
+22668
+22669
+22670
+22671
+22672
+22673
+22674
+22675
+22676
+22677
+22678
+22679
+22680
+22681
+22682
+22683
+22684
+22685
+22686
+22687
+22688
+22689
+22690
+22691
+22692
+22693
+22694
+22695
+22696
+22697
+22698
+22699
+22700
+22701
+22702
+22703
+22704
+22705
+22706
+22707
+22708
+22709
+22710
+22711
+22712
+22713
+22714
+22715
+22716
+22717
+22718
+22719
+22720
+22721
+22722
+22723
+22724
+22725
+22726
+22727
+22728
+22729
+22730
+22731
+22732
+22733
+22734
+22735
+22736
+22737
+22738
+22739
+22740
+22741
+22742
+22743
+22744
+22745
+22746
+22747
+22748
+22749
+22750
+22751
+22752
+22753
+22754
+22755
+22756
+22757
+22758
+22759
+22760
+22761
+22762
+22763
+22764
+22765
+22766
+22767
+22768
+22769
+22770
+22771
+22772
+22773
+22774
+22775
+22776
+22777
+22778
+22779
+22780
+22781
+22782
+22783
+22784
+22785
+22786
+22787
+22788
+22789
+22790
+22791
+22792
+22793
+22794
+22795
+22796
+22797
+22798
+22799
+22800
+22801
+22802
+22803
+22804
+22805
+22806
+22807
+22808
+22809
+22810
+22811
+22812
+22813
+22814
+22815
+22816
+22817
+22818
+22819
+22820
+22821
+22822
+22823
+22824
+22825
+22826
+22827
+22828
+22829
+22830
+22831
+22832
+22833
+22834
+22835
+22836
+22837
+22838
+22839
+22840
+22841
+22842
+22843
+22844
+22845
+22846
+22847
+22848
+22849
+22850
+22851
+22852
+22853
+22854
+22855
+22856
+22857
+22858
+22859
+22860
+22861
+22862
+22863
+22864
+22865
+22866
+22867
+22868
+22869
+22870
+22871
+22872
+22873
+22874
+22875
+22876
+22877
+22878
+22879
+22880
+22881
+22882
+22883
+22884
+22885
+22886
+22887
+22888
+22889
+22890
+22891
+22892
+22893
+22894
+22895
+22896
+22897
+22898
+22899
+22900
+22901
+22902
+22903
+22904
+22905
+22906
+22907
+22908
+22909
+22910
+22911
+22912
+22913
+22914
+22915
+22916
+22917
+22918
+22919
+22920
+22921
+22922
+22923
+22924
+22925
+22926
+22927
+22928
+22929
+22930
+22931
+22932
+22933
+22934
+22935
+22936
+22937
+22938
+22939
+22940
+22941
+22942
+22943
+22944
+22945
+22946
+22947
+22948
+22949
+22950
+22951
+22952
+22953
+22954
+22955
+22956
+22957
+22958
+22959
+22960
+22961
+22962
+22963
+22964
+22965
+22966
+22967
+22968
+22969
+22970
+22971
+22972
+22973
+22974
+22975
+22976
+22977
+22978
+22979
+22980
+22981
+22982
+22983
+22984
+22985
+22986
+22987
+22988
+22989
+22990
+22991
+22992
+22993
+22994
+22995
+22996
+22997
+22998
+22999
+23000
+23001
+23002
+23003
+23004
+23005
+23006
+23007
+23008
+23009
+23010
+23011
+23012
+23013
+23014
+23015
+23016
+23017
+23018
+23019
+23020
+23021
+23022
+23023
+23024
+23025
+23026
+23027
+23028
+23029
+23030
+23031
+23032
+23033
+23034
+23035
+23036
+23037
+23038
+23039
+23040
+23041
+23042
+23043
+23044
+23045
+23046
+23047
+23048
+23049
+23050
+23051
+23052
+23053
+23054
+23442
+23443
+23444
+23648
+23778
+24030
+24204
+24215
+24216
+24236
+24305
+24306
+24307
+24308
+24309
+24310
+24311
+24312
+24313
+24314
+24315
+24316
+24317
+24318
+24319
+24320
+24321
+24322
+24323
+24324
+24325
+24326
+24327
+24328
+24329
+24330
+24331
+24332
+24333
+24334
+25232
+25245
+25294
+25467
+25585
+25586
+25587
+25588
+25589
+25590
+25591
+25592
+25593
+25594
+25595
+25596
+25597
+25598
+25599
+25600
+25601
+25602
+25603
+25604
+25605
+25606
+25607
+25608
+25609
+25610
+25611
+25612
+25613
+25614
+25843
+25950
+26609
+26653
+26862
+26865
+26866
+26867
+26868
+26869
+26870
+26871
+26872
+26873
+26874
+26875
+26876
+26877
+26878
+26879
+26880
+26881
+26882
+26883
+26884
+26885
+26886
+26887
+26888
+26889
+26890
+26891
+26892
+26893
+26894
+27090
+27094
+27553
+27634
+27968
+28101
+28145
+28146
+28147
+28148
+28149
+28150
+28151
+28152
+28153
+28154
+28155
+28156
+28157
+28158
+28159
+28160
+28161
+28162
+28163
+28164
+28165
+28166
+28167
+28168
+28169
+28170
+28171
+28172
+28173
+28174
+28649
+28891
+29364
+29389
+29425
+29426
+29427
+29428
+29429
+29430
+29431
+29432
+29433
+29434
+29435
+29436
+29437
+29438
+29439
+29440
+29441
+29442
+29443
+29444
+29445
+29446
+29447
+29448
+29449
+29450
+29451
+29452
+29453
+29454
+29513
+29610
+29628
+29675
+29853
+30303
+30308
+30682
+30705
+30706
+30707
+30708
+30709
+30710
+30711
+30712
+30713
+30714
+30715
+30716
+30717
+30718
+30719
+30720
+30721
+30722
+30723
+30724
+30725
+30726
+30727
+30728
+30729
+30730
+30731
+30732
+30733
+30734
+30961
+31429
+31714
+31717
+31727
+31862
+31985
+31986
+31987
+31988
+31989
+31990
+31991
+31992
+31993
+31994
+31995
+31996
+31997
+31998
+31999
+32000
+32001
+32002
+32003
+32004
+32005
+32006
+32007
+32008
+32009
+32010
+32011
+32012
+32013
+32014
+32128
+32129
+32130
+32131
+32132
+32133
+32814
+32980
+33165
+33166
+33167
+33168
+33265
+33266
+33267
+33268
+33269
+33270
+33271
+33272
+33273
+33274
+33275
+33276
+33277
+33278
+33279
+33280
+33281
+33282
+33283
+33284
+33285
+33286
+33287
+33288
+33289
+33290
+33291
+33292
+33293
+33294
+33842
+33843
+34511
+34530
+34531
+34532
+34533
+34545
+34546
+34547
+34548
+34549
+34550
+34551
+34552
+34553
+34554
+34555
+34556
+34557
+34558
+34559
+34560
+34561
+34562
+34563
+34564
+34565
+34566
+34567
+34568
+34569
+34570
+34571
+34572
+34573
+34574
+34797
+34919
+35072
+35073
+35074
+35075
+35076
+35077
+35078
+35079
+35080
+35081
+35082
+35083
+35084
+35085
+35086
+35087
+35088
+35089
+35090
+35091
+35092
+35093
+35094
+35095
+35096
+35097
+35098
+35099
+35100
+35101
+35102
+35103
+35104
+35105
+35106
+35107
+35108
+35109
+35110
+35111
+35112
+35113
+35114
+35115
+35116
+35117
+35118
+35119
+35120
+35121
+35122
+35123
+35124
+35125
+35126
+35127
+35128
+35129
+35130
+35131
+35132
+35133
+35134
+35135
+35136
+35137
+35138
+35139
+35140
+35141
+35142
+35143
+35144
+35145
+35146
+35147
+35148
+35149
+35150
+35151
+35152
+35153
+35154
+35155
+35156
+35157
+35158
+35159
+35160
+35161
+35162
+35163
+35164
+35165
+35166
+35167
+35168
+35169
+35170
+35171
+35172
+35173
+35174
+35175
+35176
+35177
+35178
+35179
+35180
+35181
+35182
+35183
+35184
+35185
+35186
+35187
+35188
+35189
+35190
+35191
+35192
+35193
+35194
+35195
+35196
+35197
+35198
+35199
+35789
+35825
+35826
+35827
+35828
+35829
+35830
+35831
+35832
+35833
+35834
+35835
+35836
+35837
+35838
+35839
diff --git a/config/i11/mythen3_reduction_config.toml b/config/i11/mythen3_reduction_config.toml
new file mode 100644
index 0000000..3426997
--- /dev/null
+++ b/config/i11/mythen3_reduction_config.toml
@@ -0,0 +1,192 @@
+### Notes: This is used to modify the data reduction for the mythen3 detector.
+mythen3_detector_config = "/dls_sw/i11/software/mythen/mythen3.config" #used if number of active modules doesn't match data
+active_modules = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
+#if there are less than the modules specified here ^ it will assume only ring 1 is active ie 0-13
+bad_modules = [11, 17, 24] #[19, 23] #modules that may be in the raw that are to be removed by the reduction process
+bad_channel_masking = true #mask out the bad channels specified in the files below
+
+flatfield_filepath = "/dls_sw/i11/software/mythen3/diamond/flatfield/mythen3_1351666_1351675_flat.hdf5"
+#"/dls_sw/i11/software/mythen3/diamond/flatfield/flatfield_2025-04-04.h5" # "/dls_sw/i11/software/mythen3/diamond/flatfield/flatfield_202503311536.h5" "/dls_sw/i11/software/mythen3/diamond/flatfield/flatField_15keV_th7500eV.h5" #location of flatfield, Current one is: "/dls_sw/i11/software/mythen3/diamond/flatfield/flatField_15keV_th7500eV.h5" #scotts flatdfield "/dls_sw/i11/software/mythen3/diamond/flatfield/flatField_15keV_th7500eV.h5"
+apply_flatfield = false
+modules_in_flatfield = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20]
+
+send_to_ispyb = true
+
+save_nxs_out = true
+verbose_nxs = false
+out_raw_data = false
+debug_mode = true #this is for detector group to see all the data in it's full form, nothing removed, This will cause a seperate nxs to be saved, with the suffix _debug, and will save data parasitically and seperately from user data, THIS IS FOR SCOTT
+
+beam_energy = 15.0 #we could use this to calculate the diffraction pattern in Q space, or use a pv, or come up with something more clever ie auto Si refinment
+save_in_Q_space = false #save a file where the diffraction pattern has been converted into Q, must know the beam energy somehow
+rebin_step = 0.004
+default_counter = 0 #this specifies the type of threshold used internally by the detector, 0, 1 or 2, 0 = 7500 ev threshold
+edge_bad_channels = 15 #number of channels that are bad at the edge of modules (5-15 are about right)
+error_calc = "poisson" #this can be "poisson" "std_dev" or "max", poisson error is propagated poisson errors, std_dev is std_dev of counts in bin (will result in nan values if there is only 1 count in the bin), and "max" is the whichever is max for each bin
+
+###
+# Note on errors, If you have peaks with weak intensity, a high spread of data (high noise), the error shouldn't be less than the spread even if
+# poisson stats says it should have small error because there are few counts.
+# But equally if you have very large peaks with low spread, the error should reflect that, The error is unlikely to be very small because large peaks have large poisson error
+###
+
+
+######
+data_reduction_mode = "step_scan"
+# data_reduction_mode
+#0 = step_scab (all data will be reduced into 1 file, possibly multiple angles)
+#1 = time_resolved mode (many frames per .nxs saved into seperate .xye files for each frame)
+#2 = pump_probe (all frames will be read and summed together - data has been taken at static angle, optimised for lots of frames)
+######
+
+
+######
+# bad_dn.chans files are an ascii file specofying the bad channels numbers of each module, where each line specifies one bad channel 0-1279
+# ang_dn.off files specify the angular calibrations of each module, Determined experimentally and have 1 line with the format:
+# module 1 offset 62.99916323710597 conv 6.568575932737774e-05 center 639.5
+######
+
+bad_channels_filepath = "/workspaces/XRPD-Toolbox/config/i11/bad_channels.txt" #THIS SHOULD BE MOVED ALONG WITH EVERYTHING ELSE TO A CONSISTENT DIR!
+angcal_filepath = "/dls_sw/i11/software/mythen3/diamond/ang_cal_171125_cen_639.5_leastsq.off"
+
+# [angular_calibrations]
+# module_0 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d0.off"
+# module_1 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d1.off"
+# module_2 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d2.off"
+# module_3 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d3.off"
+# module_4 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d4.off"
+# module_5 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d5.off"
+# module_6 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d6.off"
+# module_7 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d7.off"
+# module_8 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d8.off"
+# module_9 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d9.off"
+# module_10 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d10.off"
+# module_11 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d11.off"
+# module_12 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d12.off"
+# module_13 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d13.off"
+# module_14 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d14.off"
+# module_15 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d15.off"
+# module_16 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d16.off"
+# module_17 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d17.off"
+# module_18 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d18.off"
+# module_19 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d19.off"
+# module_20 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d20.off"
+# module_21 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d21.off"
+# module_22 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d22.off"
+# module_23 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d23.off"
+# module_24 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d24.off"
+# module_25 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d25.off"
+# module_26 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d26.off"
+# module_27 = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d27.off"
+
+# [module_0]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d0.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d0.off"
+
+# [module_1]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d1.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d1.off"
+
+# [module_2]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d2.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d2.off"
+
+# [module_3]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d3.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d3.off"
+
+# [module_4]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d4.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d4.off"
+
+# [module_5]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d5.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d5.off"
+
+# [module_6]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d6.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d6.off"
+
+# [module_7]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d7.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d7.off"
+
+# [module_8]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d8.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d8.off"
+
+# [module_9]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d9.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d9.off"
+
+# [module_10]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d10.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d10.off"
+
+# [module_11]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d11.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d11.off"
+
+# [module_12]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d12.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d12.off"
+
+# [module_13]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d13.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d13.off"
+
+# [module_14]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d14.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d14.off"
+
+# [module_15]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d15.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d15.off"
+
+# [module_16]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d16.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d16.off"
+
+# [module_17]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d17.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d17.off"
+
+# [module_18]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d18.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d18.off"
+
+# [module_19]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d19.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d19.off"
+
+# [module_20]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d20.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d20.off"
+
+# [module_21]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d21.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d21.off"
+
+# [module_22]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d22.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d22.off"
+
+# [module_23]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d23.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d23.off"
+
+# [module_24]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d24.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d24.off"
+
+# [module_25]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d25.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d25.off"
+
+# [module_26]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d26.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d26.off"
+
+# [module_27]
+# bad_channels_path = "/dls_sw/i11/software/mythen3/diamond/calibration/bad_d27.chans"
+# angular_calibration_path = "/dls_sw/i11/software/mythen3/diamond/calibration/ang_d27.off"
diff --git a/pyproject.toml b/pyproject.toml
index da479fd..acb91a8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -18,9 +18,25 @@ dependencies = [
"matplotlib",
"scipy",
"pyfai",
- "pandas",
+ "pydantic",
+ "numpydantic",
"lmfit",
+ "pandas",
"peakutils",
+ "PyCifRW",
+ "pyyaml",
+ "toml",
+ "PyQt6",
+ # "PyQt5",
+ "spglib",
+ "pymatgen",
+ "scikit-learn",
+ "Dans_Diffraction",
+ "stomp.py",
+ "numba",
+ "gql",
+ "ipywidgets",
+
] # Add project dependencies here, e.g. ["click", "numpy"]
dynamic = ["version"]
license.file = "LICENSE"
diff --git a/src/xrpd_toolbox/core.py b/src/xrpd_toolbox/core.py
new file mode 100644
index 0000000..62fd7e2
--- /dev/null
+++ b/src/xrpd_toolbox/core.py
@@ -0,0 +1,724 @@
+from __future__ import annotations
+
+import json
+import math
+import tomllib
+from collections.abc import Collection
+from numbers import Real
+from pathlib import Path
+from typing import Annotated, Any, Literal, TypeAlias
+
+import matplotlib.pyplot as plt
+import numpy as np
+import toml
+import yaml
+from pydantic import (
+ BaseModel,
+ BeforeValidator,
+ ConfigDict,
+ Field,
+ PlainSerializer,
+ model_serializer,
+ model_validator,
+)
+
+SUPPORTED_FILE_TYPES = [".json", ".toml", ".yaml"]
+
+XUnit: TypeAlias = Literal["tth", "tof", "q", "d"]
+
+DataType: TypeAlias = Literal[
+ "xray",
+ "lab-xray",
+ "tof-neutron",
+ "cw-neutron",
+]
+
+
+def to_ndarray(v):
+ if isinstance(v, np.ndarray):
+ return v
+ if isinstance(v, list):
+ return np.asarray(v)
+ return v
+
+
+SerialisableNDArray = Annotated[
+ np.ndarray,
+ BeforeValidator(to_ndarray),
+ PlainSerializer(lambda x: x.tolist(), return_type=list),
+]
+
+SAFE_GLOBALS = {
+ "__builtins__": {},
+ "abs": abs,
+ "sin": math.sin,
+ "cos": math.cos,
+ "tan": math.tan,
+ "sqrt": math.sqrt,
+ "log": math.log,
+ "exp": math.exp,
+}
+
+
+def safe_pow(a, b):
+ if abs(a) > 1e6 or abs(b) > 100:
+ raise ValueError("too large")
+ return a**b
+
+
+def safe_exp(x):
+ if x > 700: # float overflow boundary
+ raise ValueError("exp too large")
+ return math.exp(x)
+
+
+# replace the power to use safe_pow which should protect against CPU heavy operations
+SAFE_GLOBALS["pow"] = safe_pow
+SAFE_GLOBALS["exp"] = safe_exp
+
+
+def evaluate_expression(expr: str, ctx: dict[str, float]) -> float:
+ """I realise this uses eval() which is discouraged,
+ but the other option is nasty, slower and adds bad complexity.
+ With the catches and by only using SAFE_GLOBALS and __builtins__
+ - the risk is basically 0"""
+
+ # prevents access to sub classes that could be dangerous to introspection attack
+ if "__" in expr or "." in expr:
+ raise ValueError("Disallowed expression")
+
+ # prevents stupidly long expression which might take forever to parse
+ if len(expr) > 200:
+ raise ValueError("Expression too long")
+
+ return float(eval(expr, SAFE_GLOBALS, ctx))
+
+
+class Parameter(BaseModel, Real):
+ value: float | int | str
+ refine: bool = True
+ bounds: list[float] = [-np.inf, np.inf]
+
+ _name: str | None = None
+ _model: Any = None # back reference to RefinementBaseModel
+
+ def _ctx(self) -> dict[str, float]:
+ """
+ IMPORTANT:
+ Only uses RAW values, never float(v), never recursion.
+ """
+ return {k: float(v.value) for k, v in self._model._params.items()} # noqa
+
+ def _compute_value(self) -> float:
+ # print(self, self.value, "\n\n")
+
+ if isinstance(self.value, (float, int)):
+ return float(self.value)
+ elif isinstance(self.value, str):
+ return evaluate_expression(self.value, self._ctx())
+ else:
+ raise Exception()
+
+ # helpers
+ def get_other_value(self, other: Parameter | int | float):
+ if isinstance(other, Parameter):
+ return other.value
+ else:
+ return other
+
+ def __float__(self):
+ return self._compute_value()
+
+ def _expr(self):
+ """formats the Parameter so that it shows as either
+ a number or _name in the expression"""
+ return self._name or str(self.value)
+
+ def _to_expression(self, other, op: str):
+ # if isinstance(self.value, (int, float)) and isinstance(other, (int, float)):
+ # return Parameter(value=)
+
+ if isinstance(other, Parameter):
+ return Parameter(value=f"({self._expr()} {op} {other._expr()})") # noqa
+ else:
+ return Parameter(value=f"({self._expr()} {op} {other})")
+
+ # arithmetic
+ def __add__(self, other: int | float | Parameter):
+ if isinstance(self.value, (int, float)) and isinstance(other, (int, float)):
+ return self.value + other
+ else:
+ return self._to_expression(other, "+")
+
+ def __radd__(self, other):
+ return self._to_expression(other, "+")
+
+ def __sub__(self, other):
+ return self._to_expression(other, "-")
+
+ def __rsub__(self, other):
+ return Parameter(value=f"({other} - {self._expr()})")
+
+ def __mul__(self, other):
+ return self._to_expression(other, "*")
+
+ def __rmul__(self, other):
+ return self._to_expression(other, "*")
+
+ def __truediv__(self, other):
+ return self._to_expression(other, "/")
+
+ def __rtruediv__(self, other):
+ return Parameter(value=f"({other} / {self._expr()})")
+
+ def __floordiv__(self, other):
+ return self._to_expression(other, "//")
+
+ def __rfloordiv__(self, other):
+ return Parameter(value=f"({other} // {self._expr()})")
+
+ def __mod__(self, other):
+ return self._to_expression(other, "%")
+
+ def __rmod__(self, other):
+ return Parameter(value=f"({other} % {self._expr()})")
+
+ def __pow__(self, other):
+ return self._to_expression(other, "**")
+
+ def __rpow__(self, other):
+ return Parameter(value=f"({other} ** {self._expr()})")
+
+ # unary
+ def __neg__(self):
+ return Parameter(value=f"-({self._expr()})")
+
+ def __abs__(self):
+ return Parameter(value=f"abs({self._expr()})")
+
+ # comparisons
+ def __eq__(self, other):
+ return float(self) == float(other)
+
+ def __lt__(self, other):
+ return float(self) < float(other)
+
+ def __le__(self, other):
+ return float(self) <= float(other)
+
+ def __gt__(self, other):
+ return float(self) > float(other)
+
+ def __ge__(self, other):
+ return float(self) >= float(other)
+
+ # Real interface
+ def __complex__(self):
+ return complex(float(self))
+
+ def __pos__(self):
+ return self
+
+ # numeric
+ def __int__(self):
+ return int(float(self))
+
+ def __trunc__(self):
+ return int(float(self))
+
+ def __floor__(self):
+ return math.floor(float(self))
+
+ def __ceil__(self):
+ return math.ceil(float(self))
+
+ def __round__(self, n=None):
+ return round(float(self), n)
+
+ def __array__(self):
+ return np.array([self._compute_value()], dtype=float)
+
+ @property
+ def real(self):
+ return float(self)
+
+ @property
+ def imag(self):
+ return 0
+
+ def conjugate(self):
+ return self
+
+ def __divmod__(self, other):
+ return divmod(float(self), float(other))
+
+ def __rdivmod__(self, other):
+ return divmod(float(other), float(self))
+
+
+# class Parameter(BaseModel, Real):
+# """A parameter acts like a value, that can be refined"""
+
+# value: float
+# refine: bool = Field(default=True)
+# bounds: list[float] = Field(default=[-np.inf, np.inf], repr=False)
+
+# def set_refine(self):
+# self.refine = True
+
+# def dont_refine(self):
+# self.refine = False
+
+# # helpers
+# def get_other_value(self, other):
+# if isinstance(other, Parameter):
+# return other.value
+# return other
+
+# def _op(self, other, fn):
+# return fn(self.value, self.get_other_value(other))
+
+# def _rop(self, other, fn):
+# return fn(self.get_other_value(other), self.value)
+
+# # required conversions
+# def __float__(self):
+# return float(self.value)
+
+# def __int__(self):
+# return int(self.value)
+
+# def __complex__(self):
+# return complex(self.value)
+
+# # Real abstract methods
+# def __trunc__(self):
+# return math.trunc(self.value)
+
+# def __floor__(self):
+# return math.floor(self.value)
+
+# def __ceil__(self):
+# return math.ceil(self.value)
+
+# def __round__(self, ndigits=None):
+# return round(self.value, ndigits)
+
+# # unary
+# def __neg__(self):
+# return -self.value
+
+# def __pos__(self):
+# return +self.value
+
+# def __abs__(self):
+# return abs(self.value)
+
+# # comparisons
+# def __eq__(self, other):
+# return self.value == self.get_other_value(other)
+
+# def __lt__(self, other):
+# return self.value < self.get_other_value(other)
+
+# def __le__(self, other):
+# return self.value <= self.get_other_value(other)
+
+# def __gt__(self, other):
+# return self.value > self.get_other_value(other)
+
+# def __ge__(self, other):
+# return self.value >= self.get_other_value(other)
+
+# # arithmetic
+# def __add__(self, other):
+# return self._op(other, operator.add)
+
+# def __radd__(self, other):
+# return self._rop(other, operator.add)
+
+# def __sub__(self, other):
+# return self._op(other, operator.sub)
+
+# def __rsub__(self, other):
+# return self._rop(other, operator.sub)
+
+# def __mul__(self, other):
+# return self._op(other, operator.mul)
+
+# def __rmul__(self, other):
+# return self._rop(other, operator.mul)
+
+# def __truediv__(self, other):
+# return self._op(other, operator.truediv)
+
+# def __rtruediv__(self, other):
+# return self._rop(other, operator.truediv)
+
+# def __floordiv__(self, other):
+# return self._op(other, operator.floordiv)
+
+# def __rfloordiv__(self, other):
+# return self._rop(other, operator.floordiv)
+
+# def __mod__(self, other):
+# return self._op(other, operator.mod)
+
+# def __rmod__(self, other):
+# return self._rop(other, operator.mod)
+
+# def __pow__(self, other):
+# return self._op(other, operator.pow)
+
+# def __rpow__(self, other):
+# return self._rop(other, operator.pow)
+
+# # numpy support
+# def __array__(self, dtype=float):
+# return np.asarray(self.value, dtype=dtype)
+
+# def __array_priority__(self):
+# return 1000
+
+# def link(self, other: Parameter):
+# """Use this to constrain two parmeters to be the same value
+# custom_parameter = Parameter(value=5.5, refine=True)
+# lattice.a.link(custom_parameter)
+# """
+# self.value = other.value
+# self.refine = other.refine
+# self.refinable = other.refinable
+# self.set_to = other.__name__
+
+
+# ParameterLike = int | float | Parameter
+# FloatParameterLike = float | Parameter
+# IntParameterLike = int | Parameter
+
+
+class ParameterArray(BaseModel):
+ """Parameter array should be use for things that contain an array of coeeficients
+ see: Chebychev background"""
+
+ parameter_array: list[Parameter]
+
+ @model_serializer(mode="plain")
+ def serialize(self):
+ if not self.parameter_array:
+ return {}
+
+ out = {
+ "value": [],
+ "refine": [],
+ "lower_bounds": [],
+ "upper_bounds": [],
+ }
+
+ for p in self.parameter_array:
+ out["value"].append(p.value)
+ out["refine"].append(p.refine)
+
+ lb, ub = p.bounds
+ out["lower_bounds"].append(lb)
+ out["upper_bounds"].append(ub)
+
+ return out
+
+ @model_validator(mode="before")
+ @classmethod
+ def deserialize(cls, data):
+ # already in internal format → do nothing
+ if "parameter_array" in data:
+ return data
+
+ # transposed format → rebuild
+ if "value" in data:
+ n = len(data["value"])
+
+ params = []
+ for i in range(n):
+ params.append(
+ Parameter(
+ value=data["value"][i],
+ refine=data.get("refine", [True] * n)[i],
+ bounds=[
+ data["lower_bounds"][i],
+ data["upper_bounds"][i],
+ ],
+ )
+ )
+
+ return {"parameter_array": params}
+
+ return data
+
+ def __getitem__(self, key: int | slice) -> Parameter | ParameterArray:
+ if isinstance(key, int):
+ return self.parameter_array[key]
+ elif isinstance(key, slice):
+ return ParameterArray(parameter_array=self.parameter_array[key])
+ else:
+ raise TypeError(f"Invalid key: {key}")
+
+ def __array__(self):
+ return np.array([f.value for f in self.parameter_array], dtype=float)
+
+ @classmethod
+ def from_array(cls, array: np.ndarray | list[float | int], refine: bool = True):
+ return cls(parameter_array=[Parameter(value=f, refine=refine) for f in array])
+
+
+class XRPDBaseModel(BaseModel):
+ """The XRPDBaseModel should be used for anything that you want to be able to easily
+ serialised/deserialise from file but wont be used for a refinement."""
+
+ model_config = ConfigDict(
+ from_attributes=True, arbitrary_types_allowed=True, validate_assignment=True
+ )
+
+ @classmethod
+ def load_from_toml(cls, filepath: str | Path):
+ with open(filepath, "rb") as file:
+ settings_dict = tomllib.load(file)
+
+ return cls.model_validate(settings_dict)
+
+ @classmethod
+ def load_from_yaml(cls, filepath: str | Path):
+ with open(filepath, "rb") as file:
+ settings_dict = yaml.safe_load(file)
+ return cls.model_validate(settings_dict)
+
+ @classmethod
+ def load_from_json(cls, filepath: str | Path):
+ with open(filepath, "rb") as file:
+ settings_dict = json.load(file)
+ return cls.model_validate(settings_dict)
+
+ @classmethod
+ def load(cls, filepath: str | Path):
+ file_extension = Path(filepath).suffix
+
+ if file_extension == ".json":
+ return cls.load_from_json(filepath)
+ elif file_extension == ".yaml":
+ return cls.load_from_yaml(filepath)
+ elif file_extension == ".toml":
+ return cls.load_from_toml(filepath)
+ else:
+ raise ValueError(f"Filetype must be: {SUPPORTED_FILE_TYPES}")
+
+ def save_to_toml(self, filepath: str | Path) -> None:
+ if not str(filepath).endswith(".toml"):
+ raise ValueError("file_path name must end with .toml")
+
+ print("Saving configuration to:", filepath)
+
+ config_dict = self.model_dump()
+
+ with open(filepath, "w") as outfile:
+ toml.dump(config_dict, outfile)
+
+ def save_to_json(self, filepath: str | Path) -> None:
+ if not str(filepath).endswith(".json"):
+ raise ValueError("file_path name must end with .json")
+
+ print("Saving configuration to:", filepath)
+
+ config_dict = self.model_dump()
+
+ with open(filepath, "w") as outfile:
+ json.dump(config_dict, outfile, indent=2, sort_keys=False)
+
+ def save_to_yaml(self, file_path: str | Path) -> None:
+ if not str(file_path).endswith(".yaml"):
+ raise ValueError("file_path name must end with .yaml")
+
+ print("Saving configuration to:", file_path)
+
+ config_dict = self.model_dump()
+
+ with open(file_path, "w") as outfile:
+ yaml.dump(
+ config_dict,
+ outfile,
+ default_flow_style=None,
+ sort_keys=False,
+ indent=2,
+ explicit_start=True,
+ )
+
+ def save(self, filepath: str | Path):
+ file_extension = Path(filepath).suffix
+
+ if file_extension == ".json":
+ return self.save_to_json(filepath)
+ elif file_extension == ".yaml":
+ return self.save_to_yaml(filepath)
+ elif file_extension == ".toml":
+ return self.save_to_toml(filepath)
+ else:
+ raise ValueError(f"Filetype must be: {SUPPORTED_FILE_TYPES}")
+
+ def __getitem__(self, name):
+ if name in type(self).model_fields:
+ value = getattr(self, name)
+ return value
+ else:
+ raise ValueError(f"{name} not in {self}")
+
+ def __setitem__(self, name, value):
+ setattr(self, name, value)
+
+
+class XYEData(XRPDBaseModel):
+ x: SerialisableNDArray = Field(repr=False)
+ y: SerialisableNDArray = Field(repr=False)
+ e: SerialisableNDArray | None = Field(default=None, repr=False)
+ x_unit: str = "index"
+ y_unit: str = "Intensity (Arb. Units)"
+ source: str | None = None # for tracking where the data came from
+
+ @model_validator(mode="after")
+ def validate_data(self):
+ assert len(self.x) == len(self.y)
+ if self.e is not None:
+ assert len(self.x) == len(self.e)
+
+ return self
+
+ @classmethod
+ def from_csv(cls, filepath: str | Path):
+ try:
+ x, y, e = np.genfromtxt(str(filepath), unpack=True, dtype=float)
+ except ValueError:
+ x, y = np.genfromtxt(str(filepath), unpack=True, dtype=float)
+ e = None
+
+ return cls(x=x, y=y, e=e, source=str(filepath))
+
+ def save_to_xye(self, filepath):
+ if self.e is None:
+ error = np.sqrt(self.y)
+ else:
+ error = self.e
+
+ xye_out_data = np.stack((self.x, self.y, error), axis=-1)
+
+ np.savetxt(filepath, xye_out_data, fmt="%.6f", delimiter=" ", newline="\n")
+
+
+# TODO: Decide whether better to put x_unit into XYEData, remove generic ModelDataVar
+# and then get data type from Radiation class -
+# but the type of radiation is inherently linked to data... so multi phase/radia stuff
+class ScatteringData(XYEData):
+ x_unit: XUnit = "tth" # type: ignore[override]
+ data_type: DataType = "xray"
+ wavelength: float | Parameter # for x-ray or CW neutron data
+
+ @model_validator(mode="after")
+ def validate_data_units(self):
+ if self.data_type == "xray":
+ assert self.x_unit != "tof", "x_unit cannot be 'tof' for xray data"
+
+ return self
+
+ def plot(self, show: bool = True):
+ plt.figure(figsize=(16, 10))
+ plt.errorbar(self.x, self.y, yerr=self.e, fmt="o", label="Data")
+ plt.xlabel(f"{self.x_unit}")
+ plt.ylabel("Intensity (a.u.)")
+ plt.title(f"Scattering Data ({self.data_type})")
+
+ if show:
+ plt.legend()
+ plt.show()
+
+ # If this doesn't accept the data format:
+ # I recommend using POWDLL to convert data to TOPAS style .xye format
+ @classmethod
+ def from_xye(
+ cls,
+ filepath: str | Path,
+ x_unit: XUnit,
+ data_type: DataType,
+ wavelength: float | Parameter,
+ ) -> ScatteringData:
+ """Loads scattering data from a CSV file. The file should have 3 (or 2) columns:
+ x, y and optionally e (error)
+ Equivalent the TOPAS xye format
+ """
+
+ if isinstance(wavelength, Parameter):
+ wavelength = wavelength
+ else:
+ wavelength = Parameter(value=wavelength, refine=False)
+
+ try:
+ x, y, e = np.genfromtxt(str(filepath), unpack=True, dtype=float)
+ except ValueError:
+ x, y = np.genfromtxt(str(filepath), unpack=True, dtype=float)
+ e = None
+
+ return cls(
+ x=x,
+ y=y,
+ e=e,
+ x_unit=x_unit,
+ data_type=data_type,
+ wavelength=wavelength,
+ source=str(filepath),
+ )
+
+ @classmethod
+ def from_fullprof(
+ cls,
+ filepath: str | Path,
+ x_unit: XUnit,
+ data_type: DataType,
+ wavelength: float | Parameter,
+ ) -> ScatteringData:
+ """Loads scattering data from a .xy or .dat file.
+ The file should have 3 columns x, y and error
+ Equivalent the fullprof INSTRM=10 format
+ """
+
+ if isinstance(wavelength, Parameter):
+ wavelength = wavelength
+ else:
+ wavelength = Parameter(value=wavelength, refine=False)
+ x, y, e = np.genfromtxt(
+ str(filepath),
+ skip_header=1,
+ comments="!",
+ unpack=True,
+ dtype=float,
+ )
+
+ return cls(
+ x=x,
+ y=y,
+ e=e,
+ x_unit=x_unit,
+ data_type=data_type,
+ wavelength=wavelength,
+ source=str(filepath),
+ )
+
+
+def check_parameters(maybe_parameters: Collection[Any]):
+ for maybe_parameter in maybe_parameters:
+ if not isinstance(maybe_parameter, Parameter):
+ raise ValueError(f"{maybe_parameter} is not a Parameter")
+
+
+if __name__ == "__main__":
+ import numpy as np
+
+ a = Parameter(value=3, refine=True)
+
+ print(a)
+
+ x = 1.0 + Parameter(value=3)
+
+ print(x)
diff --git a/src/xrpd_toolbox/data_loader.py b/src/xrpd_toolbox/data_loader.py
new file mode 100644
index 0000000..4d20184
--- /dev/null
+++ b/src/xrpd_toolbox/data_loader.py
@@ -0,0 +1,92 @@
+from functools import cached_property
+from pathlib import Path
+
+import numpy as np
+from h5py import Dataset, File
+
+from xrpd_toolbox.utils.utils import get_entry, h5_to_array
+
+
+def get_dataset(filepath, dataset_path: str) -> Dataset:
+ with File(filepath, "r") as file:
+ if dataset_path not in file:
+ raise ValueError(f"Dataset path {dataset_path} not found in {filepath}")
+
+ data = file.get(dataset_path)
+
+ if not isinstance(data, Dataset):
+ raise ValueError(f"{dataset_path} is not a dataset")
+
+ return data
+
+
+class BaseDataLoader:
+ """
+ Base class for detector data loaders.
+ Handles Nexus/HDF5 access and metadata retrieval.
+ """
+
+ def __init__(self, filepath: str | Path, data_path: str):
+ self.filepath = Path(filepath)
+ self.data_path = data_path
+
+ self.entry = get_entry(self.filepath)
+ self.dataset_path = f"/{self.entry}/{self.data_path}/data"
+
+ def get_entries(self):
+ paths = []
+
+ with File(self.filepath, "r") as file:
+ file.visit(paths.append)
+
+ return paths
+
+ def get_data(self, dataset_path: str | None = None, selection=...) -> np.ndarray:
+ dataset_path = dataset_path or self.dataset_path
+
+ with File(self.filepath, "r") as file:
+ if dataset_path not in file:
+ raise ValueError(
+ f"Dataset path {dataset_path} not found in {self.filepath}"
+ )
+
+ data = file.get(dataset_path)
+
+ if data is None or not isinstance(data, Dataset):
+ raise ValueError(f"Data at {dataset_path} in {self.filepath} is None.")
+
+ if data.ndim < 1:
+ raise ValueError("Data has insufficient dimensions.")
+
+ return np.asarray(data[selection])
+
+ def sum_frames(self):
+ data = get_dataset(filepath=self.filepath, dataset_path=self.dataset_path)
+
+ n_frames = data.shape[1]
+
+ summed_images = []
+
+ for frame in range(n_frames):
+ frame_image = data[:, frame, :, :]
+ image_sum = np.sum(frame_image)
+
+ summed_images.append(image_sum)
+
+ summed_images = np.array(summed_images)
+
+ return summed_images
+
+ @property
+ def data(self) -> np.ndarray:
+ """Load the entire dataset."""
+ return self.get_data()
+
+ @cached_property
+ def durations(self) -> np.ndarray:
+ path = f"/{self.entry}/instrument/{self.data_path}/count_time"
+ return h5_to_array(self.filepath, path)
+
+ def read_array(self, path: str) -> np.ndarray:
+ """Helper for reading arbitrary datasets."""
+ return h5_to_array(self.filepath, path)
diff --git a/src/xrpd_toolbox/i15-1/__init__.py b/src/xrpd_toolbox/fit_engine/__init__.py
similarity index 100%
rename from src/xrpd_toolbox/i15-1/__init__.py
rename to src/xrpd_toolbox/fit_engine/__init__.py
diff --git a/src/xrpd_toolbox/fit_engine/atom.py b/src/xrpd_toolbox/fit_engine/atom.py
new file mode 100644
index 0000000..42caa5f
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/atom.py
@@ -0,0 +1,74 @@
+import numpy as np
+
+from xrpd_toolbox.core import SerialisableNDArray, XRPDBaseModel
+
+
+class Atom(XRPDBaseModel):
+ """This describes an atom"""
+
+ label: str # elemnt label ie Si1 Si2
+ element: str # element name eg Si
+ xyz: SerialisableNDArray # fractional coorindates of xyz #type: ignore
+ b_iso: float
+ occupancy: float = 1.0
+
+ @property
+ def x(self) -> float:
+ return float(self.xyz[0])
+
+ @property
+ def y(self) -> float:
+ return float(self.xyz[1])
+
+ @property
+ def z(self) -> float:
+ return float(self.xyz[2])
+
+
+class Atoms(XRPDBaseModel):
+ """This is the array version of atoms"""
+
+ labels: SerialisableNDArray # element label ie Si1 Si2
+ elements: SerialisableNDArray # element name eg Si
+ xyz: SerialisableNDArray # fractional coordinates of xyz
+ b_iso: SerialisableNDArray
+ occupancies: SerialisableNDArray
+
+ def __getitem__(self, label_or_index: str | int) -> Atom:
+ if isinstance(label_or_index, int):
+ index = label_or_index
+ elif isinstance(label_or_index, str):
+ index = np.where(self.labels == label_or_index)[0][0]
+ else:
+ raise ValueError("label_or_index must be a string or an integer")
+
+ label = self.labels[index]
+ element = self.elements[index]
+ xyz = self.xyz[index]
+ b_iso = self.b_iso[index]
+ occupancy = self.occupancies[index]
+
+ return Atom(
+ label=label,
+ element=element,
+ xyz=xyz,
+ b_iso=b_iso,
+ occupancy=occupancy,
+ )
+
+
+if __name__ == "__main__":
+ # Example usage
+ atom = Atom(
+ label="Si1",
+ element="Si",
+ xyz=np.array([0.0, 0.0, 0.0]),
+ b_iso=1.0,
+ occupancy=1.0,
+ )
+
+ atoms = [atom, atom]
+
+ positions = np.stack([a.xyz for a in atoms])
+
+ print(positions)
diff --git a/src/xrpd_toolbox/fit_engine/background.py b/src/xrpd_toolbox/fit_engine/background.py
new file mode 100644
index 0000000..edb6a7a
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/background.py
@@ -0,0 +1,257 @@
+from __future__ import annotations
+
+from typing import Annotated, Literal
+
+import numpy as np
+from pydantic import Field
+
+from xrpd_toolbox.core import (
+ Parameter,
+ ParameterArray,
+ SerialisableNDArray,
+)
+from xrpd_toolbox.fit_engine.fitting_core import RefinementBaseModel
+
+
+# TODO: Should we store x here too?; If so store it as private
+class Background(RefinementBaseModel):
+ """This describes the background of a profile"""
+
+ # _x: np.ndarray
+
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ """Evaluate the background at the given x values"""
+ raise NotImplementedError(
+ "Must implement calculate method in Background subclass"
+ )
+
+ @classmethod
+ def estimate(
+ cls,
+ x: np.ndarray,
+ y: np.ndarray,
+ **kwargs,
+ ) -> Background:
+ """Estimate the background from a profile by taking the minimum value of y"""
+ raise NotImplementedError(
+ "Must implement estimate method in Background subclass"
+ )
+
+ def __call__(self, x: np.ndarray) -> np.ndarray:
+ return self.calculate(x)
+
+
+class ConstantBackground(Background):
+ """This describes a constant background"""
+
+ background_type: Literal["ConstantBackground"] = "ConstantBackground"
+ value: float | Parameter = Parameter(value=0)
+
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ return np.full_like(x, self.value)
+
+ @classmethod
+ def estimate(
+ cls,
+ x: np.ndarray,
+ y: np.ndarray,
+ **kwargs,
+ ) -> ConstantBackground:
+ """Estimate the background from a profile by taking the minimum value of y"""
+ value = np.min(y)
+ return cls(value=Parameter(value=value))
+
+ def __float__(self):
+ return float(self.value)
+
+
+class LinearBackground(Background):
+ background_type: Literal["LinearBackground"] = "LinearBackground"
+
+ slope: float | Parameter = Parameter(value=0)
+ intercept: float | Parameter = Parameter(value=0)
+
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ return float(self.slope) * x + float(self.intercept)
+
+ @classmethod
+ def estimate(
+ cls,
+ x: np.ndarray,
+ y: np.ndarray,
+ **kwargs,
+ ) -> LinearBackground:
+ min_x = np.min(x)
+ max_x = np.max(x)
+
+ min_y = np.min(y[x == min_x])
+ max_y = np.min(y[x == max_x])
+
+ slope = (max_y - min_y) / (max_x - min_x)
+ intercept = min_y - slope * min_x
+
+ return cls(slope=Parameter(value=slope), intercept=Parameter(value=intercept))
+
+
+class ChebyshevBackground(Background):
+ background_type: Literal["ChebyshevBackground"] = "ChebyshevBackground"
+
+ """This describes a Chebyshev polynomial background - GSAS style"""
+
+ coefficients: (
+ SerialisableNDArray | ParameterArray
+ ) # coefficients of the Chebyshev polynomial
+
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ return np.polynomial.chebyshev.chebval(x, self.coefficients)
+
+ def add_coefficient(self, new_value: int | float = 0):
+ self.coefficients = np.append(self.coefficients, new_value)
+
+ def remove_coefficient(self):
+ self.coefficients = self.coefficients[0:-1] # type: ignore - mypy is just being stupid here
+
+ @classmethod
+ def estimate(
+ cls,
+ x: np.ndarray,
+ y: np.ndarray,
+ degree: int = 8,
+ mask: bool = True,
+ mask_step: int = 50,
+ **kwargs,
+ ) -> ChebyshevBackground:
+ # this is a very simple estimation method that fits
+ # a Chebyshev polynomial to the data
+
+ # select points evenly across the x range to fit the background
+ # - prevents peaks dominating the fit
+
+ if mask:
+ selections_mask = np.arange(
+ 0, len(x), len(x) // mask_step
+ ) # select every mask_step points (20 by default)
+
+ x_selected = x[selections_mask]
+ y_selected = y[selections_mask]
+
+ else:
+ x_selected = x
+ y_selected = y
+
+ coefficients = np.polynomial.chebyshev.chebfit(
+ x_selected, y_selected, deg=degree
+ )
+ return cls(coefficients=coefficients)
+
+
+class LinearInterpolationBackground(Background):
+ """This is a FullProfs style linear interpolation background
+ - also FullProfs default"""
+
+ background_type: Literal["LinearInterpolationBackground"] = (
+ "LinearInterpolationBackground"
+ )
+
+ x_sample: SerialisableNDArray = Field(repr=False)
+ y_sample: SerialisableNDArray | list[Parameter] | ParameterArray = Field(repr=False)
+
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ return np.interp(x, self.x_sample, self.y_sample)
+
+ @classmethod
+ def estimate(
+ cls,
+ x: np.ndarray,
+ y: np.ndarray,
+ points: int = 20,
+ **kwargs,
+ ) -> LinearInterpolationBackground:
+ """simple estimate that takes a number of points equal to points,
+ spaced evenly across x"""
+
+ # gradient = np.gradient(y, x)
+ # plt.plot(x, gradient)
+ # plt.show()
+
+ indices = np.arange(
+ 0, len(x), len(x) // points
+ ) # select every mask_step points (20 by default)
+
+ x_sample = x[indices]
+ y_sample = y[indices]
+
+ y_sample_parameter = ParameterArray.from_array(y_sample, **kwargs)
+
+ return cls(x_sample=x_sample, y_sample=y_sample_parameter)
+
+
+class SplitBackground(Background):
+ """This background is basically two linear backgrounds,
+ that are split at some point. Before that point is use one background
+ and after that point it uses another"""
+
+ background_type: Literal["SplitBackground"] = "SplitBackground"
+ split_index: int
+ value1: float | Parameter
+ value2: float | Parameter
+
+ @classmethod
+ def estimate(
+ cls,
+ x: np.ndarray,
+ y: np.ndarray,
+ rtol: float = 0.1,
+ **kwargs,
+ ) -> SplitBackground:
+ y_min = float(np.min(y))
+ threshold = 2.0 * np.abs(y_min)
+
+ mask1 = np.isclose(y, y_min, rtol=rtol)
+ idx1 = np.flatnonzero(mask1)
+
+ if idx1.size == 0:
+ # fallback: nearest to min
+ idx1 = np.argsort(np.abs(y - y_min))[:10]
+
+ split_index = int(np.max(idx1)) + 1
+
+ value1 = float(np.mean(y[idx1]))
+
+ valid = y >= threshold
+
+ if np.any(valid):
+ candidates = y[valid]
+ min2 = float(np.min(candidates))
+
+ mask2 = np.isclose(y, min2, rtol=rtol)
+ idx2 = np.flatnonzero(mask2)
+
+ if idx2.size == 0:
+ idx2 = np.argsort(np.abs(y - min2))[:10]
+
+ value2 = float(np.mean(y[idx2]))
+ else:
+ # fallback: no values above threshold
+ value2 = value1
+
+ value1 = Parameter(value=value1)
+ value2 = Parameter(value=value2)
+
+ return cls(split_index=split_index, value1=value1, value2=value2)
+
+ def calculate(self, x: np.ndarray):
+ bg = np.empty_like(x, dtype=float)
+ bg[: self.split_index] = float(self.value1)
+ bg[self.split_index :] = float(self.value2)
+ return bg
+
+
+BackgroundType = Annotated[
+ ConstantBackground
+ | LinearBackground
+ | LinearInterpolationBackground
+ | ChebyshevBackground
+ | SplitBackground,
+ Field(discriminator="background_type"),
+]
diff --git a/src/xrpd_toolbox/fit_engine/constants.py b/src/xrpd_toolbox/fit_engine/constants.py
new file mode 100644
index 0000000..190563f
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/constants.py
@@ -0,0 +1,371 @@
+SPACEGROUP_NUMBER = {
+ "P1": 1,
+ "P-1": 2,
+ "P2": 3,
+ "P21": 4,
+ "C2": 5,
+ "Pm": 6,
+ "Pc": 7,
+ "Cm": 8,
+ "Cc": 9,
+ "P2/m": 10,
+ "P21/m": 11,
+ "C2/m": 12,
+ "P2/c": 13,
+ "P21/c": 14,
+ "C2/c": 15,
+ "P222": 16,
+ "P2221": 17,
+ "P21212": 18,
+ "P212121": 19,
+ "C2221": 20,
+ "C222": 21,
+ "F222": 22,
+ "I222": 23,
+ "I212121": 24,
+ "Pmm2": 25,
+ "Pmc21": 26,
+ "Pcc2": 27,
+ "Pma2": 28,
+ "Pca21": 29,
+ "Pnc2": 30,
+ "Pmn21": 31,
+ "Pba2": 32,
+ "Pna21": 33,
+ "Pnn2": 34,
+ "Cmm2": 35,
+ "Cmc21": 36,
+ "Ccc2": 37,
+ "Amm2": 38,
+ "Abm2": 39,
+ "Ama2": 40,
+ "Aba2": 41,
+ "Fmm2": 42,
+ "Fdd2": 43,
+ "Imm2": 44,
+ "Iba2": 45,
+ "Ima2": 46,
+ "Pmmm": 47,
+ "Pnnn": 48,
+ "Pccm": 49,
+ "Pban": 50,
+ "Pmma": 51,
+ "Pnna": 52,
+ "Pmna": 53,
+ "Pcca": 54,
+ "Pbam": 55,
+ "Pccn": 56,
+ "Pbcm": 57,
+ "Pnnm": 58,
+ "Pmmn": 59,
+ "Pbcn": 60,
+ "Pbca": 61,
+ "Pnma": 62,
+ "Cmcm": 63,
+ "Cmce": 64,
+ "Cmmm": 65,
+ "Cccm": 66,
+ "Cmme": 67,
+ "Ccce": 68,
+ "Fmmm": 69,
+ "Fddd": 70,
+ "Immm": 71,
+ "Ibam": 72,
+ "Ibca": 73,
+ "Imma": 74,
+ "P4": 75,
+ "P41": 76,
+ "P42": 77,
+ "P43": 78,
+ "I4": 79,
+ "I41": 80,
+ "P-4": 81,
+ "I-4": 82,
+ "P4/m": 83,
+ "P42/m": 84,
+ "P4/n": 85,
+ "P42/n": 86,
+ "I4/m": 87,
+ "I41/a": 88,
+ "P422": 89,
+ "P4212": 90,
+ "P4122": 91,
+ "P41212": 92,
+ "P4222": 93,
+ "P42212": 94,
+ "P4322": 95,
+ "P43212": 96,
+ "I422": 97,
+ "I4122": 98,
+ "P4mm": 99,
+ "P4bm": 100,
+ "P42cm": 101,
+ "P42nm": 102,
+ "P4cc": 103,
+ "P4nc": 104,
+ "P42mc": 105,
+ "P42bc": 106,
+ "I4mm": 107,
+ "I4cm": 108,
+ "I41md": 109,
+ "I41cd": 110,
+ "P-42m": 111,
+ "P-42c": 112,
+ "P-421m": 113,
+ "P-421c": 114,
+ "P-4m2": 115,
+ "P-4c2": 116,
+ "P-4b2": 117,
+ "P-4n2": 118,
+ "I-4m2": 119,
+ "I-4c2": 120,
+ "I-42m": 121,
+ "I-42d": 122,
+ "P4/mmm": 123,
+ "P4/mcc": 124,
+ "P4/nbm": 125,
+ "P4/nnc": 126,
+ "P4/mbm": 127,
+ "P4/mnc": 128,
+ "P4/nmm": 129,
+ "P4/ncc": 130,
+ "P42/mmc": 131,
+ "P42/mcm": 132,
+ "P42/nbc": 133,
+ "P42/nnm": 134,
+ "P42/mbc": 135,
+ "P42/mnm": 136,
+ "P42/nmc": 137,
+ "P42/ncm": 138,
+ "I4/mmm": 139,
+ "I4/mcm": 140,
+ "I41/amd": 141,
+ "I41/acd": 142,
+ "P3": 143,
+ "P31": 144,
+ "P32": 145,
+ "R3": 146,
+ "P-3": 147,
+ "R-3": 148,
+ "P312": 149,
+ "P321": 150,
+ "P3112": 151,
+ "P3121": 152,
+ "P3212": 153,
+ "P3221": 154,
+ "R32": 155,
+ "P3m1": 156,
+ "P31m": 157,
+ "P3c1": 158,
+ "P31c": 159,
+ "R3m": 160,
+ "R3c": 161,
+ "P-31m": 162,
+ "P-31c": 163,
+ "P-3m1": 164,
+ "P-3c1": 165,
+ "R-3m": 166,
+ "R-3c": 167,
+ "P6": 168,
+ "P61": 169,
+ "P6_5": 170,
+ "P62": 171,
+ "P64": 172,
+ "P63": 173,
+ "P-6": 174,
+ "P6/m": 175,
+ "P63/m": 176,
+ "P622": 177,
+ "P6122": 178,
+ "P6_522": 179,
+ "P6222": 180,
+ "P6422": 181,
+ "P6322": 182,
+ "P6mm": 183,
+ "P6cc": 184,
+ "P63cm": 185,
+ "P63mc": 186,
+ "P-6m2": 187,
+ "P-6c2": 188,
+ "P-62m": 189,
+ "P-62c": 190,
+ "P6/mmm": 191,
+ "P6/mcc": 192,
+ "P63/mcm": 193,
+ "P63/mmc": 194,
+ "P23": 195,
+ "F23": 196,
+ "I23": 197,
+ "P213": 198,
+ "I213": 199,
+ "Pm-3": 200,
+ "Pn-3": 201,
+ "Fm-3": 202,
+ "Fd-3": 203,
+ "Im-3": 204,
+ "Pa-3": 205,
+ "Ia-3": 206,
+ "P432": 207,
+ "P4232": 208,
+ "F432": 209,
+ "F4132": 210,
+ "I432": 211,
+ "P4332": 212,
+ "P4132": 213,
+ "I4132": 214,
+ "P-43m": 215,
+ "F-43m": 216,
+ "I-43m": 217,
+ "P-43n": 218,
+ "F-43c": 219,
+ "I-43d": 220,
+ "Pm-3m": 221,
+ "Pn-3n": 222,
+ "Pm-3n": 223,
+ "Pn-3m": 224,
+ "Fm-3m": 225,
+ "Fm-3c": 226,
+ "Fd-3m": 227,
+ "Fd-3c": 228,
+ "Im-3m": 229,
+ "Ia-3d": 230,
+}
+
+
+ELEMENT_ATOMIC_NUMBER = {
+ "H": 1,
+ "He": 2,
+ "Li": 3,
+ "Be": 4,
+ "B": 5,
+ "C": 6,
+ "N": 7,
+ "O": 8,
+ "F": 9,
+ "Ne": 10,
+ "Na": 11,
+ "Mg": 12,
+ "Al": 13,
+ "Si": 14,
+ "P": 15,
+ "S": 16,
+ "Cl": 17,
+ "Ar": 18,
+ "K": 19,
+ "Ca": 20,
+ "Sc": 21,
+ "Ti": 22,
+ "V": 23,
+ "Cr": 24,
+ "Mn": 25,
+ "Fe": 26,
+ "Co": 27,
+ "Ni": 28,
+ "Cu": 29,
+ "Zn": 30,
+ "Ga": 31,
+ "Ge": 32,
+ "As": 33,
+ "Se": 34,
+ "Br": 35,
+ "Kr": 36,
+ "Rb": 37,
+ "Sr": 38,
+ "Y": 39,
+ "Zr": 40,
+ "Nb": 41,
+ "Mo": 42,
+ "Tc": 43,
+ "Ru": 44,
+ "Rh": 45,
+ "Pd": 46,
+ "Ag": 47,
+ "Cd": 48,
+ "In": 49,
+ "Sn": 50,
+ "Sb": 51,
+ "Te": 52,
+ "I": 53,
+ "Xe": 54,
+ "Cs": 55,
+ "Ba": 56,
+ "La": 57,
+ "Ce": 58,
+ "Pr": 59,
+ "Nd": 60,
+ "Pm": 61,
+ "Sm": 62,
+ "Eu": 63,
+ "Gd": 64,
+ "Tb": 65,
+ "Dy": 66,
+ "Ho": 67,
+ "Er": 68,
+ "Tm": 69,
+ "Yb": 70,
+ "Lu": 71,
+ "Hf": 72,
+ "Ta": 73,
+ "W": 74,
+ "Re": 75,
+ "Os": 76,
+ "Ir": 77,
+ "Pt": 78,
+ "Au": 79,
+ "Hg": 80,
+ "Tl": 81,
+ "Pb": 82,
+ "Bi": 83,
+ "Po": 84,
+ "At": 85,
+ "Rn": 86,
+ "Fr": 87,
+ "Ra": 88,
+ "Ac": 89,
+ "Th": 90,
+ "Pa": 91,
+ "U": 92,
+ "Np": 93,
+ "Pu": 94,
+ "Am": 95,
+ "Cm": 96,
+ "Bk": 97,
+ "Cf": 98,
+ "Es": 99,
+ "Fm": 100,
+ "Md": 101,
+ "No": 102,
+ "Lr": 103,
+ "Rf": 104,
+ "Db": 105,
+ "Sg": 106,
+ "Bh": 107,
+ "Hs": 108,
+ "Mt": 109,
+ "Ds": 110,
+ "Rg": 111,
+ "Cn": 112,
+ "Nh": 113,
+ "Fl": 114,
+ "Mc": 115,
+ "Lv": 116,
+ "Ts": 117,
+ "Og": 118,
+}
+
+
+NUMBER_OF_SPACEGROUP = dict(
+ zip(SPACEGROUP_NUMBER.values(), SPACEGROUP_NUMBER.keys(), strict=True)
+)
+
+
+def get_element_number(element: str) -> int:
+ return ELEMENT_ATOMIC_NUMBER[element]
+
+
+def get_spacegroup_number(spacegroup: str) -> int:
+ return SPACEGROUP_NUMBER[spacegroup]
+
+
+def get_spacegroup_symbol(spacegroup_number: int) -> str:
+ return NUMBER_OF_SPACEGROUP[spacegroup_number]
diff --git a/src/xrpd_toolbox/fit_engine/constants/atom_form_factors.csv b/src/xrpd_toolbox/fit_engine/constants/atom_form_factors.csv
new file mode 100644
index 0000000..db3807a
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/constants/atom_form_factors.csv
@@ -0,0 +1,212 @@
+Element a1 b1 a2 b2 a3 b3 a4 b4 c
+H 0.489918 20.6593 0.262003 7.74039 0.196767 49.5519 0.049879 2.20159 0.001305
+H1- 0.897661 53.1368 0.565616 15.187 0.415815 186.576 0.116973 3.56709 0.002389
+He 0.8734 9.1037 0.6309 3.3568 0.3112 22.9276 0.178 0.9821 0.0064
+Li 1.1282 3.9546 0.7508 1.0524 0.6175 85.3905 0.4653 168.261 0.0377
+Li1+ 0.6968 4.6237 0.7888 1.9557 0.3414 0.6316 0.1563 10.0953 0.0167
+Be 1.5919 43.6427 1.1278 1.8623 0.5391 103.483 0.7029 0.542 0.0385
+Be2+ 6.2603 0.0027 0.8849 0.8313 0.7993 2.2758 0.1647 5.1146 -6.1092
+B 2.0545 23.2185 1.3326 1.021 1.0979 60.3498 0.7068 0.1403 -0.1932
+C 2.31 20.8439 1.02 10.2075 1.5886 0.5687 0.865 51.6512 0.2156
+Cval 2.26069 22.6907 1.56165 0.656665 1.05075 9.75618 0.839259 55.5949 0.286977
+N 12.2126 0.0057 3.1322 9.8933 2.0125 28.9975 1.1663 0.5826 -11.529
+O 3.0485 13.2771 2.2868 5.7011 1.5463 0.3239 0.867 32.9089 0.2508
+O1- 4.1916 12.8573 1.63969 4.17236 1.52673 47.0179 -20.307 -0.01404 21.9412
+F 3.5392 10.2825 2.6412 4.2944 1.517 0.2615 1.0243 26.1476 0.2776
+F1- 3.6322 5.27756 3.51057 14.7353 1.26064 0.442258 0.940706 47.3437 0.653396
+Ne 3.9553 8.4042 3.1125 3.4262 1.4546 0.2306 1.1251 21.7184 0.3515
+Na 4.7626 3.285 3.1736 8.8422 1.2674 0.3136 1.1128 129.424 0.676
+Na1+ 3.2565 2.6671 3.9362 6.1153 1.3998 0.2001 1.0032 14.039 0.404
+Mg 5.4204 2.8275 2.1735 79.2611 1.2269 0.3808 2.3073 7.1937 0.8584
+Mg2+ 3.4988 2.1676 3.8378 4.7542 1.3284 0.185 0.8497 10.1411 0.4853
+Al 6.4202 3.0387 1.9002 0.7426 1.5936 31.5472 1.9646 85.0886 1.1151
+Al3+ 4.17448 1.93816 3.3876 4.14553 1.20296 0.228753 0.528137 8.28524 0.706786
+Siv 6.2915 2.4386 3.0353 32.3337 1.9891 0.6785 1.541 81.6937 1.1407
+Sival 5.66269 2.6652 3.07164 38.6634 2.62446 0.916946 1.3932 93.5458 1.24707
+Si4+ 4.43918 1.64167 3.20345 3.43757 1.19453 0.2149 0.41653 6.65365 0.746297
+P 6.4345 1.9067 4.1791 27.157 1.78 0.526 1.4908 68.1645 1.1149
+S 6.9053 1.4679 5.2034 22.2151 1.4379 0.2536 1.5863 56.172 0.8669
+Cl 11.4604 0.0104 7.1964 1.1662 6.2556 18.5194 1.6455 47.7784 -9.5574
+Cl1- 18.2915 0.0066 7.2084 1.1717 6.5337 19.5424 2.3386 60.4486 -16.378
+Ar 7.4845 0.9072 6.7723 14.8407 0.6539 43.8983 1.6442 33.3929 1.4445
+K 8.2186 12.7949 7.4398 0.7748 1.0519 213.187 0.8659 41.6841 1.4228
+K1+ 7.9578 12.6331 7.4917 0.7674 6.359 -0.002 1.1915 31.9128 -4.9978
+Ca 8.6266 10.4421 7.3873 0.6599 1.5899 85.7484 1.0211 178.437 1.3751
+Ca2+ 15.6348 -0.0074 7.9518 0.6089 8.4372 10.3116 0.8537 25.9905 -14.875
+Sc 9.189 9.0213 7.3679 0.5729 1.6409 136.108 1.468 51.3531 1.3329
+Sc3+ 13.4008 0.29854 8.0273 7.9629 1.65943 -0.28604 1.57936 16.0662 -6.6667
+Ti 9.7595 7.8508 7.3558 0.5 1.6991 35.6338 1.9021 116.105 1.2807
+Ti2+ 9.11423 7.5243 7.62174 0.457585 2.2793 19.5361 0.087899 61.6558 0.897155
+Ti3+ 17.7344 0.22061 8.73816 7.04716 5.25691 -0.15762 1.92134 15.9768 -14.652
+Ti4+ 19.5114 0.178847 8.23473 6.67018 2.01341 -0.29263 1.5208 12.9464 -13.28
+V 10.2971 6.8657 7.3511 0.4385 2.0703 26.8938 2.0571 102.478 1.2199
+V2+ 10.106 6.8818 7.3541 0.4409 2.2884 20.3004 0.0223 115.122 1.2298
+V3+ 9.43141 6.39535 7.7419 0.383349 2.15343 15.1908 0.016865 63.969 0.656565
+V5+ 15.6887 0.679003 8.14208 5.40135 2.03081 9.97278 -9.576 0.940464 1.7143
+Cr 10.6406 6.1038 7.3537 0.392 3.324 20.2626 1.4922 98.7399 1.1832
+Cr2+ 9.54034 5.66078 7.7509 0.344261 3.58274 13.3075 0.509107 32.4224 0.616898
+Cr3+ 9.6809 5.59463 7.81136 0.334393 2.87603 12.8288 0.113575 32.8761 0.518275
+Mn 11.2819 5.3409 7.3573 0.3432 3.0193 17.8674 2.2441 83.7543 1.0896
+Mn2+ 10.8061 5.2796 7.362 0.3435 3.5268 14.343 0.2184 41.3235 1.0874
+Mn3+ 9.84521 4.91797 7.87194 0.294393 3.56531 10.8171 0.323613 24.1281 0.393974
+Mn4+ 9.96253 4.8485 7.97057 0.283303 2.76067 10.4852 0.054447 27.573 0.251877
+Fe 11.7695 4.7611 7.3573 0.3072 3.5222 15.3535 2.3045 76.8805 1.0369
+Fe2+ 11.0424 4.6538 7.374 0.3053 4.1346 12.0546 0.4399 31.2809 1.0097
+Fe3+ 11.1764 4.6147 7.3863 0.3005 3.3948 11.6729 0.0724 38.5566 0.9707
+Co 12.2841 4.2791 7.3409 0.2784 4.0034 13.5359 2.3488 71.1692 1.0118
+Co2+ 11.2296 4.1231 7.3883 0.2726 4.7393 10.2443 0.7108 25.6466 0.9324
+Co3+ 10.338 3.90969 7.88173 0.238668 4.76795 8.35583 0.725591 18.3491 0.286667
+Ni 12.8376 3.8785 7.292 0.2565 4.4438 12.1763 2.38 66.3421 1.0341
+Ni2+ 11.4166 3.6766 7.4005 0.2449 5.3442 8.873 0.9773 22.1626 0.8614
+Ni3+ 10.7806 3.5477 7.75868 0.22314 5.22746 7.64468 0.847114 16.9673 0.386044
+Cu 13.338 3.5828 7.1676 0.247 5.6158 11.3966 1.6735 64.8126 1.191
+Cu1+ 11.9475 3.3669 7.3573 0.2274 6.2455 8.6625 1.5578 25.8487 0.89
+Cu2+ 11.8168 3.37484 7.11181 0.244078 5.78135 7.9876 1.14523 19.897 1.14431
+Zn 14.0743 3.2655 7.0318 0.2333 5.1652 10.3163 2.41 58.7097 1.3041
+Zn2+ 11.9719 2.9946 7.3862 0.2031 6.4668 7.0826 1.394 18.0995 0.7807
+Ga 15.2354 3.0669 6.7006 0.2412 4.3591 10.7805 2.9623 61.4135 1.7189
+Ga3+ 12.692 2.81262 6.69883 0.22789 6.06692 6.36441 1.0066 14.4122 1.53545
+Ge 16.0816 2.8509 6.3747 0.2516 3.7068 11.4468 3.683 54.7625 2.1313
+Ge4+ 12.9172 2.53718 6.70003 0.205855 6.06791 5.47913 0.859041 11.603 1.45572
+As 16.6723 2.6345 6.0701 0.2647 3.4313 12.9479 4.2779 47.7972 2.531
+Se 17.0006 2.4098 5.8196 0.2726 3.9731 15.2372 4.3543 43.8163 2.8409
+Br 17.1789 2.1723 5.2358 16.5796 5.6377 0.2609 3.9851 41.4328 2.9557
+Br1- 17.1718 2.2059 6.3338 19.3345 5.5754 0.2871 3.7272 58.1535 3.1776
+Kr 17.3555 1.9384 6.7286 16.5623 5.5493 0.2261 3.5375 39.3972 2.825
+Rb 17.1784 1.7888 9.6435 17.3151 5.1399 0.2748 1.5292 164.934 3.4873
+Rb1+ 17.5816 1.7139 7.6598 14.7957 5.8981 0.1603 2.7817 31.2087 2.0782
+Sr 17.5663 1.5564 9.8184 14.0988 5.422 0.1664 2.6694 132.376 2.5064
+Sr2+ 18.0874 1.4907 8.1373 12.6963 2.5654 24.5651 -34.193 -0.0138 41.4025
+Y 17.776 1.4029 10.2946 12.8006 5.72629 0.125599 3.26588 104.354 1.91213
+Y3+ 17.9268 1.35417 9.1531 11.2145 1.76795 22.6599 -33.108 -0.01319 40.2602
+Zr 17.8765 1.27618 10.948 11.916 5.41732 0.117622 3.65721 87.6627 2.06929
+Zr4+ 18.1668 1.2148 10.0562 10.1483 1.01118 21.6054 -2.6479 -0.10276 9.41454
+Nb 17.6142 1.18865 12.0144 11.766 4.04183 0.204785 3.53346 69.7957 3.75591
+Nb3+ 19.8812 0.019175 18.0653 1.13305 11.0177 10.1621 1.94715 28.3389 -12.912
+Nb5+ 17.9163 1.12446 13.3417 0.028781 10.799 9.28206 0.337905 25.7228 -6.3934
+Mo 3.7025 0.2772 17.2356 1.0958 12.8876 11.004 3.7429 61.6584 4.3875
+Mo3+ 21.1664 0.014734 18.2017 1.03031 11.7423 9.53659 2.30951 26.6307 -14.421
+Mo5+ 21.0149 0.014345 18.0992 1.02238 11.4632 8.78809 0.740625 23.3452 -14.316
+Mo6+ 17.8871 1.03649 11.175 8.48061 6.57891 0.058881 0 0 0.344941
+Tc 19.1301 0.864132 11.0948 8.14487 4.64901 21.5707 2.71263 86.8472 5.40428
+Ru 19.2674 0.80852 12.9182 8.43467 4.86337 24.7997 1.56756 94.2928 5.37874
+Ru3+ 18.5638 0.847329 13.2885 8.37164 9.32602 0.017662 3.00964 22.887 -3.1892
+Ru4+ 18.5003 0.844582 13.1787 8.12534 4.71304 0.36495 2.18535 20.8504 1.42357
+Rh 19.2957 0.751536 14.3501 8.21758 4.73425 25.8749 1.28918 98.6062 5.328
+Rh3+ 18.8785 0.764252 14.1259 7.84438 3.32515 21.2487 -6.1989 -0.01036 11.8678
+Rh4+ 18.8545 0.760825 13.9806 7.62436 2.53464 19.3317 -5.6526 -0.0102 11.2835
+Pd 19.3319 0.698655 15.5017 7.98929 5.29537 25.2052 0.605844 76.8986 5.26593
+Pd2+ 19.1701 0.696219 15.2096 7.55573 4.32234 22.5057 0 0 5.2916
+Pd4+ 19.2493 0.683839 14.79 7.14833 2.89289 17.9144 -7.9492 0.005127 13.0174
+Ag 19.2808 0.6446 16.6885 7.4726 4.8045 24.6605 1.0463 99.8156 5.179
+Ag1+ 19.1812 0.646179 15.9719 7.19123 5.27475 21.7326 0.357534 66.1147 5.21572
+Ag2+ 19.1643 0.645643 16.2456 7.18544 4.3709 21.4072 0 0 5.21404
+Cd 19.2214 0.5946 17.6444 6.9089 4.461 24.7008 1.6029 87.4825 5.0694
+Cd2+ 19.1514 0.597922 17.2535 6.80639 4.47128 20.2521 0 0 5.11937
+In 19.1624 0.5476 18.5596 6.3776 4.2948 25.8499 2.0396 92.8029 4.9391
+In3+ 19.1045 0.551522 18.1108 6.3247 3.78897 17.3595 0 0 4.99635
+Sn 19.1889 5.8303 19.1005 0.5031 4.4585 26.8909 2.4663 83.9571 4.7821
+Sn2+ 19.1094 0.5036 19.0548 5.8378 4.5648 23.3752 0.487 62.2061 4.7861
+Sn4+ 18.9333 5.764 19.7131 0.4655 3.4182 14.0049 0.0193 -0.7583 3.9182
+Sb 19.6418 5.3034 19.0455 0.4607 5.0371 27.9074 2.6827 75.2825 4.5909
+Sb3+ 18.9755 0.467196 18.933 5.22126 5.10789 19.5902 0.288753 55.5113 4.69626
+Sb5+ 19.8685 5.44853 19.0302 0.467973 2.41253 14.1259 0 0 4.69263
+Te 19.9644 4.81742 19.0138 0.420885 6.14487 28.5284 2.5239 70.8403 4.352
+I 20.1472 4.347 18.9949 0.3814 7.5138 27.766 2.2735 66.8776 4.0712
+I1- 20.2332 4.3579 18.997 0.3815 7.8069 29.5259 2.8868 84.9304 4.0714
+Xe 20.2933 3.9282 19.0298 0.344 8.9767 26.4659 1.99 64.2658 3.7118
+Cs 20.3892 3.569 19.1062 0.3107 10.662 24.3879 1.4953 213.904 3.3352
+Cs1+ 20.3524 3.552 19.1278 0.3086 10.2821 23.7128 0.9615 59.4565 3.2791
+Ba 20.3361 3.216 19.297 0.2756 10.888 20.2073 2.6959 167.202 2.7731
+Ba2+ 20.1807 3.21367 19.1136 0.28331 10.9054 20.0558 0.77634 51.746 3.02902
+La 20.578 2.94817 19.599 0.244475 11.3727 18.7726 3.28719 133.124 2.14678
+La3+ 20.2489 2.9207 19.3763 0.250698 11.6323 17.8211 0.336048 54.9453 2.4086
+Ce 21.1671 2.81219 19.7695 0.226836 11.8513 17.6083 3.33049 127.113 1.86264
+Ce3+ 20.8036 2.77691 19.559 0.23154 11.9369 16.5408 0.612376 43.1692 2.09013
+Ce4+ 20.3235 2.65941 19.8186 0.21885 12.1233 15.7992 0.144583 62.2355 1.5918
+Pr 22.044 2.77393 19.6697 0.222087 12.3856 16.7669 2.82428 143.644 2.0583
+Pr3+ 21.3727 2.6452 19.7491 0.214299 12.1329 15.323 0.97518 36.4065 1.77132
+Pr4+ 20.9413 2.54467 20.0539 0.202481 12.4668 14.8137 0.296689 45.4643 1.24285
+Nd 22.6845 2.66248 19.6847 0.210628 12.774 15.885 2.85137 137.903 1.98486
+Nd3+ 21.961 2.52722 19.9339 0.199237 12.12 14.1783 1.51031 30.8717 1.47588
+Pm 23.3405 2.5627 19.6095 0.202088 13.1235 15.1009 2.87516 132.721 2.02876
+Pm3+ 22.5527 2.4174 20.1108 0.185769 12.0671 13.1275 2.07492 27.4491 1.19499
+Sm 24.0042 2.47274 19.4258 0.196451 13.4396 14.3996 2.89604 128.007 2.20963
+Sm3+ 23.1504 2.31641 20.2599 0.174081 11.9202 12.1571 2.71488 24.8242 0.954586
+Eu 24.6274 2.3879 19.0886 0.1942 13.7603 13.7546 2.9227 123.174 2.5745
+Eu2+ 24.0063 2.27783 19.9504 0.17353 11.8034 11.6096 3.87243 26.5156 1.36389
+Eu3+ 23.7497 2.22258 20.3745 0.16394 11.8509 11.311 3.26503 22.9966 0.759344
+Gd 25.0709 2.25341 19.0798 0.181951 13.8518 12.9331 3.54545 101.398 2.4196
+Gd3+ 24.3466 2.13553 20.4208 0.155525 11.8708 10.5782 3.7149 21.7029 0.645089
+Tb 25.8976 2.24256 18.2185 0.196143 14.3167 12.6648 2.95354 115.362 3.58324
+Tb3+ 24.9559 2.05601 20.3271 0.149525 12.2471 10.0499 3.773 21.2773 0.691967
+Dy 26.507 2.1802 17.6383 0.202172 14.5596 12.1899 2.96577 111.874 4.29728
+Dy3+ 25.5395 1.9804 20.2861 0.143384 11.9812 9.34972 4.50073 19.581 0.68969
+Ho 26.9049 2.07051 17.294 0.19794 14.5583 11.4407 3.63837 92.6566 4.56796
+Ho3+ 26.1296 1.91072 20.0994 0.139358 11.9788 8.80018 4.93676 18.5908 0.852795
+Er 27.6563 2.07356 16.4285 0.223545 14.9779 11.3604 2.98233 105.703 5.92046
+Er3+ 26.722 1.84659 19.7748 0.13729 12.1506 8.36225 5.17379 17.8974 1.17613
+Tm 28.1819 2.02859 15.8851 0.238849 15.1542 10.9975 2.98706 102.961 6.75621
+Tm3+ 27.3083 1.78711 19.332 0.136974 12.3339 7.96778 5.38348 17.2922 1.63929
+Yb 28.6641 1.9889 15.4345 0.257119 15.3087 10.6647 2.98963 100.417 7.56672
+Yb2+ 28.1209 1.78503 17.6817 0.15997 13.3335 8.18304 5.14657 20.39 3.70983
+Yb3+ 27.8917 1.73272 18.7614 0.13879 12.6072 7.64412 5.47647 16.8153 2.26001
+Lu 28.9476 1.90182 15.2208 9.98519 15.1 0.261033 3.71601 84.3298 7.97628
+Lu3+ 28.4628 1.68216 18.121 0.142292 12.8429 7.33727 5.59415 16.3535 2.97573
+Hf 29.144 1.83262 15.1726 9.5999 14.7586 0.275116 4.30013 72.029 8.58154
+Hf4+ 28.8131 1.59136 18.4601 0.128903 12.7285 6.76232 5.59927 14.0366 2.39699
+Ta 29.2024 1.77333 15.2293 9.37046 14.5135 0.295977 4.76492 63.3644 9.24354
+Ta5+ 29.1587 1.50711 18.8407 0.116741 12.8268 6.31524 5.38695 12.4244 1.78555
+W 29.0818 1.72029 15.43 9.2259 14.4327 0.321703 5.11982 57.056 9.8875
+W6+ 29.4936 1.42755 19.3763 0.104621 13.0544 5.93667 5.06412 11.1972 1.01074
+Re 28.7621 1.67191 15.7189 9.09227 14.5564 0.3505 5.44174 52.0861 10.472
+Os 28.1894 1.62903 16.155 8.97948 14.9305 0.382661 5.67589 48.1647 11.0005
+Os4+ 30.419 1.37113 15.2637 6.84706 14.7458 0.165191 5.06795 18.003 6.49804
+Ir 27.3049 1.59279 16.7296 8.86553 15.6115 0.417916 5.83377 45.0011 11.4722
+Ir3+ 30.4156 1.34323 15.862 7.10909 13.6145 0.204633 5.82008 20.3254 8.27903
+Ir4+ 30.7058 1.30923 15.5512 6.71983 14.2326 0.167252 5.53672 17.4911 6.96824
+Pt 27.0059 1.51293 17.7639 8.81174 15.7131 0.424593 5.7837 38.6103 11.6883
+Pt2+ 29.8429 1.32927 16.7224 7.38979 13.2153 0.263297 6.35234 22.9426 9.85329
+Pt4+ 30.9612 1.24813 15.9829 6.60834 13.7348 0.16864 5.92034 16.9392 7.39534
+Au 16.8819 0.4611 18.5913 8.6216 25.5582 1.4826 5.86 36.3956 12.0658
+Au1+ 28.0109 1.35321 17.8204 7.7395 14.3359 0.356752 6.58077 26.4043 11.2299
+Au3+ 30.6886 1.2199 16.9029 6.82872 12.7801 0.212867 6.52354 18.659 9.0968
+Hg 20.6809 0.545 19.0417 8.4484 21.6575 1.5729 5.9676 38.3246 12.6089
+Hg1+ 25.0853 1.39507 18.4973 7.65105 16.8883 0.443378 6.48216 28.2262 12.0205
+Hg2+ 29.5641 1.21152 18.06 7.05639 12.8374 0.284738 6.89912 20.7482 10.6268
+Tl 27.5446 0.65515 19.1584 8.70751 15.538 1.96347 5.52593 45.8149 13.1746
+Tl1+ 21.3985 1.4711 20.4723 0.517394 18.7478 7.43463 6.82847 28.8482 12.5258
+Tl3+ 30.8695 1.1008 18.3481 6.53852 11.9328 0.219074 7.00574 17.2114 9.8027
+Pb 31.0617 0.6902 13.0637 2.3576 18.442 8.618 5.9696 47.2579 13.4118
+Pb2+ 21.7886 1.3366 19.5682 0.488383 19.1406 6.7727 7.01107 23.8132 12.4734
+Pb4+ 32.1244 1.00566 18.8003 6.10926 12.0175 0.147041 6.96886 14.714 8.08428
+Bi 33.3689 0.704 12.951 2.9238 16.5877 8.7937 6.4692 48.0093 13.5782
+Bi3+ 21.8053 1.2356 19.5026 6.24149 19.1053 0.469999 7.10295 20.3185 12.4711
+Bi5+ 33.5364 0.91654 25.0946 0.39042 19.2497 5.71414 6.91555 12.8285 -6.7994
+Po 34.6726 0.700999 15.4733 3.55078 13.1138 9.55642 7.02588 47.0045 13.677
+At 35.3163 0.68587 19.0211 3.97458 9.49887 11.3824 7.42518 45.4715 13.7108
+Rn 35.5631 0.6631 21.2816 4.0691 8.0037 14.0422 7.4433 44.2473 13.6905
+Fr 35.9299 0.646453 23.0547 4.17619 12.1439 23.1052 2.11253 150.645 13.7247
+Ra 35.763 0.616341 22.9064 3.87135 12.4739 19.9887 3.21097 142.325 13.6211
+Ra2+ 35.215 0.604909 21.67 3.5767 7.91342 12.601 7.65078 29.8436 13.5431
+Ac 35.6597 0.589092 23.1032 3.65155 12.5977 18.599 4.08655 117.02 13.5266
+Ac3+ 35.1736 0.579689 22.1112 3.41437 8.19216 12.9187 7.05545 25.9443 13.4637
+Th 35.5645 0.563359 23.4219 3.46204 12.7473 17.8309 4.80703 99.1722 13.4314
+Th4+ 35.1007 0.555054 22.4418 3.24498 9.78554 13.4661 5.29444 23.9533 13.376
+Pa 35.8847 0.547751 23.2948 3.41519 14.1891 16.9235 4.17287 105.251 13.4287
+U 36.0228 0.5293 23.4128 3.3253 14.9491 16.0927 4.188 100.613 13.3966
+U3+ 35.5747 0.52048 22.5259 3.12293 12.2165 12.7148 5.37073 26.3394 13.3092
+U4+ 35.3715 0.516598 22.5326 3.05053 12.0291 12.5723 4.7984 23.4582 13.2671
+U6+ 34.8509 0.507079 22.7584 2.8903 14.0099 13.1767 1.21457 25.2017 13.1665
+Np 36.1874 0.511929 23.5964 3.25396 15.6402 15.3622 4.1855 97.4908 13.3573
+Np3+ 35.7074 0.502322 22.613 3.03807 12.9898 12.1449 5.43227 25.4928 13.2544
+Np4+ 35.5103 0.498626 22.5787 2.96627 12.7766 11.9484 4.92159 22.7502 13.2116
+Np6+ 35.0136 0.48981 22.7286 2.81099 14.3884 12.33 1.75669 22.6581 13.113
+Pu 36.5254 0.499384 23.8083 3.26371 16.7707 14.9455 3.47947 105.98 13.3812
+Pu3+ 35.84 0.484938 22.7169 2.96118 13.5807 11.5331 5.66016 24.3992 13.1991
+Pu4+ 35.6493 0.481422 22.646 2.8902 13.3595 11.316 5.18831 21.8301 13.1555
+Pu6+ 35.1736 0.473204 22.7181 2.73848 14.7635 11.553 2.28678 20.9303 13.0582
+Am 36.6706 0.483629 24.0992 3.20647 17.3415 14.3136 3.49331 102.273 13.3592
+Cm 36.6488 0.465154 24.4096 3.08997 17.399 13.4346 4.21665 88.4834 13.2887
+Bk 36.7881 0.451018 24.7736 3.04619 17.8919 12.8946 4.23284 86.003 13.2754
+Cf 36.9185 0.437533 25.1995 3.00775 18.3317 12.4044 4.24391 83.7881 13.2674
diff --git a/src/xrpd_toolbox/fit_engine/constants/international_tables_of_crystallography.yaml b/src/xrpd_toolbox/fit_engine/constants/international_tables_of_crystallography.yaml
new file mode 100644
index 0000000..f753f68
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/constants/international_tables_of_crystallography.yaml
@@ -0,0 +1,3404 @@
+---
+spacegroups:
+ P1:
+ spacegroup: P1
+ crystal_class: triclinic
+ hall: ' P 1'
+ hermann_mauguin: P 1
+ symops: ['x,y,z']
+ ncsym: ['x,y,z']
+ number: 1
+ schoenflies: C1^1
+ universal_h_m: P 1
+ P-1:
+ spacegroup: P-1
+ crystal_class: triclinic
+ hall: -P 1
+ hermann_mauguin: P -1
+ symops: ['x,y,z', '-x,-y,-z']
+ ncsym: ['x,y,z', '-x,-y,-z']
+ number: 2
+ schoenflies: Ci^1
+ universal_h_m: P -1
+ P2:
+ spacegroup: P2
+ crystal_class: monoclinic
+ hall: ' P 2y'
+ hermann_mauguin: P 1 2 1
+ symops: ['x,y,z', '-x,y,-z']
+ ncsym: ['x,y,z', '-x,y,-z']
+ number: 3
+ schoenflies: C2^1
+ universal_h_m: P 1 2 1
+ P21:
+ spacegroup: P21
+ crystal_class: monoclinic
+ hall: ' P 2yb'
+ hermann_mauguin: P 1 21 1
+ symops: ['x,y,z', '-x,y+0.5,-z']
+ ncsym: ['x,y,z', '-x,y+0.5,-z']
+ number: 4
+ schoenflies: C2^2
+ universal_h_m: P 1 21 1
+ C2:
+ spacegroup: C2
+ crystal_class: monoclinic
+ hall: ' C 2y'
+ hermann_mauguin: C 1 2 1
+ symops: ['x,y,z', '-x,y,-z', 'x+0.5,y+0.5,z', '-x+0.5,y+0.5,-z']
+ ncsym: ['x,y,z', '-x,y,-z']
+ number: 5
+ schoenflies: C2^3
+ universal_h_m: C 1 2 1
+ Pm:
+ spacegroup: Pm
+ crystal_class: monoclinic
+ hall: ' P -2y'
+ hermann_mauguin: P 1 m 1
+ symops: ['x,y,z', 'x,-y,z']
+ ncsym: ['x,y,z', 'x,-y,z']
+ number: 6
+ schoenflies: Cs^1
+ universal_h_m: P 1 m 1
+ Pc:
+ spacegroup: Pc
+ crystal_class: monoclinic
+ hall: ' P -2yc'
+ hermann_mauguin: P 1 c 1
+ symops: ['x,y,z', 'x,-y,z+0.5']
+ ncsym: ['x,y,z', 'x,-y,z+0.5']
+ number: 7
+ schoenflies: Cs^2
+ universal_h_m: P 1 c 1
+ Cm:
+ spacegroup: Cm
+ crystal_class: monoclinic
+ hall: ' C -2y'
+ hermann_mauguin: C 1 m 1
+ symops: ['x,y,z', 'x,-y,z', 'x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', 'x,-y,z']
+ number: 8
+ schoenflies: Cs^3
+ universal_h_m: C 1 m 1
+ Cc:
+ spacegroup: Cc
+ crystal_class: monoclinic
+ hall: ' C -2yc'
+ hermann_mauguin: C 1 c 1
+ symops: ['x,y,z', 'x,-y,z+0.5', 'x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', 'x,-y,z+0.5']
+ number: 9
+ schoenflies: Cs^4
+ universal_h_m: C 1 c 1
+ P2/m:
+ spacegroup: P2/m
+ crystal_class: monoclinic
+ hall: -P 2y
+ hermann_mauguin: P 1 2/m 1
+ symops: ['x,y,z', '-x,y,-z', '-x,-y,-z', 'x,-y,z']
+ ncsym: ['x,y,z', '-x,y,-z', '-x,-y,-z', 'x,-y,z']
+ number: 10
+ schoenflies: C2h^1
+ universal_h_m: P 1 2/m 1
+ P21/m:
+ spacegroup: P21/m
+ crystal_class: monoclinic
+ hall: -P 2yb
+ hermann_mauguin: P 1 21/m 1
+ symops: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y-0.5,z']
+ ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y-0.5,z']
+ number: 11
+ schoenflies: C2h^2
+ universal_h_m: P 1 21/m 1
+ C2/m:
+ spacegroup: C2/m
+ crystal_class: monoclinic
+ hall: -C 2y
+ hermann_mauguin: C 1 2/m 1
+ symops: ['x,y,z', '-x,y,-z', '-x,-y,-z', 'x,-y,z', 'x+0.5,y+0.5,z', '-x+0.5,y+0.5,-z',
+ '-x+0.5,-y+0.5,-z', 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', '-x,y,-z', '-x,-y,-z', 'x,-y,z']
+ number: 12
+ schoenflies: C2h^3
+ universal_h_m: C 1 2/m 1
+ P2/c:
+ spacegroup: P2/c
+ crystal_class: monoclinic
+ hall: -P 2yc
+ hermann_mauguin: P 1 2/c 1
+ symops: ['x,y,z', '-x,y,-z+0.5', '-x,-y,-z', 'x,-y,z-0.5']
+ ncsym: ['x,y,z', '-x,y,-z+0.5', '-x,-y,-z', 'x,-y,z-0.5']
+ number: 13
+ schoenflies: C2h^4
+ universal_h_m: P 1 2/c 1
+ P21/c:
+ spacegroup: P21/c
+ crystal_class: monoclinic
+ hall: -P 2ybc
+ hermann_mauguin: P 1 21/c 1
+ symops: ['x,y,z', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'x,-y-0.5,z-0.5']
+ ncsym: ['x,y,z', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'x,-y-0.5,z-0.5']
+ number: 14
+ schoenflies: C2h^5
+ universal_h_m: P 1 21/c 1
+ C2/c:
+ spacegroup: C2/c
+ crystal_class: monoclinic
+ hall: -C 2yc
+ hermann_mauguin: C 1 2/c 1
+ symops: ['x,y,z', '-x,y,-z+0.5', '-x,-y,-z', 'x,-y,z-0.5', 'x+0.5,y+0.5,z', '-x+0.5,y+0.5,-z+0.5',
+ '-x+0.5,-y+0.5,-z', 'x+0.5,-y+0.5,z-0.5']
+ ncsym: ['x,y,z', '-x,y,-z+0.5', '-x,-y,-z', 'x,-y,z-0.5']
+ number: 15
+ schoenflies: C2h^6
+ universal_h_m: C 1 2/c 1
+ P222:
+ spacegroup: P222
+ crystal_class: orthorhombic
+ hall: ' P 2 2'
+ hermann_mauguin: P 2 2 2
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z']
+ number: 16
+ schoenflies: D2^1
+ universal_h_m: P 2 2 2
+ P2221:
+ spacegroup: P2221
+ crystal_class: orthorhombic
+ hall: ' P 2c 2'
+ hermann_mauguin: P 2 2 21
+ symops: ['x,y,z', '-x,-y,z+0.5', 'x,-y,-z', '-x,y,-z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z+0.5', 'x,-y,-z', '-x,y,-z+0.5']
+ number: 17
+ schoenflies: D2^2
+ universal_h_m: P 2 2 21
+ P21212:
+ spacegroup: P21212
+ crystal_class: orthorhombic
+ hall: ' P 2 2ab'
+ hermann_mauguin: P 21 21 2
+ symops: ['x,y,z', '-x,-y,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z']
+ number: 18
+ schoenflies: D2^3
+ universal_h_m: P 21 21 2
+ P212121:
+ spacegroup: P212121
+ crystal_class: orthorhombic
+ hall: ' P 2ac 2ab'
+ hermann_mauguin: P 21 21 21
+ symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z+0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z+0.5']
+ number: 19
+ schoenflies: D2^4
+ universal_h_m: P 21 21 21
+ C2221:
+ spacegroup: C2221
+ crystal_class: orthorhombic
+ hall: ' C 2c 2'
+ hermann_mauguin: C 2 2 21
+ symops: ['x,y,z', '-x,-y,z+0.5', 'x,-y,-z', '-x,y,-z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z+0.5',
+ 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z+0.5', 'x,-y,-z', '-x,y,-z+0.5']
+ number: 20
+ schoenflies: D2^5
+ universal_h_m: C 2 2 21
+ C222:
+ spacegroup: C222
+ crystal_class: orthorhombic
+ hall: ' C 2 2'
+ hermann_mauguin: C 2 2 2
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z',
+ 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z']
+ number: 21
+ schoenflies: D2^6
+ universal_h_m: C 2 2 2
+ F222:
+ spacegroup: F222
+ crystal_class: orthorhombic
+ hall: ' F 2 2'
+ hermann_mauguin: F 2 2 2
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'x,y+0.5,z+0.5', '-x,-y+0.5,z+0.5',
+ 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5',
+ '-x+0.5,y,-z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z']
+ number: 22
+ schoenflies: D2^7
+ universal_h_m: F 2 2 2
+ I222:
+ spacegroup: I222
+ crystal_class: orthorhombic
+ hall: ' I 2 2'
+ hermann_mauguin: I 2 2 2
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z']
+ number: 23
+ schoenflies: D2^8
+ universal_h_m: I 2 2 2
+ I212121:
+ spacegroup: I212121
+ crystal_class: orthorhombic
+ hall: ' I 2b 2c'
+ hermann_mauguin: I 21 21 21
+ symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z+0.5', '-x,y+0.5,-z+0.5', 'x+0.5,y+0.5,z+0.5',
+ '-x+0.5,-y+1,z+0.5', 'x+0.5,-y+0.5,-z+1', '-x+0.5,y+1,-z+1']
+ ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z+0.5', '-x,y+0.5,-z+0.5']
+ number: 24
+ schoenflies: D2^9
+ universal_h_m: I 21 21 21
+ Pmm2:
+ spacegroup: Pmm2
+ crystal_class: orthorhombic
+ hall: ' P 2 -2'
+ hermann_mauguin: P m m 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z']
+ number: 25
+ schoenflies: C2v^1
+ universal_h_m: P m m 2
+ Pmc21:
+ spacegroup: Pmc21
+ crystal_class: orthorhombic
+ hall: ' P 2c -2'
+ hermann_mauguin: P m c 21
+ symops: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5']
+ number: 26
+ schoenflies: C2v^2
+ universal_h_m: P m c 21
+ Pcc2:
+ spacegroup: Pcc2
+ crystal_class: orthorhombic
+ hall: ' P 2 -2c'
+ hermann_mauguin: P c c 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y,z+0.5', 'x,-y,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y,z+0.5', 'x,-y,z+0.5']
+ number: 27
+ schoenflies: C2v^3
+ universal_h_m: P c c 2
+ Pma2:
+ spacegroup: Pma2
+ crystal_class: orthorhombic
+ hall: ' P 2 -2a'
+ hermann_mauguin: P m a 2
+ symops: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z']
+ ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z']
+ number: 28
+ schoenflies: C2v^4
+ universal_h_m: P m a 2
+ Pca21:
+ spacegroup: Pca21
+ crystal_class: orthorhombic
+ hall: ' P 2c -2ac'
+ hermann_mauguin: P c a 21
+ symops: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y,z']
+ ncsym: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y,z']
+ number: 29
+ schoenflies: C2v^5
+ universal_h_m: P c a 21
+ Pnc2:
+ spacegroup: Pnc2
+ crystal_class: orthorhombic
+ hall: ' P 2 -2bc'
+ hermann_mauguin: P n c 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y+0.5,z+0.5', 'x,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y+0.5,z+0.5', 'x,-y+0.5,z+0.5']
+ number: 30
+ schoenflies: C2v^6
+ universal_h_m: P n c 2
+ Pmn21:
+ spacegroup: Pmn21
+ crystal_class: orthorhombic
+ hall: ' P 2ac -2'
+ hermann_mauguin: P m n 21
+ symops: ['x,y,z', '-x+0.5,-y,z+0.5', '-x,y,z', 'x+0.5,-y,z+0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', '-x,y,z', 'x+0.5,-y,z+0.5']
+ number: 31
+ schoenflies: C2v^7
+ universal_h_m: P m n 21
+ Pba2:
+ spacegroup: Pba2
+ crystal_class: orthorhombic
+ hall: ' P 2 -2ab'
+ hermann_mauguin: P b a 2
+ symops: ['x,y,z', '-x,-y,z', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ number: 32
+ schoenflies: C2v^8
+ universal_h_m: P b a 2
+ Pna21:
+ spacegroup: Pna21
+ crystal_class: orthorhombic
+ hall: ' P 2c -2n'
+ hermann_mauguin: P n a 21
+ symops: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z']
+ number: 33
+ schoenflies: C2v^9
+ universal_h_m: P n a 21
+ Pnn2:
+ spacegroup: Pnn2
+ crystal_class: orthorhombic
+ hall: ' P 2 -2n'
+ hermann_mauguin: P n n 2
+ symops: ['x,y,z', '-x,-y,z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5']
+ number: 34
+ schoenflies: C2v^10
+ universal_h_m: P n n 2
+ Cmm2:
+ spacegroup: Cmm2
+ crystal_class: orthorhombic
+ hall: ' C 2 -2'
+ hermann_mauguin: C m m 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z',
+ '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z']
+ number: 35
+ schoenflies: C2v^11
+ universal_h_m: C m m 2
+ Cmc21:
+ spacegroup: Cmc21
+ crystal_class: orthorhombic
+ hall: ' C 2c -2'
+ hermann_mauguin: C m c 21
+ symops: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z+0.5',
+ '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5']
+ number: 36
+ schoenflies: C2v^12
+ universal_h_m: C m c 21
+ Ccc2:
+ spacegroup: Ccc2
+ crystal_class: orthorhombic
+ hall: ' C 2 -2c'
+ hermann_mauguin: C c c 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y,z+0.5', 'x,-y,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z',
+ '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y,z+0.5', 'x,-y,z+0.5']
+ number: 37
+ schoenflies: C2v^13
+ universal_h_m: C c c 2
+ Amm2:
+ spacegroup: Amm2
+ crystal_class: orthorhombic
+ hall: ' A 2 -2'
+ hermann_mauguin: A m m 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z', 'x,y+0.5,z+0.5', '-x,-y+0.5,z+0.5',
+ '-x,y+0.5,z+0.5', 'x,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z']
+ number: 38
+ schoenflies: C2v^14
+ universal_h_m: A m m 2
+ Abm2:
+ spacegroup: Abm2
+ crystal_class: orthorhombic
+ hall: ' A 2 -2b'
+ hermann_mauguin: A e m 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x,-y+0.5,z+0.5',
+ '-x,y+1,z+0.5', 'x,-y+1,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z']
+ number: 39
+ schoenflies: C2v^15
+ universal_h_m: A e m 2
+ Ama2:
+ spacegroup: Ama2
+ crystal_class: orthorhombic
+ hall: ' A 2 -2a'
+ hermann_mauguin: A m a 2
+ symops: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z', 'x,y+0.5,z+0.5', '-x,-y+0.5,z+0.5',
+ '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z']
+ number: 40
+ schoenflies: C2v^16
+ universal_h_m: A m a 2
+ Aba2:
+ spacegroup: Aba2
+ crystal_class: orthorhombic
+ hall: ' A 2 -2ab'
+ hermann_mauguin: A e a 2
+ symops: ['x,y,z', '-x,-y,z', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5',
+ '-x,-y+0.5,z+0.5', '-x+0.5,y+1,z+0.5', 'x+0.5,-y+1,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ number: 41
+ schoenflies: C2v^17
+ universal_h_m: A e a 2
+ Fmm2:
+ spacegroup: Fmm2
+ crystal_class: orthorhombic
+ hall: ' F 2 -2'
+ hermann_mauguin: F m m 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z', 'x,y+0.5,z+0.5', '-x,-y+0.5,z+0.5',
+ '-x,y+0.5,z+0.5', 'x,-y+0.5,z+0.5', 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', '-x+0.5,y,z+0.5',
+ 'x+0.5,-y,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z']
+ number: 42
+ schoenflies: C2v^18
+ universal_h_m: F m m 2
+ Fdd2:
+ spacegroup: Fdd2
+ crystal_class: orthorhombic
+ hall: ' F 2 -2d'
+ hermann_mauguin: F d d 2
+ symops: ['x,y,z', '-x,-y,z', '-x+0.25,y+0.25,z+0.25', 'x+0.75,-y+0.75,z+0.25',
+ 'x,y+0.5,z+0.5', '-x,-y+0.5,z+0.5', '-x+0.25,y+0.75,z+0.75', 'x+0.75,-y+1.25,z+0.75',
+ 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', '-x+0.75,y+0.25,z+0.75', 'x+1.25,-y+0.75,z+0.75',
+ 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z', '-x+0.75,y+0.75,z+0.25', 'x+1.25,-y+1.25,z+0.25']
+ ncsym: ['x,y,z', '-x,-y,z', '-x+0.25,y+0.25,z+0.25', 'x+0.75,-y+0.75,z+0.25']
+ number: 43
+ schoenflies: C2v^19
+ universal_h_m: F d d 2
+ Imm2:
+ spacegroup: Imm2
+ crystal_class: orthorhombic
+ hall: ' I 2 -2'
+ hermann_mauguin: I m m 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z']
+ number: 44
+ schoenflies: C2v^20
+ universal_h_m: I m m 2
+ Iba2:
+ spacegroup: Iba2
+ crystal_class: orthorhombic
+ hall: ' I 2 -2c'
+ hermann_mauguin: I b a 2
+ symops: ['x,y,z', '-x,-y,z', '-x,y,z+0.5', 'x,-y,z+0.5', 'x+0.5,y+0.5,z+0.5',
+ '-x+0.5,-y+0.5,z+0.5', '-x+0.5,y+0.5,z+1', 'x+0.5,-y+0.5,z+1']
+ ncsym: ['x,y,z', '-x,-y,z', '-x,y,z+0.5', 'x,-y,z+0.5']
+ number: 45
+ schoenflies: C2v^21
+ universal_h_m: I b a 2
+ Ima2:
+ spacegroup: Ima2
+ crystal_class: orthorhombic
+ hall: ' I 2 -2a'
+ hermann_mauguin: I m a 2
+ symops: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z', 'x+0.5,y+0.5,z+0.5',
+ '-x+0.5,-y+0.5,z+0.5', '-x+1,y+0.5,z+0.5', 'x+1,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z']
+ number: 46
+ schoenflies: C2v^22
+ universal_h_m: I m a 2
+ Pmmm:
+ spacegroup: Pmmm
+ crystal_class: orthorhombic
+ hall: -P 2 2
+ hermann_mauguin: P m m m
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z']
+ number: 47
+ schoenflies: D2h^1
+ universal_h_m: P m m m
+ Pnnn:
+ spacegroup: Pnnn
+ crystal_class: orthorhombic
+ hall: ' P 2 2 -1n'
+ hermann_mauguin: P n n n
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5',
+ '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5',
+ '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5']
+ number: 48
+ schoenflies: D2h^2
+ universal_h_m: P n n n :1
+ Pccm:
+ spacegroup: Pccm
+ crystal_class: orthorhombic
+ hall: -P 2 2c
+ hermann_mauguin: P c c m
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'x,y,-z',
+ '-x,y,z-0.5', 'x,-y,z-0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'x,y,-z',
+ '-x,y,z-0.5', 'x,-y,z-0.5']
+ number: 49
+ schoenflies: D2h^3
+ universal_h_m: P c c m
+ Pban:
+ spacegroup: Pban
+ crystal_class: orthorhombic
+ hall: ' P 2 2 -1ab'
+ hermann_mauguin: P b a n
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x+0.5,-y+0.5,-z', 'x+0.5,y+0.5,-z',
+ '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x+0.5,-y+0.5,-z', 'x+0.5,y+0.5,-z',
+ '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ number: 50
+ schoenflies: D2h^4
+ universal_h_m: P b a n :1
+ Pmma:
+ spacegroup: Pmma
+ crystal_class: orthorhombic
+ hall: -P 2a 2a
+ hermann_mauguin: P m m a
+ symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,-z', '-x,y,-z', '-x,-y,-z', 'x-0.5,y,-z',
+ '-x-0.5,y,z', 'x,-y,z']
+ ncsym: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,-z', '-x,y,-z', '-x,-y,-z', 'x-0.5,y,-z',
+ '-x-0.5,y,z', 'x,-y,z']
+ number: 51
+ schoenflies: D2h^5
+ universal_h_m: P m m a
+ Pnna:
+ spacegroup: Pnna
+ crystal_class: orthorhombic
+ hall: -P 2a 2bc
+ hermann_mauguin: P n n a
+ symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z', '-x,y-0.5,z-0.5', 'x-0.5,-y-0.5,z-0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z', '-x,y-0.5,z-0.5', 'x-0.5,-y-0.5,z-0.5']
+ number: 52
+ schoenflies: D2h^6
+ universal_h_m: P n n a
+ Pmna:
+ spacegroup: Pmna
+ crystal_class: orthorhombic
+ hall: -P 2ac 2
+ hermann_mauguin: P m n a
+ symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z-0.5', '-x,y,z', 'x-0.5,-y,z-0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z-0.5', '-x,y,z', 'x-0.5,-y,z-0.5']
+ number: 53
+ schoenflies: D2h^7
+ universal_h_m: P m n a
+ Pcca:
+ spacegroup: Pcca
+ crystal_class: orthorhombic
+ hall: -P 2a 2ac
+ hermann_mauguin: P c c a
+ symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z', '-x-0.5,y,z-0.5', 'x,-y,z-0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z', '-x-0.5,y,z-0.5', 'x,-y,z-0.5']
+ number: 54
+ schoenflies: D2h^8
+ universal_h_m: P c c a
+ Pbam:
+ spacegroup: Pbam
+ crystal_class: orthorhombic
+ hall: -P 2 2ab
+ hermann_mauguin: P b a m
+ symops: ['x,y,z', '-x,-y,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z',
+ 'x,y,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y-0.5,z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z',
+ 'x,y,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y-0.5,z']
+ number: 55
+ schoenflies: D2h^9
+ universal_h_m: P b a m
+ Pccn:
+ spacegroup: Pccn
+ crystal_class: orthorhombic
+ hall: -P 2ab 2ac
+ hermann_mauguin: P c c n
+ symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y-0.5,-z', '-x-0.5,y,z-0.5', 'x,-y-0.5,z-0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y-0.5,-z', '-x-0.5,y,z-0.5', 'x,-y-0.5,z-0.5']
+ number: 56
+ schoenflies: D2h^10
+ universal_h_m: P c c n
+ Pbcm:
+ spacegroup: Pbcm
+ crystal_class: orthorhombic
+ hall: -P 2c 2b
+ hermann_mauguin: P b c m
+ symops: ['x,y,z', '-x,-y,z+0.5', 'x,-y+0.5,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x,y,-z-0.5', '-x,y-0.5,z', 'x,-y-0.5,z-0.5']
+ ncsym: ['x,y,z', '-x,-y,z+0.5', 'x,-y+0.5,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x,y,-z-0.5', '-x,y-0.5,z', 'x,-y-0.5,z-0.5']
+ number: 57
+ schoenflies: D2h^11
+ universal_h_m: P b c m
+ Pnnm:
+ spacegroup: Pnnm
+ crystal_class: orthorhombic
+ hall: -P 2 2n
+ hermann_mauguin: P n n m
+ symops: ['x,y,z', '-x,-y,z', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x,y,-z', '-x-0.5,y-0.5,z-0.5', 'x-0.5,-y-0.5,z-0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x,y,-z', '-x-0.5,y-0.5,z-0.5', 'x-0.5,-y-0.5,z-0.5']
+ number: 58
+ schoenflies: D2h^12
+ universal_h_m: P n n m
+ Pmmn:
+ spacegroup: Pmmn
+ crystal_class: orthorhombic
+ hall: ' P 2 2ab -1ab'
+ hermann_mauguin: P m m n
+ symops: ['x,y,z', '-x,-y,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x+0.5,-y+0.5,-z',
+ 'x+0.5,y+0.5,-z', '-x,y,z', 'x,-y,z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x+0.5,-y+0.5,-z',
+ 'x+0.5,y+0.5,-z', '-x,y,z', 'x,-y,z']
+ number: 59
+ schoenflies: D2h^13
+ universal_h_m: P m m n :1
+ Pbcn:
+ spacegroup: Pbcn
+ crystal_class: orthorhombic
+ hall: -P 2n 2ab
+ hermann_mauguin: P b c n
+ symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y-0.5,z', 'x,-y,z-0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y-0.5,z', 'x,-y,z-0.5']
+ number: 60
+ schoenflies: D2h^14
+ universal_h_m: P b c n
+ Pbca:
+ spacegroup: Pbca
+ crystal_class: orthorhombic
+ hall: -P 2ac 2ab
+ hermann_mauguin: P b c a
+ symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z-0.5', '-x-0.5,y-0.5,z', 'x,-y-0.5,z-0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z-0.5', '-x-0.5,y-0.5,z', 'x,-y-0.5,z-0.5']
+ number: 61
+ schoenflies: D2h^15
+ universal_h_m: P b c a
+ Pnma:
+ spacegroup: Pnma
+ crystal_class: orthorhombic
+ hall: -P 2ac 2n
+ hermann_mauguin: P n m a
+ symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z',
+ 'x-0.5,y,-z-0.5', '-x-0.5,y-0.5,z-0.5', 'x,-y-0.5,z']
+ ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z',
+ 'x-0.5,y,-z-0.5', '-x-0.5,y-0.5,z-0.5', 'x,-y-0.5,z']
+ number: 62
+ schoenflies: D2h^16
+ universal_h_m: P n m a
+ Cmcm:
+ spacegroup: Cmcm
+ crystal_class: orthorhombic
+ hall: -C 2c 2
+ hermann_mauguin: C m c m
+ symops: ['x,y,z', '-x,-y,z+0.5', 'x,-y,-z', '-x,y,-z+0.5', '-x,-y,-z', 'x,y,-z-0.5',
+ '-x,y,z', 'x,-y,z-0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z',
+ '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', 'x+0.5,y+0.5,-z-0.5', '-x+0.5,y+0.5,z',
+ 'x+0.5,-y+0.5,z-0.5']
+ ncsym: ['x,y,z', '-x,-y,z+0.5', 'x,-y,-z', '-x,y,-z+0.5', '-x,-y,-z', 'x,y,-z-0.5',
+ '-x,y,z', 'x,-y,z-0.5']
+ number: 63
+ schoenflies: D2h^17
+ universal_h_m: C m c m
+ Cmce:
+ spacegroup: Cmce
+ crystal_class: orthorhombic
+ hall: -C 2ac 2
+ hermann_mauguin: C m c e
+ symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z-0.5', '-x,y,z', 'x-0.5,-y,z-0.5', 'x+0.5,y+0.5,z', '-x+1,-y+0.5,z+0.5',
+ 'x+0.5,-y+0.5,-z', '-x+1,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', 'x,y+0.5,-z-0.5',
+ '-x+0.5,y+0.5,z', 'x,-y+0.5,z-0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z',
+ 'x-0.5,y,-z-0.5', '-x,y,z', 'x-0.5,-y,z-0.5']
+ number: 64
+ schoenflies: D2h^18
+ universal_h_m: C m c e
+ Cmmm:
+ spacegroup: Cmmm
+ crystal_class: orthorhombic
+ hall: -C 2 2
+ hermann_mauguin: C m m m
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z',
+ '-x+0.5,-y+0.5,-z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z']
+ number: 65
+ schoenflies: D2h^19
+ universal_h_m: C m m m
+ Cccm:
+ spacegroup: Cccm
+ crystal_class: orthorhombic
+ hall: -C 2 2c
+ hermann_mauguin: C c c m
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'x,y,-z',
+ '-x,y,z-0.5', 'x,-y,z-0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5',
+ '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z-0.5',
+ 'x+0.5,-y+0.5,z-0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'x,y,-z',
+ '-x,y,z-0.5', 'x,-y,z-0.5']
+ number: 66
+ schoenflies: D2h^20
+ universal_h_m: C c c m
+ Cmme:
+ spacegroup: Cmme
+ crystal_class: orthorhombic
+ hall: -C 2a 2
+ hermann_mauguin: C m m a
+ symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,y,-z',
+ '-x,y,z', 'x-0.5,-y,z', 'x+0.5,y+0.5,z', '-x+1,-y+0.5,z', 'x+0.5,-y+0.5,-z',
+ '-x+1,y+0.5,-z', '-x+0.5,-y+0.5,-z', 'x,y+0.5,-z', '-x+0.5,y+0.5,z', 'x,-y+0.5,z']
+ ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,y,-z',
+ '-x,y,z', 'x-0.5,-y,z']
+ number: 67
+ schoenflies: D2h^21
+ universal_h_m: C m m a
+ Ccce:
+ spacegroup: Ccce
+ crystal_class: orthorhombic
+ hall: ' C 2 2 -1ac'
+ hermann_mauguin: C c c e
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x+0.5,-y,-z+0.5', 'x+0.5,y,-z+0.5',
+ '-x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z',
+ '-x+0.5,y+0.5,-z', '-x+1,-y+0.5,-z+0.5', 'x+1,y+0.5,-z+0.5', '-x+1,y+0.5,z+0.5',
+ 'x+1,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x+0.5,-y,-z+0.5', 'x+0.5,y,-z+0.5',
+ '-x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5']
+ number: 68
+ schoenflies: D2h^22
+ universal_h_m: C c c e :1
+ Fmmm:
+ spacegroup: Fmmm
+ crystal_class: orthorhombic
+ hall: -F 2 2
+ hermann_mauguin: F m m m
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z', 'x,y+0.5,z+0.5', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5',
+ '-x,-y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', 'x,-y+0.5,z+0.5', 'x+0.5,y,z+0.5',
+ '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y,-z+0.5',
+ 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z',
+ 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x+0.5,-y+0.5,-z', 'x+0.5,y+0.5,-z',
+ '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z']
+ number: 69
+ schoenflies: D2h^23
+ universal_h_m: F m m m
+ Fddd:
+ spacegroup: Fddd
+ crystal_class: orthorhombic
+ hall: ' F 2 2 -1d'
+ hermann_mauguin: F d d d
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x+0.25,-y+0.25,-z+0.25',
+ 'x+0.25,y+0.25,-z+0.25', '-x+0.25,y+0.25,z+0.25', 'x+0.25,-y+0.25,z+0.25', 'x,y+0.5,z+0.5',
+ '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-x+0.25,-y+0.75,-z+0.75',
+ 'x+0.25,y+0.75,-z+0.75', '-x+0.25,y+0.75,z+0.75', 'x+0.25,-y+0.75,z+0.75', 'x+0.5,y,z+0.5',
+ '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.75,-y+0.25,-z+0.75',
+ 'x+0.75,y+0.25,-z+0.75', '-x+0.75,y+0.25,z+0.75', 'x+0.75,-y+0.25,z+0.75', 'x+0.5,y+0.5,z',
+ '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x+0.75,-y+0.75,-z+0.25',
+ 'x+0.75,y+0.75,-z+0.25', '-x+0.75,y+0.75,z+0.25', 'x+0.75,-y+0.75,z+0.25']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x+0.25,-y+0.25,-z+0.25', 'x+0.25,y+0.25,-z+0.25',
+ '-x+0.25,y+0.25,z+0.25', 'x+0.25,-y+0.25,z+0.25']
+ number: 70
+ schoenflies: D2h^24
+ universal_h_m: F d d d :1
+ Immm:
+ spacegroup: Immm
+ crystal_class: orthorhombic
+ hall: -I 2 2
+ hermann_mauguin: I m m m
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5',
+ '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5',
+ 'x+0.5,-y+0.5,z+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z']
+ number: 71
+ schoenflies: D2h^25
+ universal_h_m: I m m m
+ Ibam:
+ spacegroup: Ibam
+ crystal_class: orthorhombic
+ hall: -I 2 2c
+ hermann_mauguin: I b a m
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'x,y,-z',
+ '-x,y,z-0.5', 'x,-y,z-0.5', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+1',
+ '-x+0.5,y+0.5,-z+1', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z',
+ 'x+0.5,-y+0.5,z']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'x,y,-z',
+ '-x,y,z-0.5', 'x,-y,z-0.5']
+ number: 72
+ schoenflies: D2h^26
+ universal_h_m: I b a m
+ Ibca:
+ spacegroup: Ibca
+ crystal_class: orthorhombic
+ hall: -I 2b 2c
+ hermann_mauguin: I b c a
+ symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x,y-0.5,-z', '-x,y,z-0.5', 'x,-y-0.5,z-0.5', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5',
+ 'x+0.5,-y+0.5,-z+1', '-x+0.5,y+1,-z+1', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,y,-z+0.5',
+ '-x+0.5,y+0.5,z', 'x+0.5,-y,z']
+ ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z',
+ 'x,y-0.5,-z', '-x,y,z-0.5', 'x,-y-0.5,z-0.5']
+ number: 73
+ schoenflies: D2h^27
+ universal_h_m: I b c a
+ Imma:
+ spacegroup: Imma
+ crystal_class: orthorhombic
+ hall: -I 2b 2
+ hermann_mauguin: I m m a
+ symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y-0.5,-z',
+ '-x,y,z', 'x,-y-0.5,z', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5', 'x+0.5,-y+0.5,-z+0.5',
+ '-x+0.5,y+1,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,y,-z+0.5', '-x+0.5,y+0.5,z+0.5',
+ 'x+0.5,-y,z+0.5']
+ ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y-0.5,-z',
+ '-x,y,z', 'x,-y-0.5,z']
+ number: 74
+ schoenflies: D2h^28
+ universal_h_m: I m m a
+ P4:
+ spacegroup: P4
+ crystal_class: tetragonal
+ hall: ' P 4'
+ hermann_mauguin: P 4
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z']
+ number: 75
+ schoenflies: C4^1
+ universal_h_m: P 4
+ P41:
+ spacegroup: P41
+ crystal_class: tetragonal
+ hall: ' P 4w'
+ hermann_mauguin: P 41
+ symops: ['x,y,z', '-y,x,z+0.25', '-x,-y,z+0.5', 'y,-x,z+0.75']
+ ncsym: ['x,y,z', '-y,x,z+0.25', '-x,-y,z+0.5', 'y,-x,z+0.75']
+ number: 76
+ schoenflies: C4^2
+ universal_h_m: P 41
+ P42:
+ spacegroup: P42
+ crystal_class: tetragonal
+ hall: ' P 4c'
+ hermann_mauguin: P 42
+ symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5']
+ ncsym: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5']
+ number: 77
+ schoenflies: C4^3
+ universal_h_m: P 42
+ P43:
+ spacegroup: P43
+ crystal_class: tetragonal
+ hall: ' P 4cw'
+ hermann_mauguin: P 43
+ symops: ['x,y,z', '-y,x,z+0.75', '-x,-y,z+0.5', 'y,-x,z+0.25']
+ ncsym: ['x,y,z', '-y,x,z+0.75', '-x,-y,z+0.5', 'y,-x,z+0.25']
+ number: 78
+ schoenflies: C4^4
+ universal_h_m: P 43
+ I4:
+ spacegroup: I4
+ crystal_class: tetragonal
+ hall: ' I 4'
+ hermann_mauguin: I 4
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+0.5,z+0.5',
+ '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x+0.5,z+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z']
+ number: 79
+ schoenflies: C4^5
+ universal_h_m: I 4
+ I41:
+ spacegroup: I41
+ crystal_class: tetragonal
+ hall: ' I 4bw'
+ hermann_mauguin: I 41
+ symops: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+1,z+0.75', '-x+1,-y+1,z+1', 'y+1,-x+0.5,z+1.25']
+ ncsym: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75']
+ number: 80
+ schoenflies: C4^6
+ universal_h_m: I 41
+ P-4:
+ spacegroup: P-4
+ crystal_class: tetragonal
+ hall: ' P -4'
+ hermann_mauguin: P -4
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z']
+ number: 81
+ schoenflies: S4^1
+ universal_h_m: P -4
+ I-4:
+ spacegroup: I-4
+ crystal_class: tetragonal
+ hall: ' I -4'
+ hermann_mauguin: I -4
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x+0.5,y+0.5,z+0.5', 'y+0.5,-x+0.5,-z+0.5',
+ '-x+0.5,-y+0.5,z+0.5', '-y+0.5,x+0.5,-z+0.5']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z']
+ number: 82
+ schoenflies: S4^2
+ universal_h_m: I -4
+ P4/m:
+ spacegroup: P4/m
+ crystal_class: tetragonal
+ hall: -P 4
+ hermann_mauguin: P 4/m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z',
+ '-y,x,-z']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z',
+ '-y,x,-z']
+ number: 83
+ schoenflies: C4h^1
+ universal_h_m: P 4/m
+ P42/m:
+ spacegroup: P42/m
+ crystal_class: tetragonal
+ hall: -P 4c
+ hermann_mauguin: P 42/m
+ symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-x,-y,-z', 'y,-x,-z-0.5',
+ 'x,y,-z', '-y,x,-z-0.5']
+ ncsym: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-x,-y,-z', 'y,-x,-z-0.5',
+ 'x,y,-z', '-y,x,-z-0.5']
+ number: 84
+ schoenflies: C4h^2
+ universal_h_m: P 42/m
+ P4/n:
+ spacegroup: P4/n
+ crystal_class: tetragonal
+ hall: ' P 4ab -1ab'
+ hermann_mauguin: P 4/n
+ symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', '-x+0.5,-y+0.5,-z',
+ 'y,-x,-z', 'x+0.5,y+0.5,-z', '-y,x,-z']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', '-x+0.5,-y+0.5,-z',
+ 'y,-x,-z', 'x+0.5,y+0.5,-z', '-y,x,-z']
+ number: 85
+ schoenflies: C4h^3
+ universal_h_m: P 4/n :1
+ P42/n:
+ spacegroup: P42/n
+ crystal_class: tetragonal
+ hall: ' P 4n -1n'
+ hermann_mauguin: P 42/n
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', '-x+0.5,-y+0.5,-z+0.5',
+ 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', '-x+0.5,-y+0.5,-z+0.5',
+ 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z']
+ number: 86
+ schoenflies: C4h^4
+ universal_h_m: P 42/n :1
+ I4/m:
+ spacegroup: I4/m
+ crystal_class: tetragonal
+ hall: -I 4
+ hermann_mauguin: I 4/m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z',
+ '-y,x,-z', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,-x+0.5,z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,x+0.5,-z+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z',
+ '-y,x,-z']
+ number: 87
+ schoenflies: C4h^5
+ universal_h_m: I 4/m
+ I41/a:
+ spacegroup: I41/a
+ crystal_class: tetragonal
+ hall: ' I 4bw -1bw'
+ hermann_mauguin: I 41/a
+ symops: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ '-x,-y+0.5,-z+0.25', 'y,-x,-z', 'x-0.5,y,-z-0.25', '-y-0.5,x+0.5,-z-0.5', 'x+0.5,y+0.5,z+0.5',
+ '-y+0.5,x+1,z+0.75', '-x+1,-y+1,z+1', 'y+1,-x+0.5,z+1.25', '-x+0.5,-y+1,-z+0.75',
+ 'y+0.5,-x+0.5,-z+0.5', 'x,y+0.5,-z+0.25', '-y,x+1,-z']
+ ncsym: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ '-x,-y+0.5,-z+0.25', 'y,-x,-z', 'x-0.5,y,-z-0.25', '-y-0.5,x+0.5,-z-0.5']
+ number: 88
+ schoenflies: C4h^6
+ universal_h_m: I 41/a :1
+ P422:
+ spacegroup: P422
+ crystal_class: tetragonal
+ hall: ' P 4 2'
+ hermann_mauguin: P 4 2 2
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z']
+ number: 89
+ schoenflies: D4^1
+ universal_h_m: P 4 2 2
+ P4212:
+ spacegroup: P4212
+ crystal_class: tetragonal
+ hall: ' P 4ab 2ab'
+ hermann_mauguin: P 4 21 2
+ symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,-z',
+ 'y,x,-z', '-x+0.5,y+0.5,-z', '-y,-x,-z']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,-z',
+ 'y,x,-z', '-x+0.5,y+0.5,-z', '-y,-x,-z']
+ number: 90
+ schoenflies: D4^2
+ universal_h_m: P 4 21 2
+ P4122:
+ spacegroup: P4122
+ crystal_class: tetragonal
+ hall: ' P 4w 2c'
+ hermann_mauguin: P 41 2 2
+ symops: ['x,y,z', '-y,x,z+0.25', '-x,-y,z+0.5', 'y,-x,z+0.75', 'x,-y,-z+0.5',
+ 'y,x,-z+0.75', '-x,y,-z', '-y,-x,-z+0.25']
+ ncsym: ['x,y,z', '-y,x,z+0.25', '-x,-y,z+0.5', 'y,-x,z+0.75', 'x,-y,-z+0.5', 'y,x,-z+0.75',
+ '-x,y,-z', '-y,-x,-z+0.25']
+ number: 91
+ schoenflies: D4^3
+ universal_h_m: P 41 2 2
+ P41212:
+ spacegroup: P41212
+ crystal_class: tetragonal
+ hall: ' P 4abw 2nw'
+ hermann_mauguin: P 41 21 2
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.25', '-x,-y,z+0.5', 'y+0.5,-x+0.5,z+0.75',
+ 'x+0.5,-y+0.5,-z+0.75', 'y,x,-z', '-x+0.5,y+0.5,-z+0.25', '-y,-x,-z+0.5']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.25', '-x,-y,z+0.5', 'y+0.5,-x+0.5,z+0.75',
+ 'x+0.5,-y+0.5,-z+0.75', 'y,x,-z', '-x+0.5,y+0.5,-z+0.25', '-y,-x,-z+0.5']
+ number: 92
+ schoenflies: D4^4
+ universal_h_m: P 41 21 2
+ P4222:
+ spacegroup: P4222
+ crystal_class: tetragonal
+ hall: ' P 4c 2'
+ hermann_mauguin: P 42 2 2
+ symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', 'x,-y,-z', 'y,x,-z+0.5',
+ '-x,y,-z', '-y,-x,-z+0.5']
+ ncsym: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', 'x,-y,-z', 'y,x,-z+0.5',
+ '-x,y,-z', '-y,-x,-z+0.5']
+ number: 93
+ schoenflies: D4^5
+ universal_h_m: P 42 2 2
+ P42212:
+ spacegroup: P42212
+ crystal_class: tetragonal
+ hall: ' P 4n 2n'
+ hermann_mauguin: P 42 21 2
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5',
+ 'y,x,-z', '-x+0.5,y+0.5,-z+0.5', '-y,-x,-z']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5',
+ 'y,x,-z', '-x+0.5,y+0.5,-z+0.5', '-y,-x,-z']
+ number: 94
+ schoenflies: D4^6
+ universal_h_m: P 42 21 2
+ P4322:
+ spacegroup: P4322
+ crystal_class: tetragonal
+ hall: ' P 4cw 2c'
+ hermann_mauguin: P 43 2 2
+ symops: ['x,y,z', '-y,x,z+0.75', '-x,-y,z+0.5', 'y,-x,z+0.25', 'x,-y,-z+0.5',
+ 'y,x,-z+0.25', '-x,y,-z', '-y,-x,-z+0.75']
+ ncsym: ['x,y,z', '-y,x,z+0.75', '-x,-y,z+0.5', 'y,-x,z+0.25', 'x,-y,-z+0.5', 'y,x,-z+0.25',
+ '-x,y,-z', '-y,-x,-z+0.75']
+ number: 95
+ schoenflies: D4^7
+ universal_h_m: P 43 2 2
+ P43212:
+ spacegroup: P43212
+ crystal_class: tetragonal
+ hall: ' P 4nw 2abw'
+ hermann_mauguin: P 43 21 2
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.75', '-x,-y,z+0.5', 'y+0.5,-x+0.5,z+0.25',
+ 'x+0.5,-y+0.5,-z+0.25', 'y,x,-z', '-x+0.5,y+0.5,-z+0.75', '-y,-x,-z+0.5']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.75', '-x,-y,z+0.5', 'y+0.5,-x+0.5,z+0.25',
+ 'x+0.5,-y+0.5,-z+0.25', 'y,x,-z', '-x+0.5,y+0.5,-z+0.75', '-y,-x,-z+0.5']
+ number: 96
+ schoenflies: D4^8
+ universal_h_m: P 43 21 2
+ I422:
+ spacegroup: I422
+ crystal_class: tetragonal
+ hall: ' I 4 2'
+ hermann_mauguin: I 4 2 2
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,-x+0.5,-z+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z']
+ number: 97
+ schoenflies: D4^9
+ universal_h_m: I 4 2 2
+ I4122:
+ spacegroup: I4122
+ crystal_class: tetragonal
+ hall: ' I 4bw 2bw'
+ hermann_mauguin: I 41 2 2
+ symops: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ 'x,-y+0.5,-z+0.25', 'y+0.5,x+0.5,-z+0.5', '-x+0.5,y,-z+0.75', '-y,-x,-z', 'x+0.5,y+0.5,z+0.5',
+ '-y+0.5,x+1,z+0.75', '-x+1,-y+1,z+1', 'y+1,-x+0.5,z+1.25', 'x+0.5,-y+1,-z+0.75',
+ 'y+1,x+1,-z+1', '-x+1,y+0.5,-z+1.25', '-y+0.5,-x+0.5,-z+0.5']
+ ncsym: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ 'x,-y+0.5,-z+0.25', 'y+0.5,x+0.5,-z+0.5', '-x+0.5,y,-z+0.75', '-y,-x,-z']
+ number: 98
+ schoenflies: D4^10
+ universal_h_m: I 41 2 2
+ P4mm:
+ spacegroup: P4mm
+ crystal_class: tetragonal
+ hall: ' P 4 -2'
+ hermann_mauguin: P 4 m m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,y,z', '-y,-x,z', 'x,-y,z',
+ 'y,x,z']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,y,z', '-y,-x,z', 'x,-y,z',
+ 'y,x,z']
+ number: 99
+ schoenflies: C4v^1
+ universal_h_m: P 4 m m
+ P4bm:
+ spacegroup: P4bm
+ crystal_class: tetragonal
+ hall: ' P 4 -2ab'
+ hermann_mauguin: P 4 b m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x+0.5,y+0.5,z', '-y+0.5,-x+0.5,z',
+ 'x+0.5,-y+0.5,z', 'y+0.5,x+0.5,z']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x+0.5,y+0.5,z', '-y+0.5,-x+0.5,z',
+ 'x+0.5,-y+0.5,z', 'y+0.5,x+0.5,z']
+ number: 100
+ schoenflies: C4v^2
+ universal_h_m: P 4 b m
+ P42cm:
+ spacegroup: P42cm
+ crystal_class: tetragonal
+ hall: ' P 4c -2c'
+ hermann_mauguin: P 42 c m
+ symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-x,y,z+0.5', '-y,-x,z',
+ 'x,-y,z+0.5', 'y,x,z']
+ ncsym: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-x,y,z+0.5', '-y,-x,z',
+ 'x,-y,z+0.5', 'y,x,z']
+ number: 101
+ schoenflies: C4v^3
+ universal_h_m: P 42 c m
+ P42nm:
+ spacegroup: P42nm
+ crystal_class: tetragonal
+ hall: ' P 4n -2n'
+ hermann_mauguin: P 42 n m
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', '-x+0.5,y+0.5,z+0.5',
+ '-y,-x,z', 'x+0.5,-y+0.5,z+0.5', 'y,x,z']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', '-x+0.5,y+0.5,z+0.5',
+ '-y,-x,z', 'x+0.5,-y+0.5,z+0.5', 'y,x,z']
+ number: 102
+ schoenflies: C4v^4
+ universal_h_m: P 42 n m
+ P4cc:
+ spacegroup: P4cc
+ crystal_class: tetragonal
+ hall: ' P 4 -2c'
+ hermann_mauguin: P 4 c c
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,y,z+0.5', '-y,-x,z+0.5',
+ 'x,-y,z+0.5', 'y,x,z+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,z+0.5',
+ 'y,x,z+0.5']
+ number: 103
+ schoenflies: C4v^5
+ universal_h_m: P 4 c c
+ P4nc:
+ spacegroup: P4nc
+ crystal_class: tetragonal
+ hall: ' P 4 -2n'
+ hermann_mauguin: P 4 n c
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x+0.5,y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5',
+ 'x+0.5,-y+0.5,z+0.5', 'y+0.5,x+0.5,z+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x+0.5,y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5',
+ 'x+0.5,-y+0.5,z+0.5', 'y+0.5,x+0.5,z+0.5']
+ number: 104
+ schoenflies: C4v^6
+ universal_h_m: P 4 n c
+ P42mc:
+ spacegroup: P42mc
+ crystal_class: tetragonal
+ hall: ' P 4c -2'
+ hermann_mauguin: P 42 m c
+ symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-x,y,z', '-y,-x,z+0.5',
+ 'x,-y,z', 'y,x,z+0.5']
+ ncsym: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-x,y,z', '-y,-x,z+0.5',
+ 'x,-y,z', 'y,x,z+0.5']
+ number: 105
+ schoenflies: C4v^7
+ universal_h_m: P 42 m c
+ P42bc:
+ spacegroup: P42bc
+ crystal_class: tetragonal
+ hall: ' P 4c -2ab'
+ hermann_mauguin: P 42 b c
+ symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-x+0.5,y+0.5,z', '-y+0.5,-x+0.5,z+0.5',
+ 'x+0.5,-y+0.5,z', 'y+0.5,x+0.5,z+0.5']
+ ncsym: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-x+0.5,y+0.5,z', '-y+0.5,-x+0.5,z+0.5',
+ 'x+0.5,-y+0.5,z', 'y+0.5,x+0.5,z+0.5']
+ number: 106
+ schoenflies: C4v^8
+ universal_h_m: P 42 b c
+ I4mm:
+ spacegroup: I4mm
+ crystal_class: tetragonal
+ hall: ' I 4 -2'
+ hermann_mauguin: I 4 m m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,y,z', '-y,-x,z', 'x,-y,z',
+ 'y,x,z', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x+0.5,z+0.5',
+ '-x+0.5,y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'y+0.5,x+0.5,z+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,y,z', '-y,-x,z', 'x,-y,z',
+ 'y,x,z']
+ number: 107
+ schoenflies: C4v^9
+ universal_h_m: I 4 m m
+ I4cm:
+ spacegroup: I4cm
+ crystal_class: tetragonal
+ hall: ' I 4 -2c'
+ hermann_mauguin: I 4 c m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,y,z+0.5', '-y,-x,z+0.5',
+ 'x,-y,z+0.5', 'y,x,z+0.5', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,-x+0.5,z+0.5', '-x+0.5,y+0.5,z+1', '-y+0.5,-x+0.5,z+1', 'x+0.5,-y+0.5,z+1',
+ 'y+0.5,x+0.5,z+1']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,z+0.5',
+ 'y,x,z+0.5']
+ number: 108
+ schoenflies: C4v^10
+ universal_h_m: I 4 c m
+ I41md:
+ spacegroup: I41md
+ crystal_class: tetragonal
+ hall: ' I 4bw -2'
+ hermann_mauguin: I 41 m d
+ symops: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ '-x,y,z', '-y,-x+0.5,z+0.25', 'x+0.5,-y+0.5,z+0.5', 'y+0.5,x,z+0.75', 'x+0.5,y+0.5,z+0.5',
+ '-y+0.5,x+1,z+0.75', '-x+1,-y+1,z+1', 'y+1,-x+0.5,z+1.25', '-x+0.5,y+0.5,z+0.5',
+ '-y+0.5,-x+1,z+0.75', 'x+1,-y+1,z+1', 'y+1,x+0.5,z+1.25']
+ ncsym: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ '-x,y,z', '-y,-x+0.5,z+0.25', 'x+0.5,-y+0.5,z+0.5', 'y+0.5,x,z+0.75']
+ number: 109
+ schoenflies: C4v^11
+ universal_h_m: I 41 m d
+ I41cd:
+ spacegroup: I41cd
+ crystal_class: tetragonal
+ hall: ' I 4bw -2c'
+ hermann_mauguin: I 41 c d
+ symops: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ '-x,y,z+0.5', '-y,-x+0.5,z+0.75', 'x+0.5,-y+0.5,z', 'y+0.5,x,z+0.25', 'x+0.5,y+0.5,z+0.5',
+ '-y+0.5,x+1,z+0.75', '-x+1,-y+1,z+1', 'y+1,-x+0.5,z+1.25', '-x+0.5,y+0.5,z+1',
+ '-y+0.5,-x+1,z+1.25', 'x+1,-y+1,z+0.5', 'y+1,x+0.5,z+0.75']
+ ncsym: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ '-x,y,z+0.5', '-y,-x+0.5,z+0.75', 'x+0.5,-y+0.5,z', 'y+0.5,x,z+0.25']
+ number: 110
+ schoenflies: C4v^12
+ universal_h_m: I 41 c d
+ P-42m:
+ spacegroup: P-42m
+ crystal_class: tetragonal
+ hall: ' P -4 2'
+ hermann_mauguin: P -4 2 m
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z']
+ number: 111
+ schoenflies: D2d^1
+ universal_h_m: P -4 2 m
+ P-42c:
+ spacegroup: P-42c
+ crystal_class: tetragonal
+ hall: ' P -4 2c'
+ hermann_mauguin: P -4 2 c
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z+0.5', '-y,-x,z+0.5',
+ '-x,y,-z+0.5', 'y,x,z+0.5']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z+0.5', '-y,-x,z+0.5',
+ '-x,y,-z+0.5', 'y,x,z+0.5']
+ number: 112
+ schoenflies: D2d^2
+ universal_h_m: P -4 2 c
+ P-421m:
+ spacegroup: P-421m
+ crystal_class: tetragonal
+ hall: ' P -4 2ab'
+ hermann_mauguin: P -4 21 m
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x+0.5,-y+0.5,-z', '-y+0.5,-x+0.5,z',
+ '-x+0.5,y+0.5,-z', 'y+0.5,x+0.5,z']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x+0.5,-y+0.5,-z', '-y+0.5,-x+0.5,z',
+ '-x+0.5,y+0.5,-z', 'y+0.5,x+0.5,z']
+ number: 113
+ schoenflies: D2d^3
+ universal_h_m: P -4 21 m
+ P-421c:
+ spacegroup: P-421c
+ crystal_class: tetragonal
+ hall: ' P -4 2n'
+ hermann_mauguin: P -4 21 c
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x+0.5,-y+0.5,-z+0.5', '-y+0.5,-x+0.5,z+0.5',
+ '-x+0.5,y+0.5,-z+0.5', 'y+0.5,x+0.5,z+0.5']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x+0.5,-y+0.5,-z+0.5', '-y+0.5,-x+0.5,z+0.5',
+ '-x+0.5,y+0.5,-z+0.5', 'y+0.5,x+0.5,z+0.5']
+ number: 114
+ schoenflies: D2d^4
+ universal_h_m: P -4 21 c
+ P-4m2:
+ spacegroup: P-4m2
+ crystal_class: tetragonal
+ hall: ' P -4 -2'
+ hermann_mauguin: P -4 m 2
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x,y,z', 'y,x,-z', 'x,-y,z',
+ '-y,-x,-z']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x,y,z', 'y,x,-z', 'x,-y,z',
+ '-y,-x,-z']
+ number: 115
+ schoenflies: D2d^5
+ universal_h_m: P -4 m 2
+ P-4c2:
+ spacegroup: P-4c2
+ crystal_class: tetragonal
+ hall: ' P -4 -2c'
+ hermann_mauguin: P -4 c 2
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x,y,z+0.5', 'y,x,-z+0.5',
+ 'x,-y,z+0.5', '-y,-x,-z+0.5']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x,y,z+0.5', 'y,x,-z+0.5',
+ 'x,-y,z+0.5', '-y,-x,-z+0.5']
+ number: 116
+ schoenflies: D2d^6
+ universal_h_m: P -4 c 2
+ P-4b2:
+ spacegroup: P-4b2
+ crystal_class: tetragonal
+ hall: ' P -4 -2ab'
+ hermann_mauguin: P -4 b 2
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x+0.5,y+0.5,z', 'y+0.5,x+0.5,-z',
+ 'x+0.5,-y+0.5,z', '-y+0.5,-x+0.5,-z']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x+0.5,y+0.5,z', 'y+0.5,x+0.5,-z',
+ 'x+0.5,-y+0.5,z', '-y+0.5,-x+0.5,-z']
+ number: 117
+ schoenflies: D2d^7
+ universal_h_m: P -4 b 2
+ P-4n2:
+ spacegroup: P-4n2
+ crystal_class: tetragonal
+ hall: ' P -4 -2n'
+ hermann_mauguin: P -4 n 2
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x+0.5,y+0.5,z+0.5', 'y+0.5,x+0.5,-z+0.5',
+ 'x+0.5,-y+0.5,z+0.5', '-y+0.5,-x+0.5,-z+0.5']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x+0.5,y+0.5,z+0.5', 'y+0.5,x+0.5,-z+0.5',
+ 'x+0.5,-y+0.5,z+0.5', '-y+0.5,-x+0.5,-z+0.5']
+ number: 118
+ schoenflies: D2d^8
+ universal_h_m: P -4 n 2
+ I-4m2:
+ spacegroup: I-4m2
+ crystal_class: tetragonal
+ hall: ' I -4 -2'
+ hermann_mauguin: I -4 m 2
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x,y,z', 'y,x,-z', 'x,-y,z',
+ '-y,-x,-z', 'x+0.5,y+0.5,z+0.5', 'y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', 'y+0.5,x+0.5,-z+0.5', 'x+0.5,-y+0.5,z+0.5',
+ '-y+0.5,-x+0.5,-z+0.5']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x,y,z', 'y,x,-z', 'x,-y,z',
+ '-y,-x,-z']
+ number: 119
+ schoenflies: D2d^9
+ universal_h_m: I -4 m 2
+ I-4c2:
+ spacegroup: I-4c2
+ crystal_class: tetragonal
+ hall: ' I -4 -2c'
+ hermann_mauguin: I -4 c 2
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x,y,z+0.5', 'y,x,-z+0.5',
+ 'x,-y,z+0.5', '-y,-x,-z+0.5', 'x+0.5,y+0.5,z+0.5', 'y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,z+1', 'y+0.5,x+0.5,-z+1', 'x+0.5,-y+0.5,z+1',
+ '-y+0.5,-x+0.5,-z+1']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', '-x,y,z+0.5', 'y,x,-z+0.5',
+ 'x,-y,z+0.5', '-y,-x,-z+0.5']
+ number: 120
+ schoenflies: D2d^10
+ universal_h_m: I -4 c 2
+ I-42m:
+ spacegroup: I-42m
+ crystal_class: tetragonal
+ hall: ' I -4 2'
+ hermann_mauguin: I -4 2 m
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z', 'x+0.5,y+0.5,z+0.5', 'y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-y+0.5,-x+0.5,z+0.5', '-x+0.5,y+0.5,-z+0.5',
+ 'y+0.5,x+0.5,z+0.5']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z']
+ number: 121
+ schoenflies: D2d^11
+ universal_h_m: I -4 2 m
+ I-42d:
+ spacegroup: I-42d
+ crystal_class: tetragonal
+ hall: ' I -4 2bw'
+ hermann_mauguin: I -4 2 d
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y+0.5,-z+0.25', '-y+0.5,-x,z+0.75',
+ '-x,y+0.5,-z+0.25', 'y+0.5,x,z+0.75', 'x+0.5,y+0.5,z+0.5', 'y+0.5,-x+0.5,-z+0.5',
+ '-x+0.5,-y+0.5,z+0.5', '-y+0.5,x+0.5,-z+0.5', 'x+0.5,-y+1,-z+0.75', '-y+1,-x+0.5,z+1.25',
+ '-x+0.5,y+1,-z+0.75', 'y+1,x+0.5,z+1.25']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y+0.5,-z+0.25', '-y+0.5,-x,z+0.75',
+ '-x,y+0.5,-z+0.25', 'y+0.5,x,z+0.75']
+ number: 122
+ schoenflies: D2d^12
+ universal_h_m: I -4 2 d
+ P4/mmm:
+ spacegroup: P4/mmm
+ crystal_class: tetragonal
+ hall: -P 4 2
+ hermann_mauguin: P 4/m m m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z']
+ number: 123
+ schoenflies: D4h^1
+ universal_h_m: P 4/m m m
+ P4/mcc:
+ spacegroup: P4/mcc
+ crystal_class: tetragonal
+ hall: -P 4 2c
+ hermann_mauguin: P 4/m c c
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z+0.5', 'y,x,-z+0.5',
+ '-x,y,-z+0.5', '-y,-x,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z-0.5',
+ '-y,-x,z-0.5', 'x,-y,z-0.5', 'y,x,z-0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z+0.5', 'y,x,-z+0.5', '-x,y,-z+0.5',
+ '-y,-x,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z-0.5', '-y,-x,z-0.5',
+ 'x,-y,z-0.5', 'y,x,z-0.5']
+ number: 124
+ schoenflies: D4h^2
+ universal_h_m: P 4/m c c
+ P4/nbm:
+ spacegroup: P4/nbm
+ crystal_class: tetragonal
+ hall: ' P 4 2 -1ab'
+ hermann_mauguin: P 4/n b m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', '-x+0.5,-y+0.5,-z', 'y+0.5,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x+0.5,-z',
+ '-x+0.5,y+0.5,z', '-y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,z', 'y+0.5,x+0.5,z']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', '-x+0.5,-y+0.5,-z', 'y+0.5,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x+0.5,-z',
+ '-x+0.5,y+0.5,z', '-y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,z', 'y+0.5,x+0.5,z']
+ number: 125
+ schoenflies: D4h^3
+ universal_h_m: P 4/n b m :1
+ P4/nnc:
+ spacegroup: P4/nnc
+ crystal_class: tetragonal
+ hall: ' P 4 2 -1n'
+ hermann_mauguin: P 4/n n c
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,x+0.5,z+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,x+0.5,z+0.5']
+ number: 126
+ schoenflies: D4h^4
+ universal_h_m: P 4/n n c :1
+ P4/mbm:
+ spacegroup: P4/mbm
+ crystal_class: tetragonal
+ hall: -P 4 2ab
+ hermann_mauguin: P 4/m b m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x+0.5,-y+0.5,-z', 'y+0.5,x+0.5,-z',
+ '-x+0.5,y+0.5,-z', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z',
+ '-x-0.5,y-0.5,z', '-y-0.5,-x-0.5,z', 'x-0.5,-y-0.5,z', 'y-0.5,x-0.5,z']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x+0.5,-y+0.5,-z', 'y+0.5,x+0.5,-z',
+ '-x+0.5,y+0.5,-z', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z',
+ '-x-0.5,y-0.5,z', '-y-0.5,-x-0.5,z', 'x-0.5,-y-0.5,z', 'y-0.5,x-0.5,z']
+ number: 127
+ schoenflies: D4h^5
+ universal_h_m: P 4/m b m
+ P4/mnc:
+ spacegroup: P4/mnc
+ crystal_class: tetragonal
+ hall: -P 4 2n
+ hermann_mauguin: P 4/m n c
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x+0.5,-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5',
+ '-x+0.5,y+0.5,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z',
+ '-y,x,-z', '-x-0.5,y-0.5,z-0.5', '-y-0.5,-x-0.5,z-0.5', 'x-0.5,-y-0.5,z-0.5',
+ 'y-0.5,x-0.5,z-0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x+0.5,-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5',
+ '-x+0.5,y+0.5,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z',
+ '-y,x,-z', '-x-0.5,y-0.5,z-0.5', '-y-0.5,-x-0.5,z-0.5', 'x-0.5,-y-0.5,z-0.5',
+ 'y-0.5,x-0.5,z-0.5']
+ number: 128
+ schoenflies: D4h^6
+ universal_h_m: P 4/m n c
+ P4/nmm:
+ spacegroup: P4/nmm
+ crystal_class: tetragonal
+ hall: ' P 4ab 2ab -1ab'
+ hermann_mauguin: P 4/n m m
+ symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,-z',
+ 'y,x,-z', '-x+0.5,y+0.5,-z', '-y,-x,-z', '-x+0.5,-y+0.5,-z', 'y,-x,-z', 'x+0.5,y+0.5,-z',
+ '-y,x,-z', '-x,y,z', '-y+0.5,-x+0.5,z', 'x,-y,z', 'y+0.5,x+0.5,z']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,-z',
+ 'y,x,-z', '-x+0.5,y+0.5,-z', '-y,-x,-z', '-x+0.5,-y+0.5,-z', 'y,-x,-z', 'x+0.5,y+0.5,-z',
+ '-y,x,-z', '-x,y,z', '-y+0.5,-x+0.5,z', 'x,-y,z', 'y+0.5,x+0.5,z']
+ number: 129
+ schoenflies: D4h^7
+ universal_h_m: P 4/n m m :1
+ P4/ncc:
+ spacegroup: P4/ncc
+ crystal_class: tetragonal
+ hall: ' P 4ab 2n -1ab'
+ hermann_mauguin: P 4/n c c
+ symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,-z+0.5',
+ 'y,x,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-y,-x,-z+0.5', '-x+0.5,-y+0.5,-z', 'y,-x,-z',
+ 'x+0.5,y+0.5,-z', '-y,x,-z', '-x,y,z-0.5', '-y+0.5,-x+0.5,z-0.5', 'x,-y,z-0.5',
+ 'y+0.5,x+0.5,z-0.5']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,-z+0.5',
+ 'y,x,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-y,-x,-z+0.5', '-x+0.5,-y+0.5,-z', 'y,-x,-z',
+ 'x+0.5,y+0.5,-z', '-y,x,-z', '-x,y,z-0.5', '-y+0.5,-x+0.5,z-0.5', 'x,-y,z-0.5',
+ 'y+0.5,x+0.5,z-0.5']
+ number: 130
+ schoenflies: D4h^8
+ universal_h_m: P 4/n c c :1
+ P42/mmc:
+ spacegroup: P42/mmc
+ crystal_class: tetragonal
+ hall: -P 4c 2
+ hermann_mauguin: P 42/m m c
+ symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', 'x,-y,-z', 'y,x,-z+0.5',
+ '-x,y,-z', '-y,-x,-z+0.5', '-x,-y,-z', 'y,-x,-z-0.5', 'x,y,-z', '-y,x,-z-0.5',
+ '-x,y,z', '-y,-x,z-0.5', 'x,-y,z', 'y,x,z-0.5']
+ ncsym: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', 'x,-y,-z', 'y,x,-z+0.5',
+ '-x,y,-z', '-y,-x,-z+0.5', '-x,-y,-z', 'y,-x,-z-0.5', 'x,y,-z', '-y,x,-z-0.5',
+ '-x,y,z', '-y,-x,z-0.5', 'x,-y,z', 'y,x,z-0.5']
+ number: 131
+ schoenflies: D4h^9
+ universal_h_m: P 42/m m c
+ P42/mcm:
+ spacegroup: P42/mcm
+ crystal_class: tetragonal
+ hall: -P 4c 2c
+ hermann_mauguin: P 42/m c m
+ symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', 'x,-y,-z+0.5', 'y,x,-z',
+ '-x,y,-z+0.5', '-y,-x,-z', '-x,-y,-z', 'y,-x,-z-0.5', 'x,y,-z', '-y,x,-z-0.5',
+ '-x,y,z-0.5', '-y,-x,z', 'x,-y,z-0.5', 'y,x,z']
+ ncsym: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', 'x,-y,-z+0.5', 'y,x,-z',
+ '-x,y,-z+0.5', '-y,-x,-z', '-x,-y,-z', 'y,-x,-z-0.5', 'x,y,-z', '-y,x,-z-0.5',
+ '-x,y,z-0.5', '-y,-x,z', 'x,-y,z-0.5', 'y,x,z']
+ number: 132
+ schoenflies: D4h^10
+ universal_h_m: P 42/m c m
+ P42/nbc:
+ spacegroup: P42/nbc
+ crystal_class: tetragonal
+ hall: ' P 4n 2c -1n'
+ hermann_mauguin: P 42/n b c
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z+0.5',
+ 'y+0.5,x+0.5,-z', '-x,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x+0.5,-y+0.5,-z+0.5',
+ 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x+0.5,y+0.5,z', '-y,-x,z+0.5',
+ 'x+0.5,-y+0.5,z', 'y,x,z+0.5']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z+0.5',
+ 'y+0.5,x+0.5,-z', '-x,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x+0.5,-y+0.5,-z+0.5',
+ 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x+0.5,y+0.5,z', '-y,-x,z+0.5',
+ 'x+0.5,-y+0.5,z', 'y,x,z+0.5']
+ number: 133
+ schoenflies: D4h^11
+ universal_h_m: P 42/n b c :1
+ P42/nnm:
+ spacegroup: P42/nnm
+ crystal_class: tetragonal
+ hall: ' P 4n 2 -1n'
+ hermann_mauguin: P 42/n n m
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z',
+ 'y+0.5,x+0.5,-z+0.5', '-x,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5',
+ 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x+0.5,y+0.5,z+0.5', '-y,-x,z',
+ 'x+0.5,-y+0.5,z+0.5', 'y,x,z']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z',
+ 'y+0.5,x+0.5,-z+0.5', '-x,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5',
+ 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x+0.5,y+0.5,z+0.5', '-y,-x,z',
+ 'x+0.5,-y+0.5,z+0.5', 'y,x,z']
+ number: 134
+ schoenflies: D4h^12
+ universal_h_m: P 42/n n m :1
+ P42/mbc:
+ spacegroup: P42/mbc
+ crystal_class: tetragonal
+ hall: -P 4c 2ab
+ hermann_mauguin: P 42/m b c
+ symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', 'x+0.5,-y+0.5,-z', 'y+0.5,x+0.5,-z+0.5',
+ '-x+0.5,y+0.5,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y,-x,-z-0.5', 'x,y,-z',
+ '-y,x,-z-0.5', '-x-0.5,y-0.5,z', '-y-0.5,-x-0.5,z-0.5', 'x-0.5,-y-0.5,z', 'y-0.5,x-0.5,z-0.5']
+ ncsym: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', 'x+0.5,-y+0.5,-z', 'y+0.5,x+0.5,-z+0.5',
+ '-x+0.5,y+0.5,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y,-x,-z-0.5', 'x,y,-z',
+ '-y,x,-z-0.5', '-x-0.5,y-0.5,z', '-y-0.5,-x-0.5,z-0.5', 'x-0.5,-y-0.5,z', 'y-0.5,x-0.5,z-0.5']
+ number: 135
+ schoenflies: D4h^13
+ universal_h_m: P 42/m b c
+ P42/mnm:
+ spacegroup: P42/mnm
+ crystal_class: tetragonal
+ hall: -P 4n 2n
+ hermann_mauguin: P 42/m n m
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5',
+ 'y,x,-z', '-x+0.5,y+0.5,-z+0.5', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x-0.5,-z-0.5',
+ 'x,y,-z', '-y-0.5,x-0.5,-z-0.5', '-x-0.5,y-0.5,z-0.5', '-y,-x,z', 'x-0.5,-y-0.5,z-0.5',
+ 'y,x,z']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5',
+ 'y,x,-z', '-x+0.5,y+0.5,-z+0.5', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x-0.5,-z-0.5',
+ 'x,y,-z', '-y-0.5,x-0.5,-z-0.5', '-x-0.5,y-0.5,z-0.5', '-y,-x,z', 'x-0.5,-y-0.5,z-0.5',
+ 'y,x,z']
+ number: 136
+ schoenflies: D4h^14
+ universal_h_m: P 42/m n m
+ P42/nmc:
+ spacegroup: P42/nmc
+ crystal_class: tetragonal
+ hall: ' P 4n 2n -1n'
+ hermann_mauguin: P 42/n m c
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5',
+ 'y,x,-z', '-x+0.5,y+0.5,-z+0.5', '-y,-x,-z', '-x+0.5,-y+0.5,-z+0.5', 'y,-x,-z',
+ 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x,y,z', '-y+0.5,-x+0.5,z+0.5', 'x,-y,z',
+ 'y+0.5,x+0.5,z+0.5']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5',
+ 'y,x,-z', '-x+0.5,y+0.5,-z+0.5', '-y,-x,-z', '-x+0.5,-y+0.5,-z+0.5', 'y,-x,-z',
+ 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x,y,z', '-y+0.5,-x+0.5,z+0.5', 'x,-y,z',
+ 'y+0.5,x+0.5,z+0.5']
+ number: 137
+ schoenflies: D4h^15
+ universal_h_m: P 42/n m c :1
+ P42/ncm:
+ spacegroup: P42/ncm
+ crystal_class: tetragonal
+ hall: ' P 4n 2ab -1n'
+ hermann_mauguin: P 42/n c m
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z',
+ 'y,x,-z+0.5', '-x+0.5,y+0.5,-z', '-y,-x,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'y,-x,-z',
+ 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x,y,z+0.5', '-y+0.5,-x+0.5,z', 'x,-y,z+0.5',
+ 'y+0.5,x+0.5,z']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z',
+ 'y,x,-z+0.5', '-x+0.5,y+0.5,-z', '-y,-x,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'y,-x,-z',
+ 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x,y,z+0.5', '-y+0.5,-x+0.5,z', 'x,-y,z+0.5',
+ 'y+0.5,x+0.5,z']
+ number: 138
+ schoenflies: D4h^16
+ universal_h_m: P 42/n c m :1
+ I4/mmm:
+ spacegroup: I4/mmm
+ crystal_class: tetragonal
+ hall: -I 4 2
+ hermann_mauguin: I 4/m m m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,x+0.5,z+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z']
+ number: 139
+ schoenflies: D4h^17
+ universal_h_m: I 4/m m m
+ I4/mcm:
+ spacegroup: I4/mcm
+ crystal_class: tetragonal
+ hall: -I 4 2c
+ hermann_mauguin: I 4/m c m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z+0.5', 'y,x,-z+0.5',
+ '-x,y,-z+0.5', '-y,-x,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z-0.5',
+ '-y,-x,z-0.5', 'x,-y,z-0.5', 'y,x,z-0.5', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+0.5,z+0.5',
+ '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+1', 'y+0.5,x+0.5,-z+1',
+ '-x+0.5,y+0.5,-z+1', '-y+0.5,-x+0.5,-z+1', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z+0.5',
+ 'x+0.5,y+0.5,-z+0.5', '-y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,z', '-y+0.5,-x+0.5,z',
+ 'x+0.5,-y+0.5,z', 'y+0.5,x+0.5,z']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z+0.5', 'y,x,-z+0.5', '-x,y,-z+0.5',
+ '-y,-x,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z-0.5', '-y,-x,z-0.5',
+ 'x,-y,z-0.5', 'y,x,z-0.5']
+ number: 140
+ schoenflies: D4h^18
+ universal_h_m: I 4/m c m
+ I41/amd:
+ spacegroup: I41/amd
+ crystal_class: tetragonal
+ hall: ' I 4bw 2bw -1bw'
+ hermann_mauguin: I 41/a m d
+ symops: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ 'x,-y+0.5,-z+0.25', 'y+0.5,x+0.5,-z+0.5', '-x+0.5,y,-z+0.75', '-y,-x,-z', '-x,-y+0.5,-z+0.25',
+ 'y,-x,-z', 'x-0.5,y,-z-0.25', '-y-0.5,x+0.5,-z-0.5', '-x,y,z', '-y-0.5,-x,z-0.25',
+ 'x-0.5,-y+0.5,z-0.5', 'y,x+0.5,z+0.25', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+1,z+0.75',
+ '-x+1,-y+1,z+1', 'y+1,-x+0.5,z+1.25', 'x+0.5,-y+1,-z+0.75', 'y+1,x+1,-z+1',
+ '-x+1,y+0.5,-z+1.25', '-y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+1,-z+0.75', 'y+0.5,-x+0.5,-z+0.5',
+ 'x,y+0.5,-z+0.25', '-y,x+1,-z', '-x+0.5,y+0.5,z+0.5', '-y,-x+0.5,z+0.25', 'x,-y+1,z',
+ 'y+0.5,x+1,z+0.75']
+ ncsym: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ 'x,-y+0.5,-z+0.25', 'y+0.5,x+0.5,-z+0.5', '-x+0.5,y,-z+0.75', '-y,-x,-z', '-x,-y+0.5,-z+0.25',
+ 'y,-x,-z', 'x-0.5,y,-z-0.25', '-y-0.5,x+0.5,-z-0.5', '-x,y,z', '-y-0.5,-x,z-0.25',
+ 'x-0.5,-y+0.5,z-0.5', 'y,x+0.5,z+0.25']
+ number: 141
+ schoenflies: D4h^19
+ universal_h_m: I 41/a m d :1
+ I41/acd:
+ spacegroup: I41/acd
+ crystal_class: tetragonal
+ hall: ' I 4bw 2aw -1bw'
+ hermann_mauguin: I 41/a c d
+ symops: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ 'x+0.5,-y,-z+0.25', 'y,x,-z+0.5', '-x,y+0.5,-z+0.75', '-y+0.5,-x+0.5,-z', '-x,-y+0.5,-z+0.25',
+ 'y,-x,-z', 'x-0.5,y,-z-0.25', '-y-0.5,x+0.5,-z-0.5', '-x-0.5,y+0.5,z', '-y,-x+0.5,z-0.25',
+ 'x,-y,z-0.5', 'y-0.5,x,z+0.25', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+1,z+0.75', '-x+1,-y+1,z+1',
+ 'y+1,-x+0.5,z+1.25', 'x+1,-y+0.5,-z+0.75', 'y+0.5,x+0.5,-z+1', '-x+0.5,y+1,-z+1.25',
+ '-y+1,-x+1,-z+0.5', '-x+0.5,-y+1,-z+0.75', 'y+0.5,-x+0.5,-z+0.5', 'x,y+0.5,-z+0.25',
+ '-y,x+1,-z', '-x,y+1,z+0.5', '-y+0.5,-x+1,z+0.25', 'x+0.5,-y+0.5,z', 'y,x+0.5,z+0.75']
+ ncsym: ['x,y,z', '-y,x+0.5,z+0.25', '-x+0.5,-y+0.5,z+0.5', 'y+0.5,-x,z+0.75',
+ 'x+0.5,-y,-z+0.25', 'y,x,-z+0.5', '-x,y+0.5,-z+0.75', '-y+0.5,-x+0.5,-z', '-x,-y+0.5,-z+0.25',
+ 'y,-x,-z', 'x-0.5,y,-z-0.25', '-y-0.5,x+0.5,-z-0.5', '-x-0.5,y+0.5,z', '-y,-x+0.5,z-0.25',
+ 'x,-y,z-0.5', 'y-0.5,x,z+0.25']
+ number: 142
+ schoenflies: D4h^20
+ universal_h_m: I 41/a c d :1
+ P3:
+ spacegroup: P3
+ crystal_class: trigonal
+ hall: ' P 3'
+ hermann_mauguin: P 3
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z']
+ number: 143
+ schoenflies: C3^1
+ universal_h_m: P 3
+ P31:
+ spacegroup: P31
+ crystal_class: trigonal
+ hall: ' P 31'
+ hermann_mauguin: P 31
+ symops: ['x,y,z', '-y,x-y,z+0.333', '-x+y,-x,z+0.667']
+ ncsym: ['x,y,z', '-y,x-y,z+0.333', '-x+y,-x,z+0.667']
+ number: 144
+ schoenflies: C3^2
+ universal_h_m: P 31
+ P32:
+ spacegroup: P32
+ crystal_class: trigonal
+ hall: ' P 32'
+ hermann_mauguin: P 32
+ symops: ['x,y,z', '-y,x-y,z+0.667', '-x+y,-x,z+0.333']
+ ncsym: ['x,y,z', '-y,x-y,z+0.667', '-x+y,-x,z+0.333']
+ number: 145
+ schoenflies: C3^3
+ universal_h_m: P 32
+ R3:
+ spacegroup: R3
+ crystal_class: rhombohedral
+ hall: ' R 3'
+ hermann_mauguin: R 3
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'x+0.667,y+0.333,z+0.333', '-y+0.667,x-y+0.333,z+0.333',
+ '-x+y+0.667,-x+0.333,z+0.333', 'x+0.333,y+0.667,z+0.667', '-y+0.333,x-y+0.667,z+0.667',
+ '-x+y+0.333,-x+0.667,z+0.667']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z']
+ number: 146
+ schoenflies: C3^4
+ universal_h_m: R 3 :H
+ P-3:
+ spacegroup: P-3
+ crystal_class: trigonal
+ hall: -P 3
+ hermann_mauguin: P -3
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z']
+ number: 147
+ schoenflies: C3i^1
+ universal_h_m: P -3
+ R-3:
+ spacegroup: R-3
+ crystal_class: rhombohedral
+ hall: -R 3
+ hermann_mauguin: R -3
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z',
+ 'x+0.667,y+0.333,z+0.333', '-y+0.667,x-y+0.333,z+0.333', '-x+y+0.667,-x+0.333,z+0.333',
+ '-x+0.667,-y+0.333,-z+0.333', 'y+0.667,-x+y+0.333,-z+0.333', 'x-y+0.667,x+0.333,-z+0.333',
+ 'x+0.333,y+0.667,z+0.667', '-y+0.333,x-y+0.667,z+0.667', '-x+y+0.333,-x+0.667,z+0.667',
+ '-x+0.333,-y+0.667,-z+0.667', 'y+0.333,-x+y+0.667,-z+0.667', 'x-y+0.333,x+0.667,-z+0.667']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z']
+ number: 148
+ schoenflies: C3i^2
+ universal_h_m: R -3 :H
+ P312:
+ spacegroup: P312
+ crystal_class: trigonal
+ hall: ' P 3 2'
+ hermann_mauguin: P 3 1 2
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,-z', 'x,x-y,-z', '-x+y,y,-z']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,-z', 'x,x-y,-z', '-x+y,y,-z']
+ number: 149
+ schoenflies: D3^1
+ universal_h_m: P 3 1 2
+ P321:
+ spacegroup: P321
+ crystal_class: trigonal
+ hall: ' P 3 2"'
+ hermann_mauguin: P 3 2 1
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z', '-x,-x+y,-z', 'x-y,-y,-z']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z', '-x,-x+y,-z', 'x-y,-y,-z']
+ number: 150
+ schoenflies: D3^2
+ universal_h_m: P 3 2 1
+ P3112:
+ spacegroup: P3112
+ crystal_class: trigonal
+ hall: ' P 31 2 (0 0 4)'
+ hermann_mauguin: P 31 1 2
+ symops: ['x,y,z', '-y,x-y,z+0.333', '-x+y,-x,z+0.667', '-y,-x,-z+0.667', 'x,x-y,-z',
+ '-x+y,y,-z+0.333']
+ ncsym: ['x,y,z', '-y,x-y,z+0.333', '-x+y,-x,z+0.667', '-y,-x,-z+0.667', 'x,x-y,-z',
+ '-x+y,y,-z+0.333']
+ number: 151
+ schoenflies: D3^3
+ universal_h_m: P 31 1 2
+ P3121:
+ spacegroup: P3121
+ crystal_class: trigonal
+ hall: ' P 31 2"'
+ hermann_mauguin: P 31 2 1
+ symops: ['x,y,z', '-y,x-y,z+0.333', '-x+y,-x,z+0.667', 'y,x,-z', '-x,-x+y,-z+0.333',
+ 'x-y,-y,-z+0.667']
+ ncsym: ['x,y,z', '-y,x-y,z+0.333', '-x+y,-x,z+0.667', 'y,x,-z', '-x,-x+y,-z+0.333',
+ 'x-y,-y,-z+0.667']
+ number: 152
+ schoenflies: D3^4
+ universal_h_m: P 31 2 1
+ P3212:
+ spacegroup: P3212
+ crystal_class: trigonal
+ hall: ' P 32 2 (0 0 2)'
+ hermann_mauguin: P 32 1 2
+ symops: ['x,y,z', '-y,x-y,z+0.667', '-x+y,-x,z+0.333', '-y,-x,-z+0.333', 'x,x-y,-z',
+ '-x+y,y,-z+0.667']
+ ncsym: ['x,y,z', '-y,x-y,z+0.667', '-x+y,-x,z+0.333', '-y,-x,-z+0.333', 'x,x-y,-z',
+ '-x+y,y,-z+0.667']
+ number: 153
+ schoenflies: D3^5
+ universal_h_m: P 32 1 2
+ P3221:
+ spacegroup: P3221
+ crystal_class: trigonal
+ hall: ' P 32 2"'
+ hermann_mauguin: P 32 2 1
+ symops: ['x,y,z', '-y,x-y,z+0.667', '-x+y,-x,z+0.333', 'y,x,-z', '-x,-x+y,-z+0.667',
+ 'x-y,-y,-z+0.333']
+ ncsym: ['x,y,z', '-y,x-y,z+0.667', '-x+y,-x,z+0.333', 'y,x,-z', '-x,-x+y,-z+0.667',
+ 'x-y,-y,-z+0.333']
+ number: 154
+ schoenflies: D3^6
+ universal_h_m: P 32 2 1
+ R32:
+ spacegroup: R32
+ crystal_class: rhombohedral
+ hall: ' R 3 2"'
+ hermann_mauguin: R 3 2
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z', '-x,-x+y,-z', 'x-y,-y,-z',
+ 'x+0.667,y+0.333,z+0.333', '-y+0.667,x-y+0.333,z+0.333', '-x+y+0.667,-x+0.333,z+0.333',
+ 'y+0.667,x+0.333,-z+0.333', '-x+0.667,-x+y+0.333,-z+0.333', 'x-y+0.667,-y+0.333,-z+0.333',
+ 'x+0.333,y+0.667,z+0.667', '-y+0.333,x-y+0.667,z+0.667', '-x+y+0.333,-x+0.667,z+0.667',
+ 'y+0.333,x+0.667,-z+0.667', '-x+0.333,-x+y+0.667,-z+0.667', 'x-y+0.333,-y+0.667,-z+0.667']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z', '-x,-x+y,-z', 'x-y,-y,-z']
+ number: 155
+ schoenflies: D3^7
+ universal_h_m: R 3 2 :H
+ P3m1:
+ spacegroup: P3m1
+ crystal_class: trigonal
+ hall: ' P 3 -2"'
+ hermann_mauguin: P 3 m 1
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,z', 'x,x-y,z', '-x+y,y,z']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,z', 'x,x-y,z', '-x+y,y,z']
+ number: 156
+ schoenflies: C3v^1
+ universal_h_m: P 3 m 1
+ P31m:
+ spacegroup: P31m
+ crystal_class: trigonal
+ hall: ' P 3 -2'
+ hermann_mauguin: P 3 1 m
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,z', '-x,-x+y,z', 'x-y,-y,z']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,z', '-x,-x+y,z', 'x-y,-y,z']
+ number: 157
+ schoenflies: C3v^2
+ universal_h_m: P 3 1 m
+ P3c1:
+ spacegroup: P3c1
+ crystal_class: trigonal
+ hall: ' P 3 -2"c'
+ hermann_mauguin: P 3 c 1
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,z+0.5', 'x,x-y,z+0.5', '-x+y,y,z+0.5']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,z+0.5', 'x,x-y,z+0.5', '-x+y,y,z+0.5']
+ number: 158
+ schoenflies: C3v^3
+ universal_h_m: P 3 c 1
+ P31c:
+ spacegroup: P31c
+ crystal_class: trigonal
+ hall: ' P 3 -2c'
+ hermann_mauguin: P 3 1 c
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,z+0.5', '-x,-x+y,z+0.5', 'x-y,-y,z+0.5']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,z+0.5', '-x,-x+y,z+0.5', 'x-y,-y,z+0.5']
+ number: 159
+ schoenflies: C3v^4
+ universal_h_m: P 3 1 c
+ R3m:
+ spacegroup: R3m
+ crystal_class: rhombohedral
+ hall: ' R 3 -2"'
+ hermann_mauguin: R 3 m
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,z', 'x,x-y,z', '-x+y,y,z', 'x+0.667,y+0.333,z+0.333',
+ '-y+0.667,x-y+0.333,z+0.333', '-x+y+0.667,-x+0.333,z+0.333', '-y+0.667,-x+0.333,z+0.333',
+ 'x+0.667,x-y+0.333,z+0.333', '-x+y+0.667,y+0.333,z+0.333', 'x+0.333,y+0.667,z+0.667',
+ '-y+0.333,x-y+0.667,z+0.667', '-x+y+0.333,-x+0.667,z+0.667', '-y+0.333,-x+0.667,z+0.667',
+ 'x+0.333,x-y+0.667,z+0.667', '-x+y+0.333,y+0.667,z+0.667']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,z', 'x,x-y,z', '-x+y,y,z']
+ number: 160
+ schoenflies: C3v^5
+ universal_h_m: R 3 m :H
+ R3c:
+ spacegroup: R3c
+ crystal_class: rhombohedral
+ hall: ' R 3 -2"c'
+ hermann_mauguin: R 3 c
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,z+0.5', 'x,x-y,z+0.5', '-x+y,y,z+0.5',
+ 'x+0.667,y+0.333,z+0.333', '-y+0.667,x-y+0.333,z+0.333', '-x+y+0.667,-x+0.333,z+0.333',
+ '-y+0.667,-x+0.333,z+0.833', 'x+0.667,x-y+0.333,z+0.833', '-x+y+0.667,y+0.333,z+0.833',
+ 'x+0.333,y+0.667,z+0.667', '-y+0.333,x-y+0.667,z+0.667', '-x+y+0.333,-x+0.667,z+0.667',
+ '-y+0.333,-x+0.667,z+1.17', 'x+0.333,x-y+0.667,z+1.17', '-x+y+0.333,y+0.667,z+1.17']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,z+0.5', 'x,x-y,z+0.5', '-x+y,y,z+0.5']
+ number: 161
+ schoenflies: C3v^6
+ universal_h_m: R 3 c :H
+ P-31m:
+ spacegroup: P-31m
+ crystal_class: trigonal
+ hall: -P 3 2
+ hermann_mauguin: P -3 1 m
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,-z', 'x,x-y,-z', '-x+y,y,-z',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', 'y,x,z', '-x,-x+y,z', 'x-y,-y,z']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,-z', 'x,x-y,-z', '-x+y,y,-z',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', 'y,x,z', '-x,-x+y,z', 'x-y,-y,z']
+ number: 162
+ schoenflies: D3d^1
+ universal_h_m: P -3 1 m
+ P-31c:
+ spacegroup: P-31c
+ crystal_class: trigonal
+ hall: -P 3 2c
+ hermann_mauguin: P -3 1 c
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,-z+0.5', 'x,x-y,-z+0.5', '-x+y,y,-z+0.5',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', 'y,x,z-0.5', '-x,-x+y,z-0.5', 'x-y,-y,z-0.5']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', '-y,-x,-z+0.5', 'x,x-y,-z+0.5', '-x+y,y,-z+0.5',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', 'y,x,z-0.5', '-x,-x+y,z-0.5', 'x-y,-y,z-0.5']
+ number: 163
+ schoenflies: D3d^2
+ universal_h_m: P -3 1 c
+ P-3m1:
+ spacegroup: P-3m1
+ crystal_class: trigonal
+ hall: -P 3 2"
+ hermann_mauguin: P -3 m 1
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z', '-x,-x+y,-z', 'x-y,-y,-z',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', '-y,-x,z', 'x,x-y,z', '-x+y,y,z']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z', '-x,-x+y,-z', 'x-y,-y,-z',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', '-y,-x,z', 'x,x-y,z', '-x+y,y,z']
+ number: 164
+ schoenflies: D3d^3
+ universal_h_m: P -3 m 1
+ P-3c1:
+ spacegroup: P-3c1
+ crystal_class: trigonal
+ hall: -P 3 2"c
+ hermann_mauguin: P -3 c 1
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z+0.5', '-x,-x+y,-z+0.5', 'x-y,-y,-z+0.5',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', '-y,-x,z-0.5', 'x,x-y,z-0.5', '-x+y,y,z-0.5']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z+0.5', '-x,-x+y,-z+0.5', 'x-y,-y,-z+0.5',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', '-y,-x,z-0.5', 'x,x-y,z-0.5', '-x+y,y,z-0.5']
+ number: 165
+ schoenflies: D3d^4
+ universal_h_m: P -3 c 1
+ R-3m:
+ spacegroup: R-3m
+ crystal_class: rhombohedral
+ hall: -R 3 2"
+ hermann_mauguin: R -3 m
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z', '-x,-x+y,-z', 'x-y,-y,-z',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', '-y,-x,z', 'x,x-y,z', '-x+y,y,z', 'x+0.667,y+0.333,z+0.333',
+ '-y+0.667,x-y+0.333,z+0.333', '-x+y+0.667,-x+0.333,z+0.333', 'y+0.667,x+0.333,-z+0.333',
+ '-x+0.667,-x+y+0.333,-z+0.333', 'x-y+0.667,-y+0.333,-z+0.333', '-x+0.667,-y+0.333,-z+0.333',
+ 'y+0.667,-x+y+0.333,-z+0.333', 'x-y+0.667,x+0.333,-z+0.333', '-y+0.667,-x+0.333,z+0.333',
+ 'x+0.667,x-y+0.333,z+0.333', '-x+y+0.667,y+0.333,z+0.333', 'x+0.333,y+0.667,z+0.667',
+ '-y+0.333,x-y+0.667,z+0.667', '-x+y+0.333,-x+0.667,z+0.667', 'y+0.333,x+0.667,-z+0.667',
+ '-x+0.333,-x+y+0.667,-z+0.667', 'x-y+0.333,-y+0.667,-z+0.667', '-x+0.333,-y+0.667,-z+0.667',
+ 'y+0.333,-x+y+0.667,-z+0.667', 'x-y+0.333,x+0.667,-z+0.667', '-y+0.333,-x+0.667,z+0.667',
+ 'x+0.333,x-y+0.667,z+0.667', '-x+y+0.333,y+0.667,z+0.667']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z', '-x,-x+y,-z', 'x-y,-y,-z',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', '-y,-x,z', 'x,x-y,z', '-x+y,y,z']
+ number: 166
+ schoenflies: D3d^5
+ universal_h_m: R -3 m :H
+ R-3c:
+ spacegroup: R-3c
+ crystal_class: rhombohedral
+ hall: -R 3 2"c
+ hermann_mauguin: R -3 c
+ symops: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z+0.5', '-x,-x+y,-z+0.5', 'x-y,-y,-z+0.5',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', '-y,-x,z-0.5', 'x,x-y,z-0.5', '-x+y,y,z-0.5',
+ 'x+0.667,y+0.333,z+0.333', '-y+0.667,x-y+0.333,z+0.333', '-x+y+0.667,-x+0.333,z+0.333',
+ 'y+0.667,x+0.333,-z+0.833', '-x+0.667,-x+y+0.333,-z+0.833', 'x-y+0.667,-y+0.333,-z+0.833',
+ '-x+0.667,-y+0.333,-z+0.333', 'y+0.667,-x+y+0.333,-z+0.333', 'x-y+0.667,x+0.333,-z+0.333',
+ '-y+0.667,-x+0.333,z-0.167', 'x+0.667,x-y+0.333,z-0.167', '-x+y+0.667,y+0.333,z-0.167',
+ 'x+0.333,y+0.667,z+0.667', '-y+0.333,x-y+0.667,z+0.667', '-x+y+0.333,-x+0.667,z+0.667',
+ 'y+0.333,x+0.667,-z+1.17', '-x+0.333,-x+y+0.667,-z+1.17', 'x-y+0.333,-y+0.667,-z+1.17',
+ '-x+0.333,-y+0.667,-z+0.667', 'y+0.333,-x+y+0.667,-z+0.667', 'x-y+0.333,x+0.667,-z+0.667',
+ '-y+0.333,-x+0.667,z+0.167', 'x+0.333,x-y+0.667,z+0.167', '-x+y+0.333,y+0.667,z+0.167']
+ ncsym: ['x,y,z', '-y,x-y,z', '-x+y,-x,z', 'y,x,-z+0.5', '-x,-x+y,-z+0.5', 'x-y,-y,-z+0.5',
+ '-x,-y,-z', 'y,-x+y,-z', 'x-y,x,-z', '-y,-x,z-0.5', 'x,x-y,z-0.5', '-x+y,y,z-0.5']
+ number: 167
+ schoenflies: D3d^6
+ universal_h_m: R -3 c :H
+ P6:
+ spacegroup: P6
+ crystal_class: hexagonal
+ hall: ' P 6'
+ hermann_mauguin: P 6
+ symops: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z']
+ ncsym: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z']
+ number: 168
+ schoenflies: C6^1
+ universal_h_m: P 6
+ P61:
+ spacegroup: P61
+ crystal_class: hexagonal
+ hall: ' P 61'
+ hermann_mauguin: P 61
+ symops: ['x,y,z', 'x-y,x,z+0.167', '-y,x-y,z+0.333', '-x,-y,z+0.5', '-x+y,-x,z+0.667',
+ 'y,-x+y,z+0.833']
+ ncsym: ['x,y,z', 'x-y,x,z+0.167', '-y,x-y,z+0.333', '-x,-y,z+0.5', '-x+y,-x,z+0.667',
+ 'y,-x+y,z+0.833']
+ number: 169
+ schoenflies: C6^2
+ universal_h_m: P 61
+ P6_5:
+ spacegroup: P6_5
+ crystal_class: hexagonal
+ hall: ' P 65'
+ hermann_mauguin: P 65
+ symops: ['x,y,z', 'x-y,x,z+0.833', '-y,x-y,z+0.667', '-x,-y,z+0.5', '-x+y,-x,z+0.333',
+ 'y,-x+y,z+0.167']
+ ncsym: ['x,y,z', 'x-y,x,z+0.833', '-y,x-y,z+0.667', '-x,-y,z+0.5', '-x+y,-x,z+0.333',
+ 'y,-x+y,z+0.167']
+ number: 170
+ schoenflies: C6^3
+ universal_h_m: P 65
+ P62:
+ spacegroup: P62
+ crystal_class: hexagonal
+ hall: ' P 62'
+ hermann_mauguin: P 62
+ symops: ['x,y,z', 'x-y,x,z+0.333', '-y,x-y,z+0.667', '-x,-y,z', '-x+y,-x,z+0.333',
+ 'y,-x+y,z+0.667']
+ ncsym: ['x,y,z', 'x-y,x,z+0.333', '-y,x-y,z+0.667', '-x,-y,z', '-x+y,-x,z+0.333',
+ 'y,-x+y,z+0.667']
+ number: 171
+ schoenflies: C6^4
+ universal_h_m: P 62
+ P64:
+ spacegroup: P64
+ crystal_class: hexagonal
+ hall: ' P 64'
+ hermann_mauguin: P 64
+ symops: ['x,y,z', 'x-y,x,z+0.667', '-y,x-y,z+0.333', '-x,-y,z', '-x+y,-x,z+0.667',
+ 'y,-x+y,z+0.333']
+ ncsym: ['x,y,z', 'x-y,x,z+0.667', '-y,x-y,z+0.333', '-x,-y,z', '-x+y,-x,z+0.667',
+ 'y,-x+y,z+0.333']
+ number: 172
+ schoenflies: C6^5
+ universal_h_m: P 64
+ P63:
+ spacegroup: P63
+ crystal_class: hexagonal
+ hall: ' P 6c'
+ hermann_mauguin: P 63
+ symops: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5']
+ ncsym: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5']
+ number: 173
+ schoenflies: C6^6
+ universal_h_m: P 63
+ P-6:
+ spacegroup: P-6
+ crystal_class: hexagonal
+ hall: ' P -6'
+ hermann_mauguin: P -6
+ symops: ['x,y,z', '-x+y,-x,-z', '-y,x-y,z', 'x,y,-z', '-x+y,-x,z', '-y,x-y,-z']
+ ncsym: ['x,y,z', '-x+y,-x,-z', '-y,x-y,z', 'x,y,-z', '-x+y,-x,z', '-y,x-y,-z']
+ number: 174
+ schoenflies: C3h^1
+ universal_h_m: P -6
+ P6/m:
+ spacegroup: P6/m
+ crystal_class: hexagonal
+ hall: -P 6
+ hermann_mauguin: P 6/m
+ symops: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', '-x,-y,-z',
+ '-x+y,-x,-z', 'y,-x+y,-z', 'x,y,-z', 'x-y,x,-z', '-y,x-y,-z']
+ ncsym: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', '-x,-y,-z',
+ '-x+y,-x,-z', 'y,-x+y,-z', 'x,y,-z', 'x-y,x,-z', '-y,x-y,-z']
+ number: 175
+ schoenflies: C6h^1
+ universal_h_m: P 6/m
+ P63/m:
+ spacegroup: P63/m
+ crystal_class: hexagonal
+ hall: -P 6c
+ hermann_mauguin: P 63/m
+ symops: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ '-x,-y,-z', '-x+y,-x,-z-0.5', 'y,-x+y,-z', 'x,y,-z-0.5', 'x-y,x,-z', '-y,x-y,-z-0.5']
+ ncsym: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ '-x,-y,-z', '-x+y,-x,-z-0.5', 'y,-x+y,-z', 'x,y,-z-0.5', 'x-y,x,-z', '-y,x-y,-z-0.5']
+ number: 176
+ schoenflies: C6h^2
+ universal_h_m: P 63/m
+ P622:
+ spacegroup: P622
+ crystal_class: hexagonal
+ hall: ' P 6 2'
+ hermann_mauguin: P 6 2 2
+ symops: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', '-y,-x,-z',
+ 'x-y,-y,-z', 'x,x-y,-z', 'y,x,-z', '-x+y,y,-z', '-x,-x+y,-z']
+ ncsym: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', '-y,-x,-z',
+ 'x-y,-y,-z', 'x,x-y,-z', 'y,x,-z', '-x+y,y,-z', '-x,-x+y,-z']
+ number: 177
+ schoenflies: D6^1
+ universal_h_m: P 6 2 2
+ P6122:
+ spacegroup: P6122
+ crystal_class: hexagonal
+ hall: ' P 61 2 (0 0 5)'
+ hermann_mauguin: P 61 2 2
+ symops: ['x,y,z', 'x-y,x,z+0.167', '-y,x-y,z+0.333', '-x,-y,z+0.5', '-x+y,-x,z+0.667',
+ 'y,-x+y,z+0.833', '-y,-x,-z+0.833', 'x-y,-y,-z', 'x,x-y,-z+0.167', 'y,x,-z+0.333',
+ '-x+y,y,-z+0.5', '-x,-x+y,-z+0.667']
+ ncsym: ['x,y,z', 'x-y,x,z+0.167', '-y,x-y,z+0.333', '-x,-y,z+0.5', '-x+y,-x,z+0.667',
+ 'y,-x+y,z+0.833', '-y,-x,-z+0.833', 'x-y,-y,-z', 'x,x-y,-z+0.167', 'y,x,-z+0.333',
+ '-x+y,y,-z+0.5', '-x,-x+y,-z+0.667']
+ number: 178
+ schoenflies: D6^2
+ universal_h_m: P 61 2 2
+ P6_522:
+ spacegroup: P6_522
+ crystal_class: hexagonal
+ hall: ' P 65 2 (0 0 1)'
+ hermann_mauguin: P 65 2 2
+ symops: ['x,y,z', 'x-y,x,z+0.833', '-y,x-y,z+0.667', '-x,-y,z+0.5', '-x+y,-x,z+0.333',
+ 'y,-x+y,z+0.167', '-y,-x,-z+0.167', 'x-y,-y,-z', 'x,x-y,-z+0.833', 'y,x,-z+0.667',
+ '-x+y,y,-z+0.5', '-x,-x+y,-z+0.333']
+ ncsym: ['x,y,z', 'x-y,x,z+0.833', '-y,x-y,z+0.667', '-x,-y,z+0.5', '-x+y,-x,z+0.333',
+ 'y,-x+y,z+0.167', '-y,-x,-z+0.167', 'x-y,-y,-z', 'x,x-y,-z+0.833', 'y,x,-z+0.667',
+ '-x+y,y,-z+0.5', '-x,-x+y,-z+0.333']
+ number: 179
+ schoenflies: D6^3
+ universal_h_m: P 65 2 2
+ P6222:
+ spacegroup: P6222
+ crystal_class: hexagonal
+ hall: ' P 62 2 (0 0 4)'
+ hermann_mauguin: P 62 2 2
+ symops: ['x,y,z', 'x-y,x,z+0.333', '-y,x-y,z+0.667', '-x,-y,z', '-x+y,-x,z+0.333',
+ 'y,-x+y,z+0.667', '-y,-x,-z+0.667', 'x-y,-y,-z', 'x,x-y,-z+0.333', 'y,x,-z+0.667',
+ '-x+y,y,-z', '-x,-x+y,-z+0.333']
+ ncsym: ['x,y,z', 'x-y,x,z+0.333', '-y,x-y,z+0.667', '-x,-y,z', '-x+y,-x,z+0.333',
+ 'y,-x+y,z+0.667', '-y,-x,-z+0.667', 'x-y,-y,-z', 'x,x-y,-z+0.333', 'y,x,-z+0.667',
+ '-x+y,y,-z', '-x,-x+y,-z+0.333']
+ number: 180
+ schoenflies: D6^4
+ universal_h_m: P 62 2 2
+ P6422:
+ spacegroup: P6422
+ crystal_class: hexagonal
+ hall: ' P 64 2 (0 0 2)'
+ hermann_mauguin: P 64 2 2
+ symops: ['x,y,z', 'x-y,x,z+0.667', '-y,x-y,z+0.333', '-x,-y,z', '-x+y,-x,z+0.667',
+ 'y,-x+y,z+0.333', '-y,-x,-z+0.333', 'x-y,-y,-z', 'x,x-y,-z+0.667', 'y,x,-z+0.333',
+ '-x+y,y,-z', '-x,-x+y,-z+0.667']
+ ncsym: ['x,y,z', 'x-y,x,z+0.667', '-y,x-y,z+0.333', '-x,-y,z', '-x+y,-x,z+0.667',
+ 'y,-x+y,z+0.333', '-y,-x,-z+0.333', 'x-y,-y,-z', 'x,x-y,-z+0.667', 'y,x,-z+0.333',
+ '-x+y,y,-z', '-x,-x+y,-z+0.667']
+ number: 181
+ schoenflies: D6^5
+ universal_h_m: P 64 2 2
+ P6322:
+ spacegroup: P6322
+ crystal_class: hexagonal
+ hall: ' P 6c 2c'
+ hermann_mauguin: P 63 2 2
+ symops: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ '-y,-x,-z+0.5', 'x-y,-y,-z', 'x,x-y,-z+0.5', 'y,x,-z', '-x+y,y,-z+0.5', '-x,-x+y,-z']
+ ncsym: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ '-y,-x,-z+0.5', 'x-y,-y,-z', 'x,x-y,-z+0.5', 'y,x,-z', '-x+y,y,-z+0.5', '-x,-x+y,-z']
+ number: 182
+ schoenflies: D6^6
+ universal_h_m: P 63 2 2
+ P6mm:
+ spacegroup: P6mm
+ crystal_class: hexagonal
+ hall: ' P 6 -2'
+ hermann_mauguin: P 6 m m
+ symops: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', 'y,x,z',
+ '-x+y,y,z', '-x,-x+y,z', '-y,-x,z', 'x-y,-y,z', 'x,x-y,z']
+ ncsym: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', 'y,x,z',
+ '-x+y,y,z', '-x,-x+y,z', '-y,-x,z', 'x-y,-y,z', 'x,x-y,z']
+ number: 183
+ schoenflies: C6v^1
+ universal_h_m: P 6 m m
+ P6cc:
+ spacegroup: P6cc
+ crystal_class: hexagonal
+ hall: ' P 6 -2c'
+ hermann_mauguin: P 6 c c
+ symops: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', 'y,x,z+0.5',
+ '-x+y,y,z+0.5', '-x,-x+y,z+0.5', '-y,-x,z+0.5', 'x-y,-y,z+0.5', 'x,x-y,z+0.5']
+ ncsym: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', 'y,x,z+0.5',
+ '-x+y,y,z+0.5', '-x,-x+y,z+0.5', '-y,-x,z+0.5', 'x-y,-y,z+0.5', 'x,x-y,z+0.5']
+ number: 184
+ schoenflies: C6v^2
+ universal_h_m: P 6 c c
+ P63cm:
+ spacegroup: P63cm
+ crystal_class: hexagonal
+ hall: ' P 6c -2'
+ hermann_mauguin: P 63 c m
+ symops: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ 'y,x,z', '-x+y,y,z+0.5', '-x,-x+y,z', '-y,-x,z+0.5', 'x-y,-y,z', 'x,x-y,z+0.5']
+ ncsym: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ 'y,x,z', '-x+y,y,z+0.5', '-x,-x+y,z', '-y,-x,z+0.5', 'x-y,-y,z', 'x,x-y,z+0.5']
+ number: 185
+ schoenflies: C6v^3
+ universal_h_m: P 63 c m
+ P63mc:
+ spacegroup: P63mc
+ crystal_class: hexagonal
+ hall: ' P 6c -2c'
+ hermann_mauguin: P 63 m c
+ symops: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ 'y,x,z+0.5', '-x+y,y,z', '-x,-x+y,z+0.5', '-y,-x,z', 'x-y,-y,z+0.5', 'x,x-y,z']
+ ncsym: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ 'y,x,z+0.5', '-x+y,y,z', '-x,-x+y,z+0.5', '-y,-x,z', 'x-y,-y,z+0.5', 'x,x-y,z']
+ number: 186
+ schoenflies: C6v^4
+ universal_h_m: P 63 m c
+ P-6m2:
+ spacegroup: P-6m2
+ crystal_class: hexagonal
+ hall: ' P -6 2'
+ hermann_mauguin: P -6 m 2
+ symops: ['x,y,z', '-x+y,-x,-z', '-y,x-y,z', 'x,y,-z', '-x+y,-x,z', '-y,x-y,-z',
+ '-y,-x,-z', '-x+y,y,z', 'x,x-y,-z', '-y,-x,z', '-x+y,y,-z', 'x,x-y,z']
+ ncsym: ['x,y,z', '-x+y,-x,-z', '-y,x-y,z', 'x,y,-z', '-x+y,-x,z', '-y,x-y,-z',
+ '-y,-x,-z', '-x+y,y,z', 'x,x-y,-z', '-y,-x,z', '-x+y,y,-z', 'x,x-y,z']
+ number: 187
+ schoenflies: D3h^1
+ universal_h_m: P -6 m 2
+ P-6c2:
+ spacegroup: P-6c2
+ crystal_class: hexagonal
+ hall: ' P -6c 2'
+ hermann_mauguin: P -6 c 2
+ symops: ['x,y,z', '-x+y,-x,-z+0.5', '-y,x-y,z', 'x,y,-z+0.5', '-x+y,-x,z', '-y,x-y,-z+0.5',
+ '-y,-x,-z', '-x+y,y,z+0.5', 'x,x-y,-z', '-y,-x,z+0.5', '-x+y,y,-z', 'x,x-y,z+0.5']
+ ncsym: ['x,y,z', '-x+y,-x,-z+0.5', '-y,x-y,z', 'x,y,-z+0.5', '-x+y,-x,z', '-y,x-y,-z+0.5',
+ '-y,-x,-z', '-x+y,y,z+0.5', 'x,x-y,-z', '-y,-x,z+0.5', '-x+y,y,-z', 'x,x-y,z+0.5']
+ number: 188
+ schoenflies: D3h^2
+ universal_h_m: P -6 c 2
+ P-62m:
+ spacegroup: P-62m
+ crystal_class: hexagonal
+ hall: ' P -6 -2'
+ hermann_mauguin: P -6 2 m
+ symops: ['x,y,z', '-x+y,-x,-z', '-y,x-y,z', 'x,y,-z', '-x+y,-x,z', '-y,x-y,-z',
+ 'y,x,z', 'x-y,-y,-z', '-x,-x+y,z', 'y,x,-z', 'x-y,-y,z', '-x,-x+y,-z']
+ ncsym: ['x,y,z', '-x+y,-x,-z', '-y,x-y,z', 'x,y,-z', '-x+y,-x,z', '-y,x-y,-z',
+ 'y,x,z', 'x-y,-y,-z', '-x,-x+y,z', 'y,x,-z', 'x-y,-y,z', '-x,-x+y,-z']
+ number: 189
+ schoenflies: D3h^3
+ universal_h_m: P -6 2 m
+ P-62c:
+ spacegroup: P-62c
+ crystal_class: hexagonal
+ hall: ' P -6c -2c'
+ hermann_mauguin: P -6 2 c
+ symops: ['x,y,z', '-x+y,-x,-z+0.5', '-y,x-y,z', 'x,y,-z+0.5', '-x+y,-x,z', '-y,x-y,-z+0.5',
+ 'y,x,z+0.5', 'x-y,-y,-z', '-x,-x+y,z+0.5', 'y,x,-z', 'x-y,-y,z+0.5', '-x,-x+y,-z']
+ ncsym: ['x,y,z', '-x+y,-x,-z+0.5', '-y,x-y,z', 'x,y,-z+0.5', '-x+y,-x,z', '-y,x-y,-z+0.5',
+ 'y,x,z+0.5', 'x-y,-y,-z', '-x,-x+y,z+0.5', 'y,x,-z', 'x-y,-y,z+0.5', '-x,-x+y,-z']
+ number: 190
+ schoenflies: D3h^4
+ universal_h_m: P -6 2 c
+ P6/mmm:
+ spacegroup: P6/mmm
+ crystal_class: hexagonal
+ hall: -P 6 2
+ hermann_mauguin: P 6/m m m
+ symops: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', '-y,-x,-z',
+ 'x-y,-y,-z', 'x,x-y,-z', 'y,x,-z', '-x+y,y,-z', '-x,-x+y,-z', '-x,-y,-z', '-x+y,-x,-z',
+ 'y,-x+y,-z', 'x,y,-z', 'x-y,x,-z', '-y,x-y,-z', 'y,x,z', '-x+y,y,z', '-x,-x+y,z',
+ '-y,-x,z', 'x-y,-y,z', 'x,x-y,z']
+ ncsym: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', '-y,-x,-z',
+ 'x-y,-y,-z', 'x,x-y,-z', 'y,x,-z', '-x+y,y,-z', '-x,-x+y,-z', '-x,-y,-z', '-x+y,-x,-z',
+ 'y,-x+y,-z', 'x,y,-z', 'x-y,x,-z', '-y,x-y,-z', 'y,x,z', '-x+y,y,z', '-x,-x+y,z',
+ '-y,-x,z', 'x-y,-y,z', 'x,x-y,z']
+ number: 191
+ schoenflies: D6h^1
+ universal_h_m: P 6/m m m
+ P6/mcc:
+ spacegroup: P6/mcc
+ crystal_class: hexagonal
+ hall: -P 6 2c
+ hermann_mauguin: P 6/m c c
+ symops: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', '-y,-x,-z+0.5',
+ 'x-y,-y,-z+0.5', 'x,x-y,-z+0.5', 'y,x,-z+0.5', '-x+y,y,-z+0.5', '-x,-x+y,-z+0.5',
+ '-x,-y,-z', '-x+y,-x,-z', 'y,-x+y,-z', 'x,y,-z', 'x-y,x,-z', '-y,x-y,-z', 'y,x,z-0.5',
+ '-x+y,y,z-0.5', '-x,-x+y,z-0.5', '-y,-x,z-0.5', 'x-y,-y,z-0.5', 'x,x-y,z-0.5']
+ ncsym: ['x,y,z', 'x-y,x,z', '-y,x-y,z', '-x,-y,z', '-x+y,-x,z', 'y,-x+y,z', '-y,-x,-z+0.5',
+ 'x-y,-y,-z+0.5', 'x,x-y,-z+0.5', 'y,x,-z+0.5', '-x+y,y,-z+0.5', '-x,-x+y,-z+0.5',
+ '-x,-y,-z', '-x+y,-x,-z', 'y,-x+y,-z', 'x,y,-z', 'x-y,x,-z', '-y,x-y,-z', 'y,x,z-0.5',
+ '-x+y,y,z-0.5', '-x,-x+y,z-0.5', '-y,-x,z-0.5', 'x-y,-y,z-0.5', 'x,x-y,z-0.5']
+ number: 192
+ schoenflies: D6h^2
+ universal_h_m: P 6/m c c
+ P63/mcm:
+ spacegroup: P63/mcm
+ crystal_class: hexagonal
+ hall: -P 6c 2
+ hermann_mauguin: P 63/m c m
+ symops: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ '-y,-x,-z', 'x-y,-y,-z+0.5', 'x,x-y,-z', 'y,x,-z+0.5', '-x+y,y,-z', '-x,-x+y,-z+0.5',
+ '-x,-y,-z', '-x+y,-x,-z-0.5', 'y,-x+y,-z', 'x,y,-z-0.5', 'x-y,x,-z', '-y,x-y,-z-0.5',
+ 'y,x,z', '-x+y,y,z-0.5', '-x,-x+y,z', '-y,-x,z-0.5', 'x-y,-y,z', 'x,x-y,z-0.5']
+ ncsym: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ '-y,-x,-z', 'x-y,-y,-z+0.5', 'x,x-y,-z', 'y,x,-z+0.5', '-x+y,y,-z', '-x,-x+y,-z+0.5',
+ '-x,-y,-z', '-x+y,-x,-z-0.5', 'y,-x+y,-z', 'x,y,-z-0.5', 'x-y,x,-z', '-y,x-y,-z-0.5',
+ 'y,x,z', '-x+y,y,z-0.5', '-x,-x+y,z', '-y,-x,z-0.5', 'x-y,-y,z', 'x,x-y,z-0.5']
+ number: 193
+ schoenflies: D6h^3
+ universal_h_m: P 63/m c m
+ P63/mmc:
+ spacegroup: P63/mmc
+ crystal_class: hexagonal
+ hall: -P 6c 2c
+ hermann_mauguin: P 63/m m c
+ symops: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ '-y,-x,-z+0.5', 'x-y,-y,-z', 'x,x-y,-z+0.5', 'y,x,-z', '-x+y,y,-z+0.5', '-x,-x+y,-z',
+ '-x,-y,-z', '-x+y,-x,-z-0.5', 'y,-x+y,-z', 'x,y,-z-0.5', 'x-y,x,-z', '-y,x-y,-z-0.5',
+ 'y,x,z-0.5', '-x+y,y,z', '-x,-x+y,z-0.5', '-y,-x,z', 'x-y,-y,z-0.5', 'x,x-y,z']
+ ncsym: ['x,y,z', 'x-y,x,z+0.5', '-y,x-y,z', '-x,-y,z+0.5', '-x+y,-x,z', 'y,-x+y,z+0.5',
+ '-y,-x,-z+0.5', 'x-y,-y,-z', 'x,x-y,-z+0.5', 'y,x,-z', '-x+y,y,-z+0.5', '-x,-x+y,-z',
+ '-x,-y,-z', '-x+y,-x,-z-0.5', 'y,-x+y,-z', 'x,y,-z-0.5', 'x-y,x,-z', '-y,x-y,-z-0.5',
+ 'y,x,z-0.5', '-x+y,y,z', '-x,-x+y,z-0.5', '-y,-x,z', 'x-y,-y,z-0.5', 'x,x-y,z']
+ number: 194
+ schoenflies: D6h^4
+ universal_h_m: P 63/m m c
+ P23:
+ spacegroup: P23
+ crystal_class: cubic
+ hall: ' P 2 2 3'
+ hermann_mauguin: P 2 3
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x']
+ number: 195
+ schoenflies: T^1
+ universal_h_m: P 2 3
+ F23:
+ spacegroup: F23
+ crystal_class: cubic
+ hall: ' F 2 2 3'
+ hermann_mauguin: F 2 3
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', 'x,y+0.5,z+0.5', '-x,-y+0.5,z+0.5',
+ 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', 'z,x+0.5,y+0.5', '-z,-x+0.5,y+0.5', 'z,-x+0.5,-y+0.5',
+ '-z,x+0.5,-y+0.5', 'y,z+0.5,x+0.5', 'y,-z+0.5,-x+0.5', '-y,z+0.5,-x+0.5', '-y,-z+0.5,x+0.5',
+ 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', 'z+0.5,x,y+0.5',
+ '-z+0.5,-x,y+0.5', 'z+0.5,-x,-y+0.5', '-z+0.5,x,-y+0.5', 'y+0.5,z,x+0.5', 'y+0.5,-z,-x+0.5',
+ '-y+0.5,z,-x+0.5', '-y+0.5,-z,x+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z',
+ '-x+0.5,y+0.5,-z', 'z+0.5,x+0.5,y', '-z+0.5,-x+0.5,y', 'z+0.5,-x+0.5,-y', '-z+0.5,x+0.5,-y',
+ 'y+0.5,z+0.5,x', 'y+0.5,-z+0.5,-x', '-y+0.5,z+0.5,-x', '-y+0.5,-z+0.5,x']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x']
+ number: 196
+ schoenflies: T^2
+ universal_h_m: F 2 3
+ I23:
+ spacegroup: I23
+ crystal_class: cubic
+ hall: ' I 2 2 3'
+ hermann_mauguin: I 2 3
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5', 'z+0.5,x+0.5,y+0.5', '-z+0.5,-x+0.5,y+0.5',
+ 'z+0.5,-x+0.5,-y+0.5', '-z+0.5,x+0.5,-y+0.5', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,-x+0.5',
+ '-y+0.5,z+0.5,-x+0.5', '-y+0.5,-z+0.5,x+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x']
+ number: 197
+ schoenflies: T^3
+ universal_h_m: I 2 3
+ P213:
+ spacegroup: P213
+ crystal_class: cubic
+ hall: ' P 2ac 2ab 3'
+ hermann_mauguin: P 21 3
+ symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z+0.5', 'z,x,y',
+ '-z+0.5,-x,y+0.5', 'z+0.5,-x+0.5,-y', '-z,x+0.5,-y+0.5', 'y,z,x', 'y+0.5,-z+0.5,-x',
+ '-y,z+0.5,-x+0.5', '-y+0.5,-z,x+0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z+0.5', 'z,x,y',
+ '-z+0.5,-x,y+0.5', 'z+0.5,-x+0.5,-y', '-z,x+0.5,-y+0.5', 'y,z,x', 'y+0.5,-z+0.5,-x',
+ '-y,z+0.5,-x+0.5', '-y+0.5,-z,x+0.5']
+ number: 198
+ schoenflies: T^4
+ universal_h_m: P 21 3
+ I213:
+ spacegroup: I213
+ crystal_class: cubic
+ hall: ' I 2b 2c 3'
+ hermann_mauguin: I 21 3
+ symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z+0.5', '-x,y+0.5,-z+0.5', 'z,x,y', '-z,-x+0.5,y',
+ 'z,-x,-y+0.5', '-z,x+0.5,-y+0.5', 'y,z,x', 'y,-z,-x+0.5', '-y,z+0.5,-x+0.5',
+ '-y+0.5,-z,x+0.5', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5', 'x+0.5,-y+0.5,-z+1',
+ '-x+0.5,y+1,-z+1', 'z+0.5,x+0.5,y+0.5', '-z+0.5,-x+1,y+0.5', 'z+0.5,-x+0.5,-y+1',
+ '-z+0.5,x+1,-y+1', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,-x+1', '-y+0.5,z+1,-x+1',
+ '-y+1,-z+0.5,x+1']
+ ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z+0.5', '-x,y+0.5,-z+0.5', 'z,x,y', '-z,-x+0.5,y',
+ 'z,-x,-y+0.5', '-z,x+0.5,-y+0.5', 'y,z,x', 'y,-z,-x+0.5', '-y,z+0.5,-x+0.5',
+ '-y+0.5,-z,x+0.5']
+ number: 199
+ schoenflies: T^5
+ universal_h_m: I 21 3
+ Pm-3:
+ spacegroup: Pm-3
+ crystal_class: cubic
+ hall: -P 2 2 3
+ hermann_mauguin: P m -3
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z', '-z,-x,-y', 'z,x,-y', '-z,x,y', 'z,-x,y', '-y,-z,-x', '-y,z,x', 'y,-z,x',
+ 'y,z,-x']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z', '-z,-x,-y', 'z,x,-y', '-z,x,y', 'z,-x,y', '-y,-z,-x', '-y,z,x', 'y,-z,x',
+ 'y,z,-x']
+ number: 200
+ schoenflies: Th^1
+ universal_h_m: P m -3
+ Pn-3:
+ spacegroup: Pn-3
+ crystal_class: cubic
+ hall: ' P 2 2 3 -1n'
+ hermann_mauguin: P n -3
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x+0.5,-y+0.5,-z+0.5',
+ 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5', '-z+0.5,-x+0.5,-y+0.5',
+ 'z+0.5,x+0.5,-y+0.5', '-z+0.5,x+0.5,y+0.5', 'z+0.5,-x+0.5,y+0.5', '-y+0.5,-z+0.5,-x+0.5',
+ '-y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,x+0.5', 'y+0.5,z+0.5,-x+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x+0.5,-y+0.5,-z+0.5',
+ 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5', '-z+0.5,-x+0.5,-y+0.5',
+ 'z+0.5,x+0.5,-y+0.5', '-z+0.5,x+0.5,y+0.5', 'z+0.5,-x+0.5,y+0.5', '-y+0.5,-z+0.5,-x+0.5',
+ '-y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,x+0.5', 'y+0.5,z+0.5,-x+0.5']
+ number: 201
+ schoenflies: Th^2
+ universal_h_m: P n -3 :1
+ Fm-3:
+ spacegroup: Fm-3
+ crystal_class: cubic
+ hall: -F 2 2 3
+ hermann_mauguin: F m -3
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z', '-z,-x,-y', 'z,x,-y', '-z,x,y', 'z,-x,y', '-y,-z,-x', '-y,z,x', 'y,-z,x',
+ 'y,z,-x', 'x,y+0.5,z+0.5', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5',
+ 'z,x+0.5,y+0.5', '-z,-x+0.5,y+0.5', 'z,-x+0.5,-y+0.5', '-z,x+0.5,-y+0.5', 'y,z+0.5,x+0.5',
+ 'y,-z+0.5,-x+0.5', '-y,z+0.5,-x+0.5', '-y,-z+0.5,x+0.5', '-x,-y+0.5,-z+0.5',
+ 'x,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', 'x,-y+0.5,z+0.5', '-z,-x+0.5,-y+0.5', 'z,x+0.5,-y+0.5',
+ '-z,x+0.5,y+0.5', 'z,-x+0.5,y+0.5', '-y,-z+0.5,-x+0.5', '-y,z+0.5,x+0.5', 'y,-z+0.5,x+0.5',
+ 'y,z+0.5,-x+0.5', 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5',
+ 'z+0.5,x,y+0.5', '-z+0.5,-x,y+0.5', 'z+0.5,-x,-y+0.5', '-z+0.5,x,-y+0.5', 'y+0.5,z,x+0.5',
+ 'y+0.5,-z,-x+0.5', '-y+0.5,z,-x+0.5', '-y+0.5,-z,x+0.5', '-x+0.5,-y,-z+0.5',
+ 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5', '-z+0.5,-x,-y+0.5', 'z+0.5,x,-y+0.5',
+ '-z+0.5,x,y+0.5', 'z+0.5,-x,y+0.5', '-y+0.5,-z,-x+0.5', '-y+0.5,z,x+0.5', 'y+0.5,-z,x+0.5',
+ 'y+0.5,z,-x+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z',
+ 'z+0.5,x+0.5,y', '-z+0.5,-x+0.5,y', 'z+0.5,-x+0.5,-y', '-z+0.5,x+0.5,-y', 'y+0.5,z+0.5,x',
+ 'y+0.5,-z+0.5,-x', '-y+0.5,z+0.5,-x', '-y+0.5,-z+0.5,x', '-x+0.5,-y+0.5,-z',
+ 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z', '-z+0.5,-x+0.5,-y', 'z+0.5,x+0.5,-y',
+ '-z+0.5,x+0.5,y', 'z+0.5,-x+0.5,y', '-y+0.5,-z+0.5,-x', '-y+0.5,z+0.5,x', 'y+0.5,-z+0.5,x',
+ 'y+0.5,z+0.5,-x']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z', '-z,-x,-y', 'z,x,-y', '-z,x,y', 'z,-x,y', '-y,-z,-x', '-y,z,x', 'y,-z,x',
+ 'y,z,-x']
+ number: 202
+ schoenflies: Th^3
+ universal_h_m: F m -3
+ Fd-3:
+ spacegroup: Fd-3
+ crystal_class: cubic
+ hall: ' F 2 2 3 -1d'
+ hermann_mauguin: F d -3
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x+0.25,-y+0.25,-z+0.25',
+ 'x+0.25,y+0.25,-z+0.25', '-x+0.25,y+0.25,z+0.25', 'x+0.25,-y+0.25,z+0.25', '-z+0.25,-x+0.25,-y+0.25',
+ 'z+0.25,x+0.25,-y+0.25', '-z+0.25,x+0.25,y+0.25', 'z+0.25,-x+0.25,y+0.25', '-y+0.25,-z+0.25,-x+0.25',
+ '-y+0.25,z+0.25,x+0.25', 'y+0.25,-z+0.25,x+0.25', 'y+0.25,z+0.25,-x+0.25', 'x,y+0.5,z+0.5',
+ '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', 'z,x+0.5,y+0.5', '-z,-x+0.5,y+0.5',
+ 'z,-x+0.5,-y+0.5', '-z,x+0.5,-y+0.5', 'y,z+0.5,x+0.5', 'y,-z+0.5,-x+0.5', '-y,z+0.5,-x+0.5',
+ '-y,-z+0.5,x+0.5', '-x+0.25,-y+0.75,-z+0.75', 'x+0.25,y+0.75,-z+0.75', '-x+0.25,y+0.75,z+0.75',
+ 'x+0.25,-y+0.75,z+0.75', '-z+0.25,-x+0.75,-y+0.75', 'z+0.25,x+0.75,-y+0.75',
+ '-z+0.25,x+0.75,y+0.75', 'z+0.25,-x+0.75,y+0.75', '-y+0.25,-z+0.75,-x+0.75',
+ '-y+0.25,z+0.75,x+0.75', 'y+0.25,-z+0.75,x+0.75', 'y+0.25,z+0.75,-x+0.75', 'x+0.5,y,z+0.5',
+ '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', 'z+0.5,x,y+0.5', '-z+0.5,-x,y+0.5',
+ 'z+0.5,-x,-y+0.5', '-z+0.5,x,-y+0.5', 'y+0.5,z,x+0.5', 'y+0.5,-z,-x+0.5', '-y+0.5,z,-x+0.5',
+ '-y+0.5,-z,x+0.5', '-x+0.75,-y+0.25,-z+0.75', 'x+0.75,y+0.25,-z+0.75', '-x+0.75,y+0.25,z+0.75',
+ 'x+0.75,-y+0.25,z+0.75', '-z+0.75,-x+0.25,-y+0.75', 'z+0.75,x+0.25,-y+0.75',
+ '-z+0.75,x+0.25,y+0.75', 'z+0.75,-x+0.25,y+0.75', '-y+0.75,-z+0.25,-x+0.75',
+ '-y+0.75,z+0.25,x+0.75', 'y+0.75,-z+0.25,x+0.75', 'y+0.75,z+0.25,-x+0.75', 'x+0.5,y+0.5,z',
+ '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-z', 'z+0.5,x+0.5,y', '-z+0.5,-x+0.5,y',
+ 'z+0.5,-x+0.5,-y', '-z+0.5,x+0.5,-y', 'y+0.5,z+0.5,x', 'y+0.5,-z+0.5,-x', '-y+0.5,z+0.5,-x',
+ '-y+0.5,-z+0.5,x', '-x+0.75,-y+0.75,-z+0.25', 'x+0.75,y+0.75,-z+0.25', '-x+0.75,y+0.75,z+0.25',
+ 'x+0.75,-y+0.75,z+0.25', '-z+0.75,-x+0.75,-y+0.25', 'z+0.75,x+0.75,-y+0.25',
+ '-z+0.75,x+0.75,y+0.25', 'z+0.75,-x+0.75,y+0.25', '-y+0.75,-z+0.75,-x+0.25',
+ '-y+0.75,z+0.75,x+0.25', 'y+0.75,-z+0.75,x+0.25', 'y+0.75,z+0.75,-x+0.25']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x+0.25,-y+0.25,-z+0.25',
+ 'x+0.25,y+0.25,-z+0.25', '-x+0.25,y+0.25,z+0.25', 'x+0.25,-y+0.25,z+0.25', '-z+0.25,-x+0.25,-y+0.25',
+ 'z+0.25,x+0.25,-y+0.25', '-z+0.25,x+0.25,y+0.25', 'z+0.25,-x+0.25,y+0.25', '-y+0.25,-z+0.25,-x+0.25',
+ '-y+0.25,z+0.25,x+0.25', 'y+0.25,-z+0.25,x+0.25', 'y+0.25,z+0.25,-x+0.25']
+ number: 203
+ schoenflies: Th^4
+ universal_h_m: F d -3 :1
+ Im-3:
+ spacegroup: Im-3
+ crystal_class: cubic
+ hall: -I 2 2 3
+ hermann_mauguin: I m -3
+ symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z', '-z,-x,-y', 'z,x,-y', '-z,x,y', 'z,-x,y', '-y,-z,-x', '-y,z,x', 'y,-z,x',
+ 'y,z,-x', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5',
+ '-x+0.5,y+0.5,-z+0.5', 'z+0.5,x+0.5,y+0.5', '-z+0.5,-x+0.5,y+0.5', 'z+0.5,-x+0.5,-y+0.5',
+ '-z+0.5,x+0.5,-y+0.5', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,-x+0.5', '-y+0.5,z+0.5,-x+0.5',
+ '-y+0.5,-z+0.5,x+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5',
+ 'x+0.5,-y+0.5,z+0.5', '-z+0.5,-x+0.5,-y+0.5', 'z+0.5,x+0.5,-y+0.5', '-z+0.5,x+0.5,y+0.5',
+ 'z+0.5,-x+0.5,y+0.5', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,x+0.5',
+ 'y+0.5,z+0.5,-x+0.5']
+ ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', 'z,x,y', '-z,-x,y', 'z,-x,-y',
+ '-z,x,-y', 'y,z,x', 'y,-z,-x', '-y,z,-x', '-y,-z,x', '-x,-y,-z', 'x,y,-z', '-x,y,z',
+ 'x,-y,z', '-z,-x,-y', 'z,x,-y', '-z,x,y', 'z,-x,y', '-y,-z,-x', '-y,z,x', 'y,-z,x',
+ 'y,z,-x']
+ number: 204
+ schoenflies: Th^5
+ universal_h_m: I m -3
+ Pa-3:
+ spacegroup: Pa-3
+ crystal_class: cubic
+ hall: -P 2ac 2ab 3
+ hermann_mauguin: P a -3
+ symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z+0.5', 'z,x,y',
+ '-z+0.5,-x,y+0.5', 'z+0.5,-x+0.5,-y', '-z,x+0.5,-y+0.5', 'y,z,x', 'y+0.5,-z+0.5,-x',
+ '-y,z+0.5,-x+0.5', '-y+0.5,-z,x+0.5', '-x,-y,-z', 'x-0.5,y,-z-0.5', '-x-0.5,y-0.5,z',
+ 'x,-y-0.5,z-0.5', '-z,-x,-y', 'z-0.5,x,-y-0.5', '-z-0.5,x-0.5,y', 'z,-x-0.5,y-0.5',
+ '-y,-z,-x', '-y-0.5,z-0.5,x', 'y,-z-0.5,x-0.5', 'y-0.5,z,-x-0.5']
+ ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z+0.5', 'z,x,y',
+ '-z+0.5,-x,y+0.5', 'z+0.5,-x+0.5,-y', '-z,x+0.5,-y+0.5', 'y,z,x', 'y+0.5,-z+0.5,-x',
+ '-y,z+0.5,-x+0.5', '-y+0.5,-z,x+0.5', '-x,-y,-z', 'x-0.5,y,-z-0.5', '-x-0.5,y-0.5,z',
+ 'x,-y-0.5,z-0.5', '-z,-x,-y', 'z-0.5,x,-y-0.5', '-z-0.5,x-0.5,y', 'z,-x-0.5,y-0.5',
+ '-y,-z,-x', '-y-0.5,z-0.5,x', 'y,-z-0.5,x-0.5', 'y-0.5,z,-x-0.5']
+ number: 205
+ schoenflies: Th^6
+ universal_h_m: P a -3
+ Ia-3:
+ spacegroup: Ia-3
+ crystal_class: cubic
+ hall: -I 2b 2c 3
+ hermann_mauguin: I a -3
+ symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z+0.5', '-x,y+0.5,-z+0.5', 'z,x,y', '-z,-x+0.5,y',
+ 'z,-x,-y+0.5', '-z,x+0.5,-y+0.5', 'y,z,x', 'y,-z,-x+0.5', '-y,z+0.5,-x+0.5',
+ '-y+0.5,-z,x+0.5', '-x,-y,-z', 'x,y-0.5,-z', '-x,y,z-0.5', 'x,-y-0.5,z-0.5',
+ '-z,-x,-y', 'z,x-0.5,-y', '-z,x,y-0.5', 'z,-x-0.5,y-0.5', '-y,-z,-x', '-y,z,x-0.5',
+ 'y,-z-0.5,x-0.5', 'y-0.5,z,-x-0.5', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5',
+ 'x+0.5,-y+0.5,-z+1', '-x+0.5,y+1,-z+1', 'z+0.5,x+0.5,y+0.5', '-z+0.5,-x+1,y+0.5',
+ 'z+0.5,-x+0.5,-y+1', '-z+0.5,x+1,-y+1', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,-x+1',
+ '-y+0.5,z+1,-x+1', '-y+1,-z+0.5,x+1', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,y,-z+0.5',
+ '-x+0.5,y+0.5,z', 'x+0.5,-y,z', '-z+0.5,-x+0.5,-y+0.5', 'z+0.5,x,-y+0.5', '-z+0.5,x+0.5,y',
+ 'z+0.5,-x,y', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z+0.5,x', 'y+0.5,-z,x', 'y,z+0.5,-x']
+ ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y,-z+0.5', '-x,y+0.5,-z+0.5', 'z,x,y', '-z,-x+0.5,y',
+ 'z,-x,-y+0.5', '-z,x+0.5,-y+0.5', 'y,z,x', 'y,-z,-x+0.5', '-y,z+0.5,-x+0.5',
+ '-y+0.5,-z,x+0.5', '-x,-y,-z', 'x,y-0.5,-z', '-x,y,z-0.5', 'x,-y-0.5,z-0.5',
+ '-z,-x,-y', 'z,x-0.5,-y', '-z,x,y-0.5', 'z,-x-0.5,y-0.5', '-y,-z,-x', '-y,z,x-0.5',
+ 'y,-z-0.5,x-0.5', 'y-0.5,z,-x-0.5']
+ number: 206
+ schoenflies: Th^7
+ universal_h_m: I a -3
+ P432:
+ spacegroup: P432
+ crystal_class: cubic
+ hall: ' P 4 2 3'
+ hermann_mauguin: P 4 3 2
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x']
+ number: 207
+ schoenflies: O^1
+ universal_h_m: P 4 3 2
+ P4232:
+ spacegroup: P4232
+ crystal_class: cubic
+ hall: ' P 4n 2 3'
+ hermann_mauguin: P 42 3 2
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z',
+ 'y+0.5,x+0.5,-z+0.5', '-x,y,-z', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z+0.5,y+0.5',
+ '-z,-x,y', 'x+0.5,-z+0.5,y+0.5', 'z,-x,-y', 'x+0.5,z+0.5,-y+0.5', '-z,x,-y',
+ '-x+0.5,-z+0.5,-y+0.5', 'y,z,x', 'y,-z,-x', 'z+0.5,y+0.5,-x+0.5', '-y,z,-x',
+ '-z+0.5,-y+0.5,-x+0.5', '-y,-z,x', 'z+0.5,-y+0.5,x+0.5', '-z+0.5,y+0.5,x+0.5']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z',
+ 'y+0.5,x+0.5,-z+0.5', '-x,y,-z', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z+0.5,y+0.5',
+ '-z,-x,y', 'x+0.5,-z+0.5,y+0.5', 'z,-x,-y', 'x+0.5,z+0.5,-y+0.5', '-z,x,-y',
+ '-x+0.5,-z+0.5,-y+0.5', 'y,z,x', 'y,-z,-x', 'z+0.5,y+0.5,-x+0.5', '-y,z,-x',
+ '-z+0.5,-y+0.5,-x+0.5', '-y,-z,x', 'z+0.5,-y+0.5,x+0.5', '-z+0.5,y+0.5,x+0.5']
+ number: 208
+ schoenflies: O^2
+ universal_h_m: P 42 3 2
+ F432:
+ spacegroup: F432
+ crystal_class: cubic
+ hall: ' F 4 2 3'
+ hermann_mauguin: F 4 3 2
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', 'x,y+0.5,z+0.5', '-y,x+0.5,z+0.5', '-x,-y+0.5,z+0.5', 'y,-x+0.5,z+0.5',
+ 'x,-y+0.5,-z+0.5', 'y,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x+0.5,-z+0.5',
+ 'z,x+0.5,y+0.5', '-x,z+0.5,y+0.5', '-z,-x+0.5,y+0.5', 'x,-z+0.5,y+0.5', 'z,-x+0.5,-y+0.5',
+ 'x,z+0.5,-y+0.5', '-z,x+0.5,-y+0.5', '-x,-z+0.5,-y+0.5', 'y,z+0.5,x+0.5', 'y,-z+0.5,-x+0.5',
+ 'z,y+0.5,-x+0.5', '-y,z+0.5,-x+0.5', '-z,-y+0.5,-x+0.5', '-y,-z+0.5,x+0.5',
+ 'z,-y+0.5,x+0.5', '-z,y+0.5,x+0.5', 'x+0.5,y,z+0.5', '-y+0.5,x,z+0.5', '-x+0.5,-y,z+0.5',
+ 'y+0.5,-x,z+0.5', 'x+0.5,-y,-z+0.5', 'y+0.5,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x,-z+0.5',
+ 'z+0.5,x,y+0.5', '-x+0.5,z,y+0.5', '-z+0.5,-x,y+0.5', 'x+0.5,-z,y+0.5', 'z+0.5,-x,-y+0.5',
+ 'x+0.5,z,-y+0.5', '-z+0.5,x,-y+0.5', '-x+0.5,-z,-y+0.5', 'y+0.5,z,x+0.5', 'y+0.5,-z,-x+0.5',
+ 'z+0.5,y,-x+0.5', '-y+0.5,z,-x+0.5', '-z+0.5,-y,-x+0.5', '-y+0.5,-z,x+0.5',
+ 'z+0.5,-y,x+0.5', '-z+0.5,y,x+0.5', 'x+0.5,y+0.5,z', '-y+0.5,x+0.5,z', '-x+0.5,-y+0.5,z',
+ 'y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,-z', 'y+0.5,x+0.5,-z', '-x+0.5,y+0.5,-z', '-y+0.5,-x+0.5,-z',
+ 'z+0.5,x+0.5,y', '-x+0.5,z+0.5,y', '-z+0.5,-x+0.5,y', 'x+0.5,-z+0.5,y', 'z+0.5,-x+0.5,-y',
+ 'x+0.5,z+0.5,-y', '-z+0.5,x+0.5,-y', '-x+0.5,-z+0.5,-y', 'y+0.5,z+0.5,x', 'y+0.5,-z+0.5,-x',
+ 'z+0.5,y+0.5,-x', '-y+0.5,z+0.5,-x', '-z+0.5,-y+0.5,-x', '-y+0.5,-z+0.5,x',
+ 'z+0.5,-y+0.5,x', '-z+0.5,y+0.5,x']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x']
+ number: 209
+ schoenflies: O^3
+ universal_h_m: F 4 3 2
+ F4132:
+ spacegroup: F4132
+ crystal_class: cubic
+ hall: ' F 4d 2 3'
+ hermann_mauguin: F 41 3 2
+ symops: ['x,y,z', '-y+0.25,x+0.25,z+0.25', '-x,-y+0.5,z+0.5', 'y+0.75,-x+0.25,z+0.75',
+ 'x,-y,-z', 'y+0.25,x+0.25,-z+0.25', '-x,y+0.5,-z+0.5', '-y+0.75,-x+0.25,-z+0.75',
+ 'z,x,y', '-x+0.25,z+0.25,y+0.25', '-z,-x+0.5,y+0.5', 'x+0.75,-z+0.25,y+0.75',
+ 'z,-x,-y', 'x+0.25,z+0.25,-y+0.25', '-z,x+0.5,-y+0.5', '-x+0.75,-z+0.25,-y+0.75',
+ 'y,z,x', 'y+0.5,-z,-x+0.5', 'z+0.25,y+0.75,-x+0.75', '-y+0.5,z+0.5,-x', '-z+0.25,-y+0.25,-x+0.25',
+ '-y,-z,x', 'z+0.25,-y+0.75,x+0.75', '-z+0.75,y+0.75,x+0.25', 'x,y+0.5,z+0.5',
+ '-y+0.25,x+0.75,z+0.75', '-x,-y+1,z+1', 'y+0.75,-x+0.75,z+1.25', 'x,-y+0.5,-z+0.5',
+ 'y+0.25,x+0.75,-z+0.75', '-x,y+1,-z+1', '-y+0.75,-x+0.75,-z+1.25', 'z,x+0.5,y+0.5',
+ '-x+0.25,z+0.75,y+0.75', '-z,-x+1,y+1', 'x+0.75,-z+0.75,y+1.25', 'z,-x+0.5,-y+0.5',
+ 'x+0.25,z+0.75,-y+0.75', '-z,x+1,-y+1', '-x+0.75,-z+0.75,-y+1.25', 'y,z+0.5,x+0.5',
+ 'y+0.5,-z+0.5,-x+1', 'z+0.25,y+1.25,-x+1.25', '-y+0.5,z+1,-x+0.5', '-z+0.25,-y+0.75,-x+0.75',
+ '-y,-z+0.5,x+0.5', 'z+0.25,-y+1.25,x+1.25', '-z+0.75,y+1.25,x+0.75', 'x+0.5,y,z+0.5',
+ '-y+0.75,x+0.25,z+0.75', '-x+0.5,-y+0.5,z+1', 'y+1.25,-x+0.25,z+1.25', 'x+0.5,-y,-z+0.5',
+ 'y+0.75,x+0.25,-z+0.75', '-x+0.5,y+0.5,-z+1', '-y+1.25,-x+0.25,-z+1.25', 'z+0.5,x,y+0.5',
+ '-x+0.75,z+0.25,y+0.75', '-z+0.5,-x+0.5,y+1', 'x+1.25,-z+0.25,y+1.25', 'z+0.5,-x,-y+0.5',
+ 'x+0.75,z+0.25,-y+0.75', '-z+0.5,x+0.5,-y+1', '-x+1.25,-z+0.25,-y+1.25', 'y+0.5,z,x+0.5',
+ 'y+1,-z,-x+1', 'z+0.75,y+0.75,-x+1.25', '-y+1,z+0.5,-x+0.5', '-z+0.75,-y+0.25,-x+0.75',
+ '-y+0.5,-z,x+0.5', 'z+0.75,-y+0.75,x+1.25', '-z+1.25,y+0.75,x+0.75', 'x+0.5,y+0.5,z',
+ '-y+0.75,x+0.75,z+0.25', '-x+0.5,-y+1,z+0.5', 'y+1.25,-x+0.75,z+0.75', 'x+0.5,-y+0.5,-z',
+ 'y+0.75,x+0.75,-z+0.25', '-x+0.5,y+1,-z+0.5', '-y+1.25,-x+0.75,-z+0.75', 'z+0.5,x+0.5,y',
+ '-x+0.75,z+0.75,y+0.25', '-z+0.5,-x+1,y+0.5', 'x+1.25,-z+0.75,y+0.75', 'z+0.5,-x+0.5,-y',
+ 'x+0.75,z+0.75,-y+0.25', '-z+0.5,x+1,-y+0.5', '-x+1.25,-z+0.75,-y+0.75', 'y+0.5,z+0.5,x',
+ 'y+1,-z+0.5,-x+0.5', 'z+0.75,y+1.25,-x+0.75', '-y+1,z+1,-x', '-z+0.75,-y+0.75,-x+0.25',
+ '-y+0.5,-z+0.5,x', 'z+0.75,-y+1.25,x+0.75', '-z+1.25,y+1.25,x+0.25']
+ ncsym: ['x,y,z', '-y+0.25,x+0.25,z+0.25', '-x,-y+0.5,z+0.5', 'y+0.75,-x+0.25,z+0.75',
+ 'x,-y,-z', 'y+0.25,x+0.25,-z+0.25', '-x,y+0.5,-z+0.5', '-y+0.75,-x+0.25,-z+0.75',
+ 'z,x,y', '-x+0.25,z+0.25,y+0.25', '-z,-x+0.5,y+0.5', 'x+0.75,-z+0.25,y+0.75',
+ 'z,-x,-y', 'x+0.25,z+0.25,-y+0.25', '-z,x+0.5,-y+0.5', '-x+0.75,-z+0.25,-y+0.75',
+ 'y,z,x', 'y+0.5,-z,-x+0.5', 'z+0.25,y+0.75,-x+0.75', '-y+0.5,z+0.5,-x', '-z+0.25,-y+0.25,-x+0.25',
+ '-y,-z,x', 'z+0.25,-y+0.75,x+0.75', '-z+0.75,y+0.75,x+0.25']
+ number: 210
+ schoenflies: O^4
+ universal_h_m: F 41 3 2
+ I432:
+ spacegroup: I432
+ crystal_class: cubic
+ hall: ' I 4 2 3'
+ hermann_mauguin: I 4 3 2
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,-x+0.5,-z+0.5', 'z+0.5,x+0.5,y+0.5', '-x+0.5,z+0.5,y+0.5', '-z+0.5,-x+0.5,y+0.5',
+ 'x+0.5,-z+0.5,y+0.5', 'z+0.5,-x+0.5,-y+0.5', 'x+0.5,z+0.5,-y+0.5', '-z+0.5,x+0.5,-y+0.5',
+ '-x+0.5,-z+0.5,-y+0.5', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,-x+0.5', 'z+0.5,y+0.5,-x+0.5',
+ '-y+0.5,z+0.5,-x+0.5', '-z+0.5,-y+0.5,-x+0.5', '-y+0.5,-z+0.5,x+0.5', 'z+0.5,-y+0.5,x+0.5',
+ '-z+0.5,y+0.5,x+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x']
+ number: 211
+ schoenflies: O^5
+ universal_h_m: I 4 3 2
+ P4332:
+ spacegroup: P4332
+ crystal_class: cubic
+ hall: ' P 4acd 2ab 3'
+ hermann_mauguin: P 43 3 2
+ symops: ['x,y,z', '-y+0.75,x+0.25,z+0.75', '-x+0.5,-y,z+0.5', 'y+0.75,-x+0.75,z+0.25',
+ 'x+0.5,-y+0.5,-z', 'y+0.25,x+0.75,-z+0.75', '-x,y+0.5,-z+0.5', '-y+0.25,-x+0.25,-z+0.25',
+ 'z,x,y', '-x+0.75,z+0.25,y+0.75', '-z+0.5,-x,y+0.5', 'x+0.75,-z+0.75,y+0.25',
+ 'z+0.5,-x+0.5,-y', 'x+0.25,z+0.75,-y+0.75', '-z,x+0.5,-y+0.5', '-x+0.25,-z+0.25,-y+0.25',
+ 'y,z,x', 'y+0.5,-z+0.5,-x', 'z+0.25,y+0.75,-x+0.75', '-y,z+0.5,-x+0.5', '-z+0.25,-y+0.25,-x+0.25',
+ '-y+0.5,-z,x+0.5', 'z+0.75,-y+0.75,x+0.25', '-z+0.75,y+0.25,x+0.75']
+ ncsym: ['x,y,z', '-y+0.75,x+0.25,z+0.75', '-x+0.5,-y,z+0.5', 'y+0.75,-x+0.75,z+0.25',
+ 'x+0.5,-y+0.5,-z', 'y+0.25,x+0.75,-z+0.75', '-x,y+0.5,-z+0.5', '-y+0.25,-x+0.25,-z+0.25',
+ 'z,x,y', '-x+0.75,z+0.25,y+0.75', '-z+0.5,-x,y+0.5', 'x+0.75,-z+0.75,y+0.25',
+ 'z+0.5,-x+0.5,-y', 'x+0.25,z+0.75,-y+0.75', '-z,x+0.5,-y+0.5', '-x+0.25,-z+0.25,-y+0.25',
+ 'y,z,x', 'y+0.5,-z+0.5,-x', 'z+0.25,y+0.75,-x+0.75', '-y,z+0.5,-x+0.5', '-z+0.25,-y+0.25,-x+0.25',
+ '-y+0.5,-z,x+0.5', 'z+0.75,-y+0.75,x+0.25', '-z+0.75,y+0.25,x+0.75']
+ number: 212
+ schoenflies: O^6
+ universal_h_m: P 43 3 2
+ P4132:
+ spacegroup: P4132
+ crystal_class: cubic
+ hall: ' P 4bd 2ab 3'
+ hermann_mauguin: P 41 3 2
+ symops: ['x,y,z', '-y+0.25,x+0.75,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.25,-x+0.25,z+0.75',
+ 'x+0.5,-y+0.5,-z', 'y+0.75,x+0.25,-z+0.25', '-x,y+0.5,-z+0.5', '-y+0.75,-x+0.75,-z+0.75',
+ 'z,x,y', '-x+0.25,z+0.75,y+0.25', '-z+0.5,-x,y+0.5', 'x+0.25,-z+0.25,y+0.75',
+ 'z+0.5,-x+0.5,-y', 'x+0.75,z+0.25,-y+0.25', '-z,x+0.5,-y+0.5', '-x+0.75,-z+0.75,-y+0.75',
+ 'y,z,x', 'y+0.5,-z+0.5,-x', 'z+0.75,y+0.25,-x+0.25', '-y,z+0.5,-x+0.5', '-z+0.75,-y+0.75,-x+0.75',
+ '-y+0.5,-z,x+0.5', 'z+0.25,-y+0.25,x+0.75', '-z+0.25,y+0.75,x+0.25']
+ ncsym: ['x,y,z', '-y+0.25,x+0.75,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.25,-x+0.25,z+0.75',
+ 'x+0.5,-y+0.5,-z', 'y+0.75,x+0.25,-z+0.25', '-x,y+0.5,-z+0.5', '-y+0.75,-x+0.75,-z+0.75',
+ 'z,x,y', '-x+0.25,z+0.75,y+0.25', '-z+0.5,-x,y+0.5', 'x+0.25,-z+0.25,y+0.75',
+ 'z+0.5,-x+0.5,-y', 'x+0.75,z+0.25,-y+0.25', '-z,x+0.5,-y+0.5', '-x+0.75,-z+0.75,-y+0.75',
+ 'y,z,x', 'y+0.5,-z+0.5,-x', 'z+0.75,y+0.25,-x+0.25', '-y,z+0.5,-x+0.5', '-z+0.75,-y+0.75,-x+0.75',
+ '-y+0.5,-z,x+0.5', 'z+0.25,-y+0.25,x+0.75', '-z+0.25,y+0.75,x+0.25']
+ number: 213
+ schoenflies: O^7
+ universal_h_m: P 41 3 2
+ I4132:
+ spacegroup: I4132
+ crystal_class: cubic
+ hall: ' I 4bd 2c 3'
+ hermann_mauguin: I 41 3 2
+ symops: ['x,y,z', '-y+0.25,x+0.75,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.25,-x+0.25,z+0.75',
+ 'x,-y,-z+0.5', 'y+0.25,x+0.75,-z+0.75', '-x+0.5,y,-z', '-y+0.25,-x+0.25,-z+0.25',
+ 'z,x,y', '-x+0.25,z+0.75,y+0.25', '-z+0.5,-x,y+0.5', 'x+0.25,-z+0.25,y+0.75',
+ 'z,-x,-y+0.5', 'x+0.25,z+0.75,-y+0.75', '-z+0.5,x,-y', '-x+0.25,-z+0.25,-y+0.25',
+ 'y,z,x', 'y+0.5,-z+0.5,-x', 'z+0.75,y+0.25,-x+0.25', '-y,z+0.5,-x+0.5', '-z+0.25,-y+0.25,-x+0.25',
+ '-y+0.5,-z,x+0.5', 'z+0.75,-y+0.75,x+0.25', '-z+0.75,y+0.25,x+0.75', 'x+0.5,y+0.5,z+0.5',
+ '-y+0.75,x+1.25,z+0.75', '-x+1,-y+0.5,z+1', 'y+0.75,-x+0.75,z+1.25', 'x+0.5,-y+0.5,-z+1',
+ 'y+0.75,x+1.25,-z+1.25', '-x+1,y+0.5,-z+0.5', '-y+0.75,-x+0.75,-z+0.75', 'z+0.5,x+0.5,y+0.5',
+ '-x+0.75,z+1.25,y+0.75', '-z+1,-x+0.5,y+1', 'x+0.75,-z+0.75,y+1.25', 'z+0.5,-x+0.5,-y+1',
+ 'x+0.75,z+1.25,-y+1.25', '-z+1,x+0.5,-y+0.5', '-x+0.75,-z+0.75,-y+0.75', 'y+0.5,z+0.5,x+0.5',
+ 'y+1,-z+1,-x+0.5', 'z+1.25,y+0.75,-x+0.75', '-y+0.5,z+1,-x+1', '-z+0.75,-y+0.75,-x+0.75',
+ '-y+1,-z+0.5,x+1', 'z+1.25,-y+1.25,x+0.75', '-z+1.25,y+0.75,x+1.25']
+ ncsym: ['x,y,z', '-y+0.25,x+0.75,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.25,-x+0.25,z+0.75',
+ 'x,-y,-z+0.5', 'y+0.25,x+0.75,-z+0.75', '-x+0.5,y,-z', '-y+0.25,-x+0.25,-z+0.25',
+ 'z,x,y', '-x+0.25,z+0.75,y+0.25', '-z+0.5,-x,y+0.5', 'x+0.25,-z+0.25,y+0.75',
+ 'z,-x,-y+0.5', 'x+0.25,z+0.75,-y+0.75', '-z+0.5,x,-y', '-x+0.25,-z+0.25,-y+0.25',
+ 'y,z,x', 'y+0.5,-z+0.5,-x', 'z+0.75,y+0.25,-x+0.25', '-y,z+0.5,-x+0.5', '-z+0.25,-y+0.25,-x+0.25',
+ '-y+0.5,-z,x+0.5', 'z+0.75,-y+0.75,x+0.25', '-z+0.75,y+0.25,x+0.75']
+ number: 214
+ schoenflies: O^8
+ universal_h_m: I 41 3 2
+ P-43m:
+ spacegroup: P-43m
+ crystal_class: cubic
+ hall: ' P -4 2 3'
+ hermann_mauguin: P -4 3 m
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z', 'z,x,y', 'x,-z,-y', '-z,-x,y', '-x,z,-y', 'z,-x,-y', '-x,-z,y', '-z,x,-y',
+ 'x,z,y', 'y,z,x', 'y,-z,-x', '-z,-y,x', '-y,z,-x', 'z,y,x', '-y,-z,x', '-z,y,-x',
+ 'z,-y,-x']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z', 'z,x,y', 'x,-z,-y', '-z,-x,y', '-x,z,-y', 'z,-x,-y', '-x,-z,y', '-z,x,-y',
+ 'x,z,y', 'y,z,x', 'y,-z,-x', '-z,-y,x', '-y,z,-x', 'z,y,x', '-y,-z,x', '-z,y,-x',
+ 'z,-y,-x']
+ number: 215
+ schoenflies: Td^1
+ universal_h_m: P -4 3 m
+ F-43m:
+ spacegroup: F-43m
+ crystal_class: cubic
+ hall: ' F -4 2 3'
+ hermann_mauguin: F -4 3 m
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z', 'z,x,y', 'x,-z,-y', '-z,-x,y', '-x,z,-y', 'z,-x,-y', '-x,-z,y', '-z,x,-y',
+ 'x,z,y', 'y,z,x', 'y,-z,-x', '-z,-y,x', '-y,z,-x', 'z,y,x', '-y,-z,x', '-z,y,-x',
+ 'z,-y,-x', 'x,y+0.5,z+0.5', 'y,-x+0.5,-z+0.5', '-x,-y+0.5,z+0.5', '-y,x+0.5,-z+0.5',
+ 'x,-y+0.5,-z+0.5', '-y,-x+0.5,z+0.5', '-x,y+0.5,-z+0.5', 'y,x+0.5,z+0.5', 'z,x+0.5,y+0.5',
+ 'x,-z+0.5,-y+0.5', '-z,-x+0.5,y+0.5', '-x,z+0.5,-y+0.5', 'z,-x+0.5,-y+0.5',
+ '-x,-z+0.5,y+0.5', '-z,x+0.5,-y+0.5', 'x,z+0.5,y+0.5', 'y,z+0.5,x+0.5', 'y,-z+0.5,-x+0.5',
+ '-z,-y+0.5,x+0.5', '-y,z+0.5,-x+0.5', 'z,y+0.5,x+0.5', '-y,-z+0.5,x+0.5', '-z,y+0.5,-x+0.5',
+ 'z,-y+0.5,-x+0.5', 'x+0.5,y,z+0.5', 'y+0.5,-x,-z+0.5', '-x+0.5,-y,z+0.5', '-y+0.5,x,-z+0.5',
+ 'x+0.5,-y,-z+0.5', '-y+0.5,-x,z+0.5', '-x+0.5,y,-z+0.5', 'y+0.5,x,z+0.5', 'z+0.5,x,y+0.5',
+ 'x+0.5,-z,-y+0.5', '-z+0.5,-x,y+0.5', '-x+0.5,z,-y+0.5', 'z+0.5,-x,-y+0.5',
+ '-x+0.5,-z,y+0.5', '-z+0.5,x,-y+0.5', 'x+0.5,z,y+0.5', 'y+0.5,z,x+0.5', 'y+0.5,-z,-x+0.5',
+ '-z+0.5,-y,x+0.5', '-y+0.5,z,-x+0.5', 'z+0.5,y,x+0.5', '-y+0.5,-z,x+0.5', '-z+0.5,y,-x+0.5',
+ 'z+0.5,-y,-x+0.5', 'x+0.5,y+0.5,z', 'y+0.5,-x+0.5,-z', '-x+0.5,-y+0.5,z', '-y+0.5,x+0.5,-z',
+ 'x+0.5,-y+0.5,-z', '-y+0.5,-x+0.5,z', '-x+0.5,y+0.5,-z', 'y+0.5,x+0.5,z', 'z+0.5,x+0.5,y',
+ 'x+0.5,-z+0.5,-y', '-z+0.5,-x+0.5,y', '-x+0.5,z+0.5,-y', 'z+0.5,-x+0.5,-y',
+ '-x+0.5,-z+0.5,y', '-z+0.5,x+0.5,-y', 'x+0.5,z+0.5,y', 'y+0.5,z+0.5,x', 'y+0.5,-z+0.5,-x',
+ '-z+0.5,-y+0.5,x', '-y+0.5,z+0.5,-x', 'z+0.5,y+0.5,x', '-y+0.5,-z+0.5,x', '-z+0.5,y+0.5,-x',
+ 'z+0.5,-y+0.5,-x']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z', 'z,x,y', 'x,-z,-y', '-z,-x,y', '-x,z,-y', 'z,-x,-y', '-x,-z,y', '-z,x,-y',
+ 'x,z,y', 'y,z,x', 'y,-z,-x', '-z,-y,x', '-y,z,-x', 'z,y,x', '-y,-z,x', '-z,y,-x',
+ 'z,-y,-x']
+ number: 216
+ schoenflies: Td^2
+ universal_h_m: F -4 3 m
+ I-43m:
+ spacegroup: I-43m
+ crystal_class: cubic
+ hall: ' I -4 2 3'
+ hermann_mauguin: I -4 3 m
+ symops: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z', 'z,x,y', 'x,-z,-y', '-z,-x,y', '-x,z,-y', 'z,-x,-y', '-x,-z,y', '-z,x,-y',
+ 'x,z,y', 'y,z,x', 'y,-z,-x', '-z,-y,x', '-y,z,-x', 'z,y,x', '-y,-z,x', '-z,y,-x',
+ 'z,-y,-x', 'x+0.5,y+0.5,z+0.5', 'y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-y+0.5,-x+0.5,z+0.5', '-x+0.5,y+0.5,-z+0.5',
+ 'y+0.5,x+0.5,z+0.5', 'z+0.5,x+0.5,y+0.5', 'x+0.5,-z+0.5,-y+0.5', '-z+0.5,-x+0.5,y+0.5',
+ '-x+0.5,z+0.5,-y+0.5', 'z+0.5,-x+0.5,-y+0.5', '-x+0.5,-z+0.5,y+0.5', '-z+0.5,x+0.5,-y+0.5',
+ 'x+0.5,z+0.5,y+0.5', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,-x+0.5', '-z+0.5,-y+0.5,x+0.5',
+ '-y+0.5,z+0.5,-x+0.5', 'z+0.5,y+0.5,x+0.5', '-y+0.5,-z+0.5,x+0.5', '-z+0.5,y+0.5,-x+0.5',
+ 'z+0.5,-y+0.5,-x+0.5']
+ ncsym: ['x,y,z', 'y,-x,-z', '-x,-y,z', '-y,x,-z', 'x,-y,-z', '-y,-x,z', '-x,y,-z',
+ 'y,x,z', 'z,x,y', 'x,-z,-y', '-z,-x,y', '-x,z,-y', 'z,-x,-y', '-x,-z,y', '-z,x,-y',
+ 'x,z,y', 'y,z,x', 'y,-z,-x', '-z,-y,x', '-y,z,-x', 'z,y,x', '-y,-z,x', '-z,y,-x',
+ 'z,-y,-x']
+ number: 217
+ schoenflies: Td^3
+ universal_h_m: I -4 3 m
+ P-43n:
+ spacegroup: P-43n
+ crystal_class: cubic
+ hall: ' P -4n 2 3'
+ hermann_mauguin: P -4 3 n
+ symops: ['x,y,z', 'y+0.5,-x+0.5,-z+0.5', '-x,-y,z', '-y+0.5,x+0.5,-z+0.5', 'x,-y,-z',
+ '-y+0.5,-x+0.5,z+0.5', '-x,y,-z', 'y+0.5,x+0.5,z+0.5', 'z,x,y', 'x+0.5,-z+0.5,-y+0.5',
+ '-z,-x,y', '-x+0.5,z+0.5,-y+0.5', 'z,-x,-y', '-x+0.5,-z+0.5,y+0.5', '-z,x,-y',
+ 'x+0.5,z+0.5,y+0.5', 'y,z,x', 'y,-z,-x', '-z+0.5,-y+0.5,x+0.5', '-y,z,-x', 'z+0.5,y+0.5,x+0.5',
+ '-y,-z,x', '-z+0.5,y+0.5,-x+0.5', 'z+0.5,-y+0.5,-x+0.5']
+ ncsym: ['x,y,z', 'y+0.5,-x+0.5,-z+0.5', '-x,-y,z', '-y+0.5,x+0.5,-z+0.5', 'x,-y,-z',
+ '-y+0.5,-x+0.5,z+0.5', '-x,y,-z', 'y+0.5,x+0.5,z+0.5', 'z,x,y', 'x+0.5,-z+0.5,-y+0.5',
+ '-z,-x,y', '-x+0.5,z+0.5,-y+0.5', 'z,-x,-y', '-x+0.5,-z+0.5,y+0.5', '-z,x,-y',
+ 'x+0.5,z+0.5,y+0.5', 'y,z,x', 'y,-z,-x', '-z+0.5,-y+0.5,x+0.5', '-y,z,-x', 'z+0.5,y+0.5,x+0.5',
+ '-y,-z,x', '-z+0.5,y+0.5,-x+0.5', 'z+0.5,-y+0.5,-x+0.5']
+ number: 218
+ schoenflies: Td^4
+ universal_h_m: P -4 3 n
+ F-43c:
+ spacegroup: F-43c
+ crystal_class: cubic
+ hall: ' F -4a 2 3'
+ hermann_mauguin: F -4 3 c
+ symops: ['x,y,z', 'y+0.5,-x,-z', '-x+0.5,-y+0.5,z', '-y,x+0.5,-z', 'x,-y,-z',
+ '-y+0.5,-x,z', '-x+0.5,y+0.5,-z', 'y,x+0.5,z', 'z,x,y', 'x+0.5,-z,-y', '-z+0.5,-x+0.5,y',
+ '-x,z+0.5,-y', 'z,-x,-y', '-x+0.5,-z,y', '-z+0.5,x+0.5,-y', 'x,z+0.5,y', 'y,z,x',
+ 'y,-z+0.5,-x+0.5', '-z,-y,x+0.5', '-y+0.5,z,-x+0.5', 'z+0.5,y,x', '-y,-z,x',
+ '-z,y,-x+0.5', 'z+0.5,-y+0.5,-x+0.5', 'x,y+0.5,z+0.5', 'y+0.5,-x+0.5,-z+0.5',
+ '-x+0.5,-y+1,z+0.5', '-y,x+1,-z+0.5', 'x,-y+0.5,-z+0.5', '-y+0.5,-x+0.5,z+0.5',
+ '-x+0.5,y+1,-z+0.5', 'y,x+1,z+0.5', 'z,x+0.5,y+0.5', 'x+0.5,-z+0.5,-y+0.5',
+ '-z+0.5,-x+1,y+0.5', '-x,z+1,-y+0.5', 'z,-x+0.5,-y+0.5', '-x+0.5,-z+0.5,y+0.5',
+ '-z+0.5,x+1,-y+0.5', 'x,z+1,y+0.5', 'y,z+0.5,x+0.5', 'y,-z+1,-x+1', '-z,-y+0.5,x+1',
+ '-y+0.5,z+0.5,-x+1', 'z+0.5,y+0.5,x+0.5', '-y,-z+0.5,x+0.5', '-z,y+0.5,-x+1',
+ 'z+0.5,-y+1,-x+1', 'x+0.5,y,z+0.5', 'y+1,-x,-z+0.5', '-x+1,-y+0.5,z+0.5', '-y+0.5,x+0.5,-z+0.5',
+ 'x+0.5,-y,-z+0.5', '-y+1,-x,z+0.5', '-x+1,y+0.5,-z+0.5', 'y+0.5,x+0.5,z+0.5',
+ 'z+0.5,x,y+0.5', 'x+1,-z,-y+0.5', '-z+1,-x+0.5,y+0.5', '-x+0.5,z+0.5,-y+0.5',
+ 'z+0.5,-x,-y+0.5', '-x+1,-z,y+0.5', '-z+1,x+0.5,-y+0.5', 'x+0.5,z+0.5,y+0.5',
+ 'y+0.5,z,x+0.5', 'y+0.5,-z+0.5,-x+1', '-z+0.5,-y,x+1', '-y+1,z,-x+1', 'z+1,y,x+0.5',
+ '-y+0.5,-z,x+0.5', '-z+0.5,y,-x+1', 'z+1,-y+0.5,-x+1', 'x+0.5,y+0.5,z', 'y+1,-x+0.5,-z',
+ '-x+1,-y+1,z', '-y+0.5,x+1,-z', 'x+0.5,-y+0.5,-z', '-y+1,-x+0.5,z', '-x+1,y+1,-z',
+ 'y+0.5,x+1,z', 'z+0.5,x+0.5,y', 'x+1,-z+0.5,-y', '-z+1,-x+1,y', '-x+0.5,z+1,-y',
+ 'z+0.5,-x+0.5,-y', '-x+1,-z+0.5,y', '-z+1,x+1,-y', 'x+0.5,z+1,y', 'y+0.5,z+0.5,x',
+ 'y+0.5,-z+1,-x+0.5', '-z+0.5,-y+0.5,x+0.5', '-y+1,z+0.5,-x+0.5', 'z+1,y+0.5,x',
+ '-y+0.5,-z+0.5,x', '-z+0.5,y+0.5,-x+0.5', 'z+1,-y+1,-x+0.5']
+ ncsym: ['x,y,z', 'y+0.5,-x,-z', '-x+0.5,-y+0.5,z', '-y,x+0.5,-z', 'x,-y,-z', '-y+0.5,-x,z',
+ '-x+0.5,y+0.5,-z', 'y,x+0.5,z', 'z,x,y', 'x+0.5,-z,-y', '-z+0.5,-x+0.5,y', '-x,z+0.5,-y',
+ 'z,-x,-y', '-x+0.5,-z,y', '-z+0.5,x+0.5,-y', 'x,z+0.5,y', 'y,z,x', 'y,-z+0.5,-x+0.5',
+ '-z,-y,x+0.5', '-y+0.5,z,-x+0.5', 'z+0.5,y,x', '-y,-z,x', '-z,y,-x+0.5', 'z+0.5,-y+0.5,-x+0.5']
+ number: 219
+ schoenflies: Td^5
+ universal_h_m: F -4 3 c
+ I-43d:
+ spacegroup: I-43d
+ crystal_class: cubic
+ hall: ' I -4bd 2c 3'
+ hermann_mauguin: I -4 3 d
+ symops: ['x,y,z', 'y+0.25,-x+0.75,-z+0.25', '-x,-y+0.5,z', '-y+0.75,x+0.75,-z+0.25',
+ 'x,-y,-z+0.5', '-y+0.25,-x+0.75,z+0.75', '-x,y+0.5,-z+0.5', 'y+0.75,x+0.75,z+0.75',
+ 'z,x,y', 'x+0.25,-z+0.75,-y+0.25', '-z,-x+0.5,y', '-x+0.75,z+0.75,-y+0.25',
+ 'z,-x,-y+0.5', '-x+0.25,-z+0.75,y+0.75', '-z,x+0.5,-y+0.5', 'x+0.75,z+0.75,y+0.75',
+ 'y,z,x', 'y,-z,-x+0.5', '-z+0.25,-y+0.75,x+0.75', '-y,z+0.5,-x+0.5', 'z+0.25,y+0.25,x+0.25',
+ '-y+0.5,-z,x+0.5', '-z+0.25,y+0.25,-x+0.75', 'z+0.75,-y+0.25,-x+0.75', 'x+0.5,y+0.5,z+0.5',
+ 'y+0.75,-x+1.25,-z+0.75', '-x+0.5,-y+1,z+0.5', '-y+1.25,x+1.25,-z+0.75', 'x+0.5,-y+0.5,-z+1',
+ '-y+0.75,-x+1.25,z+1.25', '-x+0.5,y+1,-z+1', 'y+1.25,x+1.25,z+1.25', 'z+0.5,x+0.5,y+0.5',
+ 'x+0.75,-z+1.25,-y+0.75', '-z+0.5,-x+1,y+0.5', '-x+1.25,z+1.25,-y+0.75', 'z+0.5,-x+0.5,-y+1',
+ '-x+0.75,-z+1.25,y+1.25', '-z+0.5,x+1,-y+1', 'x+1.25,z+1.25,y+1.25', 'y+0.5,z+0.5,x+0.5',
+ 'y+0.5,-z+0.5,-x+1', '-z+0.75,-y+1.25,x+1.25', '-y+0.5,z+1,-x+1', 'z+0.75,y+0.75,x+0.75',
+ '-y+1,-z+0.5,x+1', '-z+0.75,y+0.75,-x+1.25', 'z+1.25,-y+0.75,-x+1.25']
+ ncsym: ['x,y,z', 'y+0.25,-x+0.75,-z+0.25', '-x,-y+0.5,z', '-y+0.75,x+0.75,-z+0.25',
+ 'x,-y,-z+0.5', '-y+0.25,-x+0.75,z+0.75', '-x,y+0.5,-z+0.5', 'y+0.75,x+0.75,z+0.75',
+ 'z,x,y', 'x+0.25,-z+0.75,-y+0.25', '-z,-x+0.5,y', '-x+0.75,z+0.75,-y+0.25',
+ 'z,-x,-y+0.5', '-x+0.25,-z+0.75,y+0.75', '-z,x+0.5,-y+0.5', 'x+0.75,z+0.75,y+0.75',
+ 'y,z,x', 'y,-z,-x+0.5', '-z+0.25,-y+0.75,x+0.75', '-y,z+0.5,-x+0.5', 'z+0.25,y+0.25,x+0.25',
+ '-y+0.5,-z,x+0.5', '-z+0.25,y+0.25,-x+0.75', 'z+0.75,-y+0.25,-x+0.75']
+ number: 220
+ schoenflies: Td^6
+ universal_h_m: I -4 3 d
+ Pm-3m:
+ spacegroup: Pm-3m
+ crystal_class: cubic
+ hall: -P 4 2 3
+ hermann_mauguin: P m -3 m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z', '-z,-x,-y', 'x,-z,-y', 'z,x,-y', '-x,z,-y', '-z,x,y', '-x,-z,y',
+ 'z,-x,y', 'x,z,y', '-y,-z,-x', '-y,z,x', '-z,-y,x', 'y,-z,x', 'z,y,x', 'y,z,-x',
+ '-z,y,-x', 'z,-y,-x']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z', '-z,-x,-y', 'x,-z,-y', 'z,x,-y', '-x,z,-y', '-z,x,y', '-x,-z,y',
+ 'z,-x,y', 'x,z,y', '-y,-z,-x', '-y,z,x', '-z,-y,x', 'y,-z,x', 'z,y,x', 'y,z,-x',
+ '-z,y,-x', 'z,-y,-x']
+ number: 221
+ schoenflies: Oh^1
+ universal_h_m: P m -3 m
+ Pn-3n:
+ spacegroup: Pn-3n
+ crystal_class: cubic
+ hall: ' P 4 2 3 -1n'
+ hermann_mauguin: P n -3 n
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,x+0.5,z+0.5', '-z+0.5,-x+0.5,-y+0.5', 'x+0.5,-z+0.5,-y+0.5', 'z+0.5,x+0.5,-y+0.5',
+ '-x+0.5,z+0.5,-y+0.5', '-z+0.5,x+0.5,y+0.5', '-x+0.5,-z+0.5,y+0.5', 'z+0.5,-x+0.5,y+0.5',
+ 'x+0.5,z+0.5,y+0.5', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z+0.5,x+0.5', '-z+0.5,-y+0.5,x+0.5',
+ 'y+0.5,-z+0.5,x+0.5', 'z+0.5,y+0.5,x+0.5', 'y+0.5,z+0.5,-x+0.5', '-z+0.5,y+0.5,-x+0.5',
+ 'z+0.5,-y+0.5,-x+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,x+0.5,z+0.5', '-z+0.5,-x+0.5,-y+0.5', 'x+0.5,-z+0.5,-y+0.5', 'z+0.5,x+0.5,-y+0.5',
+ '-x+0.5,z+0.5,-y+0.5', '-z+0.5,x+0.5,y+0.5', '-x+0.5,-z+0.5,y+0.5', 'z+0.5,-x+0.5,y+0.5',
+ 'x+0.5,z+0.5,y+0.5', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z+0.5,x+0.5', '-z+0.5,-y+0.5,x+0.5',
+ 'y+0.5,-z+0.5,x+0.5', 'z+0.5,y+0.5,x+0.5', 'y+0.5,z+0.5,-x+0.5', '-z+0.5,y+0.5,-x+0.5',
+ 'z+0.5,-y+0.5,-x+0.5']
+ number: 222
+ schoenflies: Oh^2
+ universal_h_m: P n -3 n :1
+ Pm-3n:
+ spacegroup: Pm-3n
+ crystal_class: cubic
+ hall: -P 4n 2 3
+ hermann_mauguin: P m -3 n
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z',
+ 'y+0.5,x+0.5,-z+0.5', '-x,y,-z', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z+0.5,y+0.5',
+ '-z,-x,y', 'x+0.5,-z+0.5,y+0.5', 'z,-x,-y', 'x+0.5,z+0.5,-y+0.5', '-z,x,-y',
+ '-x+0.5,-z+0.5,-y+0.5', 'y,z,x', 'y,-z,-x', 'z+0.5,y+0.5,-x+0.5', '-y,z,-x',
+ '-z+0.5,-y+0.5,-x+0.5', '-y,-z,x', 'z+0.5,-y+0.5,x+0.5', '-z+0.5,y+0.5,x+0.5',
+ '-x,-y,-z', 'y-0.5,-x-0.5,-z-0.5', 'x,y,-z', '-y-0.5,x-0.5,-z-0.5', '-x,y,z',
+ '-y-0.5,-x-0.5,z-0.5', 'x,-y,z', 'y-0.5,x-0.5,z-0.5', '-z,-x,-y', 'x-0.5,-z-0.5,-y-0.5',
+ 'z,x,-y', '-x-0.5,z-0.5,-y-0.5', '-z,x,y', '-x-0.5,-z-0.5,y-0.5', 'z,-x,y',
+ 'x-0.5,z-0.5,y-0.5', '-y,-z,-x', '-y,z,x', '-z-0.5,-y-0.5,x-0.5', 'y,-z,x',
+ 'z-0.5,y-0.5,x-0.5', 'y,z,-x', '-z-0.5,y-0.5,-x-0.5', 'z-0.5,-y-0.5,-x-0.5']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z',
+ 'y+0.5,x+0.5,-z+0.5', '-x,y,-z', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z+0.5,y+0.5',
+ '-z,-x,y', 'x+0.5,-z+0.5,y+0.5', 'z,-x,-y', 'x+0.5,z+0.5,-y+0.5', '-z,x,-y',
+ '-x+0.5,-z+0.5,-y+0.5', 'y,z,x', 'y,-z,-x', 'z+0.5,y+0.5,-x+0.5', '-y,z,-x',
+ '-z+0.5,-y+0.5,-x+0.5', '-y,-z,x', 'z+0.5,-y+0.5,x+0.5', '-z+0.5,y+0.5,x+0.5',
+ '-x,-y,-z', 'y-0.5,-x-0.5,-z-0.5', 'x,y,-z', '-y-0.5,x-0.5,-z-0.5', '-x,y,z',
+ '-y-0.5,-x-0.5,z-0.5', 'x,-y,z', 'y-0.5,x-0.5,z-0.5', '-z,-x,-y', 'x-0.5,-z-0.5,-y-0.5',
+ 'z,x,-y', '-x-0.5,z-0.5,-y-0.5', '-z,x,y', '-x-0.5,-z-0.5,y-0.5', 'z,-x,y',
+ 'x-0.5,z-0.5,y-0.5', '-y,-z,-x', '-y,z,x', '-z-0.5,-y-0.5,x-0.5', 'y,-z,x',
+ 'z-0.5,y-0.5,x-0.5', 'y,z,-x', '-z-0.5,y-0.5,-x-0.5', 'z-0.5,-y-0.5,-x-0.5']
+ number: 223
+ schoenflies: Oh^3
+ universal_h_m: P m -3 n
+ Pn-3m:
+ spacegroup: Pn-3m
+ crystal_class: cubic
+ hall: ' P 4n 2 3 -1n'
+ hermann_mauguin: P n -3 m
+ symops: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z',
+ 'y+0.5,x+0.5,-z+0.5', '-x,y,-z', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z+0.5,y+0.5',
+ '-z,-x,y', 'x+0.5,-z+0.5,y+0.5', 'z,-x,-y', 'x+0.5,z+0.5,-y+0.5', '-z,x,-y',
+ '-x+0.5,-z+0.5,-y+0.5', 'y,z,x', 'y,-z,-x', 'z+0.5,y+0.5,-x+0.5', '-y,z,-x',
+ '-z+0.5,-y+0.5,-x+0.5', '-y,-z,x', 'z+0.5,-y+0.5,x+0.5', '-z+0.5,y+0.5,x+0.5',
+ '-x+0.5,-y+0.5,-z+0.5', 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x+0.5,y+0.5,z+0.5',
+ '-y,-x,z', 'x+0.5,-y+0.5,z+0.5', 'y,x,z', '-z+0.5,-x+0.5,-y+0.5', 'x,-z,-y',
+ 'z+0.5,x+0.5,-y+0.5', '-x,z,-y', '-z+0.5,x+0.5,y+0.5', '-x,-z,y', 'z+0.5,-x+0.5,y+0.5',
+ 'x,z,y', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z+0.5,x+0.5', '-z,-y,x', 'y+0.5,-z+0.5,x+0.5',
+ 'z,y,x', 'y+0.5,z+0.5,-x+0.5', '-z,y,-x', 'z,-y,-x']
+ ncsym: ['x,y,z', '-y+0.5,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x+0.5,z+0.5', 'x,-y,-z',
+ 'y+0.5,x+0.5,-z+0.5', '-x,y,-z', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z+0.5,y+0.5',
+ '-z,-x,y', 'x+0.5,-z+0.5,y+0.5', 'z,-x,-y', 'x+0.5,z+0.5,-y+0.5', '-z,x,-y',
+ '-x+0.5,-z+0.5,-y+0.5', 'y,z,x', 'y,-z,-x', 'z+0.5,y+0.5,-x+0.5', '-y,z,-x',
+ '-z+0.5,-y+0.5,-x+0.5', '-y,-z,x', 'z+0.5,-y+0.5,x+0.5', '-z+0.5,y+0.5,x+0.5',
+ '-x+0.5,-y+0.5,-z+0.5', 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z', '-x+0.5,y+0.5,z+0.5',
+ '-y,-x,z', 'x+0.5,-y+0.5,z+0.5', 'y,x,z', '-z+0.5,-x+0.5,-y+0.5', 'x,-z,-y',
+ 'z+0.5,x+0.5,-y+0.5', '-x,z,-y', '-z+0.5,x+0.5,y+0.5', '-x,-z,y', 'z+0.5,-x+0.5,y+0.5',
+ 'x,z,y', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z+0.5,x+0.5', '-z,-y,x', 'y+0.5,-z+0.5,x+0.5',
+ 'z,y,x', 'y+0.5,z+0.5,-x+0.5', '-z,y,-x', 'z,-y,-x']
+ number: 224
+ schoenflies: Oh^4
+ universal_h_m: P n -3 m :1
+ Fm-3m:
+ spacegroup: Fm-3m
+ crystal_class: cubic
+ hall: -F 4 2 3
+ hermann_mauguin: F m -3 m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z', '-z,-x,-y', 'x,-z,-y', 'z,x,-y', '-x,z,-y', '-z,x,y', '-x,-z,y',
+ 'z,-x,y', 'x,z,y', '-y,-z,-x', '-y,z,x', '-z,-y,x', 'y,-z,x', 'z,y,x', 'y,z,-x',
+ '-z,y,-x', 'z,-y,-x', 'x,y+0.5,z+0.5', '-y,x+0.5,z+0.5', '-x,-y+0.5,z+0.5',
+ 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z+0.5', 'y,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x+0.5,-z+0.5',
+ 'z,x+0.5,y+0.5', '-x,z+0.5,y+0.5', '-z,-x+0.5,y+0.5', 'x,-z+0.5,y+0.5', 'z,-x+0.5,-y+0.5',
+ 'x,z+0.5,-y+0.5', '-z,x+0.5,-y+0.5', '-x,-z+0.5,-y+0.5', 'y,z+0.5,x+0.5', 'y,-z+0.5,-x+0.5',
+ 'z,y+0.5,-x+0.5', '-y,z+0.5,-x+0.5', '-z,-y+0.5,-x+0.5', '-y,-z+0.5,x+0.5',
+ 'z,-y+0.5,x+0.5', '-z,y+0.5,x+0.5', '-x,-y+0.5,-z+0.5', 'y,-x+0.5,-z+0.5', 'x,y+0.5,-z+0.5',
+ '-y,x+0.5,-z+0.5', '-x,y+0.5,z+0.5', '-y,-x+0.5,z+0.5', 'x,-y+0.5,z+0.5', 'y,x+0.5,z+0.5',
+ '-z,-x+0.5,-y+0.5', 'x,-z+0.5,-y+0.5', 'z,x+0.5,-y+0.5', '-x,z+0.5,-y+0.5',
+ '-z,x+0.5,y+0.5', '-x,-z+0.5,y+0.5', 'z,-x+0.5,y+0.5', 'x,z+0.5,y+0.5', '-y,-z+0.5,-x+0.5',
+ '-y,z+0.5,x+0.5', '-z,-y+0.5,x+0.5', 'y,-z+0.5,x+0.5', 'z,y+0.5,x+0.5', 'y,z+0.5,-x+0.5',
+ '-z,y+0.5,-x+0.5', 'z,-y+0.5,-x+0.5', 'x+0.5,y,z+0.5', '-y+0.5,x,z+0.5', '-x+0.5,-y,z+0.5',
+ 'y+0.5,-x,z+0.5', 'x+0.5,-y,-z+0.5', 'y+0.5,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x,-z+0.5',
+ 'z+0.5,x,y+0.5', '-x+0.5,z,y+0.5', '-z+0.5,-x,y+0.5', 'x+0.5,-z,y+0.5', 'z+0.5,-x,-y+0.5',
+ 'x+0.5,z,-y+0.5', '-z+0.5,x,-y+0.5', '-x+0.5,-z,-y+0.5', 'y+0.5,z,x+0.5', 'y+0.5,-z,-x+0.5',
+ 'z+0.5,y,-x+0.5', '-y+0.5,z,-x+0.5', '-z+0.5,-y,-x+0.5', '-y+0.5,-z,x+0.5',
+ 'z+0.5,-y,x+0.5', '-z+0.5,y,x+0.5', '-x+0.5,-y,-z+0.5', 'y+0.5,-x,-z+0.5', 'x+0.5,y,-z+0.5',
+ '-y+0.5,x,-z+0.5', '-x+0.5,y,z+0.5', '-y+0.5,-x,z+0.5', 'x+0.5,-y,z+0.5', 'y+0.5,x,z+0.5',
+ '-z+0.5,-x,-y+0.5', 'x+0.5,-z,-y+0.5', 'z+0.5,x,-y+0.5', '-x+0.5,z,-y+0.5',
+ '-z+0.5,x,y+0.5', '-x+0.5,-z,y+0.5', 'z+0.5,-x,y+0.5', 'x+0.5,z,y+0.5', '-y+0.5,-z,-x+0.5',
+ '-y+0.5,z,x+0.5', '-z+0.5,-y,x+0.5', 'y+0.5,-z,x+0.5', 'z+0.5,y,x+0.5', 'y+0.5,z,-x+0.5',
+ '-z+0.5,y,-x+0.5', 'z+0.5,-y,-x+0.5', 'x+0.5,y+0.5,z', '-y+0.5,x+0.5,z', '-x+0.5,-y+0.5,z',
+ 'y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,-z', 'y+0.5,x+0.5,-z', '-x+0.5,y+0.5,-z', '-y+0.5,-x+0.5,-z',
+ 'z+0.5,x+0.5,y', '-x+0.5,z+0.5,y', '-z+0.5,-x+0.5,y', 'x+0.5,-z+0.5,y', 'z+0.5,-x+0.5,-y',
+ 'x+0.5,z+0.5,-y', '-z+0.5,x+0.5,-y', '-x+0.5,-z+0.5,-y', 'y+0.5,z+0.5,x', 'y+0.5,-z+0.5,-x',
+ 'z+0.5,y+0.5,-x', '-y+0.5,z+0.5,-x', '-z+0.5,-y+0.5,-x', '-y+0.5,-z+0.5,x',
+ 'z+0.5,-y+0.5,x', '-z+0.5,y+0.5,x', '-x+0.5,-y+0.5,-z', 'y+0.5,-x+0.5,-z', 'x+0.5,y+0.5,-z',
+ '-y+0.5,x+0.5,-z', '-x+0.5,y+0.5,z', '-y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,z', 'y+0.5,x+0.5,z',
+ '-z+0.5,-x+0.5,-y', 'x+0.5,-z+0.5,-y', 'z+0.5,x+0.5,-y', '-x+0.5,z+0.5,-y',
+ '-z+0.5,x+0.5,y', '-x+0.5,-z+0.5,y', 'z+0.5,-x+0.5,y', 'x+0.5,z+0.5,y', '-y+0.5,-z+0.5,-x',
+ '-y+0.5,z+0.5,x', '-z+0.5,-y+0.5,x', 'y+0.5,-z+0.5,x', 'z+0.5,y+0.5,x', 'y+0.5,z+0.5,-x',
+ '-z+0.5,y+0.5,-x', 'z+0.5,-y+0.5,-x']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z', '-z,-x,-y', 'x,-z,-y', 'z,x,-y', '-x,z,-y', '-z,x,y', '-x,-z,y',
+ 'z,-x,y', 'x,z,y', '-y,-z,-x', '-y,z,x', '-z,-y,x', 'y,-z,x', 'z,y,x', 'y,z,-x',
+ '-z,y,-x', 'z,-y,-x']
+ number: 225
+ schoenflies: Oh^5
+ universal_h_m: F m -3 m
+ Fm-3c:
+ spacegroup: Fm-3c
+ crystal_class: cubic
+ hall: -F 4a 2 3
+ hermann_mauguin: F m -3 c
+ symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y,-z', 'y+0.5,x,-z',
+ '-x+0.5,y+0.5,-z', '-y,-x+0.5,-z', 'z,x,y', '-x+0.5,z,y', '-z+0.5,-x+0.5,y',
+ 'x,-z+0.5,y', 'z,-x,-y', 'x+0.5,z,-y', '-z+0.5,x+0.5,-y', '-x,-z+0.5,-y', 'y,z,x',
+ 'y,-z+0.5,-x+0.5', 'z,y,-x+0.5', '-y+0.5,z,-x+0.5', '-z+0.5,-y,-x', '-y,-z,x',
+ 'z,-y,x+0.5', '-z+0.5,y+0.5,x+0.5', '-x,-y,-z', 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z',
+ '-y,x-0.5,-z', '-x,y,z', '-y-0.5,-x,z', 'x-0.5,-y-0.5,z', 'y,x-0.5,z', '-z,-x,-y',
+ 'x-0.5,-z,-y', 'z-0.5,x-0.5,-y', '-x,z-0.5,-y', '-z,x,y', '-x-0.5,-z,y', 'z-0.5,-x-0.5,y',
+ 'x,z-0.5,y', '-y,-z,-x', '-y,z-0.5,x-0.5', '-z,-y,x-0.5', 'y-0.5,-z,x-0.5',
+ 'z-0.5,y,x', 'y,z,-x', '-z,y,-x-0.5', 'z-0.5,-y-0.5,-x-0.5', 'x,y+0.5,z+0.5',
+ '-y+0.5,x+0.5,z+0.5', '-x+0.5,-y+1,z+0.5', 'y,-x+1,z+0.5', 'x,-y+0.5,-z+0.5',
+ 'y+0.5,x+0.5,-z+0.5', '-x+0.5,y+1,-z+0.5', '-y,-x+1,-z+0.5', 'z,x+0.5,y+0.5',
+ '-x+0.5,z+0.5,y+0.5', '-z+0.5,-x+1,y+0.5', 'x,-z+1,y+0.5', 'z,-x+0.5,-y+0.5',
+ 'x+0.5,z+0.5,-y+0.5', '-z+0.5,x+1,-y+0.5', '-x,-z+1,-y+0.5', 'y,z+0.5,x+0.5',
+ 'y,-z+1,-x+1', 'z,y+0.5,-x+1', '-y+0.5,z+0.5,-x+1', '-z+0.5,-y+0.5,-x+0.5',
+ '-y,-z+0.5,x+0.5', 'z,-y+0.5,x+1', '-z+0.5,y+1,x+1', '-x,-y+0.5,-z+0.5', 'y-0.5,-x+0.5,-z+0.5',
+ 'x-0.5,y,-z+0.5', '-y,x,-z+0.5', '-x,y+0.5,z+0.5', '-y-0.5,-x+0.5,z+0.5', 'x-0.5,-y,z+0.5',
+ 'y,x,z+0.5', '-z,-x+0.5,-y+0.5', 'x-0.5,-z+0.5,-y+0.5', 'z-0.5,x,-y+0.5', '-x,z,-y+0.5',
+ '-z,x+0.5,y+0.5', '-x-0.5,-z+0.5,y+0.5', 'z-0.5,-x,y+0.5', 'x,z,y+0.5', '-y,-z+0.5,-x+0.5',
+ '-y,z,x', '-z,-y+0.5,x', 'y-0.5,-z+0.5,x', 'z-0.5,y+0.5,x+0.5', 'y,z+0.5,-x+0.5',
+ '-z,y+0.5,-x', 'z-0.5,-y,-x', 'x+0.5,y,z+0.5', '-y+1,x,z+0.5', '-x+1,-y+0.5,z+0.5',
+ 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y,-z+0.5', 'y+1,x,-z+0.5', '-x+1,y+0.5,-z+0.5',
+ '-y+0.5,-x+0.5,-z+0.5', 'z+0.5,x,y+0.5', '-x+1,z,y+0.5', '-z+1,-x+0.5,y+0.5',
+ 'x+0.5,-z+0.5,y+0.5', 'z+0.5,-x,-y+0.5', 'x+1,z,-y+0.5', '-z+1,x+0.5,-y+0.5',
+ '-x+0.5,-z+0.5,-y+0.5', 'y+0.5,z,x+0.5', 'y+0.5,-z+0.5,-x+1', 'z+0.5,y,-x+1',
+ '-y+1,z,-x+1', '-z+1,-y,-x+0.5', '-y+0.5,-z,x+0.5', 'z+0.5,-y,x+1', '-z+1,y+0.5,x+1',
+ '-x+0.5,-y,-z+0.5', 'y,-x,-z+0.5', 'x,y-0.5,-z+0.5', '-y+0.5,x-0.5,-z+0.5',
+ '-x+0.5,y,z+0.5', '-y,-x,z+0.5', 'x,-y-0.5,z+0.5', 'y+0.5,x-0.5,z+0.5', '-z+0.5,-x,-y+0.5',
+ 'x,-z,-y+0.5', 'z,x-0.5,-y+0.5', '-x+0.5,z-0.5,-y+0.5', '-z+0.5,x,y+0.5', '-x,-z,y+0.5',
+ 'z,-x-0.5,y+0.5', 'x+0.5,z-0.5,y+0.5', '-y+0.5,-z,-x+0.5', '-y+0.5,z-0.5,x',
+ '-z+0.5,-y,x', 'y,-z,x', 'z,y,x+0.5', 'y+0.5,z,-x+0.5', '-z+0.5,y,-x', 'z,-y-0.5,-x',
+ 'x+0.5,y+0.5,z', '-y+1,x+0.5,z', '-x+1,-y+1,z', 'y+0.5,-x+1,z', 'x+0.5,-y+0.5,-z',
+ 'y+1,x+0.5,-z', '-x+1,y+1,-z', '-y+0.5,-x+1,-z', 'z+0.5,x+0.5,y', '-x+1,z+0.5,y',
+ '-z+1,-x+1,y', 'x+0.5,-z+1,y', 'z+0.5,-x+0.5,-y', 'x+1,z+0.5,-y', '-z+1,x+1,-y',
+ '-x+0.5,-z+1,-y', 'y+0.5,z+0.5,x', 'y+0.5,-z+1,-x+0.5', 'z+0.5,y+0.5,-x+0.5',
+ '-y+1,z+0.5,-x+0.5', '-z+1,-y+0.5,-x', '-y+0.5,-z+0.5,x', 'z+0.5,-y+0.5,x+0.5',
+ '-z+1,y+1,x+0.5', '-x+0.5,-y+0.5,-z', 'y,-x+0.5,-z', 'x,y,-z', '-y+0.5,x,-z',
+ '-x+0.5,y+0.5,z', '-y,-x+0.5,z', 'x,-y,z', 'y+0.5,x,z', '-z+0.5,-x+0.5,-y',
+ 'x,-z+0.5,-y', 'z,x,-y', '-x+0.5,z,-y', '-z+0.5,x+0.5,y', '-x,-z+0.5,y', 'z,-x,y',
+ 'x+0.5,z,y', '-y+0.5,-z+0.5,-x', '-y+0.5,z,x-0.5', '-z+0.5,-y+0.5,x-0.5', 'y,-z+0.5,x-0.5',
+ 'z,y+0.5,x', 'y+0.5,z+0.5,-x', '-z+0.5,y+0.5,-x-0.5', 'z,-y,-x-0.5']
+ ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y,-z', 'y+0.5,x,-z',
+ '-x+0.5,y+0.5,-z', '-y,-x+0.5,-z', 'z,x,y', '-x+0.5,z,y', '-z+0.5,-x+0.5,y',
+ 'x,-z+0.5,y', 'z,-x,-y', 'x+0.5,z,-y', '-z+0.5,x+0.5,-y', '-x,-z+0.5,-y', 'y,z,x',
+ 'y,-z+0.5,-x+0.5', 'z,y,-x+0.5', '-y+0.5,z,-x+0.5', '-z+0.5,-y,-x', '-y,-z,x',
+ 'z,-y,x+0.5', '-z+0.5,y+0.5,x+0.5', '-x,-y,-z', 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z',
+ '-y,x-0.5,-z', '-x,y,z', '-y-0.5,-x,z', 'x-0.5,-y-0.5,z', 'y,x-0.5,z', '-z,-x,-y',
+ 'x-0.5,-z,-y', 'z-0.5,x-0.5,-y', '-x,z-0.5,-y', '-z,x,y', '-x-0.5,-z,y', 'z-0.5,-x-0.5,y',
+ 'x,z-0.5,y', '-y,-z,-x', '-y,z-0.5,x-0.5', '-z,-y,x-0.5', 'y-0.5,-z,x-0.5',
+ 'z-0.5,y,x', 'y,z,-x', '-z,y,-x-0.5', 'z-0.5,-y-0.5,-x-0.5']
+ number: 226
+ schoenflies: Oh^6
+ universal_h_m: F m -3 c
+ Fd-3m:
+ spacegroup: Fd-3m
+ crystal_class: cubic
+ hall: ' F 4d 2 3 -1d'
+ hermann_mauguin: F d -3 m
+ symops: ['x,y,z', '-y+0.25,x+0.25,z+0.25', '-x,-y+0.5,z+0.5', 'y+0.75,-x+0.25,z+0.75',
+ 'x,-y,-z', 'y+0.25,x+0.25,-z+0.25', '-x,y+0.5,-z+0.5', '-y+0.75,-x+0.25,-z+0.75',
+ 'z,x,y', '-x+0.25,z+0.25,y+0.25', '-z,-x+0.5,y+0.5', 'x+0.75,-z+0.25,y+0.75',
+ 'z,-x,-y', 'x+0.25,z+0.25,-y+0.25', '-z,x+0.5,-y+0.5', '-x+0.75,-z+0.25,-y+0.75',
+ 'y,z,x', 'y+0.5,-z,-x+0.5', 'z+0.25,y+0.75,-x+0.75', '-y+0.5,z+0.5,-x', '-z+0.25,-y+0.25,-x+0.25',
+ '-y,-z,x', 'z+0.25,-y+0.75,x+0.75', '-z+0.75,y+0.75,x+0.25', '-x+0.25,-y+0.25,-z+0.25',
+ 'y,-x,-z', 'x+0.25,y-0.25,-z-0.25', '-y-0.5,x,-z-0.5', '-x+0.25,y+0.25,z+0.25',
+ '-y,-x,z', 'x+0.25,-y-0.25,z-0.25', 'y-0.5,x,z-0.5', '-z+0.25,-x+0.25,-y+0.25',
+ 'x,-z,-y', 'z+0.25,x-0.25,-y-0.25', '-x-0.5,z,-y-0.5', '-z+0.25,x+0.25,y+0.25',
+ '-x,-z,y', 'z+0.25,-x-0.25,y-0.25', 'x-0.5,z,y-0.5', '-y+0.25,-z+0.25,-x+0.25',
+ '-y-0.25,z+0.25,x-0.25', '-z,-y-0.5,x-0.5', 'y-0.25,-z-0.25,x+0.25', 'z,y,x',
+ 'y+0.25,z+0.25,-x+0.25', '-z,y-0.5,-x-0.5', 'z-0.5,-y-0.5,-x', 'x,y+0.5,z+0.5',
+ '-y+0.25,x+0.75,z+0.75', '-x,-y+1,z+1', 'y+0.75,-x+0.75,z+1.25', 'x,-y+0.5,-z+0.5',
+ 'y+0.25,x+0.75,-z+0.75', '-x,y+1,-z+1', '-y+0.75,-x+0.75,-z+1.25', 'z,x+0.5,y+0.5',
+ '-x+0.25,z+0.75,y+0.75', '-z,-x+1,y+1', 'x+0.75,-z+0.75,y+1.25', 'z,-x+0.5,-y+0.5',
+ 'x+0.25,z+0.75,-y+0.75', '-z,x+1,-y+1', '-x+0.75,-z+0.75,-y+1.25', 'y,z+0.5,x+0.5',
+ 'y+0.5,-z+0.5,-x+1', 'z+0.25,y+1.25,-x+1.25', '-y+0.5,z+1,-x+0.5', '-z+0.25,-y+0.75,-x+0.75',
+ '-y,-z+0.5,x+0.5', 'z+0.25,-y+1.25,x+1.25', '-z+0.75,y+1.25,x+0.75', '-x+0.25,-y+0.75,-z+0.75',
+ 'y,-x+0.5,-z+0.5', 'x+0.25,y+0.25,-z+0.25', '-y-0.5,x+0.5,-z', '-x+0.25,y+0.75,z+0.75',
+ '-y,-x+0.5,z+0.5', 'x+0.25,-y+0.25,z+0.25', 'y-0.5,x+0.5,z', '-z+0.25,-x+0.75,-y+0.75',
+ 'x,-z+0.5,-y+0.5', 'z+0.25,x+0.25,-y+0.25', '-x-0.5,z+0.5,-y', '-z+0.25,x+0.75,y+0.75',
+ '-x,-z+0.5,y+0.5', 'z+0.25,-x+0.25,y+0.25', 'x-0.5,z+0.5,y', '-y+0.25,-z+0.75,-x+0.75',
+ '-y-0.25,z+0.75,x+0.25', '-z,-y,x', 'y-0.25,-z+0.25,x+0.75', 'z,y+0.5,x+0.5',
+ 'y+0.25,z+0.75,-x+0.75', '-z,y,-x', 'z-0.5,-y,-x+0.5', 'x+0.5,y,z+0.5', '-y+0.75,x+0.25,z+0.75',
+ '-x+0.5,-y+0.5,z+1', 'y+1.25,-x+0.25,z+1.25', 'x+0.5,-y,-z+0.5', 'y+0.75,x+0.25,-z+0.75',
+ '-x+0.5,y+0.5,-z+1', '-y+1.25,-x+0.25,-z+1.25', 'z+0.5,x,y+0.5', '-x+0.75,z+0.25,y+0.75',
+ '-z+0.5,-x+0.5,y+1', 'x+1.25,-z+0.25,y+1.25', 'z+0.5,-x,-y+0.5', 'x+0.75,z+0.25,-y+0.75',
+ '-z+0.5,x+0.5,-y+1', '-x+1.25,-z+0.25,-y+1.25', 'y+0.5,z,x+0.5', 'y+1,-z,-x+1',
+ 'z+0.75,y+0.75,-x+1.25', '-y+1,z+0.5,-x+0.5', '-z+0.75,-y+0.25,-x+0.75', '-y+0.5,-z,x+0.5',
+ 'z+0.75,-y+0.75,x+1.25', '-z+1.25,y+0.75,x+0.75', '-x+0.75,-y+0.25,-z+0.75',
+ 'y+0.5,-x,-z+0.5', 'x+0.75,y-0.25,-z+0.25', '-y,x,-z', '-x+0.75,y+0.25,z+0.75',
+ '-y+0.5,-x,z+0.5', 'x+0.75,-y-0.25,z+0.25', 'y,x,z', '-z+0.75,-x+0.25,-y+0.75',
+ 'x+0.5,-z,-y+0.5', 'z+0.75,x-0.25,-y+0.25', '-x,z,-y', '-z+0.75,x+0.25,y+0.75',
+ '-x+0.5,-z,y+0.5', 'z+0.75,-x-0.25,y+0.25', 'x,z,y', '-y+0.75,-z+0.25,-x+0.75',
+ '-y+0.25,z+0.25,x+0.25', '-z+0.5,-y-0.5,x', 'y+0.25,-z-0.25,x+0.75', 'z+0.5,y,x+0.5',
+ 'y+0.75,z+0.25,-x+0.75', '-z+0.5,y-0.5,-x', 'z,-y-0.5,-x+0.5', 'x+0.5,y+0.5,z',
+ '-y+0.75,x+0.75,z+0.25', '-x+0.5,-y+1,z+0.5', 'y+1.25,-x+0.75,z+0.75', 'x+0.5,-y+0.5,-z',
+ 'y+0.75,x+0.75,-z+0.25', '-x+0.5,y+1,-z+0.5', '-y+1.25,-x+0.75,-z+0.75', 'z+0.5,x+0.5,y',
+ '-x+0.75,z+0.75,y+0.25', '-z+0.5,-x+1,y+0.5', 'x+1.25,-z+0.75,y+0.75', 'z+0.5,-x+0.5,-y',
+ 'x+0.75,z+0.75,-y+0.25', '-z+0.5,x+1,-y+0.5', '-x+1.25,-z+0.75,-y+0.75', 'y+0.5,z+0.5,x',
+ 'y+1,-z+0.5,-x+0.5', 'z+0.75,y+1.25,-x+0.75', '-y+1,z+1,-x', '-z+0.75,-y+0.75,-x+0.25',
+ '-y+0.5,-z+0.5,x', 'z+0.75,-y+1.25,x+0.75', '-z+1.25,y+1.25,x+0.25', '-x+0.75,-y+0.75,-z+0.25',
+ 'y+0.5,-x+0.5,-z', 'x+0.75,y+0.25,-z-0.25', '-y,x+0.5,-z-0.5', '-x+0.75,y+0.75,z+0.25',
+ '-y+0.5,-x+0.5,z', 'x+0.75,-y+0.25,z-0.25', 'y,x+0.5,z-0.5', '-z+0.75,-x+0.75,-y+0.25',
+ 'x+0.5,-z+0.5,-y', 'z+0.75,x+0.25,-y-0.25', '-x,z+0.5,-y-0.5', '-z+0.75,x+0.75,y+0.25',
+ '-x+0.5,-z+0.5,y', 'z+0.75,-x+0.25,y-0.25', 'x,z+0.5,y-0.5', '-y+0.75,-z+0.75,-x+0.25',
+ '-y+0.25,z+0.75,x-0.25', '-z+0.5,-y,x-0.5', 'y+0.25,-z+0.25,x+0.25', 'z+0.5,y+0.5,x',
+ 'y+0.75,z+0.75,-x+0.25', '-z+0.5,y,-x-0.5', 'z,-y,-x']
+ ncsym: ['x,y,z', '-y+0.25,x+0.25,z+0.25', '-x,-y+0.5,z+0.5', 'y+0.75,-x+0.25,z+0.75',
+ 'x,-y,-z', 'y+0.25,x+0.25,-z+0.25', '-x,y+0.5,-z+0.5', '-y+0.75,-x+0.25,-z+0.75',
+ 'z,x,y', '-x+0.25,z+0.25,y+0.25', '-z,-x+0.5,y+0.5', 'x+0.75,-z+0.25,y+0.75',
+ 'z,-x,-y', 'x+0.25,z+0.25,-y+0.25', '-z,x+0.5,-y+0.5', '-x+0.75,-z+0.25,-y+0.75',
+ 'y,z,x', 'y+0.5,-z,-x+0.5', 'z+0.25,y+0.75,-x+0.75', '-y+0.5,z+0.5,-x', '-z+0.25,-y+0.25,-x+0.25',
+ '-y,-z,x', 'z+0.25,-y+0.75,x+0.75', '-z+0.75,y+0.75,x+0.25', '-x+0.25,-y+0.25,-z+0.25',
+ 'y,-x,-z', 'x+0.25,y-0.25,-z-0.25', '-y-0.5,x,-z-0.5', '-x+0.25,y+0.25,z+0.25',
+ '-y,-x,z', 'x+0.25,-y-0.25,z-0.25', 'y-0.5,x,z-0.5', '-z+0.25,-x+0.25,-y+0.25',
+ 'x,-z,-y', 'z+0.25,x-0.25,-y-0.25', '-x-0.5,z,-y-0.5', '-z+0.25,x+0.25,y+0.25',
+ '-x,-z,y', 'z+0.25,-x-0.25,y-0.25', 'x-0.5,z,y-0.5', '-y+0.25,-z+0.25,-x+0.25',
+ '-y-0.25,z+0.25,x-0.25', '-z,-y-0.5,x-0.5', 'y-0.25,-z-0.25,x+0.25', 'z,y,x',
+ 'y+0.25,z+0.25,-x+0.25', '-z,y-0.5,-x-0.5', 'z-0.5,-y-0.5,-x']
+ number: 227
+ schoenflies: Oh^7
+ universal_h_m: F d -3 m :1
+ Fd-3c:
+ spacegroup: Fd-3c
+ crystal_class: cubic
+ hall: ' F 4d 2 3 -1ad'
+ hermann_mauguin: F d -3 c
+ symops: ['x,y,z', '-y+0.25,x+0.25,z+0.25', '-x,-y+0.5,z+0.5', 'y+0.75,-x+0.25,z+0.75',
+ 'x,-y,-z', 'y+0.25,x+0.25,-z+0.25', '-x,y+0.5,-z+0.5', '-y+0.75,-x+0.25,-z+0.75',
+ 'z,x,y', '-x+0.25,z+0.25,y+0.25', '-z,-x+0.5,y+0.5', 'x+0.75,-z+0.25,y+0.75',
+ 'z,-x,-y', 'x+0.25,z+0.25,-y+0.25', '-z,x+0.5,-y+0.5', '-x+0.75,-z+0.25,-y+0.75',
+ 'y,z,x', 'y+0.5,-z,-x+0.5', 'z+0.25,y+0.75,-x+0.75', '-y+0.5,z+0.5,-x', '-z+0.25,-y+0.25,-x+0.25',
+ '-y,-z,x', 'z+0.25,-y+0.75,x+0.75', '-z+0.75,y+0.75,x+0.25', '-x+0.75,-y+0.25,-z+0.25',
+ 'y+0.5,-x,-z', 'x+0.75,y-0.25,-z-0.25', '-y,x,-z-0.5', '-x+0.75,y+0.25,z+0.25',
+ '-y+0.5,-x,z', 'x+0.75,-y-0.25,z-0.25', 'y,x,z-0.5', '-z+0.75,-x+0.25,-y+0.25',
+ 'x+0.5,-z,-y', 'z+0.75,x-0.25,-y-0.25', '-x,z,-y-0.5', '-z+0.75,x+0.25,y+0.25',
+ '-x+0.5,-z,y', 'z+0.75,-x-0.25,y-0.25', 'x,z,y-0.5', '-y+0.75,-z+0.25,-x+0.25',
+ '-y+0.25,z+0.25,x-0.25', '-z+0.5,-y-0.5,x-0.5', 'y+0.25,-z-0.25,x+0.25', 'z+0.5,y,x',
+ 'y+0.75,z+0.25,-x+0.25', '-z+0.5,y-0.5,-x-0.5', 'z,-y-0.5,-x', 'x,y+0.5,z+0.5',
+ '-y+0.25,x+0.75,z+0.75', '-x,-y+1,z+1', 'y+0.75,-x+0.75,z+1.25', 'x,-y+0.5,-z+0.5',
+ 'y+0.25,x+0.75,-z+0.75', '-x,y+1,-z+1', '-y+0.75,-x+0.75,-z+1.25', 'z,x+0.5,y+0.5',
+ '-x+0.25,z+0.75,y+0.75', '-z,-x+1,y+1', 'x+0.75,-z+0.75,y+1.25', 'z,-x+0.5,-y+0.5',
+ 'x+0.25,z+0.75,-y+0.75', '-z,x+1,-y+1', '-x+0.75,-z+0.75,-y+1.25', 'y,z+0.5,x+0.5',
+ 'y+0.5,-z+0.5,-x+1', 'z+0.25,y+1.25,-x+1.25', '-y+0.5,z+1,-x+0.5', '-z+0.25,-y+0.75,-x+0.75',
+ '-y,-z+0.5,x+0.5', 'z+0.25,-y+1.25,x+1.25', '-z+0.75,y+1.25,x+0.75', '-x+0.75,-y+0.75,-z+0.75',
+ 'y+0.5,-x+0.5,-z+0.5', 'x+0.75,y+0.25,-z+0.25', '-y,x+0.5,-z', '-x+0.75,y+0.75,z+0.75',
+ '-y+0.5,-x+0.5,z+0.5', 'x+0.75,-y+0.25,z+0.25', 'y,x+0.5,z', '-z+0.75,-x+0.75,-y+0.75',
+ 'x+0.5,-z+0.5,-y+0.5', 'z+0.75,x+0.25,-y+0.25', '-x,z+0.5,-y', '-z+0.75,x+0.75,y+0.75',
+ '-x+0.5,-z+0.5,y+0.5', 'z+0.75,-x+0.25,y+0.25', 'x,z+0.5,y', '-y+0.75,-z+0.75,-x+0.75',
+ '-y+0.25,z+0.75,x+0.25', '-z+0.5,-y,x', 'y+0.25,-z+0.25,x+0.75', 'z+0.5,y+0.5,x+0.5',
+ 'y+0.75,z+0.75,-x+0.75', '-z+0.5,y,-x', 'z,-y,-x+0.5', 'x+0.5,y,z+0.5', '-y+0.75,x+0.25,z+0.75',
+ '-x+0.5,-y+0.5,z+1', 'y+1.25,-x+0.25,z+1.25', 'x+0.5,-y,-z+0.5', 'y+0.75,x+0.25,-z+0.75',
+ '-x+0.5,y+0.5,-z+1', '-y+1.25,-x+0.25,-z+1.25', 'z+0.5,x,y+0.5', '-x+0.75,z+0.25,y+0.75',
+ '-z+0.5,-x+0.5,y+1', 'x+1.25,-z+0.25,y+1.25', 'z+0.5,-x,-y+0.5', 'x+0.75,z+0.25,-y+0.75',
+ '-z+0.5,x+0.5,-y+1', '-x+1.25,-z+0.25,-y+1.25', 'y+0.5,z,x+0.5', 'y+1,-z,-x+1',
+ 'z+0.75,y+0.75,-x+1.25', '-y+1,z+0.5,-x+0.5', '-z+0.75,-y+0.25,-x+0.75', '-y+0.5,-z,x+0.5',
+ 'z+0.75,-y+0.75,x+1.25', '-z+1.25,y+0.75,x+0.75', '-x+1.25,-y+0.25,-z+0.75',
+ 'y+1,-x,-z+0.5', 'x+1.25,y-0.25,-z+0.25', '-y+0.5,x,-z', '-x+1.25,y+0.25,z+0.75',
+ '-y+1,-x,z+0.5', 'x+1.25,-y-0.25,z+0.25', 'y+0.5,x,z', '-z+1.25,-x+0.25,-y+0.75',
+ 'x+1,-z,-y+0.5', 'z+1.25,x-0.25,-y+0.25', '-x+0.5,z,-y', '-z+1.25,x+0.25,y+0.75',
+ '-x+1,-z,y+0.5', 'z+1.25,-x-0.25,y+0.25', 'x+0.5,z,y', '-y+1.25,-z+0.25,-x+0.75',
+ '-y+0.75,z+0.25,x+0.25', '-z+1,-y-0.5,x', 'y+0.75,-z-0.25,x+0.75', 'z+1,y,x+0.5',
+ 'y+1.25,z+0.25,-x+0.75', '-z+1,y-0.5,-x', 'z+0.5,-y-0.5,-x+0.5', 'x+0.5,y+0.5,z',
+ '-y+0.75,x+0.75,z+0.25', '-x+0.5,-y+1,z+0.5', 'y+1.25,-x+0.75,z+0.75', 'x+0.5,-y+0.5,-z',
+ 'y+0.75,x+0.75,-z+0.25', '-x+0.5,y+1,-z+0.5', '-y+1.25,-x+0.75,-z+0.75', 'z+0.5,x+0.5,y',
+ '-x+0.75,z+0.75,y+0.25', '-z+0.5,-x+1,y+0.5', 'x+1.25,-z+0.75,y+0.75', 'z+0.5,-x+0.5,-y',
+ 'x+0.75,z+0.75,-y+0.25', '-z+0.5,x+1,-y+0.5', '-x+1.25,-z+0.75,-y+0.75', 'y+0.5,z+0.5,x',
+ 'y+1,-z+0.5,-x+0.5', 'z+0.75,y+1.25,-x+0.75', '-y+1,z+1,-x', '-z+0.75,-y+0.75,-x+0.25',
+ '-y+0.5,-z+0.5,x', 'z+0.75,-y+1.25,x+0.75', '-z+1.25,y+1.25,x+0.25', '-x+1.25,-y+0.75,-z+0.25',
+ 'y+1,-x+0.5,-z', 'x+1.25,y+0.25,-z-0.25', '-y+0.5,x+0.5,-z-0.5', '-x+1.25,y+0.75,z+0.25',
+ '-y+1,-x+0.5,z', 'x+1.25,-y+0.25,z-0.25', 'y+0.5,x+0.5,z-0.5', '-z+1.25,-x+0.75,-y+0.25',
+ 'x+1,-z+0.5,-y', 'z+1.25,x+0.25,-y-0.25', '-x+0.5,z+0.5,-y-0.5', '-z+1.25,x+0.75,y+0.25',
+ '-x+1,-z+0.5,y', 'z+1.25,-x+0.25,y-0.25', 'x+0.5,z+0.5,y-0.5', '-y+1.25,-z+0.75,-x+0.25',
+ '-y+0.75,z+0.75,x-0.25', '-z+1,-y,x-0.5', 'y+0.75,-z+0.25,x+0.25', 'z+1,y+0.5,x',
+ 'y+1.25,z+0.75,-x+0.25', '-z+1,y,-x-0.5', 'z+0.5,-y,-x']
+ ncsym: ['x,y,z', '-y+0.25,x+0.25,z+0.25', '-x,-y+0.5,z+0.5', 'y+0.75,-x+0.25,z+0.75',
+ 'x,-y,-z', 'y+0.25,x+0.25,-z+0.25', '-x,y+0.5,-z+0.5', '-y+0.75,-x+0.25,-z+0.75',
+ 'z,x,y', '-x+0.25,z+0.25,y+0.25', '-z,-x+0.5,y+0.5', 'x+0.75,-z+0.25,y+0.75',
+ 'z,-x,-y', 'x+0.25,z+0.25,-y+0.25', '-z,x+0.5,-y+0.5', '-x+0.75,-z+0.25,-y+0.75',
+ 'y,z,x', 'y+0.5,-z,-x+0.5', 'z+0.25,y+0.75,-x+0.75', '-y+0.5,z+0.5,-x', '-z+0.25,-y+0.25,-x+0.25',
+ '-y,-z,x', 'z+0.25,-y+0.75,x+0.75', '-z+0.75,y+0.75,x+0.25', '-x+0.75,-y+0.25,-z+0.25',
+ 'y+0.5,-x,-z', 'x+0.75,y-0.25,-z-0.25', '-y,x,-z-0.5', '-x+0.75,y+0.25,z+0.25',
+ '-y+0.5,-x,z', 'x+0.75,-y-0.25,z-0.25', 'y,x,z-0.5', '-z+0.75,-x+0.25,-y+0.25',
+ 'x+0.5,-z,-y', 'z+0.75,x-0.25,-y-0.25', '-x,z,-y-0.5', '-z+0.75,x+0.25,y+0.25',
+ '-x+0.5,-z,y', 'z+0.75,-x-0.25,y-0.25', 'x,z,y-0.5', '-y+0.75,-z+0.25,-x+0.25',
+ '-y+0.25,z+0.25,x-0.25', '-z+0.5,-y-0.5,x-0.5', 'y+0.25,-z-0.25,x+0.25', 'z+0.5,y,x',
+ 'y+0.75,z+0.25,-x+0.25', '-z+0.5,y-0.5,-x-0.5', 'z,-y-0.5,-x']
+ number: 228
+ schoenflies: Oh^8
+ universal_h_m: F d -3 c :1
+ Im-3m:
+ spacegroup: Im-3m
+ crystal_class: cubic
+ hall: -I 4 2 3
+ hermann_mauguin: I m -3 m
+ symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z', '-z,-x,-y', 'x,-z,-y', 'z,x,-y', '-x,z,-y', '-z,x,y', '-x,-z,y',
+ 'z,-x,y', 'x,z,y', '-y,-z,-x', '-y,z,x', '-z,-y,x', 'y,-z,x', 'z,y,x', 'y,z,-x',
+ '-z,y,-x', 'z,-y,-x', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,-x+0.5,-z+0.5', 'z+0.5,x+0.5,y+0.5', '-x+0.5,z+0.5,y+0.5', '-z+0.5,-x+0.5,y+0.5',
+ 'x+0.5,-z+0.5,y+0.5', 'z+0.5,-x+0.5,-y+0.5', 'x+0.5,z+0.5,-y+0.5', '-z+0.5,x+0.5,-y+0.5',
+ '-x+0.5,-z+0.5,-y+0.5', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z+0.5,-x+0.5', 'z+0.5,y+0.5,-x+0.5',
+ '-y+0.5,z+0.5,-x+0.5', '-z+0.5,-y+0.5,-x+0.5', '-y+0.5,-z+0.5,x+0.5', 'z+0.5,-y+0.5,x+0.5',
+ '-z+0.5,y+0.5,x+0.5', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5',
+ '-y+0.5,x+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5',
+ 'y+0.5,x+0.5,z+0.5', '-z+0.5,-x+0.5,-y+0.5', 'x+0.5,-z+0.5,-y+0.5', 'z+0.5,x+0.5,-y+0.5',
+ '-x+0.5,z+0.5,-y+0.5', '-z+0.5,x+0.5,y+0.5', '-x+0.5,-z+0.5,y+0.5', 'z+0.5,-x+0.5,y+0.5',
+ 'x+0.5,z+0.5,y+0.5', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z+0.5,x+0.5', '-z+0.5,-y+0.5,x+0.5',
+ 'y+0.5,-z+0.5,x+0.5', 'z+0.5,y+0.5,x+0.5', 'y+0.5,z+0.5,-x+0.5', '-z+0.5,y+0.5,-x+0.5',
+ 'z+0.5,-y+0.5,-x+0.5']
+ ncsym: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y,-z', 'y,x,-z', '-x,y,-z',
+ '-y,-x,-z', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', 'z,-x,-y', 'x,z,-y', '-z,x,-y',
+ '-x,-z,-y', 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y,-x', '-y,-z,x',
+ 'z,-y,x', '-z,y,x', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', '-x,y,z', '-y,-x,z',
+ 'x,-y,z', 'y,x,z', '-z,-x,-y', 'x,-z,-y', 'z,x,-y', '-x,z,-y', '-z,x,y', '-x,-z,y',
+ 'z,-x,y', 'x,z,y', '-y,-z,-x', '-y,z,x', '-z,-y,x', 'y,-z,x', 'z,y,x', 'y,z,-x',
+ '-z,y,-x', 'z,-y,-x']
+ number: 229
+ schoenflies: Oh^9
+ universal_h_m: I m -3 m
+ Ia-3d:
+ spacegroup: Ia-3d
+ crystal_class: cubic
+ hall: -I 4bd 2c 3
+ hermann_mauguin: I a -3 d
+ symops: ['x,y,z', '-y+0.25,x+0.75,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.25,-x+0.25,z+0.75',
+ 'x,-y,-z+0.5', 'y+0.25,x+0.75,-z+0.75', '-x+0.5,y,-z', '-y+0.25,-x+0.25,-z+0.25',
+ 'z,x,y', '-x+0.25,z+0.75,y+0.25', '-z+0.5,-x,y+0.5', 'x+0.25,-z+0.25,y+0.75',
+ 'z,-x,-y+0.5', 'x+0.25,z+0.75,-y+0.75', '-z+0.5,x,-y', '-x+0.25,-z+0.25,-y+0.25',
+ 'y,z,x', 'y+0.5,-z+0.5,-x', 'z+0.75,y+0.25,-x+0.25', '-y,z+0.5,-x+0.5', '-z+0.25,-y+0.25,-x+0.25',
+ '-y+0.5,-z,x+0.5', 'z+0.75,-y+0.75,x+0.25', '-z+0.75,y+0.25,x+0.75', '-x,-y,-z',
+ 'y-0.25,-x-0.75,-z-0.25', 'x-0.5,y,-z-0.5', '-y-0.25,x-0.25,-z-0.75', '-x,y,z-0.5',
+ '-y-0.25,-x-0.75,z-0.75', 'x-0.5,-y,z', 'y-0.25,x-0.25,z-0.25', '-z,-x,-y',
+ 'x-0.25,-z-0.75,-y-0.25', 'z-0.5,x,-y-0.5', '-x-0.25,z-0.25,-y-0.75', '-z,x,y-0.5',
+ '-x-0.25,-z-0.75,y-0.75', 'z-0.5,-x,y', 'x-0.25,z-0.25,y-0.25', '-y,-z,-x',
+ '-y-0.5,z-0.5,x', '-z-0.75,-y-0.25,x-0.25', 'y,-z-0.5,x-0.5', 'z-0.25,y-0.25,x-0.25',
+ 'y-0.5,z,-x-0.5', '-z-0.75,y-0.75,-x-0.25', 'z-0.75,-y-0.25,-x-0.75', 'x+0.5,y+0.5,z+0.5',
+ '-y+0.75,x+1.25,z+0.75', '-x+1,-y+0.5,z+1', 'y+0.75,-x+0.75,z+1.25', 'x+0.5,-y+0.5,-z+1',
+ 'y+0.75,x+1.25,-z+1.25', '-x+1,y+0.5,-z+0.5', '-y+0.75,-x+0.75,-z+0.75', 'z+0.5,x+0.5,y+0.5',
+ '-x+0.75,z+1.25,y+0.75', '-z+1,-x+0.5,y+1', 'x+0.75,-z+0.75,y+1.25', 'z+0.5,-x+0.5,-y+1',
+ 'x+0.75,z+1.25,-y+1.25', '-z+1,x+0.5,-y+0.5', '-x+0.75,-z+0.75,-y+0.75', 'y+0.5,z+0.5,x+0.5',
+ 'y+1,-z+1,-x+0.5', 'z+1.25,y+0.75,-x+0.75', '-y+0.5,z+1,-x+1', '-z+0.75,-y+0.75,-x+0.75',
+ '-y+1,-z+0.5,x+1', 'z+1.25,-y+1.25,x+0.75', '-z+1.25,y+0.75,x+1.25', '-x+0.5,-y+0.5,-z+0.5',
+ 'y+0.25,-x-0.25,-z+0.25', 'x,y+0.5,-z', '-y+0.25,x+0.25,-z-0.25', '-x+0.5,y+0.5,z',
+ '-y+0.25,-x-0.25,z-0.25', 'x,-y+0.5,z+0.5', 'y+0.25,x+0.25,z+0.25', '-z+0.5,-x+0.5,-y+0.5',
+ 'x+0.25,-z-0.25,-y+0.25', 'z,x+0.5,-y', '-x+0.25,z+0.25,-y-0.25', '-z+0.5,x+0.5,y',
+ '-x+0.25,-z-0.25,y-0.25', 'z,-x+0.5,y+0.5', 'x+0.25,z+0.25,y+0.25', '-y+0.5,-z+0.5,-x+0.5',
+ '-y,z,x+0.5', '-z-0.25,-y+0.25,x+0.25', 'y+0.5,-z,x', 'z+0.25,y+0.25,x+0.25',
+ 'y,z+0.5,-x', '-z-0.25,y-0.25,-x+0.25', 'z-0.25,-y+0.25,-x-0.25']
+ ncsym: ['x,y,z', '-y+0.25,x+0.75,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.25,-x+0.25,z+0.75',
+ 'x,-y,-z+0.5', 'y+0.25,x+0.75,-z+0.75', '-x+0.5,y,-z', '-y+0.25,-x+0.25,-z+0.25',
+ 'z,x,y', '-x+0.25,z+0.75,y+0.25', '-z+0.5,-x,y+0.5', 'x+0.25,-z+0.25,y+0.75',
+ 'z,-x,-y+0.5', 'x+0.25,z+0.75,-y+0.75', '-z+0.5,x,-y', '-x+0.25,-z+0.25,-y+0.25',
+ 'y,z,x', 'y+0.5,-z+0.5,-x', 'z+0.75,y+0.25,-x+0.25', '-y,z+0.5,-x+0.5', '-z+0.25,-y+0.25,-x+0.25',
+ '-y+0.5,-z,x+0.5', 'z+0.75,-y+0.75,x+0.25', '-z+0.75,y+0.25,x+0.75', '-x,-y,-z',
+ 'y-0.25,-x-0.75,-z-0.25', 'x-0.5,y,-z-0.5', '-y-0.25,x-0.25,-z-0.75', '-x,y,z-0.5',
+ '-y-0.25,-x-0.75,z-0.75', 'x-0.5,-y,z', 'y-0.25,x-0.25,z-0.25', '-z,-x,-y',
+ 'x-0.25,-z-0.75,-y-0.25', 'z-0.5,x,-y-0.5', '-x-0.25,z-0.25,-y-0.75', '-z,x,y-0.5',
+ '-x-0.25,-z-0.75,y-0.75', 'z-0.5,-x,y', 'x-0.25,z-0.25,y-0.25', '-y,-z,-x',
+ '-y-0.5,z-0.5,x', '-z-0.75,-y-0.25,x-0.25', 'y,-z-0.5,x-0.5', 'z-0.25,y-0.25,x-0.25',
+ 'y-0.5,z,-x-0.5', '-z-0.75,y-0.75,-x-0.25', 'z-0.75,-y-0.25,-x-0.75']
+ number: 230
+ schoenflies: Oh^10
+ universal_h_m: I a -3 d
diff --git a/src/xrpd_toolbox/fit_engine/constants/symmetry_operations.yaml b/src/xrpd_toolbox/fit_engine/constants/symmetry_operations.yaml
new file mode 100644
index 0000000..eef9682
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/constants/symmetry_operations.yaml
@@ -0,0 +1,24300 @@
+# This file has been modified from cod-tools
+# (https://aiida-core.readthedocs.io/en/latest/plugins/codtools/), which is
+# distributed under the GNU GPL v2 license. The main modifications are with
+# respect to conversion to a YAML format and removal of the constraints key.
+#
+# GNU GENERAL PUBLIC LICENSE
+# Version 2, June 1991
+#
+# Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# Everyone is permitted to copy and distribute verbatim copies
+# of this license document, but changing it is not allowed.
+#
+# Preamble
+#
+# The licenses for most software are designed to take away your
+# freedom to share and change it. By contrast, the GNU General Public
+# License is intended to guarantee your freedom to share and change free
+# software--to make sure the software is free for all its users. This
+# General Public License applies to most of the Free Software
+# Foundation's software and to any other program whose authors commit to
+# using it. (Some other Free Software Foundation software is covered by
+# the GNU Lesser General Public License instead.) You can apply it to
+# your programs, too.
+#
+# When we speak of free software, we are referring to freedom, not
+# price. Our General Public Licenses are designed to make sure that you
+# have the freedom to distribute copies of free software (and charge for
+# this service if you wish), that you receive source code or can get it
+# if you want it, that you can change the software or use pieces of it
+# in new free programs; and that you know you can do these things.
+#
+# To protect your rights, we need to make restrictions that forbid
+# anyone to deny you these rights or to ask you to surrender the rights.
+# These restrictions translate to certain responsibilities for you if you
+# distribute copies of the software, or if you modify it.
+#
+# For example, if you distribute copies of such a program, whether
+# gratis or for a fee, you must give the recipients all the rights that
+# you have. You must make sure that they, too, receive or can get the
+# source code. And you must show them these terms so they know their
+# rights.
+#
+# We protect your rights with two steps: (1) copyright the software, and
+# (2) offer you this license which gives you legal permission to copy,
+# distribute and/or modify the software.
+#
+# Also, for each author's protection and ours, we want to make certain
+# that everyone understands that there is no warranty for this free
+# software. If the software is modified by someone else and passed on, we
+# want its recipients to know that what they have is not the original, so
+# that any problems introduced by others will not reflect on the original
+# authors' reputations.
+#
+# Finally, any free program is threatened constantly by software
+# patents. We wish to avoid the danger that redistributors of a free
+# program will individually obtain patent licenses, in effect making the
+# program proprietary. To prevent this, we have made it clear that any
+# patent must be licensed for everyone's free use or not licensed at all.
+#
+# The precise terms and conditions for copying, distribution and
+# modification follow.
+#
+# GNU GENERAL PUBLIC LICENSE
+# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+#
+# 0. This License applies to any program or other work which contains
+# a notice placed by the copyright holder saying it may be distributed
+# under the terms of this General Public License. The "Program", below,
+# refers to any such program or work, and a "work based on the Program"
+# means either the Program or any derivative work under copyright law:
+# that is to say, a work containing the Program or a portion of it,
+# either verbatim or with modifications and/or translated into another
+# language. (Hereinafter, translation is included without limitation in
+# the term "modification".) Each licensee is addressed as "you".
+#
+# Activities other than copying, distribution and modification are not
+# covered by this License; they are outside its scope. The act of
+# running the Program is not restricted, and the output from the Program
+# is covered only if its contents constitute a work based on the
+# Program (independent of having been made by running the Program).
+# Whether that is true depends on what the Program does.
+#
+# 1. You may copy and distribute verbatim copies of the Program's
+# source code as you receive it, in any medium, provided that you
+# conspicuously and appropriately publish on each copy an appropriate
+# copyright notice and disclaimer of warranty; keep intact all the
+# notices that refer to this License and to the absence of any warranty;
+# and give any other recipients of the Program a copy of this License
+# along with the Program.
+#
+# You may charge a fee for the physical act of transferring a copy, and
+# you may at your option offer warranty protection in exchange for a fee.
+#
+# 2. You may modify your copy or copies of the Program or any portion
+# of it, thus forming a work based on the Program, and copy and
+# distribute such modifications or work under the terms of Section 1
+# above, provided that you also meet all of these conditions:
+#
+# a) You must cause the modified files to carry prominent notices
+# stating that you changed the files and the date of any change.
+#
+# b) You must cause any work that you distribute or publish, that in
+# whole or in part contains or is derived from the Program or any
+# part thereof, to be licensed as a whole at no charge to all third
+# parties under the terms of this License.
+#
+# c) If the modified program normally reads commands interactively
+# when run, you must cause it, when started running for such
+# interactive use in the most ordinary way, to print or display an
+# announcement including an appropriate copyright notice and a
+# notice that there is no warranty (or else, saying that you provide
+# a warranty) and that users may redistribute the program under
+# these conditions, and telling the user how to view a copy of this
+# License. (Exception: if the Program itself is interactive but
+# does not normally print such an announcement, your work based on
+# the Program is not required to print an announcement.)
+#
+# These requirements apply to the modified work as a whole. If
+# identifiable sections of that work are not derived from the Program,
+# and can be reasonably considered independent and separate works in
+# themselves, then this License, and its terms, do not apply to those
+# sections when you distribute them as separate works. But when you
+# distribute the same sections as part of a whole which is a work based
+# on the Program, the distribution of the whole must be on the terms of
+# this License, whose permissions for other licensees extend to the
+# entire whole, and thus to each and every part regardless of who wrote it.
+#
+# Thus, it is not the intent of this section to claim rights or contest
+# your rights to work written entirely by you; rather, the intent is to
+# exercise the right to control the distribution of derivative or
+# collective works based on the Program.
+#
+# In addition, mere aggregation of another work not based on the Program
+# with the Program (or with a work based on the Program) on a volume of
+# a storage or distribution medium does not bring the other work under
+# the scope of this License.
+#
+# 3. You may copy and distribute the Program (or a work based on it,
+# under Section 2) in object code or executable form under the terms of
+# Sections 1 and 2 above provided that you also do one of the following:
+#
+# a) Accompany it with the complete corresponding machine-readable
+# source code, which must be distributed under the terms of Sections
+# 1 and 2 above on a medium customarily used for software interchange; or,
+#
+# b) Accompany it with a written offer, valid for at least three
+# years, to give any third party, for a charge no more than your
+# cost of physically performing source distribution, a complete
+# machine-readable copy of the corresponding source code, to be
+# distributed under the terms of Sections 1 and 2 above on a medium
+# customarily used for software interchange; or,
+#
+# c) Accompany it with the information you received as to the offer
+# to distribute corresponding source code. (This alternative is
+# allowed only for noncommercial distribution and only if you
+# received the program in object code or executable form with such
+# an offer, in accord with Subsection b above.)
+#
+# The source code for a work means the preferred form of the work for
+# making modifications to it. For an executable work, complete source
+# code means all the source code for all modules it contains, plus any
+# associated interface definition files, plus the scripts used to
+# control compilation and installation of the executable. However, as a
+# special exception, the source code distributed need not include
+# anything that is normally distributed (in either source or binary
+# form) with the major components (compiler, kernel, and so on) of the
+# operating system on which the executable runs, unless that component
+# itself accompanies the executable.
+#
+# If distribution of executable or object code is made by offering
+# access to copy from a designated place, then offering equivalent
+# access to copy the source code from the same place counts as
+# distribution of the source code, even though third parties are not
+# compelled to copy the source along with the object code.
+#
+# 4. You may not copy, modify, sublicense, or distribute the Program
+# except as expressly provided under this License. Any attempt
+# otherwise to copy, modify, sublicense or distribute the Program is
+# void, and will automatically terminate your rights under this License.
+# However, parties who have received copies, or rights, from you under
+# this License will not have their licenses terminated so long as such
+# parties remain in full compliance.
+#
+# 5. You are not required to accept this License, since you have not
+# signed it. However, nothing else grants you permission to modify or
+# distribute the Program or its derivative works. These actions are
+# prohibited by law if you do not accept this License. Therefore, by
+# modifying or distributing the Program (or any work based on the
+# Program), you indicate your acceptance of this License to do so, and
+# all its terms and conditions for copying, distributing or modifying
+# the Program or works based on it.
+#
+# 6. Each time you redistribute the Program (or any work based on the
+# Program), the recipient automatically receives a license from the
+# original licensor to copy, distribute or modify the Program subject to
+# these terms and conditions. You may not impose any further
+# restrictions on the recipients' exercise of the rights granted herein.
+# You are not responsible for enforcing compliance by third parties to
+# this License.
+#
+# 7. If, as a consequence of a court judgment or allegation of patent
+# infringement or for any other reason (not limited to patent issues),
+# conditions are imposed on you (whether by court order, agreement or
+# otherwise) that contradict the conditions of this License, they do not
+# excuse you from the conditions of this License. If you cannot
+# distribute so as to satisfy simultaneously your obligations under this
+# License and any other pertinent obligations, then as a consequence you
+# may not distribute the Program at all. For example, if a patent
+# license would not permit royalty-free redistribution of the Program by
+# all those who receive copies directly or indirectly through you, then
+# the only way you could satisfy both it and this License would be to
+# refrain entirely from distribution of the Program.
+#
+# If any portion of this section is held invalid or unenforceable under
+# any particular circumstance, the balance of the section is intended to
+# apply and the section as a whole is intended to apply in other
+# circumstances.
+#
+# It is not the purpose of this section to induce you to infringe any
+# patents or other property right claims or to contest validity of any
+# such claims; this section has the sole purpose of protecting the
+# integrity of the free software distribution system, which is
+# implemented by public license practices. Many people have made
+# generous contributions to the wide range of software distributed
+# through that system in reliance on consistent application of that
+# system; it is up to the author/donor to decide if he or she is willing
+# to distribute software through any other system and a licensee cannot
+# impose that choice.
+#
+# This section is intended to make thoroughly clear what is believed to
+# be a consequence of the rest of this License.
+#
+# 8. If the distribution and/or use of the Program is restricted in
+# certain countries either by patents or by copyrighted interfaces, the
+# original copyright holder who places the Program under this License
+# may add an explicit geographical distribution limitation excluding
+# those countries, so that distribution is permitted only in or among
+# countries not thus excluded. In such case, this License incorporates
+# the limitation as if written in the body of this License.
+#
+# 9. The Free Software Foundation may publish revised and/or new versions
+# of the General Public License from time to time. Such new versions will
+# be similar in spirit to the present version, but may differ in detail to
+# address new problems or concerns.
+#
+# Each version is given a distinguishing version number. If the Program
+# specifies a version number of this License which applies to it and "any
+# later version", you have the option of following the terms and conditions
+# either of that version or of any later version published by the Free
+# Software Foundation. If the Program does not specify a version number of
+# this License, you may choose any version ever published by the Free Software
+# Foundation.
+#
+# 10. If you wish to incorporate parts of the Program into other free
+# programs whose distribution conditions are different, write to the author
+# to ask for permission. For software which is copyrighted by the Free
+# Software Foundation, write to the Free Software Foundation; we sometimes
+# make exceptions for this. Our decision will be guided by the two goals
+# of preserving the free status of all derivatives of our free software and
+# of promoting the sharing and reuse of software generally.
+#
+# NO WARRANTY
+#
+# 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+# FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+# OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+# PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+# OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+# TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+# PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+# REPAIR OR CORRECTION.
+#
+# 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+# WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+# REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+# INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+# OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+# TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+# YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+# PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGES.
+#
+# END OF TERMS AND CONDITIONS
+#
+# How to Apply These Terms to Your New Programs
+#
+# If you develop a new program, and you want it to be of the greatest
+# possible use to the public, the best way to achieve this is to make it
+# free software which everyone can redistribute and change under these terms.
+#
+# To do so, attach the following notices to the program. It is safest
+# to attach them to the start of each source file to most effectively
+# convey the exclusion of warranty; and each file should have at least
+# the "copyright" line and a pointer to where the full notice is found.
+#
+#
+# Copyright (C)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Also add information on how to contact you by electronic and paper mail.
+#
+# If the program is interactive, make it output a short notice like this
+# when it starts in an interactive mode:
+#
+# Gnomovision version 69, Copyright (C) year name of author
+# Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+# This is free software, and you are welcome to redistribute it
+# under certain conditions; type `show c' for details.
+#
+# The hypothetical commands `show w' and `show c' should show the appropriate
+# parts of the General Public License. Of course, the commands you use may
+# be called something other than `show w' and `show c'; they could even be
+# mouse-clicks or menu items--whatever suits your program.
+#
+# You should also get your employer (if you work as a programmer) or your
+# school, if any, to sign a "copyright disclaimer" for the program, if
+# necessary. Here is a sample; alter the names:
+#
+# Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+# `Gnomovision' (which makes passes at compilers) written by James Hacker.
+#
+# , 1 April 1989
+# Ty Coon, President of Vice
+#
+# This General Public License does not permit incorporating your program into
+# proprietary programs. If your program is a subroutine library, you may
+# consider it more useful to permit linking proprietary applications with the
+# library. If this is what you want to do, use the GNU Lesser General
+# Public License instead of this License.
+
+- crystal_class: triclinic
+ hall: " P 1"
+ hermann_mauguin: P 1
+ ncsym:
+ - x,y,z
+ number: 1
+ schoenflies: C1^1
+ symops:
+ - x,y,z
+ universal_h_m: P 1
+- crystal_class: triclinic
+ hall: -P 1
+ hermann_mauguin: P -1
+ ncsym:
+ - x,y,z
+ - -x,-y,-z
+ number: 2
+ schoenflies: Ci^1
+ symops:
+ - x,y,z
+ - -x,-y,-z
+ universal_h_m: P -1
+- crystal_class: monoclinic
+ hall: " P 2y"
+ hermann_mauguin: P 1 2 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ number: 3
+ schoenflies: C2^1
+ symops:
+ - x,y,z
+ - -x,y,-z
+ universal_h_m: P 1 2 1
+- crystal_class: monoclinic
+ hall: " P 2"
+ hermann_mauguin: P 1 1 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ number: 3
+ schoenflies: C2^1
+ symops:
+ - x,y,z
+ - -x,-y,z
+ universal_h_m: P 1 1 2
+- crystal_class: monoclinic
+ hall: " P 2x"
+ hermann_mauguin: P 2 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ number: 3
+ schoenflies: C2^1
+ symops:
+ - x,y,z
+ - x,-y,-z
+ universal_h_m: P 2 1 1
+- crystal_class: monoclinic
+ hall: " P 2yb"
+ hermann_mauguin: P 1 21 1
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ number: 4
+ schoenflies: C2^2
+ symops:
+ - x,y,z
+ - -x,y+1/2,-z
+ universal_h_m: P 1 21 1
+- crystal_class: monoclinic
+ hall: " P 2c"
+ hermann_mauguin: P 1 1 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ number: 4
+ schoenflies: C2^2
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ universal_h_m: P 1 1 21
+- crystal_class: monoclinic
+ hall: " P 2xa"
+ hermann_mauguin: P 21 1 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,-z
+ number: 4
+ schoenflies: C2^2
+ symops:
+ - x,y,z
+ - x+1/2,-y,-z
+ universal_h_m: P 21 1 1
+- crystal_class: monoclinic
+ hall: " C 2y"
+ hermann_mauguin: C 1 2 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,-z
+ universal_h_m: C 1 2 1
+- crystal_class: monoclinic
+ hall: " A 2y"
+ hermann_mauguin: A 1 2 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ universal_h_m: A 1 2 1
+- crystal_class: monoclinic
+ hall: " I 2y"
+ hermann_mauguin: I 1 2 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: I 1 2 1
+- crystal_class: monoclinic
+ hall: " A 2"
+ hermann_mauguin: A 1 1 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ universal_h_m: A 1 1 2
+- crystal_class: monoclinic
+ hall: " B 2"
+ hermann_mauguin: B 1 1 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ universal_h_m: B 1 1 2
+- crystal_class: monoclinic
+ hall: " I 2"
+ hermann_mauguin: I 1 1 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ universal_h_m: I 1 1 2
+- crystal_class: monoclinic
+ hall: " B 2x"
+ hermann_mauguin: B 2 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,-z+1/2
+ universal_h_m: B 2 1 1
+- crystal_class: monoclinic
+ hall: " C 2x"
+ hermann_mauguin: C 2 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,-z
+ universal_h_m: C 2 1 1
+- crystal_class: monoclinic
+ hall: " I 2x"
+ hermann_mauguin: I 2 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ universal_h_m: I 2 1 1
+- crystal_class: monoclinic
+ hall: " P -2y"
+ hermann_mauguin: P 1 m 1
+ ncsym:
+ - x,y,z
+ - x,-y,z
+ number: 6
+ schoenflies: Cs^1
+ symops:
+ - x,y,z
+ - x,-y,z
+ universal_h_m: P 1 m 1
+- crystal_class: monoclinic
+ hall: " P -2"
+ hermann_mauguin: P 1 1 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ number: 6
+ schoenflies: Cs^1
+ symops:
+ - x,y,z
+ - x,y,-z
+ universal_h_m: P 1 1 m
+- crystal_class: monoclinic
+ hall: " P -2x"
+ hermann_mauguin: P m 1 1
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ number: 6
+ schoenflies: Cs^1
+ symops:
+ - x,y,z
+ - -x,y,z
+ universal_h_m: P m 1 1
+- crystal_class: monoclinic
+ hall: " P -2yc"
+ hermann_mauguin: P 1 c 1
+ ncsym:
+ - x,y,z
+ - x,-y,z+1/2
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - x,-y,z+1/2
+ universal_h_m: P 1 c 1
+- crystal_class: monoclinic
+ hall: " P -2yac"
+ hermann_mauguin: P 1 n 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,z+1/2
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - x+1/2,-y,z+1/2
+ universal_h_m: P 1 n 1
+- crystal_class: monoclinic
+ hall: " P -2ya"
+ hermann_mauguin: P 1 a 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,z
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - x+1/2,-y,z
+ universal_h_m: P 1 a 1
+- crystal_class: monoclinic
+ hall: " P -2a"
+ hermann_mauguin: P 1 1 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ universal_h_m: P 1 1 a
+- crystal_class: monoclinic
+ hall: " P -2ab"
+ hermann_mauguin: P 1 1 n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ universal_h_m: P 1 1 n
+- crystal_class: monoclinic
+ hall: " P -2b"
+ hermann_mauguin: P 1 1 b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ universal_h_m: P 1 1 b
+- crystal_class: monoclinic
+ hall: " P -2xb"
+ hermann_mauguin: P b 1 1
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,z
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - -x,y+1/2,z
+ universal_h_m: P b 1 1
+- crystal_class: monoclinic
+ hall: " P -2xbc"
+ hermann_mauguin: P n 1 1
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,z+1/2
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - -x,y+1/2,z+1/2
+ universal_h_m: P n 1 1
+- crystal_class: monoclinic
+ hall: " P -2xc"
+ hermann_mauguin: P c 1 1
+ ncsym:
+ - x,y,z
+ - -x,y,z+1/2
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - -x,y,z+1/2
+ universal_h_m: P c 1 1
+- crystal_class: monoclinic
+ hall: " C -2y"
+ hermann_mauguin: C 1 m 1
+ ncsym:
+ - x,y,z
+ - x,-y,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: C 1 m 1
+- crystal_class: monoclinic
+ hall: " A -2y"
+ hermann_mauguin: A 1 m 1
+ ncsym:
+ - x,y,z
+ - x,-y,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A 1 m 1
+- crystal_class: monoclinic
+ hall: " I -2y"
+ hermann_mauguin: I 1 m 1
+ ncsym:
+ - x,y,z
+ - x,-y,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I 1 m 1
+- crystal_class: monoclinic
+ hall: " A -2"
+ hermann_mauguin: A 1 1 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x,y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ universal_h_m: A 1 1 m
+- crystal_class: monoclinic
+ hall: " B -2"
+ hermann_mauguin: B 1 1 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,y,z+1/2
+ - x+1/2,y,-z+1/2
+ universal_h_m: B 1 1 m
+- crystal_class: monoclinic
+ hall: " I -2"
+ hermann_mauguin: I 1 1 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ universal_h_m: I 1 1 m
+- crystal_class: monoclinic
+ hall: " B -2x"
+ hermann_mauguin: B m 1 1
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - -x,y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,y,z+1/2
+ universal_h_m: B m 1 1
+- crystal_class: monoclinic
+ hall: " C -2x"
+ hermann_mauguin: C m 1 1
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - -x,y,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,z
+ universal_h_m: C m 1 1
+- crystal_class: monoclinic
+ hall: " I -2x"
+ hermann_mauguin: I m 1 1
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - -x,y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ universal_h_m: I m 1 1
+- crystal_class: monoclinic
+ hall: " C -2yc"
+ hermann_mauguin: C 1 c 1
+ ncsym:
+ - x,y,z
+ - x,-y,z+1/2
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: C 1 c 1
+- crystal_class: monoclinic
+ hall: " A -2yab"
+ hermann_mauguin: A 1 n 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y+1/2,z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - x+1/2,-y+1,z+1/2
+ universal_h_m: A 1 n 1
+- crystal_class: monoclinic
+ hall: " I -2ya"
+ hermann_mauguin: I 1 a 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x+1/2,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - x+1,-y+1/2,z+1/2
+ universal_h_m: I 1 a 1
+- crystal_class: monoclinic
+ hall: " A -2ya"
+ hermann_mauguin: A 1 a 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: A 1 a 1
+- crystal_class: monoclinic
+ hall: " C -2yac"
+ hermann_mauguin: C 1 n 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,z+1/2
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - x+1,-y+1/2,z+1/2
+ universal_h_m: C 1 n 1
+- crystal_class: monoclinic
+ hall: " I -2yc"
+ hermann_mauguin: I 1 c 1
+ ncsym:
+ - x,y,z
+ - x,-y,z+1/2
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1
+ universal_h_m: I 1 c 1
+- crystal_class: monoclinic
+ hall: " A -2a"
+ hermann_mauguin: A 1 1 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ universal_h_m: A 1 1 a
+- crystal_class: monoclinic
+ hall: " B -2ab"
+ hermann_mauguin: B 1 1 n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - x+1/2,y,z+1/2
+ - x+1,y+1/2,-z+1/2
+ universal_h_m: B 1 1 n
+- crystal_class: monoclinic
+ hall: " I -2b"
+ hermann_mauguin: I 1 1 b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1,-z+1/2
+ universal_h_m: I 1 1 b
+- crystal_class: monoclinic
+ hall: " B -2b"
+ hermann_mauguin: B 1 1 b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - x+1/2,y,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ universal_h_m: B 1 1 b
+- crystal_class: monoclinic
+ hall: " A -2ab"
+ hermann_mauguin: A 1 1 n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - x,y+1/2,z+1/2
+ - x+1/2,y+1,-z+1/2
+ universal_h_m: A 1 1 n
+- crystal_class: monoclinic
+ hall: " I -2a"
+ hermann_mauguin: I 1 1 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1,y+1/2,-z+1/2
+ universal_h_m: I 1 1 a
+- crystal_class: monoclinic
+ hall: " B -2xb"
+ hermann_mauguin: B b 1 1
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - -x,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ universal_h_m: B b 1 1
+- crystal_class: monoclinic
+ hall: " C -2xac"
+ hermann_mauguin: C n 1 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y,z+1/2
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1,y+1/2,z+1/2
+ universal_h_m: C n 1 1
+- crystal_class: monoclinic
+ hall: " I -2xc"
+ hermann_mauguin: I c 1 1
+ ncsym:
+ - x,y,z
+ - -x,y,z+1/2
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - -x,y,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1
+ universal_h_m: I c 1 1
+- crystal_class: monoclinic
+ hall: " C -2xc"
+ hermann_mauguin: C c 1 1
+ ncsym:
+ - x,y,z
+ - -x,y,z+1/2
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - -x,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,z+1/2
+ universal_h_m: C c 1 1
+- crystal_class: monoclinic
+ hall: " B -2xab"
+ hermann_mauguin: B n 1 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y+1/2,z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1,y+1/2,z+1/2
+ universal_h_m: B n 1 1
+- crystal_class: monoclinic
+ hall: " I -2xb"
+ hermann_mauguin: I b 1 1
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - -x,y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1,z+1/2
+ universal_h_m: I b 1 1
+- crystal_class: monoclinic
+ hall: -P 2y
+ hermann_mauguin: P 1 2/m 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ number: 10
+ schoenflies: C2h^1
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ universal_h_m: P 1 2/m 1
+- crystal_class: monoclinic
+ hall: -P 2
+ hermann_mauguin: P 1 1 2/m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ number: 10
+ schoenflies: C2h^1
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ universal_h_m: P 1 1 2/m
+- crystal_class: monoclinic
+ hall: -P 2x
+ hermann_mauguin: P 2/m 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ number: 10
+ schoenflies: C2h^1
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ universal_h_m: P 2/m 1 1
+- crystal_class: monoclinic
+ hall: -P 2yb
+ hermann_mauguin: P 1 21/m 1
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,-y-1/2,z
+ number: 11
+ schoenflies: C2h^2
+ symops:
+ - x,y,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,-y-1/2,z
+ universal_h_m: P 1 21/m 1
+- crystal_class: monoclinic
+ hall: -P 2c
+ hermann_mauguin: P 1 1 21/m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ number: 11
+ schoenflies: C2h^2
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ universal_h_m: P 1 1 21/m
+- crystal_class: monoclinic
+ hall: -P 2xa
+ hermann_mauguin: P 21/m 1 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x-1/2,y,z
+ number: 11
+ schoenflies: C2h^2
+ symops:
+ - x,y,z
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x-1/2,y,z
+ universal_h_m: P 21/m 1 1
+- crystal_class: monoclinic
+ hall: -C 2y
+ hermann_mauguin: C 1 2/m 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,-y+1/2,z
+ universal_h_m: C 1 2/m 1
+- crystal_class: monoclinic
+ hall: -A 2y
+ hermann_mauguin: A 1 2/m 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A 1 2/m 1
+- crystal_class: monoclinic
+ hall: -I 2y
+ hermann_mauguin: I 1 2/m 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I 1 2/m 1
+- crystal_class: monoclinic
+ hall: -A 2
+ hermann_mauguin: A 1 1 2/m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ universal_h_m: A 1 1 2/m
+- crystal_class: monoclinic
+ hall: -B 2
+ hermann_mauguin: B 1 1 2/m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ universal_h_m: B 1 1 2/m
+- crystal_class: monoclinic
+ hall: -I 2
+ hermann_mauguin: I 1 1 2/m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ universal_h_m: I 1 1 2/m
+- crystal_class: monoclinic
+ hall: -B 2x
+ hermann_mauguin: B 2/m 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - -x+1/2,y,z+1/2
+ universal_h_m: B 2/m 1 1
+- crystal_class: monoclinic
+ hall: -C 2x
+ hermann_mauguin: C 2/m 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ - x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,z
+ universal_h_m: C 2/m 1 1
+- crystal_class: monoclinic
+ hall: -I 2x
+ hermann_mauguin: I 2/m 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ universal_h_m: I 2/m 1 1
+- crystal_class: monoclinic
+ hall: -P 2yc
+ hermann_mauguin: P 1 2/c 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,z-1/2
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,z-1/2
+ universal_h_m: P 1 2/c 1
+- crystal_class: monoclinic
+ hall: -P 2yac
+ hermann_mauguin: P 1 2/n 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,-y,z-1/2
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,-y,z-1/2
+ universal_h_m: P 1 2/n 1
+- crystal_class: monoclinic
+ hall: -P 2ya
+ hermann_mauguin: P 1 2/a 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,-y,z
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,-y,z
+ universal_h_m: P 1 2/a 1
+- crystal_class: monoclinic
+ hall: -P 2a
+ hermann_mauguin: P 1 1 2/a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ universal_h_m: P 1 1 2/a
+- crystal_class: monoclinic
+ hall: -P 2ab
+ hermann_mauguin: P 1 1 2/n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ universal_h_m: P 1 1 2/n
+- crystal_class: monoclinic
+ hall: -P 2b
+ hermann_mauguin: P 1 1 2/b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ universal_h_m: P 1 1 2/b
+- crystal_class: monoclinic
+ hall: -P 2xb
+ hermann_mauguin: P 2/b 1 1
+ ncsym:
+ - x,y,z
+ - x,-y+1/2,-z
+ - -x,-y,-z
+ - -x,y-1/2,z
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z
+ - -x,-y,-z
+ - -x,y-1/2,z
+ universal_h_m: P 2/b 1 1
+- crystal_class: monoclinic
+ hall: -P 2xbc
+ hermann_mauguin: P 2/n 1 1
+ ncsym:
+ - x,y,z
+ - x,-y+1/2,-z+1/2
+ - -x,-y,-z
+ - -x,y-1/2,z-1/2
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z+1/2
+ - -x,-y,-z
+ - -x,y-1/2,z-1/2
+ universal_h_m: P 2/n 1 1
+- crystal_class: monoclinic
+ hall: -P 2xc
+ hermann_mauguin: P 2/c 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z+1/2
+ - -x,-y,-z
+ - -x,y,z-1/2
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - x,-y,-z+1/2
+ - -x,-y,-z
+ - -x,y,z-1/2
+ universal_h_m: P 2/c 1 1
+- crystal_class: monoclinic
+ hall: -P 2ybc
+ hermann_mauguin: P 1 21/c 1
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,-y-1/2,z-1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,-y-1/2,z-1/2
+ universal_h_m: P 1 21/c 1
+- crystal_class: monoclinic
+ hall: -P 2yn
+ hermann_mauguin: P 1 21/n 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,-y-1/2,z-1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,-y-1/2,z-1/2
+ universal_h_m: P 1 21/n 1
+- crystal_class: monoclinic
+ hall: -P 2yab
+ hermann_mauguin: P 1 21/a 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,-y-1/2,z
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,-y-1/2,z
+ universal_h_m: P 1 21/a 1
+- crystal_class: monoclinic
+ hall: -P 2ac
+ hermann_mauguin: P 1 1 21/a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ universal_h_m: P 1 1 21/a
+- crystal_class: monoclinic
+ hall: -P 2n
+ hermann_mauguin: P 1 1 21/n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ universal_h_m: P 1 1 21/n
+- crystal_class: monoclinic
+ hall: -P 2bc
+ hermann_mauguin: P 1 1 21/b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ universal_h_m: P 1 1 21/b
+- crystal_class: monoclinic
+ hall: -P 2xab
+ hermann_mauguin: P 21/b 1 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y+1/2,-z
+ - -x,-y,-z
+ - -x-1/2,y-1/2,z
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,-z
+ - -x,-y,-z
+ - -x-1/2,y-1/2,z
+ universal_h_m: P 21/b 1 1
+- crystal_class: monoclinic
+ hall: -P 2xn
+ hermann_mauguin: P 21/n 1 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,-y,-z
+ - -x-1/2,y-1/2,z-1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,-y,-z
+ - -x-1/2,y-1/2,z-1/2
+ universal_h_m: P 21/n 1 1
+- crystal_class: monoclinic
+ hall: -P 2xac
+ hermann_mauguin: P 21/c 1 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,-z+1/2
+ - -x,-y,-z
+ - -x-1/2,y,z-1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - x+1/2,-y,-z+1/2
+ - -x,-y,-z
+ - -x-1/2,y,z-1/2
+ universal_h_m: P 21/c 1 1
+- crystal_class: monoclinic
+ hall: -C 2yc
+ hermann_mauguin: C 1 2/c 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,z-1/2
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,z-1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,-y+1/2,z-1/2
+ universal_h_m: C 1 2/c 1
+- crystal_class: monoclinic
+ hall: -A 2yab
+ hermann_mauguin: A 1 2/n 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,-y-1/2,z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,-y-1/2,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,y+1,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/2,-y,z+1/2
+ universal_h_m: A 1 2/n 1
+- crystal_class: monoclinic
+ hall: -I 2ya
+ hermann_mauguin: I 1 2/a 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,-y,z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: I 1 2/a 1
+- crystal_class: monoclinic
+ hall: -A 2ya
+ hermann_mauguin: A 1 2/a 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,-y,z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/2,-y+1/2,z+1/2
+ universal_h_m: A 1 2/a 1
+- crystal_class: monoclinic
+ hall: -C 2yac
+ hermann_mauguin: C 1 2/n 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,-y,z-1/2
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,-y,z-1/2
+ - x+1/2,y+1/2,z
+ - -x+1,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x,-y+1/2,z-1/2
+ universal_h_m: C 1 2/n 1
+- crystal_class: monoclinic
+ hall: -I 2yc
+ hermann_mauguin: I 1 2/c 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,z-1/2
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,z-1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,-y+1/2,z
+ universal_h_m: I 1 2/c 1
+- crystal_class: monoclinic
+ hall: -A 2a
+ hermann_mauguin: A 1 1 2/a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/2,y+1/2,-z+1/2
+ universal_h_m: A 1 1 2/a
+- crystal_class: monoclinic
+ hall: -B 2ab
+ hermann_mauguin: B 1 1 2/n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - x+1/2,y,z+1/2
+ - -x+1,-y+1/2,z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,y-1/2,-z+1/2
+ universal_h_m: B 1 1 2/n
+- crystal_class: monoclinic
+ hall: -I 2b
+ hermann_mauguin: I 1 1 2/b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y,-z+1/2
+ universal_h_m: I 1 1 2/b
+- crystal_class: monoclinic
+ hall: -B 2b
+ hermann_mauguin: B 1 1 2/b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y-1/2,-z+1/2
+ universal_h_m: B 1 1 2/b
+- crystal_class: monoclinic
+ hall: -A 2ab
+ hermann_mauguin: A 1 1 2/n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/2,y,-z+1/2
+ universal_h_m: A 1 1 2/n
+- crystal_class: monoclinic
+ hall: -I 2a
+ hermann_mauguin: I 1 1 2/a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1,-y+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ universal_h_m: I 1 1 2/a
+- crystal_class: monoclinic
+ hall: -B 2xb
+ hermann_mauguin: B 2/b 1 1
+ ncsym:
+ - x,y,z
+ - x,-y+1/2,-z
+ - -x,-y,-z
+ - -x,y-1/2,z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z
+ - -x,-y,-z
+ - -x,y-1/2,z
+ - x+1/2,y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - -x+1/2,y-1/2,z+1/2
+ universal_h_m: B 2/b 1 1
+- crystal_class: monoclinic
+ hall: -C 2xac
+ hermann_mauguin: C 2/n 1 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,-z+1/2
+ - -x,-y,-z
+ - -x-1/2,y,z-1/2
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - x+1/2,-y,-z+1/2
+ - -x,-y,-z
+ - -x-1/2,y,z-1/2
+ - x+1/2,y+1/2,z
+ - x+1,-y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - -x,y+1/2,z-1/2
+ universal_h_m: C 2/n 1 1
+- crystal_class: monoclinic
+ hall: -I 2xc
+ hermann_mauguin: I 2/c 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z+1/2
+ - -x,-y,-z
+ - -x,y,z-1/2
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - x,-y,-z+1/2
+ - -x,-y,-z
+ - -x,y,z-1/2
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1
+ - -x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ universal_h_m: I 2/c 1 1
+- crystal_class: monoclinic
+ hall: -C 2xc
+ hermann_mauguin: C 2/c 1 1
+ ncsym:
+ - x,y,z
+ - x,-y,-z+1/2
+ - -x,-y,-z
+ - -x,y,z-1/2
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - x,-y,-z+1/2
+ - -x,-y,-z
+ - -x,y,z-1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,z-1/2
+ universal_h_m: C 2/c 1 1
+- crystal_class: monoclinic
+ hall: -B 2xab
+ hermann_mauguin: B 2/n 1 1
+ ncsym:
+ - x,y,z
+ - x+1/2,-y+1/2,-z
+ - -x,-y,-z
+ - -x-1/2,y-1/2,z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,-z
+ - -x,-y,-z
+ - -x-1/2,y-1/2,z
+ - x+1/2,y,z+1/2
+ - x+1,-y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - -x,y-1/2,z+1/2
+ universal_h_m: B 2/n 1 1
+- crystal_class: monoclinic
+ hall: -I 2xb
+ hermann_mauguin: I 2/b 1 1
+ ncsym:
+ - x,y,z
+ - x,-y+1/2,-z
+ - -x,-y,-z
+ - -x,y-1/2,z
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z
+ - -x,-y,-z
+ - -x,y-1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ universal_h_m: I 2/b 1 1
+- crystal_class: orthorhombic
+ hall: " P 2 2"
+ hermann_mauguin: P 2 2 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ number: 16
+ schoenflies: D2^1
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ universal_h_m: P 2 2 2
+- crystal_class: orthorhombic
+ hall: " P 2c 2"
+ hermann_mauguin: P 2 2 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ number: 17
+ schoenflies: D2^2
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ universal_h_m: P 2 2 21
+- crystal_class: orthorhombic
+ hall: " P 2a 2a"
+ hermann_mauguin: P 21 2 2
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ number: 17
+ schoenflies: D2^2
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ universal_h_m: P 21 2 2
+- crystal_class: orthorhombic
+ hall: " P 2 2b"
+ hermann_mauguin: P 2 21 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ number: 17
+ schoenflies: D2^2
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ universal_h_m: P 2 21 2
+- crystal_class: orthorhombic
+ hall: " P 2 2ab"
+ hermann_mauguin: P 21 21 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ number: 18
+ schoenflies: D2^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ universal_h_m: P 21 21 2
+- crystal_class: orthorhombic
+ hall: " P 2bc 2"
+ hermann_mauguin: P 2 21 21
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z+1/2
+ number: 18
+ schoenflies: D2^3
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z+1/2
+ universal_h_m: P 2 21 21
+- crystal_class: orthorhombic
+ hall: " P 2ac 2ac"
+ hermann_mauguin: P 21 2 21
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ number: 18
+ schoenflies: D2^3
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ universal_h_m: P 21 2 21
+- crystal_class: orthorhombic
+ hall: " P 2ac 2ab"
+ hermann_mauguin: P 21 21 21
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ number: 19
+ schoenflies: D2^4
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ universal_h_m: P 21 21 21
+- crystal_class: orthorhombic
+ hall: " C 2c 2"
+ hermann_mauguin: C 2 2 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ number: 20
+ schoenflies: D2^5
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: C 2 2 21
+- crystal_class: orthorhombic
+ hall: " A 2a 2a"
+ hermann_mauguin: A 21 2 2
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ number: 20
+ schoenflies: D2^5
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ universal_h_m: A 21 2 2
+- crystal_class: orthorhombic
+ hall: " B 2 2b"
+ hermann_mauguin: B 2 21 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ number: 20
+ schoenflies: D2^5
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: B 2 21 2
+- crystal_class: orthorhombic
+ hall: " C 2 2"
+ hermann_mauguin: C 2 2 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ number: 21
+ schoenflies: D2^6
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ universal_h_m: C 2 2 2
+- crystal_class: orthorhombic
+ hall: " A 2 2"
+ hermann_mauguin: A 2 2 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ number: 21
+ schoenflies: D2^6
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ universal_h_m: A 2 2 2
+- crystal_class: orthorhombic
+ hall: " B 2 2"
+ hermann_mauguin: B 2 2 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ number: 21
+ schoenflies: D2^6
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ universal_h_m: B 2 2 2
+- crystal_class: orthorhombic
+ hall: " F 2 2"
+ hermann_mauguin: F 2 2 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ number: 22
+ schoenflies: D2^7
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ universal_h_m: F 2 2 2
+- crystal_class: orthorhombic
+ hall: " I 2 2"
+ hermann_mauguin: I 2 2 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ number: 23
+ schoenflies: D2^8
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: I 2 2 2
+- crystal_class: orthorhombic
+ hall: " I 2b 2c"
+ hermann_mauguin: I 21 21 21
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ number: 24
+ schoenflies: D2^9
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - x+1/2,-y+1/2,-z+1
+ - -x+1/2,y+1,-z+1
+ universal_h_m: I 21 21 21
+- crystal_class: orthorhombic
+ hall: " P 2 -2"
+ hermann_mauguin: P m m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ number: 25
+ schoenflies: C2v^1
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ universal_h_m: P m m 2
+- crystal_class: orthorhombic
+ hall: " P -2 2"
+ hermann_mauguin: P 2 m m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ number: 25
+ schoenflies: C2v^1
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ universal_h_m: P 2 m m
+- crystal_class: orthorhombic
+ hall: " P -2 -2"
+ hermann_mauguin: P m 2 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ number: 25
+ schoenflies: C2v^1
+ symops:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ universal_h_m: P m 2 m
+- crystal_class: orthorhombic
+ hall: " P 2c -2"
+ hermann_mauguin: P m c 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z
+ - x,-y,z+1/2
+ number: 26
+ schoenflies: C2v^2
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z
+ - x,-y,z+1/2
+ universal_h_m: P m c 21
+- crystal_class: orthorhombic
+ hall: " P 2c -2c"
+ hermann_mauguin: P c m 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x,-y,z
+ number: 26
+ schoenflies: C2v^2
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x,-y,z
+ universal_h_m: P c m 21
+- crystal_class: orthorhombic
+ hall: " P -2a 2a"
+ hermann_mauguin: P 21 m a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - x+1/2,-y,-z
+ - x,-y,z
+ number: 26
+ schoenflies: C2v^2
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x+1/2,-y,-z
+ - x,-y,z
+ universal_h_m: P 21 m a
+- crystal_class: orthorhombic
+ hall: " P -2 2a"
+ hermann_mauguin: P 21 a m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,-y,-z
+ - x+1/2,-y,z
+ number: 26
+ schoenflies: C2v^2
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,-y,-z
+ - x+1/2,-y,z
+ universal_h_m: P 21 a m
+- crystal_class: orthorhombic
+ hall: " P -2 -2b"
+ hermann_mauguin: P b 21 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z
+ - -x,y+1/2,-z
+ number: 26
+ schoenflies: C2v^2
+ symops:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z
+ - -x,y+1/2,-z
+ universal_h_m: P b 21 m
+- crystal_class: orthorhombic
+ hall: " P -2b -2"
+ hermann_mauguin: P m 21 b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y,z
+ - -x,y+1/2,-z
+ number: 26
+ schoenflies: C2v^2
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y,z
+ - -x,y+1/2,-z
+ universal_h_m: P m 21 b
+- crystal_class: orthorhombic
+ hall: " P 2 -2c"
+ hermann_mauguin: P c c 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ number: 27
+ schoenflies: C2v^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: P c c 2
+- crystal_class: orthorhombic
+ hall: " P -2a 2"
+ hermann_mauguin: P 2 a a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ number: 27
+ schoenflies: C2v^3
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ universal_h_m: P 2 a a
+- crystal_class: orthorhombic
+ hall: " P -2b -2b"
+ hermann_mauguin: P b 2 b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - -x,y,-z
+ number: 27
+ schoenflies: C2v^3
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - -x,y,-z
+ universal_h_m: P b 2 b
+- crystal_class: orthorhombic
+ hall: " P 2 -2a"
+ hermann_mauguin: P m a 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ number: 28
+ schoenflies: C2v^4
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ universal_h_m: P m a 2
+- crystal_class: orthorhombic
+ hall: " P 2 -2b"
+ hermann_mauguin: P b m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x,-y+1/2,z
+ number: 28
+ schoenflies: C2v^4
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x,-y+1/2,z
+ universal_h_m: P b m 2
+- crystal_class: orthorhombic
+ hall: " P -2b 2"
+ hermann_mauguin: P 2 m b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - x,-y,-z
+ - x,-y+1/2,z
+ number: 28
+ schoenflies: C2v^4
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - x,-y,-z
+ - x,-y+1/2,z
+ universal_h_m: P 2 m b
+- crystal_class: orthorhombic
+ hall: " P -2c 2"
+ hermann_mauguin: P 2 c m
+ ncsym:
+ - x,y,z
+ - x,y,-z+1/2
+ - x,-y,-z
+ - x,-y,z+1/2
+ number: 28
+ schoenflies: C2v^4
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - x,-y,-z
+ - x,-y,z+1/2
+ universal_h_m: P 2 c m
+- crystal_class: orthorhombic
+ hall: " P -2c -2c"
+ hermann_mauguin: P c 2 m
+ ncsym:
+ - x,y,z
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - -x,y,-z
+ number: 28
+ schoenflies: C2v^4
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - -x,y,-z
+ universal_h_m: P c 2 m
+- crystal_class: orthorhombic
+ hall: " P -2a -2a"
+ hermann_mauguin: P m 2 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,z
+ - -x,y,-z
+ number: 28
+ schoenflies: C2v^4
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,z
+ - -x,y,-z
+ universal_h_m: P m 2 a
+- crystal_class: orthorhombic
+ hall: " P 2c -2ac"
+ hermann_mauguin: P c a 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z
+ number: 29
+ schoenflies: C2v^5
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z
+ universal_h_m: P c a 21
+- crystal_class: orthorhombic
+ hall: " P 2c -2b"
+ hermann_mauguin: P b c 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y+1/2,z
+ - x,-y+1/2,z+1/2
+ number: 29
+ schoenflies: C2v^5
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y+1/2,z
+ - x,-y+1/2,z+1/2
+ universal_h_m: P b c 21
+- crystal_class: orthorhombic
+ hall: " P -2b 2a"
+ hermann_mauguin: P 21 a b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - x+1/2,-y,-z
+ - x+1/2,-y+1/2,z
+ number: 29
+ schoenflies: C2v^5
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - x+1/2,-y,-z
+ - x+1/2,-y+1/2,z
+ universal_h_m: P 21 a b
+- crystal_class: orthorhombic
+ hall: " P -2ac 2a"
+ hermann_mauguin: P 21 c a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - x+1/2,-y,-z
+ - x,-y,z+1/2
+ number: 29
+ schoenflies: C2v^5
+ symops:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - x+1/2,-y,-z
+ - x,-y,z+1/2
+ universal_h_m: P 21 c a
+- crystal_class: orthorhombic
+ hall: " P -2bc -2c"
+ hermann_mauguin: P c 21 b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - -x,y,z+1/2
+ - -x,y+1/2,-z
+ number: 29
+ schoenflies: C2v^5
+ symops:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - -x,y,z+1/2
+ - -x,y+1/2,-z
+ universal_h_m: P c 21 b
+- crystal_class: orthorhombic
+ hall: " P -2a -2ab"
+ hermann_mauguin: P b 21 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ number: 29
+ schoenflies: C2v^5
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ universal_h_m: P b 21 a
+- crystal_class: orthorhombic
+ hall: " P 2 -2bc"
+ hermann_mauguin: P n c 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ number: 30
+ schoenflies: C2v^6
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: P n c 2
+- crystal_class: orthorhombic
+ hall: " P 2 -2ac"
+ hermann_mauguin: P c n 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 30
+ schoenflies: C2v^6
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: P c n 2
+- crystal_class: orthorhombic
+ hall: " P -2ac 2"
+ hermann_mauguin: P 2 n a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - x,-y,-z
+ - x+1/2,-y,z+1/2
+ number: 30
+ schoenflies: C2v^6
+ symops:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - x,-y,-z
+ - x+1/2,-y,z+1/2
+ universal_h_m: P 2 n a
+- crystal_class: orthorhombic
+ hall: " P -2ab 2"
+ hermann_mauguin: P 2 a n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - x,-y,-z
+ - x+1/2,-y+1/2,z
+ number: 30
+ schoenflies: C2v^6
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - x,-y,-z
+ - x+1/2,-y+1/2,z
+ universal_h_m: P 2 a n
+- crystal_class: orthorhombic
+ hall: " P -2ab -2ab"
+ hermann_mauguin: P b 2 n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -x,y,-z
+ number: 30
+ schoenflies: C2v^6
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -x,y,-z
+ universal_h_m: P b 2 n
+- crystal_class: orthorhombic
+ hall: " P -2bc -2bc"
+ hermann_mauguin: P n 2 b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - -x,y,-z
+ number: 30
+ schoenflies: C2v^6
+ symops:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - -x,y,-z
+ universal_h_m: P n 2 b
+- crystal_class: orthorhombic
+ hall: " P 2ac -2"
+ hermann_mauguin: P m n 21
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ number: 31
+ schoenflies: C2v^7
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ universal_h_m: P m n 21
+- crystal_class: orthorhombic
+ hall: " P 2bc -2bc"
+ hermann_mauguin: P n m 21
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ number: 31
+ schoenflies: C2v^7
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ universal_h_m: P n m 21
+- crystal_class: orthorhombic
+ hall: " P -2ab 2ab"
+ hermann_mauguin: P 21 m n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - x,-y,z
+ number: 31
+ schoenflies: C2v^7
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - x,-y,z
+ universal_h_m: P 21 m n
+- crystal_class: orthorhombic
+ hall: " P -2 2ac"
+ hermann_mauguin: P 21 n m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,-y,-z+1/2
+ - x+1/2,-y,z+1/2
+ number: 31
+ schoenflies: C2v^7
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,-y,-z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: P 21 n m
+- crystal_class: orthorhombic
+ hall: " P -2 -2bc"
+ hermann_mauguin: P n 21 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ number: 31
+ schoenflies: C2v^7
+ symops:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ universal_h_m: P n 21 m
+- crystal_class: orthorhombic
+ hall: " P -2ab -2"
+ hermann_mauguin: P m 21 n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - -x+1/2,y+1/2,-z
+ number: 31
+ schoenflies: C2v^7
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - -x+1/2,y+1/2,-z
+ universal_h_m: P m 21 n
+- crystal_class: orthorhombic
+ hall: " P 2 -2ab"
+ hermann_mauguin: P b a 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ number: 32
+ schoenflies: C2v^8
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: P b a 2
+- crystal_class: orthorhombic
+ hall: " P -2bc 2"
+ hermann_mauguin: P 2 c b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - x,-y,-z
+ - x,-y+1/2,z+1/2
+ number: 32
+ schoenflies: C2v^8
+ symops:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - x,-y,-z
+ - x,-y+1/2,z+1/2
+ universal_h_m: P 2 c b
+- crystal_class: orthorhombic
+ hall: " P -2ac -2ac"
+ hermann_mauguin: P c 2 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x,y,-z
+ number: 32
+ schoenflies: C2v^8
+ symops:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x,y,-z
+ universal_h_m: P c 2 a
+- crystal_class: orthorhombic
+ hall: " P 2c -2n"
+ hermann_mauguin: P n a 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ number: 33
+ schoenflies: C2v^9
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ universal_h_m: P n a 21
+- crystal_class: orthorhombic
+ hall: " P 2c -2ab"
+ hermann_mauguin: P b n 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z+1/2
+ number: 33
+ schoenflies: C2v^9
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: P b n 21
+- crystal_class: orthorhombic
+ hall: " P -2bc 2a"
+ hermann_mauguin: P 21 n b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - x+1/2,-y,-z
+ - x+1/2,-y+1/2,z+1/2
+ number: 33
+ schoenflies: C2v^9
+ symops:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - x+1/2,-y,-z
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: P 21 n b
+- crystal_class: orthorhombic
+ hall: " P -2n 2a"
+ hermann_mauguin: P 21 c n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - x+1/2,-y,-z
+ - x,-y+1/2,z+1/2
+ number: 33
+ schoenflies: C2v^9
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - x+1/2,-y,-z
+ - x,-y+1/2,z+1/2
+ universal_h_m: P 21 c n
+- crystal_class: orthorhombic
+ hall: " P -2n -2ac"
+ hermann_mauguin: P c 21 n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x,y+1/2,-z
+ number: 33
+ schoenflies: C2v^9
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x,y+1/2,-z
+ universal_h_m: P c 21 n
+- crystal_class: orthorhombic
+ hall: " P -2ac -2n"
+ hermann_mauguin: P n 21 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ number: 33
+ schoenflies: C2v^9
+ symops:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ universal_h_m: P n 21 a
+- crystal_class: orthorhombic
+ hall: " P 2 -2n"
+ hermann_mauguin: P n n 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ number: 34
+ schoenflies: C2v^10
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: P n n 2
+- crystal_class: orthorhombic
+ hall: " P -2n 2"
+ hermann_mauguin: P 2 n n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - x,-y,-z
+ - x+1/2,-y+1/2,z+1/2
+ number: 34
+ schoenflies: C2v^10
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - x,-y,-z
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: P 2 n n
+- crystal_class: orthorhombic
+ hall: " P -2n -2n"
+ hermann_mauguin: P n 2 n
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x,y,-z
+ number: 34
+ schoenflies: C2v^10
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x,y,-z
+ universal_h_m: P n 2 n
+- crystal_class: orthorhombic
+ hall: " C 2 -2"
+ hermann_mauguin: C m m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ number: 35
+ schoenflies: C2v^11
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: C m m 2
+- crystal_class: orthorhombic
+ hall: " A -2 2"
+ hermann_mauguin: A 2 m m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ number: 35
+ schoenflies: C2v^11
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A 2 m m
+- crystal_class: orthorhombic
+ hall: " B -2 -2"
+ hermann_mauguin: B m 2 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ number: 35
+ schoenflies: C2v^11
+ symops:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ - x+1/2,y,z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x+1/2,y,-z+1/2
+ universal_h_m: B m 2 m
+- crystal_class: orthorhombic
+ hall: " C 2c -2"
+ hermann_mauguin: C m c 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z
+ - x,-y,z+1/2
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: C m c 21
+- crystal_class: orthorhombic
+ hall: " C 2c -2c"
+ hermann_mauguin: C c m 21
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x,-y,z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ universal_h_m: C c m 21
+- crystal_class: orthorhombic
+ hall: " A -2a 2a"
+ hermann_mauguin: A 21 m a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - x+1/2,-y,-z
+ - x,-y,z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x+1/2,-y,-z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A 21 m a
+- crystal_class: orthorhombic
+ hall: " A -2 2a"
+ hermann_mauguin: A 21 a m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,-y,-z
+ - x+1/2,-y,z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,-y,-z
+ - x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: A 21 a m
+- crystal_class: orthorhombic
+ hall: " B -2 -2b"
+ hermann_mauguin: B b 21 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z
+ - -x,y+1/2,-z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z
+ - -x,y+1/2,-z
+ - x+1/2,y,z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: B b 21 m
+- crystal_class: orthorhombic
+ hall: " B -2b -2"
+ hermann_mauguin: B m 21 b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y,z
+ - -x,y+1/2,-z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y,z
+ - -x,y+1/2,-z
+ - x+1/2,y,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: B m 21 b
+- crystal_class: orthorhombic
+ hall: " C 2 -2c"
+ hermann_mauguin: C c c 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ number: 37
+ schoenflies: C2v^13
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: C c c 2
+- crystal_class: orthorhombic
+ hall: " A -2a 2"
+ hermann_mauguin: A 2 a a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ number: 37
+ schoenflies: C2v^13
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: A 2 a a
+- crystal_class: orthorhombic
+ hall: " B -2b -2b"
+ hermann_mauguin: B b 2 b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - -x,y,-z
+ number: 37
+ schoenflies: C2v^13
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - -x,y,-z
+ - x+1/2,y,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x+1/2,y,-z+1/2
+ universal_h_m: B b 2 b
+- crystal_class: orthorhombic
+ hall: " A 2 -2"
+ hermann_mauguin: A m m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A m m 2
+- crystal_class: orthorhombic
+ hall: " B 2 -2"
+ hermann_mauguin: B m m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: B m m 2
+- crystal_class: orthorhombic
+ hall: " B -2 2"
+ hermann_mauguin: B 2 m m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ - x+1/2,y,z+1/2
+ - x+1/2,y,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: B 2 m m
+- crystal_class: orthorhombic
+ hall: " C -2 2"
+ hermann_mauguin: C 2 m m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - x+1/2,-y+1/2,z
+ universal_h_m: C 2 m m
+- crystal_class: orthorhombic
+ hall: " C -2 -2"
+ hermann_mauguin: C m 2 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ - x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,-z
+ universal_h_m: C m 2 m
+- crystal_class: orthorhombic
+ hall: " A -2 -2"
+ hermann_mauguin: A m 2 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ - x,y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ universal_h_m: A m 2 m
+- crystal_class: orthorhombic
+ hall: " A 2 -2b"
+ hermann_mauguin: A e m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x,-y+1/2,z
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x,y+1,z+1/2
+ - x,-y+1,z+1/2
+ universal_h_m: A e m 2
+- crystal_class: orthorhombic
+ hall: " B 2 -2a"
+ hermann_mauguin: B m e 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+1,y,z+1/2
+ - x+1,-y,z+1/2
+ universal_h_m: B m e 2
+- crystal_class: orthorhombic
+ hall: " B -2a 2"
+ hermann_mauguin: B 2 e m
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ - x+1/2,y,z+1/2
+ - x+1,y,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - x+1,-y,z+1/2
+ universal_h_m: B 2 e m
+- crystal_class: orthorhombic
+ hall: " C -2a 2"
+ hermann_mauguin: C 2 m e
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ - x+1/2,y+1/2,z
+ - x+1,y+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - x+1,-y+1/2,z
+ universal_h_m: C 2 m e
+- crystal_class: orthorhombic
+ hall: " C -2a -2a"
+ hermann_mauguin: C m 2 e
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,z
+ - -x,y,-z
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,z
+ - -x,y,-z
+ - x+1/2,y+1/2,z
+ - x+1,y+1/2,-z
+ - -x+1,y+1/2,z
+ - -x+1/2,y+1/2,-z
+ universal_h_m: C m 2 e
+- crystal_class: orthorhombic
+ hall: " A -2b -2b"
+ hermann_mauguin: A e 2 m
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - -x,y,-z
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - -x,y,-z
+ - x,y+1/2,z+1/2
+ - x,y+1,-z+1/2
+ - -x,y+1,z+1/2
+ - -x,y+1/2,-z+1/2
+ universal_h_m: A e 2 m
+- crystal_class: orthorhombic
+ hall: " A 2 -2a"
+ hermann_mauguin: A m a 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: A m a 2
+- crystal_class: orthorhombic
+ hall: " B 2 -2b"
+ hermann_mauguin: B b m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x,-y+1/2,z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x,-y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: B b m 2
+- crystal_class: orthorhombic
+ hall: " B -2b 2"
+ hermann_mauguin: B 2 m b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - x,-y,-z
+ - x,-y+1/2,z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - x,-y,-z
+ - x,-y+1/2,z
+ - x+1/2,y,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: B 2 m b
+- crystal_class: orthorhombic
+ hall: " C -2c 2"
+ hermann_mauguin: C 2 c m
+ ncsym:
+ - x,y,z
+ - x,y,-z+1/2
+ - x,-y,-z
+ - x,-y,z+1/2
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - x,-y,-z
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: C 2 c m
+- crystal_class: orthorhombic
+ hall: " C -2c -2c"
+ hermann_mauguin: C c 2 m
+ ncsym:
+ - x,y,z
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - -x,y,-z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - -x,y,-z
+ - x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z
+ universal_h_m: C c 2 m
+- crystal_class: orthorhombic
+ hall: " A -2a -2a"
+ hermann_mauguin: A m 2 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,z
+ - -x,y,-z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,z
+ - -x,y,-z
+ - x,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ universal_h_m: A m 2 a
+- crystal_class: orthorhombic
+ hall: " A 2 -2ab"
+ hermann_mauguin: A e a 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x+1/2,y+1,z+1/2
+ - x+1/2,-y+1,z+1/2
+ universal_h_m: A e a 2
+- crystal_class: orthorhombic
+ hall: " B 2 -2ab"
+ hermann_mauguin: B b e 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+1,y+1/2,z+1/2
+ - x+1,-y+1/2,z+1/2
+ universal_h_m: B b e 2
+- crystal_class: orthorhombic
+ hall: " B -2ab 2"
+ hermann_mauguin: B 2 e b
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - x,-y,-z
+ - x+1/2,-y+1/2,z
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - x,-y,-z
+ - x+1/2,-y+1/2,z
+ - x+1/2,y,z+1/2
+ - x+1,y+1/2,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - x+1,-y+1/2,z+1/2
+ universal_h_m: B 2 e b
+- crystal_class: orthorhombic
+ hall: " C -2ac 2"
+ hermann_mauguin: C 2 e b
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - x,-y,-z
+ - x+1/2,-y,z+1/2
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - x,-y,-z
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - x+1,y+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z
+ - x+1,-y+1/2,z+1/2
+ universal_h_m: C 2 e b
+- crystal_class: orthorhombic
+ hall: " C -2ac -2ac"
+ hermann_mauguin: C c 2 e
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x,y,-z
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x,y,-z
+ - x+1/2,y+1/2,z
+ - x+1,y+1/2,-z+1/2
+ - -x+1,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z
+ universal_h_m: C c 2 e
+- crystal_class: orthorhombic
+ hall: " A -2ab -2ab"
+ hermann_mauguin: A e 2 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -x,y,-z
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -x,y,-z
+ - x,y+1/2,z+1/2
+ - x+1/2,y+1,-z+1/2
+ - -x+1/2,y+1,z+1/2
+ - -x,y+1/2,-z+1/2
+ universal_h_m: A e 2 a
+- crystal_class: orthorhombic
+ hall: " F 2 -2"
+ hermann_mauguin: F m m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ number: 42
+ schoenflies: C2v^18
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: F m m 2
+- crystal_class: orthorhombic
+ hall: " F -2 2"
+ hermann_mauguin: F 2 m m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ number: 42
+ schoenflies: C2v^18
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,y,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - x+1/2,-y+1/2,z
+ universal_h_m: F 2 m m
+- crystal_class: orthorhombic
+ hall: " F -2 -2"
+ hermann_mauguin: F m 2 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ number: 42
+ schoenflies: C2v^18
+ symops:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ - x,y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x+1/2,y,-z+1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,-z
+ universal_h_m: F m 2 m
+- crystal_class: orthorhombic
+ hall: " F 2 -2d"
+ hermann_mauguin: F d d 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/4,y+1/4,z+1/4
+ - x+3/4,-y+3/4,z+1/4
+ number: 43
+ schoenflies: C2v^19
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/4,y+1/4,z+1/4
+ - x+3/4,-y+3/4,z+1/4
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x+1/4,y+3/4,z+3/4
+ - x+3/4,-y+5/4,z+3/4
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+3/4,y+1/4,z+3/4
+ - x+5/4,-y+3/4,z+3/4
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+3/4,y+3/4,z+1/4
+ - x+5/4,-y+5/4,z+1/4
+ universal_h_m: F d d 2
+- crystal_class: orthorhombic
+ hall: " F -2d 2"
+ hermann_mauguin: F 2 d d
+ ncsym:
+ - x,y,z
+ - x+1/4,y+1/4,-z+1/4
+ - x,-y,-z
+ - x+1/4,-y+1/4,z+1/4
+ number: 43
+ schoenflies: C2v^19
+ symops:
+ - x,y,z
+ - x+1/4,y+1/4,-z+1/4
+ - x,-y,-z
+ - x+1/4,-y+1/4,z+1/4
+ - x,y+1/2,z+1/2
+ - x+1/4,y+3/4,-z+3/4
+ - x,-y+1/2,-z+1/2
+ - x+1/4,-y+3/4,z+3/4
+ - x+1/2,y,z+1/2
+ - x+3/4,y+1/4,-z+3/4
+ - x+1/2,-y,-z+1/2
+ - x+3/4,-y+1/4,z+3/4
+ - x+1/2,y+1/2,z
+ - x+3/4,y+3/4,-z+1/4
+ - x+1/2,-y+1/2,-z
+ - x+3/4,-y+3/4,z+1/4
+ universal_h_m: F 2 d d
+- crystal_class: orthorhombic
+ hall: " F -2d -2d"
+ hermann_mauguin: F d 2 d
+ ncsym:
+ - x,y,z
+ - x+1/4,y+1/4,-z+1/4
+ - -x+1/4,y+1/4,z+1/4
+ - -x+1/2,y+1/2,-z
+ number: 43
+ schoenflies: C2v^19
+ symops:
+ - x,y,z
+ - x+1/4,y+1/4,-z+1/4
+ - -x+1/4,y+1/4,z+1/4
+ - -x+1/2,y+1/2,-z
+ - x,y+1/2,z+1/2
+ - x+1/4,y+3/4,-z+3/4
+ - -x+1/4,y+3/4,z+3/4
+ - -x+1/2,y+1,-z+1/2
+ - x+1/2,y,z+1/2
+ - x+3/4,y+1/4,-z+3/4
+ - -x+3/4,y+1/4,z+3/4
+ - -x+1,y+1/2,-z+1/2
+ - x+1/2,y+1/2,z
+ - x+3/4,y+3/4,-z+1/4
+ - -x+3/4,y+3/4,z+1/4
+ - -x+1,y+1,-z
+ universal_h_m: F d 2 d
+- crystal_class: orthorhombic
+ hall: " I 2 -2"
+ hermann_mauguin: I m m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ number: 44
+ schoenflies: C2v^20
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I m m 2
+- crystal_class: orthorhombic
+ hall: " I -2 2"
+ hermann_mauguin: I 2 m m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ number: 44
+ schoenflies: C2v^20
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I 2 m m
+- crystal_class: orthorhombic
+ hall: " I -2 -2"
+ hermann_mauguin: I m 2 m
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ number: 44
+ schoenflies: C2v^20
+ symops:
+ - x,y,z
+ - x,y,-z
+ - -x,y,z
+ - -x,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: I m 2 m
+- crystal_class: orthorhombic
+ hall: " I 2 -2c"
+ hermann_mauguin: I b a 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ number: 45
+ schoenflies: C2v^21
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1
+ - x+1/2,-y+1/2,z+1
+ universal_h_m: I b a 2
+- crystal_class: orthorhombic
+ hall: " I -2a 2"
+ hermann_mauguin: I 2 c b
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ number: 45
+ schoenflies: C2v^21
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x,-y,-z
+ - x+1/2,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - x+1,y+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - x+1,-y+1/2,z+1/2
+ universal_h_m: I 2 c b
+- crystal_class: orthorhombic
+ hall: " I -2b -2b"
+ hermann_mauguin: I c 2 a
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - -x,y,-z
+ number: 45
+ schoenflies: C2v^21
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - -x,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1,-z+1/2
+ - -x+1/2,y+1,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: I c 2 a
+- crystal_class: orthorhombic
+ hall: " I 2 -2a"
+ hermann_mauguin: I m a 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1,y+1/2,z+1/2
+ - x+1,-y+1/2,z+1/2
+ universal_h_m: I m a 2
+- crystal_class: orthorhombic
+ hall: " I 2 -2b"
+ hermann_mauguin: I b m 2
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x,-y+1/2,z
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,y+1,z+1/2
+ - x+1/2,-y+1,z+1/2
+ universal_h_m: I b m 2
+- crystal_class: orthorhombic
+ hall: " I -2b 2"
+ hermann_mauguin: I 2 m b
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - x,-y,-z
+ - x,-y+1/2,z
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - x,y+1/2,-z
+ - x,-y,-z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - x+1/2,-y+1,z+1/2
+ universal_h_m: I 2 m b
+- crystal_class: orthorhombic
+ hall: " I -2c 2"
+ hermann_mauguin: I 2 c m
+ ncsym:
+ - x,y,z
+ - x,y,-z+1/2
+ - x,-y,-z
+ - x,-y,z+1/2
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - x,-y,-z
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1
+ - x+1/2,-y+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1
+ universal_h_m: I 2 c m
+- crystal_class: orthorhombic
+ hall: " I -2c -2c"
+ hermann_mauguin: I c 2 m
+ ncsym:
+ - x,y,z
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - -x,y,-z
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - -x,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1
+ - -x+1/2,y+1/2,z+1
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: I c 2 m
+- crystal_class: orthorhombic
+ hall: " I -2a -2a"
+ hermann_mauguin: I m 2 a
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,z
+ - -x,y,-z
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,z
+ - -x,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1,y+1/2,-z+1/2
+ - -x+1,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: I m 2 a
+- crystal_class: orthorhombic
+ hall: -P 2 2
+ hermann_mauguin: P m m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ number: 47
+ schoenflies: D2h^1
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ universal_h_m: P m m m
+- crystal_class: orthorhombic
+ hall: " P 2 2 -1n"
+ hermann_mauguin: P n n n
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ number: 48
+ schoenflies: D2h^2
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: P n n n :1
+- crystal_class: orthorhombic
+ hall: -P 2ab 2bc
+ hermann_mauguin: P n n n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y,z-1/2
+ number: 48
+ schoenflies: D2h^2
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y,z-1/2
+ universal_h_m: P n n n :2
+- crystal_class: orthorhombic
+ hall: -P 2 2c
+ hermann_mauguin: P c c m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z-1/2
+ - x,-y,z-1/2
+ number: 49
+ schoenflies: D2h^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z-1/2
+ - x,-y,z-1/2
+ universal_h_m: P c c m
+- crystal_class: orthorhombic
+ hall: -P 2a 2
+ hermann_mauguin: P m a a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ number: 49
+ schoenflies: D2h^3
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ universal_h_m: P m a a
+- crystal_class: orthorhombic
+ hall: -P 2b 2b
+ hermann_mauguin: P b m b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z
+ - x,-y,z
+ number: 49
+ schoenflies: D2h^3
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z
+ - x,-y,z
+ universal_h_m: P b m b
+- crystal_class: orthorhombic
+ hall: " P 2 2 -1ab"
+ hermann_mauguin: P b a n
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ number: 50
+ schoenflies: D2h^4
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: P b a n :1
+- crystal_class: orthorhombic
+ hall: -P 2ab 2b
+ hermann_mauguin: P b a n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z
+ - x-1/2,-y,z
+ number: 50
+ schoenflies: D2h^4
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z
+ - x-1/2,-y,z
+ universal_h_m: P b a n :2
+- crystal_class: orthorhombic
+ hall: " P 2 2 -1bc"
+ hermann_mauguin: P n c b
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ number: 50
+ schoenflies: D2h^4
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: P n c b :1
+- crystal_class: orthorhombic
+ hall: -P 2b 2bc
+ hermann_mauguin: P n c b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z-1/2
+ - x,-y,z-1/2
+ number: 50
+ schoenflies: D2h^4
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z-1/2
+ - x,-y,z-1/2
+ universal_h_m: P n c b :2
+- crystal_class: orthorhombic
+ hall: " P 2 2 -1ac"
+ hermann_mauguin: P c n a
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 50
+ schoenflies: D2h^4
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: P c n a :1
+- crystal_class: orthorhombic
+ hall: -P 2a 2c
+ hermann_mauguin: P c n a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z-1/2
+ - x-1/2,-y,z-1/2
+ number: 50
+ schoenflies: D2h^4
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z-1/2
+ - x-1/2,-y,z-1/2
+ universal_h_m: P c n a :2
+- crystal_class: orthorhombic
+ hall: -P 2a 2a
+ hermann_mauguin: P m m a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z
+ - x,-y,z
+ number: 51
+ schoenflies: D2h^5
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z
+ - x,-y,z
+ universal_h_m: P m m a
+- crystal_class: orthorhombic
+ hall: -P 2b 2
+ hermann_mauguin: P m m b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z
+ - x,-y-1/2,z
+ number: 51
+ schoenflies: D2h^5
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z
+ - x,-y-1/2,z
+ universal_h_m: P m m b
+- crystal_class: orthorhombic
+ hall: -P 2 2b
+ hermann_mauguin: P b m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z
+ - x,-y-1/2,z
+ number: 51
+ schoenflies: D2h^5
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z
+ - x,-y-1/2,z
+ universal_h_m: P b m m
+- crystal_class: orthorhombic
+ hall: -P 2c 2c
+ hermann_mauguin: P c m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z-1/2
+ - x,-y,z
+ number: 51
+ schoenflies: D2h^5
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z-1/2
+ - x,-y,z
+ universal_h_m: P c m m
+- crystal_class: orthorhombic
+ hall: -P 2c 2
+ hermann_mauguin: P m c m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z
+ - x,-y,z-1/2
+ number: 51
+ schoenflies: D2h^5
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z
+ - x,-y,z-1/2
+ universal_h_m: P m c m
+- crystal_class: orthorhombic
+ hall: -P 2 2a
+ hermann_mauguin: P m a m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z
+ - x-1/2,-y,z
+ number: 51
+ schoenflies: D2h^5
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z
+ - x-1/2,-y,z
+ universal_h_m: P m a m
+- crystal_class: orthorhombic
+ hall: -P 2a 2bc
+ hermann_mauguin: P n n a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ number: 52
+ schoenflies: D2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ universal_h_m: P n n a
+- crystal_class: orthorhombic
+ hall: -P 2b 2n
+ hermann_mauguin: P n n b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y-1/2,z-1/2
+ - x-1/2,-y,z-1/2
+ number: 52
+ schoenflies: D2h^6
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y-1/2,z-1/2
+ - x-1/2,-y,z-1/2
+ universal_h_m: P n n b
+- crystal_class: orthorhombic
+ hall: -P 2n 2b
+ hermann_mauguin: P b n n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x,y-1/2,z
+ - x-1/2,-y,z-1/2
+ number: 52
+ schoenflies: D2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x,y-1/2,z
+ - x-1/2,-y,z-1/2
+ universal_h_m: P b n n
+- crystal_class: orthorhombic
+ hall: -P 2ab 2c
+ hermann_mauguin: P c n n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ number: 52
+ schoenflies: D2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ universal_h_m: P c n n
+- crystal_class: orthorhombic
+ hall: -P 2ab 2n
+ hermann_mauguin: P n c n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y-1/2,z-1/2
+ - x,-y,z-1/2
+ number: 52
+ schoenflies: D2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y-1/2,z-1/2
+ - x,-y,z-1/2
+ universal_h_m: P n c n
+- crystal_class: orthorhombic
+ hall: -P 2n 2bc
+ hermann_mauguin: P n a n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y,z
+ number: 52
+ schoenflies: D2h^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y,z
+ universal_h_m: P n a n
+- crystal_class: orthorhombic
+ hall: -P 2ac 2
+ hermann_mauguin: P m n a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y,z
+ - x-1/2,-y,z-1/2
+ number: 53
+ schoenflies: D2h^7
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y,z
+ - x-1/2,-y,z-1/2
+ universal_h_m: P m n a
+- crystal_class: orthorhombic
+ hall: -P 2bc 2bc
+ hermann_mauguin: P n m b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x,y-1/2,z-1/2
+ - x,-y,z
+ number: 53
+ schoenflies: D2h^7
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x,y-1/2,z-1/2
+ - x,-y,z
+ universal_h_m: P n m b
+- crystal_class: orthorhombic
+ hall: -P 2ab 2ab
+ hermann_mauguin: P b m n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y-1/2,z
+ - x,-y,z
+ number: 53
+ schoenflies: D2h^7
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y-1/2,z
+ - x,-y,z
+ universal_h_m: P b m n
+- crystal_class: orthorhombic
+ hall: -P 2 2ac
+ hermann_mauguin: P c n m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z-1/2
+ - x-1/2,-y,z-1/2
+ number: 53
+ schoenflies: D2h^7
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z-1/2
+ - x-1/2,-y,z-1/2
+ universal_h_m: P c n m
+- crystal_class: orthorhombic
+ hall: -P 2 2bc
+ hermann_mauguin: P n c m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z-1/2
+ - x,-y-1/2,z-1/2
+ number: 53
+ schoenflies: D2h^7
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z-1/2
+ - x,-y-1/2,z-1/2
+ universal_h_m: P n c m
+- crystal_class: orthorhombic
+ hall: -P 2ab 2
+ hermann_mauguin: P m a n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y,z
+ - x-1/2,-y-1/2,z
+ number: 53
+ schoenflies: D2h^7
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y,z
+ - x-1/2,-y-1/2,z
+ universal_h_m: P m a n
+- crystal_class: orthorhombic
+ hall: -P 2a 2ac
+ hermann_mauguin: P c c a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z-1/2
+ - x,-y,z-1/2
+ number: 54
+ schoenflies: D2h^8
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z-1/2
+ - x,-y,z-1/2
+ universal_h_m: P c c a
+- crystal_class: orthorhombic
+ hall: -P 2b 2c
+ hermann_mauguin: P c c b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z-1/2
+ - x,-y-1/2,z-1/2
+ number: 54
+ schoenflies: D2h^8
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z-1/2
+ - x,-y-1/2,z-1/2
+ universal_h_m: P c c b
+- crystal_class: orthorhombic
+ hall: -P 2a 2b
+ hermann_mauguin: P b a a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y-1/2,z
+ - x-1/2,-y-1/2,z
+ number: 54
+ schoenflies: D2h^8
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y-1/2,z
+ - x-1/2,-y-1/2,z
+ universal_h_m: P b a a
+- crystal_class: orthorhombic
+ hall: -P 2ac 2c
+ hermann_mauguin: P c a a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y,z-1/2
+ - x-1/2,-y,z
+ number: 54
+ schoenflies: D2h^8
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y,z-1/2
+ - x-1/2,-y,z
+ universal_h_m: P c a a
+- crystal_class: orthorhombic
+ hall: -P 2bc 2b
+ hermann_mauguin: P b c b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x,y-1/2,z
+ - x,-y,z-1/2
+ number: 54
+ schoenflies: D2h^8
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x,y-1/2,z
+ - x,-y,z-1/2
+ universal_h_m: P b c b
+- crystal_class: orthorhombic
+ hall: -P 2b 2ab
+ hermann_mauguin: P b a b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y,z
+ number: 54
+ schoenflies: D2h^8
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y,z
+ universal_h_m: P b a b
+- crystal_class: orthorhombic
+ hall: -P 2 2ab
+ hermann_mauguin: P b a m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y-1/2,z
+ number: 55
+ schoenflies: D2h^9
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y-1/2,z
+ universal_h_m: P b a m
+- crystal_class: orthorhombic
+ hall: -P 2bc 2
+ hermann_mauguin: P m c b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x,y,z
+ - x,-y-1/2,z-1/2
+ number: 55
+ schoenflies: D2h^9
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x,y,z
+ - x,-y-1/2,z-1/2
+ universal_h_m: P m c b
+- crystal_class: orthorhombic
+ hall: -P 2ac 2ac
+ hermann_mauguin: P c m a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x,-y,z
+ number: 55
+ schoenflies: D2h^9
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x,-y,z
+ universal_h_m: P c m a
+- crystal_class: orthorhombic
+ hall: -P 2ab 2ac
+ hermann_mauguin: P c c n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y,z-1/2
+ - x,-y-1/2,z-1/2
+ number: 56
+ schoenflies: D2h^10
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y,z-1/2
+ - x,-y-1/2,z-1/2
+ universal_h_m: P c c n
+- crystal_class: orthorhombic
+ hall: -P 2ac 2bc
+ hermann_mauguin: P n a a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y-1/2,z
+ number: 56
+ schoenflies: D2h^10
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y-1/2,z
+ universal_h_m: P n a a
+- crystal_class: orthorhombic
+ hall: -P 2bc 2ab
+ hermann_mauguin: P b n b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y,z-1/2
+ number: 56
+ schoenflies: D2h^10
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y,z-1/2
+ universal_h_m: P b n b
+- crystal_class: orthorhombic
+ hall: -P 2c 2b
+ hermann_mauguin: P b c m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y-1/2,z
+ - x,-y-1/2,z-1/2
+ number: 57
+ schoenflies: D2h^11
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y-1/2,z
+ - x,-y-1/2,z-1/2
+ universal_h_m: P b c m
+- crystal_class: orthorhombic
+ hall: -P 2c 2ac
+ hermann_mauguin: P c a m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x-1/2,-y,z
+ number: 57
+ schoenflies: D2h^11
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x-1/2,-y,z
+ universal_h_m: P c a m
+- crystal_class: orthorhombic
+ hall: -P 2ac 2a
+ hermann_mauguin: P m c a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y,z
+ - x,-y,z-1/2
+ number: 57
+ schoenflies: D2h^11
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y,z
+ - x,-y,z-1/2
+ universal_h_m: P m c a
+- crystal_class: orthorhombic
+ hall: -P 2b 2a
+ hermann_mauguin: P m a b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y,z
+ - x-1/2,-y-1/2,z
+ number: 57
+ schoenflies: D2h^11
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y,z
+ - x-1/2,-y-1/2,z
+ universal_h_m: P m a b
+- crystal_class: orthorhombic
+ hall: -P 2a 2ab
+ hermann_mauguin: P b m a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y-1/2,z
+ - x,-y-1/2,z
+ number: 57
+ schoenflies: D2h^11
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y-1/2,z
+ - x,-y-1/2,z
+ universal_h_m: P b m a
+- crystal_class: orthorhombic
+ hall: -P 2bc 2c
+ hermann_mauguin: P c m b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x,y,z-1/2
+ - x,-y-1/2,z
+ number: 57
+ schoenflies: D2h^11
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x,y,z-1/2
+ - x,-y-1/2,z
+ universal_h_m: P c m b
+- crystal_class: orthorhombic
+ hall: -P 2 2n
+ hermann_mauguin: P n n m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y-1/2,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ number: 58
+ schoenflies: D2h^12
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y-1/2,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ universal_h_m: P n n m
+- crystal_class: orthorhombic
+ hall: -P 2n 2
+ hermann_mauguin: P m n n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x,y,z
+ - x-1/2,-y-1/2,z-1/2
+ number: 58
+ schoenflies: D2h^12
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x,y,z
+ - x-1/2,-y-1/2,z-1/2
+ universal_h_m: P m n n
+- crystal_class: orthorhombic
+ hall: -P 2n 2n
+ hermann_mauguin: P n m n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - x,-y,z
+ number: 58
+ schoenflies: D2h^12
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - x,-y,z
+ universal_h_m: P n m n
+- crystal_class: orthorhombic
+ hall: " P 2 2ab -1ab"
+ hermann_mauguin: P m m n
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - x,-y,z
+ number: 59
+ schoenflies: D2h^13
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - x,-y,z
+ universal_h_m: P m m n :1
+- crystal_class: orthorhombic
+ hall: -P 2ab 2a
+ hermann_mauguin: P m m n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y,z
+ - x,-y-1/2,z
+ number: 59
+ schoenflies: D2h^13
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y,z
+ - x,-y-1/2,z
+ universal_h_m: P m m n :2
+- crystal_class: orthorhombic
+ hall: " P 2bc 2 -1bc"
+ hermann_mauguin: P n m m
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ number: 59
+ schoenflies: D2h^13
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ universal_h_m: P n m m :1
+- crystal_class: orthorhombic
+ hall: -P 2c 2bc
+ hermann_mauguin: P n m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y-1/2,z-1/2
+ - x,-y-1/2,z
+ number: 59
+ schoenflies: D2h^13
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y-1/2,z-1/2
+ - x,-y-1/2,z
+ universal_h_m: P n m m :2
+- crystal_class: orthorhombic
+ hall: " P 2ac 2ac -1ac"
+ hermann_mauguin: P m n m
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x,y,-z
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ number: 59
+ schoenflies: D2h^13
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x,y,-z
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ universal_h_m: P m n m :1
+- crystal_class: orthorhombic
+ hall: -P 2c 2a
+ hermann_mauguin: P m n m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x-1/2,y,z
+ - x-1/2,-y,z-1/2
+ number: 59
+ schoenflies: D2h^13
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x-1/2,y,z
+ - x-1/2,-y,z-1/2
+ universal_h_m: P m n m :2
+- crystal_class: orthorhombic
+ hall: -P 2n 2ab
+ hermann_mauguin: P b c n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x,-y,z-1/2
+ number: 60
+ schoenflies: D2h^14
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x,-y,z-1/2
+ universal_h_m: P b c n
+- crystal_class: orthorhombic
+ hall: -P 2n 2c
+ hermann_mauguin: P c a n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x,y,z-1/2
+ - x-1/2,-y-1/2,z
+ number: 60
+ schoenflies: D2h^14
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x,y,z-1/2
+ - x-1/2,-y-1/2,z
+ universal_h_m: P c a n
+- crystal_class: orthorhombic
+ hall: -P 2a 2n
+ hermann_mauguin: P n c a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y-1/2,z-1/2
+ - x,-y-1/2,z-1/2
+ number: 60
+ schoenflies: D2h^14
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y-1/2,z-1/2
+ - x,-y-1/2,z-1/2
+ universal_h_m: P n c a
+- crystal_class: orthorhombic
+ hall: -P 2bc 2n
+ hermann_mauguin: P n a b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - x-1/2,-y,z
+ number: 60
+ schoenflies: D2h^14
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - x-1/2,-y,z
+ universal_h_m: P n a b
+- crystal_class: orthorhombic
+ hall: -P 2ac 2b
+ hermann_mauguin: P b n a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y-1/2,z
+ - x-1/2,-y-1/2,z-1/2
+ number: 60
+ schoenflies: D2h^14
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y-1/2,z
+ - x-1/2,-y-1/2,z-1/2
+ universal_h_m: P b n a
+- crystal_class: orthorhombic
+ hall: -P 2b 2ac
+ hermann_mauguin: P c n b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ number: 60
+ schoenflies: D2h^14
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ universal_h_m: P c n b
+- crystal_class: orthorhombic
+ hall: -P 2ac 2ab
+ hermann_mauguin: P b c a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x,-y-1/2,z-1/2
+ number: 61
+ schoenflies: D2h^15
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x,-y-1/2,z-1/2
+ universal_h_m: P b c a
+- crystal_class: orthorhombic
+ hall: -P 2bc 2ac
+ hermann_mauguin: P c a b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x-1/2,-y-1/2,z
+ number: 61
+ schoenflies: D2h^15
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x-1/2,-y-1/2,z
+ universal_h_m: P c a b
+- crystal_class: orthorhombic
+ hall: -P 2ac 2n
+ hermann_mauguin: P n m a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - x,-y-1/2,z
+ number: 62
+ schoenflies: D2h^16
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - x,-y-1/2,z
+ universal_h_m: P n m a
+- crystal_class: orthorhombic
+ hall: -P 2bc 2a
+ hermann_mauguin: P m n b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x-1/2,y,z
+ - x-1/2,-y-1/2,z-1/2
+ number: 62
+ schoenflies: D2h^16
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z-1/2
+ - -x-1/2,y,z
+ - x-1/2,-y-1/2,z-1/2
+ universal_h_m: P m n b
+- crystal_class: orthorhombic
+ hall: -P 2c 2ab
+ hermann_mauguin: P b n m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y-1/2,z-1/2
+ number: 62
+ schoenflies: D2h^16
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y-1/2,z-1/2
+ universal_h_m: P b n m
+- crystal_class: orthorhombic
+ hall: -P 2n 2ac
+ hermann_mauguin: P c m n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x,-y-1/2,z
+ number: 62
+ schoenflies: D2h^16
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x,-y-1/2,z
+ universal_h_m: P c m n
+- crystal_class: orthorhombic
+ hall: -P 2n 2a
+ hermann_mauguin: P m c n
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x-1/2,y,z
+ - x,-y-1/2,z-1/2
+ number: 62
+ schoenflies: D2h^16
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z-1/2
+ - -x-1/2,y,z
+ - x,-y-1/2,z-1/2
+ universal_h_m: P m c n
+- crystal_class: orthorhombic
+ hall: -P 2c 2n
+ hermann_mauguin: P n a m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - x-1/2,-y-1/2,z
+ number: 62
+ schoenflies: D2h^16
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - x-1/2,-y-1/2,z
+ universal_h_m: P n a m
+- crystal_class: orthorhombic
+ hall: -C 2c 2
+ hermann_mauguin: C m c m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z
+ - x,-y,z-1/2
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z
+ - x,-y,z-1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z-1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z-1/2
+ universal_h_m: C m c m
+- crystal_class: orthorhombic
+ hall: -C 2c 2c
+ hermann_mauguin: C c m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z-1/2
+ - x,-y,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z-1/2
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z-1/2
+ - -x+1/2,y+1/2,z-1/2
+ - x+1/2,-y+1/2,z
+ universal_h_m: C c m m
+- crystal_class: orthorhombic
+ hall: -A 2a 2a
+ hermann_mauguin: A m m a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z
+ - x,-y,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/2,y+1/2,-z+1/2
+ - -x-1/2,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A m m a
+- crystal_class: orthorhombic
+ hall: -A 2 2a
+ hermann_mauguin: A m a m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z
+ - x-1/2,-y,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z
+ - x-1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x-1/2,y+1/2,z+1/2
+ - x-1/2,-y+1/2,z+1/2
+ universal_h_m: A m a m
+- crystal_class: orthorhombic
+ hall: -B 2 2b
+ hermann_mauguin: B b m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z
+ - x,-y-1/2,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z
+ - x,-y-1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y-1/2,z+1/2
+ - x+1/2,-y-1/2,z+1/2
+ universal_h_m: B b m m
+- crystal_class: orthorhombic
+ hall: -B 2b 2
+ hermann_mauguin: B m m b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z
+ - x,-y-1/2,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z
+ - x,-y-1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y-1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y-1/2,z+1/2
+ universal_h_m: B m m b
+- crystal_class: orthorhombic
+ hall: -C 2ac 2
+ hermann_mauguin: C m c e
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y,z
+ - x-1/2,-y,z-1/2
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x,y,z
+ - x-1/2,-y,z-1/2
+ - x+1/2,y+1/2,z
+ - -x+1,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z-1/2
+ - -x+1/2,y+1/2,z
+ - x,-y+1/2,z-1/2
+ universal_h_m: C m c e
+- crystal_class: orthorhombic
+ hall: -C 2ac 2ac
+ hermann_mauguin: C c m e
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x,-y,z
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y,z-1/2
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1,-y+1/2,z+1/2
+ - x+1,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z-1/2
+ - -x,y+1/2,z-1/2
+ - x+1/2,-y+1/2,z
+ universal_h_m: C c m e
+- crystal_class: orthorhombic
+ hall: -A 2ab 2ab
+ hermann_mauguin: A e m a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y-1/2,z
+ - x,-y,z
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x-1/2,y-1/2,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - x+1/2,-y+1,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/2,y,-z+1/2
+ - -x-1/2,y,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A e m a
+- crystal_class: orthorhombic
+ hall: -A 2 2ab
+ hermann_mauguin: A e a m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y-1/2,z
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y-1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1,-z+1/2
+ - -x+1/2,y+1,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x-1/2,y,z+1/2
+ - x-1/2,-y,z+1/2
+ universal_h_m: A e a m
+- crystal_class: orthorhombic
+ hall: -B 2 2ab
+ hermann_mauguin: B b e m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y-1/2,z
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y-1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1,-y+1/2,-z+1/2
+ - -x+1,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x,y-1/2,z+1/2
+ - x,-y-1/2,z+1/2
+ universal_h_m: B b e m
+- crystal_class: orthorhombic
+ hall: -B 2ab 2
+ hermann_mauguin: B m e b
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y,z
+ - x-1/2,-y-1/2,z
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y,z
+ - x-1/2,-y-1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1,-y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,y-1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x,-y-1/2,z+1/2
+ universal_h_m: B m e b
+- crystal_class: orthorhombic
+ hall: -C 2 2
+ hermann_mauguin: C m m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ number: 65
+ schoenflies: D2h^19
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: C m m m
+- crystal_class: orthorhombic
+ hall: -A 2 2
+ hermann_mauguin: A m m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ number: 65
+ schoenflies: D2h^19
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A m m m
+- crystal_class: orthorhombic
+ hall: -B 2 2
+ hermann_mauguin: B m m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ number: 65
+ schoenflies: D2h^19
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: B m m m
+- crystal_class: orthorhombic
+ hall: -C 2 2c
+ hermann_mauguin: C c c m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z-1/2
+ - x,-y,z-1/2
+ number: 66
+ schoenflies: D2h^20
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z-1/2
+ - x,-y,z-1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z-1/2
+ - x+1/2,-y+1/2,z-1/2
+ universal_h_m: C c c m
+- crystal_class: orthorhombic
+ hall: -A 2a 2
+ hermann_mauguin: A m a a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ number: 66
+ schoenflies: D2h^20
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x-1/2,-y+1/2,z+1/2
+ universal_h_m: A m a a
+- crystal_class: orthorhombic
+ hall: -B 2b 2b
+ hermann_mauguin: B b m b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z
+ - x,-y,z
+ number: 66
+ schoenflies: D2h^20
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z
+ - x,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y-1/2,-z+1/2
+ - -x+1/2,y-1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: B b m b
+- crystal_class: orthorhombic
+ hall: -C 2a 2
+ hermann_mauguin: C m m a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ number: 67
+ schoenflies: D2h^21
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x,-y+1/2,z
+ universal_h_m: C m m a
+- crystal_class: orthorhombic
+ hall: -C 2a 2a
+ hermann_mauguin: C m m b
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z
+ - x,-y,z
+ number: 67
+ schoenflies: D2h^21
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1,-y+1/2,z
+ - x+1,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: C m m b
+- crystal_class: orthorhombic
+ hall: -A 2b 2b
+ hermann_mauguin: A b m m
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z
+ - x,-y,z
+ number: 67
+ schoenflies: D2h^21
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1,z+1/2
+ - x,-y+1,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A b m m
+- crystal_class: orthorhombic
+ hall: -A 2 2b
+ hermann_mauguin: A c m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z
+ - x,-y-1/2,z
+ number: 67
+ schoenflies: D2h^21
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z
+ - x,-y-1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1,-z+1/2
+ - -x,y+1,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: A c m m
+- crystal_class: orthorhombic
+ hall: -B 2 2a
+ hermann_mauguin: B m c m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z
+ - x-1/2,-y,z
+ number: 67
+ schoenflies: D2h^21
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z
+ - x-1/2,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1,-y,-z+1/2
+ - -x+1,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: B m c m
+- crystal_class: orthorhombic
+ hall: -B 2a 2
+ hermann_mauguin: B m a m
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ number: 67
+ schoenflies: D2h^21
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: B m a m
+- crystal_class: orthorhombic
+ hall: " C 2 2 -1ac"
+ hermann_mauguin: C c c e
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 68
+ schoenflies: D2h^22
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1,-y+1/2,-z+1/2
+ - x+1,y+1/2,-z+1/2
+ - -x+1,y+1/2,z+1/2
+ - x+1,-y+1/2,z+1/2
+ universal_h_m: C c c e :1
+- crystal_class: orthorhombic
+ hall: -C 2a 2ac
+ hermann_mauguin: C c c a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z-1/2
+ - x,-y,z-1/2
+ number: 68
+ schoenflies: D2h^22
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z-1/2
+ - x,-y,z-1/2
+ - x+1/2,y+1/2,z
+ - -x+1,-y+1/2,z
+ - x+1,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z
+ - -x,y+1/2,z-1/2
+ - x+1/2,-y+1/2,z-1/2
+ universal_h_m: C c c a :2
+- crystal_class: orthorhombic
+ hall: -C 2a 2c
+ hermann_mauguin: C c c b
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z-1/2
+ - x-1/2,-y,z-1/2
+ number: 68
+ schoenflies: D2h^22
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z-1/2
+ - x-1/2,-y,z-1/2
+ - x+1/2,y+1/2,z
+ - -x+1,-y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z
+ - -x+1/2,y+1/2,z-1/2
+ - x,-y+1/2,z-1/2
+ universal_h_m: C c c b :2
+- crystal_class: orthorhombic
+ hall: " A 2 2 -1ab"
+ hermann_mauguin: A e a a
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ number: 68
+ schoenflies: D2h^22
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x+1/2,-y+1,-z+1/2
+ - x+1/2,y+1,-z+1/2
+ - -x+1/2,y+1,z+1/2
+ - x+1/2,-y+1,z+1/2
+ universal_h_m: A e a a :1
+- crystal_class: orthorhombic
+ hall: -A 2a 2b
+ hermann_mauguin: A b a a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y-1/2,z
+ - x-1/2,-y-1/2,z
+ number: 68
+ schoenflies: D2h^22
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y-1/2,z
+ - x-1/2,-y-1/2,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1,-z+1/2
+ - -x+1/2,y+1,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/2,y+1/2,-z+1/2
+ - -x,y,z+1/2
+ - x-1/2,-y,z+1/2
+ universal_h_m: A b a a :2
+- crystal_class: orthorhombic
+ hall: -A 2ab 2b
+ hermann_mauguin: A c a a
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z
+ - x-1/2,-y,z
+ number: 68
+ schoenflies: D2h^22
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z
+ - x-1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - x,-y+1,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/2,y,-z+1/2
+ - -x,y,z+1/2
+ - x-1/2,-y+1/2,z+1/2
+ universal_h_m: A c a a :2
+- crystal_class: orthorhombic
+ hall: " B 2 2 -1ab"
+ hermann_mauguin: B b e b
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ number: 68
+ schoenflies: D2h^22
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1,-y+1/2,-z+1/2
+ - x+1,y+1/2,-z+1/2
+ - -x+1,y+1/2,z+1/2
+ - x+1,-y+1/2,z+1/2
+ universal_h_m: B b e b :1
+- crystal_class: orthorhombic
+ hall: -B 2ab 2b
+ hermann_mauguin: B b c b
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z
+ - x-1/2,-y,z
+ number: 68
+ schoenflies: D2h^22
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z
+ - x-1/2,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,y-1/2,-z+1/2
+ - -x+1/2,y-1/2,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: B b c b :2
+- crystal_class: orthorhombic
+ hall: -B 2b 2ab
+ hermann_mauguin: B b a b
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y,z
+ number: 68
+ schoenflies: D2h^22
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x-1/2,y-1/2,z
+ - x-1/2,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1,-y+1/2,-z+1/2
+ - -x+1,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y-1/2,-z+1/2
+ - -x,y-1/2,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: B b a b :2
+- crystal_class: orthorhombic
+ hall: -F 2 2
+ hermann_mauguin: F m m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ number: 69
+ schoenflies: D2h^23
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: F m m m
+- crystal_class: orthorhombic
+ hall: " F 2 2 -1d"
+ hermann_mauguin: F d d d
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/4,-y+1/4,-z+1/4
+ - x+1/4,y+1/4,-z+1/4
+ - -x+1/4,y+1/4,z+1/4
+ - x+1/4,-y+1/4,z+1/4
+ number: 70
+ schoenflies: D2h^24
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/4,-y+1/4,-z+1/4
+ - x+1/4,y+1/4,-z+1/4
+ - -x+1/4,y+1/4,z+1/4
+ - x+1/4,-y+1/4,z+1/4
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x+1/4,-y+3/4,-z+3/4
+ - x+1/4,y+3/4,-z+3/4
+ - -x+1/4,y+3/4,z+3/4
+ - x+1/4,-y+3/4,z+3/4
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+3/4,-y+1/4,-z+3/4
+ - x+3/4,y+1/4,-z+3/4
+ - -x+3/4,y+1/4,z+3/4
+ - x+3/4,-y+1/4,z+3/4
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+3/4,-y+3/4,-z+1/4
+ - x+3/4,y+3/4,-z+1/4
+ - -x+3/4,y+3/4,z+1/4
+ - x+3/4,-y+3/4,z+1/4
+ universal_h_m: F d d d :1
+- crystal_class: orthorhombic
+ hall: -F 2uv 2vw
+ hermann_mauguin: F d d d
+ ncsym:
+ - x,y,z
+ - -x+1/4,-y+1/4,z
+ - x,-y+1/4,-z+1/4
+ - -x+1/4,y,-z+1/4
+ - -x,-y,-z
+ - x-1/4,y-1/4,-z
+ - -x,y-1/4,z-1/4
+ - x-1/4,-y,z-1/4
+ number: 70
+ schoenflies: D2h^24
+ symops:
+ - x,y,z
+ - -x+1/4,-y+1/4,z
+ - x,-y+1/4,-z+1/4
+ - -x+1/4,y,-z+1/4
+ - -x,-y,-z
+ - x-1/4,y-1/4,-z
+ - -x,y-1/4,z-1/4
+ - x-1/4,-y,z-1/4
+ - x,y+1/2,z+1/2
+ - -x+1/4,-y+3/4,z+1/2
+ - x,-y+3/4,-z+3/4
+ - -x+1/4,y+1/2,-z+3/4
+ - -x,-y+1/2,-z+1/2
+ - x-1/4,y+1/4,-z+1/2
+ - -x,y+1/4,z+1/4
+ - x-1/4,-y+1/2,z+1/4
+ - x+1/2,y,z+1/2
+ - -x+3/4,-y+1/4,z+1/2
+ - x+1/2,-y+1/4,-z+3/4
+ - -x+3/4,y,-z+3/4
+ - -x+1/2,-y,-z+1/2
+ - x+1/4,y-1/4,-z+1/2
+ - -x+1/2,y-1/4,z+1/4
+ - x+1/4,-y,z+1/4
+ - x+1/2,y+1/2,z
+ - -x+3/4,-y+3/4,z
+ - x+1/2,-y+3/4,-z+1/4
+ - -x+3/4,y+1/2,-z+1/4
+ - -x+1/2,-y+1/2,-z
+ - x+1/4,y+1/4,-z
+ - -x+1/2,y+1/4,z-1/4
+ - x+1/4,-y+1/2,z-1/4
+ universal_h_m: F d d d :2
+- crystal_class: orthorhombic
+ hall: -I 2 2
+ hermann_mauguin: I m m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ number: 71
+ schoenflies: D2h^25
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I m m m
+- crystal_class: orthorhombic
+ hall: -I 2 2c
+ hermann_mauguin: I b a m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z-1/2
+ - x,-y,z-1/2
+ number: 72
+ schoenflies: D2h^26
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z-1/2
+ - x,-y,z-1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1
+ - -x+1/2,y+1/2,-z+1
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: I b a m
+- crystal_class: orthorhombic
+ hall: -I 2a 2
+ hermann_mauguin: I m c b
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ number: 72
+ schoenflies: D2h^26
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y,z
+ - x-1/2,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: I m c b
+- crystal_class: orthorhombic
+ hall: -I 2b 2b
+ hermann_mauguin: I c m a
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z
+ - x,-y,z
+ number: 72
+ schoenflies: D2h^26
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y-1/2,z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - x+1/2,-y+1,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I c m a
+- crystal_class: orthorhombic
+ hall: -I 2b 2c
+ hermann_mauguin: I b c a
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z-1/2
+ - x,-y-1/2,z-1/2
+ number: 73
+ schoenflies: D2h^27
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z-1/2
+ - x,-y-1/2,z-1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - x+1/2,-y+1/2,-z+1
+ - -x+1/2,y+1,-z+1
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: I b c a
+- crystal_class: orthorhombic
+ hall: -I 2a 2b
+ hermann_mauguin: I c a b
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y-1/2,z
+ - x-1/2,-y-1/2,z
+ number: 73
+ schoenflies: D2h^27
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x,y-1/2,z
+ - x-1/2,-y-1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1,-y+1/2,z+1/2
+ - x+1/2,-y+1,-z+1/2
+ - -x+1,y+1,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: I c a b
+- crystal_class: orthorhombic
+ hall: -I 2b 2
+ hermann_mauguin: I m m a
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z
+ - x,-y-1/2,z
+ number: 74
+ schoenflies: D2h^28
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z
+ - x,-y-1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: I m m a
+- crystal_class: orthorhombic
+ hall: -I 2a 2a
+ hermann_mauguin: I m m b
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z
+ - x,-y,z
+ number: 74
+ schoenflies: D2h^28
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x-1/2,y,-z
+ - -x-1/2,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1,-y+1/2,z+1/2
+ - x+1,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I m m b
+- crystal_class: orthorhombic
+ hall: -I 2c 2c
+ hermann_mauguin: I b m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z-1/2
+ - x,-y,z
+ number: 74
+ schoenflies: D2h^28
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z-1/2
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1
+ - x+1/2,-y+1/2,-z+1
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I b m m
+- crystal_class: orthorhombic
+ hall: -I 2 2b
+ hermann_mauguin: I c m m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z
+ - x,-y-1/2,z
+ number: 74
+ schoenflies: D2h^28
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y-1/2,z
+ - x,-y-1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1,-z+1/2
+ - -x+1/2,y+1,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: I c m m
+- crystal_class: orthorhombic
+ hall: -I 2 2a
+ hermann_mauguin: I m c m
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z
+ - x-1/2,-y,z
+ number: 74
+ schoenflies: D2h^28
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y,-z
+ - -x-1/2,y,z
+ - x-1/2,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1,-y+1/2,-z+1/2
+ - -x+1,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: I m c m
+- crystal_class: orthorhombic
+ hall: -I 2c 2
+ hermann_mauguin: I m a m
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z
+ - x,-y,z-1/2
+ number: 74
+ schoenflies: D2h^28
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z-1/2
+ - -x,y,z
+ - x,-y,z-1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ universal_h_m: I m a m
+- crystal_class: tetragonal
+ hall: " P 4"
+ hermann_mauguin: P 4
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ number: 75
+ schoenflies: C4^1
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ universal_h_m: P 4
+- crystal_class: tetragonal
+ hall: " P 4w"
+ hermann_mauguin: P 41
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/4
+ - -x,-y,z+1/2
+ - y,-x,z+3/4
+ number: 76
+ schoenflies: C4^2
+ symops:
+ - x,y,z
+ - -y,x,z+1/4
+ - -x,-y,z+1/2
+ - y,-x,z+3/4
+ universal_h_m: P 41
+- crystal_class: tetragonal
+ hall: " P 4c"
+ hermann_mauguin: P 42
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ number: 77
+ schoenflies: C4^3
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ universal_h_m: P 42
+- crystal_class: tetragonal
+ hall: " P 4cw"
+ hermann_mauguin: P 43
+ ncsym:
+ - x,y,z
+ - -y,x,z+3/4
+ - -x,-y,z+1/2
+ - y,-x,z+1/4
+ number: 78
+ schoenflies: C4^4
+ symops:
+ - x,y,z
+ - -y,x,z+3/4
+ - -x,-y,z+1/2
+ - y,-x,z+1/4
+ universal_h_m: P 43
+- crystal_class: tetragonal
+ hall: " I 4"
+ hermann_mauguin: I 4
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ number: 79
+ schoenflies: C4^5
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ universal_h_m: I 4
+- crystal_class: tetragonal
+ hall: " I 4bw"
+ hermann_mauguin: I 41
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ number: 80
+ schoenflies: C4^6
+ symops:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1,z+3/4
+ - -x+1,-y+1,z+1
+ - y+1,-x+1/2,z+5/4
+ universal_h_m: I 41
+- crystal_class: tetragonal
+ hall: " P -4"
+ hermann_mauguin: P -4
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ number: 81
+ schoenflies: S4^1
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ universal_h_m: P -4
+- crystal_class: tetragonal
+ hall: " I -4"
+ hermann_mauguin: I -4
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ number: 82
+ schoenflies: S4^2
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x+1/2,y+1/2,z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ universal_h_m: I -4
+- crystal_class: tetragonal
+ hall: -P 4
+ hermann_mauguin: P 4/m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ number: 83
+ schoenflies: C4h^1
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ universal_h_m: P 4/m
+- crystal_class: tetragonal
+ hall: -P 4c
+ hermann_mauguin: P 42/m
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,-y,-z
+ - y,-x,-z-1/2
+ - x,y,-z
+ - -y,x,-z-1/2
+ number: 84
+ schoenflies: C4h^2
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,-y,-z
+ - y,-x,-z-1/2
+ - x,y,-z
+ - -y,x,-z-1/2
+ universal_h_m: P 42/m
+- crystal_class: tetragonal
+ hall: " P 4ab -1ab"
+ hermann_mauguin: P 4/n
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ number: 85
+ schoenflies: C4h^3
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ universal_h_m: P 4/n :1
+- crystal_class: tetragonal
+ hall: -P 4a
+ hermann_mauguin: P 4/n
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ number: 85
+ schoenflies: C4h^3
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ universal_h_m: P 4/n :2
+- crystal_class: tetragonal
+ hall: " P 4n -1n"
+ hermann_mauguin: P 42/n
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ number: 86
+ schoenflies: C4h^4
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ universal_h_m: P 42/n :1
+- crystal_class: tetragonal
+ hall: -P 4bc
+ hermann_mauguin: P 42/n
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z+1/2
+ - -x,-y,-z
+ - y,-x-1/2,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y-1/2,x,-z-1/2
+ number: 86
+ schoenflies: C4h^4
+ symops:
+ - x,y,z
+ - -y,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z+1/2
+ - -x,-y,-z
+ - y,-x-1/2,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y-1/2,x,-z-1/2
+ universal_h_m: P 42/n :2
+- crystal_class: tetragonal
+ hall: -I 4
+ hermann_mauguin: I 4/m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ number: 87
+ schoenflies: C4h^5
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ universal_h_m: I 4/m
+- crystal_class: tetragonal
+ hall: " I 4bw -1bw"
+ hermann_mauguin: I 41/a
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - -x,-y+1/2,-z+1/4
+ - y,-x,-z
+ - x-1/2,y,-z-1/4
+ - -y-1/2,x+1/2,-z-1/2
+ number: 88
+ schoenflies: C4h^6
+ symops:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - -x,-y+1/2,-z+1/4
+ - y,-x,-z
+ - x-1/2,y,-z-1/4
+ - -y-1/2,x+1/2,-z-1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1,z+3/4
+ - -x+1,-y+1,z+1
+ - y+1,-x+1/2,z+5/4
+ - -x+1/2,-y+1,-z+3/4
+ - y+1/2,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/4
+ - -y,x+1,-z
+ universal_h_m: I 41/a :1
+- crystal_class: tetragonal
+ hall: -I 4ad
+ hermann_mauguin: I 41/a
+ ncsym:
+ - x,y,z
+ - -y+3/4,x+1/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+3/4,-x+3/4,z+3/4
+ - -x,-y,-z
+ - y-3/4,-x-1/4,-z-1/4
+ - x-1/2,y,-z-1/2
+ - -y-3/4,x-3/4,-z-3/4
+ number: 88
+ schoenflies: C4h^6
+ symops:
+ - x,y,z
+ - -y+3/4,x+1/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+3/4,-x+3/4,z+3/4
+ - -x,-y,-z
+ - y-3/4,-x-1/4,-z-1/4
+ - x-1/2,y,-z-1/2
+ - -y-3/4,x-3/4,-z-3/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+5/4,x+3/4,z+3/4
+ - -x+1,-y+1/2,z+1
+ - y+5/4,-x+5/4,z+5/4
+ - -x+1/2,-y+1/2,-z+1/2
+ - y-1/4,-x+1/4,-z+1/4
+ - x,y+1/2,-z
+ - -y-1/4,x-1/4,-z-1/4
+ universal_h_m: I 41/a :2
+- crystal_class: tetragonal
+ hall: " P 4 2"
+ hermann_mauguin: P 4 2 2
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ number: 89
+ schoenflies: D4^1
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ universal_h_m: P 4 2 2
+- crystal_class: tetragonal
+ hall: " P 4ab 2ab"
+ hermann_mauguin: P 4 21 2
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z
+ number: 90
+ schoenflies: D4^2
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z
+ universal_h_m: P 4 21 2
+- crystal_class: tetragonal
+ hall: " P 4w 2c"
+ hermann_mauguin: P 41 2 2
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/4
+ - -x,-y,z+1/2
+ - y,-x,z+3/4
+ - x,-y,-z+1/2
+ - y,x,-z+3/4
+ - -x,y,-z
+ - -y,-x,-z+1/4
+ number: 91
+ schoenflies: D4^3
+ symops:
+ - x,y,z
+ - -y,x,z+1/4
+ - -x,-y,z+1/2
+ - y,-x,z+3/4
+ - x,-y,-z+1/2
+ - y,x,-z+3/4
+ - -x,y,-z
+ - -y,-x,-z+1/4
+ universal_h_m: P 41 2 2
+- crystal_class: tetragonal
+ hall: " P 4abw 2nw"
+ hermann_mauguin: P 41 21 2
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/4
+ - -x,-y,z+1/2
+ - y+1/2,-x+1/2,z+3/4
+ - x+1/2,-y+1/2,-z+3/4
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+1/4
+ - -y,-x,-z+1/2
+ number: 92
+ schoenflies: D4^4
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/4
+ - -x,-y,z+1/2
+ - y+1/2,-x+1/2,z+3/4
+ - x+1/2,-y+1/2,-z+3/4
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+1/4
+ - -y,-x,-z+1/2
+ universal_h_m: P 41 21 2
+- crystal_class: tetragonal
+ hall: " P 4c 2"
+ hermann_mauguin: P 42 2 2
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z
+ - y,x,-z+1/2
+ - -x,y,-z
+ - -y,-x,-z+1/2
+ number: 93
+ schoenflies: D4^5
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z
+ - y,x,-z+1/2
+ - -x,y,-z
+ - -y,-x,-z+1/2
+ universal_h_m: P 42 2 2
+- crystal_class: tetragonal
+ hall: " P 4n 2n"
+ hermann_mauguin: P 42 21 2
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z
+ number: 94
+ schoenflies: D4^6
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z
+ universal_h_m: P 42 21 2
+- crystal_class: tetragonal
+ hall: " P 4cw 2c"
+ hermann_mauguin: P 43 2 2
+ ncsym:
+ - x,y,z
+ - -y,x,z+3/4
+ - -x,-y,z+1/2
+ - y,-x,z+1/4
+ - x,-y,-z+1/2
+ - y,x,-z+1/4
+ - -x,y,-z
+ - -y,-x,-z+3/4
+ number: 95
+ schoenflies: D4^7
+ symops:
+ - x,y,z
+ - -y,x,z+3/4
+ - -x,-y,z+1/2
+ - y,-x,z+1/4
+ - x,-y,-z+1/2
+ - y,x,-z+1/4
+ - -x,y,-z
+ - -y,-x,-z+3/4
+ universal_h_m: P 43 2 2
+- crystal_class: tetragonal
+ hall: " P 4nw 2abw"
+ hermann_mauguin: P 43 21 2
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+3/4
+ - -x,-y,z+1/2
+ - y+1/2,-x+1/2,z+1/4
+ - x+1/2,-y+1/2,-z+1/4
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+3/4
+ - -y,-x,-z+1/2
+ number: 96
+ schoenflies: D4^8
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+3/4
+ - -x,-y,z+1/2
+ - y+1/2,-x+1/2,z+1/4
+ - x+1/2,-y+1/2,-z+1/4
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+3/4
+ - -y,-x,-z+1/2
+ universal_h_m: P 43 21 2
+- crystal_class: tetragonal
+ hall: " I 4 2"
+ hermann_mauguin: I 4 2 2
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ number: 97
+ schoenflies: D4^9
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ universal_h_m: I 4 2 2
+- crystal_class: tetragonal
+ hall: " I 4bw 2bw"
+ hermann_mauguin: I 41 2 2
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - x,-y+1/2,-z+1/4
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y,-z+3/4
+ - -y,-x,-z
+ number: 98
+ schoenflies: D4^10
+ symops:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - x,-y+1/2,-z+1/4
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y,-z+3/4
+ - -y,-x,-z
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1,z+3/4
+ - -x+1,-y+1,z+1
+ - y+1,-x+1/2,z+5/4
+ - x+1/2,-y+1,-z+3/4
+ - y+1,x+1,-z+1
+ - -x+1,y+1/2,-z+5/4
+ - -y+1/2,-x+1/2,-z+1/2
+ universal_h_m: I 41 2 2
+- crystal_class: tetragonal
+ hall: " P 4 -2"
+ hermann_mauguin: P 4 m m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ number: 99
+ schoenflies: C4v^1
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ universal_h_m: P 4 m m
+- crystal_class: tetragonal
+ hall: " P 4 -2ab"
+ hermann_mauguin: P 4 b m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ number: 100
+ schoenflies: C4v^2
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ universal_h_m: P 4 b m
+- crystal_class: tetragonal
+ hall: " P 4c -2c"
+ hermann_mauguin: P 42 c m
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,y,z+1/2
+ - -y,-x,z
+ - x,-y,z+1/2
+ - y,x,z
+ number: 101
+ schoenflies: C4v^3
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,y,z+1/2
+ - -y,-x,z
+ - x,-y,z+1/2
+ - y,x,z
+ universal_h_m: P 42 c m
+- crystal_class: tetragonal
+ hall: " P 4n -2n"
+ hermann_mauguin: P 42 n m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z
+ number: 102
+ schoenflies: C4v^4
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z
+ universal_h_m: P 42 n m
+- crystal_class: tetragonal
+ hall: " P 4 -2c"
+ hermann_mauguin: P 4 c c
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - y,x,z+1/2
+ number: 103
+ schoenflies: C4v^5
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - y,x,z+1/2
+ universal_h_m: P 4 c c
+- crystal_class: tetragonal
+ hall: " P 4 -2n"
+ hermann_mauguin: P 4 n c
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 104
+ schoenflies: C4v^6
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: P 4 n c
+- crystal_class: tetragonal
+ hall: " P 4c -2"
+ hermann_mauguin: P 42 m c
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,y,z
+ - -y,-x,z+1/2
+ - x,-y,z
+ - y,x,z+1/2
+ number: 105
+ schoenflies: C4v^7
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,y,z
+ - -y,-x,z+1/2
+ - x,-y,z
+ - y,x,z+1/2
+ universal_h_m: P 42 m c
+- crystal_class: tetragonal
+ hall: " P 4c -2ab"
+ hermann_mauguin: P 42 b c
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z+1/2
+ number: 106
+ schoenflies: C4v^8
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: P 42 b c
+- crystal_class: tetragonal
+ hall: " I 4 -2"
+ hermann_mauguin: I 4 m m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ number: 107
+ schoenflies: C4v^9
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: I 4 m m
+- crystal_class: tetragonal
+ hall: " I 4 -2c"
+ hermann_mauguin: I 4 c m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - y,x,z+1/2
+ number: 108
+ schoenflies: C4v^10
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - y,x,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1
+ - -y+1/2,-x+1/2,z+1
+ - x+1/2,-y+1/2,z+1
+ - y+1/2,x+1/2,z+1
+ universal_h_m: I 4 c m
+- crystal_class: tetragonal
+ hall: " I 4bw -2"
+ hermann_mauguin: I 41 m d
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - -x,y,z
+ - -y,-x+1/2,z+1/4
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x,z+3/4
+ number: 109
+ schoenflies: C4v^11
+ symops:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - -x,y,z
+ - -y,-x+1/2,z+1/4
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x,z+3/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1,z+3/4
+ - -x+1,-y+1,z+1
+ - y+1,-x+1/2,z+5/4
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1,z+3/4
+ - x+1,-y+1,z+1
+ - y+1,x+1/2,z+5/4
+ universal_h_m: I 41 m d
+- crystal_class: tetragonal
+ hall: " I 4bw -2c"
+ hermann_mauguin: I 41 c d
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - -x,y,z+1/2
+ - -y,-x+1/2,z+3/4
+ - x+1/2,-y+1/2,z
+ - y+1/2,x,z+1/4
+ number: 110
+ schoenflies: C4v^12
+ symops:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - -x,y,z+1/2
+ - -y,-x+1/2,z+3/4
+ - x+1/2,-y+1/2,z
+ - y+1/2,x,z+1/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1,z+3/4
+ - -x+1,-y+1,z+1
+ - y+1,-x+1/2,z+5/4
+ - -x+1/2,y+1/2,z+1
+ - -y+1/2,-x+1,z+5/4
+ - x+1,-y+1,z+1/2
+ - y+1,x+1/2,z+3/4
+ universal_h_m: I 41 c d
+- crystal_class: tetragonal
+ hall: " P -4 2"
+ hermann_mauguin: P -4 2 m
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ number: 111
+ schoenflies: D2d^1
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ universal_h_m: P -4 2 m
+- crystal_class: tetragonal
+ hall: " P -4 2c"
+ hermann_mauguin: P -4 2 c
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z+1/2
+ - -y,-x,z+1/2
+ - -x,y,-z+1/2
+ - y,x,z+1/2
+ number: 112
+ schoenflies: D2d^2
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z+1/2
+ - -y,-x,z+1/2
+ - -x,y,-z+1/2
+ - y,x,z+1/2
+ universal_h_m: P -4 2 c
+- crystal_class: tetragonal
+ hall: " P -4 2ab"
+ hermann_mauguin: P -4 21 m
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x+1/2,-y+1/2,-z
+ - -y+1/2,-x+1/2,z
+ - -x+1/2,y+1/2,-z
+ - y+1/2,x+1/2,z
+ number: 113
+ schoenflies: D2d^3
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x+1/2,-y+1/2,-z
+ - -y+1/2,-x+1/2,z
+ - -x+1/2,y+1/2,-z
+ - y+1/2,x+1/2,z
+ universal_h_m: P -4 21 m
+- crystal_class: tetragonal
+ hall: " P -4 2n"
+ hermann_mauguin: P -4 21 c
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x+1/2,-y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 114
+ schoenflies: D2d^4
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x+1/2,-y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: P -4 21 c
+- crystal_class: tetragonal
+ hall: " P -4 -2"
+ hermann_mauguin: P -4 m 2
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x,y,z
+ - y,x,-z
+ - x,-y,z
+ - -y,-x,-z
+ number: 115
+ schoenflies: D2d^5
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x,y,z
+ - y,x,-z
+ - x,-y,z
+ - -y,-x,-z
+ universal_h_m: P -4 m 2
+- crystal_class: tetragonal
+ hall: " P -4 -2c"
+ hermann_mauguin: P -4 c 2
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x,y,z+1/2
+ - y,x,-z+1/2
+ - x,-y,z+1/2
+ - -y,-x,-z+1/2
+ number: 116
+ schoenflies: D2d^6
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x,y,z+1/2
+ - y,x,-z+1/2
+ - x,-y,z+1/2
+ - -y,-x,-z+1/2
+ universal_h_m: P -4 c 2
+- crystal_class: tetragonal
+ hall: " P -4 -2ab"
+ hermann_mauguin: P -4 b 2
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x+1/2,y+1/2,z
+ - y+1/2,x+1/2,-z
+ - x+1/2,-y+1/2,z
+ - -y+1/2,-x+1/2,-z
+ number: 117
+ schoenflies: D2d^7
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x+1/2,y+1/2,z
+ - y+1/2,x+1/2,-z
+ - x+1/2,-y+1/2,z
+ - -y+1/2,-x+1/2,-z
+ universal_h_m: P -4 b 2
+- crystal_class: tetragonal
+ hall: " P -4 -2n"
+ hermann_mauguin: P -4 n 2
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ number: 118
+ schoenflies: D2d^8
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ universal_h_m: P -4 n 2
+- crystal_class: tetragonal
+ hall: " I -4 -2"
+ hermann_mauguin: I -4 m 2
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x,y,z
+ - y,x,-z
+ - x,-y,z
+ - -y,-x,-z
+ number: 119
+ schoenflies: D2d^9
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x,y,z
+ - y,x,-z
+ - x,-y,z
+ - -y,-x,-z
+ - x+1/2,y+1/2,z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ universal_h_m: I -4 m 2
+- crystal_class: tetragonal
+ hall: " I -4 -2c"
+ hermann_mauguin: I -4 c 2
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x,y,z+1/2
+ - y,x,-z+1/2
+ - x,-y,z+1/2
+ - -y,-x,-z+1/2
+ number: 120
+ schoenflies: D2d^10
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - -x,y,z+1/2
+ - y,x,-z+1/2
+ - x,-y,z+1/2
+ - -y,-x,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1
+ - y+1/2,x+1/2,-z+1
+ - x+1/2,-y+1/2,z+1
+ - -y+1/2,-x+1/2,-z+1
+ universal_h_m: I -4 c 2
+- crystal_class: tetragonal
+ hall: " I -4 2"
+ hermann_mauguin: I -4 2 m
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ number: 121
+ schoenflies: D2d^11
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ - x+1/2,y+1/2,z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: I -4 2 m
+- crystal_class: tetragonal
+ hall: " I -4 2bw"
+ hermann_mauguin: I -4 2 d
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y+1/2,-z+1/4
+ - -y+1/2,-x,z+3/4
+ - -x,y+1/2,-z+1/4
+ - y+1/2,x,z+3/4
+ number: 122
+ schoenflies: D2d^12
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y+1/2,-z+1/4
+ - -y+1/2,-x,z+3/4
+ - -x,y+1/2,-z+1/4
+ - y+1/2,x,z+3/4
+ - x+1/2,y+1/2,z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - x+1/2,-y+1,-z+3/4
+ - -y+1,-x+1/2,z+5/4
+ - -x+1/2,y+1,-z+3/4
+ - y+1,x+1/2,z+5/4
+ universal_h_m: I -4 2 d
+- crystal_class: tetragonal
+ hall: -P 4 2
+ hermann_mauguin: P 4/m m m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ number: 123
+ schoenflies: D4h^1
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ universal_h_m: P 4/m m m
+- crystal_class: tetragonal
+ hall: -P 4 2c
+ hermann_mauguin: P 4/m c c
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y,-z+1/2
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z-1/2
+ - -y,-x,z-1/2
+ - x,-y,z-1/2
+ - y,x,z-1/2
+ number: 124
+ schoenflies: D4h^2
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y,-z+1/2
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z-1/2
+ - -y,-x,z-1/2
+ - x,-y,z-1/2
+ - y,x,z-1/2
+ universal_h_m: P 4/m c c
+- crystal_class: tetragonal
+ hall: " P 4 2 -1ab"
+ hermann_mauguin: P 4/n b m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ number: 125
+ schoenflies: D4h^3
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ universal_h_m: P 4/n b m :1
+- crystal_class: tetragonal
+ hall: -P 4a 2b
+ hermann_mauguin: P 4/n b m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x,y-1/2,z
+ - -y,-x,z
+ - x-1/2,-y,z
+ - y-1/2,x-1/2,z
+ number: 125
+ schoenflies: D4h^3
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x,y-1/2,z
+ - -y,-x,z
+ - x-1/2,-y,z
+ - y-1/2,x-1/2,z
+ universal_h_m: P 4/n b m :2
+- crystal_class: tetragonal
+ hall: " P 4 2 -1n"
+ hermann_mauguin: P 4/n n c
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 126
+ schoenflies: D4h^4
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: P 4/n n c :1
+- crystal_class: tetragonal
+ hall: -P 4a 2bc
+ hermann_mauguin: P 4/n n c
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x,y-1/2,z-1/2
+ - -y,-x,z-1/2
+ - x-1/2,-y,z-1/2
+ - y-1/2,x-1/2,z-1/2
+ number: 126
+ schoenflies: D4h^4
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x,y-1/2,z-1/2
+ - -y,-x,z-1/2
+ - x-1/2,-y,z-1/2
+ - y-1/2,x-1/2,z-1/2
+ universal_h_m: P 4/n n c :2
+- crystal_class: tetragonal
+ hall: -P 4 2ab
+ hermann_mauguin: P 4/m b m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x-1/2,y-1/2,z
+ - -y-1/2,-x-1/2,z
+ - x-1/2,-y-1/2,z
+ - y-1/2,x-1/2,z
+ number: 127
+ schoenflies: D4h^5
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x-1/2,y-1/2,z
+ - -y-1/2,-x-1/2,z
+ - x-1/2,-y-1/2,z
+ - y-1/2,x-1/2,z
+ universal_h_m: P 4/m b m
+- crystal_class: tetragonal
+ hall: -P 4 2n
+ hermann_mauguin: P 4/m n c
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x-1/2,y-1/2,z-1/2
+ - -y-1/2,-x-1/2,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ - y-1/2,x-1/2,z-1/2
+ number: 128
+ schoenflies: D4h^6
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x-1/2,y-1/2,z-1/2
+ - -y-1/2,-x-1/2,z-1/2
+ - x-1/2,-y-1/2,z-1/2
+ - y-1/2,x-1/2,z-1/2
+ universal_h_m: P 4/m n c
+- crystal_class: tetragonal
+ hall: " P 4ab 2ab -1ab"
+ hermann_mauguin: P 4/n m m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y+1/2,-x+1/2,z
+ - x,-y,z
+ - y+1/2,x+1/2,z
+ number: 129
+ schoenflies: D4h^7
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y+1/2,-x+1/2,z
+ - x,-y,z
+ - y+1/2,x+1/2,z
+ universal_h_m: P 4/n m m :1
+- crystal_class: tetragonal
+ hall: -P 4a 2a
+ hermann_mauguin: P 4/n m m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x+1/2,-y,-z
+ - y+1/2,x+1/2,-z
+ - -x,y+1/2,-z
+ - -y,-x,-z
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x-1/2,y,z
+ - -y-1/2,-x-1/2,z
+ - x,-y-1/2,z
+ - y,x,z
+ number: 129
+ schoenflies: D4h^7
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x+1/2,-y,-z
+ - y+1/2,x+1/2,-z
+ - -x,y+1/2,-z
+ - -y,-x,-z
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x-1/2,y,z
+ - -y-1/2,-x-1/2,z
+ - x,-y-1/2,z
+ - y,x,z
+ universal_h_m: P 4/n m m :2
+- crystal_class: tetragonal
+ hall: " P 4ab 2n -1ab"
+ hermann_mauguin: P 4/n c c
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ - -x,y,z-1/2
+ - -y+1/2,-x+1/2,z-1/2
+ - x,-y,z-1/2
+ - y+1/2,x+1/2,z-1/2
+ number: 130
+ schoenflies: D4h^8
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ - -x,y,z-1/2
+ - -y+1/2,-x+1/2,z-1/2
+ - x,-y,z-1/2
+ - y+1/2,x+1/2,z-1/2
+ universal_h_m: P 4/n c c :1
+- crystal_class: tetragonal
+ hall: -P 4a 2ac
+ hermann_mauguin: P 4/n c c
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x-1/2,y,z-1/2
+ - -y-1/2,-x-1/2,z-1/2
+ - x,-y-1/2,z-1/2
+ - y,x,z-1/2
+ number: 130
+ schoenflies: D4h^8
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x-1/2,y,z-1/2
+ - -y-1/2,-x-1/2,z-1/2
+ - x,-y-1/2,z-1/2
+ - y,x,z-1/2
+ universal_h_m: P 4/n c c :2
+- crystal_class: tetragonal
+ hall: -P 4c 2
+ hermann_mauguin: P 42/m m c
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z
+ - y,x,-z+1/2
+ - -x,y,-z
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z-1/2
+ - x,y,-z
+ - -y,x,-z-1/2
+ - -x,y,z
+ - -y,-x,z-1/2
+ - x,-y,z
+ - y,x,z-1/2
+ number: 131
+ schoenflies: D4h^9
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z
+ - y,x,-z+1/2
+ - -x,y,-z
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z-1/2
+ - x,y,-z
+ - -y,x,-z-1/2
+ - -x,y,z
+ - -y,-x,z-1/2
+ - x,-y,z
+ - y,x,z-1/2
+ universal_h_m: P 42/m m c
+- crystal_class: tetragonal
+ hall: -P 4c 2c
+ hermann_mauguin: P 42/m c m
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z+1/2
+ - y,x,-z
+ - -x,y,-z+1/2
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z-1/2
+ - x,y,-z
+ - -y,x,-z-1/2
+ - -x,y,z-1/2
+ - -y,-x,z
+ - x,-y,z-1/2
+ - y,x,z
+ number: 132
+ schoenflies: D4h^10
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z+1/2
+ - y,x,-z
+ - -x,y,-z+1/2
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z-1/2
+ - x,y,-z
+ - -y,x,-z-1/2
+ - -x,y,z-1/2
+ - -y,-x,z
+ - x,-y,z-1/2
+ - y,x,z
+ universal_h_m: P 42/m c m
+- crystal_class: tetragonal
+ hall: " P 4n 2c -1n"
+ hermann_mauguin: P 42/n b c
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x,y,-z+1/2
+ - -y+1/2,-x+1/2,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z
+ - -y,-x,z+1/2
+ - x+1/2,-y+1/2,z
+ - y,x,z+1/2
+ number: 133
+ schoenflies: D4h^11
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x,y,-z+1/2
+ - -y+1/2,-x+1/2,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z
+ - -y,-x,z+1/2
+ - x+1/2,-y+1/2,z
+ - y,x,z+1/2
+ universal_h_m: P 42/n b c :1
+- crystal_class: tetragonal
+ hall: -P 4ac 2b
+ hermann_mauguin: P 42/n b c
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z
+ - y,x,-z+1/2
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z-1/2
+ - -x,y-1/2,z
+ - -y,-x,z-1/2
+ - x-1/2,-y,z
+ - y-1/2,x-1/2,z-1/2
+ number: 133
+ schoenflies: D4h^11
+ symops:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z
+ - y,x,-z+1/2
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z-1/2
+ - -x,y-1/2,z
+ - -y,-x,z-1/2
+ - x-1/2,-y,z
+ - y-1/2,x-1/2,z-1/2
+ universal_h_m: P 42/n b c :2
+- crystal_class: tetragonal
+ hall: " P 4n 2 -1n"
+ hermann_mauguin: P 42/n n m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z
+ number: 134
+ schoenflies: D4h^12
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z
+ universal_h_m: P 42/n n m :1
+- crystal_class: tetragonal
+ hall: -P 4ac 2bc
+ hermann_mauguin: P 42/n n m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y-1/2,-x,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z-1/2
+ - -x,y-1/2,z-1/2
+ - -y,-x,z
+ - x-1/2,-y,z-1/2
+ - y-1/2,x-1/2,z
+ number: 134
+ schoenflies: D4h^12
+ symops:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y-1/2,-x,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z-1/2
+ - -x,y-1/2,z-1/2
+ - -y,-x,z
+ - x-1/2,-y,z-1/2
+ - y-1/2,x-1/2,z
+ universal_h_m: P 42/n n m :2
+- crystal_class: tetragonal
+ hall: -P 4c 2ab
+ hermann_mauguin: P 42/m b c
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z-1/2
+ - x,y,-z
+ - -y,x,-z-1/2
+ - -x-1/2,y-1/2,z
+ - -y-1/2,-x-1/2,z-1/2
+ - x-1/2,-y-1/2,z
+ - y-1/2,x-1/2,z-1/2
+ number: 135
+ schoenflies: D4h^13
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z-1/2
+ - x,y,-z
+ - -y,x,-z-1/2
+ - -x-1/2,y-1/2,z
+ - -y-1/2,-x-1/2,z-1/2
+ - x-1/2,-y-1/2,z
+ - y-1/2,x-1/2,z-1/2
+ universal_h_m: P 42/m b c
+- crystal_class: tetragonal
+ hall: -P 4n 2n
+ hermann_mauguin: P 42/m n m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z
+ - -x,-y,-z
+ - y-1/2,-x-1/2,-z-1/2
+ - x,y,-z
+ - -y-1/2,x-1/2,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - -y,-x,z
+ - x-1/2,-y-1/2,z-1/2
+ - y,x,z
+ number: 136
+ schoenflies: D4h^14
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z
+ - -x,-y,-z
+ - y-1/2,-x-1/2,-z-1/2
+ - x,y,-z
+ - -y-1/2,x-1/2,-z-1/2
+ - -x-1/2,y-1/2,z-1/2
+ - -y,-x,z
+ - x-1/2,-y-1/2,z-1/2
+ - y,x,z
+ universal_h_m: P 42/m n m
+- crystal_class: tetragonal
+ hall: " P 4n 2n -1n"
+ hermann_mauguin: P 42/n m c
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x,y,z
+ - -y+1/2,-x+1/2,z+1/2
+ - x,-y,z
+ - y+1/2,x+1/2,z+1/2
+ number: 137
+ schoenflies: D4h^15
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x,y,z
+ - -y+1/2,-x+1/2,z+1/2
+ - x,-y,z
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: P 42/n m c :1
+- crystal_class: tetragonal
+ hall: -P 4ac 2a
+ hermann_mauguin: P 42/n m c
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x+1/2,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y+1/2,-z
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z-1/2
+ - -x-1/2,y,z
+ - -y-1/2,-x-1/2,z-1/2
+ - x,-y-1/2,z
+ - y,x,z-1/2
+ number: 137
+ schoenflies: D4h^15
+ symops:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x+1/2,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y+1/2,-z
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z-1/2
+ - -x-1/2,y,z
+ - -y-1/2,-x-1/2,z-1/2
+ - x,-y-1/2,z
+ - y,x,z-1/2
+ universal_h_m: P 42/n m c :2
+- crystal_class: tetragonal
+ hall: " P 4n 2ab -1n"
+ hermann_mauguin: P 42/n c m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - y,x,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x,y,z+1/2
+ - -y+1/2,-x+1/2,z
+ - x,-y,z+1/2
+ - y+1/2,x+1/2,z
+ number: 138
+ schoenflies: D4h^16
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - y,x,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x,y,z+1/2
+ - -y+1/2,-x+1/2,z
+ - x,-y,z+1/2
+ - y+1/2,x+1/2,z
+ universal_h_m: P 42/n c m :1
+- crystal_class: tetragonal
+ hall: -P 4ac 2ac
+ hermann_mauguin: P 42/n c m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - -y,-x,-z
+ - -x,-y,-z
+ - y-1/2,-x,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z-1/2
+ - -x-1/2,y,z-1/2
+ - -y-1/2,-x-1/2,z
+ - x,-y-1/2,z-1/2
+ - y,x,z
+ number: 138
+ schoenflies: D4h^16
+ symops:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - -y,-x,-z
+ - -x,-y,-z
+ - y-1/2,-x,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z-1/2
+ - -x-1/2,y,z-1/2
+ - -y-1/2,-x-1/2,z
+ - x,-y-1/2,z-1/2
+ - y,x,z
+ universal_h_m: P 42/n c m :2
+- crystal_class: tetragonal
+ hall: -I 4 2
+ hermann_mauguin: I 4/m m m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ number: 139
+ schoenflies: D4h^17
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: I 4/m m m
+- crystal_class: tetragonal
+ hall: -I 4 2c
+ hermann_mauguin: I 4/m c m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y,-z+1/2
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z-1/2
+ - -y,-x,z-1/2
+ - x,-y,z-1/2
+ - y,x,z-1/2
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y,-z+1/2
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z-1/2
+ - -y,-x,z-1/2
+ - x,-y,z-1/2
+ - y,x,z-1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1
+ - y+1/2,x+1/2,-z+1
+ - -x+1/2,y+1/2,-z+1
+ - -y+1/2,-x+1/2,-z+1
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ universal_h_m: I 4/m c m
+- crystal_class: tetragonal
+ hall: " I 4bw 2bw -1bw"
+ hermann_mauguin: I 41/a m d
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - x,-y+1/2,-z+1/4
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y,-z+3/4
+ - -y,-x,-z
+ - -x,-y+1/2,-z+1/4
+ - y,-x,-z
+ - x-1/2,y,-z-1/4
+ - -y-1/2,x+1/2,-z-1/2
+ - -x,y,z
+ - -y-1/2,-x,z-1/4
+ - x-1/2,-y+1/2,z-1/2
+ - y,x+1/2,z+1/4
+ number: 141
+ schoenflies: D4h^19
+ symops:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - x,-y+1/2,-z+1/4
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y,-z+3/4
+ - -y,-x,-z
+ - -x,-y+1/2,-z+1/4
+ - y,-x,-z
+ - x-1/2,y,-z-1/4
+ - -y-1/2,x+1/2,-z-1/2
+ - -x,y,z
+ - -y-1/2,-x,z-1/4
+ - x-1/2,-y+1/2,z-1/2
+ - y,x+1/2,z+1/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1,z+3/4
+ - -x+1,-y+1,z+1
+ - y+1,-x+1/2,z+5/4
+ - x+1/2,-y+1,-z+3/4
+ - y+1,x+1,-z+1
+ - -x+1,y+1/2,-z+5/4
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1,-z+3/4
+ - y+1/2,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/4
+ - -y,x+1,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x+1/2,z+1/4
+ - x,-y+1,z
+ - y+1/2,x+1,z+3/4
+ universal_h_m: I 41/a m d :1
+- crystal_class: tetragonal
+ hall: -I 4bd 2
+ hermann_mauguin: I 41/a m d
+ ncsym:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x,-y,-z
+ - y+1/4,x+3/4,-z+1/4
+ - -x+1/2,y,-z+1/2
+ - -y+1/4,-x+1/4,-z+3/4
+ - -x,-y,-z
+ - y-1/4,-x-3/4,-z-1/4
+ - x-1/2,y,-z-1/2
+ - -y-1/4,x-1/4,-z-3/4
+ - -x,y,z
+ - -y-1/4,-x-3/4,z-1/4
+ - x-1/2,-y,z-1/2
+ - y-1/4,x-1/4,z-3/4
+ number: 141
+ schoenflies: D4h^19
+ symops:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x,-y,-z
+ - y+1/4,x+3/4,-z+1/4
+ - -x+1/2,y,-z+1/2
+ - -y+1/4,-x+1/4,-z+3/4
+ - -x,-y,-z
+ - y-1/4,-x-3/4,-z-1/4
+ - x-1/2,y,-z-1/2
+ - -y-1/4,x-1/4,-z-3/4
+ - -x,y,z
+ - -y-1/4,-x-3/4,z-1/4
+ - x-1/2,-y,z-1/2
+ - y-1/4,x-1/4,z-3/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+3/4,x+5/4,z+3/4
+ - -x+1,-y+1/2,z+1
+ - y+3/4,-x+3/4,z+5/4
+ - x+1/2,-y+1/2,-z+1/2
+ - y+3/4,x+5/4,-z+3/4
+ - -x+1,y+1/2,-z+1
+ - -y+3/4,-x+3/4,-z+5/4
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/4,-x-1/4,-z+1/4
+ - x,y+1/2,-z
+ - -y+1/4,x+1/4,-z-1/4
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/4,-x-1/4,z+1/4
+ - x,-y+1/2,z
+ - y+1/4,x+1/4,z-1/4
+ universal_h_m: I 41/a m d :2
+- crystal_class: tetragonal
+ hall: " I 4bw 2aw -1bw"
+ hermann_mauguin: I 41/a c d
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - x+1/2,-y,-z+1/4
+ - y,x,-z+1/2
+ - -x,y+1/2,-z+3/4
+ - -y+1/2,-x+1/2,-z
+ - -x,-y+1/2,-z+1/4
+ - y,-x,-z
+ - x-1/2,y,-z-1/4
+ - -y-1/2,x+1/2,-z-1/2
+ - -x-1/2,y+1/2,z
+ - -y,-x+1/2,z-1/4
+ - x,-y,z-1/2
+ - y-1/2,x,z+1/4
+ number: 142
+ schoenflies: D4h^20
+ symops:
+ - x,y,z
+ - -y,x+1/2,z+1/4
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x,z+3/4
+ - x+1/2,-y,-z+1/4
+ - y,x,-z+1/2
+ - -x,y+1/2,-z+3/4
+ - -y+1/2,-x+1/2,-z
+ - -x,-y+1/2,-z+1/4
+ - y,-x,-z
+ - x-1/2,y,-z-1/4
+ - -y-1/2,x+1/2,-z-1/2
+ - -x-1/2,y+1/2,z
+ - -y,-x+1/2,z-1/4
+ - x,-y,z-1/2
+ - y-1/2,x,z+1/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1,z+3/4
+ - -x+1,-y+1,z+1
+ - y+1,-x+1/2,z+5/4
+ - x+1,-y+1/2,-z+3/4
+ - y+1/2,x+1/2,-z+1
+ - -x+1/2,y+1,-z+5/4
+ - -y+1,-x+1,-z+1/2
+ - -x+1/2,-y+1,-z+3/4
+ - y+1/2,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/4
+ - -y,x+1,-z
+ - -x,y+1,z+1/2
+ - -y+1/2,-x+1,z+1/4
+ - x+1/2,-y+1/2,z
+ - y,x+1/2,z+3/4
+ universal_h_m: I 41/a c d :1
+- crystal_class: tetragonal
+ hall: -I 4bd 2c
+ hermann_mauguin: I 41/a c d
+ ncsym:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x,-y,-z+1/2
+ - y+1/4,x+3/4,-z+3/4
+ - -x+1/2,y,-z
+ - -y+1/4,-x+1/4,-z+1/4
+ - -x,-y,-z
+ - y-1/4,-x-3/4,-z-1/4
+ - x-1/2,y,-z-1/2
+ - -y-1/4,x-1/4,-z-3/4
+ - -x,y,z-1/2
+ - -y-1/4,-x-3/4,z-3/4
+ - x-1/2,-y,z
+ - y-1/4,x-1/4,z-1/4
+ number: 142
+ schoenflies: D4h^20
+ symops:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x,-y,-z+1/2
+ - y+1/4,x+3/4,-z+3/4
+ - -x+1/2,y,-z
+ - -y+1/4,-x+1/4,-z+1/4
+ - -x,-y,-z
+ - y-1/4,-x-3/4,-z-1/4
+ - x-1/2,y,-z-1/2
+ - -y-1/4,x-1/4,-z-3/4
+ - -x,y,z-1/2
+ - -y-1/4,-x-3/4,z-3/4
+ - x-1/2,-y,z
+ - y-1/4,x-1/4,z-1/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+3/4,x+5/4,z+3/4
+ - -x+1,-y+1/2,z+1
+ - y+3/4,-x+3/4,z+5/4
+ - x+1/2,-y+1/2,-z+1
+ - y+3/4,x+5/4,-z+5/4
+ - -x+1,y+1/2,-z+1/2
+ - -y+3/4,-x+3/4,-z+3/4
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/4,-x-1/4,-z+1/4
+ - x,y+1/2,-z
+ - -y+1/4,x+1/4,-z-1/4
+ - -x+1/2,y+1/2,z
+ - -y+1/4,-x-1/4,z-1/4
+ - x,-y+1/2,z+1/2
+ - y+1/4,x+1/4,z+1/4
+ universal_h_m: I 41/a c d :2
+- crystal_class: trigonal
+ hall: " P 3"
+ hermann_mauguin: P 3
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ number: 143
+ schoenflies: C3^1
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ universal_h_m: P 3
+- crystal_class: trigonal
+ hall: " P 31"
+ hermann_mauguin: P 31
+ ncsym:
+ - x,y,z
+ - -y,x-y,z+1/3
+ - -x+y,-x,z+2/3
+ number: 144
+ schoenflies: C3^2
+ symops:
+ - x,y,z
+ - -y,x-y,z+1/3
+ - -x+y,-x,z+2/3
+ universal_h_m: P 31
+- crystal_class: trigonal
+ hall: " P 32"
+ hermann_mauguin: P 32
+ ncsym:
+ - x,y,z
+ - -y,x-y,z+2/3
+ - -x+y,-x,z+1/3
+ number: 145
+ schoenflies: C3^3
+ symops:
+ - x,y,z
+ - -y,x-y,z+2/3
+ - -x+y,-x,z+1/3
+ universal_h_m: P 32
+- crystal_class: rhombohedral
+ hall: " R 3"
+ hermann_mauguin: R 3
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ number: 146
+ schoenflies: C3^4
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - x+2/3,y+1/3,z+1/3
+ - -y+2/3,x-y+1/3,z+1/3
+ - -x+y+2/3,-x+1/3,z+1/3
+ - x+1/3,y+2/3,z+2/3
+ - -y+1/3,x-y+2/3,z+2/3
+ - -x+y+1/3,-x+2/3,z+2/3
+ universal_h_m: R 3 :H
+- crystal_class: rhombohedral
+ hall: " P 3*"
+ hermann_mauguin: R 3
+ ncsym:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ number: 146
+ schoenflies: C3^4
+ symops:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ universal_h_m: R 3 :R
+- crystal_class: trigonal
+ hall: -P 3
+ hermann_mauguin: P -3
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ number: 147
+ schoenflies: C3i^1
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ universal_h_m: P -3
+- crystal_class: rhombohedral
+ hall: -R 3
+ hermann_mauguin: R -3
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ number: 148
+ schoenflies: C3i^2
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - x+2/3,y+1/3,z+1/3
+ - -y+2/3,x-y+1/3,z+1/3
+ - -x+y+2/3,-x+1/3,z+1/3
+ - -x+2/3,-y+1/3,-z+1/3
+ - y+2/3,-x+y+1/3,-z+1/3
+ - x-y+2/3,x+1/3,-z+1/3
+ - x+1/3,y+2/3,z+2/3
+ - -y+1/3,x-y+2/3,z+2/3
+ - -x+y+1/3,-x+2/3,z+2/3
+ - -x+1/3,-y+2/3,-z+2/3
+ - y+1/3,-x+y+2/3,-z+2/3
+ - x-y+1/3,x+2/3,-z+2/3
+ universal_h_m: R -3 :H
+- crystal_class: rhombohedral
+ hall: -P 3*
+ hermann_mauguin: R -3
+ ncsym:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - -x,-y,-z
+ - -z,-x,-y
+ - -y,-z,-x
+ number: 148
+ schoenflies: C3i^2
+ symops:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - -x,-y,-z
+ - -z,-x,-y
+ - -y,-z,-x
+ universal_h_m: R -3 :R
+- crystal_class: trigonal
+ hall: " P 3 2"
+ hermann_mauguin: P 3 1 2
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,-z
+ - x,x-y,-z
+ - -x+y,y,-z
+ number: 149
+ schoenflies: D3^1
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,-z
+ - x,x-y,-z
+ - -x+y,y,-z
+ universal_h_m: P 3 1 2
+- crystal_class: trigonal
+ hall: ' P 3 2"'
+ hermann_mauguin: P 3 2 1
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z
+ - -x,-x+y,-z
+ - x-y,-y,-z
+ number: 150
+ schoenflies: D3^2
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z
+ - -x,-x+y,-z
+ - x-y,-y,-z
+ universal_h_m: P 3 2 1
+- crystal_class: trigonal
+ hall: " P 31 2 (0 0 4)"
+ hermann_mauguin: P 31 1 2
+ ncsym:
+ - x,y,z
+ - -y,x-y,z+1/3
+ - -x+y,-x,z+2/3
+ - -y,-x,-z+2/3
+ - x,x-y,-z
+ - -x+y,y,-z+1/3
+ number: 151
+ schoenflies: D3^3
+ symops:
+ - x,y,z
+ - -y,x-y,z+1/3
+ - -x+y,-x,z+2/3
+ - -y,-x,-z+2/3
+ - x,x-y,-z
+ - -x+y,y,-z+1/3
+ universal_h_m: P 31 1 2
+- crystal_class: trigonal
+ hall: ' P 31 2"'
+ hermann_mauguin: P 31 2 1
+ ncsym:
+ - x,y,z
+ - -y,x-y,z+1/3
+ - -x+y,-x,z+2/3
+ - y,x,-z
+ - -x,-x+y,-z+1/3
+ - x-y,-y,-z+2/3
+ number: 152
+ schoenflies: D3^4
+ symops:
+ - x,y,z
+ - -y,x-y,z+1/3
+ - -x+y,-x,z+2/3
+ - y,x,-z
+ - -x,-x+y,-z+1/3
+ - x-y,-y,-z+2/3
+ universal_h_m: P 31 2 1
+- crystal_class: trigonal
+ hall: " P 32 2 (0 0 2)"
+ hermann_mauguin: P 32 1 2
+ ncsym:
+ - x,y,z
+ - -y,x-y,z+2/3
+ - -x+y,-x,z+1/3
+ - -y,-x,-z+1/3
+ - x,x-y,-z
+ - -x+y,y,-z+2/3
+ number: 153
+ schoenflies: D3^5
+ symops:
+ - x,y,z
+ - -y,x-y,z+2/3
+ - -x+y,-x,z+1/3
+ - -y,-x,-z+1/3
+ - x,x-y,-z
+ - -x+y,y,-z+2/3
+ universal_h_m: P 32 1 2
+- crystal_class: trigonal
+ hall: ' P 32 2"'
+ hermann_mauguin: P 32 2 1
+ ncsym:
+ - x,y,z
+ - -y,x-y,z+2/3
+ - -x+y,-x,z+1/3
+ - y,x,-z
+ - -x,-x+y,-z+2/3
+ - x-y,-y,-z+1/3
+ number: 154
+ schoenflies: D3^6
+ symops:
+ - x,y,z
+ - -y,x-y,z+2/3
+ - -x+y,-x,z+1/3
+ - y,x,-z
+ - -x,-x+y,-z+2/3
+ - x-y,-y,-z+1/3
+ universal_h_m: P 32 2 1
+- crystal_class: rhombohedral
+ hall: ' R 3 2"'
+ hermann_mauguin: R 3 2
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z
+ - -x,-x+y,-z
+ - x-y,-y,-z
+ number: 155
+ schoenflies: D3^7
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z
+ - -x,-x+y,-z
+ - x-y,-y,-z
+ - x+2/3,y+1/3,z+1/3
+ - -y+2/3,x-y+1/3,z+1/3
+ - -x+y+2/3,-x+1/3,z+1/3
+ - y+2/3,x+1/3,-z+1/3
+ - -x+2/3,-x+y+1/3,-z+1/3
+ - x-y+2/3,-y+1/3,-z+1/3
+ - x+1/3,y+2/3,z+2/3
+ - -y+1/3,x-y+2/3,z+2/3
+ - -x+y+1/3,-x+2/3,z+2/3
+ - y+1/3,x+2/3,-z+2/3
+ - -x+1/3,-x+y+2/3,-z+2/3
+ - x-y+1/3,-y+2/3,-z+2/3
+ universal_h_m: R 3 2 :H
+- crystal_class: rhombohedral
+ hall: " P 3* 2"
+ hermann_mauguin: R 3 2
+ ncsym:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - -y,-x,-z
+ - -z,-y,-x
+ - -x,-z,-y
+ number: 155
+ schoenflies: D3^7
+ symops:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - -y,-x,-z
+ - -z,-y,-x
+ - -x,-z,-y
+ universal_h_m: R 3 2 :R
+- crystal_class: trigonal
+ hall: ' P 3 -2"'
+ hermann_mauguin: P 3 m 1
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,z
+ - x,x-y,z
+ - -x+y,y,z
+ number: 156
+ schoenflies: C3v^1
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,z
+ - x,x-y,z
+ - -x+y,y,z
+ universal_h_m: P 3 m 1
+- crystal_class: trigonal
+ hall: " P 3 -2"
+ hermann_mauguin: P 3 1 m
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,z
+ - -x,-x+y,z
+ - x-y,-y,z
+ number: 157
+ schoenflies: C3v^2
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,z
+ - -x,-x+y,z
+ - x-y,-y,z
+ universal_h_m: P 3 1 m
+- crystal_class: trigonal
+ hall: ' P 3 -2"c'
+ hermann_mauguin: P 3 c 1
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,z+1/2
+ - x,x-y,z+1/2
+ - -x+y,y,z+1/2
+ number: 158
+ schoenflies: C3v^3
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,z+1/2
+ - x,x-y,z+1/2
+ - -x+y,y,z+1/2
+ universal_h_m: P 3 c 1
+- crystal_class: trigonal
+ hall: " P 3 -2c"
+ hermann_mauguin: P 3 1 c
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,z+1/2
+ - -x,-x+y,z+1/2
+ - x-y,-y,z+1/2
+ number: 159
+ schoenflies: C3v^4
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,z+1/2
+ - -x,-x+y,z+1/2
+ - x-y,-y,z+1/2
+ universal_h_m: P 3 1 c
+- crystal_class: rhombohedral
+ hall: ' R 3 -2"'
+ hermann_mauguin: R 3 m
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,z
+ - x,x-y,z
+ - -x+y,y,z
+ number: 160
+ schoenflies: C3v^5
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,z
+ - x,x-y,z
+ - -x+y,y,z
+ - x+2/3,y+1/3,z+1/3
+ - -y+2/3,x-y+1/3,z+1/3
+ - -x+y+2/3,-x+1/3,z+1/3
+ - -y+2/3,-x+1/3,z+1/3
+ - x+2/3,x-y+1/3,z+1/3
+ - -x+y+2/3,y+1/3,z+1/3
+ - x+1/3,y+2/3,z+2/3
+ - -y+1/3,x-y+2/3,z+2/3
+ - -x+y+1/3,-x+2/3,z+2/3
+ - -y+1/3,-x+2/3,z+2/3
+ - x+1/3,x-y+2/3,z+2/3
+ - -x+y+1/3,y+2/3,z+2/3
+ universal_h_m: R 3 m :H
+- crystal_class: rhombohedral
+ hall: " P 3* -2"
+ hermann_mauguin: R 3 m
+ ncsym:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - y,x,z
+ - z,y,x
+ - x,z,y
+ number: 160
+ schoenflies: C3v^5
+ symops:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - y,x,z
+ - z,y,x
+ - x,z,y
+ universal_h_m: R 3 m :R
+- crystal_class: rhombohedral
+ hall: ' R 3 -2"c'
+ hermann_mauguin: R 3 c
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,z+1/2
+ - x,x-y,z+1/2
+ - -x+y,y,z+1/2
+ number: 161
+ schoenflies: C3v^6
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,z+1/2
+ - x,x-y,z+1/2
+ - -x+y,y,z+1/2
+ - x+2/3,y+1/3,z+1/3
+ - -y+2/3,x-y+1/3,z+1/3
+ - -x+y+2/3,-x+1/3,z+1/3
+ - -y+2/3,-x+1/3,z+5/6
+ - x+2/3,x-y+1/3,z+5/6
+ - -x+y+2/3,y+1/3,z+5/6
+ - x+1/3,y+2/3,z+2/3
+ - -y+1/3,x-y+2/3,z+2/3
+ - -x+y+1/3,-x+2/3,z+2/3
+ - -y+1/3,-x+2/3,z+7/6
+ - x+1/3,x-y+2/3,z+7/6
+ - -x+y+1/3,y+2/3,z+7/6
+ universal_h_m: R 3 c :H
+- crystal_class: rhombohedral
+ hall: " P 3* -2n"
+ hermann_mauguin: R 3 c
+ ncsym:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - y+1/2,x+1/2,z+1/2
+ - z+1/2,y+1/2,x+1/2
+ - x+1/2,z+1/2,y+1/2
+ number: 161
+ schoenflies: C3v^6
+ symops:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - y+1/2,x+1/2,z+1/2
+ - z+1/2,y+1/2,x+1/2
+ - x+1/2,z+1/2,y+1/2
+ universal_h_m: R 3 c :R
+- crystal_class: trigonal
+ hall: -P 3 2
+ hermann_mauguin: P -3 1 m
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,-z
+ - x,x-y,-z
+ - -x+y,y,-z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - y,x,z
+ - -x,-x+y,z
+ - x-y,-y,z
+ number: 162
+ schoenflies: D3d^1
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,-z
+ - x,x-y,-z
+ - -x+y,y,-z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - y,x,z
+ - -x,-x+y,z
+ - x-y,-y,z
+ universal_h_m: P -3 1 m
+- crystal_class: trigonal
+ hall: -P 3 2c
+ hermann_mauguin: P -3 1 c
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,-z+1/2
+ - x,x-y,-z+1/2
+ - -x+y,y,-z+1/2
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - y,x,z-1/2
+ - -x,-x+y,z-1/2
+ - x-y,-y,z-1/2
+ number: 163
+ schoenflies: D3d^2
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - -y,-x,-z+1/2
+ - x,x-y,-z+1/2
+ - -x+y,y,-z+1/2
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - y,x,z-1/2
+ - -x,-x+y,z-1/2
+ - x-y,-y,z-1/2
+ universal_h_m: P -3 1 c
+- crystal_class: trigonal
+ hall: -P 3 2"
+ hermann_mauguin: P -3 m 1
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z
+ - -x,-x+y,-z
+ - x-y,-y,-z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - -y,-x,z
+ - x,x-y,z
+ - -x+y,y,z
+ number: 164
+ schoenflies: D3d^3
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z
+ - -x,-x+y,-z
+ - x-y,-y,-z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - -y,-x,z
+ - x,x-y,z
+ - -x+y,y,z
+ universal_h_m: P -3 m 1
+- crystal_class: trigonal
+ hall: -P 3 2"c
+ hermann_mauguin: P -3 c 1
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z+1/2
+ - -x,-x+y,-z+1/2
+ - x-y,-y,-z+1/2
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - -y,-x,z-1/2
+ - x,x-y,z-1/2
+ - -x+y,y,z-1/2
+ number: 165
+ schoenflies: D3d^4
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z+1/2
+ - -x,-x+y,-z+1/2
+ - x-y,-y,-z+1/2
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - -y,-x,z-1/2
+ - x,x-y,z-1/2
+ - -x+y,y,z-1/2
+ universal_h_m: P -3 c 1
+- crystal_class: rhombohedral
+ hall: -R 3 2"
+ hermann_mauguin: R -3 m
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z
+ - -x,-x+y,-z
+ - x-y,-y,-z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - -y,-x,z
+ - x,x-y,z
+ - -x+y,y,z
+ number: 166
+ schoenflies: D3d^5
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z
+ - -x,-x+y,-z
+ - x-y,-y,-z
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - -y,-x,z
+ - x,x-y,z
+ - -x+y,y,z
+ - x+2/3,y+1/3,z+1/3
+ - -y+2/3,x-y+1/3,z+1/3
+ - -x+y+2/3,-x+1/3,z+1/3
+ - y+2/3,x+1/3,-z+1/3
+ - -x+2/3,-x+y+1/3,-z+1/3
+ - x-y+2/3,-y+1/3,-z+1/3
+ - -x+2/3,-y+1/3,-z+1/3
+ - y+2/3,-x+y+1/3,-z+1/3
+ - x-y+2/3,x+1/3,-z+1/3
+ - -y+2/3,-x+1/3,z+1/3
+ - x+2/3,x-y+1/3,z+1/3
+ - -x+y+2/3,y+1/3,z+1/3
+ - x+1/3,y+2/3,z+2/3
+ - -y+1/3,x-y+2/3,z+2/3
+ - -x+y+1/3,-x+2/3,z+2/3
+ - y+1/3,x+2/3,-z+2/3
+ - -x+1/3,-x+y+2/3,-z+2/3
+ - x-y+1/3,-y+2/3,-z+2/3
+ - -x+1/3,-y+2/3,-z+2/3
+ - y+1/3,-x+y+2/3,-z+2/3
+ - x-y+1/3,x+2/3,-z+2/3
+ - -y+1/3,-x+2/3,z+2/3
+ - x+1/3,x-y+2/3,z+2/3
+ - -x+y+1/3,y+2/3,z+2/3
+ universal_h_m: R -3 m :H
+- crystal_class: rhombohedral
+ hall: -P 3* 2
+ hermann_mauguin: R -3 m
+ ncsym:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - -y,-x,-z
+ - -z,-y,-x
+ - -x,-z,-y
+ - -x,-y,-z
+ - -z,-x,-y
+ - -y,-z,-x
+ - y,x,z
+ - z,y,x
+ - x,z,y
+ number: 166
+ schoenflies: D3d^5
+ symops:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - -y,-x,-z
+ - -z,-y,-x
+ - -x,-z,-y
+ - -x,-y,-z
+ - -z,-x,-y
+ - -y,-z,-x
+ - y,x,z
+ - z,y,x
+ - x,z,y
+ universal_h_m: R -3 m :R
+- crystal_class: rhombohedral
+ hall: -R 3 2"c
+ hermann_mauguin: R -3 c
+ ncsym:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z+1/2
+ - -x,-x+y,-z+1/2
+ - x-y,-y,-z+1/2
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - -y,-x,z-1/2
+ - x,x-y,z-1/2
+ - -x+y,y,z-1/2
+ number: 167
+ schoenflies: D3d^6
+ symops:
+ - x,y,z
+ - -y,x-y,z
+ - -x+y,-x,z
+ - y,x,-z+1/2
+ - -x,-x+y,-z+1/2
+ - x-y,-y,-z+1/2
+ - -x,-y,-z
+ - y,-x+y,-z
+ - x-y,x,-z
+ - -y,-x,z-1/2
+ - x,x-y,z-1/2
+ - -x+y,y,z-1/2
+ - x+2/3,y+1/3,z+1/3
+ - -y+2/3,x-y+1/3,z+1/3
+ - -x+y+2/3,-x+1/3,z+1/3
+ - y+2/3,x+1/3,-z+5/6
+ - -x+2/3,-x+y+1/3,-z+5/6
+ - x-y+2/3,-y+1/3,-z+5/6
+ - -x+2/3,-y+1/3,-z+1/3
+ - y+2/3,-x+y+1/3,-z+1/3
+ - x-y+2/3,x+1/3,-z+1/3
+ - -y+2/3,-x+1/3,z-1/6
+ - x+2/3,x-y+1/3,z-1/6
+ - -x+y+2/3,y+1/3,z-1/6
+ - x+1/3,y+2/3,z+2/3
+ - -y+1/3,x-y+2/3,z+2/3
+ - -x+y+1/3,-x+2/3,z+2/3
+ - y+1/3,x+2/3,-z+7/6
+ - -x+1/3,-x+y+2/3,-z+7/6
+ - x-y+1/3,-y+2/3,-z+7/6
+ - -x+1/3,-y+2/3,-z+2/3
+ - y+1/3,-x+y+2/3,-z+2/3
+ - x-y+1/3,x+2/3,-z+2/3
+ - -y+1/3,-x+2/3,z+1/6
+ - x+1/3,x-y+2/3,z+1/6
+ - -x+y+1/3,y+2/3,z+1/6
+ universal_h_m: R -3 c :H
+- crystal_class: rhombohedral
+ hall: -P 3* 2n
+ hermann_mauguin: R -3 c
+ ncsym:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - -y+1/2,-x+1/2,-z+1/2
+ - -z+1/2,-y+1/2,-x+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - -x,-y,-z
+ - -z,-x,-y
+ - -y,-z,-x
+ - y-1/2,x-1/2,z-1/2
+ - z-1/2,y-1/2,x-1/2
+ - x-1/2,z-1/2,y-1/2
+ number: 167
+ schoenflies: D3d^6
+ symops:
+ - x,y,z
+ - z,x,y
+ - y,z,x
+ - -y+1/2,-x+1/2,-z+1/2
+ - -z+1/2,-y+1/2,-x+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - -x,-y,-z
+ - -z,-x,-y
+ - -y,-z,-x
+ - y-1/2,x-1/2,z-1/2
+ - z-1/2,y-1/2,x-1/2
+ - x-1/2,z-1/2,y-1/2
+ universal_h_m: R -3 c :R
+- crystal_class: hexagonal
+ hall: " P 6"
+ hermann_mauguin: P 6
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ number: 168
+ schoenflies: C6^1
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ universal_h_m: P 6
+- crystal_class: hexagonal
+ hall: " P 61"
+ hermann_mauguin: P 61
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/6
+ - -y,x-y,z+1/3
+ - -x,-y,z+1/2
+ - -x+y,-x,z+2/3
+ - y,-x+y,z+5/6
+ number: 169
+ schoenflies: C6^2
+ symops:
+ - x,y,z
+ - x-y,x,z+1/6
+ - -y,x-y,z+1/3
+ - -x,-y,z+1/2
+ - -x+y,-x,z+2/3
+ - y,-x+y,z+5/6
+ universal_h_m: P 61
+- crystal_class: hexagonal
+ hall: " P 65"
+ hermann_mauguin: P 65
+ ncsym:
+ - x,y,z
+ - x-y,x,z+5/6
+ - -y,x-y,z+2/3
+ - -x,-y,z+1/2
+ - -x+y,-x,z+1/3
+ - y,-x+y,z+1/6
+ number: 170
+ schoenflies: C6^3
+ symops:
+ - x,y,z
+ - x-y,x,z+5/6
+ - -y,x-y,z+2/3
+ - -x,-y,z+1/2
+ - -x+y,-x,z+1/3
+ - y,-x+y,z+1/6
+ universal_h_m: P 65
+- crystal_class: hexagonal
+ hall: " P 62"
+ hermann_mauguin: P 62
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/3
+ - -y,x-y,z+2/3
+ - -x,-y,z
+ - -x+y,-x,z+1/3
+ - y,-x+y,z+2/3
+ number: 171
+ schoenflies: C6^4
+ symops:
+ - x,y,z
+ - x-y,x,z+1/3
+ - -y,x-y,z+2/3
+ - -x,-y,z
+ - -x+y,-x,z+1/3
+ - y,-x+y,z+2/3
+ universal_h_m: P 62
+- crystal_class: hexagonal
+ hall: " P 64"
+ hermann_mauguin: P 64
+ ncsym:
+ - x,y,z
+ - x-y,x,z+2/3
+ - -y,x-y,z+1/3
+ - -x,-y,z
+ - -x+y,-x,z+2/3
+ - y,-x+y,z+1/3
+ number: 172
+ schoenflies: C6^5
+ symops:
+ - x,y,z
+ - x-y,x,z+2/3
+ - -y,x-y,z+1/3
+ - -x,-y,z
+ - -x+y,-x,z+2/3
+ - y,-x+y,z+1/3
+ universal_h_m: P 64
+- crystal_class: hexagonal
+ hall: " P 6c"
+ hermann_mauguin: P 63
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ number: 173
+ schoenflies: C6^6
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ universal_h_m: P 63
+- crystal_class: hexagonal
+ hall: " P -6"
+ hermann_mauguin: P -6
+ ncsym:
+ - x,y,z
+ - -x+y,-x,-z
+ - -y,x-y,z
+ - x,y,-z
+ - -x+y,-x,z
+ - -y,x-y,-z
+ number: 174
+ schoenflies: C3h^1
+ symops:
+ - x,y,z
+ - -x+y,-x,-z
+ - -y,x-y,z
+ - x,y,-z
+ - -x+y,-x,z
+ - -y,x-y,-z
+ universal_h_m: P -6
+- crystal_class: hexagonal
+ hall: -P 6
+ hermann_mauguin: P 6/m
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ number: 175
+ schoenflies: C6h^1
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ universal_h_m: P 6/m
+- crystal_class: hexagonal
+ hall: -P 6c
+ hermann_mauguin: P 63/m
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z-1/2
+ - y,-x+y,-z
+ - x,y,-z-1/2
+ - x-y,x,-z
+ - -y,x-y,-z-1/2
+ number: 176
+ schoenflies: C6h^2
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z-1/2
+ - y,-x+y,-z
+ - x,y,-z-1/2
+ - x-y,x,-z
+ - -y,x-y,-z-1/2
+ universal_h_m: P 63/m
+- crystal_class: hexagonal
+ hall: " P 6 2"
+ hermann_mauguin: P 6 2 2
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z
+ - x-y,-y,-z
+ - x,x-y,-z
+ - y,x,-z
+ - -x+y,y,-z
+ - -x,-x+y,-z
+ number: 177
+ schoenflies: D6^1
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z
+ - x-y,-y,-z
+ - x,x-y,-z
+ - y,x,-z
+ - -x+y,y,-z
+ - -x,-x+y,-z
+ universal_h_m: P 6 2 2
+- crystal_class: hexagonal
+ hall: " P 61 2 (0 0 5)"
+ hermann_mauguin: P 61 2 2
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/6
+ - -y,x-y,z+1/3
+ - -x,-y,z+1/2
+ - -x+y,-x,z+2/3
+ - y,-x+y,z+5/6
+ - -y,-x,-z+5/6
+ - x-y,-y,-z
+ - x,x-y,-z+1/6
+ - y,x,-z+1/3
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z+2/3
+ number: 178
+ schoenflies: D6^2
+ symops:
+ - x,y,z
+ - x-y,x,z+1/6
+ - -y,x-y,z+1/3
+ - -x,-y,z+1/2
+ - -x+y,-x,z+2/3
+ - y,-x+y,z+5/6
+ - -y,-x,-z+5/6
+ - x-y,-y,-z
+ - x,x-y,-z+1/6
+ - y,x,-z+1/3
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z+2/3
+ universal_h_m: P 61 2 2
+- crystal_class: hexagonal
+ hall: " P 65 2 (0 0 1)"
+ hermann_mauguin: P 65 2 2
+ ncsym:
+ - x,y,z
+ - x-y,x,z+5/6
+ - -y,x-y,z+2/3
+ - -x,-y,z+1/2
+ - -x+y,-x,z+1/3
+ - y,-x+y,z+1/6
+ - -y,-x,-z+1/6
+ - x-y,-y,-z
+ - x,x-y,-z+5/6
+ - y,x,-z+2/3
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z+1/3
+ number: 179
+ schoenflies: D6^3
+ symops:
+ - x,y,z
+ - x-y,x,z+5/6
+ - -y,x-y,z+2/3
+ - -x,-y,z+1/2
+ - -x+y,-x,z+1/3
+ - y,-x+y,z+1/6
+ - -y,-x,-z+1/6
+ - x-y,-y,-z
+ - x,x-y,-z+5/6
+ - y,x,-z+2/3
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z+1/3
+ universal_h_m: P 65 2 2
+- crystal_class: hexagonal
+ hall: " P 62 2 (0 0 4)"
+ hermann_mauguin: P 62 2 2
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/3
+ - -y,x-y,z+2/3
+ - -x,-y,z
+ - -x+y,-x,z+1/3
+ - y,-x+y,z+2/3
+ - -y,-x,-z+2/3
+ - x-y,-y,-z
+ - x,x-y,-z+1/3
+ - y,x,-z+2/3
+ - -x+y,y,-z
+ - -x,-x+y,-z+1/3
+ number: 180
+ schoenflies: D6^4
+ symops:
+ - x,y,z
+ - x-y,x,z+1/3
+ - -y,x-y,z+2/3
+ - -x,-y,z
+ - -x+y,-x,z+1/3
+ - y,-x+y,z+2/3
+ - -y,-x,-z+2/3
+ - x-y,-y,-z
+ - x,x-y,-z+1/3
+ - y,x,-z+2/3
+ - -x+y,y,-z
+ - -x,-x+y,-z+1/3
+ universal_h_m: P 62 2 2
+- crystal_class: hexagonal
+ hall: " P 64 2 (0 0 2)"
+ hermann_mauguin: P 64 2 2
+ ncsym:
+ - x,y,z
+ - x-y,x,z+2/3
+ - -y,x-y,z+1/3
+ - -x,-y,z
+ - -x+y,-x,z+2/3
+ - y,-x+y,z+1/3
+ - -y,-x,-z+1/3
+ - x-y,-y,-z
+ - x,x-y,-z+2/3
+ - y,x,-z+1/3
+ - -x+y,y,-z
+ - -x,-x+y,-z+2/3
+ number: 181
+ schoenflies: D6^5
+ symops:
+ - x,y,z
+ - x-y,x,z+2/3
+ - -y,x-y,z+1/3
+ - -x,-y,z
+ - -x+y,-x,z+2/3
+ - y,-x+y,z+1/3
+ - -y,-x,-z+1/3
+ - x-y,-y,-z
+ - x,x-y,-z+2/3
+ - y,x,-z+1/3
+ - -x+y,y,-z
+ - -x,-x+y,-z+2/3
+ universal_h_m: P 64 2 2
+- crystal_class: hexagonal
+ hall: " P 6c 2c"
+ hermann_mauguin: P 63 2 2
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z+1/2
+ - x-y,-y,-z
+ - x,x-y,-z+1/2
+ - y,x,-z
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z
+ number: 182
+ schoenflies: D6^6
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z+1/2
+ - x-y,-y,-z
+ - x,x-y,-z+1/2
+ - y,x,-z
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z
+ universal_h_m: P 63 2 2
+- crystal_class: hexagonal
+ hall: " P 6 -2"
+ hermann_mauguin: P 6 m m
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - y,x,z
+ - -x+y,y,z
+ - -x,-x+y,z
+ - -y,-x,z
+ - x-y,-y,z
+ - x,x-y,z
+ number: 183
+ schoenflies: C6v^1
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - y,x,z
+ - -x+y,y,z
+ - -x,-x+y,z
+ - -y,-x,z
+ - x-y,-y,z
+ - x,x-y,z
+ universal_h_m: P 6 m m
+- crystal_class: hexagonal
+ hall: " P 6 -2c"
+ hermann_mauguin: P 6 c c
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - y,x,z+1/2
+ - -x+y,y,z+1/2
+ - -x,-x+y,z+1/2
+ - -y,-x,z+1/2
+ - x-y,-y,z+1/2
+ - x,x-y,z+1/2
+ number: 184
+ schoenflies: C6v^2
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - y,x,z+1/2
+ - -x+y,y,z+1/2
+ - -x,-x+y,z+1/2
+ - -y,-x,z+1/2
+ - x-y,-y,z+1/2
+ - x,x-y,z+1/2
+ universal_h_m: P 6 c c
+- crystal_class: hexagonal
+ hall: " P 6c -2"
+ hermann_mauguin: P 63 c m
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - y,x,z
+ - -x+y,y,z+1/2
+ - -x,-x+y,z
+ - -y,-x,z+1/2
+ - x-y,-y,z
+ - x,x-y,z+1/2
+ number: 185
+ schoenflies: C6v^3
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - y,x,z
+ - -x+y,y,z+1/2
+ - -x,-x+y,z
+ - -y,-x,z+1/2
+ - x-y,-y,z
+ - x,x-y,z+1/2
+ universal_h_m: P 63 c m
+- crystal_class: hexagonal
+ hall: " P 6c -2c"
+ hermann_mauguin: P 63 m c
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - y,x,z+1/2
+ - -x+y,y,z
+ - -x,-x+y,z+1/2
+ - -y,-x,z
+ - x-y,-y,z+1/2
+ - x,x-y,z
+ number: 186
+ schoenflies: C6v^4
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - y,x,z+1/2
+ - -x+y,y,z
+ - -x,-x+y,z+1/2
+ - -y,-x,z
+ - x-y,-y,z+1/2
+ - x,x-y,z
+ universal_h_m: P 63 m c
+- crystal_class: hexagonal
+ hall: " P -6 2"
+ hermann_mauguin: P -6 m 2
+ ncsym:
+ - x,y,z
+ - -x+y,-x,-z
+ - -y,x-y,z
+ - x,y,-z
+ - -x+y,-x,z
+ - -y,x-y,-z
+ - -y,-x,-z
+ - -x+y,y,z
+ - x,x-y,-z
+ - -y,-x,z
+ - -x+y,y,-z
+ - x,x-y,z
+ number: 187
+ schoenflies: D3h^1
+ symops:
+ - x,y,z
+ - -x+y,-x,-z
+ - -y,x-y,z
+ - x,y,-z
+ - -x+y,-x,z
+ - -y,x-y,-z
+ - -y,-x,-z
+ - -x+y,y,z
+ - x,x-y,-z
+ - -y,-x,z
+ - -x+y,y,-z
+ - x,x-y,z
+ universal_h_m: P -6 m 2
+- crystal_class: hexagonal
+ hall: " P -6c 2"
+ hermann_mauguin: P -6 c 2
+ ncsym:
+ - x,y,z
+ - -x+y,-x,-z+1/2
+ - -y,x-y,z
+ - x,y,-z+1/2
+ - -x+y,-x,z
+ - -y,x-y,-z+1/2
+ - -y,-x,-z
+ - -x+y,y,z+1/2
+ - x,x-y,-z
+ - -y,-x,z+1/2
+ - -x+y,y,-z
+ - x,x-y,z+1/2
+ number: 188
+ schoenflies: D3h^2
+ symops:
+ - x,y,z
+ - -x+y,-x,-z+1/2
+ - -y,x-y,z
+ - x,y,-z+1/2
+ - -x+y,-x,z
+ - -y,x-y,-z+1/2
+ - -y,-x,-z
+ - -x+y,y,z+1/2
+ - x,x-y,-z
+ - -y,-x,z+1/2
+ - -x+y,y,-z
+ - x,x-y,z+1/2
+ universal_h_m: P -6 c 2
+- crystal_class: hexagonal
+ hall: " P -6 -2"
+ hermann_mauguin: P -6 2 m
+ ncsym:
+ - x,y,z
+ - -x+y,-x,-z
+ - -y,x-y,z
+ - x,y,-z
+ - -x+y,-x,z
+ - -y,x-y,-z
+ - y,x,z
+ - x-y,-y,-z
+ - -x,-x+y,z
+ - y,x,-z
+ - x-y,-y,z
+ - -x,-x+y,-z
+ number: 189
+ schoenflies: D3h^3
+ symops:
+ - x,y,z
+ - -x+y,-x,-z
+ - -y,x-y,z
+ - x,y,-z
+ - -x+y,-x,z
+ - -y,x-y,-z
+ - y,x,z
+ - x-y,-y,-z
+ - -x,-x+y,z
+ - y,x,-z
+ - x-y,-y,z
+ - -x,-x+y,-z
+ universal_h_m: P -6 2 m
+- crystal_class: hexagonal
+ hall: " P -6c -2c"
+ hermann_mauguin: P -6 2 c
+ ncsym:
+ - x,y,z
+ - -x+y,-x,-z+1/2
+ - -y,x-y,z
+ - x,y,-z+1/2
+ - -x+y,-x,z
+ - -y,x-y,-z+1/2
+ - y,x,z+1/2
+ - x-y,-y,-z
+ - -x,-x+y,z+1/2
+ - y,x,-z
+ - x-y,-y,z+1/2
+ - -x,-x+y,-z
+ number: 190
+ schoenflies: D3h^4
+ symops:
+ - x,y,z
+ - -x+y,-x,-z+1/2
+ - -y,x-y,z
+ - x,y,-z+1/2
+ - -x+y,-x,z
+ - -y,x-y,-z+1/2
+ - y,x,z+1/2
+ - x-y,-y,-z
+ - -x,-x+y,z+1/2
+ - y,x,-z
+ - x-y,-y,z+1/2
+ - -x,-x+y,-z
+ universal_h_m: P -6 2 c
+- crystal_class: hexagonal
+ hall: -P 6 2
+ hermann_mauguin: P 6/m m m
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z
+ - x-y,-y,-z
+ - x,x-y,-z
+ - y,x,-z
+ - -x+y,y,-z
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z
+ - -x+y,y,z
+ - -x,-x+y,z
+ - -y,-x,z
+ - x-y,-y,z
+ - x,x-y,z
+ number: 191
+ schoenflies: D6h^1
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z
+ - x-y,-y,-z
+ - x,x-y,-z
+ - y,x,-z
+ - -x+y,y,-z
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z
+ - -x+y,y,z
+ - -x,-x+y,z
+ - -y,-x,z
+ - x-y,-y,z
+ - x,x-y,z
+ universal_h_m: P 6/m m m
+- crystal_class: hexagonal
+ hall: -P 6 2c
+ hermann_mauguin: P 6/m c c
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z+1/2
+ - x-y,-y,-z+1/2
+ - x,x-y,-z+1/2
+ - y,x,-z+1/2
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z-1/2
+ - -x+y,y,z-1/2
+ - -x,-x+y,z-1/2
+ - -y,-x,z-1/2
+ - x-y,-y,z-1/2
+ - x,x-y,z-1/2
+ number: 192
+ schoenflies: D6h^2
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z+1/2
+ - x-y,-y,-z+1/2
+ - x,x-y,-z+1/2
+ - y,x,-z+1/2
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z-1/2
+ - -x+y,y,z-1/2
+ - -x,-x+y,z-1/2
+ - -y,-x,z-1/2
+ - x-y,-y,z-1/2
+ - x,x-y,z-1/2
+ universal_h_m: P 6/m c c
+- crystal_class: hexagonal
+ hall: -P 6c 2
+ hermann_mauguin: P 63/m c m
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z
+ - x-y,-y,-z+1/2
+ - x,x-y,-z
+ - y,x,-z+1/2
+ - -x+y,y,-z
+ - -x,-x+y,-z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z-1/2
+ - y,-x+y,-z
+ - x,y,-z-1/2
+ - x-y,x,-z
+ - -y,x-y,-z-1/2
+ - y,x,z
+ - -x+y,y,z-1/2
+ - -x,-x+y,z
+ - -y,-x,z-1/2
+ - x-y,-y,z
+ - x,x-y,z-1/2
+ number: 193
+ schoenflies: D6h^3
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z
+ - x-y,-y,-z+1/2
+ - x,x-y,-z
+ - y,x,-z+1/2
+ - -x+y,y,-z
+ - -x,-x+y,-z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z-1/2
+ - y,-x+y,-z
+ - x,y,-z-1/2
+ - x-y,x,-z
+ - -y,x-y,-z-1/2
+ - y,x,z
+ - -x+y,y,z-1/2
+ - -x,-x+y,z
+ - -y,-x,z-1/2
+ - x-y,-y,z
+ - x,x-y,z-1/2
+ universal_h_m: P 63/m c m
+- crystal_class: hexagonal
+ hall: -P 6c 2c
+ hermann_mauguin: P 63/m m c
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z+1/2
+ - x-y,-y,-z
+ - x,x-y,-z+1/2
+ - y,x,-z
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z-1/2
+ - y,-x+y,-z
+ - x,y,-z-1/2
+ - x-y,x,-z
+ - -y,x-y,-z-1/2
+ - y,x,z-1/2
+ - -x+y,y,z
+ - -x,-x+y,z-1/2
+ - -y,-x,z
+ - x-y,-y,z-1/2
+ - x,x-y,z
+ number: 194
+ schoenflies: D6h^4
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z+1/2
+ - x-y,-y,-z
+ - x,x-y,-z+1/2
+ - y,x,-z
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z-1/2
+ - y,-x+y,-z
+ - x,y,-z-1/2
+ - x-y,x,-z
+ - -y,x-y,-z-1/2
+ - y,x,z-1/2
+ - -x+y,y,z
+ - -x,-x+y,z-1/2
+ - -y,-x,z
+ - x-y,-y,z-1/2
+ - x,x-y,z
+ universal_h_m: P 63/m m c
+- crystal_class: cubic
+ hall: " P 2 2 3"
+ hermann_mauguin: P 2 3
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ number: 195
+ schoenflies: T^1
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ universal_h_m: P 2 3
+- crystal_class: cubic
+ hall: " F 2 2 3"
+ hermann_mauguin: F 2 3
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ number: 196
+ schoenflies: T^2
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - z,x+1/2,y+1/2
+ - -z,-x+1/2,y+1/2
+ - z,-x+1/2,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - y,z+1/2,x+1/2
+ - y,-z+1/2,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -y,-z+1/2,x+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - z+1/2,x,y+1/2
+ - -z+1/2,-x,y+1/2
+ - z+1/2,-x,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - y+1/2,z,x+1/2
+ - y+1/2,-z,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - z+1/2,x+1/2,y
+ - -z+1/2,-x+1/2,y
+ - z+1/2,-x+1/2,-y
+ - -z+1/2,x+1/2,-y
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+1/2,-x
+ - -y+1/2,z+1/2,-x
+ - -y+1/2,-z+1/2,x
+ universal_h_m: F 2 3
+- crystal_class: cubic
+ hall: " I 2 2 3"
+ hermann_mauguin: I 2 3
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ number: 197
+ schoenflies: T^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - z+1/2,x+1/2,y+1/2
+ - -z+1/2,-x+1/2,y+1/2
+ - z+1/2,-x+1/2,-y+1/2
+ - -z+1/2,x+1/2,-y+1/2
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x+1/2
+ universal_h_m: I 2 3
+- crystal_class: cubic
+ hall: " P 2ac 2ab 3"
+ hermann_mauguin: P 21 3
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - z,x,y
+ - -z+1/2,-x,y+1/2
+ - z+1/2,-x+1/2,-y
+ - -z,x+1/2,-y+1/2
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - -y,z+1/2,-x+1/2
+ - -y+1/2,-z,x+1/2
+ number: 198
+ schoenflies: T^4
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - z,x,y
+ - -z+1/2,-x,y+1/2
+ - z+1/2,-x+1/2,-y
+ - -z,x+1/2,-y+1/2
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - -y,z+1/2,-x+1/2
+ - -y+1/2,-z,x+1/2
+ universal_h_m: P 21 3
+- crystal_class: cubic
+ hall: " I 2b 2c 3"
+ hermann_mauguin: I 21 3
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - z,x,y
+ - -z,-x+1/2,y
+ - z,-x,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -y+1/2,-z,x+1/2
+ number: 199
+ schoenflies: T^5
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - z,x,y
+ - -z,-x+1/2,y
+ - z,-x,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - x+1/2,-y+1/2,-z+1
+ - -x+1/2,y+1,-z+1
+ - z+1/2,x+1/2,y+1/2
+ - -z+1/2,-x+1,y+1/2
+ - z+1/2,-x+1/2,-y+1
+ - -z+1/2,x+1,-y+1
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1
+ - -y+1/2,z+1,-x+1
+ - -y+1,-z+1/2,x+1
+ universal_h_m: I 21 3
+- crystal_class: cubic
+ hall: -P 2 2 3
+ hermann_mauguin: P m -3
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - -z,-x,-y
+ - z,x,-y
+ - -z,x,y
+ - z,-x,y
+ - -y,-z,-x
+ - -y,z,x
+ - y,-z,x
+ - y,z,-x
+ number: 200
+ schoenflies: Th^1
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - -z,-x,-y
+ - z,x,-y
+ - -z,x,y
+ - z,-x,y
+ - -y,-z,-x
+ - -y,z,x
+ - y,-z,x
+ - y,z,-x
+ universal_h_m: P m -3
+- crystal_class: cubic
+ hall: " P 2 2 3 -1n"
+ hermann_mauguin: P n -3
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -z+1/2,-x+1/2,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -z+1/2,x+1/2,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - y+1/2,z+1/2,-x+1/2
+ number: 201
+ schoenflies: Th^2
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -z+1/2,-x+1/2,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -z+1/2,x+1/2,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - y+1/2,z+1/2,-x+1/2
+ universal_h_m: P n -3 :1
+- crystal_class: cubic
+ hall: -P 2ab 2bc 3
+ hermann_mauguin: P n -3
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - z,x,y
+ - -z+1/2,-x+1/2,y
+ - z,-x+1/2,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y,z-1/2
+ - -z,-x,-y
+ - z-1/2,x-1/2,-y
+ - -z,x-1/2,y-1/2
+ - z-1/2,-x,y-1/2
+ - -y,-z,-x
+ - -y,z-1/2,x-1/2
+ - y-1/2,-z,x-1/2
+ - y-1/2,z-1/2,-x
+ number: 201
+ schoenflies: Th^2
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - z,x,y
+ - -z+1/2,-x+1/2,y
+ - z,-x+1/2,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - -x,-y,-z
+ - x-1/2,y-1/2,-z
+ - -x,y-1/2,z-1/2
+ - x-1/2,-y,z-1/2
+ - -z,-x,-y
+ - z-1/2,x-1/2,-y
+ - -z,x-1/2,y-1/2
+ - z-1/2,-x,y-1/2
+ - -y,-z,-x
+ - -y,z-1/2,x-1/2
+ - y-1/2,-z,x-1/2
+ - y-1/2,z-1/2,-x
+ universal_h_m: P n -3 :2
+- crystal_class: cubic
+ hall: -F 2 2 3
+ hermann_mauguin: F m -3
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - -z,-x,-y
+ - z,x,-y
+ - -z,x,y
+ - z,-x,y
+ - -y,-z,-x
+ - -y,z,x
+ - y,-z,x
+ - y,z,-x
+ number: 202
+ schoenflies: Th^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - -z,-x,-y
+ - z,x,-y
+ - -z,x,y
+ - z,-x,y
+ - -y,-z,-x
+ - -y,z,x
+ - y,-z,x
+ - y,z,-x
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - z,x+1/2,y+1/2
+ - -z,-x+1/2,y+1/2
+ - z,-x+1/2,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - y,z+1/2,x+1/2
+ - y,-z+1/2,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -y,-z+1/2,x+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - -z,-x+1/2,-y+1/2
+ - z,x+1/2,-y+1/2
+ - -z,x+1/2,y+1/2
+ - z,-x+1/2,y+1/2
+ - -y,-z+1/2,-x+1/2
+ - -y,z+1/2,x+1/2
+ - y,-z+1/2,x+1/2
+ - y,z+1/2,-x+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - z+1/2,x,y+1/2
+ - -z+1/2,-x,y+1/2
+ - z+1/2,-x,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - y+1/2,z,x+1/2
+ - y+1/2,-z,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ - -z+1/2,-x,-y+1/2
+ - z+1/2,x,-y+1/2
+ - -z+1/2,x,y+1/2
+ - z+1/2,-x,y+1/2
+ - -y+1/2,-z,-x+1/2
+ - -y+1/2,z,x+1/2
+ - y+1/2,-z,x+1/2
+ - y+1/2,z,-x+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - z+1/2,x+1/2,y
+ - -z+1/2,-x+1/2,y
+ - z+1/2,-x+1/2,-y
+ - -z+1/2,x+1/2,-y
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+1/2,-x
+ - -y+1/2,z+1/2,-x
+ - -y+1/2,-z+1/2,x
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ - -z+1/2,-x+1/2,-y
+ - z+1/2,x+1/2,-y
+ - -z+1/2,x+1/2,y
+ - z+1/2,-x+1/2,y
+ - -y+1/2,-z+1/2,-x
+ - -y+1/2,z+1/2,x
+ - y+1/2,-z+1/2,x
+ - y+1/2,z+1/2,-x
+ universal_h_m: F m -3
+- crystal_class: cubic
+ hall: " F 2 2 3 -1d"
+ hermann_mauguin: F d -3
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x+1/4,-y+1/4,-z+1/4
+ - x+1/4,y+1/4,-z+1/4
+ - -x+1/4,y+1/4,z+1/4
+ - x+1/4,-y+1/4,z+1/4
+ - -z+1/4,-x+1/4,-y+1/4
+ - z+1/4,x+1/4,-y+1/4
+ - -z+1/4,x+1/4,y+1/4
+ - z+1/4,-x+1/4,y+1/4
+ - -y+1/4,-z+1/4,-x+1/4
+ - -y+1/4,z+1/4,x+1/4
+ - y+1/4,-z+1/4,x+1/4
+ - y+1/4,z+1/4,-x+1/4
+ number: 203
+ schoenflies: Th^4
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x+1/4,-y+1/4,-z+1/4
+ - x+1/4,y+1/4,-z+1/4
+ - -x+1/4,y+1/4,z+1/4
+ - x+1/4,-y+1/4,z+1/4
+ - -z+1/4,-x+1/4,-y+1/4
+ - z+1/4,x+1/4,-y+1/4
+ - -z+1/4,x+1/4,y+1/4
+ - z+1/4,-x+1/4,y+1/4
+ - -y+1/4,-z+1/4,-x+1/4
+ - -y+1/4,z+1/4,x+1/4
+ - y+1/4,-z+1/4,x+1/4
+ - y+1/4,z+1/4,-x+1/4
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - z,x+1/2,y+1/2
+ - -z,-x+1/2,y+1/2
+ - z,-x+1/2,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - y,z+1/2,x+1/2
+ - y,-z+1/2,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -y,-z+1/2,x+1/2
+ - -x+1/4,-y+3/4,-z+3/4
+ - x+1/4,y+3/4,-z+3/4
+ - -x+1/4,y+3/4,z+3/4
+ - x+1/4,-y+3/4,z+3/4
+ - -z+1/4,-x+3/4,-y+3/4
+ - z+1/4,x+3/4,-y+3/4
+ - -z+1/4,x+3/4,y+3/4
+ - z+1/4,-x+3/4,y+3/4
+ - -y+1/4,-z+3/4,-x+3/4
+ - -y+1/4,z+3/4,x+3/4
+ - y+1/4,-z+3/4,x+3/4
+ - y+1/4,z+3/4,-x+3/4
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - z+1/2,x,y+1/2
+ - -z+1/2,-x,y+1/2
+ - z+1/2,-x,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - y+1/2,z,x+1/2
+ - y+1/2,-z,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - -x+3/4,-y+1/4,-z+3/4
+ - x+3/4,y+1/4,-z+3/4
+ - -x+3/4,y+1/4,z+3/4
+ - x+3/4,-y+1/4,z+3/4
+ - -z+3/4,-x+1/4,-y+3/4
+ - z+3/4,x+1/4,-y+3/4
+ - -z+3/4,x+1/4,y+3/4
+ - z+3/4,-x+1/4,y+3/4
+ - -y+3/4,-z+1/4,-x+3/4
+ - -y+3/4,z+1/4,x+3/4
+ - y+3/4,-z+1/4,x+3/4
+ - y+3/4,z+1/4,-x+3/4
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - z+1/2,x+1/2,y
+ - -z+1/2,-x+1/2,y
+ - z+1/2,-x+1/2,-y
+ - -z+1/2,x+1/2,-y
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+1/2,-x
+ - -y+1/2,z+1/2,-x
+ - -y+1/2,-z+1/2,x
+ - -x+3/4,-y+3/4,-z+1/4
+ - x+3/4,y+3/4,-z+1/4
+ - -x+3/4,y+3/4,z+1/4
+ - x+3/4,-y+3/4,z+1/4
+ - -z+3/4,-x+3/4,-y+1/4
+ - z+3/4,x+3/4,-y+1/4
+ - -z+3/4,x+3/4,y+1/4
+ - z+3/4,-x+3/4,y+1/4
+ - -y+3/4,-z+3/4,-x+1/4
+ - -y+3/4,z+3/4,x+1/4
+ - y+3/4,-z+3/4,x+1/4
+ - y+3/4,z+3/4,-x+1/4
+ universal_h_m: F d -3 :1
+- crystal_class: cubic
+ hall: -F 2uv 2vw 3
+ hermann_mauguin: F d -3
+ ncsym:
+ - x,y,z
+ - -x+1/4,-y+1/4,z
+ - x,-y+1/4,-z+1/4
+ - -x+1/4,y,-z+1/4
+ - z,x,y
+ - -z+1/4,-x+1/4,y
+ - z,-x+1/4,-y+1/4
+ - -z+1/4,x,-y+1/4
+ - y,z,x
+ - y,-z+1/4,-x+1/4
+ - -y+1/4,z,-x+1/4
+ - -y+1/4,-z+1/4,x
+ - -x,-y,-z
+ - x-1/4,y-1/4,-z
+ - -x,y-1/4,z-1/4
+ - x-1/4,-y,z-1/4
+ - -z,-x,-y
+ - z-1/4,x-1/4,-y
+ - -z,x-1/4,y-1/4
+ - z-1/4,-x,y-1/4
+ - -y,-z,-x
+ - -y,z-1/4,x-1/4
+ - y-1/4,-z,x-1/4
+ - y-1/4,z-1/4,-x
+ number: 203
+ schoenflies: Th^4
+ symops:
+ - x,y,z
+ - -x+1/4,-y+1/4,z
+ - x,-y+1/4,-z+1/4
+ - -x+1/4,y,-z+1/4
+ - z,x,y
+ - -z+1/4,-x+1/4,y
+ - z,-x+1/4,-y+1/4
+ - -z+1/4,x,-y+1/4
+ - y,z,x
+ - y,-z+1/4,-x+1/4
+ - -y+1/4,z,-x+1/4
+ - -y+1/4,-z+1/4,x
+ - -x,-y,-z
+ - x-1/4,y-1/4,-z
+ - -x,y-1/4,z-1/4
+ - x-1/4,-y,z-1/4
+ - -z,-x,-y
+ - z-1/4,x-1/4,-y
+ - -z,x-1/4,y-1/4
+ - z-1/4,-x,y-1/4
+ - -y,-z,-x
+ - -y,z-1/4,x-1/4
+ - y-1/4,-z,x-1/4
+ - y-1/4,z-1/4,-x
+ - x,y+1/2,z+1/2
+ - -x+1/4,-y+3/4,z+1/2
+ - x,-y+3/4,-z+3/4
+ - -x+1/4,y+1/2,-z+3/4
+ - z,x+1/2,y+1/2
+ - -z+1/4,-x+3/4,y+1/2
+ - z,-x+3/4,-y+3/4
+ - -z+1/4,x+1/2,-y+3/4
+ - y,z+1/2,x+1/2
+ - y,-z+3/4,-x+3/4
+ - -y+1/4,z+1/2,-x+3/4
+ - -y+1/4,-z+3/4,x+1/2
+ - -x,-y+1/2,-z+1/2
+ - x-1/4,y+1/4,-z+1/2
+ - -x,y+1/4,z+1/4
+ - x-1/4,-y+1/2,z+1/4
+ - -z,-x+1/2,-y+1/2
+ - z-1/4,x+1/4,-y+1/2
+ - -z,x+1/4,y+1/4
+ - z-1/4,-x+1/2,y+1/4
+ - -y,-z+1/2,-x+1/2
+ - -y,z+1/4,x+1/4
+ - y-1/4,-z+1/2,x+1/4
+ - y-1/4,z+1/4,-x+1/2
+ - x+1/2,y,z+1/2
+ - -x+3/4,-y+1/4,z+1/2
+ - x+1/2,-y+1/4,-z+3/4
+ - -x+3/4,y,-z+3/4
+ - z+1/2,x,y+1/2
+ - -z+3/4,-x+1/4,y+1/2
+ - z+1/2,-x+1/4,-y+3/4
+ - -z+3/4,x,-y+3/4
+ - y+1/2,z,x+1/2
+ - y+1/2,-z+1/4,-x+3/4
+ - -y+3/4,z,-x+3/4
+ - -y+3/4,-z+1/4,x+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/4,y-1/4,-z+1/2
+ - -x+1/2,y-1/4,z+1/4
+ - x+1/4,-y,z+1/4
+ - -z+1/2,-x,-y+1/2
+ - z+1/4,x-1/4,-y+1/2
+ - -z+1/2,x-1/4,y+1/4
+ - z+1/4,-x,y+1/4
+ - -y+1/2,-z,-x+1/2
+ - -y+1/2,z-1/4,x+1/4
+ - y+1/4,-z,x+1/4
+ - y+1/4,z-1/4,-x+1/2
+ - x+1/2,y+1/2,z
+ - -x+3/4,-y+3/4,z
+ - x+1/2,-y+3/4,-z+1/4
+ - -x+3/4,y+1/2,-z+1/4
+ - z+1/2,x+1/2,y
+ - -z+3/4,-x+3/4,y
+ - z+1/2,-x+3/4,-y+1/4
+ - -z+3/4,x+1/2,-y+1/4
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+3/4,-x+1/4
+ - -y+3/4,z+1/2,-x+1/4
+ - -y+3/4,-z+3/4,x
+ - -x+1/2,-y+1/2,-z
+ - x+1/4,y+1/4,-z
+ - -x+1/2,y+1/4,z-1/4
+ - x+1/4,-y+1/2,z-1/4
+ - -z+1/2,-x+1/2,-y
+ - z+1/4,x+1/4,-y
+ - -z+1/2,x+1/4,y-1/4
+ - z+1/4,-x+1/2,y-1/4
+ - -y+1/2,-z+1/2,-x
+ - -y+1/2,z+1/4,x-1/4
+ - y+1/4,-z+1/2,x-1/4
+ - y+1/4,z+1/4,-x
+ universal_h_m: F d -3 :2
+- crystal_class: cubic
+ hall: -I 2 2 3
+ hermann_mauguin: I m -3
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - -z,-x,-y
+ - z,x,-y
+ - -z,x,y
+ - z,-x,y
+ - -y,-z,-x
+ - -y,z,x
+ - y,-z,x
+ - y,z,-x
+ number: 204
+ schoenflies: Th^5
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y,z
+ - -z,-x,-y
+ - z,x,-y
+ - -z,x,y
+ - z,-x,y
+ - -y,-z,-x
+ - -y,z,x
+ - y,-z,x
+ - y,z,-x
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - z+1/2,x+1/2,y+1/2
+ - -z+1/2,-x+1/2,y+1/2
+ - z+1/2,-x+1/2,-y+1/2
+ - -z+1/2,x+1/2,-y+1/2
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -z+1/2,-x+1/2,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -z+1/2,x+1/2,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - y+1/2,z+1/2,-x+1/2
+ universal_h_m: I m -3
+- crystal_class: cubic
+ hall: -P 2ac 2ab 3
+ hermann_mauguin: P a -3
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - z,x,y
+ - -z+1/2,-x,y+1/2
+ - z+1/2,-x+1/2,-y
+ - -z,x+1/2,-y+1/2
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - -y,z+1/2,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x,-y-1/2,z-1/2
+ - -z,-x,-y
+ - z-1/2,x,-y-1/2
+ - -z-1/2,x-1/2,y
+ - z,-x-1/2,y-1/2
+ - -y,-z,-x
+ - -y-1/2,z-1/2,x
+ - y,-z-1/2,x-1/2
+ - y-1/2,z,-x-1/2
+ number: 205
+ schoenflies: Th^6
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - z,x,y
+ - -z+1/2,-x,y+1/2
+ - z+1/2,-x+1/2,-y
+ - -z,x+1/2,-y+1/2
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - -y,z+1/2,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - -x,-y,-z
+ - x-1/2,y,-z-1/2
+ - -x-1/2,y-1/2,z
+ - x,-y-1/2,z-1/2
+ - -z,-x,-y
+ - z-1/2,x,-y-1/2
+ - -z-1/2,x-1/2,y
+ - z,-x-1/2,y-1/2
+ - -y,-z,-x
+ - -y-1/2,z-1/2,x
+ - y,-z-1/2,x-1/2
+ - y-1/2,z,-x-1/2
+ universal_h_m: P a -3
+- crystal_class: cubic
+ hall: -I 2b 2c 3
+ hermann_mauguin: I a -3
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - z,x,y
+ - -z,-x+1/2,y
+ - z,-x,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z-1/2
+ - x,-y-1/2,z-1/2
+ - -z,-x,-y
+ - z,x-1/2,-y
+ - -z,x,y-1/2
+ - z,-x-1/2,y-1/2
+ - -y,-z,-x
+ - -y,z,x-1/2
+ - y,-z-1/2,x-1/2
+ - y-1/2,z,-x-1/2
+ number: 206
+ schoenflies: Th^7
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - z,x,y
+ - -z,-x+1/2,y
+ - z,-x,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - -x,-y,-z
+ - x,y-1/2,-z
+ - -x,y,z-1/2
+ - x,-y-1/2,z-1/2
+ - -z,-x,-y
+ - z,x-1/2,-y
+ - -z,x,y-1/2
+ - z,-x-1/2,y-1/2
+ - -y,-z,-x
+ - -y,z,x-1/2
+ - y,-z-1/2,x-1/2
+ - y-1/2,z,-x-1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - x+1/2,-y+1/2,-z+1
+ - -x+1/2,y+1,-z+1
+ - z+1/2,x+1/2,y+1/2
+ - -z+1/2,-x+1,y+1/2
+ - z+1/2,-x+1/2,-y+1
+ - -z+1/2,x+1,-y+1
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1
+ - -y+1/2,z+1,-x+1
+ - -y+1,-z+1/2,x+1
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y,z
+ - -z+1/2,-x+1/2,-y+1/2
+ - z+1/2,x,-y+1/2
+ - -z+1/2,x+1/2,y
+ - z+1/2,-x,y
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x
+ - y+1/2,-z,x
+ - y,z+1/2,-x
+ universal_h_m: I a -3
+- crystal_class: cubic
+ hall: " P 4 2 3"
+ hermann_mauguin: P 4 3 2
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ number: 207
+ schoenflies: O^1
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ universal_h_m: P 4 3 2
+- crystal_class: cubic
+ hall: " P 4n 2 3"
+ hermann_mauguin: P 42 3 2
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z+1/2,y+1/2
+ - -z,-x,y
+ - x+1/2,-z+1/2,y+1/2
+ - z,-x,-y
+ - x+1/2,z+1/2,-y+1/2
+ - -z,x,-y
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x
+ - z+1/2,y+1/2,-x+1/2
+ - -y,z,-x
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y,-z,x
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ number: 208
+ schoenflies: O^2
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z+1/2,y+1/2
+ - -z,-x,y
+ - x+1/2,-z+1/2,y+1/2
+ - z,-x,-y
+ - x+1/2,z+1/2,-y+1/2
+ - -z,x,-y
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x
+ - z+1/2,y+1/2,-x+1/2
+ - -y,z,-x
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y,-z,x
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ universal_h_m: P 42 3 2
+- crystal_class: cubic
+ hall: " F 4 2 3"
+ hermann_mauguin: F 4 3 2
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ number: 209
+ schoenflies: O^3
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - x,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - y,x+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -y,-x+1/2,-z+1/2
+ - z,x+1/2,y+1/2
+ - -x,z+1/2,y+1/2
+ - -z,-x+1/2,y+1/2
+ - x,-z+1/2,y+1/2
+ - z,-x+1/2,-y+1/2
+ - x,z+1/2,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - -x,-z+1/2,-y+1/2
+ - y,z+1/2,x+1/2
+ - y,-z+1/2,-x+1/2
+ - z,y+1/2,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -z,-y+1/2,-x+1/2
+ - -y,-z+1/2,x+1/2
+ - z,-y+1/2,x+1/2
+ - -z,y+1/2,x+1/2
+ - x+1/2,y,z+1/2
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x,-z+1/2
+ - z+1/2,x,y+1/2
+ - -x+1/2,z,y+1/2
+ - -z+1/2,-x,y+1/2
+ - x+1/2,-z,y+1/2
+ - z+1/2,-x,-y+1/2
+ - x+1/2,z,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - -x+1/2,-z,-y+1/2
+ - y+1/2,z,x+1/2
+ - y+1/2,-z,-x+1/2
+ - z+1/2,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - z+1/2,-y,x+1/2
+ - -z+1/2,y,x+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -y+1/2,-x+1/2,-z
+ - z+1/2,x+1/2,y
+ - -x+1/2,z+1/2,y
+ - -z+1/2,-x+1/2,y
+ - x+1/2,-z+1/2,y
+ - z+1/2,-x+1/2,-y
+ - x+1/2,z+1/2,-y
+ - -z+1/2,x+1/2,-y
+ - -x+1/2,-z+1/2,-y
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+1/2,-x
+ - z+1/2,y+1/2,-x
+ - -y+1/2,z+1/2,-x
+ - -z+1/2,-y+1/2,-x
+ - -y+1/2,-z+1/2,x
+ - z+1/2,-y+1/2,x
+ - -z+1/2,y+1/2,x
+ universal_h_m: F 4 3 2
+- crystal_class: cubic
+ hall: " F 4d 2 3"
+ hermann_mauguin: F 41 3 2
+ ncsym:
+ - x,y,z
+ - -y+1/4,x+1/4,z+1/4
+ - -x,-y+1/2,z+1/2
+ - y+3/4,-x+1/4,z+3/4
+ - x,-y,-z
+ - y+1/4,x+1/4,-z+1/4
+ - -x,y+1/2,-z+1/2
+ - -y+3/4,-x+1/4,-z+3/4
+ - z,x,y
+ - -x+1/4,z+1/4,y+1/4
+ - -z,-x+1/2,y+1/2
+ - x+3/4,-z+1/4,y+3/4
+ - z,-x,-y
+ - x+1/4,z+1/4,-y+1/4
+ - -z,x+1/2,-y+1/2
+ - -x+3/4,-z+1/4,-y+3/4
+ - y,z,x
+ - y+1/2,-z,-x+1/2
+ - z+1/4,y+3/4,-x+3/4
+ - -y+1/2,z+1/2,-x
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y,-z,x
+ - z+1/4,-y+3/4,x+3/4
+ - -z+3/4,y+3/4,x+1/4
+ number: 210
+ schoenflies: O^4
+ symops:
+ - x,y,z
+ - -y+1/4,x+1/4,z+1/4
+ - -x,-y+1/2,z+1/2
+ - y+3/4,-x+1/4,z+3/4
+ - x,-y,-z
+ - y+1/4,x+1/4,-z+1/4
+ - -x,y+1/2,-z+1/2
+ - -y+3/4,-x+1/4,-z+3/4
+ - z,x,y
+ - -x+1/4,z+1/4,y+1/4
+ - -z,-x+1/2,y+1/2
+ - x+3/4,-z+1/4,y+3/4
+ - z,-x,-y
+ - x+1/4,z+1/4,-y+1/4
+ - -z,x+1/2,-y+1/2
+ - -x+3/4,-z+1/4,-y+3/4
+ - y,z,x
+ - y+1/2,-z,-x+1/2
+ - z+1/4,y+3/4,-x+3/4
+ - -y+1/2,z+1/2,-x
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y,-z,x
+ - z+1/4,-y+3/4,x+3/4
+ - -z+3/4,y+3/4,x+1/4
+ - x,y+1/2,z+1/2
+ - -y+1/4,x+3/4,z+3/4
+ - -x,-y+1,z+1
+ - y+3/4,-x+3/4,z+5/4
+ - x,-y+1/2,-z+1/2
+ - y+1/4,x+3/4,-z+3/4
+ - -x,y+1,-z+1
+ - -y+3/4,-x+3/4,-z+5/4
+ - z,x+1/2,y+1/2
+ - -x+1/4,z+3/4,y+3/4
+ - -z,-x+1,y+1
+ - x+3/4,-z+3/4,y+5/4
+ - z,-x+1/2,-y+1/2
+ - x+1/4,z+3/4,-y+3/4
+ - -z,x+1,-y+1
+ - -x+3/4,-z+3/4,-y+5/4
+ - y,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1
+ - z+1/4,y+5/4,-x+5/4
+ - -y+1/2,z+1,-x+1/2
+ - -z+1/4,-y+3/4,-x+3/4
+ - -y,-z+1/2,x+1/2
+ - z+1/4,-y+5/4,x+5/4
+ - -z+3/4,y+5/4,x+3/4
+ - x+1/2,y,z+1/2
+ - -y+3/4,x+1/4,z+3/4
+ - -x+1/2,-y+1/2,z+1
+ - y+5/4,-x+1/4,z+5/4
+ - x+1/2,-y,-z+1/2
+ - y+3/4,x+1/4,-z+3/4
+ - -x+1/2,y+1/2,-z+1
+ - -y+5/4,-x+1/4,-z+5/4
+ - z+1/2,x,y+1/2
+ - -x+3/4,z+1/4,y+3/4
+ - -z+1/2,-x+1/2,y+1
+ - x+5/4,-z+1/4,y+5/4
+ - z+1/2,-x,-y+1/2
+ - x+3/4,z+1/4,-y+3/4
+ - -z+1/2,x+1/2,-y+1
+ - -x+5/4,-z+1/4,-y+5/4
+ - y+1/2,z,x+1/2
+ - y+1,-z,-x+1
+ - z+3/4,y+3/4,-x+5/4
+ - -y+1,z+1/2,-x+1/2
+ - -z+3/4,-y+1/4,-x+3/4
+ - -y+1/2,-z,x+1/2
+ - z+3/4,-y+3/4,x+5/4
+ - -z+5/4,y+3/4,x+3/4
+ - x+1/2,y+1/2,z
+ - -y+3/4,x+3/4,z+1/4
+ - -x+1/2,-y+1,z+1/2
+ - y+5/4,-x+3/4,z+3/4
+ - x+1/2,-y+1/2,-z
+ - y+3/4,x+3/4,-z+1/4
+ - -x+1/2,y+1,-z+1/2
+ - -y+5/4,-x+3/4,-z+3/4
+ - z+1/2,x+1/2,y
+ - -x+3/4,z+3/4,y+1/4
+ - -z+1/2,-x+1,y+1/2
+ - x+5/4,-z+3/4,y+3/4
+ - z+1/2,-x+1/2,-y
+ - x+3/4,z+3/4,-y+1/4
+ - -z+1/2,x+1,-y+1/2
+ - -x+5/4,-z+3/4,-y+3/4
+ - y+1/2,z+1/2,x
+ - y+1,-z+1/2,-x+1/2
+ - z+3/4,y+5/4,-x+3/4
+ - -y+1,z+1,-x
+ - -z+3/4,-y+3/4,-x+1/4
+ - -y+1/2,-z+1/2,x
+ - z+3/4,-y+5/4,x+3/4
+ - -z+5/4,y+5/4,x+1/4
+ universal_h_m: F 41 3 2
+- crystal_class: cubic
+ hall: " I 4 2 3"
+ hermann_mauguin: I 4 3 2
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ number: 211
+ schoenflies: O^5
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - z+1/2,x+1/2,y+1/2
+ - -x+1/2,z+1/2,y+1/2
+ - -z+1/2,-x+1/2,y+1/2
+ - x+1/2,-z+1/2,y+1/2
+ - z+1/2,-x+1/2,-y+1/2
+ - x+1/2,z+1/2,-y+1/2
+ - -z+1/2,x+1/2,-y+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1/2
+ - z+1/2,y+1/2,-x+1/2
+ - -y+1/2,z+1/2,-x+1/2
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x+1/2
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ universal_h_m: I 4 3 2
+- crystal_class: cubic
+ hall: " P 4acd 2ab 3"
+ hermann_mauguin: P 43 3 2
+ ncsym:
+ - x,y,z
+ - -y+3/4,x+1/4,z+3/4
+ - -x+1/2,-y,z+1/2
+ - y+3/4,-x+3/4,z+1/4
+ - x+1/2,-y+1/2,-z
+ - y+1/4,x+3/4,-z+3/4
+ - -x,y+1/2,-z+1/2
+ - -y+1/4,-x+1/4,-z+1/4
+ - z,x,y
+ - -x+3/4,z+1/4,y+3/4
+ - -z+1/2,-x,y+1/2
+ - x+3/4,-z+3/4,y+1/4
+ - z+1/2,-x+1/2,-y
+ - x+1/4,z+3/4,-y+3/4
+ - -z,x+1/2,-y+1/2
+ - -x+1/4,-z+1/4,-y+1/4
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - z+1/4,y+3/4,-x+3/4
+ - -y,z+1/2,-x+1/2
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y+1/2,-z,x+1/2
+ - z+3/4,-y+3/4,x+1/4
+ - -z+3/4,y+1/4,x+3/4
+ number: 212
+ schoenflies: O^6
+ symops:
+ - x,y,z
+ - -y+3/4,x+1/4,z+3/4
+ - -x+1/2,-y,z+1/2
+ - y+3/4,-x+3/4,z+1/4
+ - x+1/2,-y+1/2,-z
+ - y+1/4,x+3/4,-z+3/4
+ - -x,y+1/2,-z+1/2
+ - -y+1/4,-x+1/4,-z+1/4
+ - z,x,y
+ - -x+3/4,z+1/4,y+3/4
+ - -z+1/2,-x,y+1/2
+ - x+3/4,-z+3/4,y+1/4
+ - z+1/2,-x+1/2,-y
+ - x+1/4,z+3/4,-y+3/4
+ - -z,x+1/2,-y+1/2
+ - -x+1/4,-z+1/4,-y+1/4
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - z+1/4,y+3/4,-x+3/4
+ - -y,z+1/2,-x+1/2
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y+1/2,-z,x+1/2
+ - z+3/4,-y+3/4,x+1/4
+ - -z+3/4,y+1/4,x+3/4
+ universal_h_m: P 43 3 2
+- crystal_class: cubic
+ hall: " P 4bd 2ab 3"
+ hermann_mauguin: P 41 3 2
+ ncsym:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x+1/2,-y+1/2,-z
+ - y+3/4,x+1/4,-z+1/4
+ - -x,y+1/2,-z+1/2
+ - -y+3/4,-x+3/4,-z+3/4
+ - z,x,y
+ - -x+1/4,z+3/4,y+1/4
+ - -z+1/2,-x,y+1/2
+ - x+1/4,-z+1/4,y+3/4
+ - z+1/2,-x+1/2,-y
+ - x+3/4,z+1/4,-y+1/4
+ - -z,x+1/2,-y+1/2
+ - -x+3/4,-z+3/4,-y+3/4
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - z+3/4,y+1/4,-x+1/4
+ - -y,z+1/2,-x+1/2
+ - -z+3/4,-y+3/4,-x+3/4
+ - -y+1/2,-z,x+1/2
+ - z+1/4,-y+1/4,x+3/4
+ - -z+1/4,y+3/4,x+1/4
+ number: 213
+ schoenflies: O^7
+ symops:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x+1/2,-y+1/2,-z
+ - y+3/4,x+1/4,-z+1/4
+ - -x,y+1/2,-z+1/2
+ - -y+3/4,-x+3/4,-z+3/4
+ - z,x,y
+ - -x+1/4,z+3/4,y+1/4
+ - -z+1/2,-x,y+1/2
+ - x+1/4,-z+1/4,y+3/4
+ - z+1/2,-x+1/2,-y
+ - x+3/4,z+1/4,-y+1/4
+ - -z,x+1/2,-y+1/2
+ - -x+3/4,-z+3/4,-y+3/4
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - z+3/4,y+1/4,-x+1/4
+ - -y,z+1/2,-x+1/2
+ - -z+3/4,-y+3/4,-x+3/4
+ - -y+1/2,-z,x+1/2
+ - z+1/4,-y+1/4,x+3/4
+ - -z+1/4,y+3/4,x+1/4
+ universal_h_m: P 41 3 2
+- crystal_class: cubic
+ hall: " I 4bd 2c 3"
+ hermann_mauguin: I 41 3 2
+ ncsym:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x,-y,-z+1/2
+ - y+1/4,x+3/4,-z+3/4
+ - -x+1/2,y,-z
+ - -y+1/4,-x+1/4,-z+1/4
+ - z,x,y
+ - -x+1/4,z+3/4,y+1/4
+ - -z+1/2,-x,y+1/2
+ - x+1/4,-z+1/4,y+3/4
+ - z,-x,-y+1/2
+ - x+1/4,z+3/4,-y+3/4
+ - -z+1/2,x,-y
+ - -x+1/4,-z+1/4,-y+1/4
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - z+3/4,y+1/4,-x+1/4
+ - -y,z+1/2,-x+1/2
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y+1/2,-z,x+1/2
+ - z+3/4,-y+3/4,x+1/4
+ - -z+3/4,y+1/4,x+3/4
+ number: 214
+ schoenflies: O^8
+ symops:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x,-y,-z+1/2
+ - y+1/4,x+3/4,-z+3/4
+ - -x+1/2,y,-z
+ - -y+1/4,-x+1/4,-z+1/4
+ - z,x,y
+ - -x+1/4,z+3/4,y+1/4
+ - -z+1/2,-x,y+1/2
+ - x+1/4,-z+1/4,y+3/4
+ - z,-x,-y+1/2
+ - x+1/4,z+3/4,-y+3/4
+ - -z+1/2,x,-y
+ - -x+1/4,-z+1/4,-y+1/4
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - z+3/4,y+1/4,-x+1/4
+ - -y,z+1/2,-x+1/2
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y+1/2,-z,x+1/2
+ - z+3/4,-y+3/4,x+1/4
+ - -z+3/4,y+1/4,x+3/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+3/4,x+5/4,z+3/4
+ - -x+1,-y+1/2,z+1
+ - y+3/4,-x+3/4,z+5/4
+ - x+1/2,-y+1/2,-z+1
+ - y+3/4,x+5/4,-z+5/4
+ - -x+1,y+1/2,-z+1/2
+ - -y+3/4,-x+3/4,-z+3/4
+ - z+1/2,x+1/2,y+1/2
+ - -x+3/4,z+5/4,y+3/4
+ - -z+1,-x+1/2,y+1
+ - x+3/4,-z+3/4,y+5/4
+ - z+1/2,-x+1/2,-y+1
+ - x+3/4,z+5/4,-y+5/4
+ - -z+1,x+1/2,-y+1/2
+ - -x+3/4,-z+3/4,-y+3/4
+ - y+1/2,z+1/2,x+1/2
+ - y+1,-z+1,-x+1/2
+ - z+5/4,y+3/4,-x+3/4
+ - -y+1/2,z+1,-x+1
+ - -z+3/4,-y+3/4,-x+3/4
+ - -y+1,-z+1/2,x+1
+ - z+5/4,-y+5/4,x+3/4
+ - -z+5/4,y+3/4,x+5/4
+ universal_h_m: I 41 3 2
+- crystal_class: cubic
+ hall: " P -4 2 3"
+ hermann_mauguin: P -4 3 m
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ - z,x,y
+ - x,-z,-y
+ - -z,-x,y
+ - -x,z,-y
+ - z,-x,-y
+ - -x,-z,y
+ - -z,x,-y
+ - x,z,y
+ - y,z,x
+ - y,-z,-x
+ - -z,-y,x
+ - -y,z,-x
+ - z,y,x
+ - -y,-z,x
+ - -z,y,-x
+ - z,-y,-x
+ number: 215
+ schoenflies: Td^1
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ - z,x,y
+ - x,-z,-y
+ - -z,-x,y
+ - -x,z,-y
+ - z,-x,-y
+ - -x,-z,y
+ - -z,x,-y
+ - x,z,y
+ - y,z,x
+ - y,-z,-x
+ - -z,-y,x
+ - -y,z,-x
+ - z,y,x
+ - -y,-z,x
+ - -z,y,-x
+ - z,-y,-x
+ universal_h_m: P -4 3 m
+- crystal_class: cubic
+ hall: " F -4 2 3"
+ hermann_mauguin: F -4 3 m
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ - z,x,y
+ - x,-z,-y
+ - -z,-x,y
+ - -x,z,-y
+ - z,-x,-y
+ - -x,-z,y
+ - -z,x,-y
+ - x,z,y
+ - y,z,x
+ - y,-z,-x
+ - -z,-y,x
+ - -y,z,-x
+ - z,y,x
+ - -y,-z,x
+ - -z,y,-x
+ - z,-y,-x
+ number: 216
+ schoenflies: Td^2
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ - z,x,y
+ - x,-z,-y
+ - -z,-x,y
+ - -x,z,-y
+ - z,-x,-y
+ - -x,-z,y
+ - -z,x,-y
+ - x,z,y
+ - y,z,x
+ - y,-z,-x
+ - -z,-y,x
+ - -y,z,-x
+ - z,y,x
+ - -y,-z,x
+ - -z,y,-x
+ - z,-y,-x
+ - x,y+1/2,z+1/2
+ - y,-x+1/2,-z+1/2
+ - -x,-y+1/2,z+1/2
+ - -y,x+1/2,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - -y,-x+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ - y,x+1/2,z+1/2
+ - z,x+1/2,y+1/2
+ - x,-z+1/2,-y+1/2
+ - -z,-x+1/2,y+1/2
+ - -x,z+1/2,-y+1/2
+ - z,-x+1/2,-y+1/2
+ - -x,-z+1/2,y+1/2
+ - -z,x+1/2,-y+1/2
+ - x,z+1/2,y+1/2
+ - y,z+1/2,x+1/2
+ - y,-z+1/2,-x+1/2
+ - -z,-y+1/2,x+1/2
+ - -y,z+1/2,-x+1/2
+ - z,y+1/2,x+1/2
+ - -y,-z+1/2,x+1/2
+ - -z,y+1/2,-x+1/2
+ - z,-y+1/2,-x+1/2
+ - x+1/2,y,z+1/2
+ - y+1/2,-x,-z+1/2
+ - -x+1/2,-y,z+1/2
+ - -y+1/2,x,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - -y+1/2,-x,z+1/2
+ - -x+1/2,y,-z+1/2
+ - y+1/2,x,z+1/2
+ - z+1/2,x,y+1/2
+ - x+1/2,-z,-y+1/2
+ - -z+1/2,-x,y+1/2
+ - -x+1/2,z,-y+1/2
+ - z+1/2,-x,-y+1/2
+ - -x+1/2,-z,y+1/2
+ - -z+1/2,x,-y+1/2
+ - x+1/2,z,y+1/2
+ - y+1/2,z,x+1/2
+ - y+1/2,-z,-x+1/2
+ - -z+1/2,-y,x+1/2
+ - -y+1/2,z,-x+1/2
+ - z+1/2,y,x+1/2
+ - -y+1/2,-z,x+1/2
+ - -z+1/2,y,-x+1/2
+ - z+1/2,-y,-x+1/2
+ - x+1/2,y+1/2,z
+ - y+1/2,-x+1/2,-z
+ - -x+1/2,-y+1/2,z
+ - -y+1/2,x+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - -y+1/2,-x+1/2,z
+ - -x+1/2,y+1/2,-z
+ - y+1/2,x+1/2,z
+ - z+1/2,x+1/2,y
+ - x+1/2,-z+1/2,-y
+ - -z+1/2,-x+1/2,y
+ - -x+1/2,z+1/2,-y
+ - z+1/2,-x+1/2,-y
+ - -x+1/2,-z+1/2,y
+ - -z+1/2,x+1/2,-y
+ - x+1/2,z+1/2,y
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+1/2,-x
+ - -z+1/2,-y+1/2,x
+ - -y+1/2,z+1/2,-x
+ - z+1/2,y+1/2,x
+ - -y+1/2,-z+1/2,x
+ - -z+1/2,y+1/2,-x
+ - z+1/2,-y+1/2,-x
+ universal_h_m: F -4 3 m
+- crystal_class: cubic
+ hall: " I -4 2 3"
+ hermann_mauguin: I -4 3 m
+ ncsym:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ - z,x,y
+ - x,-z,-y
+ - -z,-x,y
+ - -x,z,-y
+ - z,-x,-y
+ - -x,-z,y
+ - -z,x,-y
+ - x,z,y
+ - y,z,x
+ - y,-z,-x
+ - -z,-y,x
+ - -y,z,-x
+ - z,y,x
+ - -y,-z,x
+ - -z,y,-x
+ - z,-y,-x
+ number: 217
+ schoenflies: Td^3
+ symops:
+ - x,y,z
+ - y,-x,-z
+ - -x,-y,z
+ - -y,x,-z
+ - x,-y,-z
+ - -y,-x,z
+ - -x,y,-z
+ - y,x,z
+ - z,x,y
+ - x,-z,-y
+ - -z,-x,y
+ - -x,z,-y
+ - z,-x,-y
+ - -x,-z,y
+ - -z,x,-y
+ - x,z,y
+ - y,z,x
+ - y,-z,-x
+ - -z,-y,x
+ - -y,z,-x
+ - z,y,x
+ - -y,-z,x
+ - -z,y,-x
+ - z,-y,-x
+ - x+1/2,y+1/2,z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - z+1/2,x+1/2,y+1/2
+ - x+1/2,-z+1/2,-y+1/2
+ - -z+1/2,-x+1/2,y+1/2
+ - -x+1/2,z+1/2,-y+1/2
+ - z+1/2,-x+1/2,-y+1/2
+ - -x+1/2,-z+1/2,y+1/2
+ - -z+1/2,x+1/2,-y+1/2
+ - x+1/2,z+1/2,y+1/2
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1/2
+ - -z+1/2,-y+1/2,x+1/2
+ - -y+1/2,z+1/2,-x+1/2
+ - z+1/2,y+1/2,x+1/2
+ - -y+1/2,-z+1/2,x+1/2
+ - -z+1/2,y+1/2,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ universal_h_m: I -4 3 m
+- crystal_class: cubic
+ hall: " P -4n 2 3"
+ hermann_mauguin: P -4 3 n
+ ncsym:
+ - x,y,z
+ - y+1/2,-x+1/2,-z+1/2
+ - -x,-y,z
+ - -y+1/2,x+1/2,-z+1/2
+ - x,-y,-z
+ - -y+1/2,-x+1/2,z+1/2
+ - -x,y,-z
+ - y+1/2,x+1/2,z+1/2
+ - z,x,y
+ - x+1/2,-z+1/2,-y+1/2
+ - -z,-x,y
+ - -x+1/2,z+1/2,-y+1/2
+ - z,-x,-y
+ - -x+1/2,-z+1/2,y+1/2
+ - -z,x,-y
+ - x+1/2,z+1/2,y+1/2
+ - y,z,x
+ - y,-z,-x
+ - -z+1/2,-y+1/2,x+1/2
+ - -y,z,-x
+ - z+1/2,y+1/2,x+1/2
+ - -y,-z,x
+ - -z+1/2,y+1/2,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ number: 218
+ schoenflies: Td^4
+ symops:
+ - x,y,z
+ - y+1/2,-x+1/2,-z+1/2
+ - -x,-y,z
+ - -y+1/2,x+1/2,-z+1/2
+ - x,-y,-z
+ - -y+1/2,-x+1/2,z+1/2
+ - -x,y,-z
+ - y+1/2,x+1/2,z+1/2
+ - z,x,y
+ - x+1/2,-z+1/2,-y+1/2
+ - -z,-x,y
+ - -x+1/2,z+1/2,-y+1/2
+ - z,-x,-y
+ - -x+1/2,-z+1/2,y+1/2
+ - -z,x,-y
+ - x+1/2,z+1/2,y+1/2
+ - y,z,x
+ - y,-z,-x
+ - -z+1/2,-y+1/2,x+1/2
+ - -y,z,-x
+ - z+1/2,y+1/2,x+1/2
+ - -y,-z,x
+ - -z+1/2,y+1/2,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ universal_h_m: P -4 3 n
+- crystal_class: cubic
+ hall: " F -4a 2 3"
+ hermann_mauguin: F -4 3 c
+ ncsym:
+ - x,y,z
+ - y+1/2,-x,-z
+ - -x+1/2,-y+1/2,z
+ - -y,x+1/2,-z
+ - x,-y,-z
+ - -y+1/2,-x,z
+ - -x+1/2,y+1/2,-z
+ - y,x+1/2,z
+ - z,x,y
+ - x+1/2,-z,-y
+ - -z+1/2,-x+1/2,y
+ - -x,z+1/2,-y
+ - z,-x,-y
+ - -x+1/2,-z,y
+ - -z+1/2,x+1/2,-y
+ - x,z+1/2,y
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - -z,-y,x+1/2
+ - -y+1/2,z,-x+1/2
+ - z+1/2,y,x
+ - -y,-z,x
+ - -z,y,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ number: 219
+ schoenflies: Td^5
+ symops:
+ - x,y,z
+ - y+1/2,-x,-z
+ - -x+1/2,-y+1/2,z
+ - -y,x+1/2,-z
+ - x,-y,-z
+ - -y+1/2,-x,z
+ - -x+1/2,y+1/2,-z
+ - y,x+1/2,z
+ - z,x,y
+ - x+1/2,-z,-y
+ - -z+1/2,-x+1/2,y
+ - -x,z+1/2,-y
+ - z,-x,-y
+ - -x+1/2,-z,y
+ - -z+1/2,x+1/2,-y
+ - x,z+1/2,y
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - -z,-y,x+1/2
+ - -y+1/2,z,-x+1/2
+ - z+1/2,y,x
+ - -y,-z,x
+ - -z,y,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ - x,y+1/2,z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - -y,x+1,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - -x+1/2,y+1,-z+1/2
+ - y,x+1,z+1/2
+ - z,x+1/2,y+1/2
+ - x+1/2,-z+1/2,-y+1/2
+ - -z+1/2,-x+1,y+1/2
+ - -x,z+1,-y+1/2
+ - z,-x+1/2,-y+1/2
+ - -x+1/2,-z+1/2,y+1/2
+ - -z+1/2,x+1,-y+1/2
+ - x,z+1,y+1/2
+ - y,z+1/2,x+1/2
+ - y,-z+1,-x+1
+ - -z,-y+1/2,x+1
+ - -y+1/2,z+1/2,-x+1
+ - z+1/2,y+1/2,x+1/2
+ - -y,-z+1/2,x+1/2
+ - -z,y+1/2,-x+1
+ - z+1/2,-y+1,-x+1
+ - x+1/2,y,z+1/2
+ - y+1,-x,-z+1/2
+ - -x+1,-y+1/2,z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - -y+1,-x,z+1/2
+ - -x+1,y+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - z+1/2,x,y+1/2
+ - x+1,-z,-y+1/2
+ - -z+1,-x+1/2,y+1/2
+ - -x+1/2,z+1/2,-y+1/2
+ - z+1/2,-x,-y+1/2
+ - -x+1,-z,y+1/2
+ - -z+1,x+1/2,-y+1/2
+ - x+1/2,z+1/2,y+1/2
+ - y+1/2,z,x+1/2
+ - y+1/2,-z+1/2,-x+1
+ - -z+1/2,-y,x+1
+ - -y+1,z,-x+1
+ - z+1,y,x+1/2
+ - -y+1/2,-z,x+1/2
+ - -z+1/2,y,-x+1
+ - z+1,-y+1/2,-x+1
+ - x+1/2,y+1/2,z
+ - y+1,-x+1/2,-z
+ - -x+1,-y+1,z
+ - -y+1/2,x+1,-z
+ - x+1/2,-y+1/2,-z
+ - -y+1,-x+1/2,z
+ - -x+1,y+1,-z
+ - y+1/2,x+1,z
+ - z+1/2,x+1/2,y
+ - x+1,-z+1/2,-y
+ - -z+1,-x+1,y
+ - -x+1/2,z+1,-y
+ - z+1/2,-x+1/2,-y
+ - -x+1,-z+1/2,y
+ - -z+1,x+1,-y
+ - x+1/2,z+1,y
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+1,-x+1/2
+ - -z+1/2,-y+1/2,x+1/2
+ - -y+1,z+1/2,-x+1/2
+ - z+1,y+1/2,x
+ - -y+1/2,-z+1/2,x
+ - -z+1/2,y+1/2,-x+1/2
+ - z+1,-y+1,-x+1/2
+ universal_h_m: F -4 3 c
+- crystal_class: cubic
+ hall: " I -4bd 2c 3"
+ hermann_mauguin: I -4 3 d
+ ncsym:
+ - x,y,z
+ - y+1/4,-x+3/4,-z+1/4
+ - -x,-y+1/2,z
+ - -y+3/4,x+3/4,-z+1/4
+ - x,-y,-z+1/2
+ - -y+1/4,-x+3/4,z+3/4
+ - -x,y+1/2,-z+1/2
+ - y+3/4,x+3/4,z+3/4
+ - z,x,y
+ - x+1/4,-z+3/4,-y+1/4
+ - -z,-x+1/2,y
+ - -x+3/4,z+3/4,-y+1/4
+ - z,-x,-y+1/2
+ - -x+1/4,-z+3/4,y+3/4
+ - -z,x+1/2,-y+1/2
+ - x+3/4,z+3/4,y+3/4
+ - y,z,x
+ - y,-z,-x+1/2
+ - -z+1/4,-y+3/4,x+3/4
+ - -y,z+1/2,-x+1/2
+ - z+1/4,y+1/4,x+1/4
+ - -y+1/2,-z,x+1/2
+ - -z+1/4,y+1/4,-x+3/4
+ - z+3/4,-y+1/4,-x+3/4
+ number: 220
+ schoenflies: Td^6
+ symops:
+ - x,y,z
+ - y+1/4,-x+3/4,-z+1/4
+ - -x,-y+1/2,z
+ - -y+3/4,x+3/4,-z+1/4
+ - x,-y,-z+1/2
+ - -y+1/4,-x+3/4,z+3/4
+ - -x,y+1/2,-z+1/2
+ - y+3/4,x+3/4,z+3/4
+ - z,x,y
+ - x+1/4,-z+3/4,-y+1/4
+ - -z,-x+1/2,y
+ - -x+3/4,z+3/4,-y+1/4
+ - z,-x,-y+1/2
+ - -x+1/4,-z+3/4,y+3/4
+ - -z,x+1/2,-y+1/2
+ - x+3/4,z+3/4,y+3/4
+ - y,z,x
+ - y,-z,-x+1/2
+ - -z+1/4,-y+3/4,x+3/4
+ - -y,z+1/2,-x+1/2
+ - z+1/4,y+1/4,x+1/4
+ - -y+1/2,-z,x+1/2
+ - -z+1/4,y+1/4,-x+3/4
+ - z+3/4,-y+1/4,-x+3/4
+ - x+1/2,y+1/2,z+1/2
+ - y+3/4,-x+5/4,-z+3/4
+ - -x+1/2,-y+1,z+1/2
+ - -y+5/4,x+5/4,-z+3/4
+ - x+1/2,-y+1/2,-z+1
+ - -y+3/4,-x+5/4,z+5/4
+ - -x+1/2,y+1,-z+1
+ - y+5/4,x+5/4,z+5/4
+ - z+1/2,x+1/2,y+1/2
+ - x+3/4,-z+5/4,-y+3/4
+ - -z+1/2,-x+1,y+1/2
+ - -x+5/4,z+5/4,-y+3/4
+ - z+1/2,-x+1/2,-y+1
+ - -x+3/4,-z+5/4,y+5/4
+ - -z+1/2,x+1,-y+1
+ - x+5/4,z+5/4,y+5/4
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1
+ - -z+3/4,-y+5/4,x+5/4
+ - -y+1/2,z+1,-x+1
+ - z+3/4,y+3/4,x+3/4
+ - -y+1,-z+1/2,x+1
+ - -z+3/4,y+3/4,-x+5/4
+ - z+5/4,-y+3/4,-x+5/4
+ universal_h_m: I -4 3 d
+- crystal_class: cubic
+ hall: -P 4 2 3
+ hermann_mauguin: P m -3 m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ - -z,-x,-y
+ - x,-z,-y
+ - z,x,-y
+ - -x,z,-y
+ - -z,x,y
+ - -x,-z,y
+ - z,-x,y
+ - x,z,y
+ - -y,-z,-x
+ - -y,z,x
+ - -z,-y,x
+ - y,-z,x
+ - z,y,x
+ - y,z,-x
+ - -z,y,-x
+ - z,-y,-x
+ number: 221
+ schoenflies: Oh^1
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ - -z,-x,-y
+ - x,-z,-y
+ - z,x,-y
+ - -x,z,-y
+ - -z,x,y
+ - -x,-z,y
+ - z,-x,y
+ - x,z,y
+ - -y,-z,-x
+ - -y,z,x
+ - -z,-y,x
+ - y,-z,x
+ - z,y,x
+ - y,z,-x
+ - -z,y,-x
+ - z,-y,-x
+ universal_h_m: P m -3 m
+- crystal_class: cubic
+ hall: " P 4 2 3 -1n"
+ hermann_mauguin: P n -3 n
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -z+1/2,-x+1/2,-y+1/2
+ - x+1/2,-z+1/2,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -x+1/2,z+1/2,-y+1/2
+ - -z+1/2,x+1/2,y+1/2
+ - -x+1/2,-z+1/2,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - x+1/2,z+1/2,y+1/2
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - -z+1/2,-y+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - z+1/2,y+1/2,x+1/2
+ - y+1/2,z+1/2,-x+1/2
+ - -z+1/2,y+1/2,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ number: 222
+ schoenflies: Oh^2
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -z+1/2,-x+1/2,-y+1/2
+ - x+1/2,-z+1/2,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -x+1/2,z+1/2,-y+1/2
+ - -z+1/2,x+1/2,y+1/2
+ - -x+1/2,-z+1/2,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - x+1/2,z+1/2,y+1/2
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - -z+1/2,-y+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - z+1/2,y+1/2,x+1/2
+ - y+1/2,z+1/2,-x+1/2
+ - -z+1/2,y+1/2,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ universal_h_m: P n -3 n :1
+- crystal_class: cubic
+ hall: -P 4a 2bc 3
+ hermann_mauguin: P n -3 n
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z,y
+ - -z+1/2,-x+1/2,y
+ - x,-z+1/2,y
+ - z,-x+1/2,-y+1/2
+ - x,z,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - z,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - z,-y+1/2,x
+ - -z+1/2,y,x
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x,y-1/2,z-1/2
+ - -y,-x,z-1/2
+ - x-1/2,-y,z-1/2
+ - y-1/2,x-1/2,z-1/2
+ - -z,-x,-y
+ - x-1/2,-z,-y
+ - z-1/2,x-1/2,-y
+ - -x,z-1/2,-y
+ - -z,x-1/2,y-1/2
+ - -x,-z,y-1/2
+ - z-1/2,-x,y-1/2
+ - x-1/2,z-1/2,y-1/2
+ - -y,-z,-x
+ - -y,z-1/2,x-1/2
+ - -z,-y,x-1/2
+ - y-1/2,-z,x-1/2
+ - z-1/2,y-1/2,x-1/2
+ - y-1/2,z-1/2,-x
+ - -z,y-1/2,-x
+ - z-1/2,-y,-x
+ number: 222
+ schoenflies: Oh^2
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z,y
+ - -z+1/2,-x+1/2,y
+ - x,-z+1/2,y
+ - z,-x+1/2,-y+1/2
+ - x,z,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - z,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - z,-y+1/2,x
+ - -z+1/2,y,x
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x,y-1/2,z-1/2
+ - -y,-x,z-1/2
+ - x-1/2,-y,z-1/2
+ - y-1/2,x-1/2,z-1/2
+ - -z,-x,-y
+ - x-1/2,-z,-y
+ - z-1/2,x-1/2,-y
+ - -x,z-1/2,-y
+ - -z,x-1/2,y-1/2
+ - -x,-z,y-1/2
+ - z-1/2,-x,y-1/2
+ - x-1/2,z-1/2,y-1/2
+ - -y,-z,-x
+ - -y,z-1/2,x-1/2
+ - -z,-y,x-1/2
+ - y-1/2,-z,x-1/2
+ - z-1/2,y-1/2,x-1/2
+ - y-1/2,z-1/2,-x
+ - -z,y-1/2,-x
+ - z-1/2,-y,-x
+ universal_h_m: P n -3 n :2
+- crystal_class: cubic
+ hall: -P 4n 2 3
+ hermann_mauguin: P m -3 n
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z+1/2,y+1/2
+ - -z,-x,y
+ - x+1/2,-z+1/2,y+1/2
+ - z,-x,-y
+ - x+1/2,z+1/2,-y+1/2
+ - -z,x,-y
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x
+ - z+1/2,y+1/2,-x+1/2
+ - -y,z,-x
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y,-z,x
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ - -x,-y,-z
+ - y-1/2,-x-1/2,-z-1/2
+ - x,y,-z
+ - -y-1/2,x-1/2,-z-1/2
+ - -x,y,z
+ - -y-1/2,-x-1/2,z-1/2
+ - x,-y,z
+ - y-1/2,x-1/2,z-1/2
+ - -z,-x,-y
+ - x-1/2,-z-1/2,-y-1/2
+ - z,x,-y
+ - -x-1/2,z-1/2,-y-1/2
+ - -z,x,y
+ - -x-1/2,-z-1/2,y-1/2
+ - z,-x,y
+ - x-1/2,z-1/2,y-1/2
+ - -y,-z,-x
+ - -y,z,x
+ - -z-1/2,-y-1/2,x-1/2
+ - y,-z,x
+ - z-1/2,y-1/2,x-1/2
+ - y,z,-x
+ - -z-1/2,y-1/2,-x-1/2
+ - z-1/2,-y-1/2,-x-1/2
+ number: 223
+ schoenflies: Oh^3
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z+1/2,y+1/2
+ - -z,-x,y
+ - x+1/2,-z+1/2,y+1/2
+ - z,-x,-y
+ - x+1/2,z+1/2,-y+1/2
+ - -z,x,-y
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x
+ - z+1/2,y+1/2,-x+1/2
+ - -y,z,-x
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y,-z,x
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ - -x,-y,-z
+ - y-1/2,-x-1/2,-z-1/2
+ - x,y,-z
+ - -y-1/2,x-1/2,-z-1/2
+ - -x,y,z
+ - -y-1/2,-x-1/2,z-1/2
+ - x,-y,z
+ - y-1/2,x-1/2,z-1/2
+ - -z,-x,-y
+ - x-1/2,-z-1/2,-y-1/2
+ - z,x,-y
+ - -x-1/2,z-1/2,-y-1/2
+ - -z,x,y
+ - -x-1/2,-z-1/2,y-1/2
+ - z,-x,y
+ - x-1/2,z-1/2,y-1/2
+ - -y,-z,-x
+ - -y,z,x
+ - -z-1/2,-y-1/2,x-1/2
+ - y,-z,x
+ - z-1/2,y-1/2,x-1/2
+ - y,z,-x
+ - -z-1/2,y-1/2,-x-1/2
+ - z-1/2,-y-1/2,-x-1/2
+ universal_h_m: P m -3 n
+- crystal_class: cubic
+ hall: " P 4n 2 3 -1n"
+ hermann_mauguin: P n -3 m
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z+1/2,y+1/2
+ - -z,-x,y
+ - x+1/2,-z+1/2,y+1/2
+ - z,-x,-y
+ - x+1/2,z+1/2,-y+1/2
+ - -z,x,-y
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x
+ - z+1/2,y+1/2,-x+1/2
+ - -y,z,-x
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y,-z,x
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z
+ - -z+1/2,-x+1/2,-y+1/2
+ - x,-z,-y
+ - z+1/2,x+1/2,-y+1/2
+ - -x,z,-y
+ - -z+1/2,x+1/2,y+1/2
+ - -x,-z,y
+ - z+1/2,-x+1/2,y+1/2
+ - x,z,y
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - -z,-y,x
+ - y+1/2,-z+1/2,x+1/2
+ - z,y,x
+ - y+1/2,z+1/2,-x+1/2
+ - -z,y,-x
+ - z,-y,-x
+ number: 224
+ schoenflies: Oh^4
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z+1/2,y+1/2
+ - -z,-x,y
+ - x+1/2,-z+1/2,y+1/2
+ - z,-x,-y
+ - x+1/2,z+1/2,-y+1/2
+ - -z,x,-y
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x
+ - z+1/2,y+1/2,-x+1/2
+ - -y,z,-x
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y,-z,x
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z
+ - -z+1/2,-x+1/2,-y+1/2
+ - x,-z,-y
+ - z+1/2,x+1/2,-y+1/2
+ - -x,z,-y
+ - -z+1/2,x+1/2,y+1/2
+ - -x,-z,y
+ - z+1/2,-x+1/2,y+1/2
+ - x,z,y
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - -z,-y,x
+ - y+1/2,-z+1/2,x+1/2
+ - z,y,x
+ - y+1/2,z+1/2,-x+1/2
+ - -z,y,-x
+ - z,-y,-x
+ universal_h_m: P n -3 m :1
+- crystal_class: cubic
+ hall: -P 4bc 2bc 3
+ hermann_mauguin: P n -3 m
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z+1/2
+ - x,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y,-z+1/2
+ - -y,-x,-z
+ - z,x,y
+ - -x,z+1/2,y+1/2
+ - -z+1/2,-x+1/2,y
+ - x+1/2,-z,y+1/2
+ - z,-x+1/2,-y+1/2
+ - x+1/2,z+1/2,-y
+ - -z+1/2,x,-y+1/2
+ - -x,-z,-y
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - z+1/2,y+1/2,-x
+ - -y+1/2,z,-x+1/2
+ - -z,-y,-x
+ - -y+1/2,-z+1/2,x
+ - z+1/2,-y,x+1/2
+ - -z,y+1/2,x+1/2
+ - -x,-y,-z
+ - y,-x-1/2,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y-1/2,x,-z-1/2
+ - -x,y-1/2,z-1/2
+ - -y-1/2,-x-1/2,z
+ - x-1/2,-y,z-1/2
+ - y,x,z
+ - -z,-x,-y
+ - x,-z-1/2,-y-1/2
+ - z-1/2,x-1/2,-y
+ - -x-1/2,z,-y-1/2
+ - -z,x-1/2,y-1/2
+ - -x-1/2,-z-1/2,y
+ - z-1/2,-x,y-1/2
+ - x,z,y
+ - -y,-z,-x
+ - -y,z-1/2,x-1/2
+ - -z-1/2,-y-1/2,x
+ - y-1/2,-z,x-1/2
+ - z,y,x
+ - y-1/2,z-1/2,-x
+ - -z-1/2,y,-x-1/2
+ - z,-y-1/2,-x-1/2
+ number: 224
+ schoenflies: Oh^4
+ symops:
+ - x,y,z
+ - -y,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z+1/2
+ - x,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y,-z+1/2
+ - -y,-x,-z
+ - z,x,y
+ - -x,z+1/2,y+1/2
+ - -z+1/2,-x+1/2,y
+ - x+1/2,-z,y+1/2
+ - z,-x+1/2,-y+1/2
+ - x+1/2,z+1/2,-y
+ - -z+1/2,x,-y+1/2
+ - -x,-z,-y
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - z+1/2,y+1/2,-x
+ - -y+1/2,z,-x+1/2
+ - -z,-y,-x
+ - -y+1/2,-z+1/2,x
+ - z+1/2,-y,x+1/2
+ - -z,y+1/2,x+1/2
+ - -x,-y,-z
+ - y,-x-1/2,-z-1/2
+ - x-1/2,y-1/2,-z
+ - -y-1/2,x,-z-1/2
+ - -x,y-1/2,z-1/2
+ - -y-1/2,-x-1/2,z
+ - x-1/2,-y,z-1/2
+ - y,x,z
+ - -z,-x,-y
+ - x,-z-1/2,-y-1/2
+ - z-1/2,x-1/2,-y
+ - -x-1/2,z,-y-1/2
+ - -z,x-1/2,y-1/2
+ - -x-1/2,-z-1/2,y
+ - z-1/2,-x,y-1/2
+ - x,z,y
+ - -y,-z,-x
+ - -y,z-1/2,x-1/2
+ - -z-1/2,-y-1/2,x
+ - y-1/2,-z,x-1/2
+ - z,y,x
+ - y-1/2,z-1/2,-x
+ - -z-1/2,y,-x-1/2
+ - z,-y-1/2,-x-1/2
+ universal_h_m: P n -3 m :2
+- crystal_class: cubic
+ hall: -F 4 2 3
+ hermann_mauguin: F m -3 m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ - -z,-x,-y
+ - x,-z,-y
+ - z,x,-y
+ - -x,z,-y
+ - -z,x,y
+ - -x,-z,y
+ - z,-x,y
+ - x,z,y
+ - -y,-z,-x
+ - -y,z,x
+ - -z,-y,x
+ - y,-z,x
+ - z,y,x
+ - y,z,-x
+ - -z,y,-x
+ - z,-y,-x
+ number: 225
+ schoenflies: Oh^5
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ - -z,-x,-y
+ - x,-z,-y
+ - z,x,-y
+ - -x,z,-y
+ - -z,x,y
+ - -x,-z,y
+ - z,-x,y
+ - x,z,y
+ - -y,-z,-x
+ - -y,z,x
+ - -z,-y,x
+ - y,-z,x
+ - z,y,x
+ - y,z,-x
+ - -z,y,-x
+ - z,-y,-x
+ - x,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - y,x+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -y,-x+1/2,-z+1/2
+ - z,x+1/2,y+1/2
+ - -x,z+1/2,y+1/2
+ - -z,-x+1/2,y+1/2
+ - x,-z+1/2,y+1/2
+ - z,-x+1/2,-y+1/2
+ - x,z+1/2,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - -x,-z+1/2,-y+1/2
+ - y,z+1/2,x+1/2
+ - y,-z+1/2,-x+1/2
+ - z,y+1/2,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -z,-y+1/2,-x+1/2
+ - -y,-z+1/2,x+1/2
+ - z,-y+1/2,x+1/2
+ - -z,y+1/2,x+1/2
+ - -x,-y+1/2,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -y,x+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - -y,-x+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - y,x+1/2,z+1/2
+ - -z,-x+1/2,-y+1/2
+ - x,-z+1/2,-y+1/2
+ - z,x+1/2,-y+1/2
+ - -x,z+1/2,-y+1/2
+ - -z,x+1/2,y+1/2
+ - -x,-z+1/2,y+1/2
+ - z,-x+1/2,y+1/2
+ - x,z+1/2,y+1/2
+ - -y,-z+1/2,-x+1/2
+ - -y,z+1/2,x+1/2
+ - -z,-y+1/2,x+1/2
+ - y,-z+1/2,x+1/2
+ - z,y+1/2,x+1/2
+ - y,z+1/2,-x+1/2
+ - -z,y+1/2,-x+1/2
+ - z,-y+1/2,-x+1/2
+ - x+1/2,y,z+1/2
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x,-z+1/2
+ - z+1/2,x,y+1/2
+ - -x+1/2,z,y+1/2
+ - -z+1/2,-x,y+1/2
+ - x+1/2,-z,y+1/2
+ - z+1/2,-x,-y+1/2
+ - x+1/2,z,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - -x+1/2,-z,-y+1/2
+ - y+1/2,z,x+1/2
+ - y+1/2,-z,-x+1/2
+ - z+1/2,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - z+1/2,-y,x+1/2
+ - -z+1/2,y,x+1/2
+ - -x+1/2,-y,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -y+1/2,-x,z+1/2
+ - x+1/2,-y,z+1/2
+ - y+1/2,x,z+1/2
+ - -z+1/2,-x,-y+1/2
+ - x+1/2,-z,-y+1/2
+ - z+1/2,x,-y+1/2
+ - -x+1/2,z,-y+1/2
+ - -z+1/2,x,y+1/2
+ - -x+1/2,-z,y+1/2
+ - z+1/2,-x,y+1/2
+ - x+1/2,z,y+1/2
+ - -y+1/2,-z,-x+1/2
+ - -y+1/2,z,x+1/2
+ - -z+1/2,-y,x+1/2
+ - y+1/2,-z,x+1/2
+ - z+1/2,y,x+1/2
+ - y+1/2,z,-x+1/2
+ - -z+1/2,y,-x+1/2
+ - z+1/2,-y,-x+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -y+1/2,-x+1/2,-z
+ - z+1/2,x+1/2,y
+ - -x+1/2,z+1/2,y
+ - -z+1/2,-x+1/2,y
+ - x+1/2,-z+1/2,y
+ - z+1/2,-x+1/2,-y
+ - x+1/2,z+1/2,-y
+ - -z+1/2,x+1/2,-y
+ - -x+1/2,-z+1/2,-y
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+1/2,-x
+ - z+1/2,y+1/2,-x
+ - -y+1/2,z+1/2,-x
+ - -z+1/2,-y+1/2,-x
+ - -y+1/2,-z+1/2,x
+ - z+1/2,-y+1/2,x
+ - -z+1/2,y+1/2,x
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ - -z+1/2,-x+1/2,-y
+ - x+1/2,-z+1/2,-y
+ - z+1/2,x+1/2,-y
+ - -x+1/2,z+1/2,-y
+ - -z+1/2,x+1/2,y
+ - -x+1/2,-z+1/2,y
+ - z+1/2,-x+1/2,y
+ - x+1/2,z+1/2,y
+ - -y+1/2,-z+1/2,-x
+ - -y+1/2,z+1/2,x
+ - -z+1/2,-y+1/2,x
+ - y+1/2,-z+1/2,x
+ - z+1/2,y+1/2,x
+ - y+1/2,z+1/2,-x
+ - -z+1/2,y+1/2,-x
+ - z+1/2,-y+1/2,-x
+ universal_h_m: F m -3 m
+- crystal_class: cubic
+ hall: -F 4a 2 3
+ hermann_mauguin: F m -3 c
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y,-z
+ - y+1/2,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x+1/2,-z
+ - z,x,y
+ - -x+1/2,z,y
+ - -z+1/2,-x+1/2,y
+ - x,-z+1/2,y
+ - z,-x,-y
+ - x+1/2,z,-y
+ - -z+1/2,x+1/2,-y
+ - -x,-z+1/2,-y
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - z,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y,-x
+ - -y,-z,x
+ - z,-y,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x,y,z
+ - -y-1/2,-x,z
+ - x-1/2,-y-1/2,z
+ - y,x-1/2,z
+ - -z,-x,-y
+ - x-1/2,-z,-y
+ - z-1/2,x-1/2,-y
+ - -x,z-1/2,-y
+ - -z,x,y
+ - -x-1/2,-z,y
+ - z-1/2,-x-1/2,y
+ - x,z-1/2,y
+ - -y,-z,-x
+ - -y,z-1/2,x-1/2
+ - -z,-y,x-1/2
+ - y-1/2,-z,x-1/2
+ - z-1/2,y,x
+ - y,z,-x
+ - -z,y,-x-1/2
+ - z-1/2,-y-1/2,-x-1/2
+ number: 226
+ schoenflies: Oh^6
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y,-z
+ - y+1/2,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x+1/2,-z
+ - z,x,y
+ - -x+1/2,z,y
+ - -z+1/2,-x+1/2,y
+ - x,-z+1/2,y
+ - z,-x,-y
+ - x+1/2,z,-y
+ - -z+1/2,x+1/2,-y
+ - -x,-z+1/2,-y
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - z,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y,-x
+ - -y,-z,x
+ - z,-y,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ - -x,-y,-z
+ - y-1/2,-x,-z
+ - x-1/2,y-1/2,-z
+ - -y,x-1/2,-z
+ - -x,y,z
+ - -y-1/2,-x,z
+ - x-1/2,-y-1/2,z
+ - y,x-1/2,z
+ - -z,-x,-y
+ - x-1/2,-z,-y
+ - z-1/2,x-1/2,-y
+ - -x,z-1/2,-y
+ - -z,x,y
+ - -x-1/2,-z,y
+ - z-1/2,-x-1/2,y
+ - x,z-1/2,y
+ - -y,-z,-x
+ - -y,z-1/2,x-1/2
+ - -z,-y,x-1/2
+ - y-1/2,-z,x-1/2
+ - z-1/2,y,x
+ - y,z,-x
+ - -z,y,-x-1/2
+ - z-1/2,-y-1/2,-x-1/2
+ - x,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1,z+1/2
+ - y,-x+1,z+1/2
+ - x,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1,-z+1/2
+ - -y,-x+1,-z+1/2
+ - z,x+1/2,y+1/2
+ - -x+1/2,z+1/2,y+1/2
+ - -z+1/2,-x+1,y+1/2
+ - x,-z+1,y+1/2
+ - z,-x+1/2,-y+1/2
+ - x+1/2,z+1/2,-y+1/2
+ - -z+1/2,x+1,-y+1/2
+ - -x,-z+1,-y+1/2
+ - y,z+1/2,x+1/2
+ - y,-z+1,-x+1
+ - z,y+1/2,-x+1
+ - -y+1/2,z+1/2,-x+1
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y,-z+1/2,x+1/2
+ - z,-y+1/2,x+1
+ - -z+1/2,y+1,x+1
+ - -x,-y+1/2,-z+1/2
+ - y-1/2,-x+1/2,-z+1/2
+ - x-1/2,y,-z+1/2
+ - -y,x,-z+1/2
+ - -x,y+1/2,z+1/2
+ - -y-1/2,-x+1/2,z+1/2
+ - x-1/2,-y,z+1/2
+ - y,x,z+1/2
+ - -z,-x+1/2,-y+1/2
+ - x-1/2,-z+1/2,-y+1/2
+ - z-1/2,x,-y+1/2
+ - -x,z,-y+1/2
+ - -z,x+1/2,y+1/2
+ - -x-1/2,-z+1/2,y+1/2
+ - z-1/2,-x,y+1/2
+ - x,z,y+1/2
+ - -y,-z+1/2,-x+1/2
+ - -y,z,x
+ - -z,-y+1/2,x
+ - y-1/2,-z+1/2,x
+ - z-1/2,y+1/2,x+1/2
+ - y,z+1/2,-x+1/2
+ - -z,y+1/2,-x
+ - z-1/2,-y,-x
+ - x+1/2,y,z+1/2
+ - -y+1,x,z+1/2
+ - -x+1,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - y+1,x,-z+1/2
+ - -x+1,y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - z+1/2,x,y+1/2
+ - -x+1,z,y+1/2
+ - -z+1,-x+1/2,y+1/2
+ - x+1/2,-z+1/2,y+1/2
+ - z+1/2,-x,-y+1/2
+ - x+1,z,-y+1/2
+ - -z+1,x+1/2,-y+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - y+1/2,z,x+1/2
+ - y+1/2,-z+1/2,-x+1
+ - z+1/2,y,-x+1
+ - -y+1,z,-x+1
+ - -z+1,-y,-x+1/2
+ - -y+1/2,-z,x+1/2
+ - z+1/2,-y,x+1
+ - -z+1,y+1/2,x+1
+ - -x+1/2,-y,-z+1/2
+ - y,-x,-z+1/2
+ - x,y-1/2,-z+1/2
+ - -y+1/2,x-1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y-1/2,z+1/2
+ - y+1/2,x-1/2,z+1/2
+ - -z+1/2,-x,-y+1/2
+ - x,-z,-y+1/2
+ - z,x-1/2,-y+1/2
+ - -x+1/2,z-1/2,-y+1/2
+ - -z+1/2,x,y+1/2
+ - -x,-z,y+1/2
+ - z,-x-1/2,y+1/2
+ - x+1/2,z-1/2,y+1/2
+ - -y+1/2,-z,-x+1/2
+ - -y+1/2,z-1/2,x
+ - -z+1/2,-y,x
+ - y,-z,x
+ - z,y,x+1/2
+ - y+1/2,z,-x+1/2
+ - -z+1/2,y,-x
+ - z,-y-1/2,-x
+ - x+1/2,y+1/2,z
+ - -y+1,x+1/2,z
+ - -x+1,-y+1,z
+ - y+1/2,-x+1,z
+ - x+1/2,-y+1/2,-z
+ - y+1,x+1/2,-z
+ - -x+1,y+1,-z
+ - -y+1/2,-x+1,-z
+ - z+1/2,x+1/2,y
+ - -x+1,z+1/2,y
+ - -z+1,-x+1,y
+ - x+1/2,-z+1,y
+ - z+1/2,-x+1/2,-y
+ - x+1,z+1/2,-y
+ - -z+1,x+1,-y
+ - -x+1/2,-z+1,-y
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+1,-x+1/2
+ - z+1/2,y+1/2,-x+1/2
+ - -y+1,z+1/2,-x+1/2
+ - -z+1,-y+1/2,-x
+ - -y+1/2,-z+1/2,x
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1,y+1,x+1/2
+ - -x+1/2,-y+1/2,-z
+ - y,-x+1/2,-z
+ - x,y,-z
+ - -y+1/2,x,-z
+ - -x+1/2,y+1/2,z
+ - -y,-x+1/2,z
+ - x,-y,z
+ - y+1/2,x,z
+ - -z+1/2,-x+1/2,-y
+ - x,-z+1/2,-y
+ - z,x,-y
+ - -x+1/2,z,-y
+ - -z+1/2,x+1/2,y
+ - -x,-z+1/2,y
+ - z,-x,y
+ - x+1/2,z,y
+ - -y+1/2,-z+1/2,-x
+ - -y+1/2,z,x-1/2
+ - -z+1/2,-y+1/2,x-1/2
+ - y,-z+1/2,x-1/2
+ - z,y+1/2,x
+ - y+1/2,z+1/2,-x
+ - -z+1/2,y+1/2,-x-1/2
+ - z,-y,-x-1/2
+ universal_h_m: F m -3 c
+- crystal_class: cubic
+ hall: " F 4d 2 3 -1d"
+ hermann_mauguin: F d -3 m
+ ncsym:
+ - x,y,z
+ - -y+1/4,x+1/4,z+1/4
+ - -x,-y+1/2,z+1/2
+ - y+3/4,-x+1/4,z+3/4
+ - x,-y,-z
+ - y+1/4,x+1/4,-z+1/4
+ - -x,y+1/2,-z+1/2
+ - -y+3/4,-x+1/4,-z+3/4
+ - z,x,y
+ - -x+1/4,z+1/4,y+1/4
+ - -z,-x+1/2,y+1/2
+ - x+3/4,-z+1/4,y+3/4
+ - z,-x,-y
+ - x+1/4,z+1/4,-y+1/4
+ - -z,x+1/2,-y+1/2
+ - -x+3/4,-z+1/4,-y+3/4
+ - y,z,x
+ - y+1/2,-z,-x+1/2
+ - z+1/4,y+3/4,-x+3/4
+ - -y+1/2,z+1/2,-x
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y,-z,x
+ - z+1/4,-y+3/4,x+3/4
+ - -z+3/4,y+3/4,x+1/4
+ - -x+1/4,-y+1/4,-z+1/4
+ - y,-x,-z
+ - x+1/4,y-1/4,-z-1/4
+ - -y-1/2,x,-z-1/2
+ - -x+1/4,y+1/4,z+1/4
+ - -y,-x,z
+ - x+1/4,-y-1/4,z-1/4
+ - y-1/2,x,z-1/2
+ - -z+1/4,-x+1/4,-y+1/4
+ - x,-z,-y
+ - z+1/4,x-1/4,-y-1/4
+ - -x-1/2,z,-y-1/2
+ - -z+1/4,x+1/4,y+1/4
+ - -x,-z,y
+ - z+1/4,-x-1/4,y-1/4
+ - x-1/2,z,y-1/2
+ - -y+1/4,-z+1/4,-x+1/4
+ - -y-1/4,z+1/4,x-1/4
+ - -z,-y-1/2,x-1/2
+ - y-1/4,-z-1/4,x+1/4
+ - z,y,x
+ - y+1/4,z+1/4,-x+1/4
+ - -z,y-1/2,-x-1/2
+ - z-1/2,-y-1/2,-x
+ number: 227
+ schoenflies: Oh^7
+ symops:
+ - x,y,z
+ - -y+1/4,x+1/4,z+1/4
+ - -x,-y+1/2,z+1/2
+ - y+3/4,-x+1/4,z+3/4
+ - x,-y,-z
+ - y+1/4,x+1/4,-z+1/4
+ - -x,y+1/2,-z+1/2
+ - -y+3/4,-x+1/4,-z+3/4
+ - z,x,y
+ - -x+1/4,z+1/4,y+1/4
+ - -z,-x+1/2,y+1/2
+ - x+3/4,-z+1/4,y+3/4
+ - z,-x,-y
+ - x+1/4,z+1/4,-y+1/4
+ - -z,x+1/2,-y+1/2
+ - -x+3/4,-z+1/4,-y+3/4
+ - y,z,x
+ - y+1/2,-z,-x+1/2
+ - z+1/4,y+3/4,-x+3/4
+ - -y+1/2,z+1/2,-x
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y,-z,x
+ - z+1/4,-y+3/4,x+3/4
+ - -z+3/4,y+3/4,x+1/4
+ - -x+1/4,-y+1/4,-z+1/4
+ - y,-x,-z
+ - x+1/4,y-1/4,-z-1/4
+ - -y-1/2,x,-z-1/2
+ - -x+1/4,y+1/4,z+1/4
+ - -y,-x,z
+ - x+1/4,-y-1/4,z-1/4
+ - y-1/2,x,z-1/2
+ - -z+1/4,-x+1/4,-y+1/4
+ - x,-z,-y
+ - z+1/4,x-1/4,-y-1/4
+ - -x-1/2,z,-y-1/2
+ - -z+1/4,x+1/4,y+1/4
+ - -x,-z,y
+ - z+1/4,-x-1/4,y-1/4
+ - x-1/2,z,y-1/2
+ - -y+1/4,-z+1/4,-x+1/4
+ - -y-1/4,z+1/4,x-1/4
+ - -z,-y-1/2,x-1/2
+ - y-1/4,-z-1/4,x+1/4
+ - z,y,x
+ - y+1/4,z+1/4,-x+1/4
+ - -z,y-1/2,-x-1/2
+ - z-1/2,-y-1/2,-x
+ - x,y+1/2,z+1/2
+ - -y+1/4,x+3/4,z+3/4
+ - -x,-y+1,z+1
+ - y+3/4,-x+3/4,z+5/4
+ - x,-y+1/2,-z+1/2
+ - y+1/4,x+3/4,-z+3/4
+ - -x,y+1,-z+1
+ - -y+3/4,-x+3/4,-z+5/4
+ - z,x+1/2,y+1/2
+ - -x+1/4,z+3/4,y+3/4
+ - -z,-x+1,y+1
+ - x+3/4,-z+3/4,y+5/4
+ - z,-x+1/2,-y+1/2
+ - x+1/4,z+3/4,-y+3/4
+ - -z,x+1,-y+1
+ - -x+3/4,-z+3/4,-y+5/4
+ - y,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1
+ - z+1/4,y+5/4,-x+5/4
+ - -y+1/2,z+1,-x+1/2
+ - -z+1/4,-y+3/4,-x+3/4
+ - -y,-z+1/2,x+1/2
+ - z+1/4,-y+5/4,x+5/4
+ - -z+3/4,y+5/4,x+3/4
+ - -x+1/4,-y+3/4,-z+3/4
+ - y,-x+1/2,-z+1/2
+ - x+1/4,y+1/4,-z+1/4
+ - -y-1/2,x+1/2,-z
+ - -x+1/4,y+3/4,z+3/4
+ - -y,-x+1/2,z+1/2
+ - x+1/4,-y+1/4,z+1/4
+ - y-1/2,x+1/2,z
+ - -z+1/4,-x+3/4,-y+3/4
+ - x,-z+1/2,-y+1/2
+ - z+1/4,x+1/4,-y+1/4
+ - -x-1/2,z+1/2,-y
+ - -z+1/4,x+3/4,y+3/4
+ - -x,-z+1/2,y+1/2
+ - z+1/4,-x+1/4,y+1/4
+ - x-1/2,z+1/2,y
+ - -y+1/4,-z+3/4,-x+3/4
+ - -y-1/4,z+3/4,x+1/4
+ - -z,-y,x
+ - y-1/4,-z+1/4,x+3/4
+ - z,y+1/2,x+1/2
+ - y+1/4,z+3/4,-x+3/4
+ - -z,y,-x
+ - z-1/2,-y,-x+1/2
+ - x+1/2,y,z+1/2
+ - -y+3/4,x+1/4,z+3/4
+ - -x+1/2,-y+1/2,z+1
+ - y+5/4,-x+1/4,z+5/4
+ - x+1/2,-y,-z+1/2
+ - y+3/4,x+1/4,-z+3/4
+ - -x+1/2,y+1/2,-z+1
+ - -y+5/4,-x+1/4,-z+5/4
+ - z+1/2,x,y+1/2
+ - -x+3/4,z+1/4,y+3/4
+ - -z+1/2,-x+1/2,y+1
+ - x+5/4,-z+1/4,y+5/4
+ - z+1/2,-x,-y+1/2
+ - x+3/4,z+1/4,-y+3/4
+ - -z+1/2,x+1/2,-y+1
+ - -x+5/4,-z+1/4,-y+5/4
+ - y+1/2,z,x+1/2
+ - y+1,-z,-x+1
+ - z+3/4,y+3/4,-x+5/4
+ - -y+1,z+1/2,-x+1/2
+ - -z+3/4,-y+1/4,-x+3/4
+ - -y+1/2,-z,x+1/2
+ - z+3/4,-y+3/4,x+5/4
+ - -z+5/4,y+3/4,x+3/4
+ - -x+3/4,-y+1/4,-z+3/4
+ - y+1/2,-x,-z+1/2
+ - x+3/4,y-1/4,-z+1/4
+ - -y,x,-z
+ - -x+3/4,y+1/4,z+3/4
+ - -y+1/2,-x,z+1/2
+ - x+3/4,-y-1/4,z+1/4
+ - y,x,z
+ - -z+3/4,-x+1/4,-y+3/4
+ - x+1/2,-z,-y+1/2
+ - z+3/4,x-1/4,-y+1/4
+ - -x,z,-y
+ - -z+3/4,x+1/4,y+3/4
+ - -x+1/2,-z,y+1/2
+ - z+3/4,-x-1/4,y+1/4
+ - x,z,y
+ - -y+3/4,-z+1/4,-x+3/4
+ - -y+1/4,z+1/4,x+1/4
+ - -z+1/2,-y-1/2,x
+ - y+1/4,-z-1/4,x+3/4
+ - z+1/2,y,x+1/2
+ - y+3/4,z+1/4,-x+3/4
+ - -z+1/2,y-1/2,-x
+ - z,-y-1/2,-x+1/2
+ - x+1/2,y+1/2,z
+ - -y+3/4,x+3/4,z+1/4
+ - -x+1/2,-y+1,z+1/2
+ - y+5/4,-x+3/4,z+3/4
+ - x+1/2,-y+1/2,-z
+ - y+3/4,x+3/4,-z+1/4
+ - -x+1/2,y+1,-z+1/2
+ - -y+5/4,-x+3/4,-z+3/4
+ - z+1/2,x+1/2,y
+ - -x+3/4,z+3/4,y+1/4
+ - -z+1/2,-x+1,y+1/2
+ - x+5/4,-z+3/4,y+3/4
+ - z+1/2,-x+1/2,-y
+ - x+3/4,z+3/4,-y+1/4
+ - -z+1/2,x+1,-y+1/2
+ - -x+5/4,-z+3/4,-y+3/4
+ - y+1/2,z+1/2,x
+ - y+1,-z+1/2,-x+1/2
+ - z+3/4,y+5/4,-x+3/4
+ - -y+1,z+1,-x
+ - -z+3/4,-y+3/4,-x+1/4
+ - -y+1/2,-z+1/2,x
+ - z+3/4,-y+5/4,x+3/4
+ - -z+5/4,y+5/4,x+1/4
+ - -x+3/4,-y+3/4,-z+1/4
+ - y+1/2,-x+1/2,-z
+ - x+3/4,y+1/4,-z-1/4
+ - -y,x+1/2,-z-1/2
+ - -x+3/4,y+3/4,z+1/4
+ - -y+1/2,-x+1/2,z
+ - x+3/4,-y+1/4,z-1/4
+ - y,x+1/2,z-1/2
+ - -z+3/4,-x+3/4,-y+1/4
+ - x+1/2,-z+1/2,-y
+ - z+3/4,x+1/4,-y-1/4
+ - -x,z+1/2,-y-1/2
+ - -z+3/4,x+3/4,y+1/4
+ - -x+1/2,-z+1/2,y
+ - z+3/4,-x+1/4,y-1/4
+ - x,z+1/2,y-1/2
+ - -y+3/4,-z+3/4,-x+1/4
+ - -y+1/4,z+3/4,x-1/4
+ - -z+1/2,-y,x-1/2
+ - y+1/4,-z+1/4,x+1/4
+ - z+1/2,y+1/2,x
+ - y+3/4,z+3/4,-x+1/4
+ - -z+1/2,y,-x-1/2
+ - z,-y,-x
+ universal_h_m: F d -3 m :1
+- crystal_class: cubic
+ hall: -F 4vw 2vw 3
+ hermann_mauguin: F d -3 m
+ ncsym:
+ - x,y,z
+ - -y,x+1/4,z+1/4
+ - -x+3/4,-y+1/4,z+1/2
+ - y+3/4,-x,z+3/4
+ - x,-y+1/4,-z+1/4
+ - y+3/4,x+1/4,-z+1/2
+ - -x+3/4,y,-z+3/4
+ - -y,-x,-z
+ - z,x,y
+ - -x,z+1/4,y+1/4
+ - -z+3/4,-x+1/4,y+1/2
+ - x+3/4,-z,y+3/4
+ - z,-x+1/4,-y+1/4
+ - x+3/4,z+1/4,-y+1/2
+ - -z+3/4,x,-y+3/4
+ - -x,-z,-y
+ - y,z,x
+ - y+1/2,-z+3/4,-x+1/4
+ - z+1/4,y+3/4,-x+1/2
+ - -y+1/4,z+1/2,-x+3/4
+ - -z,-y+1/2,-x+1/2
+ - -y+1/4,-z+1/4,x
+ - z+1/4,-y,x+1/4
+ - -z+1/2,y+1/4,x+3/4
+ - -x,-y,-z
+ - y,-x-1/4,-z-1/4
+ - x-3/4,y-1/4,-z-1/2
+ - -y-3/4,x,-z-3/4
+ - -x,y-1/4,z-1/4
+ - -y-3/4,-x-1/4,z-1/2
+ - x-3/4,-y,z-3/4
+ - y,x,z
+ - -z,-x,-y
+ - x,-z-1/4,-y-1/4
+ - z-3/4,x-1/4,-y-1/2
+ - -x-3/4,z,-y-3/4
+ - -z,x-1/4,y-1/4
+ - -x-3/4,-z-1/4,y-1/2
+ - z-3/4,-x,y-3/4
+ - x,z,y
+ - -y,-z,-x
+ - -y-1/2,z-3/4,x-1/4
+ - -z-1/4,-y-3/4,x-1/2
+ - y-1/4,-z-1/2,x-3/4
+ - z,y-1/2,x-1/2
+ - y-1/4,z-1/4,-x
+ - -z-1/4,y,-x-1/4
+ - z-1/2,-y-1/4,-x-3/4
+ number: 227
+ schoenflies: Oh^7
+ symops:
+ - x,y,z
+ - -y,x+1/4,z+1/4
+ - -x+3/4,-y+1/4,z+1/2
+ - y+3/4,-x,z+3/4
+ - x,-y+1/4,-z+1/4
+ - y+3/4,x+1/4,-z+1/2
+ - -x+3/4,y,-z+3/4
+ - -y,-x,-z
+ - z,x,y
+ - -x,z+1/4,y+1/4
+ - -z+3/4,-x+1/4,y+1/2
+ - x+3/4,-z,y+3/4
+ - z,-x+1/4,-y+1/4
+ - x+3/4,z+1/4,-y+1/2
+ - -z+3/4,x,-y+3/4
+ - -x,-z,-y
+ - y,z,x
+ - y+1/2,-z+3/4,-x+1/4
+ - z+1/4,y+3/4,-x+1/2
+ - -y+1/4,z+1/2,-x+3/4
+ - -z,-y+1/2,-x+1/2
+ - -y+1/4,-z+1/4,x
+ - z+1/4,-y,x+1/4
+ - -z+1/2,y+1/4,x+3/4
+ - -x,-y,-z
+ - y,-x-1/4,-z-1/4
+ - x-3/4,y-1/4,-z-1/2
+ - -y-3/4,x,-z-3/4
+ - -x,y-1/4,z-1/4
+ - -y-3/4,-x-1/4,z-1/2
+ - x-3/4,-y,z-3/4
+ - y,x,z
+ - -z,-x,-y
+ - x,-z-1/4,-y-1/4
+ - z-3/4,x-1/4,-y-1/2
+ - -x-3/4,z,-y-3/4
+ - -z,x-1/4,y-1/4
+ - -x-3/4,-z-1/4,y-1/2
+ - z-3/4,-x,y-3/4
+ - x,z,y
+ - -y,-z,-x
+ - -y-1/2,z-3/4,x-1/4
+ - -z-1/4,-y-3/4,x-1/2
+ - y-1/4,-z-1/2,x-3/4
+ - z,y-1/2,x-1/2
+ - y-1/4,z-1/4,-x
+ - -z-1/4,y,-x-1/4
+ - z-1/2,-y-1/4,-x-3/4
+ - x,y+1/2,z+1/2
+ - -y,x+3/4,z+3/4
+ - -x+3/4,-y+3/4,z+1
+ - y+3/4,-x+1/2,z+5/4
+ - x,-y+3/4,-z+3/4
+ - y+3/4,x+3/4,-z+1
+ - -x+3/4,y+1/2,-z+5/4
+ - -y,-x+1/2,-z+1/2
+ - z,x+1/2,y+1/2
+ - -x,z+3/4,y+3/4
+ - -z+3/4,-x+3/4,y+1
+ - x+3/4,-z+1/2,y+5/4
+ - z,-x+3/4,-y+3/4
+ - x+3/4,z+3/4,-y+1
+ - -z+3/4,x+1/2,-y+5/4
+ - -x,-z+1/2,-y+1/2
+ - y,z+1/2,x+1/2
+ - y+1/2,-z+5/4,-x+3/4
+ - z+1/4,y+5/4,-x+1
+ - -y+1/4,z+1,-x+5/4
+ - -z,-y+1,-x+1
+ - -y+1/4,-z+3/4,x+1/2
+ - z+1/4,-y+1/2,x+3/4
+ - -z+1/2,y+3/4,x+5/4
+ - -x,-y+1/2,-z+1/2
+ - y,-x+1/4,-z+1/4
+ - x-3/4,y+1/4,-z
+ - -y-3/4,x+1/2,-z-1/4
+ - -x,y+1/4,z+1/4
+ - -y-3/4,-x+1/4,z
+ - x-3/4,-y+1/2,z-1/4
+ - y,x+1/2,z+1/2
+ - -z,-x+1/2,-y+1/2
+ - x,-z+1/4,-y+1/4
+ - z-3/4,x+1/4,-y
+ - -x-3/4,z+1/2,-y-1/4
+ - -z,x+1/4,y+1/4
+ - -x-3/4,-z+1/4,y
+ - z-3/4,-x+1/2,y-1/4
+ - x,z+1/2,y+1/2
+ - -y,-z+1/2,-x+1/2
+ - -y-1/2,z-1/4,x+1/4
+ - -z-1/4,-y-1/4,x
+ - y-1/4,-z,x-1/4
+ - z,y,x
+ - y-1/4,z+1/4,-x+1/2
+ - -z-1/4,y+1/2,-x+1/4
+ - z-1/2,-y+1/4,-x-1/4
+ - x+1/2,y,z+1/2
+ - -y+1/2,x+1/4,z+3/4
+ - -x+5/4,-y+1/4,z+1
+ - y+5/4,-x,z+5/4
+ - x+1/2,-y+1/4,-z+3/4
+ - y+5/4,x+1/4,-z+1
+ - -x+5/4,y,-z+5/4
+ - -y+1/2,-x,-z+1/2
+ - z+1/2,x,y+1/2
+ - -x+1/2,z+1/4,y+3/4
+ - -z+5/4,-x+1/4,y+1
+ - x+5/4,-z,y+5/4
+ - z+1/2,-x+1/4,-y+3/4
+ - x+5/4,z+1/4,-y+1
+ - -z+5/4,x,-y+5/4
+ - -x+1/2,-z,-y+1/2
+ - y+1/2,z,x+1/2
+ - y+1,-z+3/4,-x+3/4
+ - z+3/4,y+3/4,-x+1
+ - -y+3/4,z+1/2,-x+5/4
+ - -z+1/2,-y+1/2,-x+1
+ - -y+3/4,-z+1/4,x+1/2
+ - z+3/4,-y,x+3/4
+ - -z+1,y+1/4,x+5/4
+ - -x+1/2,-y,-z+1/2
+ - y+1/2,-x-1/4,-z+1/4
+ - x-1/4,y-1/4,-z
+ - -y-1/4,x,-z-1/4
+ - -x+1/2,y-1/4,z+1/4
+ - -y-1/4,-x-1/4,z
+ - x-1/4,-y,z-1/4
+ - y+1/2,x,z+1/2
+ - -z+1/2,-x,-y+1/2
+ - x+1/2,-z-1/4,-y+1/4
+ - z-1/4,x-1/4,-y
+ - -x-1/4,z,-y-1/4
+ - -z+1/2,x-1/4,y+1/4
+ - -x-1/4,-z-1/4,y
+ - z-1/4,-x,y-1/4
+ - x+1/2,z,y+1/2
+ - -y+1/2,-z,-x+1/2
+ - -y,z-3/4,x+1/4
+ - -z+1/4,-y-3/4,x
+ - y+1/4,-z-1/2,x-1/4
+ - z+1/2,y-1/2,x
+ - y+1/4,z-1/4,-x+1/2
+ - -z+1/4,y,-x+1/4
+ - z,-y-1/4,-x-1/4
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+3/4,z+1/4
+ - -x+5/4,-y+3/4,z+1/2
+ - y+5/4,-x+1/2,z+3/4
+ - x+1/2,-y+3/4,-z+1/4
+ - y+5/4,x+3/4,-z+1/2
+ - -x+5/4,y+1/2,-z+3/4
+ - -y+1/2,-x+1/2,-z
+ - z+1/2,x+1/2,y
+ - -x+1/2,z+3/4,y+1/4
+ - -z+5/4,-x+3/4,y+1/2
+ - x+5/4,-z+1/2,y+3/4
+ - z+1/2,-x+3/4,-y+1/4
+ - x+5/4,z+3/4,-y+1/2
+ - -z+5/4,x+1/2,-y+3/4
+ - -x+1/2,-z+1/2,-y
+ - y+1/2,z+1/2,x
+ - y+1,-z+5/4,-x+1/4
+ - z+3/4,y+5/4,-x+1/2
+ - -y+3/4,z+1,-x+3/4
+ - -z+1/2,-y+1,-x+1/2
+ - -y+3/4,-z+3/4,x
+ - z+3/4,-y+1/2,x+1/4
+ - -z+1,y+3/4,x+3/4
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/4,-z-1/4
+ - x-1/4,y+1/4,-z-1/2
+ - -y-1/4,x+1/2,-z-3/4
+ - -x+1/2,y+1/4,z-1/4
+ - -y-1/4,-x+1/4,z-1/2
+ - x-1/4,-y+1/2,z-3/4
+ - y+1/2,x+1/2,z
+ - -z+1/2,-x+1/2,-y
+ - x+1/2,-z+1/4,-y-1/4
+ - z-1/4,x+1/4,-y-1/2
+ - -x-1/4,z+1/2,-y-3/4
+ - -z+1/2,x+1/4,y-1/4
+ - -x-1/4,-z+1/4,y-1/2
+ - z-1/4,-x+1/2,y-3/4
+ - x+1/2,z+1/2,y
+ - -y+1/2,-z+1/2,-x
+ - -y,z-1/4,x-1/4
+ - -z+1/4,-y-1/4,x-1/2
+ - y+1/4,-z,x-3/4
+ - z+1/2,y,x-1/2
+ - y+1/4,z+1/4,-x
+ - -z+1/4,y+1/2,-x-1/4
+ - z,-y+1/4,-x-3/4
+ universal_h_m: F d -3 m :2
+- crystal_class: cubic
+ hall: " F 4d 2 3 -1ad"
+ hermann_mauguin: F d -3 c
+ ncsym:
+ - x,y,z
+ - -y+1/4,x+1/4,z+1/4
+ - -x,-y+1/2,z+1/2
+ - y+3/4,-x+1/4,z+3/4
+ - x,-y,-z
+ - y+1/4,x+1/4,-z+1/4
+ - -x,y+1/2,-z+1/2
+ - -y+3/4,-x+1/4,-z+3/4
+ - z,x,y
+ - -x+1/4,z+1/4,y+1/4
+ - -z,-x+1/2,y+1/2
+ - x+3/4,-z+1/4,y+3/4
+ - z,-x,-y
+ - x+1/4,z+1/4,-y+1/4
+ - -z,x+1/2,-y+1/2
+ - -x+3/4,-z+1/4,-y+3/4
+ - y,z,x
+ - y+1/2,-z,-x+1/2
+ - z+1/4,y+3/4,-x+3/4
+ - -y+1/2,z+1/2,-x
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y,-z,x
+ - z+1/4,-y+3/4,x+3/4
+ - -z+3/4,y+3/4,x+1/4
+ - -x+3/4,-y+1/4,-z+1/4
+ - y+1/2,-x,-z
+ - x+3/4,y-1/4,-z-1/4
+ - -y,x,-z-1/2
+ - -x+3/4,y+1/4,z+1/4
+ - -y+1/2,-x,z
+ - x+3/4,-y-1/4,z-1/4
+ - y,x,z-1/2
+ - -z+3/4,-x+1/4,-y+1/4
+ - x+1/2,-z,-y
+ - z+3/4,x-1/4,-y-1/4
+ - -x,z,-y-1/2
+ - -z+3/4,x+1/4,y+1/4
+ - -x+1/2,-z,y
+ - z+3/4,-x-1/4,y-1/4
+ - x,z,y-1/2
+ - -y+3/4,-z+1/4,-x+1/4
+ - -y+1/4,z+1/4,x-1/4
+ - -z+1/2,-y-1/2,x-1/2
+ - y+1/4,-z-1/4,x+1/4
+ - z+1/2,y,x
+ - y+3/4,z+1/4,-x+1/4
+ - -z+1/2,y-1/2,-x-1/2
+ - z,-y-1/2,-x
+ number: 228
+ schoenflies: Oh^8
+ symops:
+ - x,y,z
+ - -y+1/4,x+1/4,z+1/4
+ - -x,-y+1/2,z+1/2
+ - y+3/4,-x+1/4,z+3/4
+ - x,-y,-z
+ - y+1/4,x+1/4,-z+1/4
+ - -x,y+1/2,-z+1/2
+ - -y+3/4,-x+1/4,-z+3/4
+ - z,x,y
+ - -x+1/4,z+1/4,y+1/4
+ - -z,-x+1/2,y+1/2
+ - x+3/4,-z+1/4,y+3/4
+ - z,-x,-y
+ - x+1/4,z+1/4,-y+1/4
+ - -z,x+1/2,-y+1/2
+ - -x+3/4,-z+1/4,-y+3/4
+ - y,z,x
+ - y+1/2,-z,-x+1/2
+ - z+1/4,y+3/4,-x+3/4
+ - -y+1/2,z+1/2,-x
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y,-z,x
+ - z+1/4,-y+3/4,x+3/4
+ - -z+3/4,y+3/4,x+1/4
+ - -x+3/4,-y+1/4,-z+1/4
+ - y+1/2,-x,-z
+ - x+3/4,y-1/4,-z-1/4
+ - -y,x,-z-1/2
+ - -x+3/4,y+1/4,z+1/4
+ - -y+1/2,-x,z
+ - x+3/4,-y-1/4,z-1/4
+ - y,x,z-1/2
+ - -z+3/4,-x+1/4,-y+1/4
+ - x+1/2,-z,-y
+ - z+3/4,x-1/4,-y-1/4
+ - -x,z,-y-1/2
+ - -z+3/4,x+1/4,y+1/4
+ - -x+1/2,-z,y
+ - z+3/4,-x-1/4,y-1/4
+ - x,z,y-1/2
+ - -y+3/4,-z+1/4,-x+1/4
+ - -y+1/4,z+1/4,x-1/4
+ - -z+1/2,-y-1/2,x-1/2
+ - y+1/4,-z-1/4,x+1/4
+ - z+1/2,y,x
+ - y+3/4,z+1/4,-x+1/4
+ - -z+1/2,y-1/2,-x-1/2
+ - z,-y-1/2,-x
+ - x,y+1/2,z+1/2
+ - -y+1/4,x+3/4,z+3/4
+ - -x,-y+1,z+1
+ - y+3/4,-x+3/4,z+5/4
+ - x,-y+1/2,-z+1/2
+ - y+1/4,x+3/4,-z+3/4
+ - -x,y+1,-z+1
+ - -y+3/4,-x+3/4,-z+5/4
+ - z,x+1/2,y+1/2
+ - -x+1/4,z+3/4,y+3/4
+ - -z,-x+1,y+1
+ - x+3/4,-z+3/4,y+5/4
+ - z,-x+1/2,-y+1/2
+ - x+1/4,z+3/4,-y+3/4
+ - -z,x+1,-y+1
+ - -x+3/4,-z+3/4,-y+5/4
+ - y,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1
+ - z+1/4,y+5/4,-x+5/4
+ - -y+1/2,z+1,-x+1/2
+ - -z+1/4,-y+3/4,-x+3/4
+ - -y,-z+1/2,x+1/2
+ - z+1/4,-y+5/4,x+5/4
+ - -z+3/4,y+5/4,x+3/4
+ - -x+3/4,-y+3/4,-z+3/4
+ - y+1/2,-x+1/2,-z+1/2
+ - x+3/4,y+1/4,-z+1/4
+ - -y,x+1/2,-z
+ - -x+3/4,y+3/4,z+3/4
+ - -y+1/2,-x+1/2,z+1/2
+ - x+3/4,-y+1/4,z+1/4
+ - y,x+1/2,z
+ - -z+3/4,-x+3/4,-y+3/4
+ - x+1/2,-z+1/2,-y+1/2
+ - z+3/4,x+1/4,-y+1/4
+ - -x,z+1/2,-y
+ - -z+3/4,x+3/4,y+3/4
+ - -x+1/2,-z+1/2,y+1/2
+ - z+3/4,-x+1/4,y+1/4
+ - x,z+1/2,y
+ - -y+3/4,-z+3/4,-x+3/4
+ - -y+1/4,z+3/4,x+1/4
+ - -z+1/2,-y,x
+ - y+1/4,-z+1/4,x+3/4
+ - z+1/2,y+1/2,x+1/2
+ - y+3/4,z+3/4,-x+3/4
+ - -z+1/2,y,-x
+ - z,-y,-x+1/2
+ - x+1/2,y,z+1/2
+ - -y+3/4,x+1/4,z+3/4
+ - -x+1/2,-y+1/2,z+1
+ - y+5/4,-x+1/4,z+5/4
+ - x+1/2,-y,-z+1/2
+ - y+3/4,x+1/4,-z+3/4
+ - -x+1/2,y+1/2,-z+1
+ - -y+5/4,-x+1/4,-z+5/4
+ - z+1/2,x,y+1/2
+ - -x+3/4,z+1/4,y+3/4
+ - -z+1/2,-x+1/2,y+1
+ - x+5/4,-z+1/4,y+5/4
+ - z+1/2,-x,-y+1/2
+ - x+3/4,z+1/4,-y+3/4
+ - -z+1/2,x+1/2,-y+1
+ - -x+5/4,-z+1/4,-y+5/4
+ - y+1/2,z,x+1/2
+ - y+1,-z,-x+1
+ - z+3/4,y+3/4,-x+5/4
+ - -y+1,z+1/2,-x+1/2
+ - -z+3/4,-y+1/4,-x+3/4
+ - -y+1/2,-z,x+1/2
+ - z+3/4,-y+3/4,x+5/4
+ - -z+5/4,y+3/4,x+3/4
+ - -x+5/4,-y+1/4,-z+3/4
+ - y+1,-x,-z+1/2
+ - x+5/4,y-1/4,-z+1/4
+ - -y+1/2,x,-z
+ - -x+5/4,y+1/4,z+3/4
+ - -y+1,-x,z+1/2
+ - x+5/4,-y-1/4,z+1/4
+ - y+1/2,x,z
+ - -z+5/4,-x+1/4,-y+3/4
+ - x+1,-z,-y+1/2
+ - z+5/4,x-1/4,-y+1/4
+ - -x+1/2,z,-y
+ - -z+5/4,x+1/4,y+3/4
+ - -x+1,-z,y+1/2
+ - z+5/4,-x-1/4,y+1/4
+ - x+1/2,z,y
+ - -y+5/4,-z+1/4,-x+3/4
+ - -y+3/4,z+1/4,x+1/4
+ - -z+1,-y-1/2,x
+ - y+3/4,-z-1/4,x+3/4
+ - z+1,y,x+1/2
+ - y+5/4,z+1/4,-x+3/4
+ - -z+1,y-1/2,-x
+ - z+1/2,-y-1/2,-x+1/2
+ - x+1/2,y+1/2,z
+ - -y+3/4,x+3/4,z+1/4
+ - -x+1/2,-y+1,z+1/2
+ - y+5/4,-x+3/4,z+3/4
+ - x+1/2,-y+1/2,-z
+ - y+3/4,x+3/4,-z+1/4
+ - -x+1/2,y+1,-z+1/2
+ - -y+5/4,-x+3/4,-z+3/4
+ - z+1/2,x+1/2,y
+ - -x+3/4,z+3/4,y+1/4
+ - -z+1/2,-x+1,y+1/2
+ - x+5/4,-z+3/4,y+3/4
+ - z+1/2,-x+1/2,-y
+ - x+3/4,z+3/4,-y+1/4
+ - -z+1/2,x+1,-y+1/2
+ - -x+5/4,-z+3/4,-y+3/4
+ - y+1/2,z+1/2,x
+ - y+1,-z+1/2,-x+1/2
+ - z+3/4,y+5/4,-x+3/4
+ - -y+1,z+1,-x
+ - -z+3/4,-y+3/4,-x+1/4
+ - -y+1/2,-z+1/2,x
+ - z+3/4,-y+5/4,x+3/4
+ - -z+5/4,y+5/4,x+1/4
+ - -x+5/4,-y+3/4,-z+1/4
+ - y+1,-x+1/2,-z
+ - x+5/4,y+1/4,-z-1/4
+ - -y+1/2,x+1/2,-z-1/2
+ - -x+5/4,y+3/4,z+1/4
+ - -y+1,-x+1/2,z
+ - x+5/4,-y+1/4,z-1/4
+ - y+1/2,x+1/2,z-1/2
+ - -z+5/4,-x+3/4,-y+1/4
+ - x+1,-z+1/2,-y
+ - z+5/4,x+1/4,-y-1/4
+ - -x+1/2,z+1/2,-y-1/2
+ - -z+5/4,x+3/4,y+1/4
+ - -x+1,-z+1/2,y
+ - z+5/4,-x+1/4,y-1/4
+ - x+1/2,z+1/2,y-1/2
+ - -y+5/4,-z+3/4,-x+1/4
+ - -y+3/4,z+3/4,x-1/4
+ - -z+1,-y,x-1/2
+ - y+3/4,-z+1/4,x+1/4
+ - z+1,y+1/2,x
+ - y+5/4,z+3/4,-x+1/4
+ - -z+1,y,-x-1/2
+ - z+1/2,-y,-x
+ universal_h_m: F d -3 c :1
+- crystal_class: cubic
+ hall: -F 4ud 2vw 3
+ hermann_mauguin: F d -3 c
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/4,z+1/4
+ - -x+1/4,-y+3/4,z+1/2
+ - y+3/4,-x+1/2,z+3/4
+ - x,-y+1/4,-z+1/4
+ - y+1/4,x+1/4,-z+1/2
+ - -x+1/4,y+1/2,-z+3/4
+ - -y,-x+1/2,-z
+ - z,x,y
+ - -x+1/2,z+1/4,y+1/4
+ - -z+1/4,-x+3/4,y+1/2
+ - x+3/4,-z+1/2,y+3/4
+ - z,-x+1/4,-y+1/4
+ - x+1/4,z+1/4,-y+1/2
+ - -z+1/4,x+1/2,-y+3/4
+ - -x,-z+1/2,-y
+ - y,z,x
+ - y+1/2,-z+1/4,-x+3/4
+ - z+1/4,y+3/4,-x
+ - -y+3/4,z+1/2,-x+1/4
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y+1/4,-z+1/4,x
+ - z+1/4,-y,x+3/4
+ - -z,y+3/4,x+1/4
+ - -x,-y,-z
+ - y-1/2,-x-1/4,-z-1/4
+ - x-1/4,y-3/4,-z-1/2
+ - -y-3/4,x-1/2,-z-3/4
+ - -x,y-1/4,z-1/4
+ - -y-1/4,-x-1/4,z-1/2
+ - x-1/4,-y-1/2,z-3/4
+ - y,x-1/2,z
+ - -z,-x,-y
+ - x-1/2,-z-1/4,-y-1/4
+ - z-1/4,x-3/4,-y-1/2
+ - -x-3/4,z-1/2,-y-3/4
+ - -z,x-1/4,y-1/4
+ - -x-1/4,-z-1/4,y-1/2
+ - z-1/4,-x-1/2,y-3/4
+ - x,z-1/2,y
+ - -y,-z,-x
+ - -y-1/2,z-1/4,x-3/4
+ - -z-1/4,-y-3/4,x
+ - y-3/4,-z-1/2,x-1/4
+ - z-1/2,y-1/2,x-1/2
+ - y-1/4,z-1/4,-x
+ - -z-1/4,y,-x-3/4
+ - z,-y-3/4,-x-1/4
+ number: 228
+ schoenflies: Oh^8
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/4,z+1/4
+ - -x+1/4,-y+3/4,z+1/2
+ - y+3/4,-x+1/2,z+3/4
+ - x,-y+1/4,-z+1/4
+ - y+1/4,x+1/4,-z+1/2
+ - -x+1/4,y+1/2,-z+3/4
+ - -y,-x+1/2,-z
+ - z,x,y
+ - -x+1/2,z+1/4,y+1/4
+ - -z+1/4,-x+3/4,y+1/2
+ - x+3/4,-z+1/2,y+3/4
+ - z,-x+1/4,-y+1/4
+ - x+1/4,z+1/4,-y+1/2
+ - -z+1/4,x+1/2,-y+3/4
+ - -x,-z+1/2,-y
+ - y,z,x
+ - y+1/2,-z+1/4,-x+3/4
+ - z+1/4,y+3/4,-x
+ - -y+3/4,z+1/2,-x+1/4
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y+1/4,-z+1/4,x
+ - z+1/4,-y,x+3/4
+ - -z,y+3/4,x+1/4
+ - -x,-y,-z
+ - y-1/2,-x-1/4,-z-1/4
+ - x-1/4,y-3/4,-z-1/2
+ - -y-3/4,x-1/2,-z-3/4
+ - -x,y-1/4,z-1/4
+ - -y-1/4,-x-1/4,z-1/2
+ - x-1/4,-y-1/2,z-3/4
+ - y,x-1/2,z
+ - -z,-x,-y
+ - x-1/2,-z-1/4,-y-1/4
+ - z-1/4,x-3/4,-y-1/2
+ - -x-3/4,z-1/2,-y-3/4
+ - -z,x-1/4,y-1/4
+ - -x-1/4,-z-1/4,y-1/2
+ - z-1/4,-x-1/2,y-3/4
+ - x,z-1/2,y
+ - -y,-z,-x
+ - -y-1/2,z-1/4,x-3/4
+ - -z-1/4,-y-3/4,x
+ - y-3/4,-z-1/2,x-1/4
+ - z-1/2,y-1/2,x-1/2
+ - y-1/4,z-1/4,-x
+ - -z-1/4,y,-x-3/4
+ - z,-y-3/4,-x-1/4
+ - x,y+1/2,z+1/2
+ - -y+1/2,x+3/4,z+3/4
+ - -x+1/4,-y+5/4,z+1
+ - y+3/4,-x+1,z+5/4
+ - x,-y+3/4,-z+3/4
+ - y+1/4,x+3/4,-z+1
+ - -x+1/4,y+1,-z+5/4
+ - -y,-x+1,-z+1/2
+ - z,x+1/2,y+1/2
+ - -x+1/2,z+3/4,y+3/4
+ - -z+1/4,-x+5/4,y+1
+ - x+3/4,-z+1,y+5/4
+ - z,-x+3/4,-y+3/4
+ - x+1/4,z+3/4,-y+1
+ - -z+1/4,x+1,-y+5/4
+ - -x,-z+1,-y+1/2
+ - y,z+1/2,x+1/2
+ - y+1/2,-z+3/4,-x+5/4
+ - z+1/4,y+5/4,-x+1/2
+ - -y+3/4,z+1,-x+3/4
+ - -z+1/2,-y+1,-x+1
+ - -y+1/4,-z+3/4,x+1/2
+ - z+1/4,-y+1/2,x+5/4
+ - -z,y+5/4,x+3/4
+ - -x,-y+1/2,-z+1/2
+ - y-1/2,-x+1/4,-z+1/4
+ - x-1/4,y-1/4,-z
+ - -y-3/4,x,-z-1/4
+ - -x,y+1/4,z+1/4
+ - -y-1/4,-x+1/4,z
+ - x-1/4,-y,z-1/4
+ - y,x,z+1/2
+ - -z,-x+1/2,-y+1/2
+ - x-1/2,-z+1/4,-y+1/4
+ - z-1/4,x-1/4,-y
+ - -x-3/4,z,-y-1/4
+ - -z,x+1/4,y+1/4
+ - -x-1/4,-z+1/4,y
+ - z-1/4,-x,y-1/4
+ - x,z,y+1/2
+ - -y,-z+1/2,-x+1/2
+ - -y-1/2,z+1/4,x-1/4
+ - -z-1/4,-y-1/4,x+1/2
+ - y-3/4,-z,x+1/4
+ - z-1/2,y,x
+ - y-1/4,z+1/4,-x+1/2
+ - -z-1/4,y+1/2,-x-1/4
+ - z,-y-1/4,-x+1/4
+ - x+1/2,y,z+1/2
+ - -y+1,x+1/4,z+3/4
+ - -x+3/4,-y+3/4,z+1
+ - y+5/4,-x+1/2,z+5/4
+ - x+1/2,-y+1/4,-z+3/4
+ - y+3/4,x+1/4,-z+1
+ - -x+3/4,y+1/2,-z+5/4
+ - -y+1/2,-x+1/2,-z+1/2
+ - z+1/2,x,y+1/2
+ - -x+1,z+1/4,y+3/4
+ - -z+3/4,-x+3/4,y+1
+ - x+5/4,-z+1/2,y+5/4
+ - z+1/2,-x+1/4,-y+3/4
+ - x+3/4,z+1/4,-y+1
+ - -z+3/4,x+1/2,-y+5/4
+ - -x+1/2,-z+1/2,-y+1/2
+ - y+1/2,z,x+1/2
+ - y+1,-z+1/4,-x+5/4
+ - z+3/4,y+3/4,-x+1/2
+ - -y+5/4,z+1/2,-x+3/4
+ - -z+1,-y+1/2,-x+1
+ - -y+3/4,-z+1/4,x+1/2
+ - z+3/4,-y,x+5/4
+ - -z+1/2,y+3/4,x+3/4
+ - -x+1/2,-y,-z+1/2
+ - y,-x-1/4,-z+1/4
+ - x+1/4,y-3/4,-z
+ - -y-1/4,x-1/2,-z-1/4
+ - -x+1/2,y-1/4,z+1/4
+ - -y+1/4,-x-1/4,z
+ - x+1/4,-y-1/2,z-1/4
+ - y+1/2,x-1/2,z+1/2
+ - -z+1/2,-x,-y+1/2
+ - x,-z-1/4,-y+1/4
+ - z+1/4,x-3/4,-y
+ - -x-1/4,z-1/2,-y-1/4
+ - -z+1/2,x-1/4,y+1/4
+ - -x+1/4,-z-1/4,y
+ - z+1/4,-x-1/2,y-1/4
+ - x+1/2,z-1/2,y+1/2
+ - -y+1/2,-z,-x+1/2
+ - -y,z-1/4,x-1/4
+ - -z+1/4,-y-3/4,x+1/2
+ - y-1/4,-z-1/2,x+1/4
+ - z,y-1/2,x
+ - y+1/4,z-1/4,-x+1/2
+ - -z+1/4,y,-x-1/4
+ - z+1/2,-y-3/4,-x+1/4
+ - x+1/2,y+1/2,z
+ - -y+1,x+3/4,z+1/4
+ - -x+3/4,-y+5/4,z+1/2
+ - y+5/4,-x+1,z+3/4
+ - x+1/2,-y+3/4,-z+1/4
+ - y+3/4,x+3/4,-z+1/2
+ - -x+3/4,y+1,-z+3/4
+ - -y+1/2,-x+1,-z
+ - z+1/2,x+1/2,y
+ - -x+1,z+3/4,y+1/4
+ - -z+3/4,-x+5/4,y+1/2
+ - x+5/4,-z+1,y+3/4
+ - z+1/2,-x+3/4,-y+1/4
+ - x+3/4,z+3/4,-y+1/2
+ - -z+3/4,x+1,-y+3/4
+ - -x+1/2,-z+1,-y
+ - y+1/2,z+1/2,x
+ - y+1,-z+3/4,-x+3/4
+ - z+3/4,y+5/4,-x
+ - -y+5/4,z+1,-x+1/4
+ - -z+1,-y+1,-x+1/2
+ - -y+3/4,-z+3/4,x
+ - z+3/4,-y+1/2,x+3/4
+ - -z+1/2,y+5/4,x+1/4
+ - -x+1/2,-y+1/2,-z
+ - y,-x+1/4,-z-1/4
+ - x+1/4,y-1/4,-z-1/2
+ - -y-1/4,x,-z-3/4
+ - -x+1/2,y+1/4,z-1/4
+ - -y+1/4,-x+1/4,z-1/2
+ - x+1/4,-y,z-3/4
+ - y+1/2,x,z
+ - -z+1/2,-x+1/2,-y
+ - x,-z+1/4,-y-1/4
+ - z+1/4,x-1/4,-y-1/2
+ - -x-1/4,z,-y-3/4
+ - -z+1/2,x+1/4,y-1/4
+ - -x+1/4,-z+1/4,y-1/2
+ - z+1/4,-x,y-3/4
+ - x+1/2,z,y
+ - -y+1/2,-z+1/2,-x
+ - -y,z+1/4,x-3/4
+ - -z+1/4,-y-1/4,x
+ - y-1/4,-z,x-1/4
+ - z,y,x-1/2
+ - y+1/4,z+1/4,-x
+ - -z+1/4,y+1/2,-x-3/4
+ - z+1/2,-y-1/4,-x-1/4
+ universal_h_m: F d -3 c :2
+- crystal_class: cubic
+ hall: -I 4 2 3
+ hermann_mauguin: I m -3 m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ - -z,-x,-y
+ - x,-z,-y
+ - z,x,-y
+ - -x,z,-y
+ - -z,x,y
+ - -x,-z,y
+ - z,-x,y
+ - x,z,y
+ - -y,-z,-x
+ - -y,z,x
+ - -z,-y,x
+ - y,-z,x
+ - z,y,x
+ - y,z,-x
+ - -z,y,-x
+ - z,-y,-x
+ number: 229
+ schoenflies: Oh^9
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ - -z,-x,-y
+ - x,-z,-y
+ - z,x,-y
+ - -x,z,-y
+ - -z,x,y
+ - -x,-z,y
+ - z,-x,y
+ - x,z,y
+ - -y,-z,-x
+ - -y,z,x
+ - -z,-y,x
+ - y,-z,x
+ - z,y,x
+ - y,z,-x
+ - -z,y,-x
+ - z,-y,-x
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - z+1/2,x+1/2,y+1/2
+ - -x+1/2,z+1/2,y+1/2
+ - -z+1/2,-x+1/2,y+1/2
+ - x+1/2,-z+1/2,y+1/2
+ - z+1/2,-x+1/2,-y+1/2
+ - x+1/2,z+1/2,-y+1/2
+ - -z+1/2,x+1/2,-y+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,-x+1/2
+ - z+1/2,y+1/2,-x+1/2
+ - -y+1/2,z+1/2,-x+1/2
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x+1/2
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -z+1/2,-x+1/2,-y+1/2
+ - x+1/2,-z+1/2,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -x+1/2,z+1/2,-y+1/2
+ - -z+1/2,x+1/2,y+1/2
+ - -x+1/2,-z+1/2,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - x+1/2,z+1/2,y+1/2
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - -z+1/2,-y+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - z+1/2,y+1/2,x+1/2
+ - y+1/2,z+1/2,-x+1/2
+ - -z+1/2,y+1/2,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ universal_h_m: I m -3 m
+- crystal_class: cubic
+ hall: -I 4bd 2c 3
+ hermann_mauguin: I a -3 d
+ ncsym:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x,-y,-z+1/2
+ - y+1/4,x+3/4,-z+3/4
+ - -x+1/2,y,-z
+ - -y+1/4,-x+1/4,-z+1/4
+ - z,x,y
+ - -x+1/4,z+3/4,y+1/4
+ - -z+1/2,-x,y+1/2
+ - x+1/4,-z+1/4,y+3/4
+ - z,-x,-y+1/2
+ - x+1/4,z+3/4,-y+3/4
+ - -z+1/2,x,-y
+ - -x+1/4,-z+1/4,-y+1/4
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - z+3/4,y+1/4,-x+1/4
+ - -y,z+1/2,-x+1/2
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y+1/2,-z,x+1/2
+ - z+3/4,-y+3/4,x+1/4
+ - -z+3/4,y+1/4,x+3/4
+ - -x,-y,-z
+ - y-1/4,-x-3/4,-z-1/4
+ - x-1/2,y,-z-1/2
+ - -y-1/4,x-1/4,-z-3/4
+ - -x,y,z-1/2
+ - -y-1/4,-x-3/4,z-3/4
+ - x-1/2,-y,z
+ - y-1/4,x-1/4,z-1/4
+ - -z,-x,-y
+ - x-1/4,-z-3/4,-y-1/4
+ - z-1/2,x,-y-1/2
+ - -x-1/4,z-1/4,-y-3/4
+ - -z,x,y-1/2
+ - -x-1/4,-z-3/4,y-3/4
+ - z-1/2,-x,y
+ - x-1/4,z-1/4,y-1/4
+ - -y,-z,-x
+ - -y-1/2,z-1/2,x
+ - -z-3/4,-y-1/4,x-1/4
+ - y,-z-1/2,x-1/2
+ - z-1/4,y-1/4,x-1/4
+ - y-1/2,z,-x-1/2
+ - -z-3/4,y-3/4,-x-1/4
+ - z-3/4,-y-1/4,-x-3/4
+ number: 230
+ schoenflies: Oh^10
+ symops:
+ - x,y,z
+ - -y+1/4,x+3/4,z+1/4
+ - -x+1/2,-y,z+1/2
+ - y+1/4,-x+1/4,z+3/4
+ - x,-y,-z+1/2
+ - y+1/4,x+3/4,-z+3/4
+ - -x+1/2,y,-z
+ - -y+1/4,-x+1/4,-z+1/4
+ - z,x,y
+ - -x+1/4,z+3/4,y+1/4
+ - -z+1/2,-x,y+1/2
+ - x+1/4,-z+1/4,y+3/4
+ - z,-x,-y+1/2
+ - x+1/4,z+3/4,-y+3/4
+ - -z+1/2,x,-y
+ - -x+1/4,-z+1/4,-y+1/4
+ - y,z,x
+ - y+1/2,-z+1/2,-x
+ - z+3/4,y+1/4,-x+1/4
+ - -y,z+1/2,-x+1/2
+ - -z+1/4,-y+1/4,-x+1/4
+ - -y+1/2,-z,x+1/2
+ - z+3/4,-y+3/4,x+1/4
+ - -z+3/4,y+1/4,x+3/4
+ - -x,-y,-z
+ - y-1/4,-x-3/4,-z-1/4
+ - x-1/2,y,-z-1/2
+ - -y-1/4,x-1/4,-z-3/4
+ - -x,y,z-1/2
+ - -y-1/4,-x-3/4,z-3/4
+ - x-1/2,-y,z
+ - y-1/4,x-1/4,z-1/4
+ - -z,-x,-y
+ - x-1/4,-z-3/4,-y-1/4
+ - z-1/2,x,-y-1/2
+ - -x-1/4,z-1/4,-y-3/4
+ - -z,x,y-1/2
+ - -x-1/4,-z-3/4,y-3/4
+ - z-1/2,-x,y
+ - x-1/4,z-1/4,y-1/4
+ - -y,-z,-x
+ - -y-1/2,z-1/2,x
+ - -z-3/4,-y-1/4,x-1/4
+ - y,-z-1/2,x-1/2
+ - z-1/4,y-1/4,x-1/4
+ - y-1/2,z,-x-1/2
+ - -z-3/4,y-3/4,-x-1/4
+ - z-3/4,-y-1/4,-x-3/4
+ - x+1/2,y+1/2,z+1/2
+ - -y+3/4,x+5/4,z+3/4
+ - -x+1,-y+1/2,z+1
+ - y+3/4,-x+3/4,z+5/4
+ - x+1/2,-y+1/2,-z+1
+ - y+3/4,x+5/4,-z+5/4
+ - -x+1,y+1/2,-z+1/2
+ - -y+3/4,-x+3/4,-z+3/4
+ - z+1/2,x+1/2,y+1/2
+ - -x+3/4,z+5/4,y+3/4
+ - -z+1,-x+1/2,y+1
+ - x+3/4,-z+3/4,y+5/4
+ - z+1/2,-x+1/2,-y+1
+ - x+3/4,z+5/4,-y+5/4
+ - -z+1,x+1/2,-y+1/2
+ - -x+3/4,-z+3/4,-y+3/4
+ - y+1/2,z+1/2,x+1/2
+ - y+1,-z+1,-x+1/2
+ - z+5/4,y+3/4,-x+3/4
+ - -y+1/2,z+1,-x+1
+ - -z+3/4,-y+3/4,-x+3/4
+ - -y+1,-z+1/2,x+1
+ - z+5/4,-y+5/4,x+3/4
+ - -z+5/4,y+3/4,x+5/4
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/4,-x-1/4,-z+1/4
+ - x,y+1/2,-z
+ - -y+1/4,x+1/4,-z-1/4
+ - -x+1/2,y+1/2,z
+ - -y+1/4,-x-1/4,z-1/4
+ - x,-y+1/2,z+1/2
+ - y+1/4,x+1/4,z+1/4
+ - -z+1/2,-x+1/2,-y+1/2
+ - x+1/4,-z-1/4,-y+1/4
+ - z,x+1/2,-y
+ - -x+1/4,z+1/4,-y-1/4
+ - -z+1/2,x+1/2,y
+ - -x+1/4,-z-1/4,y-1/4
+ - z,-x+1/2,y+1/2
+ - x+1/4,z+1/4,y+1/4
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y,z,x+1/2
+ - -z-1/4,-y+1/4,x+1/4
+ - y+1/2,-z,x
+ - z+1/4,y+1/4,x+1/4
+ - y,z+1/2,-x
+ - -z-1/4,y-1/4,-x+1/4
+ - z-1/4,-y+1/4,-x-1/4
+ universal_h_m: I a -3 d
+- crystal_class: triclinic
+ hall: P 1 (1/2*x+1/2*y,1/2*x-1/2*y,-z)
+ hermann_mauguin: C 1
+ ncsym:
+ - x, y, z
+ number: 1
+ schoenflies: C1^1
+ symops:
+ - x,y,z
+ - 1/2+x,1/2+y,z
+ universal_h_m: C 1
+- crystal_class: triclinic
+ hall: -P 1 (-x,-1/2*y+1/2*z,1/2*y+1/2*z)
+ hermann_mauguin: A -1
+ ncsym:
+ - x, y, z
+ - -x, -y, -z
+ number: 2
+ schoenflies: Ci^1
+ symops:
+ - x,y,z
+ - -x,-y,-z
+ - x,1/2+y,1/2+z
+ - -x,1/2-y,1/2-z
+ universal_h_m: A -1
+- crystal_class: triclinic
+ hall: -P 1 (-1/2*x+1/2*z,-y,1/2*x+1/2*z)
+ hermann_mauguin: B -1
+ ncsym:
+ - x, y, z
+ - -x, -y, -z
+ number: 2
+ schoenflies: Ci^1
+ symops:
+ - x, y, z
+ - x+1/2, y, z+1/2
+ - -x, -y, -z
+ - -x+1/2, -y, -z+1/2
+ universal_h_m: B -1
+- crystal_class: triclinic
+ hall: -P 1 (-1/2*x+1/2*y+1/2*z,1/2*x-1/2*y+1/2*z,1/2*x+1/2*y-1/2*z)
+ hermann_mauguin: I -1
+ ncsym:
+ - x,y,z
+ - -x,-y,-z
+ number: 2
+ schoenflies: D2^4
+ symops:
+ - x,y,z
+ - 1/2-x,1/2-y,1/2-z
+ - 1/2+x,1/2+y,1/2+z
+ - -x,-y,-z
+ universal_h_m: I -1
+- crystal_class: rhombohedral
+ hall: -C 2yc (x+y-16/3*z,-x+y+16/3*z,1/3*z)
+ hermann_mauguin: R 1 2/c 1 ("rhombohedral" setting)
+ ncsym:
+ - x, y, z
+ - y, x, -z+1/2
+ - -x, -y, -z
+ - -y, -x, z-1/2
+ number: 15
+ schoenflies: C2h^6
+ symops:
+ - x, y, z
+ - y, x, -z+1/2
+ - x+2/3, y+1/3, z+1/3
+ - y+2/3, x+1/3, -z+5/6
+ - x+1/3, y+2/3, z+2/3
+ - y+1/3, x+2/3, -z+7/6
+ - -x, -y, -z
+ - -y, -x, z-1/2
+ - -x+2/3, -y+1/3, -z+1/3
+ - -y+2/3, -x+1/3, z-1/6
+ - -x+1/3, -y+2/3, -z+2/3
+ - -y+1/3, -x+2/3, z+1/6
+ universal_h_m: R 1 2/c 1
+- crystal_class: orthorhombic
+ hall: " P 2ac 2ab (x,y,z+1/4)"
+ hermann_mauguin: P 21 21 21 (origin shift x,y,z+1/4)
+ ncsym:
+ - x,y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z
+ - -x+1/2,-y,z+1/2
+ number: 19
+ schoenflies: D2^4
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z
+ - -x+1/2,-y,z+1/2
+ universal_h_m: P 21 21 21 (origin shift x,y,z+1/4)
+- crystal_class: monoclinic
+ hall: P 2yb (1/2*x,y,-1/2*x+z)
+ hermann_mauguin: B 1 21 1
+ ncsym:
+ - x, y, z
+ - -x, y+1/2, -z
+ number: 4
+ schoenflies: C2^2
+ symops:
+ - x, y, z
+ - -x, y+1/2, -z
+ - x+1/2, y, z+1/2
+ - -x+1/2, y+1/2, -z+1/2
+ universal_h_m: B 1 21 1
+- crystal_class: triclinic
+ hall: -P 1 (1/2*x+1/2*y,1/2*x-1/2*y,-z)
+ hermann_mauguin: C -1
+ ncsym:
+ - x, y, z
+ - -x, -y, -z
+ number: 2
+ schoenflies: Ci^1
+ symops:
+ - x, y, z
+ - x+1/2, y+1/2, z
+ - -x, -y, -z
+ - -x+1/2, -y+1/2, -z
+ universal_h_m: C -1
+- crystal_class: monoclinic
+ hall: -P 2yb (1/2*x,y,-1/2*x+z)
+ hermann_mauguin: B 1 21/m 1
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,-y-1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,-y-1/2,z+1/2
+ number: 11
+ schoenflies: C2h^2
+ symops:
+ - x,y,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,-y-1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,-y-1/2,z+1/2
+ universal_h_m: B 1 21/m 1
+- crystal_class: triclinic
+ hall: " P 1 (-x,-1/2*y+1/2*z,1/2*y+1/2*z)"
+ hermann_mauguin: P 1 (-a,-b+c,b+c)
+ ncsym:
+ - x,y,z
+ number: 1
+ schoenflies: C1^1
+ symops:
+ - x,y,z
+ - x,y+1/2,z+1/2
+ universal_h_m: P 1 (-a,-b+c,b+c)
+- crystal_class: triclinic
+ hall: " P 1 (-1/2*x+1/2*z,-y,1/2*x+1/2*z)"
+ hermann_mauguin: P 1 (-a+c,-b,a+c)
+ ncsym:
+ - x,y,z
+ number: 1
+ schoenflies: C1^1
+ symops:
+ - x,y,z
+ - x+1/2,y,z+1/2
+ universal_h_m: P 1 (-a+c,-b,a+c)
+- crystal_class: triclinic
+ hall: " P 1 (-1/2*x+1/2*y+1/2*z,1/2*x-1/2*y+1/2*z,1/2*x+1/2*y-1/2*z)"
+ hermann_mauguin: P 1 (b+c,a+c,a+b)
+ ncsym:
+ - x,y,z
+ number: 1
+ schoenflies: C1^1
+ symops:
+ - x,y,z
+ - x+1/2,y+1/2,z+1/2
+ universal_h_m: P 1 (b+c,a+c,a+b)
+- crystal_class: triclinic
+ hall: " P 1 (1/2*y+1/2*z,1/2*x+1/2*z,1/2*x+1/2*y)"
+ hermann_mauguin: P 1 (-a+b+c,a-b+c,a+b-c)
+ ncsym:
+ - x,y,z
+ number: 1
+ schoenflies: C1^1
+ symops:
+ - x,y,z
+ - x,y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ universal_h_m: P 1 (-a+b+c,a-b+c,a+b-c)
+- crystal_class: triclinic
+ hall: -P 1 (1/2*y+1/2*z,1/2*x+1/2*z,1/2*x+1/2*y)
+ hermann_mauguin: P -1 (-a+b+c,a-b+c,a+b-c)
+ ncsym:
+ - x,y,z
+ - -x,-y,-z
+ number: 2
+ schoenflies: Ci^1
+ symops:
+ - x,y,z
+ - -x,-y,-z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,-z
+ universal_h_m: P -1 (-a+b+c,a-b+c,a+b-c)
+- crystal_class: monoclinic
+ hall: " P 2y (1/2*x,y,-1/2*x+z)"
+ hermann_mauguin: P 1 2 1 (2*a+c,b,c)
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ number: 3
+ schoenflies: C2^1
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - x+1/2,y,z+1/2
+ - -x+1/2,y,-z+1/2
+ universal_h_m: P 1 2 1 (2*a+c,b,c)
+- crystal_class: monoclinic
+ hall: " C 2y (x-1/2*z,y,1/2*z)"
+ hermann_mauguin: C 1 2 1 (a,b,a+2*c)
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - x+1/2,y,z+1/2
+ - -x+1/2,y,-z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,-z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ universal_h_m: C 1 2 1 (a,b,a+2*c)
+- crystal_class: monoclinic
+ hall: " P 2y (-1/2*x+z,1/2*x,y)"
+ hermann_mauguin: P 1 2 1 (c,2*a+c,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ number: 3
+ schoenflies: C2^1
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ universal_h_m: P 1 2 1 (c,2*a+c,b)
+- crystal_class: monoclinic
+ hall: " C 2y (1/2*z,x-1/2*z,y)"
+ hermann_mauguin: C 1 2 1 (a+2*c,a,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ universal_h_m: C 1 2 1 (a+2*c,a,b)
+- crystal_class: monoclinic
+ hall: " C 2y (z,y+1/4,-x-1/4)"
+ hermann_mauguin: C 1 2 1 (c-1/4,b-1/4,-a)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ universal_h_m: C 1 2 1 (c-1/4,b-1/4,-a)
+- crystal_class: monoclinic
+ hall: " C 2y (x+1/4,y+1/4,z)"
+ hermann_mauguin: C 1 2 1 (a-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ universal_h_m: C 1 2 1 (a-1/4,b-1/4,c)
+- crystal_class: monoclinic
+ hall: " C 2y (x+1/4,y+1/4,-x+z-1/4)"
+ hermann_mauguin: C 1 2 1 (a+c-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ universal_h_m: C 1 2 1 (a+c-1/4,b-1/4,c)
+- crystal_class: monoclinic
+ hall: " C 2y (x-1/2*z+1/4,y+1/4,1/2*z)"
+ hermann_mauguin: C 1 2 1 (a-1/4,b-1/4,a+2*c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - x+1/2,y,z+1/2
+ - -x,y,-z+1/2
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ - x,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ universal_h_m: C 1 2 1 (a-1/4,b-1/4,a+2*c)
+- crystal_class: monoclinic
+ hall: " C 2y (z,x+1/4,y+1/4)"
+ hermann_mauguin: C 1 2 1 (c-1/4,a-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ universal_h_m: C 1 2 1 (c-1/4,a-1/4,b)
+- crystal_class: monoclinic
+ hall: " C 2y (-x-1/4,z,y+1/4)"
+ hermann_mauguin: C 1 2 1 (-a-1/4,c-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,y,z+1/2
+ - -x,-y,z+1/2
+ universal_h_m: C 1 2 1 (-a-1/4,c-1/4,b)
+- crystal_class: monoclinic
+ hall: " P 2yb (-1/2*x+z,1/2*x,y)"
+ hermann_mauguin: P 1 21 1 (c,2*a+c,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ number: 4
+ schoenflies: C2^2
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ universal_h_m: P 1 21 1 (c,2*a+c,b)
+- crystal_class: monoclinic
+ hall: " C 2y (-x+z-1/4,x+1/4,y+1/4)"
+ hermann_mauguin: C 1 2 1 (c-1/4,a+c-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ universal_h_m: C 1 2 1 (c-1/4,a+c-1/4,b)
+- crystal_class: monoclinic
+ hall: " C 2y (1/2*z,x-1/2*z+1/4,y+1/4)"
+ hermann_mauguin: C 1 2 1 (a+2*c-1/4,a-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ number: 5
+ schoenflies: C2^3
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ universal_h_m: C 1 2 1 (a+2*c-1/4,a-1/4,b)
+- crystal_class: monoclinic
+ hall: " P -2y (1/2*x,y,-1/2*x+z)"
+ hermann_mauguin: P 1 m 1 (2*a+c,b,c)
+ ncsym:
+ - x,y,z
+ - x,-y,z
+ number: 6
+ schoenflies: Cs^1
+ symops:
+ - x,y,z
+ - x,-y,z
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: P 1 m 1 (2*a+c,b,c)
+- crystal_class: monoclinic
+ hall: " C -2y (x-1/2*z,y,1/2*z)"
+ hermann_mauguin: C 1 m 1 (a,b,a+2*c)
+ ncsym:
+ - x,y,z
+ - x,-y,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,-y,z
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: C 1 m 1 (a,b,a+2*c)
+- crystal_class: monoclinic
+ hall: " P -2y (-1/2*x+z,1/2*x,y)"
+ hermann_mauguin: P 1 m 1 (c,2*a+c,b)
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ number: 6
+ schoenflies: Cs^1
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z
+ universal_h_m: P 1 m 1 (c,2*a+c,b)
+- crystal_class: monoclinic
+ hall: " C -2y (1/2*z,x-1/2*z,y)"
+ hermann_mauguin: C 1 m 1 (a+2*c,a,b)
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,y,-z
+ - x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z
+ - x,y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,y,-z+1/2
+ universal_h_m: C 1 m 1 (a+2*c,a,b)
+- crystal_class: monoclinic
+ hall: " P -2y (y,-1/2*x+z,1/2*x)"
+ hermann_mauguin: P 1 m 1 (b,c,2*a+c)
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ number: 6
+ schoenflies: Cs^1
+ symops:
+ - x,y,z
+ - -x,y,z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ universal_h_m: P 1 m 1 (b,c,2*a+c)
+- crystal_class: monoclinic
+ hall: " C -2y (y,1/2*z,x-1/2*z)"
+ hermann_mauguin: C 1 m 1 (b,a+2*c,a)
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - -x,y,z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,z
+ universal_h_m: C 1 m 1 (b,a+2*c,a)
+- crystal_class: monoclinic
+ hall: " C -2y (z,y+1/4,-x-1/4)"
+ hermann_mauguin: C 1 m 1 (c-1/4,b-1/4,-a)
+ ncsym:
+ - x,y,z
+ - x,-y,z+1/2
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: C 1 m 1 (c-1/4,b-1/4,-a)
+- crystal_class: monoclinic
+ hall: " P -2yc (1/2*x,y,-1/2*x+z)"
+ hermann_mauguin: P 1 c 1 (2*a+c,b,c)
+ ncsym:
+ - x,y,z
+ - x,-y,z+1/2
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,z
+ universal_h_m: P 1 c 1 (2*a+c,b,c)
+- crystal_class: monoclinic
+ hall: " C -2y (x-1/2*z+1/4,y+1/4,1/2*z)"
+ hermann_mauguin: C 1 m 1 (a-1/4,b-1/4,a+2*c)
+ ncsym:
+ - x,y,z
+ - x,-y,z+1/2
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,-y+1/2,z
+ - x+1/2,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: C 1 m 1 (a-1/4,b-1/4,a+2*c)
+- crystal_class: monoclinic
+ hall: " C -2y (x+1/4,y+1/4,-x+z-1/4)"
+ hermann_mauguin: C 1 m 1 (a+c-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,z+1/2
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: C 1 m 1 (a+c-1/4,b-1/4,c)
+- crystal_class: monoclinic
+ hall: " C -2y (x+1/4,y+1/4,z)"
+ hermann_mauguin: C 1 m 1 (a-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: C 1 m 1 (a-1/4,b-1/4,c)
+- crystal_class: monoclinic
+ hall: " C -2y (-x-1/4,z,y+1/4)"
+ hermann_mauguin: C 1 m 1 (-a-1/4,c-1/4,b)
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,y,-z
+ universal_h_m: C 1 m 1 (-a-1/4,c-1/4,b)
+- crystal_class: monoclinic
+ hall: " P -2yc (-1/2*x+z,1/2*x,y)"
+ hermann_mauguin: P 1 c 1 (c,2*a+c,b)
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - x+1/2,y,-z
+ - x+1/2,y+1/2,z
+ - x,y+1/2,-z
+ universal_h_m: P 1 c 1 (c,2*a+c,b)
+- crystal_class: monoclinic
+ hall: " C -2y (1/2*z,x-1/2*z+1/4,y+1/4)"
+ hermann_mauguin: C 1 m 1 (a+2*c-1/4,a-1/4,b)
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z+1/2
+ - x,y+1/2,z+1/2
+ - x,y+1/2,-z
+ - x+1/2,y,z+1/2
+ - x+1/2,y,-z
+ universal_h_m: C 1 m 1 (a+2*c-1/4,a-1/4,b)
+- crystal_class: monoclinic
+ hall: " C -2y (-x+z-1/4,x+1/4,y+1/4)"
+ hermann_mauguin: C 1 m 1 (c-1/4,a+c-1/4,b)
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: C 1 m 1 (c-1/4,a+c-1/4,b)
+- crystal_class: monoclinic
+ hall: " C -2y (z,x+1/4,y+1/4)"
+ hermann_mauguin: C 1 m 1 (c-1/4,a-1/4,b)
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - x,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - x,y+1/2,-z
+ universal_h_m: C 1 m 1 (c-1/4,a-1/4,b)
+- crystal_class: monoclinic
+ hall: " P -2yc (y,-1/2*x+z,1/2*x)"
+ hermann_mauguin: P 1 c 1 (b,c,2*a+c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,z
+ number: 7
+ schoenflies: Cs^2
+ symops:
+ - x,y,z
+ - -x,y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,y,z+1/2
+ universal_h_m: P 1 c 1 (b,c,2*a+c)
+- crystal_class: monoclinic
+ hall: " C -2y (y+1/4,-x-1/4,z)"
+ hermann_mauguin: C 1 m 1 (b-1/4,-a-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,z
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,z
+ universal_h_m: C 1 m 1 (b-1/4,-a-1/4,c)
+- crystal_class: monoclinic
+ hall: " C -2y (y+1/4,1/2*z,x-1/2*z+1/4)"
+ hermann_mauguin: C 1 m 1 (b-1/4,a+2*c-1/4,a)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,z
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,z
+ universal_h_m: C 1 m 1 (b-1/4,a+2*c-1/4,a)
+- crystal_class: monoclinic
+ hall: " C -2y (y+1/4,-x+z-1/4,x+1/4)"
+ hermann_mauguin: C 1 m 1 (b-1/4,c-1/4,a+c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,z+1/2
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ universal_h_m: C 1 m 1 (b-1/4,c-1/4,a+c)
+- crystal_class: monoclinic
+ hall: " C -2y (y+1/4,z,x+1/4)"
+ hermann_mauguin: C 1 m 1 (b-1/4,c-1/4,a)
+ ncsym:
+ - x,y,z
+ - -x,y,z+1/2
+ number: 8
+ schoenflies: Cs^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,z
+ - x+1/2,y,z+1/2
+ - -x,y,z+1/2
+ universal_h_m: C 1 m 1 (b-1/4,c-1/4,a)
+- crystal_class: monoclinic
+ hall: -P 2y (1/2*x,y,-1/2*x+z)
+ hermann_mauguin: P 1 2/m 1 (2*a+c,b,c)
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ number: 10
+ schoenflies: C2h^1
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: P 1 2/m 1 (2*a+c,b,c)
+- crystal_class: monoclinic
+ hall: -C 2y (x-1/2*z,y,1/2*z)
+ hermann_mauguin: C 1 2/m 1 (a,b,a+2*c)
+ ncsym:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,-y,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: C 1 2/m 1 (a,b,a+2*c)
+- crystal_class: monoclinic
+ hall: -P 2y (-1/2*x+z,1/2*x,y)
+ hermann_mauguin: P 1 2/m 1 (c,2*a+c,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ number: 10
+ schoenflies: C2h^1
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ universal_h_m: P 1 2/m 1 (c,2*a+c,b)
+- crystal_class: monoclinic
+ hall: -C 2y (1/2*z,x-1/2*z,y)
+ hermann_mauguin: C 1 2/m 1 (a+2*c,a,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - -x,-y,-z
+ - x,y,-z
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - x,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ universal_h_m: C 1 2/m 1 (a+2*c,a,b)
+- crystal_class: monoclinic
+ hall: -P 2y (y,-1/2*x+z,1/2*x)
+ hermann_mauguin: P 1 2/m 1 (b,c,2*a+c)
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ number: 10
+ schoenflies: C2h^1
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ - x,y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ universal_h_m: P 1 2/m 1 (b,c,2*a+c)
+- crystal_class: monoclinic
+ hall: -C 2y (y,1/2*z,x-1/2*z)
+ hermann_mauguin: C 1 2/m 1 (b,a+2*c,a)
+ ncsym:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - -x,-y,-z
+ - -x,y,z
+ - x,y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,z
+ universal_h_m: C 1 2/m 1 (b,a+2*c,a)
+- crystal_class: monoclinic
+ hall: -C 2y (z,y-1/4,-x-1/4)
+ hermann_mauguin: C 1 2/m 1 (c-1/4,b+1/4,-a)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,-y+1/2,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,-y,z+1/2
+ universal_h_m: C 1 2/m 1 (c-1/4,b+1/4,-a)
+- crystal_class: monoclinic
+ hall: -C 2y (x+1/4,y-1/4,z)
+ hermann_mauguin: C 1 2/m 1 (a-1/4,b+1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,-y+1/2,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,-y,z
+ universal_h_m: C 1 2/m 1 (a-1/4,b+1/4,c)
+- crystal_class: monoclinic
+ hall: -C 2y (x+1/4,y-1/4,-x+z-1/4)
+ hermann_mauguin: C 1 2/m 1 (a+c-1/4,b+1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,-y+1/2,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,-y,z+1/2
+ universal_h_m: C 1 2/m 1 (a+c-1/4,b+1/4,c)
+- crystal_class: monoclinic
+ hall: -C 2y (x-1/2*z+1/4,y-1/4,1/2*z)
+ hermann_mauguin: C 1 2/m 1 (a-1/4,b+1/4,a+2*c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,-y+1/2,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x,-y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,y,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,-y,z+1/2
+ universal_h_m: C 1 2/m 1 (a-1/4,b+1/4,a+2*c)
+- crystal_class: monoclinic
+ hall: -C 2y (z,x+1/4,y-1/4)
+ hermann_mauguin: C 1 2/m 1 (c-1/4,a+1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y,-z+1/2
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y+1/2,-z
+ universal_h_m: C 1 2/m 1 (c-1/4,a+1/4,b)
+- crystal_class: monoclinic
+ hall: -C 2y (-x-1/4,z,y-1/4)
+ hermann_mauguin: C 1 2/m 1 (-a-1/4,c+1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y,-z+1/2
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x+1/2,-y,-z+1/2
+ - x,y,-z+1/2
+ - x+1/2,y,z+1/2
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x+1/2,y,-z
+ universal_h_m: C 1 2/m 1 (-a-1/4,c+1/4,b)
+- crystal_class: monoclinic
+ hall: -P 2yb (-1/2*x+z,1/2*x,y)
+ hermann_mauguin: P 1 21/m 1 (c,2*a+c,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y,-z+1/2
+ number: 11
+ schoenflies: C2h^2
+ symops:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y,-z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z+1/2
+ universal_h_m: P 1 21/m 1 (c,2*a+c,b)
+- crystal_class: monoclinic
+ hall: -C 2y (-x+z-1/4,x+1/4,y-1/4)
+ hermann_mauguin: C 1 2/m 1 (c-1/4,a+c+1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y,-z+1/2
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ universal_h_m: C 1 2/m 1 (c-1/4,a+c+1/4,b)
+- crystal_class: monoclinic
+ hall: -C 2y (1/2*z,x-1/2*z+1/4,y-1/4)
+ hermann_mauguin: C 1 2/m 1 (a+2*c-1/4,a+1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y,-z+1/2
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y,z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - x,y+1/2,-z
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y,-z
+ universal_h_m: C 1 2/m 1 (a+2*c-1/4,a+1/4,b)
+- crystal_class: monoclinic
+ hall: -P 2yb (y,-1/2*x+z,1/2*x)
+ hermann_mauguin: P 1 21/m 1 (b,c,2*a+c)
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x+1/2,y,z
+ number: 11
+ schoenflies: C2h^2
+ symops:
+ - x,y,z
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x+1/2,y,z
+ - x,y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ universal_h_m: P 1 21/m 1 (b,c,2*a+c)
+- crystal_class: monoclinic
+ hall: -C 2y (y-1/4,z,x+1/4)
+ hermann_mauguin: C 1 2/m 1 (b-1/4,c+1/4,a)
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x+1/2,y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - x,-y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - -x+1/2,y,z
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x,y,z+1/2
+ universal_h_m: C 1 2/m 1 (b-1/4,c+1/4,a)
+- crystal_class: monoclinic
+ hall: -C 2y (y-1/4,-x-1/4,z)
+ hermann_mauguin: C 1 2/m 1 (b-1/4,-a+1/4,c)
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x+1/2,y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - -x+1/2,y,z
+ - x+1/2,y+1/2,z
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x,y+1/2,z
+ universal_h_m: C 1 2/m 1 (b-1/4,-a+1/4,c)
+- crystal_class: monoclinic
+ hall: -C 2y (y-1/4,-x+z-1/4,x+1/4)
+ hermann_mauguin: C 1 2/m 1 (b-1/4,c+1/4,a+c)
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x+1/2,y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y,z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x,y+1/2,z+1/2
+ universal_h_m: C 1 2/m 1 (b-1/4,c+1/4,a+c)
+- crystal_class: monoclinic
+ hall: -C 2y (y-1/4,1/2*z,x-1/2*z+1/4)
+ hermann_mauguin: C 1 2/m 1 (b-1/4,a+2*c+1/4,a)
+ ncsym:
+ - x,y,z
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x+1/2,y,z
+ number: 12
+ schoenflies: C2h^3
+ symops:
+ - x,y,z
+ - x,-y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - -x+1/2,y,z
+ - x,y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - -x,y,z+1/2
+ - x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x,y+1/2,z
+ universal_h_m: C 1 2/m 1 (b-1/4,a+2*c+1/4,a)
+- crystal_class: monoclinic
+ hall: -P 2yc (1/2*x,y,-1/2*x+z)
+ hermann_mauguin: P 1 2/c 1 (2*a+c,b,c)
+ ncsym:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,z+1/2
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,-y,z
+ universal_h_m: P 1 2/c 1 (2*a+c,b,c)
+- crystal_class: monoclinic
+ hall: -P 2yc (-1/2*x+z,1/2*x,y)
+ hermann_mauguin: P 1 2/c 1 (c,2*a+c,b)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x,-y,-z
+ - x+1/2,y,-z
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x,-y,-z
+ - x+1/2,y,-z
+ - x+1/2,y+1/2,z
+ - -x,-y+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z
+ universal_h_m: P 1 2/c 1 (c,2*a+c,b)
+- crystal_class: monoclinic
+ hall: -P 2yc (y,-1/2*x+z,1/2*x)
+ hermann_mauguin: P 1 2/c 1 (b,c,2*a+c)
+ ncsym:
+ - x,y,z
+ - x,-y+1/2,-z
+ - -x,-y,-z
+ - -x,y+1/2,z
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z
+ - -x,-y,-z
+ - -x,y+1/2,z
+ - x,y+1/2,z+1/2
+ - x,-y,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x,y,z+1/2
+ universal_h_m: P 1 2/c 1 (b,c,2*a+c)
+- crystal_class: monoclinic
+ hall: -P 2ybc (1/2*x,y,-1/2*x+z)
+ hermann_mauguin: P 1 21/c 1 (2*a+c,b,c)
+ ncsym:
+ - x,y,z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,-y+1/2,z+1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,-y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,-y+1/2,z
+ universal_h_m: P 1 21/c 1 (2*a+c,b,c)
+- crystal_class: monoclinic
+ hall: -P 2ybc (-1/2*x+z,1/2*x,y)
+ hermann_mauguin: P 1 21/c 1 (c,2*a+c,b)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x,-y,-z
+ - x+1/2,y,-z+1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x,-y,-z
+ - x+1/2,y,-z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z+1/2
+ universal_h_m: P 1 21/c 1 (c,2*a+c,b)
+- crystal_class: monoclinic
+ hall: -P 2ybc (y,-1/2*x+z,1/2*x)
+ hermann_mauguin: P 1 21/c 1 (b,c,2*a+c)
+ ncsym:
+ - x,y,z
+ - x+1/2,-y+1/2,-z
+ - -x,-y,-z
+ - -x+1/2,y+1/2,z
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,-z
+ - -x,-y,-z
+ - -x+1/2,y+1/2,z
+ - x,y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ universal_h_m: P 1 21/c 1 (b,c,2*a+c)
+- crystal_class: orthorhombic
+ hall: " A 2 -2 (x,y-1/4,z+1/4)"
+ hermann_mauguin: A m m 2 (a,b+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z
+ - x,-y,z+1/2
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,y,z
+ - x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: A m m 2 (a,b+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2b (y-1/4,-x,z+1/4)"
+ hermann_mauguin: A e m 2 (b,-a+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z
+ - x,-y,z+1/2
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,z
+ - -x,y,z
+ - x+1/2,y,z+1/2
+ - -x,-y,z+1/2
+ - x,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ universal_h_m: A e m 2 (b,-a+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " I 2 -2a (x+1/4,y+1/4,z-1/4)"
+ hermann_mauguin: I m a 2 (a-1/4,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z
+ - x,-y,z+1/2
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x,y,z
+ - x+1/2,-y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: I m a 2 (a-1/4,b-1/4,c+1/4)
+- crystal_class: orthorhombic
+ hall: " F 2 -2 (x,y+1/4,z+1/4)"
+ hermann_mauguin: F m m 2 (a,b-1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z
+ - x,-y,z+1/2
+ number: 42
+ schoenflies: C2v^18
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,y,z
+ - x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: F m m 2 (a,b-1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2b (x,y-1/4,z+1/4)"
+ hermann_mauguin: A e m 2 (a,b+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x,-y,z
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,y+1/2,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: A e m 2 (a,b+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2 (y-1/4,-x,z+1/4)"
+ hermann_mauguin: A m m 2 (b,-a+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x,-y,z
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,y,z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,-y,z+1/2
+ - -x,y,z+1/2
+ universal_h_m: A m m 2 (b,-a+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " I 2 -2a (y+1/4,-x-1/4,z-1/4)"
+ hermann_mauguin: I m a 2 (b-1/4,-a-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x,-y,z
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -x,y,z+1/2
+ universal_h_m: I m a 2 (b-1/4,-a-1/4,c+1/4)
+- crystal_class: orthorhombic
+ hall: " F 2 -2 (x-1/4,y,z-1/4)"
+ hermann_mauguin: F m m 2 (a+1/4,b,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x,-y,z
+ number: 42
+ schoenflies: C2v^18
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x+1/2,y,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x,-y,z+1/2
+ - -x,y,z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y+1/2,z
+ - -x,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: F m m 2 (a+1/4,b,c+1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2b (-x,z+1/4,y-1/4)"
+ hermann_mauguin: A e m 2 (-a,c+1/4,b-1/4)
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z
+ - -x,y+1/2,-z
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,y,z+1/2
+ - x,y,-z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - -x,y+1/2,z
+ - x,y+1/2,-z+1/2
+ universal_h_m: A e m 2 (-a,c+1/4,b-1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2 (y-1/4,z+1/4,x)"
+ hermann_mauguin: A m m 2 (b,c+1/4,a-1/4)
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z
+ - -x,y+1/2,-z
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - x,y,-z
+ - -x+1/2,y,z
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z
+ universal_h_m: A m m 2 (b,c+1/4,a-1/4)
+- crystal_class: orthorhombic
+ hall: " I 2 -2a (y+1/4,z-1/4,x+1/4)"
+ hermann_mauguin: I m a 2 (b-1/4,c-1/4,a+1/4)
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z
+ - -x,y+1/2,-z
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - x,y,-z
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z
+ universal_h_m: I m a 2 (b-1/4,c-1/4,a+1/4)
+- crystal_class: orthorhombic
+ hall: " F 2 -2 (y+1/4,z+1/4,x)"
+ hermann_mauguin: F m m 2 (b,c-1/4,a-1/4)
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z
+ - -x,y+1/2,-z
+ number: 42
+ schoenflies: C2v^18
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - x,y,-z
+ - -x+1/2,y,z
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x,y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x,y,z+1/2
+ universal_h_m: F m m 2 (b,c-1/4,a-1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2 (-x,z+1/4,y-1/4)"
+ hermann_mauguin: A m m 2 (-a,c+1/4,b-1/4)
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y,z
+ - -x,y+1/2,-z
+ number: 38
+ schoenflies: C2v^14
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x,y,z
+ - x,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x,y+1/2,-z
+ universal_h_m: A m m 2 (-a,c+1/4,b-1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2b (y-1/4,z+1/4,x)"
+ hermann_mauguin: A e m 2 (b,c+1/4,a-1/4)
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y,z
+ - -x,y+1/2,-z
+ number: 39
+ schoenflies: C2v^15
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - x+1/2,y,-z
+ - -x,y,z
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ - x,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ universal_h_m: A e m 2 (b,c+1/4,a-1/4)
+- crystal_class: orthorhombic
+ hall: " I 2 -2a (-x-1/4,z-1/4,y+1/4)"
+ hermann_mauguin: I m a 2 (-a-1/4,c-1/4,b+1/4)
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y,z
+ - -x,y+1/2,-z
+ number: 46
+ schoenflies: C2v^22
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x,y,z
+ - x+1/2,y,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x,y+1/2,-z
+ universal_h_m: I m a 2 (-a-1/4,c-1/4,b+1/4)
+- crystal_class: orthorhombic
+ hall: " F 2 -2 (y,z-1/4,x-1/4)"
+ hermann_mauguin: F m m 2 (b+1/4,c,a+1/4)
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y,z
+ - -x,y+1/2,-z
+ number: 42
+ schoenflies: C2v^18
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - x,y,-z+1/2
+ - -x,y,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - x,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,y,-z
+ - x+1/2,y,-z
+ - -x+1/2,y,z+1/2
+ universal_h_m: F m m 2 (b+1/4,c,a+1/4)
+- crystal_class: orthorhombic
+ hall: " F 2 -2 (x-1/4,y-1/4,z+1/2)"
+ hermann_mauguin: F m m 2 (a+1/4,b+1/4,c+1/2)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ number: 42
+ schoenflies: C2v^18
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,y,z
+ - x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: F m m 2 (a+1/4,b+1/4,c+1/2)
+- crystal_class: orthorhombic
+ hall: " F 2 -2 (y-1/4,z+1/2,x-1/4)"
+ hermann_mauguin: F m m 2 (b+1/4,c+1/4,a+1/2)
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - -x,y,-z
+ number: 42
+ schoenflies: C2v^18
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y,z
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z
+ - x,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x,y,-z
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ universal_h_m: F m m 2 (b+1/4,c+1/4,a+1/2)
+- crystal_class: orthorhombic
+ hall: " C 2 -2 (x+1/4,y+1/4,z)"
+ hermann_mauguin: C m m 2 (a-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ number: 35
+ schoenflies: C2v^11
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,y,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - -x,-y,z
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: C m m 2 (a-1/4,b-1/4,c)
+- crystal_class: orthorhombic
+ hall: " C 2 -2 (y+1/4,z,x+1/4)"
+ hermann_mauguin: C m m 2 (b-1/4,c-1/4,a)
+ ncsym:
+ - x,y,z
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - -x,y,-z
+ number: 35
+ schoenflies: C2v^11
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y,z
+ - x+1/2,y,z+1/2
+ - -x,y,-z
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ universal_h_m: C m m 2 (b-1/4,c-1/4,a)
+- crystal_class: orthorhombic
+ hall: " A 2 -2ab (x,y-1/4,z+1/4)"
+ hermann_mauguin: A e a 2 (a,b+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: A e a 2 (a,b+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " C 2c -2 (y+1/4,-x-1/4,z)"
+ hermann_mauguin: C m c 21 (b-1/4,-a-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,z
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y,z+1/2
+ - x+1/2,-y,z
+ - -x,y+1/2,z+1/2
+ universal_h_m: C m c 21 (b-1/4,-a-1/4,c)
+- crystal_class: orthorhombic
+ hall: " I 2 -2c (x+1/4,y+1/4,z-1/4)"
+ hermann_mauguin: I b a 2 (a-1/4,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z
+ number: 45
+ schoenflies: C2v^21
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,y,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: I b a 2 (a-1/4,b-1/4,c+1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2ab (y-1/4,-x,z+1/4)"
+ hermann_mauguin: A e a 2 (b,-a+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y+1/2,z
+ - x,-y+1/2,z+1/2
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y+1/2,z
+ - -x,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,-y,z+1/2
+ - x,-y+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ universal_h_m: A e a 2 (b,-a+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " C 2c -2 (x+1/4,y+1/4,z)"
+ hermann_mauguin: C m c 21 (a-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x,y+1/2,z
+ - x,-y+1/2,z+1/2
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,y,z
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y,z+1/2
+ - -x,y+1/2,z
+ - x+1/2,-y,z+1/2
+ universal_h_m: C m c 21 (a-1/4,b-1/4,c)
+- crystal_class: orthorhombic
+ hall: " C 2c -2 (-x-1/4,z,y+1/4)"
+ hermann_mauguin: C m c 21 (-a-1/4,c-1/4,b)
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - -x,y,z+1/2
+ - -x,y+1/2,-z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y,z
+ - x,y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - -x,y+1/2,-z
+ - -x,y,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: C m c 21 (-a-1/4,c-1/4,b)
+- crystal_class: orthorhombic
+ hall: " A 2 -2ab (y-1/4,z+1/4,x)"
+ hermann_mauguin: A e a 2 (b,c+1/4,a-1/4)
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - -x,y,z+1/2
+ - -x,y+1/2,-z
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - x+1/2,y,-z+1/2
+ - -x,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ - x,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ universal_h_m: A e a 2 (b,c+1/4,a-1/4)
+- crystal_class: orthorhombic
+ hall: " I 2 -2c (y+1/4,z-1/4,x+1/4)"
+ hermann_mauguin: I b a 2 (b-1/4,c-1/4,a+1/4)
+ ncsym:
+ - x,y,z
+ - x,y+1/2,-z+1/2
+ - -x,y,z+1/2
+ - -x,y+1/2,-z
+ number: 45
+ schoenflies: C2v^21
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ universal_h_m: I b a 2 (b-1/4,c-1/4,a+1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2ab (-x,z+1/4,y-1/4)"
+ hermann_mauguin: A e a 2 (-a,c+1/4,b-1/4)
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ number: 41
+ schoenflies: C2v^17
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,y,-z
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,y+1/2,-z+1/2
+ universal_h_m: A e a 2 (-a,c+1/4,b-1/4)
+- crystal_class: orthorhombic
+ hall: " C 2c -2 (y+1/4,z,x+1/4)"
+ hermann_mauguin: C m c 21 (b-1/4,c-1/4,a)
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,y+1/2,-z
+ - x+1/2,y,-z
+ - -x,y+1/2,z+1/2
+ universal_h_m: C m c 21 (b-1/4,c-1/4,a)
+- crystal_class: orthorhombic
+ hall: " C 2 -2c (x+1/4,y+1/4,z)"
+ hermann_mauguin: C c c 2 (a-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ number: 37
+ schoenflies: C2v^13
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,y,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y,z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: C c c 2 (a-1/4,b-1/4,c)
+- crystal_class: orthorhombic
+ hall: " C 2 -2c (y+1/4,z,x+1/4)"
+ hermann_mauguin: C c c 2 (b-1/4,c-1/4,a)
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -x,y,-z
+ number: 37
+ schoenflies: C2v^13
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ universal_h_m: C c c 2 (b-1/4,c-1/4,a)
+- crystal_class: orthorhombic
+ hall: " A 2 -2a (x-1/4,y-1/4,z+1/4)"
+ hermann_mauguin: A m a 2 (a+1/4,b+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - -x,y,z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: A m a 2 (a+1/4,b+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " C 2c -2 (x,y-1/4,z)"
+ hermann_mauguin: C m c 21 (a,b+1/4,c)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - -x,y,z
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y,z+1/2
+ universal_h_m: C m c 21 (a,b+1/4,c)
+- crystal_class: orthorhombic
+ hall: " I 2 -2 (x,y+1/4,z)"
+ hermann_mauguin: I m m 2 (a,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ number: 44
+ schoenflies: C2v^20
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x,y,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: I m m 2 (a,b-1/4,c)
+- crystal_class: orthorhombic
+ hall: " A 2 -2a (y-1/4,-x+1/4,z+1/4)"
+ hermann_mauguin: A m a 2 (b+1/4,-a+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ - -x,y+1/2,z+1/2
+ universal_h_m: A m a 2 (b+1/4,-a+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " C 2c -2 (y-1/4,-x,z)"
+ hermann_mauguin: C m c 21 (b,-a+1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y,z
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ - -x,y+1/2,z+1/2
+ universal_h_m: C m c 21 (b,-a+1/4,c)
+- crystal_class: orthorhombic
+ hall: " I 2 -2 (x+1/4,y,z-1/4)"
+ hermann_mauguin: I m m 2 (a-1/4,b,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ number: 44
+ schoenflies: C2v^20
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - -x+1/2,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I m m 2 (a-1/4,b,c+1/4)
+- crystal_class: orthorhombic
+ hall: " C 2c -2 (y-1/4,z,x)"
+ hermann_mauguin: C m c 21 (b,c+1/4,a)
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ - x,y,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,y+1/2,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x,y+1/2,z+1/2
+ universal_h_m: C m c 21 (b,c+1/4,a)
+- crystal_class: orthorhombic
+ hall: " A 2 -2a (y-1/4,z+1/4,x-1/4)"
+ hermann_mauguin: A m a 2 (b+1/4,c+1/4,a-1/4)
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - x,y,-z
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ universal_h_m: A m a 2 (b+1/4,c+1/4,a-1/4)
+- crystal_class: orthorhombic
+ hall: " I 2 -2 (y+1/4,z,x)"
+ hermann_mauguin: I m m 2 (b,c-1/4,a)
+ ncsym:
+ - x,y,z
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ number: 44
+ schoenflies: C2v^20
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - x,y,-z
+ - -x+1/2,y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ universal_h_m: I m m 2 (b,c-1/4,a)
+- crystal_class: orthorhombic
+ hall: " A 2 -2a (-x+1/4,z+1/4,y-1/4)"
+ hermann_mauguin: A m a 2 (-a+1/4,c+1/4,b-1/4)
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - -x+1/2,y+1/2,-z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x,y,z
+ - x+1/2,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: A m a 2 (-a+1/4,c+1/4,b-1/4)
+- crystal_class: orthorhombic
+ hall: " C 2c -2 (-x,z,y-1/4)"
+ hermann_mauguin: C m c 21 (-a,c+1/4,b)
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - -x+1/2,y+1/2,-z
+ number: 36
+ schoenflies: C2v^12
+ symops:
+ - x,y,z
+ - -x,y+1/2,-z+1/2
+ - -x,y,z
+ - x,y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: C m c 21 (-a,c+1/4,b)
+- crystal_class: orthorhombic
+ hall: " I 2 -2 (y,z-1/4,x+1/4)"
+ hermann_mauguin: I m m 2 (b-1/4,c,a+1/4)
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - -x+1/2,y+1/2,-z
+ number: 44
+ schoenflies: C2v^20
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - x,y,-z+1/2
+ - -x,y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ universal_h_m: I m m 2 (b-1/4,c,a+1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2a (x,y-1/4,z+1/4)"
+ hermann_mauguin: A m a 2 (a,b+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - -x+1/2,y,z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: A m a 2 (a,b+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2a (y-1/4,-x,z+1/4)"
+ hermann_mauguin: A m a 2 (b,-a+1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z+1/2
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ universal_h_m: A m a 2 (b,-a+1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2a (y-1/4,z+1/4,x)"
+ hermann_mauguin: A m a 2 (b,c+1/4,a-1/4)
+ ncsym:
+ - x,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -x,y+1/2,-z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z
+ - x,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,y+1/2,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ universal_h_m: A m a 2 (b,c+1/4,a-1/4)
+- crystal_class: orthorhombic
+ hall: " A 2 -2a (-x,z+1/4,y-1/4)"
+ hermann_mauguin: A m a 2 (-a,c+1/4,b-1/4)
+ ncsym:
+ - x,y,z
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ number: 40
+ schoenflies: C2v^16
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - -x+1/2,y,z
+ - x+1/2,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: A m a 2 (-a,c+1/4,b-1/4)
+- crystal_class: orthorhombic
+ hall: -C 2 2c (z+1/4,x,y)
+ hermann_mauguin: C c c m (c,a,b-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ number: 66
+ schoenflies: D2h^20
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,z
+ - -x+1/2,-y,-z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ - x+1/2,y,-z
+ - x,y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ universal_h_m: C c c m (c,a,b-1/4)
+- crystal_class: orthorhombic
+ hall: -C 2 2c (y,z+1/4,x)
+ hermann_mauguin: C c c m (b,c,a-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ number: 66
+ schoenflies: D2h^20
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,-y+1/2,-z
+ - x,-y+1/2,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ universal_h_m: C c c m (b,c,a-1/4)
+- crystal_class: orthorhombic
+ hall: -C 2 2c (x,y,z+1/4)
+ hermann_mauguin: C c c m (a,b,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ number: 66
+ schoenflies: D2h^20
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z+1/2
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: C c c m (a,b,c-1/4)
+- crystal_class: orthorhombic
+ hall: -F 2 2 (x+1/4,y+1/4,z+1/4)
+ hermann_mauguin: F m m m (a-1/4,b-1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ number: 69
+ schoenflies: D2h^23
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y,z
+ - x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y,-z
+ - x,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y+1/2,-z
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: F m m m (a-1/4,b-1/4,c-1/4)
+- crystal_class: orthorhombic
+ hall: -C 2 2c (z,x+1/4,y+1/4)
+ hermann_mauguin: C c c m (c-1/4,a-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 66
+ schoenflies: D2h^20
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,z
+ - -x,-y+1/2,-z+1/2
+ - -x,y,z
+ - x+1/2,-y+1/2,z
+ - x+1/2,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - x,-y,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y,z+1/2
+ - -x,-y,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: C c c m (c-1/4,a-1/4,b)
+- crystal_class: orthorhombic
+ hall: -C 2 2c (y+1/4,z,x+1/4)
+ hermann_mauguin: C c c m (b-1/4,c-1/4,a)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 66
+ schoenflies: D2h^20
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,-y,z
+ - x,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,y,-z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ universal_h_m: C c c m (b-1/4,c-1/4,a)
+- crystal_class: orthorhombic
+ hall: -C 2 2c (x+1/4,y+1/4,z)
+ hermann_mauguin: C c c m (a-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 66
+ schoenflies: D2h^20
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x,y,-z
+ - -x+1/2,y,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: C c c m (a-1/4,b-1/4,c)
+- crystal_class: orthorhombic
+ hall: -I 2 2 (x-1/4,y+1/4,z-1/4)
+ hermann_mauguin: I m m m (a+1/4,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 71
+ schoenflies: D2h^25
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: I m m m (a+1/4,b-1/4,c+1/4)
+- crystal_class: orthorhombic
+ hall: -F 2 2 (x-1/4,y-1/4,z)
+ hermann_mauguin: F m m m (a+1/4,b+1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y,-z
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ number: 69
+ schoenflies: D2h^23
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x,y,-z
+ - -x+1/2,y,z
+ - x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: F m m m (a+1/4,b+1/4,c)
+- crystal_class: orthorhombic
+ hall: -F 2 2 (x+1/2,y-1/4,z-1/4)
+ hermann_mauguin: F m m m (a+1/2,b+1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x+1/2,y,-z
+ - -x,y,z
+ - x+1/2,-y,z
+ number: 69
+ schoenflies: D2h^23
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -x,y,z
+ - x,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y,-z
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: F m m m (a+1/2,b+1/4,c+1/4)
+- crystal_class: orthorhombic
+ hall: -F 2 2 (x+1/4,y+1/2,z-1/4)
+ hermann_mauguin: F m m m (a-1/4,b+1/2,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - x,-y,z
+ number: 69
+ schoenflies: D2h^23
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y,z
+ - x,-y,z
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: F m m m (a-1/4,b+1/2,c+1/4)
+- crystal_class: orthorhombic
+ hall: -I 2 2c (x,y,z-1/4)
+ hermann_mauguin: I b a m (a,b,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ number: 72
+ schoenflies: D2h^26
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,-z+1/2
+ - x,y,-z+1/2
+ - -x,y,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: I b a m (a,b,c+1/4)
+- crystal_class: orthorhombic
+ hall: -C 2 2 (x+1/4,y+1/4,z)
+ hermann_mauguin: C m m m (a-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ number: 65
+ schoenflies: D2h^19
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z
+ - x,y,-z
+ - -x+1/2,y,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - -x,-y,z
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: C m m m (a-1/4,b-1/4,c)
+- crystal_class: orthorhombic
+ hall: -I 2 2c (x-1/4,y+1/4,z-1/4)
+ hermann_mauguin: I b a m (a+1/4,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ number: 72
+ schoenflies: D2h^26
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ universal_h_m: I b a m (a+1/4,b-1/4,c+1/4)
+- crystal_class: orthorhombic
+ hall: -I 2 2c (z-1/4,x,y)
+ hermann_mauguin: I b a m (c,a,b+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ number: 72
+ schoenflies: D2h^26
+ symops:
+ - x,y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x,-y,z
+ - -x+1/2,-y,-z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ - x+1/2,y,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ universal_h_m: I b a m (c,a,b+1/4)
+- crystal_class: orthorhombic
+ hall: -C 2 2 (z,x+1/4,y+1/4)
+ hermann_mauguin: C m m m (c-1/4,a-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z+1/2
+ number: 65
+ schoenflies: D2h^19
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y+1/2,z
+ - -x,-y+1/2,-z+1/2
+ - -x,y,z
+ - x,-y+1/2,z
+ - x,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z
+ - -x,-y,z+1/2
+ - -x,-y,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z+1/2
+ - x,y+1/2,-z
+ universal_h_m: C m m m (c-1/4,a-1/4,b)
+- crystal_class: orthorhombic
+ hall: -I 2 2c (z-1/4,x-1/4,y+1/4)
+ hermann_mauguin: I b a m (c+1/4,a-1/4,b+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z+1/2
+ number: 72
+ schoenflies: D2h^26
+ symops:
+ - x,y,z
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y+1/2,z
+ - -x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y,z
+ - x+1/2,-y+1/2,z
+ - x+1/2,y,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y,z+1/2
+ - -x,-y,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z+1/2
+ - x,y+1/2,-z
+ universal_h_m: I b a m (c+1/4,a-1/4,b+1/4)
+- crystal_class: orthorhombic
+ hall: -I 2 2c (y,z-1/4,x)
+ hermann_mauguin: I b a m (b,c,a+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 72
+ schoenflies: D2h^26
+ symops:
+ - x,y,z
+ - -x,y,-z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,-y+1/2,-z
+ - x,-y+1/2,z
+ - x,y+1/2,-z
+ - -x,y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z+1/2
+ universal_h_m: I b a m (b,c,a+1/4)
+- crystal_class: orthorhombic
+ hall: -C 2 2 (y+1/4,z,x+1/4)
+ hermann_mauguin: C m m m (b-1/4,c-1/4,a)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 65
+ schoenflies: D2h^19
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,z
+ - x,-y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,-y,z
+ - x,y,-z+1/2
+ - -x+1/2,y,z
+ - x+1/2,y,z+1/2
+ - -x,y,-z
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x,-y,-z
+ - x+1/2,-y,z+1/2
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ universal_h_m: C m m m (b-1/4,c-1/4,a)
+- crystal_class: orthorhombic
+ hall: -I 2 2c (y+1/4,z-1/4,x-1/4)
+ hermann_mauguin: I b a m (b+1/4,c-1/4,a+1/4)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 72
+ schoenflies: D2h^26
+ symops:
+ - x,y,z
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,z
+ - x,-y,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,-y+1/2,z
+ - x,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,-y,z+1/2
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ universal_h_m: I b a m (b+1/4,c-1/4,a+1/4)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (y+1/4,z,x+1/4)
+ hermann_mauguin: C m c m (b-1/4,c-1/4,a)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x,-y+1/2,z
+ - x,y,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y,-z
+ - -x,y+1/2,z+1/2
+ universal_h_m: C m c m (b-1/4,c-1/4,a)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (z,y+1/4,-x-1/4)
+ hermann_mauguin: C m c m (c-1/4,b-1/4,-a)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,-y+1/2,z
+ - -x+1/2,y,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x+1/2,y,z
+ - x,y,-z+1/2
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - x+1/2,-y,-z
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x,y+1/2,-z
+ - x+1/2,-y,z+1/2
+ universal_h_m: C m c m (c-1/4,b-1/4,-a)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (x+1/4,y+1/4,z)
+ hermann_mauguin: C m c m (a-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z
+ - x+1/2,-y,z+1/2
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x,y,-z+1/2
+ - -x+1/2,y,z
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z
+ - x+1/2,-y,z+1/2
+ universal_h_m: C m c m (a-1/4,b-1/4,c)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (-x-1/4,z,y+1/4)
+ hermann_mauguin: C m c m (-a-1/4,c-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z+1/2
+ - x,-y,-z+1/2
+ - -x+1/2,-y+1/2,z
+ - -x+1/2,-y,-z+1/2
+ - x,-y+1/2,z
+ - -x+1/2,y,z
+ - x,y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - -x,y+1/2,-z
+ - x+1/2,-y,-z
+ - -x,-y+1/2,z+1/2
+ - -x,-y,-z
+ - x+1/2,-y+1/2,z+1/2
+ - -x,y,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: C m c m (-a-1/4,c-1/4,b)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (z,x+1/4,y+1/4)
+ hermann_mauguin: C m c m (c-1/4,a-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y,z+1/2
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x+1/2,-y+1/2,z
+ - -x,-y+1/2,-z+1/2
+ - -x+1/2,y,z
+ - x,-y+1/2,z
+ - x+1/2,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z
+ - -x+1/2,-y,z+1/2
+ - -x,-y,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: C m c m (c-1/4,a-1/4,b)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (y+1/4,-x-1/4,z)
+ hermann_mauguin: C m c m (b-1/4,-a-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/2,y,-z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x,y,-z+1/2
+ - x,-y+1/2,z
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y,z+1/2
+ - -x,y+1/2,-z
+ - x+1/2,-y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z+1/2
+ - x+1/2,-y,z
+ - -x,y+1/2,z+1/2
+ universal_h_m: C m c m (b-1/4,-a-1/4,c)
+- crystal_class: orthorhombic
+ hall: -C 2ac 2 (z,x+1/4,y+1/4)
+ hermann_mauguin: C m c e (c-1/4,a-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y,-z
+ - -x+1/2,y,z+1/2
+ - x,-y,z+1/2
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x+1/2,-y,z
+ - -x,-y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,-z+1/2
+ - x,y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y+1/2,-z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x,-y,-z
+ - -x+1/2,y,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y,-z
+ universal_h_m: C m c e (c-1/4,a-1/4,b)
+- crystal_class: orthorhombic
+ hall: -C 2ac 2 (-x-1/4,z,y+1/4)
+ hermann_mauguin: C m c e (-a-1/4,c-1/4,b)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y+1/2,-z
+ - -x,y,z+1/2
+ - x,-y+1/2,z+1/2
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x,y+1/2,-z+1/2
+ - x,-y,-z+1/2
+ - -x,-y+1/2,z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,-y+1/2,z
+ - -x+1/2,y,z
+ - x+1/2,y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,y+1/2,-z
+ - x+1/2,-y,-z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x,-y,-z
+ - x,-y+1/2,z+1/2
+ - -x,y,z+1/2
+ - x,y+1/2,-z
+ universal_h_m: C m c e (-a-1/4,c-1/4,b)
+- crystal_class: orthorhombic
+ hall: -C 2ac 2 (y+1/4,z,x+1/4)
+ hermann_mauguin: C m c e (b-1/4,c-1/4,a)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,-z
+ - x+1/2,y,-z
+ - -x,y+1/2,z
+ - x+1/2,-y+1/2,z
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y,z
+ - x,-y+1/2,-z
+ - -x+1/2,-y,-z+1/2
+ - x,-y+1/2,z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,-y,-z
+ - x+1/2,-y+1/2,z
+ - x+1/2,y,-z
+ - -x,y+1/2,z
+ universal_h_m: C m c e (b-1/4,c-1/4,a)
+- crystal_class: orthorhombic
+ hall: -C 2ac 2 (y+1/4,-x-1/4,z)
+ hermann_mauguin: C m c e (b-1/4,-a-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z+1/2
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x+1/2,y,-z+1/2
+ - -x,y,z+1/2
+ - x+1/2,-y,z
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,y,-z
+ - x,-y,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x,y+1/2,-z+1/2
+ - x,-y+1/2,z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,-z
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,-y,-z
+ - x+1/2,y,-z+1/2
+ - x+1/2,-y,z
+ - -x,y,z+1/2
+ universal_h_m: C m c e (b-1/4,-a-1/4,c)
+- crystal_class: orthorhombic
+ hall: -C 2ac 2 (x+1/4,y+1/4,z)
+ hermann_mauguin: C m c e (a-1/4,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z
+ - x,-y,z+1/2
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z
+ - -x,y,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,z
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,y+1/2,-z+1/2
+ - -x,y+1/2,z
+ - x,-y,z+1/2
+ universal_h_m: C m c e (a-1/4,b-1/4,c)
+- crystal_class: orthorhombic
+ hall: -C 2ac 2 (z,y+1/4,-x-1/4)
+ hermann_mauguin: C m c e (c-1/4,b-1/4,-a)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y,-z
+ - -x,-y,-z
+ - x,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y,z
+ number: 64
+ schoenflies: D2h^18
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,-z
+ - -x,-y+1/2,z
+ - -x+1/2,y,-z
+ - -x,-y+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - x,y,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x,y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,-y,z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x,-y,-z
+ - -x+1/2,y+1/2,z
+ - x,y+1/2,-z
+ - x+1/2,-y,z
+ universal_h_m: C m c e (c-1/4,b-1/4,-a)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (z-1/4,x+1/2,y+1/4)
+ hermann_mauguin: C m c m (c+1/2,a-1/4,b+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - x,-y,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x,-y,z
+ - -x+1/2,-y,-z+1/2
+ - -x,y,z
+ - x,-y,z
+ - x+1/2,y,-z+1/2
+ - x,y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x,-y+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: C m c m (c+1/2,a-1/4,b+1/4)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (-x+1/2,z-1/4,y+1/4)
+ hermann_mauguin: C m c m (-a+1/2,c-1/4,b+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - x,-y,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x,y+1/2,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,-y,z
+ - -x,-y+1/2,-z+1/2
+ - x,-y,z
+ - -x,y,z
+ - x,y+1/2,-z+1/2
+ - x+1/2,y,z+1/2
+ - -x+1/2,y+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,-y,z+1/2
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,-z
+ universal_h_m: C m c m (-a+1/2,c-1/4,b+1/4)
+- crystal_class: orthorhombic
+ hall: -I 2 2 (x,y,z+1/4)
+ hermann_mauguin: I m m m (a,b,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x,y,z
+ - x,-y,z
+ number: 71
+ schoenflies: D2h^25
+ symops:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z+1/2
+ - x,y,-z+1/2
+ - -x,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I m m m (a,b,c-1/4)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (y+1/4,z-1/4,x+1/2)
+ hermann_mauguin: C m c m (b+1/2,c-1/4,a+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,z
+ - x,-y,-z
+ - -x+1/2,-y+1/2,-z
+ - x,-y,z
+ - x,y,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,y,z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y,-z+1/2
+ - -x,y+1/2,z+1/2
+ universal_h_m: C m c m (b+1/2,c-1/4,a+1/4)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (y+1/4,-x+1/2,z-1/4)
+ hermann_mauguin: C m c m (b+1/2,-a-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - -x+1/2,y,-z+1/2
+ - x,-y,-z
+ - -x+1/2,-y,-z+1/2
+ - x,y,-z
+ - x,-y,z
+ - -x+1/2,y,z+1/2
+ - x+1/2,y+1/2,z
+ - -x,-y+1/2,z+1/2
+ - -x,y+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z
+ - x+1/2,-y+1/2,z
+ - -x,y+1/2,z+1/2
+ universal_h_m: C m c m (b+1/2,-a-1/4,c+1/4)
+- crystal_class: orthorhombic
+ hall: -I 2 2 (x+1/4,y,z)
+ hermann_mauguin: I m m m (a-1/4,b,c)
+ ncsym:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z
+ - -x,y+1/2,z+1/2
+ - x,-y,z
+ number: 71
+ schoenflies: D2h^25
+ symops:
+ - x,y,z
+ - -x+1/2,-y,z
+ - x,-y,-z
+ - -x+1/2,y,-z
+ - -x+1/2,-y,-z
+ - x,y,-z
+ - -x+1/2,y,z
+ - x,-y,z
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: I m m m (a-1/4,b,c)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (z-1/4,y+1/4,-x+1/2)
+ hermann_mauguin: C m c m (c+1/2,b-1/4,-a+1/4)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x,y,-z
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,-y+1/2,z
+ - -x,y,-z
+ - -x+1/2,-y+1/2,-z
+ - -x,y,z
+ - x,y,-z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - -x,y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: C m c m (c+1/2,b-1/4,-a+1/4)
+- crystal_class: orthorhombic
+ hall: -C 2c 2 (x+1/2,y+1/4,z-1/4)
+ hermann_mauguin: C m c m (a+1/2,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x,y,-z
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ number: 63
+ schoenflies: D2h^17
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - -x,y,-z
+ - -x,-y+1/2,-z+1/2
+ - x,y,-z
+ - -x,y,z
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y,z+1/2
+ universal_h_m: C m c m (a+1/2,b-1/4,c+1/4)
+- crystal_class: orthorhombic
+ hall: -I 2 2 (x,y+1/4,z)
+ hermann_mauguin: I m m m (a,b-1/4,c)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x,y,-z
+ - -x+1/2,-y,-z+1/2
+ - x,y,-z
+ - -x,y,z
+ - x+1/2,-y,z+1/2
+ number: 71
+ schoenflies: D2h^25
+ symops:
+ - x,y,z
+ - -x,-y+1/2,z
+ - x,-y+1/2,-z
+ - -x,y,-z
+ - -x,-y+1/2,-z
+ - x,y,-z
+ - -x,y,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x+1/2,-y,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: I m m m (a,b-1/4,c)
+- crystal_class: tetragonal
+ hall: -I 4 (1/2*x+1/2*y,-1/2*x+1/2*y,z)
+ hermann_mauguin: I 4/m (a+b,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ number: 87
+ schoenflies: C4h^5
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - x+1/2,y,z+1/2
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - -x+1/2,-y,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - x,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x+1/2,z+1/2
+ - -x,-y+1/2,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -y,x+1/2,-z+1/2
+ universal_h_m: I 4/m (a+b,-a+b,c)
+- crystal_class: tetragonal
+ hall: -P 4 (1/2*x+1/2*y,-1/2*x+1/2*y,z)
+ hermann_mauguin: P 4/m (a+b,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ number: 83
+ schoenflies: C4h^1
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ universal_h_m: P 4/m (a+b,-a+b,c)
+- crystal_class: tetragonal
+ hall: -I 4 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y+1/4,z)
+ hermann_mauguin: I 4/m (a+b+1/2,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ number: 87
+ schoenflies: C4h^5
+ symops:
+ - x,y,z
+ - -y,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x,-z
+ - x,y,-z
+ - -y,x+1/2,-z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x,z
+ - -x,-y,z
+ - y,-x+1/2,z
+ - -x,-y,-z
+ - y,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x,-z
+ - x+1/2,y,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - -x,-y+1/2,-z+1/2
+ - y,-x,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - x,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,-y,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -y,x,-z+1/2
+ universal_h_m: I 4/m (a+b+1/2,-a+b,c)
+- crystal_class: tetragonal
+ hall: -P 4c (1/2*x+1/2*y,-1/2*x+1/2*y,z)
+ hermann_mauguin: P 42/m (a+b,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ number: 84
+ schoenflies: C4h^2
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z+1/2
+ universal_h_m: P 42/m (a+b,-a+b,c)
+- crystal_class: tetragonal
+ hall: -I 4 (x+1/2,y,z)
+ hermann_mauguin: I 4/m (a+1/2,b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ number: 87
+ schoenflies: C4h^5
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - -x,-y,-z
+ - y+1/2,-x+1/2,-z
+ - x,y,-z
+ - -y+1/2,x+1/2,-z
+ - x+1/2,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z+1/2
+ universal_h_m: I 4/m (a+1/2,b,c)
+- crystal_class: tetragonal
+ hall: -I 4 (x+1/2,y,z+1/4)
+ hermann_mauguin: I 4/m (a+1/2,b,c-1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ number: 87
+ schoenflies: C4h^5
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - -x,-y,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ universal_h_m: I 4/m (a+1/2,b,c-1/4)
+- crystal_class: tetragonal
+ hall: -P 4 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y-1/4,z)
+ hermann_mauguin: P 4/m (a+b,-a+b+1/2,c)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ number: 83
+ schoenflies: C4h^1
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - y,-x+1/2,-z
+ - x,y,-z
+ - -y+1/2,x,-z
+ - x+1/2,y+1/2,z
+ - -y,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x,z
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ universal_h_m: P 4/m (a+b,-a+b+1/2,c)
+- crystal_class: tetragonal
+ hall: -I 4 (x+1/4,y+1/4,z-1/4)
+ hermann_mauguin: I 4/m (a-1/4,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ number: 87
+ schoenflies: C4h^5
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ universal_h_m: I 4/m (a-1/4,b-1/4,c+1/4)
+- crystal_class: tetragonal
+ hall: -I 4 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y+1/4,z+1/4)
+ hermann_mauguin: I 4/m (a+b+1/2,-a+b,c-1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ number: 87
+ schoenflies: C4h^5
+ symops:
+ - x,y,z
+ - -y,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x,y,-z+1/2
+ - -y,x+1/2,-z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x,z
+ - -x,-y,z
+ - y,-x+1/2,z
+ - -x,-y,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - x+1/2,y,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - -x,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y,-z
+ - -y+1/2,x+1/2,-z
+ - x,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,-y,-z
+ - y+1/2,-x+1/2,-z
+ - x,y+1/2,-z
+ - -y,x,-z
+ universal_h_m: I 4/m (a+b+1/2,-a+b,c-1/4)
+- crystal_class: tetragonal
+ hall: -P 4c (1/2*x+1/2*y,-1/2*x+1/2*y,z+1/4)
+ hermann_mauguin: P 42/m (a+b,-a+b,c-1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ number: 84
+ schoenflies: C4h^2
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -x,-y,-z+1/2
+ - y,-x,-z
+ - x,y,-z+1/2
+ - -y,x,-z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z
+ universal_h_m: P 42/m (a+b,-a+b,c-1/4)
+- crystal_class: tetragonal
+ hall: -P 4c (1/2*x+1/2*y-1/4,-1/2*x+1/2*y-1/4,z)
+ hermann_mauguin: P 42/m (a+b,-a+b+1/2,c)
+ ncsym:
+ - x,y,z
+ - -y,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z+1/2
+ - -x,-y,-z
+ - y,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x,-z+1/2
+ number: 84
+ schoenflies: C4h^2
+ symops:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y,-x+1/2,-z+1/2
+ - x,y,-z
+ - -y+1/2,x,-z+1/2
+ - x+1/2,y+1/2,z
+ - -y,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x,z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z+1/2
+ universal_h_m: P 42/m (a+b,-a+b+1/2,c)
+- crystal_class: tetragonal
+ hall: -I 4 2 (1/2*x+1/2*y,-1/2*x+1/2*y,z)
+ hermann_mauguin: I 4/m m m (a+b,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ number: 139
+ schoenflies: D4h^17
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -y,-x,-z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - y,x,z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - -y+1/2,-x+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - y+1/2,x+1/2,z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - x+1/2,y,z+1/2
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - -y+1/2,-x,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - y+1/2,x,z+1/2
+ - -x+1/2,y,z+1/2
+ - -y+1/2,-x,z+1/2
+ - x+1/2,-y,z+1/2
+ - x,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x+1/2,z+1/2
+ - -y,-x+1/2,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - y,x+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -y,x+1/2,-z+1/2
+ - y,x+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - -y,-x+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ universal_h_m: I 4/m m m (a+b,-a+b,c)
+- crystal_class: tetragonal
+ hall: -P 4 2 (1/2*x+1/2*y,-1/2*x+1/2*y,z)
+ hermann_mauguin: P 4/m m m (a+b,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - y,x,z
+ number: 123
+ schoenflies: D4h^1
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -y,-x,-z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - y,x,z
+ - -x,y,z
+ - -y,-x,z
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - -y+1/2,-x+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - y+1/2,x+1/2,z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ universal_h_m: P 4/m m m (a+b,-a+b,c)
+- crystal_class: tetragonal
+ hall: -I 4 2c (1/2*x+1/2*y,-1/2*x+1/2*y,z)
+ hermann_mauguin: I 4/m c m (a+b,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y,-z+1/2
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - y,x,z+1/2
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -y,-x,-z+1/2
+ - x,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - y,x,z+1/2
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - -y+1/2,-x+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - y+1/2,x+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - -y+1/2,-x,-z
+ - x+1/2,-y,-z
+ - y+1/2,x,-z
+ - -x+1/2,y,-z
+ - -x+1/2,-y,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - y+1/2,x,z
+ - -x+1/2,y,z
+ - -y+1/2,-x,z
+ - x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x+1/2,z+1/2
+ - -y,-x+1/2,-z
+ - x,-y+1/2,-z
+ - y,x+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y+1/2,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -y,x+1/2,-z+1/2
+ - y,x+1/2,z
+ - -x,y+1/2,z
+ - -y,-x+1/2,z
+ - x,-y+1/2,z
+ universal_h_m: I 4/m c m (a+b,-a+b,c)
+- crystal_class: tetragonal
+ hall: -P 4 2c (1/2*x+1/2*y,-1/2*x+1/2*y,z)
+ hermann_mauguin: P 4/m c c (a+b,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y,-z+1/2
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - y,x,z+1/2
+ number: 124
+ schoenflies: D4h^2
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -y,-x,-z+1/2
+ - x,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z
+ - x,y,-z
+ - -y,x,-z
+ - y,x,z+1/2
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - -y+1/2,-x+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - y+1/2,x+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: P 4/m c c (a+b,-a+b,c)
+- crystal_class: tetragonal
+ hall: -I 4 2c (x,y,z-1/4)
+ hermann_mauguin: I 4/m c m (a,b,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x,-y,-z+1/2
+ - y,-x,-z+1/2
+ - x,y,-z+1/2
+ - -y,x,-z+1/2
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - y,x,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ universal_h_m: I 4/m c m (a,b,c+1/4)
+- crystal_class: tetragonal
+ hall: -I 4 2 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y+1/4,z)
+ hermann_mauguin: I 4/m m m (a+b+1/2,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z
+ - -y,-x,z
+ - x+1/2,-y,z
+ - y+1/2,x+1/2,z
+ number: 139
+ schoenflies: D4h^17
+ symops:
+ - x,y,z
+ - -y,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z
+ - -y,-x,-z
+ - x,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x,-z
+ - x,y,-z
+ - -y,x+1/2,-z
+ - y+1/2,x+1/2,z
+ - -x+1/2,y,z
+ - -y,-x,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x,z
+ - -x,-y,z
+ - y,-x+1/2,z
+ - -y+1/2,-x+1/2,-z
+ - x+1/2,-y,-z
+ - y,x,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - y,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x,-z
+ - y,x,z
+ - -x,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y,z
+ - x+1/2,y,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - -y+1/2,-x,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - y,-x,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - y,x+1/2,z+1/2
+ - -x,y,z+1/2
+ - -y+1/2,-x,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - -y,-x+1/2,-z+1/2
+ - x,-y,-z+1/2
+ - y+1/2,x,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -y,x,-z+1/2
+ - y+1/2,x,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x+1/2,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: I 4/m m m (a+b+1/2,-a+b,c)
+- crystal_class: tetragonal
+ hall: -P 4 2 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y-1/4,z)
+ hermann_mauguin: P 4/m m m (a+b,-a+b+1/2,c)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z
+ - -y,-x,z
+ - x+1/2,-y,z
+ - y+1/2,x+1/2,z
+ number: 123
+ schoenflies: D4h^1
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - -y+1/2,-x+1/2,-z
+ - x,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z
+ - y,-x+1/2,-z
+ - x,y,-z
+ - -y+1/2,x,-z
+ - y,x,z
+ - -x+1/2,y,z
+ - -y+1/2,-x+1/2,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - -y,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x,z
+ - -y,-x,-z
+ - x+1/2,-y,-z
+ - y+1/2,x+1/2,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - y+1/2,x+1/2,z
+ - -x,y+1/2,z
+ - -y,-x,z
+ - x+1/2,-y,z
+ universal_h_m: P 4/m m m (a+b,-a+b+1/2,c)
+- crystal_class: tetragonal
+ hall: -I 4 2c (x+1/4,y+1/4,z-1/4)
+ hermann_mauguin: I 4/m c m (a-1/4,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z
+ - -y,-x,z
+ - x+1/2,-y,z
+ - y+1/2,x+1/2,z
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - y,x,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z
+ - -y,-x,z
+ - x+1/2,-y,z
+ - y+1/2,x+1/2,z
+ universal_h_m: I 4/m c m (a-1/4,b-1/4,c+1/4)
+- crystal_class: tetragonal
+ hall: -I 4 2c (1/2*x+1/2*y,-1/2*x+1/2*y,z-1/4)
+ hermann_mauguin: I 4/m c m (a+b,-a+b,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -y,-x,-z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -x,-y,-z+1/2
+ - y,-x,-z+1/2
+ - x,y,-z+1/2
+ - -y,x,-z+1/2
+ - y,x,z+1/2
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - -y+1/2,-x+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y,z+1/2
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - -y+1/2,-x,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y,-z
+ - -y+1/2,x,-z
+ - y+1/2,x,z
+ - -x+1/2,y,z
+ - -y+1/2,-x,z
+ - x+1/2,-y,z
+ - x,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x+1/2,z+1/2
+ - -y,-x+1/2,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - y,x+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y+1/2,-z
+ - y,-x+1/2,-z
+ - x,y+1/2,-z
+ - -y,x+1/2,-z
+ - y,x+1/2,z
+ - -x,y+1/2,z
+ - -y,-x+1/2,z
+ - x,-y+1/2,z
+ universal_h_m: I 4/m c m (a+b,-a+b,c+1/4)
+- crystal_class: tetragonal
+ hall: -P 4 2c (1/2*x+1/2*y,-1/2*x+1/2*y,z-1/4)
+ hermann_mauguin: P 4/m c c (a+b,-a+b,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 124
+ schoenflies: D4h^2
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -y,-x,-z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -x,-y,-z+1/2
+ - y,-x,-z+1/2
+ - x,y,-z+1/2
+ - -y,x,-z+1/2
+ - y,x,z+1/2
+ - -x,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - -y+1/2,-x+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: P 4/m c c (a+b,-a+b,c+1/4)
+- crystal_class: tetragonal
+ hall: -I 4 2c (1/2*x+1/2*y-1/4,-1/2*x+1/2*y+1/4,z)
+ hermann_mauguin: I 4/m c m (a+b+1/2,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z
+ - -y,-x,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x,-z
+ - x,y,-z
+ - -y,x+1/2,-z
+ - y+1/2,x+1/2,z+1/2
+ - -x+1/2,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x,z
+ - -x,-y,z
+ - y,-x+1/2,z
+ - -y+1/2,-x+1/2,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - y,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x,-z
+ - y,x,z+1/2
+ - -x,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - -y+1/2,-x,-z
+ - x+1/2,-y+1/2,-z
+ - y,x+1/2,-z
+ - -x,y,-z
+ - -x,-y+1/2,-z+1/2
+ - y,-x,-z+1/2
+ - x+1/2,y,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - y,x+1/2,z
+ - -x,y,z
+ - -y+1/2,-x,z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - -y,-x+1/2,-z
+ - x,-y,-z
+ - y+1/2,x,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - -y,x,-z+1/2
+ - y+1/2,x,z
+ - -x+1/2,y+1/2,z
+ - -y,-x+1/2,z
+ - x,-y,z
+ universal_h_m: I 4/m c m (a+b+1/2,-a+b,c)
+- crystal_class: tetragonal
+ hall: -P 4 2c (1/2*x+1/2*y-1/4,-1/2*x+1/2*y-1/4,z)
+ hermann_mauguin: P 4/m c c (a+b,-a+b+1/2,c)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 124
+ schoenflies: D4h^2
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - -y+1/2,-x+1/2,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y,-x+1/2,-z
+ - x,y,-z
+ - -y+1/2,x,-z
+ - y,x,z+1/2
+ - -x+1/2,y,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -y,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x,z
+ - -y,-x,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - y+1/2,x+1/2,z+1/2
+ - -x,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y,z+1/2
+ universal_h_m: P 4/m c c (a+b,-a+b+1/2,c)
+- crystal_class: tetragonal
+ hall: -I 4 2 (x+1/4,y+1/4,z-1/4)
+ hermann_mauguin: I 4/m m m (a-1/4,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 139
+ schoenflies: D4h^17
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - -x+1/2,y,z
+ - -y+1/2,-x+1/2,z
+ - x,-y+1/2,z
+ - y,x,z
+ - x+1/2,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - x+1/2,-y,-z
+ - y+1/2,x+1/2,-z
+ - -x,y+1/2,-z
+ - -y,-x,-z
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: I 4/m m m (a-1/4,b-1/4,c+1/4)
+- crystal_class: tetragonal
+ hall: -I 4 2 (x+1/2,y,z+1/4)
+ hermann_mauguin: I 4/m m m (a+1/2,b,c-1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ - -x,y,z
+ - -y+1/2,-x+1/2,z
+ - x,-y,z
+ - y+1/2,x+1/2,z
+ number: 139
+ schoenflies: D4h^17
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x,-y,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x,y,z
+ - -y+1/2,-x+1/2,z
+ - x,-y,z
+ - y+1/2,x+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - x+1/2,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z+1/2
+ universal_h_m: I 4/m m m (a+1/2,b,c-1/4)
+- crystal_class: tetragonal
+ hall: -I 4 2c (x+1/2,y,z-1/4)
+ hermann_mauguin: I 4/m c m (a+1/2,b,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ - -x,y,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x,-y,-z
+ - y+1/2,x+1/2,-z
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x,y,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x,-z
+ - -x+1/2,y+1/2,z
+ - -y,-x,z
+ - x+1/2,-y+1/2,z
+ - y,x,z
+ universal_h_m: I 4/m c m (a+1/2,b,c+1/4)
+- crystal_class: tetragonal
+ hall: -P 4c 2c (1/2*x+1/2*y,-1/2*x+1/2*y,z)
+ hermann_mauguin: P 42/m c m (a+b,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z
+ - y,x,-z+1/2
+ - -x,y,-z
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ - -x,y,z
+ - -y,-x,z+1/2
+ - x,-y,z
+ - y,x,z+1/2
+ number: 132
+ schoenflies: D4h^10
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -y,-x,-z+1/2
+ - x,-y,-z
+ - y,x,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ - y,x,z+1/2
+ - -x,y,z
+ - -y,-x,z+1/2
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ universal_h_m: P 42/m c m (a+b,-a+b,c)
+- crystal_class: tetragonal
+ hall: -I 4 2 (x+1/2,y,z)
+ hermann_mauguin: I 4/m m m (a+1/2,b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z
+ - y,x,-z+1/2
+ - -x,y,-z
+ - -y,-x,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ - -x,y,z
+ - -y,-x,z+1/2
+ - x,-y,z
+ - y,x,z+1/2
+ number: 139
+ schoenflies: D4h^17
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x,-y,-z
+ - y+1/2,x+1/2,-z
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y+1/2,-x+1/2,-z
+ - x,y,-z
+ - -y+1/2,x+1/2,-z
+ - -x,y,z
+ - -y+1/2,-x+1/2,z
+ - x,-y,z
+ - y+1/2,x+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -y,-x,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z+1/2
+ universal_h_m: I 4/m m m (a+1/2,b,c)
+- crystal_class: tetragonal
+ hall: -P 4c 2 (1/2*x+1/2*y,-1/2*x+1/2*y,z)
+ hermann_mauguin: P 42/m m c (a+b,-a+b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z+1/2
+ - y,x,-z
+ - -x,y,-z+1/2
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ - -x,y,z+1/2
+ - -y,-x,z
+ - x,-y,z+1/2
+ - y,x,z
+ number: 131
+ schoenflies: D4h^9
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -y,-x,-z
+ - x,-y,-z+1/2
+ - y,x,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ - y,x,z
+ - -x,y,z+1/2
+ - -y,-x,z
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x+1/2,-z+1/2
+ - y+1/2,x+1/2,z
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: P 42/m m c (a+b,-a+b,c)
+- crystal_class: tetragonal
+ hall: -I 4 2c (x+1/2,y,z)
+ hermann_mauguin: I 4/m c m (a+1/2,b,c)
+ ncsym:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - x,-y,-z+1/2
+ - y,x,-z
+ - -x,y,-z+1/2
+ - -y,-x,-z
+ - -x,-y,-z
+ - y,-x,-z+1/2
+ - x,y,-z
+ - -y,x,-z+1/2
+ - -x,y,z+1/2
+ - -y,-x,z
+ - x,-y,z+1/2
+ - y,x,z
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y+1/2,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x+1/2,z
+ - x,-y,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y+1/2,-x+1/2,-z
+ - x,y,-z
+ - -y+1/2,x+1/2,-z
+ - -x,y,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - x+1/2,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z+1/2
+ - -x+1/2,y+1/2,z
+ - -y,-x,z
+ - x+1/2,-y+1/2,z
+ - y,x,z
+ universal_h_m: I 4/m c m (a+1/2,b,c)
+- crystal_class: tetragonal
+ hall: -I 4 2c (1/2*x+1/2*y-1/4,-1/2*x+1/2*y+1/4,z-1/4)
+ hermann_mauguin: I 4/m c m (a+b+1/2,-a+b,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x,y,-z+1/2
+ - -y+1/2,-x+1/2,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z
+ - -y,-x,z+1/2
+ - x+1/2,-y+1/2,z
+ - y,x,z+1/2
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z
+ - -y,-x,-z
+ - x,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x,y,-z+1/2
+ - -y,x+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -x+1/2,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x,z
+ - -x,-y,z
+ - y,-x+1/2,z
+ - -y+1/2,-x+1/2,-z
+ - x+1/2,-y,-z
+ - y,x,-z
+ - -x,y+1/2,-z
+ - -x,-y,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - y,x,z+1/2
+ - -x,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - -y+1/2,-x,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - y,x+1/2,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y,-z
+ - -y+1/2,x+1/2,-z
+ - y,x+1/2,z
+ - -x,y,z
+ - -y+1/2,-x,z
+ - x+1/2,-y+1/2,z
+ - x,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - -y,-x+1/2,-z+1/2
+ - x,-y,-z+1/2
+ - y+1/2,x,-z+1/2
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y,-z
+ - y+1/2,-x+1/2,-z
+ - x,y+1/2,-z
+ - -y,x,-z
+ - y+1/2,x,z
+ - -x+1/2,y+1/2,z
+ - -y,-x+1/2,z
+ - x,-y,z
+ universal_h_m: I 4/m c m (a+b+1/2,-a+b,c+1/4)
+- crystal_class: tetragonal
+ hall: -P 4c 2c (1/2*x+1/2*y,-1/2*x+1/2*y,z-1/4)
+ hermann_mauguin: P 42/m c m (a+b,-a+b,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x,y,-z+1/2
+ - -y+1/2,-x+1/2,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z
+ - -y,-x,z+1/2
+ - x+1/2,-y+1/2,z
+ - y,x,z+1/2
+ number: 132
+ schoenflies: D4h^10
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -y,-x,-z
+ - x,-y,-z+1/2
+ - y,x,-z
+ - -x,y,-z+1/2
+ - -x,-y,-z+1/2
+ - y,-x,-z
+ - x,y,-z+1/2
+ - -y,x,-z
+ - y,x,z+1/2
+ - -x,y,z
+ - -y,-x,z+1/2
+ - x,-y,z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z
+ - x+1/2,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z
+ - y+1/2,x+1/2,z+1/2
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z
+ universal_h_m: P 42/m c m (a+b,-a+b,c+1/4)
+- crystal_class: tetragonal
+ hall: -P 4c 2c (1/2*x+1/2*y-1/4,-1/2*x+1/2*y-1/4,z)
+ hermann_mauguin: P 42/m c m (a+b,-a+b+1/2,c)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z
+ - y,x,-z+1/2
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z+1/2
+ - -x,y+1/2,z
+ - -y,-x,z+1/2
+ - x+1/2,-y,z
+ - y+1/2,x+1/2,z+1/2
+ number: 132
+ schoenflies: D4h^10
+ symops:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - x,-y+1/2,-z
+ - y,x,-z+1/2
+ - -x+1/2,y,-z
+ - -x+1/2,-y+1/2,-z
+ - y,-x+1/2,-z+1/2
+ - x,y,-z
+ - -y+1/2,x,-z+1/2
+ - y,x,z+1/2
+ - -x+1/2,y,z
+ - -y+1/2,-x+1/2,z+1/2
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - -y,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x,z+1/2
+ - -y,-x,-z+1/2
+ - x+1/2,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y+1/2,-z
+ - -x,-y,-z
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -x,y+1/2,z
+ - -y,-x,z+1/2
+ - x+1/2,-y,z
+ universal_h_m: P 42/m c m (a+b,-a+b+1/2,c)
+- crystal_class: tetragonal
+ hall: -I 4 2c (x-1/4,y+1/4,z-1/4)
+ hermann_mauguin: I 4/m c m (a+1/4,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z
+ - y,x,-z+1/2
+ - -x+1/2,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z+1/2
+ - -x,y+1/2,z
+ - -y,-x,z+1/2
+ - x+1/2,-y,z
+ - y+1/2,x+1/2,z+1/2
+ number: 140
+ schoenflies: D4h^18
+ symops:
+ - x,y,z
+ - -y,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z
+ - x,-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+1/2,y,-z
+ - -y,-x,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x,y,-z+1/2
+ - -y,x+1/2,-z+1/2
+ - -x+1/2,y,z+1/2
+ - -y,-x,z+1/2
+ - x,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x,z+1/2
+ - -x,-y,z+1/2
+ - y,-x+1/2,z+1/2
+ - x+1/2,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x,-y,-z
+ - y,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x,-z
+ - -x,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y,z
+ - y,x,z
+ universal_h_m: I 4/m c m (a+1/4,b-1/4,c+1/4)
+- crystal_class: tetragonal
+ hall: -I 4 2 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y+1/4,z+1/4)
+ hermann_mauguin: I 4/m m m (a+b+1/2,-a+b,c-1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z
+ number: 139
+ schoenflies: D4h^17
+ symops:
+ - x,y,z
+ - -y,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z
+ - -y,-x,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x,y,-z+1/2
+ - -y,x+1/2,-z+1/2
+ - y+1/2,x+1/2,z
+ - -x+1/2,y,z
+ - -y,-x,z
+ - x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - -y+1/2,x,z
+ - -x,-y,z
+ - y,-x+1/2,z
+ - -y+1/2,-x+1/2,-z+1/2
+ - x+1/2,-y,-z+1/2
+ - y,x,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - y,x,z
+ - -x,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y,z
+ - x+1/2,y,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x,z+1/2
+ - -y+1/2,-x,-z
+ - x+1/2,-y+1/2,-z
+ - y,x+1/2,-z
+ - -x,y,-z
+ - -x,-y+1/2,-z
+ - y,-x,-z
+ - x+1/2,y,-z
+ - -y+1/2,x+1/2,-z
+ - y,x+1/2,z+1/2
+ - -x,y,z+1/2
+ - -y+1/2,-x,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x,y+1/2,z+1/2
+ - -y,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - -y,-x+1/2,-z
+ - x,-y,-z
+ - y+1/2,x,-z
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y,-z
+ - y+1/2,-x+1/2,-z
+ - x,y+1/2,-z
+ - -y,x,-z
+ - y+1/2,x,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x+1/2,z+1/2
+ - x,-y,z+1/2
+ universal_h_m: I 4/m m m (a+b+1/2,-a+b,c-1/4)
+- crystal_class: tetragonal
+ hall: -P 4c 2 (1/2*x+1/2*y,-1/2*x+1/2*y,z+1/4)
+ hermann_mauguin: P 42/m m c (a+b,-a+b,c-1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z
+ number: 131
+ schoenflies: D4h^9
+ symops:
+ - x,y,z
+ - -y,x,z+1/2
+ - -x,-y,z
+ - y,-x,z+1/2
+ - -y,-x,-z+1/2
+ - x,-y,-z
+ - y,x,-z+1/2
+ - -x,y,-z
+ - -x,-y,-z+1/2
+ - y,-x,-z
+ - x,y,-z+1/2
+ - -y,x,-z
+ - y,x,z
+ - -x,y,z+1/2
+ - -y,-x,z
+ - x,-y,z+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,-z
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z
+ - y+1/2,x+1/2,z
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z+1/2
+ universal_h_m: P 42/m m c (a+b,-a+b,c-1/4)
+- crystal_class: tetragonal
+ hall: -P 4c 2 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y-1/4,z)
+ hermann_mauguin: P 42/m m c (a+b,-a+b+1/2,c)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y,z+1/2
+ - y+1/2,x+1/2,z
+ number: 131
+ schoenflies: D4h^9
+ symops:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - y,-x+1/2,-z+1/2
+ - x,y,-z
+ - -y+1/2,x,-z+1/2
+ - y,x,z
+ - -x+1/2,y,z+1/2
+ - -y+1/2,-x+1/2,z
+ - x,-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - -y,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x,z+1/2
+ - -y,-x,-z
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z+1/2
+ - y+1/2,x+1/2,z
+ - -x,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y,z+1/2
+ universal_h_m: P 42/m m c (a+b,-a+b+1/2,c)
+- crystal_class: tetragonal
+ hall: -I 4 2 (x-1/4,y+1/4,z-1/4)
+ hermann_mauguin: I 4/m m m (a+1/4,b-1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z+1/2
+ - x,-y+1/2,-z+1/2
+ - y,x,-z
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z+1/2
+ - -x,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y,z+1/2
+ - y+1/2,x+1/2,z
+ number: 139
+ schoenflies: D4h^17
+ symops:
+ - x,y,z
+ - -y,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x,z
+ - x,-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y,-x,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x,y,-z+1/2
+ - -y,x+1/2,-z+1/2
+ - -x+1/2,y,z
+ - -y,-x,z
+ - x,-y+1/2,z
+ - y+1/2,x+1/2,z
+ - x+1/2,y+1/2,z+1/2
+ - -y+1/2,x,z+1/2
+ - -x,-y,z+1/2
+ - y,-x+1/2,z+1/2
+ - x+1/2,-y,-z
+ - y,x,-z
+ - -x,y+1/2,-z
+ - -y+1/2,-x+1/2,-z
+ - -x,-y,-z
+ - y,-x+1/2,-z
+ - x+1/2,y+1/2,-z
+ - -y+1/2,x,-z
+ - -x,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ - y,x,z+1/2
+ universal_h_m: I 4/m m m (a+1/4,b-1/4,c+1/4)
+- crystal_class: hexagonal
+ hall: -P 6 (1/2*x,1/2*y,1/2*z)
+ hermann_mauguin: P 6/m (2*a,2*b,2*c)
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ number: 175
+ schoenflies: C6h^1
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - x+1/2,y,z
+ - x-y+1/2,x,z
+ - -y+1/2,x-y,z
+ - -x+1/2,-y,z
+ - -x+y+1/2,-x,z
+ - y+1/2,-x+y,z
+ - -x+1/2,-y,-z
+ - -x+y+1/2,-x,-z
+ - y+1/2,-x+y,-z
+ - x+1/2,y,-z
+ - x-y+1/2,x,-z
+ - -y+1/2,x-y,-z
+ - x,y+1/2,z
+ - x-y,x+1/2,z
+ - -y,x-y+1/2,z
+ - -x,-y+1/2,z
+ - -x+y,-x+1/2,z
+ - y,-x+y+1/2,z
+ - -x,-y+1/2,-z
+ - -x+y,-x+1/2,-z
+ - y,-x+y+1/2,-z
+ - x,y+1/2,-z
+ - x-y,x+1/2,-z
+ - -y,x-y+1/2,-z
+ - x+1/2,y+1/2,z
+ - x-y+1/2,x+1/2,z
+ - -y+1/2,x-y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+y+1/2,-x+1/2,z
+ - y+1/2,-x+y+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - -x+y+1/2,-x+1/2,-z
+ - y+1/2,-x+y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - x-y+1/2,x+1/2,-z
+ - -y+1/2,x-y+1/2,-z
+ - x,y,z+1/2
+ - x-y,x,z+1/2
+ - -y,x-y,z+1/2
+ - -x,-y,z+1/2
+ - -x+y,-x,z+1/2
+ - y,-x+y,z+1/2
+ - -x,-y,-z+1/2
+ - -x+y,-x,-z+1/2
+ - y,-x+y,-z+1/2
+ - x,y,-z+1/2
+ - x-y,x,-z+1/2
+ - -y,x-y,-z+1/2
+ - x+1/2,y,z+1/2
+ - x-y+1/2,x,z+1/2
+ - -y+1/2,x-y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+y+1/2,-x,z+1/2
+ - y+1/2,-x+y,z+1/2
+ - -x+1/2,-y,-z+1/2
+ - -x+y+1/2,-x,-z+1/2
+ - y+1/2,-x+y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - x-y+1/2,x,-z+1/2
+ - -y+1/2,x-y,-z+1/2
+ - x,y+1/2,z+1/2
+ - x-y,x+1/2,z+1/2
+ - -y,x-y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x+y,-x+1/2,z+1/2
+ - y,-x+y+1/2,z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x+y,-x+1/2,-z+1/2
+ - y,-x+y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - x-y,x+1/2,-z+1/2
+ - -y,x-y+1/2,-z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - x-y+1/2,x+1/2,z+1/2
+ - -y+1/2,x-y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+y+1/2,-x+1/2,z+1/2
+ - y+1/2,-x+y+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - -x+y+1/2,-x+1/2,-z+1/2
+ - y+1/2,-x+y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - x-y+1/2,x+1/2,-z+1/2
+ - -y+1/2,x-y+1/2,-z+1/2
+ universal_h_m: P 6/m (2*a,2*b,2*c)
+- crystal_class: hexagonal
+ hall: -P 6 (1/2*x,1/2*y,z)
+ hermann_mauguin: P 6/m (2*a,2*b,c)
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ number: 175
+ schoenflies: C6h^1
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - x+1/2,y,z
+ - x-y+1/2,x,z
+ - -y+1/2,x-y,z
+ - -x+1/2,-y,z
+ - -x+y+1/2,-x,z
+ - y+1/2,-x+y,z
+ - -x+1/2,-y,-z
+ - -x+y+1/2,-x,-z
+ - y+1/2,-x+y,-z
+ - x+1/2,y,-z
+ - x-y+1/2,x,-z
+ - -y+1/2,x-y,-z
+ - x,y+1/2,z
+ - x-y,x+1/2,z
+ - -y,x-y+1/2,z
+ - -x,-y+1/2,z
+ - -x+y,-x+1/2,z
+ - y,-x+y+1/2,z
+ - -x,-y+1/2,-z
+ - -x+y,-x+1/2,-z
+ - y,-x+y+1/2,-z
+ - x,y+1/2,-z
+ - x-y,x+1/2,-z
+ - -y,x-y+1/2,-z
+ - x+1/2,y+1/2,z
+ - x-y+1/2,x+1/2,z
+ - -y+1/2,x-y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+y+1/2,-x+1/2,z
+ - y+1/2,-x+y+1/2,z
+ - -x+1/2,-y+1/2,-z
+ - -x+y+1/2,-x+1/2,-z
+ - y+1/2,-x+y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - x-y+1/2,x+1/2,-z
+ - -y+1/2,x-y+1/2,-z
+ universal_h_m: P 6/m (2*a,2*b,c)
+- crystal_class: hexagonal
+ hall: -P 6c (1/2*x,1/2*y,z)
+ hermann_mauguin: P 63/m (2*a,2*b,c)
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z+1/2
+ - y,-x+y,-z
+ - x,y,-z+1/2
+ - x-y,x,-z
+ - -y,x-y,-z+1/2
+ number: 176
+ schoenflies: C6h^2
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z+1/2
+ - y,-x+y,-z
+ - x,y,-z+1/2
+ - x-y,x,-z
+ - -y,x-y,-z+1/2
+ - x+1/2,y,z
+ - x-y+1/2,x,z+1/2
+ - -y+1/2,x-y,z
+ - -x+1/2,-y,z+1/2
+ - -x+y+1/2,-x,z
+ - y+1/2,-x+y,z+1/2
+ - -x+1/2,-y,-z
+ - -x+y+1/2,-x,-z+1/2
+ - y+1/2,-x+y,-z
+ - x+1/2,y,-z+1/2
+ - x-y+1/2,x,-z
+ - -y+1/2,x-y,-z+1/2
+ - x,y+1/2,z
+ - x-y,x+1/2,z+1/2
+ - -y,x-y+1/2,z
+ - -x,-y+1/2,z+1/2
+ - -x+y,-x+1/2,z
+ - y,-x+y+1/2,z+1/2
+ - -x,-y+1/2,-z
+ - -x+y,-x+1/2,-z+1/2
+ - y,-x+y+1/2,-z
+ - x,y+1/2,-z+1/2
+ - x-y,x+1/2,-z
+ - -y,x-y+1/2,-z+1/2
+ - x+1/2,y+1/2,z
+ - x-y+1/2,x+1/2,z+1/2
+ - -y+1/2,x-y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+y+1/2,-x+1/2,z
+ - y+1/2,-x+y+1/2,z+1/2
+ - -x+1/2,-y+1/2,-z
+ - -x+y+1/2,-x+1/2,-z+1/2
+ - y+1/2,-x+y+1/2,-z
+ - x+1/2,y+1/2,-z+1/2
+ - x-y+1/2,x+1/2,-z
+ - -y+1/2,x-y+1/2,-z+1/2
+ universal_h_m: P 63/m (2*a,2*b,c)
+- crystal_class: hexagonal
+ hall: -P 6 2 (1/2*x,1/2*y,1/2*z)
+ hermann_mauguin: P 6/m m m (2*a,2*b,2*c)
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z
+ - x-y,-y,-z
+ - x,x-y,-z
+ - y,x,-z
+ - -x+y,y,-z
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z
+ - -x+y,y,z
+ - -x,-x+y,z
+ - -y,-x,z
+ - x-y,-y,z
+ - x,x-y,z
+ number: 191
+ schoenflies: D6h^1
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z
+ - x-y,-y,-z
+ - x,x-y,-z
+ - y,x,-z
+ - -x+y,y,-z
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z
+ - -x+y,y,z
+ - -x,-x+y,z
+ - -y,-x,z
+ - x-y,-y,z
+ - x,x-y,z
+ - x+1/2,y,z
+ - x-y+1/2,x,z
+ - -y+1/2,x-y,z
+ - -x+1/2,-y,z
+ - -x+y+1/2,-x,z
+ - y+1/2,-x+y,z
+ - -y+1/2,-x,-z
+ - x-y+1/2,-y,-z
+ - x+1/2,x-y,-z
+ - y+1/2,x,-z
+ - -x+y+1/2,y,-z
+ - -x+1/2,-x+y,-z
+ - -x+1/2,-y,-z
+ - -x+y+1/2,-x,-z
+ - y+1/2,-x+y,-z
+ - x+1/2,y,-z
+ - x-y+1/2,x,-z
+ - -y+1/2,x-y,-z
+ - y+1/2,x,z
+ - -x+y+1/2,y,z
+ - -x+1/2,-x+y,z
+ - -y+1/2,-x,z
+ - x-y+1/2,-y,z
+ - x+1/2,x-y,z
+ - x,y+1/2,z
+ - x-y,x+1/2,z
+ - -y,x-y+1/2,z
+ - -x,-y+1/2,z
+ - -x+y,-x+1/2,z
+ - y,-x+y+1/2,z
+ - -y,-x+1/2,-z
+ - x-y,-y+1/2,-z
+ - x,x-y+1/2,-z
+ - y,x+1/2,-z
+ - -x+y,y+1/2,-z
+ - -x,-x+y+1/2,-z
+ - -x,-y+1/2,-z
+ - -x+y,-x+1/2,-z
+ - y,-x+y+1/2,-z
+ - x,y+1/2,-z
+ - x-y,x+1/2,-z
+ - -y,x-y+1/2,-z
+ - y,x+1/2,z
+ - -x+y,y+1/2,z
+ - -x,-x+y+1/2,z
+ - -y,-x+1/2,z
+ - x-y,-y+1/2,z
+ - x,x-y+1/2,z
+ - x+1/2,y+1/2,z
+ - x-y+1/2,x+1/2,z
+ - -y+1/2,x-y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+y+1/2,-x+1/2,z
+ - y+1/2,-x+y+1/2,z
+ - -y+1/2,-x+1/2,-z
+ - x-y+1/2,-y+1/2,-z
+ - x+1/2,x-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+y+1/2,y+1/2,-z
+ - -x+1/2,-x+y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - -x+y+1/2,-x+1/2,-z
+ - y+1/2,-x+y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - x-y+1/2,x+1/2,-z
+ - -y+1/2,x-y+1/2,-z
+ - y+1/2,x+1/2,z
+ - -x+y+1/2,y+1/2,z
+ - -x+1/2,-x+y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x-y+1/2,-y+1/2,z
+ - x+1/2,x-y+1/2,z
+ - x,y,z+1/2
+ - x-y,x,z+1/2
+ - -y,x-y,z+1/2
+ - -x,-y,z+1/2
+ - -x+y,-x,z+1/2
+ - y,-x+y,z+1/2
+ - -y,-x,-z+1/2
+ - x-y,-y,-z+1/2
+ - x,x-y,-z+1/2
+ - y,x,-z+1/2
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z+1/2
+ - -x,-y,-z+1/2
+ - -x+y,-x,-z+1/2
+ - y,-x+y,-z+1/2
+ - x,y,-z+1/2
+ - x-y,x,-z+1/2
+ - -y,x-y,-z+1/2
+ - y,x,z+1/2
+ - -x+y,y,z+1/2
+ - -x,-x+y,z+1/2
+ - -y,-x,z+1/2
+ - x-y,-y,z+1/2
+ - x,x-y,z+1/2
+ - x+1/2,y,z+1/2
+ - x-y+1/2,x,z+1/2
+ - -y+1/2,x-y,z+1/2
+ - -x+1/2,-y,z+1/2
+ - -x+y+1/2,-x,z+1/2
+ - y+1/2,-x+y,z+1/2
+ - -y+1/2,-x,-z+1/2
+ - x-y+1/2,-y,-z+1/2
+ - x+1/2,x-y,-z+1/2
+ - y+1/2,x,-z+1/2
+ - -x+y+1/2,y,-z+1/2
+ - -x+1/2,-x+y,-z+1/2
+ - -x+1/2,-y,-z+1/2
+ - -x+y+1/2,-x,-z+1/2
+ - y+1/2,-x+y,-z+1/2
+ - x+1/2,y,-z+1/2
+ - x-y+1/2,x,-z+1/2
+ - -y+1/2,x-y,-z+1/2
+ - y+1/2,x,z+1/2
+ - -x+y+1/2,y,z+1/2
+ - -x+1/2,-x+y,z+1/2
+ - -y+1/2,-x,z+1/2
+ - x-y+1/2,-y,z+1/2
+ - x+1/2,x-y,z+1/2
+ - x,y+1/2,z+1/2
+ - x-y,x+1/2,z+1/2
+ - -y,x-y+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - -x+y,-x+1/2,z+1/2
+ - y,-x+y+1/2,z+1/2
+ - -y,-x+1/2,-z+1/2
+ - x-y,-y+1/2,-z+1/2
+ - x,x-y+1/2,-z+1/2
+ - y,x+1/2,-z+1/2
+ - -x+y,y+1/2,-z+1/2
+ - -x,-x+y+1/2,-z+1/2
+ - -x,-y+1/2,-z+1/2
+ - -x+y,-x+1/2,-z+1/2
+ - y,-x+y+1/2,-z+1/2
+ - x,y+1/2,-z+1/2
+ - x-y,x+1/2,-z+1/2
+ - -y,x-y+1/2,-z+1/2
+ - y,x+1/2,z+1/2
+ - -x+y,y+1/2,z+1/2
+ - -x,-x+y+1/2,z+1/2
+ - -y,-x+1/2,z+1/2
+ - x-y,-y+1/2,z+1/2
+ - x,x-y+1/2,z+1/2
+ - x+1/2,y+1/2,z+1/2
+ - x-y+1/2,x+1/2,z+1/2
+ - -y+1/2,x-y+1/2,z+1/2
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+y+1/2,-x+1/2,z+1/2
+ - y+1/2,-x+y+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - x-y+1/2,-y+1/2,-z+1/2
+ - x+1/2,x-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+y+1/2,y+1/2,-z+1/2
+ - -x+1/2,-x+y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - -x+y+1/2,-x+1/2,-z+1/2
+ - y+1/2,-x+y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - x-y+1/2,x+1/2,-z+1/2
+ - -y+1/2,x-y+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -x+y+1/2,y+1/2,z+1/2
+ - -x+1/2,-x+y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x-y+1/2,-y+1/2,z+1/2
+ - x+1/2,x-y+1/2,z+1/2
+ universal_h_m: P 6/m m m (2*a,2*b,2*c)
+- crystal_class: hexagonal
+ hall: -P 6 2 (1/2*x,1/2*y,z)
+ hermann_mauguin: P 6/m m m (2*a,2*b,c)
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z
+ - x-y,-y,-z
+ - x,x-y,-z
+ - y,x,-z
+ - -x+y,y,-z
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z
+ - -x+y,y,z
+ - -x,-x+y,z
+ - -y,-x,z
+ - x-y,-y,z
+ - x,x-y,z
+ number: 191
+ schoenflies: D6h^1
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z
+ - x-y,-y,-z
+ - x,x-y,-z
+ - y,x,-z
+ - -x+y,y,-z
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z
+ - -x+y,y,z
+ - -x,-x+y,z
+ - -y,-x,z
+ - x-y,-y,z
+ - x,x-y,z
+ - x+1/2,y,z
+ - x-y+1/2,x,z
+ - -y+1/2,x-y,z
+ - -x+1/2,-y,z
+ - -x+y+1/2,-x,z
+ - y+1/2,-x+y,z
+ - -y+1/2,-x,-z
+ - x-y+1/2,-y,-z
+ - x+1/2,x-y,-z
+ - y+1/2,x,-z
+ - -x+y+1/2,y,-z
+ - -x+1/2,-x+y,-z
+ - -x+1/2,-y,-z
+ - -x+y+1/2,-x,-z
+ - y+1/2,-x+y,-z
+ - x+1/2,y,-z
+ - x-y+1/2,x,-z
+ - -y+1/2,x-y,-z
+ - y+1/2,x,z
+ - -x+y+1/2,y,z
+ - -x+1/2,-x+y,z
+ - -y+1/2,-x,z
+ - x-y+1/2,-y,z
+ - x+1/2,x-y,z
+ - x,y+1/2,z
+ - x-y,x+1/2,z
+ - -y,x-y+1/2,z
+ - -x,-y+1/2,z
+ - -x+y,-x+1/2,z
+ - y,-x+y+1/2,z
+ - -y,-x+1/2,-z
+ - x-y,-y+1/2,-z
+ - x,x-y+1/2,-z
+ - y,x+1/2,-z
+ - -x+y,y+1/2,-z
+ - -x,-x+y+1/2,-z
+ - -x,-y+1/2,-z
+ - -x+y,-x+1/2,-z
+ - y,-x+y+1/2,-z
+ - x,y+1/2,-z
+ - x-y,x+1/2,-z
+ - -y,x-y+1/2,-z
+ - y,x+1/2,z
+ - -x+y,y+1/2,z
+ - -x,-x+y+1/2,z
+ - -y,-x+1/2,z
+ - x-y,-y+1/2,z
+ - x,x-y+1/2,z
+ - x+1/2,y+1/2,z
+ - x-y+1/2,x+1/2,z
+ - -y+1/2,x-y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+y+1/2,-x+1/2,z
+ - y+1/2,-x+y+1/2,z
+ - -y+1/2,-x+1/2,-z
+ - x-y+1/2,-y+1/2,-z
+ - x+1/2,x-y+1/2,-z
+ - y+1/2,x+1/2,-z
+ - -x+y+1/2,y+1/2,-z
+ - -x+1/2,-x+y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - -x+y+1/2,-x+1/2,-z
+ - y+1/2,-x+y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - x-y+1/2,x+1/2,-z
+ - -y+1/2,x-y+1/2,-z
+ - y+1/2,x+1/2,z
+ - -x+y+1/2,y+1/2,z
+ - -x+1/2,-x+y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x-y+1/2,-y+1/2,z
+ - x+1/2,x-y+1/2,z
+ universal_h_m: P 6/m m m (2*a,2*b,c)
+- crystal_class: hexagonal
+ hall: -P 6 2c (1/2*x,1/2*y,z)
+ hermann_mauguin: P 6/m c c (2*a,2*b,c)
+ ncsym:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z+1/2
+ - x-y,-y,-z+1/2
+ - x,x-y,-z+1/2
+ - y,x,-z+1/2
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z+1/2
+ - -x+y,y,z+1/2
+ - -x,-x+y,z+1/2
+ - -y,-x,z+1/2
+ - x-y,-y,z+1/2
+ - x,x-y,z+1/2
+ number: 192
+ schoenflies: D6h^2
+ symops:
+ - x,y,z
+ - x-y,x,z
+ - -y,x-y,z
+ - -x,-y,z
+ - -x+y,-x,z
+ - y,-x+y,z
+ - -y,-x,-z+1/2
+ - x-y,-y,-z+1/2
+ - x,x-y,-z+1/2
+ - y,x,-z+1/2
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z
+ - y,-x+y,-z
+ - x,y,-z
+ - x-y,x,-z
+ - -y,x-y,-z
+ - y,x,z+1/2
+ - -x+y,y,z+1/2
+ - -x,-x+y,z+1/2
+ - -y,-x,z+1/2
+ - x-y,-y,z+1/2
+ - x,x-y,z+1/2
+ - x+1/2,y,z
+ - x-y+1/2,x,z
+ - -y+1/2,x-y,z
+ - -x+1/2,-y,z
+ - -x+y+1/2,-x,z
+ - y+1/2,-x+y,z
+ - -y+1/2,-x,-z+1/2
+ - x-y+1/2,-y,-z+1/2
+ - x+1/2,x-y,-z+1/2
+ - y+1/2,x,-z+1/2
+ - -x+y+1/2,y,-z+1/2
+ - -x+1/2,-x+y,-z+1/2
+ - -x+1/2,-y,-z
+ - -x+y+1/2,-x,-z
+ - y+1/2,-x+y,-z
+ - x+1/2,y,-z
+ - x-y+1/2,x,-z
+ - -y+1/2,x-y,-z
+ - y+1/2,x,z+1/2
+ - -x+y+1/2,y,z+1/2
+ - -x+1/2,-x+y,z+1/2
+ - -y+1/2,-x,z+1/2
+ - x-y+1/2,-y,z+1/2
+ - x+1/2,x-y,z+1/2
+ - x,y+1/2,z
+ - x-y,x+1/2,z
+ - -y,x-y+1/2,z
+ - -x,-y+1/2,z
+ - -x+y,-x+1/2,z
+ - y,-x+y+1/2,z
+ - -y,-x+1/2,-z+1/2
+ - x-y,-y+1/2,-z+1/2
+ - x,x-y+1/2,-z+1/2
+ - y,x+1/2,-z+1/2
+ - -x+y,y+1/2,-z+1/2
+ - -x,-x+y+1/2,-z+1/2
+ - -x,-y+1/2,-z
+ - -x+y,-x+1/2,-z
+ - y,-x+y+1/2,-z
+ - x,y+1/2,-z
+ - x-y,x+1/2,-z
+ - -y,x-y+1/2,-z
+ - y,x+1/2,z+1/2
+ - -x+y,y+1/2,z+1/2
+ - -x,-x+y+1/2,z+1/2
+ - -y,-x+1/2,z+1/2
+ - x-y,-y+1/2,z+1/2
+ - x,x-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - x-y+1/2,x+1/2,z
+ - -y+1/2,x-y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x+y+1/2,-x+1/2,z
+ - y+1/2,-x+y+1/2,z
+ - -y+1/2,-x+1/2,-z+1/2
+ - x-y+1/2,-y+1/2,-z+1/2
+ - x+1/2,x-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x+y+1/2,y+1/2,-z+1/2
+ - -x+1/2,-x+y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - -x+y+1/2,-x+1/2,-z
+ - y+1/2,-x+y+1/2,-z
+ - x+1/2,y+1/2,-z
+ - x-y+1/2,x+1/2,-z
+ - -y+1/2,x-y+1/2,-z
+ - y+1/2,x+1/2,z+1/2
+ - -x+y+1/2,y+1/2,z+1/2
+ - -x+1/2,-x+y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x-y+1/2,-y+1/2,z+1/2
+ - x+1/2,x-y+1/2,z+1/2
+ universal_h_m: P 6/m c c (2*a,2*b,c)
+- crystal_class: hexagonal
+ hall: -P 6c 2 (1/2*x,1/2*y,z)
+ hermann_mauguin: P 63/m c m (2*a,2*b,c)
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z
+ - x-y,-y,-z+1/2
+ - x,x-y,-z
+ - y,x,-z+1/2
+ - -x+y,y,-z
+ - -x,-x+y,-z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z+1/2
+ - y,-x+y,-z
+ - x,y,-z+1/2
+ - x-y,x,-z
+ - -y,x-y,-z+1/2
+ - y,x,z
+ - -x+y,y,z+1/2
+ - -x,-x+y,z
+ - -y,-x,z+1/2
+ - x-y,-y,z
+ - x,x-y,z+1/2
+ number: 193
+ schoenflies: D6h^3
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z
+ - x-y,-y,-z+1/2
+ - x,x-y,-z
+ - y,x,-z+1/2
+ - -x+y,y,-z
+ - -x,-x+y,-z+1/2
+ - -x,-y,-z
+ - -x+y,-x,-z+1/2
+ - y,-x+y,-z
+ - x,y,-z+1/2
+ - x-y,x,-z
+ - -y,x-y,-z+1/2
+ - y,x,z
+ - -x+y,y,z+1/2
+ - -x,-x+y,z
+ - -y,-x,z+1/2
+ - x-y,-y,z
+ - x,x-y,z+1/2
+ - x+1/2,y,z
+ - x-y+1/2,x,z+1/2
+ - -y+1/2,x-y,z
+ - -x+1/2,-y,z+1/2
+ - -x+y+1/2,-x,z
+ - y+1/2,-x+y,z+1/2
+ - -y+1/2,-x,-z
+ - x-y+1/2,-y,-z+1/2
+ - x+1/2,x-y,-z
+ - y+1/2,x,-z+1/2
+ - -x+y+1/2,y,-z
+ - -x+1/2,-x+y,-z+1/2
+ - -x+1/2,-y,-z
+ - -x+y+1/2,-x,-z+1/2
+ - y+1/2,-x+y,-z
+ - x+1/2,y,-z+1/2
+ - x-y+1/2,x,-z
+ - -y+1/2,x-y,-z+1/2
+ - y+1/2,x,z
+ - -x+y+1/2,y,z+1/2
+ - -x+1/2,-x+y,z
+ - -y+1/2,-x,z+1/2
+ - x-y+1/2,-y,z
+ - x+1/2,x-y,z+1/2
+ - x,y+1/2,z
+ - x-y,x+1/2,z+1/2
+ - -y,x-y+1/2,z
+ - -x,-y+1/2,z+1/2
+ - -x+y,-x+1/2,z
+ - y,-x+y+1/2,z+1/2
+ - -y,-x+1/2,-z
+ - x-y,-y+1/2,-z+1/2
+ - x,x-y+1/2,-z
+ - y,x+1/2,-z+1/2
+ - -x+y,y+1/2,-z
+ - -x,-x+y+1/2,-z+1/2
+ - -x,-y+1/2,-z
+ - -x+y,-x+1/2,-z+1/2
+ - y,-x+y+1/2,-z
+ - x,y+1/2,-z+1/2
+ - x-y,x+1/2,-z
+ - -y,x-y+1/2,-z+1/2
+ - y,x+1/2,z
+ - -x+y,y+1/2,z+1/2
+ - -x,-x+y+1/2,z
+ - -y,-x+1/2,z+1/2
+ - x-y,-y+1/2,z
+ - x,x-y+1/2,z+1/2
+ - x+1/2,y+1/2,z
+ - x-y+1/2,x+1/2,z+1/2
+ - -y+1/2,x-y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+y+1/2,-x+1/2,z
+ - y+1/2,-x+y+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z
+ - x-y+1/2,-y+1/2,-z+1/2
+ - x+1/2,x-y+1/2,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x+y+1/2,y+1/2,-z
+ - -x+1/2,-x+y+1/2,-z+1/2
+ - -x+1/2,-y+1/2,-z
+ - -x+y+1/2,-x+1/2,-z+1/2
+ - y+1/2,-x+y+1/2,-z
+ - x+1/2,y+1/2,-z+1/2
+ - x-y+1/2,x+1/2,-z
+ - -y+1/2,x-y+1/2,-z+1/2
+ - y+1/2,x+1/2,z
+ - -x+y+1/2,y+1/2,z+1/2
+ - -x+1/2,-x+y+1/2,z
+ - -y+1/2,-x+1/2,z+1/2
+ - x-y+1/2,-y+1/2,z
+ - x+1/2,x-y+1/2,z+1/2
+ universal_h_m: P 63/m c m (2*a,2*b,c)
+- crystal_class: hexagonal
+ hall: -P 6c 2c (1/2*x,1/2*y,z)
+ hermann_mauguin: P 63/m m c (2*a,2*b,c)
+ ncsym:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z+1/2
+ - x-y,-y,-z
+ - x,x-y,-z+1/2
+ - y,x,-z
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z+1/2
+ - y,-x+y,-z
+ - x,y,-z+1/2
+ - x-y,x,-z
+ - -y,x-y,-z+1/2
+ - y,x,z+1/2
+ - -x+y,y,z
+ - -x,-x+y,z+1/2
+ - -y,-x,z
+ - x-y,-y,z+1/2
+ - x,x-y,z
+ number: 194
+ schoenflies: D6h^4
+ symops:
+ - x,y,z
+ - x-y,x,z+1/2
+ - -y,x-y,z
+ - -x,-y,z+1/2
+ - -x+y,-x,z
+ - y,-x+y,z+1/2
+ - -y,-x,-z+1/2
+ - x-y,-y,-z
+ - x,x-y,-z+1/2
+ - y,x,-z
+ - -x+y,y,-z+1/2
+ - -x,-x+y,-z
+ - -x,-y,-z
+ - -x+y,-x,-z+1/2
+ - y,-x+y,-z
+ - x,y,-z+1/2
+ - x-y,x,-z
+ - -y,x-y,-z+1/2
+ - y,x,z+1/2
+ - -x+y,y,z
+ - -x,-x+y,z+1/2
+ - -y,-x,z
+ - x-y,-y,z+1/2
+ - x,x-y,z
+ - x+1/2,y,z
+ - x-y+1/2,x,z+1/2
+ - -y+1/2,x-y,z
+ - -x+1/2,-y,z+1/2
+ - -x+y+1/2,-x,z
+ - y+1/2,-x+y,z+1/2
+ - -y+1/2,-x,-z+1/2
+ - x-y+1/2,-y,-z
+ - x+1/2,x-y,-z+1/2
+ - y+1/2,x,-z
+ - -x+y+1/2,y,-z+1/2
+ - -x+1/2,-x+y,-z
+ - -x+1/2,-y,-z
+ - -x+y+1/2,-x,-z+1/2
+ - y+1/2,-x+y,-z
+ - x+1/2,y,-z+1/2
+ - x-y+1/2,x,-z
+ - -y+1/2,x-y,-z+1/2
+ - y+1/2,x,z+1/2
+ - -x+y+1/2,y,z
+ - -x+1/2,-x+y,z+1/2
+ - -y+1/2,-x,z
+ - x-y+1/2,-y,z+1/2
+ - x+1/2,x-y,z
+ - x,y+1/2,z
+ - x-y,x+1/2,z+1/2
+ - -y,x-y+1/2,z
+ - -x,-y+1/2,z+1/2
+ - -x+y,-x+1/2,z
+ - y,-x+y+1/2,z+1/2
+ - -y,-x+1/2,-z+1/2
+ - x-y,-y+1/2,-z
+ - x,x-y+1/2,-z+1/2
+ - y,x+1/2,-z
+ - -x+y,y+1/2,-z+1/2
+ - -x,-x+y+1/2,-z
+ - -x,-y+1/2,-z
+ - -x+y,-x+1/2,-z+1/2
+ - y,-x+y+1/2,-z
+ - x,y+1/2,-z+1/2
+ - x-y,x+1/2,-z
+ - -y,x-y+1/2,-z+1/2
+ - y,x+1/2,z+1/2
+ - -x+y,y+1/2,z
+ - -x,-x+y+1/2,z+1/2
+ - -y,-x+1/2,z
+ - x-y,-y+1/2,z+1/2
+ - x,x-y+1/2,z
+ - x+1/2,y+1/2,z
+ - x-y+1/2,x+1/2,z+1/2
+ - -y+1/2,x-y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+y+1/2,-x+1/2,z
+ - y+1/2,-x+y+1/2,z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - x-y+1/2,-y+1/2,-z
+ - x+1/2,x-y+1/2,-z+1/2
+ - y+1/2,x+1/2,-z
+ - -x+y+1/2,y+1/2,-z+1/2
+ - -x+1/2,-x+y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - -x+y+1/2,-x+1/2,-z+1/2
+ - y+1/2,-x+y+1/2,-z
+ - x+1/2,y+1/2,-z+1/2
+ - x-y+1/2,x+1/2,-z
+ - -y+1/2,x-y+1/2,-z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -x+y+1/2,y+1/2,z
+ - -x+1/2,-x+y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z
+ - x-y+1/2,-y+1/2,z+1/2
+ - x+1/2,x-y+1/2,z
+ universal_h_m: P 63/m m c (2*a,2*b,c)
+- crystal_class: cubic
+ hall: -F 2 2 3 (x+1/4,y+1/4,z+1/4)
+ hermann_mauguin: F m -3 (a-1/4,b-1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x,-y,z
+ - x,-y,-z
+ - -x,y,-z
+ - z,x,y
+ - -z,-x,y
+ - z,-x,-y
+ - -z,x,-y
+ - y,z,x
+ - y,-z,-x
+ - -y,z,-x
+ - -y,-z,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -z+1/2,-x+1/2,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -z+1/2,x+1/2,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - y+1/2,z+1/2,-x+1/2
+ number: 202
+ schoenflies: Th^3
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - z,x,y
+ - -z+1/2,-x+1/2,y
+ - z,-x+1/2,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y,z
+ - x,-y+1/2,z
+ - -z+1/2,-x+1/2,-y+1/2
+ - z,x,-y+1/2
+ - -z+1/2,x,y
+ - z,-x+1/2,y
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z,x
+ - y,-z+1/2,x
+ - y,z,-x+1/2
+ - x,y+1/2,z+1/2
+ - -x+1/2,-y,z+1/2
+ - x,-y,-z
+ - -x+1/2,y+1/2,-z
+ - z,x+1/2,y+1/2
+ - -z+1/2,-x,y+1/2
+ - z,-x,-y
+ - -z+1/2,x+1/2,-y
+ - y,z+1/2,x+1/2
+ - y,-z,-x
+ - -y+1/2,z+1/2,-x
+ - -y+1/2,-z,x+1/2
+ - -x+1/2,-y,-z
+ - x,y+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - x,-y,z+1/2
+ - -z+1/2,-x,-y
+ - z,x+1/2,-y
+ - -z+1/2,x+1/2,y+1/2
+ - z,-x,y+1/2
+ - -y+1/2,-z,-x
+ - -y+1/2,z+1/2,x+1/2
+ - y,-z,x+1/2
+ - y,z+1/2,-x
+ - x+1/2,y,z+1/2
+ - -x,-y+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - -x,y,-z
+ - z+1/2,x,y+1/2
+ - -z,-x+1/2,y+1/2
+ - z+1/2,-x+1/2,-y
+ - -z,x,-y
+ - y+1/2,z,x+1/2
+ - y+1/2,-z+1/2,-x
+ - -y,z,-x
+ - -y,-z+1/2,x+1/2
+ - -x,-y+1/2,-z
+ - x+1/2,y,-z
+ - -x,y,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - -z,-x+1/2,-y
+ - z+1/2,x,-y
+ - -z,x,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - -y,-z+1/2,-x
+ - -y,z,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - y+1/2,z,-x
+ - x+1/2,y+1/2,z
+ - -x,-y,z
+ - x+1/2,-y,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - z+1/2,x+1/2,y
+ - -z,-x,y
+ - z+1/2,-x,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - y+1/2,z+1/2,x
+ - y+1/2,-z,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -y,-z,x
+ - -x,-y,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -x,y+1/2,z
+ - x+1/2,-y,z
+ - -z,-x,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -z,x+1/2,y
+ - z+1/2,-x,y
+ - -y,-z,-x+1/2
+ - -y,z+1/2,x
+ - y+1/2,-z,x
+ - y+1/2,z+1/2,-x+1/2
+ universal_h_m: F m -3 (a-1/4,b-1/4,c-1/4)
+- crystal_class: cubic
+ hall: -I 2 2 3 (x+1/4,y+1/4,z+1/4)
+ hermann_mauguin: I m -3 (a-1/4,b-1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - z,x,y
+ - -z+1/2,-x+1/2,y
+ - z,-x+1/2,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ - -z,-x,-y
+ - z+1/2,x+1/2,-y
+ - -z,x+1/2,y+1/2
+ - z+1/2,-x,y+1/2
+ - -y,-z,-x
+ - -y,z+1/2,x+1/2
+ - y+1/2,-z,x+1/2
+ - y+1/2,z+1/2,-x
+ number: 204
+ schoenflies: Th^5
+ symops:
+ - x,y,z
+ - -x+1/2,-y+1/2,z
+ - x,-y+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - z,x,y
+ - -z+1/2,-x+1/2,y
+ - z,-x+1/2,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -x+1/2,y,z
+ - x,-y+1/2,z
+ - -z+1/2,-x+1/2,-y+1/2
+ - z,x,-y+1/2
+ - -z+1/2,x,y
+ - z,-x+1/2,y
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z,x
+ - y,-z+1/2,x
+ - y,z,-x+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,-y,-z
+ - -x,y+1/2,-z
+ - z+1/2,x+1/2,y+1/2
+ - -z,-x,y+1/2
+ - z+1/2,-x,-y
+ - -z,x+1/2,-y
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z,-x
+ - -y,z+1/2,-x
+ - -y,-z,x+1/2
+ - -x,-y,-z
+ - x+1/2,y+1/2,-z
+ - -x,y+1/2,z+1/2
+ - x+1/2,-y,z+1/2
+ - -z,-x,-y
+ - z+1/2,x+1/2,-y
+ - -z,x+1/2,y+1/2
+ - z+1/2,-x,y+1/2
+ - -y,-z,-x
+ - -y,z+1/2,x+1/2
+ - y+1/2,-z,x+1/2
+ - y+1/2,z+1/2,-x
+ universal_h_m: I m -3 (a-1/4,b-1/4,c-1/4)
+- crystal_class: cubic
+ hall: -F 4a 2 3 (x-1/4,y-1/4,z-1/4)
+ hermann_mauguin: F m -3 c (a+1/4,b+1/4,c+1/4)
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y,-z
+ - y,x,-z
+ - -x,y,-z
+ - -y,-x,-z
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x,-y
+ - x,z,-y
+ - -z,x,-y
+ - -x,-z,-y
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y,-x
+ - -y,-z,x
+ - z,-y,x
+ - -z,y,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -z+1/2,-x+1/2,-y+1/2
+ - x+1/2,-z+1/2,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -x+1/2,z+1/2,-y+1/2
+ - -z+1/2,x+1/2,y+1/2
+ - -x+1/2,-z+1/2,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - x+1/2,z+1/2,y+1/2
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - -z+1/2,-y+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - z+1/2,y+1/2,x+1/2
+ - y+1/2,z+1/2,-x+1/2
+ - -z+1/2,y+1/2,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ number: 226
+ schoenflies: Oh^6
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - x,-y+1/2,-z+1/2
+ - y+1/2,x,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -y+1/2,-x,-z+1/2
+ - z,x,y
+ - -x,z,y
+ - -z,-x,y
+ - x,-z,y
+ - z,-x+1/2,-y+1/2
+ - x+1/2,z,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - -x+1/2,-z,-y+1/2
+ - y,z,x
+ - y,-z,-x
+ - z,y,-x
+ - -y,z,-x
+ - -z,-y+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - z,-y+1/2,x+1/2
+ - -z,y+1/2,x+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y+1/2,-x+1/2,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y+1/2,x+1/2,-z+1/2
+ - -x+1/2,y,z
+ - -y,-x+1/2,z
+ - x+1/2,-y,z
+ - y,x+1/2,z
+ - -z+1/2,-x+1/2,-y+1/2
+ - x+1/2,-z+1/2,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -x+1/2,z+1/2,-y+1/2
+ - -z+1/2,x,y
+ - -x,-z+1/2,y
+ - z+1/2,-x,y
+ - x,z+1/2,y
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - -z+1/2,-y+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - z+1/2,y,x
+ - y,z,-x+1/2
+ - -z+1/2,y,-x
+ - z+1/2,-y,-x
+ - x,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z
+ - z,x+1/2,y+1/2
+ - -x,z+1/2,y+1/2
+ - -z,-x+1/2,y+1/2
+ - x,-z+1/2,y+1/2
+ - z,-x,-y
+ - x+1/2,z+1/2,-y
+ - -z,x,-y
+ - -x+1/2,-z+1/2,-y
+ - y,z+1/2,x+1/2
+ - y,-z+1/2,-x+1/2
+ - z,y+1/2,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -z,-y,-x
+ - -y+1/2,-z,x+1/2
+ - z,-y,x
+ - -z,y,x
+ - -x+1/2,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y,-z
+ - -y+1/2,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z+1/2
+ - -z+1/2,-x,-y
+ - x+1/2,-z,-y
+ - z+1/2,x,-y
+ - -x+1/2,z,-y
+ - -z+1/2,x+1/2,y+1/2
+ - -x,-z,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - x,z,y+1/2
+ - -y+1/2,-z,-x
+ - -y+1/2,z,x
+ - -z+1/2,-y,x
+ - y+1/2,-z,x
+ - z+1/2,y+1/2,x+1/2
+ - y,z+1/2,-x
+ - -z+1/2,y+1/2,-x+1/2
+ - z+1/2,-y+1/2,-x+1/2
+ - x+1/2,y,z+1/2
+ - -y+1/2,x,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - x+1/2,-y+1/2,-z
+ - y,x,-z
+ - -x+1/2,y+1/2,-z
+ - -y,-x,-z
+ - z+1/2,x,y+1/2
+ - -x+1/2,z,y+1/2
+ - -z+1/2,-x,y+1/2
+ - x+1/2,-z,y+1/2
+ - z+1/2,-x+1/2,-y
+ - x,z,-y
+ - -z+1/2,x+1/2,-y
+ - -x,-z,-y
+ - y+1/2,z,x+1/2
+ - y+1/2,-z,-x+1/2
+ - z+1/2,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y+1/2,-x
+ - -y,-z+1/2,x+1/2
+ - z+1/2,-y+1/2,x
+ - -z+1/2,y+1/2,x
+ - -x,-y+1/2,-z
+ - y,-x+1/2,-z
+ - x,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -z,-x+1/2,-y
+ - x,-z+1/2,-y
+ - z,x+1/2,-y
+ - -x,z+1/2,-y
+ - -z,x,y+1/2
+ - -x+1/2,-z+1/2,y+1/2
+ - z,-x,y+1/2
+ - x+1/2,z+1/2,y+1/2
+ - -y,-z+1/2,-x
+ - -y,z+1/2,x
+ - -z,-y+1/2,x
+ - y,-z+1/2,x
+ - z,y,x+1/2
+ - y+1/2,z,-x
+ - -z,y,-x+1/2
+ - z,-y,-x+1/2
+ - x+1/2,y+1/2,z
+ - -y+1/2,x+1/2,z
+ - -x+1/2,-y+1/2,z
+ - y+1/2,-x+1/2,z
+ - x+1/2,-y,-z+1/2
+ - y,x+1/2,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y,-x+1/2,-z+1/2
+ - z+1/2,x+1/2,y
+ - -x+1/2,z+1/2,y
+ - -z+1/2,-x+1/2,y
+ - x+1/2,-z+1/2,y
+ - z+1/2,-x,-y+1/2
+ - x,z+1/2,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - -x,-z+1/2,-y+1/2
+ - y+1/2,z+1/2,x
+ - y+1/2,-z+1/2,-x
+ - z+1/2,y+1/2,-x
+ - -y+1/2,z+1/2,-x
+ - -z+1/2,-y,-x+1/2
+ - -y,-z,x
+ - z+1/2,-y,x+1/2
+ - -z+1/2,y,x+1/2
+ - -x,-y,-z+1/2
+ - y,-x,-z+1/2
+ - x,y,-z+1/2
+ - -y,x,-z+1/2
+ - -x,y+1/2,z
+ - -y+1/2,-x,z
+ - x,-y+1/2,z
+ - y+1/2,x,z
+ - -z,-x,-y+1/2
+ - x,-z,-y+1/2
+ - z,x,-y+1/2
+ - -x,z,-y+1/2
+ - -z,x+1/2,y
+ - -x+1/2,-z,y
+ - z,-x+1/2,y
+ - x+1/2,z,y
+ - -y,-z,-x+1/2
+ - -y,z,x+1/2
+ - -z,-y,x+1/2
+ - y,-z,x+1/2
+ - z,y+1/2,x
+ - y+1/2,z+1/2,-x+1/2
+ - -z,y+1/2,-x
+ - z,-y+1/2,-x
+ universal_h_m: F m -3 c (a+1/4,b+1/4,c+1/4)
+- crystal_class: cubic
+ hall: -I 4 2 3 (x+1/4,y+1/4,z+1/4)
+ hermann_mauguin: I m -3 m (a-1/4,b-1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z,y
+ - -z+1/2,-x+1/2,y
+ - x,-z+1/2,y
+ - z,-x+1/2,-y+1/2
+ - x,z,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - z,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - z,-y+1/2,x
+ - -z+1/2,y,x
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -z,-x,-y
+ - x+1/2,-z,-y
+ - z+1/2,x+1/2,-y
+ - -x,z+1/2,-y
+ - -z,x+1/2,y+1/2
+ - -x,-z,y+1/2
+ - z+1/2,-x,y+1/2
+ - x+1/2,z+1/2,y+1/2
+ - -y,-z,-x
+ - -y,z+1/2,x+1/2
+ - -z,-y,x+1/2
+ - y+1/2,-z,x+1/2
+ - z+1/2,y+1/2,x+1/2
+ - y+1/2,z+1/2,-x
+ - -z,y+1/2,-x
+ - z+1/2,-y,-x
+ number: 229
+ schoenflies: Oh^9
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z,y
+ - -z+1/2,-x+1/2,y
+ - x,-z+1/2,y
+ - z,-x+1/2,-y+1/2
+ - x,z,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - z,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - z,-y+1/2,x
+ - -z+1/2,y,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - -x+1/2,y,z
+ - -y+1/2,-x+1/2,z
+ - x,-y+1/2,z
+ - y,x,z
+ - -z+1/2,-x+1/2,-y+1/2
+ - x,-z+1/2,-y+1/2
+ - z,x,-y+1/2
+ - -x+1/2,z,-y+1/2
+ - -z+1/2,x,y
+ - -x+1/2,-z+1/2,y
+ - z,-x+1/2,y
+ - x,z,y
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z,x
+ - -z+1/2,-y+1/2,x
+ - y,-z+1/2,x
+ - z,y,x
+ - y,z,-x+1/2
+ - -z+1/2,y,-x+1/2
+ - z,-y+1/2,-x+1/2
+ - x+1/2,y+1/2,z+1/2
+ - -y,x+1/2,z+1/2
+ - -x,-y,z+1/2
+ - y+1/2,-x,z+1/2
+ - x+1/2,-y,-z
+ - y+1/2,x+1/2,-z
+ - -x,y+1/2,-z
+ - -y,-x,-z
+ - z+1/2,x+1/2,y+1/2
+ - -x,z+1/2,y+1/2
+ - -z,-x,y+1/2
+ - x+1/2,-z,y+1/2
+ - z+1/2,-x,-y
+ - x+1/2,z+1/2,-y
+ - -z,x+1/2,-y
+ - -x,-z,-y
+ - y+1/2,z+1/2,x+1/2
+ - y+1/2,-z,-x
+ - z+1/2,y+1/2,-x
+ - -y,z+1/2,-x
+ - -z,-y,-x
+ - -y,-z,x+1/2
+ - z+1/2,-y,x+1/2
+ - -z,y+1/2,x+1/2
+ - -x,-y,-z
+ - y+1/2,-x,-z
+ - x+1/2,y+1/2,-z
+ - -y,x+1/2,-z
+ - -x,y+1/2,z+1/2
+ - -y,-x,z+1/2
+ - x+1/2,-y,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ - -z,-x,-y
+ - x+1/2,-z,-y
+ - z+1/2,x+1/2,-y
+ - -x,z+1/2,-y
+ - -z,x+1/2,y+1/2
+ - -x,-z,y+1/2
+ - z+1/2,-x,y+1/2
+ - x+1/2,z+1/2,y+1/2
+ - -y,-z,-x
+ - -y,z+1/2,x+1/2
+ - -z,-y,x+1/2
+ - y+1/2,-z,x+1/2
+ - z+1/2,y+1/2,x+1/2
+ - y+1/2,z+1/2,-x
+ - -z,y+1/2,-x
+ - z+1/2,-y,-x
+ universal_h_m: I m -3 m (a-1/4,b-1/4,c-1/4)
+- crystal_class: cubic
+ hall: -F 4 2 3 (x+1/4,y+1/4,z+1/4)
+ hermann_mauguin: F m -3 m (a-1/4,b-1/4,c-1/4)
+ ncsym:
+ - x,y,z
+ - -y+1/2,x+1/2,z+1/2
+ - -x,-y,z
+ - y+1/2,-x+1/2,z+1/2
+ - x,-y,-z
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y,-z
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z+1/2,y+1/2
+ - -z,-x,y
+ - x+1/2,-z+1/2,y+1/2
+ - z,-x,-y
+ - x+1/2,z+1/2,-y+1/2
+ - -z,x,-y
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z,-x
+ - z+1/2,y+1/2,-x+1/2
+ - -y,z,-x
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y,-z,x
+ - z+1/2,-y+1/2,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x,-z
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y,-x,z
+ - x+1/2,-y+1/2,z+1/2
+ - y,x,z
+ - -z+1/2,-x+1/2,-y+1/2
+ - x,-z,-y
+ - z+1/2,x+1/2,-y+1/2
+ - -x,z,-y
+ - -z+1/2,x+1/2,y+1/2
+ - -x,-z,y
+ - z+1/2,-x+1/2,y+1/2
+ - x,z,y
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z+1/2,x+1/2
+ - -z,-y,x
+ - y+1/2,-z+1/2,x+1/2
+ - z,y,x
+ - y+1/2,z+1/2,-x+1/2
+ - -z,y,-x
+ - z,-y,-x
+ number: 225
+ schoenflies: Oh^5
+ symops:
+ - x,y,z
+ - -y+1/2,x,z
+ - -x+1/2,-y+1/2,z
+ - y,-x+1/2,z
+ - x,-y+1/2,-z+1/2
+ - y,x,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -y+1/2,-x+1/2,-z+1/2
+ - z,x,y
+ - -x+1/2,z,y
+ - -z+1/2,-x+1/2,y
+ - x,-z+1/2,y
+ - z,-x+1/2,-y+1/2
+ - x,z,-y+1/2
+ - -z+1/2,x,-y+1/2
+ - -x+1/2,-z+1/2,-y+1/2
+ - y,z,x
+ - y,-z+1/2,-x+1/2
+ - z,y,-x+1/2
+ - -y+1/2,z,-x+1/2
+ - -z+1/2,-y+1/2,-x+1/2
+ - -y+1/2,-z+1/2,x
+ - z,-y+1/2,x
+ - -z+1/2,y,x
+ - -x+1/2,-y+1/2,-z+1/2
+ - y,-x+1/2,-z+1/2
+ - x,y,-z+1/2
+ - -y+1/2,x,-z+1/2
+ - -x+1/2,y,z
+ - -y+1/2,-x+1/2,z
+ - x,-y+1/2,z
+ - y,x,z
+ - -z+1/2,-x+1/2,-y+1/2
+ - x,-z+1/2,-y+1/2
+ - z,x,-y+1/2
+ - -x+1/2,z,-y+1/2
+ - -z+1/2,x,y
+ - -x+1/2,-z+1/2,y
+ - z,-x+1/2,y
+ - x,z,y
+ - -y+1/2,-z+1/2,-x+1/2
+ - -y+1/2,z,x
+ - -z+1/2,-y+1/2,x
+ - y,-z+1/2,x
+ - z,y,x
+ - y,z,-x+1/2
+ - -z+1/2,y,-x+1/2
+ - z,-y+1/2,-x+1/2
+ - x,y+1/2,z+1/2
+ - -y+1/2,x+1/2,z+1/2
+ - -x+1/2,-y,z+1/2
+ - y,-x,z+1/2
+ - x,-y,-z
+ - y,x+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - -y+1/2,-x,-z
+ - z,x+1/2,y+1/2
+ - -x+1/2,z+1/2,y+1/2
+ - -z+1/2,-x,y+1/2
+ - x,-z,y+1/2
+ - z,-x,-y
+ - x,z+1/2,-y
+ - -z+1/2,x+1/2,-y
+ - -x+1/2,-z,-y
+ - y,z+1/2,x+1/2
+ - y,-z,-x
+ - z,y+1/2,-x
+ - -y+1/2,z+1/2,-x
+ - -z+1/2,-y,-x
+ - -y+1/2,-z,x+1/2
+ - z,-y,x+1/2
+ - -z+1/2,y+1/2,x+1/2
+ - -x+1/2,-y,-z
+ - y,-x,-z
+ - x,y+1/2,-z
+ - -y+1/2,x+1/2,-z
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x,z+1/2
+ - x,-y,z+1/2
+ - y,x+1/2,z+1/2
+ - -z+1/2,-x,-y
+ - x,-z,-y
+ - z,x+1/2,-y
+ - -x+1/2,z+1/2,-y
+ - -z+1/2,x+1/2,y+1/2
+ - -x+1/2,-z,y+1/2
+ - z,-x,y+1/2
+ - x,z+1/2,y+1/2
+ - -y+1/2,-z,-x
+ - -y+1/2,z+1/2,x+1/2
+ - -z+1/2,-y,x+1/2
+ - y,-z,x+1/2
+ - z,y+1/2,x+1/2
+ - y,z+1/2,-x
+ - -z+1/2,y+1/2,-x
+ - z,-y,-x
+ - x+1/2,y,z+1/2
+ - -y,x,z+1/2
+ - -x,-y+1/2,z+1/2
+ - y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,-z
+ - y+1/2,x,-z
+ - -x,y,-z
+ - -y,-x+1/2,-z
+ - z+1/2,x,y+1/2
+ - -x,z,y+1/2
+ - -z,-x+1/2,y+1/2
+ - x+1/2,-z+1/2,y+1/2
+ - z+1/2,-x+1/2,-y
+ - x+1/2,z,-y
+ - -z,x,-y
+ - -x,-z+1/2,-y
+ - y+1/2,z,x+1/2
+ - y+1/2,-z+1/2,-x
+ - z+1/2,y,-x
+ - -y,z,-x
+ - -z,-y+1/2,-x
+ - -y,-z+1/2,x+1/2
+ - z+1/2,-y+1/2,x+1/2
+ - -z,y,x+1/2
+ - -x,-y+1/2,-z
+ - y+1/2,-x+1/2,-z
+ - x+1/2,y,-z
+ - -y,x,-z
+ - -x,y,z+1/2
+ - -y,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x,z+1/2
+ - -z,-x+1/2,-y
+ - x+1/2,-z+1/2,-y
+ - z+1/2,x,-y
+ - -x,z,-y
+ - -z,x,y+1/2
+ - -x,-z+1/2,y+1/2
+ - z+1/2,-x+1/2,y+1/2
+ - x+1/2,z,y+1/2
+ - -y,-z+1/2,-x
+ - -y,z,x+1/2
+ - -z,-y+1/2,x+1/2
+ - y+1/2,-z+1/2,x+1/2
+ - z+1/2,y,x+1/2
+ - y+1/2,z,-x
+ - -z,y,-x
+ - z+1/2,-y+1/2,-x
+ - x+1/2,y+1/2,z
+ - -y,x+1/2,z
+ - -x,-y,z
+ - y+1/2,-x,z
+ - x+1/2,-y,-z+1/2
+ - y+1/2,x+1/2,-z+1/2
+ - -x,y+1/2,-z+1/2
+ - -y,-x,-z+1/2
+ - z+1/2,x+1/2,y
+ - -x,z+1/2,y
+ - -z,-x,y
+ - x+1/2,-z,y
+ - z+1/2,-x,-y+1/2
+ - x+1/2,z+1/2,-y+1/2
+ - -z,x+1/2,-y+1/2
+ - -x,-z,-y+1/2
+ - y+1/2,z+1/2,x
+ - y+1/2,-z,-x+1/2
+ - z+1/2,y+1/2,-x+1/2
+ - -y,z+1/2,-x+1/2
+ - -z,-y,-x+1/2
+ - -y,-z,x
+ - z+1/2,-y,x
+ - -z,y+1/2,x
+ - -x,-y,-z+1/2
+ - y+1/2,-x,-z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - -y,x+1/2,-z+1/2
+ - -x,y+1/2,z
+ - -y,-x,z
+ - x+1/2,-y,z
+ - y+1/2,x+1/2,z
+ - -z,-x,-y+1/2
+ - x+1/2,-z,-y+1/2
+ - z+1/2,x+1/2,-y+1/2
+ - -x,z+1/2,-y+1/2
+ - -z,x+1/2,y
+ - -x,-z,y
+ - z+1/2,-x,y
+ - x+1/2,z+1/2,y
+ - -y,-z,-x+1/2
+ - -y,z+1/2,x
+ - -z,-y,x
+ - y+1/2,-z,x
+ - z+1/2,y+1/2,x
+ - y+1/2,z+1/2,-x+1/2
+ - -z,y+1/2,-x+1/2
+ - z+1/2,-y,-x+1/2
+ universal_h_m: F m -3 m (a-1/4,b-1/4,c-1/4)
+- crystal_class: tetragonal
+ hall: " P 4 -2ab (x,y,1/2*z)"
+ hermann_mauguin: P 4 b m
+ ncsym:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ - x,y,z+1/2
+ - -y,x,z+1/2
+ - -x,-y,z+1/2
+ - y,-x,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ number: 100
+ schoenflies: C4v^2
+ symops:
+ - x,y,z
+ - -y,x,z
+ - -x,-y,z
+ - y,-x,z
+ - -x+1/2,y+1/2,z
+ - -y+1/2,-x+1/2,z
+ - x+1/2,-y+1/2,z
+ - y+1/2,x+1/2,z
+ - x,y,z+1/2
+ - -y,x,z+1/2
+ - -x,-y,z+1/2
+ - y,-x,z+1/2
+ - -x+1/2,y+1/2,z+1/2
+ - -y+1/2,-x+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - y+1/2,x+1/2,z+1/2
+ universal_h_m: P 4 b m (a,b,2*c)
+- crystal_class: monoclinic
+ hall: " C -2yc (1/2*x,y,-1/2*x+z)"
+ hermann_mauguin: C 1 c 1
+ ncsym:
+ - x,y,z
+ - x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,z
+ number: 9
+ schoenflies: Cs^4
+ symops:
+ - x,y,z
+ - x,-y,z+1/2
+ - x+1/2,y,z+1/2
+ - x+1/2,-y,z
+ - x+1/4,y+1/2,z+3/4
+ - x+1/4,-y+1/2,z+1/4
+ - x+3/4,y+1/2,z+1/4
+ - x+3/4,-y+1/2,z+3/4
+ universal_h_m: C 1 c 1 (2*a+c,b,c)
+- crystal_class: orthorhombic
+ hall: " P 2c -2 (1/2*x,y,z)"
+ hermann_mauguin: P m c 21
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ - x,-y,z+1/2
+ - -x,-y,z+1/2
+ number: 26
+ schoenflies: C2v^2
+ symops:
+ - x,y,z
+ - -x,y,z
+ - x,-y,z+1/2
+ - -x,-y,z+1/2
+ - x+1/2,y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z+1/2
+ - -x+1/2,-y,z+1/2
+ universal_h_m: P m c 21 (2*a,b,c)
+- crystal_class: orthorhombic
+ hall: " C 2 -2 (1/2*z,x,y)"
+ hermann_mauguin: C m m 2
+ ncsym:
+ - x,y,z
+ - x,-y,z
+ - x,y,-z
+ - x,-y,-z
+ number: 35
+ schoenflies: C2v^11
+ symops:
+ - x,y,z
+ - x,-y,z
+ - x,y,-z
+ - x,-y,-z
+ - x,y+1/2,z+1/2
+ - x,-y+1/2,z+1/2
+ - x,y+1/2,-z+1/2
+ - x,-y+1/2,-z+1/2
+ - x+1/2,y,z
+ - x+1/2,-y,z
+ - x+1/2,y,-z
+ - x+1/2,-y,-z
+ - x+1/2,y+1/2,z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x+1/2,y+1/2,-z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ universal_h_m: C m m 2 (2*c,a,b)
+- crystal_class: monoclinic
+ hall: -P 2ybc (-1/4*x+1/2*z,1/2*x,y)
+ hermann_mauguin: P 1 21/c 1
+ ncsym:
+ - x,y,z
+ - -x+1/4,-y,z+1/2
+ - -x,-y,-z
+ - x-1/4,y,-z-1/2
+ number: 14
+ schoenflies: C2h^5
+ symops:
+ - x,y,z
+ - -x+1/4,-y,z+1/2
+ - -x,-y,-z
+ - x-1/4,y,-z-1/2
+ - x+3/4,y+1/2,z
+ - -x+1,-y+1/2,z+1/2
+ - -x+3/4,-y+1/2,-z
+ - x+1/2,y+1/2,-z-1/2
+ - x+1/4,y+1/2,z
+ - -x+1/2,-y+1/2,z+1/2
+ - -x+1/4,-y+1/2,-z
+ - x,y+1/2,-z-1/2
+ - x+1/2,y,z
+ - -x+3/4,-y,z+1/2
+ - -x+1/2,-y,-z
+ - x+1/4,y,-z-1/2
+ universal_h_m: P 1 21/c 1 (2*c,2*a+c,b)
+- crystal_class: orthorhombic
+ hall: -P 2a 2a (1/2*y,z,x)
+ hermann_mauguin: P m m a
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ - x,y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,-z
+ - -x,-y,z-1/2
+ - x,-y,z-1/2
+ number: 51
+ schoenflies: D2h^5
+ symops:
+ - x,y,z
+ - -x,y,z
+ - x,y,-z+1/2
+ - -x,y,-z+1/2
+ - -x,-y,-z
+ - x,-y,-z
+ - -x,-y,z-1/2
+ - x,-y,z-1/2
+ - x+1/2,y,z
+ - -x+1/2,y,z
+ - x+1/2,y,-z+1/2
+ - -x+1/2,y,-z+1/2
+ - -x+1/2,-y,-z
+ - x+1/2,-y,-z
+ - -x+1/2,-y,z-1/2
+ - x+1/2,-y,z-1/2
+ universal_h_m: P m m a (2*b,c,a)
+- crystal_class: orthorhombic
+ hall: -P 2a 2a (1/2*y,z+1/3,x-1/4)
+ hermann_mauguin: P m m a
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ - x,y,-z
+ - -x,y,-z
+ - x+1/2,y,z
+ - -x+1/2,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,-z
+ number: 51
+ schoenflies: D2h^5
+ symops:
+ - x,y,z
+ - -x,y,z
+ - x,y,-z
+ - -x,y,-z
+ - x+1/2,y,z
+ - -x+1/2,y,z
+ - x+1/2,y,-z
+ - -x+1/2,y,-z
+ - -x,-y+2/3,-z+1/2
+ - x,-y+2/3,-z+1/2
+ - -x,-y+2/3,z+1/2
+ - x,-y+2/3,z+1/2
+ - -x+1/2,-y+2/3,-z+1/2
+ - x+1/2,-y+2/3,-z+1/2
+ - -x+1/2,-y+2/3,z+1/2
+ - x+1/2,-y+2/3,z+1/2
+ universal_h_m: P m m a (2*b+1/4,c,a-1/3)
+- crystal_class: monoclinic
+ hall: -P 2yc (x,1/2*y,z)
+ hermann_mauguin: P 1 2/c 1
+ ncsym:
+ - x,y,z
+ - -x,y,-z+1/2
+ - x,y+1/2,z
+ - -x,y+1/2,-z+1/2
+ number: 13
+ schoenflies: C2h^4
+ symops:
+ - x,y,z
+ - -x,y,-z+1/2
+ - x,y+1/2,z
+ - -x,y+1/2,-z+1/2
+ - -x,-y,-z
+ - x,-y,z+1/2
+ - -x,-y+1/2,-z
+ - x,-y+1/2,z+1/2
+ universal_h_m: P 1 2/c 1 (a,2*b,c)
+- crystal_class: orthorhombic
+ hall: -P 2 2 (1/2*x,1/2*y,z)
+ hermann_mauguin: P m m m
+ ncsym:
+ - x,y,z
+ - -x,y,z
+ - x,-y,z
+ - -x,-y,z
+ - x+1/2,y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ - -x+1/2,-y,z
+ number: 47
+ schoenflies: D2h^1
+ symops:
+ - x,y,z
+ - -x,y,z
+ - x,-y,z
+ - -x,-y,z
+ - x+1/2,y,z
+ - -x+1/2,y,z
+ - x+1/2,-y,z
+ - -x+1/2,-y,z
+ - x,y+1/2,z
+ - -x,y+1/2,z
+ - x,-y+1/2,z
+ - -x,-y+1/2,z
+ - x+1/2,y+1/2,z
+ - -x+1/2,y+1/2,z
+ - x+1/2,-y+1/2,z
+ - -x+1/2,-y+1/2,z
+ - -x,-y,-z
+ - x,-y,-z
+ - -x,y,-z
+ - x,y,-z
+ - -x+1/2,-y,-z
+ - x+1/2,-y,-z
+ - -x+1/2,y,-z
+ - x+1/2,y,-z
+ - -x,-y+1/2,-z
+ - x,-y+1/2,-z
+ - -x,y+1/2,-z
+ - x,y+1/2,-z
+ - -x+1/2,-y+1/2,-z
+ - x+1/2,-y+1/2,-z
+ - -x+1/2,y+1/2,-z
+ - x+1/2,y+1/2,-z
+ universal_h_m: P m m m (2*a,2*b,c)
+- crystal_class: monoclinic
+ hall: " P 2yb (x+1/4,y,z)"
+ hermann_mauguin: P 1 21 1
+ ncsym:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ number: 4
+ schoenflies: C2^2
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ universal_h_m: P 1 21 1 (a-1/4,b,c)
+- crystal_class: orthorhombic
+ hall: -P 2ac 2n (z,x,y+1/4)
+ hermann_mauguin: P n m a
+ ncsym:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,-y,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x,y,-z
+ - -x+1/2,y+1/2,z
+ number: 62
+ schoenflies: D2h^16
+ symops:
+ - x,y,z
+ - -x+1/2,y+1/2,-z
+ - -x,-y,z+1/2
+ - x+1/2,-y+1/2,-z+1/2
+ - -x,-y,-z+1/2
+ - x+1/2,-y+1/2,z+1/2
+ - x,y,-z
+ - -x+1/2,y+1/2,z
+ universal_h_m: P n m a (c,a-1/4,b)
diff --git a/src/xrpd_toolbox/fit_engine/fit_statistics.py b/src/xrpd_toolbox/fit_engine/fit_statistics.py
new file mode 100644
index 0000000..2ab13a9
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/fit_statistics.py
@@ -0,0 +1,201 @@
+import numpy as np
+
+
+def _as_arrays(
+ y_calc: np.ndarray, y_obs: np.ndarray, y_obs_error: np.ndarray | None = None
+) -> tuple[np.ndarray, np.ndarray, np.ndarray | None]:
+ y_obs = np.asarray(y_obs, dtype=float)
+ y_calc = np.asarray(y_calc, dtype=float)
+
+ if y_obs.shape != y_calc.shape:
+ raise ValueError("y_obs and y_calc must have same shape")
+
+ if y_obs_error is not None:
+ y_obs_error = np.asarray(y_obs_error, dtype=float)
+
+ if y_obs_error.shape != y_obs.shape:
+ raise ValueError("y_obs_error must have same shape")
+
+ return y_calc, y_obs, y_obs_error
+
+
+def calculate_weights(
+ y_obs: np.ndarray, y_obs_error: np.ndarray | None = None
+) -> np.ndarray:
+ """
+ Rietveld weights.
+
+ If y_obs_error is None:
+ w_i = 1 / y_obs_i
+
+ Otherwise:
+ w_i = 1 / sigma_i^2
+ """
+
+ y_obs = np.asarray(y_obs, dtype=float)
+
+ if y_obs_error is None:
+ variance = np.clip(y_obs, 1e-12, None)
+ else:
+ sigma = np.asarray(y_obs_error, dtype=float)
+ variance = np.clip(sigma**2, 1e-12, None)
+
+ return 1.0 / variance
+
+
+def calculate_chi_squared(
+ y_calc: np.ndarray, y_obs: np.ndarray, y_obs_error: np.ndarray | None = None
+) -> float:
+ """
+ Weighted chi-squared:
+
+ χ² = Σ w_i (y_obs_i - y_calc_i)^2
+
+ calculates chi_squared (the minimisation cost function) that is familiar to
+ those who do retiveld refinements
+
+ """
+
+ y_calc, y_obs, y_obs_error = _as_arrays(
+ y_calc=y_calc,
+ y_obs=y_obs,
+ y_obs_error=y_obs_error,
+ )
+
+ w = calculate_weights(y_obs=y_obs, y_obs_error=y_obs_error)
+
+ residual = y_obs - y_calc
+
+ return float(np.sum(w * residual**2))
+
+
+def calculate_reduced_chi_squared(
+ y_calc: np.ndarray,
+ y_obs: np.ndarray,
+ n_parameters: int,
+ y_obs_error: np.ndarray | None = None,
+) -> float:
+ """
+ Reduced chi-squared:
+
+ χ²_red = χ² / (N - P)
+
+ where:
+ N = number of observations
+ P = number of refined parameters
+ """
+
+ n_obs = len(y_obs)
+ dof = n_obs - n_parameters
+
+ if dof <= 0:
+ raise ValueError("Degrees of freedom must be positive")
+
+ return (
+ calculate_chi_squared(
+ y_calc=y_calc,
+ y_obs=y_obs,
+ y_obs_error=y_obs_error,
+ )
+ / dof
+ )
+
+
+def calculate_rwp(
+ y_calc: np.ndarray, y_obs: np.ndarray, y_obs_error: np.ndarray | None = None
+) -> float:
+ """
+ Weighted profile R-factor:
+
+ Σ w_i (y_obs_i - y_calc_i)^2
+ Rwp = sqrt( -------------------------------- )
+ Σ w_i y_obs_i^2
+ """
+
+ y_calc, y_obs, y_obs_error = _as_arrays(
+ y_calc=y_calc,
+ y_obs=y_obs,
+ y_obs_error=y_obs_error,
+ )
+
+ w = calculate_weights(y_obs=y_obs, y_obs_error=y_obs_error)
+
+ numerator = np.sum(w * (y_obs - y_calc) ** 2)
+ denominator = np.sum(w * y_obs**2)
+
+ return float(np.sqrt(numerator / denominator))
+
+
+def calculate_rp(
+ y_calc: np.ndarray,
+ y_obs: np.ndarray,
+) -> float:
+ """
+ Unweighted profile R-factor:
+
+ Σ |y_obs_i - y_calc_i|
+ Rp = ------------------------
+ Σ |y_obs_i|
+ """
+
+ y_calc, y_obs, _ = _as_arrays(y_calc=y_calc, y_obs=y_obs)
+
+ numerator = np.sum(np.abs(y_obs - y_calc))
+ denominator = np.sum(np.abs(y_obs))
+
+ return float(numerator / denominator)
+
+
+def calculate_expected_r_factor(
+ y_obs: np.ndarray,
+ n_parameters: int,
+ y_obs_error=None,
+) -> float:
+ """
+ Expected R-factor (Rexp):
+
+ N - P
+ Rexp = sqrt(-------)
+ Σ w_i y_obs_i^2
+ """
+
+ y_obs = np.asarray(y_obs, dtype=float)
+
+ w = calculate_weights(y_obs=y_obs, y_obs_error=y_obs_error)
+
+ n_obs = len(y_obs)
+ dof = n_obs - n_parameters
+
+ if dof <= 0:
+ raise ValueError("Degrees of freedom must be positive")
+
+ denominator = np.sum(w * y_obs**2)
+
+ return float(np.sqrt(dof / denominator))
+
+
+def calculate_goodness_of_fit(
+ y_calc: np.ndarray,
+ y_obs: np.ndarray,
+ n_parameters: int,
+ y_obs_error: np.ndarray | None = None,
+) -> float:
+ """
+ Goodness-of-fit (GoF), also called chi:
+
+ Rwp
+ GoF = -----
+ Rexp
+
+ equivalently:
+
+ GoF = sqrt(reduced chi-squared)
+ """
+
+ return calculate_rwp(
+ y_calc=y_calc, y_obs=y_obs, y_obs_error=y_obs_error
+ ) / calculate_expected_r_factor(
+ y_obs=y_obs,
+ n_parameters=n_parameters,
+ y_obs_error=y_obs_error,
+ )
diff --git a/src/xrpd_toolbox/fit_engine/fitting_core.py b/src/xrpd_toolbox/fit_engine/fitting_core.py
new file mode 100644
index 0000000..a4256da
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/fitting_core.py
@@ -0,0 +1,687 @@
+"""Refinement utilities for XRPD model fitting.
+
+This module provides an interface for refining parameterised models
+against observed data using SciPy optimizers. It supports both
+least-squares and general minimization methods, with optional live plotting.
+"""
+
+from __future__ import annotations
+
+import time
+from abc import abstractmethod
+from collections.abc import Callable, Sequence
+from copy import deepcopy
+from dataclasses import dataclass
+from typing import (
+ Any,
+ Generic,
+ Literal,
+ Self,
+ TypeVar,
+ Union,
+ cast,
+ get_args,
+ get_origin,
+)
+
+import matplotlib.pyplot as plt
+import numpy as np
+from matplotlib.axes import Axes
+from matplotlib.backends.backend_agg import FigureCanvasAgg
+from matplotlib.figure import Figure
+from matplotlib.lines import Line2D
+from scipy import optimize
+
+from xrpd_toolbox.core import (
+ Parameter,
+ ParameterArray,
+ ScatteringData,
+ XRPDBaseModel,
+ XYEData,
+)
+from xrpd_toolbox.fit_engine.fit_statistics import (
+ calculate_chi_squared,
+ calculate_rp,
+ calculate_rwp,
+)
+
+# TODO: Expand this to other methods: simulated annealing etc, AI stuff?
+RefineMethod = Literal[
+ "least_squares",
+ "trf",
+ "dogbox",
+ "lm",
+ "nelder-mead",
+ "powell",
+ "cg",
+ "bfgs",
+ "l-bfgs-b",
+ "tnc",
+ "cobyla",
+ "slsqp",
+ "trust-constr",
+ "dogleg",
+ "trust-ncg",
+ "trust-exact",
+ "trust-krylov",
+]
+
+
+def is_parameter_like(annotation):
+ return Parameter in get_args(annotation)
+
+
+def is_number_like(annotation) -> bool:
+ origin = get_origin(annotation)
+
+ if annotation in (float, int):
+ return True
+
+ if origin is Union:
+ return any(is_number_like(arg) for arg in get_args(annotation))
+
+ return False
+
+
+# class RefinementBaseModel(XRPDBaseModel, extra="allow"):
+# ^ dont do this unless you want serualisation to get messy
+class RefinementBaseModel(XRPDBaseModel):
+ """
+ This class is use to contain Parameters, on it's own this class cannot be refined.
+
+ In the RefinementBaseModel ANYTHING that is a Parameter can be refined.
+ eg. Therefore if you set cubic lattice angles to refine, you will break symmetry.
+ This requires the user to know what they're doing.
+ With great power comes great reposibility"""
+
+ def get_bounds_from_metadata(self, metadata):
+ lower = None
+ upper = None
+
+ for meta in metadata:
+ ge = getattr(meta, "ge", None)
+ gt = getattr(meta, "gt", None)
+ le = getattr(meta, "le", None)
+ lt = getattr(meta, "lt", None)
+
+ if gt is not None:
+ lower = float(gt)
+ elif ge is not None and lower is None:
+ lower = float(ge)
+
+ if lt is not None:
+ upper = float(lt)
+ elif le is not None and upper is None:
+ upper = float(le)
+
+ if lower is None:
+ lower = -np.inf
+ if upper is None:
+ upper = np.inf
+
+ bounds = [float(lower), float(upper)]
+ return bounds
+
+ def parameterise_all(self, refine: bool = False):
+ for name, field_info in type(self).model_fields.items():
+ if is_parameter_like(annotation=field_info.annotation):
+ field = getattr(self, name)
+
+ if not isinstance(field, Parameter):
+ bounds = self.get_bounds_from_metadata(field_info.metadata)
+
+ setattr(
+ self,
+ name,
+ Parameter(value=float(field), refine=refine, bounds=bounds),
+ )
+
+ def deparameterise(self, value, parent, key):
+ if isinstance(value, Parameter):
+ setattr(parent, key, float(value.value))
+ return
+
+ if isinstance(value, RefinementBaseModel):
+ for sub_name in type(value).model_fields:
+ self.deparameterise(
+ getattr(value, sub_name),
+ value,
+ sub_name,
+ )
+ return
+
+ if isinstance(value, (tuple, list)):
+ for i, obj in enumerate(value):
+ self.deparameterise(obj, value, i)
+ return
+
+ def deparameterise_all(self):
+ """Turns things that maybe a Parmaeter into a float,
+ such that it can be more easily serialised"""
+
+ for name in type(self).model_fields:
+ self.deparameterise(getattr(self, name), self, name)
+
+ def path_to_string(self, path) -> str:
+ out = []
+ for p in path:
+ if isinstance(p, int):
+ out[-1] = f"{out[-1]}[{p}]"
+ else:
+ out.append(p)
+ return ".".join(out)
+
+ def iter_parameters(self, prefix=()):
+ fields = type(self).model_fields
+
+ for name in fields:
+ value = getattr(self, name)
+ path = prefix + (name,)
+
+ if isinstance(value, Parameter):
+ yield path, value
+ continue
+
+ elif isinstance(value, ParameterArray):
+ for i, p in enumerate(value.parameter_array):
+ subpath = path + (i,)
+ yield subpath, p
+
+ elif isinstance(value, RefinementBaseModel):
+ yield from value.iter_parameters(path)
+
+ elif isinstance(value, (list, tuple)):
+ for i, v in enumerate(value):
+ subpath = path + (i,)
+
+ if isinstance(v, Parameter):
+ yield subpath, v
+ elif isinstance(v, RefinementBaseModel):
+ yield from v.iter_parameters(subpath)
+
+ elif isinstance(value, dict):
+ for k, v in value.items():
+ subpath = path + (k,)
+
+ if isinstance(v, Parameter):
+ yield subpath, v
+ elif isinstance(v, RefinementBaseModel):
+ yield from v.iter_parameters(subpath)
+
+ def model_post_init(self, __context: Any):
+ params = self._collect_parameters()
+ self._bind_parameters(params)
+
+ def _collect_parameters(self) -> dict[str, Parameter]:
+ params: dict[str, Parameter] = {}
+
+ for name, value in self.__dict__.items():
+ if isinstance(value, Parameter):
+ params[name] = value
+
+ return params
+
+ def _bind_parameters(self, params: dict) -> None:
+ for name, param in params.items():
+ param._name = name # noqa
+ param._model = self # noqa
+
+ # def iter_parameters(self, prefix=()):
+ # """this version is better - but breaks if Paramater aren't fixed"""
+
+ # stack = deque([(prefix, self)])
+
+ # while stack:
+ # path, value = stack.pop()
+
+ # # --- Parameter (fast path, most important) ---
+ # if isinstance(value, Parameter):
+ # yield path, value
+ # continue
+
+ # # --- Model ---
+ # if isinstance(value, RefinementBaseModel):
+ # for name in value.model_fields:
+ # stack.append((path + (name,), getattr(value, name)))
+ # continue
+
+ # # --- Mapping ---
+ # if isinstance(value, dict):
+ # for k, v in value.items(): # type: ignore - this is impossible to not have items # noqa
+ # stack.append((path + (k,), v))
+ # continue
+
+ # # --- Iterable containers (lists, tuples, ParameterArray, etc.) ---
+ # if isinstance(value, Iterable) and not isinstance(value, (str, bytes)):
+ # # special-case: ParameterArray exposes internal list
+ # if hasattr(value, "parameter_array"):
+ # value = value.parameter_array
+
+ # for i, v in enumerate(value):
+ # stack.append((path + (i,), v))
+
+ def get_refinement_parameters(self) -> dict:
+ result = {}
+ seen = set()
+
+ for path, p in self.iter_parameters():
+ if not p.refine:
+ continue
+
+ pid = id(p)
+
+ # this bit can be removed after I have fixed how parameter stores equiv vals
+ if pid in seen:
+ continue
+
+ seen.add(pid)
+
+ # Only build string here (once)
+ key = self.path_to_string(path)
+ result[key] = p.value
+
+ return result
+
+ def get_param_by_path(self, path: str) -> Parameter:
+ obj = self
+ tokens = path.split(".")
+
+ for token in tokens:
+ if "[" in token:
+ name, rest = token.split("[", 1)
+ obj = getattr(obj, name)
+ obj = obj[int(rest[:-1])] # strip trailing ']'
+ else:
+ obj = getattr(obj, token)
+
+ if not isinstance(obj, Parameter):
+ raise TypeError(f"{path} does not resolve to Parameter")
+
+ return obj
+
+ def set_refinement_parameters(self, values: dict[str, float]):
+ # Build mapping once
+ path_map = {}
+ seen = set()
+
+ add_seen = seen.add
+
+ for path, p in self.iter_parameters():
+ if not p.refine:
+ continue
+
+ pid = id(p)
+ if pid in seen:
+ continue
+
+ add_seen(pid)
+ path_map[self.path_to_string(path)] = p
+
+ # Apply updates
+ for key, val in values.items():
+ path_map[key].value = float(val)
+
+ def refine_none(self, keep_refined: list[str] | None = None):
+ if keep_refined is None:
+ keep_refined = []
+
+ for name, param in self.iter_parameters():
+ if name[-1] in keep_refined:
+ continue
+ else:
+ param.refine = False
+
+ def refine_all(self, keep_fixed: list[str] | None = None):
+ if keep_fixed is None:
+ keep_fixed = []
+
+ for name, param in self.iter_parameters():
+ if name[-1] in keep_fixed:
+ continue
+ else:
+ param.refine = True
+
+
+ModelDataVar = TypeVar("ModelDataVar", XYEData, ScatteringData)
+
+
+class Model(RefinementBaseModel, Generic[ModelDataVar]):
+ """A model can be refined by the refiner. It must contain:
+ data and a way to calculate_profile
+
+ This class should contain RefinementBaseModel classes or Parameters/Parameter arrays
+ """
+
+ data: ModelDataVar
+
+ @abstractmethod
+ def calculate_profile(self):
+ raise NotImplementedError("Must implmenet calculate_profile for Model subclass")
+
+ def refine(
+ self,
+ method: RefineMethod = "least_squares",
+ *,
+ copy_model: bool = False,
+ bounds: Sequence[tuple[float, float]] | None = None,
+ plot: bool = False,
+ plot_every: int = 10,
+ step_time: float | None = None,
+ max_nfev: int = 1000,
+ maxiter: int | None = None,
+ callback: Callable[[np.ndarray], None] | None = None,
+ verbose: bool = True,
+ **kwargs: Any,
+ ) -> tuple[dict[str, float], Self, optimize.OptimizeResult]:
+ """This optimises the model"""
+
+ return refine_model(
+ self,
+ method=method,
+ copy_model=copy_model,
+ bounds=bounds,
+ plot=plot,
+ plot_every=plot_every,
+ step_time=step_time,
+ max_nfev=max_nfev,
+ maxiter=maxiter,
+ callback=callback,
+ verbose=verbose,
+ **kwargs,
+ )
+
+
+ModelType = TypeVar("ModelType", bound=Model)
+
+
+@dataclass
+class PlotState:
+ fig: Figure
+ ax: Axes
+ lines: tuple[Line2D, Line2D, Line2D]
+ canvas: FigureCanvasAgg
+ background: Any
+ offset: float
+
+
+def setup_plot(model: Model) -> PlotState:
+ plt.ion()
+ fig, ax = plt.subplots()
+
+ x = model.data.x
+ y_obs = model.data.y
+ y_calc = model.calculate_profile()
+ offset = -0.1 * np.max(y_obs)
+
+ (line_obs,) = ax.plot(
+ x,
+ y_obs,
+ linestyle="none",
+ marker=".",
+ color="black",
+ label="Observed",
+ )
+ (line_calc,) = ax.plot(x, y_calc, color="red", label="Calculated")
+ (line_diff,) = ax.plot(
+ x,
+ y_obs - y_calc + offset,
+ color="blue",
+ label="Obs - Calc",
+ )
+
+ ax.legend()
+
+ x_unit = getattr(model.data, "x_unit", "index")
+ ax.set_xlabel(x_unit)
+ ax.set_ylabel("Intensity")
+
+ ax.relim()
+
+ canvas = cast(FigureCanvasAgg, fig.canvas)
+ canvas.draw()
+ background = canvas.copy_from_bbox(ax.bbox)
+
+ return PlotState(
+ fig, ax, (line_obs, line_calc, line_diff), canvas, background, offset
+ )
+
+
+def update_plot(model: Model, plot_state: PlotState) -> None:
+ line_obs, line_calc, line_diff = plot_state.lines
+
+ y_obs = model.data.y
+ y_calc = model.calculate_profile()
+
+ line_calc.set_ydata(y_calc)
+ line_diff.set_ydata(y_obs - y_calc + plot_state.offset)
+
+ plot_state.ax.relim()
+ plot_state.ax.autoscale_view()
+
+ # Draw axes frame after rescaling
+ plot_state.canvas.draw()
+
+ # Explicitly draw animated artists (lines)
+ plot_state.ax.draw_artist(line_obs)
+ plot_state.ax.draw_artist(line_calc)
+ plot_state.ax.draw_artist(line_diff)
+ plot_state.canvas.blit(plot_state.ax.bbox)
+
+ plot_state.canvas.flush_events()
+
+
+def _get_refinable_parameters(model: Model) -> list[tuple[str, Parameter]]:
+ seen_ids: set[int] = set()
+ refinable: list[tuple[str, Parameter]] = []
+
+ for path, parameter in model.iter_parameters():
+ if not parameter.refine:
+ continue
+
+ if id(parameter) in seen_ids:
+ continue
+
+ if not isinstance(parameter.value, (int, float, np.integer, np.floating)):
+ continue
+
+ seen_ids.add(id(parameter))
+ refinable.append((".".join(str(token) for token in path), parameter))
+
+ return refinable
+
+
+def _build_parameter_vectors(
+ parameters: Sequence[tuple[str, Parameter]],
+) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
+ x0 = np.empty(len(parameters), dtype=float)
+ lower = np.empty(len(parameters), dtype=float)
+ upper = np.empty(len(parameters), dtype=float)
+
+ for index, (_, parameter) in enumerate(parameters):
+ x0[index] = float(parameter.value)
+ lower[index], upper[index] = parameter.bounds
+
+ return x0, lower, upper
+
+
+def _update_parameters(
+ parameters: Sequence[tuple[str, Parameter]], values: np.ndarray
+) -> None:
+ for index, (_, parameter) in enumerate(parameters):
+ parameter.value = float(values[index])
+
+
+def _default_plot_callback(plot_state: PlotState, model: Model, interval: int):
+ counter = {"step": 0}
+
+ def callback() -> None:
+ counter["step"] += 1
+ if counter["step"] % interval == 0:
+ update_plot(model, plot_state)
+
+ return callback
+
+
+def refine_model(
+ model: ModelType,
+ method: RefineMethod = "least_squares",
+ *,
+ copy_model: bool = False,
+ bounds: Sequence[tuple[float, float]] | None = None,
+ plot: bool = False,
+ plot_every: int = 10,
+ step_time: float | None = None,
+ max_nfev: int = 1000,
+ maxiter: int | None = None,
+ callback: Callable[[np.ndarray], None] | None = None,
+ verbose: bool = True,
+ **kwargs: Any,
+) -> tuple[dict[str, float], ModelType, optimize.OptimizeResult]:
+ """Refine a Model using SciPy optimization routines.
+
+ Parameters
+ ----------
+ model : Model
+ Model containing `data`, `calculate_profile`, and refinable parameters.
+ method : RefineMethod, optional
+ Optimization method. ``least_squares`` is the default.
+ copy_model : bool, optional
+ If True, the input model is deep-copied before refinement.
+ bounds : Optional[Sequence[Tuple[float, float]]], optional
+ Optional parameter bounds for ``minimize``. If not provided, parameter
+ bounds are inferred from the model's Parameter objects.
+ plot : bool, optional
+ If True, show a live refinement plot.
+ plot_every : int, optional
+ Update the plot every N iterations.
+ step_time : Optional[float], optional
+ Time in seconds to pause during each optimization evaluation.
+ max_nfev : int, optional
+ Maximum function evaluations for least-squares optimization.
+ maxiter : Optional[int], optional
+ Maximum iterations for general minimization.
+ callback : Optional[Callable[[np.ndarray], None]], optional
+ Optional callback invoked with the current parameter vector.
+ verbose : bool, optional
+ If True (default), print chi-squared and parameter values after each evaluation.
+ **kwargs : Any
+ Additional optimizer-specific keyword arguments.
+
+ Returns
+ -------
+ tuple[dict[str, float], ModelType, optimize.OptimizeResult]
+ A tuple containing updated parameter values, the refined model,
+ and the SciPy optimization result.
+ """
+ optimized_model = deepcopy(model) if copy_model else model
+ parameters = _get_refinable_parameters(optimized_model)
+
+ if not parameters:
+ raise ValueError("No refinable parameters found")
+
+ x0, lower, upper = _build_parameter_vectors(parameters)
+ y_obs = np.asarray(optimized_model.data.y, dtype=float)
+
+ plot_state: PlotState | None = None
+ plot_callback: Callable[[], None]
+
+ if plot:
+ plot_state = setup_plot(optimized_model)
+ plot_callback = _default_plot_callback(plot_state, optimized_model, plot_every)
+ else:
+
+ def _no_plot() -> None:
+ pass
+
+ plot_callback = _no_plot
+
+ def _evaluate(x: np.ndarray) -> np.ndarray:
+ _update_parameters(parameters, x)
+ if step_time is not None and step_time > 0:
+ time.sleep(step_time)
+
+ if callback is not None:
+ callback(x)
+
+ plot_callback()
+ y_calc = optimized_model.calculate_profile()
+ residuals = y_obs - np.asarray(y_calc, dtype=float)
+
+ chi_squared = calculate_chi_squared(
+ y_calc=y_calc, y_obs=model.data.y, y_obs_error=model.data.e
+ )
+
+ rwp = calculate_rwp(y_calc=y_calc, y_obs=model.data.y, y_obs_error=model.data.e)
+ rp = calculate_rp(y_calc=y_calc, y_obs=model.data.y)
+
+ print(f"Chi-squared: {chi_squared}")
+ print(f"Rwp: {rwp}")
+ print(f"Rp: {rp}")
+
+ if verbose:
+ for path, param in parameters:
+ value = param.value
+
+ if abs(float(value)) >= 10000:
+ value_str = f"{value:12.3e}"
+ else:
+ value_str = f"{value:12.3f}"
+
+ print(f"{path:<40} : {value_str}")
+
+ print()
+
+ return residuals
+
+ if method in {"least_squares", "trf", "dogbox", "lm"}:
+ solver_kwargs: dict[str, Any] = {
+ "x0": x0,
+ "bounds": (lower, upper),
+ "max_nfev": max_nfev,
+ **kwargs,
+ }
+
+ if method != "least_squares":
+ solver_kwargs["method"] = method
+
+ result = optimize.least_squares(_evaluate, **solver_kwargs)
+ else:
+
+ def _objective(x: np.ndarray) -> float:
+ residual = _evaluate(x)
+ return float(np.dot(residual, residual))
+
+ minimize_bounds = (
+ bounds if bounds is not None else list(zip(lower, upper, strict=True))
+ )
+ minimize_options = kwargs.pop("options", {})
+ if maxiter is not None:
+ minimize_options["maxiter"] = maxiter
+
+ result = optimize.minimize(
+ _objective,
+ x0,
+ method=method,
+ bounds=minimize_bounds,
+ options=minimize_options,
+ **kwargs,
+ )
+
+ _update_parameters(parameters, np.asarray(result.x, dtype=float))
+ updated = {
+ path: float(result.x[index]) for index, (path, _) in enumerate(parameters)
+ }
+
+ if plot and plot_state is not None:
+ plt.close(plot_state.fig)
+
+ return updated, optimized_model, result
+
+
+if __name__ == "__main__":
+ rf = RefinementBaseModel()
+ rf["a"] = 1
+
+ print(rf.model_dump_json())
+
+ print(rf)
diff --git a/src/xrpd_toolbox/fit_engine/form_factors.py b/src/xrpd_toolbox/fit_engine/form_factors.py
new file mode 100644
index 0000000..a44ad64
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/form_factors.py
@@ -0,0 +1,4096 @@
+"""
+Contains atomic scattering factors from
+"New Analytical Scattering Factor Functions for Free Atoms
+and Ions for Free Atoms and Ions",
+D. Waasmaier & A. Kirfel,
+*Acta Cryst.* **(1995).** A51, 416-413.
+
+Also, tabulated coefficients for calculation of Compton Cross Section as a function of
+sin(theta)/lambda from
+"Analytic Approximations to Incoherently Scattered X-Ray Intensities",
+H. H. M. Balyuzi, *Acta Cryst.* **(1975).** A31, 600.
+
+"""
+
+#
+# The atomic scattering factor is calculated using the method developed by
+# D. Waasmaier & A. Kirfel
+#
+# New Analytical Scattering Factor Functions for Free Atoms
+# and Ions for Free Atoms and Ions
+# D. Waasmaier & A. Kirfel
+# Acta Cryst. (1995). A51, 416-413
+#
+# fo the non-dispersive part of the atomic scattering factor is a
+# function of the selected element and of sin(theta)/lambda, where
+# lambda is the photon wavelengh and theta is incident angle.
+# This function can be approximated by a function:
+#
+# f0[k] = c + [SUM a_i*EXP(-b_i*(k^2)) ]
+# i=1,5
+#
+# where k = sin(theta) / lambda and c, a_i and b_i
+# are the coefficients tabulated in this file (in columns:
+# a1 a2 a3 a4 a5 c b1 b2 b3 b4 b5
+#
+X_RAY_FORM_FACTORS = {
+ "H": [
+ 0.413048,
+ 0.294953,
+ 0.187491,
+ 0.080701,
+ 0.023736,
+ 0.000049,
+ 15.569946,
+ 32.398468,
+ 5.711404,
+ 61.889874,
+ 1.334118,
+ ],
+ "He": [
+ 0.732354,
+ 0.753896,
+ 0.283819,
+ 0.190003,
+ 0.039139,
+ 0.000487,
+ 11.553918,
+ 4.595831,
+ 1.546299,
+ 26.463964,
+ 0.377523,
+ ],
+ "Li": [
+ 0.974637,
+ 0.158472,
+ 0.811855,
+ 0.262416,
+ 0.790108,
+ 0.002542,
+ 4.334946,
+ 0.342451,
+ 97.102966,
+ 201.363831,
+ 1.409234,
+ ],
+ "Be": [
+ 1.533712,
+ 0.638283,
+ 0.601052,
+ 0.106139,
+ 1.118414,
+ 0.002511,
+ 42.662079,
+ 0.595420,
+ 99.106499,
+ 0.151340,
+ 1.843093,
+ ],
+ "B": [
+ 2.085185,
+ 1.064580,
+ 1.062788,
+ 0.140515,
+ 0.641784,
+ 0.003823,
+ 23.494068,
+ 1.137894,
+ 61.238976,
+ 0.114886,
+ 0.399036,
+ ],
+ "C": [
+ 2.657506,
+ 1.078079,
+ 1.490909,
+ -4.241070,
+ 0.713791,
+ 4.297983,
+ 14.780758,
+ 0.776775,
+ 42.086842,
+ -0.000294,
+ 0.239535,
+ ],
+ "N": [
+ 11.893780,
+ 3.277479,
+ 1.858092,
+ 0.858927,
+ 0.912985,
+ -11.80490,
+ 0.000158,
+ 10.232723,
+ 30.344690,
+ 0.656065,
+ 0.217287,
+ ],
+ "O": [
+ 2.960427,
+ 2.508818,
+ 0.637853,
+ 0.722838,
+ 1.142756,
+ 0.027014,
+ 14.182259,
+ 5.936858,
+ 0.112726,
+ 34.958481,
+ 0.390240,
+ ],
+ "F": [
+ 3.511943,
+ 2.772244,
+ 0.678385,
+ 0.915159,
+ 1.089261,
+ 0.032557,
+ 10.687859,
+ 4.380466,
+ 0.093982,
+ 27.255203,
+ 0.313066,
+ ],
+ "Ne": [
+ 4.183749,
+ 2.905726,
+ 0.520513,
+ 1.135641,
+ 1.228065,
+ 0.025576,
+ 8.175457,
+ 3.252536,
+ 0.063295,
+ 21.813910,
+ 0.224952,
+ ],
+ "Na": [
+ 4.910127,
+ 3.081783,
+ 1.262067,
+ 1.098938,
+ 0.560991,
+ 0.079712,
+ 3.281434,
+ 9.119178,
+ 0.102763,
+ 132.013947,
+ 0.405878,
+ ],
+ "Mg": [
+ 4.708971,
+ 1.194814,
+ 1.558157,
+ 1.170413,
+ 3.239403,
+ 0.126842,
+ 4.875207,
+ 108.506081,
+ 0.111516,
+ 48.292408,
+ 1.928171,
+ ],
+ "Al": [
+ 4.730796,
+ 2.313951,
+ 1.541980,
+ 1.117564,
+ 3.154754,
+ 0.139509,
+ 3.628931,
+ 43.051167,
+ 0.095960,
+ 108.932388,
+ 1.555918,
+ ],
+ "Si": [
+ 5.275329,
+ 3.191038,
+ 1.511514,
+ 1.356849,
+ 2.519114,
+ 0.145073,
+ 2.631338,
+ 33.730728,
+ 0.081119,
+ 86.288643,
+ 1.170087,
+ ],
+ "P": [
+ 1.950541,
+ 4.146930,
+ 1.494560,
+ 1.522042,
+ 5.729711,
+ 0.155233,
+ 0.908139,
+ 27.044952,
+ 0.071280,
+ 67.520187,
+ 1.981173,
+ ],
+ "S": [
+ 6.372157,
+ 5.154568,
+ 1.473732,
+ 1.635073,
+ 1.209372,
+ 0.154722,
+ 1.514347,
+ 22.092527,
+ 0.061373,
+ 55.445175,
+ 0.646925,
+ ],
+ "Cl": [
+ 1.446071,
+ 6.870609,
+ 6.151801,
+ 1.750347,
+ 0.634168,
+ 0.146773,
+ 0.052357,
+ 1.193165,
+ 18.343416,
+ 46.398396,
+ 0.401005,
+ ],
+ "Ar": [
+ 7.188004,
+ 6.638454,
+ 0.454180,
+ 1.929593,
+ 1.523654,
+ 0.265954,
+ 0.956221,
+ 15.339877,
+ 15.339862,
+ 39.043823,
+ 0.062409,
+ ],
+ "K": [
+ 8.163991,
+ 7.146945,
+ 1.070140,
+ 0.877316,
+ 1.486434,
+ 0.253614,
+ 12.816323,
+ 0.808945,
+ 210.327011,
+ 39.597652,
+ 0.052821,
+ ],
+ "Ca": [
+ 8.593655,
+ 1.477324,
+ 1.436254,
+ 1.182839,
+ 7.113258,
+ 0.196255,
+ 10.460644,
+ 0.041891,
+ 81.390381,
+ 169.847839,
+ 0.688098,
+ ],
+ "Sc": [
+ 1.476566,
+ 1.487278,
+ 1.600187,
+ 9.177463,
+ 7.099750,
+ 0.157765,
+ 53.131023,
+ 0.035325,
+ 137.319489,
+ 9.098031,
+ 0.602102,
+ ],
+ "Ti": [
+ 9.818524,
+ 1.522646,
+ 1.703101,
+ 1.768774,
+ 7.082555,
+ 0.102473,
+ 8.001879,
+ 0.029763,
+ 39.885422,
+ 120.157997,
+ 0.532405,
+ ],
+ "V": [
+ 10.473575,
+ 1.547881,
+ 1.986381,
+ 1.865616,
+ 7.056250,
+ 0.067744,
+ 7.081940,
+ 0.026040,
+ 31.909672,
+ 108.022842,
+ 0.474882,
+ ],
+ "Cr": [
+ 11.007069,
+ 1.555477,
+ 2.985293,
+ 1.347855,
+ 7.034779,
+ 0.065510,
+ 6.366281,
+ 0.023987,
+ 23.244839,
+ 105.774498,
+ 0.429369,
+ ],
+ "Mn": [
+ 11.709542,
+ 1.733414,
+ 2.673141,
+ 2.023368,
+ 7.003180,
+ -0.147293,
+ 5.597120,
+ 0.017800,
+ 21.788420,
+ 89.517914,
+ 0.383054,
+ ],
+ "Fe": [
+ 12.311098,
+ 1.876623,
+ 3.066177,
+ 2.070451,
+ 6.975185,
+ -0.304931,
+ 5.009415,
+ 0.014461,
+ 18.743040,
+ 82.767876,
+ 0.346506,
+ ],
+ "Co": [
+ 12.914510,
+ 2.481908,
+ 3.466894,
+ 2.106351,
+ 6.960892,
+ -0.936572,
+ 4.507138,
+ 0.009126,
+ 16.438129,
+ 76.987320,
+ 0.314418,
+ ],
+ "Ni": [
+ 13.521865,
+ 6.947285,
+ 3.866028,
+ 2.135900,
+ 4.284731,
+ -2.762697,
+ 4.077277,
+ 0.286763,
+ 14.622634,
+ 71.966080,
+ 0.004437,
+ ],
+ "Cu": [
+ 14.014192,
+ 4.784577,
+ 5.056806,
+ 1.457971,
+ 6.932996,
+ -3.254477,
+ 3.738280,
+ 0.003744,
+ 13.034982,
+ 72.554794,
+ 0.265666,
+ ],
+ "Zn": [
+ 14.741002,
+ 6.907748,
+ 4.642337,
+ 2.191766,
+ 38.424042,
+ -36.915829,
+ 3.388232,
+ 0.243315,
+ 11.903689,
+ 63.312130,
+ 0.000397,
+ ],
+ "Ga": [
+ 15.758946,
+ 6.841123,
+ 4.121016,
+ 2.714681,
+ 2.395246,
+ -0.847395,
+ 3.121754,
+ 0.226057,
+ 12.482196,
+ 66.203621,
+ 0.007238,
+ ],
+ "Ge": [
+ 16.540613,
+ 1.567900,
+ 3.727829,
+ 3.345098,
+ 6.785079,
+ 0.018726,
+ 2.866618,
+ 0.012198,
+ 13.432163,
+ 58.866047,
+ 0.210974,
+ ],
+ "As": [
+ 17.025642,
+ 4.503441,
+ 3.715904,
+ 3.937200,
+ 6.790175,
+ -2.984117,
+ 2.597739,
+ 0.003012,
+ 14.272119,
+ 50.437996,
+ 0.193015,
+ ],
+ "Se": [
+ 17.354071,
+ 4.653248,
+ 4.259489,
+ 4.136455,
+ 6.749163,
+ -3.160982,
+ 2.349787,
+ 0.002550,
+ 15.579460,
+ 45.181202,
+ 0.177432,
+ ],
+ "Br": [
+ 17.550570,
+ 5.411882,
+ 3.937180,
+ 3.880645,
+ 6.707793,
+ -2.492088,
+ 2.119226,
+ 16.557184,
+ 0.002481,
+ 42.164009,
+ 0.162121,
+ ],
+ "Kr": [
+ 17.655279,
+ 6.848105,
+ 4.171004,
+ 3.446760,
+ 6.685200,
+ -2.810592,
+ 1.908231,
+ 16.606236,
+ 0.001598,
+ 39.917473,
+ 0.146896,
+ ],
+ "Rb": [
+ 8.123134,
+ 2.138042,
+ 6.761702,
+ 1.156051,
+ 17.679546,
+ 1.139548,
+ 15.142385,
+ 33.542667,
+ 0.129372,
+ 224.132507,
+ 1.713368,
+ ],
+ "Sr": [
+ 17.730219,
+ 9.795867,
+ 6.099763,
+ 2.620025,
+ 0.600053,
+ 1.140251,
+ 1.563060,
+ 14.310868,
+ 0.120574,
+ 135.771317,
+ 0.120574,
+ ],
+ "Y": [
+ 17.792040,
+ 10.253252,
+ 5.714949,
+ 3.170516,
+ 0.918251,
+ 1.131787,
+ 1.429691,
+ 13.132816,
+ 0.112173,
+ 108.197029,
+ 0.112173,
+ ],
+ "Zr": [
+ 17.859772,
+ 10.911038,
+ 5.821115,
+ 3.512513,
+ 0.746965,
+ 1.124859,
+ 1.310692,
+ 12.319285,
+ 0.104353,
+ 91.777542,
+ 0.104353,
+ ],
+ "Nb": [
+ 17.958399,
+ 12.063054,
+ 5.007015,
+ 3.287667,
+ 1.531019,
+ 1.123452,
+ 1.211590,
+ 12.246687,
+ 0.098615,
+ 75.011948,
+ 0.098615,
+ ],
+ "Mo": [
+ 6.236218,
+ 17.987711,
+ 12.973127,
+ 3.451426,
+ 0.210899,
+ 1.108770,
+ 0.090780,
+ 1.108310,
+ 11.468720,
+ 66.684151,
+ 0.090780,
+ ],
+ "Tc": [
+ 17.840963,
+ 3.428236,
+ 1.373012,
+ 12.947364,
+ 6.335469,
+ 1.074784,
+ 1.005729,
+ 41.901382,
+ 119.320541,
+ 9.781542,
+ 0.083391,
+ ],
+ "Ru": [
+ 6.271624,
+ 17.906738,
+ 14.123269,
+ 3.746008,
+ 0.908235,
+ 1.043992,
+ 0.077040,
+ 0.928222,
+ 9.555345,
+ 35.860680,
+ 123.552246,
+ ],
+ "Rh": [
+ 6.216648,
+ 17.919739,
+ 3.854252,
+ 0.840326,
+ 15.173498,
+ 0.995452,
+ 0.070789,
+ 0.856121,
+ 33.889484,
+ 121.686691,
+ 9.029517,
+ ],
+ "Pd": [
+ 6.121511,
+ 4.784063,
+ 16.631683,
+ 4.318258,
+ 13.246773,
+ 0.883099,
+ 0.062549,
+ 0.784031,
+ 8.751391,
+ 34.489983,
+ 0.784031,
+ ],
+ "Ag": [
+ 6.073874,
+ 17.155437,
+ 4.173344,
+ 0.852238,
+ 17.988686,
+ 0.756603,
+ 0.055333,
+ 7.896512,
+ 28.443739,
+ 110.376106,
+ 0.716809,
+ ],
+ "Cd": [
+ 6.080986,
+ 18.019468,
+ 4.018197,
+ 1.303510,
+ 17.974669,
+ 0.603504,
+ 0.048990,
+ 7.273646,
+ 29.119284,
+ 95.831207,
+ 0.661231,
+ ],
+ "In": [
+ 6.196477,
+ 18.816183,
+ 4.050479,
+ 1.638929,
+ 17.962912,
+ 0.333097,
+ 0.042072,
+ 6.695665,
+ 31.009790,
+ 103.284348,
+ 0.610714,
+ ],
+ "Sn": [
+ 19.325171,
+ 6.281571,
+ 4.498866,
+ 1.856934,
+ 17.917318,
+ 0.119024,
+ 6.118104,
+ 0.036915,
+ 32.529045,
+ 95.037186,
+ 0.565651,
+ ],
+ "Sb": [
+ 5.394956,
+ 6.549570,
+ 19.650681,
+ 1.827820,
+ 17.867832,
+ -0.290506,
+ 33.326523,
+ 0.030974,
+ 5.564929,
+ 87.130966,
+ 0.523992,
+ ],
+ "Te": [
+ 6.660302,
+ 6.940756,
+ 19.847015,
+ 1.557175,
+ 17.802427,
+ -0.806668,
+ 33.031654,
+ 0.025750,
+ 5.065547,
+ 84.101616,
+ 0.487660,
+ ],
+ "I": [
+ 19.884502,
+ 6.736593,
+ 8.110516,
+ 1.170953,
+ 17.548716,
+ -0.448811,
+ 4.628591,
+ 0.027754,
+ 31.849096,
+ 84.406387,
+ 0.463550,
+ ],
+ "Xe": [
+ 19.978920,
+ 11.774945,
+ 9.332182,
+ 1.244749,
+ 17.737501,
+ -6.065902,
+ 4.143356,
+ 0.010142,
+ 28.796200,
+ 75.280685,
+ 0.413616,
+ ],
+ "Cs": [
+ 17.418674,
+ 8.314444,
+ 10.323193,
+ 1.383834,
+ 19.876251,
+ -2.322802,
+ 0.399828,
+ 0.016872,
+ 25.605827,
+ 233.339676,
+ 3.826915,
+ ],
+ "Ba": [
+ 19.747343,
+ 17.368477,
+ 10.465718,
+ 2.592602,
+ 11.003653,
+ -5.183497,
+ 3.481823,
+ 0.371224,
+ 21.226641,
+ 173.834274,
+ 0.010719,
+ ],
+ "La": [
+ 19.966019,
+ 27.329655,
+ 11.018425,
+ 3.086696,
+ 17.335455,
+ -21.745489,
+ 3.197408,
+ 0.003446,
+ 19.955492,
+ 141.381973,
+ 0.341817,
+ ],
+ "Ce": [
+ 17.355122,
+ 43.988499,
+ 20.546650,
+ 3.130670,
+ 11.353665,
+ -38.386017,
+ 0.328369,
+ 0.002047,
+ 3.088196,
+ 134.907654,
+ 18.832960,
+ ],
+ "Pr": [
+ 21.551311,
+ 17.161730,
+ 11.903859,
+ 2.679103,
+ 9.564197,
+ -3.871068,
+ 2.995675,
+ 0.312491,
+ 17.716705,
+ 152.192825,
+ 0.010468,
+ ],
+ "Nd": [
+ 17.331244,
+ 62.783924,
+ 12.160097,
+ 2.663483,
+ 22.239950,
+ -57.189842,
+ 0.300269,
+ 0.001320,
+ 17.026001,
+ 148.748993,
+ 2.910268,
+ ],
+ "Pm": [
+ 17.286388,
+ 51.560162,
+ 12.478557,
+ 2.675515,
+ 22.960947,
+ -45.973682,
+ 0.286620,
+ 0.001550,
+ 16.223755,
+ 143.984512,
+ 2.796480,
+ ],
+ "Sm": [
+ 23.700363,
+ 23.072214,
+ 12.777782,
+ 2.684217,
+ 17.204367,
+ -17.452166,
+ 2.689539,
+ 0.003491,
+ 15.495437,
+ 139.862473,
+ 0.274536,
+ ],
+ "Eu": [
+ 17.186195,
+ 37.156837,
+ 13.103387,
+ 2.707246,
+ 24.419271,
+ -31.586687,
+ 0.261678,
+ 0.001995,
+ 14.787360,
+ 134.816299,
+ 2.581883,
+ ],
+ "Gd": [
+ 24.898117,
+ 17.104952,
+ 13.222581,
+ 3.266152,
+ 48.995213,
+ -43.505684,
+ 2.435028,
+ 0.246961,
+ 13.996325,
+ 110.863091,
+ 0.001383,
+ ],
+ "Tb": [
+ 25.910013,
+ 32.344139,
+ 13.765117,
+ 2.751404,
+ 17.064405,
+ -26.851971,
+ 2.373912,
+ 0.002034,
+ 13.481969,
+ 125.836510,
+ 0.236916,
+ ],
+ "Dy": [
+ 26.671785,
+ 88.687576,
+ 14.065445,
+ 2.768497,
+ 17.067781,
+ -83.279831,
+ 2.282593,
+ 0.000665,
+ 12.920230,
+ 121.937187,
+ 0.225531,
+ ],
+ "Ho": [
+ 27.150190,
+ 16.999819,
+ 14.059334,
+ 3.386979,
+ 46.546471,
+ -41.165253,
+ 2.169660,
+ 0.215414,
+ 12.213148,
+ 100.506783,
+ 0.001211,
+ ],
+ "Er": [
+ 28.174887,
+ 82.493271,
+ 14.624002,
+ 2.802756,
+ 17.018515,
+ -77.135223,
+ 2.120995,
+ 0.000640,
+ 11.915256,
+ 114.529938,
+ 0.207519,
+ ],
+ "Tm": [
+ 28.925894,
+ 76.173798,
+ 14.904704,
+ 2.814812,
+ 16.998117,
+ -70.839813,
+ 2.046203,
+ 0.000656,
+ 11.465375,
+ 111.411980,
+ 0.199376,
+ ],
+ "Yb": [
+ 29.676760,
+ 65.624069,
+ 15.160854,
+ 2.830288,
+ 16.997850,
+ -60.313812,
+ 1.977630,
+ 0.000720,
+ 11.044622,
+ 108.139153,
+ 0.192110,
+ ],
+ "Lu": [
+ 30.122866,
+ 15.099346,
+ 56.314899,
+ 3.540980,
+ 16.943729,
+ -51.049416,
+ 1.883090,
+ 10.342764,
+ 0.000780,
+ 89.559250,
+ 0.183849,
+ ],
+ "Hf": [
+ 30.617033,
+ 15.145351,
+ 54.933548,
+ 4.096253,
+ 16.896156,
+ -49.719837,
+ 1.795613,
+ 9.934469,
+ 0.000739,
+ 76.189705,
+ 0.175914,
+ ],
+ "Ta": [
+ 31.066359,
+ 15.341823,
+ 49.278297,
+ 4.577665,
+ 16.828321,
+ -44.119026,
+ 1.708732,
+ 9.618455,
+ 0.000760,
+ 66.346199,
+ 0.168002,
+ ],
+ "W": [
+ 31.507900,
+ 15.682498,
+ 37.960129,
+ 4.885509,
+ 16.792112,
+ -32.864574,
+ 1.629485,
+ 9.446448,
+ 0.000898,
+ 59.980675,
+ 0.160798,
+ ],
+ "Re": [
+ 31.888456,
+ 16.117104,
+ 42.390297,
+ 5.211669,
+ 16.767591,
+ -37.412682,
+ 1.549238,
+ 9.233474,
+ 0.000689,
+ 54.516373,
+ 0.152815,
+ ],
+ "Os": [
+ 32.210297,
+ 16.678440,
+ 48.559906,
+ 5.455839,
+ 16.735533,
+ -43.677956,
+ 1.473531,
+ 9.049695,
+ 0.000519,
+ 50.210201,
+ 0.145771,
+ ],
+ "Ir": [
+ 32.004436,
+ 1.975454,
+ 17.070105,
+ 15.939454,
+ 5.990003,
+ 4.018893,
+ 1.353767,
+ 81.014175,
+ 0.128093,
+ 7.661196,
+ 26.659403,
+ ],
+ "Pt": [
+ 31.273891,
+ 18.445440,
+ 17.063745,
+ 5.555933,
+ 1.575270,
+ 4.050394,
+ 1.316992,
+ 8.797154,
+ 0.124741,
+ 40.177994,
+ 1.316997,
+ ],
+ "Au": [
+ 16.777390,
+ 19.317156,
+ 32.979683,
+ 5.595453,
+ 10.576854,
+ -6.279078,
+ 0.122737,
+ 8.621570,
+ 1.256902,
+ 38.008820,
+ 0.000601,
+ ],
+ "Hg": [
+ 16.839890,
+ 20.023823,
+ 28.428564,
+ 5.881564,
+ 4.714706,
+ 4.076478,
+ 0.115905,
+ 8.256927,
+ 1.195250,
+ 39.247227,
+ 1.195250,
+ ],
+ "Tl": [
+ 16.630795,
+ 19.386616,
+ 32.808571,
+ 1.747191,
+ 6.356862,
+ 4.066939,
+ 0.110704,
+ 7.181401,
+ 1.119730,
+ 90.660263,
+ 26.014978,
+ ],
+ "Pb": [
+ 16.419567,
+ 32.738590,
+ 6.530247,
+ 2.342742,
+ 19.916475,
+ 4.049824,
+ 0.105499,
+ 1.055049,
+ 25.025890,
+ 80.906593,
+ 6.664449,
+ ],
+ "Bi": [
+ 16.282274,
+ 32.725136,
+ 6.678302,
+ 2.694750,
+ 20.576559,
+ 4.040914,
+ 0.101180,
+ 1.002287,
+ 25.714146,
+ 77.057549,
+ 6.291882,
+ ],
+ "Po": [
+ 16.289164,
+ 32.807171,
+ 21.095163,
+ 2.505901,
+ 7.254589,
+ 4.046556,
+ 0.098121,
+ 0.966265,
+ 6.046622,
+ 76.598068,
+ 28.096128,
+ ],
+ "At": [
+ 16.011461,
+ 32.615547,
+ 8.113899,
+ 2.884082,
+ 21.377867,
+ 3.995684,
+ 0.092639,
+ 0.904416,
+ 26.543257,
+ 68.372963,
+ 5.499512,
+ ],
+ "Rn": [
+ 16.070229,
+ 32.641106,
+ 21.489658,
+ 2.299218,
+ 9.480184,
+ 4.020977,
+ 0.090437,
+ 0.876409,
+ 5.239687,
+ 69.188477,
+ 27.632641,
+ ],
+ "Fr": [
+ 16.007385,
+ 32.663830,
+ 21.594351,
+ 1.598497,
+ 11.121192,
+ 4.003472,
+ 0.087031,
+ 0.840187,
+ 4.954467,
+ 199.805801,
+ 26.905106,
+ ],
+ "Ra": [
+ 32.563690,
+ 21.396671,
+ 11.298093,
+ 2.834688,
+ 15.914965,
+ 3.981773,
+ 0.801980,
+ 4.590666,
+ 22.758972,
+ 160.404388,
+ 0.083544,
+ ],
+ "Ac": [
+ 15.914053,
+ 32.535042,
+ 21.553976,
+ 11.433394,
+ 3.612409,
+ 3.939212,
+ 0.080511,
+ 0.770669,
+ 4.352206,
+ 21.381622,
+ 130.500748,
+ ],
+ "Th": [
+ 15.784024,
+ 32.454899,
+ 21.849222,
+ 4.239077,
+ 11.736191,
+ 3.922533,
+ 0.077067,
+ 0.735137,
+ 4.097976,
+ 109.464111,
+ 20.512138,
+ ],
+ "Pa": [
+ 32.740208,
+ 21.973675,
+ 12.957398,
+ 3.683832,
+ 15.744058,
+ 3.886066,
+ 0.709545,
+ 4.050881,
+ 19.231543,
+ 117.255005,
+ 0.074040,
+ ],
+ "U": [
+ 15.679275,
+ 32.824306,
+ 13.660459,
+ 3.687261,
+ 22.279434,
+ 3.854444,
+ 0.071206,
+ 0.681177,
+ 18.236156,
+ 112.500038,
+ 3.930325,
+ ],
+ "Np": [
+ 32.999901,
+ 22.638077,
+ 14.219973,
+ 3.672950,
+ 15.683245,
+ 3.769391,
+ 0.657086,
+ 3.854918,
+ 17.435474,
+ 109.464485,
+ 0.068033,
+ ],
+ "Pu": [
+ 33.281178,
+ 23.148544,
+ 15.153755,
+ 3.031492,
+ 15.704215,
+ 3.664200,
+ 0.634999,
+ 3.856168,
+ 16.849735,
+ 121.292038,
+ 0.064857,
+ ],
+ "Am": [
+ 33.435162,
+ 23.657259,
+ 15.576339,
+ 3.027023,
+ 15.746100,
+ 3.541160,
+ 0.612785,
+ 3.792942,
+ 16.195778,
+ 117.757004,
+ 0.061755,
+ ],
+ "Cm": [
+ 15.804837,
+ 33.480801,
+ 24.150198,
+ 3.655563,
+ 15.499866,
+ 3.390840,
+ 0.058619,
+ 0.590160,
+ 3.674720,
+ 100.736191,
+ 15.408296,
+ ],
+ "Bk": [
+ 15.889072,
+ 33.625286,
+ 24.710381,
+ 3.707139,
+ 15.839268,
+ 3.213169,
+ 0.055503,
+ 0.569571,
+ 3.615472,
+ 97.694786,
+ 14.754303,
+ ],
+ "Cf": [
+ 33.794075,
+ 25.467693,
+ 16.048487,
+ 3.657525,
+ 16.008982,
+ 3.005326,
+ 0.550447,
+ 3.581973,
+ 14.357388,
+ 96.064972,
+ 0.052450,
+ ],
+ "H1-": [
+ 0.702260,
+ 0.763666,
+ 0.248678,
+ 0.261323,
+ 0.023017,
+ 0.000425,
+ 23.945604,
+ 74.897919,
+ 6.773289,
+ 233.583450,
+ 1.337,
+ ],
+ "Li1+": [
+ 0.432724,
+ 0.549257,
+ 0.376575,
+ -0.336481,
+ 0.976060,
+ 0.001764,
+ 0.260367,
+ 1.042836,
+ 7.885294,
+ 0.260368,
+ 3.042,
+ ],
+ "Be2+": [
+ 3.055430,
+ -2.372617,
+ 1.044914,
+ 0.544233,
+ 0.381737,
+ -0.653773,
+ 0.001226,
+ 0.001227,
+ 1.542106,
+ 0.456279,
+ 4.047,
+ ],
+ "Cval": [
+ 1.258489,
+ 0.728215,
+ 1.119856,
+ 2.168133,
+ 0.705239,
+ 0.019722,
+ 10.683769,
+ 0.208177,
+ 0.836097,
+ 24.603704,
+ 58.954,
+ ],
+ "O1-": [
+ 3.106934,
+ 3.235142,
+ 1.148886,
+ 0.783981,
+ 0.676953,
+ 0.046136,
+ 19.868080,
+ 6.960252,
+ 0.170043,
+ 65.693512,
+ 0.630,
+ ],
+ "O2-": [
+ 3.990247,
+ 2.300563,
+ 0.607200,
+ 1.907882,
+ 1.167080,
+ 0.025429,
+ 16.639956,
+ 5.636819,
+ 0.108493,
+ 47.299709,
+ 0.379,
+ ],
+ "F1-": [
+ 0.457649,
+ 3.841561,
+ 1.432771,
+ 0.801876,
+ 3.395041,
+ 0.069525,
+ 0.917243,
+ 5.507803,
+ 0.164955,
+ 51.076206,
+ 15.821,
+ ],
+ "Na1+": [
+ 3.148690,
+ 4.073989,
+ 0.767888,
+ 0.995612,
+ 0.968249,
+ 0.045300,
+ 2.594987,
+ 6.046925,
+ 0.070139,
+ 14.122657,
+ 0.217,
+ ],
+ "Mg2+": [
+ 3.062918,
+ 4.135106,
+ 0.853742,
+ 1.036792,
+ 0.852520,
+ 0.058851,
+ 2.015803,
+ 4.417941,
+ 0.065307,
+ 9.669710,
+ 0.187,
+ ],
+ "Al3+": [
+ 4.132015,
+ 0.912049,
+ 1.102425,
+ 0.614876,
+ 3.219136,
+ 0.019397,
+ 3.528641,
+ 7.378344,
+ 0.133708,
+ 0.039065,
+ 1.644,
+ ],
+ "Siva": [
+ 2.879033,
+ 3.072960,
+ 1.515981,
+ 1.390030,
+ 4.995051,
+ 0.146030,
+ 1.239713,
+ 38.706276,
+ 0.081481,
+ 93.616333,
+ 2.770,
+ ],
+ "Si4+": [
+ 3.676722,
+ 3.828496,
+ 1.258033,
+ 0.419024,
+ 0.720421,
+ 0.097266,
+ 1.446851,
+ 3.013144,
+ 0.064397,
+ 0.206254,
+ 5.970,
+ ],
+ "Cl1-": [
+ 1.061802,
+ 7.139886,
+ 6.524271,
+ 2.355626,
+ 35.829403,
+ -34.916603,
+ 0.144727,
+ 1.171795,
+ 19.467655,
+ 60.320301,
+ 0.000,
+ ],
+ "K1+": [
+ -17.609339,
+ 1.494873,
+ 7.150305,
+ 10.899569,
+ 15.808228,
+ 0.257164,
+ 18.840979,
+ 0.053453,
+ 0.812940,
+ 22.264105,
+ 14.351,
+ ],
+ "Ca2+": [
+ 8.501441,
+ 12.880483,
+ 9.765095,
+ 7.156669,
+ 0.711160,
+ -21.013187,
+ 10.525848,
+ -0.004033,
+ 0.010692,
+ 0.684443,
+ 27.231,
+ ],
+ "Sc3+": [
+ 7.104348,
+ 1.511488,
+ -53.669773,
+ 38.404816,
+ 24.532240,
+ 0.118642,
+ 0.601957,
+ 0.033386,
+ 12.572138,
+ 10.859736,
+ 14.125,
+ ],
+ "Ti2+": [
+ 7.040119,
+ 1.496285,
+ 9.657304,
+ 0.006534,
+ 1.649561,
+ 0.150362,
+ 0.537072,
+ 0.031914,
+ 8.009958,
+ 201.800293,
+ 24.039,
+ ],
+ "Ti3+": [
+ 36.587933,
+ 7.230255,
+ -9.086077,
+ 2.084594,
+ 17.294008,
+ -35.111282,
+ 0.000681,
+ 0.522262,
+ 5.262317,
+ 15.881716,
+ 6.149,
+ ],
+ "Ti4+": [
+ 45.355537,
+ 7.092900,
+ 7.483858,
+ -43.498817,
+ 1.678915,
+ -0.110628,
+ 9.252186,
+ 0.523046,
+ 13.082852,
+ 10.193876,
+ 0.023,
+ ],
+ "V2+": [
+ 7.754356,
+ 2.064100,
+ 2.576998,
+ 2.011404,
+ 7.126177,
+ -0.533379,
+ 7.066315,
+ 0.014993,
+ 7.066308,
+ 22.055786,
+ 0.467,
+ ],
+ "V3+": [
+ 9.958480,
+ 1.596350,
+ 1.483442,
+ -10.846044,
+ 17.332867,
+ 0.474921,
+ 6.763041,
+ 0.056895,
+ 17.750029,
+ 0.328826,
+ 0.388,
+ ],
+ "V5+": [
+ 15.575018,
+ 8.448095,
+ 1.612040,
+ -9.721855,
+ 1.534029,
+ 0.552676,
+ 0.682708,
+ 5.566640,
+ 10.527077,
+ 0.907961,
+ 0.066,
+ ],
+ "Cr2+": [
+ 10.598877,
+ 1.565858,
+ 2.728280,
+ 0.098064,
+ 6.959321,
+ 0.049870,
+ 6.151846,
+ 0.023519,
+ 17.432816,
+ 54.002388,
+ 0.426,
+ ],
+ "Cr3+": [
+ 7.989310,
+ 1.765079,
+ 2.627125,
+ 1.829380,
+ 6.980908,
+ -0.192123,
+ 6.068867,
+ 0.018342,
+ 6.068887,
+ 16.309284,
+ 0.420,
+ ],
+ "Mn2+": [
+ 11.287712,
+ 26.042414,
+ 3.058096,
+ 0.090258,
+ 7.088306,
+ -24.566132,
+ 5.506225,
+ 0.000774,
+ 16.158575,
+ 54.766354,
+ 0.375,
+ ],
+ "Mn3+": [
+ 6.926972,
+ 2.081342,
+ 11.128379,
+ 2.375107,
+ -0.419287,
+ -0.093713,
+ 0.378315,
+ 0.015054,
+ 5.379957,
+ 14.429586,
+ 0.004,
+ ],
+ "Mn4+": [
+ 12.409131,
+ 7.466993,
+ 1.809947,
+ -12.138477,
+ 10.780248,
+ 0.672146,
+ 0.300400,
+ 0.112814,
+ 12.520756,
+ 0.168653,
+ 5.173,
+ ],
+ "Fe2+": [
+ 11.776765,
+ 11.165097,
+ 3.533495,
+ 0.165345,
+ 7.036932,
+ -9.676919,
+ 4.912232,
+ 0.001748,
+ 14.166556,
+ 42.381958,
+ 0.341,
+ ],
+ "Fe3+": [
+ 9.721638,
+ 63.403847,
+ 2.141347,
+ 2.629274,
+ 7.033846,
+ -61.930725,
+ 4.869297,
+ 0.000293,
+ 4.867602,
+ 13.539076,
+ 0.338,
+ ],
+ "Co2+": [
+ 6.993840,
+ 26.285812,
+ 12.254289,
+ 0.246114,
+ 4.017407,
+ -24.796852,
+ 0.310779,
+ 0.000684,
+ 4.400528,
+ 35.741447,
+ 12.536,
+ ],
+ "Co3+": [
+ 6.861739,
+ 2.678570,
+ 12.281889,
+ 3.501741,
+ -0.179384,
+ -1.147345,
+ 0.309794,
+ 0.008142,
+ 4.331703,
+ 11.914167,
+ 11.914,
+ ],
+ "Ni2+": [
+ 12.519017,
+ 37.832058,
+ 4.387257,
+ 0.661552,
+ 6.949072,
+ -36.344471,
+ 3.933053,
+ 0.000442,
+ 10.449184,
+ 23.860998,
+ 0.283,
+ ],
+ "Ni3+": [
+ 13.579366,
+ 1.902844,
+ 12.859268,
+ 3.811005,
+ -6.838595,
+ -0.317618,
+ 0.313140,
+ 0.012621,
+ 3.906407,
+ 10.894311,
+ 0.344,
+ ],
+ "Cu1+": [
+ 12.960763,
+ 16.342150,
+ 1.110102,
+ 5.520682,
+ 6.915452,
+ -14.849320,
+ 3.576010,
+ 0.000975,
+ 29.523218,
+ 10.114283,
+ 0.261,
+ ],
+ "Cu2+": [
+ 11.895569,
+ 16.344978,
+ 5.799817,
+ 1.048804,
+ 6.789088,
+ -14.878383,
+ 3.378519,
+ 0.000924,
+ 8.133653,
+ 20.526524,
+ 0.254,
+ ],
+ "Zn2+": [
+ 13.340772,
+ 10.428857,
+ 5.544489,
+ 0.762295,
+ 6.869172,
+ -8.945248,
+ 3.215913,
+ 0.001413,
+ 8.542680,
+ 21.891756,
+ 0.239,
+ ],
+ "Ga3+": [
+ 13.123875,
+ 35.288189,
+ 6.126979,
+ 0.611551,
+ 6.724807,
+ -33.875122,
+ 2.809960,
+ 0.000323,
+ 6.831534,
+ 16.784311,
+ 0.212,
+ ],
+ "Ge4+": [
+ 6.876636,
+ 6.779091,
+ 9.969591,
+ 3.135857,
+ 0.152389,
+ 1.08654,
+ 2.025174,
+ 0.176650,
+ 3.573822,
+ 7.685848,
+ 16.677,
+ ],
+ "Br1-": [
+ 17.714310,
+ 6.466926,
+ 6.947385,
+ 4.402674,
+ -0.697279,
+ 1.152674,
+ 2.122554,
+ 19.050768,
+ 0.152708,
+ 58.690361,
+ 58.690,
+ ],
+ "Rb1+": [
+ 17.684320,
+ 7.761588,
+ 6.680874,
+ 2.668883,
+ 0.070974,
+ 1.133263,
+ 1.710209,
+ 14.919863,
+ 0.128542,
+ 31.654478,
+ 0.128,
+ ],
+ "Sr2+": [
+ 17.694973,
+ 1.275762,
+ 6.154252,
+ 9.234786,
+ 0.515995,
+ 1.125309,
+ 1.550888,
+ 30.133041,
+ 0.118774,
+ 13.821799,
+ 0.118,
+ ],
+ "Y3+": [
+ 46.660366,
+ 10.369686,
+ 4.623042,
+ -62.170834,
+ 17.471146,
+ 19.023842,
+ -0.019971,
+ 13.180257,
+ 0.176398,
+ -0.016727,
+ 1.467,
+ ],
+ "Zr4+": [
+ 6.802956,
+ 17.699253,
+ 10.650647,
+ -0.248108,
+ 0.250338,
+ 0.827902,
+ 0.096228,
+ 1.296127,
+ 11.240715,
+ -0.219259,
+ -0.219,
+ ],
+ "Nb3+": [
+ 17.714323,
+ 1.675213,
+ 7.483963,
+ 8.322464,
+ 11.143573,
+ -8.339573,
+ 1.172419,
+ 30.102791,
+ 0.080255,
+ -0.002983,
+ 10.456,
+ ],
+ "Nb5+": [
+ 17.580206,
+ 7.633277,
+ 10.793497,
+ 0.180884,
+ 67.837921,
+ -68.024780,
+ 1.165852,
+ 0.078558,
+ 9.507652,
+ 31.621656,
+ -0.000,
+ ],
+ "Mo3+": [
+ 7.447050,
+ 17.778122,
+ 11.886068,
+ 1.997905,
+ 1.789626,
+ -1.898764,
+ 0.072000,
+ 1.073145,
+ 9.834720,
+ 28.221746,
+ -0.011,
+ ],
+ "Mo5+": [
+ 7.929879,
+ 17.667669,
+ 11.515987,
+ 0.500402,
+ 77.444084,
+ -78.056595,
+ 0.068856,
+ 1.068064,
+ 9.046229,
+ 26.558945,
+ -0.000,
+ ],
+ "Mo6+": [
+ 34.757683,
+ 9.653037,
+ 6.584769,
+ -18.628115,
+ 2.490594,
+ 1.141916,
+ 1.301770,
+ 7.123843,
+ 0.094097,
+ 1.617443,
+ 12.335,
+ ],
+ "Ru3+": [
+ 17.894758,
+ 13.579529,
+ 10.729251,
+ 2.474095,
+ 48.227997,
+ -51.905243,
+ 0.902827,
+ 8.740579,
+ 0.045125,
+ 24.764954,
+ -0.001,
+ ],
+ "Ru4+": [
+ 17.845776,
+ 13.455084,
+ 10.229087,
+ 1.653524,
+ 14.059795,
+ -17.241762,
+ 0.901070,
+ 8.482392,
+ 0.045972,
+ 23.015272,
+ -0.004,
+ ],
+ "Rh3+": [
+ 17.758621,
+ 14.569813,
+ 5.298320,
+ 2.533579,
+ 0.879753,
+ 0.960843,
+ 0.841779,
+ 8.319533,
+ 0.069050,
+ 23.709131,
+ 0.069,
+ ],
+ "Rh4+": [
+ 17.716188,
+ 14.446654,
+ 5.185801,
+ 1.703448,
+ 0.989992,
+ 0.959941,
+ 0.840572,
+ 8.100647,
+ 0.068995,
+ 22.357307,
+ 0.068,
+ ],
+ "Pd2+": [
+ 6.122282,
+ 15.651012,
+ 3.513508,
+ 9.060790,
+ 8.771199,
+ 0.879336,
+ 0.062424,
+ 8.018296,
+ 24.784275,
+ 0.776457,
+ 0.776,
+ ],
+ "Pd4+": [
+ 6.152421,
+ -96.069023,
+ -31.622141,
+ -81.578255,
+ -17.801403,
+ -0.915874,
+ -0.063951,
+ -11.090354,
+ -13.466152,
+ -9.758302,
+ -0.783,
+ ],
+ "Ag1+": [
+ 6.091192,
+ 4.019526,
+ 16.948174,
+ 4.258638,
+ 13.889437,
+ 0.785127,
+ 0.056305,
+ 0.719340,
+ 7.758938,
+ 27.368349,
+ 0.719,
+ ],
+ "Ag2+": [
+ 6.401808,
+ 48.699802,
+ 4.799859,
+ -32.332523,
+ 16.356710,
+ 1.068247,
+ 0.068167,
+ 0.942270,
+ 20.639496,
+ 1.100365,
+ 6.883,
+ ],
+ "Cd2+": [
+ 6.093711,
+ 43.909691,
+ 17.041306,
+ -39.675117,
+ 17.958918,
+ 0.664795,
+ 0.050624,
+ 8.654143,
+ 15.621396,
+ 11.082067,
+ 0.667,
+ ],
+ "In3+": [
+ 6.206277,
+ 18.497746,
+ 3.078131,
+ 10.524613,
+ 7.401234,
+ 0.293677,
+ 0.041357,
+ 6.605563,
+ 18.792250,
+ 0.608082,
+ 0.608,
+ ],
+ "Sn2+": [
+ 6.353672,
+ 4.770377,
+ 14.672025,
+ 4.235959,
+ 18.002131,
+ -0.042519,
+ 0.034720,
+ 6.167891,
+ 6.167879,
+ 29.006456,
+ 0.561,
+ ],
+ "Sn4+": [
+ 15.445732,
+ 6.420892,
+ 4.562980,
+ 1.713385,
+ 18.033537,
+ -0.172219,
+ 6.280898,
+ 0.033144,
+ 6.280899,
+ 17.983601,
+ 0.557,
+ ],
+ "Sb3+": [
+ 10.189171,
+ 57.461918,
+ 19.356573,
+ 4.862206,
+ -45.394096,
+ 1.516108,
+ 0.089485,
+ 0.375256,
+ 5.357987,
+ 22.153736,
+ 0.297,
+ ],
+ "Sb5+": [
+ 17.920622,
+ 6.647932,
+ 12.724075,
+ 1.555545,
+ 7.600591,
+ -0.445371,
+ 0.522315,
+ 0.029487,
+ 5.718210,
+ 16.433775,
+ 5.718,
+ ],
+ "I1-": [
+ 20.010330,
+ 17.835524,
+ 8.104130,
+ 2.231118,
+ 9.158548,
+ -3.341004,
+ 4.565931,
+ 0.444266,
+ 32.430672,
+ 95.149040,
+ 0.014,
+ ],
+ "Cs1+": [
+ 19.939056,
+ 24.967621,
+ 10.375884,
+ 0.454243,
+ 17.660248,
+ -19.394306,
+ 3.770511,
+ 0.004040,
+ 25.311275,
+ 76.537766,
+ 0.384,
+ ],
+ "Ba2+": [
+ 19.750200,
+ 17.513683,
+ 10.884892,
+ 0.321585,
+ 65.149834,
+ -59.618172,
+ 3.430748,
+ 0.361590,
+ 21.358307,
+ 70.309402,
+ 0.001,
+ ],
+ "La3+": [
+ 19.688887,
+ 17.345703,
+ 11.356296,
+ 0.099418,
+ 82.358124,
+ -76.846909,
+ 3.146211,
+ 0.339586,
+ 18.753832,
+ 90.345459,
+ 0.001,
+ ],
+ "Ce3+": [
+ 26.593231,
+ 85.866432,
+ -6.677695,
+ 12.111847,
+ 17.401903,
+ -80.313423,
+ 3.280381,
+ 0.001012,
+ 4.313575,
+ 17.868504,
+ 0.326,
+ ],
+ "Ce4+": [
+ 17.457533,
+ 25.659941,
+ 11.691037,
+ 19.695251,
+ -16.994749,
+ -3.515096,
+ 0.311812,
+ -0.003793,
+ 16.568687,
+ 2.886395,
+ -0.008,
+ ],
+ "Pr3+": [
+ 20.879841,
+ 36.035797,
+ 12.135341,
+ 0.283103,
+ 17.167803,
+ -30.500784,
+ 2.870897,
+ 0.002364,
+ 16.615236,
+ 53.909359,
+ 0.306,
+ ],
+ "Pr4+": [
+ 17.496082,
+ 21.538509,
+ 20.403114,
+ 12.062211,
+ -7.492043,
+ -9.016722,
+ 0.294457,
+ -0.002742,
+ 2.772886,
+ 15.804613,
+ -0.013,
+ ],
+ "Nd3+": [
+ 17.120077,
+ 56.038139,
+ 21.468307,
+ 10.000671,
+ 2.905866,
+ -50.541992,
+ 0.291295,
+ 0.001421,
+ 2.743681,
+ 14.581367,
+ 22.485,
+ ],
+ "Pm3+": [
+ 22.221066,
+ 17.068142,
+ 12.805423,
+ 0.435687,
+ 52.238770,
+ -46.767181,
+ 2.635767,
+ 0.277039,
+ 14.927315,
+ 45.768017,
+ 0.001,
+ ],
+ "Sm3+": [
+ 15.618565,
+ 19.538092,
+ 13.398946,
+ -4.358811,
+ 24.490461,
+ -9.714854,
+ 0.006001,
+ 0.306379,
+ 14.979594,
+ 0.748825,
+ 2.454,
+ ],
+ "Eu2+": [
+ 23.899035,
+ 31.657497,
+ 12.955752,
+ 1.700576,
+ 16.992199,
+ -26.204315,
+ 2.467332,
+ 0.002230,
+ 13.625002,
+ 35.089481,
+ 0.253,
+ ],
+ "Eu3+": [
+ 17.758327,
+ 33.498665,
+ 24.067188,
+ 13.436883,
+ -9.019134,
+ -19.768026,
+ 0.244474,
+ -0.003901,
+ 2.487526,
+ 14.568011,
+ -0.015,
+ ],
+ "Gd3+": [
+ 24.344999,
+ 16.945311,
+ 13.866931,
+ 0.481674,
+ 93.506378,
+ -88.147179,
+ 2.333971,
+ 0.239215,
+ 12.982995,
+ 43.876347,
+ 0.000,
+ ],
+ "Tb3+": [
+ 24.878252,
+ 16.856016,
+ 13.663937,
+ 1.279671,
+ 39.271294,
+ -33.950317,
+ 2.223301,
+ 0.227290,
+ 11.812528,
+ 29.910065,
+ 0.001,
+ ],
+ "Dy3+": [
+ 16.864344,
+ 90.383461,
+ 13.675473,
+ 1.687078,
+ 25.540651,
+ -85.150650,
+ 0.216275,
+ 0.000593,
+ 11.121207,
+ 26.250975,
+ 2.135,
+ ],
+ "Ho3+": [
+ 16.837524,
+ 63.221336,
+ 13.703766,
+ 2.061602,
+ 26.202621,
+ -58.026505,
+ 0.206873,
+ 0.000796,
+ 10.500283,
+ 24.031883,
+ 2.055,
+ ],
+ "Er3+": [
+ 16.810127,
+ 22.681061,
+ 13.864114,
+ 2.294506,
+ 26.864477,
+ -17.513460,
+ 0.198293,
+ 0.002126,
+ 9.973341,
+ 22.836388,
+ 1.979,
+ ],
+ "Tm3+": [
+ 16.787500,
+ 15.350905,
+ 14.182357,
+ 2.299111,
+ 27.573771,
+ -10.192087,
+ 0.190852,
+ 0.003036,
+ 9.602934,
+ 22.526880,
+ 1.912,
+ ],
+ "Yb2+": [
+ 28.443794,
+ 16.849527,
+ 14.165081,
+ 3.445311,
+ 28.308853,
+ -23.214935,
+ 1.863896,
+ 0.183811,
+ 9.225469,
+ 23.691355,
+ 0.001,
+ ],
+ "Yb3+": [
+ 28.191629,
+ 16.828087,
+ 14.167848,
+ 2.744962,
+ 23.171774,
+ -18.103676,
+ 1.842889,
+ 0.182788,
+ 9.045957,
+ 20.799847,
+ 0.001,
+ ],
+ "Lu3+": [
+ 28.828693,
+ 16.823227,
+ 14.247617,
+ 3.079559,
+ 25.647667,
+ -20.626528,
+ 1.776641,
+ 0.175560,
+ 8.575531,
+ 19.693701,
+ 0.001,
+ ],
+ "Hf4+": [
+ 29.267378,
+ 16.792543,
+ 14.785310,
+ 2.184128,
+ 23.791996,
+ -18.820383,
+ 1.697911,
+ 0.168313,
+ 8.190025,
+ 18.277578,
+ 0.001,
+ ],
+ "Ta5+": [
+ 29.539469,
+ 16.741854,
+ 15.182070,
+ 1.642916,
+ 16.437447,
+ -11.542459,
+ 1.612934,
+ 0.160460,
+ 7.654408,
+ 17.070732,
+ 0.001,
+ ],
+ "W6+": [
+ 29.729357,
+ 17.247808,
+ 15.184488,
+ 1.154652,
+ 0.739335,
+ 3.945157,
+ 1.501648,
+ 0.140803,
+ 6.880573,
+ 14.299601,
+ 14.299,
+ ],
+ "Os4+": [
+ 17.113485,
+ 15.792370,
+ 23.342392,
+ 4.090271,
+ 7.671292,
+ 3.988390,
+ 0.131850,
+ 7.288542,
+ 1.389307,
+ 19.629425,
+ 1.389,
+ ],
+ "Ir3+": [
+ 31.537575,
+ 16.363338,
+ 15.597141,
+ 5.051404,
+ 1.436935,
+ 4.009459,
+ 1.334144,
+ 7.451918,
+ 0.127514,
+ 21.705648,
+ 0.127,
+ ],
+ "Ir4+": [
+ 30.391249,
+ 16.146996,
+ 17.019068,
+ 4.458904,
+ 0.975372,
+ 4.006865,
+ 1.328519,
+ 7.181766,
+ 0.127337,
+ 19.060146,
+ 1.328,
+ ],
+ "Pt2+": [
+ 31.986849,
+ 17.249048,
+ 15.269374,
+ 5.760234,
+ 1.694079,
+ 4.032512,
+ 1.281143,
+ 7.625512,
+ 0.123571,
+ 24.190826,
+ 0.123,
+ ],
+ "Pt4+": [
+ 41.932713,
+ 16.339224,
+ 17.653894,
+ 6.012420,
+ -12.036877,
+ 4.094551,
+ 1.111409,
+ 6.466086,
+ 0.128917,
+ 16.954155,
+ 0.778,
+ ],
+ "Au1+": [
+ 32.124306,
+ 16.716476,
+ 16.814100,
+ 7.311565,
+ 0.993064,
+ 4.040792,
+ 1.216073,
+ 7.165378,
+ 0.118715,
+ 20.442486,
+ 53.095,
+ ],
+ "Au3+": [
+ 31.704271,
+ 17.545767,
+ 16.819551,
+ 5.522640,
+ 0.361725,
+ 4.042679,
+ 1.215561,
+ 7.220506,
+ 0.118812,
+ 20.050970,
+ 1.215,
+ ],
+ "Hg1+": [
+ 28.866837,
+ 19.277540,
+ 16.776051,
+ 6.281459,
+ 3.710289,
+ 4.068430,
+ 1.173967,
+ 7.583842,
+ 0.115351,
+ 29.055994,
+ 1.173,
+ ],
+ "Hg2+": [
+ 32.411079,
+ 18.690371,
+ 16.711773,
+ 9.974835,
+ -3.847611,
+ 4.052869,
+ 1.162980,
+ 7.329806,
+ 0.114518,
+ 22.009489,
+ 22.009,
+ ],
+ "Tl1+": [
+ 32.295044,
+ 16.570049,
+ 17.991013,
+ 1.535355,
+ 7.554591,
+ 4.054030,
+ 1.101544,
+ 0.110020,
+ 6.528559,
+ 52.495068,
+ 20.338,
+ ],
+ "Tl3+": [
+ 32.525639,
+ 19.139185,
+ 17.100321,
+ 5.891115,
+ 12.599463,
+ -9.256075,
+ 1.094966,
+ 6.900992,
+ 0.103667,
+ 18.489614,
+ -0.001,
+ ],
+ "Pb2+": [
+ 27.392647,
+ 16.496822,
+ 19.984501,
+ 6.813923,
+ 5.233910,
+ 4.065623,
+ 1.058874,
+ 0.106305,
+ 6.708123,
+ 24.395554,
+ 1.058,
+ ],
+ "Pb4+": [
+ 32.505657,
+ 20.014240,
+ 14.645661,
+ 5.029499,
+ 1.760138,
+ 4.044678,
+ 1.047035,
+ 6.670321,
+ 0.105279,
+ 16.525040,
+ 0.105,
+ ],
+ "Bi3+": [
+ 32.461437,
+ 19.438683,
+ 16.302486,
+ 7.322662,
+ 0.431704,
+ 4.043703,
+ 0.997930,
+ 6.038867,
+ 0.101338,
+ 18.371586,
+ 46.361,
+ ],
+ "Bi5+": [
+ 16.734028,
+ 20.580494,
+ 9.452623,
+ 61.155834,
+ -34.041023,
+ 4.113663,
+ 0.105076,
+ 4.773282,
+ 11.762162,
+ 1.211775,
+ 1.619,
+ ],
+ "Ra2+": [
+ 4.986228,
+ 32.474945,
+ 21.947443,
+ 11.800013,
+ 10.807292,
+ 3.956572,
+ 0.082597,
+ 0.791468,
+ 4.608034,
+ 24.792431,
+ 0.082,
+ ],
+ "Ac3+": [
+ 15.584983,
+ 32.022125,
+ 21.456327,
+ 0.757593,
+ 12.341252,
+ 3.838984,
+ 0.077438,
+ 0.739963,
+ 4.040735,
+ 47.525002,
+ 19.406,
+ ],
+ "Th4+": [
+ 15.515445,
+ 32.090691,
+ 13.996399,
+ 12.918157,
+ 7.635514,
+ 3.831122,
+ 0.074499,
+ 0.711663,
+ 3.871044,
+ 18.596891,
+ 3.871,
+ ],
+ "U3+": [
+ 15.360309,
+ 32.395657,
+ 21.961290,
+ 1.325894,
+ 14.251453,
+ 3.706622,
+ 0.067815,
+ 0.654643,
+ 3.643409,
+ 39.604965,
+ 16.330,
+ ],
+ "U4+": [
+ 15.355091,
+ 32.235306,
+ 0.557745,
+ 14.396367,
+ 21.751173,
+ 3.705863,
+ 0.067789,
+ 0.652613,
+ 42.354237,
+ 15.908239,
+ 3.553,
+ ],
+ "U6+": [
+ 15.333844,
+ 31.770849,
+ 21.274414,
+ 13.872636,
+ 0.048519,
+ 3.700591,
+ 0.067644,
+ 0.646384,
+ 3.317894,
+ 14.650250,
+ 75.339,
+ ],
+ "Np3+": [
+ 15.378152,
+ 32.572132,
+ 22.206125,
+ 1.413295,
+ 14.828381,
+ 3.603370,
+ 0.064613,
+ 0.631420,
+ 3.561936,
+ 37.875511,
+ 15.546,
+ ],
+ "Np4+": [
+ 15.373926,
+ 32.423019,
+ 21.969994,
+ 0.662078,
+ 14.969350,
+ 3.603039,
+ 0.064597,
+ 0.629658,
+ 3.476389,
+ 39.438942,
+ 15.135,
+ ],
+ "Np6+": [
+ 15.359986,
+ 31.992825,
+ 21.412458,
+ 0.066574,
+ 14.568174,
+ 3.600942,
+ 0.064528,
+ 0.624505,
+ 3.253441,
+ 67.658318,
+ 13.980,
+ ],
+ "Pu3+": [
+ 15.356004,
+ 32.769127,
+ 22.680210,
+ 1.351055,
+ 15.416232,
+ 3.428895,
+ 0.060590,
+ 0.604663,
+ 3.491509,
+ 37.260635,
+ 14.981,
+ ],
+ "Pu4+": [
+ 15.416219,
+ 32.610569,
+ 22.256662,
+ 0.719495,
+ 15.518152,
+ 3.480408,
+ 0.061456,
+ 0.607938,
+ 3.411848,
+ 37.628792,
+ 14.464,
+ ],
+ "Pu6+": [
+ 15.436506,
+ 32.289719,
+ 14.726737,
+ 15.012391,
+ 7.024677,
+ 3.502325,
+ 0.061815,
+ 0.606541,
+ 3.245363,
+ 13.616438,
+ 3.245,
+ ],
+}
+# Parametrization of incoherently scattered X-ray intensities vs sin(theta)/lambda.
+#
+# This file contains the tabulated coefficients for calculation
+# of Compton Cross Section as a function of sin(theta)/lambda, being
+# theta=scattering angle, and lambda=photon wavelength.
+# REFERENCE:
+# Analytic Approximations to Incoherently Scattered X-Ray Intensities
+# by H.H.M. Balyuzi (Acta Cryst. (1975). A31, 600
+#
+# This is the abstract from the mentioned paper:
+# The theoretically calculated incoherently scattered X-ray intensities of
+# Cromer & Mann [j. Chem. Phys. (1967). 47, 1892-1893] and Cromer [J. Chem.
+# Phys. (1969). 50, 4857-4859] for the elements 2 to 95 and 102 have been
+# fitted to analytic function. The coefficients of the fit are tabulated
+# and the accurance of the fitting is discussed. The accuracy is very good
+# for sin(theta)/Lambda<=1.4 A^(-1)
+#
+# The analytical function is:
+# Compton[s] = Z-[SUM a_i*EXP(-b_i*(s^2)) ]
+# i=1,5
+#
+# where s = sin(theta)/lambda, and a_i and b_i are the tabulated coefficients.
+# Coefficients for elements Cm-Cf simply copied from those for Am
+# Column description: Z a1 a2 a3 a4 a5 b1 b2 b3 b4 b5
+COMPTON = {
+ "H": [
+ 1.0,
+ 0.2623,
+ 0.5094,
+ 0.2034,
+ 0.0249,
+ 0.0000,
+ 32.3717,
+ 14.7084,
+ 6.6884,
+ 2.4843,
+ 0.0000,
+ ],
+ "He": [
+ 2.0,
+ 0.5246,
+ 1.0188,
+ 0.4068,
+ 0.0498,
+ 0.0000,
+ 32.3717,
+ 14.7084,
+ 6.6884,
+ 2.4843,
+ 0.0000,
+ ],
+ "Li": [
+ 3.0,
+ 0.0518,
+ 0.9578,
+ 0.7348,
+ 1.0817,
+ 0.1740,
+ 533.922,
+ 245.845,
+ 10.1831,
+ 4.4364,
+ 1.5031,
+ ],
+ "Be": [
+ 4.0,
+ 0.4634,
+ 1.5592,
+ 0.7685,
+ 1.0623,
+ 0.1470,
+ 185.856,
+ 104.601,
+ 4.8589,
+ 2.1932,
+ 0.7641,
+ ],
+ "B": [
+ 5.0,
+ 0.9046,
+ 1.9822,
+ 0.2279,
+ 1.4873,
+ 0.3979,
+ 104.961,
+ 46.0191,
+ 8.9873,
+ 1.9674,
+ 0.6778,
+ ],
+ "C": [
+ 6.0,
+ 0.7568,
+ 2.5511,
+ 0.7051,
+ 1.4605,
+ 0.5263,
+ 82.2385,
+ 31.7282,
+ 11.9471,
+ 1.4637,
+ 0.5150,
+ ],
+ "N": [
+ 7.0,
+ 0.9070,
+ 2.8972,
+ 1.1659,
+ 1.5526,
+ 0.4769,
+ 64.1555,
+ 20.8507,
+ 7.7576,
+ 1.0335,
+ 0.3516,
+ ],
+ "O": [
+ 8.0,
+ 0.8847,
+ 3.2189,
+ 1.7990,
+ 1.5538,
+ 0.5434,
+ 52.0063,
+ 16.4487,
+ 6.5958,
+ 0.8143,
+ 0.2815,
+ ],
+ "F": [
+ 9.0,
+ 0.9756,
+ 3.5101,
+ 2.3561,
+ 1.5896,
+ 0.5683,
+ 41.7194,
+ 12.7747,
+ 5.2945,
+ 0.6470,
+ 0.2254,
+ ],
+ "Ne": [
+ 10.0,
+ 1.1544,
+ 3.8033,
+ 2.8085,
+ 1.6647,
+ 0.5687,
+ 34.2567,
+ 9.76720,
+ 4.0375,
+ 0.5256,
+ 0.1800,
+ ],
+ "Na": [
+ 11.0,
+ 1.0243,
+ 2.0704,
+ 5.3197,
+ 1.5214,
+ 1.0637,
+ 293.411,
+ 15.2373,
+ 4.4697,
+ 0.6246,
+ 0.1922,
+ ],
+ "Mg": [
+ 12.0,
+ 2.0049,
+ 1.9449,
+ 5.4291,
+ 1.6315,
+ 0.9888,
+ 178.983,
+ 11.2433,
+ 3.4272,
+ 0.4907,
+ 0.1542,
+ ],
+ "Al": [
+ 13.0,
+ 2.6790,
+ 1.2336,
+ 5.9358,
+ 1.6622,
+ 1.4835,
+ 121.363,
+ 16.0728,
+ 3.2632,
+ 0.6616,
+ 0.1586,
+ ],
+ "Si": [
+ 14.0,
+ 2.1006,
+ 2.2025,
+ 5.3063,
+ 2.5162,
+ 1.8716,
+ 116.957,
+ 34.7760,
+ 3.3215,
+ 0.9933,
+ 0.1553,
+ ],
+ "P": [
+ 15.0,
+ 1.8936,
+ 3.3782,
+ 5.3752,
+ 2.4942,
+ 1.8564,
+ 108.033,
+ 26.6586,
+ 2.6865,
+ 0.7973,
+ 0.1333,
+ ],
+ "S": [
+ 16.0,
+ 2.0717,
+ 4.2023,
+ 5.6883,
+ 2.2623,
+ 1.7735,
+ 86.7211,
+ 21.4574,
+ 2.1255,
+ 0.5882,
+ 0.1128,
+ ],
+ "Cl": [
+ 17.0,
+ 2.1221,
+ 5.0905,
+ 5.6885,
+ 2.2809,
+ 1.8164,
+ 73.8395,
+ 17.9756,
+ 1.8037,
+ 0.5162,
+ 0.1008,
+ ],
+ "Ar": [
+ 18.0,
+ 2.1778,
+ 5.9791,
+ 5.6104,
+ 2.3442,
+ 1.8873,
+ 65.6187,
+ 14.4380,
+ 1.5611,
+ 0.4716,
+ 0.0914,
+ ],
+ "K": [
+ 19.0,
+ 1.0863,
+ 2.8562,
+ 5.6616,
+ 6.7809,
+ 2.6145,
+ 425.474,
+ 35.7249,
+ 9.3261,
+ 1.0206,
+ 0.1036,
+ ],
+ "Ca": [
+ 20.0,
+ 2.0554,
+ 2.7251,
+ 5.9104,
+ 6.7171,
+ 2.5916,
+ 289.862,
+ 28.7190,
+ 7.4788,
+ 0.8644,
+ 0.0920,
+ ],
+ "Sc": [
+ 21.0,
+ 2.1608,
+ 2.9545,
+ 6.5125,
+ 6.7745,
+ 2.5969,
+ 251.387,
+ 26.8528,
+ 6.4238,
+ 0.7616,
+ 0.0831,
+ ],
+ "Ti": [
+ 22.0,
+ 2.1983,
+ 3.2282,
+ 7.0649,
+ 6.8832,
+ 2.6243,
+ 226.968,
+ 24.9306,
+ 5.6213,
+ 0.6865,
+ 0.0758,
+ ],
+ "V": [
+ 23.0,
+ 2.2399,
+ 3.4348,
+ 7.6412,
+ 7.0270,
+ 2.6558,
+ 206.399,
+ 22.9026,
+ 4.9366,
+ 0.6256,
+ 0.0697,
+ ],
+ "Cr": [
+ 24.0,
+ 1.5893,
+ 3.6692,
+ 8.7249,
+ 7.2913,
+ 2.7226,
+ 196.584,
+ 25.2663,
+ 4.5848,
+ 0.5876,
+ 0.0650,
+ ],
+ "Mn": [
+ 25.0,
+ 2.3156,
+ 3.7420,
+ 8.8241,
+ 7.3811,
+ 2.7355,
+ 174.656,
+ 19.5879,
+ 3.8896,
+ 0.5326,
+ 0.0597,
+ ],
+ "Fe": [
+ 26.0,
+ 2.3141,
+ 3.9729,
+ 9.2624,
+ 7.5083,
+ 2.9404,
+ 164.104,
+ 18.2898,
+ 3.5861,
+ 0.5155,
+ 0.0597,
+ ],
+ "Co": [
+ 27.0,
+ 2.3636,
+ 4.4188,
+ 9.7350,
+ 7.6872,
+ 2.7927,
+ 151.337,
+ 16.0770,
+ 3.1445,
+ 0.4553,
+ 0.0514,
+ ],
+ "Ni": [
+ 28.0,
+ 2.4174,
+ 4.7076,
+ 10.2289,
+ 7.8357,
+ 2.8071,
+ 139.963,
+ 14.5797,
+ 2.8142,
+ 0.4203,
+ 0.0476,
+ ],
+ "Cu": [
+ 29.0,
+ 1.7532,
+ 4.8167,
+ 11.2836,
+ 8.2460,
+ 2.8943,
+ 127.251,
+ 16.9194,
+ 2.7458,
+ 0.4076,
+ 0.0454,
+ ],
+ "Zn": [
+ 30.0,
+ 2.4474,
+ 5.1080,
+ 11.4407,
+ 8.1791,
+ 2.8211,
+ 125.083,
+ 12.8443,
+ 2.3122,
+ 0.3605,
+ 0.0410,
+ ],
+ "Ga": [
+ 31.0,
+ 3.0360,
+ 5.1760,
+ 11.6692,
+ 8.2940,
+ 2.8148,
+ 104.577,
+ 11.2803,
+ 2.0663,
+ 0.3314,
+ 0.0380,
+ ],
+ "Ge": [
+ 32.0,
+ 3.4795,
+ 5.2306,
+ 11.9324,
+ 8.5063,
+ 2.8388,
+ 87.5304,
+ 10.8491,
+ 1.9060,
+ 0.3107,
+ 0.0356,
+ ],
+ "As": [
+ 33.0,
+ 3.3385,
+ 5.6229,
+ 12.2449,
+ 8.8668,
+ 2.9138,
+ 82.4879,
+ 12.0723,
+ 1.8317,
+ 0.2996,
+ 0.0341,
+ ],
+ "Se": [
+ 34.0,
+ 3.5333,
+ 5.9644,
+ 12.4403,
+ 9.1212,
+ 2.9289,
+ 73.4400,
+ 12.2369,
+ 1.7151,
+ 0.2824,
+ 0.0318,
+ ],
+ "Br": [
+ 35.0,
+ 3.4898,
+ 6.5641,
+ 12.5318,
+ 9.3877,
+ 3.0170,
+ 68.5438,
+ 12.5940,
+ 1.6235,
+ 0.2712,
+ 0.0308,
+ ],
+ "Kr": [
+ 36.0,
+ 3.0598,
+ 7.6671,
+ 12.5852,
+ 9.6168,
+ 3.0647,
+ 70.8068,
+ 12.6449,
+ 1.5230,
+ 0.2577,
+ 0.0294,
+ ],
+ "Rb": [
+ 37.0,
+ 2.3770,
+ 8.6605,
+ 12.5729,
+ 10.1507,
+ 3.2083,
+ 178.867,
+ 13.9200,
+ 1.5224,
+ 0.2567,
+ 0.0289,
+ ],
+ "Sr": [
+ 38.0,
+ 3.0740,
+ 8.8344,
+ 12.5145,
+ 10.3129,
+ 3.2433,
+ 210.803,
+ 12.3784,
+ 1.4148,
+ 0.2424,
+ 0.0275,
+ ],
+ "Y": [
+ 39.0,
+ 3.5086,
+ 9.2574,
+ 12.4297,
+ 10.4962,
+ 3.2840,
+ 177.423,
+ 11.0509,
+ 1.3242,
+ 0.2300,
+ 0.0263,
+ ],
+ "Zr": [
+ 40.0,
+ 3.8436,
+ 9.6980,
+ 12.3352,
+ 10.7459,
+ 3.3493,
+ 152.274,
+ 10.0161,
+ 1.2610,
+ 0.2206,
+ 0.0254,
+ ],
+ "Nb": [
+ 41.0,
+ 3.7519,
+ 10.5738,
+ 12.2251,
+ 10.9745,
+ 3.4425,
+ 117.449,
+ 8.9975,
+ 1.2044,
+ 0.2127,
+ 0.0248,
+ ],
+ "Mo": [
+ 42.0,
+ 3.9567,
+ 11.1228,
+ 12.1674,
+ 11.2328,
+ 3.4857,
+ 105.180,
+ 8.0754,
+ 1.1551,
+ 0.2038,
+ 0.0237,
+ ],
+ "Tc": [
+ 43.0,
+ 4.3317,
+ 10.7065,
+ 12.1316,
+ 12.0687,
+ 3.7296,
+ 115.939,
+ 7.9151,
+ 1.2769,
+ 0.2105,
+ 0.0240,
+ ],
+ "Ru": [
+ 44.0,
+ 4.7308,
+ 12.0616,
+ 11.9367,
+ 11.6021,
+ 3.6225,
+ 77.6118,
+ 6.4667,
+ 1.0431,
+ 0.1877,
+ 0.0223,
+ ],
+ "Rh": [
+ 45.0,
+ 4.8745,
+ 12.2804,
+ 12.0133,
+ 12.0245,
+ 3.7592,
+ 71.5772,
+ 6.1701,
+ 1.0589,
+ 0.1853,
+ 0.0220,
+ ],
+ "Pd": [
+ 46.0,
+ 5.4847,
+ 13.7150,
+ 11.6608,
+ 11.4709,
+ 3.6545,
+ 53.2508,
+ 4.9329,
+ 0.8575,
+ 0.1655,
+ 0.0206,
+ ],
+ "Ag": [
+ 47.0,
+ 5.3490,
+ 13.4127,
+ 11.9402,
+ 12.3201,
+ 3.9205,
+ 58.9663,
+ 5.0548,
+ 0.9684,
+ 0.1715,
+ 0.0210,
+ ],
+ "Cd": [
+ 48.0,
+ 4.5224,
+ 9.6282,
+ 14.9509,
+ 14.2066,
+ 4.6563,
+ 87.3897,
+ 7.7119,
+ 1.5820,
+ 0.2036,
+ 0.0234,
+ ],
+ "In": [
+ 49.0,
+ 4.7031,
+ 8.2361,
+ 16.4206,
+ 14.6608,
+ 4.9493,
+ 89.2096,
+ 8.9965,
+ 1.7229,
+ 0.2062,
+ 0.0238,
+ ],
+ "Sn": [
+ 50.0,
+ 4.9677,
+ 7.4873,
+ 17.4268,
+ 14.9229,
+ 5.1678,
+ 83.2133,
+ 10.1130,
+ 1.7605,
+ 0.2042,
+ 0.0237,
+ ],
+ "Sb": [
+ 51.0,
+ 4.6001,
+ 7.4399,
+ 18.3475,
+ 15.1777,
+ 5.4096,
+ 82.5070,
+ 12.5902,
+ 1.7906,
+ 0.2029,
+ 0.0238,
+ ],
+ "Te": [
+ 52.0,
+ 4.5671,
+ 7.7178,
+ 18.8338,
+ 15.2844,
+ 5.5769,
+ 79.7245,
+ 13.8028,
+ 1.7411,
+ 0.1976,
+ 0.0235,
+ ],
+ "I": [
+ 53.0,
+ 4.3147,
+ 8.3728,
+ 19.1961,
+ 15.3645,
+ 5.7365,
+ 78.6996,
+ 14.9421,
+ 1.6795,
+ 0.1921,
+ 0.0232,
+ ],
+ "Xe": [
+ 54.0,
+ 3.4467,
+ 19.4724,
+ 9.7473,
+ 15.4210,
+ 5.9034,
+ 88.3050,
+ 1.6131,
+ 16.1669,
+ 0.1869,
+ 0.0229,
+ ],
+ "Cs": [
+ 55.0,
+ 2.5751,
+ 19.7181,
+ 11.0138,
+ 15.5312,
+ 6.1374,
+ 224.598,
+ 1.5722,
+ 17.7908,
+ 0.1845,
+ 0.0229,
+ ],
+ "Ba": [
+ 56.0,
+ 3.2477,
+ 19.7824,
+ 11.2142,
+ 15.4790,
+ 6.2602,
+ 266.593,
+ 1.4758,
+ 16.2710,
+ 0.1775,
+ 0.0225,
+ ],
+ "La": [
+ 57.0,
+ 3.6683,
+ 11.7149,
+ 19.8077,
+ 15.4015,
+ 6.3860,
+ 224.726,
+ 14.7472,
+ 1.3823,
+ 0.1708,
+ 0.0222,
+ ],
+ "Ce": [
+ 58.0,
+ 3.7218,
+ 12.0076,
+ 20.1925,
+ 15.4540,
+ 6.5996,
+ 212.566,
+ 14.0417,
+ 1.3272,
+ 0.1681,
+ 0.0221,
+ ],
+ "Pr": [
+ 59.0,
+ 3.6287,
+ 11.9193,
+ 20.8823,
+ 15.6425,
+ 6.8971,
+ 208.103,
+ 13.8486,
+ 1.3025,
+ 0.1690,
+ 0.0222,
+ ],
+ "Nd": [
+ 60.0,
+ 3.7229,
+ 12.0836,
+ 21.2664,
+ 15.7405,
+ 7.1521,
+ 194.998,
+ 13.2282,
+ 1.2573,
+ 0.1677,
+ 0.0222,
+ ],
+ "Pm": [
+ 61.0,
+ 3.8009,
+ 12.2546,
+ 21.6281,
+ 15.8659,
+ 7.4126,
+ 184.340,
+ 12.6793,
+ 1.2139,
+ 0.1669,
+ 0.0222,
+ ],
+ "Sm": [
+ 62.0,
+ 3.8533,
+ 12.3520,
+ 22.0136,
+ 16.0323,
+ 7.7082,
+ 176.392,
+ 12.2878,
+ 1.1810,
+ 0.1672,
+ 0.0223,
+ ],
+ "Eu": [
+ 63.0,
+ 3.9234,
+ 12.4961,
+ 22.3133,
+ 16.2152,
+ 8.0085,
+ 167.816,
+ 11.8294,
+ 1.1433,
+ 0.1676,
+ 0.0224,
+ ],
+ "Gd": [
+ 64.0,
+ 4.1100,
+ 13.0008,
+ 22.2962,
+ 16.2937,
+ 8.2594,
+ 160.859,
+ 11.0492,
+ 1.0914,
+ 0.1659,
+ 0.0223,
+ ],
+ "Tb": [
+ 65.0,
+ 4.1589,
+ 13.2197,
+ 22.4627,
+ 16.5329,
+ 8.5842,
+ 155.186,
+ 10.6407,
+ 1.0667,
+ 0.1674,
+ 0.0224,
+ ],
+ "Dy": [
+ 66.0,
+ 4.0415,
+ 13.1038,
+ 22.8132,
+ 17.0066,
+ 8.9849,
+ 150.058,
+ 10.6511,
+ 1.0708,
+ 0.1723,
+ 0.0227,
+ ],
+ "Ho": [
+ 67.0,
+ 4.0620,
+ 13.2132,
+ 22.9351,
+ 17.3999,
+ 9.3388,
+ 145.976,
+ 10.3972,
+ 1.0569,
+ 0.1752,
+ 0.0228,
+ ],
+ "Er": [
+ 68.0,
+ 4.0815,
+ 13.3282,
+ 22.9865,
+ 17.8548,
+ 9.6967,
+ 142.072,
+ 10.1525,
+ 1.0438,
+ 0.1785,
+ 0.0229,
+ ],
+ "Tm": [
+ 69.0,
+ 4.7416,
+ 13.2875,
+ 23.1429,
+ 17.9215,
+ 9.8935,
+ 100.170,
+ 9.0676,
+ 0.9833,
+ 0.1753,
+ 0.0227,
+ ],
+ "Yb": [
+ 70.0,
+ 4.1014,
+ 13.4586,
+ 22.9675,
+ 18.9998,
+ 10.4188,
+ 135.833,
+ 9.8125,
+ 1.0290,
+ 0.1860,
+ 0.0231,
+ ],
+ "Lu": [
+ 71.0,
+ 4.3261,
+ 13.8638,
+ 22.6992,
+ 19.3649,
+ 10.6986,
+ 133.360,
+ 9.1664,
+ 0.9951,
+ 0.1861,
+ 0.0230,
+ ],
+ "Hf": [
+ 72.0,
+ 4.5759,
+ 14.3292,
+ 22.3741,
+ 19.7027,
+ 10.9720,
+ 124.501,
+ 8.5195,
+ 0.9599,
+ 0.1857,
+ 0.0229,
+ ],
+ "Ta": [
+ 73.0,
+ 4.7416,
+ 14.9284,
+ 22.0214,
+ 20.0290,
+ 11.2347,
+ 117.648,
+ 7.9070,
+ 0.9250,
+ 0.1850,
+ 0.0227,
+ ],
+ "W": [
+ 74.0,
+ 4.8423,
+ 15.6421,
+ 21.6701,
+ 20.3207,
+ 11.4817,
+ 112.694,
+ 7.3551,
+ 0.8892,
+ 0.1837,
+ 0.0226,
+ ],
+ "Re": [
+ 75.0,
+ 5.0015,
+ 16.3874,
+ 21.3263,
+ 20.5247,
+ 11.7163,
+ 106.001,
+ 6.7592,
+ 0.8491,
+ 0.1817,
+ 0.0224,
+ ],
+ "Os": [
+ 76.0,
+ 5.3630,
+ 17.5066,
+ 23.3197,
+ 20.9425,
+ 8.8158,
+ 93.6155,
+ 6.0569,
+ 0.7156,
+ 0.1373,
+ 0.0127,
+ ],
+ "Ir": [
+ 77.0,
+ 5.0953,
+ 15.4321,
+ 15.5924,
+ 26.5617,
+ 14.2784,
+ 98.2594,
+ 6.9463,
+ 1.2550,
+ 0.2600,
+ 0.0242,
+ ],
+ "Pt": [
+ 78.0,
+ 5.6451,
+ 18.8015,
+ 20.6881,
+ 20.5266,
+ 12.2868,
+ 69.2677,
+ 5.3127,
+ 0.7107,
+ 0.1702,
+ 0.0216,
+ ],
+ "Au": [
+ 79.0,
+ 5.8170,
+ 19.5635,
+ 20.3716,
+ 20.6837,
+ 12.5114,
+ 65.4079,
+ 4.9469,
+ 0.6809,
+ 0.1680,
+ 0.0214,
+ ],
+ "Hg": [
+ 80.0,
+ 5.9389,
+ 19.4946,
+ 19.0547,
+ 22.4442,
+ 13.0069,
+ 74.0107,
+ 4.9118,
+ 0.7375,
+ 0.1779,
+ 0.0216,
+ ],
+ "Tl": [
+ 81.0,
+ 6.5803,
+ 19.6010,
+ 18.3955,
+ 23.0433,
+ 13.3134,
+ 69.9997,
+ 4.6032,
+ 0.7312,
+ 0.1787,
+ 0.0216,
+ ],
+ "Pb": [
+ 82.0,
+ 7.3754,
+ 19.7974,
+ 18.0002,
+ 23.2605,
+ 13.4943,
+ 62.4634,
+ 4.2561,
+ 0.7021,
+ 0.1757,
+ 0.0213,
+ ],
+ "Bi": [
+ 83.0,
+ 8.2324,
+ 20.0183,
+ 17.6603,
+ 23.3246,
+ 13.6777,
+ 53.0479,
+ 3.9249,
+ 0.6675,
+ 0.1722,
+ 0.0210,
+ ],
+ "Po": [
+ 84.0,
+ 9.0662,
+ 20.1395,
+ 23.6273,
+ 17.1872,
+ 13.8913,
+ 48.3272,
+ 3.6624,
+ 0.1701,
+ 0.6471,
+ 0.0208,
+ ],
+ "At": [
+ 85.0,
+ 9.9223,
+ 20.2544,
+ 23.9015,
+ 16.7271,
+ 14.1028,
+ 43.7514,
+ 3.4229,
+ 0.1680,
+ 0.6271,
+ 0.0206,
+ ],
+ "Rn": [
+ 86.0,
+ 10.7789,
+ 20.3926,
+ 16.3720,
+ 24.0637,
+ 14.2879,
+ 38.6121,
+ 3.2050,
+ 0.6037,
+ 0.1650,
+ 0.0203,
+ ],
+ "Fr": [
+ 87.0,
+ 2.5332,
+ 11.5319,
+ 24.7459,
+ 31.9247,
+ 16.2475,
+ 269.878,
+ 21.9610,
+ 2.0716,
+ 0.2243,
+ 0.0223,
+ ],
+ "Ra": [
+ 88.0,
+ 3.2249,
+ 11.6694,
+ 24.8687,
+ 31.8957,
+ 16.3306,
+ 321.663,
+ 20.3846,
+ 1.9730,
+ 0.2166,
+ 0.0219,
+ ],
+ "Ac": [
+ 89.0,
+ 3.6207,
+ 12.1269,
+ 24.9363,
+ 31.8798,
+ 16.4227,
+ 270.774,
+ 18.9025,
+ 1.8811,
+ 0.2095,
+ 0.0215,
+ ],
+ "Th": [
+ 90.0,
+ 4.0181,
+ 12.6119,
+ 24.9621,
+ 31.8646,
+ 16.5249,
+ 232.371,
+ 17.3825,
+ 1.7950,
+ 0.2030,
+ 0.0211,
+ ],
+ "Pa": [
+ 91.0,
+ 3.7926,
+ 12.6626,
+ 25.8795,
+ 31.9403,
+ 16.7045,
+ 236.803,
+ 17.5908,
+ 1.7607,
+ 0.1984,
+ 0.0209,
+ ],
+ "U": [
+ 92.0,
+ 3.9051,
+ 12.8415,
+ 26.4298,
+ 31.9514,
+ 16.8475,
+ 221.178,
+ 16.8737,
+ 1.7008,
+ 0.1932,
+ 0.0205,
+ ],
+ "Np": [
+ 93.0,
+ 4.0333,
+ 12.9014,
+ 26.7571,
+ 31.4732,
+ 17.8065,
+ 207.727,
+ 16.3175,
+ 1.6677,
+ 0.1954,
+ 0.0220,
+ ],
+ "Pu": [
+ 94.0,
+ 4.2695,
+ 12.5662,
+ 28.0362,
+ 31.9382,
+ 17.1487,
+ 185.955,
+ 15.5936,
+ 1.5914,
+ 0.1834,
+ 0.0200,
+ ],
+ "Am": [
+ 95.0,
+ 4.3981,
+ 12.6808,
+ 28.6781,
+ 31.9085,
+ 17.2883,
+ 174.359,
+ 14.9676,
+ 1.5304,
+ 0.1786,
+ 0.0197,
+ ],
+ "Cm": [
+ 96.0,
+ 4.3981,
+ 12.6808,
+ 28.6781,
+ 31.9085,
+ 17.2883,
+ 174.359,
+ 14.9676,
+ 1.5304,
+ 0.1786,
+ 0.0197,
+ ],
+ "Bk": [
+ 97.0,
+ 4.3981,
+ 12.6808,
+ 28.6781,
+ 31.9085,
+ 17.2883,
+ 174.359,
+ 14.9676,
+ 1.5304,
+ 0.1786,
+ 0.0197,
+ ],
+ "Cf": [
+ 98.0,
+ 4.3981,
+ 12.6808,
+ 28.6781,
+ 31.9085,
+ 17.2883,
+ 174.359,
+ 14.9676,
+ 1.5304,
+ 0.1786,
+ 0.0197,
+ ],
+}
+
+
+NEUTRON_SCATTERING_LENGTHS = {}
diff --git a/src/xrpd_toolbox/fit_engine/lattice.py b/src/xrpd_toolbox/fit_engine/lattice.py
new file mode 100644
index 0000000..e750037
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/lattice.py
@@ -0,0 +1,285 @@
+import numpy as np
+
+from xrpd_toolbox.core import Parameter
+from xrpd_toolbox.fit_engine.fitting_core import RefinementBaseModel
+
+MIN_POSSIBLE_LATTICE = (
+ 0.53 # Single hydrogen atom is 0.53 angstroms so it can never be smaller than this
+)
+
+
+class LatticeParameter(Parameter):
+ bounds: list[float] = [MIN_POSSIBLE_LATTICE, np.inf]
+
+
+class Lattice(RefinementBaseModel):
+ """This decribes the assymetric unit cell lattice -
+ a, b, c refer to the length of the unit cell in Angstrom
+ alpha, beta, gamma are the angles of the unit cell in degreee"""
+
+ a: Parameter | float # in Angstrom
+ b: Parameter | float
+ c: Parameter | float
+ alpha: Parameter | float # in degrees
+ beta: Parameter | float # in degrees
+ gamma: Parameter | float # in degrees
+
+ @property
+ def alpha_radians(self):
+ return np.deg2rad(self.alpha)
+
+ @property
+ def beta_radians(self):
+ return np.deg2rad(self.beta)
+
+ @property
+ def gamma_radians(self):
+ return np.deg2rad(self.gamma)
+
+ @property
+ def matrix(self) -> np.ndarray:
+ """
+ Returns 3x3 lattice matrix (fractional → Cartesian)
+ """
+ a, b, c = self.a, self.b, self.c
+ alpha = self.alpha_radians
+ beta = self.beta_radians
+ gamma = self.gamma_radians
+
+ # lattice vectors
+ a_vec = np.array([a, 0.0, 0.0])
+ b_vec = np.array([b * np.cos(gamma), b * np.sin(gamma), 0.0])
+
+ cx = c * np.cos(beta)
+ cy = c * (np.cos(alpha) - np.cos(beta) * np.cos(gamma)) / np.sin(gamma)
+ cz = np.sqrt(max(c**2 - cx**2 - cy**2, 0.0))
+
+ c_vec = np.array([cx, cy, cz])
+
+ return np.vstack([a_vec, b_vec, c_vec])
+
+
+class TriclinicLattice(Lattice):
+ """This is the most general case of the lattice
+ where a, b, c and alpha, beta, gamma can be any value"""
+
+ def __init__(
+ self,
+ a: float,
+ b: float,
+ c: float,
+ alpha: float,
+ beta: float,
+ gamma: float,
+ parameterise: bool = True,
+ **kwargs,
+ ):
+ a_param = LatticeParameter(value=a, refine=True)
+ b_param = LatticeParameter(value=b, refine=True)
+ c_param = LatticeParameter(value=c, refine=True)
+
+ alpha_param = Parameter(value=alpha, refine=True)
+ beta_param = Parameter(value=beta, refine=True)
+ gamma_param = Parameter(value=gamma, refine=True)
+
+ super().__init__(
+ a=a_param,
+ b=b_param,
+ c=c_param,
+ alpha=alpha_param,
+ beta=beta_param,
+ gamma=gamma_param,
+ )
+
+
+class MonoclinicLattice(Lattice):
+ """This is a special case of the lattice where alpha = gamma = 90"""
+
+ def __init__(
+ self,
+ a: float,
+ b: float,
+ c: float,
+ beta: float,
+ parameterise: bool = True,
+ **kwargs,
+ ):
+ a_param = LatticeParameter(value=a, refine=True)
+ b_param = LatticeParameter(value=b, refine=True)
+ c_param = LatticeParameter(value=c, refine=True)
+
+ beta_param = Parameter(value=beta, refine=True)
+
+ # right_angle = Parameter(value=90, refine=False)
+
+ super().__init__(
+ a=a_param,
+ b=b_param,
+ c=c_param,
+ alpha=90,
+ beta=beta_param,
+ gamma=90,
+ )
+
+
+class OrthorhombicLattice(Lattice):
+ """This is a special case of the lattice
+ where alpha = beta = gamma = 90"""
+
+ def __init__(
+ self, a: float, b: float, c: float, parameterise: bool = True, **kwargs
+ ):
+ a_param = LatticeParameter(value=a, refine=True)
+ b_param = LatticeParameter(value=b, refine=True)
+ c_param = LatticeParameter(value=c, refine=True)
+
+ # right_angle = Parameter(value=90, refine=False)
+
+ super().__init__(
+ a=a_param,
+ b=b_param,
+ c=c_param,
+ alpha=90,
+ beta=90,
+ gamma=90,
+ )
+
+
+class TetragonalLattice(Lattice):
+ """This is a special case of the lattice
+ where a = b and alpha = beta = gamma = 90"""
+
+ def __init__(self, a: float, c: float, parameterise: bool = True, **kwargs):
+ a_param = LatticeParameter(value=a, refine=True)
+ c_param = LatticeParameter(value=c, refine=True)
+
+ # right_angle = Parameter(value=90, refine=False)
+
+ super().__init__(
+ a=a_param,
+ b=a_param,
+ c=c_param,
+ alpha=90,
+ beta=90,
+ gamma=90,
+ )
+
+
+class TrigonalLattice(Lattice):
+ """This is a special case of the lattice
+ where a = b and alpha = beta = 90 and gamma = 120"""
+
+ def __init__(self, a: float, c: float, parameterise: bool = True, **kwargs):
+ a_param = LatticeParameter(value=a, refine=True)
+ c_param = LatticeParameter(value=c, refine=True)
+ # right_angle = Parameter(value=90, refine=False)
+ # one_twenty_angle = Parameter(value=120, refine=False)
+
+ super().__init__(
+ a=a_param,
+ b=a_param,
+ c=c_param,
+ alpha=90,
+ beta=90,
+ gamma=120,
+ )
+
+
+class HexagonalLattice(Lattice):
+ """This is a special case of the lattice
+ where a = b and gamma = 120 and alpha = beta = 90"""
+
+ def __init__(self, a: float, c: float, parameterise: bool = True, **kwargs):
+ a_param = LatticeParameter(value=a, refine=True)
+ c_param = LatticeParameter(value=c, refine=True)
+ # right_angle = Parameter(value=90, refine=False)
+ # one_twenty_angle = Parameter(value=120, refine=False)
+
+ super().__init__(
+ a=a_param,
+ b=a_param,
+ c=c_param,
+ alpha=90,
+ beta=90,
+ gamma=120,
+ )
+
+
+class RhombohedralLattice(Lattice):
+ """This is a special case of the lattice
+ where a = b = c and alpha = beta = gamma"""
+
+ def __init__(self, a: float, alpha: float, parameterise: bool = True, **kwargs):
+ a_param = LatticeParameter(value=a, refine=True)
+ alpha_param = Parameter(value=alpha, refine=True)
+
+ super().__init__(
+ a=a_param,
+ b=a_param,
+ c=a_param,
+ alpha=alpha_param,
+ beta=alpha_param,
+ gamma=alpha_param,
+ )
+
+
+class CubicLattice(Lattice):
+ def __init__(self, a: float, parameterise: bool = True, **kwargs):
+ a_param = LatticeParameter(value=a, refine=True)
+
+ super().__init__(
+ a=a_param,
+ b=a_param,
+ c=a_param,
+ alpha=90,
+ beta=90,
+ gamma=90,
+ )
+
+
+def crystal_lattice_factory(crystal_class: str):
+ class_str = str(crystal_class).lower()
+
+ if class_str == "cubic":
+ return CubicLattice
+ elif class_str == "hexagonal":
+ return HexagonalLattice
+ elif class_str == "monoclinic":
+ return MonoclinicLattice
+ elif class_str == "orthorhombic":
+ return OrthorhombicLattice
+ elif class_str == "rhombohedral":
+ return RhombohedralLattice
+ elif class_str == "tetragonal":
+ return TetragonalLattice
+ elif class_str == "trigonal":
+ return TrigonalLattice
+ elif class_str == "triclinic":
+ return TriclinicLattice
+ else:
+ raise ValueError(f"{crystal_class} unknown")
+
+
+if __name__ == "__main__":
+ cl = CubicLattice(a=5)
+ # cl.parameterise()
+
+ print(cl)
+
+ params = cl.get_refinement_parameters()
+
+ print(params)
+
+ params["a"] = 5.5
+
+ cl.set_refinement_parameters(params)
+
+ print(cl)
+
+ model_dict = cl.model_dump()
+
+ # print(cl.get_refinable_parameters())
+
+ cl2 = Lattice.model_validate(model_dict)
+
+ print(cl2)
diff --git a/src/xrpd_toolbox/fit_engine/peak_shape_functions.py b/src/xrpd_toolbox/fit_engine/peak_shape_functions.py
new file mode 100644
index 0000000..714cc73
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/peak_shape_functions.py
@@ -0,0 +1,382 @@
+from abc import abstractmethod
+from typing import Annotated, Literal
+
+import numpy as np
+from numba import njit
+from pydantic import Field
+
+from xrpd_toolbox.core import Parameter
+from xrpd_toolbox.fit_engine.fitting_core import RefinementBaseModel
+
+
+def caglioti_fwhm(
+ two_theta: np.ndarray | float, # in degrees
+ u: float | int,
+ v: float | int,
+ w: float | int,
+) -> np.ndarray:
+ """
+ Compute FWHM using the Caglioti function.
+
+ Parameters
+ ----------
+ two_theta : float or array
+ 2θ in degrees
+ u, v, w : float
+ Caglioti parameters
+
+ """
+ theta = np.radians(two_theta / 2.0)
+ tan_theta = np.tan(theta)
+
+ return np.sqrt(u * tan_theta**2 + v * tan_theta + w)
+
+
+@njit
+def extended_caglioti_fwhm(
+ two_theta: np.ndarray | float,
+ u: float,
+ v: float,
+ w: float,
+ x: float,
+ y: float,
+) -> np.ndarray:
+ theta = np.radians(two_theta / 2.0)
+ tan_theta = np.tan(theta)
+ sec_theta = 1.0 / np.cos(theta)
+
+ return np.sqrt(
+ u * tan_theta**2 + v * tan_theta + w + x * sec_theta + y * np.cos(theta)
+ )
+
+
+@njit
+def lorentzian_fwhm(
+ two_theta: np.ndarray | float,
+ x: float,
+ y: float,
+) -> np.ndarray:
+ theta = np.radians(two_theta / 2.0)
+
+ return x / np.cos(theta) + y * np.tan(theta)
+
+
+@njit
+def tchz_fwhm(
+ two_theta: np.ndarray,
+ u: float,
+ v: float,
+ w: float,
+ x: float,
+ y: float,
+):
+ hg = caglioti_fwhm(two_theta, u, v, w)
+ hl = lorentzian_fwhm(two_theta, x, y)
+
+ return hg, hl
+
+
+class IRF(RefinementBaseModel):
+ wdt: float | int = 5.0 # window for peak calculation. 5 = 5 * fwhm
+
+ @abstractmethod
+ def calculate_peak_widths(self, peak_centres: np.ndarray):
+ raise NotImplementedError(
+ "calculate_peak_widths method must be implemented for subclasses"
+ )
+
+ @abstractmethod
+ def calculate_profile(
+ self, x: np.ndarray, peak_centres: np.ndarray, peak_intensities: np.ndarray
+ ) -> np.ndarray:
+ """Calculates the profile of peaks with the stored values,
+ and for the given peak_centres/intensities"""
+ raise NotImplementedError(
+ "calculate_profile method must be implemented for subclasses"
+ )
+
+
+class Cagloti(IRF):
+ irf_type: Literal["Cagloti"] = "Cagloti"
+
+ u: float | Parameter = Field(default=Parameter(value=1))
+ v: float | Parameter = Field(default=Parameter(value=1))
+ w: float | Parameter = Field(default=Parameter(value=1))
+
+ def calculate(self, peak_centres: np.ndarray) -> np.ndarray:
+ return caglioti_fwhm(
+ two_theta=peak_centres, u=float(self.u), v=float(self.v), w=float(self.w)
+ )
+
+
+class ExtendedCaglioti(IRF):
+ irf_type: Literal["ExtendedCaglioti"] = "ExtendedCaglioti"
+
+ u: float | Parameter = Field(default=Parameter(value=1e-4))
+ v: float | Parameter = Field(default=Parameter(value=0))
+ w: float | Parameter = Field(default=Parameter(value=1e-4))
+ x: float | Parameter = Field(default=Parameter(value=1e-3))
+ y: float | Parameter = Field(default=Parameter(value=0.0))
+
+ def calculate(self, peak_centres: np.ndarray) -> np.ndarray:
+ return extended_caglioti_fwhm(
+ peak_centres,
+ float(self.u),
+ float(self.v),
+ float(self.w),
+ float(self.x),
+ float(self.y),
+ )
+
+
+@njit
+def tchz_combine_fwhm(hg, hl):
+ return (
+ hg**5
+ + 2.69269 * hg**4 * hl
+ + 2.42843 * hg**3 * hl**2
+ + 4.47163 * hg**2 * hl**3
+ + 0.07842 * hg * hl**4
+ + hl**5
+ ) ** (1 / 5)
+
+
+@njit
+def tchz_eta(hg, hl, h):
+ r = hl / h
+ return 1.36603 * r - 0.47719 * r**2 + 0.11116 * r**3
+
+
+# # TODO: Add modified pearson
+# class ModifiedPearson(IRF):
+
+
+class TCHZ(IRF):
+ """Thompson–Cox–Hastings pseudo-Voigt"""
+
+ irf_type: Literal["TCHZ"] = "TCHZ"
+
+ u: float | Parameter = Field(default=Parameter(value=0.002))
+ v: float | Parameter = Field(default=Parameter(value=0.0, refine=False))
+ w: float | Parameter = Field(default=Parameter(value=0.0006))
+ x: float | Parameter = Field(default=Parameter(value=0.003))
+ y: float | Parameter = Field(default=Parameter(value=0.01))
+
+ def calculate_peak_widths(self, peak_centres: np.ndarray):
+ hg = caglioti_fwhm(
+ peak_centres,
+ float(self.u),
+ float(self.v),
+ float(self.w),
+ )
+
+ hl = lorentzian_fwhm(
+ peak_centres,
+ float(self.x),
+ float(self.y),
+ )
+
+ fwhm = tchz_combine_fwhm(hg, hl)
+ eta = tchz_eta(hg, hl, fwhm)
+
+ return fwhm, eta
+
+ def calculate_shape(self, x: np.ndarray, centre: float, fwhm: float, eta: float):
+ sigma = fwhm / (2 * np.sqrt(2 * np.log(2)))
+ gamma = fwhm / 2.0
+
+ dx = x - centre
+
+ gauss = np.exp(-(dx**2) / (2 * sigma**2))
+ lorentz = gamma**2 / (dx**2 + gamma**2)
+
+ return eta * lorentz + (1 - eta) * gauss
+
+ def calculate_profile(
+ self,
+ x: np.ndarray,
+ peak_centres: np.ndarray,
+ peak_intensities: np.ndarray,
+ ) -> np.ndarray:
+ y = np.zeros_like(x, dtype=float)
+
+ fwhm, eta = self.calculate_peak_widths(peak_centres)
+
+ for i, centre in enumerate(peak_centres):
+ w = fwhm[i]
+
+ start = np.searchsorted(x, centre - self.wdt * w)
+ end = np.searchsorted(x, centre + self.wdt * w, side="right")
+
+ if end <= start:
+ continue
+
+ xi = x[start:end]
+
+ peak = self.calculate_shape(
+ xi,
+ centre,
+ w,
+ eta[i],
+ )
+
+ y[start:end] += peak_intensities[i] * peak
+
+ return y
+
+
+class ModifiedPearsonVII(IRF):
+ """Modified Pearson VII peak shape function"""
+
+ irf_type: Literal["MPV"] = "MPV"
+
+ u: float | Parameter = Field(default=Parameter(value=1)) # shape parameter m
+ v: float | Parameter = Field(
+ default=Parameter(value=-1e-1, refine=False)
+ ) # optional fixed offset
+ w: float | Parameter = Field(
+ default=Parameter(value=5e-3)
+ ) # instrument broadening term
+
+ def calculate_peak_widths(self, peak_centres: np.ndarray):
+ # Replace with your own Caglioti/Lorentzian model if needed
+ # Here assumed to directly produce FWHM per peak centre
+ fwhm = caglioti_fwhm(
+ peak_centres,
+ float(self.u),
+ float(self.v),
+ float(self.w),
+ )
+ return fwhm
+
+ def calculate_shape(self, x: np.ndarray, centre: float, fwhm: float, m: float):
+ dx = x - centre
+
+ # avoid invalid m values
+ m = max(float(m), 1e-6)
+
+ denom = 2 * np.sqrt(2 ** (1.0 / m) - 1)
+ gamma = fwhm / denom
+
+ return (1.0 + (dx**2) / (gamma**2)) ** (-m)
+
+ def calculate_profile(
+ self,
+ x: np.ndarray,
+ peak_centres: np.ndarray,
+ peak_intensities: np.ndarray,
+ ) -> np.ndarray:
+ y = np.zeros_like(x, dtype=float)
+
+ fwhm = self.calculate_peak_widths(peak_centres)
+ m = float(self.u)
+
+ for i, centre in enumerate(peak_centres):
+ w = fwhm[i]
+
+ start = np.searchsorted(x, centre - self.wdt * w)
+ end = np.searchsorted(x, centre + self.wdt * w, side="right")
+
+ if end <= start:
+ continue
+
+ xi = x[start:end]
+
+ peak = self.calculate_shape(
+ xi,
+ centre,
+ w,
+ m,
+ )
+
+ y[start:end] += peak_intensities[i] * peak
+
+ return y
+
+
+class FCJPseudoVoigt(IRF):
+ """
+ Finger–Cox–Jephcoat asymmetric pseudo-Voigt (practical approximation)
+
+ Uses:
+ - pseudo-Voigt core
+ - exponential tailing asymmetry (axial divergence model)
+ """
+
+ irf_type: Literal["FCJ_PV"] = "FCJ_PV"
+
+ u: float | Parameter = Field(default=Parameter(value=0.002))
+ v: float | Parameter = Field(default=Parameter(value=0.0, refine=False))
+ w: float | Parameter = Field(default=Parameter(value=0.0006))
+ x: float | Parameter = Field(default=Parameter(value=0.003))
+ y: float | Parameter = Field(default=Parameter(value=0.01))
+
+ a: float | Parameter = Field(default=Parameter(value=0.0)) # FCJ asymmetry
+
+ def calculate_peak_widths(self, peak_centres: np.ndarray):
+ hg = caglioti_fwhm(peak_centres, float(self.u), float(self.v), float(self.w))
+ hl = lorentzian_fwhm(peak_centres, float(self.x), float(self.y))
+
+ fwhm = tchz_combine_fwhm(hg, hl)
+ eta = tchz_eta(hg, hl, fwhm)
+
+ return fwhm, eta
+
+ def calculate_shape(self, x, centre, fwhm, eta, alpha):
+ dx = x - centre
+
+ sigma = fwhm / (2 * np.sqrt(2 * np.log(2)))
+ gamma = fwhm / 2.0
+
+ # symmetric components
+ gauss = np.exp(-(dx**2) / (2 * sigma**2))
+ lorentz = gamma**2 / (dx**2 + gamma**2)
+
+ pv = eta * lorentz + (1 - eta) * gauss
+
+ # FCJ asymmetry: exponential right-hand tailing
+ # (common diffraction approximation)
+ asym = np.exp(-alpha * np.clip(dx, 0, None))
+
+ return pv * asym
+
+ def calculate_profile(
+ self,
+ x: np.ndarray,
+ peak_centres: np.ndarray,
+ peak_intensities: np.ndarray,
+ ) -> np.ndarray:
+ y = np.zeros_like(x, dtype=float)
+
+ fwhm, eta = self.calculate_peak_widths(peak_centres)
+
+ alpha = float(self.a)
+
+ for i, centre in enumerate(peak_centres):
+ w = fwhm[i]
+
+ start = np.searchsorted(x, centre - self.wdt * w)
+ end = np.searchsorted(x, centre + self.wdt * w, side="right")
+
+ if end <= start:
+ continue
+
+ xi = x[start:end]
+
+ peak = self.calculate_shape(
+ xi,
+ centre,
+ w,
+ eta[i],
+ alpha,
+ )
+
+ y[start:end] += peak_intensities[i] * peak
+
+ return y
+
+
+IntrumentResolutionFunction = Annotated[
+ Cagloti | ExtendedCaglioti | TCHZ | ModifiedPearsonVII | FCJPseudoVoigt,
+ Field(discriminator="irf_type"),
+]
diff --git a/src/xrpd_toolbox/fit_engine/peaks.py b/src/xrpd_toolbox/fit_engine/peaks.py
new file mode 100644
index 0000000..63cf2e3
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/peaks.py
@@ -0,0 +1,716 @@
+"""Peak shape definitions, peak fitting utilities, and profile calculation.
+
+This module defines analytical peak functions, Pydantic peak models, and
+utility routines for XRPD profile generation and peak detection.
+"""
+
+from __future__ import annotations
+
+import math
+from abc import abstractmethod
+from collections.abc import Collection, Sequence
+from typing import Annotated, Literal, TypeAlias
+
+import numpy as np
+import peakutils
+from numba import njit
+from pydantic import Field
+from scipy.optimize import curve_fit
+from scipy.special import erf
+
+from xrpd_toolbox.core import Parameter
+from xrpd_toolbox.fit_engine.background import Background
+from xrpd_toolbox.fit_engine.fitting_core import RefinementBaseModel
+
+IMPLEMENTED_PEAK_FUNCTONS: TypeAlias = Literal[
+ "gaussian", "lorentzian", "pseudo_voigt", "tophat"
+]
+
+
+@njit()
+def gaussian_sigma_to_fwhm(sigma: float | int) -> float:
+ """Convert a Gaussian standard deviation to full width at half maximum."""
+ return float(sigma) * 2 * np.sqrt(2 * np.log(2))
+
+
+@njit()
+def gaussian_fwhm_to_sigma(fwhm: float | int) -> float:
+ """Convert a Gaussian full width at half maximum to standard deviation."""
+ return float(fwhm) / (2 * np.sqrt(2 * np.log(2)))
+
+
+@njit()
+def lorentzian_gamma_to_fwhm(gamma: float | int) -> float:
+ """Convert Lorentzian half width at half maximum to FWHM."""
+ return 2 * float(gamma)
+
+
+@njit()
+def lorentzian_fwhm_to_gamma(fwhm: float | int) -> float:
+ """Convert Lorentzian FWHM to half width at half maximum."""
+ return float(fwhm) / 2
+
+
+@njit()
+def gaussian(
+ x: np.ndarray,
+ amplitude: float | int,
+ centre: float | int,
+ fwhm: float | int,
+ background: float | int | np.ndarray = 0,
+ normalised: bool = True,
+) -> np.ndarray:
+ """
+ Gaussian peak function.
+
+ Parameters
+ ----------
+ x : array-like
+ Input coordinate(s).
+ amplitude : float | int
+ Amplitude parameter:
+ - If normalised=True: total area under the curve.
+ - If normalised=False: peak height.
+ centre : float | int
+ Peak center.
+ fwhm : float | int
+ Full-Wdth at half maximum of the peak - the peak width (must be > 0).
+ background : float | int | array-like, optional
+ Additive background (constant or array matching `x`). Default is 0.
+ normalised : bool, optional
+ If True (default), returns an area-normalised Gaussian.
+ If False, returns a Gaussian with peak height A.
+
+ Returns
+ -------
+ NDArray[np.float64]
+ Evaluated Gaussian function.
+ """
+
+ sigma = gaussian_fwhm_to_sigma(fwhm)
+
+ if normalised:
+ prefactor = amplitude / (sigma * np.sqrt(2 * np.pi))
+ else:
+ prefactor = amplitude
+
+ return prefactor * np.exp(-((x - centre) ** 2) / (2 * sigma**2)) + background
+
+
+@njit()
+def lorentzian(
+ x: np.ndarray,
+ amplitude: float | int,
+ centre: float | int,
+ fwhm: float | int,
+ background: float | int | np.ndarray = 0,
+ normalised: bool = True,
+) -> np.ndarray:
+ """Lorentzian peak function.
+
+ Parameters
+ ----------
+ x : array-like
+ Input coordinate(s).
+ amplitude : float | int
+ Amplitude parameter:
+ - If normalised=True: total area under the curve.
+ - If normalised=False: peak height.
+ centre : float | int
+ Peak centre.
+ fwhm : float | int
+ Full width at half maximum.
+ background : float | int | array-like, optional
+ Additive background term. Default is 0.
+ normalised : bool, optional
+ If True, returns an area-normalised Lorentzian.
+
+ Returns
+ -------
+ NDArray[np.float64]
+ Evaluated Lorentzian function.
+ """
+ gamma = float(fwhm) / 2
+
+ if normalised:
+ prefactor = amplitude / np.pi
+ core = gamma / ((x - centre) ** 2 + gamma**2)
+ else:
+ prefactor = amplitude
+ core = gamma**2 / ((x - centre) ** 2 + gamma**2)
+
+ return prefactor * core + background
+
+
+@njit()
+def pseudo_voigt(
+ x: np.ndarray,
+ amplitude: float | int,
+ centre: float | int,
+ fwhm: float | int,
+ eta: float | int,
+ background: float | int | np.ndarray = 0,
+ normalised: bool = True,
+) -> np.ndarray:
+ """
+ Pseudo-Voigt peak function with a single FWHM parameter.
+
+ Parameters
+ ----------
+ x : array-like
+ Input coordinate(s).
+ amplitude : float | int
+ Amplitude parameter:
+ - If normalised=True: total area under the curve.
+ - If normalised=False: approximate peak height.
+ centre : float | int
+ Peak center.
+ fwhm : float | int
+ Full width at half maximum (must be > 0).
+ eta : float | int
+ Mixing parameter:
+ - 0 → pure Gaussian
+ - 1 → pure Lorentzian
+ background : float | int | array-like, optional
+ Additive background. Default is 0.
+ normalised : bool, optional
+ If True (default), area-normalised.
+ If False, amplitude ≈ peak height.
+
+ Returns
+ -------
+ NDArray[np.float64]
+ Evaluated pseudo-Voigt function.
+ """
+
+ fwhm = float(fwhm)
+ eta = float(eta)
+
+ gauss = gaussian(
+ x=x,
+ amplitude=amplitude,
+ centre=centre,
+ fwhm=fwhm,
+ background=0,
+ normalised=normalised,
+ )
+ lorentz = lorentzian(
+ x=x,
+ amplitude=amplitude,
+ centre=centre,
+ fwhm=fwhm,
+ background=0,
+ normalised=normalised,
+ )
+
+ pv = eta * lorentz + (1.0 - eta) * gauss
+ pv = pv + background
+ return pv
+
+
+def smooth_tophat(
+ x: np.ndarray,
+ amplitude: float | int,
+ centre: float | int,
+ fwhm: float | int,
+ epsilon: float | int,
+ background: float | int | np.ndarray = 0,
+ normalised: bool = True,
+):
+ """Return a Gaussian-smoothed top-hat profile.
+
+ Parameters
+ ----------
+ x : array-like
+ Input coordinate(s).
+ amplitude : float | int
+ Plateau area if normalised=True, otherwise plateau height.
+ centre : float | int
+ Centre of the plateau.
+ fwhm : float | int
+ Width of the plateau.
+ epsilon : float | int
+ Smoothing parameter for edge softening.
+ background : float | int | array-like, optional
+ Additive background. Default is 0.
+ normalised : bool, optional
+ If True, returns an area-normalised shape.
+
+ Returns
+ -------
+ NDArray[np.float64]
+ Evaluated smooth top-hat function.
+ """
+
+ sigma = max(epsilon * fwhm / 2.0, 1e-12)
+ half_width = fwhm / 2.0
+
+ left = (x - (centre - half_width)) / (np.sqrt(2) * sigma)
+ right = (x - (centre + half_width)) / (np.sqrt(2) * sigma)
+
+ profile = 0.5 * (erf(left) - erf(right))
+
+ if normalised:
+ # area is already fwhm * 1.0 (plateau height = 1)
+ # so amplitude is converted to height
+ scale = amplitude / fwhm
+ else:
+ scale = amplitude
+
+ return scale * profile + background
+
+
+def closest_indices(arr1: np.ndarray, arr2: np.ndarray):
+ """Find the closest index in `arr2` for each value in `arr1`.
+
+ Parameters
+ ----------
+ arr1 : array-like
+ Values whose closest matches are sought.
+ arr2 : array-like
+ Reference values for matching.
+
+ Returns
+ -------
+ numpy.ndarray
+ Indices into `arr2` corresponding to the closest values.
+ """
+ arr1 = np.asarray(arr1)
+ arr2 = np.asarray(arr2)
+ # Broadcast arr1 and arr2 to compute pairwise differences
+ diffs = np.abs(arr1[..., np.newaxis] - arr2)
+ # Find the index of the minimum difference along the last axis (arr2)
+ idx = np.argmin(diffs, axis=-1)
+ return idx
+
+
+def peak_factory(peak_type: str):
+ """Return the peak model class for a given peak type name.
+
+ Parameters
+ ----------
+ peak_type : str
+ Supported values: 'gaussian', 'lorentzian', 'pseudo_voigt', 'tophat'.
+
+ Returns
+ -------
+ type[Peak]
+ The peak model class corresponding to `peak_type`.
+
+ Raises
+ ------
+ ValueError
+ If `peak_type` is not in the implemented peak types.
+ """
+ match peak_type:
+ case "gaussian":
+ return GaussianPeak
+ case "lorentzian":
+ return LorentzianPeak
+ case "pseudo_voigt":
+ return PseudoVoigtPeak
+ case "tophat":
+ return TopHatPeak
+ case _:
+ raise ValueError(
+ f"peak_type must be one of the following {IMPLEMENTED_PEAK_FUNCTONS}"
+ )
+
+
+def estimate_fwhm(
+ x_values: np.ndarray,
+ y_values: np.ndarray,
+ peak_index: int,
+) -> float:
+ """
+ Estimate the full width at half maximum (FWHM) of a peak
+ using neighbouring points.
+
+ Parameters
+ ----------
+ x_values : NDArray[np.float64]
+ Coordinate values.
+ y_values : NDArray[np.float64]
+ Signal/intensity values.
+ peak_index : int
+ Index of the peak maximum.
+
+ Returns
+ -------
+ float
+ Estimated FWHM.
+ """
+ # --- fallback based on sampling spacing ---
+ if len(x_values) > 1:
+ average_spacing = float(np.mean(np.diff(x_values)))
+ else:
+ average_spacing = 1.0
+
+ fallback_fwhm = average_spacing * 2
+
+ # need neighbours on both sides
+ if peak_index <= 0 or peak_index >= len(x_values) - 1:
+ return fallback_fwhm
+
+ peak_x = x_values[peak_index]
+ peak_y = y_values[peak_index]
+
+ if peak_y <= 0 or not np.isfinite(peak_y):
+ return fallback_fwhm
+
+ estimated_sigmas: list[float] = []
+
+ # --- right neighbour ---
+ right_x = x_values[peak_index + 1]
+ right_y = y_values[peak_index + 1]
+
+ if 0 < right_y < peak_y:
+ try:
+ sigma = abs(right_x - peak_x) / np.sqrt(2 * np.log(peak_y / right_y))
+ estimated_sigmas.append(sigma)
+ except Exception:
+ pass
+
+ # --- left neighbour ---
+ left_x = x_values[peak_index - 1]
+ left_y = y_values[peak_index - 1]
+
+ if 0 < left_y < peak_y:
+ try:
+ sigma = abs(left_x - peak_x) / np.sqrt(2 * np.log(peak_y / left_y))
+ estimated_sigmas.append(sigma)
+ except Exception:
+ pass
+
+ if not estimated_sigmas:
+ return fallback_fwhm
+
+ mean_sigma = float(np.mean(estimated_sigmas))
+
+ # convert sigma to FWHM
+ fwhm = mean_sigma * 2 * np.sqrt(2 * np.log(2))
+
+ if not np.isfinite(fwhm) or fwhm <= 0:
+ return fallback_fwhm
+
+ return fwhm
+
+
+def fit_peaks(
+ x: np.ndarray, y: np.ndarray, initial_x_pos: Collection[int | float]
+) -> list[Peak]:
+ """Fit Gaussian peaks to observed data using initial position guesses.
+
+ Parameters
+ ----------
+ x : NDArray[np.float64]
+ Coordinate values.
+ y : NDArray[np.float64]
+ Observed intensity values.
+ initial_x_pos : Collection[int | float]
+ Initial guesses for the peak positions.
+
+ Returns
+ -------
+ list[Peak]
+ Fitted Gaussian peak models.
+ """
+ fitted_peaks = []
+
+ for x_guess in initial_x_pos:
+ try:
+ peak_index = int(np.argmin(np.abs(x - x_guess)))
+ width_guess = estimate_fwhm(x, y, peak_index)
+ # Estimate amplitude from nearest data point
+ idx = np.argmin(np.abs(x - x_guess))
+ amp_guess = y[idx] * np.sqrt(2 * np.pi) * width_guess
+
+ p0 = [
+ amp_guess,
+ x_guess,
+ width_guess,
+ ]
+
+ start_idx = np.searchsorted(x, x_guess - 1)
+ end_idx = np.searchsorted(x, x_guess + 1, side="right")
+
+ x_fit = x[start_idx:end_idx]
+ y_fit = y[start_idx:end_idx]
+
+ if len(y_fit) == 0:
+ fitted_peaks.append(
+ GaussianPeak(amplitude=math.nan, centre=math.nan, fwhm=math.nan)
+ )
+ continue
+
+ popt, _ = curve_fit(gaussian, x_fit, y_fit, p0=p0, maxfev=10000) # type: ignore
+
+ fitted_peaks.append(
+ GaussianPeak(amplitude=popt[0], centre=popt[1], fwhm=popt[2])
+ )
+
+ except RuntimeError:
+ fitted_peaks.append(
+ GaussianPeak(amplitude=math.nan, centre=math.nan, fwhm=math.nan)
+ )
+
+ return fitted_peaks
+
+
+def find_and_fit_peaks(x: np.ndarray, y: np.ndarray, smoothing: int = 5) -> list[Peak]:
+ """Detect peaks in a signal and fit Gaussian models automatically.
+
+ Parameters
+ ----------
+ x : NDArray[np.float64]
+ Coordinate values.
+ y : NDArray[np.float64]
+ Observed signal intensities.
+ smoothing : int, optional
+ Width of the moving-average filter used to reduce noise.
+
+ Returns
+ -------
+ list[Peak]
+ Gaussian peak models fit to the detected peak positions.
+ """
+
+ y_smoothed = np.convolve(
+ y, np.ones(smoothing), mode="same"
+ ) # smooth the data to reduce noise
+
+ threshold = np.amax(y_smoothed) / smoothing
+
+ indexes = peakutils.indexes(y_smoothed, thres=threshold, min_dist=3) # type: ignore
+
+ initial_x_pos = x[indexes]
+ fitted_peaks = fit_peaks(x, y_smoothed, initial_x_pos=initial_x_pos)
+
+ return fitted_peaks
+
+
+class Peak(RefinementBaseModel):
+ """Abstract base class for parameterised peak models.
+
+ Peak subclasses provide analytic peak shapes and support refinement
+ through the shared parameter interface.
+ """
+
+ amplitude: Parameter | float = Field(gt=0)
+ centre: Parameter | float = Field(gt=0)
+ fwhm: Parameter | float = Field(gt=0, default=Parameter(value=0.02))
+ normalised: bool = True # if normalised the
+
+ @abstractmethod
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ """Evaluate the peak shape on a coordinate array."""
+ raise NotImplementedError("Must implement calculate method in peak subclass")
+
+
+class GaussianPeak(Peak):
+ """Gaussian peak model class."""
+
+ peak_type: Literal["gaussian"] = "gaussian"
+
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ return gaussian(
+ x,
+ float(self.amplitude),
+ float(self.centre),
+ float(self.fwhm),
+ normalised=self.normalised,
+ )
+
+
+class LorentzianPeak(Peak):
+ """Lorentzian peak model class."""
+
+ peak_type: Literal["lorentzian"] = "lorentzian"
+
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ return lorentzian(
+ x,
+ float(self.amplitude),
+ float(self.centre),
+ float(self.fwhm),
+ normalised=self.normalised,
+ )
+
+
+class PseudoVoigtPeak(Peak):
+ """Pseudo-Voigt peak model class combining Gaussian and Lorentzian shapes."""
+
+ peak_type: Literal["pseudo_voigt"] = "pseudo_voigt"
+
+ eta: Parameter | float | int = Field(
+ ge=0, le=1, default=0.5
+ ) # used for pseudo-voigt - mixing param
+
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ return pseudo_voigt(
+ x,
+ float(self.amplitude),
+ float(self.centre),
+ float(self.fwhm),
+ float(self.eta),
+ normalised=self.normalised,
+ )
+
+
+class TopHatPeak(Peak):
+ """Smoothed top-hat peak model class."""
+
+ peak_type: Literal["tophat"] = "tophat"
+
+ epsilon: Parameter | float | int = Field(
+ ge=0, le=1, default=0.1
+ ) # used for tophat - smoothing
+
+ def calculate(self, x: np.ndarray) -> np.ndarray:
+ return smooth_tophat(
+ x,
+ float(self.amplitude),
+ float(self.centre),
+ float(self.fwhm),
+ float(self.epsilon),
+ normalised=self.normalised,
+ )
+
+
+# would it be useful to have a peak that can be any of of the other peaks
+# possibly useful if you don't know what type of peak shape you actually want?
+# class MutatablePeak(Peak):
+# peak_type: Literal["mutatable"] = "mutatable"
+
+
+def calculate_profile(
+ x: np.ndarray,
+ peaks: Sequence[Peak],
+ background: int | float | np.ndarray | Background = 0,
+ phase_scale: int | float = 1,
+ wdt: int | float = 5,
+):
+ """Calculate the combined peak profile and optional background.
+
+ Parameters
+ ----------
+ x : NDArray[np.float64]
+ Coordinate values at which to evaluate the profile.
+ peaks : Sequence[Peak]
+ Sequence of peak models to sum.
+ background : int | float | np.ndarray | Background, optional
+ Baseline to add to the summed peak profile. Default is 0.
+ phase_scale : int | float, optional
+ Multiplicative scale factor applied to the peak intensity.
+ wdt : int | float, optional
+ Range in units of peak FWHM used when evaluating each peak.
+
+ Returns
+ -------
+ numpy.ndarray
+ Summed intensity profile for the input coordinates.
+ """
+
+ if isinstance(background, np.ndarray):
+ assert len(x) == len(background)
+
+ intensity = np.zeros_like(x)
+
+ for peak in peaks:
+ start_idx = np.searchsorted(x, float(peak.centre) - (wdt * float(peak.fwhm)))
+ end_idx = np.searchsorted(
+ x, float(peak.centre) + (wdt * float(peak.fwhm)), side="right"
+ )
+
+ if end_idx <= start_idx:
+ continue
+
+ xi = x[start_idx:end_idx]
+ peak_intensity = peak.calculate(xi)
+ intensity[start_idx:end_idx] += peak_intensity
+
+ if isinstance(background, Background):
+ background = background.calculate(x)
+
+ intensity = (intensity * phase_scale) + background
+
+ return intensity
+
+
+@njit(parallel=True)
+def calculate_profile_parallel(
+ x: np.ndarray,
+ peaks: Sequence[Peak],
+ background: int | float | np.ndarray | Background = 0,
+ phase_scale: int | float = 1,
+ wdt: int | float = 5,
+):
+ """Placeholder for a parallel profile calculation implementation.
+
+ Parameters
+ ----------
+ x : NDArray[np.float64]
+ Coordinate values.
+ peaks : Sequence[Peak]
+ Sequence of peak models.
+ background : int | float | np.ndarray | Background, optional
+ Background model or baseline.
+ phase_scale : int | float, optional
+ Multiplicative intensity scale.
+ wdt : int | float, optional
+ Evaluation window in units of FWHM.
+
+ Returns
+ -------
+ numpy.ndarray
+ Combined intensity profile.
+
+ Notes
+ -----
+ This implementation is currently not completed and raises
+ NotImplementedError by design.
+ """
+
+ raise NotImplementedError("Not implemented well yet")
+
+ if isinstance(background, np.ndarray):
+ assert len(x) == len(background)
+
+ intensity = np.zeros_like(x)
+
+ for peak_index in range(len(peaks)):
+ peak = peaks[peak_index]
+
+ assert peak.background == 0
+
+ start_idx = np.searchsorted(x, peak.centre - (wdt * peak.fwhm))
+ end_idx = np.searchsorted(x, peak.centre + (wdt * peak.fwhm), side="right")
+
+ xi = x[start_idx:end_idx]
+ peak_intensity = peak.calculate(xi)
+
+ intensity[start_idx:end_idx] += peak_intensity
+
+ intensity = (intensity * phase_scale) + background
+
+ return intensity
+
+
+PeakType = Annotated[
+ GaussianPeak | LorentzianPeak | PseudoVoigtPeak | TopHatPeak,
+ Field(discriminator="peak_type"),
+]
+
+
+if __name__ == "__main__":
+ gauss = PseudoVoigtPeak(amplitude=1, centre=1, fwhm=1)
+
+ print(gauss)
+
+ gauss.refine_none()
+
+ print(gauss)
+
+ gauss.refine_all()
+
+ print(gauss)
diff --git a/src/xrpd_toolbox/fit_engine/phase_matching.py b/src/xrpd_toolbox/fit_engine/phase_matching.py
new file mode 100644
index 0000000..c8aef52
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/phase_matching.py
@@ -0,0 +1,2 @@
+# TODO:
+# Autophase matching
diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py
new file mode 100644
index 0000000..9c28678
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py
@@ -0,0 +1,1126 @@
+from collections.abc import Collection, Sequence
+from functools import cached_property
+from pathlib import Path
+from typing import Literal, TypeAlias
+
+import matplotlib.pyplot as plt
+import numpy as np
+
+# from numba import njit
+from pydantic import Field, computed_field, model_validator
+
+from xrpd_toolbox.core import (
+ DataType,
+ Parameter,
+ ScatteringData,
+ SerialisableNDArray,
+)
+from xrpd_toolbox.fit_engine.atom import Atoms
+from xrpd_toolbox.fit_engine.background import (
+ Background,
+ BackgroundType,
+)
+from xrpd_toolbox.fit_engine.constants import (
+ ELEMENT_ATOMIC_NUMBER,
+)
+from xrpd_toolbox.fit_engine.fit_statistics import calculate_chi_squared
+from xrpd_toolbox.fit_engine.fitting_core import (
+ Model,
+ RefinementBaseModel,
+ refine_model,
+)
+from xrpd_toolbox.fit_engine.form_factors import X_RAY_FORM_FACTORS
+from xrpd_toolbox.fit_engine.lattice import (
+ Lattice,
+ crystal_lattice_factory,
+)
+from xrpd_toolbox.fit_engine.peak_shape_functions import (
+ FCJPseudoVoigt,
+ IntrumentResolutionFunction,
+)
+from xrpd_toolbox.fit_engine.peaks import (
+ PeakType,
+ calculate_profile,
+ peak_factory,
+)
+from xrpd_toolbox.fit_engine.symmetry import (
+ SpaceGroup,
+ format_space_group_name,
+ get_symmetry_tables,
+)
+from xrpd_toolbox.plotting import FittedDataPlot
+from xrpd_toolbox.utils.cif_reader import read_cif
+from xrpd_toolbox.utils.unit_conversion import (
+ beam_energy_to_wavelength,
+ q_space_to_s,
+ q_space_to_theta,
+)
+
+CrystalType: TypeAlias = Literal["powder", "single-crystal"]
+
+
+ITC_TABLES = get_symmetry_tables()
+
+
+def merge_peaks(
+ two_theta, intensity, hkl, tol=1e-5
+) -> tuple[np.ndarray, np.ndarray, list]:
+ """
+ Vectorised merging of reflections with same 2θ (within tolerance).
+ Sums intensities (equivalent to multiplicity handling).
+ """
+
+ # Sort by 2θ
+ sort_idx = np.argsort(two_theta)
+ tth = two_theta[sort_idx]
+ inten = intensity[sort_idx]
+ hkl_sorted = hkl[sort_idx]
+
+ # Find group boundaries
+ dt = np.diff(tth)
+ new_group = np.concatenate(([True], dt > tol))
+
+ # Indices where groups start
+ group_starts = np.flatnonzero(new_group)
+
+ # Sum intensities per group
+ merged_intensity = np.add.reduceat(inten, group_starts)
+
+ # Representative 2θ (take first in each group)
+ merged_tth = tth[group_starts]
+
+ # HKL groups (still needs object handling)
+ group_indices = np.split(np.arange(len(tth)), group_starts[1:])
+ merged_hkl = [hkl_sorted[idx] for idx in group_indices]
+
+ return merged_tth, merged_intensity, merged_hkl
+
+
+# @njit()
+def absorption_correction(
+ theta: np.ndarray,
+ mu: float,
+ radius: float,
+) -> np.ndarray:
+ """
+ Debye–Scherrer absorption correction (capillary geometry).
+
+ Parameters
+ ----------
+ theta : np.ndarray
+ Bragg angle in radians
+ mu : float
+ Linear absorption coefficient (1 / length)
+ radius : float
+ Capillary radius (same length units as mu^-1)
+
+ Returns
+ -------
+ np.ndarray
+ Absorption correction factor
+ """
+ x = 2.0 * mu * radius / np.sin(theta)
+ return (1.0 - np.exp(-x)) / x
+
+
+def calculate_form_factor(elements: Collection[str], s: np.ndarray) -> np.ndarray:
+ params = np.asarray([X_RAY_FORM_FACTORS[el] for el in elements])
+
+ if params.shape[0] != len(elements):
+ raise ValueError("Element form factor parameters not found for all elements")
+
+ a = params[:, 0:5] # (n_atoms, 5)
+ c = params[:, 5] # (n_atoms,)
+ b = params[:, 6:11] # (n_atoms, 5)
+
+ s2 = s**2 # (s,)
+
+ exp_term = np.exp(-s2[:, None, None] * b[None, :, :])
+
+ ff = np.sum(a[None, :, :] * exp_term, axis=2) + c[None, :]
+
+ return ff # (n_atoms, s)
+
+
+# @njit()
+def calculate_debye_waller_factor(b_iso: np.ndarray, s: np.ndarray):
+ """s is scattering vector in radians"""
+ # (n_hkl, n_atoms)
+ return np.exp(-np.outer(s**2, b_iso))
+
+
+def calculate_structure_factor(
+ hkl: np.ndarray,
+ positions: np.ndarray,
+ occupancy: np.ndarray,
+ b_iso: np.ndarray,
+ elements: np.ndarray,
+ q: np.ndarray,
+) -> np.ndarray:
+ phase = 2j * np.pi * (hkl @ positions.T) # (n_hkl, n_atoms)
+
+ s = q_space_to_s(q)
+ ff = calculate_form_factor(elements, s) # (n_hkl, n_atoms)
+ dw = calculate_debye_waller_factor(b_iso, s) # (n_hkl, n_atoms)
+
+ f_hkl = np.sum(
+ occupancy * ff * dw * np.exp(phase),
+ axis=1,
+ )
+
+ ###this is an alternate way which may be faster for larger arrays
+ # f_hkl = np.einsum(
+ # "a,ha,ha,ha->h",
+ # occupancy,
+ # ff,
+ # dw,
+ # np.exp(phase),
+ # optimize=True,
+ # )
+
+ return f_hkl
+
+
+# @njit
+# @timeit
+def hkl_laue_reduction(
+ hkl: np.ndarray, rotations: np.ndarray
+) -> tuple[np.ndarray, np.ndarray]:
+ """
+ Laue reduction with positive-preference canonicalisation.
+ """
+
+ equiv = np.einsum("rij,nj->rni", rotations, hkl, optimize=True)
+ equiv = np.rint(equiv).astype(int) # (R,N,3)
+
+ # → (N,R,3)
+ equiv = np.transpose(equiv, (1, 0, 2))
+
+ # enforce "first non-zero positive" rule
+ equiv = np.abs(equiv)
+
+ # sort to get positive hkls
+ order = np.lexsort((equiv[:, :, 2], equiv[:, :, 1], equiv[:, :, 0]))
+ canonical = equiv[np.arange(len(equiv)), order[:, -1]] # -1 not 0
+ # --------------------------------------------------
+ # Step 3: unique + multiplicity
+ # --------------------------------------------------
+ unique, counts = np.unique(canonical, axis=0, return_counts=True)
+
+ return unique, counts
+
+
+def q_vectors_from_hkl(
+ hkl: np.ndarray,
+ reciprocal_lattice_matrix: np.ndarray,
+) -> np.ndarray:
+ """Also know as G in single crystal"""
+
+ return hkl @ reciprocal_lattice_matrix
+
+
+def q_magnitude(q_vectors: np.ndarray) -> np.ndarray:
+ """also known as G* in single crystal"""
+
+ return np.linalg.norm(q_vectors, axis=1)
+
+
+# @njit
+def lorentz_polarisation(
+ theta: np.ndarray,
+ polarisation: float | int = 0.0,
+ azimuth: float | int | None = None,
+) -> np.ndarray:
+ """
+ Lorentz–polarisation factor for X-ray diffraction.
+
+ Parameters
+ ----------
+ theta : np.ndarray
+ Bragg angle in radians.
+ polarisation : float, optional
+ Degree of polarisation (0 = unpolarised, 1 = fully polarised).
+ azimuth : float, optional
+ Azimuthal angle (radians) between scattering and polarisation planes.
+ If None, assumes powder-averaged synchrotron geometry.
+
+ Returns
+ -------
+ np.ndarray
+ Lorentz–polarisation factor.
+ """
+
+ return (1 + np.cos(2 * theta) ** 2) / (np.sin(theta) ** 2 * np.cos(theta))
+
+ two_theta = 2 * theta
+
+ cos2theta = np.cos(two_theta) ** 2
+ sin2theta = np.sin(two_theta)
+
+ if azimuth is None:
+ return (1.0 + cos2theta * (1.0 - 2.0 * polarisation)) / (sin2theta)
+ else:
+ return (
+ (1.0 - polarisation) * (1.0 + cos2theta)
+ + polarisation * (1.0 - cos2theta * np.cos(azimuth) ** 2)
+ ) / (sin2theta * cos2theta)
+
+
+# @njit
+def unit_cell_volume(
+ a: float | np.ndarray,
+ b: float | np.ndarray,
+ c: float | np.ndarray,
+ alpha: float | np.ndarray,
+ beta: float | np.ndarray,
+ gamma: float | np.ndarray,
+ degrees: bool = True,
+) -> np.ndarray:
+ """
+ Compute unit cell volume for arbitrary lattice.
+
+ Parameters
+ ----------
+ a, b, c : float or np.ndarray
+ Lattice parameters
+ alpha, beta, gamma : float or np.ndarray
+ Angles (degrees by default)
+ degrees : bool
+ If True, convert angles from degrees to radians
+
+ Returns
+ -------
+ np.ndarray
+ Unit cell volume
+ """
+ a = np.asarray(a)
+ b = np.asarray(b)
+ c = np.asarray(c)
+
+ if degrees:
+ alpha = np.radians(alpha)
+ beta = np.radians(beta)
+ gamma = np.radians(gamma)
+
+ cos_a = np.cos(alpha)
+ cos_b = np.cos(beta)
+ cos_g = np.cos(gamma)
+
+ volume = (
+ a
+ * b
+ * c
+ * np.sqrt(1 - cos_a**2 - cos_b**2 - cos_g**2 + 2 * cos_a * cos_b * cos_g)
+ )
+
+ return volume
+
+
+def lattice_to_metric(a, b, c, alpha, beta, gamma):
+ alpha, beta, gamma = np.radians([alpha, beta, gamma])
+
+ g = np.array(
+ [
+ [a * a, a * b * np.cos(gamma), a * c * np.cos(beta)],
+ [a * b * np.cos(gamma), b * b, b * c * np.cos(alpha)],
+ [a * c * np.cos(beta), b * c * np.cos(alpha), c * c],
+ ]
+ )
+
+ g_star = np.linalg.inv(g)
+ return g, g_star
+
+
+####### calculate peak positions
+def allowed_reflections_simple(hkl: np.ndarray, centering: str):
+ """for a given array of hkl value it returns a mask of
+ hkls which are forbidden by centering"""
+
+ h, k, l = hkl[:, 0], hkl[:, 1], hkl[:, 2] # noqa - crystallogrpahic nomenclature
+
+ if centering == "P":
+ # Primitive: no centering → all allowed
+ return np.ones(len(hkl), dtype=bool)
+
+ elif centering == "I":
+ # Body-centred: (0,0,0) + (1/2,1/2,1/2)
+ # h+k+l = 2n
+ return (h + k + l) % 2 == 0
+
+ elif centering == "F":
+ # Face-centred: (0,0,0), (1/2,1/2,0), (1/2,0,1/2), (0,1/2,1/2)
+ # all even or all odd
+ even = (h % 2 == 0) & (k % 2 == 0) & (l % 2 == 0)
+ odd = (h % 2 != 0) & (k % 2 != 0) & (l % 2 != 0)
+ return even | odd
+
+ elif centering == "C":
+ # C-centred: centering on ab faces → (1/2,1/2,0)
+ # h + k = 2n
+ return (h + k) % 2 == 0
+
+ elif centering == "A":
+ # A-centred: centering on bc faces → (0,1/2,1/2)
+ # k + l = 2n
+ return (k + l) % 2 == 0
+
+ elif centering == "B":
+ # B-centred: centering on ac faces → (1/2,0,1/2)
+ # h + l = 2n
+ return (h + l) % 2 == 0
+
+ elif centering == "R":
+ # Rhombohedral (hex setting)
+ # -h + k + l = 3n
+ # Rhombohedral - my fave - magnets baby
+ return (-h + k + l) % 3 == 0
+
+ else:
+ raise ValueError(f"Unknown centering: {centering}")
+
+
+def generate_h_k_l(hkl_max: np.ndarray) -> np.ndarray:
+ """generate hkl and filter forbidden beam centre hkl = 0 0 0"""
+
+ hmax = hkl_max[0]
+ kmax = hkl_max[1]
+ lmax = hkl_max[2]
+
+ h_range = np.arange(-hmax, hmax + 1)
+ k_range = np.arange(-kmax, kmax + 1)
+ l_range = np.arange(-lmax, lmax + 1)
+
+ hkl = np.array(np.meshgrid(h_range, k_range, l_range)).reshape(3, -1).T
+ return hkl[np.any(hkl != 0, axis=1)]
+
+
+def generate_hkl(reciprocal_lattice_matrix: np.ndarray, q_max: float) -> np.ndarray:
+ norms = np.linalg.norm(reciprocal_lattice_matrix, axis=0)
+
+ hmax = int(np.ceil(q_max / norms[0]))
+ kmax = int(np.ceil(q_max / norms[1]))
+ lmax = int(np.ceil(q_max / norms[2]))
+
+ hkl = generate_h_k_l(np.array([hmax, kmax, lmax]))
+
+ q_vec = hkl @ reciprocal_lattice_matrix
+ q = np.linalg.norm(q_vec, axis=1)
+
+ return hkl[q <= q_max]
+
+
+def reciprocal_lattice_matrix(
+ a: float, b: float, c: float, alpha: float, beta: float, gamma: float
+) -> np.ndarray:
+ a_vec = np.array([a, 0.0, 0.0])
+ b_vec = np.array([b * np.cos(gamma), b * np.sin(gamma), 0.0])
+
+ cx = c * np.cos(beta)
+ cy = c * (np.cos(alpha) - np.cos(beta) * np.cos(gamma)) / np.sin(gamma)
+ cz = np.sqrt(max(c**2 - cx**2 - cy**2, 0.0))
+ c_vec = np.array([cx, cy, cz])
+
+ volume = np.dot(a_vec, np.cross(b_vec, c_vec))
+
+ a_star = 2 * np.pi * np.cross(b_vec, c_vec) / volume
+ b_star = 2 * np.pi * np.cross(c_vec, a_vec) / volume
+ c_star = 2 * np.pi * np.cross(a_vec, b_vec) / volume
+
+ return np.vstack([a_star, b_star, c_star])
+
+
+def allowed_reflections(
+ hkl: np.ndarray,
+ rotations: np.ndarray,
+ translations: np.ndarray,
+ tol: float = 1e-8,
+) -> np.ndarray:
+ hkl_rot = np.einsum("rij,nj->rni", rotations, hkl, optimize=True)
+ delta = hkl_rot - hkl[None]
+ invariant = np.all(np.isclose(delta, np.rint(delta), atol=tol), axis=2)
+ phase = 2 * np.pi * (hkl @ translations.T)
+ real = (np.cos(phase).T * invariant).sum(axis=0)
+ imag = (np.sin(phase).T * invariant).sum(axis=0)
+ extinct = np.isclose(real, 0.0, atol=tol) & np.isclose(imag, 0.0, atol=tol)
+ return ~extinct
+
+
+def d_spacing(hkl: np.ndarray, g_star: np.ndarray) -> np.ndarray:
+ """calculate d spacing from reciprocal metric tensor and hkls"""
+
+ g_hkl = np.einsum("mi,ij,nj->n", hkl, g_star, hkl, optimize=True)
+ return 1.0 / np.sqrt(g_hkl)
+
+
+def plot_form_factors(elements: Sequence[str], q_space: np.ndarray | None = None):
+ if q_space is None:
+ q_space = np.linspace(0.01, 25, 1000)
+
+ scatter_vec = q_space / (4 * np.pi)
+
+ form_factors = calculate_form_factor(elements, scatter_vec).T
+
+ plt.figure(figsize=(16, 10))
+
+ for element, ff in zip(elements, form_factors, strict=True):
+ plt.plot(q_space, ff, label=element)
+ plt.legend()
+ plt.show()
+
+
+def apply_symmetry_operations_to_atoms(
+ asymmetric_atoms: Atoms, rotations: np.ndarray, translations: np.ndarray
+) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
+ """Expand asymmetric unit → full unit cell (vectorised)."""
+
+ # base_pos = np.array([a.xyz for a in asymmetric_atoms])
+ # base_occ = np.array([a.occupancy for a in asymmetric_atoms])
+ # base_b = np.array([a.b_iso for a in asymmetric_atoms])
+ # base_el = np.array([a.element for a in asymmetric_atoms])
+
+ positions = (
+ np.einsum("sij,aj->sai", rotations, asymmetric_atoms.xyz, optimize=True)
+ + translations[:, None, :]
+ )
+
+ positions = positions % 1.0
+ positions = np.round(positions, 10)
+
+ positions = positions.reshape(-1, 3)
+ occupancies = np.tile(asymmetric_atoms.occupancies, len(rotations))
+ b_iso = np.tile(asymmetric_atoms.b_iso, len(rotations))
+ elements = np.tile(asymmetric_atoms.elements, len(rotations))
+
+ # key = np.round(positions * 1e8).astype(int)
+ _, idx = np.unique(positions, axis=0, return_index=True)
+
+ positions = positions[idx]
+ occupancies = occupancies[idx]
+ b_iso = b_iso[idx]
+ elements = elements[idx]
+
+ return positions, occupancies, b_iso, elements
+
+
+# pydantic models to store the data
+
+
+class Radiation(RefinementBaseModel):
+ """This defines the type of radiation that is diffracting"""
+
+ radiation: DataType
+ wavelength: float | int | None = None
+ energy: float | int | None = None
+
+ @model_validator(mode="after")
+ def check_wavelength_or_energy(self):
+ if (
+ self.radiation in ["xray", "lab-xray", "cw-neutron"]
+ and self.energy is not None
+ and self.wavelength is None
+ ):
+ self.wavelength = beam_energy_to_wavelength(self.energy)
+
+ return self
+
+
+class Structure(RefinementBaseModel):
+ """This should contain everything needed to calculate the structure factor,
+ peak intensities and peak position of the diffraction peeaks
+ lattice: Lattice
+ atoms: Atoms
+ spacegroup_symbol: str = "P1"
+ symmetry_operations: np.ndarray
+ """
+
+ spacegroup: str = "P1"
+ lattice: Lattice
+ atoms: Atoms
+ name: str | None = None
+ source: str | None = None
+ # symmetry_operations: npt.NDArray[np.str_] | None = None
+
+ @classmethod
+ def load_from_cif(cls, cif_filepath: str | Path) -> "Structure":
+ return cif_to_structure(cif_filepath)
+
+ @cached_property
+ def spacegroup_class(self) -> SpaceGroup:
+ sg = ITC_TABLES[self.spacegroup]
+ return sg
+
+ @cached_property
+ def spacegroup_number(self) -> int:
+ sg = ITC_TABLES[self.spacegroup]
+ return int(sg["number"])
+
+ # @cached_property
+ @property
+ def element_array(self):
+ # element_array = np.array([a.element for a in self.atoms]) # (N_atoms, 3)
+ return self.atoms.elements
+
+ @property
+ def positions(self):
+ """Turns the list of Atoms into a vectorised numpy array
+ for fast computation later"""
+ # positions = np.stack([a.xyz for a in self.atoms]) # (N_atoms, 3)
+ return self.atoms.xyz
+
+ @property
+ def occupancies(self):
+ # occ_array = np.array([a.occupancy for a in self.atoms]) # (N_atoms,)
+ return self.atoms.occupancies
+
+ @property
+ def b_iso_array(self):
+ # b_iso_array = np.array([a.b_iso for a in self.atoms]) # (N_atoms,)
+ return self.atoms.b_iso
+
+ # @cached_property
+ @property
+ def atomic_numbers(self):
+ atomic_numbers = np.array(
+ [ELEMENT_ATOMIC_NUMBER[el] for el in self.atoms.elements]
+ ) # (N_atoms,)
+ return atomic_numbers
+
+ @cached_property
+ def centering(self):
+ return list(self.spacegroup)[0]
+
+ def reciprocal_lattice_matrix(self):
+ return reciprocal_lattice_matrix(
+ a=float(self.lattice.a),
+ b=float(self.lattice.b),
+ c=float(self.lattice.c),
+ alpha=float(self.lattice.alpha_radians),
+ beta=float(self.lattice.beta_radians),
+ gamma=float(self.lattice.gamma_radians),
+ )
+
+ @property
+ def volume(self):
+ return unit_cell_volume(
+ a=float(self.lattice.a),
+ b=float(self.lattice.b),
+ c=float(self.lattice.c),
+ alpha=float(self.lattice.alpha_radians),
+ beta=float(self.lattice.beta_radians),
+ gamma=float(self.lattice.gamma_radians),
+ degrees=True,
+ )
+
+ # TODO: Make this read from the cif file if provided
+ def get_symmetry_operations(self):
+ # if self.symmetry_operations is None:
+ sg = ITC_TABLES[self.spacegroup]
+ sym_ops = sg.get_rotations_and_translations()
+
+ # else:
+ # sym_ops = self.symmetry_operations
+
+ return sym_ops
+
+ def generate_structure_hkls(
+ self,
+ reciprocal_lattice_matrix: np.ndarray,
+ rotations: np.ndarray,
+ translations: np.ndarray,
+ q_max: float,
+ ) -> np.ndarray:
+ """HKL generator with systematic absence filtering
+ based on symmetry operations."""
+
+ # generate hkls
+ hkl = generate_hkl(reciprocal_lattice_matrix, q_max=q_max)
+ # remove systematic absences
+
+ mask = allowed_reflections(hkl, rotations, translations)
+ return hkl[mask]
+
+ # @timeit
+ def calculate_reflections(
+ self,
+ wavelength: float | int = 1.5406,
+ mode: CrystalType = "powder",
+ radiation: DataType = "xray",
+ multiplicity_method: bool = False,
+ ) -> tuple[list, np.ndarray, np.ndarray, np.ndarray]:
+ """calculates peaks"""
+
+ reciprocal_lattice_matrix = self.reciprocal_lattice_matrix()
+ rotations, translations = self.get_symmetry_operations()
+
+ # g, g_star = lattice_to_metric(
+ # self.lattice.a,
+ # self.lattice.b,
+ # self.lattice.c,
+ # self.lattice.alpha,
+ # self.lattice.beta,
+ # self.lattice.gamma,
+ # )
+
+ q_max = 4 * np.pi / wavelength
+
+ hkl = self.generate_structure_hkls(
+ reciprocal_lattice_matrix, rotations, translations, q_max
+ )
+
+ # hkl, multiplicity = hkl_laue_reduction(hkl, rotations)
+
+ # mask = allowed_reflections_simple(hkl, self.centering)
+ # hkl = hkl[mask]
+
+ # d_space = d_spacing(hkl, g_star)
+ # Bragg angle
+ # theta = np.arcsin(wavelength / (2 * d_space))
+ # s = np.sin(theta) / wavelength
+
+ if mode == "powder":
+ if multiplicity_method:
+ hkl, multiplicity = hkl_laue_reduction(hkl, rotations)
+ # some pxrd refs are equal
+ else:
+ multiplicity = np.ones(len(hkl))
+ else:
+ multiplicity = np.ones(len(hkl))
+
+ q_vec = q_vectors_from_hkl(hkl, reciprocal_lattice_matrix)
+ q = q_magnitude(q_vec)
+
+ # print(q.shape, hkl.shape)
+ assert q.shape[0] == hkl.shape[0]
+
+ sort_index = np.argsort(q)
+ q = q[sort_index]
+ q_vec = q_vec[sort_index]
+ hkl = hkl[sort_index]
+ multiplicity = multiplicity[sort_index]
+
+ theta = q_space_to_theta(q, wavelength=wavelength) # in radians still
+ two_theta = 2 * theta
+ peak_centres_tthdeg = np.degrees(two_theta)
+
+ # positions = self.positions
+ # occupancies = self.occupancies
+ # b_iso = self.b_iso_array
+ # elements = self.element_array
+
+ positions, occupancies, b_iso, elements = apply_symmetry_operations_to_atoms(
+ self.atoms, rotations, translations
+ )
+
+ structure_factor = calculate_structure_factor(
+ hkl=hkl,
+ positions=positions,
+ occupancy=occupancies,
+ b_iso=b_iso,
+ elements=elements,
+ q=q,
+ )
+
+ f_abs = np.abs(structure_factor)
+ structure_factor_squared = f_abs**2 # |F|**2
+
+ intensity = structure_factor_squared
+
+ if multiplicity_method:
+ intensity = intensity * multiplicity
+
+ intensity = intensity / (self.volume**2)
+
+ # intensity = np.ones_like(intensity) # normalise to max 1
+
+ abs_corr = absorption_correction(theta, 0.1, 0.1)
+ intensity = intensity * abs_corr
+
+ if mode == "powder":
+ lp_factor = lorentz_polarisation(theta, 0.9) # 0 for unpolarized
+ intensity = intensity * lp_factor
+
+ peak_centres_tthdeg, intensity, hkl = merge_peaks(
+ peak_centres_tthdeg, intensity, hkl
+ )
+
+ return hkl, f_abs, peak_centres_tthdeg, intensity
+
+ def to_peaks(
+ self,
+ wavelength: float | int = 1.5406,
+ mode: CrystalType = "powder",
+ peak_type: str = "gaussian",
+ radiation: DataType = "xray",
+ ):
+ hkl, f_abs, peak_centres_two_theta_degrees, intensity = (
+ self.calculate_reflections(wavelength=wavelength, mode=mode)
+ )
+
+ peak_func = peak_factory(peak_type)
+
+ peaks = []
+
+ for inten, tth in zip(intensity, peak_centres_two_theta_degrees, strict=True):
+ peaks.append(peak_func(amplitude=inten, centre=tth))
+
+ return peaks
+
+ def calculate_profile(
+ self,
+ x: np.ndarray,
+ wavelength: float | int = 1.5406,
+ backround: int | float | np.ndarray | Background = 0,
+ mode: CrystalType = "powder",
+ peak_type: str = "gaussian",
+ phase_scale: int | float = 1,
+ wdt: int | float = 5,
+ radiation: DataType = "xray",
+ ) -> np.ndarray:
+ hkl, f_abs, two_theta_degrees, intensity = self.calculate_reflections(
+ wavelength=wavelength, mode=mode, radiation=radiation
+ )
+
+ peak_func = peak_factory(peak_type)
+
+ peaks = []
+
+ for inten, tth in zip(intensity, two_theta_degrees, strict=True):
+ peaks.append(peak_func(amplitude=inten, centre=tth))
+
+ profile = PeakProfile(
+ x=x, peaks=peaks, background=backround, phase_scale=phase_scale, wdt=wdt
+ )
+
+ return profile.calculate_profile()
+
+ def plot_unit_cell(
+ self,
+ ):
+ """
+ Plot full unit cell (symmetry-expanded).
+ """
+
+ # Apply symmetry
+ rotations, translations = self.get_symmetry_operations()
+
+ positions, occupancies, b_iso, elements = apply_symmetry_operations_to_atoms(
+ self.atoms,
+ rotations,
+ translations,
+ )
+
+ for el, pos in zip(elements, positions, strict=True):
+ print(f"{el}: {pos}")
+
+ shifts = np.array(
+ [
+ [0, 0, 0],
+ [0, 0, 1],
+ [0, 1, 0],
+ [0, 1, 1],
+ [1, 0, 0],
+ [1, 0, 1],
+ [1, 1, 0],
+ [1, 1, 1],
+ ],
+ dtype=float,
+ )
+
+ n_atoms = positions.shape[0]
+ n_shifts = shifts.shape[0]
+
+ positions = positions[:, None, :] + shifts[None, :, :]
+ positions = positions.reshape(n_atoms * n_shifts, 3)
+
+ elements = np.repeat(elements, len(shifts))
+ occupancies = np.repeat(occupancies, len(shifts))
+
+ mask = (
+ (positions[:, 0] >= 0)
+ & (positions[:, 0] <= 1)
+ & (positions[:, 1] >= 0)
+ & (positions[:, 1] <= 1)
+ & (positions[:, 2] >= 0)
+ & (positions[:, 2] <= 1)
+ )
+
+ positions = positions[mask]
+ elements = elements[mask]
+ occupancies = occupancies[mask]
+
+ for el, pos in zip(elements, positions, strict=True):
+ print(f"{el}: {pos}")
+
+ coords = positions
+ xlabel, ylabel, zlabel = "a", "b", "c"
+
+ # Colors
+ unique_elements = np.unique(elements)
+ cmap = plt.cm.get_cmap("tab10", len(unique_elements))
+
+ element_to_color = {el: cmap(i) for i, el in enumerate(unique_elements)}
+
+ colors = np.array([element_to_color[el] for el in elements])
+
+ # Sizes
+ sizes = 100 * np.array([ELEMENT_ATOMIC_NUMBER[el] for el in elements])
+
+ # Plot
+ fig = plt.figure()
+ ax = fig.add_subplot(111, projection="3d")
+ ax.set_aspect("equal")
+ ax.set_aspect("equal")
+
+ ax.scatter(
+ coords[:, 0],
+ coords[:, 1],
+ coords[:, 2], # type: ignore
+ c=colors,
+ s=sizes, # type: ignore
+ depthshade=True,
+ # label=unique_elements,
+ )
+
+ # Formatting
+ ax.set_xlabel(xlabel)
+ ax.set_ylabel(ylabel)
+ ax.set_zlabel(zlabel)
+
+ mins = coords.min(axis=0)
+ maxs = coords.max(axis=0)
+ max_range = (maxs - mins).max()
+ mid = (maxs + mins) / 2
+
+ ax.set_xlim(mid[0] - max_range / 2, mid[0] + max_range / 2)
+ ax.set_ylim(mid[1] - max_range / 2, mid[1] + max_range / 2)
+ ax.set_zlim(mid[2] - max_range / 2, mid[2] + max_range / 2)
+
+ plt.xlim(0, 1)
+ plt.ylim(0, 1)
+ ax.set_zlim(0, 1)
+ # plt.legend()
+ plt.title(f"Unit Cell ({self.spacegroup})")
+ plt.tight_layout()
+ plt.show()
+
+
+def cif_to_structure(cif_filepath: str | Path) -> Structure:
+ spacegroup_symbol, lattice, atoms, symmetry_operations, name = read_cif(
+ str(cif_filepath)
+ )
+
+ spacegroup = format_space_group_name(spacegroup_symbol)
+
+ sg = ITC_TABLES[spacegroup]
+ crystal_class = sg["crystal_class"]
+
+ latticecls = crystal_lattice_factory(crystal_class)
+ lattice = latticecls.model_validate(lattice)
+
+ structure = Structure(
+ spacegroup=spacegroup,
+ lattice=lattice,
+ atoms=atoms,
+ source=str(cif_filepath),
+ name=name,
+ # symmetry_operations=symmetry_operations,
+ )
+
+ return structure
+
+
+##### more complex pydantic models to do whole profiles
+class PeakProfile(RefinementBaseModel):
+ phase_scale: int | float | Parameter = Parameter(value=1e-5, bounds=[0, np.inf])
+ x: SerialisableNDArray
+ peaks: list[PeakType]
+ background: np.ndarray | int | float | Background = 0.0
+ wdt: int | float = 5
+
+ @property
+ def sorted_peaks(self):
+ return sorted(self.peaks, key=lambda p: p.centre)
+
+ # @timeit
+ def calculate_profile(self):
+ """calculates the profile with the parameters stored within self"""
+
+ return calculate_profile(
+ x=self.x,
+ peaks=self.sorted_peaks,
+ background=self.background,
+ phase_scale=float(self.phase_scale),
+ wdt=self.wdt,
+ )
+
+
+class ReitveldRefinement(Model[ScatteringData]):
+ phase_scale: int | float | Parameter = Parameter(value=1e-2, bounds=[0, np.inf])
+ structure: Structure | list[Structure]
+ zero_offset: int | float | Parameter = Parameter(value=0, bounds=[-10, 10])
+ irf: IntrumentResolutionFunction = Field(default=FCJPseudoVoigt())
+ background: np.ndarray | float | int | BackgroundType | Parameter = Parameter(
+ value=0
+ )
+ intensity_modifiers: Parameter | None = None
+ position_modifiers: Parameter | None = None
+ shape_modifiers: Parameter | None = None
+ calculated_intensity: SerialisableNDArray | None = Field(
+ default=None, repr=False
+ ) # this gets created the first time calc profile is run
+
+ """How can we divide down a reitveld refinement -
+ peaks pos/intensity, peak width function, background, detecor parameters
+ """
+
+ def load_cif(self, cif_filepath: str | Path) -> Structure | list[Structure]:
+ new_structure = Structure.load_from_cif(cif_filepath)
+
+ if isinstance(self.structure, Structure):
+ self.structure = [self.structure, new_structure]
+ elif isinstance(self.structure, list):
+ self.structure.append(new_structure)
+ else:
+ self.structure = new_structure
+
+ return self.structure
+
+ def save_cif(self, output_path: str | Path):
+ """Saves the structure to a CIF file."""
+ assert self.structure is not None
+ raise NotImplementedError("CIF writing not implemented yet")
+
+ def calculate_peaks(self):
+ if isinstance(self.structure, Structure):
+ return self.structure.calculate_reflections()
+ elif isinstance(self.structure, Collection):
+ raise NotImplementedError("Multiple phase calculation not implemented yet")
+ else:
+ raise Exception("Unknown structure")
+
+ def calculate_profile(self) -> np.ndarray:
+ if not isinstance(self.structure, Structure):
+ raise NotImplementedError("Not yet implemented for mullti-phase patterns")
+
+ hkl, f_abs, peak_centres_tthdeg, intensity = (
+ self.structure.calculate_reflections(float(self.data.wavelength))
+ )
+
+ zero_offset_x = self.data.x - float(self.zero_offset)
+
+ calculated_intensity = self.irf.calculate_profile(
+ x=zero_offset_x,
+ peak_centres=peak_centres_tthdeg,
+ peak_intensities=intensity,
+ )
+
+ if isinstance(self.background, Background):
+ background = self.background.calculate(x=self.data.x)
+ else:
+ background = self.background
+
+ self.calculated_intensity = (
+ calculated_intensity * float(self.phase_scale)
+ ) + background
+
+ return self.calculated_intensity
+
+ @computed_field
+ @property
+ def chi_squared(self) -> float:
+ if self.calculated_intensity is not None:
+ chi_squared = calculate_chi_squared(
+ self.calculated_intensity, self.data.y, self.data.e
+ )
+
+ return chi_squared
+
+ else:
+ return np.inf
+
+ def calculate_residual(self) -> np.ndarray:
+ # http://pd.chem.ucl.ac.uk/pdnn/refine1/practice.htm
+
+ self.calculated_intensity = self.calculate_profile()
+
+ _ = self.chi_squared
+
+ return self.data.y - self.calculated_intensity
+
+ def plot(self):
+ # if self.calculated_intensity is None:
+ self.calculated_intensity = self.calculate_profile()
+
+ if isinstance(self.background, Background):
+ background = self.background.calculate(self.data.x)
+ else:
+ background = float(self.background)
+
+ plot_data = FittedDataPlot(
+ data=self.data,
+ calc=self.calculated_intensity,
+ diff=self.data.y - self.calculated_intensity,
+ background=background,
+ )
+ plot_data.plot()
+
+
+if __name__ == "__main__":
+ output_name = "/workspaces/outputs/test.toml"
+
+ def test_refine_silicon():
+ cif_filepath = "/workspaces/XRPD-Toolbox/cifs/Si.cif"
+ si_structure = Structure.load_from_cif(cif_filepath)
+
+ beam_energy = 15
+ wavelength = beam_energy_to_wavelength(beam_energy)
+
+ data = ScatteringData.from_xye(
+ "/workspaces/outputs/step_scan/1410696.nxs_summed_mythen3.xye",
+ # "/workspaces/outputs/1429744_summed_mythen3.xye",
+ x_unit="tth",
+ data_type="xray",
+ wavelength=Parameter(value=wavelength, refine=False),
+ )
+
+ from xrpd_toolbox.fit_engine.background import (
+ # ChebyshevBackground,
+ LinearInterpolationBackground,
+ )
+
+ background = LinearInterpolationBackground.estimate(data.x, data.y)
+
+ model = ReitveldRefinement(
+ data=data, background=background, structure=si_structure
+ )
+
+ assert isinstance(model.background, Background)
+ model.background.refine_none()
+
+ print(model.get_refinement_parameters())
+
+ model.irf.refine_none()
+
+ updated, model, result = refine_model(model, plot=True)
+
+ model.save(output_name)
+
+ return model
+
+ def test_load_refinement_and_refine():
+ loaded_refinement = ReitveldRefinement.load(output_name)
+
+ loaded_refinement.calculate_profile()
+ loaded_refinement.plot()
+
+ # refine_model(loaded_refinement)
+
+ model = test_refine_silicon()
+ # test_load_refinement_and_refine()
+
+ two_theta = np.linspace(1, 70, 1000)
+
+ width = FCJPseudoVoigt().calculate_peak_widths(two_theta)[0]
+
+ plt.plot(two_theta, width)
+ plt.show()
diff --git a/src/xrpd_toolbox/fit_engine/symmetry.py b/src/xrpd_toolbox/fit_engine/symmetry.py
new file mode 100644
index 0000000..f14cf25
--- /dev/null
+++ b/src/xrpd_toolbox/fit_engine/symmetry.py
@@ -0,0 +1,334 @@
+import os
+import re
+from functools import lru_cache
+from pathlib import Path
+
+import numpy as np
+from yaml import safe_load
+
+from xrpd_toolbox.core import XRPDBaseModel
+from xrpd_toolbox.fit_engine.constants import get_spacegroup_symbol
+
+_FRAC_RE = re.compile(r"([+-]?\d+)/(\d+)")
+
+
+def frac_to_decimal_string(sym_strs: np.ndarray, dp: int = 3):
+ """
+ Convert fractions in symmetry strings to decimals while preserving the + or - signs.
+ Example: "x+1/4" -> "x+0.25"
+
+ Parameters
+ ----------
+ sym_strs : array-like of str
+
+ Returns
+ -------
+ np.ndarray of str
+ """
+ sym_strs = np.asarray(sym_strs, dtype=str)
+
+ # Replacement function
+ def _replace_frac(match):
+ num, den = match.groups()
+ val = float(num) / float(den)
+ # Keep the explicit + if positive
+ return f"{val:+.{dp}g}" if val >= 0 else f"{val:.{dp}g}"
+
+ # Apply to all strings (still vectorized over array, no per-character loops)
+ new_strs = np.array([_FRAC_RE.sub(_replace_frac, s) for s in sym_strs])
+ return new_strs
+
+
+def format_space_group_name(sg: str) -> str:
+ """Format space group name to a consistent format for lookup."""
+
+ sg = sg[0].upper() + sg[1:].lower() # upper case first letter
+ sg = re.sub(r"\s+", "", sg) # remove all whitespace
+ sg = re.sub(r"^([A-Za-z]+)3([A-Za-z]+)$", r"\1-3\2", sg)
+ sg = re.sub(r"([234])_1", r"\g<1>1", sg) # 2_1 → 21 etc.
+
+ # remove trivial 1's (P121 → P21, P112 → P12 etc.)
+ # sg = re.sub(r"1(?=[xyzabcmbcn/:-]|$)", "", sg)
+ # sg = re.sub(r"^([A-Za-z])1+", r"\1", sg) # drop leading 1's
+ sg = re.sub(r"1$", "", sg) # drop trailing 1
+
+ return sg
+
+
+def lattice_to_matrix(
+ a: float,
+ b: float,
+ c: float,
+ alpha: float,
+ beta: float,
+ gamma: float,
+) -> np.ndarray:
+ """Convert lattice parameters to Cartesian lattice matrix."""
+
+ alpha_r, beta_r, gamma_r = np.radians([alpha, beta, gamma])
+
+ cos_a, cos_b, cos_g = np.cos([alpha_r, beta_r, gamma_r])
+ sin_g = np.sin(gamma_r)
+
+ a_vec = np.array([a, 0.0, 0.0])
+ b_vec = np.array([b * cos_g, b * sin_g, 0.0])
+
+ cx = c * cos_b
+ cy = c * (cos_a - cos_b * cos_g) / sin_g
+ cz = np.sqrt(max(c**2 - cx**2 - cy**2, 0.0))
+
+ c_vec = np.array([cx, cy, cz])
+
+ return np.vstack([a_vec, b_vec, c_vec])
+
+
+def _convert_symmetry_operations_yaml():
+ constants_folder = os.path.join(os.path.dirname(__file__), "constants")
+
+ symmetry_operation_filepath = os.path.join(
+ constants_folder, "symmetry_operations.yaml"
+ )
+
+ with open(symmetry_operation_filepath) as file:
+ try:
+ symmetry_operations = safe_load(file)
+ except Exception:
+ raise
+
+ new_spacegroups = {}
+
+ for sg in symmetry_operations:
+ sg["symops"] = frac_to_decimal_string(sg["symops"])
+ sg["ncsym"] = frac_to_decimal_string(sg["ncsym"])
+
+ sg_name = get_spacegroup_symbol(sg["number"])
+
+ sg["spacegroup"] = sg_name
+
+ if sg_name in new_spacegroups:
+ continue
+
+ new_spacegroups[sg_name] = sg
+
+ itc = IntTabCryst(spacegroups=new_spacegroups)
+
+ itc.save_to_yaml(
+ "/workspaces/XRPD-Toolbox/src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml"
+ )
+
+
+class SpaceGroup(XRPDBaseModel):
+ spacegroup: str
+ crystal_class: str
+ hall: str
+ hermann_mauguin: str
+ symops: list[str]
+ ncsym: list[str]
+ number: int
+ schoenflies: str
+ universal_h_m: str
+
+ # symop - full set
+
+ # Use this for:
+
+ # HKL reduction
+ # Laue symmetry
+ # structure factor
+ # systematic absences
+ # diffraction pattern
+
+ # ncsym (non-centrosymmetric set)
+ # inversion symmetry is removed
+ # Used for:
+
+ # anomalous scattering (f′, f″)
+ # Friedel pairs (hkl vs -hkl not equivalent)
+ # non-centrosymmetric analysis
+ # separating centrosymmetric vs non-centrosymmetric contributions
+
+ def _normalise_symmetry_operations(self, symops):
+ """Convert symmetry operation strings to a consistent format for parsing."""
+ ops = np.asarray(symops, dtype=str)
+
+ # Normalize signs and remove leading '+'
+ ops = np.char.replace(ops, "-", "+-")
+ ops = np.char.replace(ops, "++", "+")
+ ops = np.char.lstrip(ops, "+")
+
+ return ops
+
+ def get_rotations_and_translations(self):
+ ops = self._normalise_symmetry_operations(self.symops)
+
+ # Split into coordinates (N,3)
+ coords = np.char.split(ops, ",")
+
+ # Split each coordinate into terms (e.g. "x+1/4" -> ["x", "+1/4"])
+ terms = np.array([[c.split("+") for c in row] for row in coords], dtype=object)
+
+ # ---------------------------------
+ # FLATTEN TERMS
+ # ---------------------------------
+ flat_terms = np.concatenate([t for row in terms for t in row])
+
+ # ---------------------------------
+ # IDENTIFY VARIABLES
+ # ---------------------------------
+ is_x = np.char.find(flat_terms, "x") >= 0
+ is_y = np.char.find(flat_terms, "y") >= 0
+ is_z = np.char.find(flat_terms, "z") >= 0
+
+ coeff = np.where(np.char.startswith(flat_terms, "-"), -1.0, 1.0)
+
+ rx = np.where(is_x, coeff, 0.0)
+ ry = np.where(is_y, coeff, 0.0)
+ rz = np.where(is_z, coeff, 0.0)
+
+ # ---------------------------------
+ # CONSTANT TERMS
+ # ---------------------------------
+ is_const = ~(is_x | is_y | is_z)
+ const_terms = np.where(is_const, flat_terms, "0")
+ const_terms = np.where(const_terms == "", "0", const_terms)
+
+ frac = np.char.find(const_terms, "/") >= 0
+ num = np.where(frac, np.char.partition(const_terms, "/")[:, 0], const_terms)
+ den = np.where(frac, np.char.partition(const_terms, "/")[:, 2], "1")
+
+ const_vals = num.astype(float) / den.astype(float)
+
+ # ---------------------------------
+ # REASSEMBLE
+ # ---------------------------------
+ split_sizes = np.array([len(t) for row in terms for t in row])
+ idx = np.repeat(np.arange(len(split_sizes)), split_sizes)
+
+ rx_sum = np.bincount(idx, weights=rx)
+ ry_sum = np.bincount(idx, weights=ry)
+ rz_sum = np.bincount(idx, weights=rz)
+ t_sum = np.bincount(idx, weights=const_vals)
+
+ n_ops = len(ops)
+
+ rotations = (
+ np.stack([rx_sum, ry_sum, rz_sum], axis=1).reshape(n_ops, 3, 3).astype(int)
+ )
+ translations = t_sum.reshape(n_ops, 3) % 1.0
+
+ return rotations, translations
+
+ def apply_symmetry(self, xyz: np.ndarray) -> np.ndarray:
+ """take the symmetry operation of the space group and
+ applies them to the provides xyz fractional coordinations
+ must have xyz for every position shape = (n, 3)"""
+
+ assert xyz.shape[-1] == 3
+
+ rotations, translations = self.get_rotations_and_translations()
+
+ pos = (
+ np.einsum("sij,aj->sai", rotations, xyz, optimize=True)
+ + translations[:, None, :]
+ ) % 1.0
+
+ return pos
+
+
+class IntTabCryst(XRPDBaseModel):
+ """The international crystallographuc tables in digital format
+ The space groups are loaded from a yaml file
+
+ Once intialised itc = IntTabCryst.load()
+ space groups can be accessed such as pnma = itc["Pnma"]
+ If space group requires a setting and none is provided
+ this will assume it's in the first setting"""
+
+ spacegroups: dict[str, SpaceGroup]
+
+ def __getitem__(self, spacegroup_name: str | int) -> SpaceGroup:
+ if isinstance(spacegroup_name, int):
+ sg_name = get_spacegroup_symbol(spacegroup_name)
+ else:
+ sg_name = spacegroup_name.replace(" ", "")
+
+ sg = self.spacegroups.get(sg_name)
+
+ if sg is None:
+ first_setting_sg_name = self._assume_first_setting(sg_name)
+ # print("Assuming first setting for space group:", first_setting_sg_name)
+ sg = self.spacegroups.get(first_setting_sg_name)
+
+ if sg is None:
+ formatted_sg_name = format_space_group_name(sg_name)
+ # print(f"Trying formatted space group name: {formatted_sg_name}")
+ sg = self.spacegroups.get(formatted_sg_name)
+
+ if sg is None:
+ formatted_sg_name = format_space_group_name(sg_name)
+ first_setting_formatted_sg_name = self._assume_first_setting(
+ formatted_sg_name
+ )
+ # print(
+ # f"Trying formatted space group name in first setting: {first_setting_formatted_sg_name}" # noqa
+ # )
+ sg = self.spacegroups.get(first_setting_formatted_sg_name)
+
+ if sg is None:
+ print("Available space groups:", list(self.spacegroups.keys()))
+ raise KeyError(f"{spacegroup_name} not in ITC")
+
+ return sg
+
+ def __len__(self):
+ return len(self.spacegroups)
+
+ def keys(self):
+ return self.spacegroups.keys()
+
+ def values(self):
+ return self.spacegroups.values()
+
+ def items(self):
+ return self.spacegroups.items()
+
+ def _assume_first_setting(self, spacegroup_name):
+ return str(spacegroup_name) + ":1"
+
+ @classmethod
+ def load(cls, filepath: str | Path | None = None) -> "IntTabCryst":
+ constants_folder = os.path.join(os.path.dirname(__file__), "constants")
+
+ default_filepath = os.path.join(
+ constants_folder, "international_tables_of_crystallography.yaml"
+ )
+
+ return cls.load_from_yaml(filepath or default_filepath)
+
+
+@lru_cache
+def get_symmetry_tables():
+ itc = IntTabCryst.load()
+ return itc
+
+
+if __name__ == "__main__":
+ _convert_symmetry_operations_yaml()
+
+ itc = get_symmetry_tables()
+
+ print(itc.keys())
+
+ for i in range(1, 231):
+ print(i, itc[i].spacegroup, itc[i].crystal_class)
+
+ # spacegroup = itc["P212121"]
+ # spacegroup = itc["P21"]
+
+ # print(spacegroup)
+
+ # positions = np.array([[0, 0, 0]])
+
+ # spacegroup.apply_symmetry(positions)
+
+ # print(itc["P42/mnm"])
diff --git a/src/xrpd_toolbox/gui/__init__,py b/src/xrpd_toolbox/gui/__init__,py
new file mode 100644
index 0000000..e69de29
diff --git a/src/xrpd_toolbox/gui/bad_pixel_gui.py b/src/xrpd_toolbox/gui/bad_pixel_gui.py
new file mode 100644
index 0000000..b3f83a2
--- /dev/null
+++ b/src/xrpd_toolbox/gui/bad_pixel_gui.py
@@ -0,0 +1,475 @@
+import sys
+from pathlib import Path
+
+import numpy as np
+from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg
+from matplotlib.figure import Figure
+from matplotlib.widgets import RectangleSelector
+from PyQt6.QtCore import Qt
+from PyQt6.QtGui import QKeySequence, QShortcut
+from PyQt6.QtWidgets import (
+ QApplication,
+ QFileDialog,
+ QHBoxLayout,
+ QLabel,
+ QListWidget,
+ QListWidgetItem,
+ QMainWindow,
+ QMessageBox,
+ QPushButton,
+ QSlider,
+ QSpinBox,
+ QTextEdit,
+ QVBoxLayout,
+ QWidget,
+)
+
+from xrpd_toolbox.i11.mythen import MythenDataLoader
+from xrpd_toolbox.utils.utils import load_int_array_from_file
+
+# =========================
+# Plot canvas
+# =========================
+
+
+class PlotCanvas(FigureCanvasQTAgg):
+ def __init__(
+ self,
+ data: MythenDataLoader,
+ global_selected_indices: set[int],
+ selection_callback,
+ pixels_per_modules: int = 1280,
+ parent: QWidget | None = None,
+ ) -> None:
+ self.figure = Figure()
+ super().__init__(self.figure)
+ self.setParent(parent)
+
+ self.ax = self.figure.add_subplot(111)
+ self._pan_start = None
+
+ self.data = data
+ self.raw_data = data.data
+ self.pixels_per_modules = pixels_per_modules
+
+ self.current_module = 0
+ self.global_selected_indices = global_selected_indices
+ self.selection_callback = selection_callback
+
+ self.x = np.arange(self.pixels_per_modules)
+ self.scatter = None
+ self.reference_curve = None
+
+ self._connect_events()
+ self._plot_module(0)
+
+ def _connect_events(self) -> None:
+ self.mpl_connect("scroll_event", self._on_scroll)
+ self.mpl_connect("button_press_event", self._on_click)
+ self.mpl_connect("motion_notify_event", self._on_mouse_move)
+ self.mpl_connect("button_release_event", self._on_mouse_release)
+
+ def _plot_module(self, module: int) -> None:
+ self.ax.cla()
+
+ start = module * self.pixels_per_modules
+ end = start + self.pixels_per_modules
+ curves = self.raw_data[:, start:end]
+
+ for curve in curves:
+ self.ax.plot(self.x, curve, alpha=0.3, linewidth=1)
+
+ self.reference_curve = curves[0]
+
+ self.ax.set_title(f"Mythen Data — Module {module}")
+ self.ax.set_xlabel("Pixel (within module)")
+ self.ax.set_ylabel("Intensity (a.u.)")
+
+ self.scatter = self.ax.scatter([], [], color="red", zorder=5)
+ self._update_selected_points()
+
+ self._enable_rectangle_zoom()
+ self.ax.relim()
+ self.ax.autoscale()
+ self.draw_idle()
+
+ def _enable_rectangle_zoom(self) -> None:
+ if hasattr(self, "rect_selector"):
+ self.rect_selector.disconnect_events()
+
+ self.rect_selector = RectangleSelector(
+ self.ax,
+ self._on_rectangle_select,
+ useblit=True,
+ button=[1], # type: ignore
+ interactive=False,
+ props={"facecolor": "blue", "alpha": 0.2},
+ )
+
+ def set_module(self, module: int) -> None:
+ self.current_module = module
+ self._plot_module(module)
+
+ def reset_zoom(self) -> None:
+ self.ax.relim()
+ self.ax.autoscale()
+ self.draw_idle()
+
+ def _on_scroll(self, event) -> None:
+ if event.xdata is None or event.ydata is None:
+ return
+
+ zoom = 1.05
+ factor = 1 / zoom if event.button == "up" else zoom
+
+ x0, x1 = self.ax.get_xlim()
+ y0, y1 = self.ax.get_ylim()
+
+ self.ax.set_xlim(
+ event.xdata - (x1 - x0) * factor / 2,
+ event.xdata + (x1 - x0) * factor / 2,
+ )
+ self.ax.set_ylim(
+ event.ydata - (y1 - y0) * factor / 2,
+ event.ydata + (y1 - y0) * factor / 2,
+ )
+ self.draw_idle()
+
+ def _on_rectangle_select(self, eclick, erelease) -> None:
+ if eclick.xdata is None or erelease.xdata is None:
+ return
+ self.ax.set_xlim(sorted((eclick.xdata, erelease.xdata))) # type: ignore
+ self.ax.set_ylim(sorted((eclick.ydata, erelease.ydata))) # type: ignore
+ self.draw_idle()
+
+ def _on_click(self, event) -> None:
+ if event.button == 3 and event.xdata is not None:
+ idx = int(round(event.xdata))
+ if 0 <= idx < self.data.pixels_per_module:
+ global_idx = self.current_module * self.data.pixels_per_module + idx
+ self.selection_callback(global_idx)
+
+ elif event.button == 2 and event.xdata is not None and event.ydata is not None:
+ self._pan_start = {
+ "x": event.xdata,
+ "y": event.ydata,
+ "xlim": self.ax.get_xlim(),
+ "ylim": self.ax.get_ylim(),
+ }
+
+ def _on_mouse_move(self, event) -> None:
+ if self._pan_start is None or event.xdata is None or event.ydata is None:
+ return
+
+ dx = event.xdata - self._pan_start["x"]
+ dy = event.ydata - self._pan_start["y"]
+
+ x0, x1 = self._pan_start["xlim"]
+ y0, y1 = self._pan_start["ylim"]
+
+ self.ax.set_xlim(x0 - dx, x1 - dx)
+ self.ax.set_ylim(y0 - dy, y1 - dy)
+ self.draw_idle()
+
+ def _on_mouse_release(self, event) -> None:
+ if event.button == 2:
+ self._pan_start = None
+
+ def _update_selected_points(self) -> None:
+ if self.scatter is None or self.reference_curve is None:
+ return
+
+ start = self.current_module * self.pixels_per_modules
+ end = start + self.pixels_per_modules
+
+ local = [
+ idx - start for idx in self.global_selected_indices if start <= idx < end
+ ]
+
+ if local:
+ x = self.x[local]
+ y = self.reference_curve[local]
+ self.scatter.set_offsets(np.column_stack((x, y)))
+ else:
+ self.scatter.set_offsets(np.empty((0, 2)))
+
+ self.draw_idle()
+
+
+# =========================
+# Main window
+# =========================
+
+
+class MainWindow(QMainWindow):
+ def __init__(self, data: MythenDataLoader, initial_indices: set[int]) -> None:
+ super().__init__()
+
+ self.setWindowTitle("Mythen NXS Viewer")
+
+ self.data = data
+ self.global_selected_indices = initial_indices
+ self._current_save_path: Path | None = None
+
+ # undo / redo
+ self.undo_stack: list[set[int]] = []
+ self.redo_stack: list[set[int]] = []
+ self.undo_limit = 20
+
+ self.canvas = PlotCanvas(
+ self.data,
+ self.global_selected_indices,
+ self._toggle_index,
+ )
+
+ self.list_widget = QListWidget()
+
+ self.module_bad_pixels_box = QTextEdit()
+ self.module_bad_pixels_box.setReadOnly(True)
+
+ self.module_count_label = QLabel()
+ self.global_count_label = QLabel()
+
+ self.module_slider = QSlider(Qt.Orientation.Horizontal)
+ self.module_slider.setRange(0, self.data.n_modules_in_data - 1)
+ self.module_slider.valueChanged.connect(self._on_module_changed)
+
+ self.reset_zoom_button = QPushButton("Reset Zoom")
+ self.reset_zoom_button.clicked.connect(self.canvas.reset_zoom)
+
+ self.save_button = QPushButton("Save Selected Indices")
+ self.save_button.clicked.connect(self._save)
+
+ self.n_spin = QSpinBox()
+ self.n_spin.setRange(1, self.data.pixels_per_module // 2)
+ self.n_spin.setValue(5)
+
+ self.add_edges_button = QPushButton("Add First/Last N per Module")
+ self.add_edges_button.clicked.connect(self._add_edge_indices)
+
+ self.undo_button = QPushButton("Undo")
+ self.undo_button.clicked.connect(self._undo)
+
+ self.redo_button = QPushButton("Redo")
+ self.redo_button.clicked.connect(self._redo)
+
+ # keyboard shortcuts
+ QShortcut(QKeySequence("Ctrl+Z"), self, activated=self._undo) # type: ignore
+ QShortcut(QKeySequence("Ctrl+Y"), self, activated=self._redo) # type: ignore
+
+ self._setup_layout()
+ self._setup_menu()
+ self._sync_all()
+
+ # ---------- UI ----------
+
+ def _setup_layout(self) -> None:
+ right = QVBoxLayout()
+ right.addWidget(QLabel("Selected Global Indices"))
+ right.addWidget(self.list_widget)
+
+ right.addWidget(QLabel("Bad Pixels (Current Module, Global Indices)"))
+ right.addWidget(self.module_bad_pixels_box)
+ right.addWidget(self.module_count_label)
+ right.addWidget(self.global_count_label)
+
+ edge_row = QHBoxLayout()
+ edge_row.addWidget(QLabel("N edge points per module"))
+ edge_row.addWidget(self.n_spin)
+ edge_row.addWidget(self.add_edges_button)
+ edge_row.addStretch()
+ right.addLayout(edge_row)
+
+ undo_row = QHBoxLayout()
+ undo_row.addWidget(self.undo_button)
+ undo_row.addWidget(self.redo_button)
+ undo_row.addStretch()
+ right.addLayout(undo_row)
+
+ right.addWidget(self.save_button)
+
+ left = QVBoxLayout()
+ left.addWidget(self.canvas)
+ left.addWidget(self.module_slider)
+ left.addWidget(self.reset_zoom_button)
+
+ central = QWidget()
+ main = QHBoxLayout(central)
+ main.addLayout(left, 3)
+ main.addLayout(right, 1)
+
+ self.setCentralWidget(central)
+
+ def _setup_menu(self) -> None:
+ menu = self.menuBar()
+
+ if menu is None:
+ raise Exception("Menu has broken")
+ file_menu = menu.addMenu("File")
+ if file_menu is None:
+ raise Exception("file_menu has broken")
+ file_menu.addAction("Save", self._save)
+ file_menu.addAction("Save As...", self._save_as)
+
+ help_menu = menu.addMenu("Help")
+ if help_menu is None:
+ raise Exception("help_menu has broken")
+
+ help_menu.addAction("Controls", self._show_controls)
+
+ # ---------- syncing ----------
+
+ def _sync_all(self) -> None:
+ self.list_widget.clear()
+ for idx in sorted(self.global_selected_indices):
+ self.list_widget.addItem(QListWidgetItem(str(idx)))
+
+ self._update_module_bad_pixels()
+ self.global_count_label.setText(
+ f"Total bad pixels (global): {len(self.global_selected_indices)}"
+ )
+
+ def _update_module_bad_pixels(self) -> None:
+ m = self.canvas.current_module
+ ppm = self.data.pixels_per_module
+ start = m * ppm
+ end = start + ppm
+
+ module_globals = sorted(
+ idx for idx in self.global_selected_indices if start <= idx < end
+ )
+
+ self.module_bad_pixels_box.setPlainText(
+ ", ".join(map(str, module_globals)) if module_globals else "(none)"
+ )
+ self.module_count_label.setText(f"Bad pixels in module: {len(module_globals)}")
+
+ # ---------- undo / redo ----------
+
+ def _record_state(self) -> None:
+ self.undo_stack.append(self.global_selected_indices.copy())
+ if len(self.undo_stack) > self.undo_limit:
+ self.undo_stack.pop(0)
+ self.redo_stack.clear()
+
+ def _undo(self) -> None:
+ if not self.undo_stack:
+ return
+
+ self.redo_stack.append(self.global_selected_indices.copy())
+ prev = self.undo_stack.pop()
+
+ self.global_selected_indices.clear()
+ self.global_selected_indices.update(prev)
+
+ self.canvas._update_selected_points() # noqa
+ self._sync_all()
+
+ def _redo(self) -> None:
+ if not self.redo_stack:
+ return
+
+ self.undo_stack.append(self.global_selected_indices.copy())
+ nxt = self.redo_stack.pop()
+
+ self.global_selected_indices.clear()
+ self.global_selected_indices.update(nxt)
+
+ self.canvas._update_selected_points() # noqa
+ self._sync_all()
+
+ # ---------- actions ----------
+
+ def _toggle_index(self, idx: int) -> None:
+ self._record_state()
+
+ if idx in self.global_selected_indices:
+ self.global_selected_indices.remove(idx)
+ else:
+ self.global_selected_indices.add(idx)
+
+ self.canvas._update_selected_points() # noqa
+ self._sync_all()
+
+ def _add_edge_indices(self) -> None:
+ self._record_state()
+
+ n = self.n_spin.value()
+ for m in range(self.data.n_modules_in_data):
+ base = m * self.data.pixels_per_module
+ for i in range(n):
+ self.global_selected_indices.add(base + i)
+ self.global_selected_indices.add(
+ base + self.data.pixels_per_module - 1 - i
+ )
+
+ self.canvas._update_selected_points() # noqa
+ self._sync_all()
+
+ # ---------- save ----------
+
+ def _save(self) -> None:
+ if self._current_save_path is None:
+ self._save_as()
+ return
+
+ with self._current_save_path.open("w", encoding="utf-8") as f:
+ for idx in sorted(self.global_selected_indices):
+ f.write(f"{idx}\n")
+
+ def _save_as(self) -> None:
+ path_str, _ = QFileDialog.getSaveFileName(
+ self, "Save Indices", "", "Text Files (*.txt)"
+ )
+ if not path_str:
+ return
+
+ self._current_save_path = Path(path_str)
+ self._save()
+
+ # ---------- help ----------
+
+ def _show_controls(self) -> None:
+ QMessageBox.information(
+ self,
+ "Controls",
+ "Right click: toggle bad pixel\n"
+ "Middle click + drag: pan\n"
+ "Scroll wheel: zoom\n"
+ "Left click + drag: rectangle zoom\n"
+ "Slider: change module\n"
+ "Ctrl+Z / Ctrl+Y: undo / redo",
+ )
+
+ def _on_module_changed(self, module: int) -> None:
+ self.canvas.set_module(module)
+ self._update_module_bad_pixels()
+
+
+# =========================
+# Entrypoint
+# =========================
+
+
+def run_bad_pixel_gui(filepath: str, indices_file: str | None = None) -> None:
+ data = MythenDataLoader(filepath)
+
+ if indices_file:
+ initial_indices = set(load_int_array_from_file(indices_file))
+ else:
+ initial_indices = set()
+
+ app = QApplication(sys.argv)
+ win = MainWindow(data, initial_indices)
+ win.resize(1500, 900)
+ win.show()
+ win.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose, True) # optional
+ sys.exit(app.exec())
+
+
+if __name__ == "__main__":
+ DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1410286.nxs"
+
+ run_bad_pixel_gui(
+ DATA_FILE,
+ )
diff --git a/src/xrpd_toolbox/gui/reprocessor.py b/src/xrpd_toolbox/gui/reprocessor.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/xrpd_toolbox/gui/reprocessor_gui.py b/src/xrpd_toolbox/gui/reprocessor_gui.py
new file mode 100644
index 0000000..94d79b5
--- /dev/null
+++ b/src/xrpd_toolbox/gui/reprocessor_gui.py
@@ -0,0 +1,389 @@
+import sys
+import time
+from pathlib import Path
+from types import UnionType
+from typing import Any, Literal, cast, get_args, get_origin
+
+from pydantic import ValidationError
+from PyQt5.QtCore import QDir, Qt, QThread, pyqtSignal
+from PyQt5.QtWidgets import (
+ QAbstractItemView,
+ QApplication,
+ QCheckBox,
+ QComboBox,
+ QDoubleSpinBox,
+ QFileDialog,
+ QFileSystemModel,
+ QGridLayout,
+ QHBoxLayout,
+ QLabel,
+ QLineEdit,
+ QListWidget,
+ QListWidgetItem,
+ QMessageBox,
+ QPushButton,
+ QSpinBox,
+ QTreeView,
+ QVBoxLayout,
+ QWidget,
+)
+
+from xrpd_toolbox.i11.mythen import MythenSettings
+
+# =========================
+# Worker Thread
+# =========================
+
+
+class ProcessingWorker(QThread):
+ file_started = pyqtSignal(Path)
+ file_finished = pyqtSignal(Path)
+ file_failed = pyqtSignal(Path, str)
+
+ def __init__(self, files: list[Path], settings: MythenSettings) -> None:
+ super().__init__()
+ self.files: list[Path] = files
+ self.settings: MythenSettings = settings
+
+ def run(self) -> None:
+ for file in self.files:
+ self.file_started.emit(file)
+ try:
+ self.process_file(file)
+ self.file_finished.emit(file)
+ except Exception as exc:
+ self.file_failed.emit(file, str(exc))
+
+ def process_file(self, file: Path) -> None:
+ # Replace with real processing
+ time.sleep(1)
+
+
+# =========================
+# Main Window
+# =========================
+
+
+class MainWindow(QWidget):
+ def __init__(
+ self,
+ settings_path: str | Path | None = None,
+ settings: MythenSettings | None = None,
+ beamline: str = "i11",
+ settings_columns: int = 1,
+ ) -> None:
+ super().__init__()
+
+ self.output_dir: str = str(Path.home())
+ self.beamline = beamline
+
+ self.settings_columns: int = max(1, settings_columns)
+
+ if settings is not None:
+ self.settings_model: MythenSettings = settings
+ elif settings_path is not None:
+ self.settings_path: Path = Path(settings_path)
+ self.settings_model: MythenSettings = MythenSettings.load_from_toml(
+ settings_path
+ )
+ else:
+ raise ValueError("Either settings or settings_path must be provided.")
+
+ self.selected_files: list[Path] = []
+ self.worker: ProcessingWorker | None = None
+
+ self.widgets: dict[str, QWidget] = {}
+
+ self.fs_model: QFileSystemModel
+ self.tree: QTreeView
+ self.file_list: QListWidget
+ self.settings_grid: QGridLayout
+ self.process_btn: QPushButton
+
+ self.setWindowTitle("NXS Reprocessor")
+ self.resize(1200, 650)
+
+ self.init_ui()
+
+ # ---------------------
+ # UI setup
+ # ---------------------
+
+ def init_ui(self) -> None:
+ main_layout = QHBoxLayout(self)
+
+ # -------- LEFT PANEL --------
+ left_layout = QVBoxLayout()
+
+ self.fs_model = QFileSystemModel()
+
+ self.base_path = f"/dls/{self.beamline}/data/"
+
+ self.fs_model.setRootPath(QDir.rootPath())
+ self.fs_model.setNameFilters(["*.nxs"])
+ self.fs_model.setNameFilterDisables(False)
+
+ self.tree = QTreeView()
+ self.tree.setModel(self.fs_model)
+ self.tree.setRootIndex(self.fs_model.index(self.base_path))
+ self.tree.setSelectionMode(QAbstractItemView.ExtendedSelection)
+
+ for col in range(1, self.fs_model.columnCount()):
+ self.tree.hideColumn(col)
+
+ selection_model = self.tree.selectionModel()
+ if selection_model:
+ selection_model.selectionChanged.connect(self.on_selection_changed)
+
+ self.file_list = QListWidget()
+
+ left_layout.addWidget(self.tree)
+ left_layout.addWidget(self.file_list)
+
+ # -------- RIGHT PANEL --------
+ right_layout = QVBoxLayout()
+
+ self.settings_grid = QGridLayout()
+ self.settings_grid.setHorizontalSpacing(20)
+ self.settings_grid.setVerticalSpacing(10)
+
+ self.build_settings_grid()
+
+ right_layout.addLayout(self.settings_grid)
+ right_layout.addStretch()
+
+ self.process_btn = QPushButton("PROCESS")
+ self.process_btn.setStyleSheet(
+ "font-size: 18px; font-weight: bold; padding: 12px;"
+ )
+ self.process_btn.clicked.connect(self.process)
+
+ right_layout.addWidget(self.process_btn)
+
+ main_layout.addLayout(left_layout, 2)
+ main_layout.addLayout(right_layout, 1)
+
+ # ---------------------
+ # Settings grid
+ # ---------------------
+
+ def build_settings_grid(self) -> None:
+ normal_settings: list[tuple[str, QWidget]] = []
+
+ model_class = type(self.settings_model)
+
+ for setting_name, field in model_class.model_fields.items():
+ setting_val = getattr(self.settings_model, setting_name)
+ annotation = field.annotation
+ # default = field.default
+
+ widget = self.make_setting(setting_name, setting_val, annotation)
+ print("\n")
+
+ normal_settings.append((setting_name, widget))
+
+ for i, (label, widget) in enumerate(normal_settings):
+ col = i % self.settings_columns
+ row = i // self.settings_columns
+
+ label_col = col * 2
+ field_col = label_col + 1
+
+ self.settings_grid.addWidget(QLabel(label), row, label_col)
+ self.settings_grid.addWidget(widget, row, field_col)
+
+ output_row = (
+ len(normal_settings) + self.settings_columns - 1
+ ) // self.settings_columns
+
+ output_name = "Output Directory"
+ self.settings_grid.addWidget(QLabel(output_name), output_row, 0)
+ self.settings_grid.addWidget(
+ self.make_dir_widget(output_name),
+ output_row,
+ 1,
+ 1,
+ self.settings_columns * 2 - 1,
+ )
+
+ # ---------------------
+ # Widget builders
+ # ---------------------
+
+ def make_setting(
+ self, setting_name: str, setting_val: Any, annotation: Any
+ ) -> QWidget:
+ if (get_origin(annotation) is list) and (get_args(annotation) == (int,)):
+ w = QLineEdit()
+ w.setText(str(setting_val))
+ self.widgets[setting_name] = w
+ return w
+ elif (get_origin(annotation) is UnionType) and (Path in get_args(annotation)):
+ w = QLineEdit()
+ w.setText(setting_val)
+ self.widgets[setting_name] = w
+ return w
+ elif get_origin(annotation) is Literal:
+ get_allowed_literals = get_args(annotation)
+ w = QComboBox()
+ w.addItems(get_allowed_literals)
+ w.setCurrentText(setting_val)
+ self.widgets[setting_name] = w
+ return w
+ elif annotation is float:
+ w = QDoubleSpinBox()
+ w.setRange(0.0, 1e9)
+ w.setDecimals(3)
+ w.setSingleStep(0.001)
+ w.setValue(setting_val)
+ self.widgets[setting_name] = w
+ return w
+ elif annotation is int:
+ w = QSpinBox()
+ w.setRange(1, 1_000_000)
+ w.setValue(setting_val)
+ self.widgets[setting_name] = w
+ return w
+ elif annotation is bool:
+ w = QCheckBox()
+ w.setChecked(setting_val)
+ self.widgets[setting_name] = w
+ return w
+ else:
+ raise ValueError(f"Unknown setting type: {setting_name}")
+
+ def make_dir_widget(self, name) -> QWidget:
+ container = QWidget()
+ layout = QHBoxLayout(container)
+ layout.setContentsMargins(0, 0, 0, 0)
+
+ edit = QLineEdit(self.output_dir)
+ browse = QPushButton("Browse…")
+ browse.clicked.connect(self.browse_output_dir)
+
+ layout.addWidget(edit)
+ layout.addWidget(browse)
+
+ self.widgets[name] = edit
+ return container
+
+ # ---------------------
+ # Output directory picker
+ # ---------------------
+
+ def browse_output_dir(self) -> None:
+ edit = cast(QLineEdit, self.widgets["output_dir"])
+ directory = QFileDialog.getExistingDirectory(
+ self,
+ "Select Output Directory",
+ edit.text() or str(Path.home()),
+ )
+ if directory:
+ edit.setText(directory)
+
+ # ---------------------
+ # File selection
+ # ---------------------
+
+ def on_selection_changed(self, *_: object) -> None:
+ self.selected_files.clear()
+ self.file_list.clear()
+
+ selection_model = self.tree.selectionModel()
+ if selection_model is None:
+ return
+ indexes = selection_model.selectedIndexes()
+ seen: set[Path] = set()
+
+ for index in indexes:
+ if index.column() != 0:
+ continue
+
+ path = Path(self.fs_model.filePath(index))
+ if path.is_file() and path.suffix == ".nxs" and path not in seen:
+ seen.add(path)
+ self.selected_files.append(path)
+
+ item = QListWidgetItem(f"⏳ {path.name}")
+ item.setData(int(Qt.ItemDataRole.UserRole), path)
+ self.file_list.addItem(item)
+
+ # ---------------------
+ # Collect settings
+ # ---------------------
+
+ def collect_settings(self) -> MythenSettings:
+ return MythenSettings(
+ # threshold=cast(QDoubleSpinBox, self.widgets["threshold"]).value(),
+ # max_iterations=cast(QSpinBox, self.widgets["max_iterations"]).value(),
+ # normalize=cast(QCheckBox, self.widgets["normalize"]).isChecked(),
+ # output_dir=cast(QLineEdit, self.widgets["output_dir"]).text(),
+ )
+
+ # ---------------------
+ # Process
+ # ---------------------
+
+ def process(self) -> None:
+ if not self.selected_files:
+ QMessageBox.warning(self, "No files", "Select at least one .nxs file.")
+ return
+
+ try:
+ settings = self.collect_settings()
+ except ValidationError as exc:
+ QMessageBox.critical(self, "Invalid settings", str(exc))
+ return
+
+ self.process_btn.setEnabled(False)
+
+ self.worker = ProcessingWorker(self.selected_files, settings)
+ self.worker.file_started.connect(self.on_file_started)
+ self.worker.file_finished.connect(self.on_file_finished)
+ self.worker.file_failed.connect(self.on_file_failed)
+ self.worker.finished.connect(self.on_all_done)
+ self.worker.start()
+
+ # ---------------------
+ # Worker callbacks
+ # ---------------------
+
+ def find_item(self, path: Path) -> QListWidgetItem | None:
+ for i in range(self.file_list.count()):
+ item = self.file_list.item(i)
+ if item is not None and item.data(Qt.ItemDataRole.UserRole) == path:
+ return item
+ return None
+
+ def on_file_started(self, path: Path) -> None:
+ item = self.find_item(path)
+ if item:
+ item.setText(f"🔄 {path.name}")
+
+ def on_file_finished(self, path: Path) -> None:
+ item = self.find_item(path)
+ if item:
+ item.setText(f"✅ {path.name}")
+
+ def on_file_failed(self, path: Path, error: str) -> None:
+ item = self.find_item(path)
+ if item:
+ item.setText(f"❌ {path.name}")
+
+ print(f"Error processing {path}: {error}")
+
+ def on_all_done(self) -> None:
+ self.process_btn.setEnabled(True)
+ QMessageBox.information(self, "Done", "All files processed.")
+
+
+# =========================
+# App entry point
+# =========================
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ settings = MythenSettings()
+ window = MainWindow(settings=settings, settings_columns=1)
+ window.show()
+ sys.exit(app.exec_())
diff --git a/src/xrpd_toolbox/gui/waffle.py b/src/xrpd_toolbox/gui/waffle.py
new file mode 100644
index 0000000..7098cee
--- /dev/null
+++ b/src/xrpd_toolbox/gui/waffle.py
@@ -0,0 +1,117 @@
+import sys
+
+from PyQt6.QtCore import QSize
+from PyQt6.QtWidgets import (
+ QApplication,
+ QComboBox,
+ QGridLayout,
+ QLabel,
+ QMessageBox,
+ QPushButton,
+ QVBoxLayout,
+ QWidget,
+)
+
+from xrpd_toolbox.gui.bad_pixel_gui import run_bad_pixel_gui
+
+# Constants
+BEAMLINES: list[str] = ["i11", "i15-1"]
+
+
+class WaffleGUI(QWidget):
+ """Main waffle GUI with square buttons that resize dynamically"""
+
+ def __init__(self, beamline: str, grid_size: int = 3) -> None:
+ super().__init__()
+ self.beamline: str = beamline
+ self.grid_size: int = grid_size
+ self.setWindowTitle(f"{beamline} Modules")
+ self.setMinimumSize(300, 300) # Prevent uncontrolled expansion
+
+ self.layout: QGridLayout = QGridLayout() # type: ignore
+ self.layout.setSpacing(5)
+ self.buttons: list[QPushButton] = []
+
+ # Create NxN waffle buttons
+ for row in range(grid_size):
+ for col in range(grid_size):
+ idx: int = row * grid_size + col
+ btn: QPushButton = QPushButton(f"Module {idx}")
+ btn.clicked.connect(lambda checked: self.launch_module(idx)) # type: ignore # noqa
+ self.layout.addWidget(btn, row, col)
+ self.buttons.append(btn)
+
+ self.setLayout(self.layout)
+
+ # Force initial square sizing
+ self.adjust_button_sizes()
+
+ def resizeEvent(self, event) -> None: # type: ignore # noqa
+ """Keep buttons square when window resizes"""
+ self.adjust_button_sizes()
+ super().resizeEvent(event)
+
+ def adjust_button_sizes(self) -> None:
+ """Compute max square size that fits the grid"""
+ if not self.buttons:
+ return
+ # total spacing between buttons
+ spacing: int = self.layout.spacing() * (self.grid_size - 1)
+ available_width: int = self.width() - spacing
+ available_height: int = self.height() - spacing
+ button_size: int = min(available_width, available_height) // self.grid_size
+ for btn in self.buttons:
+ btn.setFixedSize(QSize(button_size, button_size))
+
+ def launch_module(self, idx: int) -> None:
+ """Open submodule GUI (placeholder)"""
+ # sub_gui: SubmoduleGUI = SubmoduleGUI(f"Module {idx}")
+ # sub_gui.show()
+ # # Keep a reference so it doesn't get garbage collected
+ # sub_gui.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose, True)
+
+ data_file = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1406731.nxs"
+
+ run_bad_pixel_gui(data_file)
+
+
+class BeamlineSelector(QWidget):
+ """Initial beamline selection GUI"""
+
+ def __init__(self) -> None:
+ super().__init__()
+ self.setWindowTitle("Select Beamline")
+ self.setGeometry(100, 100, 300, 150)
+
+ self.waffle_gui: WaffleGUI | None = None
+
+ layout: QVBoxLayout = QVBoxLayout()
+ label: QLabel = QLabel("Select beamline:")
+ self.combo: QComboBox = QComboBox()
+ self.combo.addItems(BEAMLINES)
+
+ self.confirm_btn: QPushButton = QPushButton("Confirm")
+ self.confirm_btn.clicked.connect(self.confirm_selection)
+
+ layout.addWidget(label)
+ layout.addWidget(self.combo)
+ layout.addWidget(self.confirm_btn)
+ self.setLayout(layout)
+
+ def confirm_selection(self) -> None:
+ beamline: str = self.combo.currentText()
+ if beamline not in BEAMLINES:
+ QMessageBox.warning(self, "Error", "Please select a valid beamline.")
+ return
+
+ # Open waffle GUI
+ self.waffle_gui = WaffleGUI(beamline)
+ self.waffle_gui.show()
+ self.close() # close the selector
+
+
+if __name__ == "__main__":
+ app: QApplication = QApplication(sys.argv)
+ selector: BeamlineSelector = BeamlineSelector()
+ selector.show()
+ sys.exit(app.exec())
diff --git a/src/xrpd_toolbox/i11/angular_calibration.py b/src/xrpd_toolbox/i11/angular_calibration.py
new file mode 100644
index 0000000..2384249
--- /dev/null
+++ b/src/xrpd_toolbox/i11/angular_calibration.py
@@ -0,0 +1,1236 @@
+# type: ignore
+import json
+import os
+import pickle
+from collections.abc import Collection
+
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+import peakutils
+from h5py import File as h5pyFile
+from lmfit import Parameters, minimize, report_fit
+from pyFAI.calibrant import get_calibrant
+from scipy.interpolate import interp1d
+
+from xrpd_toolbox.i11.mythen import (
+ AngularCalibration,
+ MythenDetector,
+ MythenSettings,
+)
+from xrpd_toolbox.i11.mythen3_reduction_legacy import I11Reduction
+from xrpd_toolbox.utils.utils import load_int_array_from_file, rebin_together
+
+
+def top_n_recurring(arr, n):
+ arr = np.array(arr)
+ # Get unique values and their counts
+ unique_vals, counts = np.unique(arr, return_counts=True)
+
+ # Sort by counts descending
+ sorted_indices = np.argsort(counts)[::-1]
+
+ # Select top n
+ top_n = unique_vals[sorted_indices][:n]
+
+ return top_n
+
+
+def paired_modules():
+ """
+ Given a list of module numbers, return a list of (a, b) pairs such that
+ a and b are paired as described: 0-27, 1-26, 2-25, ..., 13-14.
+ Only pairs where both a and b are in the input list are returned.
+ """
+
+ modules = list(range(28))
+
+ modules = np.array(modules)
+ n = modules.max()
+ pairs = []
+ for m in modules:
+ pair = n - m
+ if pair in modules and m <= pair:
+ pairs.append((int(m), int(pair)))
+
+ pairs = np.array(pairs)
+
+ return pairs
+
+
+def calc_starting_module_offset(initial_module=0.45, offset=2.5):
+ """Used for calculatign the intial centres of each of the modules"""
+
+ module_pairs = paired_modules()
+ module_offsets_dict = {}
+
+ for n, module_pair in enumerate(module_pairs[::-1]):
+ print(module_pair)
+
+ ring_2_cen = (n * 5) + initial_module
+ ring_1_cen = ring_2_cen + offset
+
+ module_offsets_dict[int(module_pair[1])] = ring_2_cen
+ module_offsets_dict[int(module_pair[0])] = ring_1_cen
+
+ print(module_offsets_dict)
+
+ return module_offsets_dict
+
+
+def index_of_closest(arr, value):
+ """
+ Return the index of the closest value in arr to the given value.
+ """
+ arr = np.asarray(arr)
+ idx = np.abs(arr - value).argmin()
+ return idx
+
+
+def calc_intial_module_conv(conv=6.5e-05):
+ module_conv_dict = {}
+
+ for mod in range(28):
+ if mod > 13:
+ module_conv_dict[mod] = -conv
+ else:
+ module_conv_dict[mod] = conv
+
+ return module_conv_dict
+
+
+def gaussian(x: np.array, cen: float, amp: float, fwhm: float):
+ # "1-d gaussian: gaussian(x, amp, cen, fwhm)"
+
+ return (amp / (np.sqrt(2 * np.pi) * fwhm)) * np.exp(
+ -((x - cen) ** 2) / (2 * fwhm**2)
+ )
+
+
+def multi_gaussian(x: np.array, peaks, background=0, phase_scale=1, wdt: int = 4):
+ """wdt (range) of calculated profile of a single Bragg reflection in units of FWHM
+ (typically 4
+ for Gaussian and 20-30 for Lorentzian, 4-5 for TOF).
+
+ peaks: list of (cen, amp, fwhm)
+
+ background: scalar or array
+ """
+
+ y = np.zeros_like(x) + background
+
+ for peak in peaks:
+ cen, amp, fwhm = peak
+ start_idx = np.searchsorted(x, cen - wdt)
+ end_idx = np.searchsorted(x, cen + wdt, side="right")
+
+ xi = x[start_idx:end_idx]
+ peak = gaussian(xi, cen, amp, fwhm) * phase_scale
+
+ y[start_idx:end_idx] += peak
+
+ return y
+
+
+class AngularCalibrateMythen:
+ def split_into_modules(
+ self,
+ filespaths: list[str],
+ modules: Collection[int] = tuple(range(28)),
+ bad_channels: Collection[int] = (),
+ ):
+ n_modules = len(modules)
+
+ out_filepaths = []
+
+ for filepath in filespaths:
+ with h5pyFile(filepath, "r") as file:
+ entry = file["entry"]
+
+ delta = entry["mythen_nx"]["delta"]
+
+ filename = os.path.basename(filepath)
+ filenumber = filename.replace(".nxs", "")
+
+ n_delta_points = delta.shape[0]
+
+ module_array = np.zeros(
+ (n_delta_points, n_modules, self.STRIPS_PER_MODULE)
+ )
+
+ for i in range(delta.shape[0]):
+ print(f"File: {filepath}, Frame: {i}, Delta: {delta[i]}")
+
+ data = entry["mythen_nx"]["data"][i, :, self.DEFAULT_COUNTER]
+
+ data[bad_channels] = 0
+
+ split_module_data = np.split(data, n_modules)
+
+ for n_mod in modules:
+ module_data = split_module_data[n_mod]
+
+ # if n_mod > 13:
+ # module_data = np.flip(module_data)
+
+ module_array[i, n_mod, :] = module_data
+
+ out_filepath = os.path.join(
+ "/host-home/projects/outputs",
+ filenumber + "_modules.h5",
+ )
+ out_filepaths.append(out_filepath)
+
+ with h5pyFile(out_filepath, "w", libver="latest") as h5f:
+ h5f["data1"] = module_array
+
+ return out_filepaths
+
+ def generate_filepaths(self, data_dir, nexus_file_numbers):
+ filepaths = []
+
+ for data_file_number in nexus_file_numbers:
+ filepath = os.path.join(data_dir, f"{data_file_number}.nxs")
+ filepaths.append(filepath)
+
+ return filepaths
+
+ def extract_module_dataset(self, module_to_analyse: int, delta_points):
+ module_datasets = []
+
+ with h5pyFile(self.module_dataset, "r") as file:
+ nxs_data = file["data1"] # (delta, n_modules, PIXELS_PER_MODULE)
+
+ for n_delta, _ in enumerate(delta_points):
+ module_data = nxs_data[n_delta, module_to_analyse, :]
+ module_datasets.append(module_data)
+
+ module_datasets = np.array(module_datasets)
+
+ return module_datasets
+
+ def average_within_tolerance(self, arr, tol):
+ """
+ For a 1D numpy array, if two adjacent values are within 'tol',
+ replace them with their average
+ and remove one of them, so the returned array is shorter.
+ No explicit Python loops.
+ """
+ arr = np.asarray(arr, dtype=float)
+ if arr.size == 0:
+ return arr
+
+ arr = np.sort(arr) # Ensure the array is sorted at the beginning
+
+ # Find adjacent pairs within tolerance
+ close = np.abs(arr[1:] - arr[:-1]) <= tol
+
+ # Indices to keep: start with all True
+ keep = np.ones(arr.shape, dtype=bool)
+ # Where close, we'll keep only the first of the pair (set the second to False)
+ keep[1:][close] = False
+
+ # Compute averages for close pairs
+ avgs = (arr[:-1][close] + arr[1:][close]) / 2
+
+ # Output array: fill with arr, then replace the kept
+ # indices that start a close pair with the average
+ out = arr[keep]
+ out_indices = np.where(close)[0][keep[:-1][close]]
+ out[out_indices] = avgs
+
+ return out
+
+ def fit_peaks_across_delta(
+ self,
+ delta_points,
+ module_angular_cal,
+ modules,
+ observed_reflections_in_tth,
+ beamline_offset,
+ ):
+ fitted_peaks_for_modules = {}
+ big_df = pd.DataFrame()
+
+ for module_to_analyse in modules:
+ module_dataset = self.extract_module_dataset(
+ module_to_analyse=module_to_analyse, delta_points=delta_points
+ )
+ params = module_angular_cal[module_to_analyse]
+
+ centre = params["centre"]
+ conv = params["conv"]
+ offset = params["offset"]
+
+ module_pixel_number = np.arange(self.STRIPS_PER_MODULE, dtype=np.int64)
+
+ raw_tth = I11Reduction.channel_to_angle(
+ module_pixel_number, centre, conv, offset, beamline_offset
+ )
+
+ tol = 0.01
+ trim = 10
+
+ calc_peak_tth = np.array([])
+ detected_peak_pixel = np.array([])
+ delta_of_point = np.array([])
+
+ for n, (delta, dataset) in enumerate(
+ zip(delta_points, module_dataset, strict=True)
+ ):
+ print(module_to_analyse, n, delta)
+
+ dataset[0:trim] = np.nan
+ dataset[len(dataset) - trim : :] = np.nan
+ # dataset = dataset[trim:-trim]
+ mask = dataset == 0
+
+ real_tth = raw_tth + delta
+ real_tth[0:trim] = np.nan
+ real_tth[len(dataset) - trim : :] = np.nan
+
+ dataset[mask] = np.nan
+ real_tth[mask] = np.nan
+
+ data_tth_mean = np.nanmean(real_tth)
+
+ mintth, maxtth = np.nanmin(real_tth), np.nanmax(real_tth)
+
+ tth_calculated_peak_centres = observed_reflections_in_tth[
+ (maxtth + tol > observed_reflections_in_tth)
+ & (observed_reflections_in_tth > mintth - tol)
+ ]
+ tth_calculated_peak_centres = np.sort(tth_calculated_peak_centres)
+
+ if (
+ len(tth_calculated_peak_centres) > 0
+ ): # if there are peaks as detected by calculation from cif
+ if (len(tth_calculated_peak_centres) > 1) and self.single_peak:
+ middle_index = self.closest_indices(
+ data_tth_mean, tth_calculated_peak_centres
+ )
+ tth_calculated_peak_centres = np.array(
+ [tth_calculated_peak_centres[middle_index]]
+ )
+
+ non_nan_dataset = np.nan_to_num(dataset)
+
+ indexes = peakutils.indexes(
+ non_nan_dataset, thres=0.10, min_dist=100
+ )
+ tth_peaks_centres_in_data = real_tth[indexes]
+ pixel_peak_in_data = module_pixel_number[indexes]
+
+ n_calc, n_data = (
+ len(tth_calculated_peak_centres),
+ len(tth_peaks_centres_in_data),
+ )
+
+ if n_data > n_calc:
+ # if extra peaks are detected then clean it up
+ # by taking the closest ones
+ index = self.closest_indices(
+ tth_calculated_peak_centres, tth_peaks_centres_in_data
+ )
+ tth_peaks_centres_in_data = tth_peaks_centres_in_data[index]
+ pixel_peak_in_data = pixel_peak_in_data[index]
+ n_calc, n_data = (
+ len(tth_calculated_peak_centres),
+ len(tth_peaks_centres_in_data),
+ )
+
+ real_tth_no_nan = raw_tth + delta
+ tth_peaks_centres_in_data_refined = peakutils.interpolate(
+ real_tth_no_nan, non_nan_dataset, ind=pixel_peak_in_data
+ )
+
+ interp_func = interp1d(real_tth_no_nan, module_pixel_number)
+
+ try:
+ pixel_peak_in_data_refined = interp_func(
+ tth_peaks_centres_in_data_refined
+ )
+
+ if (
+ abs(
+ tth_peaks_centres_in_data_refined
+ - tth_peaks_centres_in_data
+ )
+ < 0.4
+ ):
+ pixel_peak_in_data = (
+ pixel_peak_in_data_refined.flatten()
+ )
+ n_calc, n_data = (
+ len(tth_calculated_peak_centres),
+ len(tth_peaks_centres_in_data),
+ )
+ else:
+ continue
+
+ except Exception as e:
+ pixel_peak_in_data_refined = tth_peaks_centres_in_data
+ print(e)
+ try:
+ if (
+ abs(
+ tth_peaks_centres_in_data_refined
+ - tth_peaks_centres_in_data
+ )
+ > 0.4
+ ):
+ continue
+ except Exception as e:
+ print(e)
+ continue
+
+ # if (
+ # (n % 1 == 0)
+ # and (n > 29)
+ # and (n < 41)
+ # and (module_to_analyse in [5])
+ # ):
+ # plt.plot(real_tth, non_nan_dataset)
+ # plt.scatter(
+ # tth_peaks_centres_in_data,
+ # non_nan_dataset[pixel_peak_in_data.astype(int)],
+ # color="red",
+ # )
+ # plt.show()
+
+ if (
+ n_calc != n_data
+ ): # if still not equal - why? (peak probably on edge of data)
+ continue
+
+ calc_peak_tth = np.append(
+ calc_peak_tth, tth_calculated_peak_centres
+ )
+ detected_peak_pixel = np.append(
+ detected_peak_pixel, pixel_peak_in_data
+ )
+ delta_of_point = np.append(
+ delta_of_point, [delta] * len(tth_calculated_peak_centres)
+ )
+
+ continue
+
+ else: # if there are no peaks in this range skip
+ continue
+
+ # if module_to_analyse in [5]:
+ # plt.ylabel("Intensity (A.U)")
+ # plt.xlabel("tth")
+
+ module_data = pd.DataFrame()
+ module_data["calc_peak_tth"] = calc_peak_tth
+ module_data["pixel"] = detected_peak_pixel
+ module_data["delta"] = delta_of_point
+ module_data["module"] = module_to_analyse
+
+ big_df = pd.concat((big_df, module_data))
+
+ # print(len(module_data))
+
+ # print(len(module_data))
+
+ # mask = np.isclose(
+ # module_data["calc_peak_tth"].to_numpy()[:, None], # shape (rows, 1)
+ # self.peaks_to_fit, # shape (n,)
+ # rtol=1e-5,
+ # atol=1e-8,
+ # ).any(axis=1)
+
+ # mask = module_data["delta"] < 25
+
+ # module_data = module_data[mask]
+
+ # print(len(module_data))
+
+ # module_data.to_csv(f"/workspaces/{module_to_analyse}.csv")
+
+ # median_tth = np.median(calc_peak_tth)
+
+ # module_data = module_data[
+ # (module_data["calc_peak_tth"] > median_tth - 0.2)
+ # & (module_data["calc_peak_tth"] < median_tth + 0.2)
+ # ]
+
+ # it's a dict
+ fitted_peaks_for_modules[module_to_analyse] = module_data
+
+ for peak in np.unique(big_df["calc_peak_tth"]):
+ peak_data = big_df[big_df["calc_peak_tth"] == peak]
+
+ print(peak, "(tth)")
+ print(len(np.unique(peak_data["module"])), "\n")
+
+ return fitted_peaks_for_modules
+
+ def return_residual_for_modules(
+ self, params, modules, fitted_peaks_for_modules, ring_compare=False, plot=False
+ ):
+ params = params.valuesdict()
+
+ resid_for_all_modules = np.array([])
+
+ for _, (module_to_analyse) in enumerate(modules):
+ module_dataframe = fitted_peaks_for_modules[module_to_analyse]
+
+ centre = params[f"centre_{module_to_analyse}"]
+ beamline_offset = params["beamline_offset"]
+ conv = params[f"conv_{module_to_analyse}"]
+ offset = params[f"offset_{module_to_analyse}"]
+
+ raw_tth = I11Reduction.channel_to_angle(
+ module_dataframe["pixel"], centre, conv, offset, beamline_offset
+ )
+
+ real_tth = raw_tth + module_dataframe["delta"]
+ diff = np.abs(real_tth - module_dataframe["calc_peak_tth"])
+ # mmultiplying by mean weights the lower agnles greater than higher
+ # excess = np.clip(diff - 0.002, 0, None)
+ # resid_for_module = excess**2 * 1000
+
+ # max_dist = 13.5
+
+ # distance = abs(module_to_analyse - 14)
+ # normalised = 1 - (distance / max_dist)
+
+ # resid_for_module = diff * ((normalised) * 100)
+ resid_for_module = diff
+
+ resid_for_all_modules = np.append(resid_for_all_modules, resid_for_module)
+ resid_for_module_iter = float(np.nansum(resid_for_module))
+ # print(resid_for_module_iter)
+ # print(module_to_analyse)
+ self.resid_per_module[module_to_analyse].append(resid_for_module_iter)
+
+ if plot and (self.plot_iter % 200 == 0):
+ print(module_to_analyse)
+ plt.scatter(real_tth, [1] * len(real_tth), label="det")
+ plt.scatter(
+ module_dataframe["calc_peak_tth"],
+ [2] * len(module_dataframe),
+ label="calc",
+ )
+ plt.legend()
+ plt.show()
+
+ if ring_compare:
+ for bad_mod in self.bad_modules:
+ params[f"conv_{bad_mod}"] = self.module_angular_cal[bad_mod]["conv"]
+ params[f"offset_{bad_mod}"] = self.module_angular_cal[bad_mod]["offset"]
+ params[f"centre_{bad_mod}"] = self.module_centre
+
+ pydantic_dict = self.results_dict_to_pydantic(params)
+ angular_calibration = AngularCalibration(**pydantic_dict)
+
+ config_file = "/host-home/projects/outputs/mythen_calibration/mythen3_reduction_config.toml" # noqa
+ settings1 = MythenSettings.load_from_toml(config_file)
+ settings2 = MythenSettings.load_from_toml(config_file)
+
+ bad_chan_file = "/workspaces/XRPD-Toolbox/config/i11/bad_channels.txt"
+
+ data_file = "/host-home/projects/outputs/angular_calibration/1410289.nxs"
+ settings1.bad_channels_filepath = bad_chan_file
+ settings2.bad_channels_filepath = bad_chan_file
+
+ settings1.bad_modules = [
+ 11,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ ]
+ settings2.bad_modules = [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 17,
+ 27,
+ ] # type: ignore
+
+ mythen3_ring_1 = MythenDetector(
+ filepath=data_file,
+ settings=settings1,
+ angular_calibration=angular_calibration,
+ )
+
+ tth1, count1, error1 = mythen3_ring_1.generate_binned_xye(normalise=False)
+
+ mythen3_ring_2 = MythenDetector(
+ filepath=data_file,
+ settings=settings2,
+ angular_calibration=angular_calibration,
+ )
+
+ tth2, count2, error2 = mythen3_ring_2.generate_binned_xye(normalise=False)
+
+ x_common, y1_interp, y2_interp = rebin_together(tth1, count1, tth2, count2)
+
+ ring_compare = np.abs(y1_interp - y2_interp)
+ ring_compare_resid = np.sum(ring_compare) / (1e9)
+
+ resid_for_all_modules = resid_for_all_modules + ring_compare_resid
+
+ print(np.sum(resid_for_all_modules), np.sum(ring_compare))
+ self.plot_iter = self.plot_iter + 1
+
+ return resid_for_all_modules
+
+ def get_delta_points(self, filepath):
+ with h5pyFile(filepath, "r") as file:
+ entry = file["entry"]
+ delta_points = entry["mythen_nx"]["delta"][()]
+
+ return delta_points
+
+ def save_results(
+ self, results_dict, filepath, modules, bad_modules, original_ang_cal, p=0.05
+ ):
+ for key in results_dict.keys():
+ if "conv" in key:
+ print(key, results_dict[key])
+ else:
+ print(key, results_dict[key])
+
+ with open(filepath, "w") as f:
+ for module in modules:
+ if module in bad_modules:
+ og_off = original_ang_cal[module]["offset"]
+ og_conv = original_ang_cal[module]["conv"]
+ og_centre = self.module_centre
+
+ f.write(
+ f"module {module} offset {og_off} conv {og_conv} center {og_centre} #not refined\n" # noqa
+ )
+
+ else:
+ off = results_dict[f"offset_{module}"]
+ conv = results_dict[f"conv_{module}"]
+ center = results_dict[f"centre_{module}"]
+
+ f.write(
+ f"module {module} offset {off} conv {conv} center {center} \n"
+ )
+
+ beamline_offset = results_dict["beamline_offset"]
+
+ f.write(f"beamline_offset {beamline_offset}")
+
+ with open(filepath.replace(".off", ".json"), "w") as fp:
+ json.dump(results_dict, fp, indent=4)
+
+ print(f"Saved to: {filepath}")
+
+ def plot_resids(self):
+ for module in self.resid_per_module.keys():
+ mod_resids = self.resid_per_module[module]
+ plt.title(module)
+ plt.plot(np.log10(mod_resids))
+ plt.show()
+
+ def create_starting_params(self, zero=-0.5):
+ conv_tol = 0.2 # fractional percent 0.1 = 10%
+ offset_tol = 4 # in degrees
+
+ convs = calc_intial_module_conv(0.05 / 762)
+ offsets = calc_starting_module_offset()
+
+ params = Parameters()
+
+ for mod in self.good_modules:
+ init_conv = convs[mod]
+ init_offset = offsets[mod]
+
+ conv_lower = init_conv - ((abs(init_conv)) * conv_tol)
+ conv_upper = init_conv + ((abs(init_conv)) * conv_tol)
+
+ print(mod, init_offset, init_conv, conv_lower, conv_upper)
+
+ params.add(
+ f"conv_{mod}",
+ vary=True,
+ value=init_conv,
+ min=conv_lower,
+ max=conv_upper,
+ )
+ params.add(
+ f"offset_{mod}",
+ vary=True,
+ value=init_offset,
+ min=init_offset - offset_tol,
+ max=init_offset + offset_tol,
+ )
+
+ params.add(
+ f"centre_{mod}",
+ value=self.module_centre,
+ vary=False,
+ min=self.module_centre - 2,
+ max=self.module_centre + 2,
+ ) # maybe 640 or 639.5?
+
+ params.add("beamline_offset", value=zero, vary=True, min=-2, max=2)
+
+ return params
+
+ def plot_fit_stats(self, fitted_peaks_for_modules):
+ peak_fits = pd.DataFrame(
+ columns=["peak"].append(list(fitted_peaks_for_modules.keys()))
+ )
+
+ peak_fits["peak"] = self.peaks_to_fit
+
+ for module in fitted_peaks_for_modules.keys():
+ module_data = fitted_peaks_for_modules[module]
+ plt.title(module)
+ # plt.scatter(module_data["delta"], module_data["pixel"])
+
+ mask = np.isclose(
+ module_data["calc_peak_tth"].to_numpy()[:, None], # shape (rows, 1)
+ self.peaks_to_fit, # shape (n,)
+ rtol=1e-5,
+ atol=1e-8,
+ ).any(axis=1)
+
+ module_data = module_data[mask]
+
+ peak_data_gradient = []
+
+ for peak in np.unique(module_data["calc_peak_tth"]):
+ peak_in_module = module_data[module_data["calc_peak_tth"] == peak]
+ plt.scatter(peak_in_module["delta"], peak_in_module["pixel"])
+
+ m, b = np.polyfit(
+ peak_in_module["delta"].to_numpy(),
+ peak_in_module["pixel"].to_numpy(),
+ 1,
+ )
+ print(m, b)
+ peak_data_gradient.append(m)
+
+ plt.plot(
+ peak_in_module["delta"],
+ (m * peak_in_module["delta"]) + b,
+ color="red",
+ )
+ peak_fits[str(module)] = peak_data_gradient
+ plt.savefig(f"/host-home/projects/outputs/peak_fits_{module}.png")
+ plt.close()
+
+ mean_grads = []
+
+ plt.figure(figsize=(16, 10))
+ plt.title("Absolute Gradient of Fitted Peaks")
+ for module in fitted_peaks_for_modules.keys():
+ mean_gradient = np.mean(peak_fits[str(module)])
+ print(module, mean_gradient)
+ mean_grads.append(mean_gradient)
+
+ # for module in fitted_peaks_for_modules.keys():
+ # gradients = peak_fits[str(module)]
+ # plt.title(module)
+ # plt.plot(self.peaks_to_fit, gradients)
+ # plt.show()
+
+ plt.errorbar(
+ list(fitted_peaks_for_modules.keys()),
+ np.abs(mean_grads),
+ np.std(np.abs(mean_grads)),
+ fmt="-o",
+ )
+ plt.ylabel("Mean Gradient Of Peak Fit pixel/delta")
+ plt.xlabel("Module number")
+ plt.grid(True)
+ plt.savefig("/host-home/projects/outputs/gradient.png")
+ plt.close()
+
+ peak_fits.to_csv("/host-home/projects/outputs/peak_gradients.csv")
+
+ def remove_bad_modules(self, fitted_peaks_for_modules: dict):
+ for bad_module in self.bad_modules:
+ fitted_peaks_for_modules.pop(bad_module)
+
+ return fitted_peaks_for_modules
+
+ def select_peaks(self, fitted_peaks_for_modules, mask_type: str = "select_peaks"):
+ for module in fitted_peaks_for_modules.keys():
+ module_data = fitted_peaks_for_modules[module]
+
+ print(module, "unique peaks", np.unique(module_data["calc_peak_tth"]))
+ print(len(module_data))
+
+ if mask_type == "select_peaks":
+ mask = np.isclose(
+ module_data["calc_peak_tth"].to_numpy()[:, None], # shape (rows, 1)
+ self.peaks_to_fit, # shape (n,)
+ rtol=1e-5,
+ atol=1e-8,
+ ).any(axis=1)
+
+ elif mask_type == "below":
+ if module not in [12, 13, 14, 15, 16]:
+ mask = module_data["delta"] < 25
+ else:
+ mask = module_data["delta"] < 50
+
+ elif mask_type == "below2":
+ distance = abs(module_distance(module))
+
+ if distance > 0.7:
+ distance = distance
+ else:
+ distance = 0
+
+ mask = module_data["delta"] < 25 + (25 * distance)
+
+ elif mask_type == "max":
+ max_n = 5
+ most_present_peaks = top_n_recurring(
+ module_data["calc_peak_tth"], max_n
+ )
+ mask = np.isclose(
+ module_data["calc_peak_tth"].to_numpy()[:, None], # shape (rows, 1)
+ most_present_peaks, # shape (n,)
+ rtol=1e-5,
+ atol=1e-8,
+ ).any(axis=1)
+ elif mask_type == "between":
+ mask = (module_data["delta"] < self.upper_delta) & (
+ module_data["delta"] > self.lower_delta
+ )
+
+ module_data = module_data[mask]
+ print(len(module_data))
+ # it's a dict
+ fitted_peaks_for_modules[module] = module_data
+
+ return fitted_peaks_for_modules
+
+ def results_dict_to_pydantic(self, results_dict):
+ pydantic_dict = {}
+ pydantic_dict["beamline_offset"] = results_dict["beamline_offset"]
+
+ for module in self.active_modules:
+ pydantic_dict[f"module_{str(module)}"] = {
+ "centre": results_dict[f"centre_{module}"],
+ "conv": results_dict[f"conv_{module}"],
+ "offset": results_dict[f"offset_{module}"],
+ }
+
+ return pydantic_dict
+
+ def create_starting_params_from_original(self, starting_params, beamline_offset):
+ conv_tol = 0.2 # fractional percent 0.1 = 10%
+ offset_tol = 4 # in degrees
+
+ params = Parameters()
+
+ for mod in self.good_modules:
+ init_conv = starting_params[mod]["conv"]
+ init_offset = starting_params[mod]["offset"]
+
+ conv_lower = init_conv - ((abs(init_conv)) * conv_tol)
+ conv_upper = init_conv + ((abs(init_conv)) * conv_tol)
+
+ print(mod, init_offset, init_conv, conv_lower, conv_upper)
+
+ params.add(
+ f"conv_{mod}",
+ vary=True,
+ value=init_conv,
+ min=conv_lower,
+ max=conv_upper,
+ )
+ params.add(
+ f"offset_{mod}",
+ vary=True,
+ value=init_offset,
+ min=init_offset - offset_tol,
+ max=init_offset + offset_tol,
+ )
+
+ params.add(
+ f"centre_{mod}",
+ value=self.module_centre,
+ vary=True,
+ min=self.module_centre - 5,
+ max=self.module_centre + 5,
+ ) # maybe 640 or 639.5?
+
+ params.add("beamline_offset", value=beamline_offset, vary=True, min=-2, max=2)
+
+ return params
+
+ def __init__(
+ self,
+ wavelength_in_ang,
+ method,
+ module_centre=640,
+ lower_delta=0,
+ upper_delta=90,
+ ):
+ self.DEFAULT_COUNTER = 0
+ self.STRIPS_PER_MODULE = 1280
+ self.wavelength_in_ang = wavelength_in_ang
+ self.method = method
+
+ self.lower_delta = lower_delta
+ self.upper_delta = upper_delta
+
+ self.active_modules = list(range(28))
+ self.bad_modules = [
+ 17,
+ ] # 11 is wobbling?, 17 is dead, 27 is wobbling?
+ self.good_modules = [
+ f for f in self.active_modules if f not in self.bad_modules
+ ]
+
+ self.peaks_to_fit = [
+ 69.6350914079859,
+ 71.75570444785892,
+ 75.23501956270378,
+ 77.29530751474618,
+ 80.69374073239572,
+ 82.71626960778555,
+ 86.06823060567002,
+ 88.07221803978473,
+ ]
+
+ self.p = 0.05 # pixel size in mm
+ self.psd_radius = 762
+ self.module_centre = (
+ module_centre # 639.5p = 31.975 mm from the center of the 0-th
+ )
+ self.module_pixel_number = np.arange(self.STRIPS_PER_MODULE, dtype=np.int64)
+
+ self.init_conv = self.p / self.psd_radius # 6.56e-5
+
+ self.single_peak = True # True is much better
+ self.use_pickle = True
+
+ data_dir = "/host-home/projects/outputs/angular_calibration/"
+ si_nexus_file_numbers = [1410289]
+ fitted_peaks_for_modules_file = (
+ f"/host-home/projects/outputs/{si_nexus_file_numbers[0]}_fitted_peaks.obj"
+ )
+
+ ang_cal = "/host-home/projects/outputs/mythen_calibration/processed/ang_cal_171125.off" # noqa
+ self.module_angular_cal, self.beamline_offset = (
+ I11Reduction.read_singular_angcal_files(ang_cal)
+ ) # ["offset"], module_cal["conv"], module_cal["centre"]
+
+ bad_channels = load_int_array_from_file(
+ "/workspaces/XRPD-Toolbox/config/i11/bad_channels.txt"
+ )
+
+ calibrant = get_calibrant("Si")
+ calibrant.wavelength = self.wavelength_in_ang / 1e10
+ observed_reflections_in_tth = calibrant.get_peaks("2th_deg")
+
+ filepaths = self.generate_filepaths(data_dir, si_nexus_file_numbers)
+
+ ########################################
+
+ if not self.use_pickle:
+ new_split_si_filepaths = [
+ f"/host-home/projects/outputs/mythen_calibration/processed/{f}_modules.h5"
+ for f in si_nexus_file_numbers
+ ]
+
+ self.module_dataset = new_split_si_filepaths[0]
+
+ if not os.path.exists(self.module_dataset):
+ new_split_si_filepaths = self.split_into_modules(
+ filepaths, bad_channels=bad_channels
+ ) # (delta, n_modules, PIXELS_PER_MODULE)
+
+ delta_points = self.get_delta_points(filepaths[0])
+ fitted_peaks_for_modules = self.fit_peaks_across_delta(
+ delta_points=delta_points,
+ module_angular_cal=self.module_angular_cal,
+ modules=self.active_modules,
+ observed_reflections_in_tth=observed_reflections_in_tth,
+ beamline_offset=self.beamline_offset,
+ )
+
+ with open(fitted_peaks_for_modules_file, "wb") as fp:
+ pickle.dump(fitted_peaks_for_modules, fp)
+
+ else:
+ with open(fitted_peaks_for_modules_file, "rb") as pickle_file:
+ fitted_peaks_for_modules = pickle.load(pickle_file)
+
+ fitted_peaks_for_modules = self.remove_bad_modules(fitted_peaks_for_modules)
+
+ self.plot_fit_stats(fitted_peaks_for_modules)
+
+ # quit()
+
+ fitted_peaks_for_modules = self.select_peaks(
+ fitted_peaks_for_modules, mask_type="below"
+ )
+
+ # for module in fitted_peaks_for_modules.keys():
+ # module_data = fitted_peaks_for_modules[module]
+
+ # for peak in self.peaks_to_fit:
+ # peak_data_for_module = module_data[
+ # np.abs(module_data["calc_peak_tth"] - peak) < 0.1
+ # ]
+ # print(module, peak_data_for_module["pixel"])
+
+ # quit()
+
+ # try:
+ # except Exception as e:
+ # print(e)
+
+ starting_params = "guess"
+
+ if starting_params == "guess":
+ params = self.create_starting_params(self.beamline_offset)
+ else:
+ params = self.create_starting_params_from_original(
+ self.module_angular_cal, self.beamline_offset
+ )
+
+ self.plot_iter = 0
+
+ self.resid_per_module = {}
+ for module in self.good_modules:
+ self.resid_per_module[module] = []
+
+ results = minimize(
+ self.return_residual_for_modules,
+ params,
+ args=(self.good_modules, fitted_peaks_for_modules),
+ nan_policy="omit",
+ method=method,
+ )
+ report_fit(results)
+
+ self.residual = results.residual
+
+ angcal_filepath = f"/host-home/projects/outputs/mythen_calibration/processed/ang_cal_020426_cen_{self.module_centre}_{method}_{self.bad_modules}.off" # noqa
+
+ self.results_dict = results.params.valuesdict()
+ print(self.results_dict)
+
+ for bad_mod in self.bad_modules:
+ self.results_dict[f"conv_{bad_mod}"] = self.module_angular_cal[bad_mod][
+ "conv"
+ ]
+ self.results_dict[f"offset_{bad_mod}"] = self.module_angular_cal[bad_mod][
+ "offset"
+ ]
+ self.results_dict[f"centre_{bad_mod}"] = self.module_centre
+
+ self.save_results(
+ results_dict=self.results_dict,
+ filepath=angcal_filepath,
+ modules=list(range(28)),
+ bad_modules=self.bad_modules,
+ original_ang_cal=self.module_angular_cal,
+ )
+
+ # print(AngularCalibration.model_fields)
+ # quit()
+
+ pydantic_dict = self.results_dict_to_pydantic(self.results_dict)
+ pydantic_model = AngularCalibration(**pydantic_dict)
+ pydantic_model.save_to_json(angcal_filepath.replace(".off", "_new.json"))
+
+ # convert_angcal_to_new_pydantic_json(
+ # angcal_filepath.replace(".off", ".json"),
+ # angcal_filepath.replace(".off", "_new.json"),
+ # )
+
+ # check_files = "/dls/i11/data/2025/cm40625-5/1399181.nxs"
+ check_files = [
+ "/host-home/projects/outputs/step_scan/1410696.nxs",
+ "/host-home/projects/outputs/step_scan/1414223.nxs",
+ ]
+
+ for check_file in check_files:
+ analysis = I11Reduction(
+ filepath=check_file,
+ reduced_nxs_filepath_out=None,
+ xye_filepath_out=None,
+ out_directory="/host-home/projects/outputs/mythen_calibration",
+ config_filepath="/workspaces/XRPD-Toolbox/config/i11/mythen3_reduction_config.toml",
+ beam_energy=None,
+ data_reduction_mode=0,
+ bad_frames=[],
+ bad_modules=self.bad_modules, # [9,17,24],
+ beamline_offset=None,
+ active_modules=list(range(28)),
+ flatfield_filepath=None,
+ apply_flatfield=None,
+ angcal_filepath=angcal_filepath,
+ filename_suffix=f"_new_cal_{self.module_centre}",
+ execute_reduction=True,
+ )
+
+ for module in range(28):
+ print(analysis.module_angular_cal[module])
+
+ basename = os.path.basename(check_file)
+
+ analysis.plot_by_region_of_interest(
+ observed_reflections_in_tth,
+ tol=0.04,
+ filepath=f"/host-home/projects/outputs/roi_{basename}.png",
+ )
+ analysis.plot_diffraction_by_mod(filepath=f"./outputs/diff_{basename}.png") # noqa
+ # analysis.plot_diffraction()
+
+ analysis.plot_modules_by_ring(output_folder="/host-home/projects/outputs")
+ # analysis.plot_by(["frame"])
+
+
+def module_distance(module: int):
+ max_dist = 13.5
+
+ distance = np.abs(module - 14)
+ # Normalize so:
+ # distance = 0 → red
+ # distance = max → blue
+ normalised = 1 - (distance / max_dist)
+
+ return normalised
+
+
+def plot_convs(conv: pd.DataFrame, steps):
+ plt.figure(figsize=(16, 10))
+
+ import matplotlib.cm as cm
+
+ cmap = cm.get_cmap("bwr")
+
+ for mod in range(28):
+ if mod in [11]:
+ continue
+
+ normalised = module_distance(mod)
+
+ color = cmap(normalised)
+
+ if mod > 13:
+ line = "--"
+ else:
+ line = "-"
+
+ plt.plot(
+ steps,
+ conv[str(mod)],
+ label=str(mod),
+ linestyle=line,
+ color=color,
+ )
+
+ plt.legend()
+ plt.xlabel("Delta Range of Calibration")
+ plt.ylabel("Calibrated Distance of Module (mm)")
+ plt.savefig("/host-home/projects/outputs/step_cals.png")
+ plt.show()
+ plt.close()
+
+
+if __name__ == "__main__":
+ method = "leastsq"
+
+ for i in range(27):
+ print(i, module_distance(i))
+
+ # quit()
+
+ # step_size = 18
+ # steps = np.arange(0, 90, step_size)
+
+ # distance_file = "./outputs/cal_step_vs_distance.csv"
+
+ # conv = pd.read_csv(distance_file)
+
+ # plot_convs(conv, steps)
+
+ # quit()
+
+ # leastsq: Levenberg-Marquardt (default)
+ # ’least_squares’: Least-Squares minimization, using Trust Region Reflective method
+ # ’differential_evolution’: differential evolution
+ # ’brute’: brute force method
+ # ’basinhopping’: basinhopping
+ # ’ampgo’: Adaptive Memory Programming for Global Optimization
+ # ’nelder’: Nelder-Mead
+ # ’lbfgsb’: L-BFGS-B
+ # ’powell’: Powell
+ # ’cg’: Conjugate-Gradient
+ # ’newton’: Newton-CG
+ # ’cobyla’: Cobyla
+ # ’bfgs’: BFGS
+ # ’tnc’: Truncated Newton
+ # ’trust-ncg’: Newton-CG trust-region
+ # ’trust-krylov’: Newton GLTR trust-region
+ # ’trust-constr’: trust-region for constrained optimization
+ # ’slsqp’: Sequential Linear Squares Programming
+ # ’emcee’: Maximum likelihood via Monte-Carlo Markov Chain
+ # ’shgo’: Simplicial Homology Global Optimization
+ # ’dual_annealing’: Dual Annealing optimization
+
+ # methods = ["leastsq", "least_squares", "differential_evolution", "brute",
+ # "basinhopping", "ampgo", "nelder", "lbfgsb", "powell", "cg", "newton", "cobyla",
+ # "bfgs", "tnc", "trust-ncg", "trust-exact", "trust-krylov","trust-constr",
+ # "slsqp", "shgo", "dual_annealing"]
+
+ wavelength_in_ang = (
+ 0.828783 # 0.828773 # Angstrom - as refined by Eamonn on the MAC
+ )
+
+ # convs = []
+
+ # for step in steps:
+ lower_delta = 0
+ upper_delta = 35
+
+ cal = AngularCalibrateMythen(
+ wavelength_in_ang=wavelength_in_ang,
+ method=method,
+ module_centre=639.5,
+ lower_delta=lower_delta,
+ upper_delta=upper_delta,
+ )
+
+ # module_convs = [
+ # abs(0.05 / cal.results_dict[f"conv_{module}"]) for module in range(28)
+ # ]
+ # convs.append(module_convs)
+
+ # convs = pd.DataFrame(convs)
+
+ # convs.to_csv(distance_file)
+
+ # print(convs)
diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py
new file mode 100644
index 0000000..1a95877
--- /dev/null
+++ b/src/xrpd_toolbox/i11/mythen.py
@@ -0,0 +1,863 @@
+import json
+import math
+import os
+import re
+from collections import OrderedDict
+from collections.abc import Collection, Iterable
+from functools import cached_property
+from pathlib import Path
+from shutil import copy
+from typing import Literal
+
+import h5py
+import matplotlib.pyplot as plt
+import numpy as np
+from h5py import Dataset, File
+from pydantic import Field
+
+from xrpd_toolbox.core import XRPDBaseModel, XYEData
+from xrpd_toolbox.fit_engine.peaks import fit_peaks
+from xrpd_toolbox.fit_engine.profile_calculation import Structure
+from xrpd_toolbox.plotting import DataPlot
+from xrpd_toolbox.utils.messenger import Messenger
+from xrpd_toolbox.utils.mythen_utils import channel_to_angle, modules_to_pixels
+from xrpd_toolbox.utils.utils import (
+ bin_and_propagate_errors,
+ get_calibrant_peaks,
+ get_entry,
+ h5_to_array,
+ load_int_array_from_file,
+ save_data_to_h5,
+)
+
+# np.set_printoptions(threshold=sys.maxsize)
+
+MODULES_IN_DETECTOR = 28
+PIXELS_PER_MODULE = 1280
+PSD_RADIUS = 762 # mm
+MYTHEN_PIXEL_SIZE = 0.05 # mm
+
+PIXEL_NUMBER = np.arange(PIXELS_PER_MODULE, dtype=np.int64)
+
+
+class ModuleConversion(XRPDBaseModel):
+ conv: float
+ offset: float
+ centre: float
+
+ @property
+ def module_sign(self) -> int: # returns -1 or 1 depending on sign of conv
+ return int(math.copysign(1, self.conv))
+
+ @property
+ def distance(self) -> float:
+ """returns the theoretical distance of the module based on the conv"""
+ return abs(MYTHEN_PIXEL_SIZE / self.conv)
+
+ def return_raw_tth(self, zero_offset: float) -> np.ndarray:
+ """this calculated the module raw tth, ie the tth of the detector
+ without taking the delta angle into account"""
+
+ raw_tth = channel_to_angle(
+ pixel_number=PIXEL_NUMBER,
+ centre=self.centre,
+ conv=self.conv,
+ module_offset=self.offset,
+ zero_offset=zero_offset,
+ )
+ return raw_tth
+
+
+# TODO: Make module_n a dict?
+class AngularCalibration(XRPDBaseModel):
+ beamline_offset: float | int
+ module_0: ModuleConversion
+ module_1: ModuleConversion
+ module_2: ModuleConversion
+ module_3: ModuleConversion
+ module_4: ModuleConversion
+ module_5: ModuleConversion
+ module_6: ModuleConversion
+ module_7: ModuleConversion
+ module_8: ModuleConversion
+ module_9: ModuleConversion
+ module_10: ModuleConversion
+ module_11: ModuleConversion
+ module_12: ModuleConversion
+ module_13: ModuleConversion
+ module_14: ModuleConversion
+ module_15: ModuleConversion
+ module_16: ModuleConversion
+ module_17: ModuleConversion
+ module_18: ModuleConversion
+ module_19: ModuleConversion
+ module_20: ModuleConversion
+ module_21: ModuleConversion
+ module_22: ModuleConversion
+ module_23: ModuleConversion
+ module_24: ModuleConversion
+ module_25: ModuleConversion
+ module_26: ModuleConversion
+ module_27: ModuleConversion
+
+
+class MythenSettings(XRPDBaseModel):
+ active_modules: list[int] = list(range(MODULES_IN_DETECTOR))
+ bad_modules: list[int] = []
+ bad_channel_masking: bool = True
+ zero_channel_masking: bool = True
+ flatfield_filepath: str | Path = ""
+ apply_flatfield: bool = False
+ modules_in_flatfield: list[int] = list(range(MODULES_IN_DETECTOR))
+ send_to_ispyb: bool = False
+ rebin_step: float = 0.004
+ default_counter: int = Field(default=0, ge=0, le=3)
+ edge_bad_channels: int = 15
+ error_calc: Literal["poisson", "std_dev", "max"] = "poisson"
+ data_reduction_mode: Literal[
+ "step_scan", "time_resolved", "pump_probe", "flat_field", "bad_pixel"
+ ] = "step_scan"
+ bad_channels_filepath: str | Path = "/dls_sw/i11/software/mythen/badchannels.txt"
+ angcal_filepath: str | Path = ""
+
+
+class BadChannels:
+ def __init__(self, filepath: str | Path):
+ self.filepath = filepath
+ self.array = self.load_bad_channels()
+ self.masks = self.bad_channels_to_mask()
+
+ def load_bad_channels(self):
+ if not self.filepath:
+ raise ValueError("Bad channels file path is not set.")
+ self.bad_channels = load_int_array_from_file(self.filepath)
+ return self.bad_channels
+
+ def _split_bad_channels_into_modules(self, bad_channels: np.ndarray):
+ """Takes a long array eg. 0, 1, 67, 1285, 7655, 32000
+ turns it into 28 arrays, [0, 1, 67], ... [1285], ... [7655], ...[32000]
+ """
+
+ bins = np.arange(
+ 0, MODULES_IN_DETECTOR * PIXELS_PER_MODULE + 1, PIXELS_PER_MODULE
+ )
+ indices = (
+ np.digitize(bad_channels, bins) - 1
+ ) # subtract 1 because digitize returns 1-based
+
+ detector_bad_channels_per_module = [
+ bad_channels[indices == i] for i in range(MODULES_IN_DETECTOR)
+ ]
+
+ return detector_bad_channels_per_module
+
+ def bad_channels_to_mask(self) -> OrderedDict:
+ """PyFAI considers masks with values equal to zero 0 as valid pixels (mnemonic:
+ non zero pixels are masked out) - Therefore we keep the convention here
+ https://pyfai.readthedocs.io/en/latest/conventions.html
+
+ Takes the long araay of numbers and convert, used by the SLSDet Package
+ and converts it to a module by module mask
+ """
+
+ bad_channel_mask = OrderedDict()
+
+ bad_channels_per_module = self._split_bad_channels_into_modules(
+ self.bad_channels
+ )
+
+ module_bad_channels = [
+ bad_channels_per_module[f] - (PIXELS_PER_MODULE * f)
+ for f in range(MODULES_IN_DETECTOR)
+ ]
+
+ for module in range(MODULES_IN_DETECTOR):
+ mask = np.zeros(PIXELS_PER_MODULE, dtype=bool)
+ mask[module_bad_channels[module]] = True
+ bad_channel_mask[module] = mask
+
+ return bad_channel_mask # bad channels are denoted by 1
+
+
+class MythenDataLoader:
+ def __init__(
+ self,
+ filepath: str | Path,
+ counter: int = 0,
+ mythen_data_path="mythen_nx",
+ frames: int | slice | Collection[int] = slice(None),
+ modules: int | slice | Collection[int] = slice(None),
+ ):
+ self.filepath = Path(filepath)
+ self.frames = frames
+ self.modules = modules
+ self.counter = counter
+ self.mythen_data_path = mythen_data_path
+
+ self.entry = get_entry(self.filepath)
+ self.dataset_path = f"/{self.entry}/{self.mythen_data_path}/data"
+ self.n_modules_in_data, self.n_frames = self.read_nxs_metadata()
+
+ if self.frames == slice(None) and self.modules == slice(None):
+ self.data, self.module_data = self.load()
+ else:
+ self.data = self.get_data(modules=self.modules, frame=self.frames)
+
+ def load(self):
+ self.data = self.load_all_data(self.counter)
+ self.module_data = np.array_split(self.data, self.n_modules_in_data, axis=-1)
+
+ return self.data, self.module_data
+
+ @property
+ def pixels_per_module(self):
+ return PIXELS_PER_MODULE
+
+ def get_data(
+ self,
+ modules: int | Collection[int] | slice,
+ frame: int | Collection[int] | slice,
+ counter: int = 0,
+ ):
+ if isinstance(modules, int) or isinstance(modules, Collection):
+ pixels = modules_to_pixels(modules=modules)
+ else:
+ pixels = modules
+
+ with File(self.filepath, "r") as file:
+ if self.dataset_path not in file:
+ raise ValueError(
+ f"Dataset path {self.dataset_path} not found in HDF5 file."
+ )
+
+ data = file.get(self.dataset_path)
+
+ if (data is not None) and isinstance(data, Dataset):
+ if data.ndim < 1:
+ raise ValueError("Data has insufficient dimensions.")
+ module_frame_data = data[frame, pixels, counter]
+
+ return np.asarray(module_frame_data)
+ else:
+ raise ValueError(
+ f"Data at {self.dataset_path} in {self.filepath}is None."
+ )
+
+ @cached_property
+ def delta_path(self) -> str:
+ delta_subpaths = ("delta", "deltas", "ds")
+
+ with h5py.File(self.filepath, "r") as file:
+ base = f"/{self.entry}/{self.mythen_data_path}"
+
+ for name in delta_subpaths:
+ path = f"{base}/{name}"
+ if path in file and isinstance(file[path], h5py.Dataset):
+ return path
+
+ raise KeyError(
+ f"No delta dataset found. Tried: "
+ f"{', '.join(f'{base}/{n}' for n in delta_subpaths)}"
+ )
+
+ @cached_property
+ def count_time_path(self) -> str:
+ return f"/{self.entry}/instrument/{self.mythen_data_path}/count_time"
+
+ @cached_property
+ def positions(self) -> np.ndarray:
+ try:
+ deltas = h5_to_array(self.filepath, self.delta_path)
+ return deltas
+ except ValueError as e:
+ print(f"{e} - {self.delta_path} in data - returning 0")
+ deltas = np.array([0])
+ return deltas
+
+ @cached_property
+ def durations(self) -> np.ndarray:
+ return h5_to_array(self.filepath, self.count_time_path)
+
+ def read_nxs_metadata(self) -> tuple[int, int]:
+ with h5py.File(self.filepath, "r") as file:
+ data = file.get(self.dataset_path)
+ if (data is not None) and isinstance(data, Dataset):
+ first_frame = data[0, :, self.counter]
+ first_frame_len = first_frame.shape[-1]
+ n_modules_in_data = int(first_frame_len / self.pixels_per_module)
+ n_frames = len(data)
+ return n_modules_in_data, n_frames
+ else:
+ raise ValueError(f"Data is None at {self.dataset_path}")
+
+ def load_all_data(self, counter: int) -> np.ndarray:
+ return self.get_data(slice(None), slice(None), counter)
+
+
+class MythenModule:
+ def __init__(
+ self,
+ data: np.ndarray,
+ conversion: ModuleConversion,
+ beamline_offset: float,
+ module_id: int,
+ positions: np.ndarray,
+ durations: np.ndarray | None = None,
+ bad_channel_mask: np.ndarray | None = None,
+ ):
+ self.data = data
+ self.conversion = conversion
+ self.beamline_offset = beamline_offset
+ self.positions = positions
+ self.module_id = module_id
+
+ if bad_channel_mask is None:
+ self.bad_channel_mask = np.zeros(self.data.shape[-1], dtype=bool)
+ else:
+ self.bad_channel_mask = bad_channel_mask
+
+ if durations is None:
+ self.durations = np.ones(self.data.shape[-1], dtype=bool)
+ else:
+ self.durations = durations
+
+ # @cached_property
+ # def pixel_number(self) -> np.ndarray:
+ # """returns a 1d array of integers between 0 and 1280"""
+ # return PIXEL_NUMBER
+
+ @cached_property
+ def raw_tth(self) -> np.ndarray:
+ """this calculated the module raw tth, ie the tth of the detector
+ without taking the delta angle into account"""
+
+ raw_tth = self.conversion.return_raw_tth(self.beamline_offset)
+
+ return raw_tth
+
+ @cached_property
+ def positions_2d(self):
+ print(len(self.positions))
+ positions_2d = np.broadcast_to(self.positions, self.data.shape)
+ return positions_2d
+
+ @cached_property
+ def duration_2d(self):
+ duration_2d = np.broadcast_to(self.durations[:, np.newaxis], self.data.shape)
+ return duration_2d
+
+ @cached_property
+ def tth_2d(self) -> np.ndarray:
+ """Creates an array with the same shape as the data,
+ with the tth values at the corresponding indexes"""
+
+ tth_2d = np.broadcast_to(self.raw_tth, self.data.shape)
+ tth_2d = tth_2d + self.positions[:, None]
+ return tth_2d
+
+ @cached_property
+ def mask_2d(self) -> np.ndarray:
+ """Creates an array with the same shape as the data,
+ with the tth values at the corresponding indexes"""
+
+ mask_2d = np.broadcast_to(self.bad_channel_mask, self.data.shape)
+ return mask_2d
+
+ @cached_property
+ def unmasked_counts(self) -> np.ndarray:
+ return self.data.flatten()
+
+ @cached_property
+ def unmasked_duration(self) -> np.ndarray:
+ return self.duration_2d.flatten()
+
+ @cached_property
+ def unmasked_tth(self) -> np.ndarray:
+ return self.tth_2d.flatten()
+
+ @cached_property
+ def unmasked_error(self) -> np.ndarray:
+ return np.sqrt(self.unmasked_counts)
+
+ @cached_property
+ def counts(self) -> np.ndarray:
+ masked_counts = self.data[:, ~self.bad_channel_mask]
+ return masked_counts.flatten()
+
+ @cached_property
+ def duration(self) -> np.ndarray:
+ duration = self.duration_2d[:, ~self.bad_channel_mask]
+ return duration.flatten()
+
+ @cached_property
+ def tth(self) -> np.ndarray:
+ masked_tth = self.tth_2d[:, ~self.bad_channel_mask]
+ return masked_tth.flatten()
+
+ @cached_property
+ def error(self) -> np.ndarray:
+ return np.sqrt(self.counts)
+
+
+class MythenDetector:
+ def __init__(
+ self,
+ filepath: str | Path,
+ angular_calibration: AngularCalibration | None = None,
+ settings: MythenSettings | None = None,
+ xye_filepath_out: str | Path | None = None,
+ output_directory: str | Path | None = None,
+ filename_suffix: str = "",
+ ):
+ self.filepath = filepath
+ self.filename_suffix = filename_suffix
+
+ if str(self.filepath) == "dev":
+ pass
+ elif not str(self.filepath).lower().endswith(".nxs"):
+ raise ValueError(f"{self.filepath} should be a Nexus File!!")
+ elif not os.path.exists(self.filepath):
+ raise ValueError(f"{self.filepath} does not exist!!")
+
+ self.file_dir = os.path.dirname(str(self.filepath))
+ self.filename = os.path.basename(str(self.filepath))
+
+ self.output_directory = output_directory or os.path.join(
+ str(self.file_dir), "processed"
+ )
+
+ if not os.path.exists(self.output_directory):
+ os.makedirs(self.output_directory)
+
+ self.processed_nexus_filepath = os.path.join(
+ str(self.output_directory),
+ f"{Path(self.filename).stem}_reduced_mythen3{self.filename_suffix}.nxs",
+ )
+
+ self.xye_filepath_out = xye_filepath_out or os.path.join(
+ self.file_dir,
+ f"{self.filename}_summed_mythen3{self.filename_suffix}.xye",
+ )
+
+ self.settings = settings or MythenSettings()
+ self.calibration = angular_calibration or AngularCalibration.load(
+ self.settings.angcal_filepath
+ )
+
+ self.active_modules: list[int] = self.settings.active_modules
+ self.bad_modules: list[int] = self.settings.bad_modules
+ self.good_modules: list[int] = list(
+ set(self.active_modules) ^ set(self.bad_modules)
+ )
+ self.ring1_modules: list[int] = list(range(0, 14))
+ self.ring2_modules: list[int] = list(range(14, 28))
+
+ self.active_ring1_modules: list[int] = list(
+ set(self.active_modules) ^ set(self.ring2_modules)
+ )
+ self.active_ring2_modules: list[int] = list(
+ set(self.active_modules) ^ set(self.ring1_modules)
+ )
+
+ self.bad_channels = BadChannels(self.settings.bad_channels_filepath)
+
+ # mythen data loader, just loads the data,
+ # it has no information about which modules are which
+
+ self.mythen_data = MythenDataLoader(
+ filepath=filepath,
+ )
+
+ self.contruct_modules()
+
+ def _make_mythen_module_kwargs(self, n_module, nth_active_module):
+ """MythenModule requires quite a lot of info,
+ so it's easier to make a contructor of it's kwargs"""
+
+ these_frames = slice(None, None, 2)
+
+ return {
+ "data": self.mythen_data.module_data[n_module][these_frames],
+ "conversion": self.calibration[f"module_{nth_active_module}"],
+ "beamline_offset": self.calibration.beamline_offset,
+ "module_id": nth_active_module,
+ "positions": self.mythen_data.positions[these_frames],
+ "durations": self.mythen_data.durations[these_frames],
+ "bad_channel_mask": self.bad_channels.masks[nth_active_module],
+ }
+
+ def get_module(self, mod: int) -> MythenModule:
+ return self.modules[mod]
+
+ def contruct_modules(self):
+ self.modules = OrderedDict()
+
+ for n_module, nth_active_module in enumerate(self.settings.active_modules):
+ module = MythenModule(
+ **self._make_mythen_module_kwargs(n_module, nth_active_module)
+ )
+
+ self.modules[nth_active_module] = module
+
+ def generate_xye(
+ self, modules: Iterable[int], masked: bool = True
+ ) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
+ if masked:
+ module_tth_list = [self.get_module(f).tth for f in modules]
+ module_counts_list = [self.get_module(f).counts for f in modules]
+ module_errors_list = [self.get_module(f).error for f in modules]
+ else:
+ module_tth_list = [self.get_module(f).unmasked_tth for f in modules]
+ module_counts_list = [self.get_module(f).unmasked_counts for f in modules]
+ module_errors_list = [self.get_module(f).unmasked_error for f in modules]
+
+ unsorted_tth = np.concatenate(module_tth_list)
+ unsorted_counts = np.concatenate(module_counts_list)
+ unsorted_error = np.concatenate(module_errors_list)
+
+ sort_indexes = np.argsort(unsorted_tth)
+
+ tth = unsorted_tth[sort_indexes]
+ counts = unsorted_counts[sort_indexes]
+ error = unsorted_error[sort_indexes]
+
+ return tth, counts, error
+
+ def generate_binned_xye(
+ self,
+ masked: bool = True,
+ rebin_step: float = 0.004,
+ error_calc: str = "poisson",
+ normalise: bool = True,
+ ) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """
+ Returns the final dataset that you would use to generate a xye file,
+ binned and all
+ """
+
+ tth, counts, error = self.generate_xye(modules=self.good_modules, masked=masked)
+
+ # TODO: Should count times really be in MythenModule and then recreated this way
+ # - seems like extra wasteful computation?
+
+ if normalise:
+ module_duration_list = [
+ self.get_module(f).duration for f in self.good_modules
+ ]
+ durations = np.concatenate(module_duration_list)
+ counts = counts / durations
+
+ binned_tth, binned_counts, binned_error = bin_and_propagate_errors(
+ tth,
+ counts,
+ error,
+ rebin_step=rebin_step,
+ error_calc=error_calc,
+ )
+
+ return binned_tth, binned_counts, binned_error
+
+ def communicate_with_control(self, send_to_ispyb: bool = False):
+ """
+ Attempts to connect to i11-control and send a message indicating
+ that a file has been processed. This will cause gda to plot the latest file
+
+ Also may send xye to ispyb so that users can lookup data
+
+ """
+
+ daq = Messenger(host="i11-control")
+ daq.connect()
+ daq.send_file(str(self.xye_filepath_out)) # sends message to GDA
+
+ if send_to_ispyb:
+ daq.send_to_ispyb(
+ str(self.filepath), str(self.xye_filepath_out)
+ ) # sends to ispyb
+
+ def process_step_scan(self):
+ """Analyses the data using the settings provided by the MythenSettings class
+ Takes all of the data from each module and each step of the multistep scan
+ and calculates the tth for each delta position, orders them, concatenates
+ and puts them into a single array. Bins it, and saves it to xye/nexus file"""
+
+ self.binned_tth, self.binned_counts, self.binned_error = (
+ self.generate_binned_xye(
+ masked=self.settings.bad_channel_masking,
+ rebin_step=self.settings.rebin_step,
+ error_calc=self.settings.error_calc,
+ )
+ )
+
+ self.xye_data = XYEData(
+ x=self.binned_tth, y=self.binned_counts, e=self.binned_error
+ )
+ self.xye_data.save_to_xye(self.xye_filepath_out)
+
+ xye_names_and_data = {
+ "tth": self.binned_tth,
+ "counts": self.binned_counts,
+ "error": self.binned_error,
+ }
+
+ self.save_data_to_nexus(subpath="/xye", names_and_data=xye_names_and_data)
+
+ ring1_data, ring2_data = self.get_ring1_ring2_data()
+ self.save_data_to_nexus(subpath="/ring1", names_and_data={"data": ring1_data})
+ self.save_data_to_nexus(subpath="/ring1", names_and_data={"data": ring2_data})
+
+ print(f"Data saved to: {self.processed_nexus_filepath}")
+
+ self.data_plot = DataPlot(data=self.xye_data, title=self.filename)
+ self.data_plot.plot()
+
+ try:
+ self.communicate_with_control(send_to_ispyb=self.settings.send_to_ispyb)
+ self.data_plot = DataPlot(data=self.xye_data, title=self.filename)
+ except Exception as e:
+ print(f"Could not connect with control - {e}")
+ pass
+
+ def get_ring1_ring2_data(self):
+ first_ring_pixels = len(self.active_ring1_modules) * PIXELS_PER_MODULE
+ ring1_data = self.mythen_data.get_data(slice(0, first_ring_pixels), slice(None))
+ ring2_data = self.mythen_data.get_data(
+ slice(first_ring_pixels, None), slice(None)
+ )
+
+ return ring1_data, ring2_data
+
+ def save_data_to_nexus(
+ self, subpath: str, names_and_data: dict[str, np.ndarray], **kwargs
+ ):
+ copy(self.filepath, self.processed_nexus_filepath)
+
+ for name, data in names_and_data.items():
+ save_data_to_h5(
+ self.filepath,
+ f"{self.mythen_data.entry}{subpath}/{name}",
+ data,
+ **kwargs,
+ )
+
+ def process_pump_probe(self):
+ pass
+
+ def process_time_resolved(self):
+ pass
+
+ def simulate_data(self, calibrant_name: str):
+ pass
+
+ def plot_diffraction(
+ self, filepath: str | Path | None = None, calibrant: str | None = None
+ ):
+ plt.figure(figsize=(10, 7))
+
+ zero_offset = -0.01
+
+ tth, counts, error = self.generate_binned_xye(
+ masked=self.settings.bad_channel_masking,
+ rebin_step=self.settings.rebin_step,
+ error_calc=self.settings.error_calc,
+ )
+
+ if calibrant is not None:
+ # si_tth = get_calibrant_peaks("Si", 0.828783)
+
+ si = Structure.load_from_cif("/workspaces/XRPD-Toolbox/cifs/si.cif")
+ _, _, si_tth, si_intensity = si.calculate_reflections(0.828783)
+
+ background = np.amin(counts)
+
+ phase_scale = (np.amax(counts) - background) / np.amax(si_intensity)
+
+ print(phase_scale)
+
+ for t, i in zip(si_tth, si_intensity, strict=True):
+ print(t, i)
+
+ si_intensity = phase_scale * si_intensity + background
+
+ plt.scatter(
+ si_tth + zero_offset,
+ si_intensity,
+ label="calibrant positions",
+ color="red",
+ )
+
+ plt.errorbar(tth, counts, error, label="data")
+ plt.legend(ncols=2)
+ plt.xlabel("tth")
+ plt.ylabel("Intensity (arb. units)")
+
+ if filepath:
+ plt.savefig(filepath)
+
+ plt.show()
+ plt.close()
+
+ return tth, counts, error
+
+ def plot_diffraction_by_mod(self, filepath: str | Path | None = None):
+ plt.figure(figsize=(10, 7))
+
+ print(self.good_modules)
+
+ for module in self.good_modules:
+ print(module)
+ sort_index = np.argsort(self.modules[module].tth)
+ tth = (self.modules[module].tth)[sort_index]
+ counts = (self.modules[module].counts)[sort_index]
+
+ plt.plot(
+ tth,
+ counts,
+ label=str(self.modules[module].module_id),
+ )
+ # plt.text(
+ # np.mean(tth),
+ # np.amin(counts),
+ # str(self.modules[module].module_id),
+ # ) # type: ignore
+
+ plt.xlabel("tth")
+ plt.ylabel("Intensity (arb. units)")
+ plt.legend(ncols=2)
+
+ if filepath:
+ plt.savefig(filepath)
+
+ plt.show()
+ plt.close()
+
+
+def convert_angcal_to_pydantic_json(
+ ang_cal_json_path: str | Path, new_path: str | Path
+):
+ pydantic_dict = {}
+
+ with open(ang_cal_json_path, "rb") as file:
+ legacy_dict = json.load(file)
+
+ pydantic_dict["beamline_offset"] = legacy_dict["beamline_offset"]
+ pydantic_dict["centre"] = legacy_dict["centre"]
+
+ for entry in legacy_dict.keys():
+ numbers = re.findall(r"-?\d*\.?\d+", str(entry))
+
+ if len(numbers) > 0:
+ module = numbers[0]
+ pydantic_dict[f"module_{module}"] = {
+ "conv": legacy_dict[f"conv_{module}"],
+ "offset": legacy_dict[f"offset_{module}"],
+ }
+
+ pydantic_model = AngularCalibration(**pydantic_dict)
+ pydantic_model.save_to_json(new_path)
+
+
+def convert_angcal_to_new_pydantic_json(
+ ang_cal_json_path: str | Path, new_path: str | Path
+):
+ pydantic_dict = {}
+ module_conv_list = []
+
+ with open(ang_cal_json_path, "rb") as file:
+ legacy_dict = json.load(file)
+
+ for entry in legacy_dict.keys():
+ numbers = re.findall(r"-?\d*\.?\d+", str(entry))
+
+ if len(numbers) > 0:
+ module = numbers[0]
+ module_conv_list.append(
+ {
+ "name": f"module_{module}",
+ "conv": legacy_dict[f"conv_{module}"],
+ "beamline_offset": legacy_dict[f"conv_{module}"],
+ "centre": legacy_dict["beamline_offset"],
+ "offset": legacy_dict["centre"],
+ }
+ )
+
+ pydantic_dict["modules"] = module_conv_list
+ pydantic_model = AngularCalibration(**pydantic_dict)
+ pydantic_model.save_to_json(new_path)
+
+
+if __name__ == "__main__":
+ PARENT_PATH = Path(__file__).parent.parent
+
+ print(PARENT_PATH)
+
+ CONFIG_FILE = "/workspaces/XRPD-Toolbox/config/i11/mythen3_reduction_config.toml"
+
+ DATA_FILE = "//host-home/projects/outputs/step_scan/1410289.nxs"
+
+ ANG_CAL = "/host-home/projects/outputs/mythen_calibration/processed/ang_cal_020426_cen_639.5_leastsq_[11, 17, 27]_new.json" # noqa
+
+ settings = MythenSettings.load_from_toml(CONFIG_FILE)
+ # settings.bad_modules = list(range(27))
+ print("Loaded settings:", settings)
+
+ # print(DATA_FILE)
+
+ # MythenDataLoader(DATA_FILE)
+
+ BAD_CHAN_FILE = "/workspaces/XRPD-Toolbox/config/i11/bad_channels.txt"
+
+ angular_calibration = AngularCalibration.load_from_json(ANG_CAL)
+ # angular_calibration.beamline_offset = -0.4979739
+
+ settings.bad_channels_filepath = BAD_CHAN_FILE
+
+ # DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1414223.nxs"
+ DATA_FILE = "/host-home/projects/outputs/angular_calibration/1410289.nxs"
+
+ mythen3 = MythenDetector(
+ filepath=DATA_FILE,
+ settings=settings,
+ angular_calibration=angular_calibration,
+ )
+
+ tth, counts, error = mythen3.plot_diffraction(
+ filepath="/host-home/projects/outputs/diff.png", calibrant="Si"
+ )
+
+ # mythen3.plot_diffraction_by_mod()
+
+ quit()
+
+ active_modules = list(range(28))
+
+ for module in range(28):
+ module_name = f"module_{module}"
+ bad_modules = [f for f in active_modules if f != module]
+ settings.bad_modules = bad_modules
+
+ mythen3 = MythenDetector(
+ filepath=DATA_FILE,
+ settings=settings,
+ angular_calibration=angular_calibration,
+ )
+
+ tth, counts, error = mythen3.plot_diffraction(
+ filepath="/host-home/projects/outputs/peak_fits.png", calibrant="Si"
+ )
+
+ si_tth = get_calibrant_peaks("Si", wavelength_in_ang=0.828783)
+ peaks = fit_peaks(tth, counts, si_tth)
+
+ centres, amps, fwhms = map(
+ list, zip(*[(p.centre, p.amplitude, p.fwhm) for p in peaks], strict=True)
+ )
+
+ plt.plot(si_tth, centres - si_tth)
+ plt.ylabel("Fit Peak - Calc Peak (deg)")
+ plt.xlabel("tth of peak (deg)")
+ plt.savefig(f"/host-home/projects/outputs/peak_error_module_{module}.png")
+ plt.show()
+
+ # mythen3.plot_diffraction_by_mod()
+ # print(mythen3.counts_times)
diff --git a/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py b/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py
new file mode 100644
index 0000000..bc557cb
--- /dev/null
+++ b/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py
@@ -0,0 +1,2247 @@
+# type: ignore
+import argparse
+import os
+import sys
+from itertools import product
+from pathlib import Path
+from shutil import copy, copy2
+from tomllib import load
+
+import matplotlib
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+from h5py import File as h5pyFile
+from matplotlib.gridspec import GridSpec
+
+from xrpd_toolbox.utils.messenger import Messenger
+from xrpd_toolbox.utils.mythen_utils import paired_modules
+from xrpd_toolbox.utils.unit_conversion import tth_to_q
+from xrpd_toolbox.utils.utils import AnalysisLogger, load_int_array_from_file
+
+matplotlib.use("Qt5Agg") # or TkAgg
+
+
+np.seterr(
+ divide="ignore", invalid="ignore"
+) # dividing by zero throws a warning, this is expected due to some pixels being dead
+
+
+pd.set_option("display.max_columns", None)
+pd.set_option("display.max_rows", None)
+pd.set_option("display.width", 1000)
+np.set_printoptions(threshold=sys.maxsize)
+
+
+class I11Reduction:
+ __slots__ = (
+ "filepath",
+ "reduced_nxs_filepath_out",
+ "xye_filepath_out",
+ "xye_filepath_out_q",
+ "file_dir",
+ "out_directory",
+ "file_name",
+ "file_extension",
+ "filename_suffix",
+ "config_filepath",
+ "STRIPS_PER_MODULE",
+ "MODULES_PER_DETECTOR",
+ "config",
+ "mythen3_config_dir",
+ "flatfield_filepath",
+ "apply_flatfield",
+ "active_modules",
+ "bad_modules",
+ "bad_frames",
+ "bad_channel_masking",
+ "default_counter",
+ "n_bad_edge_channels",
+ "rebin_step",
+ "error_calc",
+ "beam_energy",
+ "beamline_offset",
+ "save_nxs_out",
+ "verbose_nxs",
+ "debug_mode",
+ "save_in_q_space",
+ "data_reduction_mode",
+ "wavelength",
+ "raw_flatfield_counts",
+ "flatfield_modules",
+ "bad_channels",
+ "module_angular_cal",
+ "module_raw_tth",
+ "deltas",
+ "duration",
+ "n_frames",
+ "wholedetector_raw_frames",
+ "raw_frame_counts",
+ "frames_range",
+ "all_module_data",
+ "angular_corrected_data",
+ "module_raw_data",
+ "xyedata",
+ "frame_data",
+ "angular_corrected_data_unmasked",
+ "out_raw_data",
+ "n_modules_in_data",
+ "good_modules",
+ "Ie",
+ "Ic4",
+ "whole_data_raw_tth",
+ "beam_intensity",
+ "ffcorr",
+ "bad_channels_filepath",
+ "modules_in_flatfield",
+ "angcal_filepath",
+ "live",
+ "send_to_ispyb",
+ "execute_reduction",
+ "logger",
+ "logging",
+ )
+
+ @staticmethod
+ def read_singular_angcal_files(angcal_filepath: str) -> dict:
+ """
+
+ Reads a single of ang.off files and returns a dict with the
+ each modules anngular calibrations contains within a dict
+
+ each module dict contains "offset", "conv" and "centre"
+
+ eg. self.module_angular_cal[module]["offset"]
+
+ """
+
+ module_angular_cal = {}
+ beamline_offset = None
+
+ with open(angcal_filepath) as f:
+ for line in f:
+ if "beamline_offset" in line:
+ elements = line.split()
+ beamline_offset = float(elements[1])
+
+ elif line := line.strip():
+ elements = line.split()
+ module_cal = {}
+
+ (
+ module_in_file,
+ module_cal["offset"],
+ module_cal["conv"],
+ module_cal["centre"],
+ ) = (
+ int(elements[1]),
+ float(elements[3]),
+ float(elements[5]),
+ float(elements[7]),
+ )
+
+ module_angular_cal[module_in_file] = module_cal
+
+ return module_angular_cal, beamline_offset
+
+ @staticmethod
+ def read_angular_calibration_and_create_cal_dict(
+ config: dict, active_modules: list[int]
+ ) -> dict:
+ """
+
+ Reads a load of ang_d .off files and returns a dict with
+ the each modules anngular calibrations contains within a dict
+
+ each module dict contains "offset", "conv" and "centre"
+
+ eg. self.module_angular_cal[module]["offset"]
+
+ """
+
+ print(config)
+
+ module_angular_cal = {}
+
+ for active_mod in active_modules:
+ single_cal_file = config["".join(["module_", str(active_mod)])][
+ "angular_calibration_path"
+ ]
+
+ with open(single_cal_file) as f:
+ module_cal = {}
+ for line in f:
+ if "beamline_offset" in line:
+ elements = line.split()
+ beamline_offset = float(elements[1])
+
+ elif line := line.strip():
+ elements = line.split()
+ (
+ module_in_file, # noqa
+ module_cal["offset"],
+ module_cal["conv"],
+ module_cal["centre"],
+ ) = (
+ int(elements[1]),
+ float(elements[3]),
+ float(elements[5]),
+ float(elements[7]),
+ )
+
+ module_angular_cal[active_mod] = module_cal
+
+ return module_angular_cal, beamline_offset
+
+ @staticmethod
+ def channel_to_angle(module_pixel_number, centre, conv, offset, beamline_offset):
+ module_conversions = module_pixel_number - centre
+ module_conversions = module_conversions * conv
+ module_conversions = np.arctan(module_conversions)
+ raw_tth = offset + np.rad2deg(module_conversions) + beamline_offset
+
+ return raw_tth
+
+ @staticmethod
+ def channel_to_angle_in_real_units(
+ module_pixel_number,
+ centre,
+ offset,
+ beamline_offset,
+ radius,
+ p=0.05,
+ direction=1,
+ ):
+ """
+ module_pixel_number: channel number, 0-1280
+ centre: centre (in pixel number - ie 1280/2)
+ offset: module offset, degrees
+ radius: radius, mm - approx 760
+ direction: 1 or -1 depending if module is flipped or not
+ p: pixel size, mm = 0.05
+ """
+
+ raw_tth = I11Reduction.channel_to_angle(
+ module_pixel_number, centre, (p / radius), offset, beamline_offset
+ )
+
+ return raw_tth
+
+ def calculate_modules_tth(self):
+ """
+ Given a set of calibration parameters, return a numpy array
+ describing the angle, in degrees, of each pixel in that module
+
+ Ref:
+ section 1.1 of "Angular conversion 1-D" by A. Cervellino (ANGCONV_2024.pdf).
+ beamline_offset
+ file:///home/akz63626/Downloads/ANGCONV_2024.pdf
+
+ """
+
+ module_raw_tth = {}
+ module_pixel_number = np.arange(self.STRIPS_PER_MODULE, dtype=np.int64)
+ module_raw_tth["mod_channel"] = module_pixel_number
+
+ for n_mod in self.active_modules:
+ # cm = self.module_angular_cal[n_mod]["centre"]
+ # km = self.module_angular_cal[n_mod]["conv"]
+ # om = self.module_angular_cal[n_mod]["offset"]
+ # sm = +1/-1 # this is already included in the km in the ang.off files
+
+ raw_tth = I11Reduction.channel_to_angle(
+ module_pixel_number,
+ self.module_angular_cal[n_mod]["centre"],
+ self.module_angular_cal[n_mod]["conv"],
+ self.module_angular_cal[n_mod]["offset"],
+ self.beamline_offset,
+ )
+
+ module_raw_tth[n_mod] = (
+ raw_tth # this is raw because it doesn't take into account the delta
+ )
+
+ whole_data_raw_tth = np.array(
+ [module_raw_tth[f] for f in self.active_modules]
+ ).flatten()
+
+ return module_raw_tth, whole_data_raw_tth
+
+ def generate_badchannel_dict(self) -> dict:
+ """
+
+ loads the bad channels specified with the bad_channels_path
+ which are specified in the .toml config file.
+
+ Creates a dictionary of bad channels so that they can be
+ accessed self.bad_channels[n] where n is 0-27
+
+ """
+
+ bad_channels = {}
+
+ self.logger.log("Using the following bad channels files:")
+ for active_mod in self.active_modules:
+ badchan_file = self.config["".join(["module_", str(active_mod)])][
+ "bad_channels_path"
+ ]
+ bad_channels[active_mod] = load_int_array_from_file(badchan_file)
+ self.logger.log(
+ f"Module: {active_mod} badchan_file | Bad Chans: {len(bad_channels[active_mod])}" # noqa
+ )
+
+ self.logger.log("\n")
+ return bad_channels
+
+ @staticmethod
+ def read_config(mythen3_config_dir):
+ """
+ reads the config file and works out what modules are currently active
+
+ """
+
+ enabled_modules_hostnames = None
+
+ with open(mythen3_config_dir) as file:
+ lines = [line.rstrip() for line in file]
+
+ for _, line in enumerate(lines):
+ if line.startswith("hostname"):
+ enabled_modules_hostnames = line.split()[1::]
+
+ enabled_modules = [
+ int(n_mod.rstrip()[-3::]) - 100 for n_mod in enabled_modules_hostnames
+ ]
+
+ return enabled_modules
+
+ def apply_flatfield_correction(
+ self, no_ff_corr: np.ndarray, flatfield_counts: np.ndarray
+ ) -> np.ndarray:
+ """
+ Divide raw counts by flatfield counts to get scaled counts.
+ Where the flatfield counts are zero, return zero. Then rescale
+ by the mean value of flatfield counts to get back to a unit of
+ counts.
+
+ This MUST be scaled on the whole detector not on a module/module
+ basis otherwise counts will be thrown off massively by bad
+ modules/channels and the module will scale incorrectly!!!
+ """
+
+ scaled_counts = np.divide(
+ no_ff_corr,
+ flatfield_counts,
+ where=flatfield_counts != 0,
+ out=np.zeros(no_ff_corr.shape),
+ )
+
+ # self.logger.log(np.mean(flatfield_counts))
+
+ return scaled_counts
+
+ def read_nxs_metadata(self, filepath: str):
+ with h5pyFile(filepath, "r") as file:
+ try:
+ entry = file["entry"]
+ except Exception:
+ entry = file["entry1"]
+
+ if "ds" in list(entry["mythen_nx"].keys()):
+ dummy_array = entry["mythen_nx"]["ds"][()]
+ self.deltas = [dummy_array[0]] * len(dummy_array)
+
+ elif "delta" in list(entry["mythen_nx"].keys()):
+ self.deltas = entry["mythen_nx"]["delta"][()]
+
+ elif "deltas" in list(entry["mythen_nx"].keys()):
+ self.deltas = entry["mythen_nx"]["deltas"][()]
+
+ self.n_frames = len(entry["mythen_nx"]["data"])
+ first_frame_len = len(
+ entry["mythen_nx"]["data"][0, :, self.default_counter][()]
+ )
+ self.n_modules_in_data = int(first_frame_len / self.STRIPS_PER_MODULE)
+
+ self.Ie = np.full(self.n_frames, 1)
+ try:
+ self.Ie = entry["Ie"]["data"][()]
+ except Exception:
+ try:
+ self.Ie = entry["mythen_nx"]["Ie"][()]
+ except Exception:
+ pass
+
+ self.Ic4 = np.full(self.n_frames, 1)
+ try:
+ self.Ic4 = entry["Ic4"]["data"][()]
+ except Exception:
+ try:
+ self.Ic4 = entry["mythen_nx"]["Ic4"][()]
+ except Exception:
+ pass
+
+ self.beam_intensity = (self.Ic4 + self.Ie) / 2
+
+ return self.n_frames, self.deltas, self.n_modules_in_data
+
+ def read_nxs_data(
+ self,
+ filepath: str,
+ frame: int | None = None,
+ sum_frames: bool = False,
+ bad_frames=(),
+ ) -> dict:
+ """
+ Note: [()] causes data to be copied to a numpy array
+ rather than just referencing
+ a h5py dataset (which goes out of scope after the context manager exits)
+ Axes at this level are:
+ x_dim: always 1
+ y_dim: channelS_PER_MODULE * NUM_MODULES
+ counters: (always 3 counters).
+
+ Reading nxs files is pretty fast - not really a bottleneck
+
+ """
+
+ with h5pyFile(filepath, "r") as file:
+ try:
+ entry = file["entry"]
+ except Exception:
+ entry = file["entry1"]
+
+ normalised_beam_intensity = self.beam_intensity / np.median(
+ self.beam_intensity
+ )
+
+ if (frame is not None) and (sum_frames is False):
+ # for when we want to only read a specific frame - ie time resolved
+
+ self.wholedetector_raw_frames = entry["mythen_nx"]["data"][
+ frame, :, self.default_counter
+ ][()] # [n, 17920, 3] where n is the number of frames, 3 = 3 counters
+ self.wholedetector_raw_frames = (
+ self.wholedetector_raw_frames / normalised_beam_intensity[frame]
+ )
+
+ self.raw_frame_counts = {}
+ self.raw_frame_counts[frame] = self.wholedetector_raw_frames
+ self.logger.log(
+ f"Frame: {frame + 1}/{self.n_frames} | Delta: {self.deltas[frame]}"
+ )
+
+ elif (frame is None) and (sum_frames is True):
+ # we want to read all frames and then sum them, ie pump-probe mode
+ self.wholedetector_raw_frames = np.zeros_like(
+ entry["mythen_nx"]["data"][0, :, self.default_counter][()]
+ )
+
+ for frame in range(self.n_frames):
+ if frame in bad_frames:
+ self.logger.log(f"{frame} is a bad frame")
+ continue
+
+ wholedetector_n_frame = entry["mythen_nx"]["data"][
+ frame, :, self.default_counter
+ ][()]
+ wholedetector_n_frame_normalised = (
+ wholedetector_n_frame / normalised_beam_intensity[frame]
+ )
+ self.wholedetector_raw_frames = (
+ self.wholedetector_raw_frames + wholedetector_n_frame_normalised
+ )
+
+ self.raw_frame_counts = {}
+ self.raw_frame_counts[0] = self.wholedetector_raw_frames
+ self.deltas = [np.mean(self.deltas)]
+ self.logger.log(f"Summing {self.n_frames} frames")
+
+ elif (frame is None) and not (sum_frames):
+ # standard data reduction mode
+ self.wholedetector_raw_frames = entry["mythen_nx"]["data"][
+ :, :, self.default_counter
+ ][()] # [n, 17920, 3] where n is the number of frames, 3 = 3 counters
+ self.raw_frame_counts = {
+ frame: self.wholedetector_raw_frames[frame, :]
+ for frame in range(len(self.wholedetector_raw_frames))
+ } # coverts it from list into dict
+ self.logger.log(f"Deltas position(s): {self.deltas}")
+ self.logger.log(
+ f"Frames: {len(self.raw_frame_counts)}/{self.n_frames} | Specified frame: {frame}" # noqa
+ )
+
+ self.frames_range = list(self.raw_frame_counts.keys())
+
+ return (
+ self.raw_frame_counts,
+ self.frames_range,
+ self.wholedetector_raw_frames,
+ )
+
+ def load_flatfield(self, flatfield_filepath: str) -> np.ndarray:
+ """
+
+ loads the flatfield file. The flatfield file is (usually) an
+ h5 file containing a calibrated beam on the detector. This
+
+ allows to calibrate the response of the detector to the beam
+ ie. work out the efficiency of the detector
+
+ the flatfield can then be used to adjust the raw counts to correct the raw data.
+ If flatfield correction is set to False then
+
+ the entire flatfield is set to 1, such that it effectively makes no correction
+
+ """
+
+ if self.apply_flatfield:
+ if not os.path.exists(flatfield_filepath):
+ self.logger.log("Flatfield file does not exist")
+ flatfield = np.full(
+ (self.STRIPS_PER_MODULE * self.MODULES_PER_DETECTOR), 1
+ )
+
+ try:
+ with h5pyFile(flatfield_filepath, "r") as file:
+ if "flatfield" in file:
+ flatfield = file["flatfield"][()]
+ elif "flat_total_rescaled" in file:
+ flatfield = file["flat_total_rescaled"][()]
+ except Exception:
+ with h5pyFile(flatfield_filepath, "r") as file:
+ flatfield_tuple = file["data"][()]
+ flatfield = np.full(
+ (self.STRIPS_PER_MODULE * self.MODULES_PER_DETECTOR), 0
+ )
+
+ for flatfield_frame in flatfield_tuple:
+ flatfield += flatfield_frame
+
+ # flatfield = I11Reduction.NormalizeTo(flatfield,minval=0)
+
+ return flatfield
+
+ else:
+ flatfield = np.full((self.STRIPS_PER_MODULE * self.MODULES_PER_DETECTOR), 1)
+ return flatfield
+
+ def split_flatfield(self) -> dict:
+ """
+
+ splits the raw_flatfield_counts into array of arrays,
+ where each array corresponds to the module counts using a white beam
+
+ """
+ if len(self.raw_flatfield_counts) == (
+ self.STRIPS_PER_MODULE * self.MODULES_PER_DETECTOR
+ ):
+ flatfield_module_array = np.split(
+ self.raw_flatfield_counts, self.MODULES_PER_DETECTOR
+ )
+ iter_modules = range(self.MODULES_PER_DETECTOR)
+
+ elif (
+ (len(self.modules_in_flatfield) != 0)
+ and (
+ len(self.raw_flatfield_counts)
+ != (self.STRIPS_PER_MODULE * self.MODULES_PER_DETECTOR)
+ )
+ and (
+ (len(self.raw_flatfield_counts) / self.STRIPS_PER_MODULE)
+ == self.n_modules_in_data
+ )
+ ):
+ flatfield_module_array = np.split(
+ self.raw_flatfield_counts, len(self.modules_in_flatfield)
+ )
+ iter_modules = self.modules_in_flatfield
+
+ flatfield_modules = {}
+
+ for n, mod in enumerate(iter_modules):
+ flatfield_modules[mod] = flatfield_module_array[n]
+
+ return flatfield_modules
+
+ def save_nxs_outfile(
+ self,
+ reduced_nxs_filepath_out: str,
+ xyedata: pd.DataFrame,
+ module_raw_data: pd.DataFrame,
+ frame_data: pd.DataFrame,
+ angular_corrected_data: pd.DataFrame,
+ debug=False,
+ ) -> None:
+ """
+
+ Saves a hdf5 file suitable for analysis in dawn or calibration of the detector
+
+ """
+
+ if not self.verbose_nxs:
+ columns_to_export = ["tth", "det_channel", "no_ff_corr", "counts"]
+ else:
+ columns_to_export = angular_corrected_data.columns
+
+ self.logger.log(reduced_nxs_filepath_out)
+
+ #####################################
+ if os.path.exists(reduced_nxs_filepath_out):
+ os.remove(reduced_nxs_filepath_out)
+ print("remove")
+
+ copy(self.filepath, reduced_nxs_filepath_out)
+
+ with h5pyFile(self.filepath, "r", libver="latest", swmr=True) as file:
+ left_ring = file["entry"]["mythen_nx"]["data"][:, 0:17920, :][
+ ()
+ ] # [n, 17920, 3] where n is the number of frames, 3 = 3 counters
+ right_ring = file["entry"]["mythen_nx"]["data"][:, 17920::, :][
+ ()
+ ] # [n, 17920, 3] where n is the number of frames, 3 = 3 counters
+
+ with h5pyFile(reduced_nxs_filepath_out, "a", libver="latest") as out_file:
+ ##################################
+ # save rings exactly as they were from the hdf5 file but split ring 1 and 2
+ ##################################
+ print(out_file["entry"].keys())
+
+ out_file["entry"]["mythen_nx"]["ring1"] = left_ring
+ out_file["entry"]["mythen_nx"]["ring2"] = right_ring
+
+ tth_sorted_data = angular_corrected_data.sort_values(by="tth")
+
+ ##################################
+ # save fully reduced xye data
+ ##################################
+
+ xye_group = out_file["entry"].create_group("xye")
+ out_file["entry"]["xye"].create_dataset(
+ "error", data=xyedata["error"].values, dtype="f"
+ )
+ out_file["entry"]["xye"].create_dataset(
+ "counts", data=xyedata["counts"].values, dtype="f"
+ )
+ out_file["entry"]["xye"].create_dataset(
+ "tth", data=xyedata["tth"].values, dtype="f"
+ )
+
+ xye_group.attrs["NX_class"] = "NXdata"
+ xye_group.attrs["signal"] = "counts"
+ xye_group.attrs["axes"] = ["tth"]
+ xye_group.attrs["tth_indices"] = [0]
+
+ nxentry = out_file["entry"]
+ nxentry.attrs["default"] = "/entry/xye/counts"
+
+ # out_file.attrs["default"] = "/entry/xye/counts"
+
+ ##################################
+ # save all reduced modules seperately
+ ##################################
+
+ out_file["entry"].create_group("modules")
+ out_file["entry"]["modules"]["active_modules"] = np.array(
+ self.active_modules
+ )
+
+ for column in columns_to_export:
+ column_array = np.zeros(
+ (len(self.active_modules), self.STRIPS_PER_MODULE * self.n_frames)
+ )
+
+ for n, module in enumerate(self.active_modules):
+ module_data = tth_sorted_data[tth_sorted_data["n_mod"] == module]
+ column_array[n, 0 : len(module_data[column].values)] = module_data[
+ column
+ ].values
+
+ out_file["entry"]["modules"][column] = column_array
+
+ ##################################
+ # save all reduced frames seperately
+ ##################################
+
+ out_file["entry"].create_group("frames")
+ out_file["entry"]["frames"]["frame_ids"] = np.arange(self.n_frames)
+
+ for col in columns_to_export:
+ column_array = []
+ for frame in frame_data.values():
+ column_array.append(frame[col])
+ column_array = np.array(column_array)
+ out_file["entry"]["frames"][col] = column_array
+
+ ##################################
+ # save reduced rings seperately
+ ##################################
+ nxs_modules_group_ring1 = out_file["entry"].create_group("ring1")
+
+ if np.amin(self.active_modules) < 14:
+ ring1 = angular_corrected_data[
+ angular_corrected_data["n_mod"].isin(np.arange(0, 14, 1, dtype=int))
+ ]
+ for col in columns_to_export:
+ nxs_modules_group_ring1[col] = ring1[col]
+
+ nxs_modules_group_ring1.attrs["NX_class"] = "NXdata"
+ nxs_modules_group_ring1.attrs["signal"] = "counts"
+ nxs_modules_group_ring1.attrs["axes"] = ["tth"]
+ nxs_modules_group_ring1.attrs["tth_indices"] = [0]
+
+ nxs_modules_group_ring2 = out_file["entry"].create_group("ring2")
+
+ if np.amax(self.active_modules) > 14:
+ ring2 = angular_corrected_data[
+ angular_corrected_data["n_mod"].isin(
+ np.arange(14, 28, 1, dtype=int)
+ )
+ ]
+
+ for col in columns_to_export:
+ nxs_modules_group_ring2[col] = ring2[col]
+
+ nxs_modules_group_ring2.attrs["NX_class"] = "NXdata"
+ nxs_modules_group_ring2.attrs["signal"] = "counts"
+ nxs_modules_group_ring2.attrs["axes"] = ["tth"]
+ nxs_modules_group_ring2.attrs["tth_indices"] = [0]
+
+ #############################
+ # run debug processing
+ ##############################
+
+ if debug:
+ guide = self.make_module_boundary_guide(len(self.active_modules))
+ out_file["entry"]["guide"] = guide
+
+ detchannel_data = angular_corrected_data.sort_values(by="det_channel")
+
+ ring1_ffcorr = []
+ ring2_ffcorr = []
+
+ ring1_ffcorr_flipped = []
+ ring2_ffcorr_flipped = []
+
+ for frame in range(self.n_frames):
+ det_channel_frame = detchannel_data[
+ detchannel_data["frame"] == frame
+ ]
+ det_channel_frame_ring1 = (det_channel_frame["counts"].values)[
+ 0:17920
+ ]
+ det_channel_frame_ring2 = (det_channel_frame["counts"].values)[
+ 17920::
+ ]
+
+ flipped_frame = tth_sorted_data[tth_sorted_data["frame"] == frame]
+ flipped_frame_ring1 = (flipped_frame["counts"].values)[0:17920]
+ flipped_frame_ring2 = (flipped_frame["counts"].values)[17920::]
+
+ ring1_ffcorr.append(det_channel_frame_ring1)
+ ring2_ffcorr.append(det_channel_frame_ring2)
+
+ ring1_ffcorr_flipped.append(flipped_frame_ring1)
+ ring2_ffcorr_flipped.append(flipped_frame_ring2)
+
+ ring1_ffcorr = np.array(ring1_ffcorr)
+ ring2_ffcorr = np.array(ring2_ffcorr)
+ ring1_ffcorr_flipped = np.array(ring1_ffcorr_flipped)
+ ring2_ffcorr_flipped = np.array(ring2_ffcorr_flipped)
+
+ out_file["entry"]["frames"].create_dataset(
+ "ring1_ffcorr", data=ring1_ffcorr, dtype="f"
+ )
+ out_file["entry"]["frames"].create_dataset(
+ "ring2_ffcorr", data=ring2_ffcorr, dtype="f"
+ )
+
+ out_file["entry"]["frames"].create_dataset(
+ "ring1_ffcorr_flipped", data=ring1_ffcorr_flipped, dtype="f"
+ )
+ out_file["entry"]["frames"].create_dataset(
+ "ring2_ffcorr_flipped", data=ring2_ffcorr_flipped, dtype="f"
+ )
+
+ self.logger.log(f"Saving NXS file to: {reduced_nxs_filepath_out}")
+
+ def align_modules_dict(self, deltas: np.ndarray) -> dict:
+ """
+
+ Creates a self.all_module_data which ia a dicitionary containing delta position
+ and module datae broken up into an accessable way
+
+ self.all_module_data[n_frame][n_mod]
+
+ n_frame may relate to a delta position or potentially the same delta
+ if running a time resolved experiment
+
+ If flatfield correction is True in the config file
+ it will apply the flatfield correction
+
+ """
+
+ self.all_module_data = {} # is a dictionary containing a load of dataframes.
+ # Each dict is self.all_module_data[n_frame][n_mod] = module_data_at_delta
+
+ det_channels = np.arange(
+ self.STRIPS_PER_MODULE * len(self.active_modules), dtype=np.int64
+ )
+ module_det_channels = np.array_split(det_channels, len(self.active_modules))
+
+ start_bad_chans = np.arange(0, self.n_bad_edge_channels, 1)
+ end_bad_chans = np.arange(
+ self.STRIPS_PER_MODULE - self.n_bad_edge_channels, self.STRIPS_PER_MODULE, 1
+ )
+
+ for n_frame, delta_pos in zip(self.frames_range, deltas, strict=True):
+ self.all_module_data[n_frame] = {}
+ counts_in_each_frame_and_module = np.array_split(
+ self.raw_frame_counts[n_frame], len(self.active_modules)
+ )
+
+ for n, (n_mod) in enumerate(self.active_modules):
+ # self.logger.log(n_frame, n_mod)
+
+ # mod_start_chan = n_mod*self.STRIPS_PER_MODULE
+ # self.logger.log(n_mod, module_det_channels[n])
+
+ module_data_at_delta = pd.DataFrame()
+ module_data_at_delta["raw_tth"] = self.module_raw_tth[n_mod]
+ module_data_at_delta["tth"] = (
+ module_data_at_delta["raw_tth"].values + delta_pos
+ )
+ module_data_at_delta["mod_channel"] = self.module_raw_tth[
+ "mod_channel"
+ ] # always 0-1280 for each module
+ module_data_at_delta["det_channel"] = module_det_channels[n]
+ module_data_at_delta["frame"] = n_frame
+ module_data_at_delta["delta_pos"] = delta_pos
+ module_data_at_delta["n_mod"] = n_mod
+ module_data_at_delta["no_ff_corr"] = counts_in_each_frame_and_module[n]
+
+ # if flatfield is not enabled,
+ # the entire array is set to 1, so it makes no difference
+
+ # self.logger.log(n_mod, self.flatfield_modules[n_mod])
+ module_data_at_delta["counts"] = self.apply_flatfield_correction(
+ module_data_at_delta["no_ff_corr"].values,
+ self.flatfield_modules[n_mod],
+ )
+
+ module_data_at_delta["error"] = np.sqrt(
+ module_data_at_delta["counts"]
+ ) # poisson errors
+
+ module_data_at_delta["badchannel"] = (
+ (module_data_at_delta["det_channel"].isin(self.bad_channels))
+ | (module_data_at_delta["mod_channel"].isin(start_bad_chans))
+ | (module_data_at_delta["mod_channel"].isin(end_bad_chans))
+ ) # new way
+
+ self.all_module_data[n_frame][n_mod] = module_data_at_delta
+
+ # plt.plot(module_data_at_delta["tth"],module_data_at_delta["counts"])
+ # plt.plot(module_data_at_delta["tth"],module_data_at_delta["no_ff_corr"])
+ # plt.show()
+
+ return self.all_module_data
+
+ def remove_bad_channels_modules_frames(self) -> pd.DataFrame:
+ if self.bad_channel_masking:
+ angular_corrected_data = self.angular_corrected_data_unmasked[
+ (~self.angular_corrected_data_unmasked["n_mod"].isin(self.bad_modules))
+ & (self.angular_corrected_data_unmasked["badchannel"] == False) # noqa
+ & (~self.angular_corrected_data_unmasked["frame"].isin(self.bad_frames))
+ ] # keep non-bad modules #remove bad channels
+
+ else:
+ angular_corrected_data = self.angular_corrected_data_unmasked[
+ (~self.angular_corrected_data_unmasked["n_mod"].isin(self.bad_modules))
+ & (~self.angular_corrected_data_unmasked["frame"].isin(self.bad_frames))
+ ] # keep non-bad modules only
+
+ return angular_corrected_data
+
+ def concatenate_frames_and_modules(self) -> pd.DataFrame:
+ """
+
+ it contatenates the data in self.all_module_data and then appends
+ it into a dataframe containing lots of info. Then remove the bad channels
+
+ I suspect when fast_shutter_mode is available we would probably want to iterate
+ frames first, modules second and build a
+ self.frame_outputdata dict instead of modules
+
+ This way we could iterate the frames and save an xye for each frame. Which means
+ we wouldn't concatenate everything into a dataframe, we would concatenate all
+
+ the modules together and be able to look frame by frame
+
+ """
+
+ angular_corrected_data_unmasked = pd.DataFrame()
+
+ for n_mod, n_frame in product(self.active_modules, self.frames_range):
+ angular_corrected_data_unmasked = pd.concat(
+ [angular_corrected_data_unmasked, self.all_module_data[n_frame][n_mod]],
+ axis=0,
+ )
+
+ angular_corrected_data_unmasked = angular_corrected_data_unmasked.sort_values(
+ by="tth", ascending=True
+ )
+ angular_corrected_data_unmasked = angular_corrected_data_unmasked.reset_index()
+
+ del self.all_module_data
+
+ return angular_corrected_data_unmasked
+
+ def check_active_modules(self) -> bool:
+ """
+
+ checks to see if the modules specified in the config are
+ correct for the data shape. If not it will try to infer the correct shape.
+
+ """
+
+ self.logger.log(f"\nModules in data: {self.n_modules_in_data}")
+
+ if (len(self.active_modules) != self.n_modules_in_data) and (
+ os.path.exists(self.mythen3_config_dir)
+ ):
+ self.logger.log(
+ f"\nNumber of active modules in {self.config_filepath} does not reflect data!!!!" # noqa
+ )
+ self.logger.log("Modules will be determined from mythen3 config")
+ self.active_modules = I11Reduction.read_config(self.mythen3_config_dir)
+
+ if (len(self.active_modules) != self.n_modules_in_data) and (
+ self.n_modules_in_data == 14
+ ):
+ self.logger.log("Modules will be determined by using a range()")
+ self.active_modules = np.arange(self.n_modules_in_data, dtype=int)
+
+ elif (len(self.active_modules) != self.n_modules_in_data) and (
+ self.n_modules_in_data == 28
+ ):
+ self.logger.log("Modules will be determined by using a range()")
+ self.active_modules = np.arange(self.n_modules_in_data, dtype=int)
+
+ self.logger.log(f"Using = {self.active_modules}", "\n")
+
+ if len(self.active_modules) != self.n_modules_in_data:
+ self.logger.log(
+ f"The modules must be specified correctly in active_modules in: {self.config_filepath}" # noqa
+ )
+ quit()
+
+ return True
+
+ @staticmethod
+ def calculate_wavelength(beam_energy: float) -> float:
+ """
+
+ Calculates wavelength (Angstrom) from beam energy in kev.
+
+ To allow convertion of tth to Q space, using the energy of the beam.
+ beam energy is converted to wavlength because it's better
+
+ """
+
+ beam_energy_ev = beam_energy * 1000
+ ev_to_j, h_planck, c_speed_of_light = (
+ 1.602176634e-19,
+ 6.62607015e-34,
+ 299792458.0,
+ ) # electron volt-joule relationship (in J), plancks constant and speeed of l
+ beam_energy_j = beam_energy_ev * ev_to_j
+ wavelength_m = (h_planck * c_speed_of_light) / (beam_energy_j)
+ wavelength = wavelength_m * 1e10
+
+ return wavelength
+
+ def create_bins(self, tth_values: np.ndarray, rebin_step) -> np.ndarray:
+ """
+ Return a suitable set of bin centres, and edges for histogramming this data.
+
+ To match old GDA mythen2 behaviour, want start and
+ stop to align with "multiples" of rebin step
+ (as far as f.p. arithmetic allows this...).
+
+ """
+ mintth, maxtth = np.amin(tth_values), np.amax(tth_values)
+ start = np.round((mintth / rebin_step), decimals=3) * rebin_step
+ stop = np.round((maxtth / rebin_step), decimals=3) * rebin_step
+
+ # start = mintth
+ # stop = maxtth
+ # self.logger.log("Min2th:",f'{start:.3f}'," | ","Max2th:",f"{stop:.3f}","\n")
+
+ bin_edges = np.arange(
+ start=start - (rebin_step / 2),
+ stop=stop + rebin_step + (rebin_step / 2),
+ step=rebin_step,
+ dtype=np.float64,
+ )
+ bin_centres = 0.5 * (bin_edges[1:] + bin_edges[:-1])
+
+ return bin_centres, bin_edges
+
+ def bin_and_propagate_errors(
+ self, x: np.ndarray, y: np.ndarray, e: np.ndarray, error_calc: str = "poisson"
+ ) -> np.ndarray:
+ """
+
+ The bin centres and edges are calculated and used to bin the data.
+ Binning of the data is done used searchsorted == np.digitize.
+
+ Because we want to propagate the errors we will iterate though all the values
+ of x, y and e that need to be binned together and propagate the errors
+
+ Errors can be calculated using internal error = error propagation, external
+ error std_dev of error or we can take the greatest of the two values.
+ Which is probabaly the best idea.
+
+ If you have a high spread of data (high noise), ie peaks with weak intensity
+ surely the error can't be less than the spread.
+ But equally if you have very large peaks with low spread the
+
+ error should reflect that.
+
+ """
+
+ bin_centres, bin_edges = self.create_bins(x, self.rebin_step)
+
+ if (
+ x[-1] == bin_edges[-1]
+ ): # if the last value is exactly equal to the final bin edge it will be lost.
+ x[-1] = x[-1] - (
+ self.rebin_step / 10000
+ ) # I think it would be better to move it inside bin edge,
+ # and include, rather than remove all together or create bin with 1 value
+
+ sums, bin_edges = np.histogram(x, bins=bin_edges, weights=y)
+ counts = np.histogram(x, bins=bin_edges)[0]
+ mean_counts = (
+ sums / counts
+ ) # this will throw a warning if there are missing counts
+
+ e_sums = np.histogram(
+ x, bins=bin_edges, weights=e**2
+ )[
+ 0
+ ] # https://faraday.physics.utoronto.ca/PVB/Harrison/ErrorAnalysis/Propagation.html
+ prop_errors = np.sqrt(e_sums) / counts
+
+ repeated_mean = np.repeat(mean_counts, counts)
+ std_sums = np.histogram(x, bins=bin_edges, weights=(y - repeated_mean) ** 2)[0]
+ std_errors = np.sqrt(std_sums / counts)
+
+ if error_calc == "poisson":
+ errors = prop_errors
+ elif error_calc == "std_dev":
+ errors = std_errors
+ elif error_calc == "max":
+ errors = np.where(prop_errors > std_errors, prop_errors, std_errors)
+ else:
+ raise ValueError(
+ f"Invalid error_calc value: {error_calc}. Must be 'poisson', 'std_dev', or 'max'." # noqa
+ )
+
+ return bin_centres, bin_edges, mean_counts, errors
+
+ def bin_data(
+ self, angular_corrected_data: pd.DataFrame, error_calc: str
+ ) -> pd.DataFrame:
+ """
+
+ creates the bins, fins the bins centres (which gives the 2th angle)
+ Then sticks this all in a dataframe called xyedata with tth,
+ counts, error and if wavelength is provided Q
+
+ """
+
+ rebinned_tth, tth_bin_edges, rebinned_counts, errors = (
+ self.bin_and_propagate_errors(
+ angular_corrected_data["tth"].values,
+ angular_corrected_data["counts"].values,
+ angular_corrected_data["error"].values,
+ error_calc,
+ )
+ )
+
+ xyedata = pd.DataFrame()
+
+ xyedata["tth"] = rebinned_tth
+ xyedata["counts"] = rebinned_counts
+ xyedata["error"] = errors
+
+ xyedata = xyedata[
+ (xyedata["counts"] != 0) & (~xyedata["counts"].isnull())
+ ] # remove no counts #remove null counts
+
+ if (self.beam_energy) and (self.save_in_q_space):
+ q_space = tth_to_q(xyedata["tth"].to_numpy(), self.wavelength)
+ xyedata["Q"] = q_space
+
+ return xyedata
+
+ def save_xye(
+ self, xye_filepath_out: str, xyedata: pd.DataFrame, x: str
+ ) -> np.ndarray:
+ """
+
+ given a filepath out, and a dataframe containing some
+ x axis (Q or tth) and an x axis label
+
+ it concatenated the data into a ascii format and then saves it
+
+ """
+
+ xye_out_data = np.stack(
+ (xyedata[x].values, xyedata["counts"].values, xyedata["error"].values),
+ axis=-1,
+ )
+
+ np.savetxt(
+ xye_filepath_out, xye_out_data, fmt="%.6f", delimiter=" ", newline="\n"
+ )
+
+ self.logger.log(f"Saving xye to: {xye_filepath_out}")
+
+ return xye_out_data
+
+ def split_data(self, unmasked: bool = False):
+ """
+
+ splits data into frames and modules, depending on how you want to
+ look at the data, creates self.frame_data and self.module_raw_data
+
+ """
+
+ if unmasked:
+ data_to_split = self.angular_corrected_data_unmasked
+ else:
+ data_to_split = self.angular_corrected_data
+
+ frame_data = {
+ frame: data_to_split[data_to_split["frame"] == frame]
+ for frame in data_to_split.frame.unique()
+ }
+ module_raw_data = {
+ n_mod: data_to_split[data_to_split["n_mod"] == n_mod]
+ for n_mod in data_to_split.n_mod.unique()
+ }
+
+ return frame_data, module_raw_data
+
+ def load_toml_config(self) -> bool:
+ """
+
+ Loads the config from a toml file for the data reduction.
+ Returns true when success.
+
+ """
+
+ if not os.path.exists(self.config_filepath):
+ self.logger.log("Config file does not exist")
+ quit()
+
+ with open(self.config_filepath, "rb") as file:
+ self.logger.log(f"Using config: {self.config_filepath}")
+
+ self.config = load(file)
+
+ self.logger.log("\n")
+ self.mythen3_config_dir = self.config["mythen3_detector_config"]
+
+ if self.flatfield_filepath is None:
+ self.flatfield_filepath = self.config["flatfield_filepath"]
+
+ if self.apply_flatfield is None:
+ self.apply_flatfield = self.config["apply_flatfield"]
+
+ if self.active_modules is None:
+ self.active_modules = self.config["active_modules"]
+ self.active_modules.sort()
+
+ if self.bad_modules is None:
+ self.bad_modules = self.config["bad_modules"]
+
+ self.bad_channel_masking = self.config["bad_channel_masking"]
+ self.default_counter = self.config["default_counter"]
+ self.n_bad_edge_channels = self.config["edge_bad_channels"]
+ self.rebin_step = self.config["rebin_step"]
+ self.beam_energy = self.config["beam_energy"]
+
+ if self.beamline_offset is None:
+ self.beamline_offset = self.config.get("beamline_offset")
+
+ self.save_nxs_out = self.config["save_nxs_out"]
+ self.out_raw_data = self.config["out_raw_data"]
+ self.save_in_q_space = self.config["save_in_Q_space"]
+ self.debug_mode = self.config["debug_mode"]
+ self.modules_in_flatfield = self.config["modules_in_flatfield"]
+ self.send_to_ispyb = self.config["send_to_ispyb"]
+
+ if self.angcal_filepath is None:
+ self.angcal_filepath = self.config["angcal_filepath"]
+
+ if self.data_reduction_mode is None:
+ self.data_reduction_mode = int(self.config["data_reduction_mode"])
+
+ self.error_calc = self.config["error_calc"]
+ self.verbose_nxs = self.config["verbose_nxs"]
+ self.bad_channels_filepath = self.config["bad_channels_filepath"]
+
+ self.logger.log("Active modules:", self.active_modules)
+ self.logger.log("Bad modules:", self.bad_modules)
+ self.logger.log("Bad frames:", self.bad_frames)
+ self.logger.log("Beam energy (keV):", self.beam_energy)
+ self.logger.log("Beamline offset:", self.beamline_offset)
+ self.logger.log("Flatfield filepath:", self.flatfield_filepath)
+ self.logger.log("Saving in Q space:", self.save_in_q_space)
+ self.logger.log("Saving in NXS:", self.save_nxs_out)
+ self.logger.log("Apply Flatfield:", self.apply_flatfield)
+ self.logger.log("Using counter:", self.default_counter)
+ self.logger.log(
+ "Number of bad channels at module edge:", self.n_bad_edge_channels
+ )
+ self.logger.log("Rebin step:", self.rebin_step)
+
+ data_reduction_mode_dict = {
+ 0: "standard",
+ 1: "time-resolved",
+ 2: "pump-probe",
+ 3: "flatfield",
+ }
+
+ self.logger.log(
+ "Data reduction mode:", data_reduction_mode_dict[self.data_reduction_mode]
+ )
+
+ return True
+
+ def set_save_filepaths(self) -> bool:
+ if not self.xye_filepath_out:
+ self.xye_filepath_out = os.path.join(
+ self.file_dir,
+ f"{self.file_name}_summed_mythen3{self.filename_suffix}.xye",
+ )
+
+ if not os.path.exists(os.path.join(self.file_dir, "processed")):
+ os.makedirs(os.path.join(self.file_dir, "processed"))
+
+ if not self.reduced_nxs_filepath_out:
+ self.reduced_nxs_filepath_out = os.path.join(
+ self.file_dir,
+ "processed",
+ f"{self.file_name}_reduced_mythen3{self.filename_suffix}.nxs",
+ )
+
+ if not self.xye_filepath_out_q:
+ self.xye_filepath_out_q = os.path.join(
+ self.file_dir,
+ f"{self.file_name}_summed_mythen3_Q{self.filename_suffix}.xye",
+ )
+
+ return True
+
+ def _refine_rebin(self):
+ best_so_far = [[1e-8, 1e19]]
+
+ for n, new_rebin in enumerate(
+ np.linspace(
+ self.rebin_step / 10, self.rebin_step + (self.rebin_step / 10), 10000
+ )
+ ):
+ bin_centres, bin_edges = self.create_bins(
+ self.angular_corrected_data["tth"].values, new_rebin
+ )
+
+ sums, bin_edges = np.histogram(
+ self.angular_corrected_data["tth"].values,
+ bins=bin_edges,
+ weights=self.angular_corrected_data["counts"].values,
+ )
+ counts = np.histogram(
+ self.angular_corrected_data["tth"].values, bins=bin_edges
+ )[0]
+
+ if np.amin(counts) == 0:
+ continue
+
+ # mean_counts = (
+ # sums / counts
+ # ) # this will throw a warning if there are
+ # missing counts in a bin as a result of missing module
+
+ bin_centres_repeated = np.repeat(bin_centres, counts)
+
+ chi = np.sum(
+ np.abs(bin_centres_repeated - self.angular_corrected_data["tth"].values)
+ ) * len(bin_centres)
+
+ if n % 100 == 0:
+ self.logger.log(new_rebin)
+
+ if chi < best_so_far[-1][1]:
+ best_so_far.append([new_rebin, chi])
+ self.logger.log(new_rebin, chi)
+
+ best_rebin = best_so_far[-1][0]
+
+ return best_rebin
+
+ def plot_modules(self, block=True):
+ for n_mod in self.active_modules:
+ n_mod_theta = self.module_raw_tth[n_mod]
+ plt.plot([n_mod] * 1280, n_mod_theta)
+
+ plt.xlabel("module number")
+ plt.ylabel("angle tth")
+ plt.show(block=block)
+ if block is True:
+ plt.close()
+
+ def plot_modules_by_ring(self, mask=(), output_folder="./outputs", block=True):
+ plt.figure(figsize=(10, 4))
+
+ modules_min_max = {}
+
+ for n_mod in self.active_modules:
+ if n_mod in mask:
+ continue
+
+ n_mod_theta = self.module_raw_tth[n_mod]
+ if n_mod <= 13:
+ plt.plot(n_mod_theta, [0] * 1280, label=str(n_mod))
+ plt.text(n_mod_theta[640], 0.1, str(n_mod), fontsize=8)
+ else:
+ plt.plot(n_mod_theta, [1] * 1280, label=str(n_mod))
+ plt.text(n_mod_theta[640], 0.9, str(n_mod), fontsize=8)
+
+ modules_min_max[n_mod] = [float(min(n_mod_theta)), float(max(n_mod_theta))]
+
+ plt.ylabel("Ring number")
+ plt.yticks([0, 1])
+ plt.xlabel("Angle (tth)")
+ plt.savefig(os.path.join(output_folder, "module_arrangment.png"))
+ plt.show(block=block)
+ if block is True:
+ plt.close()
+
+ total_degrees = np.amax(self.module_raw_tth[0]) - np.amin(
+ self.module_raw_tth[13]
+ )
+
+ radius = 762
+ circum = 2 * 3.14159 * radius
+
+ length_of_arc = circum * (total_degrees / 360)
+
+ mm_per_degree = length_of_arc / total_degrees
+ print("Total Angular Coverage", total_degrees)
+ print("Radius of detector (mm):", 762)
+ print("mm/tth", mm_per_degree)
+
+ module_tth_spans = []
+ module_sizes = []
+ print(len(self.active_modules))
+ print(len(self.good_modules))
+
+ spec_module_size = 1280 * 0.05
+
+ for n_mod in list(self.good_modules):
+ module_1 = modules_min_max[n_mod]
+ module_tth_span = np.amax(module_1) - np.amin(module_1)
+ module_tth_spans.append(module_tth_span)
+ module_size = module_tth_span * mm_per_degree
+ module_sizes.append(module_size)
+
+ mm_per_deg_size = spec_module_size / module_tth_span
+
+ print(n_mod, module_tth_span, module_size, mm_per_deg_size)
+
+ fig, ax1 = plt.subplots(figsize=(10, 7))
+ ax1.scatter(list(self.good_modules), module_tth_spans)
+ ax1.set_ylabel("Size (tth)")
+ ax2 = ax1.twinx()
+
+ ax2.scatter(list(self.good_modules), module_sizes)
+ ax2.set_ylabel("Size (mm)")
+ ax1.set_xlabel("Module")
+ plt.savefig(os.path.join(output_folder, "sizes.png"))
+ plt.close()
+
+ for n_mod in self.active_modules[0:-1]:
+ if n_mod == 13:
+ continue
+
+ n_mod1 = n_mod
+ n_mod2 = n_mod + 1
+
+ module_1 = modules_min_max[n_mod1]
+ module_2 = modules_min_max[n_mod2]
+
+ sorted_modules = np.sort(np.concatenate((module_1, module_2)))
+
+ diff = mm_per_degree * (sorted_modules[2] - sorted_modules[1])
+
+ print("Modules:", n_mod1, n_mod2)
+ print("Sorted Module Edges (tth):", sorted_modules)
+ print("Gap (mm)", diff, "\n")
+
+ mod1spans = []
+ mod2spans = []
+
+ for mod1, mod2 in paired_modules():
+ n_mod1_theta = self.module_raw_tth[mod1]
+ mod1span = np.amax(n_mod1_theta) - np.amin(n_mod1_theta)
+ n_mod2_theta = self.module_raw_tth[mod2]
+ mod2span = np.amax(n_mod2_theta) - np.amin(n_mod2_theta)
+
+ if mod1 in [11, 17, 27]:
+ mod1spans.append(np.nan)
+ else:
+ mod1spans.append(mod1span)
+
+ if mod2 in [11, 17, 27]:
+ mod2spans.append(np.nan)
+ else:
+ mod2spans.append(mod2span)
+
+ plt.plot(np.array(mod1spans) * mm_per_degree)
+ plt.plot(np.array(mod2spans) * mm_per_degree)
+ plt.ylabel("size (mm)")
+ plt.xlabel("Index from module")
+ plt.savefig(os.path.join(output_folder, "module_compare.png"))
+ plt.show()
+
+ def plot_by(self, parameters=(), x="tth", at_a_time=False):
+ if isinstance(parameters, str):
+ parameters = [parameters]
+
+ for parameter in parameters:
+ for val in np.unique(self.angular_corrected_data[parameter]):
+ parameter_data = self.angular_corrected_data[
+ self.angular_corrected_data[parameter] == val
+ ]
+ p = plt.scatter(
+ parameter_data[x], parameter_data["counts"], label=str(val), s=2
+ )
+ col = p.get_facecolors()[-1].tolist()
+ plt.text(
+ np.median(parameter_data[x]),
+ -np.amax(self.angular_corrected_data["counts"]) / 30,
+ str(val),
+ color=col,
+ )
+
+ if at_a_time:
+ plt.legend()
+ plt.xlabel("Angle (tth)")
+ plt.ylabel("Intensity (arb. units)")
+ plt.show()
+
+ if not at_a_time:
+ plt.legend()
+ plt.xlabel("Angle (tth)")
+ plt.ylabel("Intensity (arb. units)")
+ plt.show()
+
+ def plot_module_offsets(self, mask=()):
+ plt.figure(figsize=(10, 4))
+
+ ring_1_angles = {}
+ ring_2_angles = {}
+
+ for n_mod in self.active_modules:
+ if n_mod in mask:
+ continue
+
+ n_mod_theta = self.module_raw_tth[n_mod]
+ if n_mod <= 13:
+ ring_1_angles[n_mod] = n_mod_theta
+
+ else:
+ ring_2_angles[n_mod] = n_mod_theta
+
+ ring_1_array = np.array(list(ring_1_angles.values())).flatten()
+ ring_1_diff = np.gradient(ring_1_array)
+
+ ring_2_array = np.array(list(ring_2_angles.values())).flatten()
+ ring_2_diff = np.gradient(ring_2_array)
+
+ ring1_steps = ring_1_diff[np.abs(ring_1_diff) > 1]
+ ring2_steps = ring_2_diff[np.abs(ring_2_diff) > 1]
+
+ for x, y in zip(ring_1_angles.keys(), ring1_steps, strict=True):
+ print(x, y)
+
+ for x, y in zip(ring_2_angles.keys(), ring2_steps, strict=True):
+ print(x, y)
+
+ plt.plot(ring_1_diff, label="ring1")
+ plt.plot(ring_2_diff, label="ring2")
+ plt.legend()
+ plt.show()
+
+ def plot_module_counts(self, block=True):
+ plt.figure()
+
+ for n_mod in self.active_modules:
+ if n_mod in self.angular_corrected_data["n_mod"].values:
+ plt.bar(n_mod, np.sum(self.module_raw_data[n_mod]))
+
+ plt.xlabel("module number")
+ plt.ylabel("module raw counts")
+ plt.show(block=block)
+ if block is True:
+ plt.close()
+
+ def plot_diffraction(self, out_only=True, filepath=None):
+ plt.figure(figsize=(15, 10))
+
+ if not out_only:
+ for n_frame in self.frame_data.keys():
+ framedata = self.frame_data[n_frame]
+ plt.plot(framedata["tth"], framedata["counts"], label=n_frame)
+
+ plt.errorbar(
+ self.xyedata["tth"],
+ self.xyedata["counts"],
+ self.xyedata["error"],
+ label=self.error_calc,
+ )
+ plt.legend()
+ plt.xlabel("tth")
+ plt.ylabel("Intensity (arb. units)")
+
+ if filepath:
+ plt.savefig(filepath)
+
+ plt.show()
+ plt.close()
+
+ def plot_raw_vs_xye(self):
+ fig, axes = plt.subplots(2)
+
+ axes[0].step(
+ self.angular_corrected_data["tth"],
+ self.angular_corrected_data["counts"],
+ label="ff corrected counts",
+ color="k",
+ )
+ axes[0].plot(self.xyedata["tth"], self.xyedata["counts"], label="xye")
+ axes[0].legend()
+
+ axes[1].step(
+ self.angular_corrected_data["tth"],
+ self.angular_corrected_data["no_ff_corr"],
+ label="ff uncorrected counts",
+ color="k",
+ )
+ axes[1].plot(self.xyedata["tth"], self.xyedata["counts"], label="xye")
+
+ axes[1].legend()
+ plt.show()
+
+ def plot_by_region_of_interest(self, peaks, tol=0.03, filepath=None):
+ fig = plt.figure(figsize=(15, 10))
+
+ max_rows = 4
+ max_cols = 4
+
+ gs = GridSpec(max_rows, max_cols, figure=fig) # upper bound on plots
+
+ i = 0
+
+ for peak in np.sort(peaks):
+ if i > 15:
+ break
+
+ region_of_interest = self.angular_corrected_data[
+ (self.angular_corrected_data["tth"] > peak - tol)
+ & (self.angular_corrected_data["tth"] < peak + tol)
+ ]
+
+ present_modules = np.unique(region_of_interest["n_mod"])
+
+ if len(region_of_interest) == 0: # or (len(present_modules) < 2):
+ continue
+
+ row = i // max_rows
+ col = i % max_cols
+
+ ax = fig.add_subplot(gs[row, col])
+
+ for n_mod in present_modules:
+ mod_data = region_of_interest[region_of_interest["n_mod"] == n_mod]
+ ax.scatter(mod_data["tth"], mod_data["counts"], label=str(n_mod))
+ ax.vlines(peak, np.min(mod_data["counts"]), np.max(mod_data["counts"]))
+ ax.legend()
+
+ i = i + 1
+
+ plt.xlabel("tth")
+ plt.ylabel("Intensity (arb. units)")
+ if filepath:
+ plt.savefig(filepath)
+ plt.show()
+ plt.close()
+
+ def plot_diffraction_by_mod(self, filepath=None, block=True):
+ plt.figure(figsize=(15, 10))
+
+ for n_mod in np.unique(self.angular_corrected_data["n_mod"]):
+ mod_data = self.angular_corrected_data[
+ self.angular_corrected_data["n_mod"] == n_mod
+ ]
+ plt.scatter(mod_data["tth"], mod_data["counts"], label=str(n_mod))
+ plt.text(
+ np.median(mod_data["tth"]), np.amin(mod_data["counts"]), str(n_mod)
+ )
+
+ plt.xlabel("tth")
+ plt.ylabel("Intensity (arb. units)")
+ plt.legend()
+
+ if filepath:
+ plt.savefig(filepath)
+
+ plt.show(block=block)
+ if block is True:
+ plt.close()
+
+ def plot_rings(self):
+ ringmod0_13 = self.angular_corrected_data[
+ self.angular_corrected_data["n_mod"].isin(np.arange(0, 14, 1, dtype=int))
+ ]
+ ringmod14_27 = self.angular_corrected_data[
+ self.angular_corrected_data["n_mod"].isin(np.arange(14, 28, 1, dtype=int))
+ ]
+ plt.errorbar(
+ ringmod0_13["tth"],
+ ringmod0_13["counts"],
+ ringmod0_13["error"],
+ label="ring1",
+ )
+ plt.errorbar(
+ ringmod14_27["tth"],
+ ringmod14_27["counts"],
+ ringmod14_27["error"],
+ label="ring2",
+ )
+ plt.show()
+ plt.close()
+
+ def make_module_boundary_guide(self, nmodules):
+ guide = np.zeros([nmodules * 1280])
+
+ for mod in range(nmodules):
+ guide[(mod - 1) * 1280 : ((mod - 1) * 1280) + 10] = 100000000000
+
+ return guide
+
+ def return_outliers(
+ self,
+ factor: int | float = 3,
+ low_bound: float | None = None,
+ plot: bool = False,
+ ) -> None:
+ """
+ This is used to return bad pixels.
+ This should only be run on a scan conducted on water at high angles (
+ or something else that scatters very flat) -
+ otherwise the results are invalid"""
+
+ all_bad_channels = np.array([], dtype=int)
+
+ for n_mod in np.unique(self.angular_corrected_data["n_mod"]):
+ hist_model = "fd"
+
+ mod_data = self.angular_corrected_data[
+ self.angular_corrected_data["n_mod"] == n_mod
+ ]
+
+ hist, bin_edges = np.histogram(mod_data["counts"].values, bins=hist_model)
+ mean_hist = np.mean(bin_edges)
+ std_hist = np.std(bin_edges)
+ stdfact = 1.5 * std_hist
+
+ print("hist", mean_hist, std_hist, mean_hist - stdfact, mean_hist + stdfact)
+
+ if plot:
+ plt.hist(
+ mod_data["counts"].values, bins=hist_model
+ ) # arguments are passed to np.histogram
+ plt.title(f"Histogram with {hist_model} bins")
+ plt.show()
+
+ median_count = np.median(mod_data["counts"])
+ stddev = np.std(mod_data["counts"])
+
+ low_data_points = mod_data[(mod_data["counts"] < median_count / factor)]
+ high_data_points = mod_data[(mod_data["counts"] > median_count * factor)]
+
+ low_channels = low_data_points["det_channel"].values
+ high_channels = high_data_points["det_channel"].values
+
+ bad_channels = np.sort(np.unique(np.append(low_channels, high_channels)))
+ all_bad_channels = np.append(all_bad_channels, bad_channels)
+
+ print(n_mod, bad_channels, median_count, stddev)
+
+ if low_bound:
+ low_bound_points = mod_data[(mod_data["counts"] < low_bound)]
+ low_bound_channels = low_bound_points["det_channel"].values
+
+ if len(low_bound_channels) > 0:
+ print("\n", "low bound", low_bound_channels, "\n")
+
+ if plot:
+ plt.scatter(mod_data["det_channel"], mod_data["counts"], label=n_mod)
+ plt.scatter(
+ bad_channels, [median_count] * len(bad_channels), color="red"
+ )
+ plt.legend()
+ plt.show()
+
+ for bc in all_bad_channels:
+ print(bc)
+
+ def data_reduction_mode_standard(self):
+ # standard data reduction
+
+ self.raw_frame_counts, self.frames_range, self.wholedetector_raw_frames = (
+ self.read_nxs_data(self.filepath)
+ )
+ # self.ffcorr = self.ffcorr_calc(self.wholedetector_raw_frames)
+
+ self.all_module_data = self.align_modules_dict(
+ self.deltas
+ ) # its a dict of dataframes
+
+ self.angular_corrected_data_unmasked = self.concatenate_frames_and_modules()
+ self.angular_corrected_data = self.remove_bad_channels_modules_frames()
+
+ self.frame_data, self.module_raw_data = self.split_data(
+ unmasked=self.out_raw_data
+ ) # if this is done after remove bad channels and modules
+ self.xyedata = self.bin_data(
+ self.angular_corrected_data, error_calc=self.error_calc
+ )
+
+ #####save data
+ self.save_xye(self.xye_filepath_out, self.xyedata, "tth")
+
+ if (self.save_in_q_space) and (self.beam_energy):
+ self.save_xye(self.xye_filepath_out_q, self.xyedata, "Q")
+
+ if self.save_nxs_out:
+ try:
+ self.save_nxs_outfile(
+ self.reduced_nxs_filepath_out,
+ self.xyedata,
+ self.module_raw_data,
+ self.frame_data,
+ self.angular_corrected_data_unmasked,
+ debug=self.debug_mode,
+ )
+ except Exception as e:
+ self.logger.log(e, self.filepath, "is open?")
+
+ def data_reduction_mode_time_resolved(self):
+ ###where every frame is a unique dataset and you want lots of final xye's
+ # This iterates through every frame and load them
+ # seperately because for large datasets it will eat up memory
+
+ for n_frame in range(self.n_frames):
+ self.logger.log(f"Analysing frame: {n_frame}")
+
+ self.raw_frame_counts, self.frames_range, self.wholedetector_raw_frames = (
+ self.read_nxs_data(self.filepath, frame=n_frame)
+ )
+ self.all_module_data = self.align_modules_dict(
+ [self.deltas[n_frame]]
+ ) # align all modules for the specfic frame of data
+ self.angular_corrected_data_unmasked = self.concatenate_frames_and_modules()
+ self.angular_corrected_data = self.remove_bad_channels_modules_frames()
+ self.frame_data, self.module_raw_data = self.split_data(
+ unmasked=self.out_raw_data
+ ) # if this is done after remove bad channels and modules
+ self.xyedata = self.bin_data(
+ self.angular_corrected_data, error_calc=self.error_calc
+ )
+
+ self.save_xye(
+ self.xye_filepath_out.replace(
+ ".xye", f"_frame_{n_frame + 1}{self.filename_suffix}.xye"
+ ),
+ self.xyedata,
+ "tth",
+ )
+ if (self.save_in_q_space) and (self.beam_energy):
+ self.save_xye(
+ self.xye_filepath_out_q.replace(
+ ".xye", f"_frame_{n_frame + 1}{self.filename_suffix}.xye"
+ ),
+ self.xyedata,
+ "Q",
+ )
+
+ def data_reduction_mode_pump_probe(self):
+ # pump probe
+
+ self.raw_frame_counts, self.frames_range, self.wholedetector_raw_frames = (
+ self.read_nxs_data(self.filepath, sum_frames=True)
+ )
+ self.all_module_data = self.align_modules_dict(
+ self.deltas
+ ) # its a dict of dataframes
+ self.angular_corrected_data_unmasked = self.concatenate_frames_and_modules()
+ self.angular_corrected_data = self.remove_bad_channels_modules_frames()
+ self.frame_data, self.module_raw_data = self.split_data(
+ unmasked=self.out_raw_data
+ ) # if this is done after remove bad channels and modules
+ self.xyedata = self.bin_data(
+ self.angular_corrected_data, error_calc=self.error_calc
+ )
+
+ #####save data
+
+ self.save_xye(self.xye_filepath_out, self.xyedata, "tth")
+
+ if (self.save_in_q_space) and (self.beam_energy):
+ self.save_xye(self.xye_filepath_out_q, self.xyedata, "Q")
+
+ if self.save_nxs_out:
+ self.save_nxs_outfile(
+ self.reduced_nxs_filepath_out,
+ self.xyedata,
+ self.module_raw_data,
+ self.frame_data,
+ self.angular_corrected_data,
+ debug=self.debug_mode,
+ )
+
+ def data_reduction_mode_flatfield(self, cleanup=True, peak_centre=80.67, tol=3.05):
+ # flatfield
+ """
+ This assumes that the angular calibration is correct,
+ if it isn't then the peak centre will be wrong and the flatfield will be wrong.
+ Do the angular calibration first, then run this.
+ """
+
+ from datetime import datetime
+
+ ###analyse the middle frame (where we hope the peak is present)
+ # throw away bad channels, and find the peak maxima.
+ # If this is a flatfield, that peak will always be at that tth
+ #
+
+ self.raw_frame_counts, self.frames_range, self.wholedetector_raw_frames = (
+ self.read_nxs_data(self.filepath, frame=int(self.n_frames / 2))
+ )
+ self.all_module_data = self.align_modules_dict(
+ [self.deltas[int(self.n_frames / 2)]]
+ ) # its a dict of dataframes
+ self.angular_corrected_data_unmasked = self.concatenate_frames_and_modules()
+ self.angular_corrected_data = self.remove_bad_channels_modules_frames()
+
+ max_index = np.argmax(self.angular_corrected_data["counts"])
+ peak_centre = (self.angular_corrected_data["tth"].values)[max_index]
+
+ new_flatfield = np.full((len(self.active_modules) * 1280), 0)
+ normalised_beam_intensity = self.beam_intensity / np.median(self.beam_intensity)
+
+ new_flatfield = np.full((len(self.active_modules) * 1280), 0)
+
+ for n_frame in range(self.n_frames):
+ self.logger.log(
+ f"Analysing frame: {n_frame}, Beam: {normalised_beam_intensity[n_frame]}" # noqa
+ )
+ self.raw_frame_counts, self.frames_range, self.wholedetector_raw_frames = (
+ self.read_nxs_data(self.filepath, frame=n_frame)
+ )
+
+ beam_normalised_flatfield = (
+ self.wholedetector_raw_frames / normalised_beam_intensity[n_frame]
+ )
+
+ if cleanup:
+ tth = self.deltas[n_frame] + self.whole_data_raw_tth
+ tth_throw_index = np.where(
+ ~((tth < (peak_centre + tol)) & (tth > (peak_centre - tol)))
+ )[0]
+ beam_normalised_flatfield[tth_throw_index] = 0
+
+ peak_counts = beam_normalised_flatfield[beam_normalised_flatfield != 0]
+
+ if len(peak_counts) == 0:
+ maxx = 10
+ else:
+ maxx = np.median(peak_counts) * 1000
+
+ self.logger.log(maxx)
+
+ count_throw_index = np.where(beam_normalised_flatfield > maxx)[0]
+ beam_normalised_flatfield[count_throw_index] = 0
+
+ new_flatfield = new_flatfield + beam_normalised_flatfield
+
+ new_flatfield = new_flatfield / np.median(new_flatfield)
+
+ count_throw_index = np.where(new_flatfield > 10)[0]
+ new_flatfield[count_throw_index] = 0
+
+ datetimestr = datetime.now().strftime("%Y-%m-%d") # _%H:%M")
+
+ if not self.out_directory:
+ save_dir = "/dls_sw/i11/software/mythen3/diamond/flatfield"
+ else:
+ save_dir = self.out_directory
+
+ flatfield_dir_flatfield_save_path = os.path.join(
+ save_dir,
+ f"{self.file_name}_flatfield_{datetimestr}{self.filename_suffix}.h5",
+ )
+
+ with h5pyFile(flatfield_dir_flatfield_save_path, "w") as out_file:
+ out_file.create_dataset("flatfield", data=new_flatfield)
+
+ self.logger.log(
+ f"New flatfield has been saved to {flatfield_dir_flatfield_save_path}"
+ )
+
+ def data_reduction_mode_0_fast(self):
+ # standard fast - testing
+
+ for n_frame, delta in range(self.n_frames), self.deltas:
+ self.raw_frame_counts, self.frames_range, self.wholedetector_raw_frames = (
+ self.read_nxs_data(self.filepath, frame=n_frame)
+ )
+ self.all_module_data = self.align_modules_dict(
+ [delta]
+ ) # its a dict of dataframes
+
+ self.angular_corrected_data_unmasked = self.concatenate_frames_and_modules()
+ self.angular_corrected_data = self.remove_bad_channels_modules_frames()
+ self.frame_data, self.module_raw_data = self.split_data(
+ unmasked=self.out_raw_data
+ ) # if this is done after remove bad channels and modules
+ self.xyedata = self.bin_data(
+ self.angular_corrected_data, error_calc=self.error_calc
+ )
+
+ #####save data
+
+ self.save_xye(self.xye_filepath_out, self.xyedata, "tth")
+
+ if (self.save_in_q_space) and (self.beam_energy):
+ self.save_xye(self.xye_filepath_out_q, self.xyedata, "Q")
+
+ if self.save_nxs_out:
+ self.save_nxs_outfile(
+ self.reduced_nxs_filepath_out,
+ self.xyedata,
+ self.module_raw_data,
+ self.frame_data,
+ self.angular_corrected_data,
+ debug=self.debug_mode,
+ )
+
+ if self.debug_mode:
+ self.debug_reduction()
+
+ def communicate_with_control(self, send_to_ispyb: bool = False):
+ """
+ Attempts to connect to i11-control and send a message indicating
+ that a file has been processed. This will cause gda to plot the latest file
+
+ Also may send xye to ispyb so that users can lookup data
+
+ """
+
+ try:
+ daq = Messenger("i11-control")
+ daq.connect()
+ daq.send_file(str(self.xye_filepath_out)) # sends message to GDA
+
+ if send_to_ispyb:
+ p = Path(self.filepath)
+ magic_path = p.parent / ".ispyb" / (p.stem + "_mythen_nx/data.dat")
+ copy2(self.xye_filepath_out, magic_path) # copies to ispyb
+
+ except Exception as e:
+ self.logger.log(f"{e}: No messenger")
+
+ def __init__(
+ self,
+ filepath: str | None = None,
+ reduced_nxs_filepath_out: str | None = None,
+ xye_filepath_out: str | None = None,
+ xye_filepath_out_q: str | None = None,
+ out_directory: str | None = None,
+ config_filepath: str | None = None,
+ beam_energy: float | None = None,
+ data_reduction_mode: int | None = None,
+ bad_frames: list[int] | None = None,
+ bad_modules: list[int] | None = None,
+ beamline_offset: float | None = None,
+ active_modules: list[int] | None = None,
+ flatfield_filepath: str | None = None,
+ apply_flatfield: bool | None = None,
+ angcal_filepath: str | None = None,
+ filename_suffix: str = "",
+ live: bool | None = False,
+ execute_reduction: bool | None = True,
+ logging: bool = True,
+ ):
+ self.reduced_nxs_filepath_out = reduced_nxs_filepath_out
+ self.xye_filepath_out = xye_filepath_out
+ self.xye_filepath_out_q = xye_filepath_out_q
+ self.config_filepath = config_filepath
+ self.beam_energy = beam_energy
+ self.flatfield_filepath = flatfield_filepath
+ self.active_modules = active_modules
+ self.angcal_filepath = angcal_filepath
+ self.filename_suffix = filename_suffix
+ self.out_directory = out_directory
+ self.bad_frames = bad_frames
+ self.bad_modules = bad_modules
+ self.beamline_offset = beamline_offset
+ self.data_reduction_mode = data_reduction_mode
+ self.apply_flatfield = apply_flatfield
+ self.live = live
+ self.execute_reduction = execute_reduction
+ self.logging = logging
+ self.filepath = filepath
+
+ if self.bad_frames is None:
+ self.bad_frames = [] # frames that should be removed, because they are bad
+
+ if self.out_directory is not None:
+ self.file_dir = (
+ self.out_directory
+ ) # this will replace the directory with the one specified by the user
+ else:
+ self.file_dir = os.path.dirname(
+ self.filepath
+ ) # this will be something like /dls/i11/data/2025/cm40643-1
+
+ self.logger = AnalysisLogger(
+ os.path.join(self.file_dir, "processed", "mythen3_reduction.log")
+ )
+
+ if not os.path.exists(self.filepath):
+ self.logger.log("NXS file does not exist")
+ quit()
+
+ self.logger.log("######################################\n")
+ self.logger.log(f"Data reduction being performed on: {self.filepath}")
+
+ self.file_name = os.path.splitext(os.path.basename(self.filepath))[
+ 0
+ ] # this will be something like 1290222
+ self.file_extension = os.path.splitext(self.filepath)[-1] # this will be .nxs
+
+ # Each module is divided into this many pixels.
+ self.STRIPS_PER_MODULE = 1280
+ self.MODULES_PER_DETECTOR = 28
+
+ if not self.config_filepath:
+ self.config_filepath = (
+ "/dls_sw/i11/software/mythen3/diamond/mythen3_reduction_config.toml"
+ )
+
+ self.load_toml_config()
+ self.set_save_filepaths()
+
+ self.good_modules = set(self.active_modules).difference(set(self.bad_modules))
+
+ self.logger.log("Modules in output data:", self.good_modules)
+
+ if self.beam_energy:
+ self.wavelength = I11Reduction.calculate_wavelength(self.beam_energy)
+ self.logger.log(
+ f"Beam Energy: {self.beam_energy} (keV) | Wavelength = {self.wavelength:.3f} (Angstrom)\n" # noqa
+ )
+
+ # self.bad_channels = self.generate_badchannel_dict()
+ self.bad_channels = load_int_array_from_file(self.bad_channels_filepath)
+
+ if self.angcal_filepath:
+ self.logger.log(
+ f"Using the following angular calibrations file: {angcal_filepath}"
+ )
+
+ self.module_angular_cal, self.beamline_offset = (
+ I11Reduction.read_singular_angcal_files(self.angcal_filepath)
+ )
+ else:
+ # self.logger.log("Using the following angular calibrations files")
+ # self.logger.log(f"{list(self.config["angular_calibrations"].values())}")
+ self.module_angular_cal, self.beamline_offset = (
+ I11Reduction.read_angular_calibration_and_create_cal_dict(
+ self.config, self.active_modules
+ )
+ )
+
+ #####################################################################################################################################
+ # everything before here is just setting up calibrations,
+ # and hasn't read the actual dataset
+
+ if self.filepath.lower().endswith(".nxs"):
+ self.n_frames, self.deltas, self.n_modules_in_data = self.read_nxs_metadata(
+ self.filepath
+ )
+ else:
+ self.logger.log("\n\nAborting: Must be a nexus!!\n\n")
+ quit()
+
+ self.raw_flatfield_counts = self.load_flatfield(self.flatfield_filepath)
+ self.flatfield_modules = self.split_flatfield()
+
+ self.check_active_modules()
+ # dict containing angular calibrations for each module
+ self.module_raw_tth, self.whole_data_raw_tth = self.calculate_modules_tth()
+
+ ############################################################################################################
+
+ # data reduction happens here differently for each data reduction mode
+
+ if self.execute_reduction:
+ if (
+ (self.data_reduction_mode == 0)
+ and (self.n_frames > 50)
+ and ((np.amax(self.deltas) - np.amin(self.deltas)) > 60)
+ ):
+ self.logger.log(
+ "This looks like a flatfield scan...treating it as such"
+ )
+ self.data_reduction_mode = 3
+
+ if self.data_reduction_mode == 0:
+ self.data_reduction_mode_standard()
+ # self.data_reduction_mode_0_fast()
+ elif self.data_reduction_mode == 1:
+ self.data_reduction_mode_time_resolved()
+ elif self.data_reduction_mode == 2:
+ self.data_reduction_mode_pump_probe()
+ elif self.data_reduction_mode == 3:
+ self.data_reduction_mode_flatfield()
+ else:
+ self.logger.log(
+ "Data reduction mode must be one of the specified values"
+ )
+
+ if self.live:
+ self.communicate_with_control(self.send_to_ispyb)
+
+ zeros = (
+ self.angular_corrected_data[self.angular_corrected_data["counts"] == 0]
+ ).sort_values(by="det_channel", ascending=True)
+ # print("bad channel", zeros)
+ self.logger.log(f"Possible bad channels: {zeros['det_channel'].unique()}")
+ ##########################################################################
+ self.logger.log("###############END###############\n")
+
+
+if __name__ == "__main__":
+ ##################################################
+ ##################################################
+
+ parser = argparse.ArgumentParser(
+ description="Post-processor for mythen3 data; "
+ "converts an uncalibrated .nxs files "
+ "written by the detector into a calibrated and corrected .xye ASCII file.",
+ add_help=True,
+ )
+
+ parser.add_argument(
+ "-d", "--data", help="Path to the nxs data file to reduce", required=True
+ )
+
+ parser.add_argument(
+ "-c",
+ "--config",
+ help="Path to .toml config file, containing the bad channels, "
+ "angular cal files, binning size, etc",
+ required=False,
+ )
+
+ parser.add_argument(
+ "-o",
+ "--out-xye-file",
+ help="Path to write output .xye file (2th, counts, error)",
+ required=False,
+ )
+
+ parser.add_argument(
+ "-q",
+ "--out-q-space-file",
+ help="Path to write output Q .xye file (Q, counts, error)",
+ required=False,
+ )
+
+ parser.add_argument(
+ "-nxs",
+ "--out-nxs-file",
+ help="Path to write output processed .nxs file",
+ required=False,
+ )
+
+ parser.add_argument(
+ "-ang",
+ "--ang-cal-file",
+ help="Path to angular calibration file",
+ required=False,
+ )
+
+ parser.add_argument(
+ "-drm",
+ "--data-reduction-mode",
+ help="How the data should be reduced. 0, 1 or 2 \
+ 0 = standard (all data will be reduced into 1 file, possibly multiple angles) \
+ 1 = time-resolved mode (many frames per .nxs saved into "
+ "seperate .xye files for each frame)\
+ 2 = pump-probe (all frames will be read and summed together - "
+ "data has been taken at static angle, optimised for lots of frames)",
+ required=False,
+ )
+
+ parser.add_argument(
+ "-bf",
+ "--bad_frames",
+ help="A list of 'bad frames' that will be removed from the final dataset."
+ "Specified comma seperated eg. -bf 0,1,2,3 ",
+ required=False,
+ type=lambda s: [int(item) for item in s.split(",")],
+ )
+
+ parser.add_argument(
+ "-l",
+ "--live",
+ help="Is this a live experiment, and therefore shuold we send messenges to gda?", # noqa
+ required=False,
+ )
+
+ args = parser.parse_args()
+
+ import time
+
+ start = time.time()
+ Analysis = I11Reduction(
+ filepath=args.data,
+ config_filepath=args.config,
+ xye_filepath_out_q=args.out_q_space_file,
+ reduced_nxs_filepath_out=args.out_nxs_file,
+ angcal_filepath=args.ang_cal_file,
+ live=args.live,
+ )
+ end = time.time()
+
+ Analysis.logger.log(f"Time: {end - start} sec")
diff --git a/src/xrpd_toolbox/i11/mythen_pyfai.py b/src/xrpd_toolbox/i11/mythen_pyfai.py
new file mode 100644
index 0000000..a3f53fb
--- /dev/null
+++ b/src/xrpd_toolbox/i11/mythen_pyfai.py
@@ -0,0 +1,180 @@
+from pathlib import Path
+from typing import Literal
+
+# import ipywidgets as widgets
+import numpy as np
+from matplotlib import cm
+from matplotlib import pyplot as plt
+from matplotlib.colors import LogNorm
+
+# from pyFAI import goniometer, units
+# from pyFAI.azimuthalIntegrator import AzimuthalIntegrator
+from pyFAI.calibrant import get_calibrant
+
+# from pyFAI.containers import Integrate1dResult
+# from pyFAI.control_points import ControlPoints
+from pyFAI.detectors import Detector
+from pyFAI.geometry import Geometry
+
+# from pyFAI.geometryRefinement import GeometryRefinement
+from pyFAI.goniometer import (
+ ExtendedTransformation,
+ SingleGeometry,
+)
+
+# from pyFAI.gui import jupyter
+# from pyFAI.units import hc
+# from scipy.interpolate import interp1d
+# from scipy.optimize import bisect, minimize
+from scipy.signal import find_peaks_cwt
+
+# from scipy.spatial import distance_matrix
+# from silx.resources import ExternalResources
+from xrpd_toolbox.i11.mythen import MythenDataLoader
+
+
+class Mythen3(Detector):
+ "Verical Mythen dtrip detector from Dectris"
+
+ aliases = ["Mythen3 1280"]
+ force_pixel = True
+ MAX_SHAPE = (1280, 1)
+
+ def __init__(self, pixel1=50e-6, pixel2=8e-3):
+ super().__init__(pixel1=pixel1, pixel2=pixel2)
+
+
+class AngularCalibrationPyFAI:
+ def __init__(
+ self,
+ filepath: str | Path,
+ wavelength_in_m: float,
+ calibrant_name: Literal["Si", "LaB6", "CeO2"],
+ ):
+ self.filepath = filepath
+ self.data_loader = MythenDataLoader(filepath=filepath)
+ self.data = self.data_loader.module_data
+ self.calibrant_name = calibrant_name
+ self.calibrant = get_calibrant(self.calibrant_name)
+ self.calibrant.wavelength = wavelength_in_m
+
+ self.modules = {}
+ for name, module_dataset in enumerate(self.data):
+ detector_module = Mythen3()
+ mask = module_dataset[0] < 0
+ print(name, module_dataset.shape)
+ # discard the first 20 and last 20 pixels
+ # as their intensities are less reliable
+ mask[:20] = True
+ mask[-20:] = True
+ detector_module.mask = mask.reshape(-1, 1)
+ self.modules[name] = detector_module
+
+ ExtendedTransformation(
+ dist_expr="dist",
+ poni1_expr="poni1",
+ poni2_expr="poni2",
+ rot1_expr="rot1",
+ rot2_expr="pi*(offset+scale*angle)/180.",
+ rot3_expr="0.0",
+ wavelength_expr="wavelength",
+ param_names=["dist", "poni1", "poni2", "rot1", "offset", "scale", "nrj"],
+ pos_names=["angle"],
+ constants={"wavelength": wavelength_in_m},
+ )
+
+ peaks = self.peak_picking(0, 0)
+ print(peaks)
+
+ step_idx = 1
+ # Approximate offset for the module #0 at 0°
+ print(
+ f"Approximated offset for the first module at step {step_idx}: ",
+ self.get_position(step_idx),
+ )
+
+ def single_geometry_calibration(self, wavelength_in_m: float):
+ for name, module_dataset in enumerate(self.data):
+ detector_module = self.modules[name]
+ initial = Geometry(detector=detector_module, wavelength=wavelength_in_m)
+
+ plt.title(f"Module {name}")
+ plt.imshow(module_dataset, cmap=cm.inferno, norm=LogNorm(), origin="lower") # type: ignore
+ plt.show()
+
+ # peak_indices = get_peaks_from_images(data_img, n_peaks=n_peaks)
+
+ # print(peak_indices)
+ beam_centre_x = -10 # x-coordinate of the beam-center in pixels
+ beam_centre_y = 1 # y-coordinate of the beam-center in pixels
+ distance = 762 # This is the distance in mm (unit used by Fit2d)
+ rot3 = -0.78539816339
+
+ initial.setFit2D(distance, beam_centre_x, beam_centre_y)
+
+ single_geometry = SingleGeometry(
+ "pe2AD",
+ module_dataset,
+ calibrant=self.calibrant,
+ detector=detector_module,
+ geometry=initial,
+ )
+ single_geometry.geometry_refinement.rot3 = (
+ rot3 # https://confluence.diamond.ac.uk/display/I151/Making+a+poni+file
+ )
+
+ for rings in [5, 5, 5, 5, 7, 7, 9, 11, 15, 15, 17, 21, 23, 25, 31, 41, 51]:
+ single_geometry.extract_cp(max_rings=rings)
+ # Refine the geometry ... here in SAXS geometry,
+ # the rotation is fixed in orthogonal setup
+ single_geometry.geometry_refinement.refine2(fix=["wavelength"])
+
+ def get_data(self, module_id, frame_id: int):
+ return self.data[module_id][frame_id]
+
+ def get_position(self, idx: int):
+ "Returns the postion of the goniometer for the given frame_id"
+ return self.data_loader.positions[idx]
+
+ # Define a peak-picking function based on the dataset-name and the frame_id:
+ def peak_picking(self, module_name, frame_id, threshold=500):
+ """Peak-picking base on find_peaks_cwt from scipy plus
+ second-order tailor exapention refinement for sub-pixel resolution.
+
+ The half-pixel offset is accounted here, i.e pixel #0 has its center at 0.5
+
+ """
+ module = self.modules[module_name]
+ msk = module.mask.ravel()
+
+ spectrum = self.data[module_name][frame_id]
+ guess = find_peaks_cwt(spectrum, [20])
+
+ valid = np.logical_and(np.logical_not(msk[guess]), spectrum[guess] > threshold)
+ guess = guess[valid]
+
+ # Based on maximum is f'(x) = 0 ~ f'(x0) + (x-x0)*(f''(x0))
+ df = np.gradient(spectrum)
+ d2f = np.gradient(df)
+ bad = d2f == 0
+ d2f[bad] = 1e-10 # prevent devision by zero. Discared later on
+ cor = df / d2f
+ cor[abs(cor) > 1] = 0
+ cor[bad] = 0
+ ref = guess - cor[guess] + 0.5 # half a pixel offset
+ x = np.zeros_like(ref) + 0.5 # half a pixel offset
+ return np.vstack((ref, x)).T
+
+ # def update(self, module_id, frame_id):
+ # spectrum = self.data[module_id][frame_id]
+ # self.line.set_data(np.arange(spectrum.size), spectrum)
+ # self.ax.set_title(f"Module {module_id}, Frame {frame_id}")
+ # self.fig.canvas.draw()
+
+
+if __name__ == "__main__":
+ filepath = "/host-home/projects/outputs/angular_calibration/1410290.nxs"
+ wavelength = 0.828783 * 1e-10 # 0.828773
+ calibrant_name = "Si"
+
+ AngularCalibrationPyFAI(filepath, wavelength, calibrant_name)
diff --git a/src/xrpd_toolbox/i15_1/__init__.py b/src/xrpd_toolbox/i15_1/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/xrpd_toolbox/i15_1/eiger_500k.py b/src/xrpd_toolbox/i15_1/eiger_500k.py
new file mode 100644
index 0000000..3ada7a5
--- /dev/null
+++ b/src/xrpd_toolbox/i15_1/eiger_500k.py
@@ -0,0 +1,344 @@
+from collections.abc import Collection
+from copy import deepcopy
+from functools import cached_property
+from pathlib import Path
+from typing import Literal
+
+import matplotlib.pyplot as plt
+import numpy as np
+import pyFAI
+from h5py import Dataset, File
+from matplotlib.colors import LogNorm
+from pyFAI import units
+from pyFAI.calibrant import get_calibrant
+from pyFAI.detectors import Detector
+from pyFAI.goniometer import MultiGeometry, SingleGeometry
+from pyFAI.gui import jupyter
+from pyFAI.integrator.azimuthal import AzimuthalIntegrator
+from pyFAI.method_registry import IntegrationMethod
+
+from xrpd_toolbox.core import XRPDBaseModel
+from xrpd_toolbox.utils.utils import (
+ get_entry,
+ h5_to_array,
+)
+
+PIXEL_SIZE = 7.5e-5 # in m
+INITIAL_DISTNACE = 700 # mm
+DEFAULT_MAX_SHAPE = (1024, 512)
+
+
+def calibrate_single_geometry_from_rings(
+ geometry: SingleGeometry,
+ rings: Collection[int] = [5, 5, 5, 7, 7, 9, 11, 15, 17],
+ fix: list | None = None,
+):
+ if fix is None:
+ fix = []
+
+ for n_rings in rings:
+ geometry.extract_cp(max_rings=n_rings)
+ geometry.geometry_refinement.refine2(fix=fix)
+
+ return geometry
+
+
+class EigerSettings(XRPDBaseModel):
+ bad_channels_filepath: str | Path = "/dls_sw/i15-1/software/bad_channel_mask.hdf5"
+ bad_channel_masking: bool = True
+ flatfield_filepath: str | Path | None = None
+ apply_flatfield: bool = False
+ darkfield_filepath: str | Path | None = None
+ send_to_ispyb: bool = False
+ rebin_step: float = 0.004
+ error_calc: Literal["poisson", "std_dev", "max"] = "poisson"
+ poni_filepath: str | Path | None = None
+
+
+class EigerDataLoader:
+ def __init__(
+ self,
+ filepath: str | Path,
+ eiger_data_path: str = "data",
+ tth_path: str = "tth",
+ ):
+ self.filepath = filepath
+ self.eiger_data_path = eiger_data_path
+ self.tth_path = tth_path
+
+ self.entry = get_entry(self.filepath)
+ self.dataset_path = f"/{self.entry}/{self.eiger_data_path}/data"
+
+ @cached_property
+ def positions(self) -> np.ndarray:
+ try:
+ deltas = h5_to_array(self.filepath, self.tth_path)
+ return deltas
+ except ValueError as e:
+ print(f"{e} - {self.tth_path} in data - returning 0")
+ deltas = np.array([0])
+ return deltas
+
+ @cached_property
+ def count_time_path(self) -> str:
+ return f"/{self.entry}/instrument/{self.eiger_data_path}/count_time"
+
+ @cached_property
+ def durations(self) -> np.ndarray:
+ return h5_to_array(self.filepath, self.count_time_path)
+
+ @property
+ def data(self):
+ return self.get_data(self.dataset_path)
+
+ def get_frame(self, frame: int | Collection[int] | slice):
+ return self.get_data(self.dataset_path)
+
+ def get_data(self, dataset_path) -> np.ndarray:
+ with File(self.filepath, "r") as file:
+ if self.dataset_path not in file:
+ raise ValueError(f"Dataset path {dataset_path} not found in HDF5 file.")
+
+ data = file.get(dataset_path)
+
+ if (data is not None) and isinstance(data, Dataset):
+ if data.ndim < 1:
+ raise ValueError("Data has insufficient dimensions.")
+ module_frame_data = data[...]
+
+ return np.asarray(module_frame_data)
+ else:
+ raise ValueError(f"Data at {dataset_path} in {self.filepath}is None.")
+
+
+class Eiger500K(Detector):
+ IS_FLAT = False # this detector is flat
+ IS_CONTIGUOUS = True
+
+ def __init__(
+ self,
+ filepath: str | Path | None = None,
+ settings: EigerSettings | None = None,
+ poni: str | Path | dict | None = None,
+ wavelength: float | None = None, # in Angstrom
+ ):
+ self.filepath = filepath
+ self.settings = settings
+ self.poni = poni
+ self.calibrant = None
+ self.wavelength = wavelength
+
+ if self.filepath is not None:
+ self.data_loader = EigerDataLoader(self.filepath)
+ self.max_shape = self.data_loader.data.shape
+ else:
+ self.max_shape = DEFAULT_MAX_SHAPE # Default shape if no data
+
+ super().__init__(pixel1=PIXEL_SIZE, pixel2=PIXEL_SIZE, max_shape=self.max_shape)
+
+ if isinstance(self.poni, (str, Path)):
+ self.ai = pyFAI.load(str(self.poni))
+ elif isinstance(self.poni, dict):
+ self.ai = AzimuthalIntegrator(detector=self, **self.poni)
+ elif self.settings is not None:
+ self.ai = pyFAI.load(str(self.settings.poni_filepath))
+ else:
+ self.ai = None
+
+ if self.ai is not None and (
+ self.ai.pixel1 != PIXEL_SIZE or self.ai.pixel2 != PIXEL_SIZE
+ ):
+ raise ValueError(
+ f"Pixel size in poni file ({self.ai.pixel1}, {self.ai.pixel2}) does not match expected pixel size ({PIXEL_SIZE})." # noqa
+ )
+
+ def process_step_scan(self):
+ for _position in self.data_loader.positions:
+ # do geometry transformation
+
+ pass
+
+ def load_geometry(self, poni_files: str | list[str | Path]):
+ # if isinstance(poni_files, list) and (len(poni_files) > 1):
+ # mg = MultiGeometry()
+
+ # else:
+ # self.ai = pyFAI.load(str(poni_files))
+ pass
+
+ def set_calibrant(self, calibrant_name: str, wavelength_in_ang: float):
+ self.calibrant = get_calibrant(calibrant_name)
+ self.calibrant.wavelength = wavelength_in_ang / 1e10
+
+ return self.calibrant
+
+ def test(self):
+ poni1 = 0.06144
+ poni2 = 0.06144
+ wavelength = 1e-10
+
+ lab6 = get_calibrant("LaB6")
+ lab6.wavelength = wavelength
+
+ ai = pyFAI.load(
+ {
+ "dist": 0.1,
+ "poni1": poni1,
+ "poni2": poni2,
+ "detector": self,
+ "wavelength": wavelength,
+ }
+ )
+
+ method = IntegrationMethod.parse("full", dim=1)
+ img = lab6.fake_calibration_image(ai)
+
+ plt.imshow(img)
+ plt.show()
+
+ step = 15 * np.pi / 180
+ ais = []
+ imgs = []
+ fig, ax = plt.subplots(1, 5, figsize=(20, 4))
+ for i in range(5):
+ my_ai = deepcopy(ai)
+ my_ai.rot2 -= i * step
+ my_img = lab6.fake_calibration_image(my_ai)
+ jupyter.display(
+ my_img,
+ label=f"Angle rot2: {np.degrees(my_ai.rot2)}",
+ ax=ax[i],
+ )
+ ais.append(my_ai)
+ imgs.append(my_img)
+ print(my_ai)
+
+ mg = MultiGeometry(ais, unit="2th_deg", radial_range=(0, 90))
+ print(mg)
+ fig, ax = plt.subplots(2, 1, figsize=(12, 16))
+ jupyter.plot1d(mg.integrate1d(imgs, 10000, method=method), ax=ax[0])
+ plt.show()
+
+ def integrate_images(
+ self, images: Collection[np.ndarray], ais: Collection[AzimuthalIntegrator]
+ ):
+ method = IntegrationMethod.parse("full", dim=1)
+ mg = MultiGeometry(ais, unit=units.TTH_DEG)
+ x_data, y_data = mg.integrate1d(images, npt=10000, method=method)
+
+ return x_data, y_data
+
+ def simulate_data(
+ self,
+ positions_in_tth: Collection[float],
+ calibrant_name: str,
+ wavelength_in_ang: float,
+ resolution: float = 0.03,
+ ) -> tuple[list[np.ndarray], list[AzimuthalIntegrator]]:
+ simulated_data = []
+ simulated_ais = []
+
+ if self.calibrant is None:
+ self.calibrant = self.set_calibrant(calibrant_name, wavelength_in_ang)
+ if self.ai is None:
+ raise AttributeError("No Azimuthal Integrator set")
+
+ positions_rad = np.deg2rad(np.asarray(positions_in_tth, dtype=float))
+
+ for position in positions_rad:
+ ai_copy = deepcopy(self.ai)
+ ai_copy.rot2 = position
+
+ simulated_image = self.calibrant.fake_calibration_image(
+ ai_copy, shape=self.max_shape, resolution=resolution
+ )
+
+ simulated_ais.append(ai_copy)
+ simulated_data.append(simulated_image)
+
+ return simulated_data, simulated_ais
+
+ def simulate_1d_pattern(
+ self,
+ positions_in_tth: Collection[float],
+ calibrant_name: str,
+ wavelength_in_ang: float,
+ ):
+ simulated_step_scan, simulated_ais = self.simulate_data(
+ positions_in_tth=positions_in_tth,
+ calibrant_name=calibrant_name,
+ wavelength_in_ang=wavelength_in_ang,
+ )
+
+ simulated_x_data, simulated_y_data = self.integrate_images(
+ simulated_step_scan, simulated_ais
+ )
+
+ return simulated_x_data, simulated_y_data
+
+ def calibrate_single_geometry(
+ self,
+ calibrant_name: str,
+ wavelength: float,
+ poni_output_filepath: str | Path,
+ wavelength_unit: Literal["Ang", "A", "Angstrom", "kev", "keV", "ev"],
+ ):
+ """Using pyfai and the current data file,
+ this will attempt to calibrate the detector
+ using a known calibrant and then output a poni file to disk"""
+
+ if wavelength_unit.lower() in ["ang", "ansgtrom", "a"]:
+ wavelength_in_ang = wavelength
+ elif wavelength_unit.lower() in ["ang", "ansgtrom", "a"]:
+ wavelength_in_ang = wavelength
+ else:
+ raise ValueError("wavelength_unit must be valid!")
+
+ calibrant = get_calibrant(calibrant_name)
+ calibrant.wavelength = wavelength_in_ang / 1e10
+
+ single_geometry = SingleGeometry(
+ self.name, self.data_loader.data, calibrant=calibrant, detector=self
+ )
+
+ single_geometry = calibrate_single_geometry_from_rings(geometry=single_geometry)
+ single_geometry.geometry_refinement.save(str(poni_output_filepath))
+
+
+if __name__ == "__main__":
+ # SETTINGS = EigerSettings()
+ # FILEPATH = "/workspaces/XRPD-Toolbox/examples/i15-1/eiger_500k/1414223.nxs"
+ # eiger = Eiger500K(filepath=FILEPATH, settings=SETTINGS)
+ calibrant = get_calibrant(calibrant_name="Si")
+ calibrant.wavelength = 0.161699 / 1e10
+
+ pixel1 = PIXEL_SIZE
+ pixel2 = PIXEL_SIZE
+
+ shape = (1024, 512)
+
+ poni1 = pixel1 * shape[0] / 2
+ poni2 = pixel2 * shape[1] / 2
+
+ import pyFAI.detectors
+
+ ai = AzimuthalIntegrator(
+ detector=pyFAI.detectors.Detector(
+ pixel1=pixel1, pixel2=pixel2, max_shape=shape
+ ),
+ wavelength=calibrant.wavelength,
+ dist=0.7,
+ poni1=poni1,
+ poni2=poni2,
+ rot1=0,
+ rot2=0.1,
+ rot3=0,
+ )
+
+ calibration_image = calibrant.fake_calibration_image(
+ ai, shape=shape, resolution=0.01
+ )
+
+ plt.imshow(calibration_image, norm=LogNorm())
+ plt.colorbar()
+ plt.show()
diff --git a/src/xrpd_toolbox/i15_1/pe2ad.py b/src/xrpd_toolbox/i15_1/pe2ad.py
new file mode 100644
index 0000000..ae278e2
--- /dev/null
+++ b/src/xrpd_toolbox/i15_1/pe2ad.py
@@ -0,0 +1,111 @@
+import matplotlib.pyplot as plt
+import numpy as np
+
+from xrpd_toolbox.data_loader import BaseDataLoader
+from xrpd_toolbox.fit_engine.peaks import fit_peaks, smooth_tophat
+
+
+class PE2AD(BaseDataLoader):
+ def __init__(self, filepath, data_path: str = "pe2AD"):
+ super().__init__(filepath, data_path)
+
+ self.entries = self.get_entries()
+
+ def find_centre1(self, x: np.ndarray):
+ positions = np.arange(len(x))
+ center = np.sum(positions * x) / np.sum(x)
+
+ return center
+
+ def find_center2(self, x):
+ threshold = np.percentile(x, 99)
+ sample = x[x < threshold]
+ densest_idx = np.argmax(sample)
+
+ return int(densest_idx)
+
+ def find_sample_centre(self):
+ summed_images = self.sum_frames()
+ centre_index = self.find_center2(summed_images)
+
+ # x = np.arange(len(summed_images))
+
+ indices = np.arange(
+ int(centre_index) - 30, int(centre_index) + 31, 1, dtype=int
+ )
+
+ print(indices)
+
+ trimmed_sample_density = summed_images[indices]
+
+ s = 3
+
+ trimmed_sample_density = np.convolve(trimmed_sample_density, np.ones(s) / s)
+
+ trimmed_sample_density = trimmed_sample_density[s - 1 : :]
+
+ peaks = fit_peaks(
+ x=indices, y=trimmed_sample_density, initial_x_pos=[centre_index]
+ )
+
+ # p0 = [x_guess, amp_guess, width_guess]
+ # popt, _ = curve_fit(gaussian, x_fit, y_fit, p0=p0, maxfev=10000)
+
+ for peak in peaks:
+ print(peak)
+ plt.plot(indices, peak.calculate(indices))
+
+ tophat = smooth_tophat(
+ indices,
+ float(peak.amplitude),
+ float(peak.amplitude),
+ float(peak.amplitude),
+ 0.1,
+ )
+
+ plt.plot(indices, tophat)
+
+ plt.plot(indices, trimmed_sample_density)
+ plt.show()
+
+
+if __name__ == "__main__":
+ import os
+
+ folder = "/dls/i15-1/data/2026/cm44163-1/"
+ file = "i15-1-95016.nxs"
+
+ prefix = "i15-1-"
+
+ sample_alignment_scans = {
+ "carbon_black": 94519,
+ "water": 94520,
+ "GaIn": 94521,
+ "NIST_Si": 95016,
+ "NaCl": 95017,
+ "HKUST1": 95018,
+ }
+
+ for sample, number in sample_alignment_scans.items():
+ filepath = folder + prefix + str(number) + ".nxs"
+
+ output_file = f"/workspaces/outputs/i15-1/{sample}-{number}.csv"
+
+ print(filepath)
+
+ if not os.path.exists(filepath):
+ print("it doesn't exist")
+
+ pe2ad = PE2AD(filepath)
+ summed_images = pe2ad.sum_frames()
+
+ index = np.linspace(0, len(summed_images), len(summed_images))
+
+ csv_data = np.stack((index, summed_images), axis=-1)
+
+ np.savetxt(output_file, csv_data)
+
+ x, y = np.genfromtxt(output_file, unpack=True)
+
+ plt.plot(x, y)
+ plt.show()
diff --git a/src/xrpd_toolbox/i15_1/sample_alignment.py b/src/xrpd_toolbox/i15_1/sample_alignment.py
new file mode 100644
index 0000000..aec2bca
--- /dev/null
+++ b/src/xrpd_toolbox/i15_1/sample_alignment.py
@@ -0,0 +1,376 @@
+"""Sample alignment utilities for the XRPD Toolbox.
+
+This module provides a SampleAligner model for I15-1 XRPD data,
+including peak detection, peak profile construction, and plotting.
+"""
+
+import math
+import os
+from pathlib import Path
+
+import numpy as np
+from scipy.signal import find_peaks
+
+from xrpd_toolbox.core import Parameter, XYEData
+from xrpd_toolbox.data_loader import BaseDataLoader
+from xrpd_toolbox.fit_engine.background import (
+ BackgroundType,
+ ConstantBackground,
+)
+from xrpd_toolbox.fit_engine.fitting_core import Model, RefinementBaseModel
+from xrpd_toolbox.fit_engine.peaks import (
+ Peak,
+ PeakType,
+ calculate_profile,
+ peak_factory,
+)
+from xrpd_toolbox.plotting import FittedDataPlot
+from xrpd_toolbox.utils.messenger import Messenger
+from xrpd_toolbox.utils.utils import cluster_points_auto
+
+
+class SampleCenteringResult(RefinementBaseModel):
+ """This is what contains the results and can
+ be serisalised and sent back to the bluesky plan"""
+
+ centre: float
+ peaks: list[Peak]
+ scores: list[float]
+
+
+class SampleAligner(Model[XYEData]):
+ """Model for aligning XRPD sample patterns using initial peak detection.
+
+ The SampleAligner detects peaks from observed XYEData, groups them,
+ constructs initial peak models, and evaluates the resulting profile
+ together with an estimated background.
+ """
+
+ background: BackgroundType
+ sample_and_capillary: list[PeakType] = []
+ centre: float | None = None
+
+ def get_peak_info(self, labels, peak_position, peak_intensity):
+ """Summarize grouped peak detections into peak initialization data.
+
+ Parameters
+ ----------
+ labels:
+ Cluster labels for each detected peak.
+ peak_position:
+ X positions of the detected peaks.
+ peak_intensity:
+ Intensities of the detected peaks.
+
+ Returns
+ -------
+ list[dict]
+ A list of peak summaries containing group id, centre,
+ amplitude, and FWHM estimates.
+ """
+ grouped_peaks = []
+
+ group_numbers = np.unique(labels)
+
+ for group in group_numbers:
+ index = np.where(labels == group)[0]
+
+ group_positions = peak_position[index]
+
+ average_peak_position = np.median(group_positions)
+ average_peak_intensity = np.median(peak_intensity[index])
+
+ average_peak_spread = np.ptp(group_positions)
+
+ if average_peak_spread == 0:
+ average_peak_spread = np.ptp(self.data.x) / 20
+
+ peak = {
+ "group": int(group),
+ "centre": float(average_peak_position),
+ "amplitude": float(average_peak_intensity),
+ "fwhm": float(average_peak_spread),
+ }
+
+ grouped_peaks.append(peak)
+
+ return grouped_peaks
+
+ def calculate_profile(self):
+ """Calculate the combined peak profile plus background for the model.
+
+ Returns
+ -------
+ numpy.ndarray
+ The combined intensity profile evaluated at the current x positions.
+ """
+ return calculate_profile(
+ self.data.x, self.sample_and_capillary
+ ) + self.background.calculate(self.data.x)
+
+ def get_initial_peaks(self, peak_type: str = "tophat", smoothing: int = 5):
+ """Detect observed peaks and build initial peak models for fitting.
+
+ Parameters
+ ----------
+ peak_type:
+ The type of peak model to create for each detected peak.
+ smoothing:
+ Smoothing parameter for peak detection. Currently accepted for
+ API compatibility but not applied in the current implementation.
+ """
+ peak_indexes = find_peaks(self.data.y)[0]
+
+ peak_position = self.data.x[peak_indexes]
+ peak_intensity = self.data.y[peak_indexes]
+
+ labels, n_groups = cluster_points_auto(peak_position, peak_intensity)
+
+ peaks = self.get_peak_info(labels, peak_position, peak_intensity)
+
+ for peak in peaks:
+ if math.isclose(peak["amplitude"], self.data.y.min(), rel_tol=0.1) or (
+ peak["amplitude"] < 0
+ ):
+ continue
+ else:
+ peak_cls = peak_factory(peak_type)
+
+ sample_peak = peak_cls.model_validate(peak)
+ sample_peak.parameterise_all(refine=True)
+ sample_peak.normalised = False
+ assert isinstance(sample_peak.centre, Parameter)
+ sample_peak.centre.bounds = [
+ self.data.x.min(),
+ self.data.x.max(),
+ ]
+ # assert isinstance(sample_peak.fwhm, Parameter)
+ # sample_peak.fwhm.bounds = [
+ # 0,
+ # float(np.ptp(self.data.x)),
+ # ]
+ self.sample_and_capillary.append(sample_peak)
+
+ # plt.plot(self.data.x, self.calculate_profile())
+ # plt.plot(self.data.x, self.data.y)
+ # plt.scatter(peak_position, peak_intensity)
+ # plt.show()
+
+ # print(self.sample_and_capillary)
+ # plt.scatter(peak_position, peak_intensity)
+ # plt.plot(self.data.x, self.data.y)
+ # plt.show()
+
+ def get_plot_data(self):
+ """Plot the observed data, calculated profile, background, and residual.
+
+ The plot shows the observed intensities, the current fitted profile,
+ the background model, and the residual (observed minus calculated).
+ """
+ if self.data.source is not None:
+ title = os.path.basename(self.data.source)
+ else:
+ title = None
+
+ profile = calculate_profile(self.data.x, self.sample_and_capillary)
+ profile = profile + self.background.calculate(self.data.x)
+
+ plot_data = FittedDataPlot(
+ data=self.data,
+ calc=profile,
+ diff=self.data.y - profile,
+ background=self.background.calculate(self.data.x),
+ title=title,
+ markers=np.array([self.centre]),
+ )
+
+ return plot_data
+
+ def peaks_to_arrays(
+ self, peaks: list[PeakType]
+ ) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """Convert a list of peaks into numpy arrays of centre, amplitude, and FWHM.
+
+ Parameters
+ ----------
+ peaks:
+ A list of peak model objects.
+
+ Returns
+ -------
+ tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]
+ Arrays containing peak centres, amplitudes, and FWHMs.
+ """
+ centres = [
+ p.centre.value if isinstance(p.centre, Parameter) else p.centre
+ for p in peaks
+ ]
+ amplitudes = [
+ p.amplitude.value if isinstance(p.amplitude, Parameter) else p.amplitude
+ for p in peaks
+ ]
+ fwhms = [
+ p.fwhm.value if isinstance(p.fwhm, Parameter) else p.fwhm for p in peaks
+ ]
+ return np.array(centres), np.array(amplitudes), np.array(fwhms)
+
+ def middle_elements(self, lst: list):
+ """Return the central element(s) from a list.
+
+ If the list length is odd, returns the middle three elements. If even,
+ returns the two elements at the center of the list.
+ """
+ n = len(lst)
+ mid = n // 2
+
+ if n % 2 == 0:
+ return lst[mid - 1 : mid + 1] # 2 elements
+ else:
+ return lst[mid - 1 : mid + 2] # 3 elements
+
+ def get_middle_peaks(self):
+ """Return the central peaks from the current sample and capillary list.
+
+ This is useful for selecting the most representative peaks from the
+ middle of the detector pattern.
+ """
+ middle_peaks = self.middle_elements(self.sample_and_capillary)
+
+ return middle_peaks
+
+ def get_sample_centre(self) -> SampleCenteringResult:
+ middle_peaks = self.get_middle_peaks()
+ centres, amplitudes, fwhms = self.peaks_to_arrays(middle_peaks)
+
+ scores = fwhms * amplitudes
+ max_index = np.argmax(scores)
+
+ sample_centre = centres[max_index]
+
+ self.centre = sample_centre
+
+ return SampleCenteringResult(
+ centre=sample_centre, peaks=middle_peaks, scores=scores.tolist()
+ )
+
+ # def get_best_peaks(self):
+ # middle_peaks = self.get_middle_peaks()
+ # centres, amplitudes, fwhms = self.peaks_to_arrays(self.sample_and_capillary)
+
+ # scores = fwhms * amplitudes
+ # sort_index = np.argsort(scores)
+
+ # centre_distance = np.abs(centres - np.mean(centres))
+ # centre_distance[centre_distance == 0] = 1e-12
+
+ # centre_scores = normalise(np.log10(centre_distance))
+
+ # for cen, amp, fw, cs, score in zip(
+ # centres, amplitudes, fwhms, centre_scores, scores, strict=True
+ # ):
+ # print(cen, amp, fw, cs, score)
+
+
+def sample_alignment_model_builder(
+ data: XYEData | str, peak_type: str = "gaussian"
+) -> SampleAligner:
+ """Construct a SampleAligner from XYE data or a CSV file path, and a peak type
+ A sample aligner is what is used to align an abtract data set (usually a sample)
+
+ Parameters
+ ----------
+ data:
+ XYEData instance or a path to a CSV file containing x, y, and e data.
+ peak_type:
+ The peak model type to use when generating initial peaks.
+
+ Returns
+ -------
+ SampleAligner
+ A model with estimated background and initial peak definitions.
+ """
+ if isinstance(data, str):
+ data = XYEData.from_csv(data)
+
+ background = ConstantBackground.estimate(data.x, data.y)
+ sample_alignment_model = SampleAligner(data=data, background=background)
+ sample_alignment_model.get_initial_peaks(peak_type=peak_type)
+
+ return sample_alignment_model
+
+
+def run_sample_alignment(data: XYEData | str) -> SampleAligner:
+ gauss_model = sample_alignment_model_builder(data, "gaussian")
+ _, gauss_model, gauss_result = gauss_model.refine()
+
+ tophat_model = sample_alignment_model_builder(data, "tophat")
+ _, tophat_model, tophat_result = tophat_model.refine()
+
+ if gauss_result.cost < tophat_result.cost:
+ print("gaussian wins")
+ best_model = gauss_model
+ else:
+ print("top hat wins")
+ best_model = tophat_model
+
+ # sample_centre = best_model.get_best_peaks()
+ best_model.get_sample_centre()
+
+ # SampleCenteringResult(centre=sample_centre, peaks=)
+
+ return best_model
+
+
+def sample_alignment(
+ filepath: str | Path, dataset_path: str, beamline: str | None = None
+):
+ if (beamline is not None) and (not beamline.startswith("i")):
+ print(f"{beamline} must start with i, eg i15-1, or i11")
+
+ data = BaseDataLoader(filepath=filepath, data_path=dataset_path)
+ summed_frames = data.sum_frames()
+ index = np.linspace(0, len(summed_frames), len(summed_frames))
+
+ xyedata = XYEData(x=index, y=summed_frames)
+ best_model = run_sample_alignment(data=xyedata)
+
+ sample_centre_result = best_model.get_sample_centre()
+ sample_centre_result.deparameterise_all()
+
+ plot_data = best_model.get_plot_data()
+
+ if beamline is not None:
+ plot_data.publish(beamline=beamline)
+
+ return sample_centre_result
+
+
+if __name__ == "__main__":
+ BEAMLINE = "i15-1"
+
+ folder = "/workspaces/XRPD-Toolbox/src/xrpd_toolbox/i15_1/sample_alignment_data"
+
+ sample_alignment_files = [os.path.join(folder, f) for f in os.listdir(folder)]
+
+ listener = Messenger("i15-1", destinations=["/topic/public.data.plot"])
+
+ for filepath in sample_alignment_files:
+ best_model = run_sample_alignment(data=filepath)
+
+ sample_centre_result = best_model.get_sample_centre()
+ # _ = best_model.get_best_peaks()
+
+ sample_centre_result.deparameterise_all()
+
+ print(sample_centre_result.model_dump_json())
+
+ plot_data = best_model.get_plot_data()
+ plot_data.plot()
+
+ # plot_data.publish(BEAMLINE)
+
+ # messenger.send_plot_data(plot_data)
+ # listener.listen(max_iter=5)
+ # listener.stop()
+
+ print("-----")
diff --git a/src/xrpd_toolbox/i15_1/sample_alignment_data/GaIn-94521.csv b/src/xrpd_toolbox/i15_1/sample_alignment_data/GaIn-94521.csv
new file mode 100644
index 0000000..fa1956e
--- /dev/null
+++ b/src/xrpd_toolbox/i15_1/sample_alignment_data/GaIn-94521.csv
@@ -0,0 +1,121 @@
+0.000000000000000000e+00 -4.942632500000000000e+05
+1.008333333333333304e+00 -2.682030000000000000e+05
+2.016666666666666607e+00 -9.406111250000000000e+05
+3.024999999999999911e+00 -5.795606250000000000e+05
+4.033333333333333215e+00 1.029351000000000000e+06
+5.041666666666666075e+00 -8.120321250000000000e+05
+6.049999999999999822e+00 -1.611372750000000000e+06
+7.058333333333333570e+00 -1.159415625000000000e+06
+8.066666666666666430e+00 -4.752855000000000000e+05
+9.074999999999999289e+00 -1.044992625000000000e+06
+1.008333333333333215e+01 -1.096205625000000000e+06
+1.109166666666666679e+01 -1.812264625000000000e+06
+1.209999999999999964e+01 -6.532726250000000000e+05
+1.310833333333333250e+01 -2.199323000000000000e+06
+1.411666666666666714e+01 -1.836659125000000000e+06
+1.512500000000000000e+01 -1.416606125000000000e+06
+1.613333333333333286e+01 -4.033614500000000000e+06
+1.714166666666666572e+01 -1.308484125000000000e+06
+1.814999999999999858e+01 -3.033754500000000000e+06
+1.915833333333333144e+01 -4.853658000000000000e+06
+2.016666666666666430e+01 -1.641913625000000000e+06
+2.117500000000000071e+01 -2.823653500000000000e+06
+2.218333333333333357e+01 -2.504555500000000000e+06
+2.319166666666666643e+01 -6.514760000000000000e+05
+2.419999999999999929e+01 -1.861670625000000000e+06
+2.520833333333333215e+01 -2.473223500000000000e+06
+2.621666666666666501e+01 -3.984078500000000000e+06
+2.722499999999999787e+01 -1.503500125000000000e+06
+2.823333333333333428e+01 -2.957918000000000000e+06
+2.924166666666666714e+01 -1.089009500000000000e+06
+3.025000000000000000e+01 1.397393400000000000e+07
+3.125833333333333286e+01 4.656908800000000000e+07
+3.226666666666666572e+01 1.132956880000000000e+08
+3.327499999999999858e+01 1.985058080000000000e+08
+3.428333333333333144e+01 2.473709440000000000e+08
+3.529166666666666430e+01 2.560948800000000000e+08
+3.629999999999999716e+01 2.586607360000000000e+08
+3.730833333333333002e+01 2.623426400000000000e+08
+3.831666666666666288e+01 2.629969440000000000e+08
+3.932499999999999574e+01 2.629731200000000000e+08
+4.033333333333332860e+01 2.637951680000000000e+08
+4.134166666666666856e+01 2.639682400000000000e+08
+4.235000000000000142e+01 2.633032640000000000e+08
+4.335833333333333428e+01 2.626618880000000000e+08
+4.436666666666666714e+01 2.626556480000000000e+08
+4.537500000000000000e+01 2.626733440000000000e+08
+4.638333333333333286e+01 2.625541600000000000e+08
+4.739166666666666572e+01 2.640034720000000000e+08
+4.839999999999999858e+01 2.627830720000000000e+08
+4.940833333333333144e+01 2.616420960000000000e+08
+5.041666666666666430e+01 2.642833280000000000e+08
+5.142499999999999716e+01 2.625634400000000000e+08
+5.243333333333333002e+01 2.633835680000000000e+08
+5.344166666666666288e+01 2.629843840000000000e+08
+5.444999999999999574e+01 2.617662080000000000e+08
+5.545833333333332860e+01 2.636600480000000000e+08
+5.646666666666666856e+01 2.616656320000000000e+08
+5.747500000000000142e+01 2.619733760000000000e+08
+5.848333333333333428e+01 2.627042720000000000e+08
+5.949166666666666714e+01 2.624980320000000000e+08
+6.050000000000000000e+01 2.635790400000000000e+08
+6.150833333333333286e+01 2.643184160000000000e+08
+6.251666666666666572e+01 2.634902560000000000e+08
+6.352499999999999858e+01 2.636081760000000000e+08
+6.453333333333333144e+01 2.626369440000000000e+08
+6.554166666666667140e+01 2.642100640000000000e+08
+6.654999999999999716e+01 2.640754720000000000e+08
+6.755833333333333712e+01 2.632022400000000000e+08
+6.856666666666666288e+01 2.639891200000000000e+08
+6.957500000000000284e+01 2.627248640000000000e+08
+7.058333333333332860e+01 2.622544480000000000e+08
+7.159166666666666856e+01 2.622233760000000000e+08
+7.259999999999999432e+01 2.646480640000000000e+08
+7.360833333333333428e+01 2.629961920000000000e+08
+7.461666666666666003e+01 2.645904960000000000e+08
+7.562500000000000000e+01 2.623220800000000000e+08
+7.663333333333332575e+01 2.638705600000000000e+08
+7.764166666666666572e+01 2.634112800000000000e+08
+7.864999999999999147e+01 2.619528960000000000e+08
+7.965833333333333144e+01 2.647644160000000000e+08
+8.066666666666665719e+01 2.645945760000000000e+08
+8.167499999999999716e+01 2.636450400000000000e+08
+8.268333333333333712e+01 2.627555200000000000e+08
+8.369166666666666288e+01 2.645808960000000000e+08
+8.470000000000000284e+01 2.630552000000000000e+08
+8.570833333333332860e+01 2.663572160000000000e+08
+8.671666666666666856e+01 2.675390560000000000e+08
+8.772499999999999432e+01 2.691481600000000000e+08
+8.873333333333333428e+01 2.689531200000000000e+08
+8.974166666666666003e+01 2.690643840000000000e+08
+9.075000000000000000e+01 2.684619840000000000e+08
+9.175833333333332575e+01 2.684525120000000000e+08
+9.276666666666666572e+01 2.699386560000000000e+08
+9.377499999999999147e+01 2.684809600000000000e+08
+9.478333333333333144e+01 2.680434240000000000e+08
+9.579166666666665719e+01 2.683393440000000000e+08
+9.679999999999999716e+01 2.671742240000000000e+08
+9.780833333333333712e+01 2.679014560000000000e+08
+9.881666666666666288e+01 2.683104000000000000e+08
+9.982500000000000284e+01 2.697334720000000000e+08
+1.008333333333333286e+02 2.705280640000000000e+08
+1.018416666666666686e+02 2.703045120000000000e+08
+1.028499999999999943e+02 2.694526400000000000e+08
+1.038583333333333343e+02 2.694515200000000000e+08
+1.048666666666666600e+02 2.692971840000000000e+08
+1.058750000000000000e+02 2.654848320000000000e+08
+1.068833333333333258e+02 2.234591680000000000e+08
+1.078916666666666657e+02 1.336448960000000000e+08
+1.088999999999999915e+02 6.488301600000000000e+07
+1.099083333333333314e+02 5.173446400000000000e+07
+1.109166666666666572e+02 5.597864000000000000e+07
+1.119249999999999972e+02 5.737546400000000000e+07
+1.129333333333333371e+02 5.261663200000000000e+07
+1.139416666666666629e+02 5.312282400000000000e+07
+1.149500000000000028e+02 5.529982000000000000e+07
+1.159583333333333286e+02 5.261446400000000000e+07
+1.169666666666666686e+02 4.004167600000000000e+07
+1.179749999999999943e+02 3.187776000000000000e+07
+1.189833333333333343e+02 3.305045400000000000e+07
+1.199916666666666600e+02 3.191910000000000000e+07
+1.210000000000000000e+02 3.062903000000000000e+07
diff --git a/src/xrpd_toolbox/i15_1/sample_alignment_data/HKUST1-95018.csv b/src/xrpd_toolbox/i15_1/sample_alignment_data/HKUST1-95018.csv
new file mode 100644
index 0000000..6858d6f
--- /dev/null
+++ b/src/xrpd_toolbox/i15_1/sample_alignment_data/HKUST1-95018.csv
@@ -0,0 +1,121 @@
+0.000000000000000000e+00 3.130599800000000000e+07
+1.008333333333333304e+00 3.093492400000000000e+07
+2.016666666666666607e+00 3.002946400000000000e+07
+3.024999999999999911e+00 3.031497000000000000e+07
+4.033333333333333215e+00 3.037097800000000000e+07
+5.041666666666666075e+00 2.958688000000000000e+07
+6.049999999999999822e+00 2.999681600000000000e+07
+7.058333333333333570e+00 2.995722600000000000e+07
+8.066666666666666430e+00 2.990089600000000000e+07
+9.074999999999999289e+00 2.962231200000000000e+07
+1.008333333333333215e+01 2.958536000000000000e+07
+1.109166666666666679e+01 2.972692600000000000e+07
+1.209999999999999964e+01 3.092850800000000000e+07
+1.310833333333333250e+01 2.918844600000000000e+07
+1.411666666666666714e+01 3.051542800000000000e+07
+1.512500000000000000e+01 2.968539600000000000e+07
+1.613333333333333286e+01 3.087203200000000000e+07
+1.714166666666666572e+01 3.116345400000000000e+07
+1.814999999999999858e+01 3.111531200000000000e+07
+1.915833333333333144e+01 3.056914800000000000e+07
+2.016666666666666430e+01 3.210825000000000000e+07
+2.117500000000000071e+01 3.256551200000000000e+07
+2.218333333333333357e+01 3.038399600000000000e+07
+2.319166666666666643e+01 3.191833200000000000e+07
+2.419999999999999929e+01 3.166461000000000000e+07
+2.520833333333333215e+01 3.052523200000000000e+07
+2.621666666666666501e+01 3.144023400000000000e+07
+2.722499999999999787e+01 3.162286200000000000e+07
+2.823333333333333428e+01 3.110690400000000000e+07
+2.924166666666666714e+01 3.118338200000000000e+07
+3.025000000000000000e+01 3.154022000000000000e+07
+3.125833333333333286e+01 3.087176600000000000e+07
+3.226666666666666572e+01 2.982390000000000000e+07
+3.327499999999999858e+01 3.055512800000000000e+07
+3.428333333333333144e+01 3.103538800000000000e+07
+3.529166666666666430e+01 2.899421400000000000e+07
+3.629999999999999716e+01 3.055985600000000000e+07
+3.730833333333333002e+01 2.906779800000000000e+07
+3.831666666666666288e+01 3.005662800000000000e+07
+3.932499999999999574e+01 3.421096800000000000e+07
+4.033333333333332860e+01 5.134942400000000000e+07
+4.134166666666666856e+01 8.194876800000000000e+07
+4.235000000000000142e+01 9.648438400000000000e+07
+4.335833333333333428e+01 8.772667200000000000e+07
+4.436666666666666714e+01 7.765228800000000000e+07
+4.537500000000000000e+01 7.401430400000000000e+07
+4.638333333333333286e+01 7.518102400000000000e+07
+4.739166666666666572e+01 7.406272800000000000e+07
+4.839999999999999858e+01 7.254305600000000000e+07
+4.940833333333333144e+01 7.408316800000000000e+07
+5.041666666666666430e+01 7.080732000000000000e+07
+5.142499999999999716e+01 6.812671200000000000e+07
+5.243333333333333002e+01 6.573288800000000000e+07
+5.344166666666666288e+01 6.368700800000000000e+07
+5.444999999999999574e+01 6.375175600000000000e+07
+5.545833333333332860e+01 6.524612400000000000e+07
+5.646666666666666856e+01 6.847843200000000000e+07
+5.747500000000000142e+01 7.063230400000000000e+07
+5.848333333333333428e+01 7.241953600000000000e+07
+5.949166666666666714e+01 6.865308800000000000e+07
+6.050000000000000000e+01 6.060246800000000000e+07
+6.150833333333333286e+01 5.881985600000000000e+07
+6.251666666666666572e+01 5.868864800000000000e+07
+6.352499999999999858e+01 5.969702800000000000e+07
+6.453333333333333144e+01 6.032499600000000000e+07
+6.554166666666667140e+01 5.924179600000000000e+07
+6.654999999999999716e+01 6.009128800000000000e+07
+6.755833333333333712e+01 6.133314800000000000e+07
+6.856666666666666288e+01 6.098732800000000000e+07
+6.957500000000000284e+01 6.383683200000000000e+07
+7.058333333333332860e+01 6.377981600000000000e+07
+7.159166666666666856e+01 6.276036800000000000e+07
+7.259999999999999432e+01 6.481506400000000000e+07
+7.360833333333333428e+01 6.438474800000000000e+07
+7.461666666666666003e+01 6.702049600000000000e+07
+7.562500000000000000e+01 6.252268000000000000e+07
+7.663333333333332575e+01 5.890271200000000000e+07
+7.764166666666666572e+01 5.811528000000000000e+07
+7.864999999999999147e+01 5.824042400000000000e+07
+7.965833333333333144e+01 5.745035600000000000e+07
+8.066666666666665719e+01 5.907456800000000000e+07
+8.167499999999999716e+01 5.867616800000000000e+07
+8.268333333333333712e+01 5.794715200000000000e+07
+8.369166666666666288e+01 6.164179200000000000e+07
+8.470000000000000284e+01 6.315317600000000000e+07
+8.570833333333332860e+01 6.694786400000000000e+07
+8.671666666666666856e+01 6.490659200000000000e+07
+8.772499999999999432e+01 6.002080800000000000e+07
+8.873333333333333428e+01 5.942921200000000000e+07
+8.974166666666666003e+01 5.942940000000000000e+07
+9.075000000000000000e+01 5.821060800000000000e+07
+9.175833333333332575e+01 5.807120000000000000e+07
+9.276666666666666572e+01 5.756773600000000000e+07
+9.377499999999999147e+01 5.847058400000000000e+07
+9.478333333333333144e+01 6.453256800000000000e+07
+9.579166666666665719e+01 6.031956800000000000e+07
+9.679999999999999716e+01 5.942517200000000000e+07
+9.780833333333333712e+01 5.754168400000000000e+07
+9.881666666666666288e+01 6.280173200000000000e+07
+9.982500000000000284e+01 5.596982400000000000e+07
+1.008333333333333286e+02 5.456378400000000000e+07
+1.018416666666666686e+02 5.661342000000000000e+07
+1.028499999999999943e+02 5.548591200000000000e+07
+1.038583333333333343e+02 5.662965600000000000e+07
+1.048666666666666600e+02 5.655254400000000000e+07
+1.058750000000000000e+02 5.708367200000000000e+07
+1.068833333333333258e+02 5.601358400000000000e+07
+1.078916666666666657e+02 5.657220000000000000e+07
+1.088999999999999915e+02 5.455332800000000000e+07
+1.099083333333333314e+02 5.562106400000000000e+07
+1.109166666666666572e+02 5.471967600000000000e+07
+1.119249999999999972e+02 5.561060000000000000e+07
+1.129333333333333371e+02 5.551432800000000000e+07
+1.139416666666666629e+02 5.425797600000000000e+07
+1.149500000000000028e+02 5.468420000000000000e+07
+1.159583333333333286e+02 5.618793600000000000e+07
+1.169666666666666686e+02 5.743634400000000000e+07
+1.179749999999999943e+02 5.580818400000000000e+07
+1.189833333333333343e+02 5.689840800000000000e+07
+1.199916666666666600e+02 5.631702000000000000e+07
+1.210000000000000000e+02 5.702631600000000000e+07
diff --git a/src/xrpd_toolbox/i15_1/sample_alignment_data/NIST_Si-95016.csv b/src/xrpd_toolbox/i15_1/sample_alignment_data/NIST_Si-95016.csv
new file mode 100644
index 0000000..be50b84
--- /dev/null
+++ b/src/xrpd_toolbox/i15_1/sample_alignment_data/NIST_Si-95016.csv
@@ -0,0 +1,121 @@
+0.000000000000000000e+00 4.592435600000000000e+07
+1.008333333333333304e+00 4.589576800000000000e+07
+2.016666666666666607e+00 4.489067200000000000e+07
+3.024999999999999911e+00 4.505381600000000000e+07
+4.033333333333333215e+00 4.407009600000000000e+07
+5.041666666666666075e+00 4.426360000000000000e+07
+6.049999999999999822e+00 4.396980000000000000e+07
+7.058333333333333570e+00 4.373070400000000000e+07
+8.066666666666666430e+00 4.464439200000000000e+07
+9.074999999999999289e+00 4.282458000000000000e+07
+1.008333333333333215e+01 4.530382400000000000e+07
+1.109166666666666679e+01 4.359265600000000000e+07
+1.209999999999999964e+01 4.293948800000000000e+07
+1.310833333333333250e+01 4.332887200000000000e+07
+1.411666666666666714e+01 4.336192800000000000e+07
+1.512500000000000000e+01 4.382769200000000000e+07
+1.613333333333333286e+01 4.316155200000000000e+07
+1.714166666666666572e+01 4.304653600000000000e+07
+1.814999999999999858e+01 4.266971200000000000e+07
+1.915833333333333144e+01 4.258350000000000000e+07
+2.016666666666666430e+01 4.352450400000000000e+07
+2.117500000000000071e+01 4.243902000000000000e+07
+2.218333333333333357e+01 4.283452000000000000e+07
+2.319166666666666643e+01 4.158014400000000000e+07
+2.419999999999999929e+01 4.119976000000000000e+07
+2.520833333333333215e+01 4.087552000000000000e+07
+2.621666666666666501e+01 4.091136400000000000e+07
+2.722499999999999787e+01 4.239316000000000000e+07
+2.823333333333333428e+01 4.287269200000000000e+07
+2.924166666666666714e+01 4.120102400000000000e+07
+3.025000000000000000e+01 4.015220800000000000e+07
+3.125833333333333286e+01 4.016066400000000000e+07
+3.226666666666666572e+01 3.967920800000000000e+07
+3.327499999999999858e+01 3.997936800000000000e+07
+3.428333333333333144e+01 4.007656800000000000e+07
+3.529166666666666430e+01 4.025739200000000000e+07
+3.629999999999999716e+01 4.124155200000000000e+07
+3.730833333333333002e+01 4.148746400000000000e+07
+3.831666666666666288e+01 4.180901600000000000e+07
+3.932499999999999574e+01 4.140894400000000000e+07
+4.033333333333332860e+01 4.306017600000000000e+07
+4.134166666666666856e+01 4.249212800000000000e+07
+4.235000000000000142e+01 4.041435600000000000e+07
+4.335833333333333428e+01 4.152126800000000000e+07
+4.436666666666666714e+01 4.121411600000000000e+07
+4.537500000000000000e+01 4.192129600000000000e+07
+4.638333333333333286e+01 4.109799200000000000e+07
+4.739166666666666572e+01 4.033575200000000000e+07
+4.839999999999999858e+01 4.107360800000000000e+07
+4.940833333333333144e+01 4.144730800000000000e+07
+5.041666666666666430e+01 3.966359600000000000e+07
+5.142499999999999716e+01 4.033454400000000000e+07
+5.243333333333333002e+01 4.060265600000000000e+07
+5.344166666666666288e+01 4.094939200000000000e+07
+5.444999999999999574e+01 4.015024400000000000e+07
+5.545833333333332860e+01 4.134372800000000000e+07
+5.646666666666666856e+01 4.179562800000000000e+07
+5.747500000000000142e+01 3.928744800000000000e+07
+5.848333333333333428e+01 4.080628400000000000e+07
+5.949166666666666714e+01 4.106670400000000000e+07
+6.050000000000000000e+01 4.337183600000000000e+07
+6.150833333333333286e+01 7.141752000000000000e+07
+6.251666666666666572e+01 1.156610400000000000e+08
+6.352499999999999858e+01 1.449754720000000000e+08
+6.453333333333333144e+01 1.381191200000000000e+08
+6.554166666666667140e+01 1.168592960000000000e+08
+6.654999999999999716e+01 1.054670480000000000e+08
+6.755833333333333712e+01 1.028518720000000000e+08
+6.856666666666666288e+01 1.016387040000000000e+08
+6.957500000000000284e+01 1.029092320000000000e+08
+7.058333333333332860e+01 1.037260640000000000e+08
+7.159166666666666856e+01 1.079606240000000000e+08
+7.259999999999999432e+01 1.086168480000000000e+08
+7.360833333333333428e+01 1.102378400000000000e+08
+7.461666666666666003e+01 1.135538880000000000e+08
+7.562500000000000000e+01 1.135737680000000000e+08
+7.663333333333332575e+01 1.144591200000000000e+08
+7.764166666666666572e+01 1.149796800000000000e+08
+7.864999999999999147e+01 1.165001600000000000e+08
+7.965833333333333144e+01 1.161007920000000000e+08
+8.066666666666665719e+01 1.152422320000000000e+08
+8.167499999999999716e+01 1.161203280000000000e+08
+8.268333333333333712e+01 1.154573760000000000e+08
+8.369166666666666288e+01 1.154438720000000000e+08
+8.470000000000000284e+01 1.174812000000000000e+08
+8.570833333333332860e+01 1.164923520000000000e+08
+8.671666666666666856e+01 1.158027200000000000e+08
+8.772499999999999432e+01 1.162023360000000000e+08
+8.873333333333333428e+01 1.155393760000000000e+08
+8.974166666666666003e+01 1.157245840000000000e+08
+9.075000000000000000e+01 1.157727920000000000e+08
+9.175833333333332575e+01 1.144853360000000000e+08
+9.276666666666666572e+01 1.146373280000000000e+08
+9.377499999999999147e+01 1.137720480000000000e+08
+9.478333333333333144e+01 1.122964560000000000e+08
+9.579166666666665719e+01 1.129900640000000000e+08
+9.679999999999999716e+01 1.123122320000000000e+08
+9.780833333333333712e+01 1.119554160000000000e+08
+9.881666666666666288e+01 1.105969760000000000e+08
+9.982500000000000284e+01 1.096567360000000000e+08
+1.008333333333333286e+02 1.118300160000000000e+08
+1.018416666666666686e+02 1.097313760000000000e+08
+1.028499999999999943e+02 1.083385040000000000e+08
+1.038583333333333343e+02 1.063102080000000000e+08
+1.048666666666666600e+02 1.065440160000000000e+08
+1.058750000000000000e+02 1.048883360000000000e+08
+1.068833333333333258e+02 1.079413200000000000e+08
+1.078916666666666657e+02 1.037431200000000000e+08
+1.088999999999999915e+02 1.018428880000000000e+08
+1.099083333333333314e+02 1.059902800000000000e+08
+1.109166666666666572e+02 1.090612240000000000e+08
+1.119249999999999972e+02 1.083638480000000000e+08
+1.129333333333333371e+02 1.125011680000000000e+08
+1.139416666666666629e+02 1.100336000000000000e+08
+1.149500000000000028e+02 1.093645520000000000e+08
+1.159583333333333286e+02 1.095052160000000000e+08
+1.169666666666666686e+02 1.098423600000000000e+08
+1.179749999999999943e+02 1.096359920000000000e+08
+1.189833333333333343e+02 1.095714720000000000e+08
+1.199916666666666600e+02 1.088480000000000000e+08
+1.210000000000000000e+02 1.096078240000000000e+08
diff --git a/src/xrpd_toolbox/i15_1/sample_alignment_data/NaCl-95017.csv b/src/xrpd_toolbox/i15_1/sample_alignment_data/NaCl-95017.csv
new file mode 100644
index 0000000..5f92bca
--- /dev/null
+++ b/src/xrpd_toolbox/i15_1/sample_alignment_data/NaCl-95017.csv
@@ -0,0 +1,121 @@
+0.000000000000000000e+00 3.522964000000000000e+07
+1.008333333333333304e+00 3.568271200000000000e+07
+2.016666666666666607e+00 3.556776000000000000e+07
+3.024999999999999911e+00 3.340027000000000000e+07
+4.033333333333333215e+00 3.516885600000000000e+07
+5.041666666666666075e+00 3.520857200000000000e+07
+6.049999999999999822e+00 3.758441600000000000e+07
+7.058333333333333570e+00 3.599689200000000000e+07
+8.066666666666666430e+00 3.657045600000000000e+07
+9.074999999999999289e+00 3.580348000000000000e+07
+1.008333333333333215e+01 3.714878400000000000e+07
+1.109166666666666679e+01 3.662171600000000000e+07
+1.209999999999999964e+01 3.411759600000000000e+07
+1.310833333333333250e+01 3.577781200000000000e+07
+1.411666666666666714e+01 3.505512000000000000e+07
+1.512500000000000000e+01 3.420848000000000000e+07
+1.613333333333333286e+01 3.662299200000000000e+07
+1.714166666666666572e+01 3.439826800000000000e+07
+1.814999999999999858e+01 3.579360000000000000e+07
+1.915833333333333144e+01 4.078491200000000000e+07
+2.016666666666666430e+01 6.689615600000000000e+07
+2.117500000000000071e+01 1.114236400000000000e+08
+2.218333333333333357e+01 1.413294240000000000e+08
+2.319166666666666643e+01 1.443977760000000000e+08
+2.419999999999999929e+01 1.340049200000000000e+08
+2.520833333333333215e+01 1.269089280000000000e+08
+2.621666666666666501e+01 1.273327920000000000e+08
+2.722499999999999787e+01 1.269708560000000000e+08
+2.823333333333333428e+01 1.271573520000000000e+08
+2.924166666666666714e+01 1.265738560000000000e+08
+3.025000000000000000e+01 1.225522240000000000e+08
+3.125833333333333286e+01 1.253445440000000000e+08
+3.226666666666666572e+01 1.252980720000000000e+08
+3.327499999999999858e+01 1.269196320000000000e+08
+3.428333333333333144e+01 1.294372480000000000e+08
+3.529166666666666430e+01 1.349380000000000000e+08
+3.629999999999999716e+01 1.383393280000000000e+08
+3.730833333333333002e+01 1.414430720000000000e+08
+3.831666666666666288e+01 1.440518720000000000e+08
+3.932499999999999574e+01 1.398744320000000000e+08
+4.033333333333332860e+01 1.391776320000000000e+08
+4.134166666666666856e+01 1.395795520000000000e+08
+4.235000000000000142e+01 1.387792320000000000e+08
+4.335833333333333428e+01 1.398985600000000000e+08
+4.436666666666666714e+01 1.386660800000000000e+08
+4.537500000000000000e+01 1.374674080000000000e+08
+4.638333333333333286e+01 1.406484640000000000e+08
+4.739166666666666572e+01 1.416141760000000000e+08
+4.839999999999999858e+01 1.416871520000000000e+08
+4.940833333333333144e+01 1.409804960000000000e+08
+5.041666666666666430e+01 1.407893120000000000e+08
+5.142499999999999716e+01 1.420301440000000000e+08
+5.243333333333333002e+01 1.411359520000000000e+08
+5.344166666666666288e+01 1.396859840000000000e+08
+5.444999999999999574e+01 1.421249920000000000e+08
+5.545833333333332860e+01 1.420967040000000000e+08
+5.646666666666666856e+01 1.404420800000000000e+08
+5.747500000000000142e+01 1.389450720000000000e+08
+5.848333333333333428e+01 1.405049280000000000e+08
+5.949166666666666714e+01 1.398428480000000000e+08
+6.050000000000000000e+01 1.394228640000000000e+08
+6.150833333333333286e+01 1.388050560000000000e+08
+6.251666666666666572e+01 1.381165920000000000e+08
+6.352499999999999858e+01 1.401671680000000000e+08
+6.453333333333333144e+01 1.395625120000000000e+08
+6.554166666666667140e+01 1.379917760000000000e+08
+6.654999999999999716e+01 1.383876960000000000e+08
+6.755833333333333712e+01 1.414599680000000000e+08
+6.856666666666666288e+01 1.413861760000000000e+08
+6.957500000000000284e+01 1.398839200000000000e+08
+7.058333333333332860e+01 1.407741920000000000e+08
+7.159166666666666856e+01 1.381179200000000000e+08
+7.259999999999999432e+01 1.378299200000000000e+08
+7.360833333333333428e+01 1.378696960000000000e+08
+7.461666666666666003e+01 1.367285120000000000e+08
+7.562500000000000000e+01 1.371200000000000000e+08
+7.663333333333332575e+01 1.372702400000000000e+08
+7.764166666666666572e+01 1.348669120000000000e+08
+7.864999999999999147e+01 1.374659200000000000e+08
+7.965833333333333144e+01 1.400137920000000000e+08
+8.066666666666665719e+01 1.415123840000000000e+08
+8.167499999999999716e+01 1.416187200000000000e+08
+8.268333333333333712e+01 1.392053920000000000e+08
+8.369166666666666288e+01 1.389063360000000000e+08
+8.470000000000000284e+01 1.372563200000000000e+08
+8.570833333333332860e+01 1.378095360000000000e+08
+8.671666666666666856e+01 1.355738240000000000e+08
+8.772499999999999432e+01 1.371024160000000000e+08
+8.873333333333333428e+01 1.356694400000000000e+08
+8.974166666666666003e+01 1.348125280000000000e+08
+9.075000000000000000e+01 1.364826080000000000e+08
+9.175833333333332575e+01 1.348311680000000000e+08
+9.276666666666666572e+01 1.322980960000000000e+08
+9.377499999999999147e+01 1.347531360000000000e+08
+9.478333333333333144e+01 1.358829600000000000e+08
+9.579166666666665719e+01 1.334823680000000000e+08
+9.679999999999999716e+01 1.316352320000000000e+08
+9.780833333333333712e+01 1.297853600000000000e+08
+9.881666666666666288e+01 1.325978720000000000e+08
+9.982500000000000284e+01 1.379783040000000000e+08
+1.008333333333333286e+02 1.384021760000000000e+08
+1.018416666666666686e+02 1.339016720000000000e+08
+1.028499999999999943e+02 1.339786000000000000e+08
+1.038583333333333343e+02 1.327476320000000000e+08
+1.048666666666666600e+02 1.343115200000000000e+08
+1.058750000000000000e+02 1.351975680000000000e+08
+1.068833333333333258e+02 1.335174880000000000e+08
+1.078916666666666657e+02 1.298355680000000000e+08
+1.088999999999999915e+02 1.228193840000000000e+08
+1.099083333333333314e+02 1.160383040000000000e+08
+1.109166666666666572e+02 1.071615520000000000e+08
+1.119249999999999972e+02 1.014399040000000000e+08
+1.129333333333333371e+02 1.036868480000000000e+08
+1.139416666666666629e+02 1.023876480000000000e+08
+1.149500000000000028e+02 1.050239040000000000e+08
+1.159583333333333286e+02 1.066595120000000000e+08
+1.169666666666666686e+02 1.098060480000000000e+08
+1.179749999999999943e+02 1.085492960000000000e+08
+1.189833333333333343e+02 1.051797120000000000e+08
+1.199916666666666600e+02 1.068129280000000000e+08
+1.210000000000000000e+02 1.111378080000000000e+08
diff --git a/src/xrpd_toolbox/i15_1/sample_alignment_data/carbon_black-94519.csv b/src/xrpd_toolbox/i15_1/sample_alignment_data/carbon_black-94519.csv
new file mode 100644
index 0000000..4c35b46
--- /dev/null
+++ b/src/xrpd_toolbox/i15_1/sample_alignment_data/carbon_black-94519.csv
@@ -0,0 +1,121 @@
+0.000000000000000000e+00 1.377591680000000000e+08
+1.008333333333333304e+00 1.406833120000000000e+08
+2.016666666666666607e+00 1.397596800000000000e+08
+3.024999999999999911e+00 1.405597760000000000e+08
+4.033333333333333215e+00 1.396667840000000000e+08
+5.041666666666666075e+00 1.413643520000000000e+08
+6.049999999999999822e+00 1.423704640000000000e+08
+7.058333333333333570e+00 1.437309760000000000e+08
+8.066666666666666430e+00 1.445266400000000000e+08
+9.074999999999999289e+00 1.436100960000000000e+08
+1.008333333333333215e+01 1.452912800000000000e+08
+1.109166666666666679e+01 1.445481280000000000e+08
+1.209999999999999964e+01 1.439958400000000000e+08
+1.310833333333333250e+01 1.460131520000000000e+08
+1.411666666666666714e+01 1.460922560000000000e+08
+1.512500000000000000e+01 1.445242240000000000e+08
+1.613333333333333286e+01 1.452464960000000000e+08
+1.714166666666666572e+01 1.478931840000000000e+08
+1.814999999999999858e+01 1.465644160000000000e+08
+1.915833333333333144e+01 1.475947520000000000e+08
+2.016666666666666430e+01 1.460047680000000000e+08
+2.117500000000000071e+01 1.485704960000000000e+08
+2.218333333333333357e+01 2.116406240000000000e+08
+2.319166666666666643e+01 5.109036480000000000e+08
+2.419999999999999929e+01 9.724240640000000000e+08
+2.520833333333333215e+01 1.246411776000000000e+09
+2.621666666666666501e+01 1.183032192000000000e+09
+2.722499999999999787e+01 9.740386560000000000e+08
+2.823333333333333428e+01 8.709547520000000000e+08
+2.924166666666666714e+01 8.625374720000000000e+08
+3.025000000000000000e+01 8.616341120000000000e+08
+3.125833333333333286e+01 8.618775040000000000e+08
+3.226666666666666572e+01 8.623905280000000000e+08
+3.327499999999999858e+01 8.614231040000000000e+08
+3.428333333333333144e+01 8.606934400000000000e+08
+3.529166666666666430e+01 8.597089280000000000e+08
+3.629999999999999716e+01 8.578350080000000000e+08
+3.730833333333333002e+01 8.541014400000000000e+08
+3.831666666666666288e+01 8.516895360000000000e+08
+3.932499999999999574e+01 8.494691200000000000e+08
+4.033333333333332860e+01 8.447370240000000000e+08
+4.134166666666666856e+01 8.429112320000000000e+08
+4.235000000000000142e+01 8.407536000000000000e+08
+4.335833333333333428e+01 8.360875520000000000e+08
+4.436666666666666714e+01 8.335380480000000000e+08
+4.537500000000000000e+01 8.310956160000000000e+08
+4.638333333333333286e+01 8.259228160000000000e+08
+4.739166666666666572e+01 8.227412480000000000e+08
+4.839999999999999858e+01 8.190304000000000000e+08
+4.940833333333333144e+01 8.158649600000000000e+08
+5.041666666666666430e+01 8.108427520000000000e+08
+5.142499999999999716e+01 8.067724800000000000e+08
+5.243333333333333002e+01 8.044174080000000000e+08
+5.344166666666666288e+01 8.031783680000000000e+08
+5.444999999999999574e+01 8.015225600000000000e+08
+5.545833333333332860e+01 8.004728320000000000e+08
+5.646666666666666856e+01 8.017263360000000000e+08
+5.747500000000000142e+01 8.131904000000000000e+08
+5.848333333333333428e+01 8.131024640000000000e+08
+5.949166666666666714e+01 8.120432640000000000e+08
+6.050000000000000000e+01 8.105748480000000000e+08
+6.150833333333333286e+01 8.114499840000000000e+08
+6.251666666666666572e+01 8.085486080000000000e+08
+6.352499999999999858e+01 8.079965440000000000e+08
+6.453333333333333144e+01 8.064606720000000000e+08
+6.554166666666667140e+01 7.913469440000000000e+08
+6.654999999999999716e+01 7.162200960000000000e+08
+6.755833333333333712e+01 6.065536000000000000e+08
+6.856666666666666288e+01 5.624327040000000000e+08
+6.957500000000000284e+01 5.597957120000000000e+08
+7.058333333333332860e+01 5.594403840000000000e+08
+7.159166666666666856e+01 5.625560320000000000e+08
+7.259999999999999432e+01 5.607992960000000000e+08
+7.360833333333333428e+01 5.530339200000000000e+08
+7.461666666666666003e+01 5.551884800000000000e+08
+7.562500000000000000e+01 5.536418560000000000e+08
+7.663333333333332575e+01 5.534088960000000000e+08
+7.764166666666666572e+01 5.785730560000000000e+08
+7.864999999999999147e+01 5.659896960000000000e+08
+7.965833333333333144e+01 5.572739200000000000e+08
+8.066666666666665719e+01 5.584353920000000000e+08
+8.167499999999999716e+01 5.522748800000000000e+08
+8.268333333333333712e+01 5.422984960000000000e+08
+8.369166666666666288e+01 5.417317760000000000e+08
+8.470000000000000284e+01 5.429344640000000000e+08
+8.570833333333332860e+01 5.472798080000000000e+08
+8.671666666666666856e+01 5.460882560000000000e+08
+8.772499999999999432e+01 5.713745920000000000e+08
+8.873333333333333428e+01 5.581912320000000000e+08
+8.974166666666666003e+01 5.660707840000000000e+08
+9.075000000000000000e+01 5.492231680000000000e+08
+9.175833333333332575e+01 5.453797760000000000e+08
+9.276666666666666572e+01 5.369918720000000000e+08
+9.377499999999999147e+01 5.413032960000000000e+08
+9.478333333333333144e+01 5.505628160000000000e+08
+9.579166666666665719e+01 5.364636480000000000e+08
+9.679999999999999716e+01 5.425648640000000000e+08
+9.780833333333333712e+01 5.406475520000000000e+08
+9.881666666666666288e+01 5.369661440000000000e+08
+9.982500000000000284e+01 5.448457600000000000e+08
+1.008333333333333286e+02 5.355694400000000000e+08
+1.018416666666666686e+02 5.440951680000000000e+08
+1.028499999999999943e+02 5.358801280000000000e+08
+1.038583333333333343e+02 5.399360640000000000e+08
+1.048666666666666600e+02 5.297328640000000000e+08
+1.058750000000000000e+02 5.430506240000000000e+08
+1.068833333333333258e+02 5.379313920000000000e+08
+1.078916666666666657e+02 5.459512960000000000e+08
+1.088999999999999915e+02 5.523472000000000000e+08
+1.099083333333333314e+02 5.371033600000000000e+08
+1.109166666666666572e+02 5.369039360000000000e+08
+1.119249999999999972e+02 5.677847680000000000e+08
+1.129333333333333371e+02 5.401000320000000000e+08
+1.139416666666666629e+02 5.380368640000000000e+08
+1.149500000000000028e+02 5.408871040000000000e+08
+1.159583333333333286e+02 5.358821120000000000e+08
+1.169666666666666686e+02 5.500618880000000000e+08
+1.179749999999999943e+02 5.494726400000000000e+08
+1.189833333333333343e+02 5.399372800000000000e+08
+1.199916666666666600e+02 5.505455360000000000e+08
+1.210000000000000000e+02 5.737535360000000000e+08
diff --git a/src/xrpd_toolbox/i15_1/sample_alignment_data/water-94520.csv b/src/xrpd_toolbox/i15_1/sample_alignment_data/water-94520.csv
new file mode 100644
index 0000000..238423d
--- /dev/null
+++ b/src/xrpd_toolbox/i15_1/sample_alignment_data/water-94520.csv
@@ -0,0 +1,121 @@
+0.000000000000000000e+00 1.449017600000000000e+08
+1.008333333333333304e+00 1.458960640000000000e+08
+2.016666666666666607e+00 1.459970400000000000e+08
+3.024999999999999911e+00 1.454245440000000000e+08
+4.033333333333333215e+00 1.452668960000000000e+08
+5.041666666666666075e+00 1.455336000000000000e+08
+6.049999999999999822e+00 1.453294560000000000e+08
+7.058333333333333570e+00 1.441366720000000000e+08
+8.066666666666666430e+00 1.455931520000000000e+08
+9.074999999999999289e+00 1.452171520000000000e+08
+1.008333333333333215e+01 1.447066560000000000e+08
+1.109166666666666679e+01 1.456973120000000000e+08
+1.209999999999999964e+01 1.441247840000000000e+08
+1.310833333333333250e+01 1.453886400000000000e+08
+1.411666666666666714e+01 1.447000320000000000e+08
+1.512500000000000000e+01 1.442922080000000000e+08
+1.613333333333333286e+01 1.450781440000000000e+08
+1.714166666666666572e+01 1.438343840000000000e+08
+1.814999999999999858e+01 1.433143360000000000e+08
+1.915833333333333144e+01 1.439086720000000000e+08
+2.016666666666666430e+01 1.450504480000000000e+08
+2.117500000000000071e+01 1.872140480000000000e+08
+2.218333333333333357e+01 4.462410880000000000e+08
+2.319166666666666643e+01 9.023895040000000000e+08
+2.419999999999999929e+01 1.231362432000000000e+09
+2.520833333333333215e+01 1.259544064000000000e+09
+2.621666666666666501e+01 1.094915328000000000e+09
+2.722499999999999787e+01 9.677130240000000000e+08
+2.823333333333333428e+01 8.703262720000000000e+08
+2.924166666666666714e+01 6.949149440000000000e+08
+3.025000000000000000e+01 5.585233920000000000e+08
+3.125833333333333286e+01 5.314554240000000000e+08
+3.226666666666666572e+01 5.299416960000000000e+08
+3.327499999999999858e+01 5.295399680000000000e+08
+3.428333333333333144e+01 5.285449280000000000e+08
+3.529166666666666430e+01 5.287374080000000000e+08
+3.629999999999999716e+01 5.284835200000000000e+08
+3.730833333333333002e+01 5.287966720000000000e+08
+3.831666666666666288e+01 5.291780160000000000e+08
+3.932499999999999574e+01 5.279539840000000000e+08
+4.033333333333332860e+01 5.266706240000000000e+08
+4.134166666666666856e+01 5.375146240000000000e+08
+4.235000000000000142e+01 6.221213440000000000e+08
+4.335833333333333428e+01 8.029190400000000000e+08
+4.436666666666666714e+01 9.401991040000000000e+08
+4.537500000000000000e+01 9.709915520000000000e+08
+4.638333333333333286e+01 9.724789760000000000e+08
+4.739166666666666572e+01 9.725920640000000000e+08
+4.839999999999999858e+01 9.731558400000000000e+08
+4.940833333333333144e+01 9.727699200000000000e+08
+5.041666666666666430e+01 9.705978240000000000e+08
+5.142499999999999716e+01 9.737093120000000000e+08
+5.243333333333333002e+01 9.723189760000000000e+08
+5.344166666666666288e+01 9.745209600000000000e+08
+5.444999999999999574e+01 9.726368640000000000e+08
+5.545833333333332860e+01 9.736901120000000000e+08
+5.646666666666666856e+01 9.735059840000000000e+08
+5.747500000000000142e+01 9.732435840000000000e+08
+5.848333333333333428e+01 9.746139520000000000e+08
+5.949166666666666714e+01 9.736100480000000000e+08
+6.050000000000000000e+01 9.743711360000000000e+08
+6.150833333333333286e+01 9.726291840000000000e+08
+6.251666666666666572e+01 9.740900480000000000e+08
+6.352499999999999858e+01 9.752416000000000000e+08
+6.453333333333333144e+01 9.735466240000000000e+08
+6.554166666666667140e+01 9.729325440000000000e+08
+6.654999999999999716e+01 9.328379520000000000e+08
+6.755833333333333712e+01 7.771297280000000000e+08
+6.856666666666666288e+01 5.991376000000000000e+08
+6.957500000000000284e+01 5.364492800000000000e+08
+7.058333333333332860e+01 5.324243520000000000e+08
+7.159166666666666856e+01 5.307462400000000000e+08
+7.259999999999999432e+01 5.296631040000000000e+08
+7.360833333333333428e+01 5.307827840000000000e+08
+7.461666666666666003e+01 5.286820160000000000e+08
+7.562500000000000000e+01 5.296255680000000000e+08
+7.663333333333332575e+01 5.281068800000000000e+08
+7.764166666666666572e+01 5.277863680000000000e+08
+7.864999999999999147e+01 5.276912000000000000e+08
+7.965833333333333144e+01 5.335940160000000000e+08
+8.066666666666665719e+01 5.361155200000000000e+08
+8.167499999999999716e+01 5.362858880000000000e+08
+8.268333333333333712e+01 5.369864320000000000e+08
+8.369166666666666288e+01 5.482195200000000000e+08
+8.470000000000000284e+01 6.417559040000000000e+08
+8.570833333333332860e+01 8.312894720000000000e+08
+8.671666666666666856e+01 9.603690240000000000e+08
+8.772499999999999432e+01 9.862875520000000000e+08
+8.873333333333333428e+01 9.872969600000000000e+08
+8.974166666666666003e+01 9.874996480000000000e+08
+9.075000000000000000e+01 9.882850560000000000e+08
+9.175833333333332575e+01 9.881093760000000000e+08
+9.276666666666666572e+01 9.871802880000000000e+08
+9.377499999999999147e+01 9.886852480000000000e+08
+9.478333333333333144e+01 9.646420480000000000e+08
+9.579166666666665719e+01 8.254586880000000000e+08
+9.679999999999999716e+01 6.311121920000000000e+08
+9.780833333333333712e+01 5.462680960000000000e+08
+9.881666666666666288e+01 5.400590720000000000e+08
+9.982500000000000284e+01 5.386460160000000000e+08
+1.008333333333333286e+02 5.391397120000000000e+08
+1.018416666666666686e+02 5.364253120000000000e+08
+1.028499999999999943e+02 5.364563200000000000e+08
+1.038583333333333343e+02 5.368830080000000000e+08
+1.048666666666666600e+02 5.393338240000000000e+08
+1.058750000000000000e+02 5.406700160000000000e+08
+1.068833333333333258e+02 5.400839680000000000e+08
+1.078916666666666657e+02 5.419340800000000000e+08
+1.088999999999999915e+02 6.008361600000000000e+08
+1.099083333333333314e+02 7.759524480000000000e+08
+1.109166666666666572e+02 9.364953600000000000e+08
+1.119249999999999972e+02 9.826758400000000000e+08
+1.129333333333333371e+02 9.847898880000000000e+08
+1.139416666666666629e+02 9.862750080000000000e+08
+1.149500000000000028e+02 9.868202240000000000e+08
+1.159583333333333286e+02 9.862291840000000000e+08
+1.169666666666666686e+02 9.869008000000000000e+08
+1.179749999999999943e+02 9.861032960000000000e+08
+1.189833333333333343e+02 9.877442560000000000e+08
+1.199916666666666600e+02 9.884719360000000000e+08
+1.210000000000000000e+02 9.860961280000000000e+08
diff --git a/src/xrpd_toolbox/plotting.py b/src/xrpd_toolbox/plotting.py
new file mode 100644
index 0000000..c627221
--- /dev/null
+++ b/src/xrpd_toolbox/plotting.py
@@ -0,0 +1,73 @@
+import matplotlib.pyplot as plt
+import numpy as np
+
+from xrpd_toolbox.core import (
+ SerialisableNDArray,
+ XRPDBaseModel,
+ XYEData,
+)
+from xrpd_toolbox.utils.messenger import Messenger
+
+
+class DataPlot(XRPDBaseModel):
+ data: XYEData
+ title: str | None = None
+
+ def plot(self):
+ if self.title is not None:
+ plt.title(self.title)
+ plt.scatter(self.data.x, self.data.y, label="Obs", color="black", s=5)
+ plt.xlabel(self.data.x_unit)
+ plt.ylabel(self.data.y_unit)
+ plt.legend()
+ plt.show()
+
+ def publish(self, beamline: str):
+ messenger = Messenger(beamline)
+ messenger.send_plot_data(self)
+
+
+class FittedDataPlot(DataPlot):
+ calc: SerialisableNDArray
+ diff: SerialisableNDArray
+ background: SerialisableNDArray | float | None = None
+ markers: SerialisableNDArray | None = None
+
+ def plot(self, save_to: str | None = None):
+ if isinstance(self.background, float):
+ background = [self.background] * len(self.data.x)
+ elif isinstance(self.background, np.ndarray):
+ background = self.background
+ else:
+ background = self.background
+
+ offset = -0.1 * self.data.y.max()
+ if self.title is not None:
+ plt.title(self.title)
+ plt.scatter(self.data.x, self.data.y, label="Obs", color="black", s=5)
+ plt.plot(self.data.x, self.calc, label="Calc", color="red")
+ if background is not None:
+ plt.plot(self.data.x, background, label="Background")
+ plt.plot(
+ self.data.x,
+ self.data.y - self.calc + offset,
+ label="Obs-Calc",
+ color="blue",
+ )
+
+ if self.markers is not None:
+ plt.vlines(
+ self.markers,
+ 0,
+ self.data.y.max() / 10,
+ color="magenta",
+ label="Marker",
+ )
+
+ plt.xlabel(self.data.x_unit)
+ plt.ylabel(self.data.y_unit)
+ plt.legend()
+ if save_to is not None:
+ plt.savefig(save_to)
+ else:
+ plt.show()
diff --git a/src/xrpd_toolbox/utils/cif_reader.py b/src/xrpd_toolbox/utils/cif_reader.py
new file mode 100644
index 0000000..861aebe
--- /dev/null
+++ b/src/xrpd_toolbox/utils/cif_reader.py
@@ -0,0 +1,134 @@
+from pathlib import Path
+
+import numpy as np
+from CifFile import ReadCif
+
+from xrpd_toolbox.utils.utils import parse_numbers_with_error
+
+# TODO: do the comment below
+# Use U_iso for computation / modeling
+# Accept B_iso when reading external data
+
+# uiso- = direct measure of atomic displacement (mean-square displacement).
+# biso - debye waller factor
+
+
+# @njit()
+def u_iso_to_b_iso(u_iso: np.ndarray) -> np.ndarray:
+ return 8 * np.pi**2 * u_iso
+
+
+# @njit()
+def b_iso_to_u_iso(b_iso: np.ndarray) -> np.ndarray:
+ return b_iso / (8 * np.pi**2)
+
+
+###cif reader
+def open_cif(cif_filepath: str | Path, block_number: int = 0) -> dict:
+ """opens the cif and returns a dict-like representation of the cif"""
+ cif = ReadCif(cif_filepath)
+ block_name = list(cif.keys())[block_number]
+ block = cif[block_name]
+
+ return block
+
+
+def get_symmetry_operation_from_cif(cif_filepath: str | Path, block_number: int = 0):
+ block = open_cif(cif_filepath=cif_filepath, block_number=block_number)
+ synmmetry_operations = np.array(block["_space_group_symop_operation_xyz"])
+
+ return synmmetry_operations
+
+
+def read_cif(cif_filepath: str | Path, block_number: int = 0) -> tuple:
+ """reads data from a cif and returns
+ list of Atom classes and a unit cell class"""
+
+ # TODO: make this use the errors
+
+ block = open_cif(cif_filepath=cif_filepath, block_number=block_number)
+
+ x = np.array(block["_atom_site_fract_x"], dtype=str)
+ x, x_e = parse_numbers_with_error(x)
+ y = np.array(block["_atom_site_fract_y"], dtype=str)
+ y, y_e = parse_numbers_with_error(y)
+
+ z = np.array(block["_atom_site_fract_z"], dtype=str)
+ z, z_e = parse_numbers_with_error(z)
+
+ atom_labels = np.array(block["_atom_site_label"])
+
+ if "_atom_site_type_symbol" in block:
+ elements = np.array(block["_atom_site_type_symbol"])
+ else:
+ elements = atom_labels.copy()
+
+ elements = np.array([el.capitalize() for el in elements])
+
+ occupancies = (
+ np.array(block["_atom_site_occupancy"], dtype=str)
+ if "_atom_site_occupancy" in block
+ else np.ones(len(x))
+ )
+
+ occupancies, occupancies_e = parse_numbers_with_error(occupancies)
+
+ # --- B_iso or U_iso handling ---
+ if "_atom_site_B_iso_or_equiv" in block:
+ b_iso = np.array(block["_atom_site_B_iso_or_equiv"], dtype=str)
+
+ elif "_atom_site_U_iso_or_equiv" in block:
+ u_iso = np.array(block["_atom_site_U_iso_or_equiv"], dtype=str)
+ u_iso, u_iso_e = parse_numbers_with_error(u_iso)
+ b_iso = u_iso_to_b_iso(u_iso)
+
+ else:
+ b_iso = np.tile(0.5, len(x)) # fallback
+ b_iso, b_iso_e = parse_numbers_with_error(b_iso)
+
+ if "_symmetry_space_group_name_H-M" in block:
+ spacegroup_symbol = block["_symmetry_space_group_name_H-M"]
+ elif "_space_group_name_H-M_alt" in block:
+ spacegroup_symbol = block["_space_group_name_H-M_alt"]
+ else:
+ print("_symmetry_space_group_name_H-M not in cif")
+ spacegroup_symbol = "P1"
+
+ if "_space_group_symop_operation_xyz" in block:
+ symmetry_operations = np.array(block["_space_group_symop_operation_xyz"])
+ elif "_symmetry_equiv_pos_as_xyz" in block:
+ symmetry_operations = np.array(block["_symmetry_equiv_pos_as_xyz"])
+ else:
+ print("No symmetry operation in cif")
+ symmetry_operations = np.array([])
+
+ if "_chemical_name_mineral" in block:
+ name = block["_chemical_name_mineral"]
+ else:
+ name = None
+
+ atoms = {
+ "labels": atom_labels,
+ "elements": elements,
+ "xyz": np.column_stack((x, y, z)),
+ "b_iso": b_iso,
+ "occupancies": occupancies,
+ }
+
+ a, a_e = parse_numbers_with_error(block["_cell_length_a"])
+ b, b_e = parse_numbers_with_error(block["_cell_length_b"])
+ c, c_e = parse_numbers_with_error(block["_cell_length_c"])
+ alpha, alpha_e = parse_numbers_with_error(block["_cell_angle_alpha"])
+ beta, beta_e = parse_numbers_with_error(block["_cell_angle_beta"])
+ gamma, gamma_e = parse_numbers_with_error(block["_cell_angle_gamma"])
+
+ lattice = {
+ "a": float(a),
+ "b": float(b),
+ "c": float(c),
+ "alpha": float(alpha),
+ "beta": float(beta),
+ "gamma": float(gamma),
+ }
+
+ return spacegroup_symbol, lattice, atoms, symmetry_operations, name
diff --git a/src/xrpd_toolbox/utils/energy.py b/src/xrpd_toolbox/utils/energy.py
deleted file mode 100644
index a5f5673..0000000
--- a/src/xrpd_toolbox/utils/energy.py
+++ /dev/null
@@ -1,49 +0,0 @@
-from _collections_abc import Iterable
-from typing import Literal
-
-import numpy as np
-
-
-def beam_energy_to_wavelength(
- beam_energy: float | int, unit: Literal["kev", "ev"] = "kev"
-) -> float:
- """
-
- Calculates wavelength (Angstrom) from beam energy in kev.
-
- To allow convertion of tth to Q space, using the energy of the beam. beam energy is
- converted to wavlength because it's better
-
- """
- if unit.lower() == "kev":
- beam_energy_ev = beam_energy * 1000
- else:
- beam_energy_ev = beam_energy
-
- ev_to_j = 1.602176634e-19 # electron volt to joule factor
- h_planck = 6.62607015e-34 # h_planck plancks constant
- c_speed_of_light = 299792458.0 # m/s
- beam_energy_j = beam_energy_ev * ev_to_j
- wavelength_m = (h_planck * c_speed_of_light) / (beam_energy_j)
- wavelength = wavelength_m * 1e10
-
- return wavelength
-
-
-def tth_to_q(tth: Iterable[int | float] | int | float, wavelength: float) -> np.ndarray:
- """
-
- Converts a 2th angle to Q using the wavelength. Simple.
-
- Whatever unit wavelength is in, will be the unit of Q.
-
- https://www.ill.eu/fileadmin/user_upload/ILL/3_Users/Support_labs_infrastructure/Software-tools/DIF_tools/neutrons.html
-
- """
-
- tth_array = np.array(tth, dtype=float)
-
- pi = 3.141592653589
- q_space = (4 * pi / wavelength) * np.sin(np.deg2rad(tth_array) / 2)
-
- return q_space
diff --git a/src/xrpd_toolbox/utils/graph.py b/src/xrpd_toolbox/utils/graph.py
new file mode 100644
index 0000000..c9cbf65
--- /dev/null
+++ b/src/xrpd_toolbox/utils/graph.py
@@ -0,0 +1,111 @@
+import logging
+from collections.abc import Mapping
+from pathlib import Path
+from textwrap import dedent
+
+import httpx
+from blueapi.utils import BlueapiBaseModel
+from pydantic import Field, HttpUrl
+
+LOGGER = logging.getLogger(__name__)
+
+
+class DirectoryPath(BlueapiBaseModel):
+ """
+ Directory location and associated metadata
+ """
+
+ instrument: str
+ instrument_session: str = Field(alias="instrumentSession")
+ path: Path
+
+
+class ScanPaths(BlueapiBaseModel):
+ """
+ Description of where to write scan data
+ """
+
+ scan_file: str = Field(alias="scanFile")
+ scan_number: int = Field(alias="scanNumber")
+ directory: DirectoryPath
+
+
+class NumtrackerScanMutationResponse(BlueapiBaseModel):
+ """
+ Response from numtracker server when creating a new scan
+ """
+
+ scan: ScanPaths
+
+
+class NumtrackerClient:
+ """
+ Client for numtracker: https://github.com/DiamondLightSource/numtracker
+ Can be used to assign new scan numbers.
+ """
+
+ def __init__(
+ self,
+ url: HttpUrl,
+ ) -> None:
+ self._url = url
+ self._headers: Mapping[str, str] = {}
+
+ def set_headers(self, headers: Mapping[str, str]) -> None:
+ """
+ Set default HTTP headers
+
+ Args:
+ headers: headers to embed in every request.
+ """
+
+ self._headers = headers
+
+ async def create_scan(
+ self, instrument_session: str, instrument: str
+ ) -> NumtrackerScanMutationResponse:
+ """
+ Create a new scan with numtracker.
+
+ Args:
+ instrument_session: The proposal number, proposal code and visit ID
+ e.g. cm12345-1
+
+ instrument: The instrument to write data on e.g. i22
+ """
+
+ query = {
+ "query": dedent(f"""
+ mutation{{
+ scan(
+ instrument: "{instrument}",
+ instrumentSession: "{instrument_session}"
+ ) {{
+ directory{{
+ instrumentSession
+ instrument
+ path
+ }}
+ scanFile
+ scanNumber
+ }}
+ }}
+ """)
+ }
+
+ async with httpx.AsyncClient() as client:
+ response = await client.post(
+ self._url.unicode_string(),
+ headers=self._headers,
+ json=query,
+ )
+
+ response.raise_for_status()
+ json = response.json()
+
+ if json.get("errors") is not None:
+ raise RuntimeError(f"Numtracker error: {json['errors']}")
+
+ new_collection = NumtrackerScanMutationResponse.model_validate(json["data"])
+ LOGGER.debug("New NumtrackerNewScan: %s", new_collection)
+ return new_collection
diff --git a/src/xrpd_toolbox/utils/logger.py b/src/xrpd_toolbox/utils/logger.py
new file mode 100644
index 0000000..bbb6d32
--- /dev/null
+++ b/src/xrpd_toolbox/utils/logger.py
@@ -0,0 +1,31 @@
+from datetime import datetime
+from pathlib import Path
+
+
+class AnalysisLogger:
+ def __init__(
+ self, log_filepath: str | Path, log_to_file: bool = False, beamline: str = "i11"
+ ):
+ self.log_filepath = Path(log_filepath)
+ self.log_to_file = log_to_file
+
+ if not self.log_filepath.exists():
+ self.log_filepath.parent.mkdir(parents=True, exist_ok=True)
+ elif self.log_filepath.exists() and (self.log_filepath.stat().st_size > 1e7):
+ self.log_filepath.unlink()
+ with open(self.log_filepath, "a+") as f:
+ f.write(f"Log File for {beamline} Data Reduction\n")
+
+ with open(self.log_filepath, "a+") as f:
+ f.write("================================\n")
+ f.write(f"Datetime: {datetime.now()}\n")
+ f.write("================================\n")
+
+ def log(self, *args, print_to_console=True):
+ if print_to_console:
+ print(*args)
+
+ if self.log_to_file:
+ with open(self.log_filepath, "a") as f:
+ [f.write(str(m)) for m in args]
+ f.write("\n")
diff --git a/src/xrpd_toolbox/utils/messenger.py b/src/xrpd_toolbox/utils/messenger.py
new file mode 100644
index 0000000..7330a19
--- /dev/null
+++ b/src/xrpd_toolbox/utils/messenger.py
@@ -0,0 +1,210 @@
+import json
+from collections import deque
+from pathlib import Path
+from shutil import copy2
+from time import sleep
+
+import stomp
+
+from xrpd_toolbox.core import XRPDBaseModel
+
+DEFAULT_BROKER = "rabbitmq"
+DEFAULT_DESTINATIONS = [
+ "/topic/public.worker.event",
+ "/topic/gda.messages.scan",
+]
+
+DEFAULT_DII_UI_PLOT_DESTINATION = (
+ "/topic/public.data.plot" # Currently prone to change as of 07/05/26
+)
+
+
+class MessageUnpacker:
+ messages = deque()
+
+ @staticmethod
+ def unpack_dict(unpacked: dict):
+ for key, value in unpacked.items():
+ if isinstance(value, dict):
+ MessageUnpacker.unpack_dict(value)
+ else:
+ MessageUnpacker.messages.append(f"{key}: {value}")
+
+ return MessageUnpacker.messages
+
+
+class ScanListener(stomp.ConnectionListener):
+ def __init__(self, maxlen=100):
+ self.messages = deque(maxlen=maxlen)
+
+ def on_error(self, message): # type: ignore
+ print(f"received an error: {message}")
+
+ def on_message(self, message): # type: ignore
+ message_body: dict = json.loads(message.body)
+ self.messages.append(message_body)
+
+
+class Messenger:
+ def __init__(
+ self,
+ beamline: str | None = None,
+ host: str | None = None,
+ broker: str | None = None,
+ port: int = 61613,
+ username: str | None = None,
+ password: str | None = None,
+ destinations: Path | list[Path] | str | list[str] | None = None,
+ auto_connect: bool = True,
+ **kwargs,
+ ):
+ self.beamline = beamline
+ self.host = host
+ self.port = port
+ self.broker = broker
+ self.port = port
+
+ self.username = username
+ self.password = password
+ self.auto_connect = auto_connect
+ self.destinations = destinations
+
+ # /topic/public.worker.event blueapi
+ # defined here https://github.com/DiamondLightSource/blueapi/blob/77129d132d5481b9d6adad3fe15c02d581aff9f7/docs/reference/asyncapi.yaml#L4
+
+ # "/topic/gda.messages.scan" # nexus file converter
+ # defined here: https://gitlab.diamond.ac.uk/daq/d2acq/services/nexus-file-converter/-/blob/master/src/main/resources/application.yaml
+
+ if (beamline is not None) and (not beamline.startswith("i")):
+ print(f"{beamline} must start with i, eg i15-1, or i11")
+
+ if not self.destinations:
+ print(f"No destination specified, defaulting to {DEFAULT_DESTINATIONS}")
+ self.destinations = DEFAULT_DESTINATIONS
+
+ if not self.broker:
+ self.broker = DEFAULT_BROKER
+
+ if not self.host and self.beamline:
+ print("Host not specified, constructing from beamline name")
+ self.host = f"{self.beamline}-{self.broker}-daq.diamond.ac.uk"
+ self.broker = "rabbitmq"
+ elif not self.host and self.beamline and (self.broker == "activemq"):
+ self.host = f"{self.beamline}-control"
+ self.broker = "activemq"
+ else:
+ raise ValueError("Either host or beamline must be provided")
+
+ self.messages = deque()
+ self.scan_listener = ScanListener()
+
+ self.run = True
+
+ if self.auto_connect:
+ try:
+ self.setup_connection()
+ self.connect()
+ self.subscribe()
+ except Exception:
+ print(f"Could not connect to {self.host}")
+
+ def setup_connection(self):
+ self.conn = stomp.Connection(
+ host_and_ports=[(self.host, self.port)], auto_content_length=False
+ )
+
+ self.conn.set_listener("scan_listener", self.scan_listener)
+
+ def connect(self):
+ print("Connecting..")
+
+ if self.username and self.password:
+ self.conn.connect(self.username, self.password, wait=True)
+ else:
+ self.conn.connect(wait=True)
+
+ print("Connected to STOMP server at", self.host, self.port)
+
+ def disconnect(self):
+ self.conn.disconnect()
+
+ def subscribe(self):
+ if isinstance(self.destinations, list):
+ for i, dest in enumerate(self.destinations):
+ self.conn.subscribe(destination=dest, id=i + 1, ack="auto")
+ else:
+ self.conn.subscribe(destination=self.destinations, id=1, ack="auto")
+
+ def send_file(self, path: str):
+ """Use this when you want dawn to open and plot a file"""
+ message = json.dumps({"filePath": path})
+ destination = "/topic/org.dawnsci.file.topic"
+ self.send_message(destination, message)
+
+ def send_start(self, path: str):
+ """use this in when doing live processing and it has started"""
+ message = json.dumps(
+ {"filePath": path, "status": "STARTED", "swmrStatus": "ENABLED"}
+ )
+ destination = "/topic/gda.messages.processing"
+ self.send_message(destination, message)
+
+ def send_update(self, path):
+ """use this in when doing live processing and it has started"""
+
+ message = json.dumps(
+ {"filePath": path, "status": "UPDATED", "swmrStatus": "ACTIVE"}
+ )
+ destination = "/topic/gda.messages.processing"
+ self.send_message(destination, message)
+
+ def send_finished(self, path):
+ message = json.dumps(
+ {"filePath": path, "status": "FINISHED", "swmrStatus": "ACTIVE"}
+ )
+ destination = "/topic/gda.messages.processing"
+ self.send_message(destination, message)
+
+ def send_message(self, destination: str, message: str):
+ try:
+ self.conn.send(destination=destination, body=message, ack="auto")
+ print(f"Message sent to: {destination}")
+ except Exception:
+ print("Could not send message!")
+
+ def stop(self):
+ """Stop listening to destinations"""
+ self.run = False
+
+ def get_message(self):
+ return self.scan_listener.messages.popleft()
+
+ def send_plot_data(self, plot_data: XRPDBaseModel):
+ """Pass this a PlotData object and it will serialise it
+ and send it to RabbitMQ telling the UI to plot it"""
+ self.send_message(DEFAULT_DII_UI_PLOT_DESTINATION, plot_data.model_dump_json())
+
+ def listen(self, max_iter: int = 50, interval: float | int = 1.0):
+ c = 0
+ self.run = True
+
+ while (self.run is True) and (c < max_iter):
+ if self.scan_listener.messages:
+ print("Processing message:", self.scan_listener.messages.popleft())
+ sleep(interval)
+ c += 1
+
+ def send_to_ispyb(self, original_filepath: str, filepath_out: str) -> None:
+ p = Path(original_filepath)
+ magic_path = p.parent / ".ispyb" / (p.stem + "_mythen_nx/data.dat")
+ copy2(filepath_out, magic_path) # copies to ispyb
+
+
+# if __name__ == "__main__":
+# client = Messenger("i15-1", broker="rabbitmq", username="guest", password="guest")
+
+# print("djsdnsj")
+
+# print(client.host)
+
+# client._send_message("/topic/public.worker.event", "fff")
diff --git a/src/xrpd_toolbox/utils/mythen_utils.py b/src/xrpd_toolbox/utils/mythen_utils.py
new file mode 100644
index 0000000..c11c0a5
--- /dev/null
+++ b/src/xrpd_toolbox/utils/mythen_utils.py
@@ -0,0 +1,185 @@
+from collections.abc import Iterable
+from pathlib import Path
+
+import numpy as np
+import numpy.typing as npt
+
+# def channel_to_angle(ich, off, r, c, dir=1, p=0.05):
+# """
+# ich: channel number, 0-1280
+# off: module offset, degrees
+# r: radius, mm
+# c: center (in pixel or mm?)
+# dir: direction, 1
+# p: pixel size, mm
+# """
+# # print(off)
+# if r < 0:
+# ich = 1279 - ich
+# return off + np.degrees(
+# c * p / np.abs(r) - dir * np.arctan(p * (ich - c) / np.abs(r))
+# )
+
+# def angle_to_channel(ang, off, r, c, dir=1, p=0.05):
+# ich = (
+# np.tan(dir * (np.radians(ang - off) - c * p / np.abs(r))) * np.abs(r) / p
+# + c
+# )
+# if r > 0:
+# return ich
+# else:
+# return 1279 - ich
+
+
+def channel_to_angle(
+ pixel_number: npt.NDArray[np.int_],
+ centre: int | float,
+ conv: int | float,
+ module_offset: int | float,
+ zero_offset: int | float,
+) -> np.ndarray:
+ module_conversions = pixel_number - centre
+ module_conversions = module_conversions * conv
+ module_conversions = np.arctan(module_conversions)
+ raw_tth = module_offset + np.rad2deg(module_conversions) + zero_offset
+
+ return raw_tth
+
+
+def channel_to_angle_in_real_units(
+ pixel_number: npt.NDArray[np.int_],
+ centre: int | float,
+ offset: int | float,
+ beamline_offset: int | float,
+ radius: int | float = 762,
+ p: float = 0.05,
+) -> np.ndarray:
+ """
+ pixel_number: channel number, usually 0-1280
+ centre: centre (in pixel number - ie 1280/2)
+ offset: module offset, degrees
+ radius: radius, mm - approx 760
+ direction: 1 or -1 depending if module is flipped or not
+ p: pixel size, mm = 0.05
+ """
+
+ raw_tth = channel_to_angle(
+ pixel_number, centre, (p / radius), offset, beamline_offset
+ )
+
+ return raw_tth
+
+
+def calc_intial_module_conv(conv=6.5e-05) -> dict[int, float]:
+ module_conv_dict = {}
+
+ for mod in range(28):
+ if mod > 13:
+ module_conv_dict[mod] = -conv
+ else:
+ module_conv_dict[mod] = conv
+
+ return module_conv_dict
+
+
+def paired_modules():
+ """
+ Given a list of module numbers, return a list of (a, b) pairs such that
+ a and b are paired as described: 0-27, 1-26, 2-25, ..., 13-14.
+ Only pairs where both a and b are in the input list are returned.
+ """
+
+ modules = list(range(28))
+
+ modules = np.array(modules)
+ n = modules.max()
+ pairs = []
+ for m in modules:
+ pair = n - m
+ if pair in modules and m <= pair:
+ pairs.append((int(m), int(pair)))
+
+ pairs = np.array(pairs)
+
+ return pairs
+
+
+def find_pair(mod: int):
+ modules_array = paired_modules()
+
+ row, col = np.where(modules_array == mod)
+ if len(row) == 0:
+ return None # value not found
+ return modules_array[row[0], 1 - col[0]]
+
+
+def calc_starting_module_offset(initial_module=0.45, offset=2.5) -> dict[int, float]:
+ """Used for calculatign the intial centres of each of the modules"""
+
+ module_pairs = paired_modules()
+ module_offsets_dict = {}
+
+ for n, module_pair in enumerate(module_pairs[::-1]):
+ print(module_pair)
+
+ ring_2_cen = (n * 5) + initial_module
+ ring_1_cen = ring_2_cen + offset
+
+ module_offsets_dict[int(module_pair[1])] = ring_2_cen
+ module_offsets_dict[int(module_pair[0])] = ring_1_cen
+
+ print(module_offsets_dict)
+
+ return module_offsets_dict
+
+
+def calc_starting_module_centre(initial_module=0.45, offset=2.5):
+ """Used for calculatign the intial centres of each of the modules"""
+
+ module_pairs = paired_modules()
+ module_centres_dict = {}
+
+ for n, module_pair in enumerate(module_pairs[::-1]):
+ print(module_pair)
+
+ ring_2_cen = (n * 5) + initial_module
+ ring_1_cen = ring_2_cen + offset
+
+ module_centres_dict[int(module_pair[1])] = ring_2_cen
+ module_centres_dict[int(module_pair[0])] = ring_1_cen
+
+ print(module_centres_dict)
+
+ return module_centres_dict
+
+
+def read_config(mythen3_config_filepath: str | Path) -> list[int]:
+ """
+ reads the config file used by SLSDet and works out what modules are currently active
+ """
+
+ enabled_modules_hostnames = []
+
+ with open(mythen3_config_filepath) as file:
+ lines = [line.rstrip() for line in file]
+
+ for _, line in enumerate(lines):
+ if line.startswith("hostname"):
+ enabled_modules_hostnames = line.split()[1::]
+
+ enabled_modules = [
+ int(n_mod.rstrip()[-3::]) - 100 for n_mod in enabled_modules_hostnames
+ ]
+
+ return enabled_modules
+
+
+def modules_to_pixels(modules: int | Iterable[int]):
+ if isinstance(modules, int):
+ pixels = slice(modules * 1280, (modules + 1) * 1280, None)
+ elif isinstance(modules, Iterable):
+ pixels = np.concatenate([np.arange(i * 1280, (i + 1) * 1280) for i in modules])
+ else:
+ raise TypeError("Must be int or iterable of ints")
+
+ return pixels
diff --git a/src/xrpd_toolbox/utils/unit_conversion.py b/src/xrpd_toolbox/utils/unit_conversion.py
new file mode 100644
index 0000000..04e3b18
--- /dev/null
+++ b/src/xrpd_toolbox/utils/unit_conversion.py
@@ -0,0 +1,134 @@
+import math
+from collections.abc import Iterable
+from typing import Literal
+
+import numpy as np
+
+# from numba import njit
+
+# constants
+ev_to_j = 1.602176634e-19 # electron volt to joule factor
+h_planck = 6.62607015e-34 # Planck's constant
+c_speed_of_light = 299792458.0 # m/s
+
+
+def beam_energy_to_wavelength(
+ beam_energy: float | int,
+ unit: Literal["keV", "eV", "kev", "ev"] = "kev",
+) -> float:
+ """
+
+ Calculates wavelength (Angstrom) from beam energy in kev.
+
+ To allow convertion of tth to Q space, using the energy of the beam. beam energy is
+ converted to wavlength because it's better
+
+ """
+ if unit.lower() == "kev":
+ beam_energy_ev = beam_energy * 1000
+ else:
+ beam_energy_ev = beam_energy
+
+ beam_energy_j = beam_energy_ev * ev_to_j
+ wavelength_m = (h_planck * c_speed_of_light) / (beam_energy_j)
+ wavelength = wavelength_m * 1e10
+
+ return wavelength
+
+
+def wavelength_to_beam_energy(
+ wavelength: float | int,
+ unit: Literal["keV", "eV", "kev", "ev"] = "kev",
+) -> float:
+ """
+ Calculates beam energy from wavelength (Angstrom).
+
+ Converts wavelength to energy using E = hc / λ.
+ Returns energy in keV or eV depending on `unit`.
+ """
+
+ # convert Å → m
+ wavelength_m = wavelength * 1e-10
+
+ # energy in joules
+ beam_energy_j = (h_planck * c_speed_of_light) / wavelength_m
+
+ # convert J → eV
+ beam_energy_ev = beam_energy_j / ev_to_j
+
+ if unit.lower() == "kev":
+ return beam_energy_ev / 1000
+ else:
+ return beam_energy_ev
+
+
+def two_theta_to_q(
+ tth: Iterable[int | float] | int | float, wavelength: float
+) -> np.ndarray:
+ """
+
+ Converts a 2th angle to Q using the wavelength. Simple.
+
+ Whatever unit wavelength is in, will be the unit of Q.
+
+ https://www.ill.eu/fileadmin/user_upload/ILL/3_Users/Support_labs_infrastructure/Software-tools/DIF_tools/neutrons.html
+
+ """
+
+ tth_array = np.array(tth, dtype=float)
+ q_space = (4 * math.pi / wavelength) * np.sin(np.deg2rad(tth_array) / 2)
+
+ return q_space
+
+
+def d_to_two_theta(
+ d_spacing: np.ndarray | float | int, wavelength: float | int, degrees: bool = True
+) -> np.ndarray:
+ """convertts d to tth - simples
+ sinθ=2dnλ
+ """
+
+ sintheta = wavelength / (2 * d_spacing)
+ theta = np.arcsin(sintheta)
+ two_theta = 2 * theta
+
+ if degrees:
+ two_theta = np.degrees(two_theta)
+
+ return two_theta
+
+
+# @njit()
+def q_space_to_theta(q: np.ndarray | float | int, wavelength: int | float):
+ return np.arcsin(q * wavelength / (4 * np.pi))
+
+
+def q_space_to_d(q: np.ndarray | float | int):
+ return 2 * np.pi / q
+
+
+def q2_to_d(q2: np.ndarray | float | int):
+ """q2 = scattering vector squared to d-space"""
+
+ d = 2 * np.pi / np.sqrt(q2)
+
+ return d
+
+
+def d_spacing_to_scattering_vector(d_spacing: np.ndarray) -> np.ndarray:
+ scattering_vector = 1 / (2 * d_spacing)
+ return scattering_vector
+
+
+def d_to_tof(d: float | np.ndarray, difa: float, difc: float, tzero: float = 0.0):
+ """This is for TOF neutron data"""
+
+ tof = difc * d + difa * d**2 + tzero
+
+ return tof
+
+
+# @njit()
+def q_space_to_s(q: np.ndarray) -> np.ndarray:
+ s = q / (4 * np.pi)
+ return s
diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py
index c34c73a..7fe0d4e 100644
--- a/src/xrpd_toolbox/utils/utils.py
+++ b/src/xrpd_toolbox/utils/utils.py
@@ -1,15 +1,568 @@
-from _collections_abc import Iterable
+import json
+import os
+import re
+from collections import defaultdict
+from collections.abc import Iterable, Sequence
+from datetime import datetime
+from functools import wraps
+from pathlib import Path
+from time import time
+import h5py
import numpy as np
+from h5py import Dataset, File
+from pyFAI.calibrant import get_calibrant
+from scipy.interpolate import interp1d
-def normalise_to(data: Iterable[float | int], minval: float | int = 0) -> np.ndarray:
+# TODO: Decide whether we can just use the normal logging within python
+class AnalysisLogger:
+ """A class that can be use as a logger to log data to a
+ filepath and print at the same time - possibly superfluous"""
+
+ def __init__(self, log_filepath: str | Path, logging: bool = False):
+ self.log_filepath = log_filepath
+ self.logging = logging
+
+ if not os.path.exists(self.log_filepath):
+ os.makedirs(os.path.dirname(self.log_filepath), exist_ok=True)
+ elif os.path.exists(self.log_filepath) and (
+ os.path.getsize(self.log_filepath) > 1e7
+ ):
+ os.remove(self.log_filepath)
+ with open(self.log_filepath, "a+") as f:
+ f.write("Log File for I11 Data Reduction\n")
+
+ with open(self.log_filepath, "a+") as f:
+ f.write("================================\n")
+ f.write(f"Datetime: {datetime.now()}\n")
+ f.write("================================\n")
+
+ def log(self, *args, print_to_console: bool = True):
+ if print_to_console:
+ print(*args)
+
+ if self.logging:
+ with open(self.log_filepath, "a") as f:
+ [f.write(str(m)) for m in args]
+ f.write("\n")
+
+
+class NexusDatasetMapper:
+ def __init__(self, filepath: str | Path):
+ self.filepath = str(filepath)
+ self._mapping = defaultdict(list)
+ self._build_mapping()
+
+ def _build_mapping(self):
+ """Scan file once and build dataset name → path mapping."""
+ with h5py.File(self.filepath, "r") as f:
+
+ def visitor(name, obj):
+ if isinstance(obj, h5py.Dataset):
+ dataset_name = name.split("/")[-1]
+ self._mapping[dataset_name].append(f"/{name}")
+
+ f.visititems(visitor)
+
+ def find(self, dataset_name):
+ """
+ Returns:
+ - None if not found
+ - Single string if exactly one match
+ - List of paths if multiple matches
+ """
+ matches = self._mapping.get(dataset_name)
+ if not matches:
+ return None
+ if len(matches) == 1:
+ return matches[0]
+ return matches
+
+ def get(self, dataset_name, index=0):
+ """
+ Lazily open the file and return the h5py.Dataset object.
+
+ NOTE:
+ The returned dataset is only valid while the file is open.
+ Use within a context manager.
+ """
+ paths = self._mapping.get(dataset_name)
+ if not paths:
+ raise KeyError(f"Dataset '{dataset_name}' not found.")
+
+ path = paths[index]
+
+ f = h5py.File(self.filepath, "r")
+ return f[path] # lazy dataset handle
+
+ def keys(self):
+ return list(self._mapping.keys())
+
+ def items(self):
+ return dict(self._mapping)
+
+
+def h5_to_array(file_path: str | Path, data_path: str) -> np.ndarray:
+ with File(file_path, "r") as file:
+ data = file.get(data_path)
+ if (data is not None) and isinstance(data, Dataset):
+ return np.asarray(data)
+ else:
+ raise ValueError(f"Data is None at {data_path} in {file_path}")
+
+
+def get_entry(nexus_filepath: str | Path) -> str:
+ with File(nexus_filepath, "r") as file:
+ return list(file.keys())[0]
+
+
+def dict_to_json(dict_to_save: dict, filepath: str | Path):
+ with open(filepath, "w") as file:
+ json.dump(dict_to_save, file, indent=4)
+
+
+def nexus_file_match(str_to_match, beamline: str = "i15-1"):
+ return re.match(f"{beamline}" + r"-+[0-9]+\.nxs", str_to_match)
+
+
+def get_nexus_files(
+ instrument_session_folder: str | Path,
+ beamline: str = "i15-1",
+ exclude: str = "processed",
+) -> list[str]:
+ """Get all final data files ending with .nxs in some folder"""
+
+ nexus_files = [
+ os.path.join(str(instrument_session_folder), f)
+ for f in os.listdir(instrument_session_folder)
+ if nexus_file_match(f, beamline) and (exclude not in f)
+ ]
+ nexus_files.sort()
+
+ return nexus_files
+
+
+def get_filenumber_from_nxs(nexus_filepath: str | Path) -> int:
+ basename = os.path.basename(str(nexus_filepath))
+ filenumber_str = re.findall(r"\d+", basename)[-1]
+ return int(filenumber_str)
+
+
+def get_folder_paths(root_folder: str | Path) -> list[str]:
+ """get all folder directories within another folder"""
+
+ instrument_session_folders = [
+ os.path.join(root_folder, f) for f in os.listdir(root_folder)
+ ]
+ instrument_session_folders.sort()
+
+ return instrument_session_folders
+
+
+def copy_datapath_to_nexus(
+ source_file: str | Path,
+ destination_file: str | Path,
+ source_path: str,
+ destination_path: str,
+) -> None:
+ """
+ Copy a detector group from a source NeXus file to a destination NeXus file.
+ Overwrites the destination path if it already exists.
+ """
+
+ with h5py.File(source_file, "r") as src, h5py.File(destination_file, "a") as dst:
+ if source_path not in src:
+ raise KeyError(f"Source path not found: {source_path}")
+
+ # Remove destination path if it exists (overwrite behavior)
+ if destination_path in dst:
+ del dst[destination_path]
+
+ # Ensure parent group exists
+ parent_path = destination_path.rsplit("/", 1)[0]
+ dst.require_group(parent_path)
+
+ # Copy the group recursively
+ src.copy(source_path, dst, destination_path)
+
+
+def normalise_to(
+ data: Iterable[float | int],
+ minval: float | int = 0,
+) -> np.ndarray:
"""
normalises an array
- minval is the minimum value that the
+ minval is the minimum value that the
processed array is scaled to.
"""
data_array = np.array(data, dtype=float)
return (data_array - minval) / (np.amax(data_array) - minval)
+
+
+def normalise(data: np.ndarray | list, default_min: float = 1e-12) -> np.ndarray:
+ """Normalises an array between 0 and 1, a specific version of normalise_to
+ where minval is min(data)"""
+
+ # Do not make this use normalise_to it keeps breaking for some reason
+
+ array_min = float(np.amin(data))
+ if array_min == 0.0:
+ array_min = default_min
+
+ return (data - np.min(data)) / (np.max(data) - array_min)
+
+
+def load_int_array_from_file(filepath: str | Path) -> np.ndarray:
+ """
+ File format is just a list of integers in a text file, one integer per line.
+
+ If no file, will raise
+
+ If empty file, will return no empty array.
+
+ """
+
+ if not os.path.exists(filepath):
+ raise FileNotFoundError(f"{filepath} does not exist")
+ elif os.path.getsize(filepath) == 0:
+ return np.array([])
+ else:
+ return np.loadtxt(filepath, dtype=np.int64, comments="#", usecols=0, ndmin=1)
+
+
+def create_bins(
+ x: np.ndarray, rebin_step: float | int
+) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """
+ Create uniform bins for x, returning:
+ - bin_edges: the edges of the bins
+ - bin_centers: center of each bin
+ - indices: which bin each x belongs to
+ """
+ bin_edges = np.arange(x.min(), x.max() + rebin_step, rebin_step)
+ bin_centers = 0.5 * (bin_edges[:-1] + bin_edges[1:])
+ indices = np.digitize(x, bin_edges) - 1 # 0-based
+ return bin_centers, bin_edges, indices
+
+
+def bin_and_propagate_errors(
+ x: np.ndarray,
+ y: np.ndarray,
+ e: np.ndarray,
+ rebin_step: float | int,
+ error_calc: str = "max",
+) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """
+ Rebin diffraction data with overlap-corrected averaging.
+
+ sum_counts=False:
+ return the average diffraction pattern
+
+ sum_counts=True:
+ return the pattern scaled by the effective number of detector steps
+ """
+ # --- Validation ---
+ if not (x.ndim == y.ndim == e.ndim == 1):
+ raise ValueError("x, y, and e must be 1D arrays")
+ if not (x.shape == y.shape == e.shape):
+ raise ValueError("x, y, and e must have the same length")
+
+ # --- Bin definition ---
+ bin_centres, bin_edges, _ = create_bins(x, rebin_step)
+
+ # Prevent last point from falling exactly on the final bin edge
+ if x[-1] == bin_edges[-1]:
+ x = x.copy()
+ x[-1] -= rebin_step / 10_000
+
+ # --- Bin statistics ---
+
+ y_sums, _ = np.histogram(x, bins=bin_edges, weights=y)
+ y2_sums, _ = np.histogram(x, bins=bin_edges, weights=y**2)
+ e2_sums, _ = np.histogram(x, bins=bin_edges, weights=e**2)
+ bin_counts, _ = np.histogram(x, bins=bin_edges)
+
+ # # Effective scaling factor (heuristic)
+ # scale_factpr = scale or np.max(bin_counts) - np.median(bin_counts)
+
+ with np.errstate(divide="ignore", invalid="ignore"):
+ intensity = y_sums / bin_counts
+
+ # --- Errors ---
+ # Internal (propagated) error
+ prop_errors = np.sqrt(e2_sums) / bin_counts
+
+ # External (sample) error with Bessel correction
+ variance = (y2_sums - bin_counts * intensity**2) / (bin_counts - 1)
+ std_errors = np.sqrt(variance)
+
+ if error_calc == "poisson":
+ errors = prop_errors
+ elif error_calc == "std_dev":
+ # Invalidate bins with <2 points for external error
+ std_errors[bin_counts < 2] = np.nan
+ errors = std_errors
+ elif error_calc == "max":
+ std_errors[bin_counts < 2] = 0
+ errors = np.maximum(prop_errors, std_errors)
+ else:
+ raise ValueError(f"Invalid error_calc: {error_calc}")
+
+ ##remove NaN's - bins without counts
+ nan_mask = np.isnan(intensity)
+ nan_index = np.where(nan_mask)[0]
+
+ bin_centres = np.delete(bin_centres, nan_index)
+ intensity = np.delete(intensity, nan_index)
+ errors = np.delete(errors, nan_index)
+
+ return bin_centres, intensity, errors
+
+
+def bin_and_propagate_errors_norm(
+ x: np.ndarray,
+ y: np.ndarray,
+ e: np.ndarray,
+ rebin_step: float | int,
+ error_calc: str = "max",
+ weighting: None | np.ndarray = None,
+) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """
+ Rebin diffraction data with overlap-corrected averaging.
+
+ sum_counts=False:
+ return the average diffraction pattern
+
+ sum_counts=True:
+ return the pattern scaled by the effective number of detector steps
+ """
+ # --- Validation ---
+ if not (x.ndim == y.ndim == e.ndim == 1):
+ raise ValueError("x, y, and e must be 1D arrays")
+ if not (x.shape == y.shape == e.shape):
+ raise ValueError("x, y, and e must have the same length")
+
+ # --- Bin definition ---
+ bin_centres, bin_edges, _ = create_bins(x, rebin_step)
+
+ # Prevent last point from falling exactly on the final bin edge
+ if x[-1] == bin_edges[-1]:
+ x = x.copy()
+ x[-1] -= rebin_step / 1e3
+
+ # --- Bin statistics ---
+
+ y_sums, _ = np.histogram(x, bins=bin_edges, weights=y)
+ y2_sums, _ = np.histogram(x, bins=bin_edges, weights=y**2)
+ e2_sums, _ = np.histogram(x, bins=bin_edges, weights=e**2)
+ bin_counts, _ = np.histogram(x, bins=bin_edges)
+
+ # # Effective scaling factor (heuristic)
+ # scale_factpr = scale or np.max(bin_counts) - np.median(bin_counts)
+
+ with np.errstate(divide="ignore", invalid="ignore"):
+ intensity = y_sums
+
+ # --- Errors ---
+ # Internal (propagated) error
+ prop_errors = np.sqrt(e2_sums)
+
+ # External (sample) error with Bessel correction
+ variance = (y2_sums - bin_counts * intensity**2) / (bin_counts - 1)
+ std_errors = np.sqrt(variance)
+
+ if error_calc == "poisson":
+ errors = prop_errors
+ elif error_calc == "std_dev":
+ # Invalidate bins with <2 points for external error
+ std_errors[bin_counts < 2] = np.nan
+ errors = std_errors
+ elif error_calc == "max":
+ std_errors[bin_counts < 2] = 0
+ errors = np.maximum(prop_errors, std_errors)
+ else:
+ raise ValueError(f"Invalid error_calc: {error_calc}")
+
+ ##remove NaN's - bins without counts
+ nan_mask = np.isnan(intensity)
+ nan_index = np.where(nan_mask)[0]
+
+ bin_centres = np.delete(bin_centres, nan_index)
+ intensity = np.delete(intensity, nan_index)
+ errors = np.delete(errors, nan_index)
+
+ if weighting is not None:
+ w_sums, _ = np.histogram(x, bins=bin_edges, weights=weighting)
+ scale = np.delete(w_sums, nan_index)
+
+ intensity = intensity / scale
+ errors = errors / scale
+
+ return bin_centres, intensity, errors
+
+
+def save_to_xye(xye_filepath_out, x: np.ndarray, y: np.ndarray, e: np.ndarray):
+ """Takes in 3 equal sized arrays and writes them to a typical XRPD csv/xye file"""
+ xye_out_data = np.stack((x, y, e), axis=-1)
+ np.savetxt(xye_filepath_out, xye_out_data, fmt="%.6f", delimiter=" ", newline="\n")
+
+
+def save_data_to_h5(filepath: str | Path, dataset_path: str, data: np.ndarray) -> None:
+ group_path, name = dataset_path.rsplit("/", 1)
+
+ with File(filepath, "a") as file:
+ if dataset_path in file:
+ del file[dataset_path]
+
+ group = file.require_group(group_path)
+ group.create_dataset(name, data=data, compression="gzip", compression_opts=4)
+
+
+def get_calibrant_peaks(calibrant_name: str, wavelength_in_ang: float):
+ calibrant = get_calibrant(calibrant_name)
+ calibrant.wavelength = wavelength_in_ang / 1e10
+ observed_reflections_in_tth = calibrant.get_peaks("2th_deg")
+
+ return observed_reflections_in_tth
+
+
+def rebin_together(x1, y1, x2, y2, num_points=None):
+ # 1. Define overlapping x-range
+ xmin = max(x1.min(), x2.min())
+ xmax = min(x1.max(), x2.max())
+
+ # 2. Decide number of points
+ if num_points is None:
+ num_points = min(len(x1), len(x2))
+
+ # 3. Create common evenly spaced grid
+ x_common = np.linspace(xmin, xmax, num_points)
+
+ # 4. Interpolate both datasets
+ f1 = interp1d(x1, y1, kind="linear", bounds_error=False, fill_value="extrapolate") # type: ignore
+ f2 = interp1d(x2, y2, kind="linear", bounds_error=False, fill_value="extrapolate") # type: ignore
+
+ y1_interp = f1(x_common)
+ y2_interp = f2(x_common)
+
+ return x_common, y1_interp, y2_interp
+
+
+def timeit(f):
+ """use this as a decorator to time a function
+
+ eg:
+
+ @timeit
+ def my_func()
+ time.sleep(1)
+
+ myfunc()
+
+ - my_func took 1 seconds
+
+ """
+
+ @wraps(f)
+ def wrap(*args, **kw):
+ ts = time()
+ result = f(*args, **kw)
+ te = time()
+ duration = te - ts
+ print(f"{f.__name__} took {duration} seconds")
+ return result
+
+ return wrap
+
+
+def parse_numbers_with_error(
+ data: Sequence[str] | str | np.ndarray,
+) -> tuple[np.ndarray, np.ndarray]:
+ """Takes a str or list of str in the format 1.234(5)
+ and returns two arrays: one with the numbers and one with the errors.
+ ie 1.234(5) -> 1.234, 0.005"""
+
+ arr = np.atleast_1d(np.array(data, dtype=str))
+ arr = np.char.replace(arr, " ", "")
+
+ # Split number and optional error
+ num_str = np.char.partition(arr, "(")[:, 0]
+ err_str = np.char.strip(np.char.partition(arr, "(")[:, 2], ")")
+ err_str[err_str == ""] = "0"
+
+ numbers = num_str.astype(float)
+
+ # Compute decimal places safely as float
+ decimals = np.where(
+ np.char.find(num_str, ".") == -1,
+ 0,
+ np.char.str_len(num_str) - np.char.find(num_str, ".") - 1,
+ )
+ errors = err_str.astype(float) * 10.0 ** (-decimals.astype(float))
+
+ if isinstance(data, str):
+ return numbers[0], errors[0]
+ else:
+ return numbers, errors
+
+
+def cluster_points_auto(
+ x: np.ndarray,
+ y: np.ndarray,
+ y_tol: float | None = None,
+ x_gap: float | None = None,
+):
+ """
+ Groups points based on:
+ - Similar Y values (anchored to first point in group)
+ - Local continuity in X
+
+ Returns:
+ labels: continuous group labels ordered left → right by X
+ n_groups: number of groups
+ """
+
+ x = np.asarray(x)
+ y = np.asarray(y)
+
+ if y_tol is None:
+ y_tol = (y.max() - y.min()) / 20
+
+ if x_gap is None:
+ x_gap = (x.max() - x.min()) / 5
+
+ # IMPORTANT: sort by X first to enforce ordering consistency
+ order = np.argsort(x)
+ x_sorted = x[order]
+ y_sorted = y[order]
+
+ n = len(x)
+ labels_sorted = np.full(n, -1, dtype=int)
+
+ n_groups = 0
+ start = 0
+
+ while start < n:
+ end = start + 1
+
+ while end < n:
+ y_diff = abs(y_sorted[end] - y_sorted[start])
+ x_diff = abs(x_sorted[end] - x_sorted[end - 1])
+
+ if y_diff <= y_tol and x_diff <= x_gap:
+ end += 1
+ else:
+ break
+
+ labels_sorted[start:end] = n_groups
+ n_groups += 1
+ start = end
+
+ # map back to original order
+ labels = np.empty(n, dtype=int)
+ labels[order] = labels_sorted
+
+ return labels, n_groups
diff --git a/tests/test_core.py b/tests/test_core.py
new file mode 100644
index 0000000..7cb6ac2
--- /dev/null
+++ b/tests/test_core.py
@@ -0,0 +1,236 @@
+from pathlib import Path
+
+import numpy as np
+import pytest
+
+from xrpd_toolbox.core import (
+ Parameter,
+ ParameterArray,
+ ScatteringData,
+ XRPDBaseModel,
+ XYEData,
+ evaluate_expression,
+ safe_exp,
+ safe_pow,
+ to_ndarray,
+)
+from xrpd_toolbox.fit_engine.fitting_core import RefinementBaseModel, is_parameter_like
+
+
+def test_to_ndarray_converts_lists_and_preserves_ndarrays():
+ source = [1, 2, 3]
+ result = to_ndarray(source)
+ assert isinstance(result, np.ndarray)
+ assert np.array_equal(result, np.array([1, 2, 3]))
+
+ arr = np.array([4.0, 5.0])
+ assert to_ndarray(arr) is arr
+ assert to_ndarray(7) == 7
+
+
+def test_safe_pow_and_safe_exp_valid_and_invalid():
+ assert safe_pow(2, 3) == 8
+ assert safe_pow(5, 0) == 1
+
+ with pytest.raises(ValueError, match="too large"):
+ safe_pow(1e7, 1)
+
+ assert safe_exp(2) == pytest.approx(np.exp(2.0))
+ with pytest.raises(ValueError, match="exp too large"):
+ safe_exp(701)
+
+
+def test_evaluate_expression_uses_safe_globals_and_rejects_bad_input():
+ assert evaluate_expression("x * 2 + sin(y)", {"x": 3.0, "y": 0.0}) == 6.0
+ assert evaluate_expression("pow(2, 3)", {}) == 8.0
+
+ with pytest.raises(ValueError):
+ evaluate_expression("__import__('os')", {})
+
+ with pytest.raises(ValueError):
+ evaluate_expression("x.__class__", {"x": 1})
+
+ with pytest.raises(ValueError):
+ evaluate_expression("a" * 201, {})
+
+
+class ParameterModel(RefinementBaseModel):
+ a: Parameter = Parameter(value=3)
+ b: Parameter = Parameter(value="a + 2")
+
+
+def test_parameter_string_expression_with_model_context():
+ model = ParameterModel()
+ model.b._ctx = lambda: {"a": float(model.a)}
+ model.b._name = "b"
+
+ assert float(model.a) == 3.0
+ assert float(model.b) == 5.0
+
+ assert model.a == 3
+ assert model.a < 4
+ assert model.a <= 3
+ assert model.a > 2
+
+
+def test_parameter_arithmetic_returns_raw_numbers_when_possible():
+ a = Parameter(value=3)
+ assert a + 2 == 5
+
+
+def test_is_parameter_like_detects_parameter_in_union_annotations():
+ assert is_parameter_like(Parameter | float)
+ assert not is_parameter_like(float)
+
+
+def test_parameter_array_serialisation_and_indexing():
+ array = ParameterArray.from_array([1, 2, 3], refine=False)
+ assert isinstance(array, ParameterArray)
+ assert np.array_equal(array.__array__(), np.array([1.0, 2.0, 3.0]))
+ first_item = array[1]
+ assert isinstance(first_item, Parameter)
+ assert first_item.value == 2
+ assert isinstance(array[1:2], ParameterArray)
+ serialised = array.serialize()
+ assert serialised["value"] == [1, 2, 3]
+ assert serialised["refine"] == [False, False, False]
+
+ loaded = ParameterArray.model_validate(
+ {
+ "value": [4, 5],
+ "refine": [True, False],
+ "lower_bounds": [-np.inf, -np.inf],
+ "upper_bounds": [np.inf, np.inf],
+ }
+ )
+ assert isinstance(loaded, ParameterArray)
+ first_item = loaded[0]
+ assert isinstance(first_item, Parameter)
+ assert first_item.value == 4
+ second_item = loaded[1]
+ assert isinstance(second_item, Parameter)
+ assert second_item.refine is False
+
+
+class SimpleXRPDModel(XRPDBaseModel):
+ x: int
+ y: str
+
+
+def test_xrpd_base_model_save_load(tmp_path: Path):
+ model = SimpleXRPDModel(x=1, y="hello")
+
+ json_path = tmp_path / "model.json"
+ model.save_to_json(json_path)
+ loaded_json = SimpleXRPDModel.load_from_json(json_path)
+ assert loaded_json == model
+
+ toml_path = tmp_path / "model.toml"
+ model.save_to_toml(toml_path)
+ loaded_toml = SimpleXRPDModel.load_from_toml(toml_path)
+ assert loaded_toml == model
+
+ yaml_path = tmp_path / "model.yaml"
+ model.save_to_yaml(yaml_path)
+ loaded_yaml = SimpleXRPDModel.load_from_yaml(yaml_path)
+ assert loaded_yaml == model
+
+ with pytest.raises(ValueError):
+ model.save_to_json(tmp_path / "bad.txt")
+
+ with pytest.raises(ValueError):
+ SimpleXRPDModel.load(tmp_path / "bad.txt")
+
+
+def test_xrpd_base_model_get_set_item():
+ model = SimpleXRPDModel(x=2, y="world")
+ assert model["x"] == 2
+ model["x"] = 5
+ assert model.x == 5
+ with pytest.raises(ValueError):
+ _ = model["missing"]
+
+
+class NestedRefinementModel(RefinementBaseModel):
+ c: Parameter = Parameter(value=3)
+
+
+class RefinementModelUnderTest(RefinementBaseModel):
+ a: Parameter | float = 1.5
+ b: Parameter = Parameter(value=2)
+ nested: NestedRefinementModel = NestedRefinementModel()
+
+
+def test_refinement_base_model_parameterisation_and_iteration():
+ model = RefinementModelUnderTest()
+ model.parameterise_all(refine=True)
+
+ assert isinstance(model.a, Parameter)
+ assert model.a.refine is True
+ assert isinstance(model.b, Parameter)
+ assert isinstance(model.nested.c, Parameter)
+
+ paths = {model.path_to_string(path) for path, _ in model.iter_parameters()}
+ assert "a" in paths
+ assert "b" in paths
+ assert "nested.c" in paths
+
+ model.parameterise_all(refine=True)
+ model.refine_none()
+ assert model.a.refine is False
+ assert model.b.refine is False
+ assert model.nested.c.refine is False
+
+ model.refine_all(keep_fixed=["b"])
+ assert model.a.refine is True
+ assert model.b.refine is False
+ assert model.nested.c.refine is True
+
+ params = model.get_refinement_parameters()
+ assert "a" in params
+ assert "nested.c" in params
+
+ model.set_refinement_parameters({"a": 4.0, "nested.c": 6.0})
+ assert float(model.a) == 4.0
+ assert float(model.nested.c) == 6.0
+
+ assert model.get_param_by_path("a") is model.a
+ assert model.get_param_by_path("nested.c") is model.nested.c
+
+
+def test_xyedata_from_csv(tmp_path: Path):
+ csv_file = tmp_path / "data.csv"
+ csv_file.write_text("1 2 0.1\n2 3 0.2\n")
+
+ data = XYEData.from_csv(str(csv_file))
+ assert data.e is not None
+ assert isinstance(data, XYEData)
+ assert np.array_equal(data.x, np.array([1.0, 2.0]))
+ assert np.array_equal(data.y, np.array([2.0, 3.0]))
+ assert np.array_equal(data.e, np.array([0.1, 0.2]))
+ assert data.source == str(csv_file)
+
+
+def test_scattering_data_from_xye_and_fullprof(tmp_path: Path):
+ xye_file = tmp_path / "data.xye"
+ xye_file.write_text("1 2 0.1\n2 3 0.2\n")
+
+ scattering = ScatteringData.from_xye(
+ str(xye_file), x_unit="tth", data_type="xray", wavelength=1.54
+ )
+ assert isinstance(scattering, ScatteringData)
+ assert scattering.x_unit == "tth"
+ assert scattering.data_type == "xray"
+ assert float(scattering.wavelength) == pytest.approx(1.54)
+
+ fullprof_file = tmp_path / "data.dat"
+ fullprof_file.write_text("header\n1 2 0.1\n2 3 0.2\n")
+
+ fullprof_data = ScatteringData.from_fullprof(
+ str(fullprof_file), x_unit="tth", data_type="xray", wavelength=2.0
+ )
+ assert isinstance(fullprof_data, ScatteringData)
+ assert fullprof_data.e is not None
+ assert np.array_equal(fullprof_data.x, np.array([1.0, 2.0]))
+ assert np.array_equal(fullprof_data.y, np.array([2.0, 3.0]))
+ assert np.array_equal(fullprof_data.e, np.array([0.1, 0.2]))
diff --git a/tests/test_eiger.py b/tests/test_eiger.py
new file mode 100644
index 0000000..a1fa8d1
--- /dev/null
+++ b/tests/test_eiger.py
@@ -0,0 +1,49 @@
+import numpy as np
+import pytest
+
+from xrpd_toolbox.i15_1.eiger_500k import Eiger500K
+
+wavelength = 0.161699
+
+poni = {
+ "dist": 0.7,
+ "poni1": 0.0,
+ "poni2": 0.1,
+ "rot1": 0.0,
+ "rot2": 0.0,
+ "rot3": 0.0,
+ "pixel1": 7.5e-5,
+ "pixel2": 7.5e-5,
+ "wavelength": wavelength / 1e10,
+}
+
+eiger = Eiger500K(poni=poni)
+
+
+def test_simulated_eiger():
+ positions_in_tth = np.linspace(1, 20, 10)
+
+ images, ais = eiger.simulate_data(
+ positions_in_tth=positions_in_tth,
+ calibrant_name="Si",
+ wavelength_in_ang=wavelength,
+ )
+
+ assert images[0].shape == (1024, 512)
+ assert np.any(images[0] > 0)
+
+
+@pytest.mark.skip(reason="Produces interactive plot output")
+def test_simulated_eiger_1d_scan():
+ x, y = eiger.simulate_1d_pattern(
+ positions_in_tth=np.linspace(1, 50, 10),
+ calibrant_name="Si",
+ wavelength_in_ang=wavelength,
+ )
+
+ assert len(x) > 0
+ assert len(y) == len(x)
+
+
+if __name__ == "__main__":
+ eiger.test()
diff --git a/tests/test_lattice.py b/tests/test_lattice.py
new file mode 100644
index 0000000..bc55f76
--- /dev/null
+++ b/tests/test_lattice.py
@@ -0,0 +1,105 @@
+import numpy as np
+import pytest
+
+from xrpd_toolbox.fit_engine.lattice import (
+ CubicLattice,
+ HexagonalLattice,
+ Lattice,
+ MonoclinicLattice,
+ OrthorhombicLattice,
+ RhombohedralLattice,
+ TetragonalLattice,
+ TriclinicLattice,
+ TrigonalLattice,
+ crystal_lattice_factory,
+)
+
+
+def test_cubic_lattice():
+ cl = CubicLattice(a=5)
+ params = cl.get_refinement_parameters()
+ params["a"] = 5.5
+ cl.set_refinement_parameters(params)
+
+ params = cl.get_refinement_parameters()
+
+ assert params["a"] == 5.5
+
+ model_dict = cl.model_dump()
+ cl2 = Lattice(**model_dict)
+
+ assert isinstance(cl2, Lattice)
+
+
+def test_lattice_radian_conversions_and_matrix():
+ lattice = Lattice(a=3.0, b=4.0, c=5.0, alpha=60.0, beta=70.0, gamma=80.0)
+
+ assert np.isclose(lattice.alpha_radians, np.deg2rad(60.0))
+ assert np.isclose(lattice.beta_radians, np.deg2rad(70.0))
+ assert np.isclose(lattice.gamma_radians, np.deg2rad(80.0))
+
+ matrix = lattice.matrix
+ assert matrix.shape == (3, 3)
+ assert np.isclose(matrix[0, 0], 3.0)
+ assert matrix[1, 0] == pytest.approx(4.0 * np.cos(np.deg2rad(80.0)))
+ assert matrix[1, 1] == pytest.approx(4.0 * np.sin(np.deg2rad(80.0)))
+ assert matrix[2, 2] >= 0.0
+
+
+def test_special_lattice_equalities():
+ ortho = OrthorhombicLattice(a=2.0, b=3.0, c=4.0)
+ assert ortho.alpha == 90
+ assert ortho.beta == 90
+ assert ortho.gamma == 90
+ assert ortho.a == 2.0
+ assert ortho.b == 3.0
+ assert ortho.c == 4.0
+
+ tetragonal = TetragonalLattice(a=2.5, c=6.0)
+ assert tetragonal.a == tetragonal.b
+ assert tetragonal.alpha == 90
+ assert tetragonal.gamma == 90
+
+ hexagonal = HexagonalLattice(a=2.0, c=5.0)
+ assert hexagonal.a == hexagonal.b
+ assert hexagonal.gamma == 120
+ assert hexagonal.alpha == 90
+ assert hexagonal.beta == 90
+
+ trigonal = TrigonalLattice(a=2.5, c=5.0)
+ assert trigonal.a == trigonal.b
+ assert trigonal.gamma == 120
+ assert trigonal.alpha == 90
+ assert trigonal.beta == 90
+
+ rhombo = RhombohedralLattice(a=4.0, alpha=100.0)
+ assert rhombo.a == rhombo.b == rhombo.c
+ assert rhombo.alpha == rhombo.beta == rhombo.gamma
+
+ mono = MonoclinicLattice(a=3.0, b=4.0, c=5.0, beta=110.0)
+ assert mono.alpha == 90
+ assert mono.gamma == 90
+ assert mono.beta == 110.0
+
+
+@pytest.mark.parametrize(
+ "crystal_class,expected_type",
+ [
+ ("cubic", CubicLattice),
+ ("hexagonal", HexagonalLattice),
+ ("monoclinic", MonoclinicLattice),
+ ("orthorhombic", OrthorhombicLattice),
+ ("rhombohedral", RhombohedralLattice),
+ ("tetragonal", TetragonalLattice),
+ ("trigonal", TrigonalLattice),
+ ("triclinic", TriclinicLattice),
+ ],
+)
+def test_crystal_lattice_factory_returns_expected_class(crystal_class, expected_type):
+ lattice_cls = crystal_lattice_factory(crystal_class.upper())
+ assert lattice_cls is expected_type
+
+
+def test_crystal_lattice_factory_raises_for_unknown_class():
+ with pytest.raises(ValueError, match="unknown"):
+ crystal_lattice_factory("unknown-crystal")
diff --git a/tests/test_mythen.py b/tests/test_mythen.py
new file mode 100644
index 0000000..88069d8
--- /dev/null
+++ b/tests/test_mythen.py
@@ -0,0 +1,97 @@
+import os
+from pathlib import Path
+
+import pytest
+
+from xrpd_toolbox.i11.mythen import MythenSettings
+
+CONFIG_FILE = (
+ Path(__file__).parent.parent / "config" / "i11" / "mythen3_reduction_config.toml"
+)
+
+
+@pytest.fixture
+def mythen_settings():
+ mythen_settings = MythenSettings(
+ active_modules=[1, 2, 3],
+ bad_modules=[4, 5],
+ bad_channel_masking=True,
+ flatfield_filepath="flatfield.h5",
+ apply_flatfield=False,
+ modules_in_flatfield=[1, 2],
+ send_to_ispyb=False,
+ rebin_step=0.004,
+ default_counter=0,
+ edge_bad_channels=10,
+ error_calc="poisson",
+ data_reduction_mode="step_scan",
+ bad_channels_filepath="bad_channels.txt",
+ angcal_filepath="angcal.txt",
+ )
+
+ return mythen_settings
+
+
+def test_mythen_settings(mythen_settings: MythenSettings):
+ assert mythen_settings.data_reduction_mode == "step_scan"
+ assert mythen_settings.rebin_step == 0.004
+
+
+def test_mythen_settings_load_from_toml():
+ settings = MythenSettings.load_from_toml(CONFIG_FILE)
+
+ assert isinstance(settings, MythenSettings)
+
+
+def test_mythen_toml_save_load(mythen_settings: MythenSettings):
+ file_path = "file.toml"
+
+ mythen_settings.save_to_toml(file_path)
+ loaded_mythen_settings = MythenSettings.load_from_toml(file_path)
+
+ assert mythen_settings == loaded_mythen_settings
+
+ os.remove(file_path)
+
+
+def test_mythen_yaml_save_load(mythen_settings: MythenSettings):
+ file_path = "file.yaml"
+
+ mythen_settings.save_to_yaml(file_path)
+ loaded_mythen_settings = MythenSettings.load_from_yaml(file_path)
+
+ assert mythen_settings == loaded_mythen_settings
+
+ os.remove(file_path)
+
+
+def test_mythen_load_fails_when_incorrect_file_extension(
+ mythen_settings: MythenSettings,
+):
+ file_path = "file.txt"
+
+ with pytest.raises(ValueError):
+ mythen_settings.save_to_yaml(file_path)
+
+ with pytest.raises(ValueError):
+ mythen_settings.save_to_toml(file_path)
+
+
+# def test_mythen_data_loader():
+# pass
+
+
+# def test_mythen_step_scan_process():
+# raise Exception("Not done")
+
+
+# def test_mythen_flatefield_process():
+# raise Exception("Not done")
+
+
+# def test_mythen_pump_probe_process():
+# raise Exception("Not done")
+
+
+# def test_mythen_time_resolved_process():
+# raise Exception("Not done")
diff --git a/tests/test_profile_calc.py b/tests/test_profile_calc.py
new file mode 100644
index 0000000..b008337
--- /dev/null
+++ b/tests/test_profile_calc.py
@@ -0,0 +1,66 @@
+import os
+from pathlib import Path
+
+import pytest
+
+from xrpd_toolbox.core import Parameter
+from xrpd_toolbox.fit_engine.background import Background, LinearInterpolationBackground
+from xrpd_toolbox.fit_engine.fitting_core import ScatteringData, refine_model
+from xrpd_toolbox.fit_engine.profile_calculation import ReitveldRefinement, Structure
+from xrpd_toolbox.utils.unit_conversion import beam_energy_to_wavelength
+
+# Paths relative to this test file
+TEST_DIR = Path(__file__).parent
+REPO_ROOT = TEST_DIR.parent
+CIF_DIR = REPO_ROOT / "cifs"
+TEST_DATA_DIR = TEST_DIR / "data"
+OUTPUT_NAME = "test.yaml"
+
+# Data file - use test data directory
+DATA_FILE = TEST_DATA_DIR / "1410696_summed_mythen3.xye"
+
+
+@pytest.mark.skipif(
+ not DATA_FILE.exists(),
+ reason="Test data file not available (expected in local dev environment)",
+)
+def test_refine_silicon():
+ si_cif = CIF_DIR / "Si.cif"
+ assert si_cif.exists(), f"CIF file not found: {si_cif}"
+
+ si_structure = Structure.load_from_cif(si_cif)
+
+ beam_energy = 15
+ wavelength = beam_energy_to_wavelength(beam_energy)
+
+ data = ScatteringData.from_xye(
+ str(DATA_FILE),
+ x_unit="tth",
+ data_type="xray",
+ wavelength=Parameter(value=wavelength, refine=False),
+ )
+
+ background = LinearInterpolationBackground.estimate(data.x, data.y)
+
+ model = ReitveldRefinement(data=data, background=background, structure=si_structure)
+
+ assert isinstance(model.background, Background)
+ model.background.refine_none()
+
+ print(model.get_refinement_parameters())
+ model.irf.refine_none()
+ model.refine(plot=False)
+ model.save(OUTPUT_NAME)
+ os.remove(OUTPUT_NAME)
+
+
+@pytest.mark.skipif(
+ not Path(OUTPUT_NAME).exists(),
+ reason="Requires test_refine_silicon to run first",
+)
+def test_load_refinement_and_refine():
+ loaded_refinement = ReitveldRefinement.load(OUTPUT_NAME)
+
+ loaded_refinement.calculate_profile()
+
+ refine_model(loaded_refinement)
diff --git a/tests/test_sample_alignment.py b/tests/test_sample_alignment.py
new file mode 100644
index 0000000..ed7a2e8
--- /dev/null
+++ b/tests/test_sample_alignment.py
@@ -0,0 +1,56 @@
+from pathlib import Path
+
+import pytest
+
+from xrpd_toolbox.fit_engine.background import ConstantBackground
+from xrpd_toolbox.i15_1.sample_alignment import (
+ SampleAligner,
+ run_sample_alignment,
+ sample_alignment_model_builder,
+)
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+SAMPLE_ALIGNMENT_DATA = (
+ REPO_ROOT / "src" / "xrpd_toolbox" / "i15_1" / "sample_alignment_data"
+)
+TEST_FILE = SAMPLE_ALIGNMENT_DATA / "NIST_Si-95016.csv"
+
+EXPECTED_SAMPLE_ALIGNMENT_CENTRES = {
+ "GaIn-94521.csv": 70.02,
+ "HKUST1-95018.csv": 71.05,
+ "NIST_Si-95016.csv": 84.37,
+ "NaCl-95017.csv": 55.39,
+ "carbon_black-94519.csv": 36.77,
+ "water-94520.csv": 55.23,
+}
+
+
+def test_sample_alignment_builder_from_csv():
+ model = sample_alignment_model_builder(str(TEST_FILE), peak_type="tophat")
+
+ assert isinstance(model, SampleAligner)
+ assert isinstance(model.background, ConstantBackground)
+ assert model.data.x.shape == model.data.y.shape
+ assert model.data.x.shape[0] > 0
+ assert len(model.sample_and_capillary) > 0
+
+ y_calc = model.calculate_profile()
+ assert y_calc.shape == model.data.x.shape
+ assert y_calc.dtype == model.data.x.dtype
+
+
+@pytest.mark.parametrize(
+ "csv_file, expected_centre",
+ EXPECTED_SAMPLE_ALIGNMENT_CENTRES.items(),
+)
+def test_run_sample_alignment_returns_centered_model(
+ csv_file: Path, expected_centre: float
+):
+ sample_file = SAMPLE_ALIGNMENT_DATA / csv_file
+ model = run_sample_alignment(str(sample_file))
+
+ assert isinstance(model, SampleAligner)
+ assert model.centre is not None
+ assert len(model.sample_and_capillary) > 0
+ assert model.data.x.shape[0] > 0
+ assert model.centre == pytest.approx(expected_centre, abs=2)
diff --git a/tests/test_utils.py b/tests/test_utils.py
index de69e74..5e1b793 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -1,7 +1,30 @@
+import os
+
import numpy as np
+import pytest
+import scipy.integrate as integrate
+
+from xrpd_toolbox.fit_engine.peaks import find_and_fit_peaks, gaussian
+from xrpd_toolbox.utils.unit_conversion import beam_energy_to_wavelength, two_theta_to_q
+from xrpd_toolbox.utils.utils import (
+ get_filenumber_from_nxs,
+ get_folder_paths,
+ load_int_array_from_file,
+ nexus_file_match,
+ normalise,
+ normalise_to,
+)
+
-from xrpd_toolbox.utils.energy import beam_energy_to_wavelength, tth_to_q
-from xrpd_toolbox.utils.utils import normalise_to
+def test_get_filenumber_from_nxs():
+ filedir = "/dls/i11/test/cm12345-1/i11-99999.nxs"
+ assert get_filenumber_from_nxs(filedir) == 99999
+
+
+def test_nexus_file_match():
+ filedir = "/dls/i15-1/test/cm12345-1/i15-1-99999.nxs"
+ filename = os.path.basename(filedir)
+ assert nexus_file_match(filename, beamline="i15-1") is not None
def test_normalise_to():
@@ -9,12 +32,113 @@ def test_normalise_to():
assert np.array_equal(normalised_array, [0.25, 0.5, 1.0])
+def test_normalise():
+ normalised_array = normalise([1, 2, 4])
+ assert np.amax(normalised_array) == 1.0
+ assert np.amin(normalised_array) == 0.0
+
+
+def test_gaussian():
+ x = np.linspace(0, 10, 100)
+ y = gaussian(x, amplitude=22.0, centre=5.0, fwhm=1.0)
+ assert len(y) == len(x)
+ integral = integrate.simpson(y, x)
+ assert np.isclose(integral, 22.0, atol=0.5)
+
+
def test_tth_to_q():
tth = 30
- q_in_angstrom = tth_to_q(tth, 1)
+ q_in_angstrom = two_theta_to_q(tth, 1)
assert np.round(q_in_angstrom, 2) == 3.25
def test_beam_energy_to_wavelength():
wavelength_in_angstrom = beam_energy_to_wavelength(12.34, unit="kev")
assert round(wavelength_in_angstrom, 2) == 1.0
+
+
+def test_load_int_array_from_file_returns_array_when_contains_ints(tmp_path):
+ test_file = tmp_path / "int_array.txt"
+
+ # Create a temporary file
+ test_file.write_text("\n".join(str(i) for i in range(1, 6)))
+
+ # Test loading the array
+ result = load_int_array_from_file(test_file)
+ expected = np.array([1, 2, 3, 4, 5])
+ assert np.array_equal(result, expected)
+
+
+def test_load_int_array_from_file_raises_when_file_doesnt_exist():
+ test_file = "non_existent.txt"
+
+ with pytest.raises(FileNotFoundError, match="does not exist"):
+ load_int_array_from_file(test_file)
+
+
+def test_load_int_array_from_file_returns_empty_array_when_file_empty(tmp_path):
+ test_file = tmp_path / "int_array.txt"
+
+ # Create a temporary empty file
+ test_file.write_text("")
+
+ result = load_int_array_from_file(test_file)
+ expected = np.array([])
+ assert np.array_equal(result, expected)
+
+ # Create a temporary file
+ with open(test_file, "w") as f:
+ f.write("")
+
+ # Test loading the array
+ result = load_int_array_from_file(test_file)
+ expected = np.array([])
+ assert np.array_equal(result, expected)
+
+ # Clean up
+ os.remove(test_file)
+
+
+def test_get_folder_paths():
+ list_of_paths = get_folder_paths("/")
+
+ assert "/home" in list_of_paths
+ assert isinstance(list_of_paths, list)
+
+
+def test_find_and_fit_peaks_with_one_peak():
+ np.random.seed(0) # For reproducibility
+ x = np.linspace(0, 10, 100)
+ y = gaussian(x, amplitude=1.0, centre=5.0, fwhm=1.0)
+
+ noise = np.random.normal(0, 0.02, size=y.shape)
+ y_noisy = y + noise
+
+ peaks = find_and_fit_peaks(x, y_noisy)
+ assert np.isclose(peaks[0].centre, 5.0, atol=0.1)
+
+ print(peaks)
+
+
+def test_find_and_fit_peaks_with_n_peaks():
+ np.random.seed(0) # For reproducibility
+ x = np.linspace(0, 100, 1000)
+
+ y_intensity = np.zeros_like(x)
+
+ for peak_cen in np.linspace(20, 80, 4):
+ peak_intensity = gaussian(x, amplitude=1.0, centre=peak_cen, fwhm=1.0)
+ y_intensity = y_intensity + peak_intensity
+
+ noise = np.random.normal(0, 0.02, size=y_intensity.shape)
+ y_noisy = y_intensity + noise
+
+ peaks = find_and_fit_peaks(x, y_noisy)
+
+ assert len(peaks) == 4
+
+ assert np.allclose([float(p.centre) for p in peaks], [20, 40, 60, 80], atol=0.5)
+
+
+if __name__ == "__main__":
+ test_find_and_fit_peaks_with_n_peaks()
diff --git a/uv.lock b/uv.lock
index 98c6a36..bb99e34 100644
--- a/uv.lock
+++ b/uv.lock
@@ -19,6 +19,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
]
+[[package]]
+name = "anyio"
+version = "4.13.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" },
+]
+
[[package]]
name = "asteval"
version = "1.0.8"
@@ -28,6 +41,33 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/99/31/6cf181011dc738c33bf6ba7aea2e8e1d3c1f71b7dab1942f3054f66f6202/asteval-1.0.8-py3-none-any.whl", hash = "sha256:6c64385c6ff859a474953c124987c7ee8354d781c76509b2c598741c4d1d28e9", size = 22968, upload-time = "2025-12-17T20:56:07.457Z" },
]
+[[package]]
+name = "asttokens"
+version = "3.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" },
+]
+
+[[package]]
+name = "backoff"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001, upload-time = "2022-10-05T19:19:32.061Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" },
+]
+
+[[package]]
+name = "bibtexparser"
+version = "1.4.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/44/1c/577d3ce406e88f370e80a6ebf76ae52a2866521e0b585e8ec612759894f1/bibtexparser-1.4.4.tar.gz", hash = "sha256:093b6c824f7a71d3a748867c4057b71f77c55b8dbc07efc993b781771520d8fb", size = 55594, upload-time = "2026-01-29T18:58:01.366Z" }
+
[[package]]
name = "cachetools"
version = "7.0.6"
@@ -37,6 +77,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/fe/c4/cf76242a5da1410917107ff14551764aa405a5fd10cd10cf9a5ca8fa77f4/cachetools-7.0.6-py3-none-any.whl", hash = "sha256:4e94956cfdd3086f12042cdd29318f5ced3893014f7d0d059bf3ead3f85b7f8b", size = 13976, upload-time = "2026-04-20T19:02:21.187Z" },
]
+[[package]]
+name = "certifi"
+version = "2026.4.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" },
+]
+
[[package]]
name = "cfgv"
version = "3.5.0"
@@ -46,6 +95,95 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" },
]
+[[package]]
+name = "charset-normalizer"
+version = "3.4.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" },
+ { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" },
+ { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" },
+ { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" },
+ { url = "https://files.pythonhosted.org/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" },
+ { url = "https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" },
+ { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" },
+ { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" },
+ { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" },
+ { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" },
+ { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" },
+ { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" },
+ { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" },
+ { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" },
+ { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" },
+ { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" },
+ { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" },
+ { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" },
+ { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" },
+ { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" },
+ { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" },
+ { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" },
+ { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" },
+ { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" },
+ { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" },
+ { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" },
+ { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" },
+ { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" },
+ { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" },
+]
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -55,6 +193,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
]
+[[package]]
+name = "comm"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" },
+]
+
[[package]]
name = "contourpy"
version = "1.3.3"
@@ -274,6 +421,28 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
]
+[[package]]
+name = "dans-diffraction"
+version = "3.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "matplotlib" },
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/97/c1/23a07e0bb8edeaa50f85a5399dd10e7b002d5bab90a1cfc41461eb229825/dans_diffraction-3.4.0.tar.gz", hash = "sha256:d808af4db4dcc30ec0a6d10d7566cafd9a0c22913456e369166d9a267236ded7", size = 3605391, upload-time = "2025-09-15T20:09:06.203Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/bb/92/b7bbffc01432c63ea79295686b42a4959dacb298e6f39a95029600acb73b/dans_diffraction-3.4.0-py3-none-any.whl", hash = "sha256:d19a522b37655970dfa9f0eaa1abbea6a20643c9b5473cb613d80d5362180746", size = 3698901, upload-time = "2025-09-15T20:09:03.806Z" },
+]
+
+[[package]]
+name = "decorator"
+version = "5.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" },
+]
+
[[package]]
name = "dill"
version = "0.4.1"
@@ -292,6 +461,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" },
]
+[[package]]
+name = "docopt-ng"
+version = "0.9.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e4/50/8d6806cf13138127692ae6ff79ddeb4e25eb3b0bcc3c1bd033e7e04531a9/docopt_ng-0.9.0.tar.gz", hash = "sha256:91c6da10b5bb6f2e9e25345829fb8278c78af019f6fc40887ad49b060483b1d7", size = 32264, upload-time = "2023-05-30T20:46:25.064Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6c/4a/c3b77fc1a24510b08918b43a473410c0168f6e657118807015f1f1edceea/docopt_ng-0.9.0-py3-none-any.whl", hash = "sha256:bfe4c8b03f9fca424c24ee0b4ffa84bf7391cb18c29ce0f6a8227a3b01b81ff9", size = 16689, upload-time = "2023-05-30T20:46:45.294Z" },
+]
+
[[package]]
name = "dunamai"
version = "1.26.1"
@@ -304,6 +482,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/fa/bc/8b8ec5a4bfc5b9cf3ce27a118339e994f88410be5677c96493e0ea28e76d/dunamai-1.26.1-py3-none-any.whl", hash = "sha256:2727d939c5b4257cb01ea404372803b477f5176e5a347c43beaf89cd5072e853", size = 27332, upload-time = "2026-04-04T14:07:10.079Z" },
]
+[[package]]
+name = "executing"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" },
+]
+
[[package]]
name = "fabio"
version = "2025.10.0"
@@ -416,6 +603,30 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl", hash = "sha256:53df23c8bb1651b12f095df764bfb057935d49537a56de211b098f4c79614bb0", size = 30891, upload-time = "2023-03-28T06:22:42.576Z" },
]
+[[package]]
+name = "gql"
+version = "4.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "backoff" },
+ { name = "graphql-core" },
+ { name = "yarl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/9f/cf224a88ed71eb223b7aa0b9ff0aa10d7ecc9a4acdca2279eb046c26d5dc/gql-4.0.0.tar.gz", hash = "sha256:f22980844eb6a7c0266ffc70f111b9c7e7c7c13da38c3b439afc7eab3d7c9c8e", size = 215644, upload-time = "2025-08-17T14:32:35.397Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ac/94/30bbd09e8d45339fa77a48f5778d74d47e9242c11b3cd1093b3d994770a5/gql-4.0.0-py3-none-any.whl", hash = "sha256:f3beed7c531218eb24d97cb7df031b4a84fdb462f4a2beb86e2633d395937479", size = 89900, upload-time = "2025-08-17T14:32:34.029Z" },
+]
+
+[[package]]
+name = "graphql-core"
+version = "3.2.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/68/c5/36aa96205c3ecbb3d34c7c24189e4553c7ca2ebc7e1dd07432339b980272/graphql_core-3.2.8.tar.gz", hash = "sha256:015457da5d996c924ddf57a43f4e959b0b94fb695b85ed4c29446e508ed65cf3", size = 513181, upload-time = "2026-03-05T19:55:37.332Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/86/41/cb887d9afc5dabd78feefe6ccbaf83ff423c206a7a1b7aeeac05120b2125/graphql_core-3.2.8-py3-none-any.whl", hash = "sha256:cbee07bee1b3ed5e531723685369039f32ff815ef60166686e0162f540f1520c", size = 207349, upload-time = "2026-03-05T19:55:35.911Z" },
+]
+
[[package]]
name = "h5py"
version = "3.16.0"
@@ -492,6 +703,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" },
]
+[[package]]
+name = "idna"
+version = "3.15"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" },
+]
+
[[package]]
name = "iniconfig"
version = "2.3.0"
@@ -501,6 +721,69 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
]
+[[package]]
+name = "ipython"
+version = "9.13.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "decorator" },
+ { name = "ipython-pygments-lexers" },
+ { name = "jedi" },
+ { name = "matplotlib-inline" },
+ { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
+ { name = "prompt-toolkit" },
+ { name = "psutil" },
+ { name = "pygments" },
+ { name = "stack-data" },
+ { name = "traitlets" },
+ { name = "typing-extensions", marker = "python_full_version < '3.12'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" },
+]
+
+[[package]]
+name = "ipython-pygments-lexers"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" },
+]
+
+[[package]]
+name = "ipywidgets"
+version = "8.1.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "comm" },
+ { name = "ipython" },
+ { name = "jupyterlab-widgets" },
+ { name = "traitlets" },
+ { name = "widgetsnbextension" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" },
+]
+
+[[package]]
+name = "jedi"
+version = "0.20.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "parso" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" },
+]
+
[[package]]
name = "jinja2"
version = "3.1.6"
@@ -526,6 +809,24 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl", hash = "sha256:e1082f5564917649c76fed239117820610516ec10f87735d0338688800a55b34", size = 18975, upload-time = "2022-06-30T14:08:49.571Z" },
]
+[[package]]
+name = "joblib"
+version = "1.5.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" },
+]
+
+[[package]]
+name = "jupyterlab-widgets"
+version = "3.0.16"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" },
+]
+
[[package]]
name = "kiwisolver"
version = "1.5.0"
@@ -632,6 +933,34 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" },
]
+[[package]]
+name = "llvmlite"
+version = "0.47.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz", hash = "sha256:62031ce968ec74e95092184d4b0e857e444f8fdff0b8f9213707699570c33ccc", size = 193614, upload-time = "2026-03-31T18:29:53.497Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74090f0dcfd6f24ebbef3f21f11e38111c4d7e6919b54c4416e1e357c3446b07", size = 37232770, upload-time = "2026-03-31T18:28:26.765Z" },
+ { url = "https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ca14f02e29134e837982497959a8e2193d6035235de1cb41a9cb2bd6da4eedbb", size = 56275177, upload-time = "2026-03-31T18:28:31.01Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/51/48a53fedf01cb1f3f43ef200be17ebf83c8d9a04018d3783c1a226c342c2/llvmlite-0.47.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:12a69d4bb05f402f30477e21eeabe81911e7c251cecb192bed82cd83c9db10d8", size = 55128631, upload-time = "2026-03-31T18:28:36.046Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:c37d6eb7aaabfa83ab9c2ff5b5cdb95a5e6830403937b2c588b7490724e05327", size = 38138400, upload-time = "2026-03-31T18:28:40.076Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/48/4b7fe0e34c169fa2f12532916133e0b219d2823b540733651b34fdac509a/llvmlite-0.47.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:306a265f408c259067257a732c8e159284334018b4083a9e35f67d19792b164f", size = 37232769, upload-time = "2026-03-31T18:28:43.735Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/4b/e3f2cd17822cf772a4a51a0a8080b0032e6d37b2dbe8cfb724eac4e31c52/llvmlite-0.47.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5853bf26160857c0c2573415ff4efe01c4c651e59e2c55c2a088740acfee51cd", size = 56275178, upload-time = "2026-03-31T18:28:48.342Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/55/a3b4a543185305a9bdf3d9759d53646ed96e55e7dfd43f53e7a421b8fbae/llvmlite-0.47.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:003bcf7fa579e14db59c1a1e113f93ab8a06b56a4be31c7f08264d1d4072d077", size = 55128632, upload-time = "2026-03-31T18:28:52.901Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/f5/d281ae0f79378a5a91f308ea9fdb9f9cc068fddd09629edc0725a5a8fde1/llvmlite-0.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:f3079f25bdc24cd9d27c4b2b5e68f5f60c4fdb7e8ad5ee2b9b006007558f9df7", size = 38138692, upload-time = "2026-03-31T18:28:57.147Z" },
+ { url = "https://files.pythonhosted.org/packages/77/6f/4615353e016799f80fa52ccb270a843c413b22361fadda2589b2922fb9b0/llvmlite-0.47.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a3c6a735d4e1041808434f9d440faa3d78d9b4af2ee64d05a66f351883b6ceec", size = 37232771, upload-time = "2026-03-31T18:29:01.324Z" },
+ { url = "https://files.pythonhosted.org/packages/31/b8/69f5565f1a280d032525878a86511eebed0645818492feeb169dfb20ae8e/llvmlite-0.47.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2699a74321189e812d476a43d6d7f652f51811e7b5aad9d9bba842a1c7927acb", size = 56275178, upload-time = "2026-03-31T18:29:05.748Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/da/b32cafcb926fb0ce2aa25553bf32cb8764af31438f40e2481df08884c947/llvmlite-0.47.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c6951e2b29930227963e53ee152441f0e14be92e9d4231852102d986c761e40", size = 55128632, upload-time = "2026-03-31T18:29:11.235Z" },
+ { url = "https://files.pythonhosted.org/packages/46/9f/4898b44e4042c60fafcb1162dfb7014f6f15b1ec19bf29cfea6bf26df90d/llvmlite-0.47.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2e9adf8698d813a9a5efb2d4370caf344dbc1e145019851fee6a6f319ba760e", size = 38138695, upload-time = "2026-03-31T18:29:15.43Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/d4/33c8af00f0bf6f552d74f3a054f648af2c5bc6bece97972f3bfadce4f5ec/llvmlite-0.47.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:de966c626c35c9dff5ae7bf12db25637738d0df83fc370cf793bc94d43d92d14", size = 37232773, upload-time = "2026-03-31T18:29:19.453Z" },
+ { url = "https://files.pythonhosted.org/packages/64/1d/a760e993e0c0ba6db38d46b9f48f6c7dceb8ac838824997fb9e25f97bc04/llvmlite-0.47.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ddbccff2aeaff8670368340a158abefc032fe9b3ccf7d9c496639263d00151aa", size = 56275176, upload-time = "2026-03-31T18:29:24.149Z" },
+ { url = "https://files.pythonhosted.org/packages/84/3b/e679bc3b29127182a7f4aa2d2e9e5bea42adb93fb840484147d59c236299/llvmlite-0.47.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4a7b778a2e144fc64468fb9bf509ac1226c9813a00b4d7afea5d988c4e22fca", size = 55128631, upload-time = "2026-03-31T18:29:29.536Z" },
+ { url = "https://files.pythonhosted.org/packages/be/f7/19e2a09c62809c9e63bbd14ce71fb92c6ff7b7b3045741bb00c781efc3c9/llvmlite-0.47.0-cp314-cp314-win_amd64.whl", hash = "sha256:694e3c2cdc472ed2bd8bd4555ca002eec4310961dd58ef791d508f57b5cc4c94", size = 39153826, upload-time = "2026-03-31T18:29:33.681Z" },
+ { url = "https://files.pythonhosted.org/packages/40/a1/581a8c707b5e80efdbbe1dd94527404d33fe50bceb71f39d5a7e11bd57b7/llvmlite-0.47.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:92ec8a169a20b473c1c54d4695e371bde36489fc1efa3688e11e99beba0abf9c", size = 37232772, upload-time = "2026-03-31T18:29:37.952Z" },
+ { url = "https://files.pythonhosted.org/packages/11/03/16090dd6f74ba2b8b922276047f15962fbeea0a75d5601607edb301ba945/llvmlite-0.47.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa1cbd800edd3b20bc141521f7fd45a6185a5b84109aa6855134e81397ffe72b", size = 56275178, upload-time = "2026-03-31T18:29:42.58Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/cb/0abf1dd4c5286a95ffe0c1d8c67aec06b515894a0dd2ac97f5e27b82ab0b/llvmlite-0.47.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6725179b89f03b17dabe236ff3422cb8291b4c1bf40af152826dfd34e350ae8", size = 55128632, upload-time = "2026-03-31T18:29:46.939Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/79/d3bbab197e86e0ff4f9c07122895b66a3e0d024247fcff7f12c473cb36d9/llvmlite-0.47.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6842cf6f707ec4be3d985a385ad03f72b2d724439e118fcbe99b2929964f0453", size = 39153839, upload-time = "2026-03-31T18:29:51.004Z" },
+]
+
[[package]]
name = "lmfit"
version = "1.3.4"
@@ -888,6 +1217,175 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/6f/87/afead29192170917537934c6aff4b008c805fff7b1ccea0c79120d96beda/matplotlib-3.10.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4", size = 8774002, upload-time = "2026-04-24T00:14:09.816Z" },
]
+[[package]]
+name = "matplotlib-inline"
+version = "0.2.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" },
+]
+
+[[package]]
+name = "monty"
+version = "2026.2.18"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "ruamel-yaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/82/e2/e8ada0dbe679e4af4587e1d29b46e6c1febf2e861cb71ba09b2a6b3aed1a/monty-2026.2.18.tar.gz", hash = "sha256:e34e77abe7454ab84a9eeab7d909dbb500e3fa114c1849352ecd4570feb72be0", size = 191585, upload-time = "2026-02-18T01:19:02.858Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/af/d46382eef9338e01a9f6424884a127e1fbf9a13818b962edfa8a231830bb/monty-2026.2.18-py3-none-any.whl", hash = "sha256:fee3580ccc77431a4714455dc705a0bd6196c4350f4fca3771e5fa61638274ea", size = 52670, upload-time = "2026-02-18T01:19:01.079Z" },
+]
+
+[[package]]
+name = "mpmath"
+version = "1.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" },
+]
+
+[[package]]
+name = "multidict"
+version = "6.7.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355, upload-time = "2026-01-26T02:43:31.165Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" },
+ { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" },
+ { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940, upload-time = "2026-01-26T02:43:43.042Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" },
+ { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302, upload-time = "2026-01-26T02:43:48.753Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981, upload-time = "2026-01-26T02:43:49.921Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159, upload-time = "2026-01-26T02:43:51.635Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" },
+ { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" },
+ { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" },
+ { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" },
+ { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" },
+ { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" },
+ { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" },
+ { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" },
+ { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" },
+ { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" },
+ { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" },
+ { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" },
+ { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" },
+ { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" },
+ { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" },
+ { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" },
+ { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" },
+ { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" },
+ { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" },
+ { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" },
+ { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" },
+ { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" },
+ { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" },
+ { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" },
+ { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" },
+ { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" },
+ { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" },
+ { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" },
+ { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" },
+]
+
+[[package]]
+name = "narwhals"
+version = "2.21.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2d/0e/3ad61eb87088cc4932e0d851531fa82f845a6230b68b091a0e298cc7e537/narwhals-2.21.0.tar.gz", hash = "sha256:7c6e7f50528e62b7a967dd864d7e117d2955d38d4f730653ce46a9861358e2dc", size = 633083, upload-time = "2026-05-08T12:29:02.587Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/e1/68c2256b69a314eba133673377ba9118c356f6342a0c02b61de449cf2bf2/narwhals-2.21.0-py3-none-any.whl", hash = "sha256:1e6617d0fca68ae1fda29e5397c4eaacd3ffc9fffe6bcd6ded0c690475e853be", size = 451943, upload-time = "2026-05-08T12:29:01.058Z" },
+]
+
+[[package]]
+name = "networkx"
+version = "3.6.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" },
+]
+
[[package]]
name = "nodeenv"
version = "1.10.0"
@@ -897,6 +1395,38 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" },
]
+[[package]]
+name = "numba"
+version = "0.65.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "llvmlite" },
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz", hash = "sha256:19357146c32fe9ed25059ab915e8465fb13951cf6b0aace3826b76886373ab23", size = 2765600, upload-time = "2026-04-24T02:02:56.551Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:7020d74b19cdb8cff16506542fdd510756e28c5e7f3bd0b7f574f0f42272fcd9", size = 2680563, upload-time = "2026-04-24T02:02:18.414Z" },
+ { url = "https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f80ed83774b5173abd6581cd8d2165d1d38e13d2e5c8155c0c0b421784745420", size = 3745018, upload-time = "2026-04-24T02:02:20.252Z" },
+ { url = "https://files.pythonhosted.org/packages/49/aa/4361698f35bf63bff67dfe6c90493731177f48ede954f77b0588731537bc/numba-0.65.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7ed425a43b0a5f9772f2f4e2dd0bbd12eabecae1af0b24efcfd4e053f012aac6", size = 3450962, upload-time = "2026-04-24T02:02:22.449Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl", hash = "sha256:df40a5028a975b9ea66f6a2a3f7abbdbd541a863070e34ed367aff21141248e4", size = 2747417, upload-time = "2026-04-24T02:02:24.43Z" },
+ { url = "https://files.pythonhosted.org/packages/57/bc/76f8f8c5cf9adee47fdb7bbb03be8900f76f902d451d7477cf12b845e1de/numba-0.65.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ac3f1e77c352dd0ea9712732c2d8f9ca507717435eec5b5013bf138ac33c4a08", size = 2681371, upload-time = "2026-04-24T02:02:26.105Z" },
+ { url = "https://files.pythonhosted.org/packages/69/47/a415af0283e4db0398104c6d1c11c9861a98dc67a7aa442a7769ed5d6196/numba-0.65.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:52bc6f3ceb8fcaff9b2ae26b4c6b1e9fee39db8d355534c0fe4f39a901246b84", size = 3802467, upload-time = "2026-04-24T02:02:27.712Z" },
+ { url = "https://files.pythonhosted.org/packages/46/36/246f73ec99cfeab2f2cb2ce7d4218766cc36a2da418901223f4f4da9c813/numba-0.65.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90ca10b3463bae0bd70589726fe3c77d01d6b5fc86bee54bcdf9fb6b47c28977", size = 3502628, upload-time = "2026-04-24T02:02:29.763Z" },
+ { url = "https://files.pythonhosted.org/packages/db/9e/3c679b2ee078425b9e99a91e44f8d132a6830d8ccce5227bc5e9181aeed8/numba-0.65.1-cp312-cp312-win_amd64.whl", hash = "sha256:5971c632be2a2351500431f46213821dba8d02b18a9f7d02fd36bd2743e41a6a", size = 2750611, upload-time = "2026-04-24T02:02:31.477Z" },
+ { url = "https://files.pythonhosted.org/packages/79/37/14a4579049c1eb673afd0de0cb4842982acd55b9ce2643e763db858bcea0/numba-0.65.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1735c15c1134a5108b4d6a5c77fc0947924ea066a738dc09a52008c13df9cad3", size = 2681344, upload-time = "2026-04-24T02:02:33.65Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/22/b8d873f6466b20aa563fc9b33acd48dec89a07803ddaa2f1c8ca1cd33126/numba-0.65.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c09f49117ef255e1f1c6dad0c7a1ed39868243862a73be5706793241a3755f1b", size = 3810619, upload-time = "2026-04-24T02:02:36.041Z" },
+ { url = "https://files.pythonhosted.org/packages/62/08/e16a8b5d9a018962ebb5c66be662317cde32b9f5dab08441f90bed5522fb/numba-0.65.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:594a8680b3fadac99e97e489b1fd89007177e5336713745c3b769528c635a464", size = 3509783, upload-time = "2026-04-24T02:02:38.245Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/a5/03c970d57f4c1741354837353ce39fb5206952ae1dba8922d29c86f64805/numba-0.65.1-cp313-cp313-win_amd64.whl", hash = "sha256:85be74c0d036842699a30058f82fb88fc5ffdc59f7615cab5792ea92914c9b62", size = 2750534, upload-time = "2026-04-24T02:02:39.903Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/2e/8aed9b726d9ba5f11ad287645fd479e88278db3060a25cb1225d730eb2b7/numba-0.65.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:33f5eb68eb1c843511615d14663ce60258525d6a4c65ab040e2c2b0c4cf17450", size = 2681554, upload-time = "2026-04-24T02:02:41.812Z" },
+ { url = "https://files.pythonhosted.org/packages/87/96/f3eb235fafa82a34e2ab5dd7dc9ffff998ebf5f0bbc23fa56a96aeb44da6/numba-0.65.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:71e73029bf53a62cc6afcf96be4bd942290d8b4c55f0a454fb536158115790f7", size = 3779602, upload-time = "2026-04-24T02:02:43.726Z" },
+ { url = "https://files.pythonhosted.org/packages/09/90/b0f09b48752d23640b8284f22aa597737e8adaddc7fbfacc4708b7f73a4c/numba-0.65.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a07635e0be926b9bdbffb09137c230fb13f6ec0e564914ba937cee12ce3eb35", size = 3479532, upload-time = "2026-04-24T02:02:45.427Z" },
+ { url = "https://files.pythonhosted.org/packages/56/46/3f7fc04fb853559e74b210e0b62c19974ec844cefec611f9e535f4da3761/numba-0.65.1-cp314-cp314-win_amd64.whl", hash = "sha256:2a20fcdabdefbdacf88d85caf70c3b18c4bcb7ebb8f82e6a19486383dd26ab63", size = 2752637, upload-time = "2026-04-24T02:02:47.664Z" },
+ { url = "https://files.pythonhosted.org/packages/81/7b/c1a341a9067367778f4152a5f01061cf281fb09582c92c510ec4918cabf6/numba-0.65.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:548dd4b3a4508d5062768d1514b2cd7b015f9a25ec7af651c50dee243965e652", size = 2684600, upload-time = "2026-04-24T02:02:49.653Z" },
+ { url = "https://files.pythonhosted.org/packages/03/36/98ddbcf3e4f04a6dd07e1c67249955920579ba4af6bb6868e3088f4ed282/numba-0.65.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:78abc28feff2c2ff8307fff3975b6438352759c9acb797ecd6b1fb6e7e39e31d", size = 3817198, upload-time = "2026-04-24T02:02:51.266Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/83/0dad21057ece5a835599f5d24099b091703995e23dbbf894f259e91c010b/numba-0.65.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee7676cb389555805f9b9a1840cbcd1ea6c8bd5376ab6918e3a29c5ea1dbda20", size = 3533862, upload-time = "2026-04-24T02:02:52.987Z" },
+ { url = "https://files.pythonhosted.org/packages/32/36/8be7118ffd4c8440881046eac3d0982cc5ab42909508cf5d67024d62a2e4/numba-0.65.1-cp314-cp314t-win_amd64.whl", hash = "sha256:20609346e3bd75204950dcbbfe383a8d7dbf4902f442aedbf00f97fef4aa8f38", size = 2758237, upload-time = "2026-04-24T02:02:54.612Z" },
+]
+
[[package]]
name = "numexpr"
version = "2.14.1"
@@ -1035,6 +1565,87 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/04/74/f4c001f4714c3ad9ce037e18cf2b9c64871a84951eaa0baf683a9ca9301c/numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119", size = 12509075, upload-time = "2026-03-29T13:21:57.644Z" },
]
+[[package]]
+name = "numpydantic"
+version = "1.8.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pydantic" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/53/28/fb2fa636e777d3a0636697b59e0c3310dbfa5a4126ba3515bb0848e20032/numpydantic-1.8.1.tar.gz", hash = "sha256:e5192efee5784df5cb70f99937e3538fdcbe58ed445c53935f39e5ab2b3f8ea6", size = 82121, upload-time = "2026-04-14T00:01:18.931Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/99/e1/9af63cd9a101ac1c1362200705fb3fa5aabe80a5d63674d0253b18a1072b/numpydantic-1.8.1-py3-none-any.whl", hash = "sha256:f3170b44cdcb168d3799eccbbbe8993f146e90211db9d9903f62b56006e8baca", size = 87926, upload-time = "2026-04-14T00:01:17.388Z" },
+]
+
+[[package]]
+name = "orjson"
+version = "3.11.9"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/0c/964746fcafbd16f8ff53219ad9f6b412b34f345c75f384ad434ceaadb538/orjson-3.11.9.tar.gz", hash = "sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f", size = 5599163, upload-time = "2026-05-06T15:11:08.309Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/51/3fb9e65ae76ee97bd611869a503fa3fc0a6e81dd8b737cf3003f682df7ff/orjson-3.11.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f01c4818b3fc9b0da8e096722a84318071eaa118df35f6ed2344da0e73a5444f", size = 228522, upload-time = "2026-05-06T15:09:35.362Z" },
+ { url = "https://files.pythonhosted.org/packages/16/fa/9d54b07cb3f3b0bfd57841478e42d7a0ece4a9f49f9907eecf5a45461687/orjson-3.11.9-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:3ebca4179031ee716ed076ffadc29428e900512f6fccee8614c9983157fcf19c", size = 128463, upload-time = "2026-05-06T15:09:37.063Z" },
+ { url = "https://files.pythonhosted.org/packages/88/b1/6ceafc2eefd0a553e3be77ce6c49d107e772485d9568629376171c50e634/orjson-3.11.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48ee05097750de0ff69ed5b7bbcf0732182fd57a24043dcc2a1da780a5ead3a5", size = 132306, upload-time = "2026-05-06T15:09:38.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/76/f11311285324a40aab1e3031385c50b635a7cd0734fdaf60c7e89a696f60/orjson-3.11.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6082706765a95a6680d812e1daf1c0cfe8adec7831b3ff3b625693f3b461b1c", size = 127988, upload-time = "2026-05-06T15:09:39.597Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/85/0ef63bcf1337f44031ce9b91b1919563f62a37527b3ea4368bb15a22e5d7/orjson-3.11.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:277fefe9d76ee17eb14debf399e3533d4d63b5f677a4d3719eb763536af1f4bd", size = 135188, upload-time = "2026-05-06T15:09:40.957Z" },
+ { url = "https://files.pythonhosted.org/packages/05/94/b0d27090ea8a2095db3c2bd1b1c96f96f19bbb494d7fef33130e846e613d/orjson-3.11.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03db380e3780fa0015ed776a90f20e8e20bb11dde13b216ce19e5718e3dfba62", size = 145937, upload-time = "2026-05-06T15:09:42.249Z" },
+ { url = "https://files.pythonhosted.org/packages/09/eb/75d50c29c05b8054013e221e598820a365c8e64065312e75e202ed880709/orjson-3.11.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33d7d766701847dc6729846362dc27895d2f2d2251264f9d10e7cb9878194877", size = 132758, upload-time = "2026-05-06T15:09:43.945Z" },
+ { url = "https://files.pythonhosted.org/packages/49/bd/360686f39348aa88827cb6fbf7dc606fd41c831a35235e1abf1db8e3a9e6/orjson-3.11.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147302878da387104b66bb4a8b0227d1d487e976ce41a8501916161072ed87b1", size = 133971, upload-time = "2026-05-06T15:09:45.239Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/30/3178eb16f3221aeef068b6f1f1ebe05f656ea5c6dffe9f6c917329fe17a3/orjson-3.11.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3513550321f8c8c811a7c3297b8a630e82dc08e4c10216d07703c997776236cd", size = 141685, upload-time = "2026-05-06T15:09:46.858Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/f1/ff2f19ed0225f9680fafa42febca3570dd59444ebf190980738d376214c2/orjson-3.11.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c5d001196b89fa9cf0a4ab79766cd835b991a166e4b621ba95089edc50c429ff", size = 415167, upload-time = "2026-05-06T15:09:48.312Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/61/863bddf0da6e9e586765414debd54b4e58db05f560902b6d00658cb88636/orjson-3.11.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:16969c9d369c98eb084889c6e4d2d39b77c7eb38ceccf8da2a9fff62ae908980", size = 147913, upload-time = "2026-05-06T15:09:49.733Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/8a/4081492586d75b073d60c5271a8d0f05a0955cabf1e34c8473f6fcd84235/orjson-3.11.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63e0efbc991250c0b3143488fa57d95affcabbfc63c99c48d625dd37779aafe2", size = 136959, upload-time = "2026-05-06T15:09:51.311Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/bd/70b6ab193594d7abb875320c0a7c8335e846f28968c432c31042409c3c8d/orjson-3.11.9-cp311-cp311-win32.whl", hash = "sha256:14ed654580c1ed2bc217352ec82f91b047aef82951aa71c7f64e0dcb03c0e180", size = 131533, upload-time = "2026-05-06T15:09:52.637Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/17/1a1a228183d62d1b77e2c30d210f47dd4768b310ebe1607c63e3c0e3a71e/orjson-3.11.9-cp311-cp311-win_amd64.whl", hash = "sha256:57ea77fb70a448ce87d18fca050193202a3da5e54598f6501ca5476fb66cfe02", size = 127106, upload-time = "2026-05-06T15:09:54.204Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/95/285de5fa296d09681ee9c546cd4a8aeb773b701cf343dc125994f4d52953/orjson-3.11.9-cp311-cp311-win_arm64.whl", hash = "sha256:19b72ed11572a2ee51a67a903afbe5af504f84ed6f529c0fe44b0ab3fb5cc697", size = 126848, upload-time = "2026-05-06T15:09:55.551Z" },
+ { url = "https://files.pythonhosted.org/packages/16/6d/11867a3ffa3a3608d84a4de51ef4dd0896d6b5cc9132fbe1daf593e677bc/orjson-3.11.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9ef6fe90aadef185c7b128859f40beb24720b4ecea95379fc9000931179c3a49", size = 228515, upload-time = "2026-05-06T15:09:57.265Z" },
+ { url = "https://files.pythonhosted.org/packages/24/75/05912954c8b288f34fcf5cd4b9b071cb4f6e77b9961e175e56ebb258089f/orjson-3.11.9-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e5c9b8f28e726e97d97696c826bc7bea5d71cecd63576dba92924a32c1961291", size = 128409, upload-time = "2026-05-06T15:09:59.063Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/86/1c3a47df3bc8191ea9ac51603bbb872a95167a364320c269f2557911f406/orjson-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a473dbb4162108b27901492546f83c76fdcea3d0eadff00ae7a07e18dcce09", size = 132106, upload-time = "2026-05-06T15:10:00.798Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/cf/b33b5f3e695ae7d63feef9d915c37cc3b8f465493dcd4f8e0b4c697a2366/orjson-3.11.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:011382e2a60fda9d46f1cdee31068cfc52ffe952b587d683ec0463002802a0f4", size = 127864, upload-time = "2026-05-06T15:10:02.15Z" },
+ { url = "https://files.pythonhosted.org/packages/31/6a/6cf69385a58208024fcb8c014e2141b8ce838aba6492b589f8acfff97fab/orjson-3.11.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2d3dc759490128c5c1711a53eeaa8ee1d437fd0038ffd2b6008abf46db3f882", size = 135213, upload-time = "2026-05-06T15:10:03.515Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/f8/0b1bd3e8f2efcdd376af5c8cfd79eaf13f018080c0089c80ebd724e3c7fb/orjson-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8ea516b3726d190e1b4297e6f4e7a8650347ae053868a18163b4dd3641d1fff", size = 145994, upload-time = "2026-05-06T15:10:05.083Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/59/dab79f61044c529d2c81aecdc589b1f833a1c8dec11ba3b1c2498a02ca7e/orjson-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380cdce7ba24989af81d0a7013d0aaec5d0e2a21734c0e2681b1bc4f141957fe", size = 132744, upload-time = "2026-05-06T15:10:06.853Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/a4/82b7a2fe5d8a67a59ed831b24d59a3d46ea7d207b66e1602d376541d94a6/orjson-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4fa4f0af7fa18951f7ab3fc2148e223af211bf03f59e1c6034ec3f97f21d61", size = 134014, upload-time = "2026-05-06T15:10:08.213Z" },
+ { url = "https://files.pythonhosted.org/packages/50/c7/375e83a76851b73b2e39f3bcf0e5a19e2b89bad13e5bca97d0b293d27f24/orjson-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a8f5f8bc7ce7d59f08d9f99fa510c06496164a24cb5f3d34537dbd9ca30132e2", size = 141509, upload-time = "2026-05-06T15:10:09.595Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/7c/49d5d82a3d3097f641f094f552131f1e2723b0b8cb0fa2874ab65ecfffa6/orjson-3.11.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:4d7fde5501b944f83b3e665e1b31343ff6e154b15560a16b7130ea1e594a4206", size = 415127, upload-time = "2026-05-06T15:10:11.049Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/dc/7446c538590d55f455647e5f3c61fc33f7108714e7afcffa6a2a033f8350/orjson-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cde1a448023ba7d5bb4c01c5afb48894380b5e4956e0627266526587ef4e535f", size = 148025, upload-time = "2026-05-06T15:10:12.842Z" },
+ { url = "https://files.pythonhosted.org/packages/df/e5/4d2d8af06f788329b4f78f8cc3679bb395392fcaa1e4d8d3c33e85308fa4/orjson-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71e63adb0e1f1ed5d9e168f50a91ceb93ae6420731d222dc7da5c69409aa47aa", size = 136943, upload-time = "2026-05-06T15:10:14.405Z" },
+ { url = "https://files.pythonhosted.org/packages/06/69/850264ccf6d80f6b174620d30a87f65c9b1490aba33fe6b62798e618cad3/orjson-3.11.9-cp312-cp312-win32.whl", hash = "sha256:2d057a602cdd19a0ad680417527c45b6961a095081c0f46fe0e03e304aac6470", size = 131606, upload-time = "2026-05-06T15:10:15.791Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/d5/973a43fc9c55e20f2051e9830997649f669be0cb3ca52192087c0143f118/orjson-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:59e403b1cc5a676da8eaf31f6254801b7341b3e29efa85f92b48d272637e77be", size = 127101, upload-time = "2026-05-06T15:10:17.129Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/ae/495470f0e4a18f73fa10b7f6b84b464ec4cc5291c4e0c7c2a6c400bef006/orjson-3.11.9-cp312-cp312-win_arm64.whl", hash = "sha256:9af678d6488357948f1f84c6cd1c1d397c014e1ae2f98ae082a44eb48f602624", size = 126736, upload-time = "2026-05-06T15:10:18.645Z" },
+ { url = "https://files.pythonhosted.org/packages/32/33/93fcc25907235c344ae73122f8a4e01d2d393ef062b4af7d2e2487a32c37/orjson-3.11.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021", size = 228458, upload-time = "2026-05-06T15:10:20.079Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/27/b1e6dadb3c080313c03fdd8067b85e6a0460c7d8d6a1c3984ef77b904e4d/orjson-3.11.9-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c", size = 128368, upload-time = "2026-05-06T15:10:21.549Z" },
+ { url = "https://files.pythonhosted.org/packages/21/0f/c9ede0bf052f6b4051e64a7d4fa91b725cccf8321a6a786e86eb03519f00/orjson-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81", size = 132070, upload-time = "2026-05-06T15:10:23.371Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/26/d398e28048dc18205bbe812f2c88cb9b40313db2470778e25964796458fe/orjson-3.11.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a", size = 127892, upload-time = "2026-05-06T15:10:24.714Z" },
+ { url = "https://files.pythonhosted.org/packages/66/60/52b0054c4c700d5aa7fc5b7ca96917400d8f061307778578e67a10e25852/orjson-3.11.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aff7da9952a5ad1cef8e68017724d96c7b9a66e99e91d6252e1b133d67a7b10", size = 135217, upload-time = "2026-05-06T15:10:26.084Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/97/1e3dc2b2a28b7b2528f403d2fc1d79ec5f39af3bc143ab65d3ec26426385/orjson-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362", size = 145980, upload-time = "2026-05-06T15:10:28.062Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/39/31fbfe7850f2de32dee7e7e5c09f26d403ab01e440ac96001c6b01ad3c99/orjson-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97", size = 132738, upload-time = "2026-05-06T15:10:29.727Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/08/dca0082dd2a194acb93e5457e73455388e2e2ca464a2672449a9ddbb679d/orjson-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218", size = 134033, upload-time = "2026-05-06T15:10:31.152Z" },
+ { url = "https://files.pythonhosted.org/packages/11/d4/5bdb0626801230139987385554c5d4c42255218ac906525bf4347f22cd95/orjson-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9", size = 141492, upload-time = "2026-05-06T15:10:32.641Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/88/a21fb53b3ede6703aede6dce4710ed4111e5b201cfa6bbff5e544f9d47d7/orjson-3.11.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677", size = 415087, upload-time = "2026-05-06T15:10:34.438Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/57/1b30daf70f0d8180e9a73cefbfbdd99e4bf19eb020466502b01fba7e0e50/orjson-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:97db4c94a7db398a5bd636273324f0b3fd58b350bbbac8bb380ceb825a9b40f4", size = 148031, upload-time = "2026-05-06T15:10:36.358Z" },
+ { url = "https://files.pythonhosted.org/packages/04/83/45fbb6d962e260807f99441db9613cee868ceda4baceda59b3720a563f97/orjson-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0", size = 136915, upload-time = "2026-05-06T15:10:38.013Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/cc/2d10025f9056d376e4127ec05a5808b218d46f035fdc08178a5411b34250/orjson-3.11.9-cp313-cp313-win32.whl", hash = "sha256:d4087e5c0209a0a8efe4de3303c234b9c44d1174161dcd851e8eea07c7560b32", size = 131613, upload-time = "2026-05-06T15:10:39.569Z" },
+ { url = "https://files.pythonhosted.org/packages/67/bd/2775ff28bfe883b9aa1ff348300542eb2ef1ee18d8ae0e3a49846817a865/orjson-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:051b102c93b4f634e89f3866b07b9a9a98915ada541f4ec30f177067b2694979", size = 127086, upload-time = "2026-05-06T15:10:41.262Z" },
+ { url = "https://files.pythonhosted.org/packages/91/2b/d26799e580939e32a7da9a39531bc9e58e15ca32ffaa6a8cb3e9bb0d22cd/orjson-3.11.9-cp313-cp313-win_arm64.whl", hash = "sha256:cce9127885941bd28f080cecf1f1d288336b7e0d812c345b08be88b572796254", size = 126696, upload-time = "2026-05-06T15:10:42.651Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/eb/5da01e356015aee6ecfa1187ced87aef51364e306f5e695dd52719bf0e78/orjson-3.11.9-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b6ef1979adc4bc243523f1a2ba91418030a8e29b0a99cbe7e0e2d6807d4dce6e", size = 228465, upload-time = "2026-05-06T15:10:44.097Z" },
+ { url = "https://files.pythonhosted.org/packages/64/62/3e0e0c14c957133bcd855395c62b55ed4e3b0af23ffea11b032cb1dcbdb1/orjson-3.11.9-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:f36b7f32c7c0db4a719f1fc5824db4a9c6f8bd1a354debb91faf26ebf3a4c71e", size = 128364, upload-time = "2026-05-06T15:10:45.839Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/5a/07d8aa117211a8ed7630bda80c8c0b14d04e0f8dcf99bcf49656e4a710eb/orjson-3.11.9-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08f4d8ebb44925c794e535b2bebc507cebf32209df81de22ae285fb0d8d66de0", size = 132063, upload-time = "2026-05-06T15:10:47.267Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/ec/4acaf21483e18aa945be74a474c74b434f284b549f275a0a39b9f98956e9/orjson-3.11.9-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6cc7923789694fd58f001cbcac7e47abc13af4d560ebbfcf3b41a8b1a0748124", size = 122356, upload-time = "2026-05-06T15:10:48.765Z" },
+ { url = "https://files.pythonhosted.org/packages/13/d8/5f0555e7638801323b7a75850f92e7dfa891bc84fe27a1ba4449170d1200/orjson-3.11.9-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea5c46eb2d3af39e806b986f4b09d5c2706a1f5afde3cbf7544ce6616127173c", size = 129592, upload-time = "2026-05-06T15:10:50.13Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/30/ed9860412a3603ceb3c5955bfd72d28b9d0e7ba6ed81add14f83d7114236/orjson-3.11.9-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5d89a2ed90731df3be64bab0aa44f78bff39fdc9d71c291f4a8023aa46425b7", size = 140491, upload-time = "2026-05-06T15:10:51.582Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/17/adc514dea7ac7c505527febf884934b815d34f0c7b8693c1a8b39c5c4a57/orjson-3.11.9-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25e4aed0312d292c09f61af25bba34e0b2c88546041472b09088c39a4d828af1", size = 127309, upload-time = "2026-05-06T15:10:53.329Z" },
+ { url = "https://files.pythonhosted.org/packages/76/3e/c0b690253f0b82d86e99949af13533363acfb5432ecb5d53dd5b3bce9c34/orjson-3.11.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaea64f3f467d22e70eeed68bdccb3bc4f83f650446c4a03c59f2cba28a108db", size = 134030, upload-time = "2026-05-06T15:10:54.988Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/7a/bc82a0bb25e9faaf92dc4d9ef002732efc09737706af83e346788641d4a7/orjson-3.11.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a028425d1b440c5d92a6be1e1a020739dfe67ea87d96c6dbe828c1b30041728b", size = 141482, upload-time = "2026-05-06T15:10:56.663Z" },
+ { url = "https://files.pythonhosted.org/packages/01/55/e69188b939f77d5d32a9833745ace31ea5ccae3ab613a1ec185d3cd2c4fb/orjson-3.11.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5b192c6cf397e4455b11523c5cf2b18ed084c1bbd61b6c0926344d2129481972", size = 415178, upload-time = "2026-05-06T15:10:58.446Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/1a/b8a5a7ac527e80b9cb11d51e3f6689b709279183264b9ec5c7bc680bb8b5/orjson-3.11.9-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea407d4ccf5891d667d045fecae97a7a1e5e87b3b97f97ae1803c2e741130be0", size = 148089, upload-time = "2026-05-06T15:11:00.441Z" },
+ { url = "https://files.pythonhosted.org/packages/97/4e/00503f64204bf859b37213a63927028f30fb6268cd8677fb0a5ad48155e1/orjson-3.11.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f63aaf97afd9f6dec5b1a68e1b8da12bfccb4cb9a9a65c3e0b6c847849e7586", size = 136921, upload-time = "2026-05-06T15:11:02.176Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/ba/a23b82a0a8d0ed7bed4e5f5035aae751cad4ff6a1e8d2ecd14d8860f5929/orjson-3.11.9-cp314-cp314-win32.whl", hash = "sha256:e30ab17845bb9fa54ccf67fa4f9f5282652d54faa6d17452f47d0f369d038673", size = 131638, upload-time = "2026-05-06T15:11:03.696Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/c3/0c6798456bade745c75c452342dabacce5798196483e77e643be1f53877d/orjson-3.11.9-cp314-cp314-win_amd64.whl", hash = "sha256:32ef5f4283a3be81913947d19608eacb7c6608026851123790cd9cc8982af34b", size = 127078, upload-time = "2026-05-06T15:11:05.123Z" },
+ { url = "https://files.pythonhosted.org/packages/16/21/5a3f1e8913103b703a436a5664238e5b965ec392b555fe68943ea3691e6b/orjson-3.11.9-cp314-cp314-win_arm64.whl", hash = "sha256:eebdbdeef0094e4f5aefa20dcd4eb2368ab5e7a3b4edea27f1e7b2892e009cf9", size = 126687, upload-time = "2026-05-06T15:11:06.602Z" },
+]
+
[[package]]
name = "packaging"
version = "26.2"
@@ -1044,6 +1655,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
]
+[[package]]
+name = "palettable"
+version = "3.3.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/dc/3d/a5854d60850485bff12f28abfe0e17f503e866763bed61aed4990b604530/palettable-3.3.3.tar.gz", hash = "sha256:094dd7d9a5fc1cca4854773e5c1fc6a315b33bd5b3a8f47064928facaf0490a8", size = 106639, upload-time = "2023-04-19T23:13:35.864Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cf/f7/3367feadd4ab56783b0971c9b7edfbdd68e0c70ce877949a5dd2117ed4a0/palettable-3.3.3-py2.py3-none-any.whl", hash = "sha256:74e9e7d7fe5a9be065e02397558ed1777b2df0b793a6f4ce1a5ee74f74fb0caa", size = 332251, upload-time = "2023-04-19T23:13:33.996Z" },
+]
+
[[package]]
name = "pandas"
version = "3.0.2"
@@ -1104,6 +1724,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/2b/f8434233fab2bd66a02ec014febe4e5adced20e2693e0e90a07d118ed30e/pandas-3.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:5371b72c2d4d415d08765f32d689217a43227484e81b2305b52076e328f6f482", size = 9455341, upload-time = "2026-03-31T06:48:28.418Z" },
]
+[[package]]
+name = "parso"
+version = "0.8.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" },
+]
+
[[package]]
name = "pathspec"
version = "1.1.0"
@@ -1126,6 +1755,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/92/6f/ad8db42b3a744e910e62a8781282acadf7b95ff16f714f05347f6fb6129b/PeakUtils-1.3.5-py3-none-any.whl", hash = "sha256:5c54ca98ba3177b8c1ae4c5fdfd1b09d7bec947b9c25d9e4bd25334526ca98e5", size = 7722, upload-time = "2024-06-27T01:33:28.172Z" },
]
+[[package]]
+name = "pexpect"
+version = "4.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" },
+]
+
[[package]]
name = "pillow"
version = "12.2.0"
@@ -1222,6 +1863,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" },
]
+[[package]]
+name = "plotly"
+version = "6.7.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "narwhals" },
+ { name = "packaging" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3a/7f/0f100df1172aadf88a929a9dbb902656b0880ba4b960fe5224867159d8f4/plotly-6.7.0.tar.gz", hash = "sha256:45eea0ff27e2a23ccd62776f77eb43aa1ca03df4192b76036e380bb479b892c6", size = 6911286, upload-time = "2026-04-09T20:36:45.738Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/90/ad/cba91b3bcf04073e4d1655a5c1710ef3f457f56f7d1b79dcc3d72f4dd912/plotly-6.7.0-py3-none-any.whl", hash = "sha256:ac8aca1c25c663a59b5b9140a549264a5badde2e057d79b8c772ae2920e32ff0", size = 9898444, upload-time = "2026-04-09T20:36:39.812Z" },
+]
+
[[package]]
name = "pluggy"
version = "1.6.0"
@@ -1243,6 +1897,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl", hash = "sha256:9583d737ac901c474d99d030e4d5eec4c4e6d2d7417b1cf49728cf3be34f6dc8", size = 127383, upload-time = "2025-10-31T05:02:47.002Z" },
]
+[[package]]
+name = "ply"
+version = "3.11"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload-time = "2018-02-15T19:01:31.097Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload-time = "2018-02-15T19:01:27.172Z" },
+]
+
[[package]]
name = "pre-commit"
version = "4.6.0"
@@ -1259,6 +1922,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl", hash = "sha256:e2cf246f7299edcabcf15f9b0571fdce06058527f0a06535068a86d38089f29b", size = 226472, upload-time = "2026-04-21T20:31:40.092Z" },
]
+[[package]]
+name = "prettytable"
+version = "3.17.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "wcwidth" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/79/45/b0847d88d6cfeb4413566738c8bbf1e1995fad3d42515327ff32cc1eb578/prettytable-3.17.0.tar.gz", hash = "sha256:59f2590776527f3c9e8cf9fe7b66dd215837cca96a9c39567414cbc632e8ddb0", size = 67892, upload-time = "2025-11-14T17:33:20.212Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ee/8c/83087ebc47ab0396ce092363001fa37c17153119ee282700c0713a195853/prettytable-3.17.0-py3-none-any.whl", hash = "sha256:aad69b294ddbe3e1f95ef8886a060ed1666a0b83018bbf56295f6f226c43d287", size = 34433, upload-time = "2025-11-14T17:33:19.093Z" },
+]
+
[[package]]
name = "prompt-toolkit"
version = "3.0.52"
@@ -1271,6 +1946,191 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" },
]
+[[package]]
+name = "propcache"
+version = "0.5.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/f1/8a8cc1c2c7e7934ab77e0163414f736fadbc0f5e8dd9673b952355ac175b/propcache-0.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74b70780220e2dd89175ca24b81b68b67c83db499ae611e7f2313cb329801c78", size = 90744, upload-time = "2026-05-08T20:59:45.799Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/f4/651b1225e976bd1a2ba5cfba0c29d096581c2636b437e3a9a7ab6276270a/propcache-0.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4840ab0ae0216d952f4b53dc6d0b992bfc2bedbfe360bdd9b548bc184c08959", size = 52033, upload-time = "2026-05-08T20:59:47.408Z" },
+ { url = "https://files.pythonhosted.org/packages/15/a8/8ede85d6aa1f79fc7dc2f8fd2c8d65920b8272c3892903c8a1affde48cfb/propcache-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6844ba6364fb12f403928a82cfd295ab103a2b315c77c747b2dbe4a41894ea7", size = 52754, upload-time = "2026-05-08T20:59:49.202Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/fe/b3551b41bbc2f5b5bb088fc6920567cd43101253e68fbaa261339eb96fe1/propcache-0.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2293949b855ce597f2826452d17c2d545fb5622379c4ea6fdf525e9b8e8a2511", size = 57573, upload-time = "2026-05-08T20:59:50.778Z" },
+ { url = "https://files.pythonhosted.org/packages/83/27/ab851ebd1b7172e3e161f5f8d39e315d54a91bea246f01f4d872d3376aef/propcache-0.5.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0fd59b5af35f74da48d905dcbad55449ba13be91823cb05a9bd590bbf5b61660", size = 60645, upload-time = "2026-05-08T20:59:52.227Z" },
+ { url = "https://files.pythonhosted.org/packages/95/7d/466b3d18022e9897cbda9c735c493c5bd747d7a4c6f5ea1480b4cec434b6/propcache-0.5.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29f9309a2e42b0d273be006fdb4be2d6c39a47f6f57d8fb1cf9f81481df81b66", size = 61563, upload-time = "2026-05-08T20:59:53.866Z" },
+ { url = "https://files.pythonhosted.org/packages/27/1b/16ab7f2cf2041da2f60d156ba64c2484eadf9168075b4ff43c3ef60045af/propcache-0.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5aaa2b923c1944ac8febd6609cb373540a5563e7cbcb0fd770f75dace2eb817b", size = 58888, upload-time = "2026-05-08T20:59:55.457Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/67/bb777ffd907633563bf35fd859c4ce97b0512c32f4633cf5d1eb7c33512b/propcache-0.5.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66ea454f095ddf5b6b14f56c064c0941c4788be11e18d2464cf643bf7203ff67", size = 59253, upload-time = "2026-05-08T20:59:57.075Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/42/64f8d90b73fd9cdc1499b48057ff6d9cd2a98a25734c9bb62ecf07e87061/propcache-0.5.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:95f1e3f4760d404b13c9976c0229b2b49a3c8e2c62a9ce92efdd2b11ada75e3f", size = 57558, upload-time = "2026-05-08T20:59:58.602Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/02/dba5bc03c9041f2092ea55a449caf5dfe68352c6654511b29ba0654ddb69/propcache-0.5.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:85341b12b9d55bad0bded24cac341bb34289469e03a11f3f583ea1cc1db0326c", size = 55007, upload-time = "2026-05-08T20:59:59.837Z" },
+ { url = "https://files.pythonhosted.org/packages/14/c0/43f649c7aa2a77a3b100d84e9dea3a483120ecb608bfe36ce49eaff517fe/propcache-0.5.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:26a4dca084132874e639895c3135dfad5eb20bae209f62d1aeb31b03e601c3c0", size = 60355, upload-time = "2026-05-08T21:00:01.144Z" },
+ { url = "https://files.pythonhosted.org/packages/83/c0/435dafd27f1cb4a495381dae60e25883ccfe4020bb72818e8184c1678092/propcache-0.5.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3b199b9b2b3d6a7edf3183ba8a9a137a22b97f7df525feb5ae1eccf026d2a9c6", size = 59057, upload-time = "2026-05-08T21:00:02.401Z" },
+ { url = "https://files.pythonhosted.org/packages/53/ae/6e292df9135d659944e96cb3389258e4a663e5b2b5f6c217ef0ddc8d2f73/propcache-0.5.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e59bc9e66329185b93dab73f210f1a37f81cb40f321501db8017c9aea15dba27", size = 61938, upload-time = "2026-05-08T21:00:03.638Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/42/314ebc50d8159055411fd6b0bda322ff510e4b1f7d2e4927940ad0f6af20/propcache-0.5.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:552ffadf6ad409844bc5919c42a0a83d88314cedddaea0e41e80a8b8fffe881f", size = 59731, upload-time = "2026-05-08T21:00:04.881Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/9b/2da6dee38871c3c8772fabc2758325a5c9077d6d18c597737dc04dd884cd/propcache-0.5.2-cp311-cp311-win32.whl", hash = "sha256:cd416c1de191973c52ff1a12a57446bfc7642797b282d7caf2162d7d1b8aa9a0", size = 38966, upload-time = "2026-05-08T21:00:06.511Z" },
+ { url = "https://files.pythonhosted.org/packages/42/4e/f17363fb58c0afe05b067361cb6d86ed2d29de6506779a27547c4d183075/propcache-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:44e488ef40dbb452700b2b1f8188934121f6648f52c295055662d2191959ff82", size = 42135, upload-time = "2026-05-08T21:00:08.088Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/eb/6af6685077d22e8b33358d3c548e3282706a0b3cd85044ffba4e5dd08e3b/propcache-0.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:54adaa85a22078d1e306304a40984dc5be99d599bf3dc0a24dc98f7daeab89ab", size = 38381, upload-time = "2026-05-08T21:00:09.692Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887, upload-time = "2026-05-08T21:00:11.277Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a", size = 54654, upload-time = "2026-05-08T21:00:12.604Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190, upload-time = "2026-05-08T21:00:13.935Z" },
+ { url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995, upload-time = "2026-05-08T21:00:15.526Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422, upload-time = "2026-05-08T21:00:16.824Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342, upload-time = "2026-05-08T21:00:18.362Z" },
+ { url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639, upload-time = "2026-05-08T21:00:19.692Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588, upload-time = "2026-05-08T21:00:21.155Z" },
+ { url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029, upload-time = "2026-05-08T21:00:22.713Z" },
+ { url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774, upload-time = "2026-05-08T21:00:24.001Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532, upload-time = "2026-05-08T21:00:25.545Z" },
+ { url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592, upload-time = "2026-05-08T21:00:27.186Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788, upload-time = "2026-05-08T21:00:28.8Z" },
+ { url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514, upload-time = "2026-05-08T21:00:30.098Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018, upload-time = "2026-05-08T21:00:31.622Z" },
+ { url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322, upload-time = "2026-05-08T21:00:32.918Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172, upload-time = "2026-05-08T21:00:35.124Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457, upload-time = "2026-05-08T21:00:36.355Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835, upload-time = "2026-05-08T21:00:38.072Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545, upload-time = "2026-05-08T21:00:39.319Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886, upload-time = "2026-05-08T21:00:40.621Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261, upload-time = "2026-05-08T21:00:41.775Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184, upload-time = "2026-05-08T21:00:43.018Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534, upload-time = "2026-05-08T21:00:44.507Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500, upload-time = "2026-05-08T21:00:45.796Z" },
+ { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994, upload-time = "2026-05-08T21:00:47.093Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884, upload-time = "2026-05-08T21:00:48.376Z" },
+ { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464, upload-time = "2026-05-08T21:00:49.954Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588, upload-time = "2026-05-08T21:00:51.281Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667, upload-time = "2026-05-08T21:00:52.602Z" },
+ { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463, upload-time = "2026-05-08T21:00:54.303Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621, upload-time = "2026-05-08T21:00:55.808Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649, upload-time = "2026-05-08T21:00:57.061Z" },
+ { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636, upload-time = "2026-05-08T21:00:58.646Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872, upload-time = "2026-05-08T21:00:59.889Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257, upload-time = "2026-05-08T21:01:01.195Z" },
+ { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696, upload-time = "2026-05-08T21:01:02.941Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378, upload-time = "2026-05-08T21:01:04.475Z" },
+ { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283, upload-time = "2026-05-08T21:01:05.959Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616, upload-time = "2026-05-08T21:01:07.228Z" },
+ { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773, upload-time = "2026-05-08T21:01:08.514Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664, upload-time = "2026-05-08T21:01:09.874Z" },
+ { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643, upload-time = "2026-05-08T21:01:11.132Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595, upload-time = "2026-05-08T21:01:12.387Z" },
+ { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711, upload-time = "2026-05-08T21:01:13.676Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247, upload-time = "2026-05-08T21:01:14.936Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102, upload-time = "2026-05-08T21:01:16.281Z" },
+ { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964, upload-time = "2026-05-08T21:01:17.57Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" },
+ { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/ea/23ee535d90ce8bcc465a3028eb3cc0ce3bd1005f4bb27710b30587de798d/propcache-0.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:46088abff4cba581dea21ae0467a480526cb25aa5f3c269e909f800328bc3999", size = 94662, upload-time = "2026-05-08T21:01:22.683Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/06/c5a52f419b5d8972f8d46a7577476090d8e3263ff589ce40b5ca4968d5be/propcache-0.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fc88b26f08d634f7bc819a7852e5214f5802641ab8d9fd5326892292eee1993e", size = 53928, upload-time = "2026-05-08T21:01:23.986Z" },
+ { url = "https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539", size = 54650, upload-time = "2026-05-08T21:01:25.305Z" },
+ { url = "https://files.pythonhosted.org/packages/70/06/2f46c318e3307cd7a6a7481def374ce838c0fe20084b39dd54b0879d0e99/propcache-0.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba57fffe4ac99c5d30076161b5866336d97600769bad35cc68f7774b15298a4e", size = 59912, upload-time = "2026-05-08T21:01:26.545Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/29/fe1aebec2ce57ab985a9c382bded1124431f85078113aa222c5d278430d4/propcache-0.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:583c19759d9eec1e5b69e2fbef36a7d9c326041be9746cb822d335c8cedc2979", size = 63300, upload-time = "2026-05-08T21:01:27.937Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/18/2334b26768b6c82be8c69e83671b767d5ef426aa09b0cba6c2ea47816774/propcache-0.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d0326e2e5e1f3163fa306c834e48e8d490e5fae607a097a40c0648109b47ba80", size = 64208, upload-time = "2026-05-08T21:01:29.484Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/76/7f1bfd6afff4c5e38e36a3c6d68eb5f4b7311ea80baf693db78d95b603c4/propcache-0.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e00820e192c8dbebcafb383ebbf99030895f09905e7a0eb2e0340a0bcc2bc825", size = 61633, upload-time = "2026-05-08T21:01:31.068Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/46/b3ff8aba2b4953a3e50de2cf72f1b5748b8eca93b15f3dc2c84339084c09/propcache-0.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c66afea89b1e43725731d2004732a046fe6fe955d51f952c3e95a7314a284a39", size = 61724, upload-time = "2026-05-08T21:01:32.374Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/01/814cfcafbcff954f94c01cf30e097ddc88a076b5440fbcf4570753437d40/propcache-0.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc37dec6c6cdad0b57881a5658fd14fbf53e333b1a86cf86559f190e1d9ec4", size = 60069, upload-time = "2026-05-08T21:01:33.67Z" },
+ { url = "https://files.pythonhosted.org/packages/da/68/5c6f7622d510cc666a300687e06fd060c1a43361c0c9b20d284f06d8096a/propcache-0.5.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5570dbcc97571c15f68068e529c92715a12f8d54030e272d264b377e22bd17a5", size = 57099, upload-time = "2026-05-08T21:01:34.915Z" },
+ { url = "https://files.pythonhosted.org/packages/55/27/9cb0b4c679124085327957d42521c99dba04c88c90c3e55a6f0b633ebccc/propcache-0.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f814362777a9f841adddb200ecdf8f5cb1e5a3c4b7a86378edbd6ccb26edd702", size = 63391, upload-time = "2026-05-08T21:01:36.231Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/9d/7258aaa5bdf60fc6f27591eef6fe52768cb0beda7140be477c8b12c9794a/propcache-0.5.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:196913dea116aeb5a2ba95af4ddcb7ea85559ae07d8eee8751688310d09168c3", size = 61626, upload-time = "2026-05-08T21:01:37.545Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/0d/41c602003e8a9b16fe1e7eadf62c7bfba9d5474370b24200bf48b315f45f/propcache-0.5.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6e7b8719005dd1175be4ab1cd25e9b98659a5e0347331506ec6760d2773a7fb5", size = 64781, upload-time = "2026-05-08T21:01:38.83Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/f3/38e66b1856e9bd079deea015bc4a55f7767c0e4db2f7dcf69e7e680ba4ce/propcache-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:51f96d685ab16e88cab128cd37a52c5da540809c8b879fa047731bfcb4ad35a4", size = 62570, upload-time = "2026-05-08T21:01:40.415Z" },
+ { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436, upload-time = "2026-05-08T21:01:41.654Z" },
+ { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373, upload-time = "2026-05-08T21:01:43.041Z" },
+ { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554, upload-time = "2026-05-08T21:01:44.336Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/81/fadf555f42d3b762eea8a53950b0489fdc0aa9da5f8ed9e10ce0a4e01b48/propcache-0.5.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bc8ff1feffc6a61c7002ffe84634c41b822e104990ae009f44a0834430070bb", size = 99395, upload-time = "2026-05-08T21:01:45.883Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/c9/c61e134a686949cf7971af3a390148b1156f7be81c73bc0cd12c873e2d48/propcache-0.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:79aa3ff0a9b566633b642fa9caf7e21ed1c13d6feca718187873f199e1514078", size = 56653, upload-time = "2026-05-08T21:01:47.307Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/73/daf935ea7048ddd7ec8eec5345b4a40b619d2d178b3c0a0900796bc3c794/propcache-0.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1b31822f4474c4036bae62de9402710051d431a606d6a0f907fec79935a071aa", size = 56914, upload-time = "2026-05-08T21:01:48.573Z" },
+ { url = "https://files.pythonhosted.org/packages/79/9f/aba959b435ea18617edd7cf0a7ad0b9c574b8fc7e3d2cd55fb59cb255d33/propcache-0.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fef48778b5a2a756523fdb781326b028ca75e32858b04f2cdd19f394564917", size = 62567, upload-time = "2026-05-08T21:01:49.903Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/a1/859942de9a791ff42f6141736f5b37749b8f53e65edfa49638c67dd67e6a/propcache-0.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b73ab70f1a3351fbc71f663b3e645af6dd0329100c353081cf69c37433fc6fe", size = 65542, upload-time = "2026-05-08T21:01:51.204Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/61/315bc0fd6c0fc7f80a528b8afd209e5fc4a875ea79571b91b8f50f442907/propcache-0.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5538d2c13d93e4698af7e092b57bc7298fd35d1d58e656ae18f23ee0d0378e03", size = 66845, upload-time = "2026-05-08T21:01:52.539Z" },
+ { url = "https://files.pythonhosted.org/packages/47/f7/9f8122e3132e8e354ac41975ef8f1099be7d5a16bc7ae562734e993665c0/propcache-0.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd645f03898405cabe694fb8bc35241e3a9c332ec85627584fe3de201452b335", size = 63985, upload-time = "2026-05-08T21:01:53.847Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/54/c317819ec157cbf6f35df9df9657a6f82daf34d5faf15948b2f639c2192e/propcache-0.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a473b3440261e0c60706e732b2ed2f517857344fc21bf48fdfe211e2d98eb285", size = 63999, upload-time = "2026-05-08T21:01:55.179Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/56/387e3f7dfce0a9233df41fb888aa1c30222cb4bbbf09537c02dd9bd85fe2/propcache-0.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7afa37062e6650640e932e4cc9297d81f9f42d9944029cc386b8247dea4da837", size = 62779, upload-time = "2026-05-08T21:01:57.489Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/9c/596784cb5824ed61ee960d3f8655a3f0993e107c6e98ab6c818b7fb92ccb/propcache-0.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8a90efd5777e996e42d568db9ac740b944d691e565cbfd31b2f7832f9184b2b8", size = 59796, upload-time = "2026-05-08T21:01:58.736Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/3d/1a6cfa1726a48542c1e8784a0761421476a5b68e09b7f36bf95eb954aaba/propcache-0.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f19bb891234d72535764d703bfed1153cc34f4214d5bd7150aee1eec9e8f4366", size = 66023, upload-time = "2026-05-08T21:02:00.228Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/0e/05fd6990369477076e4e280bcb970de760fddf0161a46e988bc95f7940ec/propcache-0.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:32775082acd2d807ee3db715c7770d38767b817870acfa08c29e057f3c4d5b56", size = 64448, upload-time = "2026-05-08T21:02:01.888Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/86/5f8da315a4309c62c10c0b2516b17492d5d3bbe1bb862b96604db67e2a37/propcache-0.5.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9282fb1a3bccd038da9f768b927b24a0c753e466c086b7c4f3c6982851eefb2d", size = 67329, upload-time = "2026-05-08T21:02:03.484Z" },
+ { url = "https://files.pythonhosted.org/packages/da/d3/3368efe79ab21f0cdf86ef49895811c9cc933131d4cde1f28a624e22e712/propcache-0.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc49723e2f60d6b32a0f0b08a3fd6d13203c07f1cd9566cfce0f12a917c967a2", size = 65172, upload-time = "2026-05-08T21:02:04.745Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813, upload-time = "2026-05-08T21:02:06.025Z" },
+ { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764, upload-time = "2026-05-08T21:02:07.353Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140, upload-time = "2026-05-08T21:02:09.065Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" },
+]
+
+[[package]]
+name = "psutil"
+version = "7.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" },
+ { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" },
+ { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" },
+ { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" },
+ { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" },
+ { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" },
+ { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" },
+ { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" },
+]
+
+[[package]]
+name = "ptyprocess"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" },
+]
+
+[[package]]
+name = "pure-eval"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" },
+]
+
+[[package]]
+name = "pycifrw"
+version = "5.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "ply" },
+ { name = "prettytable" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/58/e0/f1871f520c359e4e3a2eb7437c9e7e792bb6c356414e8617937561167caf/pycifrw-5.0.1.tar.gz", hash = "sha256:e636b80be6a2be15b215e69ecec0c0a784ebcbfed8b1e3bac4bcc6e6ba9a75e0", size = 896861, upload-time = "2025-03-24T05:34:42.247Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/b6/84364503e0726da4a263e1736d0e1754526d1b1729d0087c680d96345570/pycifrw-5.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3eba3a2d394e82fd4a1ca143080f7f938d6aa169c460e0bcd39a7bad4c29a0d2", size = 184019, upload-time = "2025-03-24T05:34:21.106Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/5c/b999ea3e64981018d52846b9b69193fa581a70cd255912cb6962a33a666a/pycifrw-5.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f200aae9d7cf9c8857326587ee949dad9de8480f38d98ac6d6ee2dff5ab2308", size = 184022, upload-time = "2025-03-24T05:34:22.703Z" },
+ { url = "https://files.pythonhosted.org/packages/75/35/a44ce3d7c3f52a2a443cae261a05c2affc52fde7f1643974adbef105785f/pycifrw-5.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6569131e601f857f72824ccac73efc38ab7a712f465c2248181f798105196491", size = 204621, upload-time = "2025-03-24T05:34:24.167Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/87/a5148792c832cd243bd68c144bb9e25a55130b0fe2b0622330572dc50ebb/pycifrw-5.0.1-cp311-cp311-win32.whl", hash = "sha256:e7da341b9568861f2a75116690ef2037f2b4c82f61af454b953ef0011ec6e43a", size = 183552, upload-time = "2025-03-24T05:34:25.803Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/58/e60915c59f4adcbd97af30047694978127d63139ae05a0cf987c6f2e90f9/pycifrw-5.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bca7cc9685b70c45aa326a301b65d393b7a58ba5a07c29c2066c2ebbdc0393d2", size = 184705, upload-time = "2025-03-24T05:34:27.417Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/b1/c227e507318a605d863d6f5112ab567b39109895c77ad1be4fc697ae01ff/pycifrw-5.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4942c2eb7b4eb54e0909d90f4301f5c5be122ef6c0f5707cd6aa11c87bf91847", size = 184048, upload-time = "2025-03-24T05:34:29.074Z" },
+ { url = "https://files.pythonhosted.org/packages/32/a0/37fb236da6040e337381dd656cafb97d09eacb998c5db3057547f5ffddd9/pycifrw-5.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d0464e10abda9890347a95c8c385654c2741fca186df371a5c47c3b4b819866", size = 184024, upload-time = "2025-03-24T05:34:30.624Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/61/3c1ea8c10bf4f6bf83c33a7f5b4a3143f4cc1f979859dec5498b6cc31900/pycifrw-5.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:379801e71509d0f9c59b56edc5ceb6600796eaf2b84ee5e0f5a256c76542047d", size = 204922, upload-time = "2025-03-24T05:34:32.211Z" },
+ { url = "https://files.pythonhosted.org/packages/07/84/a1f98428d20611a21f47144788ce56c4cda7a93aa62eba88855a736dc1cc/pycifrw-5.0.1-cp312-cp312-win32.whl", hash = "sha256:7dbbed562238416e81cb614e2df433182c75b4fd330e182db0d5875b20472704", size = 183571, upload-time = "2025-03-24T05:34:33.44Z" },
+ { url = "https://files.pythonhosted.org/packages/28/55/5733807f4af131ea6194309ac0f43eb5b05463c676d036ef948f3143c1f2/pycifrw-5.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:9d2939cce3bded805f02beda5a6aea62eb95951d59a1b99d73aa3463052fe4fe", size = 184706, upload-time = "2025-03-24T05:34:34.636Z" },
+ { url = "https://files.pythonhosted.org/packages/87/0d/6af0bb9a45c771ffccd5c4c035c57ac9005e711b1191ddad1dd954187cfe/pycifrw-5.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d01c83295a9e5f91e1cd5df03a24387a79388992b60c9e043f2c24a65b6607d", size = 184049, upload-time = "2025-03-24T05:34:35.867Z" },
+ { url = "https://files.pythonhosted.org/packages/83/81/bdd4bfabe70b7c9a8c0716a722ced4ebd27311afd1f4800cd405d3229c1b/pycifrw-5.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e9ad2fdb4fca6398ed5ae50c19908bf6238434893b68d0125bda79a54a03d708", size = 184027, upload-time = "2025-03-24T05:34:37.043Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/a5/a8c7562ec39f2647245b52ea4aeb13b5b125b3f48c0c152e9ebce7047a0a/pycifrw-5.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65a90ee34e46e6be20834493382585277d12daaa8d1a145cb158c163b3d9fc1c", size = 205819, upload-time = "2025-03-24T05:34:38.623Z" },
+ { url = "https://files.pythonhosted.org/packages/66/4a/a59dbf6f3ceccf277b2969dd0bc7b9b162f8284b032a47a59ed26c77313d/pycifrw-5.0.1-cp313-cp313-win32.whl", hash = "sha256:6fdb4cfd28cb70eea64c3520e0c29559e38cf82f819bae818a4b94ffa210aae9", size = 183574, upload-time = "2025-03-24T05:34:39.736Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/9b/50835e8fd86073fa7aa921df61b4cebc1f0ff400e4338541675cb72b5507/pycifrw-5.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:8632df76b99932408ab432e09b30aa9a6c390df884a5f34f1e1f76201e625156", size = 184711, upload-time = "2025-03-24T05:34:40.918Z" },
+]
+
[[package]]
name = "pydantic"
version = "2.13.3"
@@ -1431,6 +2291,66 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
]
+[[package]]
+name = "pymatgen"
+version = "2026.5.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pymatgen-core" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0c/a1/727feae7083bb3b10ba9d43ccbbe83317d4654957a08cee52096ef86bfde/pymatgen-2026.5.4.tar.gz", hash = "sha256:4998d6084da72224c8025dc1e9645b2aab73896109a7ef1e05bd479a25a55b79", size = 743199, upload-time = "2026-05-04T22:03:24.675Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a2/3a/de29b0b6c1740098c3ccdd3fa69336dc39b5efc6840a55e30dcaea01a19b/pymatgen-2026.5.4-py3-none-any.whl", hash = "sha256:7815cd4310c6d5a465b0da14a1633479cf61366676e62764db17f7e2a20d1974", size = 829056, upload-time = "2026-05-04T22:03:22.327Z" },
+]
+
+[[package]]
+name = "pymatgen-core"
+version = "2026.4.16"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "bibtexparser" },
+ { name = "joblib" },
+ { name = "lxml" },
+ { name = "matplotlib" },
+ { name = "monty" },
+ { name = "networkx" },
+ { name = "numpy" },
+ { name = "orjson" },
+ { name = "palettable" },
+ { name = "pandas" },
+ { name = "plotly" },
+ { name = "requests" },
+ { name = "scipy" },
+ { name = "spglib" },
+ { name = "sympy" },
+ { name = "tabulate" },
+ { name = "tqdm" },
+ { name = "uncertainties" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/75/74/64e3b140394de86baf743426d77c3d9e37701ce25a0c00d4267723003bcc/pymatgen_core-2026.4.16.tar.gz", hash = "sha256:7b5f00ce7c6ae6d77eb79ab1d7f71609a639dbd9639d299cc3a9e1fac65adaf6", size = 2527245, upload-time = "2026-04-16T01:04:24.612Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dd/c9/d1d4daf672fe738aaa09fb4afeceab695c935bd2e9d4da4024b033d960ae/pymatgen_core-2026.4.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c75d62e1dfb81f2bd164da2e66d78e284051b98bb850edc35bda788a329dad47", size = 2879100, upload-time = "2026-04-16T01:04:21.806Z" },
+ { url = "https://files.pythonhosted.org/packages/36/7d/c5973afcc1dfd0a3ab5d6c8c9cdb3b6414bdd77caa0450caec3a8f93f738/pymatgen_core-2026.4.16-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b3bdc5783a79aa117166a20246239b0609b4ef588dcdde1943792390fe60589", size = 3904229, upload-time = "2026-04-16T01:30:43.618Z" },
+ { url = "https://files.pythonhosted.org/packages/76/7a/5b6a298be00c312a77a7b9e0b4f7ef10ae1c4aae1125b07693535ed49084/pymatgen_core-2026.4.16-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45eb5d96b3d64ba24c2120aa608bda9396fe0d7f316e223722fcfa12ff556446", size = 3932163, upload-time = "2026-04-16T01:30:45.242Z" },
+ { url = "https://files.pythonhosted.org/packages/32/fe/f4e2abcb189a9ae50bb051fbbed0062df814fa7d653705d3b10173ff0152/pymatgen_core-2026.4.16-cp311-cp311-win32.whl", hash = "sha256:54780258e6730533e04850b6f92600d1d29097025aec6a8f6dd14bd738cd48a1", size = 2837683, upload-time = "2026-04-16T01:30:47.141Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/00/18781f5a02ff0cdef2497b36ead0f18c8101f61d74fd68fd81d4fbefc043/pymatgen_core-2026.4.16-cp311-cp311-win_amd64.whl", hash = "sha256:8ecaa17bc159fbbeb0b42367a61f6b5178c4d3cdc1b9f19951e360e5833cd260", size = 2867173, upload-time = "2026-04-16T01:30:48.715Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/2f/fb85f7c3f27f9bc455656e9dddbf74d0562d7fa5ac9d93184d7f3f3dbac9/pymatgen_core-2026.4.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e861357ef60755ea3be2a430b93038468dee346dba671c0b66042e57682947b", size = 2882980, upload-time = "2026-04-16T01:30:50.383Z" },
+ { url = "https://files.pythonhosted.org/packages/43/51/0da63dd3e50bead08b87490303aef720e1a79492cf04cd16c428a6eb2ff9/pymatgen_core-2026.4.16-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25f9acab9cb2ff4a232ed4915e6063d604958604760e57c5c462343b0a500322", size = 3901165, upload-time = "2026-04-16T01:30:52.07Z" },
+ { url = "https://files.pythonhosted.org/packages/15/30/8f0f0db8b335421b6c45aa0e3339f7ec3bafe237617c024c96197434d37a/pymatgen_core-2026.4.16-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75a8f164806386546e263a464cfba10e5c513aadec9b538b58a523f9c3e7deea", size = 3940640, upload-time = "2026-04-16T01:30:54.916Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/2d/113d8bed22fe52c9a38d779ade8b22d4d6528495af0ef07ede02abf819cf/pymatgen_core-2026.4.16-cp312-cp312-win32.whl", hash = "sha256:9345c32a11c57409bd404388333f4e9ed4c32e47ad379c6af34db92700d695ad", size = 2835894, upload-time = "2026-04-16T01:30:56.742Z" },
+ { url = "https://files.pythonhosted.org/packages/17/8c/10cb89a2262dd53ec4ec370f7a25fc6ad6ea9acd50b44bfe62ebf597a941/pymatgen_core-2026.4.16-cp312-cp312-win_amd64.whl", hash = "sha256:3c9839f9c175830cce5c13c704888d8aad4981b8988c425c1ca0f2563bf38208", size = 2866605, upload-time = "2026-04-16T01:30:58.794Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/f0/c4bac8bb205ded6af21d7ec42108cd99795f393b6b4518123d7598a5ac3c/pymatgen_core-2026.4.16-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b04742e9a2b14a074ce4a1a573e68eeb0142dfe3a98ce278297c76a64f675ae9", size = 2881601, upload-time = "2026-04-16T01:31:00.576Z" },
+ { url = "https://files.pythonhosted.org/packages/75/cc/dd8740c5eaa24cdcc9ecb70f022c57f877df4d66f841532f6dba28dd6660/pymatgen_core-2026.4.16-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45837bd4e5e760b3e346df0dfa408c4948b11f86c5d1478f3ef3f90bce2e54b0", size = 3892512, upload-time = "2026-04-16T01:31:02.068Z" },
+ { url = "https://files.pythonhosted.org/packages/09/e5/2bf7ce92c6918d010c20096c5c3c75efd1b6adc284e9443b6df307013b69/pymatgen_core-2026.4.16-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3fdd047766096ab0bbdee9ebd0338286ebc2b0780fa39d603b407cd67d992997", size = 3930890, upload-time = "2026-04-16T01:31:03.781Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/cc/97e6d1644f82ae9c0d6e4ae4709c75f248d580d9dab2a8af819e741008a8/pymatgen_core-2026.4.16-cp313-cp313-win32.whl", hash = "sha256:0ab43a7ee12e843f9eb8957f6b2dd9558e513daeb2d2be45ecfae963fd0e6b95", size = 2835716, upload-time = "2026-04-16T01:31:05.584Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/5d/d0dd9c8913686b0ed4b64f21c45730cc437d151d0fd6de2e7e666cffe5b8/pymatgen_core-2026.4.16-cp313-cp313-win_amd64.whl", hash = "sha256:149c1b4f8daa4d387f5f641bda606db7ef9dcb960e76e16d429bb3dd263c76ef", size = 2866166, upload-time = "2026-04-16T01:31:07.473Z" },
+ { url = "https://files.pythonhosted.org/packages/85/52/5547cbeb845fa31061b70057f2dd75d2881d44273c2d27d0eda7caa7f3f2/pymatgen_core-2026.4.16-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:98738152da9bf8150435975c4ef79bad3a1c88fe81711ca02cb9ea74d29b1e2c", size = 2883130, upload-time = "2026-04-16T01:31:09.421Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/97/3ad93d5b0d7a4a773a79f5d2bdf72fc55a9fe29f7fdbc6e8e5de1c9be549/pymatgen_core-2026.4.16-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d74dcb66871c73beb7f1c4aa5a8dda016514408cf8a7bf1194a9d71869ab5cb1", size = 3889851, upload-time = "2026-04-16T01:31:10.989Z" },
+ { url = "https://files.pythonhosted.org/packages/57/bf/558f74b69f6023818c985bc991dfbf11a195ef0b0940749383fde63f8ebf/pymatgen_core-2026.4.16-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:700435b88ec6e590170487a72c09aa6407dcdb28c77fca5e3d532f83b418f307", size = 3920993, upload-time = "2026-04-16T01:31:13.019Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/c5/15a7c30453dcc5e2aa924e1d4283222d3f46db5a177fece4586a6debb833/pymatgen_core-2026.4.16-cp314-cp314-win32.whl", hash = "sha256:694e4fb035d6712b23c43f022d18b739805885e26c7fd0cc7de2df4821b52a40", size = 2813481, upload-time = "2026-04-16T01:31:14.963Z" },
+ { url = "https://files.pythonhosted.org/packages/67/8f/9320145f0eed0a5559d95cf8c9dadd15329d4b2127d2f769e658bcca19ae/pymatgen_core-2026.4.16-cp314-cp314-win_amd64.whl", hash = "sha256:0f9ef6f5cbe9acf7fae748ffc511518f543b1390d1cbd18fecbb14d72a879440", size = 2844999, upload-time = "2026-04-16T01:31:16.482Z" },
+]
+
[[package]]
name = "pyparsing"
version = "3.3.2"
@@ -1452,6 +2372,64 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl", hash = "sha256:8757c41a79c0f4ab71b99abed52b97ecf66bd20b04fa59da43b5840bac105a09", size = 13218, upload-time = "2025-10-09T19:12:24.428Z" },
]
+[[package]]
+name = "pyqt6"
+version = "6.11.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyqt6-qt6" },
+ { name = "pyqt6-sip" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8b/47/b25c13eca5bebc6505394d0223e46d7ebf0c57dcac2ed908d7d19b18ab6b/pyqt6-6.11.0.tar.gz", hash = "sha256:45dd60aa69976de1918b5ced6b4e7b6a25abd2a919ecef5fd5826ecc76718889", size = 1087430, upload-time = "2026-03-30T09:16:13.543Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/33/44/fcd3dd3f64c83c96bf9bce76ec16cca64bd9b91702c3d08fd8e3dafc73d9/pyqt6-6.11.0-cp310-abi3-macosx_10_14_universal2.whl", hash = "sha256:f7100bc7f72b12581ec479a733f4ad11b8002668e6786e8a445ab6f4d1c743d4", size = 12429735, upload-time = "2026-03-30T09:16:03.713Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/a0/bd1399740dfa80c0a94d20b02d89962a31458233dcf70eaa09bfbccf3d0f/pyqt6-6.11.0-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8555277989fa7d114cb3c3443fd261d566909f7268ceedd41d93a5f02d37ec05", size = 8334632, upload-time = "2026-03-30T09:16:06.066Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/db/425b184ac2430ba1978bb507ffd285ec007a872644e2ae5df13332dbcb05/pyqt6-6.11.0-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:0734959955adde095af9a074213a7f73386d1bbbddfc27346b4c0621641a692e", size = 8321484, upload-time = "2026-03-30T09:16:08.135Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/85/dd9f03d78d87460e109e0121cd6201c5802bdd655656bf2780e964870fea/pyqt6-6.11.0-cp310-abi3-win_amd64.whl", hash = "sha256:bd11b459c54dca068e988a42cf838303334f0d441b9d16d92ae6719fcb5ac6ba", size = 6844358, upload-time = "2026-03-30T09:16:09.766Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/75/970b041bde4372cc6739c5ef9db1de83a6b36e788e4992e598baa35b2255/pyqt6-6.11.0-cp310-abi3-win_arm64.whl", hash = "sha256:b6324e3501b19b4292c7a55b1f22e82d3e80e519e383ce4fe79b4a754c6f0288", size = 5933984, upload-time = "2026-03-30T09:16:11.817Z" },
+]
+
+[[package]]
+name = "pyqt6-qt6"
+version = "6.11.0"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/eb/5e/9e65b87ba746bb3a2ee81d6f3b2a8a7a4dfc33335c0a6afa15e8621e5fe9/pyqt6_qt6-6.11.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:447b04baf9bfd800410dc6a3b6faf24a2b754bd6e1c5d0dc609e6935362828f3", size = 70238920, upload-time = "2026-03-24T15:01:22.753Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/b2/a15f88a0d9f550b9581592f79fb64b827ab3d3343cbb2af05912e6c77d26/pyqt6_qt6-6.11.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b510d0cb8f4d3f4306b6ff33a63234139c9c87c160909d3853e4deb1094782c2", size = 64036460, upload-time = "2026-03-24T15:01:42.951Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/f9/99696e6b2325ae54868111f581c59a8a6283b8f21bc931837f49093bc582/pyqt6_qt6-6.11.0-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:c2c3a14714536256a9fd761a8ac8e030dfed7b991200a220ca79d399fcc3d265", size = 85757517, upload-time = "2026-03-24T15:02:11.86Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/3c/a420d08723d4ab1998afead3e6f643333e93a9eadfde3486bdec25acfff0/pyqt6_qt6-6.11.0-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:acc5b78d7f718a5642f14b37928e074b048751cc86edb4c539e4425bfbd26827", size = 84854032, upload-time = "2026-03-24T15:03:26.991Z" },
+ { url = "https://files.pythonhosted.org/packages/36/cd/da0147d331b44587a7214c7f59719ac4f8e9433b268016962b02067007d1/pyqt6_qt6-6.11.0-py3-none-win_amd64.whl", hash = "sha256:b0e42629cef2575f2178aaeb32b0e539291df869f91f4df48983da3ccaad05af", size = 78309473, upload-time = "2026-03-24T15:03:53.396Z" },
+ { url = "https://files.pythonhosted.org/packages/72/9a/8d09ca47a61c2504b49e16c97ccde99b120ceec323d97f7ca776f8331213/pyqt6_qt6-6.11.0-py3-none-win_arm64.whl", hash = "sha256:bcfa594171408319935c25afc7f82a3ae3ba90678ea194631bbca1c6f68daa6d", size = 59848654, upload-time = "2026-03-24T15:04:18.117Z" },
+]
+
+[[package]]
+name = "pyqt6-sip"
+version = "13.11.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/90/24/a753e1af94b9ae5b2da63d4598457308da3cdbf0838c959381db086ccc86/pyqt6_sip-13.11.1.tar.gz", hash = "sha256:869c5b48afe38e55b1ee0dd72182b0886e968cc509b98023ff50010b013ce1be", size = 92574, upload-time = "2026-03-09T13:01:35.418Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/46/fa/049879f61888462099dcbab495ad16df770cca2432330cca0767ab8e87cb/pyqt6_sip-13.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0ec2128c174db352bec1c8d23a437e970e8d5a78ac50315d8dfc671fcf7a7da", size = 111056, upload-time = "2026-03-09T13:01:07.998Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/0d/6ee861c53f3f7e6c5dd34a441d17aad1dfb3d50ce1f1a024cc9194ac3db3/pyqt6_sip-13.11.1-cp311-cp311-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6aa6c15ad3a9bb86e69119baff77b4ac17c47e55ee567abff616a4652051a6cc", size = 289930, upload-time = "2026-03-09T13:01:11.122Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/39/c975733d7204a594e6ae51d3a810aad539d09718aa3ceeb0dd28cb3276bd/pyqt6_sip-13.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee652b272373c4f9287625ef32ad4ec1f0755c24928dc958a870b7a928b288c", size = 315827, upload-time = "2026-03-09T13:01:09.48Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/d6/c40e8ae38a6e2bce9e837b64688f55746bfdad1aa557eb733fb5e90edd7c/pyqt6_sip-13.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:98db8ed37cf08130e1ee74b8ff47a6bfb8c3cdfe826310597a630a50e47feedc", size = 54029, upload-time = "2026-03-09T13:01:12.261Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/63/ec8c21ef9edffb55af42c637325d72eca4ea90a73ab714aaa1429c757e85/pyqt6_sip-13.11.1-cp311-cp311-win_arm64.whl", hash = "sha256:3af7a49dce4c35c5464309232c81cc1da5ec6074f46d2957831ee4031b8eefa6", size = 48458, upload-time = "2026-03-09T13:01:13.689Z" },
+ { url = "https://files.pythonhosted.org/packages/46/27/47598e701d284497216bf97bf8b6a69f5e61412e716c232ff2b7e6cb2100/pyqt6_sip-13.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ba9d362dd1e54b43bc2594f8841e1e39d24789716d28f08e5c9282af9fca342c", size = 112564, upload-time = "2026-03-09T13:01:14.628Z" },
+ { url = "https://files.pythonhosted.org/packages/95/cb/116f9b328636765f3bce97d9e10ec041c54bbe92beb0617edb86c2b615c1/pyqt6_sip-13.11.1-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0df15849946cea969d3ff2b24b76149262b6044aea2c5403e4f70c24c973a4c8", size = 299564, upload-time = "2026-03-09T13:01:17.292Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/be/fe2321285e8f683e705d199dbb458131f1850dc5966155a19c40100c85bb/pyqt6_sip-13.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c52b2b27fc77d9447a8dc1c6de1aaccc22d41e48697aafb2f2f20b8984bb02a5", size = 321210, upload-time = "2026-03-09T13:01:15.904Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/9b/7d4b10f9cba1b6f581dfb4860b9d11898da55a5ed3b8a6e7a1bf9f7084d0/pyqt6_sip-13.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d1c67179c1924b28e3d7f04585639e7a7c0946f62390efc6ccf2a6206e595d3", size = 53351, upload-time = "2026-03-09T13:01:19.327Z" },
+ { url = "https://files.pythonhosted.org/packages/06/72/6c4e6f21cafa4bed40d2b0c1563525b0d8bfcb5734493696f4cfd043b45f/pyqt6_sip-13.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:d83543125fe9fdb153e7e446c3b4d056d80ab5953644660633ab3f80e7784194", size = 48746, upload-time = "2026-03-09T13:01:20.248Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/0b/dc76c463c203e630b2c6417d4d5e337e919a265ac1c10127ef413551f5de/pyqt6_sip-13.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0c6d097aae7df312519e2b36e001bd796f6a2ce060ab8b9ed793daa8f407fe2e", size = 112552, upload-time = "2026-03-09T13:01:21.493Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/e3/65b605759859d38231ce7544065d4c61f891eb7766c351318e2a0b08a473/pyqt6_sip-13.11.1-cp313-cp313-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a72f4ebdab16a8a484019ff593de90d8013d3286b678c6ba1c0bdb117f4fcb13", size = 299932, upload-time = "2026-03-09T13:01:24.912Z" },
+ { url = "https://files.pythonhosted.org/packages/60/f7/c10d2dd5bf503a1de83bd163467bd323f12af016866c2814743b5b1efe1c/pyqt6_sip-13.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b68e442efc4275651bf63f2c43713e242924fd948909e31cf8f20d783ca505e9", size = 321497, upload-time = "2026-03-09T13:01:22.724Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/1f/e7e5ad77a76c00db5c8c1b9960f2b0672ec1978b971bb3509858cd7a9458/pyqt6_sip-13.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca24bfd4d5d8274e338433df9ac41930650088c00018d3313c6bd8de21772a02", size = 53371, upload-time = "2026-03-09T13:01:26.286Z" },
+ { url = "https://files.pythonhosted.org/packages/36/ef/a7acaf44980aed6fe26f1320e265db528fecb6a47ac67829c7cd011e9821/pyqt6_sip-13.11.1-cp313-cp313-win_arm64.whl", hash = "sha256:f532144c43f2fddcccf2e25df50cdb4a744edb4ce4ba5ed2d0f2cef825197f2f", size = 48745, upload-time = "2026-03-09T13:01:27.212Z" },
+ { url = "https://files.pythonhosted.org/packages/20/1d/62c633faedef5bb3b8c7486a72e8a6466adaa2a14efcfccf85bb23426748/pyqt6_sip-13.11.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:cb931c1af45294bbe8039c5cfda184e3023f5dc766fc884964010eedd8fd85db", size = 112678, upload-time = "2026-03-09T13:01:28.15Z" },
+ { url = "https://files.pythonhosted.org/packages/03/72/5a3d9ffef0caa7e1bc7a35d6300f6099bfccd1d8a485b4320ba20013a2d9/pyqt6_sip-13.11.1-cp314-cp314-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:353d613129316e9f7eda6bbe821deb7b7ffa14483499189171fd8a246873f9ac", size = 299560, upload-time = "2026-03-09T13:01:32.134Z" },
+ { url = "https://files.pythonhosted.org/packages/98/f4/886f901f1e04da717a11e180ba19a9c7fc62da170966d57206006f173bda/pyqt6_sip-13.11.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcadd68e09ee24cdda8f8bfcba52e59c9b297055d2c450f0eb89afa61a8dc31a", size = 321846, upload-time = "2026-03-09T13:01:29.817Z" },
+ { url = "https://files.pythonhosted.org/packages/96/f2/b68fd566f7f86dbb53d933489e70487cabaea0e0161690e4899653bbc7fb/pyqt6_sip-13.11.1-cp314-cp314-win_amd64.whl", hash = "sha256:581e287bf42587593b88b30d9db06ed0fccbf40f345a5bd3ec3f00a5692e2430", size = 55055, upload-time = "2026-03-09T13:01:33.467Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/42/efb7ced69f7d1d31eb8f19b2d778aeb182be7e070569d02b9057ac478e3e/pyqt6_sip-13.11.1-cp314-cp314-win_arm64.whl", hash = "sha256:42b62530a9b6a9c6e29c2941b8ab78258652da0aeae4eb1fc9a0631d19a7a7b2", size = 49597, upload-time = "2026-03-09T13:01:34.49Z" },
+]
+
[[package]]
name = "pyright"
version = "1.1.409"
@@ -1606,6 +2584,30 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl", hash = "sha256:a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59", size = 36753, upload-time = "2025-08-28T19:00:19.56Z" },
]
+[[package]]
+name = "requests"
+version = "2.34.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/43/b8/7a707d60fea4c49094e40262cc0e2ca6c768cca21587e34d3f705afec47e/requests-2.34.0.tar.gz", hash = "sha256:7d62fe92f50eb82c529b0916bb445afa1531a566fc8f35ffdc64446e771b856a", size = 142436, upload-time = "2026-05-11T19:29:51.717Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ef/e6/e300fce5fe83c30520607a015dabd985df3251e188d234bfe9492e17a389/requests-2.34.0-py3-none-any.whl", hash = "sha256:917520a21b767485ce7c588f4ebb917c436b24a31231b44228715eaeb5a52c60", size = 73021, upload-time = "2026-05-11T19:29:49.923Z" },
+]
+
+[[package]]
+name = "ruamel-yaml"
+version = "0.19.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c7/3b/ebda527b56beb90cb7652cb1c7e4f91f48649fbcd8d2eb2fb6e77cd3329b/ruamel_yaml-0.19.1.tar.gz", hash = "sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993", size = 142709, upload-time = "2026-01-02T16:50:31.84Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93", size = 118102, upload-time = "2026-01-02T16:50:29.201Z" },
+]
+
[[package]]
name = "ruff"
version = "0.15.12"
@@ -1631,6 +2633,56 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" },
]
+[[package]]
+name = "scikit-learn"
+version = "1.8.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "joblib" },
+ { name = "numpy" },
+ { name = "scipy" },
+ { name = "threadpoolctl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c9/92/53ea2181da8ac6bf27170191028aee7251f8f841f8d3edbfdcaf2008fde9/scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da", size = 8595835, upload-time = "2025-12-10T07:07:39.385Z" },
+ { url = "https://files.pythonhosted.org/packages/01/18/d154dc1638803adf987910cdd07097d9c526663a55666a97c124d09fb96a/scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1", size = 8080381, upload-time = "2025-12-10T07:07:41.93Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/44/226142fcb7b7101e64fdee5f49dbe6288d4c7af8abf593237b70fca080a4/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b", size = 8799632, upload-time = "2025-12-10T07:07:43.899Z" },
+ { url = "https://files.pythonhosted.org/packages/36/4d/4a67f30778a45d542bbea5db2dbfa1e9e100bf9ba64aefe34215ba9f11f6/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1", size = 9103788, upload-time = "2025-12-10T07:07:45.982Z" },
+ { url = "https://files.pythonhosted.org/packages/89/3c/45c352094cfa60050bcbb967b1faf246b22e93cb459f2f907b600f2ceda5/scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b", size = 8081706, upload-time = "2025-12-10T07:07:48.111Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/46/5416595bb395757f754feb20c3d776553a386b661658fb21b7c814e89efe/scikit_learn-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961", size = 7688451, upload-time = "2025-12-10T07:07:49.873Z" },
+ { url = "https://files.pythonhosted.org/packages/90/74/e6a7cc4b820e95cc38cf36cd74d5aa2b42e8ffc2d21fe5a9a9c45c1c7630/scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e", size = 8548242, upload-time = "2025-12-10T07:07:51.568Z" },
+ { url = "https://files.pythonhosted.org/packages/49/d8/9be608c6024d021041c7f0b3928d4749a706f4e2c3832bbede4fb4f58c95/scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76", size = 8079075, upload-time = "2025-12-10T07:07:53.697Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/47/f187b4636ff80cc63f21cd40b7b2d177134acaa10f6bb73746130ee8c2e5/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4", size = 8660492, upload-time = "2025-12-10T07:07:55.574Z" },
+ { url = "https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a", size = 8931904, upload-time = "2025-12-10T07:07:57.666Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/c4/0ab22726a04ede56f689476b760f98f8f46607caecff993017ac1b64aa5d/scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809", size = 8019359, upload-time = "2025-12-10T07:07:59.838Z" },
+ { url = "https://files.pythonhosted.org/packages/24/90/344a67811cfd561d7335c1b96ca21455e7e472d281c3c279c4d3f2300236/scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb", size = 7641898, upload-time = "2025-12-10T07:08:01.36Z" },
+ { url = "https://files.pythonhosted.org/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", size = 8513770, upload-time = "2025-12-10T07:08:03.251Z" },
+ { url = "https://files.pythonhosted.org/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", size = 8044458, upload-time = "2025-12-10T07:08:05.336Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", size = 8610341, upload-time = "2025-12-10T07:08:07.732Z" },
+ { url = "https://files.pythonhosted.org/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", size = 8900022, upload-time = "2025-12-10T07:08:09.862Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/f9/9b7563caf3ec8873e17a31401858efab6b39a882daf6c1bfa88879c0aa11/scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271", size = 7989409, upload-time = "2025-12-10T07:08:12.028Z" },
+ { url = "https://files.pythonhosted.org/packages/49/bd/1f4001503650e72c4f6009ac0c4413cb17d2d601cef6f71c0453da2732fc/scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3", size = 7619760, upload-time = "2025-12-10T07:08:13.688Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", size = 8826045, upload-time = "2025-12-10T07:08:15.215Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", size = 8420324, upload-time = "2025-12-10T07:08:17.561Z" },
+ { url = "https://files.pythonhosted.org/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", size = 8680651, upload-time = "2025-12-10T07:08:19.952Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", size = 8925045, upload-time = "2025-12-10T07:08:22.11Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/b7/64d8cfa896c64435ae57f4917a548d7ac7a44762ff9802f75a79b77cb633/scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702", size = 8507994, upload-time = "2025-12-10T07:08:23.943Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/37/e192ea709551799379958b4c4771ec507347027bb7c942662c7fbeba31cb/scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde", size = 7869518, upload-time = "2025-12-10T07:08:25.71Z" },
+ { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" },
+ { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" },
+ { url = "https://files.pythonhosted.org/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", size = 8096518, upload-time = "2025-12-10T07:08:36.339Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", size = 7754546, upload-time = "2025-12-10T07:08:38.128Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" },
+ { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" },
+ { url = "https://files.pythonhosted.org/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", size = 8774395, upload-time = "2025-12-10T07:08:49.337Z" },
+ { url = "https://files.pythonhosted.org/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", size = 8002647, upload-time = "2025-12-10T07:08:51.601Z" },
+]
+
[[package]]
name = "scipy"
version = "1.17.1"
@@ -1754,6 +2806,108 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
]
+[[package]]
+name = "spglib"
+version = "2.7.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a9/06/7964acb4c444191376bd87f91579475fbe7623ca943cce40cee8fb7f2c36/spglib-2.7.0.tar.gz", hash = "sha256:c40907a42c9dc45572f46740bf95412f84fb0eda30267e31665d104a4bde6627", size = 2366134, upload-time = "2025-12-29T09:48:26.42Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/44/a8/d841ae7743c58227af277f7f16aa844376fa11c426090d6ae35e7e93af76/spglib-2.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cf0ff80c01d8631ef4b9f1b78da79ff2044834e6e2d870f7f20c8579c921136", size = 910793, upload-time = "2025-12-29T09:47:32.063Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/02/11baf94cf682cdaafa046b72d4b2adcf944e19e2b2741454e329dedb2fc2/spglib-2.7.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7b29d2cfca6ac53e927686ca0b91257126e47f6abfa26451723a5cd40070352", size = 944977, upload-time = "2025-12-29T09:47:33.638Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/fa/6d1bc8f8cb08945ca8c37c95b42bf336b6b9a8a737eced1ce64f0cebe9ce/spglib-2.7.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f892ecce2dd1bc636b14a4e5bc13aabb73b008bd37a4d23636882c8971c432a0", size = 960531, upload-time = "2025-12-29T09:47:36.932Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/79/2fd5e33b431cd0afcdd441bd10704c11cdf74c09b721249297284e5bf0b2/spglib-2.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:468879702577124dcde0607a75396576e256f1cfa2d8fe48da4a928fbb27abc6", size = 669827, upload-time = "2025-12-29T09:47:38.47Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/e9/4e07c9c1bda40df54e09bd686eae0dc13d46e76a5ef4d43582971a86eb32/spglib-2.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:ceb6730a2324d0c83579c803f3782e28bd41e79bbfe0c3dfdbf30e3d3a6320e5", size = 649076, upload-time = "2025-12-29T09:47:40.367Z" },
+ { url = "https://files.pythonhosted.org/packages/68/0e/36720beeca8452530e50ab8a16b91e8721e34c0f97fd25e9c4ddd8b9324b/spglib-2.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ef70132e23dfcc7ab6813742e0edab3f9906e61cd11c857f014bd5610a8bc88c", size = 911009, upload-time = "2025-12-29T09:47:42.238Z" },
+ { url = "https://files.pythonhosted.org/packages/47/a0/24df91cbde6a3237d54cfb21602cc8ebb4102cd4e3ec9497c66135c2b190/spglib-2.7.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:59f134e74f7f488de4bf5579ee6a35af25cb2c478c138de664fea1e14f3efbaf", size = 946821, upload-time = "2025-12-29T09:47:44.548Z" },
+ { url = "https://files.pythonhosted.org/packages/67/4c/75ac6f7ade28019b216c7333322f2886e1c0105202cd74506f530664bf26/spglib-2.7.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6913906fd9108e7bb2ce06a810513a95a82d801530f10230979bf3427bb7e771", size = 962531, upload-time = "2025-12-29T09:47:46.3Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/5f/4e283139af178bb445eedff281a90e66ceff1b814ace70a9d90a2197acc3/spglib-2.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:d5729ff0040baae764c17249302cd99f0eb4e73449612a8c69d3e60a215f062e", size = 671111, upload-time = "2025-12-29T09:47:48.14Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/b9/20e52d46e33bf69ceba4fc86602f006c06ce4ab10e3c930f4722fb270b02/spglib-2.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:54f4b6e789475384c62e759c618172707f261c0eae8017949fe4994b6b8cc779", size = 646679, upload-time = "2025-12-29T09:47:49.376Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/1c/a0fe8c0523a0e7d608f49f09895e5c599329265c9bfacd269a21458b7564/spglib-2.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ab061ea6a3c3c25a1d0018b09c333c0458792036d3f45d892bd52793ed1f1bda", size = 911085, upload-time = "2025-12-29T09:47:51.606Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/34/cb3c522c4aaf6ce319b37bbec71d373b9e2cf0bcfe7d42c365cd6c113b4b/spglib-2.7.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be28673e90f7a6c7770f73c57e529d2bdbb373d06d26ee5e90991b548e9238aa", size = 946857, upload-time = "2025-12-29T09:47:53.059Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/64/3b1213f2f655ff143ed142292b47ec3f1f9bda8641e659a7e33c4cf0e8a9/spglib-2.7.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f627a4ed6f2396ed6e3e8eaf33a53ad143c8ffb8756a84a640f4569ac5ffa2a7", size = 962470, upload-time = "2025-12-29T09:47:54.878Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/3a/c51883ce739a00f9f60196f3dcb4ed91b690299a4ec64defd8ec5b2c5899/spglib-2.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:c76411bc1b96cd87c8733994747c7692512b583bb4ef89a65463ff4255221c11", size = 671073, upload-time = "2025-12-29T09:47:56.887Z" },
+ { url = "https://files.pythonhosted.org/packages/35/78/3f9ec6ae93a48527dce0eceb6eeab74e6ad1fb2977adb5cbdfc03d43193c/spglib-2.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:0d8ecf030d13d67c4cc272423e5652b74eda57f86a0b118e007f6d12974cc256", size = 646711, upload-time = "2025-12-29T09:47:58.697Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/47/86e3c15c3e1c252bde40a794eea4742c142f23fc5f9c3d7551f083c1fa20/spglib-2.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:95e3dd7ef992ff8a88f6ef2e5909aaa60ecb479004cc1f73c1e6285d54227960", size = 911712, upload-time = "2025-12-29T09:48:01.14Z" },
+ { url = "https://files.pythonhosted.org/packages/05/61/ab2447bb47fa69934adc2fc2d13f771dedd3b2fd3171c95307446c948f01/spglib-2.7.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97e0fcea2db3915bd973fdd2cc0a757b1f99bda71ce815da333d75ad1ffc3eb1", size = 947528, upload-time = "2025-12-29T09:48:03.258Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/69/898d9e005131b0b1c7e5dce2b79f36aeb20ec4d3a88cca596b522a0fa4df/spglib-2.7.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39b978c08ef2ebc0eaba833c488fc4c0f9b1fc0f50d4a8584f176741eea69376", size = 962474, upload-time = "2025-12-29T09:48:05.617Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/56/7b25ee5348722dc93ca245ed950f1a89f8a944906140629055f394c072a4/spglib-2.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:5f334b4b66c8aafd583fafab5b15a56e27efdd2dc6cb1064dfcd0fe59ae130f4", size = 679679, upload-time = "2025-12-29T09:48:15.393Z" },
+ { url = "https://files.pythonhosted.org/packages/20/37/eda9a34f25b13e47298fa1b94cc4dfd8b0fcfc46c7d63ea046aa1bf91fe7/spglib-2.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:b032842fc223de46d2ef7d220459e1a61ed90329ac2e72818c605f1fc87451b8", size = 656403, upload-time = "2025-12-29T09:48:17.027Z" },
+ { url = "https://files.pythonhosted.org/packages/39/af/1c8d0f98d07969b7fa7323d522732124d88caf4ee3b680ef59120bd7b229/spglib-2.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b7e29c796cfdadcc3857aef330acc19b9bc50c83e9911fb23b28390e7c80bae5", size = 920791, upload-time = "2025-12-29T09:48:07.085Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/c6/89a3f31f831efc4108a19f110873559990b72186745cd3e151de28b256cc/spglib-2.7.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b6ca88bb6e604bc8f63efe87b3b2470c2e25f56988b775bd332cefa8866f5c5", size = 946881, upload-time = "2025-12-29T09:48:09.154Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/e9/1ca63db2cebd381bd6b27ae309f25d270e70928359a6f0360db09b77894e/spglib-2.7.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50629939a9cd6fa3df5a12f6f025ceb3c78534284f875371574c360e4ccaf5e1", size = 963803, upload-time = "2025-12-29T09:48:12.478Z" },
+ { url = "https://files.pythonhosted.org/packages/28/97/459b37c3802633f77c883883c75f5d4429b601ae8d930410b999c4e1dafb/spglib-2.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:cb77daaf9dd5d48d523a888f37cebd47fa63ff28dfcf1aac2b031b914f9ed55a", size = 696536, upload-time = "2025-12-29T09:48:13.885Z" },
+]
+
+[[package]]
+name = "stack-data"
+version = "0.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "asttokens" },
+ { name = "executing" },
+ { name = "pure-eval" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" },
+]
+
+[[package]]
+name = "stomp-py"
+version = "9.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "docopt-ng" },
+ { name = "websocket-client" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3f/9d/2eac45f75ce1f9708cf23c5361e74d0b855013d842d3c0aef64ce0667405/stomp_py-9.0.0.tar.gz", hash = "sha256:77b63fdd6cb2fb5e3d7032c5e1cde70c005f498d6096b77827efe71913196464", size = 39701, upload-time = "2026-05-12T19:05:15.221Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a5/99/b010daaf1db86ea6ff3b831e70a5484bfe9c4fbf2f5f2ad6578160c56917/stomp_py-9.0.0-py3-none-any.whl", hash = "sha256:d115c85950b92dad358d11bc361b23d23994d21ff7eef50119f487f718ea4be2", size = 44242, upload-time = "2026-05-12T19:05:16.657Z" },
+]
+
+[[package]]
+name = "sympy"
+version = "1.14.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mpmath" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" },
+]
+
+[[package]]
+name = "tabulate"
+version = "0.10.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754, upload-time = "2026-03-04T18:55:34.402Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814, upload-time = "2026-03-04T18:55:31.284Z" },
+]
+
+[[package]]
+name = "threadpoolctl"
+version = "3.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" },
+]
+
+[[package]]
+name = "toml"
+version = "0.10.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" },
+]
+
[[package]]
name = "tomli"
version = "2.4.1"
@@ -1863,6 +3017,27 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/7a/12/a5eca5cde48b06a9aef319bc2cd8b5629eb1bd9207b6e3449ae009ee4021/tox_uv_bare-1.35.1-py3-none-any.whl", hash = "sha256:0b8d12d45f195a521d4f6aac5e42869f0a733c80d86575da855494444f60be74", size = 22243, upload-time = "2026-04-10T16:12:59.735Z" },
]
+[[package]]
+name = "tqdm"
+version = "4.67.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" },
+]
+
+[[package]]
+name = "traitlets"
+version = "5.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/22/40f55b26baeab80c2d7b3f1db0682f8954e4617fee7d90ce634022ef05c6/traitlets-5.15.0.tar.gz", hash = "sha256:4fead733f81cf1c4c938e06f8ca4633896833c9d89eff878159457f4d4392971", size = 163197, upload-time = "2026-05-06T08:05:58.016Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl", hash = "sha256:fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40", size = 85877, upload-time = "2026-05-06T08:05:55.853Z" },
+]
+
[[package]]
name = "types-mock"
version = "5.2.0.20260408"
@@ -1911,6 +3086,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl", hash = "sha256:313353900d8f88b283c9bad81e7d2b2d3d4bcc330cbace35403faaed7e78890a", size = 60118, upload-time = "2025-04-21T19:58:26.864Z" },
]
+[[package]]
+name = "urllib3"
+version = "2.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
+]
+
[[package]]
name = "uv"
version = "0.11.7"
@@ -1961,18 +3145,50 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" },
]
+[[package]]
+name = "websocket-client"
+version = "1.9.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" },
+]
+
+[[package]]
+name = "widgetsnbextension"
+version = "4.0.15"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" },
+]
+
[[package]]
name = "xrpd-toolbox"
source = { editable = "." }
dependencies = [
+ { name = "dans-diffraction" },
+ { name = "gql" },
{ name = "h5py" },
+ { name = "ipywidgets" },
{ name = "lmfit" },
{ name = "matplotlib" },
+ { name = "numba" },
{ name = "numpy" },
+ { name = "numpydantic" },
{ name = "pandas" },
{ name = "peakutils" },
+ { name = "pycifrw" },
+ { name = "pydantic" },
{ name = "pyfai" },
+ { name = "pymatgen" },
+ { name = "pyqt6" },
+ { name = "pyyaml" },
+ { name = "scikit-learn" },
{ name = "scipy" },
+ { name = "spglib" },
+ { name = "stomp-py" },
+ { name = "toml" },
]
[package.dev-dependencies]
@@ -1989,14 +3205,28 @@ dev = [
[package.metadata]
requires-dist = [
+ { name = "dans-diffraction" },
+ { name = "gql" },
{ name = "h5py" },
+ { name = "ipywidgets" },
{ name = "lmfit" },
{ name = "matplotlib" },
+ { name = "numba" },
{ name = "numpy" },
+ { name = "numpydantic" },
{ name = "pandas" },
{ name = "peakutils" },
+ { name = "pycifrw" },
+ { name = "pydantic" },
{ name = "pyfai" },
+ { name = "pymatgen" },
+ { name = "pyqt6" },
+ { name = "pyyaml" },
+ { name = "scikit-learn" },
{ name = "scipy" },
+ { name = "spglib" },
+ { name = "stomp-py" },
+ { name = "toml" },
]
[package.metadata.requires-dev]
@@ -2010,3 +3240,125 @@ dev = [
{ name = "tox-uv" },
{ name = "types-mock" },
]
+
+[[package]]
+name = "yarl"
+version = "1.23.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "multidict" },
+ { name = "propcache" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a2/aa/60da938b8f0997ba3a911263c40d82b6f645a67902a490b46f3355e10fae/yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99", size = 123641, upload-time = "2026-03-01T22:04:42.841Z" },
+ { url = "https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c", size = 86248, upload-time = "2026-03-01T22:04:44.757Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432", size = 85988, upload-time = "2026-03-01T22:04:46.365Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/6c/4a90d59c572e46b270ca132aca66954f1175abd691f74c1ef4c6711828e2/yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a", size = 100566, upload-time = "2026-03-01T22:04:47.639Z" },
+ { url = "https://files.pythonhosted.org/packages/49/fb/c438fb5108047e629f6282a371e6e91cf3f97ee087c4fb748a1f32ceef55/yarl-1.23.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aafe5dcfda86c8af00386d7781d4c2181b5011b7be3f2add5e99899ea925df05", size = 92079, upload-time = "2026-03-01T22:04:48.925Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/13/d269aa1aed3e4f50a5a103f96327210cc5fa5dd2d50882778f13c7a14606/yarl-1.23.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ee33b875f0b390564c1fb7bc528abf18c8ee6073b201c6ae8524aca778e2d83", size = 108741, upload-time = "2026-03-01T22:04:50.838Z" },
+ { url = "https://files.pythonhosted.org/packages/85/fb/115b16f22c37ea4437d323e472945bea97301c8ec6089868fa560abab590/yarl-1.23.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c41e021bc6d7affb3364dc1e1e5fa9582b470f283748784bd6ea0558f87f42c", size = 108099, upload-time = "2026-03-01T22:04:52.499Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598", size = 102678, upload-time = "2026-03-01T22:04:55.176Z" },
+ { url = "https://files.pythonhosted.org/packages/85/59/cd98e556fbb2bf8fab29c1a722f67ad45c5f3447cac798ab85620d1e70af/yarl-1.23.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2af5c81a1f124609d5f33507082fc3f739959d4719b56877ab1ee7e7b3d602b", size = 100803, upload-time = "2026-03-01T22:04:56.588Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/c0/b39770b56d4a9f0bb5f77e2f1763cd2d75cc2f6c0131e3b4c360348fcd65/yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c", size = 100163, upload-time = "2026-03-01T22:04:58.492Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/64/6980f99ab00e1f0ff67cb84766c93d595b067eed07439cfccfc8fb28c1a6/yarl-1.23.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1dc702e42d0684f42d6519c8d581e49c96cefaaab16691f03566d30658ee8788", size = 93859, upload-time = "2026-03-01T22:05:00.268Z" },
+ { url = "https://files.pythonhosted.org/packages/38/69/912e6c5e146793e5d4b5fe39ff5b00f4d22463dfd5a162bec565ac757673/yarl-1.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0e40111274f340d32ebcc0a5668d54d2b552a6cca84c9475859d364b380e3222", size = 108202, upload-time = "2026-03-01T22:05:02.273Z" },
+ { url = "https://files.pythonhosted.org/packages/59/97/35ca6767524687ad64e5f5c31ad54bc76d585585a9fcb40f649e7e82ffed/yarl-1.23.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4764a6a7588561a9aef92f65bda2c4fb58fe7c675c0883862e6df97559de0bfb", size = 99866, upload-time = "2026-03-01T22:05:03.597Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/1c/1a3387ee6d73589f6f2a220ae06f2984f6c20b40c734989b0a44f5987308/yarl-1.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:03214408cfa590df47728b84c679ae4ef00be2428e11630277be0727eba2d7cc", size = 107852, upload-time = "2026-03-01T22:05:04.986Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/b8/35c0750fcd5a3f781058bfd954515dd4b1eab45e218cbb85cf11132215f1/yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2", size = 102919, upload-time = "2026-03-01T22:05:06.397Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/1c/9a1979aec4a81896d597bcb2177827f2dbee3f5b7cc48b2d0dadb644b41d/yarl-1.23.0-cp311-cp311-win32.whl", hash = "sha256:51430653db848d258336cfa0244427b17d12db63d42603a55f0d4546f50f25b5", size = 82602, upload-time = "2026-03-01T22:05:08.444Z" },
+ { url = "https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46", size = 87461, upload-time = "2026-03-01T22:05:10.145Z" },
+ { url = "https://files.pythonhosted.org/packages/93/95/07e3553fe6f113e6864a20bdc53a78113cda3b9ced8784ee52a52c9f80d8/yarl-1.23.0-cp311-cp311-win_arm64.whl", hash = "sha256:b39cb32a6582750b6cc77bfb3c49c0f8760dc18dc96ec9fb55fbb0f04e08b928", size = 82336, upload-time = "2026-03-01T22:05:11.554Z" },
+ { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" },
+ { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" },
+ { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" },
+ { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" },
+ { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" },
+ { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" },
+ { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" },
+ { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" },
+ { url = "https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", size = 86547, upload-time = "2026-03-01T22:05:42.841Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" },
+ { url = "https://files.pythonhosted.org/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", size = 92711, upload-time = "2026-03-01T22:05:48.316Z" },
+ { url = "https://files.pythonhosted.org/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", size = 106014, upload-time = "2026-03-01T22:05:50.028Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", size = 105557, upload-time = "2026-03-01T22:05:51.416Z" },
+ { url = "https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" },
+ { url = "https://files.pythonhosted.org/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", size = 100502, upload-time = "2026-03-01T22:05:54.954Z" },
+ { url = "https://files.pythonhosted.org/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" },
+ { url = "https://files.pythonhosted.org/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", size = 95369, upload-time = "2026-03-01T22:05:58.141Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", size = 105565, upload-time = "2026-03-01T22:06:00.286Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", size = 99813, upload-time = "2026-03-01T22:06:01.712Z" },
+ { url = "https://files.pythonhosted.org/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", size = 105632, upload-time = "2026-03-01T22:06:03.188Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", size = 82356, upload-time = "2026-03-01T22:06:06.04Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", size = 87515, upload-time = "2026-03-01T22:06:08.107Z" },
+ { url = "https://files.pythonhosted.org/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", size = 81785, upload-time = "2026-03-01T22:06:10.181Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", size = 89690, upload-time = "2026-03-01T22:06:13.429Z" },
+ { url = "https://files.pythonhosted.org/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", size = 88710, upload-time = "2026-03-01T22:06:19.004Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", size = 101033, upload-time = "2026-03-01T22:06:21.203Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", size = 100817, upload-time = "2026-03-01T22:06:22.738Z" },
+ { url = "https://files.pythonhosted.org/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", size = 95949, upload-time = "2026-03-01T22:06:25.697Z" },
+ { url = "https://files.pythonhosted.org/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", size = 90696, upload-time = "2026-03-01T22:06:29.048Z" },
+ { url = "https://files.pythonhosted.org/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", size = 100865, upload-time = "2026-03-01T22:06:30.525Z" },
+ { url = "https://files.pythonhosted.org/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", size = 96234, upload-time = "2026-03-01T22:06:32.692Z" },
+ { url = "https://files.pythonhosted.org/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", size = 100295, upload-time = "2026-03-01T22:06:34.268Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" },
+ { url = "https://files.pythonhosted.org/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", size = 88313, upload-time = "2026-03-01T22:06:37.39Z" },
+ { url = "https://files.pythonhosted.org/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", size = 94932, upload-time = "2026-03-01T22:06:39.579Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", size = 84786, upload-time = "2026-03-01T22:06:41.988Z" },
+ { url = "https://files.pythonhosted.org/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" },
+ { url = "https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" },
+ { url = "https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" },
+ { url = "https://files.pythonhosted.org/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" },
+ { url = "https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" },
+ { url = "https://files.pythonhosted.org/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" },
+ { url = "https://files.pythonhosted.org/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" },
+ { url = "https://files.pythonhosted.org/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" },
+ { url = "https://files.pythonhosted.org/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" },
+ { url = "https://files.pythonhosted.org/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" },
+ { url = "https://files.pythonhosted.org/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" },
+ { url = "https://files.pythonhosted.org/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" },
+ { url = "https://files.pythonhosted.org/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" },
+ { url = "https://files.pythonhosted.org/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" },
+ { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" },
+ { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" },
+]