From c15394559d9ef6e6ce04c8dd35ba826f94c8d596 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Tue, 27 Jan 2026 17:44:08 +0000 Subject: [PATCH 01/86] minimal mythen reduction and legacy example added --- examples/i11/angular_calibration/1399199.nxs | Bin 0 -> 125960 bytes examples/i11/step_scan/1406733.nxs | Bin 0 -> 84480 bytes pyproject.toml | 1 + src/xrpd_toolbox/calibrant_cifs/Silicon.cif | 226 ++ src/xrpd_toolbox/i11/mythen.py | 32 + src/xrpd_toolbox/i11/mythen3reduction.txt | 1925 ++++++++++++++++ .../mythen_calibration/ang_cal_171125.json | 56 + .../i11/mythen_calibration/ang_cal_171125.off | 29 + .../i11/mythen_calibration/badchannels.txt | 1984 +++++++++++++++++ .../mythen3_reduction_config.toml | 192 ++ src/xrpd_toolbox/utils/utils.py | 19 + tests/test_utils.py | 21 +- uv.lock | 51 + 13 files changed, 4535 insertions(+), 1 deletion(-) create mode 100644 examples/i11/angular_calibration/1399199.nxs create mode 100644 examples/i11/step_scan/1406733.nxs create mode 100644 src/xrpd_toolbox/calibrant_cifs/Silicon.cif create mode 100644 src/xrpd_toolbox/i11/mythen.py create mode 100755 src/xrpd_toolbox/i11/mythen3reduction.txt create mode 100644 src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json create mode 100644 src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.off create mode 100644 src/xrpd_toolbox/i11/mythen_calibration/badchannels.txt create mode 100644 src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml diff --git a/examples/i11/angular_calibration/1399199.nxs b/examples/i11/angular_calibration/1399199.nxs new file mode 100644 index 0000000000000000000000000000000000000000..2b8174048809e57fcb21391a30cfcb42ce86f122 GIT binary patch literal 125960 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 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index da479fd..a80baf6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ dependencies = [ "pandas", "lmfit", "peakutils", + "PyCifRW", ] # Add project dependencies here, e.g. ["click", "numpy"] dynamic = ["version"] license.file = "LICENSE" diff --git a/src/xrpd_toolbox/calibrant_cifs/Silicon.cif b/src/xrpd_toolbox/calibrant_cifs/Silicon.cif new file mode 100644 index 0000000..3befb8c --- /dev/null +++ b/src/xrpd_toolbox/calibrant_cifs/Silicon.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/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py new file mode 100644 index 0000000..fcb8853 --- /dev/null +++ b/src/xrpd_toolbox/i11/mythen.py @@ -0,0 +1,32 @@ +from pathlib import Path + +import numpy as np + + +class MythenDataLoader: + def __init__(self, file_path: str | Path): + self.file_path = file_path + + def load_data(self) -> np.ndarray: + return np.array([]) + + +class MythenModule: + def __init__(self, data, pixels_per_modules: int = 1280): + self.pixels_per_modules = pixels_per_modules + + def process(self): + # Example processing: compute the mean + return np.mean(self.pixels_per_modules) + + +class MythenDetector: + def __init__(self, modules_per_detector: int = 28): + self.modules_per_detector = modules_per_detector + + +if __name__ == "__main__": + data = np.array([1, 2, 3, 4, 5]) + module = MythenModule(data) + result = module.process() + print("Processed result:", result) diff --git a/src/xrpd_toolbox/i11/mythen3reduction.txt b/src/xrpd_toolbox/i11/mythen3reduction.txt new file mode 100755 index 0000000..0d150e7 --- /dev/null +++ b/src/xrpd_toolbox/i11/mythen3reduction.txt @@ -0,0 +1,1925 @@ +#!/dls_sw/apps/python/miniforge/4.10.0-0/envs/python3.11/bin/python +import numpy as np +np.seterr(divide='ignore', invalid='ignore') #dividing by zero throws a warning, this is expected due to some pixels being dead +import argparse, os, sys +from pandas import DataFrame, concat +from h5py import File as h5pyFile +from shutil import copy2, copy +from itertools import product +from tomllib import load +import matplotlib.pyplot as plt +from pathlib import Path +from datetime import datetime +import json +# from collections import OrderedDict add this later for module angular cal + + +try: + from epics import caget + epics_available = True + sys.path.append("/dls_sw/apps/daq-messenger") + from daqmessenger import DaqMessenger #type: ignore +except Exception as e: + epics_available = False + +import pandas as pd +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) + +def NormalizeTo(data: np.ndarray, minval: int = 0): + + """ + minval isn't the minimum value that will come out of the processed array, what the scale of normlisation is on + """ + + return (data - minval) / (np.max(data) - minval) + +def paired_modules(modules=None): + """ + 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. + """ + + if modules is None: + 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((m, pair)) + + pairs = np.array(pairs) + + return pairs + +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 calc_intial_module_conv(modules, conv = 6.5e-05): + + module_conv_dict = {} + + for mod in modules: + + if mod > 13: + module_conv_dict[mod] = -conv + else: + module_conv_dict[mod] = conv + + return module_conv_dict + + +class AnalysisLogger(): + def __init__(self, log_filepath, logging=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=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 I11_reduction(): + + __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', '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, module_cal["offset"], module_cal["conv"], module_cal["centre"] = \ + int(elements[1]), float(elements[3]), float(elements[5]), float(elements[7]) + + # if module_in_file != active_mod: + # self.logger.log("Angular calibration specified in config.toml, doesn't agree with module specified in .off file. Is this what you want?") + + module_angular_cal[active_mod] = module_cal + + return module_angular_cal, beamline_offset + + + # def read_angular_cal_json(self, filepath): + # with open(filepath) as f: + # ang_cal_load = json.load(f) + + # print(ang_cal_load) + + # beamline_offset = ang_cal_load["beamline_offset"] + + # quit() + + + + # 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): + """ + 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 = I11_reduction.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 = I11_reduction.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_conversions = module_pixel_number-self.module_angular_cal[n_mod]["centre"] + # # module_conversions = module_pixel_number-self.module_angular_cal[n_mod]["centre"] + + # module_conversions = module_conversions*self.module_angular_cal[n_mod]["conv"] + # module_conversions = np.arctan(module_conversions) + # raw_tth = self.module_angular_cal[n_mod]["offset"]+np.rad2deg(module_conversions)+self.beamline_offset + + module_raw_tth[n_mod] = raw_tth #this is raw because it doesn't take into account the angular delta of the detector + + 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] = I11_reduction.load_int_array_from_file(badchan_file) + self.logger.log(f"Module: {active_mod} badchan_file | Bad Chans: {len(bad_channels[active_mod])}") + + 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 n,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: + 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.logger.log(f"\nData file keys and shape: {entry["mythen_nx"].keys()} {entry["mythen_nx"]["data"]}") + # self.logger.log("Data shape: [(frames), (data), (counter)]") + + 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: + try: + self.Ie = entry["mythen_nx"]["Ie"][()] + except: + pass + + + self.Ic4 = np.full(self.n_frames,1) + try: + self.Ic4 = entry["Ic4"]["data"][()] + except: + try: + self.Ic4 = entry["mythen_nx"]["Ic4"][()] + except: + 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: + entry = file["entry1"] + + + normalised_beam_intensity = self.beam_intensity / np.median(self.beam_intensity) + + if (frame != None) and (sum_frames == 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 == None) and (sum_frames == 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 == None) and (sum_frames == False): + # 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}") + + 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: + + 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 = I11_reduction.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 + + + @staticmethod + def load_int_array_from_file(filepath: str) -> np.ndarray: + + """ + File format is just a list of integers in a text file, one integer per line. + + """ + + if not os.path.exists(filepath): + return np.array([]) + + elif (os.path.getsize(filepath) == 0): + return np.array([]) + + + return np.loadtxt(filepath, dtype=np.int64, comments="#", usecols=0, ndmin=1) + + + def save_nxs_outfile(self, reduced_nxs_filepath_out: str, xyedata: DataFrame, module_raw_data: DataFrame, frame_data: DataFrame, angular_corrected_data: 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) + + ##################################### + + 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: + + ################################## + #just save rings exactly as they were from the hdf5 file but split into ring 1 and 2 + ################################## + + 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] = ModuleDataAtDelta + + 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): + + 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]) + + ModuleDataAtDelta = DataFrame() + ModuleDataAtDelta["raw_tth"] = self.module_raw_tth[n_mod] + ModuleDataAtDelta["tth"] = ModuleDataAtDelta["raw_tth"].values+delta_pos + ModuleDataAtDelta["mod_channel"] = self.module_raw_tth["mod_channel"] #always 0-1280 for each module + ModuleDataAtDelta["det_channel"] = module_det_channels[n] + ModuleDataAtDelta["frame"] = n_frame + ModuleDataAtDelta["delta_pos"] = delta_pos + ModuleDataAtDelta["n_mod"] = n_mod + ModuleDataAtDelta["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]) + ModuleDataAtDelta["counts"] = self.apply_flatfield_correction(ModuleDataAtDelta["no_ff_corr"].values,self.flatfield_modules[n_mod]) + + # ModuleDataAtDelta["counts"] = self.apply_flatfield_correction(ModuleDataAtDelta["no_ff_corr"].values,self.flatfield_modules[n_mod]) + ModuleDataAtDelta["error"] = np.sqrt(ModuleDataAtDelta["counts"]) #poisson errors + + #if isinstance(self.bad_channels,dict) + # ModuleDataAtDelta["badchannel"] = ( (ModuleDataAtDelta['counts'] == 0) \ + # | (ModuleDataAtDelta["mod_channel"].isin(self.bad_channels[n_mod])) \ + # | (ModuleDataAtDelta["mod_channel"].isin(start_bad_chans)) \ + # | (ModuleDataAtDelta["mod_channel"].isin(end_bad_chans)) ) old way + + #if isinstance(self.bad_channels,np.ndarray): + + + ModuleDataAtDelta["badchannel"] = ( (ModuleDataAtDelta["det_channel"].isin(self.bad_channels)) \ + | (ModuleDataAtDelta["mod_channel"].isin(start_bad_chans)) \ + | (ModuleDataAtDelta["mod_channel"].isin(end_bad_chans)) ) #new way + + self.all_module_data[n_frame][n_mod] = ModuleDataAtDelta + + + + + # plt.plot(ModuleDataAtDelta["tth"],ModuleDataAtDelta["counts"]) + # plt.plot(ModuleDataAtDelta["tth"],ModuleDataAtDelta["no_ff_corr"]) + # plt.show() + + + return self.all_module_data + + def remove_bad_channels_modules_frames(self) -> 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)\ + & (~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) -> 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 = DataFrame() + + for n_mod,n_frame in product(self.active_modules,self.frames_range): + + angular_corrected_data_unmasked = 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!!!!') + self.logger.log("Modules will be determined from mythen3 config") + self.active_modules = I11_reduction.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}") + 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 light (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 + + @staticmethod + def convert_tth_to_Q(tth: np.ndarray, wavelength: float) -> np.ndarray: + + """ + + Converts a 2th angle to Q using the wavelength. Simple + + https://www.ill.eu/fileadmin/user_upload/ILL/3_Users/Support_labs_infrastructure/Software-tools/DIF_tools/neutrons.html + + """ + + pi = 3.141592653589 + Q_space = (4*pi/wavelength)* np.sin(np.deg2rad(tth)/2) + + return Q_space + + 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 ='best') -> 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 a bin with a single 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 in a bin as a result of missing module + + + 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 == 'internal': + errors = prop_errors + elif (error_calc == 'external'): + errors = std_errors + elif error_calc == 'best': + errors = np.where(prop_errors > std_errors, prop_errors, std_errors) + + + return bin_centres, bin_edges, mean_counts, errors + + + + def bin_data(self, angular_corrected_data: DataFrame, error_calc: str) -> 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 = 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 = I11_reduction.convert_tth_to_Q(xyedata["tth"].values, self.wavelength) + xyedata["Q"] = Q_space + + return xyedata + + def save_xye(self, xye_filepath_out: str, xyedata: 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 == None: + self.flatfield_filepath = self.config["flatfield_filepath"] + + if self.apply_flatfield == None: + self.apply_flatfield = self.config["apply_flatfield"] + + if self.active_modules == None: + self.active_modules = self.config["active_modules"] + self.active_modules.sort() + + if self.bad_modules == 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 == 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 == None: + self.angcal_filepath = self.config["angcal_filepath"] + + if self.data_reduction_mode == 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 bin_frames_and_save(self): + + # for n_frame in self.frames_range: + + # frame_angular_corrected_data = self.frame_data[n_frame] + # xye_frame_out = self.bin_data(frame_angular_corrected_data) + # self.save_xye(self.xye_filepath_out.replace(".xye",f"_frame_{n_frame}.xye"), xye_frame_out, "tth") + + + 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): + + # rebinned_tth, tth_bin_edges, rebinned_counts, errors = self.bin_and_propagate_errors(self.angular_corrected_data["tth"].values, + # self.angular_corrected_data["counts"].values, + # self.angular_corrected_data["error"].values,'internal') + 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 == True: + plt.close() + + def plot_modules_by_ring(self, mask=[], block=True): + + plt.figure(figsize=(10,4)) + + 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) + + + plt.ylabel("Ring number") + plt.yticks([0,1]) + plt.xlabel("Angle (tth)") + plt.show(block=block) + if block == True: + plt.close() + + + def plot_by(self, parameters=[], x="tth", at_a_time=False): + + 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): + print(x,y) + + for x,y in zip(ring_2_angles.keys(), ring2_steps): + 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 == 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_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.plot(mod_data["tth"], mod_data["counts"],label=str(n_mod)) + plt.text(np.mean(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 == 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 debug_reduction(self): + + # self.logger.log('Saving debug nxs...') + + # unmasked_frame_data, unmasked_module_raw_data = self.split_data(unmasked=True) #if this is done after remove bad channels and modules + # unmasked_xyedata = self.bin_data(self.angular_corrected_data_unmasked,error_calc=self.error_calc) + # debug_reduced_nxs_filepath_out = self.reduced_nxs_filepath_out.replace('.nxs','_debug.nxs') + # self.save_nxs_outfile(debug_reduced_nxs_filepath_out, unmasked_xyedata, unmasked_module_raw_data, unmasked_frame_data, self.angular_corrected_data_unmasked, debug=True) + + # def ffcorr_calc(self, wholedetector_raw_frames): + + # flipped_data = np.zeros_like(wholedetector_raw_frames) + + # for exp,frame_data in enumerate(wholedetector_raw_frames): + + # frame_mod_data = np.array_split(frame_data, len(self.active_modules)) + + # for n,n_mod in enumerate(self.active_modules): + + + # if (n_mod <= 13): + # pos = 13-n_mod + # ffcorr = frame_mod_data[n] + + # else: + # pos = n_mod + # ffcorr = np.flip(frame_mod_data[n],axis=0) + + # start = (pos)*self.STRIPS_PER_MODULE + # stop = ((pos+1)*self.STRIPS_PER_MODULE) + + # self.logger.log(len(ffcorr)) + # self.logger.log(exp) + # self.logger.log(start,stop) + + # self.logger.log(np.shape(flipped_data)) + + # self.logger.log("\n") + + # flipped_data[exp,start:stop] = ffcorr + + # return flipped_data + + + 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: + # self.logger.log(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]}") + 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 + + # beam_normalised_flatfield = beam_normalised_flatfield - np.amin(beam_normalised_flatfield) + 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 + # new_flatfield[count_throw_index] = (new_flatfield[count_throw_index-1]+new_flatfield[count_throw_index+1])/2 + + 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: + dset = 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 = DaqMessenger("i11-control") + daq.connect() + # self.logger.log(f"sending {self.reduced_nxs_filepath_out}, stomp is old? {daq.old_stomp}") + 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 not os.path.exists(self.filepath): + self.logger.log("NXS file does not exist") + quit() + + if self.bad_frames == None: + self.bad_frames = [] #frames that should be removed, because they are bad for whatever reason + + + if self.out_directory != 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")) + 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() + + output_data_modules = set(self.active_modules).difference(set(self.bad_modules)) + self.logger.log("Modules in output data:",output_data_modules) + + if self.beam_energy: + self.wavelength = I11_reduction.calculate_wavelength(self.beam_energy) + self.logger.log(f"Beam Energy: {self.beam_energy} (keV) | Wavelength = {self.wavelength:.3f} (Angstrom)\n") + + + # self.bad_channels = self.generate_badchannel_dict() + self.bad_channels = I11_reduction.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}") + + # if self.angcal_filepath.endswith(".json"): + # self.module_angular_cal, self.beamline_offset = self.read_angular_cal_json(self.angcal_filepath) + # else: + self.module_angular_cal, self.beamline_offset = I11_reduction.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 = I11_reduction.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?", required=False + ) + + args = parser.parse_args() + + + import time + start = time.time() + Analysis = I11_reduction(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_calibration/ang_cal_171125.json b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json new file mode 100644 index 0000000..f51ac2e --- /dev/null +++ b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json @@ -0,0 +1,56 @@ +{ + "centre": 639.5, + "conv_0": 6.570184497741959e-05, + "offset_0": 67.96978209773698, + "conv_1": 6.568315103360132e-05, + "offset_1": 62.96538344998067, + "conv_2": 6.568292984577048e-05, + "offset_2": 57.954158956916906, + "conv_3": 6.566155391015388e-05, + "offset_3": 52.95557701205766, + "conv_4": 6.566551064046604e-05, + "offset_4": 47.9555186087957, + "conv_5": 6.56564416881416e-05, + "offset_5": 42.94753952319434, + "conv_6": 6.563593626034103e-05, + "offset_6": 37.94886671053375, + "conv_7": 6.564169975987083e-05, + "offset_7": 32.93554609049577, + "conv_8": 6.56217783956062e-05, + "offset_8": 27.934354886129004, + "conv_9": 6.562040232230031e-05, + "offset_9": 22.932921824280186, + "conv_10": 6.563425551557966e-05, + "offset_10": 17.93115217829966, + "conv_11": 6.50714144302067e-05, + "offset_11": 12.93714697370569, + "conv_12": 6.559688777484265e-05, + "offset_12": 7.925242220666613, + "conv_13": 6.558346574831002e-05, + "offset_13": 2.9349146500271828, + "conv_14": -6.558871353830087e-05, + "offset_14": 0.43719841617827926, + "conv_15": -6.55873849338328e-05, + "offset_15": 5.43245569047748, + "conv_16": -6.559859936901077e-05, + "offset_16": 10.438755845366217, + "conv_18": -6.561026146803566e-05, + "offset_18": 20.434766311618212, + "conv_19": -6.561170974362194e-05, + "offset_19": 25.443743042246087, + "conv_20": -6.562461529722984e-05, + "offset_20": 30.440076040360058, + "conv_21": -6.564163529664693e-05, + "offset_21": 35.44938893414347, + "conv_22": -6.565333081177747e-05, + "offset_22": 40.45283216309983, + "conv_23": -6.564782459391464e-05, + "offset_23": 45.45746776051998, + "conv_25": -6.567031885143943e-05, + "offset_25": 55.46414350273406, + "conv_26": -6.56761558320164e-05, + "offset_26": 60.46960365808682, + "conv_27": -6.567657918854628e-05, + "offset_27": 65.48052129001229, + "beamline_offset": -0.49797387571608365 +} diff --git a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.off b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.off new file mode 100644 index 0000000..73b536c --- /dev/null +++ b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.off @@ -0,0 +1,29 @@ +module 0 offset 67.96978209773698 conv 6.570184497741959e-05 center 639.5 +module 1 offset 62.96538344998067 conv 6.568315103360132e-05 center 639.5 +module 2 offset 57.954158956916906 conv 6.568292984577048e-05 center 639.5 +module 3 offset 52.95557701205766 conv 6.566155391015388e-05 center 639.5 +module 4 offset 47.9555186087957 conv 6.566551064046604e-05 center 639.5 +module 5 offset 42.94753952319434 conv 6.56564416881416e-05 center 639.5 +module 6 offset 37.94886671053375 conv 6.563593626034103e-05 center 639.5 +module 7 offset 32.93554609049577 conv 6.564169975987083e-05 center 639.5 +module 8 offset 27.934354886129004 conv 6.56217783956062e-05 center 639.5 +module 9 offset 22.932921824280186 conv 6.562040232230031e-05 center 639.5 +module 10 offset 17.93115217829966 conv 6.563425551557966e-05 center 639.5 +module 11 offset 12.93714697370569 conv 6.50714144302067e-05 center 639.5 +module 12 offset 7.925242220666613 conv 6.559688777484265e-05 center 639.5 +module 13 offset 2.9349146500271828 conv 6.558346574831002e-05 center 639.5 +module 14 offset 0.43719841617827926 conv -6.558871353830087e-05 center 639.5 +module 15 offset 5.43245569047748 conv -6.55873849338328e-05 center 639.5 +module 16 offset 10.438755845366217 conv -6.559859936901077e-05 center 639.5 +module 17 offset 15.460898259570609 conv -6.559958016268705e-05 center 639.5 #not refined +module 18 offset 20.434766311618212 conv -6.561026146803566e-05 center 639.5 +module 19 offset 25.443743042246087 conv -6.561170974362194e-05 center 639.5 +module 20 offset 30.440076040360058 conv -6.562461529722984e-05 center 639.5 +module 21 offset 35.44938893414347 conv -6.564163529664693e-05 center 639.5 +module 22 offset 40.45283216309983 conv -6.565333081177747e-05 center 639.5 +module 23 offset 45.45746776051998 conv -6.564782459391464e-05 center 639.5 +module 24 offset 50.490325933600815 conv -6.566850538481755e-05 center 639.5 #not refined +module 25 offset 55.46414350273406 conv -6.567031885143943e-05 center 639.5 +module 26 offset 60.46960365808682 conv -6.56761558320164e-05 center 639.5 +module 27 offset 65.48052129001229 conv -6.567657918854628e-05 center 639.5 +beamline_offset -0.49797387571608365 diff --git a/src/xrpd_toolbox/i11/mythen_calibration/badchannels.txt b/src/xrpd_toolbox/i11/mythen_calibration/badchannels.txt new file mode 100644 index 0000000..fb42d51 --- /dev/null +++ b/src/xrpd_toolbox/i11/mythen_calibration/badchannels.txt @@ -0,0 +1,1984 @@ +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 +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 +14624 +14625 +14626 +16398 +16399 +16400 +16401 +16402 +16403 +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 +32130 +32131 +32132 +32133 +33166 +33167 +33168 +34530 +34531 +34532 +34533 +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 diff --git a/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml b/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml new file mode 100644 index 0000000..4fd2009 --- /dev/null +++ b/src/xrpd_toolbox/i11/mythen_calibration/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 = "internal" #this can be "internal" "external" or "best". internal error is propagated poisson errors, external is std_dev of counts in bin (will result in nan values if there is only 1 count in the bin), and "best" 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 = 0 +# data_reduction_mode +#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) +###### + + +###### +# 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 = "/dls_sw/i11/software/mythen/badchannels.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/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index c34c73a..77a795b 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -1,3 +1,4 @@ +import os from _collections_abc import Iterable import numpy as np @@ -13,3 +14,21 @@ def normalise_to(data: Iterable[float | int], minval: float | int = 0) -> np.nda data_array = np.array(data, dtype=float) return (data_array - minval) / (np.amax(data_array) - minval) + + +def load_int_array_from_file(filepath: str) -> np.ndarray: + """ + File format is just a list of integers in a text file, one integer per line. + + If no file, will return no empty array. + + If empty file, will return no empty array. + + """ + + if not os.path.exists(filepath): + return np.array([]) + elif os.path.getsize(filepath) == 0: + return np.array([]) + else: + return np.loadtxt(filepath, dtype=np.int64, comments="#", usecols=0, ndmin=1) diff --git a/tests/test_utils.py b/tests/test_utils.py index de69e74..becd007 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,7 +1,9 @@ +import os + import numpy as np from xrpd_toolbox.utils.energy import beam_energy_to_wavelength, tth_to_q -from xrpd_toolbox.utils.utils import normalise_to +from xrpd_toolbox.utils.utils import load_int_array_from_file, normalise_to def test_normalise_to(): @@ -18,3 +20,20 @@ def test_tth_to_q(): 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(): + test_file = "int_array.txt" + + # Create a temporary file + with open(test_file, "w") as f: + for i in range(1, 6): + f.write(f"{i}\n") + + # 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) + + # Clean up + os.remove(test_file) diff --git a/uv.lock b/uv.lock index a017914..dd318dd 100644 --- a/uv.lock +++ b/uv.lock @@ -1216,6 +1216,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.5.1" @@ -1232,6 +1241,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, ] +[[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" @@ -1244,6 +1265,34 @@ 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 = "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.12.5" @@ -1895,6 +1944,7 @@ dependencies = [ { name = "numpy" }, { name = "pandas" }, { name = "peakutils" }, + { name = "pycifrw" }, { name = "pyfai" }, { name = "scipy" }, ] @@ -1919,6 +1969,7 @@ requires-dist = [ { name = "numpy" }, { name = "pandas" }, { name = "peakutils" }, + { name = "pycifrw" }, { name = "pyfai" }, { name = "scipy" }, ] From 0b33fabb8a6fafbb581145606a69a4feb4e9bb08 Mon Sep 17 00:00:00 2001 From: akz63626 Date: Wed, 28 Jan 2026 17:48:57 +0000 Subject: [PATCH 02/86] added guis for inspecting mythen data --- pyproject.toml | 3 + src/xrpd_toolbox/gui/__init__,py | 0 src/xrpd_toolbox/gui/bad_pixel_gui.py | 377 ++++++++++++++++++ src/xrpd_toolbox/gui/reprocessor.py | 0 src/xrpd_toolbox/gui/reprocessor_gui.py | 355 +++++++++++++++++ src/xrpd_toolbox/i11/mythen.py | 101 ++++- ...then3reduction.txt => mythen3reduction.py} | 57 +-- .../mythen3_reduction_config.toml | 142 ------- src/xrpd_toolbox/utils/utils.py | 78 ++++ tests/test_mythen.py | 52 +++ tests/test_utils.py | 16 +- 11 files changed, 990 insertions(+), 191 deletions(-) create mode 100644 src/xrpd_toolbox/gui/__init__,py create mode 100644 src/xrpd_toolbox/gui/bad_pixel_gui.py create mode 100644 src/xrpd_toolbox/gui/reprocessor.py create mode 100644 src/xrpd_toolbox/gui/reprocessor_gui.py rename src/xrpd_toolbox/i11/{mythen3reduction.txt => mythen3reduction.py} (97%) create mode 100644 tests/test_mythen.py diff --git a/pyproject.toml b/pyproject.toml index a80baf6..63e7f3b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,9 @@ dependencies = [ "lmfit", "peakutils", "PyCifRW", + "pyyaml", + "PyQt6" + "PyQt5" ] # Add project dependencies here, e.g. ["click", "numpy"] dynamic = ["version"] license.file = "LICENSE" 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..42dd6a9 --- /dev/null +++ b/src/xrpd_toolbox/gui/bad_pixel_gui.py @@ -0,0 +1,377 @@ +import sys +from pathlib import Path +from typing import List, Optional, Set + +import h5py +import numpy as np + +from PyQt6.QtCore import Qt +from PyQt6.QtWidgets import ( + QApplication, + QFileDialog, + QHBoxLayout, + QVBoxLayout, + QSlider, + QPushButton, + QListWidget, + QListWidgetItem, + QSpinBox, + QWidget, + QLabel, +) + +from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg +from matplotlib.figure import Figure +from matplotlib.widgets import RectangleSelector + +from xrpd_toolbox.utils.utils import load_int_array_from_file + +DATASET_PATH = "/entry/mythen_nx/data" +MODULE_COUNT = 28 +MODULE_SIZE = 1280 +UNDO_LIMIT = 10 +COUNTER = 0 + + +def load_mythen_data(filepath: str) -> np.ndarray: + path = Path(filepath) + if not path.exists(): + raise FileNotFoundError(path) + + with h5py.File(path, "r") as file: + if DATASET_PATH not in file: + raise KeyError(f"Dataset not found: {DATASET_PATH}") + + data = np.asarray(file.get(DATASET_PATH, [])) + + if data.ndim < 1: + raise ValueError("Dataset must have at least one dimension") + else: + data = data[:, :, COUNTER] + + return data + + +class PlotCanvas(FigureCanvasQTAgg): + def __init__( + self, + data: np.ndarray, + global_selected_indices: Set[int], + selection_callback, + parent: Optional[QWidget] = None, + ) -> None: + self.figure = Figure() + super().__init__(self.figure) + self.setParent(parent) + + self._pan_start = None # new attribute + + + self.ax = self.figure.add_subplot(111) + + self.raw_data = data + self.current_module = 0 + self.global_selected_indices = global_selected_indices + self.selection_callback = selection_callback + + self.x = np.arange(MODULE_SIZE) + self.scatter = None + self.reference_curve = None + + self._connect_events() + self._plot_module(0) + self._enable_rectangle_zoom() + + 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 * MODULE_SIZE + end = start + MODULE_SIZE + + 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 (Arb. Units.)") + + self.ax.relim() + self.ax.autoscale() + + self.scatter = self.ax.scatter([], [], color="red", zorder=5) + self._update_selected_points() + + self._enable_rectangle_zoom() + 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=dict(facecolor="blue", alpha=0.2), + ) + + def reset_zoom(self) -> None: + self.ax.relim() + self.ax.autoscale() + self.draw_idle() + + def set_module(self, module: int) -> None: + self.current_module = module + self._plot_module(module) + + def _on_scroll(self, event) -> None: + if event.xdata is None or event.ydata is None: + return + + zoom_factor = 1.05 + factor = 1 / zoom_factor if event.button == "up" else zoom_factor + + x_min, x_max = self.ax.get_xlim() + y_min, y_max = self.ax.get_ylim() + + x_range = (x_max - x_min) * factor + y_range = (y_max - y_min) * factor + + self.ax.set_xlim(event.xdata - x_range / 2, event.xdata + x_range / 2) + self.ax.set_ylim(event.ydata - y_range / 2, event.ydata + y_range / 2) + self.draw_idle() + + def _on_rectangle_select(self, eclick, erelease) -> None: + if eclick.xdata is None or erelease.xdata is None: + return + + x0, x1 = sorted((eclick.xdata, erelease.xdata)) + y0, y1 = sorted((eclick.ydata, erelease.ydata)) + + self.ax.set_xlim(x0, x1) + self.ax.set_ylim(y0, y1) + self.draw_idle() + + + def _on_click(self, event) -> None: + # Right-click toggle + if event.button == 3 and event.xdata is not None: + index = int(round(event.xdata)) + if 0 <= index < MODULE_SIZE: + global_index = self.current_module * MODULE_SIZE + index + self.selection_callback(global_index) + # Middle-button press starts panning + 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"] + xlim_start, xlim_end = self._pan_start["xlim"] + ylim_start, ylim_end = self._pan_start["ylim"] + self.ax.set_xlim(xlim_start - dx, xlim_end - dx) + self.ax.set_ylim(ylim_start - dy, ylim_end - 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 + + module_start = self.current_module * MODULE_SIZE + module_end = module_start + MODULE_SIZE + + local_indices = [ + idx - module_start + for idx in self.global_selected_indices + if module_start <= idx < module_end + ] + + if local_indices: + x = self.x[local_indices] + y = self.reference_curve[local_indices] + offsets = np.column_stack((x, y)) + else: + offsets = np.empty((0, 2)) + + self.scatter.set_offsets(offsets) + self.draw_idle() + + +class MainWindow(QWidget): + def __init__(self, data: np.ndarray, initial_indices: Set[int]) -> None: + super().__init__() + + self.setWindowTitle("Mythen NXS Viewer") + + self.global_selected_indices = initial_indices + + self.undo_stack: List[Set[int]] = [] + self.redo_stack: List[Set[int]] = [] + + self.canvas = PlotCanvas( + data, self.global_selected_indices, self._toggle_index + ) + self.list_widget = QListWidget() + + self.module_slider = QSlider(Qt.Orientation.Horizontal) + self.module_slider.setRange(0, MODULE_COUNT - 1) + self.module_slider.valueChanged.connect(self.canvas.set_module) + + 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_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) + + self.n_spin = QSpinBox() + self.n_spin.setRange(1, MODULE_SIZE // 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._setup_layout() + self._timer_id = self.startTimer(200) + + def _setup_layout(self) -> None: + right_layout = QVBoxLayout() + right_layout.addWidget(QLabel("Selected Global Indices")) + right_layout.addWidget(self.list_widget) + right_layout.addWidget(QLabel("N (edge points per module)")) + right_layout.addWidget(self.n_spin) + right_layout.addWidget(self.add_edges_button) + + # Undo/Redo buttons side by side + undo_redo_layout = QHBoxLayout() + undo_redo_layout.addWidget(self.undo_button) + undo_redo_layout.addWidget(self.redo_button) + right_layout.addLayout(undo_redo_layout) + + right_layout.addWidget(self.save_button) + + left_layout = QVBoxLayout() + left_layout.addWidget(self.canvas) + left_layout.addWidget(self.module_slider) + left_layout.addWidget(self.reset_zoom_button) + + main_layout = QHBoxLayout() + main_layout.addLayout(left_layout, stretch=3) + main_layout.addLayout(right_layout, stretch=1) + + self.setLayout(main_layout) + + def timerEvent(self, event) -> None: #type: ignore + self._sync_list() + + def _sync_list(self) -> None: + indices = sorted(self.global_selected_indices) + if self.list_widget.count() == len(indices): + return + + self.list_widget.clear() + for idx in indices: + self.list_widget.addItem(QListWidgetItem(str(idx))) + + def _record_state(self) -> None: + self.undo_stack.append(self.global_selected_indices.copy()) + if len(self.undo_stack) > UNDO_LIMIT: + self.undo_stack.pop(0) + self.redo_stack.clear() + + 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() + + def _undo(self) -> None: + if not self.undo_stack: + return + self.redo_stack.append(self.global_selected_indices.copy()) + prev_state = self.undo_stack.pop() + self.global_selected_indices.clear() + self.global_selected_indices.update(prev_state) + self.canvas._update_selected_points() + + def _redo(self) -> None: + if not self.redo_stack: + return + self.undo_stack.append(self.global_selected_indices.copy()) + next_state = self.redo_stack.pop() + self.global_selected_indices.clear() + self.global_selected_indices.update(next_state) + self.canvas._update_selected_points() + + def _add_edge_indices(self) -> None: + self._record_state() + n = self.n_spin.value() + for module in range(MODULE_COUNT): + base = module * MODULE_SIZE + for i in range(n): + self.global_selected_indices.add(base + i) + self.global_selected_indices.add(base + MODULE_SIZE - 1 - i) + self.canvas._update_selected_points() + + def _save_indices(self) -> None: + path_str, _ = QFileDialog.getSaveFileName( + self, + "Save Indices", + "", + "Text Files (*.txt)", + ) + if not path_str: + return + path = Path(path_str) + with path.open("w", encoding="utf-8") as f: + for idx in sorted(self.global_selected_indices): + f.write(f"{idx}\n") + + +def run_gui(filepath: str, indices_file: Optional[str] = None) -> None: + data = load_mythen_data(filepath) + initial_indices: Set[int] = set() + if indices_file is not None: + initial_indices = set(load_int_array_from_file(indices_file)) + + app = QApplication(sys.argv) + window = MainWindow(data, initial_indices) + window.resize(1450, 900) + window.show() + sys.exit(app.exec()) + + + +if __name__ == "__main__": + # Example usage: + run_gui("/Users/akz63626/cm44155-1/1407178.nxs", indices_file="/Users/akz63626/cm44155-1/combined_bad_channels.txt") 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..ff83aaf --- /dev/null +++ b/src/xrpd_toolbox/gui/reprocessor_gui.py @@ -0,0 +1,355 @@ +import sys +import json +import time +from pathlib import Path +from typing import List, Dict, Optional, Tuple, Set, cast + +from PyQt5.QtCore import QDir, Qt, QThread, pyqtSignal +from PyQt5.QtWidgets import ( + QApplication, + QWidget, + QTreeView, + QListWidget, + QListWidgetItem, + QGridLayout, + QLineEdit, + QSpinBox, + QDoubleSpinBox, + QCheckBox, + QPushButton, + QHBoxLayout, + QVBoxLayout, + QMessageBox, + QFileSystemModel, + QAbstractItemView, + QFileDialog, + QLabel, +) + +from pydantic import BaseModel, ValidationError + + +# ========================= +# Pydantic settings model +# ========================= + +class ProcessingSettings(BaseModel): + threshold: float + max_iterations: int + normalize: bool + output_dir: str + + +# ========================= +# 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: ProcessingSettings) -> None: + super().__init__() + self.files: List[Path] = files + self.settings: ProcessingSettings = 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_columns: int = 1, settings_path: str | Path = Path("settings.json")) -> None: + super().__init__() + + self.settings_columns: int = max(1, settings_columns) + + self.settings_path: Path = Path(settings_path) + self.settings_model: ProcessingSettings = self.load_settings() + + self.selected_files: List[Path] = [] + self.worker: Optional[ProcessingWorker] = 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 Processor") + 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.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(QDir.homePath())) + 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) + + # --------------------- + # Load settings + # --------------------- + + def load_settings(self) -> ProcessingSettings: + with self.settings_path.open("r") as f: + return ProcessingSettings(**json.load(f)) + + # --------------------- + # Settings grid + # --------------------- + + def build_settings_grid(self) -> None: + normal_settings: List[Tuple[str, QWidget]] = [ + ("Threshold", self.make_threshold()), + ("Max Iterations", self.make_max_iterations()), + ("Normalize", self.make_normalize()), + ] + + 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 + + self.settings_grid.addWidget(QLabel("Output Directory"), output_row, 0) + self.settings_grid.addWidget( + self.make_output_dir(), + output_row, + 1, + 1, + self.settings_columns * 2 - 1, + ) + + # --------------------- + # Widget builders + # --------------------- + + def make_threshold(self) -> QDoubleSpinBox: + w = QDoubleSpinBox() + w.setRange(0.0, 1e9) + w.setValue(self.settings_model.threshold) + self.widgets["threshold"] = w + return w + + def make_max_iterations(self) -> QSpinBox: + w = QSpinBox() + w.setRange(1, 1_000_000) + w.setValue(self.settings_model.max_iterations) + self.widgets["max_iterations"] = w + return w + + def make_normalize(self) -> QCheckBox: + w = QCheckBox() + w.setChecked(self.settings_model.normalize) + self.widgets["normalize"] = w + return w + + def make_output_dir(self) -> QWidget: + container = QWidget() + layout = QHBoxLayout(container) + layout.setContentsMargins(0, 0, 0, 0) + + edit = QLineEdit(self.settings_model.output_dir) + browse = QPushButton("Browse…") + browse.clicked.connect(self.browse_output_dir) + + layout.addWidget(edit) + layout.addWidget(browse) + + self.widgets["output_dir"] = 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) -> ProcessingSettings: + return ProcessingSettings( + 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) -> Optional[QListWidgetItem]: + 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) + window = MainWindow(settings_columns=2, settings_path="/Users/akz63626/Documents/settings.json") + window.show() + sys.exit(app.exec_()) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index fcb8853..0dd1843 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -1,15 +1,94 @@ from pathlib import Path - +from pydantic import BaseModel import numpy as np +from h5py import File as h5pyFile +import tomllib +import yaml +from typing import Literal + +from xrpd_toolbox.gui.bad_pixel_gui import DATASET_PATH + +class MythenReductionSettings(BaseModel): + active_modules: list[int] + bad_modules: list[int] + bad_channel_masking: bool + flatfield_filepath: str | Path + apply_flatfield: bool + modules_in_flatfield: list[int] + send_to_ispyb: bool + rebin_step: float + default_counter: int + edge_bad_channels: int + error_calc: Literal["internal", "external", "best"] + data_reduction_mode: int + bad_channels_filepath: str | Path + angcal_filepath: str | Path + + @classmethod + def load_from_toml(cls, file_path: str | Path) -> MythenReductionSettings: + + settings_dict = tomllib.load(open(file_path, "rb")) + return cls(**settings_dict) + + @classmethod + def load_from_yaml(cls, file_path: str | Path) -> MythenReductionSettings: + settings_dict = yaml.safe_load(open(file_path, "rb")) + return cls(**settings_dict) + + def save_to_yaml(self, file_path: str | Path) -> None: + 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, + ) + +DATASET_PATH = "/entry/mythen_nx/data" +MODULE_COUNT = 28 +MODULE_SIZE = 1280 +UNDO_LIMIT = 10 +COUNTER = 0 class MythenDataLoader: - def __init__(self, file_path: str | Path): - self.file_path = file_path + def __init__(self, file_path: str | Path, n_modules: int = 28, counter: int = 0): + self.file_path = Path(file_path) + self.n_modules = n_modules + self.counter = counter + self.dataset_path = "/entry/mythen_nx/data" + self.raw_data = self.load_data() + self.module_data = np.array_split(self.raw_data, self.n_modules, axis=-1) def load_data(self) -> np.ndarray: - return np.array([]) + if not self.file_path.exists(): + raise FileNotFoundError(self.file_path) + + with h5pyFile(self.file_path, "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.ndim < 1: + raise ValueError("Dataset must have at least one dimension") + + data = data[..., self.counter] + + return data + + def get_module_data(self, module_index: int) -> np.ndarray: + if module_index < 0 or module_index >= self.n_modules: + raise IndexError("Module index out of range.") + + return self.module_data[module_index] class MythenModule: def __init__(self, data, pixels_per_modules: int = 1280): @@ -26,7 +105,13 @@ def __init__(self, modules_per_detector: int = 28): if __name__ == "__main__": - data = np.array([1, 2, 3, 4, 5]) - module = MythenModule(data) - result = module.process() - print("Processed result:", result) + + settings = MythenReductionSettings.load_from_toml("/Users/akz63626/projects/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml") + + print("Loaded settings:", settings) + + MythenDataLoader("/Users/akz63626/cm44155-1/1407178.nxs") + + # module = MythenModule(data) + # result = module.process() + # print("Processed result:", result) diff --git a/src/xrpd_toolbox/i11/mythen3reduction.txt b/src/xrpd_toolbox/i11/mythen3reduction.py similarity index 97% rename from src/xrpd_toolbox/i11/mythen3reduction.txt rename to src/xrpd_toolbox/i11/mythen3reduction.py index 0d150e7..6c1e97b 100755 --- a/src/xrpd_toolbox/i11/mythen3reduction.txt +++ b/src/xrpd_toolbox/i11/mythen3reduction.py @@ -134,7 +134,7 @@ class I11_reduction(): '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: + def read_singular_angcal_files(angcal_filepath: str) -> tuple[dict, float | None]: """ @@ -928,29 +928,6 @@ def convert_tth_to_Q(tth: np.ndarray, wavelength: float) -> np.ndarray: return Q_space - 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 ='best') -> np.ndarray: @@ -1005,9 +982,9 @@ def bin_data(self, angular_corrected_data: DataFrame, error_calc: str) -> DataFr """ - 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) + rebinned_tth, tth_bin_edges, rebinned_counts, errors = self.bin_and_propagate_errors(angular_corrected_data["tth"].to_numpy(), + angular_corrected_data["counts"].to_numpy(), + angular_corrected_data["error"].to_numpy(), error_calc) xyedata = DataFrame() @@ -1018,7 +995,7 @@ def bin_data(self, angular_corrected_data: DataFrame, error_calc: str) -> DataFr 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 = I11_reduction.convert_tth_to_Q(xyedata["tth"].values, self.wavelength) + Q_space = I11_reduction.convert_tth_to_Q(xyedata["tth"].to_numpy(), self.wavelength) xyedata["Q"] = Q_space return xyedata @@ -1034,7 +1011,7 @@ def save_xye(self, xye_filepath_out: str, xyedata: DataFrame, x: str ) -> np.nda """ xye_out_data = np.stack( - (xyedata[x].values, xyedata["counts"].values, xyedata["error"].values), axis=-1 + (xyedata[x].to_numpy(), xyedata["counts"].to_numpy(), xyedata["error"].to_numpy()), axis=-1 ) np.savetxt(xye_filepath_out, xye_out_data, fmt="%.6f", delimiter=" ", newline="\n") @@ -1177,10 +1154,10 @@ def _refine_rebin(self): 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) + bin_centres, bin_edges = self.create_bins(self.angular_corrected_data["tth"].to_numpy(),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] + sums, bin_edges = np.histogram(self.angular_corrected_data["tth"].to_numpy(), bins=bin_edges, weights=self.angular_corrected_data["counts"].to_numpy()) + counts = np.histogram(self.angular_corrected_data["tth"].to_numpy(), bins=bin_edges)[0] if np.amin(counts) == 0: continue @@ -1189,7 +1166,7 @@ def _refine_rebin(self): 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) + chi = np.sum(np.abs(bin_centres_repeated-self.angular_corrected_data["tth"].to_numpy()))*len(bin_centres) if n%100 == 0: self.logger.log(new_rebin) @@ -1312,7 +1289,7 @@ def plot_module_counts(self,block=True): for n_mod in self.active_modules: - if n_mod in self.angular_corrected_data["n_mod"].values: + if n_mod in self.angular_corrected_data["n_mod"].to_numpy(): plt.bar(n_mod, np.sum(self.module_raw_data[n_mod])) plt.xlabel("module number") @@ -1416,7 +1393,7 @@ def return_outliers(self, factor: int | float = 3, low_bound: float | None = Non 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) + hist, bin_edges = np.histogram(mod_data["counts"].to_numpy(),bins=hist_model) mean_hist = np.mean(bin_edges) std_hist = np.std(bin_edges) stdfact = 1.5*std_hist @@ -1425,7 +1402,7 @@ def return_outliers(self, factor: int | float = 3, low_bound: float | None = Non if plot: - plt.hist(mod_data["counts"].values, bins=hist_model) # arguments are passed to np.histogram + plt.hist(mod_data["counts"].to_numpy(), bins=hist_model) # arguments are passed to np.histogram plt.title(f"Histogram with {hist_model} bins") plt.show() @@ -1436,8 +1413,8 @@ def return_outliers(self, factor: int | float = 3, low_bound: float | None = Non 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 + low_channels = low_data_points["det_channel"].to_numpy() + high_channels = high_data_points["det_channel"].to_numpy() bad_channels = np.sort(np.unique(np.append(low_channels, high_channels))) all_bad_channels = np.append(all_bad_channels, bad_channels) @@ -1446,7 +1423,7 @@ def return_outliers(self, factor: int | float = 3, low_bound: float | None = Non if low_bound: low_bound_points = mod_data[(mod_data["counts"] < low_bound)] - low_bound_channels = low_bound_points["det_channel"].values + low_bound_channels = low_bound_points["det_channel"].to_numpy() if len(low_bound_channels) > 0: print("\n", "low bound", low_bound_channels,"\n") @@ -1713,7 +1690,7 @@ def communicate_with_control(self, send_to_ispyb: bool = False): def __init__(self, - filepath: str | None = None, + filepath: str, reduced_nxs_filepath_out: str | None = None, xye_filepath_out: str | None = None, xye_filepath_out_Q: str | None = None, diff --git a/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml b/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml index 4fd2009..6789720 100644 --- a/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml +++ b/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml @@ -48,145 +48,3 @@ data_reduction_mode = 0 bad_channels_filepath = "/dls_sw/i11/software/mythen/badchannels.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/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 77a795b..c3c001b 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -15,6 +15,15 @@ def normalise_to(data: Iterable[float | int], minval: float | int = 0) -> np.nda return (data_array - minval) / (np.amax(data_array) - minval) +def normalise(data) -> np.ndarray: + return (data - np.min(data)) / (np.max(data) - np.min(data)) + + +def gaussian(x, amp, cen, fwhm, background) -> np.ndarray: + + #"1-d gaussian: gaussian(x, amp, cen, fwhm)" + + return (amp/(np.sqrt(2*np.pi)*fwhm)) * np.exp(-(x-cen)**2 /(2*fwhm**2))+background def load_int_array_from_file(filepath: str) -> np.ndarray: """ @@ -32,3 +41,72 @@ def load_int_array_from_file(filepath: str) -> np.ndarray: return np.array([]) else: return np.loadtxt(filepath, dtype=np.int64, comments="#", usecols=0, ndmin=1) + +def create_bins(tth_values: np.ndarray, rebin_step) -> tuple[np.ndarray, 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(x: np.ndarray, y: np.ndarray ,e: np.ndarray, rebin_step: float = 0.004, error_calc: str ='best', sum_counts: bool = False) -> tuple[np.ndarray, np.ndarray, 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 = create_bins(x, 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]-(rebin_step/10000) #I think it would be better to move it inside bin edge, and include, rather than remove all together or create a bin with a single value + + sums, bin_edges = np.histogram(x, bins=bin_edges, weights=y) + counts = np.histogram(x, bins=bin_edges)[0] + + if sum_counts: + binned_counts = sums #this will throw a warning if there are missing counts in a bin as a result of missing module + else: + binned_counts = sums / counts #this will throw a warning if there are missing counts in a bin as a result of missing module + + 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(binned_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 == 'internal': + errors = prop_errors + elif (error_calc == 'external'): + errors = std_errors + else: + errors = np.where(prop_errors > std_errors, prop_errors, std_errors) + + + return bin_centres, binned_counts, errors diff --git a/tests/test_mythen.py b/tests/test_mythen.py new file mode 100644 index 0000000..ac93c99 --- /dev/null +++ b/tests/test_mythen.py @@ -0,0 +1,52 @@ +from xrpd_toolbox.i11.mythen import MythenReductionSettings +import numpy as np +from xrpd_toolbox.utils.utils import gaussian, bin_and_propagate_errors +import matplotlib.pyplot as plt + +def test_mythen_settings(): + settings = MythenReductionSettings( + active_modules=[1, 2, 3], + bad_modules=[4, 5], + bad_channel_masking=True, + flatfield_filepath="flatfield.h5", + apply_flatfield=True, + modules_in_flatfield=[1, 2], + send_to_ispyb=False, + rebin_step=2.0, + default_counter=0, + edge_bad_channels=10, + error_calc="internal", + data_reduction_mode=1, + bad_channels_filepath="bad_channels.txt", + angcal_filepath="angcal.txt" + ) + +def test_mythen_settings_load_from_toml(): + settings = MythenReductionSettings.load_from_toml("tests/test_data/mythen_settings.toml") + assert settings.apply_flatfield is True + + + +def test_peak_averaging(): + + x1 = np.arange(0,10,0.1) + y1 = gaussian(x1, amp=10.0, cen=5.0, fwhm=1.0, background=0.0) + e1 = np.sqrt(y1) + + x2 = np.arange(0.01,10.01,0.1) + y2 = gaussian(x2, amp=20.0, cen=5.0, fwhm=1.0, background=0.0) + e2 = np.sqrt(y2) + + x_combined = np.concatenate((x1, x2)) + y_combined = np.concatenate((y1, y2)) + e_combined = np.concatenate((e1, e2)) + + x, y, e = bin_and_propagate_errors(x_combined, y_combined, e_combined, rebin_step=0.1, error_calc='internal') + + plt.errorbar(x1, y1, yerr=e1, fmt='o', label='Binned Data with Propagated Errors') + plt.errorbar(x2, y2, yerr=e2, fmt='o', label='Binned Data with Propagated Errors') + plt.errorbar(x-0.05, y, yerr=e, label='Binned Data with Propagated Errors') + plt.show() + +if __name__ == "__main__": + test_peak_averaging() diff --git a/tests/test_utils.py b/tests/test_utils.py index becd007..8bc7057 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -3,7 +3,7 @@ import numpy as np from xrpd_toolbox.utils.energy import beam_energy_to_wavelength, tth_to_q -from xrpd_toolbox.utils.utils import load_int_array_from_file, normalise_to +from xrpd_toolbox.utils.utils import load_int_array_from_file, normalise_to, normalise, gaussian def test_normalise_to(): @@ -11,6 +11,20 @@ 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, amp=22.0, cen=5.0, fwhm=1.0, background=0.0) + assert len(y) == len(x) + assert np.amax(y) == 22.0 + + def test_tth_to_q(): tth = 30 q_in_angstrom = tth_to_q(tth, 1) From df9b6bbd2eda0d684639bdddef55716a633dfb38 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 28 Jan 2026 20:06:42 +0000 Subject: [PATCH 03/86] fixed typing --- Dockerfile | 2 +- pyproject.toml | 4 +- src/xrpd_toolbox/gui/bad_pixel_gui.py | 59 +- src/xrpd_toolbox/gui/reprocessor_gui.py | 67 +- src/xrpd_toolbox/i11/mythen.py | 65 +- src/xrpd_toolbox/i11/mythen3reduction.py | 1902 ---------------------- uv.lock | 119 ++ 7 files changed, 221 insertions(+), 1997 deletions(-) delete mode 100755 src/xrpd_toolbox/i11/mythen3reduction.py diff --git a/Dockerfile b/Dockerfile index 4b99b9c..78930b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # The devcontainer should use the developer target and run as root with podman # or docker with user namespaces. -FROM ghcr.io/diamondlightsource/ubuntu-devcontainer:noble AS developer +FROM ghcr.io/diamondlightsource/ubuntu-devcontainer:noble-20260113@sha256:d59c106ff0751e5c51a8463f08cf93c6fbd28cac7399c46e32e5c544b7106336 AS developer # Add any system dependencies for the developer/build environment here RUN apt-get update -y && apt-get install -y --no-install-recommends \ diff --git a/pyproject.toml b/pyproject.toml index 63e7f3b..75c7cc3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,8 +23,8 @@ dependencies = [ "peakutils", "PyCifRW", "pyyaml", - "PyQt6" - "PyQt5" + "PyQt6", + "PyQt5", ] # Add project dependencies here, e.g. ["click", "numpy"] dynamic = ["version"] license.file = "LICENSE" diff --git a/src/xrpd_toolbox/gui/bad_pixel_gui.py b/src/xrpd_toolbox/gui/bad_pixel_gui.py index 42dd6a9..8382eb5 100644 --- a/src/xrpd_toolbox/gui/bad_pixel_gui.py +++ b/src/xrpd_toolbox/gui/bad_pixel_gui.py @@ -1,29 +1,26 @@ import sys from pathlib import Path -from typing import List, Optional, Set import h5py 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.QtWidgets import ( QApplication, QFileDialog, QHBoxLayout, - QVBoxLayout, - QSlider, - QPushButton, + QLabel, QListWidget, QListWidgetItem, + QPushButton, + QSlider, QSpinBox, + QVBoxLayout, QWidget, - QLabel, ) -from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg -from matplotlib.figure import Figure -from matplotlib.widgets import RectangleSelector - from xrpd_toolbox.utils.utils import load_int_array_from_file DATASET_PATH = "/entry/mythen_nx/data" @@ -41,7 +38,7 @@ def load_mythen_data(filepath: str) -> np.ndarray: with h5py.File(path, "r") as file: if DATASET_PATH not in file: raise KeyError(f"Dataset not found: {DATASET_PATH}") - + data = np.asarray(file.get(DATASET_PATH, [])) if data.ndim < 1: @@ -56,9 +53,9 @@ class PlotCanvas(FigureCanvasQTAgg): def __init__( self, data: np.ndarray, - global_selected_indices: Set[int], + global_selected_indices: set[int], selection_callback, - parent: Optional[QWidget] = None, + parent: QWidget | None = None, ) -> None: self.figure = Figure() super().__init__(self.figure) @@ -66,7 +63,6 @@ def __init__( self._pan_start = None # new attribute - self.ax = self.figure.add_subplot(111) self.raw_data = data @@ -122,9 +118,9 @@ def _enable_rectangle_zoom(self) -> None: self.ax, self._on_rectangle_select, useblit=True, - button=[1], #type: ignore + button=[1], # type: ignore interactive=False, - props=dict(facecolor="blue", alpha=0.2), + props={"facecolor": "blue", "alpha": 0.2}, ) def reset_zoom(self) -> None: @@ -164,7 +160,6 @@ def _on_rectangle_select(self, eclick, erelease) -> None: self.ax.set_ylim(y0, y1) self.draw_idle() - def _on_click(self, event) -> None: # Right-click toggle if event.button == 3 and event.xdata is not None: @@ -221,19 +216,17 @@ def _update_selected_points(self) -> None: class MainWindow(QWidget): - def __init__(self, data: np.ndarray, initial_indices: Set[int]) -> None: + def __init__(self, data: np.ndarray, initial_indices: set[int]) -> None: super().__init__() self.setWindowTitle("Mythen NXS Viewer") self.global_selected_indices = initial_indices - self.undo_stack: List[Set[int]] = [] - self.redo_stack: List[Set[int]] = [] + self.undo_stack: list[set[int]] = [] + self.redo_stack: list[set[int]] = [] - self.canvas = PlotCanvas( - data, self.global_selected_indices, self._toggle_index - ) + self.canvas = PlotCanvas(data, self.global_selected_indices, self._toggle_index) self.list_widget = QListWidget() self.module_slider = QSlider(Qt.Orientation.Horizontal) @@ -289,7 +282,7 @@ def _setup_layout(self) -> None: self.setLayout(main_layout) - def timerEvent(self, event) -> None: #type: ignore + def timerEvent(self, event) -> None: # type: ignore # noqa self._sync_list() def _sync_list(self) -> None: @@ -313,7 +306,7 @@ def _toggle_index(self, idx: int) -> None: self.global_selected_indices.remove(idx) else: self.global_selected_indices.add(idx) - self.canvas._update_selected_points() + self.canvas._update_selected_points() # noqa def _undo(self) -> None: if not self.undo_stack: @@ -322,7 +315,7 @@ def _undo(self) -> None: prev_state = self.undo_stack.pop() self.global_selected_indices.clear() self.global_selected_indices.update(prev_state) - self.canvas._update_selected_points() + self.canvas._update_selected_points() # noqa def _redo(self) -> None: if not self.redo_stack: @@ -331,7 +324,7 @@ def _redo(self) -> None: next_state = self.redo_stack.pop() self.global_selected_indices.clear() self.global_selected_indices.update(next_state) - self.canvas._update_selected_points() + self.canvas._update_selected_points() # noqa def _add_edge_indices(self) -> None: self._record_state() @@ -341,7 +334,7 @@ def _add_edge_indices(self) -> None: for i in range(n): self.global_selected_indices.add(base + i) self.global_selected_indices.add(base + MODULE_SIZE - 1 - i) - self.canvas._update_selected_points() + self.canvas._update_selected_points() # noqa def _save_indices(self) -> None: path_str, _ = QFileDialog.getSaveFileName( @@ -358,9 +351,9 @@ def _save_indices(self) -> None: f.write(f"{idx}\n") -def run_gui(filepath: str, indices_file: Optional[str] = None) -> None: +def run_gui(filepath: str, indices_file: str | None = None) -> None: data = load_mythen_data(filepath) - initial_indices: Set[int] = set() + initial_indices: set[int] = set() if indices_file is not None: initial_indices = set(load_int_array_from_file(indices_file)) @@ -371,7 +364,9 @@ def run_gui(filepath: str, indices_file: Optional[str] = None) -> None: sys.exit(app.exec()) - if __name__ == "__main__": # Example usage: - run_gui("/Users/akz63626/cm44155-1/1407178.nxs", indices_file="/Users/akz63626/cm44155-1/combined_bad_channels.txt") + run_gui( + "/Users/akz63626/cm44155-1/1407178.nxs", + indices_file="/Users/akz63626/cm44155-1/combined_bad_channels.txt", + ) diff --git a/src/xrpd_toolbox/gui/reprocessor_gui.py b/src/xrpd_toolbox/gui/reprocessor_gui.py index ff83aaf..5296bf5 100644 --- a/src/xrpd_toolbox/gui/reprocessor_gui.py +++ b/src/xrpd_toolbox/gui/reprocessor_gui.py @@ -1,38 +1,37 @@ -import sys import json +import sys import time from pathlib import Path -from typing import List, Dict, Optional, Tuple, Set, cast +from typing import cast +from pydantic import BaseModel, ValidationError from PyQt5.QtCore import QDir, Qt, QThread, pyqtSignal from PyQt5.QtWidgets import ( + QAbstractItemView, QApplication, - QWidget, - QTreeView, - QListWidget, - QListWidgetItem, + QCheckBox, + QDoubleSpinBox, + QFileDialog, + QFileSystemModel, QGridLayout, + QHBoxLayout, + QLabel, QLineEdit, - QSpinBox, - QDoubleSpinBox, - QCheckBox, + QListWidget, + QListWidgetItem, + QMessageBox, QPushButton, - QHBoxLayout, + QSpinBox, + QTreeView, QVBoxLayout, - QMessageBox, - QFileSystemModel, - QAbstractItemView, - QFileDialog, - QLabel, + QWidget, ) -from pydantic import BaseModel, ValidationError - - # ========================= # Pydantic settings model # ========================= + class ProcessingSettings(BaseModel): threshold: float max_iterations: int @@ -44,14 +43,15 @@ class ProcessingSettings(BaseModel): # 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: ProcessingSettings) -> None: + def __init__(self, files: list[Path], settings: ProcessingSettings) -> None: super().__init__() - self.files: List[Path] = files + self.files: list[Path] = files self.settings: ProcessingSettings = settings def run(self) -> None: @@ -72,8 +72,13 @@ def process_file(self, file: Path) -> None: # Main Window # ========================= + class MainWindow(QWidget): - def __init__(self, settings_columns: int = 1, settings_path: str | Path = Path("settings.json")) -> None: + def __init__( + self, + settings_columns: int = 1, + settings_path: str | Path = Path("settings.json"), + ) -> None: super().__init__() self.settings_columns: int = max(1, settings_columns) @@ -81,10 +86,10 @@ def __init__(self, settings_columns: int = 1, settings_path: str | Path = Path(" self.settings_path: Path = Path(settings_path) self.settings_model: ProcessingSettings = self.load_settings() - self.selected_files: List[Path] = [] - self.worker: Optional[ProcessingWorker] = None + self.selected_files: list[Path] = [] + self.worker: ProcessingWorker | None = None - self.widgets: Dict[str, QWidget] = {} + self.widgets: dict[str, QWidget] = {} self.fs_model: QFileSystemModel self.tree: QTreeView @@ -122,9 +127,7 @@ def init_ui(self) -> None: selection_model = self.tree.selectionModel() if selection_model: - selection_model.selectionChanged.connect( - self.on_selection_changed - ) + selection_model.selectionChanged.connect(self.on_selection_changed) self.file_list = QListWidget() @@ -167,7 +170,7 @@ def load_settings(self) -> ProcessingSettings: # --------------------- def build_settings_grid(self) -> None: - normal_settings: List[Tuple[str, QWidget]] = [ + normal_settings: list[tuple[str, QWidget]] = [ ("Threshold", self.make_threshold()), ("Max Iterations", self.make_max_iterations()), ("Normalize", self.make_normalize()), @@ -261,7 +264,7 @@ def on_selection_changed(self, *_: object) -> None: if selection_model is None: return indexes = selection_model.selectedIndexes() - seen: Set[Path] = set() + seen: set[Path] = set() for index in indexes: if index.column() != 0: @@ -316,7 +319,7 @@ def process(self) -> None: # Worker callbacks # --------------------- - def find_item(self, path: Path) -> Optional[QListWidgetItem]: + 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: @@ -350,6 +353,8 @@ def on_all_done(self) -> None: if __name__ == "__main__": app = QApplication(sys.argv) - window = MainWindow(settings_columns=2, settings_path="/Users/akz63626/Documents/settings.json") + window = MainWindow( + settings_columns=2, settings_path="/Users/akz63626/Documents/settings.json" + ) window.show() sys.exit(app.exec_()) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 0dd1843..fb8b5c9 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -1,12 +1,13 @@ +import tomllib +from collections.abc import Collection from pathlib import Path -from pydantic import BaseModel +from typing import Literal + import numpy as np -from h5py import File as h5pyFile -import tomllib import yaml -from typing import Literal +from h5py import Dataset, File +from pydantic import BaseModel -from xrpd_toolbox.gui.bad_pixel_gui import DATASET_PATH class MythenReductionSettings(BaseModel): active_modules: list[int] @@ -25,14 +26,12 @@ class MythenReductionSettings(BaseModel): angcal_filepath: str | Path @classmethod - def load_from_toml(cls, file_path: str | Path) -> MythenReductionSettings: - + def load_from_toml(cls, file_path: str | Path): settings_dict = tomllib.load(open(file_path, "rb")) return cls(**settings_dict) - - @classmethod - def load_from_yaml(cls, file_path: str | Path) -> MythenReductionSettings: + @classmethod + def load_from_yaml(cls, file_path: str | Path): settings_dict = yaml.safe_load(open(file_path, "rb")) return cls(**settings_dict) @@ -51,45 +50,52 @@ def save_to_yaml(self, file_path: str | Path) -> None: explicit_start=True, ) -DATASET_PATH = "/entry/mythen_nx/data" -MODULE_COUNT = 28 -MODULE_SIZE = 1280 -UNDO_LIMIT = 10 -COUNTER = 0 class MythenDataLoader: - def __init__(self, file_path: str | Path, n_modules: int = 28, counter: int = 0): + def __init__( + self, + file_path: str | Path, + active_modules: Collection[int] = tuple(range(28)), + counter: int = 0, + ): self.file_path = Path(file_path) - self.n_modules = n_modules + self.active_modules = active_modules self.counter = counter self.dataset_path = "/entry/mythen_nx/data" self.raw_data = self.load_data() - self.module_data = np.array_split(self.raw_data, self.n_modules, axis=-1) + self.module_data = np.array_split( + self.raw_data, len(self.active_modules), axis=-1 + ) + self.n_modules = len(self.module_data) def load_data(self) -> np.ndarray: - if not self.file_path.exists(): raise FileNotFoundError(self.file_path) - with h5pyFile(self.file_path, "r") as file: + with File(self.file_path, "r") as file: if self.dataset_path not in file: - raise ValueError(f"Dataset path {self.dataset_path} not found in HDF5 file.") + raise ValueError( + f"Dataset path {self.dataset_path} not found in HDF5 file." + ) data = file.get(self.dataset_path) - if data.ndim < 1: - raise ValueError("Dataset must have at least one dimension") + if (data is not None) and isinstance(data, Dataset): + if data.ndim < 1: + raise ValueError("Data has insufficient dimensions.") + data = data[..., self.counter] - data = data[..., self.counter] + return np.asarray(data) + else: + raise ValueError("Data is None.") - return data - def get_module_data(self, module_index: int) -> np.ndarray: - if module_index < 0 or module_index >= self.n_modules: + if module_index not in self.active_modules: raise IndexError("Module index out of range.") return self.module_data[module_index] + class MythenModule: def __init__(self, data, pixels_per_modules: int = 1280): self.pixels_per_modules = pixels_per_modules @@ -105,8 +111,9 @@ def __init__(self, modules_per_detector: int = 28): if __name__ == "__main__": - - settings = MythenReductionSettings.load_from_toml("/Users/akz63626/projects/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml") + settings = MythenReductionSettings.load_from_toml( + "/Users/akz63626/projects/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml" + ) print("Loaded settings:", settings) diff --git a/src/xrpd_toolbox/i11/mythen3reduction.py b/src/xrpd_toolbox/i11/mythen3reduction.py deleted file mode 100755 index 6c1e97b..0000000 --- a/src/xrpd_toolbox/i11/mythen3reduction.py +++ /dev/null @@ -1,1902 +0,0 @@ -#!/dls_sw/apps/python/miniforge/4.10.0-0/envs/python3.11/bin/python -import numpy as np -np.seterr(divide='ignore', invalid='ignore') #dividing by zero throws a warning, this is expected due to some pixels being dead -import argparse, os, sys -from pandas import DataFrame, concat -from h5py import File as h5pyFile -from shutil import copy2, copy -from itertools import product -from tomllib import load -import matplotlib.pyplot as plt -from pathlib import Path -from datetime import datetime -import json -# from collections import OrderedDict add this later for module angular cal - - -try: - from epics import caget - epics_available = True - sys.path.append("/dls_sw/apps/daq-messenger") - from daqmessenger import DaqMessenger #type: ignore -except Exception as e: - epics_available = False - -import pandas as pd -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) - -def NormalizeTo(data: np.ndarray, minval: int = 0): - - """ - minval isn't the minimum value that will come out of the processed array, what the scale of normlisation is on - """ - - return (data - minval) / (np.max(data) - minval) - -def paired_modules(modules=None): - """ - 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. - """ - - if modules is None: - 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((m, pair)) - - pairs = np.array(pairs) - - return pairs - -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 calc_intial_module_conv(modules, conv = 6.5e-05): - - module_conv_dict = {} - - for mod in modules: - - if mod > 13: - module_conv_dict[mod] = -conv - else: - module_conv_dict[mod] = conv - - return module_conv_dict - - -class AnalysisLogger(): - def __init__(self, log_filepath, logging=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=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 I11_reduction(): - - __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', '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) -> tuple[dict, float | None]: - - """ - - 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, module_cal["offset"], module_cal["conv"], module_cal["centre"] = \ - int(elements[1]), float(elements[3]), float(elements[5]), float(elements[7]) - - # if module_in_file != active_mod: - # self.logger.log("Angular calibration specified in config.toml, doesn't agree with module specified in .off file. Is this what you want?") - - module_angular_cal[active_mod] = module_cal - - return module_angular_cal, beamline_offset - - - # def read_angular_cal_json(self, filepath): - # with open(filepath) as f: - # ang_cal_load = json.load(f) - - # print(ang_cal_load) - - # beamline_offset = ang_cal_load["beamline_offset"] - - # quit() - - - - # 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): - """ - 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 = I11_reduction.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 = I11_reduction.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_conversions = module_pixel_number-self.module_angular_cal[n_mod]["centre"] - # # module_conversions = module_pixel_number-self.module_angular_cal[n_mod]["centre"] - - # module_conversions = module_conversions*self.module_angular_cal[n_mod]["conv"] - # module_conversions = np.arctan(module_conversions) - # raw_tth = self.module_angular_cal[n_mod]["offset"]+np.rad2deg(module_conversions)+self.beamline_offset - - module_raw_tth[n_mod] = raw_tth #this is raw because it doesn't take into account the angular delta of the detector - - 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] = I11_reduction.load_int_array_from_file(badchan_file) - self.logger.log(f"Module: {active_mod} badchan_file | Bad Chans: {len(bad_channels[active_mod])}") - - 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 n,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: - 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.logger.log(f"\nData file keys and shape: {entry["mythen_nx"].keys()} {entry["mythen_nx"]["data"]}") - # self.logger.log("Data shape: [(frames), (data), (counter)]") - - 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: - try: - self.Ie = entry["mythen_nx"]["Ie"][()] - except: - pass - - - self.Ic4 = np.full(self.n_frames,1) - try: - self.Ic4 = entry["Ic4"]["data"][()] - except: - try: - self.Ic4 = entry["mythen_nx"]["Ic4"][()] - except: - 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: - entry = file["entry1"] - - - normalised_beam_intensity = self.beam_intensity / np.median(self.beam_intensity) - - if (frame != None) and (sum_frames == 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 == None) and (sum_frames == 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 == None) and (sum_frames == False): - # 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}") - - 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: - - 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 = I11_reduction.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 - - - @staticmethod - def load_int_array_from_file(filepath: str) -> np.ndarray: - - """ - File format is just a list of integers in a text file, one integer per line. - - """ - - if not os.path.exists(filepath): - return np.array([]) - - elif (os.path.getsize(filepath) == 0): - return np.array([]) - - - return np.loadtxt(filepath, dtype=np.int64, comments="#", usecols=0, ndmin=1) - - - def save_nxs_outfile(self, reduced_nxs_filepath_out: str, xyedata: DataFrame, module_raw_data: DataFrame, frame_data: DataFrame, angular_corrected_data: 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) - - ##################################### - - 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: - - ################################## - #just save rings exactly as they were from the hdf5 file but split into ring 1 and 2 - ################################## - - 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] = ModuleDataAtDelta - - 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): - - 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]) - - ModuleDataAtDelta = DataFrame() - ModuleDataAtDelta["raw_tth"] = self.module_raw_tth[n_mod] - ModuleDataAtDelta["tth"] = ModuleDataAtDelta["raw_tth"].values+delta_pos - ModuleDataAtDelta["mod_channel"] = self.module_raw_tth["mod_channel"] #always 0-1280 for each module - ModuleDataAtDelta["det_channel"] = module_det_channels[n] - ModuleDataAtDelta["frame"] = n_frame - ModuleDataAtDelta["delta_pos"] = delta_pos - ModuleDataAtDelta["n_mod"] = n_mod - ModuleDataAtDelta["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]) - ModuleDataAtDelta["counts"] = self.apply_flatfield_correction(ModuleDataAtDelta["no_ff_corr"].values,self.flatfield_modules[n_mod]) - - # ModuleDataAtDelta["counts"] = self.apply_flatfield_correction(ModuleDataAtDelta["no_ff_corr"].values,self.flatfield_modules[n_mod]) - ModuleDataAtDelta["error"] = np.sqrt(ModuleDataAtDelta["counts"]) #poisson errors - - #if isinstance(self.bad_channels,dict) - # ModuleDataAtDelta["badchannel"] = ( (ModuleDataAtDelta['counts'] == 0) \ - # | (ModuleDataAtDelta["mod_channel"].isin(self.bad_channels[n_mod])) \ - # | (ModuleDataAtDelta["mod_channel"].isin(start_bad_chans)) \ - # | (ModuleDataAtDelta["mod_channel"].isin(end_bad_chans)) ) old way - - #if isinstance(self.bad_channels,np.ndarray): - - - ModuleDataAtDelta["badchannel"] = ( (ModuleDataAtDelta["det_channel"].isin(self.bad_channels)) \ - | (ModuleDataAtDelta["mod_channel"].isin(start_bad_chans)) \ - | (ModuleDataAtDelta["mod_channel"].isin(end_bad_chans)) ) #new way - - self.all_module_data[n_frame][n_mod] = ModuleDataAtDelta - - - - - # plt.plot(ModuleDataAtDelta["tth"],ModuleDataAtDelta["counts"]) - # plt.plot(ModuleDataAtDelta["tth"],ModuleDataAtDelta["no_ff_corr"]) - # plt.show() - - - return self.all_module_data - - def remove_bad_channels_modules_frames(self) -> 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)\ - & (~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) -> 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 = DataFrame() - - for n_mod,n_frame in product(self.active_modules,self.frames_range): - - angular_corrected_data_unmasked = 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!!!!') - self.logger.log("Modules will be determined from mythen3 config") - self.active_modules = I11_reduction.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}") - 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 light (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 - - @staticmethod - def convert_tth_to_Q(tth: np.ndarray, wavelength: float) -> np.ndarray: - - """ - - Converts a 2th angle to Q using the wavelength. Simple - - https://www.ill.eu/fileadmin/user_upload/ILL/3_Users/Support_labs_infrastructure/Software-tools/DIF_tools/neutrons.html - - """ - - pi = 3.141592653589 - Q_space = (4*pi/wavelength)* np.sin(np.deg2rad(tth)/2) - - return Q_space - - - def bin_and_propagate_errors(self, x: np.ndarray, y: np.ndarray ,e: np.ndarray, error_calc: str ='best') -> 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 a bin with a single 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 in a bin as a result of missing module - - - 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 == 'internal': - errors = prop_errors - elif (error_calc == 'external'): - errors = std_errors - elif error_calc == 'best': - errors = np.where(prop_errors > std_errors, prop_errors, std_errors) - - - return bin_centres, bin_edges, mean_counts, errors - - - - def bin_data(self, angular_corrected_data: DataFrame, error_calc: str) -> 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"].to_numpy(), - angular_corrected_data["counts"].to_numpy(), - angular_corrected_data["error"].to_numpy(), error_calc) - - xyedata = 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 = I11_reduction.convert_tth_to_Q(xyedata["tth"].to_numpy(), self.wavelength) - xyedata["Q"] = Q_space - - return xyedata - - def save_xye(self, xye_filepath_out: str, xyedata: 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].to_numpy(), xyedata["counts"].to_numpy(), xyedata["error"].to_numpy()), 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 == None: - self.flatfield_filepath = self.config["flatfield_filepath"] - - if self.apply_flatfield == None: - self.apply_flatfield = self.config["apply_flatfield"] - - if self.active_modules == None: - self.active_modules = self.config["active_modules"] - self.active_modules.sort() - - if self.bad_modules == 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 == 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 == None: - self.angcal_filepath = self.config["angcal_filepath"] - - if self.data_reduction_mode == 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 bin_frames_and_save(self): - - # for n_frame in self.frames_range: - - # frame_angular_corrected_data = self.frame_data[n_frame] - # xye_frame_out = self.bin_data(frame_angular_corrected_data) - # self.save_xye(self.xye_filepath_out.replace(".xye",f"_frame_{n_frame}.xye"), xye_frame_out, "tth") - - - 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): - - # rebinned_tth, tth_bin_edges, rebinned_counts, errors = self.bin_and_propagate_errors(self.angular_corrected_data["tth"].values, - # self.angular_corrected_data["counts"].values, - # self.angular_corrected_data["error"].values,'internal') - 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"].to_numpy(),new_rebin) - - sums, bin_edges = np.histogram(self.angular_corrected_data["tth"].to_numpy(), bins=bin_edges, weights=self.angular_corrected_data["counts"].to_numpy()) - counts = np.histogram(self.angular_corrected_data["tth"].to_numpy(), 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"].to_numpy()))*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 == True: - plt.close() - - def plot_modules_by_ring(self, mask=[], block=True): - - plt.figure(figsize=(10,4)) - - 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) - - - plt.ylabel("Ring number") - plt.yticks([0,1]) - plt.xlabel("Angle (tth)") - plt.show(block=block) - if block == True: - plt.close() - - - def plot_by(self, parameters=[], x="tth", at_a_time=False): - - 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): - print(x,y) - - for x,y in zip(ring_2_angles.keys(), ring2_steps): - 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"].to_numpy(): - 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 == 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_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.plot(mod_data["tth"], mod_data["counts"],label=str(n_mod)) - plt.text(np.mean(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 == 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"].to_numpy(),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"].to_numpy(), 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"].to_numpy() - high_channels = high_data_points["det_channel"].to_numpy() - - 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"].to_numpy() - - 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 debug_reduction(self): - - # self.logger.log('Saving debug nxs...') - - # unmasked_frame_data, unmasked_module_raw_data = self.split_data(unmasked=True) #if this is done after remove bad channels and modules - # unmasked_xyedata = self.bin_data(self.angular_corrected_data_unmasked,error_calc=self.error_calc) - # debug_reduced_nxs_filepath_out = self.reduced_nxs_filepath_out.replace('.nxs','_debug.nxs') - # self.save_nxs_outfile(debug_reduced_nxs_filepath_out, unmasked_xyedata, unmasked_module_raw_data, unmasked_frame_data, self.angular_corrected_data_unmasked, debug=True) - - # def ffcorr_calc(self, wholedetector_raw_frames): - - # flipped_data = np.zeros_like(wholedetector_raw_frames) - - # for exp,frame_data in enumerate(wholedetector_raw_frames): - - # frame_mod_data = np.array_split(frame_data, len(self.active_modules)) - - # for n,n_mod in enumerate(self.active_modules): - - - # if (n_mod <= 13): - # pos = 13-n_mod - # ffcorr = frame_mod_data[n] - - # else: - # pos = n_mod - # ffcorr = np.flip(frame_mod_data[n],axis=0) - - # start = (pos)*self.STRIPS_PER_MODULE - # stop = ((pos+1)*self.STRIPS_PER_MODULE) - - # self.logger.log(len(ffcorr)) - # self.logger.log(exp) - # self.logger.log(start,stop) - - # self.logger.log(np.shape(flipped_data)) - - # self.logger.log("\n") - - # flipped_data[exp,start:stop] = ffcorr - - # return flipped_data - - - 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: - # self.logger.log(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]}") - 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 - - # beam_normalised_flatfield = beam_normalised_flatfield - np.amin(beam_normalised_flatfield) - 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 - # new_flatfield[count_throw_index] = (new_flatfield[count_throw_index-1]+new_flatfield[count_throw_index+1])/2 - - 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: - dset = 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 = DaqMessenger("i11-control") - daq.connect() - # self.logger.log(f"sending {self.reduced_nxs_filepath_out}, stomp is old? {daq.old_stomp}") - 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, - 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 not os.path.exists(self.filepath): - self.logger.log("NXS file does not exist") - quit() - - if self.bad_frames == None: - self.bad_frames = [] #frames that should be removed, because they are bad for whatever reason - - - if self.out_directory != 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")) - 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() - - output_data_modules = set(self.active_modules).difference(set(self.bad_modules)) - self.logger.log("Modules in output data:",output_data_modules) - - if self.beam_energy: - self.wavelength = I11_reduction.calculate_wavelength(self.beam_energy) - self.logger.log(f"Beam Energy: {self.beam_energy} (keV) | Wavelength = {self.wavelength:.3f} (Angstrom)\n") - - - # self.bad_channels = self.generate_badchannel_dict() - self.bad_channels = I11_reduction.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}") - - # if self.angcal_filepath.endswith(".json"): - # self.module_angular_cal, self.beamline_offset = self.read_angular_cal_json(self.angcal_filepath) - # else: - self.module_angular_cal, self.beamline_offset = I11_reduction.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 = I11_reduction.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?", required=False - ) - - args = parser.parse_args() - - - import time - start = time.time() - Analysis = I11_reduction(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/uv.lock b/uv.lock index dd318dd..d728086 100644 --- a/uv.lock +++ b/uv.lock @@ -1472,6 +1472,119 @@ 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 = "pyqt5" +version = "5.15.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyqt5-qt5" }, + { name = "pyqt5-sip" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/07/c9ed0bd428df6f87183fca565a79fee19fa7c88c7f00a7f011ab4379e77a/PyQt5-5.15.11.tar.gz", hash = "sha256:fda45743ebb4a27b4b1a51c6d8ef455c4c1b5d610c90d2934c7802b5c1557c52", size = 3216775, upload-time = "2024-07-19T08:39:57.756Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/64/42ec1b0bd72d87f87bde6ceb6869f444d91a2d601f2e67cd05febc0346a1/PyQt5-5.15.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8b03dd9380bb13c804f0bdb0f4956067f281785b5e12303d529f0462f9afdc2", size = 6579776, upload-time = "2024-07-19T08:39:19.775Z" }, + { url = "https://files.pythonhosted.org/packages/49/f5/3fb696f4683ea45d68b7e77302eff173493ac81e43d63adb60fa760b9f91/PyQt5-5.15.11-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:6cd75628f6e732b1ffcfe709ab833a0716c0445d7aec8046a48d5843352becb6", size = 7016415, upload-time = "2024-07-19T08:39:32.977Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8c/4065950f9d013c4b2e588fe33cf04e564c2322842d84dbcbce5ba1dc28b0/PyQt5-5.15.11-cp38-abi3-manylinux_2_17_x86_64.whl", hash = "sha256:cd672a6738d1ae33ef7d9efa8e6cb0a1525ecf53ec86da80a9e1b6ec38c8d0f1", size = 8188103, upload-time = "2024-07-19T08:39:40.561Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/ae5a5b4f9b826b29ea4be841b2f2d951bcf5ae1d802f3732b145b57c5355/PyQt5-5.15.11-cp38-abi3-win32.whl", hash = "sha256:76be0322ceda5deecd1708a8d628e698089a1cea80d1a49d242a6d579a40babd", size = 5433308, upload-time = "2024-07-19T08:39:46.932Z" }, + { url = "https://files.pythonhosted.org/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl", hash = "sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517", size = 6865864, upload-time = "2024-07-19T08:39:53.572Z" }, +] + +[[package]] +name = "pyqt5-qt5" +version = "5.15.18" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/90/bf01ac2132400997a3474051dd680a583381ebf98b2f5d64d4e54138dc42/pyqt5_qt5-5.15.18-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:8bb997eb903afa9da3221a0c9e6eaa00413bbeb4394d5706118ad05375684767", size = 39715743, upload-time = "2025-11-09T12:56:42.936Z" }, + { url = "https://files.pythonhosted.org/packages/24/8e/76366484d9f9dbe28e3bdfc688183433a7b82e314216e9b14c89e5fab690/pyqt5_qt5-5.15.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c656af9c1e6aaa7f59bf3d8995f2fa09adbf6762b470ed284c31dca80d686a26", size = 36798484, upload-time = "2025-11-09T12:56:59.998Z" }, + { url = "https://files.pythonhosted.org/packages/9a/46/ffe177f99f897a59dc237a20059020427bd2d3853d713992b8081933ddfe/pyqt5_qt5-5.15.18-py3-none-manylinux2014_x86_64.whl", hash = "sha256:bf2457e6371969736b4f660a0c153258fa03dbc6a181348218e6f05421682af7", size = 60864590, upload-time = "2025-11-09T12:57:26.724Z" }, +] + +[[package]] +name = "pyqt5-sip" +version = "12.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/31/5ef342de9faee0f3801088946ae103db9b9eaeba3d6a64fefd5ce74df244/pyqt5_sip-12.18.0.tar.gz", hash = "sha256:71c37db75a0664325de149f43e2a712ec5fa1f90429a21dafbca005cb6767f94", size = 104143, upload-time = "2026-01-13T15:53:19.576Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/59/3dd29bcfde479ac241f618235bf7d76e65e47afdcd91743554d490ae0d19/pyqt5_sip-12.18.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13c32e9025d0ab5fe960ef64dcb4c6f7ec26156ddce2cf2f195600aa26e8f9fe", size = 122724, upload-time = "2026-01-13T15:52:49.875Z" }, + { url = "https://files.pythonhosted.org/packages/87/c4/ac4deee3249d3ceb703103acbbf76d89f3782fa7ad2ca5a15fcb5bcf5c73/pyqt5_sip-12.18.0-cp311-cp311-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dd855149c724634eb1f92d10e04e1be0751068a8521d5f9f06e5c2dbe32fd89f", size = 327560, upload-time = "2026-01-13T15:52:53.584Z" }, + { url = "https://files.pythonhosted.org/packages/79/53/64373ba9311288b0ea6b5ab375d9c9743a41ac93df7137655498c95a08e5/pyqt5_sip-12.18.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:521729e4ce44db555005f4e6987c4a5164d45ea03f5a7d08519813d4776acd15", size = 277067, upload-time = "2026-01-13T15:52:51.22Z" }, + { url = "https://files.pythonhosted.org/packages/ce/dd/4026bba8355ceaba222db0369fe4a480d55aa61d3f14dbe1458886ccc032/pyqt5_sip-12.18.0-cp311-cp311-win32.whl", hash = "sha256:c738949863d88b78f86f28e13151989ca3b1a302934811af41856dc8a27838bd", size = 49323, upload-time = "2026-01-13T15:52:55.859Z" }, + { url = "https://files.pythonhosted.org/packages/41/35/39e549ca7f7c9fbb025912a5db7f55f3b9c22d7f9718f41c2e7a17c806e9/pyqt5_sip-12.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac0be1a8ce145ed78c7e8d45243749405bee7e3a87e9810b0542bca010c50bd7", size = 58795, upload-time = "2026-01-13T15:52:54.995Z" }, + { url = "https://files.pythonhosted.org/packages/2a/61/6d78d702016ac23d2b97634a3b6a831c3f7735f0552a1c8b058db96005d1/pyqt5_sip-12.18.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b29e4cda24748e59e5bd1bdad4812091a86b4b5b08c38b7f781eb55a5166f2b7", size = 124614, upload-time = "2026-01-13T15:52:57.59Z" }, + { url = "https://files.pythonhosted.org/packages/19/bf/8f3efa10ddd3e76c1253865340ab7c2960ef96681d732b1f666c77430612/pyqt5_sip-12.18.0-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:163c2bba5e637c2222ec17d82a2c5aa158184a191923eb7d137cf4cfa0399529", size = 339412, upload-time = "2026-01-13T15:53:00.563Z" }, + { url = "https://files.pythonhosted.org/packages/72/48/f1bcf6729d01bae6729cd790b22fd579dbe34014e8be031e6f10c5b9b2aa/pyqt5_sip-12.18.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ead5e0a64ad852ac60797989d8444a6a5bd834768536b04a07b40b2937d922f6", size = 282376, upload-time = "2026-01-13T15:52:59.172Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b7/d84c764ac9f1366be561255ec9bd88ee224fefdbdb349aee250f3003f0ca/pyqt5_sip-12.18.0-cp312-cp312-win32.whl", hash = "sha256:993fe3ed9a62a92e770f32d5344e3df56c2cacf1471f01b7feaf04818a2df1c4", size = 49523, upload-time = "2026-01-13T15:53:03.068Z" }, + { url = "https://files.pythonhosted.org/packages/ab/e7/ef87178d5afa5f63be38556dc0df8af89f9bf74f2555f4dab6824c0fd150/pyqt5_sip-12.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:9b689e02e400abd1ce0a30cd6eae8eceabcf1bbba0395cb5c86e64ba74351d68", size = 58001, upload-time = "2026-01-13T15:53:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/79/67/8d43d0fea10ff48ddecc8534aead8b855dc80df80653b8b1bf9e1f993063/pyqt5_sip-12.18.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9254e5dd7676b76503ba20edcc919e7ac4a97b6c70a6fb2f9dba9e13b4c60509", size = 124605, upload-time = "2026-01-13T15:53:04.991Z" }, + { url = "https://files.pythonhosted.org/packages/48/2a/b08bc8efeb49c50c6cdac11417dc2c8eaefcac2f0a6382eae7b26dc0f232/pyqt5_sip-12.18.0-cp313-cp313-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c969631ada7293a81e1012b2264a62d69a91995b517586489dfe24421b87b9af", size = 339918, upload-time = "2026-01-13T15:53:08.502Z" }, + { url = "https://files.pythonhosted.org/packages/b6/99/24f82437b2f073cf39296b7c731b6a8bc0f5207911fdd93841a0ea9abe42/pyqt5_sip-12.18.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d84ac384a63285132e67762c87681191c25e28a1df7560287ec3889d9eb223b5", size = 282088, upload-time = "2026-01-13T15:53:06.632Z" }, + { url = "https://files.pythonhosted.org/packages/3e/27/20d3924943df34361fae9c6a0489ae89d0b07571693245c61678d185e4a4/pyqt5_sip-12.18.0-cp313-cp313-win32.whl", hash = "sha256:95bba4670ecf5cba73958b85aa2087c17838a402ed251c38e68060c7665c998b", size = 49501, upload-time = "2026-01-13T15:53:11.159Z" }, + { url = "https://files.pythonhosted.org/packages/3f/36/e251623c12968730730512a9e5150430e36246afbe64894610190b896f61/pyqt5_sip-12.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:aac4adc37df2f2ac1dc259409be1900f07332d140a12c9db7c84112cef64ff59", size = 58076, upload-time = "2026-01-13T15:53:09.928Z" }, + { url = "https://files.pythonhosted.org/packages/37/3a/b46a0116b1aacbb6156b2957eb5cb928c94b49f4626eb2540ca8d16ee757/pyqt5_sip-12.18.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8372ec8704bfd5e09942d0d055a1657eb4f702f4b30847a5e59df0496f99d67f", size = 124594, upload-time = "2026-01-13T15:53:13.159Z" }, + { url = "https://files.pythonhosted.org/packages/58/63/df3037f11391c25c5b0ab233d22e58b8f056cb1ce16d7ecadb844421ce75/pyqt5_sip-12.18.0-cp314-cp314-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fdb45c7cd2af7eccd7370b994d432bfc7965079f845392760724f26771bb59dc", size = 339056, upload-time = "2026-01-13T15:53:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e7/4f96b84520b8f8b7502682fd43f68f63ca6572b5858f56e5f61c76a54fe2/pyqt5_sip-12.18.0-cp314-cp314-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:92abe984becbde768954d6d0951f56d80a9868d2fd9e738e61fc944f0ff83dd6", size = 282439, upload-time = "2026-01-13T15:53:14.856Z" }, + { url = "https://files.pythonhosted.org/packages/79/8e/ccdf20d373ceba83e1d1b7f818505c375208ffde4a96376dc7dbe592406c/pyqt5_sip-12.18.0-cp314-cp314-win32.whl", hash = "sha256:bd9e3c6f81346f1b08d6db02305cdee20c009b43aa083d44ee2de47a7da0e123", size = 50713, upload-time = "2026-01-13T15:53:18.634Z" }, + { url = "https://files.pythonhosted.org/packages/7f/21/8486ed45977be615ec5371b24b47298b1cb0e1a455b419eddd0215078dba/pyqt5_sip-12.18.0-cp314-cp314-win_amd64.whl", hash = "sha256:6d948f1be619c645cd3bda54952bfdc1aef7c79242dccea6a6858748e61114b9", size = 59622, upload-time = "2026-01-13T15:53:17.714Z" }, +] + +[[package]] +name = "pyqt6" +version = "6.10.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyqt6-qt6" }, + { name = "pyqt6-sip" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/03/e756f52e8b0d7bb5527baf8c46d59af0746391943bdb8655acba22ee4168/pyqt6-6.10.2.tar.gz", hash = "sha256:6c0db5d8cbb9a3e7e2b5b51d0ff3f283121fa27b864db6d2f35b663c9be5cc83", size = 1085573, upload-time = "2026-01-08T16:40:00.244Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/3f/f073a980969aa485ef288eb2e3b94c223ba9c7ac9941543f19b51659b98d/pyqt6-6.10.2-cp39-abi3-macosx_10_14_universal2.whl", hash = "sha256:37ae7c1183fe4dd0c6aefd2006a35731245de1cb6f817bb9e414a3e4848dfd6d", size = 60244482, upload-time = "2026-01-08T16:38:50.837Z" }, + { url = "https://files.pythonhosted.org/packages/ec/3e/9a015651ec71cea2e2f960c37edeb21623ba96a74956c0827def837f7c6b/pyqt6-6.10.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:78e1b3d5763e4cbc84485aef600e0aba5e1932fd263b716f92cd1a40dfa5e924", size = 37899440, upload-time = "2026-01-08T16:39:09.027Z" }, + { url = "https://files.pythonhosted.org/packages/51/74/a88fec2b99700270ca5d7dc7d650236a4990ed6fc88e055ca0fc8a339ee3/pyqt6-6.10.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:bbc3af541bbecd27301bfe69fe445aa1611a9b490bd3de77306b12df632f7ec6", size = 40748467, upload-time = "2026-01-08T16:39:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/75/34/be7a55529607b21db00a49ca53cb07c3092d2a5a95ea19bb95cfa0346904/pyqt6-6.10.2-cp39-abi3-win_amd64.whl", hash = "sha256:bd328cb70bc382c48861cd5f0a11b2b8ae6f5692d5a2d6679ba52785dced327b", size = 26015391, upload-time = "2026-01-08T16:39:42.946Z" }, + { url = "https://files.pythonhosted.org/packages/af/de/d9c88f976602b7884fec4ad54a4575d48e23e4f390e5357ea83917358846/pyqt6-6.10.2-cp39-abi3-win_arm64.whl", hash = "sha256:7901ba1df024b7ee9fdacfb2b7661aeb3749ae8b0bef65428077de3e0450eabb", size = 26208415, upload-time = "2026-01-08T16:39:57.751Z" }, +] + +[[package]] +name = "pyqt6-qt6" +version = "6.10.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/1b/137184632cad83a210e7955226744a77945260ca2e75892fe36299d26ada/pyqt6_qt6-6.10.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:4bb2798a95f624b462b70c4f185422235b714b01e55abab32af1740f147948e2", size = 68472463, upload-time = "2025-11-27T14:20:51.694Z" }, + { url = "https://files.pythonhosted.org/packages/af/df/ca795ac3d04243ad63499cfedcf92d8b5f6e3585a2a26c09f34cb58c8e44/pyqt6_qt6-6.10.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0921cc522512cb40dbab673806bc1676924819550e0aec8e3f3fe6907387c5b7", size = 62296168, upload-time = "2025-11-27T14:21:21.232Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/9867361252e2a4717dba95c64a0f3a793603f4a52cb9a46abbb041e960f5/pyqt6_qt6-6.10.1-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:04069aea421703b1269c8a1bcf017e36463af284a044239a4ebda3bde0a629fb", size = 83829262, upload-time = "2025-11-27T14:22:00.399Z" }, + { url = "https://files.pythonhosted.org/packages/9b/7b/18f4eb2273a92283fe4d87aa740a400eb14a4e41b8f990aaf563e9767db6/pyqt6_qt6-6.10.1-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:5b9be39e0120e32d0b42cdb844e3ae110ddadd39629c991e511902c06f155aff", size = 82877396, upload-time = "2025-11-27T14:22:36.994Z" }, + { url = "https://files.pythonhosted.org/packages/53/5c/648c515d57bc82909d0597befb03bbc2f7a570f323dba3ad38629669efcb/pyqt6_qt6-6.10.1-py3-none-win_amd64.whl", hash = "sha256:df564d3dc2863b1fde22b39bea9f56ceb2a3ed7d6f0b76d3f96c2d3bc5d71516", size = 76670151, upload-time = "2025-11-27T14:23:11.172Z" }, + { url = "https://files.pythonhosted.org/packages/0a/13/2d2a9c0559bfa53effea5e2c1ed7aebb430186ce0b64cfba235231a049d9/pyqt6_qt6-6.10.1-py3-none-win_arm64.whl", hash = "sha256:48282e0f99682daf4f1e220cfe9f41255e003af38f7728a30d40c76e55c89816", size = 58276316, upload-time = "2025-11-27T14:23:38.744Z" }, +] + +[[package]] +name = "pyqt6-sip" +version = "13.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/7d/d2916048e2e3960f68cb4e93907639844f7b8ff95897dcc98553776ccdfc/pyqt6_sip-13.11.0.tar.gz", hash = "sha256:d463af37738bda1856c9ef513e5620a37b7a005e9d589c986c3304db4a8a14d3", size = 92509, upload-time = "2026-01-13T16:01:32.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/41/1c2097aad646f7ef6be9cfd2fd4814ad6bbdba7d53a622ad56e00f88dc72/pyqt6_sip-13.11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e329ccc3a6502e2b774ef62ab843ac8b3f32191324e8230e6dde78c1c0df5a8", size = 110804, upload-time = "2026-01-13T16:01:02.527Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d3/51143a254a7c9e9650c3eedfc35b967cdcd180a289c6fa2a937c57fe405a/pyqt6_sip-13.11.0-cp311-cp311-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:364424dacdee9e0a2a723646b5608139629ad9bde318dd755d86f5e0ba123c79", size = 291442, upload-time = "2026-01-13T16:01:05.424Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5c/d62e0ded4fdd5abf6a3085a65aa229c863b334758555af1f7b79af9bc003/pyqt6_sip-13.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:132ee69d935c14bb4ced2a811ef333200c7aa50324bd7caadefd7d5874495225", size = 317793, upload-time = "2026-01-13T16:01:04.183Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d4/34f3fb522323a5336e31a51ab7ae3103ebc0c8e741bff9630f29480cdca2/pyqt6_sip-13.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:341e52e702d41872515794dea6265ee56b8625c9d3c74ea0468124f0bd675f8b", size = 54101, upload-time = "2026-01-13T16:01:06.504Z" }, + { url = "https://files.pythonhosted.org/packages/a9/a1/37109ec33ead4b9cc62294b48a1ba2b4899cb0d009eb1763d61e3a89ab21/pyqt6_sip-13.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:489fdd0910f8c1d5d40255b4cd7b45f4a4549f9a599512bc6b2cc8d384e28852", size = 48359, upload-time = "2026-01-13T16:01:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/53/a6/0e4d8fa7d6deb750bd0fdf89024e39c71fb127efb5eeedfab6830ad6679a/pyqt6_sip-13.11.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6b3267cd93b7f4da6fdf9a6a26f3baed8faae06e5cdd76235f2acc2116c40a54", size = 112367, upload-time = "2026-01-13T16:01:09.08Z" }, + { url = "https://files.pythonhosted.org/packages/66/e6/25dc20a03c46000e8b93aaf79347227926b67959283e5aab797daa7f64d8/pyqt6_sip-13.11.0-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c30248d9bbe54c46a78e5d549da50295ecd6584b965597f751e272f000fb8527", size = 301150, upload-time = "2026-01-13T16:01:12.385Z" }, + { url = "https://files.pythonhosted.org/packages/11/9f/e850cd350aade789660cafba38c00777e686040c06b8cd0b45339b80fcba/pyqt6_sip-13.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c367b53a91e575ef66c1375f899713bdaf0a8b2c64b95ac226e9644854a4984", size = 323303, upload-time = "2026-01-13T16:01:10.736Z" }, + { url = "https://files.pythonhosted.org/packages/77/26/5261d62108f7579407230f8c1d4dda43c18b5600ce70bf3becb2f997d5cc/pyqt6_sip-13.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:077958105c2ea2f62be2f1a7611ff8bd44cb52fb5ea8fc8c59ea949144acb7b5", size = 53461, upload-time = "2026-01-13T16:01:13.875Z" }, + { url = "https://files.pythonhosted.org/packages/46/80/6c88b97eda309d6babb7292200bf51165dc06d0204d891b7bf1fb17a8ed0/pyqt6_sip-13.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:52812471619d3d3750b940d7d124cd0954107656924921ac177e098ba36362fb", size = 48650, upload-time = "2026-01-13T16:01:14.897Z" }, + { url = "https://files.pythonhosted.org/packages/df/a0/46abcae4fce175a326185460a02c13ab81332bca7dd55c1e853ba6aee71e/pyqt6_sip-13.11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:929716eebde1a64ffdb6b1715db6a22aefd5634d6df84858c7deb5e85be84fdf", size = 112353, upload-time = "2026-01-13T16:01:16.152Z" }, + { url = "https://files.pythonhosted.org/packages/0e/38/27c3aa3f153fcd83a0765fedf8e44a1136f189a322bcc9c494c5b3793cd7/pyqt6_sip-13.11.0-cp313-cp313-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75144e8a0bcf9d1a9069011890401748af353749f1de1b6a314b880781edf9d", size = 301497, upload-time = "2026-01-13T16:01:20.531Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ac/1053ffce45e4174f0a8174557b88537aa82bf96ba03c7dd208c59de36f69/pyqt6_sip-13.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8082b5f57ffad5dddf5efcf0ef5eaf94841395aa4e7c374c79ef24cf49b0f0ce", size = 323498, upload-time = "2026-01-13T16:01:17.859Z" }, + { url = "https://files.pythonhosted.org/packages/40/d3/447b30d1f00cc50ad9e5c53b2e920068606b16857da83f8036b390c79fad/pyqt6_sip-13.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d49b5bf3d8d36cd7db93ddc54cd09dbba96a3fd926e445ef75499b41e47b5a3", size = 53469, upload-time = "2026-01-13T16:01:21.762Z" }, + { url = "https://files.pythonhosted.org/packages/92/67/77e6fafcabd01c0a11166ab7464509896f137929f82c4f2e03aea1bf41b3/pyqt6_sip-13.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:293eac1b53c66c54b03266cc30015ec77454af679043a4f188b9bb80a9656996", size = 48643, upload-time = "2026-01-13T16:01:22.669Z" }, + { url = "https://files.pythonhosted.org/packages/ff/28/a5178c8e005bafbf9c0fd507f45a3eef619ab582811414a0a461ee75994f/pyqt6_sip-13.11.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4dc9c4df24af0571423c3e85b5c008bad42ed48558eef80fbc3e5d30274c5abb", size = 112431, upload-time = "2026-01-13T16:01:23.832Z" }, + { url = "https://files.pythonhosted.org/packages/13/3c/02770b02b5a05779e26bd02c202c2fd32aa38e225d01f14c06908e33738c/pyqt6_sip-13.11.0-cp314-cp314-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c974d5a193f32e55e746e9b63138503163ac63500dbb1fd67233d8a8d71369bd", size = 301236, upload-time = "2026-01-13T16:01:28.733Z" }, + { url = "https://files.pythonhosted.org/packages/40/47/5af493a698cc520581ca1000b4ab09b8182992053ffe2478062dde5e4671/pyqt6_sip-13.11.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4284540ffccd8349763ddce3518264dde62f20556720d4061b9c895e09011ca0", size = 323919, upload-time = "2026-01-13T16:01:25.122Z" }, + { url = "https://files.pythonhosted.org/packages/b7/2d/64b26e21183a7ff180105871dd5983a8da539d8768921728268dc6d0a73d/pyqt6_sip-13.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:9bd81cb351640abc803ea2fe7262b5adea28615c9b96fd103d1b6f3459937211", size = 55078, upload-time = "2026-01-13T16:01:29.853Z" }, + { url = "https://files.pythonhosted.org/packages/7e/36/23f699fa8b1c3fcc312ecd12661a1df6057d92e16d4def2399b59cf7bf22/pyqt6_sip-13.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:cd95ec98f8edb15bcea832b8657809f69d758bc4151cc6fd7790c0181949e45f", size = 49465, upload-time = "2026-01-13T16:01:31.174Z" }, +] + [[package]] name = "pyright" version = "1.1.408" @@ -1946,6 +2059,9 @@ dependencies = [ { name = "peakutils" }, { name = "pycifrw" }, { name = "pyfai" }, + { name = "pyqt5" }, + { name = "pyqt6" }, + { name = "pyyaml" }, { name = "scipy" }, ] @@ -1971,6 +2087,9 @@ requires-dist = [ { name = "peakutils" }, { name = "pycifrw" }, { name = "pyfai" }, + { name = "pyqt5" }, + { name = "pyqt6" }, + { name = "pyyaml" }, { name = "scipy" }, ] From 26517b3abd6335be20afa080d07758f9e488a7a7 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 28 Jan 2026 20:27:23 +0000 Subject: [PATCH 04/86] fixed tests --- .vscode/settings.json | 1 + src/xrpd_toolbox/utils/utils.py | 95 ++++++++++++++++++++++----------- tests/test_utils.py | 12 +++-- 3 files changed, 74 insertions(+), 34 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 101c75f..bf55204 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": { diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index c3c001b..d923c8e 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -1,5 +1,5 @@ import os -from _collections_abc import Iterable +from collections.abc import Iterable import numpy as np @@ -15,15 +15,18 @@ def normalise_to(data: Iterable[float | int], minval: float | int = 0) -> np.nda return (data_array - minval) / (np.amax(data_array) - minval) + def normalise(data) -> np.ndarray: return (data - np.min(data)) / (np.max(data) - np.min(data)) def gaussian(x, amp, cen, fwhm, background) -> np.ndarray: + # "1-d gaussian: gaussian(x, amp, cen, fwhm)" - #"1-d gaussian: gaussian(x, amp, cen, fwhm)" + return (amp / (np.sqrt(2 * np.pi) * fwhm)) * np.exp( + -((x - cen) ** 2) / (2 * fwhm**2) + ) + background - return (amp/(np.sqrt(2*np.pi)*fwhm)) * np.exp(-(x-cen)**2 /(2*fwhm**2))+background def load_int_array_from_file(filepath: str) -> np.ndarray: """ @@ -42,71 +45,101 @@ def load_int_array_from_file(filepath: str) -> np.ndarray: else: return np.loadtxt(filepath, dtype=np.int64, comments="#", usecols=0, ndmin=1) -def create_bins(tth_values: np.ndarray, rebin_step) -> tuple[np.ndarray, np.ndarray]: +def create_bins( + tth_values: np.ndarray, rebin_step: float | int = 0.004 +) -> tuple[np.ndarray, 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...). + 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...). """ + rebin_step = float(rebin_step) 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 = 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]) + rebin_start = start - (rebin_step / 2) + rebin_stop = stop + rebin_step + (rebin_step / 2) - return bin_centres, bin_edges + bin_edges = np.arange( + rebin_start, + rebin_stop, + float(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(x: np.ndarray, y: np.ndarray ,e: np.ndarray, rebin_step: float = 0.004, error_calc: str ='best', sum_counts: bool = False) -> tuple[np.ndarray, np.ndarray, np.ndarray]: +def bin_and_propagate_errors( + x: np.ndarray, + y: np.ndarray, + e: np.ndarray, + rebin_step: float | int = 0.004, + error_calc: str = "best", + sum_counts: bool = False, +) -> tuple[np.ndarray, np.ndarray, 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 + The bin centres and edges are calculated and used to bin the data. + Binning of the data is done used searchsorted == np.digitize. - 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. + 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 - 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 + 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 = create_bins(x, 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]-(rebin_step/10000) #I think it would be better to move it inside bin edge, and include, rather than remove all together or create a bin with a single value + 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] - ( + rebin_step / 10000 + ) # I think it would be better to move it inside bin edge, and include, rather + # than remove all together or create a bin with a single value sums, bin_edges = np.histogram(x, bins=bin_edges, weights=y) counts = np.histogram(x, bins=bin_edges)[0] - + if sum_counts: - binned_counts = sums #this will throw a warning if there are missing counts in a bin as a result of missing module + binned_counts = sums else: - binned_counts = sums / counts #this will throw a warning if there are missing counts in a bin as a result of missing module + binned_counts = ( + sums / counts + ) # throws a warning if e missing counts in a bin as a result of missing module - 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 + 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(binned_counts, counts) - std_sums = np.histogram(x, bins=bin_edges, weights=(y-repeated_mean)**2)[0] - std_errors = np.sqrt(std_sums/counts) + repeated_mean = np.repeat(binned_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 == 'internal': + if error_calc == "internal": errors = prop_errors - elif (error_calc == 'external'): + elif error_calc == "external": errors = std_errors else: errors = np.where(prop_errors > std_errors, prop_errors, std_errors) - return bin_centres, binned_counts, errors diff --git a/tests/test_utils.py b/tests/test_utils.py index 8bc7057..e837029 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,9 +1,15 @@ import os import numpy as np +import scipy.integrate as integrate from xrpd_toolbox.utils.energy import beam_energy_to_wavelength, tth_to_q -from xrpd_toolbox.utils.utils import load_int_array_from_file, normalise_to, normalise, gaussian +from xrpd_toolbox.utils.utils import ( + gaussian, + load_int_array_from_file, + normalise, + normalise_to, +) def test_normalise_to(): @@ -17,12 +23,12 @@ def test_normalise(): assert np.amin(normalised_array) == 0.0 - def test_gaussian(): x = np.linspace(0, 10, 100) y = gaussian(x, amp=22.0, cen=5.0, fwhm=1.0, background=0.0) assert len(y) == len(x) - assert np.amax(y) == 22.0 + integral = integrate.simpson(y, x) + assert np.isclose(integral, 22.0, atol=0.5) def test_tth_to_q(): From 85ba9f229880216c4cbf0f97fb5749183bfe450f Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 28 Jan 2026 20:33:15 +0000 Subject: [PATCH 05/86] assert in settings test --- tests/test_mythen.py | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/tests/test_mythen.py b/tests/test_mythen.py index ac93c99..ed6b040 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -1,7 +1,9 @@ -from xrpd_toolbox.i11.mythen import MythenReductionSettings -import numpy as np -from xrpd_toolbox.utils.utils import gaussian, bin_and_propagate_errors import matplotlib.pyplot as plt +import numpy as np + +from xrpd_toolbox.i11.mythen import MythenReductionSettings +from xrpd_toolbox.utils.utils import bin_and_propagate_errors, gaussian + def test_mythen_settings(): settings = MythenReductionSettings( @@ -18,22 +20,26 @@ def test_mythen_settings(): error_calc="internal", data_reduction_mode=1, bad_channels_filepath="bad_channels.txt", - angcal_filepath="angcal.txt" + angcal_filepath="angcal.txt", ) - -def test_mythen_settings_load_from_toml(): - settings = MythenReductionSettings.load_from_toml("tests/test_data/mythen_settings.toml") + assert settings.apply_flatfield is True + assert settings.rebin_step == 2.0 +def test_mythen_settings_load_from_toml(): + settings = MythenReductionSettings.load_from_toml( + "tests/test_data/mythen_settings.toml" + ) + assert settings.apply_flatfield is True -def test_peak_averaging(): - x1 = np.arange(0,10,0.1) +def test_peak_averaging(): + x1 = np.arange(0, 10, 0.1) y1 = gaussian(x1, amp=10.0, cen=5.0, fwhm=1.0, background=0.0) e1 = np.sqrt(y1) - x2 = np.arange(0.01,10.01,0.1) + x2 = np.arange(0.01, 10.01, 0.1) y2 = gaussian(x2, amp=20.0, cen=5.0, fwhm=1.0, background=0.0) e2 = np.sqrt(y2) @@ -41,12 +47,15 @@ def test_peak_averaging(): y_combined = np.concatenate((y1, y2)) e_combined = np.concatenate((e1, e2)) - x, y, e = bin_and_propagate_errors(x_combined, y_combined, e_combined, rebin_step=0.1, error_calc='internal') + x, y, e = bin_and_propagate_errors( + x_combined, y_combined, e_combined, rebin_step=0.1, error_calc="internal" + ) - plt.errorbar(x1, y1, yerr=e1, fmt='o', label='Binned Data with Propagated Errors') - plt.errorbar(x2, y2, yerr=e2, fmt='o', label='Binned Data with Propagated Errors') - plt.errorbar(x-0.05, y, yerr=e, label='Binned Data with Propagated Errors') + plt.errorbar(x1, y1, yerr=e1, fmt="o", label="Binned Data with Propagated Errors") + plt.errorbar(x2, y2, yerr=e2, fmt="o", label="Binned Data with Propagated Errors") + plt.errorbar(x - 0.05, y, yerr=e, label="Binned Data with Propagated Errors") plt.show() + if __name__ == "__main__": test_peak_averaging() From 01d3db8dabc8eb35002ae950c81df2d86dcc1ffe Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 28 Jan 2026 21:07:45 +0000 Subject: [PATCH 06/86] added libs to dockerfile to make gui works --- Dockerfile | 6 +++++- src/xrpd_toolbox/utils/utils.py | 17 +++++++++-------- tests/test_mythen.py | 20 +++++++------------- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/Dockerfile b/Dockerfile index 78930b7..37ec064 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,11 @@ FROM ghcr.io/diamondlightsource/ubuntu-devcontainer:noble-20260113@sha256:d59c10 # 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 -y +RUN apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 -y + # The build stage installs the context into the venv FROM developer AS build diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index d923c8e..1e92585 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -117,23 +117,24 @@ def bin_and_propagate_errors( # than remove all together or create a bin with a single value sums, bin_edges = np.histogram(x, bins=bin_edges, weights=y) - counts = np.histogram(x, bins=bin_edges)[0] + occurances = np.histogram(x, bins=bin_edges)[0] + + # occurances = np.where(occurances != 0, occurances, 1) # avoid division by zero if sum_counts: binned_counts = sums else: binned_counts = ( - sums / counts + sums / occurances ) # throws a warning if e missing counts in a bin as a result of missing module - 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 + 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) / occurances - repeated_mean = np.repeat(binned_counts, counts) + repeated_mean = np.repeat(binned_counts, occurances) std_sums = np.histogram(x, bins=bin_edges, weights=(y - repeated_mean) ** 2)[0] - std_errors = np.sqrt(std_sums / counts) + std_errors = np.sqrt(std_sums / occurances) if error_calc == "internal": errors = prop_errors diff --git a/tests/test_mythen.py b/tests/test_mythen.py index ed6b040..f640c4c 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -1,4 +1,3 @@ -import matplotlib.pyplot as plt import numpy as np from xrpd_toolbox.i11.mythen import MythenReductionSettings @@ -34,28 +33,23 @@ def test_mythen_settings_load_from_toml(): assert settings.apply_flatfield is True -def test_peak_averaging(): +def test_peak_bin_and_propagate_errors(): x1 = np.arange(0, 10, 0.1) - y1 = gaussian(x1, amp=10.0, cen=5.0, fwhm=1.0, background=0.0) + y1 = gaussian(x1, amp=10.0, cen=5.0, fwhm=1.0, background=0.1) e1 = np.sqrt(y1) x2 = np.arange(0.01, 10.01, 0.1) - y2 = gaussian(x2, amp=20.0, cen=5.0, fwhm=1.0, background=0.0) + y2 = gaussian(x2, amp=20.0, cen=5.0, fwhm=1.0, background=0.1) e2 = np.sqrt(y2) x_combined = np.concatenate((x1, x2)) y_combined = np.concatenate((y1, y2)) e_combined = np.concatenate((e1, e2)) - x, y, e = bin_and_propagate_errors( + binned_x, binned_y, binned_e = bin_and_propagate_errors( x_combined, y_combined, e_combined, rebin_step=0.1, error_calc="internal" ) - plt.errorbar(x1, y1, yerr=e1, fmt="o", label="Binned Data with Propagated Errors") - plt.errorbar(x2, y2, yerr=e2, fmt="o", label="Binned Data with Propagated Errors") - plt.errorbar(x - 0.05, y, yerr=e, label="Binned Data with Propagated Errors") - plt.show() - - -if __name__ == "__main__": - test_peak_averaging() + assert len(binned_x) == len(binned_y) == len(binned_e) + assert np.amax(binned_y) > np.amax(y1) + assert np.amax(binned_y) > np.amax(y2) From 0f0f450267e0fb2a055362e21e25d211ef075e36 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 28 Jan 2026 21:31:41 +0000 Subject: [PATCH 07/86] changed processor setting to mythen settings --- src/xrpd_toolbox/gui/reprocessor_gui.py | 49 ++++++++++--------------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/src/xrpd_toolbox/gui/reprocessor_gui.py b/src/xrpd_toolbox/gui/reprocessor_gui.py index 5296bf5..b0ee205 100644 --- a/src/xrpd_toolbox/gui/reprocessor_gui.py +++ b/src/xrpd_toolbox/gui/reprocessor_gui.py @@ -1,10 +1,9 @@ -import json import sys import time from pathlib import Path from typing import cast -from pydantic import BaseModel, ValidationError +from pydantic import ValidationError from PyQt5.QtCore import QDir, Qt, QThread, pyqtSignal from PyQt5.QtWidgets import ( QAbstractItemView, @@ -27,17 +26,7 @@ QWidget, ) -# ========================= -# Pydantic settings model -# ========================= - - -class ProcessingSettings(BaseModel): - threshold: float - max_iterations: int - normalize: bool - output_dir: str - +from xrpd_toolbox.i11.mythen import MythenReductionSettings # ========================= # Worker Thread @@ -49,10 +38,10 @@ class ProcessingWorker(QThread): file_finished = pyqtSignal(Path) file_failed = pyqtSignal(Path, str) - def __init__(self, files: list[Path], settings: ProcessingSettings) -> None: + def __init__(self, files: list[Path], settings: MythenReductionSettings) -> None: super().__init__() self.files: list[Path] = files - self.settings: ProcessingSettings = settings + self.settings: MythenReductionSettings = settings def run(self) -> None: for file in self.files: @@ -77,14 +66,24 @@ class MainWindow(QWidget): def __init__( self, settings_columns: int = 1, - settings_path: str | Path = Path("settings.json"), + settings_path: str | Path | None = None, + settings: MythenReductionSettings | None = None, ) -> None: super().__init__() + self.output_dir: str = str(Path.home()) + self.settings_columns: int = max(1, settings_columns) - self.settings_path: Path = Path(settings_path) - self.settings_model: ProcessingSettings = self.load_settings() + if settings is not None: + self.settings_model: MythenReductionSettings = settings + elif settings_path is not None: + self.settings_path: Path = Path(settings_path) + self.settings_model: MythenReductionSettings = ( + MythenReductionSettings.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 @@ -157,14 +156,6 @@ def init_ui(self) -> None: main_layout.addLayout(left_layout, 2) main_layout.addLayout(right_layout, 1) - # --------------------- - # Load settings - # --------------------- - - def load_settings(self) -> ProcessingSettings: - with self.settings_path.open("r") as f: - return ProcessingSettings(**json.load(f)) - # --------------------- # Settings grid # --------------------- @@ -228,7 +219,7 @@ def make_output_dir(self) -> QWidget: layout = QHBoxLayout(container) layout.setContentsMargins(0, 0, 0, 0) - edit = QLineEdit(self.settings_model.output_dir) + edit = QLineEdit(self.output_dir) browse = QPushButton("Browse…") browse.clicked.connect(self.browse_output_dir) @@ -283,8 +274,8 @@ def on_selection_changed(self, *_: object) -> None: # Collect settings # --------------------- - def collect_settings(self) -> ProcessingSettings: - return ProcessingSettings( + def collect_settings(self) -> MythenReductionSettings: + return MythenReductionSettings( threshold=cast(QDoubleSpinBox, self.widgets["threshold"]).value(), max_iterations=cast(QSpinBox, self.widgets["max_iterations"]).value(), normalize=cast(QCheckBox, self.widgets["normalize"]).isChecked(), From 3e601a4d64e41b419b6e968993a726d4b74624fa Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 28 Jan 2026 21:58:09 +0000 Subject: [PATCH 08/86] gui working in container --- Dockerfile | 2 +- src/xrpd_toolbox/gui/reprocessor_gui.py | 45 ++++++++++++++----------- src/xrpd_toolbox/i11/mythen.py | 28 +++++++-------- 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/Dockerfile b/Dockerfile index 37ec064..0e63e18 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y RUN apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 -y - +RUN export DISPLAY=:0 # The build stage installs the context into the venv FROM developer AS build diff --git a/src/xrpd_toolbox/gui/reprocessor_gui.py b/src/xrpd_toolbox/gui/reprocessor_gui.py index b0ee205..460d363 100644 --- a/src/xrpd_toolbox/gui/reprocessor_gui.py +++ b/src/xrpd_toolbox/gui/reprocessor_gui.py @@ -65,9 +65,9 @@ def process_file(self, file: Path) -> None: class MainWindow(QWidget): def __init__( self, - settings_columns: int = 1, settings_path: str | Path | None = None, settings: MythenReductionSettings | None = None, + settings_columns: int = 1, ) -> None: super().__init__() @@ -118,7 +118,7 @@ def init_ui(self) -> None: self.tree = QTreeView() self.tree.setModel(self.fs_model) - self.tree.setRootIndex(self.fs_model.index(QDir.homePath())) + self.tree.setRootIndex(self.fs_model.index(QDir.currentPath())) self.tree.setSelectionMode(QAbstractItemView.ExtendedSelection) for col in range(1, self.fs_model.columnCount()): @@ -196,22 +196,22 @@ def build_settings_grid(self) -> None: def make_threshold(self) -> QDoubleSpinBox: w = QDoubleSpinBox() - w.setRange(0.0, 1e9) - w.setValue(self.settings_model.threshold) - self.widgets["threshold"] = w + # w.setRange(0.0, 1e9) + # w.setValue(self.settings_model.threshold) + # self.widgets["threshold"] = w return w def make_max_iterations(self) -> QSpinBox: w = QSpinBox() - w.setRange(1, 1_000_000) - w.setValue(self.settings_model.max_iterations) - self.widgets["max_iterations"] = w + # w.setRange(1, 1_000_000) + # w.setValue(self.settings_model.max_iterations) + # self.widgets["max_iterations"] = w return w def make_normalize(self) -> QCheckBox: w = QCheckBox() - w.setChecked(self.settings_model.normalize) - self.widgets["normalize"] = w + # w.setChecked(self.settings_model.normalize) + # self.widgets["normalize"] = w return w def make_output_dir(self) -> QWidget: @@ -276,10 +276,10 @@ def on_selection_changed(self, *_: object) -> None: def collect_settings(self) -> MythenReductionSettings: return MythenReductionSettings( - 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(), + # 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(), ) # --------------------- @@ -320,17 +320,21 @@ def find_item(self, path: Path) -> QListWidgetItem | None: def on_file_started(self, path: Path) -> None: item = self.find_item(path) if item: - item.setText(f"🔄 {path.name}") + item.setText(f"O {path.name}") + # 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}") + item.setText(f"Y {path.name}") + # 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}") + item.setText(f"X {path.name}") + # item.setText(f"❌ {path.name}") + print(f"Error processing {path}: {error}") def on_all_done(self) -> None: @@ -344,8 +348,9 @@ def on_all_done(self) -> None: if __name__ == "__main__": app = QApplication(sys.argv) - window = MainWindow( - settings_columns=2, settings_path="/Users/akz63626/Documents/settings.json" - ) + + settings = MythenReductionSettings() + + window = MainWindow(settings=settings, settings_columns=2) window.show() sys.exit(app.exec_()) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index fb8b5c9..79fc6c7 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -10,20 +10,20 @@ class MythenReductionSettings(BaseModel): - active_modules: list[int] - bad_modules: list[int] - bad_channel_masking: bool - flatfield_filepath: str | Path - apply_flatfield: bool - modules_in_flatfield: list[int] - send_to_ispyb: bool - rebin_step: float - default_counter: int - edge_bad_channels: int - error_calc: Literal["internal", "external", "best"] - data_reduction_mode: int - bad_channels_filepath: str | Path - angcal_filepath: str | Path + active_modules: list[int] = list(range(28)) + bad_modules: list[int] = [] + bad_channel_masking: bool = True + flatfield_filepath: str | Path = "" + apply_flatfield: bool = True + modules_in_flatfield: list[int] = list(range(28)) + send_to_ispyb: bool = False + rebin_step: float = 0.004 + default_counter: int = 0 + edge_bad_channels: int = 15 + error_calc: Literal["internal", "external", "best"] = "internal" + data_reduction_mode: int = 0 + bad_channels_filepath: str | Path = "" + angcal_filepath: str | Path = "" @classmethod def load_from_toml(cls, file_path: str | Path): From 7fca534f6a7ed4f4b0d98c2ed6fb7a72f30090c8 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 13:07:33 +0000 Subject: [PATCH 09/86] make bad pixel gui work with Mythen Data Loader --- .devcontainer/devcontainer.json | 5 ++ src/xrpd_toolbox/gui/bad_pixel_gui.py | 93 +++++++++++++-------------- src/xrpd_toolbox/i11/mythen.py | 43 +++++++++++-- src/xrpd_toolbox/utils/utils.py | 7 ++ 4 files changed, 95 insertions(+), 53 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c12cce5..6c3bd92 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -63,6 +63,11 @@ "source": "devcontainer-shared-cache", "target": "/cache", "type": "volume" + }, + { + "source": "/dls/i11/data/2026", + "target": "/dls/i11/data/2026", + "type": "bind" } ], // Mount the parent as /workspaces so we can pip install peers as editable diff --git a/src/xrpd_toolbox/gui/bad_pixel_gui.py b/src/xrpd_toolbox/gui/bad_pixel_gui.py index 8382eb5..f937db4 100644 --- a/src/xrpd_toolbox/gui/bad_pixel_gui.py +++ b/src/xrpd_toolbox/gui/bad_pixel_gui.py @@ -1,7 +1,6 @@ import sys from pathlib import Path -import h5py import numpy as np from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg from matplotlib.figure import Figure @@ -21,40 +20,18 @@ QWidget, ) +from xrpd_toolbox.i11.mythen import MythenDataLoader from xrpd_toolbox.utils.utils import load_int_array_from_file -DATASET_PATH = "/entry/mythen_nx/data" -MODULE_COUNT = 28 -MODULE_SIZE = 1280 -UNDO_LIMIT = 10 -COUNTER = 0 - - -def load_mythen_data(filepath: str) -> np.ndarray: - path = Path(filepath) - if not path.exists(): - raise FileNotFoundError(path) - - with h5py.File(path, "r") as file: - if DATASET_PATH not in file: - raise KeyError(f"Dataset not found: {DATASET_PATH}") - - data = np.asarray(file.get(DATASET_PATH, [])) - - if data.ndim < 1: - raise ValueError("Dataset must have at least one dimension") - else: - data = data[:, :, COUNTER] - - return data - class PlotCanvas(FigureCanvasQTAgg): def __init__( self, - data: np.ndarray, + data: MythenDataLoader, global_selected_indices: set[int], selection_callback, + undo_limit: int = 10, + pixels_per_modules: int = 1280, parent: QWidget | None = None, ) -> None: self.figure = Figure() @@ -65,12 +42,17 @@ def __init__( self.ax = self.figure.add_subplot(111) - self.raw_data = data + self.data = data + self.raw_data = data.raw_data + + self.pixels_per_modules = pixels_per_modules + self.undo_limit = undo_limit + self.current_module = 0 self.global_selected_indices = global_selected_indices self.selection_callback = selection_callback - self.x = np.arange(MODULE_SIZE) + self.x = np.arange(self.pixels_per_modules) self.scatter = None self.reference_curve = None @@ -87,8 +69,8 @@ def _connect_events(self) -> None: def _plot_module(self, module: int) -> None: self.ax.cla() - start = module * MODULE_SIZE - end = start + MODULE_SIZE + start = module * self.pixels_per_modules + end = start + self.pixels_per_modules curves = self.raw_data[:, start:end] @@ -164,8 +146,8 @@ def _on_click(self, event) -> None: # Right-click toggle if event.button == 3 and event.xdata is not None: index = int(round(event.xdata)) - if 0 <= index < MODULE_SIZE: - global_index = self.current_module * MODULE_SIZE + index + if 0 <= index < self.data.pixels_per_module: + global_index = self.current_module * self.data.pixels_per_module + index self.selection_callback(global_index) # Middle-button press starts panning elif event.button == 2 and event.xdata is not None and event.ydata is not None: @@ -195,8 +177,8 @@ def _update_selected_points(self) -> None: if self.scatter is None or self.reference_curve is None: return - module_start = self.current_module * MODULE_SIZE - module_end = module_start + MODULE_SIZE + module_start = self.current_module * self.pixels_per_modules + module_end = module_start + self.pixels_per_modules local_indices = [ idx - module_start @@ -216,21 +198,30 @@ def _update_selected_points(self) -> None: class MainWindow(QWidget): - def __init__(self, data: np.ndarray, initial_indices: set[int]) -> None: + def __init__( + self, data: MythenDataLoader, initial_indices: set[int], undo_limit: int = 10 + ) -> None: super().__init__() self.setWindowTitle("Mythen NXS Viewer") self.global_selected_indices = initial_indices + self.data = data + self.undo_limit = undo_limit self.undo_stack: list[set[int]] = [] self.redo_stack: list[set[int]] = [] - self.canvas = PlotCanvas(data, self.global_selected_indices, self._toggle_index) + self.canvas = PlotCanvas( + self.data, + self.global_selected_indices, + self._toggle_index, + undo_limit=self.undo_limit, + ) self.list_widget = QListWidget() self.module_slider = QSlider(Qt.Orientation.Horizontal) - self.module_slider.setRange(0, MODULE_COUNT - 1) + self.module_slider.setRange(0, self.data.n_modules - 1) self.module_slider.valueChanged.connect(self.canvas.set_module) self.reset_zoom_button = QPushButton("Reset Zoom") @@ -246,7 +237,7 @@ def __init__(self, data: np.ndarray, initial_indices: set[int]) -> None: self.redo_button.clicked.connect(self._redo) self.n_spin = QSpinBox() - self.n_spin.setRange(1, MODULE_SIZE // 2) + 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") @@ -296,7 +287,7 @@ def _sync_list(self) -> None: def _record_state(self) -> None: self.undo_stack.append(self.global_selected_indices.copy()) - if len(self.undo_stack) > UNDO_LIMIT: + if len(self.undo_stack) > self.undo_limit: self.undo_stack.pop(0) self.redo_stack.clear() @@ -329,11 +320,13 @@ def _redo(self) -> None: def _add_edge_indices(self) -> None: self._record_state() n = self.n_spin.value() - for module in range(MODULE_COUNT): - base = module * MODULE_SIZE + for module in range(self.data.n_modules): + base = module * self.data.pixels_per_module for i in range(n): self.global_selected_indices.add(base + i) - self.global_selected_indices.add(base + MODULE_SIZE - 1 - i) + self.global_selected_indices.add( + base + self.data.pixels_per_module - 1 - i + ) self.canvas._update_selected_points() # noqa def _save_indices(self) -> None: @@ -352,21 +345,27 @@ def _save_indices(self) -> None: def run_gui(filepath: str, indices_file: str | None = None) -> None: - data = load_mythen_data(filepath) + mythen_data = MythenDataLoader(filepath) initial_indices: set[int] = set() if indices_file is not None: initial_indices = set(load_int_array_from_file(indices_file)) + else: + initial_indices = set() app = QApplication(sys.argv) - window = MainWindow(data, initial_indices) + window = MainWindow(mythen_data, initial_indices) window.resize(1450, 900) window.show() sys.exit(app.exec()) if __name__ == "__main__": + filepath = "/dls/i11/data/2026/cm44155-1/1406733.nxs" + + mythen_data = MythenDataLoader(filepath) + # Example usage: run_gui( - "/Users/akz63626/cm44155-1/1407178.nxs", - indices_file="/Users/akz63626/cm44155-1/combined_bad_channels.txt", + filepath, + indices_file=None, ) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 79fc6c7..e48fe73 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -3,11 +3,14 @@ from pathlib import Path from typing import Literal +import h5py import numpy as np import yaml from h5py import Dataset, File from pydantic import BaseModel +from xrpd_toolbox.utils.utils import get_entry + class MythenReductionSettings(BaseModel): active_modules: list[int] = list(range(28)) @@ -56,18 +59,45 @@ def __init__( self, file_path: str | Path, active_modules: Collection[int] = tuple(range(28)), + pixels_per_module: int = 1280, counter: int = 0, ): self.file_path = Path(file_path) self.active_modules = active_modules + self.pixels_per_module = pixels_per_module self.counter = counter - self.dataset_path = "/entry/mythen_nx/data" + + self.entry = get_entry(self.file_path) + self.dataset_path = f"/{self.entry}/mythen_nx/data" + + self.n_modules_in_data, self.n_frames = self.read_nxs_metadata() + + if self.n_modules_in_data != len(self.active_modules): + raise ValueError("Mismatch between active modules and data.") + + self.get_deltas() + self.raw_data = self.load_data() self.module_data = np.array_split( self.raw_data, len(self.active_modules), axis=-1 ) self.n_modules = len(self.module_data) + def get_deltas(self) -> list[float]: + return [1.0] + + def read_nxs_metadata(self) -> tuple[int, int]: + with h5py.File(self.file_path, "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_data(self) -> np.ndarray: if not self.file_path.exists(): raise FileNotFoundError(self.file_path) @@ -83,6 +113,7 @@ def load_data(self) -> np.ndarray: if (data is not None) and isinstance(data, Dataset): if data.ndim < 1: raise ValueError("Data has insufficient dimensions.") + self.n_frames = len(data) data = data[..., self.counter] return np.asarray(data) @@ -111,13 +142,13 @@ def __init__(self, modules_per_detector: int = 28): if __name__ == "__main__": - settings = MythenReductionSettings.load_from_toml( - "/Users/akz63626/projects/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml" - ) + filepath = "/Users/akz63626/projects/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml" # noqa + + # settings = MythenReductionSettings.load_from_toml(filepath) - print("Loaded settings:", settings) + # print("Loaded settings:", settings) - MythenDataLoader("/Users/akz63626/cm44155-1/1407178.nxs") + MythenDataLoader("/dls/i11/data/2026/cm44155-1/1406733.nxs") # module = MythenModule(data) # result = module.process() diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 1e92585..67fd92a 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -1,9 +1,16 @@ import os from collections.abc import Iterable +from pathlib import Path +import h5py import numpy as np +def get_entry(nexus_filepath: str | Path) -> str: + with h5py.File(nexus_filepath, "r") as file: + return list(file.keys())[0] + + def normalise_to(data: Iterable[float | int], minval: float | int = 0) -> np.ndarray: """ normalises an array From 957e8df24d39b55b0207b0c3dad455c22ca06fcc Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 13:28:17 +0000 Subject: [PATCH 10/86] add emoji lib to dev container and change ui to emojis --- .devcontainer/devcontainer.json | 5 +++++ Dockerfile | 1 + src/xrpd_toolbox/gui/reprocessor_gui.py | 9 +++------ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 6c3bd92..10ab764 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -68,6 +68,11 @@ "source": "/dls/i11/data/2026", "target": "/dls/i11/data/2026", "type": "bind" + }, + { + "source": "/dls_sw/i11/software", + "target": "/dls_sw/i11/software", + "type": "bind" } ], // Mount the parent as /workspaces so we can pip install peers as editable diff --git a/Dockerfile b/Dockerfile index 0e63e18..364b25b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y RUN apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 -y +RUN apt-get install fonts-noto-color-emoji -y RUN export DISPLAY=:0 # The build stage installs the context into the venv diff --git a/src/xrpd_toolbox/gui/reprocessor_gui.py b/src/xrpd_toolbox/gui/reprocessor_gui.py index 460d363..157cb8a 100644 --- a/src/xrpd_toolbox/gui/reprocessor_gui.py +++ b/src/xrpd_toolbox/gui/reprocessor_gui.py @@ -320,20 +320,17 @@ def find_item(self, path: Path) -> QListWidgetItem | None: def on_file_started(self, path: Path) -> None: item = self.find_item(path) if item: - item.setText(f"O {path.name}") - # item.setText(f"🔄 {path.name}") + item.setText(f"🔄 {path.name}") def on_file_finished(self, path: Path) -> None: item = self.find_item(path) if item: - item.setText(f"Y {path.name}") - # item.setText(f"✅ {path.name}") + 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"X {path.name}") - # item.setText(f"❌ {path.name}") + item.setText(f"❌ {path.name}") print(f"Error processing {path}: {error}") From 59bc2c62a06f52f4a6e300f904c80875938b3a78 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 15:04:55 +0000 Subject: [PATCH 11/86] made reprocessor gui add all settings --- src/xrpd_toolbox/gui/reprocessor_gui.py | 95 +++++++++++++++++-------- src/xrpd_toolbox/i11/mythen.py | 6 +- 2 files changed, 68 insertions(+), 33 deletions(-) diff --git a/src/xrpd_toolbox/gui/reprocessor_gui.py b/src/xrpd_toolbox/gui/reprocessor_gui.py index 157cb8a..b826ccb 100644 --- a/src/xrpd_toolbox/gui/reprocessor_gui.py +++ b/src/xrpd_toolbox/gui/reprocessor_gui.py @@ -1,7 +1,8 @@ import sys import time from pathlib import Path -from typing import cast +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 @@ -9,6 +10,7 @@ QAbstractItemView, QApplication, QCheckBox, + QComboBox, QDoubleSpinBox, QFileDialog, QFileSystemModel, @@ -161,11 +163,19 @@ def init_ui(self) -> None: # --------------------- def build_settings_grid(self) -> None: - normal_settings: list[tuple[str, QWidget]] = [ - ("Threshold", self.make_threshold()), - ("Max Iterations", self.make_max_iterations()), - ("Normalize", self.make_normalize()), - ] + 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 @@ -181,9 +191,10 @@ def build_settings_grid(self) -> None: len(normal_settings) + self.settings_columns - 1 ) // self.settings_columns - self.settings_grid.addWidget(QLabel("Output Directory"), output_row, 0) + output_name = "Output Directory" + self.settings_grid.addWidget(QLabel(output_name), output_row, 0) self.settings_grid.addWidget( - self.make_output_dir(), + self.make_dir_widget(output_name), output_row, 1, 1, @@ -194,27 +205,49 @@ def build_settings_grid(self) -> None: # Widget builders # --------------------- - def make_threshold(self) -> QDoubleSpinBox: - w = QDoubleSpinBox() - # w.setRange(0.0, 1e9) - # w.setValue(self.settings_model.threshold) - # self.widgets["threshold"] = w - return w - - def make_max_iterations(self) -> QSpinBox: - w = QSpinBox() - # w.setRange(1, 1_000_000) - # w.setValue(self.settings_model.max_iterations) - # self.widgets["max_iterations"] = w - return w - - def make_normalize(self) -> QCheckBox: - w = QCheckBox() - # w.setChecked(self.settings_model.normalize) - # self.widgets["normalize"] = w - return w - - def make_output_dir(self) -> QWidget: + 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) @@ -226,7 +259,7 @@ def make_output_dir(self) -> QWidget: layout.addWidget(edit) layout.addWidget(browse) - self.widgets["output_dir"] = edit + self.widgets[name] = edit return container # --------------------- @@ -348,6 +381,6 @@ def on_all_done(self) -> None: settings = MythenReductionSettings() - window = MainWindow(settings=settings, settings_columns=2) + window = MainWindow(settings=settings, settings_columns=1) window.show() sys.exit(app.exec_()) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index e48fe73..88320bc 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -24,8 +24,10 @@ class MythenReductionSettings(BaseModel): default_counter: int = 0 edge_bad_channels: int = 15 error_calc: Literal["internal", "external", "best"] = "internal" - data_reduction_mode: int = 0 - bad_channels_filepath: str | Path = "" + 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 = "" @classmethod From cb98e2a2c4f1fc1fdcd260ae8c8d67966d8dfd57 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 15:09:53 +0000 Subject: [PATCH 12/86] add default bad channels path --- src/xrpd_toolbox/gui/bad_pixel_gui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrpd_toolbox/gui/bad_pixel_gui.py b/src/xrpd_toolbox/gui/bad_pixel_gui.py index f937db4..f3088b9 100644 --- a/src/xrpd_toolbox/gui/bad_pixel_gui.py +++ b/src/xrpd_toolbox/gui/bad_pixel_gui.py @@ -367,5 +367,5 @@ def run_gui(filepath: str, indices_file: str | None = None) -> None: # Example usage: run_gui( filepath, - indices_file=None, + indices_file="/dls_sw/i11/software/mythen/badchannels.txt", ) From 567f8ea8ae5ca6455d7950bf06ca1dcdb1d17c20 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 15:24:29 +0000 Subject: [PATCH 13/86] minor edits --- src/xrpd_toolbox/i11/mythen.py | 10 ++++++++-- src/xrpd_toolbox/utils/utils.py | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 88320bc..9a58eb9 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -9,7 +9,7 @@ from h5py import Dataset, File from pydantic import BaseModel -from xrpd_toolbox.utils.utils import get_entry +from xrpd_toolbox.utils.utils import get_entry, load_int_array_from_file class MythenReductionSettings(BaseModel): @@ -17,7 +17,7 @@ class MythenReductionSettings(BaseModel): bad_modules: list[int] = [] bad_channel_masking: bool = True flatfield_filepath: str | Path = "" - apply_flatfield: bool = True + apply_flatfield: bool = False modules_in_flatfield: list[int] = list(range(28)) send_to_ispyb: bool = False rebin_step: float = 0.004 @@ -40,6 +40,12 @@ def load_from_yaml(cls, file_path: str | Path): settings_dict = yaml.safe_load(open(file_path, "rb")) return cls(**settings_dict) + def load_bad_channels(self): + if not self.bad_channels_filepath: + raise ValueError("Bad channels file path is not set.") + self.bad_channels = load_int_array_from_file(self.bad_channels_filepath) + return self.bad_channels + def save_to_yaml(self, file_path: str | Path) -> None: print("Saving configuration to:", file_path) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 67fd92a..fd811a0 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -35,7 +35,7 @@ def gaussian(x, amp, cen, fwhm, background) -> np.ndarray: ) + background -def load_int_array_from_file(filepath: str) -> np.ndarray: +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. From 51b71480a0abfa308d2918149f839b30d2cf6009 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 15:36:50 +0000 Subject: [PATCH 14/86] add analysis logger --- examples/i11/bad_channels.txt | 2989 +++++++++++++++++ src/xrpd_toolbox/i11/mythen.py | 6 +- .../mythen3_reduction_config.toml | 2 +- src/xrpd_toolbox/utils/logger.py | 32 + 4 files changed, 3025 insertions(+), 4 deletions(-) create mode 100644 examples/i11/bad_channels.txt create mode 100644 src/xrpd_toolbox/utils/logger.py diff --git a/examples/i11/bad_channels.txt b/examples/i11/bad_channels.txt new file mode 100644 index 0000000..501b796 --- /dev/null +++ b/examples/i11/bad_channels.txt @@ -0,0 +1,2989 @@ +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 +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/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 9a58eb9..4373714 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -150,11 +150,11 @@ def __init__(self, modules_per_detector: int = 28): if __name__ == "__main__": - filepath = "/Users/akz63626/projects/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml" # noqa + filepath = "/workspaces/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml" # noqa - # settings = MythenReductionSettings.load_from_toml(filepath) + settings = MythenReductionSettings.load_from_toml(filepath) - # print("Loaded settings:", settings) + print("Loaded settings:", settings) MythenDataLoader("/dls/i11/data/2026/cm44155-1/1406733.nxs") diff --git a/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml b/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml index 6789720..d2f3619 100644 --- a/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml +++ b/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml @@ -32,7 +32,7 @@ error_calc = "internal" #this can be "internal" "external" or "best". internal e ###### -data_reduction_mode = 0 +data_reduction_mode = "step_scan" # data_reduction_mode #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) diff --git a/src/xrpd_toolbox/utils/logger.py b/src/xrpd_toolbox/utils/logger.py new file mode 100644 index 0000000..55834dd --- /dev/null +++ b/src/xrpd_toolbox/utils/logger.py @@ -0,0 +1,32 @@ +import os +from datetime import datetime +from pathlib import Path + + +class AnalysisLogger: + def __init__(self, log_filepath: str | Path, logging=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=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") From 7ffc340caee6322894a3a7662ed6406aed18dbdf Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 15:40:01 +0000 Subject: [PATCH 15/86] make logger use pathlib --- src/xrpd_toolbox/utils/logger.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/xrpd_toolbox/utils/logger.py b/src/xrpd_toolbox/utils/logger.py index 55834dd..bbb6d32 100644 --- a/src/xrpd_toolbox/utils/logger.py +++ b/src/xrpd_toolbox/utils/logger.py @@ -1,21 +1,20 @@ -import os from datetime import datetime from pathlib import Path class AnalysisLogger: - def __init__(self, log_filepath: str | Path, logging=False): - self.log_filepath = log_filepath - self.logging = logging + 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 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) + 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("Log File for I11 Data Reduction\n") + f.write(f"Log File for {beamline} Data Reduction\n") with open(self.log_filepath, "a+") as f: f.write("================================\n") @@ -26,7 +25,7 @@ def log(self, *args, print_to_console=True): if print_to_console: print(*args) - if self.logging: + if self.log_to_file: with open(self.log_filepath, "a") as f: [f.write(str(m)) for m in args] f.write("\n") From f01dfbd132db769dded3e185db55e9d15dc24e9f Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 15:56:51 +0000 Subject: [PATCH 16/86] add basic module loading --- src/xrpd_toolbox/i11/mythen.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 4373714..6c3e5cd 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -1,4 +1,5 @@ import tomllib +from collections import OrderedDict from collections.abc import Collection from pathlib import Path from typing import Literal @@ -145,18 +146,30 @@ def process(self): class MythenDetector: - def __init__(self, modules_per_detector: int = 28): - self.modules_per_detector = modules_per_detector + def __init__( + self, filepath: str | Path, settings: MythenReductionSettings | None = None + ): + self.filepath = filepath + self.mythen_data = MythenDataLoader(filepath) + self.settings = settings or MythenReductionSettings() + + self.modules = OrderedDict() + + for module in self.settings.active_modules: + self.modules[module] = MythenModule( + self.mythen_data.get_module_data(module) + ) if __name__ == "__main__": filepath = "/workspaces/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml" # noqa settings = MythenReductionSettings.load_from_toml(filepath) - print("Loaded settings:", settings) - MythenDataLoader("/dls/i11/data/2026/cm44155-1/1406733.nxs") + MythenDetector( + filepath="/dls/i11/data/2026/cm44155-1/1406733.nxs", settings=settings + ) # module = MythenModule(data) # result = module.process() From 62c5f6753eada1972998f56f228a1aa3b4565316 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 16:04:23 +0000 Subject: [PATCH 17/86] changed directory of reprocessor gui depending on beamline arg --- src/xrpd_toolbox/gui/reprocessor_gui.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/xrpd_toolbox/gui/reprocessor_gui.py b/src/xrpd_toolbox/gui/reprocessor_gui.py index b826ccb..58f723e 100644 --- a/src/xrpd_toolbox/gui/reprocessor_gui.py +++ b/src/xrpd_toolbox/gui/reprocessor_gui.py @@ -69,11 +69,13 @@ def __init__( self, settings_path: str | Path | None = None, settings: MythenReductionSettings | 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) @@ -98,7 +100,7 @@ def __init__( self.settings_grid: QGridLayout self.process_btn: QPushButton - self.setWindowTitle("NXS Processor") + self.setWindowTitle("NXS Reprocessor") self.resize(1200, 650) self.init_ui() @@ -114,13 +116,16 @@ def init_ui(self) -> None: 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(QDir.currentPath())) + self.tree.setRootIndex(self.fs_model.index(self.base_path)) self.tree.setSelectionMode(QAbstractItemView.ExtendedSelection) for col in range(1, self.fs_model.columnCount()): From fc4c671e455d57503390d7ab6a4192dfe70b56f3 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 16:36:28 +0000 Subject: [PATCH 18/86] add get_filenumber util --- src/xrpd_toolbox/gui/reprocessor_gui.py | 2 -- src/xrpd_toolbox/utils/utils.py | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/xrpd_toolbox/gui/reprocessor_gui.py b/src/xrpd_toolbox/gui/reprocessor_gui.py index 58f723e..b507efa 100644 --- a/src/xrpd_toolbox/gui/reprocessor_gui.py +++ b/src/xrpd_toolbox/gui/reprocessor_gui.py @@ -383,9 +383,7 @@ def on_all_done(self) -> None: if __name__ == "__main__": app = QApplication(sys.argv) - settings = MythenReductionSettings() - window = MainWindow(settings=settings, settings_columns=1) window.show() sys.exit(app.exec_()) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index fd811a0..5421dda 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -1,4 +1,5 @@ import os +import re from collections.abc import Iterable from pathlib import Path @@ -11,6 +12,12 @@ def get_entry(nexus_filepath: str | Path) -> str: return list(file.keys())[0] +def get_filenumber_from_nxs(nexus_file: str | Path) -> int: + basename = os.path.basename(str(nexus_file)) + filenumber_str = re.findall(r"\d+", basename)[-1] + return int(filenumber_str) + + def normalise_to(data: Iterable[float | int], minval: float | int = 0) -> np.ndarray: """ normalises an array From 707cd38b33159646744b851e41274c45a3b65c95 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 16:37:51 +0000 Subject: [PATCH 19/86] add nexus unpacked --- src/xrpd_toolbox/utils/utils.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 5421dda..aa61ebf 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -7,6 +7,35 @@ import numpy as np +class NexusToDict: + def __init__(self, nexus_filepath: str | Path): + self.nexus_dict = {} + + with h5py.File(nexus_filepath, "r") as open_nexus_file: + self.recursive_inspect(open_nexus_file) + + def recursive_inspect(self, dataset): + for key in dataset.keys(): + if hasattr(dataset[key], "keys"): + self.recursive_inspect(dataset[key]) + else: + try: + self.nexus_dict[key] = dataset[key][()].decode("UTF-8") + except Exception: + data = dataset[key][()] + + if isinstance(data, np.ndarray) and (len(data) == 1): + data = data.flatten()[0] + + if isinstance(data, bytes): + data = data.decode("UTF-8") + + self.nexus_dict[key] = data + + def get_dict(self): + return self.nexus_dict + + def get_entry(nexus_filepath: str | Path) -> str: with h5py.File(nexus_filepath, "r") as file: return list(file.keys())[0] From d88bb836476883a56b0fba7a98348c923f0f3f6e Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 16:39:08 +0000 Subject: [PATCH 20/86] add nexus getters --- src/xrpd_toolbox/utils/utils.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index aa61ebf..6b99e26 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -41,6 +41,27 @@ def get_entry(nexus_filepath: str | Path) -> str: return list(file.keys())[0] +def nexus_file_match(f, beamline: str = "i15-1"): + return re.match(f"{beamline}" + r"-+[0-9]+\.nxs", f) + + +def get_nexus_files( + instrument_session_folder: str | Path, + beamline: str = "i15-1", + exclude: str = "processed", +): + """Get all final data files ending with .nxs in some folder""" + + nexus_files = [ + os.path.join(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_file: str | Path) -> int: basename = os.path.basename(str(nexus_file)) filenumber_str = re.findall(r"\d+", basename)[-1] From 6e5e4f5fb7770f9b98f6cbf1e3bd87eec734e97e Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 16:40:57 +0000 Subject: [PATCH 21/86] add type hints to nexus getters --- src/xrpd_toolbox/utils/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 6b99e26..1ff7f66 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -49,7 +49,7 @@ 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 = [ From 283407967d9dd946ca035a94db84810df5747295 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 16:41:48 +0000 Subject: [PATCH 22/86] added more specific variable name --- src/xrpd_toolbox/utils/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 1ff7f66..f174266 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -41,8 +41,8 @@ def get_entry(nexus_filepath: str | Path) -> str: return list(file.keys())[0] -def nexus_file_match(f, beamline: str = "i15-1"): - return re.match(f"{beamline}" + r"-+[0-9]+\.nxs", f) +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( From a6708711e24b0e11dbcf2e58c0ecaad8d46dea5d Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 16:42:59 +0000 Subject: [PATCH 23/86] add get_folders in path function --- src/xrpd_toolbox/utils/utils.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index f174266..f25729e 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -68,6 +68,17 @@ def get_filenumber_from_nxs(nexus_file: str | Path) -> int: return int(filenumber_str) +def get_folder_paths(root_folder: str | Path): + """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 normalise_to(data: Iterable[float | int], minval: float | int = 0) -> np.ndarray: """ normalises an array From caa1a7f3164f840a4346de6db29fbc53b60a5b0c Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 16:45:32 +0000 Subject: [PATCH 24/86] add nexus dataset path to utils --- src/xrpd_toolbox/utils/utils.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index f25729e..5091b3f 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -79,6 +79,33 @@ def get_folder_paths(root_folder: str | Path): return instrument_session_folders +def copy_datapath_to_nexus( + source_file: str | Path, + destination_file: str | Path, + source_path: str, + destination_path: str, +): + """ + 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 From a22fa5bf9d82d064f4c0b9e1935bcaa39f40aace Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 16:46:29 +0000 Subject: [PATCH 25/86] add nexus dataset copier type hints --- src/xrpd_toolbox/utils/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 5091b3f..4d8f2c8 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -32,7 +32,7 @@ def recursive_inspect(self, dataset): self.nexus_dict[key] = data - def get_dict(self): + def get_dict(self) -> dict: return self.nexus_dict @@ -68,7 +68,7 @@ def get_filenumber_from_nxs(nexus_file: str | Path) -> int: return int(filenumber_str) -def get_folder_paths(root_folder: str | Path): +def get_folder_paths(root_folder: str | Path) -> list[str]: """get all folder directories within another folder""" instrument_session_folders = [ @@ -84,7 +84,7 @@ def copy_datapath_to_nexus( 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. From 6dc3fcbb3e1271f45d656c77ea144433466f79c3 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 29 Jan 2026 17:25:25 +0000 Subject: [PATCH 26/86] add DaqMessenger and mythen lgeacy --- .../i11/mythen3_reduction_legacy.py | 2168 +++++++++++++++++ src/xrpd_toolbox/utils/daq_messenger.py | 99 + 2 files changed, 2267 insertions(+) create mode 100644 src/xrpd_toolbox/i11/mythen3_reduction_legacy.py create mode 100644 src/xrpd_toolbox/utils/daq_messenger.py 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..4ec2b29 --- /dev/null +++ b/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py @@ -0,0 +1,2168 @@ +# type: ignore +import argparse +import os +import sys +from datetime import datetime +from itertools import product +from pathlib import Path +from shutil import copy, copy2 +from tomllib import load + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from h5py import File as h5pyFile + +from xrpd_toolbox.utils.daq_messenger import DaqMessenger +from xrpd_toolbox.utils.energy import convert_tth_to_q +from xrpd_toolbox.utils.utils import load_int_array_from_file + +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) + + +def paired_modules(modules=None): + """ + 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. + """ + + if modules is None: + 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((m, pair)) + + pairs = np.array(pairs) + + return pairs + + +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 calc_intial_module_conv(modules, conv=6.5e-05): + module_conv_dict = {} + + for mod in modules: + if mod > 13: + module_conv_dict[mod] = -conv + else: + module_conv_dict[mod] = conv + + return module_conv_dict + + +class AnalysisLogger: + def __init__(self, log_filepath, logging=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=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 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", + "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 + ): + """ + 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) + + ##################################### + + 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 + ################################## + + 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 = "best" + ) -> 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 == "internal": + errors = prop_errors + elif error_calc == "external": + errors = std_errors + elif error_calc == "best": + errors = np.where(prop_errors > std_errors, prop_errors, std_errors) + + 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 = convert_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=(), block=True): + plt.figure(figsize=(10, 4)) + + 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) + + plt.ylabel("Ring number") + plt.yticks([0, 1]) + plt.xlabel("Angle (tth)") + plt.show(block=block) + if block is True: + plt.close() + + def plot_by(self, parameters=(), x="tth", at_a_time=False): + 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_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.plot(mod_data["tth"], mod_data["counts"], label=str(n_mod)) + plt.text(np.mean(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: + # self.logger.log(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 = DaqMessenger("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 not os.path.exists(self.filepath): + self.logger.log("NXS file does not exist") + quit() + + 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") + ) + 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() + + output_data_modules = set(self.active_modules).difference(set(self.bad_modules)) + self.logger.log("Modules in output data:", output_data_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/utils/daq_messenger.py b/src/xrpd_toolbox/utils/daq_messenger.py new file mode 100644 index 0000000..176bc18 --- /dev/null +++ b/src/xrpd_toolbox/utils/daq_messenger.py @@ -0,0 +1,99 @@ +import json +import time +from collections import deque + +import stomp + + +class DaqScanListener(stomp.ConnectionListener): + def __init__(self): + self.queue = deque() + + def on_error(self, frame): + print(f"received an error {frame.body}") + + def on_message(self, frame): + m = json.loads(frame.body) + self.queue.append(m) + + +class DaqScanListener4(stomp.ConnectionListener): + def __init__(self): + self.queue = deque() + + def on_error(self, headers, message): + print(f"Received an error {message}") + + def on_message(self, headers, message): + m = json.loads(message) + self.queue.append(m) + + +class DaqMessenger: + def __init__(self, beamline): + self.beamline = beamline + self.old_stomp = stomp.__version__[0] == 4 + + def connect(self): + self.conn = stomp.Connection( + [(self.beamline, 61613)], auto_content_length=False + ) + if self.old_stomp: + self.conn.start() + self.conn.connect() + + def disconnect(self): + self.conn.disconnect() + + def on_scan(self, message_function, sleep=1): + dsl = DaqScanListener4() if self.old_stomp else DaqScanListener() + self.conn.set_listener("scan", dsl) + self.conn.subscribe(destination="/topic/gda.messages.scan", id=1, ack="auto") + + while 1: + while dsl.queue: + m = dsl.queue.popleft() + message_function(m) + time.sleep(sleep) + + def send_file(self, path): + message = json.dumps({"filePath": path}) + destination = "/topic/org.dawnsci.file.topic" + self._send_message(destination, message) + + def send_start(self, path): + message = json.dumps( + {"filePath": path, "status": "STARTED", "swmrStatus": "ENABLED"} + ) + destination = "/topic/gda.messages.processing" + self._send_message(destination, message) + + def send_update(self, path): + 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_poni(self, path, status, message): + """ + styatus is ERROR WARN OK + """ + message = json.dumps( + {"calibration_filepath": path, "status": status, "message": message} + ) + destination = "/topic/gda.messages.calibration.xrd2" + self._send_message(destination, message) + + def _send_message(self, destination, message): + if self.old_stomp: + self.conn.send(destination, message, ack="auto") + else: + self.conn.send(destination=destination, body=message, ack="auto") From 3b5426d7dce5ee13531b8c92e9caf33e53feda19 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 29 Jan 2026 23:23:03 +0000 Subject: [PATCH 27/86] add more utils tests --- src/xrpd_toolbox/utils/utils.py | 4 ++-- tests/test_mythen.py | 2 +- tests/test_utils.py | 13 +++++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 4d8f2c8..1bc384e 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -62,8 +62,8 @@ def get_nexus_files( return nexus_files -def get_filenumber_from_nxs(nexus_file: str | Path) -> int: - basename = os.path.basename(str(nexus_file)) +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) diff --git a/tests/test_mythen.py b/tests/test_mythen.py index f640c4c..e9cd16b 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -17,7 +17,7 @@ def test_mythen_settings(): default_counter=0, edge_bad_channels=10, error_calc="internal", - data_reduction_mode=1, + data_reduction_mode="step_scan", bad_channels_filepath="bad_channels.txt", angcal_filepath="angcal.txt", ) diff --git a/tests/test_utils.py b/tests/test_utils.py index e837029..d4be6cc 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -6,12 +6,25 @@ from xrpd_toolbox.utils.energy import beam_energy_to_wavelength, tth_to_q from xrpd_toolbox.utils.utils import ( gaussian, + get_filenumber_from_nxs, load_int_array_from_file, + nexus_file_match, normalise, 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(): normalised_array = normalise_to([1, 2, 4], minval=0) assert np.array_equal(normalised_array, [0.25, 0.5, 1.0]) From 8b2a16e14764934a0dcd0921967beacd55812224 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 29 Jan 2026 23:26:40 +0000 Subject: [PATCH 28/86] added int load tests --- tests/test_utils.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index d4be6cc..9c81330 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -55,7 +55,7 @@ def test_beam_energy_to_wavelength(): assert round(wavelength_in_angstrom, 2) == 1.0 -def test_load_int_array_from_file(): +def test_load_int_array_from_file_returns_array_when_contains_ints(): test_file = "int_array.txt" # Create a temporary file @@ -70,3 +70,28 @@ def test_load_int_array_from_file(): # Clean up os.remove(test_file) + + +def test_load_int_array_from_file_returns_none_when_file_doesnt_exist(): + test_file = "nob_existent.txt" + + # Test loading the array + result = load_int_array_from_file(test_file) + expected = np.array([]) + assert np.array_equal(result, expected) + + +def test_load_int_array_from_file_returns_none_when_file_empty(): + test_file = "int_array.txt" + + # 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) From 0ef4c852f4c74c7c6daa6e373b3da01a4f37c4d5 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 29 Jan 2026 23:35:39 +0000 Subject: [PATCH 29/86] add test for get list of paths --- .devcontainer/devcontainer.json | 20 ++++++++++---------- tests/test_utils.py | 8 ++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 10ab764..0eac1a5 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -64,16 +64,16 @@ "target": "/cache", "type": "volume" }, - { - "source": "/dls/i11/data/2026", - "target": "/dls/i11/data/2026", - "type": "bind" - }, - { - "source": "/dls_sw/i11/software", - "target": "/dls_sw/i11/software", - "type": "bind" - } + // { + // "source": "/dls/i11/data/2026", + // "target": "/dls/i11/data/2026", + // "type": "bind" + // }, + // { + // "source": "/dls_sw/i11/software", + // "target": "/dls_sw/i11/software", + // "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/tests/test_utils.py b/tests/test_utils.py index 9c81330..f85a002 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -7,6 +7,7 @@ from xrpd_toolbox.utils.utils import ( gaussian, get_filenumber_from_nxs, + get_folder_paths, load_int_array_from_file, nexus_file_match, normalise, @@ -95,3 +96,10 @@ def test_load_int_array_from_file_returns_none_when_file_empty(): # Clean up os.remove(test_file) + + +def test_get_folder_paths(): + list_of_paths = get_folder_paths("/") + + assert "/workspaces" in list_of_paths + assert isinstance(list_of_paths, list) From bae0e88e27b02718605dfb2502c75d72406a3a6e Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 30 Jan 2026 10:13:31 +0000 Subject: [PATCH 30/86] add export to dev container --- .devcontainer/devcontainer.json | 2 +- .pre-commit-config.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0eac1a5..0e9343a 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -78,5 +78,5 @@ // Mount the parent as /workspaces so we can pip install peers as editable "workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind", // After the container is created, recreate the venv then make pre-commit first run faster - "postCreateCommand": "uv venv --clear && uv sync && pre-commit install --install-hooks" + "postCreateCommand": "uv venv --clear && uv sync && pre-commit install --install-hooks && echo 'export DISPLAY=:0' >> ~/.bashrc" } 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 From 2c29a7cef40506c079e6e442e0a4063202c7668c Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 30 Jan 2026 12:47:03 +0000 Subject: [PATCH 31/86] made settings load/save generic --- src/xrpd_toolbox/i11/mythen.py | 67 ++++++++++++++++++++++------------ tests/test_mythen.py | 23 ++++++++---- 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 6c3e5cd..ce241b7 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -6,6 +6,7 @@ import h5py import numpy as np +import toml import yaml from h5py import Dataset, File from pydantic import BaseModel @@ -13,27 +14,12 @@ from xrpd_toolbox.utils.utils import get_entry, load_int_array_from_file -class MythenReductionSettings(BaseModel): - active_modules: list[int] = list(range(28)) - bad_modules: list[int] = [] - bad_channel_masking: bool = True - flatfield_filepath: str | Path = "" - apply_flatfield: bool = False - modules_in_flatfield: list[int] = list(range(28)) - send_to_ispyb: bool = False - rebin_step: float = 0.004 - default_counter: int = 0 - edge_bad_channels: int = 15 - error_calc: Literal["internal", "external", "best"] = "internal" - 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 SettingsBase(BaseModel): @classmethod def load_from_toml(cls, file_path: str | Path): - settings_dict = tomllib.load(open(file_path, "rb")) + with open(file_path, "rb") as f: + settings_dict = tomllib.load(f) + return cls(**settings_dict) @classmethod @@ -41,13 +27,21 @@ def load_from_yaml(cls, file_path: str | Path): settings_dict = yaml.safe_load(open(file_path, "rb")) return cls(**settings_dict) - def load_bad_channels(self): - if not self.bad_channels_filepath: - raise ValueError("Bad channels file path is not set.") - self.bad_channels = load_int_array_from_file(self.bad_channels_filepath) - return self.bad_channels + def save_to_toml(self, file_path: str | Path) -> None: + if not str(file_path).endswith(".toml"): + raise ValueError("file name must end with .toml") + + print("Saving configuration to:", file_path) + + config_dict = self.model_dump() + + with open(file_path, "w") as outfile: + toml.dump(config_dict, outfile) def save_to_yaml(self, file_path: str | Path) -> None: + if not str(file_path).endswith(".yaml"): + raise ValueError("file name must end with .yaml") + print("Saving configuration to:", file_path) config_dict = self.model_dump() @@ -63,6 +57,31 @@ def save_to_yaml(self, file_path: str | Path) -> None: ) +class MythenReductionSettings(SettingsBase): + active_modules: list[int] = list(range(28)) + bad_modules: list[int] = [] + bad_channel_masking: bool = True + flatfield_filepath: str | Path = "" + apply_flatfield: bool = False + modules_in_flatfield: list[int] = list(range(28)) + send_to_ispyb: bool = False + rebin_step: float = 0.004 + default_counter: int = 0 + edge_bad_channels: int = 15 + error_calc: Literal["internal", "external", "best"] = "internal" + 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 = "" + + def load_bad_channels(self): + if not self.bad_channels_filepath: + raise ValueError("Bad channels file path is not set.") + self.bad_channels = load_int_array_from_file(self.bad_channels_filepath) + return self.bad_channels + + class MythenDataLoader: def __init__( self, diff --git a/tests/test_mythen.py b/tests/test_mythen.py index e9cd16b..a1c08b3 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -1,19 +1,21 @@ import numpy as np +import pytest from xrpd_toolbox.i11.mythen import MythenReductionSettings from xrpd_toolbox.utils.utils import bin_and_propagate_errors, gaussian -def test_mythen_settings(): - settings = MythenReductionSettings( +@pytest.fixture +def mythen_settings(): + mythen_settings = MythenReductionSettings( active_modules=[1, 2, 3], bad_modules=[4, 5], bad_channel_masking=True, flatfield_filepath="flatfield.h5", - apply_flatfield=True, + apply_flatfield=False, modules_in_flatfield=[1, 2], send_to_ispyb=False, - rebin_step=2.0, + rebin_step=0.004, default_counter=0, edge_bad_channels=10, error_calc="internal", @@ -22,15 +24,20 @@ def test_mythen_settings(): angcal_filepath="angcal.txt", ) - assert settings.apply_flatfield is True - assert settings.rebin_step == 2.0 + return mythen_settings + + +def test_mythen_settings(mythen_settings: MythenReductionSettings): + assert mythen_settings.data_reduction_mode == "step_scan" + assert mythen_settings.rebin_step == 0.004 def test_mythen_settings_load_from_toml(): settings = MythenReductionSettings.load_from_toml( - "tests/test_data/mythen_settings.toml" + "/workspaces/XRPD-Toolbox/examples/i11/mythen3_reduction_config.toml" ) - assert settings.apply_flatfield is True + + print(settings.rebin_step) def test_peak_bin_and_propagate_errors(): From c2adc510de2bda8a217b1fa9598e8d4adcd4aca4 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 30 Jan 2026 12:48:22 +0000 Subject: [PATCH 32/86] added toml to dev container --- pyproject.toml | 1 + uv.lock | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 75c7cc3..b47d053 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ dependencies = [ "peakutils", "PyCifRW", "pyyaml", + "toml", "PyQt6", "PyQt5", ] # Add project dependencies here, e.g. ["click", "numpy"] diff --git a/uv.lock b/uv.lock index d728086..64d72a9 100644 --- a/uv.lock +++ b/uv.lock @@ -1862,6 +1862,15 @@ 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 = "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.0" @@ -2063,6 +2072,7 @@ dependencies = [ { name = "pyqt6" }, { name = "pyyaml" }, { name = "scipy" }, + { name = "toml" }, ] [package.dev-dependencies] @@ -2091,6 +2101,7 @@ requires-dist = [ { name = "pyqt6" }, { name = "pyyaml" }, { name = "scipy" }, + { name = "toml" }, ] [package.metadata.requires-dev] From 64ce0cbe2c6b7e5387d21255e247179437697973 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 30 Jan 2026 12:48:51 +0000 Subject: [PATCH 33/86] added example reduction toml settings --- .DS_Store | Bin 0 -> 10244 bytes examples/.DS_Store | Bin 0 -> 10244 bytes examples/i11/.DS_Store | Bin 0 -> 10244 bytes examples/i11/mythen3_reduction_config.toml | 192 ++++++++++++++++++++ examples/i11/step_scan/1406731.nxs | Bin 0 -> 88872 bytes examples/i11/step_scan/mythen3_1406731.hdf5 | Bin 0 -> 2588860 bytes 6 files changed, 192 insertions(+) create mode 100644 .DS_Store create mode 100644 examples/.DS_Store create mode 100644 examples/i11/.DS_Store create mode 100644 examples/i11/mythen3_reduction_config.toml create mode 100644 examples/i11/step_scan/1406731.nxs create mode 100644 examples/i11/step_scan/mythen3_1406731.hdf5 diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0eb316b8e8d5d968bc15f973f646c626d5ec31bc GIT binary patch literal 10244 zcmeHMU2Ggz6+UO2#Iwmd87Fq*B%WsFO+?bzuIv0cO(WKSP2K!Bc?s&e03-lFrp%}kr^hOZwX!T!MbZbb z!G$Sk0}Grg>4*^_5FrpD5FrpD5FzltfB?O-S&}yh8a*QfA_O7?mJwj*LxM7+sgN!S z%8w3u@GAh(HN@tL%IrG8bP^#=g>*?!YN3Qem8ej~@QQ&#o%o4RE)~)xL4`VCc=^C^ zWDIX8$VaFC6I>iHC1~`F5Qq?{Mu53XJ?Nl8K)L+>K1p}^c32>84(tKj)w8ynC26M7 zL%IDPPgDX}4}B!9!z`HK!6e=PZ7?fz-l@=$Np_z1o@dhFuaw7@e)P2;S<60WnR63LL$B)un&p@t zSFj9|M8-!g$8hI*+=65HTsJKmCTmgdQnsv0f57%m!rR9f_}6{WQ7 z*!m6ex{aHZ`psMF8|oVy8z0%)v~BZ_<_Tp>R?}yvJhq%(*LJ-gyI@Wzn|uOgKzE%p zo>?R?GJ!cCq^*xr)8-0=A=9{UpEbOYCz*!(4BqK+&orHLQ=VlEPEPt}kSQyVvC(wT zwe2&mZv~d?jE(cr12Z?^Ou958o55h7HTln(o=>z&Co`sbp5{!MJqzb;Eo<6?PLCS| zZZ2cdD%i~Vkm7VyQ8{m7jlk2q15Y|tru)9 zFuQG=p+>yQ-6^w$il)q2-}M68aq4VBQ3}2}WKv&N(d?rh{pGEw!Z&t(JaOz{XxTVG$<7dgYoWPp2Om9r{b<;6u_eSO{BbXj7TE3OF&0$B&nX!6ojosSR zv~By2W>pme_Z3Q_nL^gORIq{tB`M2%jD*?}A2(=nr(A=LV#vyS)DQW|ZnZ@{$69(l zlb%MXuvgs|ANC0tS<~rQP^%wIU$(G z;*DxXcXK&fq8}5yZnamvz=l1k`N3e`bl8+`ingbz?W{kodFJ389ZKPho+U1KSmHCK ze!~h}-biSiZc)`S)?K$@@HK32+O|net0S`V6PdQia*7rmgyd1;Jd~H6Aenkh*kGCM zGoX{Hj?gw`P@$6!_>*vv4);a43a`Lh@Ktypz6U>pU%~I;&+s=yT!*!|9yeeEZpU4r z3v}TT?7=}iLynNfahygAXVAxaT);)VjGw~i@ddn!pT=wW8orL7$1mWQ@f~~@-@~ur zH}NL^0Dp)-#oKrXe}lipKjGi;A9z<_{oRHwV`x!mrPEh ztPQJs_EPnPvQAW++uCJvP(|X^cys6e7`dTR6IR;}Qx!!ee)OprIi#{CtUj8eD)35k zb6-Dob5oK3Q`Y_g+=k!5hj5pyeIstcCj1C?U>8~VGkBU?c^XIX0#4A8pG5<6=%9<2 z$lfpG75oG);U~%3UnG0~48DY)#n0iZWb<$07x7E@7Jh{+{_A)Hzk%Pu@8bLT{m}M* zNtXWy{9}bRpIT|n_?OkJxtR7G+jXX>jlFnk$%hA^7y98ey~6q{0S!F3ejB+^R&Me1CX`z%r=_P*D0|K>?ZTejvb(3H z7EEK}i-5)#G2Wu_L4}BkinkXvilB);D4Jl58i>ZrgCy#MN`n7fPFpDWM2wi7WcQ!> z|M_QjzWM&yomoN%)MkxJLZXBa880eT1#dS<)K0HaNfMfgC;|P6n@-to3QOv!x}hRO zAVeTUAVeTUAVlE5fdIaRcz#EywhjgJqalrK8Pq z47ab=%{qq9d=uOtM)@a3DZby`YK@9*;Hv)8${>($y>vs0boBLamD>sz0P5qY3v?WweNYI)Ve|7W|9_;f<8Ix zGSQ=_EvGAX=Vgv-Bo?2~b1I4P41QY{?tx5VO`L=~AVA~hsI zI>-SsNRE?d$xGy2@(H;_ekWI95=@6uSOjIT99BXcYG51eggv0cKJG8&W?d8Q2?0K4 z#1z|Im5H>Q>0zd_6L}*nes3M8cU~el`Co#dH=BB`E!n<9>9{GD*UolZ+O@M8$M010 z)4H9`+InEt*fvEGb=S|<2yR?wO78GoFF*!hW1Xs+_04T2wq^C2_1L06G&Q5}j+~l2 zW6s?9U|>0cwbwGecHK{#j)Ak;+GiO-cU!OJTPfRYarBHC z$%nGY`6)%kGiQ}(8m}5E9h5avdsF3YNbktfe*LEHE1t}te(bpFmC2) zrP@wvsq;*{8^U3Mwn%C55g1w3dBw#_h0?MgSA>Y_bInp^xz@@^8Bq=1PqngIYwP7) zj;Ncsa-CABC2@u`I7C0fbv0U@wwrdlS@(mc9@C+ZbdKBZLfa0%TldVSK3tK+6KzB- z3t-e!rv}3cTxLWxww7vIJ8iDUFxVJo78Os?5?ZUQek$V>Sx&Eos~|=gUkv4;poqm6 za!!tj1qyU5UcvSFEu@huQcpIMJ;Wme}@EZ7G=9E5%tfJ1OUJOD@F7(58a;YoN3o`z@O1iTEd zz-f35-iCAVA$$a%!9}&9_aUUEnW;0(>Dv=Pg{a zta@F|5Cu7Bb2J@Ee#ZD~;)F4th2C{+J=@~z_d1#*%6KrWLj$nnWA4T|6nsDNtZ^#<6=xSfDj*bSYy@Tb6l3^?Gz z0c80hI1Kl~Al!!>KZ-1W2p)#V;Bj~Ynf@F+4==z;coBL2I=lgI!F%vNoPo1~@n0d| ze}bPmS%)~hK zsL8#`s5ML>0wDq+0wDq+0=EVMy6wRfrDp&QH~;_7DuuTYfe?ZJCjv00K2cAP`)>BR zNzdA&c=reAk^h{wbU<;dMXFG#2lu7{bxY9{}1>7 PxkK1ncF=Zv?f?GSbS7P}p^ji8s;n=%f+LgWCb9e6w z7POkEQG!tu6+aXIG79pCU%^BpB#IdIAA>0Tp@}gD6E*k|OpJ-X+1V>?DT?tU74zpePv>ydwrMIO;=Qzo;h%nPhMR-r)nhk-)(q8h0h*#>m!1yIP|W@YGixZe zi;c4eUJ!(YR5mbBQ&(FRs);PwQxzJhtBF*FYHOD6*(31N!i$!-CU)p)!@M6?feE~y z1Tu-$hw{Bx8iR`w9#}c=%Zv1~bB%2M1wHxopU$sem{=rE3UqaE?h&^pq>>yiv?b$c zreSYVEgNM*nrtH>%_-B^V5zjdBW3E@v|%TtDJfY`Wp&w6>vcV@-KL^$vYoO_UEg5Z z8a30^>8Lv$+IB%xXSZ!yPNQoqAxT+VZB@~hmQ!PB(eBi6ND3?+qJb4aI8;0%cy&c} z&2=m4SFLG@pO`F7DG|kK(>rpSttEA}OSV(0p=d^Ld%vbQeciYthNErQR7()1K)lV6 z)9Q(`nX^g)vjcPUDAxBpmY2eOXEv$bn$?_LY>Ys8Sm32sdla1DI#Zz*6}Kf2D4);s zo2kChQZZ+0F|eQt0dkv->+q%-Su6;W-L?bWhC#(;wY(rH?Yf*)bx(D}a#XG9$gw@} zls83roPAX%zI4*K9-FBHu_m6Ej&7x6ua#}5C8HWcvua+AZO6OqKG{-R`q6VeO!Io4 zcXt-`6x5_>j%hJU$^)%D-$l*UD+*dFnK`ShtvwLHJ<^PvhH--X%ECqZ2m>gb-=A=_ zk`=>8QiE>EC0YnaBVHGt%po--M%I#T_>LGL`^bKBfV@K9A;-waUL&si-$dW3 zVj6E#OQ%hr5t>)IXzBGU8-`qxIdR@^hsT2(0wV&)4FT6fM*A*CW?;5BH`tCbqV7B& zkt{;<@hVNA(ZExu4O}ILgVH#RB38XdtO!cuF@jiiL9jX~aTvI)8VS~jQUQjg;9{2r zt3?TTR;d%0i&7y5D68HmMn#FxcLu9B2AhHs4Yz;H?N5;}$Qg9|U(xN0VJeite023% zh@zXXhYhe1+Mpd>eH+M-0tM1wLIx~!{M~Rn+yQsOU9cDSq1!(Q55W`g6g&;jz;p0C zI{!g<5ncZPeBcJb=WqtTh3`f=_4<)c4L^_V)WbhutnYt0R{W^@ z0W*gCr_J*pD}UT`#D_^`lul#}d%3t}=%&$&t@%KtJ^kb};4|Pe;4^SVGEl%)9isRD zO?aTa$p8OWBscz|eFm-+2B0t&kJ0PAi+vk%*cQTP8$LAAeuGT95X@*7s&}vBu|n_l rDm-2O9824yo^Fsy7mj)tj*{Kx|LcDSlmz_qzkmM!PjBBYxAXt+t*>T7 literal 0 HcmV?d00001 diff --git a/examples/i11/mythen3_reduction_config.toml b/examples/i11/mythen3_reduction_config.toml new file mode 100644 index 0000000..2c7b7cf --- /dev/null +++ b/examples/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 = "internal" #this can be "internal" "external" or "best", internal error is propagated poisson errors, external is std_dev of counts in bin (will result in nan values if there is only 1 count in the bin), and "best" 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 = "/dls_sw/i11/software/mythen/badchannels.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/examples/i11/step_scan/1406731.nxs b/examples/i11/step_scan/1406731.nxs new file mode 100644 index 0000000000000000000000000000000000000000..8bf8bab33098ebc8e2986886050377dfda089a4b GIT binary patch literal 88872 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
EJD+DEpZkgP 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

Sdq@Nd8;0ry02ejk!J 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� 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 literal 0 HcmV?d00001 From cf51d2d1803b00d2fc77c62539a941c80b2c6415 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 30 Jan 2026 12:50:47 +0000 Subject: [PATCH 34/86] added DS_Store to gitignore --- .DS_Store | Bin 10244 -> 0 bytes .gitignore | 3 +++ examples/.DS_Store | Bin 10244 -> 0 bytes examples/i11/.DS_Store | Bin 10244 -> 0 bytes 4 files changed, 3 insertions(+) delete mode 100644 .DS_Store delete mode 100644 examples/.DS_Store delete mode 100644 examples/i11/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 0eb316b8e8d5d968bc15f973f646c626d5ec31bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 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 From 424b4f2271fcff26675f4263e056ef573c03db50 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 30 Jan 2026 13:08:21 +0000 Subject: [PATCH 35/86] added tests for mythen settings save/load --- src/xrpd_toolbox/i11/mythen.py | 11 ++++---- tests/test_mythen.py | 50 +++++++++++++++++++++------------- tests/test_utils.py | 22 +++++++++++++++ 3 files changed, 59 insertions(+), 24 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index ce241b7..a9bc953 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -17,19 +17,20 @@ class SettingsBase(BaseModel): @classmethod def load_from_toml(cls, file_path: str | Path): - with open(file_path, "rb") as f: - settings_dict = tomllib.load(f) + with open(file_path, "rb") as file: + settings_dict = tomllib.load(file) return cls(**settings_dict) @classmethod def load_from_yaml(cls, file_path: str | Path): - settings_dict = yaml.safe_load(open(file_path, "rb")) + with open(file_path, "rb") as file: + settings_dict = yaml.safe_load(file) return cls(**settings_dict) def save_to_toml(self, file_path: str | Path) -> None: if not str(file_path).endswith(".toml"): - raise ValueError("file name must end with .toml") + raise ValueError("file_path name must end with .toml") print("Saving configuration to:", file_path) @@ -40,7 +41,7 @@ def save_to_toml(self, file_path: str | Path) -> None: def save_to_yaml(self, file_path: str | Path) -> None: if not str(file_path).endswith(".yaml"): - raise ValueError("file name must end with .yaml") + raise ValueError("file_path name must end with .yaml") print("Saving configuration to:", file_path) diff --git a/tests/test_mythen.py b/tests/test_mythen.py index a1c08b3..51497af 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -1,8 +1,8 @@ -import numpy as np +import os + import pytest from xrpd_toolbox.i11.mythen import MythenReductionSettings -from xrpd_toolbox.utils.utils import bin_and_propagate_errors, gaussian @pytest.fixture @@ -37,26 +37,38 @@ def test_mythen_settings_load_from_toml(): "/workspaces/XRPD-Toolbox/examples/i11/mythen3_reduction_config.toml" ) - print(settings.rebin_step) + assert isinstance(settings, MythenReductionSettings) -def test_peak_bin_and_propagate_errors(): - x1 = np.arange(0, 10, 0.1) - y1 = gaussian(x1, amp=10.0, cen=5.0, fwhm=1.0, background=0.1) - e1 = np.sqrt(y1) +def test_mythen_toml_save_load(mythen_settings: MythenReductionSettings): + file_path = "file.toml" - x2 = np.arange(0.01, 10.01, 0.1) - y2 = gaussian(x2, amp=20.0, cen=5.0, fwhm=1.0, background=0.1) - e2 = np.sqrt(y2) + mythen_settings.save_to_toml(file_path) + loaded_mythen_settings = MythenReductionSettings.load_from_toml(file_path) - x_combined = np.concatenate((x1, x2)) - y_combined = np.concatenate((y1, y2)) - e_combined = np.concatenate((e1, e2)) + assert mythen_settings == loaded_mythen_settings - binned_x, binned_y, binned_e = bin_and_propagate_errors( - x_combined, y_combined, e_combined, rebin_step=0.1, error_calc="internal" - ) + os.remove(file_path) + + +def test_mythen_yaml_save_load(mythen_settings: MythenReductionSettings): + file_path = "file.yaml" + + mythen_settings.save_to_yaml(file_path) + loaded_mythen_settings = MythenReductionSettings.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: MythenReductionSettings, +): + file_path = "file.txt" + + with pytest.raises(ValueError): + mythen_settings.save_to_yaml(file_path) - assert len(binned_x) == len(binned_y) == len(binned_e) - assert np.amax(binned_y) > np.amax(y1) - assert np.amax(binned_y) > np.amax(y2) + with pytest.raises(ValueError): + mythen_settings.save_to_toml(file_path) diff --git a/tests/test_utils.py b/tests/test_utils.py index f85a002..a6c5917 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -103,3 +103,25 @@ def test_get_folder_paths(): assert "/workspaces" in list_of_paths assert isinstance(list_of_paths, list) + + +# def test_peak_bin_and_propagate_errors(): +# x1 = np.arange(0, 10, 0.1) +# y1 = gaussian(x1, amp=10.0, cen=5.0, fwhm=1.0, background=0.1) +# e1 = np.sqrt(y1) + +# x2 = np.arange(0.01, 10.01, 0.1) +# y2 = gaussian(x2, amp=20.0, cen=5.0, fwhm=1.0, background=0.1) +# e2 = np.sqrt(y2) + +# x_combined = np.concatenate((x1, x2)) +# y_combined = np.concatenate((y1, y2)) +# e_combined = np.concatenate((e1, e2)) + +# binned_x, binned_y, binned_e = bin_and_propagate_errors( +# x_combined, y_combined, e_combined, rebin_step=0.1, error_calc="internal" +# ) + +# assert len(binned_x) == len(binned_y) == len(binned_e) +# assert np.amax(binned_y) > np.amax(y1) +# assert np.amax(binned_y) > np.amax(y2) From db50db37e312c3d2f3297fd1a2e23005d395936b Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 30 Jan 2026 13:16:48 +0000 Subject: [PATCH 36/86] assert home in folder test --- tests/test_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index a6c5917..3e4ee75 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -101,7 +101,7 @@ def test_load_int_array_from_file_returns_none_when_file_empty(): def test_get_folder_paths(): list_of_paths = get_folder_paths("/") - assert "/workspaces" in list_of_paths + assert "/home" in list_of_paths assert isinstance(list_of_paths, list) From 12af5167bd2f324b4131bf3eede520eb1f5247e2 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 30 Jan 2026 14:18:29 +0000 Subject: [PATCH 37/86] used pathlib to get correct filepath for config --- tests/test_mythen.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_mythen.py b/tests/test_mythen.py index 51497af..60d0b34 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -1,9 +1,14 @@ import os +from pathlib import Path import pytest from xrpd_toolbox.i11.mythen import MythenReductionSettings +CONFIG_FILE = ( + Path(__file__).parent.parent / "examples" / "i11" / "mythen3_reduction_config.toml" +) + @pytest.fixture def mythen_settings(): @@ -33,9 +38,7 @@ def test_mythen_settings(mythen_settings: MythenReductionSettings): def test_mythen_settings_load_from_toml(): - settings = MythenReductionSettings.load_from_toml( - "/workspaces/XRPD-Toolbox/examples/i11/mythen3_reduction_config.toml" - ) + settings = MythenReductionSettings.load_from_toml(CONFIG_FILE) assert isinstance(settings, MythenReductionSettings) From 2d2597d0e36efad2706401ab8c2cdb31c9ae2d02 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Mon, 2 Feb 2026 11:06:53 +0000 Subject: [PATCH 38/86] added new pydnatic model for angular calibration --- src/xrpd_toolbox/i11/mythen.py | 204 +++++++++++++++--- .../i11/mythen3_reduction_legacy.py | 4 +- .../mythen_calibration/ang_cal_171125.json | 4 + .../ang_cal_171125_new.json | 116 ++++++++++ src/xrpd_toolbox/utils/utils.py | 20 +- tests/test_mythen.py | 4 + 6 files changed, 314 insertions(+), 38 deletions(-) create mode 100644 src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125_new.json diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index a9bc953..34b1a0d 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -1,6 +1,8 @@ +import json +import os +import re import tomllib from collections import OrderedDict -from collections.abc import Collection from pathlib import Path from typing import Literal @@ -11,7 +13,13 @@ from h5py import Dataset, File from pydantic import BaseModel -from xrpd_toolbox.utils.utils import get_entry, load_int_array_from_file +from xrpd_toolbox.utils.utils import ( + get_entry, + h5_to_array, + load_int_array_from_file, +) + +SUPPORTED_FILE_TYPES = ["json", "toml", "yaml"] class SettingsBase(BaseModel): @@ -28,6 +36,25 @@ def load_from_yaml(cls, file_path: str | Path): settings_dict = yaml.safe_load(file) return cls(**settings_dict) + @classmethod + def load_from_json(cls, file_path: str | Path): + with open(file_path, "rb") as file: + settings_dict = json.load(file) + return cls(**settings_dict) + + @classmethod + def load(cls, file_path: str | Path): + filename, file_extension = os.path.splitext(str(file_path)) + + if file_extension == "json": + return cls.load_from_json(file_path) + elif file_extension == "yaml": + return cls.load_from_yaml(file_path) + elif file_extension == "toml": + return cls.load_from_toml(file_path) + else: + raise ValueError(f"Filetype must be: {SUPPORTED_FILE_TYPES}") + def save_to_toml(self, file_path: str | Path) -> None: if not str(file_path).endswith(".toml"): raise ValueError("file_path name must end with .toml") @@ -39,6 +66,17 @@ def save_to_toml(self, file_path: str | Path) -> None: with open(file_path, "w") as outfile: toml.dump(config_dict, outfile) + def save_to_json(self, file_path: str | Path) -> None: + if not str(file_path).endswith(".json"): + raise ValueError("file_path name must end with .json") + + print("Saving configuration to:", file_path) + + config_dict = self.model_dump() + + with open(file_path, "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") @@ -58,6 +96,44 @@ def save_to_yaml(self, file_path: str | Path) -> None: ) +class ModuleConversion(BaseModel): + conv: float + offset: float + + +class AngularCalibration(SettingsBase): + beamline_offset: float + centre: float + 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 MythenReductionSettings(SettingsBase): active_modules: list[int] = list(range(28)) bad_modules: list[int] = [] @@ -87,33 +163,48 @@ class MythenDataLoader: def __init__( self, file_path: str | Path, - active_modules: Collection[int] = tuple(range(28)), pixels_per_module: int = 1280, counter: int = 0, + mythen_data_path="mythen_nx", ): self.file_path = Path(file_path) - self.active_modules = active_modules self.pixels_per_module = pixels_per_module self.counter = counter + self.mythen_data_path = mythen_data_path self.entry = get_entry(self.file_path) - self.dataset_path = f"/{self.entry}/mythen_nx/data" + 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.n_modules_in_data != len(self.active_modules): - raise ValueError("Mismatch between active modules and data.") - - self.get_deltas() + self.delta_path = self.get_delta_path() + self.deltas_or_ds = self.get_deltas() - self.raw_data = self.load_data() + self.raw_data = self.load_data(self.counter) self.module_data = np.array_split( - self.raw_data, len(self.active_modules), axis=-1 + self.raw_data, self.n_modules_in_data, axis=-1 ) - self.n_modules = len(self.module_data) - def get_deltas(self) -> list[float]: - return [1.0] + def get_delta_path(self) -> str: + delta_subpaths = ("delta", "deltas", "ds") + + with h5py.File(self.file_path, "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)}" + ) + + def get_deltas(self) -> np.ndarray: + deltas_or_ds = h5_to_array(self.file_path, self.delta_path) + + return deltas_or_ds def read_nxs_metadata(self) -> tuple[int, int]: with h5py.File(self.file_path, "r") as file: @@ -127,7 +218,7 @@ def read_nxs_metadata(self) -> tuple[int, int]: else: raise ValueError(f"Data is None at {self.dataset_path}") - def load_data(self) -> np.ndarray: + def load_data(self, counter: int) -> np.ndarray: if not self.file_path.exists(): raise FileNotFoundError(self.file_path) @@ -143,22 +234,20 @@ def load_data(self) -> np.ndarray: if data.ndim < 1: raise ValueError("Data has insufficient dimensions.") self.n_frames = len(data) - data = data[..., self.counter] + data = data[..., counter] return np.asarray(data) else: raise ValueError("Data is None.") - def get_module_data(self, module_index: int) -> np.ndarray: - if module_index not in self.active_modules: - raise IndexError("Module index out of range.") - + def get_module_data(self, module_index): return self.module_data[module_index] class MythenModule: - def __init__(self, data, pixels_per_modules: int = 1280): + def __init__(self, data: np.ndarray, pixels_per_modules: int = 1280): self.pixels_per_modules = pixels_per_modules + self.data = data def process(self): # Example processing: compute the mean @@ -167,30 +256,77 @@ def process(self): class MythenDetector: def __init__( - self, filepath: str | Path, settings: MythenReductionSettings | None = None + self, + file_path: str | Path, + settings: MythenReductionSettings | None = None, + angular_calibration: AngularCalibration | None = None, ): - self.filepath = filepath - self.mythen_data = MythenDataLoader(filepath) + self.file_path = file_path self.settings = settings or MythenReductionSettings() + self.angular_calibration = angular_calibration + + # mythen data loader, just loads the data, + # it has no information about which modules are which + self.mythen_data = MythenDataLoader( + file_path=file_path, + ) self.modules = OrderedDict() - for module in self.settings.active_modules: + for n_module, module in enumerate(self.settings.active_modules): self.modules[module] = MythenModule( - self.mythen_data.get_module_data(module) + data=self.mythen_data.get_module_data(n_module) ) +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) + + if __name__ == "__main__": - filepath = "/workspaces/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml" # noqa + PARENT_PATH = Path(__file__).parent.parent - settings = MythenReductionSettings.load_from_toml(filepath) - print("Loaded settings:", settings) + print(PARENT_PATH) - MythenDetector( - filepath="/dls/i11/data/2026/cm44155-1/1406733.nxs", settings=settings + CONFIG_FILE = ( + PARENT_PATH / "i11" / "mythen_calibration" / "mythen3_reduction_config.toml" ) - # module = MythenModule(data) - # result = module.process() - # print("Processed result:", result) + DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1406731.nxs" + + ANG_CAL = PARENT_PATH / "i11" / "mythen_calibration" / "ang_cal_171125_new.json" + settings = MythenReductionSettings.load_from_toml(CONFIG_FILE) + print("Loaded settings:", settings) + + print(DATA_FILE) + + MythenDataLoader(DATA_FILE) + + angular_calibration = AngularCalibration.load_from_json(ANG_CAL) + + # MythenDetector( + # file_path=DATA_FILE, + # settings=settings, + # angular_calibration=angular_calibration + # ) diff --git a/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py b/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py index 4ec2b29..6b6a7b3 100644 --- a/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py +++ b/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py @@ -14,7 +14,7 @@ from h5py import File as h5pyFile from xrpd_toolbox.utils.daq_messenger import DaqMessenger -from xrpd_toolbox.utils.energy import convert_tth_to_q +from xrpd_toolbox.utils.energy import tth_to_q from xrpd_toolbox.utils.utils import load_int_array_from_file np.seterr( @@ -1146,7 +1146,7 @@ def bin_data( ] # remove no counts #remove null counts if (self.beam_energy) and (self.save_in_q_space): - q_space = convert_tth_to_q(xyedata["tth"].to_numpy(), self.wavelength) + q_space = tth_to_q(xyedata["tth"].to_numpy(), self.wavelength) xyedata["Q"] = q_space return xyedata diff --git a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json index f51ac2e..7cd1aba 100644 --- a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json +++ b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json @@ -34,6 +34,8 @@ "offset_15": 5.43245569047748, "conv_16": -6.559859936901077e-05, "offset_16": 10.438755845366217, + "conv_17": -6.559958016268705e-05, + "offset_17": 15.46089825957060, "conv_18": -6.561026146803566e-05, "offset_18": 20.434766311618212, "conv_19": -6.561170974362194e-05, @@ -46,6 +48,8 @@ "offset_22": 40.45283216309983, "conv_23": -6.564782459391464e-05, "offset_23": 45.45746776051998, + "conv_24": -6.566850538481755e-05, + "offset_24": 50.490325933600815, "conv_25": -6.567031885143943e-05, "offset_25": 55.46414350273406, "conv_26": -6.56761558320164e-05, diff --git a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125_new.json b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125_new.json new file mode 100644 index 0000000..60b77eb --- /dev/null +++ b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125_new.json @@ -0,0 +1,116 @@ +{ + "beamline_offset": -0.49797387571608365, + "centre": 639.5, + "module_0": { + "conv": 6.570184497741959e-05, + "offset": 67.96978209773698 + }, + "module_1": { + "conv": 6.568315103360132e-05, + "offset": 62.96538344998067 + }, + "module_2": { + "conv": 6.568292984577048e-05, + "offset": 57.954158956916906 + }, + "module_3": { + "conv": 6.566155391015388e-05, + "offset": 52.95557701205766 + }, + "module_4": { + "conv": 6.566551064046604e-05, + "offset": 47.9555186087957 + }, + "module_5": { + "conv": 6.56564416881416e-05, + "offset": 42.94753952319434 + }, + "module_6": { + "conv": 6.563593626034103e-05, + "offset": 37.94886671053375 + }, + "module_7": { + "conv": 6.564169975987083e-05, + "offset": 32.93554609049577 + }, + "module_8": { + "conv": 6.56217783956062e-05, + "offset": 27.934354886129004 + }, + "module_9": { + "conv": 6.562040232230031e-05, + "offset": 22.932921824280186 + }, + "module_10": { + "conv": 6.563425551557966e-05, + "offset": 17.93115217829966 + }, + "module_11": { + "conv": 6.50714144302067e-05, + "offset": 12.93714697370569 + }, + "module_12": { + "conv": 6.559688777484265e-05, + "offset": 7.925242220666613 + }, + "module_13": { + "conv": 6.558346574831002e-05, + "offset": 2.9349146500271828 + }, + "module_14": { + "conv": -6.558871353830087e-05, + "offset": 0.43719841617827926 + }, + "module_15": { + "conv": -6.55873849338328e-05, + "offset": 5.43245569047748 + }, + "module_16": { + "conv": -6.559859936901077e-05, + "offset": 10.438755845366217 + }, + "module_17": { + "conv": -6.559958016268705e-05, + "offset": 15.460898259570609 + }, + "module_18": { + "conv": -6.561026146803566e-05, + "offset": 20.434766311618212 + }, + "module_19": { + "conv": -6.561170974362194e-05, + "offset": 25.443743042246087 + }, + "module_20": { + "conv": -6.562461529722984e-05, + "offset": 30.440076040360058 + }, + "module_21": { + "conv": -6.564163529664693e-05, + "offset": 35.44938893414347 + }, + "module_22": { + "conv": -6.565333081177747e-05, + "offset": 40.45283216309983 + }, + "module_23": { + "conv": -6.564782459391464e-05, + "offset": 45.45746776051998 + }, + "module_24": { + "conv": -6.566850538481755e-05, + "offset": 50.490325933600815 + }, + "module_25": { + "conv": -6.567031885143943e-05, + "offset": 55.46414350273406 + }, + "module_26": { + "conv": -6.56761558320164e-05, + "offset": 60.46960365808682 + }, + "module_27": { + "conv": -6.567657918854628e-05, + "offset": 65.48052129001229 + } +} diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 1bc384e..bc645f6 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -1,3 +1,4 @@ +import json import os import re from collections.abc import Iterable @@ -5,13 +6,14 @@ import h5py import numpy as np +from h5py import Dataset, File class NexusToDict: def __init__(self, nexus_filepath: str | Path): self.nexus_dict = {} - with h5py.File(nexus_filepath, "r") as open_nexus_file: + with File(nexus_filepath, "r") as open_nexus_file: self.recursive_inspect(open_nexus_file) def recursive_inspect(self, dataset): @@ -36,11 +38,25 @@ def get_dict(self) -> dict: return self.nexus_dict +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 h5py.File(nexus_filepath, "r") as file: + 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) diff --git a/tests/test_mythen.py b/tests/test_mythen.py index 60d0b34..1cb242d 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -75,3 +75,7 @@ def test_mythen_load_fails_when_incorrect_file_extension( with pytest.raises(ValueError): mythen_settings.save_to_toml(file_path) + + +def test_mythen_data_loader(): + pass From d23915a72005d4084e813a59bc92e781ad503dc9 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Mon, 2 Feb 2026 11:19:35 +0000 Subject: [PATCH 39/86] add sign function to conv --- src/xrpd_toolbox/i11/mythen.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 34b1a0d..8f4bb22 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -1,4 +1,5 @@ import json +import math import os import re import tomllib @@ -100,6 +101,10 @@ class ModuleConversion(BaseModel): conv: float offset: float + @property + def module_sign(self) -> int: # returns -1 or 1 depending on sign of conv + return int(math.copysign(1, self.conv)) + class AngularCalibration(SettingsBase): beamline_offset: float From 24d13b1dbe5e1486c01789ad61d7e3069614823f Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Mon, 2 Feb 2026 17:28:22 +0000 Subject: [PATCH 40/86] further improvements to pydantic mythen --- src/xrpd_toolbox/gui/bad_pixel_gui.py | 380 ++++++++++++++++--------- src/xrpd_toolbox/i11/mythen.py | 103 +++++-- src/xrpd_toolbox/utils/mythen_utils.py | 95 +++++++ src/xrpd_toolbox/utils/peaks.py | 48 ++++ src/xrpd_toolbox/utils/utils.py | 16 +- tests/test_utils.py | 4 +- 6 files changed, 474 insertions(+), 172 deletions(-) create mode 100644 src/xrpd_toolbox/utils/mythen_utils.py create mode 100644 src/xrpd_toolbox/utils/peaks.py diff --git a/src/xrpd_toolbox/gui/bad_pixel_gui.py b/src/xrpd_toolbox/gui/bad_pixel_gui.py index f3088b9..3d9e4e8 100644 --- a/src/xrpd_toolbox/gui/bad_pixel_gui.py +++ b/src/xrpd_toolbox/gui/bad_pixel_gui.py @@ -6,6 +6,7 @@ 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, @@ -13,9 +14,12 @@ QLabel, QListWidget, QListWidgetItem, + QMainWindow, + QMessageBox, QPushButton, QSlider, QSpinBox, + QTextEdit, QVBoxLayout, QWidget, ) @@ -23,6 +27,10 @@ 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__( @@ -30,7 +38,6 @@ def __init__( data: MythenDataLoader, global_selected_indices: set[int], selection_callback, - undo_limit: int = 10, pixels_per_modules: int = 1280, parent: QWidget | None = None, ) -> None: @@ -38,15 +45,12 @@ def __init__( super().__init__(self.figure) self.setParent(parent) - self._pan_start = None # new attribute - self.ax = self.figure.add_subplot(111) + self._pan_start = None self.data = data self.raw_data = data.raw_data - self.pixels_per_modules = pixels_per_modules - self.undo_limit = undo_limit self.current_module = 0 self.global_selected_indices = global_selected_indices @@ -58,7 +62,6 @@ def __init__( self._connect_events() self._plot_module(0) - self._enable_rectangle_zoom() def _connect_events(self) -> None: self.mpl_connect("scroll_event", self._on_scroll) @@ -71,7 +74,6 @@ def _plot_module(self, module: int) -> None: start = module * self.pixels_per_modules end = start + self.pixels_per_modules - curves = self.raw_data[:, start:end] for curve in curves: @@ -81,15 +83,14 @@ def _plot_module(self, module: int) -> None: self.ax.set_title(f"Mythen Data — Module {module}") self.ax.set_xlabel("Pixel (within module)") - self.ax.set_ylabel("Intensity (Arb. Units.)") - - self.ax.relim() - self.ax.autoscale() + 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: @@ -105,51 +106,49 @@ def _enable_rectangle_zoom(self) -> None: 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 set_module(self, module: int) -> None: - self.current_module = module - self._plot_module(module) - def _on_scroll(self, event) -> None: if event.xdata is None or event.ydata is None: return - zoom_factor = 1.05 - factor = 1 / zoom_factor if event.button == "up" else zoom_factor + zoom = 1.05 + factor = 1 / zoom if event.button == "up" else zoom - x_min, x_max = self.ax.get_xlim() - y_min, y_max = self.ax.get_ylim() + x0, x1 = self.ax.get_xlim() + y0, y1 = self.ax.get_ylim() - x_range = (x_max - x_min) * factor - y_range = (y_max - y_min) * factor - - self.ax.set_xlim(event.xdata - x_range / 2, event.xdata + x_range / 2) - self.ax.set_ylim(event.ydata - y_range / 2, event.ydata + y_range / 2) + 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 - - x0, x1 = sorted((eclick.xdata, erelease.xdata)) - y0, y1 = sorted((eclick.ydata, erelease.ydata)) - - self.ax.set_xlim(x0, x1) - self.ax.set_ylim(y0, y1) + 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: - # Right-click toggle if event.button == 3 and event.xdata is not None: - index = int(round(event.xdata)) - if 0 <= index < self.data.pixels_per_module: - global_index = self.current_module * self.data.pixels_per_module + index - self.selection_callback(global_index) - # Middle-button press starts panning + 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, @@ -161,12 +160,15 @@ def _on_click(self, event) -> None: 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"] - xlim_start, xlim_end = self._pan_start["xlim"] - ylim_start, ylim_end = self._pan_start["ylim"] - self.ax.set_xlim(xlim_start - dx, xlim_end - dx) - self.ax.set_ylim(ylim_start - dy, ylim_end - dy) + + 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: @@ -177,64 +179,66 @@ def _update_selected_points(self) -> None: if self.scatter is None or self.reference_curve is None: return - module_start = self.current_module * self.pixels_per_modules - module_end = module_start + self.pixels_per_modules + start = self.current_module * self.pixels_per_modules + end = start + self.pixels_per_modules - local_indices = [ - idx - module_start - for idx in self.global_selected_indices - if module_start <= idx < module_end + local = [ + idx - start for idx in self.global_selected_indices if start <= idx < end ] - if local_indices: - x = self.x[local_indices] - y = self.reference_curve[local_indices] - offsets = np.column_stack((x, y)) + if local: + x = self.x[local] + y = self.reference_curve[local] + self.scatter.set_offsets(np.column_stack((x, y))) else: - offsets = np.empty((0, 2)) + self.scatter.set_offsets(np.empty((0, 2))) - self.scatter.set_offsets(offsets) self.draw_idle() -class MainWindow(QWidget): - def __init__( - self, data: MythenDataLoader, initial_indices: set[int], undo_limit: int = 10 - ) -> None: +# ========================= +# Main window +# ========================= + + +class MainWindow(QMainWindow): + def __init__(self, data: MythenDataLoader, initial_indices: set[int]) -> None: super().__init__() self.setWindowTitle("Mythen NXS Viewer") - self.global_selected_indices = initial_indices self.data = data - self.undo_limit = undo_limit + 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, - undo_limit=self.undo_limit, ) + 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 - 1) - self.module_slider.valueChanged.connect(self.canvas.set_module) + 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_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) + self.save_button.clicked.connect(self._save) self.n_spin = QSpinBox() self.n_spin.setRange(1, self.data.pixels_per_module // 2) @@ -243,129 +247,229 @@ def __init__( 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._timer_id = self.startTimer(200) + self._setup_menu() + self._sync_all() - def _setup_layout(self) -> None: - right_layout = QVBoxLayout() - right_layout.addWidget(QLabel("Selected Global Indices")) - right_layout.addWidget(self.list_widget) - right_layout.addWidget(QLabel("N (edge points per module)")) - right_layout.addWidget(self.n_spin) - right_layout.addWidget(self.add_edges_button) - - # Undo/Redo buttons side by side - undo_redo_layout = QHBoxLayout() - undo_redo_layout.addWidget(self.undo_button) - undo_redo_layout.addWidget(self.redo_button) - right_layout.addLayout(undo_redo_layout) - - right_layout.addWidget(self.save_button) - - left_layout = QVBoxLayout() - left_layout.addWidget(self.canvas) - left_layout.addWidget(self.module_slider) - left_layout.addWidget(self.reset_zoom_button) - - main_layout = QHBoxLayout() - main_layout.addLayout(left_layout, stretch=3) - main_layout.addLayout(right_layout, stretch=1) - - self.setLayout(main_layout) - - def timerEvent(self, event) -> None: # type: ignore # noqa - self._sync_list() - - def _sync_list(self) -> None: - indices = sorted(self.global_selected_indices) - if self.list_widget.count() == len(indices): - return + # ---------- 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 indices: + 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 _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 - def _undo(self) -> None: if not self.undo_stack: return + self.redo_stack.append(self.global_selected_indices.copy()) - prev_state = self.undo_stack.pop() + prev = self.undo_stack.pop() + self.global_selected_indices.clear() - self.global_selected_indices.update(prev_state) + 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()) - next_state = self.redo_stack.pop() + nxt = self.redo_stack.pop() + self.global_selected_indices.clear() - self.global_selected_indices.update(next_state) + 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 module in range(self.data.n_modules): - base = module * self.data.pixels_per_module + 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_indices(self) -> None: + def _save_as(self) -> None: path_str, _ = QFileDialog.getSaveFileName( - self, - "Save Indices", - "", - "Text Files (*.txt)", + self, "Save Indices", "", "Text Files (*.txt)" ) if not path_str: return - path = Path(path_str) - with path.open("w", encoding="utf-8") as f: - for idx in sorted(self.global_selected_indices): - f.write(f"{idx}\n") + + 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_gui(filepath: str, indices_file: str | None = None) -> None: - mythen_data = MythenDataLoader(filepath) - initial_indices: set[int] = set() - if indices_file is not 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) - window = MainWindow(mythen_data, initial_indices) - window.resize(1450, 900) - window.show() + win = MainWindow(data, initial_indices) + win.resize(1500, 900) + win.show() sys.exit(app.exec()) if __name__ == "__main__": - filepath = "/dls/i11/data/2026/cm44155-1/1406733.nxs" - - mythen_data = MythenDataLoader(filepath) + DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1406731.nxs" - # Example usage: run_gui( - filepath, + DATA_FILE, indices_file="/dls_sw/i11/software/mythen/badchannels.txt", ) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 8f4bb22..ac125f2 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -21,6 +21,10 @@ ) SUPPORTED_FILE_TYPES = ["json", "toml", "yaml"] +MODULES_IN_DETECTOR = 28 +PIXELS_PER_MODULE = 1280 +PSD_RADIUS = 762 # mm +MYTHEN_PIXEL_SIZE = 0.05 # mm class SettingsBase(BaseModel): @@ -140,12 +144,12 @@ class AngularCalibration(SettingsBase): class MythenReductionSettings(SettingsBase): - active_modules: list[int] = list(range(28)) + active_modules: list[int] = list(range(MODULES_IN_DETECTOR)) bad_modules: list[int] = [] bad_channel_masking: bool = True flatfield_filepath: str | Path = "" apply_flatfield: bool = False - modules_in_flatfield: list[int] = list(range(28)) + modules_in_flatfield: list[int] = list(range(MODULES_IN_DETECTOR)) send_to_ispyb: bool = False rebin_step: float = 0.004 default_counter: int = 0 @@ -157,18 +161,12 @@ class MythenReductionSettings(SettingsBase): bad_channels_filepath: str | Path = "/dls_sw/i11/software/mythen/badchannels.txt" angcal_filepath: str | Path = "" - def load_bad_channels(self): - if not self.bad_channels_filepath: - raise ValueError("Bad channels file path is not set.") - self.bad_channels = load_int_array_from_file(self.bad_channels_filepath) - return self.bad_channels - class MythenDataLoader: def __init__( self, file_path: str | Path, - pixels_per_module: int = 1280, + pixels_per_module: int = PIXELS_PER_MODULE, counter: int = 0, mythen_data_path="mythen_nx", ): @@ -250,7 +248,12 @@ def get_module_data(self, module_index): class MythenModule: - def __init__(self, data: np.ndarray, pixels_per_modules: int = 1280): + def __init__( + self, + data: np.ndarray, + module_id: int, + pixels_per_modules: int = PIXELS_PER_MODULE, + ): self.pixels_per_modules = pixels_per_modules self.data = data @@ -263,12 +266,25 @@ class MythenDetector: def __init__( self, file_path: str | Path, - settings: MythenReductionSettings | None = None, angular_calibration: AngularCalibration | None = None, + settings: MythenReductionSettings | None = None, + output_directory: str | Path | None = None, ): self.file_path = file_path + + if not str(self.file_path).lower().endswith(".nxs"): + raise ValueError(f"{self.file_path} should be a Nexus File!!") + + if not output_directory: + self.output_directory = os.path.join(str(self.file_path), "processed") + self.settings = settings or MythenReductionSettings() - self.angular_calibration = angular_calibration + self.angular_calibration = angular_calibration or MythenReductionSettings.load( + self.settings.angcal_filepath + ) + + self.bad_channels = self.load_bad_channels() + self.bad_channels_to_mask() # mythen data loader, just loads the data, # it has no information about which modules are which @@ -280,9 +296,54 @@ def __init__( for n_module, module in enumerate(self.settings.active_modules): self.modules[module] = MythenModule( - data=self.mythen_data.get_module_data(n_module) + data=self.mythen_data.get_module_data(n_module), module_id=module ) + def load_bad_channels(self): + if not self.settings.bad_channels_filepath: + raise ValueError("Bad channels file path is not set.") + self.bad_channels = load_int_array_from_file( + self.settings.bad_channels_filepath + ) + return self.bad_channels + + def bad_channels_to_mask(self): + self.bad_channel_mask = OrderedDict() + + bins = np.arange( + 0, MODULES_IN_DETECTOR * PIXELS_PER_MODULE + 1, PIXELS_PER_MODULE + ) + indices = ( + np.digitize(self.bad_channels, bins) - 1 + ) # subtract 1 because digitize returns 1-based + + bad_channels_per_module = [ + self.bad_channels[indices == i] for i in range(MODULES_IN_DETECTOR) + ] + + module_mask = [ + bad_channels_per_module[f] - (PIXELS_PER_MODULE * f) + for f in range(MODULES_IN_DETECTOR) + ] + + print(bad_channels_per_module) + print(module_mask) + + def save_to_xye(self): + pass + + def save_processed_nexus(self): + pass + + def process_step_scan(self): + pass + + def process_pump_probe(self): + pass + + def process_time_resolved(self): + pass + def convert_angcal_to_pydantic_json( ang_cal_json_path: str | Path, new_path: str | Path @@ -324,14 +385,16 @@ def convert_angcal_to_pydantic_json( settings = MythenReductionSettings.load_from_toml(CONFIG_FILE) print("Loaded settings:", settings) - print(DATA_FILE) + # print(DATA_FILE) + + # MythenDataLoader(DATA_FILE) - MythenDataLoader(DATA_FILE) + BAD_CHAN_FILE = "/workspaces/XRPD-Toolbox/examples/i11/bad_channels.txt" angular_calibration = AngularCalibration.load_from_json(ANG_CAL) - # MythenDetector( - # file_path=DATA_FILE, - # settings=settings, - # angular_calibration=angular_calibration - # ) + settings.bad_channels_filepath = BAD_CHAN_FILE + + MythenDetector( + file_path=DATA_FILE, settings=settings, angular_calibration=angular_calibration + ) diff --git a/src/xrpd_toolbox/utils/mythen_utils.py b/src/xrpd_toolbox/utils/mythen_utils.py new file mode 100644 index 0000000..3a85086 --- /dev/null +++ b/src/xrpd_toolbox/utils/mythen_utils.py @@ -0,0 +1,95 @@ +import numpy as np +import numpy.typing as npt + + +def channel_to_angle( + module_pixel_number: npt.NDArray[np.int_], + centre: int | float, + conv: int | float, + offset: int | float, + beamline_offset: int | float, +): + 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 + + +def channel_to_angle_in_real_units( + module_pixel_number: npt.NDArray[np.int_], + centre: int | float, + offset: int | float, + beamline_offset: int | float, + radius: int | float = 762, + p: float = 0.05, +): + """ + 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 = channel_to_angle( + module_pixel_number, centre, (p / radius), offset, beamline_offset + ) + + return raw_tth + + +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 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 diff --git a/src/xrpd_toolbox/utils/peaks.py b/src/xrpd_toolbox/utils/peaks.py new file mode 100644 index 0000000..adb009c --- /dev/null +++ b/src/xrpd_toolbox/utils/peaks.py @@ -0,0 +1,48 @@ +from collections.abc import Collection + +import numpy as np +from pydantic import BaseModel + + +class Peak(BaseModel): + centre: int | float + amplitude: int | float + fwhm: int | float + + +def gaussian( + x: np.ndarray, cen: int | float, amp: int | float, fwhm: int | float +) -> np.ndarray: + """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.ndarray, + peaks: Collection[Peak], + background: int | float | np.ndarray, + phase_scale: int | float = 1, +): + """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: + start_idx = np.searchsorted(x, peak.centre - peak.fwhm) + end_idx = np.searchsorted(x, peak.centre + peak.fwhm, side="right") + + xi = x[start_idx:end_idx] + peak = gaussian(xi, peak.centre, peak.amplitude, peak.fwhm) * phase_scale + + y[start_idx:end_idx] += peak + + return y diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index bc645f6..ca58bc5 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -69,7 +69,7 @@ def get_nexus_files( """Get all final data files ending with .nxs in some folder""" nexus_files = [ - os.path.join(instrument_session_folder, f) + 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) ] @@ -134,30 +134,22 @@ def normalise_to(data: Iterable[float | int], minval: float | int = 0) -> np.nda return (data_array - minval) / (np.amax(data_array) - minval) -def normalise(data) -> np.ndarray: +def normalise(data: np.ndarray | list) -> np.ndarray: return (data - np.min(data)) / (np.max(data) - np.min(data)) -def gaussian(x, amp, cen, fwhm, background) -> np.ndarray: - # "1-d gaussian: gaussian(x, amp, cen, fwhm)" - - return (amp / (np.sqrt(2 * np.pi) * fwhm)) * np.exp( - -((x - cen) ** 2) / (2 * fwhm**2) - ) + background - - 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 return no empty array. + If no file, will raise If empty file, will return no empty array. """ if not os.path.exists(filepath): - return np.array([]) + raise FileNotFoundError(f"{filepath} does not exist") elif os.path.getsize(filepath) == 0: return np.array([]) else: diff --git a/tests/test_utils.py b/tests/test_utils.py index 3e4ee75..ac5abcc 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -4,8 +4,8 @@ import scipy.integrate as integrate from xrpd_toolbox.utils.energy import beam_energy_to_wavelength, tth_to_q +from xrpd_toolbox.utils.peaks import gaussian from xrpd_toolbox.utils.utils import ( - gaussian, get_filenumber_from_nxs, get_folder_paths, load_int_array_from_file, @@ -39,7 +39,7 @@ def test_normalise(): def test_gaussian(): x = np.linspace(0, 10, 100) - y = gaussian(x, amp=22.0, cen=5.0, fwhm=1.0, background=0.0) + y = gaussian(x, cen=5.0, amp=22.0, fwhm=1.0) assert len(y) == len(x) integral = integrate.simpson(y, x) assert np.isclose(integral, 22.0, atol=0.5) From 1a23389b7a7e1ab4021493a987d2dbbebe487a3f Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Mon, 2 Feb 2026 17:39:12 +0000 Subject: [PATCH 41/86] made bad channel mask --- src/xrpd_toolbox/i11/mythen.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index ac125f2..c1d1be4 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -2,6 +2,7 @@ import math import os import re +import sys import tomllib from collections import OrderedDict from pathlib import Path @@ -20,6 +21,9 @@ load_int_array_from_file, ) +np.set_printoptions(threshold=sys.maxsize) + + SUPPORTED_FILE_TYPES = ["json", "toml", "yaml"] MODULES_IN_DETECTOR = 28 PIXELS_PER_MODULE = 1280 @@ -284,7 +288,7 @@ def __init__( ) self.bad_channels = self.load_bad_channels() - self.bad_channels_to_mask() + self.bad_channel_mask = self.bad_channels_to_mask() # mythen data loader, just loads the data, # it has no information about which modules are which @@ -308,7 +312,7 @@ def load_bad_channels(self): return self.bad_channels def bad_channels_to_mask(self): - self.bad_channel_mask = OrderedDict() + bad_channel_mask = OrderedDict() bins = np.arange( 0, MODULES_IN_DETECTOR * PIXELS_PER_MODULE + 1, PIXELS_PER_MODULE @@ -317,17 +321,21 @@ def bad_channels_to_mask(self): np.digitize(self.bad_channels, bins) - 1 ) # subtract 1 because digitize returns 1-based - bad_channels_per_module = [ + detector_bad_channels_per_module = [ self.bad_channels[indices == i] for i in range(MODULES_IN_DETECTOR) ] - module_mask = [ - bad_channels_per_module[f] - (PIXELS_PER_MODULE * f) + module_bad_channels = [ + detector_bad_channels_per_module[f] - (PIXELS_PER_MODULE * f) for f in range(MODULES_IN_DETECTOR) ] - print(bad_channels_per_module) - print(module_mask) + for module in range(MODULES_IN_DETECTOR): + mask = np.ones(PIXELS_PER_MODULE, dtype=bool) + mask[module_bad_channels[module]] = False + bad_channel_mask[module] = mask + + return bad_channel_mask def save_to_xye(self): pass From 5845c47277e45088f6c8ca3162ec61a61cdd774f Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Tue, 3 Feb 2026 20:33:26 +0000 Subject: [PATCH 42/86] minimal step scan working --- 1410286.nxs | Bin 0 -> 84480 bytes Dockerfile | 2 +- examples/i11/step_scan/1410286.nxs | Bin 0 -> 84480 bytes examples/i11/step_scan/pyproject.toml | 152 +++++++++ mythen3_1410286.hdf5 | Bin 0 -> 1728604 bytes pyproject.toml | 2 + src/xrpd_toolbox/gui/bad_pixel_gui.py | 6 +- src/xrpd_toolbox/gui/waffle.py | 117 +++++++ src/xrpd_toolbox/i11/mythen.py | 408 +++++++++++++++--------- src/xrpd_toolbox/utils/daq_messenger.py | 6 +- src/xrpd_toolbox/utils/mythen_utils.py | 10 +- src/xrpd_toolbox/utils/peaks.py | 8 +- src/xrpd_toolbox/utils/settings.py | 97 ++++++ src/xrpd_toolbox/utils/utils.py | 153 +++++---- tests/test_mythen.py | 16 + uv.lock | 45 +++ 16 files changed, 786 insertions(+), 236 deletions(-) create mode 100644 1410286.nxs create mode 100644 examples/i11/step_scan/1410286.nxs create mode 100644 examples/i11/step_scan/pyproject.toml create mode 100644 mythen3_1410286.hdf5 create mode 100644 src/xrpd_toolbox/gui/waffle.py create mode 100644 src/xrpd_toolbox/utils/settings.py diff --git a/1410286.nxs b/1410286.nxs new file mode 100644 index 0000000000000000000000000000000000000000..a6f09c91968ef4d5578b77e33d5d438be899b3ca GIT binary patch literal 84480 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 literal 0 HcmV?d00001 diff --git a/Dockerfile b/Dockerfile index 364b25b..91e69d9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && apt-get dist-clean RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y -RUN apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 -y +RUN apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y RUN apt-get install fonts-noto-color-emoji -y RUN export DISPLAY=:0 diff --git a/examples/i11/step_scan/1410286.nxs b/examples/i11/step_scan/1410286.nxs new file mode 100644 index 0000000000000000000000000000000000000000..a6f09c91968ef4d5578b77e33d5d438be899b3ca GIT binary patch literal 84480 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 literal 0 HcmV?d00001 diff --git a/examples/i11/step_scan/pyproject.toml b/examples/i11/step_scan/pyproject.toml new file mode 100644 index 0000000..b47d053 --- /dev/null +++ b/examples/i11/step_scan/pyproject.toml @@ -0,0 +1,152 @@ +[build-system] +requires = ["setuptools>=64", "setuptools_scm[toml]>=8"] +build-backend = "setuptools.build_meta" + +[project] +name = "XRPD-Toolbox" +classifiers = [ + "Development Status :: 3 - Alpha", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +description = "A repository for useful python data analysis tools for the X-ray powder diffraction beamlines at Diamond Light Source" +dependencies = [ + "numpy", + "h5py", + "matplotlib", + "scipy", + "pyfai", + "pandas", + "lmfit", + "peakutils", + "PyCifRW", + "pyyaml", + "toml", + "PyQt6", + "PyQt5", +] # Add project dependencies here, e.g. ["click", "numpy"] +dynamic = ["version"] +license.file = "LICENSE" +readme = "README.md" +requires-python = ">=3.11" + +[dependency-groups] +dev = [ + "copier", + "pre-commit", + "pyright", + "pytest", + "pytest-cov", + "ruff", + "tox-uv", + "types-mock", +] + +[project.scripts] +XRPD-Toolbox = "xrpd_toolbox.__main__:main" + +[project.urls] +GitHub = "https://github.com/DiamondLightSource/XRPD-Toolbox" + +[[project.authors]] # Further authors may be added by duplicating this section +email = "richard.dixey@diamond.ac.uk" +name = "Richard Dixey" + +[tool.setuptools_scm] +version_file = "src/xrpd_toolbox/_version.py" + +[tool.pyright] +typeCheckingMode = "standard" +reportMissingImports = false # Ignore missing stubs in imported modules + +[tool.pytest.ini_options] +# Run pytest with all our checkers, and don't spam us with massive tracebacks on error +addopts = """ + --tb=native -vv + """ +# https://iscinumpy.gitlab.io/post/bound-version-constraints/#watch-for-warnings +filterwarnings = "error" +# Doctest python code in docs, python code in src docstrings, test functions in tests +testpaths = "docs src tests" + +[tool.coverage.run] +patch = ["subprocess"] +data_file = "/tmp/xrpd_toolbox.coverage" + +[tool.coverage.paths] +# Tests are run from installed location, map back to the src directory +source = ["src", "**/site-packages/"] + +[tool.tox] +skipsdist = true +# envs to runs automatically with tox -p +env_list = ["pre-commit", "type-checking", "tests"] + +[tool.tox.env_run_base] +# Pass all environment variables to the test environments +passenv = ["*"] + +[tool.tox.env.pre-commit] +description = "Run pre-commit on all files" +commands = [ + [ + "pre-commit", + "run", + "--all-files", + "--show-diff-on-failure", + { replace = "posargs", default = [ + ], extend = true }, + ], +] + +[tool.tox.env.type-checking] +description = "Run pyright" +commands = [ + [ + "pyright", + "--pythonpath", + "{env:VIRTUAL_ENV}/bin/python", + "src", + "tests", + { replace = "posargs", default = [ + ], extend = true }, + ], +] + +[tool.tox.env.tests] +description = "Run tests with coverage" +commands = [ + [ + "pytest", + "--cov=xrpd_toolbox", + "--cov-report", + "term", + "--cov-report", + "xml:cov.xml", + { replace = "posargs", default = [ + ], extend = true }, + ], +] + +[tool.ruff] +src = ["src", "tests"] +line-length = 88 +lint.select = [ + "B", # flake8-bugbear - https://docs.astral.sh/ruff/rules/#flake8-bugbear-b + "C4", # flake8-comprehensions - https://docs.astral.sh/ruff/rules/#flake8-comprehensions-c4 + "E", # pycodestyle errors - https://docs.astral.sh/ruff/rules/#error-e + "F", # pyflakes rules - https://docs.astral.sh/ruff/rules/#pyflakes-f + "N", # pep8-naming - https://docs.astral.sh/ruff/rules/#pep8-naming-n + "W", # pycodestyle warnings - https://docs.astral.sh/ruff/rules/#warning-w + "I", # isort - https://docs.astral.sh/ruff/rules/#isort-i + "UP", # pyupgrade - https://docs.astral.sh/ruff/rules/#pyupgrade-up + "SLF", # self - https://docs.astral.sh/ruff/settings/#lintflake8-self +] + +[tool.ruff.lint.per-file-ignores] +# By default, private member access is allowed in tests +# See https://github.com/DiamondLightSource/python-copier-template/issues/154 +# Remove this line to forbid private member access in tests +"tests/**/*" = ["SLF001"] diff --git a/mythen3_1410286.hdf5 b/mythen3_1410286.hdf5 new file mode 100644 index 0000000000000000000000000000000000000000..b04fe2be4a472065cca452e78608ba93169431e0 GIT binary patch literal 1728604 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≥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 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index b47d053..9d67b98 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,8 @@ dependencies = [ "toml", "PyQt6", "PyQt5", + "Dans_Diffraction", + "stomp.py", ] # Add project dependencies here, e.g. ["click", "numpy"] dynamic = ["version"] license.file = "LICENSE" diff --git a/src/xrpd_toolbox/gui/bad_pixel_gui.py b/src/xrpd_toolbox/gui/bad_pixel_gui.py index 3d9e4e8..96c203b 100644 --- a/src/xrpd_toolbox/gui/bad_pixel_gui.py +++ b/src/xrpd_toolbox/gui/bad_pixel_gui.py @@ -451,7 +451,7 @@ def _on_module_changed(self, module: int) -> None: # ========================= -def run_gui(filepath: str, indices_file: str | None = None) -> None: +def run_bad_pixel_gui(filepath: str, indices_file: str | None = None) -> None: data = MythenDataLoader(filepath) if indices_file: @@ -463,13 +463,13 @@ def run_gui(filepath: str, indices_file: str | None = None) -> None: 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/1406731.nxs" - run_gui( + run_bad_pixel_gui( DATA_FILE, - indices_file="/dls_sw/i11/software/mythen/badchannels.txt", ) 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/mythen.py b/src/xrpd_toolbox/i11/mythen.py index c1d1be4..ee7b85c 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -2,109 +2,35 @@ import math import os import re -import sys -import tomllib from collections import OrderedDict +from functools import cached_property from pathlib import Path +from shutil import copy2 from typing import Literal import h5py import numpy as np -import toml -import yaml from h5py import Dataset, File from pydantic import BaseModel +from xrpd_toolbox.utils.daq_messenger import DaqMessenger +from xrpd_toolbox.utils.mythen_utils import channel_to_angle +from xrpd_toolbox.utils.settings import SettingsBase from xrpd_toolbox.utils.utils import ( + bin_and_propagate_errors, get_entry, h5_to_array, load_int_array_from_file, ) -np.set_printoptions(threshold=sys.maxsize) +# np.set_printoptions(threshold=sys.maxsize) - -SUPPORTED_FILE_TYPES = ["json", "toml", "yaml"] MODULES_IN_DETECTOR = 28 PIXELS_PER_MODULE = 1280 PSD_RADIUS = 762 # mm MYTHEN_PIXEL_SIZE = 0.05 # mm -class SettingsBase(BaseModel): - @classmethod - def load_from_toml(cls, file_path: str | Path): - with open(file_path, "rb") as file: - settings_dict = tomllib.load(file) - - return cls(**settings_dict) - - @classmethod - def load_from_yaml(cls, file_path: str | Path): - with open(file_path, "rb") as file: - settings_dict = yaml.safe_load(file) - return cls(**settings_dict) - - @classmethod - def load_from_json(cls, file_path: str | Path): - with open(file_path, "rb") as file: - settings_dict = json.load(file) - return cls(**settings_dict) - - @classmethod - def load(cls, file_path: str | Path): - filename, file_extension = os.path.splitext(str(file_path)) - - if file_extension == "json": - return cls.load_from_json(file_path) - elif file_extension == "yaml": - return cls.load_from_yaml(file_path) - elif file_extension == "toml": - return cls.load_from_toml(file_path) - else: - raise ValueError(f"Filetype must be: {SUPPORTED_FILE_TYPES}") - - def save_to_toml(self, file_path: str | Path) -> None: - if not str(file_path).endswith(".toml"): - raise ValueError("file_path name must end with .toml") - - print("Saving configuration to:", file_path) - - config_dict = self.model_dump() - - with open(file_path, "w") as outfile: - toml.dump(config_dict, outfile) - - def save_to_json(self, file_path: str | Path) -> None: - if not str(file_path).endswith(".json"): - raise ValueError("file_path name must end with .json") - - print("Saving configuration to:", file_path) - - config_dict = self.model_dump() - - with open(file_path, "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, - ) - - class ModuleConversion(BaseModel): conv: float offset: float @@ -146,6 +72,13 @@ class AngularCalibration(SettingsBase): module_26: ModuleConversion module_27: ModuleConversion + def __getitem__(self, name): + if name in AngularCalibration.model_fields: + value = getattr(self, name) + return value + else: + raise ValueError(f"{name} not in {self}") + class MythenReductionSettings(SettingsBase): active_modules: list[int] = list(range(MODULES_IN_DETECTOR)) @@ -166,6 +99,64 @@ class MythenReductionSettings(SettingsBase): 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, 7655, 32000 + turns it into 28 arrays, [0, 1, 67], ... [67], ... [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 1 + + class MythenDataLoader: def __init__( self, @@ -181,12 +172,8 @@ def __init__( self.entry = get_entry(self.file_path) self.dataset_path = f"/{self.entry}/{self.mythen_data_path}/data" - self.n_modules_in_data, self.n_frames = self.read_nxs_metadata() - self.delta_path = self.get_delta_path() - self.deltas_or_ds = self.get_deltas() - self.raw_data = self.load_data(self.counter) self.module_data = np.array_split( self.raw_data, self.n_modules_in_data, axis=-1 @@ -208,10 +195,16 @@ def get_delta_path(self) -> str: f"{', '.join(f'{base}/{n}' for n in delta_subpaths)}" ) - def get_deltas(self) -> np.ndarray: - deltas_or_ds = h5_to_array(self.file_path, self.delta_path) - - return deltas_or_ds + @cached_property + def deltas(self) -> np.ndarray: + try: + self.delta_path = self.get_delta_path() + deltas = h5_to_array(self.file_path, 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 def read_nxs_metadata(self) -> tuple[int, int]: with h5py.File(self.file_path, "r") as file: @@ -245,105 +238,232 @@ def load_data(self, counter: int) -> np.ndarray: return np.asarray(data) else: - raise ValueError("Data is None.") - - def get_module_data(self, module_index): - return self.module_data[module_index] + raise ValueError( + f"Data at {self.dataset_path} in {self.file_path}is None." + ) class MythenModule: def __init__( self, data: np.ndarray, + conversion: ModuleConversion, + centre: float | int, + beamline_offset: float, + deltas: np.ndarray, module_id: int, + bad_channel_mask: np.ndarray | None = None, pixels_per_modules: int = PIXELS_PER_MODULE, ): - self.pixels_per_modules = pixels_per_modules self.data = data + self.conversion = conversion + self.centre = centre + self.beamline_offset = beamline_offset + self.deltas = deltas + self.module_id = module_id + self.pixels_per_modules = pixels_per_modules + + 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 + + @cached_property + def pixel_number(self) -> np.ndarray: + """returns a 1d array of integers between 0 and 1280""" + return np.arange(self.pixels_per_modules, dtype=np.int64) + + @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 = channel_to_angle( + pixel_number=self.pixel_number, + centre=self.centre, + conv=self.conversion.conv, + offset=self.conversion.offset, + beamline_offset=self.beamline_offset, + ) + return raw_tth + + @cached_property + def tth_shaped(self) -> np.ndarray: + """Creates an array with the same shape as the data, + with the tth values at the corresponding indexes""" + + raw_tth_shaped = np.broadcast_to(self.raw_tth, self.data.shape) + tth_shaped = raw_tth_shaped + self.deltas[:, None] + return tth_shaped + + @cached_property + def unmasked_counts(self) -> np.ndarray: + return self.data.flatten() - def process(self): - # Example processing: compute the mean - return np.mean(self.pixels_per_modules) + @cached_property + def unmasked_tth(self) -> np.ndarray: + return self.tth_shaped.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 tth(self) -> np.ndarray: + masked_tth = self.tth_shaped[:, ~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, - file_path: str | Path, + filepath: str | Path, angular_calibration: AngularCalibration | None = None, settings: MythenReductionSettings | None = None, + xye_filepath_out: str | Path | None = None, output_directory: str | Path | None = None, + filename_suffix: str = "", ): - self.file_path = file_path + self.filepath = filepath + self.filename_suffix = filename_suffix + + if not str(self.filepath).lower().endswith(".nxs"): + raise ValueError(f"{self.filepath} should be a Nexus File!!") - if not str(self.file_path).lower().endswith(".nxs"): - raise ValueError(f"{self.file_path} should be a Nexus File!!") + self.output_directory = output_directory or os.path.join( + str(self.filepath), "processed" + ) - if not output_directory: - self.output_directory = os.path.join(str(self.file_path), "processed") + self.file_dir = os.path.dirname(str(self.filepath)) + self.filename = os.path.basename(str(self.filepath)) + + 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 MythenReductionSettings() - self.angular_calibration = angular_calibration or MythenReductionSettings.load( + self.calibration = angular_calibration or AngularCalibration.load( self.settings.angcal_filepath ) - self.bad_channels = self.load_bad_channels() - self.bad_channel_mask = self.bad_channels_to_mask() + self.active_modules: list[int] = self.settings.active_modules + self.bad_modules: list[int] = self.settings.bad_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( - file_path=file_path, + file_path=filepath, ) + self.contruct_modules() + + def contruct_modules(self): self.modules = OrderedDict() - for n_module, module in enumerate(self.settings.active_modules): - self.modules[module] = MythenModule( - data=self.mythen_data.get_module_data(n_module), module_id=module + for n_module, nth_active_module in enumerate(self.settings.active_modules): + module = MythenModule( + data=self.mythen_data.module_data[n_module], + conversion=self.calibration[f"module_{nth_active_module}"], + centre=self.calibration.centre, + beamline_offset=self.calibration.beamline_offset, + deltas=self.mythen_data.deltas, + bad_channel_mask=self.bad_channels.masks[nth_active_module], + module_id=nth_active_module, ) - def load_bad_channels(self): - if not self.settings.bad_channels_filepath: - raise ValueError("Bad channels file path is not set.") - self.bad_channels = load_int_array_from_file( - self.settings.bad_channels_filepath - ) - return self.bad_channels + self.modules[nth_active_module] = module + + @cached_property + def good_modules(self) -> list[MythenModule]: + return [ + self.modules[f] + for f in list(self.modules.keys()) + if f not in self.bad_modules + ] # noqa + + def generate_xye( + self, masked: bool = True + ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + if masked: + module_tth_list = [f.tth for f in self.good_modules] + module_counts_list = [f.counts for f in self.good_modules] + module_errors_list = [f.error for f in self.good_modules] + else: + module_tth_list = [f.unmasked_tth for f in self.good_modules] + module_counts_list = [f.unmasked_counts for f in self.good_modules] + module_errors_list = [f.unmasked_error for f in self.good_modules] - def bad_channels_to_mask(self): - bad_channel_mask = OrderedDict() + tth = np.concatenate(module_tth_list) + counts = np.concatenate(module_counts_list) + error = np.concatenate(module_errors_list) - bins = np.arange( - 0, MODULES_IN_DETECTOR * PIXELS_PER_MODULE + 1, PIXELS_PER_MODULE + return tth, counts, error + + def generate_summed_xye( + self, + masked: bool = True, + rebin_step: float = 0.004, + error_calc: str = "internal", + sum_counts: bool = True, + ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + tth, counts, error = self.generate_xye(masked=masked) + + summed_tth, summed_counts, summed_error = bin_and_propagate_errors( + tth, + counts, + error, + rebin_step=rebin_step, + error_calc=error_calc, + sum_counts=sum_counts, ) - indices = ( - np.digitize(self.bad_channels, bins) - 1 - ) # subtract 1 because digitize returns 1-based - detector_bad_channels_per_module = [ - self.bad_channels[indices == i] for i in range(MODULES_IN_DETECTOR) - ] + return summed_tth, summed_counts, summed_error - module_bad_channels = [ - detector_bad_channels_per_module[f] - (PIXELS_PER_MODULE * f) - for f in range(MODULES_IN_DETECTOR) - ] + 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 - for module in range(MODULES_IN_DETECTOR): - mask = np.ones(PIXELS_PER_MODULE, dtype=bool) - mask[module_bad_channels[module]] = False - bad_channel_mask[module] = mask + Also may send xye to ispyb so that users can lookup data - return bad_channel_mask + """ - def save_to_xye(self): - pass + daq = DaqMessenger("i11-control") + daq.connect() + daq.send_file(str(self.xye_filepath_out)) # sends message to GDA - def save_processed_nexus(self): - pass + 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 def process_step_scan(self): + summed_tth, summed_counts, summed_error = self.generate_summed_xye( + masked=self.settings.bad_channel_masking, + rebin_step=self.settings.rebin_step, + error_calc=self.settings.error_calc, + sum_counts=True, + ) + + # plt.plot(normalise(summed_tth), normalise(summed_counts)) + # plt.show() + + # save_to_xye(self.xye_filepath_out, summed_tth, summed_counta, summed_error) + self.save_processed_nexus() + # self.communicate_with_control(send_to_ispyb=self.settings.send_to_ispyb) + + def save_processed_nexus(self): pass def process_pump_probe(self): @@ -387,7 +507,7 @@ def convert_angcal_to_pydantic_json( PARENT_PATH / "i11" / "mythen_calibration" / "mythen3_reduction_config.toml" ) - DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1406731.nxs" + DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1410286.nxs" ANG_CAL = PARENT_PATH / "i11" / "mythen_calibration" / "ang_cal_171125_new.json" settings = MythenReductionSettings.load_from_toml(CONFIG_FILE) @@ -403,6 +523,8 @@ def convert_angcal_to_pydantic_json( settings.bad_channels_filepath = BAD_CHAN_FILE - MythenDetector( - file_path=DATA_FILE, settings=settings, angular_calibration=angular_calibration + mythen3 = MythenDetector( + filepath=DATA_FILE, settings=settings, angular_calibration=angular_calibration ) + + mythen3.process_step_scan() diff --git a/src/xrpd_toolbox/utils/daq_messenger.py b/src/xrpd_toolbox/utils/daq_messenger.py index 176bc18..837e42a 100644 --- a/src/xrpd_toolbox/utils/daq_messenger.py +++ b/src/xrpd_toolbox/utils/daq_messenger.py @@ -21,10 +21,10 @@ class DaqScanListener4(stomp.ConnectionListener): def __init__(self): self.queue = deque() - def on_error(self, headers, message): + def on_error(self, headers, message): # type: ignore print(f"Received an error {message}") - def on_message(self, headers, message): + def on_message(self, headers, message): # type: ignore m = json.loads(message) self.queue.append(m) @@ -39,7 +39,7 @@ def connect(self): [(self.beamline, 61613)], auto_content_length=False ) if self.old_stomp: - self.conn.start() + self.conn.start() # type: ignore self.conn.connect() def disconnect(self): diff --git a/src/xrpd_toolbox/utils/mythen_utils.py b/src/xrpd_toolbox/utils/mythen_utils.py index 3a85086..0288766 100644 --- a/src/xrpd_toolbox/utils/mythen_utils.py +++ b/src/xrpd_toolbox/utils/mythen_utils.py @@ -3,13 +3,13 @@ def channel_to_angle( - module_pixel_number: npt.NDArray[np.int_], + pixel_number: npt.NDArray[np.int_], centre: int | float, conv: int | float, offset: int | float, beamline_offset: int | float, ): - module_conversions = module_pixel_number - centre + module_conversions = pixel_number - centre module_conversions = module_conversions * conv module_conversions = np.arctan(module_conversions) raw_tth = offset + np.rad2deg(module_conversions) + beamline_offset @@ -18,7 +18,7 @@ def channel_to_angle( def channel_to_angle_in_real_units( - module_pixel_number: npt.NDArray[np.int_], + pixel_number: npt.NDArray[np.int_], centre: int | float, offset: int | float, beamline_offset: int | float, @@ -26,7 +26,7 @@ def channel_to_angle_in_real_units( p: float = 0.05, ): """ - module_pixel_number: channel number, 0-1280 + pixel_number: channel number, usually 0-1280 centre: centre (in pixel number - ie 1280/2) offset: module offset, degrees radius: radius, mm - approx 760 @@ -35,7 +35,7 @@ def channel_to_angle_in_real_units( """ raw_tth = channel_to_angle( - module_pixel_number, centre, (p / radius), offset, beamline_offset + pixel_number, centre, (p / radius), offset, beamline_offset ) return raw_tth diff --git a/src/xrpd_toolbox/utils/peaks.py b/src/xrpd_toolbox/utils/peaks.py index adb009c..bdc2605 100644 --- a/src/xrpd_toolbox/utils/peaks.py +++ b/src/xrpd_toolbox/utils/peaks.py @@ -31,10 +31,10 @@ def multi_gaussian( peaks: list of (cen, amp, fwhm) - background: scalar or array + background: scalar or array, if array must be same shape as x """ - y = np.zeros_like(x) + background + intensity = np.zeros_like(x) + background for peak in peaks: start_idx = np.searchsorted(x, peak.centre - peak.fwhm) @@ -43,6 +43,6 @@ def multi_gaussian( xi = x[start_idx:end_idx] peak = gaussian(xi, peak.centre, peak.amplitude, peak.fwhm) * phase_scale - y[start_idx:end_idx] += peak + intensity[start_idx:end_idx] += peak - return y + return intensity diff --git a/src/xrpd_toolbox/utils/settings.py b/src/xrpd_toolbox/utils/settings.py new file mode 100644 index 0000000..94c5160 --- /dev/null +++ b/src/xrpd_toolbox/utils/settings.py @@ -0,0 +1,97 @@ +import json +import tomllib +from pathlib import Path + +import toml +import yaml +from pydantic import BaseModel + +SUPPORTED_FILE_TYPES = [".json", ".toml", ".yaml"] + + +class SettingsBase(BaseModel): + supported_file_types: list[str] = SUPPORTED_FILE_TYPES + + @classmethod + def load_from_toml(cls, filepath: str | Path): + with open(filepath, "rb") as file: + settings_dict = tomllib.load(file) + + return cls(**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(**settings_dict) + + @classmethod + def load_from_json(cls, filepath: str | Path): + with open(filepath, "rb") as file: + settings_dict = json.load(file) + return cls(**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: {cls.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: {self.supported_file_types}") diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index ca58bc5..6dc98dc 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -157,100 +157,99 @@ def load_int_array_from_file(filepath: str | Path) -> np.ndarray: def create_bins( - tth_values: np.ndarray, rebin_step: float | int = 0.004 -) -> tuple[np.ndarray, np.ndarray]: + x: np.ndarray, rebin_step: float | int +) -> tuple[np.ndarray, np.ndarray, 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...). - + 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 """ - rebin_step = float(rebin_step) - 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") - - rebin_start = start - (rebin_step / 2) - rebin_stop = stop + rebin_step + (rebin_step / 2) - - bin_edges = np.arange( - rebin_start, - rebin_stop, - float(rebin_step), - dtype=np.float64, - ) - bin_centres = 0.5 * (bin_edges[1:] + bin_edges[:-1]) - - return bin_centres, bin_edges + 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 = 0.004, + rebin_step: float | int, error_calc: str = "best", - sum_counts: bool = False, + sum_counts: bool = True, ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: """ + Rebin diffraction data with overlap-corrected averaging. - 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. + 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 = np.max(bin_counts) - np.median(bin_counts) + + with np.errstate(divide="ignore", invalid="ignore"): + mean = y_sums / bin_counts + intensity = mean if not sum_counts else mean * scale + + # --- Errors --- + # Internal (propagated) error + prop_errors = np.sqrt(e2_sums) / bin_counts + + # External (sample) error with Bessel correction + variance = (y2_sums - bin_counts * mean**2) / (bin_counts - 1) + std_errors = np.sqrt(variance) + + # Invalidate bins with <2 points for external error + std_errors[bin_counts < 2] = np.nan + + if error_calc == "internal": + errors = prop_errors + elif error_calc == "external": + errors = std_errors + elif error_calc == "best": + errors = np.maximum(prop_errors, std_errors) + else: + raise ValueError(f"Invalid error_calc: {error_calc}") - bin_centres, bin_edges = create_bins(x, rebin_step) + if sum_counts: + errors *= scale - 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] - ( - rebin_step / 10000 - ) # I think it would be better to move it inside bin edge, and include, rather - # than remove all together or create a bin with a single value + ##remove Nan's + nan_mask = np.isnan(intensity) + nan_index = np.where(nan_mask)[0] - sums, bin_edges = np.histogram(x, bins=bin_edges, weights=y) - occurances = np.histogram(x, bins=bin_edges)[0] + bin_centres = np.delete(bin_centres, nan_index) + intensity = np.delete(intensity, nan_index) + errors = np.delete(errors, nan_index) - # occurances = np.where(occurances != 0, occurances, 1) # avoid division by zero + return bin_centres, intensity, errors - if sum_counts: - binned_counts = sums - else: - binned_counts = ( - sums / occurances - ) # throws a warning if e missing counts in a bin as a result of missing module - - 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) / occurances - - repeated_mean = np.repeat(binned_counts, occurances) - std_sums = np.histogram(x, bins=bin_edges, weights=(y - repeated_mean) ** 2)[0] - std_errors = np.sqrt(std_sums / occurances) - - if error_calc == "internal": - errors = prop_errors - elif error_calc == "external": - errors = std_errors - else: - errors = np.where(prop_errors > std_errors, prop_errors, std_errors) - return bin_centres, binned_counts, errors +def save_to_xye(xye_filepath_out, x: np.ndarray, y: np.ndarray, e: np.ndarray): + xye_out_data = np.stack((x, y, e), axis=-1) + + np.savetxt(xye_filepath_out, xye_out_data, fmt="%.6f", delimiter=" ", newline="\n") diff --git a/tests/test_mythen.py b/tests/test_mythen.py index 1cb242d..9ba9790 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -79,3 +79,19 @@ def test_mythen_load_fails_when_incorrect_file_extension( 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/uv.lock b/uv.lock index 64d72a9..c0f3f12 100644 --- a/uv.lock +++ b/uv.lock @@ -271,6 +271,19 @@ 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 = "dill" version = "0.4.1" @@ -289,6 +302,12 @@ 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" +version = "0.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload-time = "2014-06-16T11:18:57.406Z" } + [[package]] name = "dunamai" version = "1.25.0" @@ -1862,6 +1881,19 @@ 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 = "stomp-py" +version = "8.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docopt" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/66/c07f01feb5fbc669c4333c76eb02fb8149c653c25ba9769477f8427d5e55/stomp_py-8.2.0.tar.gz", hash = "sha256:9908689361e263bf198e6acfb3c4386759fb7df7d141f4384d7414771c68d7fc", size = 39286, upload-time = "2024-10-31T21:59:38.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/b6/ebfd6daef0c19a5ca3ac1fb2fc092331d67af5a30c868f106fcc2504c287/stomp_py-8.2.0-py3-none-any.whl", hash = "sha256:fad24e51b505996015a39ca1632df4e0225c1c552980955e21f2aebfc0d9d85c", size = 42751, upload-time = "2024-10-31T21:59:36.658Z" }, +] + [[package]] name = "toml" version = "0.10.2" @@ -2056,10 +2088,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f2/3e/45583b67c2ff08ad5a582d316fcb2f11d6cf0a50c7707ac09d212d25bc98/wcwidth-0.5.0-py3-none-any.whl", hash = "sha256:1efe1361b83b0ff7877b81ba57c8562c99cf812158b778988ce17ec061095695", size = 93772, upload-time = "2026-01-27T01:31:43.432Z" }, ] +[[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 = "xrpd-toolbox" source = { editable = "." } dependencies = [ + { name = "dans-diffraction" }, { name = "h5py" }, { name = "lmfit" }, { name = "matplotlib" }, @@ -2072,6 +2114,7 @@ dependencies = [ { name = "pyqt6" }, { name = "pyyaml" }, { name = "scipy" }, + { name = "stomp-py" }, { name = "toml" }, ] @@ -2089,6 +2132,7 @@ dev = [ [package.metadata] requires-dist = [ + { name = "dans-diffraction" }, { name = "h5py" }, { name = "lmfit" }, { name = "matplotlib" }, @@ -2101,6 +2145,7 @@ requires-dist = [ { name = "pyqt6" }, { name = "pyyaml" }, { name = "scipy" }, + { name = "stomp-py" }, { name = "toml" }, ] From 8f5b7869ae2aeb6419c05a4122028c97a04963e8 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 27 Feb 2026 15:12:22 +0000 Subject: [PATCH 43/86] lots of changes, added legacy stuff --- .devcontainer/devcontainer.json | 15 +- .gitignore | 10 + .vscode/settings.json | 1 + 1410286.nxs | Bin 84480 -> 0 bytes {examples => config}/i11/bad_channels.txt | 1 + .../i11/mythen3_reduction_config.toml | 4 +- examples/i11/angular_calibration/1399199.nxs | Bin 125960 -> 0 bytes examples/i11/step_scan/1406731.nxs | Bin 88872 -> 0 bytes examples/i11/step_scan/1406733.nxs | Bin 84480 -> 0 bytes examples/i11/step_scan/1410286.nxs | Bin 84480 -> 0 bytes examples/i11/step_scan/mythen3_1406731.hdf5 | Bin 2588860 -> 0 bytes examples/i11/step_scan/pyproject.toml | 152 -- mythen3_1410286.hdf5 | Bin 1728604 -> 0 bytes pyproject.toml | 3 + src/xrpd_toolbox/calibrant_cifs/Silicon.cif | 226 -- src/xrpd_toolbox/gui/bad_pixel_gui.py | 2 +- src/xrpd_toolbox/i11/angular_calibration.py | 1251 +++++++++++ src/xrpd_toolbox/i11/mythen.py | 547 +++-- .../i11/mythen3_reduction_legacy.py | 334 +-- .../mythen_calibration/ang_cal_171125.json | 60 - .../i11/mythen_calibration/ang_cal_171125.off | 29 - .../ang_cal_171125_new.json | 116 - .../i11/mythen_calibration/badchannels.txt | 1984 ----------------- .../mythen3_reduction_config.toml | 50 - src/xrpd_toolbox/i11/mythen_pyfai.py | 215 ++ src/xrpd_toolbox/i15-1/eiger_500k.py | 159 ++ src/xrpd_toolbox/utils/daq_messenger.py | 99 - src/xrpd_toolbox/utils/energy.py | 14 + src/xrpd_toolbox/utils/messenger.py | 182 ++ src/xrpd_toolbox/utils/mythen_utils.py | 86 +- src/xrpd_toolbox/utils/peaks.py | 44 + src/xrpd_toolbox/utils/settings.py | 13 +- src/xrpd_toolbox/utils/utils.py | 187 +- uv.lock | 233 ++ 34 files changed, 3000 insertions(+), 3017 deletions(-) delete mode 100644 1410286.nxs rename {examples => config}/i11/bad_channels.txt (99%) rename {examples => config}/i11/mythen3_reduction_config.toml (96%) delete mode 100644 examples/i11/angular_calibration/1399199.nxs delete mode 100644 examples/i11/step_scan/1406731.nxs delete mode 100644 examples/i11/step_scan/1406733.nxs delete mode 100644 examples/i11/step_scan/1410286.nxs delete mode 100644 examples/i11/step_scan/mythen3_1406731.hdf5 delete mode 100644 examples/i11/step_scan/pyproject.toml delete mode 100644 mythen3_1410286.hdf5 delete mode 100644 src/xrpd_toolbox/calibrant_cifs/Silicon.cif create mode 100644 src/xrpd_toolbox/i11/angular_calibration.py delete mode 100644 src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json delete mode 100644 src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.off delete mode 100644 src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125_new.json delete mode 100644 src/xrpd_toolbox/i11/mythen_calibration/badchannels.txt delete mode 100644 src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml create mode 100644 src/xrpd_toolbox/i11/mythen_pyfai.py create mode 100644 src/xrpd_toolbox/i15-1/eiger_500k.py delete mode 100644 src/xrpd_toolbox/utils/daq_messenger.py create mode 100644 src/xrpd_toolbox/utils/messenger.py diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0e9343a..39030b4 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -64,16 +64,11 @@ "target": "/cache", "type": "volume" }, - // { - // "source": "/dls/i11/data/2026", - // "target": "/dls/i11/data/2026", - // "type": "bind" - // }, - // { - // "source": "/dls_sw/i11/software", - // "target": "/dls_sw/i11/software", - // "type": "bind" - // } + { + "source": "${localEnv:HOME}${localEnv:USERPROFILE}", + "target": "/host-home", + "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 b9fdcd4..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/ diff --git a/.vscode/settings.json b/.vscode/settings.json index bf55204..74bb75e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,4 +10,5 @@ "[python]": { "editor.defaultFormatter": "charliermarsh.ruff", }, + "python-envs.defaultEnvManager": "ms-python.python:system", } diff --git a/1410286.nxs b/1410286.nxs deleted file mode 100644 index a6f09c91968ef4d5578b77e33d5d438be899b3ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84480 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 diff --git a/examples/i11/bad_channels.txt b/config/i11/bad_channels.txt similarity index 99% rename from examples/i11/bad_channels.txt rename to config/i11/bad_channels.txt index 501b796..7072e52 100644 --- a/examples/i11/bad_channels.txt +++ b/config/i11/bad_channels.txt @@ -617,6 +617,7 @@ 12744 12745 12767 +12781 12784 12785 12786 diff --git a/examples/i11/mythen3_reduction_config.toml b/config/i11/mythen3_reduction_config.toml similarity index 96% rename from examples/i11/mythen3_reduction_config.toml rename to config/i11/mythen3_reduction_config.toml index 2c7b7cf..3426997 100644 --- a/examples/i11/mythen3_reduction_config.toml +++ b/config/i11/mythen3_reduction_config.toml @@ -22,7 +22,7 @@ save_in_Q_space = false #save a file where the diffraction pattern has been conv 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 = "internal" #this can be "internal" "external" or "best", internal error is propagated poisson errors, external is std_dev of counts in bin (will result in nan values if there is only 1 count in the bin), and "best" is the whichever is max for each bin +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 @@ -46,7 +46,7 @@ data_reduction_mode = "step_scan" # module 1 offset 62.99916323710597 conv 6.568575932737774e-05 center 639.5 ###### -bad_channels_filepath = "/dls_sw/i11/software/mythen/badchannels.txt" #THIS SHOULD BE MOVED ALONG WITH EVERYTHING ELSE TO A CONSISTENT DIR! +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] diff --git a/examples/i11/angular_calibration/1399199.nxs b/examples/i11/angular_calibration/1399199.nxs deleted file mode 100644 index 2b8174048809e57fcb21391a30cfcb42ce86f122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125960 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 diff --git a/examples/i11/step_scan/1410286.nxs b/examples/i11/step_scan/1410286.nxs deleted file mode 100644 index a6f09c91968ef4d5578b77e33d5d438be899b3ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84480 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 diff --git a/examples/i11/step_scan/mythen3_1406731.hdf5 b/examples/i11/step_scan/mythen3_1406731.hdf5 deleted file mode 100644 index e411edbb9a54a01ecf86e51c00779ce4d5283f57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2588860 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

EJD+DEpZkgP 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

Sdq@Nd8;0ry02ejk!J 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� z9IX@E%;4QtF=z_FcNB7dHhfdUS+B~0?fWorg}}B_i1~9Oj(kc$vlaMoXdH6{V*V6- zO8DtD4>89rdnWr0(G>q5T=JntKup!qsAE&ng0UE3Dm-N0OX zGZ0^S+O~&2CBD#WSMbU4f4#m2o{pI5g140l-uerH6+aa29}>*=>ywTTWrJ8cg>^Ya2?JKK3zEI^$9fhAx@sa_Psu0 z8n+0&Z8`Ke0*^sV?Z=dG(2MK&F~qq#d|j(`udrS<#8~^qI9FiXb;zwBc&#PthlR$* z{?0*eza!_nfWHQQJz^$DAiYu%UmCadW?);L(AXYI_)6D0H16*s&~Pnj{53y%u?7xE z#8D1ifIA>gGWaWjRj>T{)d7)%V(7)%UJh|`!o}S(+oXtZ(^+p#Mc`S` zYdqcGbI{a4eBNQS#%x;8Ha!#BH0HLVz`V0f41IEl^csVrX*nK6v{M1Ah>{WdnPxo&vusHO-g#3`Wexi1`ih!@%5M z#gXUUi0_i=lehaBOX9RJs=4fH99nFVuN2K?R7pAPIX z;W}Ipd~zbb)~Zc+d-JoQ83L^PjI9Fn8bjN7V4Z!oYk`*mw*%JwJS80TnjAPe{;$`X zXv?O1i0uaO4Z#-%ei^t9@Z!|8wwi;#1z2-rV?GVh?jxZ|4v}&$8N9Gwxq=s`m&VHY zWALht((0x4Z0zThppy=RzY}q?1-A7LY+vf7F~1dYro)#tq;IMt#^3!6y-l?@CBD#l zQVq1tO8p=7pEeL*cQ9Ka==%o#k2d~sLFg4zuM+Sb0ln6+^_mys&jZ`8gI@izCNHqo zzj@s~Y;ECN75MtlSkJxF7CiS_d+^VoE!MZmscA8}el#z(%!s3XXR8a$=MmO<)uQBZ z&`bN&dtYlZB{;plOHDgx_akPl(Ab6suNZn|fTk)i*DB8r&5PUGl+gJKL_n$qCjxiB2 zZwhSNo|=|_R`|As<_BP%d`zIBk?-gy?rUg!pFZ3D-Ts!pUivq6* zY+D(6=THUwZ82`P-l4J02<)|YI$C*LSq{a%=7VH@Xb=w;%Lv> zc&673J~{qDuj+xF8~5Fe;B5tf3#X>d(PHp(f%W`uTN^kzzR>F^ejePpiRXG&f1Qt> zag3J-w#^|?NB52YB&keopY+z~i`X#X2`X2lm;145?H6sIit*#Gjdmei3 z-U9BF8pp4MnEjz)4OtSrb5Oq=vow6OgKrzywhUOmi^ld$@Qza~uLKW$PaO`|)B^?K$q*50(WKup~M ztkM0-rt`(7-y3X=>Z-#l&b%Zm| zoI~D|^phs>I571~4=B|=N;u(bWuh~1FW}Ewm2&yMtKZ)!uVioSrAhF*P!XD3zpPu- zs+9Y(aH1>p-d_o>J$|>U=gRfH`M6H_UMutVm~b?+fqh<0%om@a{vGkj?E=hNT&ui? zX()YSPvCm08&97n6E|pGWexDPo?oXVu4xriuAJ9r##jNo=PLe>AeZ+io}Xxz0rOtP z_e;@K1m<~ciTK1W2bB6*SA2S#B^)2G^I*?y!uQG1`~D=cn{f0e2`7AilDG?av2c8R zY$kke&)oXlo8bFn6T!RB#0uf`a3E@Bome*z{Pof&cpdTiD)EDGJbjEOKF7I*$Hmt2 zkKX5#;Lm}19oZXvE9ABlPWZJ?;&Nzs&rlwkO@%YJ`@m;BG(ImSDg&2;=2eX`!S78i zFMa$MLi1ZOC(iNM6PH5232IFfE-#Tce@AybeU1wD8i-~S;4aEdOat#VkX)`wUzZbW zfX_hxpNLQH70_HNoF06g3VsfnLEvYC=Q{DZI=OYB_r6PAe)sz#^hVEC@aOlH-3gxG z>;9d5;$H=IpM?Jh!s+c@`1}FQ=HQP9=KA5^JJ<`J&j6pN-1Ng9`l419=skytjg*_< z_uB0zKA!JG@Avr=N5bN5uG|K~(Jul2Bl!Km-v+)qJZFf{oJ_!Y`JUUS(qt^W|9?~Z@T1`W8s=)G_(blj z-S@GrO8vi#x;@pKpZC^Ln#36J_lbAU);wM08vm%e315FRuAN$yJTC!$0(Ex<&+D46 zv+?oyC*gJOn%+(mPCPDb&N)7BCwKn?L=7>7SqIMG=+ z`-11~oy8}%QxD1IJxon$!heJwrif2GB^-^fv+3DuBm5S?4+tmxJ@e7LF8|<@3f^8D z3di$v=pRNuKKCXj1A84NcN_47folM-7S3FC0na|CgXj6yYcKutI|F?zhi_JB+*4Kb zb_6`H0xn-*=idbWGmPEqF#ZQXbF^^y?!er?UT+z%??a;J*cXaV_;pi)?>|&+Rm%12 z)A;lS{uO=h1^#S!b`YQNc_91lOJeEMGmo!RqzUhFrH94B2_7##_M`tnxUxjvekuBN z?PcisU}@rc7BK%#%{k!t-N-}5XDl99d~U;7W`g(MtVuKypEwHmFksJrqKDfLB zp1Zbb6;}UujNCc!yg=CV;kElPG`xrT2tH3hv#cDdJw z^xqjgugkTd@%OQ(2cGAR!}GqP96Z-k|A|*H_I~hx13r8m{XBd)#_HflV;=4Y@AG8N z?GFlPybnNA1^g`d`23&XJwWAFC7&hG`0uvF-|Hc9QGxy3AHvaa|MK`9*Q%uX6a8F) z+_gn5&%0lL#nac~VBV8&E@@Ne*suZ zbY0{0W4wEz5iC~$_&VTwfp-8tM>xmheBt!)vT){{``72&M80$0IsE?oI?%8OU(@67 z^_=kfOq>AC^Tl}G2ak)k(xkWDkn4NS@I0S*4pWz}k6r@*ta79A`<96>4=C~eoLXXo zLrVP9hlSPeG`27Ga9hU`KlBoPK0yyX*AMk5w$%p5McB7IME5j(^p{-+df{+y=nsBe#Oan?AQi?n-Fh6^?&x z^!745=OecraA#Y;og~EwW&@>faSxD;mmVge&EXkFHt}7pD5ng zV>=$X4ORDF8q8q}Xf6`YdpLuI(?dVx))F6|qYEGFJ{6z&{6+l)w?J>d3Mc*qK1R6- z9(Pwka}fMTLjQtr`WY&mo}X84dT0dwQg}XmTuDDed~#Wr^Uwi4*Q3_sg{Sk!pzf)t z>`SrxfntBI|UduX9|{#(N7p)oY` z#3x<>-U*&Pp>Ho7pNi6_x66^+9oTC%JwGizxz7ljcmBD;@!1)5ef~*!&g0XZ82UNr zZI<>$^!88Oh1_M(SAb>>_Ty~v>8%fPy{_UvOW4Pk&$k~6CoYyx#=8Lh+zZW_z^jB) z>w4jw!^>fe?Zms5eTN9Ahfn06=mh>!jOAM3@zNx|MsN4Pr-L-<;c@Wa!{;w)((}#W z_g2s8Z8G?`;4=l5_v81# z-z%J2hY4q2k5D8DVBj5v6E7+^agq33LwOvXf!y7N<6jLv9(!`P7N350 z)x3q@54E}o$EPAZPl9I$__+V*+W`-Q=eNi`0{*8!)3V6*y!-`CKdk5D#i#!k(7Z03 z`K*arXNphM1OK-6dwd$hXExTu`rs$Qe^dC37S0@=Ax%8br@u6rAFs*aW28?s7N6W* zgfo^s&_fw|8wGv>d~Op??y2y(0DL3pD+Aw&-u8k1BH{Er4?SE8{zKp<@OcpWxzZ#~ zg#O8+!`$IEBIAdu6pT^KkRo!TQg?>5u z=>Yy#=)V9G{Nx86ZAB-Y9XXb5HmT z0MFd9%1xig!E*}uFVu5-dlQ-^!ih1^+cU8(aAV+Q!trdc-hzJ<&YWKf%^t$()47RJ z!dWx5q4^n@`(mxe5`UjRB&)I-)!bL6fO zpJ)esH9Yr*{u^jsmL`3ED?W8Qw~J%Ba<7ZexbDVSet^$T;uB}1=f%)8fW~Veo;N~s zA^gt-9){fh&<_Vc4?OXf;xn#&pc!4{x{p=hIS=!}PXj&@XsQ>Dp%Uo1X&OVr&!xrqh9+e?$N zoF+-vlVi;Qr(-cj$zX_k}*w>@Mzm9%OcOkK>s^D`#|4QIG)d=hcm!WhEEOf8^Gr|@ZEr$BX?u?FF@{L;5UTc z>odLa`+K*8zKeVk_kjNl{-e;3_hZ8S#Q#S4Gy=X1KI_3}NBA5Mz76ojz(a)-^T1CM z&idRNngwl3y?qXTxp4OH$-?QsCi;0_x$&F@pV82d0e>BMUhgVkemM5_(&u=YAe>qk zz^4Q76!deh_{7QJFB4Ae1kcXkmkDRQBjLXe@a@o?0?hUE0eJVB7%ZH*-4}dkVUN+z zRWGm~e<_@PI>|F}KK!2rz6-h6g6|7lADRcj{{=hJVUjDzZdozvu`E!7QQ7s zS4)%l4Y|v~zlpjtkXsr2D&(#~?#sfN+jXT+504|4YxrSkUQuqw-W&XGsI>yMIB%DL zpQGIPOaT9Ff&JY2!s+d^0()MXLH~wue2zr_Hz9W{_#ckQ%$6(n8Z<4nFB1Kv&;0x< zeR|jjJs&R|{ypGY!21H1p;klT#Jk|ffxjO7UGNzuocIx%Es%SnaL!}PG2Ww~ISIL4 zg)@iGW4xZ9@K3?#h9cL`as6x#{TSd`!s%zSaAHG@Wr6%t>pS3U(9gcY*)Id&b2@Ny z;p~^^z&{Co58z#aw*sc;c=WJJIB~P|iL=pL75MB3%}?+d0{xBPyF>5XjO7q$x(R1K zr-SEOwSVUGtHVn^oX;l6T^DuV2Hzj}ZTTb~6`$~&r`GAbMQ$J9ACbE~^uytQ5cIB<{c<31XKB*srpT=c|8>E?BR=}Y z@M!{lGt{jD|Bb+ZkK7U9D}jF%_(Eu!1Al|Mi-5n@@26$FbEQwu{ozUfQR1Un3QdC| z*ItwHJ8vJL*7d-mvK16{%2FPuJ~g3m|59WmaY051Z*6?HwI ziHXu=9*#y2TLKS<&o=07C-9?%GxmYgd=y3Sb${$kXvBAoTG3O<~Ne&VAU z3eC@$+joFHSLyQw;Ehmsxbz9nbM&{vry+W-CQZiD3H(~|i8}D9C7hnCLBB6FwUK)Q zG~L8!f6at`JosADr{}#2?3}95ACEEK2HtZR|IQfiTIgp1ZwLLK!imG6X^Q?gh3D4L zv+hsG9V<=7GD&>qts-(g4~cJpk3y{#z=NSVPJG6Di}?6Is^8;HyeUnB$HkfOIRtoA zQOmx|QTGXHQmZHQH=&2#sMQJBn#88?*%&^112=|eYw?-G!Qz9j1#SSmH}G`fL{ng& z4-?&i=V9KKNT2!qvfy3&Jot1I&YW=U4dMAcJU@o#T=+C8eC)qO`gp#ET84Ec|D|`1=55+7rCyLIeA}v@V4-L8@L`c4S{cfW)sZMN8;1NNvOL! za_<5jDt&tRR5(3<2Yv*6ydM)4;N$CW>NbP^4(O*IT&i^lH09tkO`62Q0=vIf@L3P| zWZ+@)N&j5W?@ANChj7Nrv2YE{K@T<1+il3L0=^r@^%DB2CQafeXjVgW2Q)sHW)4?E ze>Un)L~oZMw+xzJkjwqs2AYcK{{is{p5GRNw~y}?D{DIz{O-b;&p%Z+{rgx8-vRmo z=>J~y`4RYD@Hq%RK40Z^Uq9qt1WhBELe=PFw?i z5%90VnG>HUgU>NqCnJ~p`dR3k3s+J@-ew4Ao_hnIE1b9n?FM36JHnDJv{}V&!G2lkr)j8J@5y@nIG<>uUh{-Ugw`BO~&2< zxo;J`HM@Y{0(005d>!Bgz{7;&-xRs8tB3S!Kbl$j=#^7i59})M*^=FPF;>=GWab}>r3&8R>GC_z}rjEZwgHh z@OOis4g3;%z7%u*mFl`@_xGRT3Te{+3&=efbw{9<=Rf+dr4QZ&ni|mD1pav7mcXB) zF4w^J(!}3?pEUD73wQwVDZ&*sP;WngH;xalR}7 zL9;D##{&D>l-_m}P7mYIb5nS}3j7W9ye_A{fAYSuBlP8pwc&aV(8F=UiSgh^NuTh! zI&lk*JHF?$Qtx$SEc~5{)%abzp3=5A>+#!ujRKJZ4!Jrudqgp+%v z^p#ZD+cm<8!{Bq4aP%7pSCq)xU*LBIeqEoBj^_gL>HjhD$^Ae*1m6kGS?KdU@$s1? zoN)i~90AQ(_`C)GAEEgUn(cru0A5vKkJ;-a@e)4w{jm7-?>Wr;^bxMC1aI?&(`QBW zJWoF1Pn0GxSA2XjSre(j6I(S^T#7a@0j zc;1OzpHE!ZLH?$~$75UopC6I?J^0S@$yoLfAAEM9w~w#Ung3tV&)4Xm_Z8ov*5=UP zDxA4mi5}XZuFvxsS6$@R!g^Q-;11^91-O(8DN&#-zGujIKSOW67YhHEd@|>+!{=Mzal#4TgIVu-T%VPsiKma>+#7iRW=?KZtze#e zZ-KwpRbo$!aTV}*%~g877xTG7n#2#N)e8JP`KPxb!s*%f44Ff|rq~Y}zZOXU8v^@0 z7Jek~tH2japLjuh>Ndc>aIN@k42{p98Sg{l6N5DN=nnwDUQx@>`S?w(&83OHC;T4~ zj{n|8u5+5f^Bm~6R?qQyu+Y0F-;br%O!b!eybV1pmL|E+!Qa=-^zeal6Wb!!n#AqE zZ=kN{JUx64ysv!Xf4cbKPdb(Qxm|o>J>bjX<8yEPeIAPs*Q&1(8RNCZK5`C^{kxER z2x@u1B-huA)Y=Jk+XyFi2Cjp;U%|f~e7;aW@q7gu_VyNdUpq3!i{bN&u>16LK7S^T zg62!$L!qf(%!%{IiO+c1^E2YJetJru9K+Tv zHsE^z^ZZZ_`o^l8etv}i%fjK^Tkwy_9Rj=#^u5LV+Tppo5gM+s{h_DN2bhQX(qtZL zz-KM^8^lL*j`-}afza@r!?jcswYtbBu}rxhuYEn1jQtUv0~5Zd%Jp%oaAIfpbVP4g z7M}Lv`EZ&v?%B0|fMyKvm+)^5Po5Lbg`OH;>vMeZ+%*+G_X%f=K7VFDSIaZ=d89PK zt;I)EQ+(nY_`HXHdLg&2aB{5=o-CZ$3VNRd)7t{neFk`h^wAsy&+UMHe;duC@O)P| z;p@2jv2G3gyTku{cn%d#`2H$!Iq)aKse1rCs}#KV%^?ME-3`KtQ=s>89iNkcrvRU& zezLE(N1yI3^ZY6FKL0271V0Zv-*pwkIk$>Q?y@IM^b_ZaEtcKE+2oR|dt4#JtA$C2yzJmXUt`sVQT zeTy~DUxP7DMV~ykd;p&%!r2!aL%$jNTnc<8a+jjk667`jz8e~zbKaIFJ)c-$Kb|C< z@Hr=AZ&8fVkFOJ-x#BhSGu6sIx*oZn=jeStiRU8tG=_dF@Y98}KHmgyjl*777ub(a z$9V6A-scea=02W<{^^4Eb59DVH=eJWK|fnKW4Wrp&N&mBBZb|wujOrpDNqk~!_^(FpX{hDE}M-cwPk0anSqNjK<>)=5@A-_}UtP_t_ZX#Ja-ia|%3n zgilBCLxtn-HIQ5%YvI3#egkM8#QguKbLqCyCw#rgJlq5RVEKnXS8F)2x%l)m6yL3V zKJ>NV!+G%Qhjzg){cIfIXJ*S3*BQI57u3PZy59GI|~jpIf0n z75bXc`1+pypTzw5HD>(p!mQOKD9ho!Bd2@{=H`6vo$n- zp$A?&d|r*7=dN4ngMIqnG+HMKueU@e;Bx5UVc>6sGv_~Gy^V$Edg$R2Xna4GvEM6A z-hVR=@B8YEtBUlAU7`6HJ-iM7S>Ufg?!~~j3CG{Bp;Fi9BJ+Oi*ZYaB(a&F~)m!?^ zLuZV=zxc#!;15BqZbdEEdkXxWz`Fo%CY)M+Pc_jDy?GuIzX(TvmU0t2!E>B6nTO8e zg9ky=3b+RReLhS)09+CJ>fk2<{{?(L`dn8y`(hpJ>#6vAD34*hykDJz+*jqFvA+cU zAL8Rb51J>z-vfNEaKh*I#Fo%ZLft{Y&j}~Iu2OeH^s}e<^m#HgKK8ROu7D5kk$j(% z++orue2*Hw34CS>hxfWlY$*TKxoA%v;PV^se$dpDf1(jIzIMdtJ!#_4b9HlR z(!-Y0MBi8aBrbrb|4%CVV=(rb(BBALQ8@Y$(4P#=QtXRQ(6f&z_v~{n*VwV}nF>5x zIJGv#xITn`dDL~!(fi&hW4}ao!#@Lm?~7=B-xAF`&@2aDPx`FA>FOc+Bcw@mgT5O4 z_Z5!*Lg-f&*nM0sO@haxeG67g|uzkW|}&HMODZ)Xc083 zGv~d86L$-z|MQ?ZQ8+$*1RIt50NHg zc~v-?{gFEvdS9Co`$Dr=nnXMBzlqPW(;j>);f&GOsnl&ReX!4~iR!}X)7QSlK=gCJ zax)LdVZV5t#It;HZgK6);Q1mvy9!6YG5C|<^BC~@&>skVGjf{=XCA(R=3Mz?9{v!Y zF|Gpdb!d(AJ?H6dIP_OZpWL%`zWt~8Nax$+{!#q>HR~qAXDR%B97Vs6aOT$QKQROv z@9XG!-^JG~$4H+(c~4bWe4>YN=43SX<8b)Ehvy06GjDsKH{Yk3cfD(% ze*(CTH0j56_(i~Tg&lrwL;e19Gy}^1#@+|LPb=+<1J3>XJnVVD z=JL{5^zeV&5>RxxPf>$BbIVHICdr;p8>Z>nVq?sR_TI zlJIrP!M>bJ{eKDm5C2Ks|3mqI$^K7j{U_gl$~Bj9{d*tL=f3FQpZ~vme9)=-UW0!S zHN`!~KRo>}%Jn(_|9ay8Loh=G8?k{`uJ{5B=@uxqiJ^ zhyScBvH!H+4nr>g&Ze{esozm$CBG@%OPHvi{-$Kc`vv^h*|5Y@PkjD4e`~HI`9I*H zS{teLKgj+cJ>|d2zQI3aoOAZyFcrT9cA^pylK*rARdEj@d9EMzfZ$NyOiqCr65t=o^ znX9XW(c~F%`W(^Adl5A4@#n7IygYebOYJML&HCji2-PUnO@e@YB*{ zKVB*9x~`Y`@ne4G)W>i7@i`%$_7BhXFjo3#{9QWHoQmAW&`bvQ_qtf`9_aaHp)sHH zo^fr>xqo`|v7d4Idqu+c!@0trolighZm4MZog`lK@tL8164zraqk#RLA@Nxk{ah}e z#82=!TYP%(`7@Z~nkG%=a2xn=E%`eZ5?(*)d7*GT{{ZG^OZ`0wiRP$P5Bj1kBZY;^TQSG%J9c!N=cC zmv|lh%z;k}_^*J5*R_4%@A0OGy$jxt`Q0py;8}*;r;6UJza6!_uQOiX&tzZR4gJrk z+Z6nt;uF4RB|e1bRq7`_zYm`?zpa({r=a(`P5Al}{R6@o z?;pU?`sZBnnFk*iiRHlE;CVgpCFqUc`Bn|J)(R(nmEN`7pU-2#{_K3#t@nFkws80z zgfp)BIxiVJ|0D1k+#&$#Xu&OFqE<{a^fov@F#hyDlQ^sp}QE|{O@n1^%alW?D@ z>-)p>zq@e4pHoh}Djfa(&@4f3$D@Du7S9)jGv1l#$DWC;;OS#L`f)7QK7zYY2v1pnvY<6|K` zzX|N)F+H~fU#IBDIj@RO^oOP@a0T?=3;N@Q<9`cy9`8J7*1}kP?aLT{)L4wYzI|>C z{}<-xb<~<6pJ=`We+}kjGilP>TKHT7Ju++;Lhfquse2?ebD+5bV{C&S zIB(UU86}+K`eNvxmVe>^U|(Oduh&NpeC_6Iaf06w#5J%0K953w8hWcMobi5zTE1q5 zZ;P=%4?G9Cz8+ccIXw}Yn^Efy^fMK>sj$Oi?j(JFpOE|dUTJb(<$CsgVCHHU;p|i2 zw*==kpmq1lKm4V_i7v{`c!$BWN1<`9eUiHzxCVSK6wbc3r^C5pp?N?!J{(JTXzqvq zX~0KdZjTn9u`kAWd5-dH{EUm&@kz+t5SXudr@_h-mz}J7Z~%-r7UM^NG(J$@OcQmg*F(bB*7#q7y1us$zc2KDjhV0};d{lzWANer^8I0=GVq@0Z7DF< z@I@HoG0M%H`xr_1SPnm1KIz~0X_8qQk1OuTFPxxwNSQ-L=xG}cvxr`Jiw=xbG$*;?v?ZDdx`YF z7slHG{Tz;3yx(3XP3H4w;A?~v-j9ic3f}d6FP*yk0rS09Ul$VFLNi@Bk)BkJp|tOEtx~k^9Is5obT7I zsr9LFd=A2RuLV9wIN>#u9{AqH`Or*2Kc|R~Ki|*s^(Ao}`nd)C!{GgXPU=1({$HNJ z&5^r*SxN7G6#Yr?c@+3sXnbFn@Y+t@&470o&TAsSmm7bt+vvGZuM{86Bhc&u{IPrz z)5Iq>0PpjB{M!~idtdt4Pw<-lviRujpZ(qfK9>WxD=YQ6xbS!19pO_R`VYj%^GftN z1e%KQ^mr3Jp!o*=ehr(RXB9p8aSP$Z4Ak{8o4Ms!avgN;PKA$k_B3bg^_k#31J|e5 zWct|-b*%|M9zFYgyzm=AGYtG}@XN%f|HCVXsW>^^3bdjvFR z1Lt1OzPtykD@|&7P7*$cC$`(5eN`y&0X1OMvi zp*C{A1U_Ck^LYsLyiYEJ#`BO`{(pz`lkxed_gCU~;rQNEyFCYD-uQaK*Q3O0)O|@f{+FPK z(}dIWVFh+R&((haGts21H;yOYKdf8qBaiDH?5{nc_dR)X{XS&s`hASV z1JZa+y0)*0*)Q`8?0m18S6XE#RK{VUL4F5cmK^`JQmcq`%bGa3Am z@b8T=o+ORO;`zTA`um_i6#PWt_+Jm7dkPVW?lxxV)0eB$>Z6ORbT^LO;X^Yd}a%~*~S&RBe|NOZuQ@IKt@AyEl^@^?zF zgvM(=eZCF;SoC=-`acwN;@=BO_;--f=NIyE{~o8;NqGOiq&Yvg6>?ijlQ}t6eERYE zJh^4?uZUb8Bg4eUXA|iC-a_IIczR#NzbA6ngT5TbyQOloU+zTDzrxe!;dtg;?eTOL z@9=ZyLo*3I@OK@3{!G*q&ba*l@0lO}4s-h12R=N1`gL(~+riU+V`}5 zA|4%AdXHuPwI$6J(qw*yTwcO&^eO50y||=bD}UGVc9d|U--RXqoeN6$joJQkMSf9KlwZ0OgDPyge^$Gn z3I1cnC#t~zT;W80X*@31m?G@n9E*h0!x;td=Q^V2HR99T7y9gc#??rC=4vP5#IwNr zV_Zw&^NO%P-{$Rf;rKi$|I})W9-fva>+@joxxal-e4?pvdRq>kt;A;zD=9a14}pIT zOtna5v3=>bkd#@fP9m>~l}}Pe%VA2}j=>{3g)Ph2|9S z9mP95FB_t6Z{Y;j71z=&%FTQ}4ZH>XhxUj|xpLouKN5I$(Swz%;Pa?*v(AT!&lu|i zpDLed`sf^S6`FBF|IPe5{W`1gm zPoD#Y!#6MH!L@%t4_^qUw_T+V9Ru$A^|ln6)1lcxKAEd4#V5X3 zt@L@l_-KAX?yKl+fAGh`=icJl>M_)SW0Cz=hcj4>{k1IZ(pH;$piqBjvh5kq23x!kn1mW~nRsCe0 zJfP2Vns<#23+%_OrAhPoK6C!F|Fy+yxCF?K(G9X)Rk&%dBQLpWpH5BueM)Y=!d79w|V@yYdP zgfsT#@<~72LjP@nJ?3u08T%o^$^8*MTr1D`%!1EE=)aUcKDUccybpbK?4uiyyAS-g zJhS9;o-|%>9^3E2@vjQ(v8U&A!5=A{_z1mSi8<+sF`kax&fq^3PW&uQYMlqZ7IODP z-9I&!%v)>d2aAu-zVLL<(O1>DJZ_J90Qe7)TTh)F z|QD*x2I0d;qiPxwQGxCKqiQ9pA$Kq76E_RT^HpH;iJHP0R~7i2B0jzC0DK|v z4B_;)j&c)iFc0@jlO7tu{|e+D4b2zu@xD$E=ZgSFZ%J=Ru`V`uNKC53;aFLnTIFP+Y91TYq)UY66os}*#2ItnTO%> zaX)@s9rN=VG~v?Y-g%jU)FY#xKPY>Sj>672x_ljyI-V=`IA?aP;j~B}`^HW}Y z@bS_|b4P*wxQ;Z5sp6yG1wG6{t^I)~2q$_8+t1tf@cgS=sn0b zE2%GUlQhPRYkZ;c<9*Q2W8$M}T=d{Rh8BAJo?2k@zX|)NxBk+n?i%pjge&WLZ%-81 zdVkkYa>oMigSzJlr=Rz_m3%r&pIUbbN7GUIO7ix0koZJB@z%SZ*G%eWjMls7_|!n% zZNVQ?_&fh>^^-UXnl8fW?Lpy65_$8!NIZvJuZ;xv^_Jq}^Bl0(dH7cF++Empyqzme z#?l$JCP@>1p>U!W_}zfN6!uuX{Uo2{-iX|Fg)8ZKZ*PF#U;6a0zu48rAzkmAQv!qGXDKyq?0seCE%TRX>a5Lf5 zeHZv?)e3(VJof6Y_DR6!0Z-r+w@$sAv{#IJcomS z=G4+09t@4=Kk)*3*cG`Cu`bq0b&TamTtS?-&YG*>QSh8AjcYl&7ub()2RQ*7E9x?Sbrsa4ijHNoVNw=`AwSecME489x5yGK96O+X!*Zzs)kn44us47i* z*a~%z0dN0!{serOJQGI=yBBY5!1sXO`=x@O_cmQP@vAh6KcR05-sf%SxsRKb>z|H| zp&udM8gEUdx5nGC(j-Pe|D5!R-GHk>-w*ss@U@D5D#+j!@Yb92=01Z5!e=z}eZ`lT z)|-2)sGr`pgMK75uSpYqH}F12!uN&d4)EIwCyo|Qt&M?O3s;cHTkC)GNiIEGN|P9+ z-12(h?FsSmUm-r&=iv%^-rHdC#|kHY1@>H(*AvzcC@cANk;c5YHHF5wws2+r^fpeK ze}%9;yd7Lt$~~>%o$F&EeXbQY=gnhDd7)5Yy(K<@hM!ycRGM6ymP(WU z{X0d$&4r_x1piICmTK`cGCuaptFX6fz^#Nc-lx%{EXpVsP&8bOk4qf zUysV`32%*r6Z6YTypPS)^8QV&;lKw$zZdXNm@A%V>PeI6Ab;2QR#!OwpDQ=~&1F&R z_r8SFk3Yu|>}yK!rO)Kg2{fMDjO#<;jQxJ$)IC->agB0w%`(eX4cPlDJ|EzG)m}K^&n6_->o)xyt=wRL-akJ6Tug$; zf{(T6#|uZ#{Z$1%_DtQ|;OWoT*vI*Y!t;G-z9=--9SO}R(CiAn5A>Ug&vnzEPf7Um zS?T#OY0{g2*FF4l@eV)czT3L+G5-hV`MR>wI`Qv<#>eNA;EUkT-yh~@Ay1c2^p`-- z&u%OfpZWh7wR~;~KTUkX=k4$h!?P2x*LmvtI~x;sl?Cawtu&b{u7{rDdC@kZo2Z80 z$LJqy@OTsXtdQrYrTBR62+dUCg5MKYRyhe9R_}l0N(T5cI~+<@Fbz@b90;)1PHX?z)&;e*Wu5%H5&k2X`2F&YAGx3>|su;^u`1ren;^XU7>fR2`IALoXw@IJq4Gq6H&z~uX z&nHE$^ZmKM)beKmavk?~Wu#Aj_IxgK%aH4P-T0r3{{2~)_-_q-jBxz@nTX^bgIw>6 zXnYQdrZ#%>I!w$$F0b#`K~t%$)K3l6t&Up${^#^O85&;;(t~m4s)=y)_rYgx@recS zsevAjkS1e{_W$kAnx~ffd{zGG+2@(y^U>Qb!s)*o_*&8@253&wr$4h9ea-`Z?ERRi z4cuBdxo4D>dhq82!#@w~?|sVLc0_NRN|U-iNBKPG?M&=19~a?gLGNQfxjrsZ*WbY# zex5X$AD>%-zeBE%uju{x$Hax=6aG9=a@T==!vb69^J;v2y$kl|D3i-t{n4ktCnPZz zxx1lm74h-O_0cuvgFghd-VmQT?}b_;fL9A=ZYLslx_Hm0{hyFe=JtH?34TUz<3exU znbK$MYyRz8mfX9fNnD`Z=y@OIYhT8DC-5d%KRoyHGq%IwzX$w}2Jg>V$KT)clOF1$ ze}7L)_)*~V+TY{lcR4P{c>S5;;6jnK~|)%Cvi zzT|gK&J`b@k%f;Rdu^mQeg@6!Ftt9#SpES25Y~x52N$2i3XT2SN)w-<;uDR8qxbh4 zq_;gWb{~UTlU&<4I8a!JiEMdcq!;^M6#`M8AUfb0;9TojfxSJZ2w-#@D!n_i1{&AG!YA zXy&RC^kcy{#ym6?_B^{b?_qjNAOD|$mm&91@dh;dy8elqaI z!tuNYxC?sl^)BK2?kA?T&wn#txE|eFgx5hcW;N#B-rw3ox z;^VsEzZQ-s_w^R2g%hLEgV$1O@fueqP2ySPwt^?m`JT7LRN?gO z&vYlw5l*caiaBwAuL7Tf-Zm4C{sLg1({hh-6Zq?KKL4{URrUQvT}!xQ_fl{CT~mK% zB(*l{UBWB-m)?uG@7dCPcAs4GnR$B&e|j_izy8KjpY3lbeXelp5q}>$9z&DsOP(FB zE%`iqU5Rg6XgsHl#Jf+=+gj;;4BF=%;mk?xg7^;ae2HR z+aU27qvs@eSK#i*eM~sD-Ut7ZYB|@nw*=oyy!9UEV)606`|47kyJ8=0f!vRj>pXi- z1;3YY=515uuA}F@%_{VMZn<#!{9gLtXQfXM<-rdW4u64iUDJC-P5+v?1+83Onm15aO8SFW*%xvlUQ#W}eqCG_LVI^efk-L>}YJHEMTLF9h z$CKxuU%-z8-b^_Acb5FqTgKwK*h!l3q?JVq`Jr~WOIY|8^*XP*u*-D!5K4x9Z`6o*gz5#qXV;*uY zbsx3GXRclpUPqj_%aD6p(VKM_6+Jt5hBWEtec_DvTWGcrUrkzX2SDEi`WvNBZgb)E z|19($0ROl1o_P1-{5J5UX2U{b-B!>%C7iK$5O%oswZd7G-v~R;+okGlUH$atV<&yy zFPwS!6=V0hHE-SP;MWtMx=qCge(EQ?yVd&FG}N@u05*g!T3Gt z(=*SFK3+2a=O{Ph{S3V4E&MlyzrE(kGyH7v@!|Tp3Z9Q5cWd;vTzpmed269{7|)NO zKUDhkKU;NE%ek5VrQo*}pSfxPpD!>ETNM4<>uPCIcO~%i!toyqeyDKznF0Req6gPL z4;s&H`njU0>w23acl#pO{ZzsH?5;UUEw7XG`OIJmi}(|KW#RO^wLF7wF0lPKk|v&y zLvua&Rq*U8oH_3$eR`N69G|tqRpjmM-hy}Sj_{l+oOzfeoZjjQ$Fm&tEeapk_!zkd zijTfCa`zKoRa$QwL;nJBUEwNv-rL*48P|Hk@!TAmdD<7z{4W3W-wPTaNAWZt&11sO z_2YMhtLmq>0n$g)MSSXhEC2X(2j4|}=Blyy;BSS~+Ya!&V{pm87JNF&C$+p^g6~vr z@b%KflWX-Ic~&j@|4^FrzgB$Kz#`%FW=(jXKke`59uc3Y1&xpEE{ID)T$_)+^eB)U10a^Yg6WDHO4rw$aVe;sJn!{LGzsW z^fp+0W#xHWU)cS)zcS&}+FbhJ`{8pG`kWygO<&=}2g32MS76sZwy5QLA0gN0g!I5M zo{S!P4=VM4P@#A2)!<)+-upfCT))^y?xB(RD*EZ|HuUfoax01V^HsIg6pl|HXg(3P zpSQE*89Z6~;Oh&$A5V~`vVMBwIs7&8nZxm@HAp!6^}sh3&RRM`IJJ09>^P{TxlcVr zKNLQDp|1B=#(0$U#_lOSR1sb#-khHs1Wg6`B)1O6xH0P9D*wc3h2A}l5KjNsNFQ9g z@VD=D<%X|Rv!-TIXoH@J-xjP`2=krg+SC)sjx1~?+M&dJ;Cc>Gw!-S*RQnjiS zxjzX^jTXt`j4fL&&A-|2xs2r2&b-JU&Np1(jMZYXIlcj_Y&!|iS+4hny~fm(xm?m=;5hCQ$?Pi zW9(hUr|!wZ>1UcW!8?j~Kd#~9E@SaJ3|@v@UnA1P6#3ZSIv+c!)kiozkCrAr-QnqT zNP6gwv812>%8@29O1O$1c&l2>p*1fJD%GkWO={hxy79kTe0tsxnn$Hc&o_Z@DgWet zBu&Qhg=)p$>&F^D-bL#?{ywIH_d{Lw;A1d8Z^Cn5)G9;nMCeyR|1{>Us`Tk|H{r_a z%iAu(spV@{##KXnulbYTUWLG(|ycR zt!QRRlioJNxXzYOc%O%ZeV?DYzIKQAYm@Z0R{rVdX8A||GWzkkG0|F{>F0R(%tmih z#b+#ogyXpenrhMgoctDzj&u{TxAwHfjm!<+9z;`1ZM<++OHaN+nYktWzR#a|kJts~2Uk@73VRCs7_P+SUKFal& zy!oE3vVMBoSUBM|AKvGOcwQqMeiLcZo7Yl$yHwb`bq@)r&jWxL2>W?&dkM#t{=b6nGO$$3{lw>V%)_DL)6Y-JjgPNiiKE0< z)&p--;Xhjb@jO9#=UQ`&G~qc$-skwWK>9yh`YOuv)=PYH-xZ(UrU)md3s=$uZ@#CB zPi^ph)LT4jNRzl+ns{D~T#kLAG&zncK)etKI5&CBAg@%F0v3|=7|&zqs&Ui$D~3fs@y3~4fNX9{QRhXUUX z{qe%l|ApLkz=sSj_46luZc=XiyQ$Ck3>IHey?FCIM)|-vdSMsJplL^gK~~YMm%PnrnggmnP%&oV%8FuL6H9jd^eL zgyT6%eWupQz%L40YoDFriZsDHDmQhlucSP0{iVrVtrWJO zx6#7My;V4I2zcwGnI&u=d+s6s3i|2oTjBUu0)H8BBWUiFPjYX*s?_Ih>ObeMhQb+3 zJ?S(5uSuU;JByFz7~zWQ#oNBB6}~O_7Qz*Zo=3_jcy51@MRXGH@p;{x4b5ca-Y4F5 z+{cyBukK&!ZC;_V?m76}1fSof&-yGc-gUkGF6=ySmjPR2u7b9@!sYeT+g-xuytPIx zuZ_&rE#M!9{v+}BaBe$c*LRH-(BC0_dRqs%uA4sB6He4auJsus&#S}4yRNqt{YySS zDL4E2FyZvyPq>1#-g+xHe0}lh?M?CN=W2O|cR%Ho=dBuWFX8AnSFXLi4HWO6t}z{& zH-rul1{Y(BGg~J~sefqo&K5fBoBJ5i3qor_i`xLw%*A-5m^W~rUTnm1w_|#e~ zzP$3heb}#rH&xH}vFCT<cklU<($-k3uJeLY5cOLjU z@SH3@waN>7T;BJO!+$sF%Zsz_p8h5M1H%90f2H{JaIAcy*%7&4U0Le+Q21;rKG7NT za5{X}S3l`_ck$U5?kDSZtZ;gmB7OGDiSV2SpH}@Ud!=#D7e}6T(t%cKnb?9q~&lsnGKLqpBLz>j;1kaVyr`AB=lcY(XXCrroG~wS6 zPF?RKhaZ2?zf|i?Y101*;#2D!>C?}_@aYZyA>rtIDmS%$6iz&f+!n&oFX~(JKL9?S zH*4(mg*4Ikg~nqH->BfNKU{pqeysRJ-~OfEI>bmxx;?r|^ z;GL0sMUm?{U07h(s|MU&y`|^z;Exrbm45V@ZebzS>5;N|!`Q_qV}?iKKPQGKS?EAZSx zeDr&R_r8mMtZ>HF51MB1KT?{Et2O5B1LS^JVEeu+9RC;K(;E6=;*Z}Ug6Ze5p`b# ze>&!&pLqMb?p)#c+cPn>&{%h(a;^2Yjr#u=M(#q?{r#enW{hzBw}NJka?|tS@M&Mv zb&c0CS7$0WJ=YbE=S#xzSq%TrQFkTu1EAj>{29WT^XbBgAw@rat{(XJg>xQ0TD9DR zHPZ_0$9JHIYSO3YwZf^@Mw(#jGq;sc>q6vyDxC2SL~k3Q)>*}T+UqxXo(|9VrAd6< zyEK;m(7z&_I1m1PrO#MS7oYxr7oXnt5uf?l1wG#a{rbZ0(fRF!(*J6vNc)T$^P&o|)TQ+%R@`1JN5@Kn^j5&U7u9SYnE z_)+8z0q!H8^n9B5)LnRCy3zdrG{*?Lf9EWQe+}`8mCE(=*8K{+GyH3zhqK_nsL(rq z1U#n-XP&P?-PfS61O6Q0%yTDcGOmZAA0ZsgAZUIRPP~G;(}m;nvHY{%Dq+9BB%D4w z3P*nk&WAN{-@^BQ+7Bw_HXUB-?fBc%jjkb2mez2I)!%))GR|9O);LHg`3{vY&ec-}4?%?jlP|00~8e-};+60W2N-gZ&l)bjt8MDO1v2+!ZU z@b6}X_wW2vmWQ`V!l~>3Uk*M|IJNr1|0&^U@_S0w4HO@L|G&I7=KZ@;mG#q`|Nk+$ z@1aB(7ik|n@z0g+{u0a2RC4F^i(%S*hG!Y*k z&iMoKPw@AzJh$<=5;(s<v7|`oi&?idrqCud13p{C$}5^!HpP_e#t zEq*V}s%uK?^);1RoQZ!9D7l__H2i*Pe;;pE)%W537LCtEu>bEkKFy`^9DKYbP4Lyo z-Cp}Y`WxZDop9#U3pm%2z5IRe>8Gb~e4Y}nrq_K;7LJd4-rr*xe4_5# zSr@+-{d4K#>1)T>ISr9}uW;5oQJQLc-Fs+d!B-V-Dn9X>`0TMk$h}+|Ykl~8^MV%( zr-!|Vl<;QK$HzaT6n%T)ti|U#x&D6d^x0i}^tFYf?^$5ylnE#PrMj6_xc{$zpD*;T z=buB&+`6cTYT|tO{V|@;p@(~zmFt$ z5;TVuxz7I!{Lj$)X9VKe7yA7R-ns8epFT%IzeqTBU)FxBDs43#zeu0>Od9v@<0kRe z`0za>p1wwc{XO34$M=WuD~03Z@5PPg#~~%&-`5(=2JqYup8k2*XubmOD$i;~pZ?zI z?8ACErw0}q>-fGu0q5=*;rN&18svUnPyXrO-`|*8{$9ka*VkY)FKLb8eg6qws(yl7 zpwFhr_5D1W59Cu#z5DRb7o^W#(ggcGC~;7ssVd?G@cp%}!~^iTT6}8x8jmM`=68{N zvM#SN`)54n#_!WUM11rY3%eH|E0mjBRpGNYG|vdHC#{e9=!f_7(bA+(e*b?z_@9rS z-xE&HrzXW+jU8vpEYa$BKpOX2Fu^Wp0# zn)ij>gFjv+OR5?4Ngb z53cP!mVW#k6`xz6&-H8lWa;C1w{Y~nPlo>k{qu8#>!r_nYe*CPZ{eI%zmLS{TIhXm z4}TJP|7=C#9_8B8Jyn5zjQDEeeC!Q=j&Q=i?;`#9noTV~t2occQ}U^*e|-#u{sQPP z1<#+0KUqGRv!AarxAl}8d@T6pSflSV>1~}f>4853?)_F>efjXcH=dq(*5co35KVJw zGOLE_Ir>G?n0JnIU8|ao*M+0$qui{;&kX738sTV;0p`zC`nk(`=lkb|T*o>7dF}9T zAh#v3XBfSI?@H>vBtHH4=YoTO0PmlTN^fTu8n4rPFTD3#JYNx?x%p@4f@i_=O7PPQ zPuKR(!A0L1vuy#qyKv5_e;zaVM&K3jd=|XlU(z#wN6kaUT3ovya@z=JT}PvbBZ2+9 zU);O6!c1Gf()L$9_J> z%O^AR?}BhmAO1OC`?yd3ek6OkrjJih%fDkGy-ksibM3oMIC}m*ii4%ktZtAdJ*)zL z9JxoJ?$-EP(=p<+UjP20oZsrgS>uwSC44S4AId-a%j6lKFQrL8k86$T)9+K(TQ^6! z@qbnNtZ^p%y+7mWdv$#HyU1>rKANk9qw&vq#s4X2{CnG?@imzKr%00?hJmjsKH>cn z&tB;5RB5taf9)=K5pw-Ll|KC*n!4`_S62ZajnP{h;b<<@?`ulWgQbuEUGj|PYw_vr zGiVM&UH=ZES$O)j-onYf0Gdb8Ll4yY2>SDcGdKTUzVvgBaO&2OXZ*d-6Mw?zEY$r1xo-<6 z{CgVXbGmrfa&2ByM~P2ARpHY^^9g?kd}@O~Uwrz19JzOkPwo)$*^?)Me+9Yzy?N2E z0e(}t>EG*0t&4!)6;4boc<1a3pIyXf4|rc0yC?oE_K{jw`kbZQVBcf22d0Qm4}FEx zTODa~?)W?O_LXP!OQi|EPkeF*%E!5`R|Wbi(q|^eK|d9BuN97_T>p;{|J@2t`wm6_ z3xpHxp;?Z)eT3t=nKTKXm-O5hYq zz~8?gGJCSEG|_)4oVg7a&f0zd&szMuI)fjC=5+9H3ft59%Y@T^W#RarQRuC?Mn2Kp z3r$z;tMGdlwd~7&&XFdb{#~i*O|t*R3Y_b9sI@>i`VWN@-O@0GRx*63j&G+m0dSaXkf&&sh3 znvJE2r+;5-`d=;V-n@^O!N0n4qdB|qcdxC5!+%rMa=mq^wMpUQdQ-u-5N{9Hx&-_* z;Y2gx%*wgBPX7&ktwQ5IMha)XwYTbK?K>2`IcKai*;j4FTkCpF@OztA zNRwRqWbMzQmams+2EgZ^q6g<3iMnqJr>?Jyq4B|GV_hZyOwj7z_Tv&o#1ndG+wXQu)h8eJwBI<&$_k* z?q2Af^K((l_1+bZev~wc3xv~uUE%n@sam;LyU%D=2xtB`2xo3*Ngw~w@cE~}&VLL2 zUkjgip#L43TfpA|{Wz^9{rFlAo)67sg^yp`RNuo8%}vszXYX6{{`g?joeZCm;NEat6uf

R-p%9`|05Y@u@Wnn(o4xb0ug76&mNvR1Z1VCqT13dYdoozO28p!2b9P>BIZH z#OF`o-83tQ`#3__dLJ!OYa`*TajpClqlzA^pIBh`@SODVIZd8f<0|3I!83{GBju*I z!-S*1P@2qnDKs^KeT_#y4Sap&rq;xwmUX{F(+KMwAU?4^dY%XW8qiOdXU^}j;?w^s z_@6qe)WabC?SrhhN70Wz{!9AwSxb7a*S?#fhdSb|b^kvXJs5w6+@sLLO9i&i<>=vo zBG+E)l$(BD0Y6o}*>(6 zQlF{SSbS#XxrHC5+~C7etC`jkeP8ssmCi-hvH)`!Dx5yMNt4{`kZYghUaeZ0;d1HI zgZl|TN_u;GZHwUZT~XIHo<|SUl$-glkv^U~Blk1m^v3ybt=#DC6TCfe_JH%}!P7pO z|7_{g|M%Fd7fBP(`_yxK*jIewdgX>c8Mr-a?JYiYejJ(x(EN#72jF~-klsDGzZwPh z$Cu&UEmv;NQB!HGwPv(%>i&-0M}-rEq1i(?YuQ;nWF`ZJbDcho^S%^y8!I&WdUoc?62t(W-3$HLi@o=H6C3TGesK4Ty2 zrV3|`r>RynzasZQ)biZo>HDg4{jqz_Or9y$XuhTRcy3J4wJ$&Ze@7hsGd{zB5C5; zMw;;Zi_feU3TF<}p}8IXj2EBS{+3c*UkmZCCQWAbIP|+qpIZK#LDAF`AN-p1@wq}c z{kTuB(I2;j<|Oq0LZPv)pFHEU27FKDW>ya%ck`kLpTCpQXAf!8+g{=`w^QYlwR`|P zPB@x6;H%3g{rn-H^w38*{72|#uyQw4FFu;0?rGw^zkJ*S|LcTPcc)uRy|pbgt}zGt zTJlW)H%Ol~PLL+|3a=}@{UDs4T{rqpSl3$d?!o!T$Upb1@xsY%2>n;m=loU^pSn9q zpSqtFecE?6>JAi6|9e8;R%^)|7Gqsw3%z|e5}$s0i4Xo+I6d?c-auNKG#}vFw{C{-}9owspiOhGV@`l^e}0;4#99-3m|pb`qbpoPk<1gwsPy?TuWI^D(QX zn9okqXSNT>Gk6;KyP&TpK7GC+oV9-^P59B^A5;(Fe-@vfhpATPKLd5MR{wjm=9YfQ z*OX^+$v4u^+PELr;62BEW+uA|$MY%lc@s1f)K6l#aQd$!?0cGz7lqS9AN7;i1-Yll zGr7yfyRJVjNB_qO=NxrJKYI#iR<|lQKF3HO{2p?%5AAiIa?_iy)9Bwp-CKk+hx<|Y zZunm*KDm$R{Cc+b{Yrdtb3OXC1Ho@9oc`}u57{S&!~b+?a$cqt{kYz*;?w_M!s)>{ z{3_x2TOZ9&&eeUSL$aw@%HrmkB~mO z{}leNF&jR2JFNSf4bC_bJ%r`E)C4`A=loZpYtf6n8p z=%=1=JhKn&b(;9BtG#g6`<47NpNYcGwQgL2{qeQ%{2Tf;zzvI^Nwn`%sI?Yr+(r7V z{XFT@&m{4|Lxr>UbKuh&`VEAm*-)DF-vb(Zrq)Vnf)9}<*tJr3Gvq!Xede7Wn?c$vsLq{fv@-KEJ2}&2GY(&*p{RH5Le`{}Z79UO3NA zE46>p&qVoW&;KHv-UcCem2mX0NE2+&=)2xt>c4|DuI0W5iBCTV0x!Iyq(4P`de~5W z^xxiDn#0rj8Q#pK$)x}0x{pQ=l=!sI>PDy#cri@)Im7>sa^kzUHcv3oX53YN}8F4#yR(i zPYe;C{ud*6lyKHkj#_64C%%!UTpw8X1o&UXCkCtkL~X2PO_A&T1L40Z_~zoXmZ9)G z3HpuY8BOCtZ_n}4hyPK0);JjaGI)*?E?1t9S@8K?e0jRR2l4TrAwE5P1pn8?JI_ZsJnsX~ zna>d)&*{KN2*x|1NoF z-5;um^YJihJqXV#!twkTJ=7AP_!^o8(A;|Fe{-!HCBCx$^)W&?Fl1}26Bf(@9QO=J)!s7E6c;janeUq37Ubx zD}@t(BKK$b_k#W%cs?qeS~Z0;lbyhyi`*T-KPjAe7CkH$j*s6Xg3FQnA~ZLmPw$!Z zvkacK#aB@=A0xr95YBv70gpo6*Th#Ta=VJR-XCuzoMR5qgY=13MJ?C(6aF7Se>|{fo_Ihwy{$nHYsF{n_rbpkd?q4y59p_$w{Fn41%EdB zd={G1;WJm7^l%mQbup7s(kI%9kA97C&f`+#?toe|fPJnLZzA_w@$syuXWi_veSxo$ zJ~JExTpyZF@=5OdsKx7OfpV*=iRwBwhtGq;i5cKG5U!>de7vSLCSHf;T-C}PJ`~Pc zo{%Q|yTCJ%`=a!T@#2%a9GVM&H_&=B2k%v{#fSY9^`LJdoE}CXw~BD$4f({=b50L^ z(c5w7M6G9U<;K%}2G<7v8gLuo_&+S1xCENv!mexG&+zOF%|PHm!ilqm<6l!adtf1a zW0v3b&uRD-sJjq&lJx1bCi=M&nvF1%k>WF- zkHsgtAa`bgUArFmU3-=Kc?^BtFHJnZm%sBo!{>w(_ezts)Io3G!=HQjZg}1)oa^od zLEEa{=%qcrF&7 zSv>>I@z87qP4=++94S6C>?M6-J@99VkAF?zqoqmQE}Z_W^)7in3(dda{|@}G6QB8< zES!FNqSgxJ-V1&U)Ex@Xeb7TY;rL$+%|hYuO@Qx04`WfQJNVJkXC`L|C+0wNAUtQG zhwXqj1O86Ai7%C#Ih-g>qPB46+*UZ6ot2xl+ybAK=x1|%Jt~^E&FC5S3gtPWbQFk)<3&qF(df~*@(qvX! z2}jdW>q;yTpLiacO420vbj3@uH;!gDT7W4-eJ-EL;`jm2C5FekT zf&T!$Q8?>*L%G3^qKBtdD{Hw-`rrr9zrSvoT;CIdy@#V;4vnw1#4F%06;4!!<_+*q zgFhPlWcX|-oVuS$pMJdd;6~8b$J#d$PHt0ZjuW34BOlM!y7t1}V}5V=75=j@2cL_C z*AoBf;)Ab1t!L3gZ}EvofF}s&{b(+7%aA(=c(e0Lwe|+CD@}YlfWJ_lUZdCcm~i@> zD1BzQ4*qw5Zz-Q>rXaTpG^YWNgU=A*?AwmOd!VU~T6dB}ZK zIGUco`zbeZ4%TvraPB8p2xlg~UV{G-AJ3f%?3}}p`=0a;_j(z8IwAMC0^4_AApLhbA?%>C$R(h)oO&8Ry zgr3X6FP1)Y-b*-jUlUHBt))*4fxqXUx;wzX4fF?~)_CFgw<~h}@l~m-~gQg|$GU2StGf6xm9RD`J6NTgdm2lSE5bJ#ccq{xL*|Avf z{>n{s(0b#!2|Rm>cMq=dq4@Ok9W-|UdyUaN0lW(R^aI{e{^@@L^q-^8tHozOe+B&* z;Hkoyq4!DF(noyyxd8h6q)FX>fU9U$;eUo_NBH~zpI^XF2Hq4tGqK*`;?qwH)lJWb z6rTRLI(+sjc=xm|_`&FT4R~J*@xKH7G~vwfN#U%qKJ>ebPd}^wkN^Mlg~nb}u&>67 z&&*F2P7m8cQy>022*>kqX%aOtpY;oD-KWCQx4N+8{~~HFg#T#ivljmz?_mE<>|p0s zledo*@L37GjdD|Wd-PLPeBv-@xF?^JKJgOjzAFEmi`D3@>qVtn!{F)jm7aerdhmR& zKyD}S^TcQV_d>HAJ@f$nL>l+w^XK1Zp5A&Qcf4>SzYEaJ^@MXg3fxn;siHl2o zO=&XQ_q6utJHh8y^_hKjop9n;X)=>`&^M8PJhy@8YUFl>{uXHxe+j476Y$>=*uVcj z;olpdT9vV`k?@}&98ClC(_T0;uPdCjd=33X=$i;9sua1-zhCRh+};6ym2f=omuECj zh!5ThYx%bDaj&bSNzY#bx5I3o#Cp4-)=**h<=QWUUk=!Z#tLM<$W$-D3o@@LYnvu%QTKsn z@4rElHQpqgwLc@D^!d4PG&>4c*CKuVD1FWg|Mo=P!pHds0q?Ke=&uwXpEJcL=3H9R zTqT^?Px`EPFY)Q;PvNZVH~9pA3w(ug!#@MuS~xzGa`(me^7(I*rPj{!iQa#&E!Y05g~t6|3(ev1xm}v%^6%e0CcVQo zZh)p=;bYIo#V5KzGeDZmA0tw;&TEg)>|KJ=5s@cRY9(_tr5=LIwE%{@J(26UHvW8%=TI3WfHg%ehq%pPpBt zhmDjQ{Z#Pf(x=w3(j>RK_|&pb*62NxICWsj^XVejITMwe{cwtKqPaBjSt^{m^M&)? zbe#N?I{^C1!s-73;OB%BkAU~zbdEp&F8LkmCq4M@wkMuI?l5TX5{}QffhD{^eYzjN zb{I6?C(-|e9$p6TzoQ+E|IT&Rb)j(Pzlm}ker+W5HHFiEi-G^ud*%-cCtg)<&fS6V zcdgVtMEdx6KH<+6AG|wiEric8(7y)$3(W9*`D8xr;PW-~`xYAO_5l7{KAFRj;?rkC z;Y2gxXl{o8IOV4Q!=(wnPnztpy5iH@I`ngxc-OM;_rl42yWstr_e^}&iBAuc;Pa$# zV*cQg&*kFd>HdQ+5_Ug6Ita(}IPlL6D)Cc=lY5mk!HvP!6rZ_W3(uv{&x2-T@EwX; zz7BU3uB3l`j2F(n>Mwox{e{!Rm6*eH>CL;3zp(al@y_*Y-wZ7ITmk-H;^X-taBpcc zpSFeGUSou#?*hD$aC*KH_%7i@U+9k!j(@GeCC@s@-AQ~UCHq()K6CCku*A<64u2wY zJ3;>f^p^-Hc9y1+KJd{-IQ_H+Z+-5Q&x_C6cN8ByO?=`FXug2YJn(anJ3xHqcA0Q` zcvqU>zQUDMz=!9Vy5HzrJJ-7P#V3x}+^n(wZ1M5=q2T?RuRFi)I87R3AHF~MbsyVH zpS7=dP042$@zFOFAN?uvNv(s0qd8Oh#J`23?*`4pfl=u18i-HylRiE}k-HFe{|3Kp zp)Z%g*TU(4=YqG_0m6x;=wX#`=Gg)I&w$$sd%szCY=Qmped;HDjukfN-(NUA{2`yraE|!+R|Wqu^y`GV2jw51@u;eE7a$KObF&mU?bhXw26T zPM?#66AOgXb7kdP>*G=3)b-EdW)Ag+l=Lr)kKTWmDn9-j2fy%2nB z;L*Ul0H1$GY5wnsPjB~%PmC+DU;A1(n&HxCZifN?3eV~ATt^Q+lTsS?vCwf8g1!&5&lsuI6ZmP=-A_2Ve7}1adapO}5ON;@ zUW|S^qX*x^vxhH*=QZ$T&%Vafv#*^*4b0&N%;zF`W)26TpK8htKOa7o!CRkNz6YjH z&X&)gn;_TziCxrNqPO^XdR@WCp#Rar>1`lklPTLd-!DJ9)dae^M&~H+3Ya* z`&lR&?~PzS`|+Ot88maSmf`U9edB*V!r51c0oTIXJ;Th$_p#{xc}K$csCafQYWZXC z?XAQoR-)Ez$Xx`_cX5q#Pu>O14Z`W|9{B7joId?bp747_;%#XB43KyM{vV5vzdxtT z8oAzX$lV{BvFQIg_}p3e+jo70yM@H1_AKer@y6wbOnD*XNN7T|p!j)r^YRjhp$H0yvb zMy+AsUqtSQz*nL!`4^qX#6=#JP(G3&(*#!Mepmv*z0){=dljvHXD5Qu=S5AH*=U=VAuXqIA0gt zRz9iqoA}JRIrw~?#JTq&*ZV4K$$qofQyofmFT*_DbNcZ$8{Dbr%^&+*Bvyz|JSjfC z-7Y?L{rOaU_%))sIKOAZ$LBXb{=7S%n|!aeWDcV-&#Q~xT(73|se2DJ8>v>p_k{H0 z>nq`B#qe)Ia~d>$j*UN`8T>V?XMNR8EPy}nMf6_M-{$~~%>z+YB$4Zmlwl6f!X(^msKj#};=l;Xz^DOiJ8h(6s6;50&oSFN6p4=|z z{{-anYXu)bKewoBuZQ6|2en4R=R@Tt-h@vh@Ht2BX#@DY1pgg`({uKl*LgTZ+BPjaX@6W4(M8u!c}fb+S4bB>c|`t-TBr$6?6 zHMNdHKL;%s2!5^j#L>d(zcn;|??~<_XhuonaL!`!*;mJ5pWFsLpBb))Kd-VvXk^Ldj$_Ir2uQ{nl%uyg&|V)S+}YVrN?Iq=@wsoNE~{`yIJ z_UDqp{@PdKMELmr79T$UUkjhXz@BaN>%(V1`1t=mvR?0>^uYH@eqMj2G||sO&;Gho z;!@xx(6278LF@dSncn;y6;FP>=niQTo>jtoDSbYM^Lwz?68=N<<~bxr3a4%j@I#?L zAO3#dPaF)*M!^2RiS+OLMtay3du$u<8y0%^u@1Ss*1iJ&6l(d|ApP$pK6PKm+AE1q z4A*r{616i_hD`#b=F2V^2N{ zp3gttKZ*Xr@#J&nUpN=LLBr2I2f%+Tc>1|3(GtAB4xd_2L-Qwm{Qt#?PsB$*54@jq zvR>X3Di?ac#`l7s(LeXIpMT=>0@k|#wcbPSGSsaC{$IeAwZ`lvzQ6c6Em05H_tmWN z65;gY_l5A@Gr_L{``(-AFPyr(pT7@J-p8y-t&@TMe^{xN_fXf^5^J9h&4c3eOfmsJ z*PLn>d8a)4x)nBhppT4IBe~&)v z2`Aow#(UVa^-Q`$-xsy|2xtEOfAHX{z+;6o=gm8pG|!;7O3=5GXZpNfIJthFOf-k* z`S59i+;fF9!>RD`|Fb9FfTw#%+zg*%;s3b!tkHWTcsTS!Fi&5UX0EAbE2&Ago5{Le#Qvz zuVW|I?_c2$5l(ooX6@IZ*8albxhFZp$KYQLK9`G6uIG^W6Z)rt`=Qn}@rfDmxe-2m z=J7L3*5%Ll6aIWQYtPpKtn+@0-p^_2v#R*$H^jbr7aD$zrM@(Y?UDOC@L9lqPf2*a zsdWG}dkUu?KUXJ)ice&pcn$m8mGyRm|2yIn<`YZd!~2!L&nMw~Q9Ng< zR(j_9=GEw7m~hs6l6-RQyKZ=Xo%v*& z-d~@I|Eb{5l0N)z@Lblp)W6S5Vj^%C;nd>$g+JGb=Wt-Z4`wEp0>2BNmeMCK2ERM_ zmB@V+_z&R(?`eKcNT2@NNboA)oq@dv^0k-0#HZ)Iuoiw@*PdCgzrP~>?S+%O3Ht8> z{siE*s8zFbDR;Fr@%Q)L1rI55{juLuQp@K(J@EUx&Xhh;7d>-bz82#DlW_KP1L64R z>#NqiRP^B24(nX1+f;md;Cd_XFU8$n|xU_4@nn5@*AwFEqTj`1(zZ>0FxORp8rTjkn4(bN&#X{#+pcFW~vF zCsQA{L*ERZEmSM(+EILP8}#r9G#3ab>H!Zz5B^$E=CB8P?yVl;@6V@#ea%MS4L$gI zDRCM6cUIlxHWyCrkh;ly?7C)e`c&}xe5!ShqO7bx^cM(cp1v0)II9~~D|0wln&>+UXI*=CNv6KHO?+Z8a_52XgC2gA zCO&U#R_Xt8=~Ij6@fy_%|1tXaJvng^a5?n8-gB+_zLEG!IG%og4EBAgl0-fRh) zef$3ZukZ~Dz1Q+6YW;&AwujGah2Ay%oS%48`pl?^pM}3`_<1IJf8L$mHtbU3pA;Vrzy2^qn&^2y*#^AtKgspJ4Xy_K73#JU&K!Kb zCx%F$TD&K`FMaqr(&v0Ng8nyY5?zF&KUz4kT6@5~Isd56r9S@_pZkoT599x_H1YBM zE&L9`iM@ogUe7a{iNeY4DNXQ!!U=va^k(9t`Bpf=>+vM<(Re0_YcYpc(El&OiLJW? z>Fea3OFp&1?*aTFH2aIs8qbhtW_SlQmC?i2;1BFt%H3Ujd@6}g+}k;*tn5bNO8U^p zY~jRL>LL6p@#&$qaKd{anggVF_~W|5srzGRv;U3w{O2`kto7lq!zVcZFFKbryFuSd zYsqs*^`)Ydl5xKWP-x2zgp}AUoX8W>gC3Y5{y4|5)EWVONKCT8o8TdiiPEzJCdSJhbFf%B(;Y6R4O##RMuQP%(ju z2~Xem_Wq@Dke}dfr<%KOrT-{6%(kKK*aXe zm_Wq@Dke}dfr<%KOrT-{6%(kK!2jP97^|Nh&d(IT-MREL!aJT`!ax42gqs52d_t-F zmTgP85AY4gmvUcgQ_}1uKCy{#diVyK`r`9**$2VrZfU~5e_Y9bj`;kn^g`giz{`MF zDK{}rd}5lg{q6OBf!*I^wm*Be#r~k#6 z$-dY#UQ5>11o{TxXM&%FbuAO0m=DdT(42?!RSo)y(2oN@8o6VXoBsEL&pK(+^HAi@ z2EH8rH-c{tyiPbXUkm;w%;)R^`}elFhr|ier?(e`)6Yz4!v6$*F8r5({|)$JXr{nt z67Y24)T$($=nGsI_zUPy0`7wQ$+OT8Dl}fhrr>#R=>(s_z@N!8y5|Iwrt?;*dS?)E1}QC9Y(_{8nN_2KV5lXZ=S&$-Yn zK@X#Zvz8U`90JY3(6oYQ8)%w9^Dy{#z`u^%<>0Fdr{~|H`2uV241FiyhQMb6{|0=f zJhR4g;dvr7TM4I!ZG>|T?gRaM(CjIkm?#|o3BUt@{{}u!IMD?D2Z8r~P7j}h_Zkz8 zl$*Nq#Has`&~$_5E$}~ykN!#U3*qB+CB~tjp78W~u^pJ1L5?vMJC^ zFZ!`=U*W9%MASMM_yy$poW_4R_zO_$ENK$2p`WXf`!w)Q%C)CsOY!Na4m?|<)-lMP z4*$Q!=Xc#aC!FxU%G{2D=eFPl;_!Sg(hQ*PG#BIfD68ooLD zoPr+C2mh^b^w$Ze|7Pg(4d^?IkNy+zKfr$qH0J`JDScuN@Jis9fDb|s7s98HaQ46v z;O_(9LO3xUn(ojvP_6hpul^G+i_aWxf_{+rtbHB&xn9FLsJl*l!anhA4WAF-zqZggr?UJL0}FrW-vZB{ko!CMhoFB1 z_$S~&z`qsP_4)~C{&xY-#Cm@QKTdqkOC#arHjyT=25WCGK697>{15Q{Czm{{{GYnX zeFba(7`1LfKV5|r2f_0_=)LyDF2Y&M>Bv1CnyTP$7EV8X!S@!<`wOo@?wOaNKN$W4 z;Q1rwHWR(=iQJ~ZZID|Xe1Gu2fiDB!0{k@K*M&2abAhi1?ycT32k)`O6wN&Gob=Jy zCovDXXF<~sc&TuH_h4<|^wS5Ldw_Qb-atL1?iJwY3CE`vG+T(zxw{kmHOTEHoVZt- z_;~(_L&PVVBXzYKVWaMr%La6D%LKMwt^z}>O-CBVJW{{-pd{|9o<6;5wg38(Hf_;`ki z$?)6+xx=7;4E}47`vdge+llWAjr%win##a?qHa&{V}$d2ZpVTjE}Zo?DtNE$YT?AO z(Dw$vHSj!W_CpW6_qG(Dx!ovz@Q1($2&bQR(C-cWx8{&s@8{_6S8n1l@d=;P#IC?K zw4ZZM9|C`va>FkIe>3>c#HR;e*TENqUyR%%q)DGE#m9elc-{tlmvExI=+ht15}#UL zV|>n%#{PcI=Q{ib(9eMWCuug2c1H=fRc_)zMn)m%wjF> zZyopn$lV|Qol z@LpH?zYzS9>L>oS(fcE%tm*;c5Lr@R9z@5}&nf zDV#OlB%Imq1zZdBoQZyhh>y=h(BFrCT8NKkop@shYpsNS5PY@({t!L~3MaY%*FtY= z#AjW;{{)`_{foj`FZb%T;Lj5;f2jTfL@IB~xF7W>7e|PAg zDX`DYyV!>dp?Om{=WZT&_Ut*kFGt-1`{RevLs$4L5%wA#a|`T`t0H$_{Ga$J@rjYZ zJ{Re&HuxLBw};Oe!qM*o%}>JV|3USf_xf(|oB;jV;P;k3=j(f{_eba(Lw|;_Yx!u5 zer^#TpBmy5pUX4)0r2s?(Y)8gx%s+|{vYU%hR<)nTd7vo+XejX%FV1cDzJUm!T){W zedLq6K3~BLfZr2NYy#XF>m{CAXzbNRIP>uw(%Y8ssV|>s1`9{?2iEnx^yzI=^n3_> zyl0YI4$lveyBYLtfwwR4{_5G+etce655elmfNLI z3>VH?-iFW5SW6}FN5j*7CWb)co->DK=(!(oFKKeUxNhQTX|LPBzgA$+%lE*EpM&yOf_ z-IK5PXcmCK8g*Mi(;u3@aZYaqUM!90X5U?q>-S&tj-}w+7rbA49Q;AR_X#I>ALDyR z^wxQA=iJSPKi{XS!hezUi7m1A1Ek6IcsXXnf4@)V|0#Y1-%k1j*L4~+4WRM$nDyRS@LuDw&{r3q z`R|3?ZH3ckTWAgj?xcHrVmIi0EhM)mYRv`zsc@nmG~~O=GyR_hO>^-HpZE0t9(doo z!e5WxYNF?(pubLhYRv%upnS5HRlwep39fN8a`{}e6ZGuO_oDR4{qH@QxDlFz;P06y z_JO7Y_(9;u!_)ge>$(7%Uxa-P`Pc&bF~HU2?^!vPAh(M6z~xw&v=d!KyL+b!^aqR6$s?@^h_-RwuT;=}hlzPEOjPyD|H zzDzwNc#Zs9{*Cm4>m83;-=K#{@cBkP#6RcDxg(H!jc_#YVO?*)bF8q};=RbvM@~kc zzQ*nC7%rUfJtT9mPiECoICXnt{*|G*5t<(AExF6F#?ztq+@kUQKjG(r)Y@43#NWW) zZ;5Sy4-}5)8Nyl1vxUaKH-n!8{d$;>?-jZ4^@64j@J7Hd10O4#+-|~&{R@pho*^GoEu4ox5QP)|5LPm?C+s2BR_2mGlt(f=i!TJ9(D zNU>heZENj+d)Cs?7PVGD-xPc!;hdLKP}loBb-RG?rdsKNd*d)@b{5XM_`Ko!PiplR zj;4-!PWZhk@o1rO&QZvngj#K&&waysJ~Lk`eb%xJy?w5=q=$Rp^KY#23-BKU&lb*F znxUWF;C~kM4?^$rp4>Xp2VYy9N3Z`XY0}#n(xm^>;eQ%@E>mtaS3`5B`1qe8eZtSi zi6O$y^?BVF=fe9fxd)=p!SLt%9p4B2{+QeyrB9p#em&vpdck#vOOyVeMlIe0FNe=x z&>RoGul^2r>iU@{F%NZXBliUHne+XH#yNFxF8ujOJbk|k_Sd7F>yO_QpO^~l=lS>_ zRn+yzccZsenE62T)>t^Xenv`k1^*LxzxO42z~9fGxn`FLXU=1!37!hvP&jM6M>swB zy)wLK8{R&_d7gJ4ypMU`CU=Q&>fVoBKA-7FNbsT{BP|2 z;Lq`WUb(l&qKEb2^BDGU88mZ*Q};{svkl`}-P6OfLFyAO3om!}vkW@Hcq=41Oov>mCzMynw$w{YvN3xx1%( zX}y1*UBaK7U&6m#QPOw9{|o!)n=-4W$CPlbR;gN6_IC3U-%2>K;;104t62%(cw`B8 z0DqWpY8?)~s&LLP`F}Mn`J4efr0{W0UGd3%3!Ym8zlz*FguU0C(+T`_!j;7N*aiIO zM~En5anqo(vZuvI-yQf|X~K7GR?;sOpFY2W<_6#v&{P&qYz=?vC!n_}(x+}E;lwGz z;pf8VQtJ=Erb(aqV6&1`6_582q(9bG{JqL`31NE@ErMP zwzrE9J`I`$1-5T{`1AaJC7;ygIUNIiD|j9u9Q{J@J4&A@ZyHoq_Ly+=?-Uw;{37Ze z0!Mvc%`sw`ZyE(r-i4VM}5AcX$Jo*pnpd=nlb3- zW$*)`Uk2P8ns8{y>oz8BAN;CbCOg3qtO<P=)kG;lt{wAE5)U?F!C7c)!>~oZO3jEIC4-t<4VBxIgeCdPh z3rBN}u=kn|uB)|j6MoN)o_pY8@Ehv9Cw2nAwrN;>%@EkvV8Zw3_@4`Yp!kGqC9VTL zQgxGiD)>Wz-CNeU4f=dfn&ci0eK~MfXuMaWuLd9AZ^QH6=xZUd7d-ilcMWoHm8M(? zKK>D|R3slzV1L{|p8nUzW$^bsB)Qxt8b#8u!2H7)t@If2g=+)EAN^QCgjW$I&@JQIBW z`Jw33ul>8gm4t6@TFU)iII%nYn*jd=jrW*6eEbc~RN!N<#=n#sJp%Rx>Aex|4GQ*Q#f^buN$V^@O);d zi(FqXi7MdV2mc0mJ_ma3@vi}Vy7c8T^|3#E1^`bHj>gX?m8A7?7VwqOKOh_p=iuu) z(O5X1^?|F(GjT2Sp9xpe3qJNk-M^sWd*43LybaC4@Gk?d1bi~^naF(u_$A=+&|d?- zqxeci&z@m$C+Lp=wtqBDk-HrI8J<`#Zf`>D0tr=Ik!2` zb3Pj)_axy%l;>VALeK9Y_cZYDq948=ttY)bd`yvNx&HOx>nr>af<8usr4lM=M}tbpM=~?rActl_mq?&ED~{I8?4aQsgMcK?aJfvd?U`j^4qfZQsWzjLGCL3}XZi{FIj2TfD8tc>T~ z_u+)E-^2s(Z;877#Ct!M>)?H+miWXcsO$4vNiX=|HRaDe6aJdym&FGU30v#K``>kZ zd?B1zA9#sy^nU*eUI)zx@B^S9BR(++`bprQNA7LVxX;A>@Z1l3=~VIM68ZQYo+`QBFtde1FU5Bh7N;Wc$LdYcB# zZ1_9_pJCAWy&!$oEU?$M0{VvVZw39q&C{j6#|E`thyG0HxvzX5NDPJk1mM=t@VYn- znh%82Ki`9zi7!_HA6G#CJv{FL{~-9M!1oXz|GC2D^7F@aps5edcftwJFu8d?@oQHr zH~bsWZvjv5;lvE^x4?5Tc;2rjf$xKJbTo2Lga2R9{{o&qOTl-6ekB{g-PHKF$R{2|gW#6Q4;F{Q=PL0v~^llQ>kG1nR zJ_r9>;ZqgZdnR!*_1U)w9jtM4 z;BnBGf!`neG4L4$+!r|aRo8Y8S>xJ5V}2cGc$E0`*;I8Ccf*r2{0IC!$bAufPx!0` ze+Aan41DbtsjB~b=SySWbNmDSbP{jQ zuT9oGjjQO`37#hbKaAWt@aOyTAn=Xg?{k{ow#TeCmL_})XlfO??x~IV#8tq1BKNK$ z*Sf96CvFE`gxre?y=ylI|0Hl<`1?MYco+QHSc{(-vKHSf5>=%4I(+cHT@^lO!M`Q& zJ@9-Jo{OMqtR7PLHRvybW<%h^fX55FugW^+f%o}MY=kvl3xA)x#J_;A0^SOECVcJ@ zpP3v44WAR*gMR_|BlX~Zy=I^HM15&8hX$%;jcY7MZhWls{VK6kIJv&|(;M%@K9A9C zgSGfvyOv*j54A3bhS&Hl&|FgBjg|Xn(T{!nK9U}MohIfAr-v@U7Xt5qx}I~w=RLVc z1Mdudb6~zFzEbpNudSqskM~Tludm>#;C&q>CV>A7_zhvt(8q=H&)QEw?lb6ZAb3BU zB^Cld3jGP_`6X%6=L^uh3)~dgv-SVyyC+_EGg0d!_#X@WG<-xr#yYW5TGwOf|f`<660r{2Sv!vWBA1ilA8}P4&F4CC8#IlvM()D~M@L;&wo~Eb^KqPT&dblm8a<1J z@GKWL=NKh@;xuR;Mn4-uv$Du_{+-g)Dw2;v?g(J-jhu@U(c4|Z;pu-X>V6HMa;$d? z^z#bvaj3=h{w6*%@%=4vZo&H;%mqImJq&=q`%g@gKK&mdK6nOvnuA|}+yjB1DSX_Y z^@*3^e*!#fNRzcp1VofH=)IPj(&W5s2K+SY{!{d9-FVdM1N~RP z%dp0qrO#T{Z=KbamGy_u-N0ANC$R{8ck%Y|{^(F>+|M7<_+P(vQlT;4tl<6H-{^;R zy-yPRqwXWfJxIJgeDs0d=PU6u@S*UT0iPk5=hx6rf&LWedH=ry`j)`EA-5O!`RI8M z;4#qu4*f3ByaV3*Eo(mmxl@5p2JSDM_Zr`O6J3Pkv#T`O55tRGzcv?|naJh!do60U z5RPZ|v+G>|jcX1N`~o<9`SE0m7O8ZqO_e&br=#eo3MCYdZ)>^CC1mqlY)3S&JDy3w=Z3^!6(F z6M=t)=3>lhckm|{{kx}0=-~?BW`)M}R>OZKG#3G%Cr#$_JMna`EboCE*Mq3?@Y zdqBTA=J`aScYmHw`uq)^zXHDq&zaJvpGCm4;L}lhKQB3MgQgzvh0?@lGxT;CG#%hM zPMQSg)&%@B&@UFBYoQzX)zF^>p7)u*u=X3IPoJZpe^)sCj?!d?XTX0ZF>)UgPTT_@ zuPZ)J3a9_4pg+6l$N2-m-w6CV`kx{`p4Ig?J%jHDe_G+`*RCk=f7T`({lA10+yjTh z^AGf}1bA!YPC(raz+VFW@4#)KX^&c$icfC?fPYhN=2l&N&QT9&Mge~#oVX19-{|2! zVb^jj5RT_w>L*bNxn0Fa^D8tBpy9r~89h7${bS%C5}$Q>U%4OGm;uc^VDFR6rz7|o z@aMJQwWQ})gp=C@diM4~o2*e+76%yAogJlv4i>bSl+)_pA~=T>8Xm=wT_I z;in%JMOoRLW~JPDO-r@>bCFrgvrS6;m%@qH8wcs{ctGyFYXa=CxZ0N^fZkIsc3V1`{ zPmy~P_?6&$7Cm?tPeRiMcoOu!r)6$0K{FGYv%q^_WmehxbAM05m;tZJsYaYab1Ksc_;K z%xX0>oq)ZcQ}-0)-T>_DF}13Ie+<0OZ#10Mnc}m?F<4hS=x+udf}VX3Pi`Y%jO!zkz*qG#@_ zwy4_z`gP*d^DW{tlg*&;A6Fq@{ z7S1_Z3(pha(;0gH-iZ#-FTq~&xk&K+!uQgwm)Dfvce1W~p?Ov~y>$TJO|`;bgR^Kj7P7|9>V;Vju8tOP}B~Jg<@3&~F2L8TwgIeEQ)%?P6%Ap_cbX z*76%PcSEx&YJCRH)52LV??sKF-xYX1Jl_+ax-+2Z4h=uAX$ih7@L1qofp3HV>*7<( z&jZ1pRiXtj?|ZyI_4vpEGX`pOfLA=QP*$Jvq@2 zKAVHz5x5-Z{Uq=Mky|D{>*XG6Dow)o-b8=oJ`UdZx9pSm!M}rR;U(}_pr6ygcLer( zL3%3(u8Q1p;8m#gC48!3js6@hu|N3U(&wBWk6QJh_vic3SfAd831{u2;8{z2Vhi!f z{Y8B6mGJkoP56u8RGd_;bJAgnqmS5`N#e-nF-C8dl%y zA)mzAMO}YfAGxdGSs8V`Zxi=}w>~i*=aIh~&HE&C-UvOkg3mbN%&I;#K1bnsjh_R} zQfNAX9{|ri(C5v-pBC6P-bU_sg{Rl{IrQEqITxRR_xn`hx+2$}|JF>>e;G8c8=oTz zz4OmS57VKqiM4oE3Eqo%@AbJ(T|UomSMbjFb7?gG95dnhq_@SuzBZ$84SWr75BX>B zy@TBO(0E_P=Tz|tK6~5;{zT~$$AW)V*!#-$_JfA+JG&SCShE(no=JM}b)DdSgZI5R zp!rrfxjzD51l$$=KcENSW0Sj5IAMLl@7>Yd2z)E_(}34O^AhT^|25D*3~WBNK0*&q zf#5E?7ll*zD&Tv8{d=XN`3iOU`wag8{|vC70TRBS z#AiA18PNC|iRM&bYqIty!T*K#HNOA)-k$I^p12vgtI@-|z}=v))U?zOp9#62H$bgD zfcd;+ed27?x(52b=xq@AVZh!SnUBv!X5#0T;QxoRH-YxK{NBF}iOeZUX(Ey#l8^?+ zJd;`GipWrrp-4hRQ8Hvol+072REErC$k3#u389d=qImZ8{NLB_yuRP{`>*vpd#zU2 z*{*%v`=0iFzu)Ja&v_f10>E9-ZdUlu!{06ZwvNDg0$aa4@ae$LX94(}_ZPwWD%!Hm zN4q>X?}CobZtEY0j_wAwLMcY^Ghp!70e>6(H-o<#e(g2i0ZO3VkDxO-{I-Ij@oNYhmP04gW&M2(fz^uh@U-J8*K?&hi7qh_}4-Ifh1Nj^Wg6V zJU-#54;PSgri3GZb8z_nglmsy@e{#!o;M^qA(KY?)K(DqSzvxfXwww4)1;{hd>gRp zp2xpL_}#AVX12<}I@io!1pGk6+TR44dBSh|82p3Kd>Ob5_+P-Uv)KB2&a!m`em(SU zeD2dc+U9`s7&LDIhwnWmrZ_VG=3o-5JiZUU$LeorYF?Zt??298YSY306YcW(cTI4t zqxEUyvoN18RP)Ur3O+SI1c&3(27b=OX+8&MKl)fL zIF98#pLdU0&>0T>U(lCQ&@T$U*0%MzzrIHfs&BUZDXIKv@HY;>O`mOR&5H1A?a8lo zthqL4FLYJ{_XW-rI$rRv{|LmgmUe+(d)#^641IkTx9wi=4}m{9u-m03pAjlUa}@BVz;0J(jq!`% zlm_Q9`1O4&x0?(8rqJPC?yB(Hm|Je})1{aZKZ6SVAA1Bk?ZCM#u=BqX{%4@i`pNZh zHDWo2>(SOQVAfv0S5({LIEO*tw}8J2+WHH5s$O|K+aZ?EP2WK$Ct{z5KL`A|E2jA$ znPD&l=_*3v3&blA1r)>eb*c59~g2zt@3|YM@Ph zF<ue9d+tvFA8}HliBX&e^99tl;Z7kZV75W}q ze@?YxH0HKNz|R1e1b#iR+d79l4#IfPGX$)=k zf!_z#`DmT}&_5O&`zwN<9h~RkPXoU0*p3y)SYu+`2>1Z7axiCa_-#W2+poKg@teTu z1AAUBAWzkQ`*|)u8h%^$z}BoD*v9q48m@bz`T4+a4V(u#d>VVlb{#lp!C3)%*+W83`T*jQWcfPW|WcfzmQ?lCW0(JJw~ z#^7ijy4@dv$AQx&uywSajeQ?W6Ltyt*Gk%w?l<6b+`5L}?Q-6$g8wc0^;Gz6gMp8O zQ!o71<+ut^@V~4@t13Eb>rt)?7vz-Rs0DNttBi&WucU#@VZ>tS|W%zY2 zoBvw)jkiMoX7DG1&zjsAv01?X20AOi`52h@bIzUa4>s*VTmA5R3{}IOv+9rS4Dy@; zzux~l_6KnEe!x28!*AnxtXKwIqe6~6gvDPme9P@P!+V%p^4vzV%b;frEwjBcI z7}kPcYsR)H^xf{m!7*Ne+^EUDvm3dkPc#+39y&(@J5Q}!>+eCVYMT8m0^4*4upLe@ ziq9brY`*rL@iX8Q17{QbtS9szL|b|;vt~)?bPDXg)Pl5Z zRe|kq9oVM5X1lVYQT$yP=)awk8q4)u1swA0gpS){P0kcLwrYXh7uKl7;kWS)GbjAk z)ZN3T{ch9wYtwU_`8qpnKVy96BmW)2F@GEUQ^Rj-3j7f`mxted=>^XAz}8glwQ>EZ z?~YY&#tWeTWN>V`DyC|V2*36716K}gI}e-IgPaVXj1E257wMT4sMLyQ#7#0tX{go@GVy;it^VPw(>2Cqp+CpFF ztmk3}@br{a{d>Z1D;Iv7_OkQo7TCu7Fze5?(AfoC6`1b_Skv-`zT0XNd}Gap^B*19 zmLstIy2pGP*!BXj{vM5V#5)B|z600K2G~X-&v7aC#%Fp2c0RfX+KL9YUwh4XdiZS% zfpspJqdI2W0=zrH;%R-FulnY3&^c)97})-&1Dl_@q8ah?Kj;_l{Cxgh9#pFQ}tM^aMtCj;|u#QYR~ z>*os{=d(8aHucLkGQ}uO8vQLB^I7v-2giQ>O%q#T_;ts&v4-~!zw^;rvJUqP&;7p8 ze>q}p{JwAj_(uWX7y6e)fd1oi*}CAkUHv@^W8P!6-fYdlSIu$$y5~6dXW+|1Q#D5a z@o&KC`O&fZTN}o=!mmAR&F+D1|FLF5-<&oW!v}-!{yr2OV?AR!A3ZNSR%_BZxE=j} zEBvh@)_nb}l(GKqk2UpNVE=iH+jr1;J+O^)&A(qTBQ&jZd1bTX?+a8(#Tl!mV*O6N zZFqg7_&d4HQ$IJUNZtR_N9q0=vF>js;uJ*l`;f~EBx{6CdT zjlH>iYCb98+!ENfHTbq?;jae#COBWi{}^zuXv_KM2*2@F;Cum`8#o>C^1$ko=Cx>o z_4T~S!J1!&-}rj?+W=n+&Sd0Y2bv=T+h%}M4E`5@zY6Sjn*lckN8@bk8Q63EJNVh) zFN1bD&IO=T9P{`vbdDmnA^2&4+Xu%vzYTs1=sXeFd1gfHu7g3{8`cNtMJbOe^-o;jcr|t*uBW73jDQ!KZoWs@HYVN5ZH6adNm5M^#Xf6Yzgc$ z<$dTBM1A9$;h3n7xvkd_%k^9ibN6Dx*H}D^e9DDCQ}~qA`{B3dad7?wo`ZJT_o2w4 zF!)+0w!XkCg5z;u&1{C8S;Gq>wr#{Z&k^w71iUb?Iah-J4BEXPe6MHa#J)@lzU@J1 z>P*R)`~%x+2hD|uy%qknz}Yd^I*)AQ5vw}yzU&6hg;=iDec()hCimSb=${0>9Gbtv ze+6_hVvg=cTbfhbG4Kyy50*kKb9foCv%%R0{cXYVICO!35wL24Ioz`vPx~jLtrfwy zaST<5ZJVLVea#%WFGeM?YHugnJsjBQk=Bx}Gw|(b>m^{WN$!#D=nMDPO89F+za#La z;JE%21fO%46Z|p2p8)5;eCd4jIKKkTf5A@&zG|jz0{FY2Qwp4_fvtZLn6++Q_}#Az zXsa>!j|8@z0^W!m&I4ZwokD?~1MBT{_%Da%XJ}Vz#?~jWYashF34CF5Hp1_Et~@>h zXCU(Y3}dMKxpUSX%=Q;B*Bfi^FVHy${>;GE92{7A>g(?@ZhwRS1MnK;xfVJaAJ5$e za4HA(INSq&XXMru9PXFOX!ri$IA^xY^H(+5#+uv?{-2QZBKZ3P7mDX8+il395;(js zajmkZ-5Y%8d;&TT!Jh)G`-4qu#`YEFMeEAe5}0QS?{z1^c^SA{(w63C9{Q_$lyhdy zKY-Y#$g>gflfdtSuQ{@2e&C7V*MPq~{0GDD_2XJ0t*e7$&HcfV>1*vTTTAHN1>6x> z_09UT0$cMM==Xvq_X3|~G{26Org2HMrE}bSA zY5kc0C3H$7mU|&jaBQr@IxlRc!5JA?^C+7Oj_#AT8{sbmzwTYOjKI@@D**Qk?6Knf zvQ``gU%A_Tkb;5fI-;n(?Mzxr;R4SwHO^>5tEWfH#H{xGoDOs>E--N&q{y==_2HxK+Hz@G;; zUvj+O-{r z&MM&d!BGu&e>Vd!0H1dc?m_0MT58(_`~=$48nE#kd>-w#2IpbmOVHFk(5AMuPPG5e zLWg_gGw7rRz8kn`V6V69VqT1S7UT|&$4c*VZ5ki@xenKXKL>4XN9;AxmScT4*4OFa ze+oJ;L+5Mg)Bxu)=M1Y8%m32?>0wk62_E%?vF z{~P?o>BH}LBV7Oe!G8c)&*09JW6L%C3ixf1Lp8)sNH|&(4}#DA-Vm{$g7YnK=D^N} z>zR9@4){%x!zuV{VJ@D7zajj(+uN=UzwI>q+zW5R&-Gjr{(ga-|4#Tb0c$^+!+ALm z|5A)qDa7(_mLGoIC#}gl81DeX(Z?dd%g}CF=-dMRaq!neZrWeAKEU08djazf@Mh?^ zhVc19``3MWEn)AS;F~2Lp*B!(6c8#YsRVQs1kk)jtN0OG# zQ|q*Xj%tzptD!R&oaVq~fjn@%>!eJ@D&Hw@n2e1J1wDd=H!)q3OOP~3RQN%tB&H&&X zz$w6$fq527)B3}LW84~Tsn&V!(t=Vy6HfMn2jv9tWR&(ys=cLBaQ!G={%AG~a+`HDJB>wrvG}U|?(3 z0^SBZ5^afZ<6amZ`p*AvaQF^nHT+Kl^F2UTw6zqRFM)f5!?iILeViA3=kpC>RlDq0 z4Y#phJZr81=RfXF(BXaHB>1eiwIgS@t3DdDuC{@{0dyWfec zCvXZv{|;b2XBB|X>%hZ9$LmM;JzIO|?*V@W{IlWbotgFIa&WXJJ#O2f^9=CK$l-hV zwI&@q0{)+Ye+P%>BhTUjsGn~lx4#g3FZ{Z9d3+ARe;oY$$U*aKTaUgBfWHG`9|2~& z97FDfiqJfXe7MK=psioQ(S6cZ6gpLKjvR*nAYvE6&)6&A9}Pa&0gnLQkJu-H z-vg&S=I#gd<#X_}fd67}{*q~Ef}kz;B%}dBQ_H_#D75Z6>u5> zF9fF>H1+)JeyNrk^FE+)w!aZ_9tBOE_1;tC0^7O(7Xw}go$r!ZwZXld7My*Ey$Sfe z;5fI2;A{QZ)&g$^z6hKSv7f@<7k=Iirh>zJ&f@Uv{;r(Vmd7MBaE;Kk{{iSL*8bvw zZEph)0zU)%_rYHyeh$!9%%>OFn zsr#GlE8tboxeK^O607$90{;^5F7V5SUtIls&%H^k+EZKZBiGDCa84z$ir)x*J`3n< zvZcpbqUI6gQxkkXchmu=6F8jTo#A)R8bgn{)~)So#9jlx=E!zC@Il}?fu$+?IdrT) zJ=VYR)+7ggJs|kb=R9piPEC8j3HzcXU%2R2`|+E{-l!lrY_e$^S{?7**rpB|X&b13+Q z(U+;<^RC6axAVywNezdNYM||D`1Q=9Jk{rS!TAuF=TU$7ntZQ9qK-><>x71((eM$RRGwcpLjg4|Ao zzBRSxZ91E5mw|shbmqX%vrlJ}+u8)3^2nz={4?P{AAaXk37p!%eD*9Ad(C{^6Ws13 z+^HP#%R3&vcZkD)D%q3uiXbq{oGJ+!O)x&5k##y>(QJL-e}_Le#IfFD6D^JJaO z3mu*vpQ5b{z*hn{fqr4={07bhVAj3A;7^NKj>CFzl!N=oyK4$KeD>T2zy5}u&CeH_ z??1rV1pPF@cU!sOe+YA`Gs~uDQuFmU;EZ*D@VZhhb?w#oh$FiLe9e*VHpKGY{yX^m z`+A=t_8#|oJBx0TO zjzmYi+tKcafvw3q^MeUr{n!1({nZ|~@wt!tw`SyHdp+SR-gg-NTQ_Lxe79`@=G}NR z{4=AE?$-+VGXnPy?40u@`RMDD;EV=djdA1N)SbsVAAqBC!PW!#N%Z|8;4I)&1fBuS zKH+!2`T_G<>088(0q0t@rMYv?>%(uXHEI2n@Efx(t%Uw`#Lk4i?ijXzk^eFHzYFYk zH^R?*=0D)<1}=o$3ZPxq{|eCLICla65I7CvGYXs!|IUT}mZ+^e_!og&1;??i!7m5R zf5F$^g*5+V@V5uYeytN@eXgwM;xPD|@w>zN+Zp00rbtC+oF>h*%BlFJ>Z$ns+NrpA z!&H1e{BCP${Qj?V$eNPM$&7wwM!)!;RzFv1o!oc_!r#%Dik~Of@0Pl)Z1DF5eiy&1 zcmw>mA+|a20Q}z272w|kog3lr3jT-SR0d}=@b};pM(iB;9}T|yH5LBF&>4-`9c5C- zc`o?5pfd*kYT@_1FABfMd}D&8HWF>!h}bs+%aq^0;M@%?eOn{oa)I5iUlJYhdM1A1 zr{S*!{&(>I0lW|RX|%;0ego$q#;QyBoljkGnA;Tit)rN);MeaU+iJl-9$52hn-JLT zRz>W3aDI+F&GDEkei`^_z|Rf;DD?4JaC)I#&8bbluj;l=z<(_?x58fo{3`JC_q%h# zzZCi04*wMB4}<3Cz-=MIjsaH<>~RhM$!0zJ~ zaPCMr%BcZ3|6(rQ1BY#C+-yGqPXn$T*zI0}{;DS1Y6iz+@*`qdE5^d#6tR~BYj3J8 zX}tq}h2U6UKR<7*^TNLy&b7^P=I;?d0!{j7!k-WMoP(cxU!U_}oVzjp9m#qb7UifWCfH}4!;pb;f+#fo&r+~G`Z8~3^ zPiyG#_qBV2qqS#S4_r2|b?QTh`D>2Mxd={4==1~TSRlfh{N%)5%tL0ebke;0CC z4$g6KYKPzBxg7jwCj|KmG za83Xh1BcHJZQx%E{u{u$TiUc9yk=OpxgK6Y>?~mJ)4lL_2IjutGtr0O^aJLdllQUy z!SS5(47wNo3kg==mIrpf>Y={}!f#`LRcCC?6CJhp4q~T+^G5ic&j@hz%xg;z|Fh6s z49?BK`kWbS^0|iXY7Lu{AF-;*Uc+4Hzk^=_`P_=O#=)=WcN^#KRrqyB_1Inq|MbAh zO?ETc9Cqqm2gy$9E^KEBnds3!Os1$IzDU z*v{c7bTkgu+zh_!gK|9&|FcoYY?a_Y1iTeF)P?`4z|NsKboznM&k^FCTxW#ye!Y)^1n13!bD4+Ad(rziX`z_0tf`^dU_6*#KZ?u%-*G4JypfBjoQ zw8j3iR(FRE&-9M)^O-ag{H>txHKsY%ndsd3d(&4(tgRO~??H#pEcw7+15OS2GhmK} zg7X{jr^vYo{QH0>1D{Q>elFoN#Of??zj#MtZNGrKE^9T{Mla;AT5V0%pLFO~739V< zk!NdKXlgvIxgW8w0Y4IaueVF#H|8C99yB?&9iXFoi`)7YxHw{OgrDyR=0K-SVCTU4 zFdrN~!}1=O0d3_4zYFkS=yUIAO*;Raz5k<2Y70M~ zqvyb{bI^Q!rk2~)T-bPDy#^fK!)IaKcxEj?-%BHQBmCLX)@I-rg5!Md0ME>m&Hb06z}A0l0r) z>vxBL9YE{b;Z1Am*er9H-H&+ieN7qz7m z{JO6?f87slJ_q%+)~ENc#>)Kn!RJ0wJ+##X*4lRLYT%a8=?T8-v)ko6T@m7)20_|4w{j_$qoa}EE3Sl07d(0K`X z1o(@A>!B^yjjs^gHeqvSgQN3Nn))~8Y0hPc)j4Q84Ez;zv_~APJFty+W3J)X5zG3iePNwr zz@&sMgfft9mNbL#xdg2QJ$z9X6rj%u|{=e~{W{0sQ?y#u#(H^z;hoAE^W z-51`?R-!F_4($){rvvVfwp62R=g=HDGrupO=UH2G#Olsqo$KM(vz7gPhAIJ_9cWjd(`(~C8-)IMp>Y;OZ zEwKBNGq7zMu=axZvOI}j^Qtr2c3Z*`k9Q1y-;;Zdb^AWF#j|xMG#>^>ejDq_QgFCF zReNpk0AGX-&j{6jkB`RIru}Q<8a@F3AmH?Yt+OoJ(m2b`f%7;xHQ+A?{1|XX;09R3 zoza&&g5!3%eyGE~cLl#Q^v4AD8sj^8jjhekWooY?{BI+lwD9YB)-~Y-?kAPO8HZS% zeZD*83Xa;5>F(;!w(=T~zcqALMXbkxYi2F<^Me06@P)u`t04Hhq4^weZE*S!Lq}`C zwgi124gU?u;V0m~!KncMx4;d6dHxoRb>eYQUA5%~egc^F$Im{B@mvdQ9Bf`=YQwcc zxO8yb?t9SJ`wAQ1lPe$dS%+J|&u957lN_>#*hA3d^RJ$pY|W65>YnWsIMac7R#w3n z<_-?`h1avzzw`eM`n>ZifAdd(qvvtQW(e$>Toe9R;2$5@#%H}-!RPmkc+P%>*beA# z8~AI&ePV=Nn+2-8`F~LR);+=pBCdeLXm=hwno_3$V@|kKvVw{Sw%< zLOj(y+nA&;^6N8=Z5lTl-)UrmpL^{f#*KG|&*9IGSn-{6lkgjB4cHbUwh8z;Lv1&K zuNrP0e!nIS{P%+Y2{iRy)UiFG&%SVM`JR?_m1|}++T~uDjU2@HytDq_fE?JD>%d=v zoCkrgbI``K?>PLdb^pNsMqrP_DEPTaYDzV7=9czgEP091cSNDroZOBoBi#1X$0`Hr~&tLuWrYw;-QSu}5A7 zXLVrb_BQ;wf4X1k5z8^3kZ_dK<7kWfWd%5oK)(fWA>ap~lajG49Q$puYrsttA_u<9>pl>qO_Wa*$~cI-e@w zcMJUguJ_>Zd1^w8m5uKn(?Cb-$HwQf?eKR3o)4^b=)J77&!+Rp>ndGf=iC99wRbYc zN_*3>tpeMo053+r_60V78uT9qhwqlTo>@=$e9<*@+%ML{G0@kTyI*q<#xieyIYk=>A=0f1gftA1F`EJ&CGmV$-v>rFTad7 zk$5YErem z2A+>`=JyEBfx|V-pLc2-9OqvMI;#WQ-y43e^YMsfZ8;0Ro`tQ$&*)%w19NPo2e}S*PZ#xA1X0n!~a|`@e2X-I%ZiKbk zcN@JY8jH3rgU%A@Ft=jh6a?ombf$uHP2ek&4&;J=AMi3@jgM^x@V&t8fcFOW7(N0& zzsEWNYalb$(vQLSSakvJ1s&C48}|iuxW|73pLeHu@bj*_9OK4yRW|s}ttfCY^yOAy zjf3qU;5xv1hVoc(9~Hrv+>g&r;peH|j^DH9@8I+A#n-Qxs$Ukr+j~VFXO42%@V)DY;Fkwp z7TEgj;MdRKNk_Kt?o`fHa8eSEc(+Gx)>##P;~UYh!|>k={;%-g2z&;3Xkc3w;LjpA z+sE*K1AGtgEb#d~tS!h>`P&);?*~?0vayd}fm0CpN#Og@_abPw3~)a1tApPHoD9Hh zOF!Rb)9+n+J)DOB{se2DZh}sez`obDlLxp9I0LXw>VQ)Nn0@~f{zJeSq1i3*-xVD_ z1y1|G9*6Y7_t@@74rRfa8Q7dGiN50RLR0Z#;fMd&;B7PPe; zI*%dtCt%i`1L1f6+&i1WFBaHs9SVKpJ!tD;a9BTCAFfB9Il*T=WZf$Pemmez$Zc|9 z=f4!1uLRcK(Z9Wg*gt{QclSl_VJ;7@zTSy`F}K_aKPYMXBer(LTIV4AT5tB}L%U;x zWAoY&Z$A9Pz}L@TS!W?Q^We9RbmxJy9Jn&@8Q|a1*8A`e2F?ynHQ*yy4_)BDC1RcP zZ_sH8tUHP4t~dPoq0=4yJHv0yJHl^V7@VWPsyQ~*J-2lV^P3j_a%gu8VznRLR!(qO zTV{c;H6y-EHN-X-I#55_4d|=~-kNaKb`ki` zV0^9)P3Lw4IQ$-88Tc!L|6KSz=9!S&dFbDd*x!M(2X?#s-P@(m(V90$HOi)Ouzvvj z4<>x^G@jYm4HHge!zQ%$hx{h0Y&hfkrc+`t_F(ulnV9MwbH71%H8quY7} ze4Q!wuY#ZJR%e-w?-1I6uXk%UJ`e7KKNm3f=|uRu13we(y5{gq=Us^R$r|Xd)~Ai% zOUeO`^7J$8Wbj!Je+`buhx4xQ7dW+?CWVes9@9EklSu=%B-e;+tJLp5KvUWnBiuuczf_`LZWIIKBegI@-CAMgNR z*4`EHYt7jBJto%w#^5wXe_Ms$`IiOfS8%vT=E8piumLr)>!YrW%`=+RF8FLq->bFp`zab* zk2&u=ybJMX7~ToK{#J%!w0CR+k^h@$>kV*L19Qw(KW*a!J0G4Se5b)Rb};x}s}s>K zzb~fsV9n8JYd-iqI~IU*6qq@)R`5I;3x0Lz@5X$62F__RaxHv{G~!U_1b$E~?Ju-mo1+EC6mzGImR9er=nI>+FD2>P?(*S@o{ zKDPviHM4f`otvJsY#g7i$l+$_w*tNm_yzDwLsR46zNi+tU46gXezto%ba-w)22HNX z!QeLn=6k=w;kVtCxpi2Zv|esPNnLeO}w#gs(mi1&3!uo8Y_M zKcN35YTDh_z;7iAT-X%Uq9blbdy;9A0EZ0d!^eaE`PvAcZye6=1G5lwdgU)?h?gXoC ze*fzu@LeCo;l1J{^m_xd?y+X7=DUxqnY+X9xz=69cxGVR&A=R!GBGCR^KSEKGFE!_ z&~u8-YeRW_0nN6+Tr;P_@0|JkWgY2u0OvO7)I_^u16zmhi1agW_UoD5SnJ9*6daGU z`o;U+PQ+@zTcRYanX9{vtyJ)BJRkePuluBpb$$}`wVs{lYtYwv zw&eroH2kVj>X+h+!0&TM@vK+d!D)ir^v=!WqrKpKc-Q(Ce&uib6!?B_u80%KK25x1|6M!wo$-5yC=in40sAO7r=j8g0qG22>5kRwk-?n{B$>y{oLt#CklS$h`v7-FY}3F`hG^gTPwUDy z4;;QfKLdT;N!)kV#=fCrKc5RmfImLzyUvt%;okyWJFv$`XOK;2xAplP@k01*(}9(z z($-w83~bGg(B$v+G)Mkg=ROBpKvQS2b9e`sb+0t^xyS25|54yupwHU1E&R^;*@UCE zw;)z~*&Ke)^b>G+#=U{I^uEh|=^ypb#@bRRI5yV3Goj;H-UIb)V$(gr9NyI@!`}rt zXsm3R;hzOf?KPQnKZXA_;QfI;Cg}n@hnK<8d11e5k@-iFgYGjj@pSH(Un}wJ-?(@F z0Y~lH^m~hrb)D3|y^XdW3chpr1Af+`>d@C6!ha+i@?BPb#PZBy-OxE`P0ge6#)$R(xm{qll^=QP9ku-5+#k(|?*fnc7fY zwUq;22c4^-GYT9&H~koX=P(ca!O-cCSk-6SFTi&McHj9dqxEb*^VGe?ey;hg&|Cwo zdhR?`KW(pIZLbD@0{X)9ozD)vgJVsu=e*Eg49t7@o@mSYt1TP(U&6mCu=)ECyBD1M zupisOe-Zs+oh%N{aNu%*-PXjw>Z88aoz{M>J=)}>`=s|VU@3V#vk zd<~BFnvH$03BT5%P4`}#YNqpHy*-S!-U5CCIxT^9AFvMJ`SAHp&sOH>E@Z6p#r8FD zec+71Gm-x@ShpR(NgvqyUD3xk;O9Ah5V5*X+SUN8UfFcdw9OBW*Tam!Zdc=J%y;t7 zLG$WFN4!6v^AGg1KvVN;&3eEZANzTp@{D)|e2ta)tUtHHul1&LM18vr{v5!nA=XiS zHvT)X$Asr2&miSya0Qd^*ecjWn$>*={z<(&PIlA-PTEovg^;~0P4bgL)b;g2I6L=6f{|5Hlm4Tmg zlnrC}JosEcdKYBVUUm+-5xWEWd>$VKj=oQ4>j9h%`ga0L)5iPKTC~M?u$*7jLt6`A z)>5v+p3vkPID=R{KiYUdS&C=dLc#Hvr=X9#pQz@045edJZMVNF{ON(U_icPWs*Scb zCHY88V`BR=u=Q0}ZTgu#=R7R1IiDf+Vc?aBEsdOy0_*-@+l5%|5x2!L)V#ahkCIq@ zt^H-={C)ub6zD$&+ys5;1V7gX_pH{xjqgcrgTF~&=c&82v7R;DuSxK0|C+U)chZ5#T=`M~F0Vm|ygV%$0cv+s4lzY3T&nYFPx`p9R2r=hwKT$Ud8v?;`e`@XU_QjU-MViNadspzB#?{`^B4)!)xf*bgY@( z`2C1Z_+6EPrBn4+0_OuJXIS{1+a2H(0DeoqfS6ca_-Di42mWV(_XCd$?6$T>tTFR> z3H$-z-wgj`v|APaKY{N??AqXaoa>|AP2leYz6!WOV8;#tZXekB-wXcV&{tm^`!+Zw zf!hENLF`%huLG_U*zIP3zXtFU;KzYGK))5%&uI8}2DY^TUJN`6nuidZ37VOLbNzE)G!Bk)P@cBGp?_Ck z=YJ4>;@aW2&L7a6iX6%#b`tOy@XJAm`?N9mcS7?Q_#Xp)4_I?&I}@?)%Qw*Z2mE`0 zR|R&zH2%hm!Qt38LR;&=*^SuZz-xh5BA+JkXA5i_1Y8ifD)?KV!@biS9Mw$ssIwk5_Y2Xr(?=H!OIDs(~CvLYLboPUPE&T6-&vnuioX)^HJ3JR9F}8id84dg#@H}9h3)UGI*g2~{ z+ui_wDEN)Q?+(ry_y@wzwa0!{04G=U#W}Q1bd<+e;Jl68CW51y;8^8pn*e+mv2)?S z9{4}@KKQJM>%r%J;6w0vhH9OAoU@{j-$N%O@K3!aXr0KXEja&~M}w97HC2A#JNt9zYedB0tUvE72$4#2mfEuK@p`)OP% zAU8gfmWEDwAoeiuVDNim z4N&tD=(k4fMewyA+;`qFG=?54?)`1hk-j<1zgB4ay$bhBR>W%W*fydsE8x!**trb{ z=G`neVma42;qM7e-f62s^EYsKXX^_858xk#pY{AHw9E5!QTW}LSrO}TW8GU0O|JPp z@P7gPGumnve(Mi~e+~HTV@7Zefy4aoLC#Nr!#X(*I(jy-eFuIU_;9OXy1n_$vpt zl?L7b&S!|#v$m}{IBS9Df>RX!QQ>#a_lDng9{#Tpn*t8+U|Yd?4Y8{8wmRTwE!j%O zyHFeJC+`yPgMSC`S!k{V_FY1KJAkv2x&0Y@@4NQ{dmIXdzHuY?bq_ILYt@_w1KU_< zSi7!7&Le;aqOCWfSrr_f9s9v)k9Os^J&xEM;B!xL?_7Z#euqw8%*%)H*G>2ui$CDc zjCOq%E2js-?{QlOzG}6{@B(6A2j>a+$AC}FJ*Y8sTLloS^WDZ;+8X{D(C2;T7&!dQ z$+gIncl){EGlwkT&jV(?-2p%E)h|Kw+ayo*^J@4xo|-R@tN%LTOps8z#YNSvzv|c<-M$bD-8Z5VC@n2_h#VEz+<7`8+Z^f zYoqpy{)V~!8;Q0W0?!PN+s%#d>8Os`uk~;I2V$EA_E>d={~qi+yVT(V>w6s zT(yGG=bjpdwk9T6ZE&3b21nmtu&Gwq{*D}M9pIk|JTI{G9}k=#WAz~Xd!hLVbo6{= zo!2lv*Mj4|D5p)(;hg3|>=tN>W8*XRvCwh5x@#GqgFf#YQ=oYz+S1wQ`O^3MY-NCF z0&jyppJ!J>pZCKj5!(%z_v%&1U+dZV+z3ARV~*!lp^Mr_OIm;3%H+ByvWQ25UxmiI9}zjp_pb5R#- zpdR$~jA`S2AS?K~o7w6kb~5lla8&DTTY-62@_gZ4h5C91v1tw1_`J!S7eregPu|(M zXYYq*dgP|DwQT`M_ad9thHYnXJl7N8=N&-#*x0TaP-_^<2v~Ue)jhh_)9@^X=u9ddhW9g0WO1fd3JF9+zOrTzym_Z`phRS z^ml-x_3U->0{j<|LprRb{os@V)}6uaP77?~^O5Gu_7U)D#Ii=^24^JjFTkS^I|zQx zwd%Hw^@scAX2cf7eDR*3F>xPTfKwH*Ity$$f@41G$#>x71Bai@tD4|g-Z!d;-+PT~ zo_q6HqOW+(wN2-sHD5trcrGg+8`t&^&^ZeH-~Dy$*x)!%&Z+i-bEprUJK=8(%sbLN z@L8h{CVuIb3vB(pfxWh?pCr^eh^pMP%SyAe_jSZ_-Oho(H2A7NHa=H!Y_9=_`4l{XVDwKida6= z-3U(mz+MCQLPzz%I!^&l10EEyUWawVZ=K%I)E>A0QgCdC;pg7uejF7X=TITAtp{|T zf}dlenr7p(Oa;X9vx}+I4Y9hP+g=U7^Z5?A6ZoZr@BZ>L)pLQPI%6F@R~qvKz%y51+)WwtV;kQIzx zZeV?uul@Ca_lC~@t2Uo6;(ZFv65toX*BII+21nzg*lXec91nBS?`4(udK&)!MZ7%$MfFDKd*Wg!!e+jVe3?5tYjeSp6d%E-3ue*fp zIpAgBe1Lw92j_9*!_Oh%{ZM<>mLX!jzedCVIq>MO+TGWgd6 ztIpeahvXg~56ywWcb=~!md~*2qx0n771|Oy_7_8J6Y%$dqkEA}&mA^CADsk8&qvNp zZQ1Gv$NtIiYy53l@jEH3OF9>vGoNiIA@*tDe4#JCjCDhI8{2&3;994D)A{8*b=KI5 z0M`H>hny?Hud#K`ZPAv-$JPgY_LpivFNLPpIqT$5v{e?de7<-u z{Ep?jjvoKQCGx3_&b8{*rSNm z-N}C5sZ{rD%>#RW>Hh?=Tw}A*RvqXx0_OchSo+GNIyeh}RVQs)t2VvYvR#6|3jE)} z&-;wdP20S{9)}g+E7pFkE1P~+^MCWN0bhH~b`3ONg}(#v5peVl!Nz=er>c!u*4t6= z{}$MJmWF0$;Io0n(Hu-ete#;VtIve7tp-Om&F>O_gXT7Hz6UM^9iCZwXK2fVJ(V{6 z&cVMQt*?)O&)+fE=g!$K!|&w&fZrFs55Eh%9)H8Pb>-By7UA#z)~u51?+*UM(0?uZ z?mfcq{bj^DxmYSy=S*PRwmVb(9f6kww&w4FZRblGrAf06{?@>KfX@Z?81@J52Tpe6 za{&4az&RU!*TxO-7e&8bfAJB;TA_+JLT7q~RW@JINsf&XQ+H3=N9hv&er z2hI%OnW5vpXnu`zBj+1|Podp6p)&=sX@IjKhk4+C3l7&wvG9BDgk{QUG-9hk^Ks;+ zb?(^f;b)$eq4Ntc*VS9-nr(--~~h~?T_3rf zbZ*lVzrJn;KG$1TjLBQz+=|#-z^{U%{qC_n4F3q=6yUsQt5o=%r*hEIpszo`IA4d@ zRlsF{I|5%s?6u*yeqrF}k;B6OiZy>0bhNhZe+aQ{5j!CK9*6Vz8RO{A|1WDAI&SMe zv~?%&akRSt{;PqvA^$bNPa(D>aQDD&_aOW|p}8IYBGBX-t_Yp_z{vG=p@J!&Ifo%^0e+>LjOXrUBzX;8mzy*WjIXVVE>rZp|b(gT_4ZxhQui@t% z=^E%v0v;3CIjn)d3vefl)z$D*N9)A7-2*=H74Sa-9j$HKTwu196~FVvx?LEWHzKwv zaJ|6p<4xeF4Q&6R;5dJs@3zXpv40Nys(ac~vd`dO0)4K}^w44b)E&ci8L(=FEgSky zKJPYlpwGL?cafX>I1zacf&MGucOP}O8ebJ0$Fh%FGq&^Kr$DnVI5~mEvA*t*)*qJW z=xg0o%-I)v&6sz{1>oesS+*Pg{K)5K;2puSaV^zCtj-j-y8~Ez#QtZY$@55KZfg$C ztx!?m^=r}dd|;m(Y?j| z_0Xvc|6j;qKQQZ_>Zgt4vkrc))k$dU95_73btkkv3VsjxJHXF#_8)MH0^bEb*O+R8 ztr+G}=cA41&J6fZnho5t| z6@J!`DbTzCj`o!ERQ|>bfZK!5cP!jTeZXOTs|i2vT0g+g`RxRM3E-_5ADx>vo{y{> zdY9t93o<-~k#J&ow+T|Pu!=DqlHSj5DJ`DeWz}6x5 z8K-~a9hGCa9-4d(;+ijwwzzI@gzb*Wi1HS_N68Ilt+&HJaLvnrg1pgUmz5wicqP}rmY0Pch z`$dt@b>Q$Gcs$y5A9+U91-~)y{TR1v;GYMa4xBU?^JVDc;o!U72Z5&o*N9lp`vdSl z3aopG_M)_|gnt4s_q*?6Cf>I@B2U#!8|y9S^d<23fWI{S?&D@~7@H4crJ8L1 z`_Oq8Sa(8mw!*LbyzOb=T)@=ip8Xe`#{*k`C;VRmzX!Yw_$TzSOZcr*8JO>-`CP#J z)vkoE{_IW0P*~5N(v-2@ejXgxWY%ic4O@5Q)*1f#z#9{NwJ`<$#lWhcwy%N91a^Np zhX117TfpA{tY>f=-{;(#%(ecF^UE6b8DiUDEp3B;3^4cC^YHT=(Q}PW^})t*)4sOl z3%>h43VhyUxd&4a%e8lH=y)%4e)XAq*4JFy?tzZ#p*cLudcx299`EFD1jkkiSnJTH z+-$nT+jNe*-JIaO1&-P^hj+-r;PV-cckJiD;XRG>o)`M8V-=FzG^VVXe2(^=P5tSc zw5446tePF;uf1$zT`CFxc;v(9wHq;C;@Gq%Woq}e;3!}Hr#j;E#G&r+>Rnwds$GIzV;N5`t9OCan$Nj1e{Y$_<0Q;U6Lz3n^VtI$z3I0Lg zN0A%PT-9yopnHo=pGPXwzm0%@X@ccfeY5fIq338D*G5m|FcX|U@Sg-`t#ECTZf0=y z0P|UFAM`&0hkKJcdBJfX)fUgzaiQt4+8x+ypkw0K*P2uNYXr7&Eq#;lrF91QLGb?p zE`i*%2W=<7`2qgb@Xv)m4=|ric=y(xavynTR!y+~hR`wAS!}Bf{no&f6OR5~p+2wA zvCY8YU4`SrIbuHZ(5}u1jk$Dro)(6FFYt>7b`JHxNsruIi`2Jfh#idBrx2?(Y)$UF zwBY=X*e`)~zT3DS^qgYTXGB=PDg1Q<+n)=5z2DH!BWYZIz!}7~&Hc-I_z-k<0;^Wo zw!z;duybG?o`yd1d1P+7=Q3b@cDijpaCzX|z^s$MhTr+HCR9TH>~98)?dC*N z@fuqj>%e=Vux|pN zYo2}NdjOtOt3uzJo6y#;z>h3$7h<<~V4-*g8P}Z1_EHd>$DOzTO`? zXRi5cp~G|JGQ@rid;oYUVsii&0%rZ>^Q>x}O>^PgY6W&*bVl3H^Y{ODj=YX`^}OuZ zRq(%wc2#@L(dSOvxQ4aAY&=_sCYp*Ljo40TYh_^fWdQs|0=wPEfH@a`q3^6AoOeEN z>b_^=9YgijZ4Co17ufbEV!6)weWhQ)*XOpmUvI&`5193Y{aO+n=W`T%u7NJ#vfArzkTv+ojVD8@{ z;PbP#KE?Q4j~uQ;UrNKj0(|bZ)8J%44(-tH9pG^PR)oJ_@ZFb^$-L`p-Vb#rF=r!U ztHA$l603P-yR1JCBDdAhDHGV^Tp#|Hzy+W`75>42o!dG14+8UZn{&diad7Mu;0C~L z!7mQXb$bf_<$>LoCj(obYlGuc31d@O+IGSJ3UC|Xvw=O%brH)w`x^MXUzLWR_2D1*+4skx&%b?BFZ|AdweH2x z@tEjy1kN2WJV|dK!IS0K5?G_JqF?bhrmOwl_dO zC-7eA=+0wX5BxE(>a&gKk=B*11oGJozG|k&Z5_se_e}1uK1r-%-hvM6n4Y_>`CD*2 zkJ{t*>)oSq3b5`W_74l}Sk`~nAN^bI;Mg7q)-#lKbiUZi0_%LVy#Ty1IF99ggJ;|d zjIHkB=4)-c?rBWyZwx-))pvwnHPfd3Wu4mtTW3D7_J#e!prbLgO@jXp@cDUt{H%kW z_`Tr9_+8+y@Vmf$Dq212YVx;$l}CyDQ~g5_tIq;*p88o1&*`BOss3|;ZP(vn6z|x9 zF9YrbJOy}2@zmJU#Zqx*aBfMka+(1Cyui-0esGMJ!T%WeN1@NQt_P$z6k8TjD!DG;HwiI@#?|cI8oU9!I-#!EX-S4EQ<34g{_Y&X(|Nzo>?)U7OaDtz7WEr!EidzK?=V zqXg^UN=2+WT=O-d`3~?iz#z$ zto3irH4$t4FF0wCbJM`yFKvTkerf1jMC=UU708X6=fG)`v?bjqq0cj#Ymalm^_c-V zXGd-v2c9E`k;7T!$y%zj)&1pqemmjo-)2GQ>x8d4;5?p$&Yj3peYbvB_}>Jc46K@9 zWBvRF`qu{EH86Kz>yLvDHJ2hb9qwi+@c)8X=FkoPOW>CT&WRjafqw(=PvEZwe+@Y5 zi>*EI9`H-R{|5Z5+oz)~+XLWp4AWv9+JU2U+2hH(XfF64#+~+k_%;5HT^QJ=@v$92 zZoaST-?qU&7COHFh{N@N0h)!758LVvj_xP63BcsAtwZ2s1741K)OuEbWv{~jBlucx zw$ISVn&1opRxPsq3eCTOZ-*xDFxMe=e_+qWEcnmBe-i%6&|C&T?z@p(!}q5Ss@6*MQR_b~ti7gV>wEXKnuy{;t6J zf%X2%)&O`G@T0)lFox&D?|r%#oa4xI18@;=)`#EYKQR2pDZp9}_HRJ!8EA6bH=FKeHq|u8Do-2d z>j3;?&~En7ajecGo9=J+-`vgq;8cPCTVU>eomp=81akfW{x%V7 zPMXm7SX~02wTQLi3$!~QeC}E9wYP(xB^eaPR!nr%_DJNzI?3AJ9PLgAU+c$KEy3!W z_MQ9nC;EOGIDaxP;;Su>3Fq{wq%CRPg0>1mzaIQ!627$h!_PY09sUxSU#&Oiuq?3J zlx+fEYulV%@T;cT7NIXXk8H&d%lx_a-UH`*VD?L&UFICrFWoU(#DAO@oeSpNfIhwo z%`EU=0emtzwl{%?0apM%4g558dI0wWegXWSfqA|^7ku?g)+#vei}sF<>zVbRHAl7A zvBQx=^T6`U#=~C@_!8QB75PEJ5sTz&pVI0{HLXc)z>@{)@o1!RNfp14nDd zHVl02aU1(m3>>Zpo&~>0tjBOQbgCeBB-S}=_$v7Q?4Ue&mT}E|3r*eq-0pm|tM#U_ z()!T3>~YHqP95mX1Lo(&ah+^I?32NFyLq9nHDgNw&J8>Sm}^^~Rb|s&v;KF$6Tqnj z+yl9d1^yOA(ms35B`3^x2*x@KKccG-4op3Pv95F zbGHCG_kq(JcynOud;tEAz}6WEKR-*bD0J!vHveq!t@$xH+o4k(zke|woTq^E;rD~O zhTob$B^-U76a2fuxeWeyfS*Qg-N9!KQ4VfPd&HQ2eddY#y9)Xvf%%z@`utKqw>E@+ z8Sq~Q9{Ydc@cCj@GM>tB3dS}A#*Lpt==v=FY_z32gKZ-40buUU!|><9IBbP~4DdAM zwh{gTz_o#22fuyzJ^s8Kj{u)%VjJ+&L~f3yj%tYgt}Xid3XGdR=hnv0o>dFOC-{}3(Py%izD_dVqXkwzS=d`8Zc(RF2S#Rug5Su^s@o~6?~h{BWu11 z|82pypL;}m+_oI}VuBU(CH#eDxS~`nns&lXc){@b?2>jr<$IuY0C)R!*zne>Sl5EP}RJ2bO|= zKlnV;Hze&UXWm8q93;Q$s*PvmajaXef6j}>+%^O`9D-lpgOI8ImW01N@Iqj(CB;-g zZW)ulXj~qE|1!jKZ*qQh_p|YADieO`$@Ct;_HN?Wzv;Qdb1^vK=>zUN1^GiP$ zDGukFW6Rp8nr8i$=;Nc%XMG^nI31e%rJ>1M!FQXwGq~Lnz*z!oO=gJy1_qYt zYu``wb!GHd`P=S;j_%3U=e+otMKPP8^9yvwA@&eBI(MvD1Ad-^`bJjB}v=aOgWX>9fWb1*Zw{ zwrIgn0dz!|?b^)=U!M_(+<6~=!KKd@9Jale)-xa`I==&G?cl}${;5cXI zFc#F$g4E$A*+jQVXfvv+inhbr`oH5YUo>Hvp z{)~hl@IOA|_cri(H`6(5y9@c`2VXhZc>nhr*1zd~>-?)EIq2)hfrkXvJjis$*){^} zoVD#iEa!!HmDy+27&^(MeJqSLZZMjw-1*c13&yk-Uluv8q@CEoc z0e=WAO^?Zwz`KxJDdgM?vD$Yw)_lIZxD1>D&^ZYGyzs9<4t){(b8x&)`oo_t{I&t` zzYagwH9G=m<%dJCOIRkqPxi|NLqrLC88V5FCHQavHSlb|IegOO| zVyA*X6FD~r?h#n)LTzv@Z2{+P;Fo~c0rS0LdHC6`=E(ixXQg%ppP#>>XJ_;IH@Vm@ zKf9Qp-#8hXy#JSoIko0gaQGZF9Da?D?Rntsz^Xsi{DXG+ey<)lyTRdI z=tXdb0ha{+f7rY0U^}a(Tl7JKySqbh*8qWp;K3!hOK`U!Ay{yi;4Z-}xCbY=yW5Mq zhco-$H4eY?*8QsP|A(%k7<*)N&z{zEK5Or_)))Am2fhSN&xX^NiQ#jeR^GG0ugGh6 zyArcId_DW5zrUlYJ7@Tji1`+pdLB4$kj($gQJyXOs z>%^&_S0HC!N3||FhN)52=UPj#B^%B-xEJb-4)5!G{qaqV|G)pg7vF2?R}c7aJAJJ2 z^7|dSq3I3Y2K)Er8Yoa>k1PXlkw8hZ~sChrkm8T>8pwLgsS4&I6P z^S-y#KkMYt<^CDfQ_%a|^b>yr-*2ve^s~?T4;~Y|b3M#;Y|!jMUAnvmJ_fuP_`HU* zhKG0ie{qf7Qw_)V=OzKo$$wlS3~nX{NnH*!9NNfmwEXFex2r2E*s{{sGSeC_+ojP2`aKE?Na_{qVQTkWB0dp&s9_U7bSH92`ci+&?C zkCTskb|Ai6(Z^>yxYpm}#2i3O$9w}cjoQ398H1=yt_*!qVqu}=dJCD=BZ-MU^ zjnDWvr*EQ}6kqq+-Dt)^a~J&O4JZBvv~>ZRh4HoaUWV@#XdZ!I1bz`>J_A2h!^vSJ z_?6&q#rHY*PvAEMSN(~NjD8yMk7%r!)mHN9)AX?i&~FUh3ypJq416!z-4S2c`FLoS z$9KG@Pc1zHU+dCB=+_3nhJFj;_e66Knz`Vgg0FRzF*zB{jo`Wm#=J*)hCV^e)VlIH zu<_~RPQ|fz$5d_=scc_rfO9B`z`#k;5Er-8T55e z$i7~*@r5has;%Ad=2m+-=KNj;|2)_;`V9En$frk#uXbl{IDI)3T(vQFAb3Zx`+8n@ z&;9I|idE-k+A_DZ;SU4%VlMV3zW0_|pNY8(nq9#kb#Un(K<|1x9sOP489VE+e7}KT zfH+;y)cKoy_Cdchcrf@E@E^>P`P_?UTE=7^_%q?h2D?XG+k@~u0qk>@Ypm9MtUGu@ z@K@lf30d2FG(KZ;IJtQ@a85H{)!sZ!A7ATeyT01@T=TeqwmnaE(>^wFCMo!H0mq1fNgLC*c={?+V_pY0_4$|5)7{W3JUb(R&BB zmJY|)wd(kLr*#~*Be%ieIv-=!8Q0+i=obN>L(cZ=I5ZEUv9_#(=1nv&fvXPG@3hNm z-DW)9oBfGn-*<(d0(=&6TuZORk7zjd3%KGZhee55Imgz5pBp?IxY|vex2Qj_5$6){ z$>58?PZ863IihJ2zYm(e;Bgy{#x?vC@&5z%K7Tp89h`+?U5d*;^bk@Z-Th4SxxE*``T8f54vsz7+f!`1OY4+lRJ(MdLki z!KTT)eBIV$e7`{NozrnM|L0lHyVLG@PR`&<l)6uRUdR z;9rPy4!m{XLHMT|PW;+OvCYA?t}-SYH9q(%G>?I;Z)3qfPhSSZuMQr{XD`1AzYX}t zhAZc?gW=x*zYIPe>^bFLcpc3v;O)WZf@>~n9Ln5-3zL7HcNyF1_>AbKn{W7;&{zH$ z+i~HodpnSW^?yEM{tSKqed=xH{2sh#jcd;}S^bTj4L$+9Gx!SD;VAUQy*wd&%|+}Q z@G;==n?B>_nQ}jE{n_-Oz3X2Z$hZE!C%n}FX!^Ar4k$g}zqt9%mwLipkE zpTNHe?_OR8ek=O>75pB==?6ZI^-$|M`FKA$9L=-%4gpuK%f7n_z8m@UZ+u=){sPU9 z;E%x{f}a5QB%ew6o7e-;^rhX}%dy29P9NW3Ug{1LepGx9MgJOcJ_1{ZYhNeM9UWYK zP93f>x&dG7XRd@7;9-{D$aj?<7y>XiYTE*W>7`@3B9?y}?g``w{be_+#Kb(-%Wy zUHTo~J#uM_lfK;eUond>yA~5AfFDalo$0>xnZ3noHm}fWHp>DVi(cZ)|-1t!DjKcZ1lZ z;Pt>a6X#Cw(P(~!uYH#>KLU+8>2;pF2PIvKv6YrEp>9?w0t#=6EiG0!1>t&QxRC5T_+5dHX__@#5)>U@c>ch0&u zhOc@Xd=N430q;(`OEx}MbvQXZ1YhG;G3(!M#rI(FMh(ZeN5{8*wieYMk7j0kSAaj^ zzxd=f1H5By4fl?8E_!Q@cd-4?{0M%m;pBM)<4|K5TfU>IpLgr{md}#Jd8FaY#X22* zX%0nm9N0TsZ{ zyN%W+{xuEP_>|S1A+|AiOyaoqsurbP?;dqW4gVN%z6CGFID81-hqh|nX6~H#E6~@S zFm^4z-UE9Pr*N!lUCcXD)tTgPUHzu<$*1y+<}%_`U5(ua_WS1Qxubk5miN7yi&)n- zKAD$4;AtIoQz56I!b z#>dtI`+ab=CSzBE?`$|Zya#^(ab^YoiYDKCRdK(DKfCD@)9(QC`^auUZ_Y2k-`H^C zdkWjr@)I61$IW*PXAi8BS*ny@y$E7ITBiQ}___uEC$-$eXb zz;AZqR3C=HuZr)~;HT02Om6N+zYlIRe5-E6DxZvx`|Hf63BLmRLE!b!_#LnH{iHSi zbzVr8O-XnZ{)5mul-YdN}-ziY* zFjnV#^ar$Y3qBa^>sPz6_WXVBY>fG=yiPJLxc=TU@$2`M%j?+3pWcwBr(gZFRn-lZ>pkh6a$R)6yrtG}O&`TO)eXlp{+ zs=q&s`QDtd(0tZ3>94;ZG5`8o!PEiA-@ku5iMF;RzJHTkeqZa8h#dpd&s+rQt@R}RsP4!;6;6LRqN!20{W z_}1^EW5dAyJ@9hGxgU+br=U?^e{-0&X2N%2uz&BdBK#0=t^dT?h_)P)`up41@!zhid|%tOwT;(I+g)Zg)@ts0Zq%-~VM?zMB^ zrvQ)M$-iP*E51YH9$W=}Ht?wAzaPARCtvSP`2WiP2lPvWe*|v|{;lD}c?RBd#P=X? zg=Tv2WMJP1;T#>xI++#y9t|f4ee3;7;TLT!ar!{13^b3GTX*hj65&muRIkDlyJP^I_fp!1d?oz~bT~$75 zcYZX!XLer3r#?R+In?J8#7+U%S)7=4Z;3qy|69{XGZO9A8Vi3rylZ=H_-^1!!N0fn zL?=$I`Iu|Ca)_OcX4Qt{yD|LnlxJyo1$e0j1rmI&Ia@caX!=;Kx|2V>W$! zU2nc$`we`Tqc88m_iH$D>a#e4{S1n#UE%9|jMZl>grA7`e&)lBXsYkgpG=&p3E}-r zgD%9p5$xS*SNH{q*$3=>xX!HD_28bwsWp>)o`gRR{pRqqgT4DLi{3r8D7^FaE&QA< zW^!1m@xk+;aXhUF?u-5LbsyFGiCqD9k8Dp{XP|Lxy@$+4&d%>EeC|X(&!pOZ55D$Y z`gkPxY;w2-+!uTXxX!-B*^T&1qWKBzc{D2gulPO;zdU%RhSOGkK3J^kL#%2`%rm;y zd3^mWj@nbPS->}e?XRB^G?17>(0@)}>NBZg51?_~x<}S!-p4?HCiv2Z)0e~Gd*N$6 zOr0;ES`V>liSr|PT-KFm);nlECeBGk6lH=Ot*!CT+@!_Nsm0z5z1I8(yAPv?Svi#|ThyjO0qMbOk*O3v0s*Ml{r_Gzr1 zJ7U(ik;CBB2vyLUX})Q?7-6KU5usydl=H>0iI;4Q#gl7pXVb{g^5LT^ob2hCip)$^J@ zIk?Vi9>YI~?+Ng)!Y@L**0CGWTmzm4y>a|Z&gaqZivB$KF7Ug6`=Obx@#%}>^I_A} zUaNnrGd-Fs@f{oAnc@BH%G=?q-Nf0dlTZD8K_^b_neWio=T%1k9K3fGKO^*hG*x@! z>pA6Ga@^`Z6a8DA+$x_sQ)0vZ2mC(#>iGIOrMIAQ9=np~YiI_5t*d@+>fdPm+|hC1 zF9%m!u@m5r0xt!2-FntoTb!?@>C0Tiv8{I-pK<;P&8Ogp!Op3lkGeM+?>}?GmnLnE zPv3WHe9n;v(BCs#MyE@cNx*e~NSqq0;5mp{bC;O4XQT0catQpr;L#h7xyHUA2W!P& z=>LPpd`2g?t!T@-F)ndtLt~Ad9?gDePJ!PA>^}7zaelj^ckdhnKLgnH&;x!AuxqLA zoUz9kpPA5)1Req&0DcbNQ5v5)owCKxTvu(34M2Y`eB~M64d5Sw|G4=^GXeSkg5J+x zJsJK%@KEq_;J3)loZXu~`@25E@?_K0v;}csI zjc44^@YX=j)2qd(fke` ziFRvjV|C9-Uk-ym2t0^5W5fG-*N)p*XvPOS{`V1cGBi7b|3ouUEJ&g=7R9nv@zfp09(f{Ax_rDQ)irz@aeC3#KJZV&|Izr2o9B-8@LhbD zA-740(+^y}$@va=*W~u_%Mjo5^!&yr&Yft6fosjgo`PQ-em?LUXy%8nIZazXqxl?c zjoJra=lZOsPn?_atvV1J3_msetdeEpSGBp$J%SjLCsCHdlh(vhNGW_ z_{2^f1 zZH<3yN_=;3d~*9^)+pNdU!Xq~ya(8PTzluDaa~P7yECJ)KCF%Ag@%*ce&}xm4*>rk zcNO@zi1`luJn&T~W5qP_3|#d;_6&Fq;$I8z-Qb1B zC;n*Qr@>W=V%ISyV-xcj@R{Ix?ugmP3E|JCt;6xXA8cRjWA2>Q2iMzQ`1-7EZQKM+ z?ZJ%0p73AN-!b9OK))LJA@r}H-wbTOJmXv^$D-es_(S2H_d3^NKa#`b@JE9`LbEdb z_F(J(ujnUY?nb~nzsB*dehhl=T|YHGGxU3tTh)i?pFs0Hcz^UCf&YWX*GXK5 z)>Y^92;z7yj{&~`xW*xQ*7*{=E;%?y?#-H`=;y|FYH;_4W8Pi6z@G?yopv7vFNvnc zAy#e0Hf{5se5QjRMw|&7AI&%L62%Z((jW{n5 z=PPh&V#gAHbbK#^cm0@K-6gVStg*k)mNm!yG7dS^xsy0^!h45Virnnu4Cq$^*M7{n zJxM+jqp{A<4!?QR$G0E8GlHwOM6(>e6QcPOO|=!h{aO%T`#uA4tOKhyea5QhD0mL^ zztPsk@Na=f1wW2{F8KYxOM<8AuUZuA(TQ0<-`V)Y zd<{*llj8rMKErnfZvgg=bRzsLv~>i$>mhxteAb~~*1FH}t^JjpmxaF&>^|KBzRs8U z_JSV>{(v!DocyQ4w>$bt(YV)Yu48vMoOa*u;QF_!2{H3r9)1M*90Wfe?Op)CTEl6} z+ISqAx4}oDe;Ix-@jaJ4kM2Xi2XWqLIQzxD<~ZL>zf$LGELI@qk;FU~-rBejnw`M4 zXJfa5Uqxfg73l9?O_Tg@#<%W}u_?f}fIT}Vh93Za2Rtu$4sz%QKVHL`)7nSDKQM+% zHXPoyU1w$Zr_j$veAmxJ@Xw>~3BM+IYq0ymwebgWJRkRhUz#{mHJqIL!q-@Z-vRz- zaNU8U`KHA$TyuFXnhiUe;%nbUzZ;sJ!R`_JI10Wu(3idOy{nT$wNd?w%>rHk{19ZW-b{?9lGl?@Tn%`#rhj%ZWkMDx$4KWZ``e;H>REys;1YPT@P2{YSrV_kZf){d}kJVBQy8 z-?tuHs^PTt9q&her{VDD!;c3(g!dG01V0;iEZ&3sS>qG)Q+y|a9|nIKaqfYil9+p< zsrNg_-e~&RDrn9EpN!@lu)Z79?r*%;d-oP6eK`!xWaPFwZT$_t8vG#bJ`KMKcmwbW z;Gtm0;g-fHwe+g_-pPzusxBqPSVSFEG`sB7YaSkEQ z7T|7ZW{2N`zAOs=W8?Fh|K*J@T`*kz!G8(NNH#7^t-`x0&?e_3jfwyfqd5*!FnH$aEj;3_a($Jo*L-D;)`9;M?73F+7^^KzsP6)97bD% z(NsN;Z3wPCn3yLuKG-|M>*&AY{#p0ZSnWrBgQsGws*joLO&cHl7rxgKe`I_wrmZ{B zp9Vh&ydb{A;a>yq2Yv)RHQ1OhH$MG37mZ_8wKujdn#tf7gP#|^7kurzShXA5rs3pJ zH6iA@S`m$Bgz;X|E6bs$#zF17^NGqE(OjZ33(pT5i*aLs!+ zdja2p4QDOY8jI}?Hh%FL!&&fM4*Ut4nHr8wOn+}eGa8x&!B>Ib1h3w3a`>G7y7w1A zvj@IgpnnfseTn%wet)C+0{ko3eSHh<)?SO%_{2sBdzLvbBZz+v`mMlkHBH9hHT2)1 zdAQ+drT{O9{&(;rkN$wZQe6c(FYjpY>3m0hlqVbrpL9{Zz!c6ped)R`{yP zi8%`VL&TgNO^r$P-Z9QazdmuSKRb}Wb)Y^cFt!7}p6}h!3?>K9^m*ay%u1f~fwv?F z>yK;u>yDMd zU5X8D`n0ta{8F8m$6y6Z-ZZL zIJr#@?|FSGntJ|<{ss72Z|RG3JsCNVf@TPOo!7C&n_woq%s&%pP8=tX#1kFLSgjcsfw_*L+!;1e27J~{8o ze`YjOg74sSQ=ej8i5Eow0P&sQJ;l{^K0aqQ1@0jp@ z?(wcIPRzT9HM#E9>C3dlthq@1U&-eiVpje!KaW~GE4ewgekT92wB_2K2H)ye@~J%) z?76TW`Rv;?>DQ0&j^~lY9|JrK_;-Ad2hWS<^2R5hItzkNN8|SnECz3G^TYdj<1@k6 zevH)|#dZcCLq3;+v+v4hIDL5uycTgDg+CnJ4~=m=FXnEVj6wU;xtmoz+TYpnk3MqA&5U7!2H8`HhK zH#rP#`t)~3e2)dYr(7rJ6K8q!eh)(RH}R{^1Un|ytEw}x9^~ddZ6n%R4tyngzx&`F zG(L-+18)w-e*n#j4QE~)^XhNxYVhCSrNQ}5qS2a@pGChgngcqx#_J6D+V2@dzq8{b zG*dH%^?e!9*IdVH-G+C3{9ccZ(OZ9fzPK07g5Z(Be}bO}&klYKybX8~)=bsySgq~k z?^!${zF+g%^^e2P-*Dz}bNIuXJ~6F(o}rHtv+8Z)ybQkrF|BW&FK5t~b(yA~ z<9BlHkKXUFsBF(R)*rubs2g!^XT8;&#@44@&!);JHXFECM?XpX$F<=7?!uelOCR%lvhIMN4(#_- z)^}3GE~4-EgNM^zuW5;^6|OGahtdKX70KYXIXsx zUMKfgeSchR5`5nR*LqHT>-H${RmWn^SACaXY$o*e-OY(vdoy-1`Xk_7&j-Pe2Cnb7 zN=$Q5zc2A?Y-7Lk8O45|;J7V*V%GO#2K!y)ewV1VqSjSxC-SVbHF4@YeS$ARQ_q9p zHzCehVCQ;geEsfb*X<$rx<~3cH0EA#OlBdU$!Kdka3ApK4JZFG!KaYJw&<%)#>N3J z03)b348R&}@U|dhly#tO>3G=gz(0_bJarOxwMe z_&dJ)H(|3=d!ruqknUuR8hJM`Pbe??m(8qRpGfTq4PJ#GDles9|H zoc$clP~!MKkB_49JC$6k>k!{{J^?YmBhEPRwa#P9gFOd#VEl)pSqwa!_^^+`uFqHD zmq0&P%QIuu4gQ;^55Eum#|?*n2#tNezwue06Qh5g99$3k6W{lGSgWn2RUeYW=wR2L z`+7gxospbf121*>%6mQXSqc0!crW5y37!$n91SPWTi}mv`dFP=v1%)N&&n=nwnI~6 z8>^Ze-xG-cBDo!frgDo_jg9pHSG#%LZy9*+z~>WxS+M6t-9=*`lAG=R0KYqWzYEVg zukYXZo&|oS;f#s%vLf-HK=UNN&+{3=m%&&3#M}wI9-2iP&bU1VKMeeM!-?bBQD=Sl zamlmlK=xGaqiE`TFk_>j-x=PV?e8DNsqfH9%&Nn|+Y{#=@KxaMv^z6+XK>Zt#I$}s zNSqD8H73zpH-?~b9_u^uVq^VRyW#Ifa~rtoRoYqw-Z9)9{sQ9P32$GnMN@GS-!*KV zf3BmcTyG?1t&><+#^fSm9*1TPu;0hD5BfeGT<1i&T%!%d<@Mq-nSmR@Uk6tf$*W|JArxMfep1TmfC;A=WuLZ9I zt}{CQ8i23k-wnQMOKei`bm00P%-HGR%y0c3XD#?G8%_=vzz>G^Ji4ZhXY^IyVpY>J zcds($Q=qvLd{D!QGn|;e;9K9Ll$fjI>vQzi=)WUQfAnvGYdovnio0S5*UzJXk3_!! z_(yPe^b^C+3hoN_`@;NQD$k~E=!^LuK%DEq2REECth;OQw++X}Zm;vyoY%j-%ik(o z!QVVDxbQ!|hb{gO{;u~w`<;?wSKjSpTO{1@**{uJMF!SA8z4&SwdEACgkfB7Nw8=#-J;p8wgeB~Cq z7vI0Z520C`ICr8M0X`YcwfL?HUbo?l+vfNl*l_af3cmm`cSf@Ucsb&~itmfy3(yZj zKQi$zK|d#&t--5+H^O%-_>ovMQ^Vib;@ADK*7^pt^(dOL8qWA^2=AC*hwp*t7e&7d znm54*HJouix#6^RI=%zZzYcaye#3i9zeY19eLsxc)+2tchvcw1_)p^8g5DfXLh}e3 z*Wsk_mx62k#P$LAXqt?}^5~}pZ;gI^__@J9FeYm?K7G6c-=W~DC(*n^oI}7DH+?ks z!q@kt$HoEghkh>jeZW_er~7XIrb$~1qF;!dYmej^XE^*q=x-p0VQ3zNADy=5M6(WY zZUS3RwtydlI5iH*|4=l}=^M0lJNoa)?Mm=u#5thhtdsumI}!64d~3dvPdD`AfuF#) z)@S0M0^b{~zAy2szQvvg-_~%&tUP{fIQblc=2Q65;EjJZeBs2YniKph>uMJCyMdPl zS8b1ZM*I$c0l4Z_tm<}b?}n2@X@ciP|1fw*G?&3!E6(g_stxPgnD~xLyVn!vL$GIr zcYywAz98l`@UF=bjBTykSmm7l&I*2jIPbxiCUz5=pTLgcQScXnZ)`a2Zb{7QV_E&% zqUc?Fu8oP%j8B{yJN%d}jy2@)#%GUAiGCFD^$jPtv*D{&#I6F5jlRzJ#P5aXd-C)g ztU4V1GHB+&*Y$rFn#aMlXOr{(@O4)Ve?0tctcP8}ub~+W-xJ{P2YWYIspXuumPYdq zao(b>L(y0de?(JbmGN=S+z0=6)2H2IiTN~f4u-FDB=#layfpcL&@>gZ+O}qTu6Y*k zK}`3^W}P?{Yd!E)=&yk9O+Mb=CW5z*wJ%~P5@$B_JD{oaC}TAvnvKwS_MJz}Zy8V5 z^Pa@~gP0!?b0GK?;y9;O&okGK=S=vXNL$v)Q_;*1p1z~6F{uYr{KtXTxvP;wS%QXzMUE-mji%eDwC$Gp-jJ$HzTbdB(g$?hEf)^(=dd_}*8$ zlYhm}eC>_ib7538JsF3~8XudSn6Br#>n8rH#Q&6iGz7jhu{Y6p-t|OZclg+8;0e%- zfL|G0buu;|`CB)9ePcdi)|g~|PX-@J%;~`!6aRGhMH-(t57S@As>V5EI0bsg-joX_nfp_eF?TM&5wRn@~nKK zKLbs@J{J3pu{r=eE50-0TWcv+YdGfXC)UzA&`jKL@^LReg~q;Ig#Ju4)}mL?OonD6 z@Rn$555@+fS+L=(z2BQA_-pj8!;$b^4Lo_n>EqVTH@N0KugkrJehlWT_HXpvJNoiD zoH#2rzTU4;|ILo?DEL+mvAT!EmH^)auK7*7-tjyiJ#)9m_jAU_9F{?|Jn=sVe@4Hq zVoiFk`Apgc-#=-$?$5D$eJp*cbrSplnl-?SgLi4ZdEKdACy6cAaIJ@mW&KH#a`} z;(honz|-J6tnul)^WrntZTRj7J{Npyr(YGTA2IcG@w=wbE8hixtUxBavoB5gs{0W-sV>Bza zT9p32O3Zp@iRM=DqQp5Jz31HyXpTfPCvhHwKNGwpzMF#Q08iWS7@dLk+3J2YJ;6i3 z-_q7`4X2NF#|wT6&2aD;4QH&5BBtwe0^-!?g+@Oc`r4bZk%+%5{A=*_ES%hKf!_l> ztbgle17Bx!%-ohoQ}sV~X@{@8{XFV=Hc4M@qK@rJoR`5%qrVsafYw%Oa-D05 z`9645@^N2yul|yl7vt->HWqQb|MbImF!)3Cr_o1i)FQO?AAI)$e}l%_^)VXHh{`kL z&h=0n%zKN^3)YIdFU4M@-HnOw`CD~0Ie0%=7XB@8A8^&%_||y-n93F#r?bS0ytnNsOvk>__N&Ko~(Y%fC`rz(pY7C>Vbsk#} zd>MEd^ejIZ^_Gi!f*Zw1c|J`%hD zT@k3F6-l_F4F?#wVtqMeplByW?xj@mfBy2hbb> zzjueP{_KF}FY#SsD)iH2rnY*4Y$I zZ+xp(#C`_*y5C9gYtxs{;J*Mbfu`=RS%)jp?lIsk(Nu29^J+BuI)>Y!9}WHIEuX|W z8T=rc`VN;^osTi+y}q9!b~J6d_9}y`JhC7UMsxQ4ykkB+9+O!U{awrc$AXV0&?V@I=B z!D)%VzLXugBDzE%Ct*v^8+z3?df)?mlPwdeD~B;;^EzI!%4$?`ZJZ=yw8tjBhvii@=kiaSfaS zU(ZMB*AMVDcj4>xtJra!`1Nm9mtyXPvElRDLg{xVPW3DOy&e7IXzcF|jZZ%3fiK4Q zQ}`c=^C);<@J1cqitG9A-g&8M((ae|Ufytc_eG6u`ZXoK*5`-Gxqh#gIB#>dUdej~ ze+OT^XhytCm%dB>2g1)q{B`lY7R_StyTi{5|56*P#NQSEH~0Te5V2L3_ghYdJFzg@LOnBXgQ>Vf zZ@AV>y(f1Lc;6@PTx`)aS@Q#kIXAw2;d_H`1up?UsNuxC7k(A+OW-5GqqTNpAHdf- z$=Gh*_~8A>{|xxa@jV_qGI%oZhv01*PW+?bFYK(b%5Qe^+yza=jPFOR$v4m(4(K>1e9$b&2^pn(LY-Ys}mpL9;%-=QSMtujD@?n&ru-Kl-iEbZI#DB7J!Z zO?Q0vZ8+mo>pA237rq;I+O4>*f!Ufqb}qg%Ft*D#KKM6(ZgLUO*1-0nkD;}&}#JQ2RN?~>bCXjbgt8sAmn$HlkKh1j>? z%y0eMmK}b)hNnaGGC3ay{|UG!ZTVRobCL7o=%+zH2>zAUR@TY(@aKS+0S^OrZ8+m| zbBmuiyP{dF;qYgo-wn+*;MzyA+rgiKzhQi4YJB3mXKP;&)yYRJ!lS9?C*g&x7(G}>cE>%BjZy!ZWYx~p0xdY#<)oO1K_|n9x zZp7|xagt{r_{Z>F6W+b--mmqOIM1Me7CbMSrQyB*^h9$Cnvuavf~(f0-A&+Yt%g5= zv8pu?TNJ(ht@}pSx%+V(*1$%@cYLm*t>4kOr>;Qb9-NfihBZxcI2-+FQ{0zXV3J7(O-vtefV*}Z-W;CKM!6N zTz!c>#~kepZw;BT@yWTKBVy0u`!=}tb@XF`t^Wg9Cl?a4G%;)GN$`_^tpjhcHr51x zj(+BbliP6c!|1nx-yGj*z|M=g?TF@EVy*zcb?bZ9Qr&Z6n>Bs-sx!&+0DOOGn%Hw_ z?rb=|wYKYgsGrYAzaILpi1`w@o}prO1|{YV_|`ca-Wpgq{I=-#2D=XHc_C(h`!{`T zU+}%?N9l}PjgkAYo*!d#;cFeP=fRBauHfmx-eau~XA<*j@;MkhEgH`q@1>KY`5HWe zI4{G0)%fH*LF0o*K~v{Kc>8OeKc4uuWgYkt&C)G?=Clv()@uc6t1mfN)23>1;yWLj z^*VXhJk^~)&na*7o)p)4)za7v9p7rZ@=Ok!fSt!5@x82RVgnnW+-mP6&dJ0%8{Y@; zt@}pwKG!UYegODbV$Kc!Co!v5#OigP#IJo6tMeuNO6bppulsH6@`lsL8k5+4=-(vH z*l5mce0(2leA=zr7<&-kPk3*mHT*9$OW`|K+oy^72%3@M>zOw>c$aqXtWR!hfVTsG zP5k}A8#PVL+CDY>#KfuivE9J)qN%>5Uz4J#JY)Nj!yxc!VDGWDuVW)o-@NaAil%B> zy$)CZRgFqMuaak-@8O-7diD%&9s3;pDzw$VgUe?}c<;KlyDstT&Xcz4wbq#R%{t&7 zS*FE_tph%z;jEd3Y0Gg~h_<@nJAWsiiaS5Pb)LpNgKF-Q|3kzvX6@hPvlVfU0sGq8 z`S3Rr)4BMGcB@vzmL=yY@!bXeo#2h}_4Sadb?MjTXk52*&{oci^6`w@kQ~k+&NJXG zi1Rb;)|$+?J=*x-@4?Q?$+T5_Jo&FgeDAb%2F0uobHi_j@7wV2Q|nG>e9o_Z$@v$2 z7sS`SW6kuLX!PbA>x*xFc5Cc)_?n~i_aHR&x<|&X3wrCx%J8@2yC?kQ@Lx2Xwq8Rs z1Dd|z+T$_D-0`e^k(hNiOU^UmyBslnPVu}x6wPYHth$t#uKC)_Y4-x!`Ww6v_)u`I ztC(xs`dN3USmhbJAME{YeE5}{Z*n_;IR9yy^yN3!VUNZ~U-KRti8ytp$2_9RZ-A*1(BawC2J2K_|f z)9~G};XF582Y(^>=7ux=+cq5gk+~R$oX5s@JM`y(>;4eCikz>-*L%Wz_|{rV-)l^Q zKSXmXcn8|r1YCK>d=2VsV!H2E$M-0FZ$V#YP3$=ESK!5ob0GXX4W}<%nD#M~TyOK=Y~-hZ}1b1`#TXH)FhhO-9h^ZJs*(da$nb|-)PG9x+cOHBJx`#t98 zPj61@)@F>J_UJiyIlRQ1UM@I83ZPi$%t>jq$uk$fy;*Iz|(fH^W!S_D+ z2l#u2i}1Y^{b}UjxmNdt*d1uE zFYwZ6p27FQhBIzsqJI+XSoy3pBQaek$HHIFTB^RMt&eHf*T<^<)cn@-h4V56zW3u> z{fhkuydZi%f710<{Y^esgY~WPi48zg^*nYr8t(w-!`J;kb}ISr-@)~7hokYcgGwK} z24B~Y^JT4=gP8VZ*-o7L9Hi5U{{`{=48vM8sY~^Fw!wZT@U{55FUEnt1YCPIR-cic zxp)}-D}Rsl2mALgHQ-Ykj(vvj)@>XTe|t2&;pbtjUO`juH;-@SAFKTy{v&ul8)w~4 z%+g(n=GBJdYmNE_%`W6KQ^Oha-O=1l4qL&`({S|3xBkC)<5NEuCw@P$_putc#Ho6o zoF_zIdo%WKiyuw6`u`^Q)_o?L`dri4HBFPY_Ch}icr38@EAJS)qd5#*cZ0P1O2e_z z#7_DzO~$I8VdJ|q8tJR(zK6eoT77!sV|#;V2H#8mu7UNMCh?yD*BT2ykT})W|K{oYa%k%LG;3oA z_&d>G4?kPO(bu@eo(6wF{_g#H7Kpjd-TQr-COLav7au#A__ZD~&TFD^d_3!)C;nXx z$M^e&)32$~)R@QW?i$UpXzpUH?nQHA!-+p7`l_Yr<5TeSHe6Q!b|jjW8lQH}VJ-No zX^A;^!)dqXu5kIg-u58=rwzv*B+e%AtFeZ?PYyzJ0=QR;6LX)=4)1I7etzs>#MueF zBe}VLd`)H=*7Iljf+r$}%B{w&#%JHA$v97nW-0I&VDA81!H);7=akIL*zoT68n8cocNMVXQ|EPJ4#Rf@cY~@MX{**i@S+XJ zmILnsUXpgtC(iodwb5SPyh~3+TWf%qKwtYPR%c~$b583Firqmz`++yb*E-|thpw3y(a%Nv zpNLuax7bVY{{i1joche_%D?QK4z8cAA=cg}iR1lq7TUE2R=+Yn{m@(nJ^=hT@gD_m z-*DE?iRi5Z^(+t@4z9YC99GA7ba?mp>(s-+ElzyDC1yYPKZ&yr_;K_Lf$t^0HSJAu z`x$-J{Mfb)C!giPkD+-Jybv*Koy2!qH0m!zvk!f_jX3V3n~8H8dY=JZC#Mp>YC`N- z;@6swjSik1&Fr-GJDRH+P9N8T_pai(V@(^@VrGpUh;P;B#B`sog2r>oy6y8qz5Wne zn7(Y-__X^Sn#;f!gX{H&*dz@nx8vZ)1@{FzcQsbA>%cRCYrVx@1)Jv~@O9UU)!ImI zlQD)%qTdg`UgwG4np16suW<;jdvffG#%Bz#M^iO9R^uGseHxC{SsyzCY^`wKS3pze zS7Q2F(2MXVgFnZ&)=zwE3=5YX&Nw`e{w(yP(ywX3=c9LDd!E*7JF(-@7oRb7Jq)2; z&&oyct-D9e^R8YKNKEe}uE~+f-cb9HhU8(eih@vVU`&__QPXfSO}Oq`9u)%VPc zG1qE*%=_?a=nn$Bf1R(|gUR`)mS@^}nfUJIn!D&HLvv`u@vRya&HHF-O-5r)+YG*5 zV~l+Y_BGGT8=v^~nR1EgdUylhUBH*Ht}bU@egJRR^m(5B2!1c(JPLn6>ujD_aq7AHBp^*_X%f;jbhdvd6`h@Awk&moM)y;iw}-=pCg+xmGR{EOr; zJ@aebw)PH1zY;mr?;2v>jbBAyH7Zu?A-VY(gTJ9qy(*or)!f)L@vSkBIWJR@kL!Fs z^oyZcxbazgiTCgS{~dvUN8sNP_;&>U9f5yG;NKDWcLe?&fqzHf-x2tC1peTy0iK+g3&4Mk@6%0__!pz8&x}g^DLQfL=RWY&ZZw@H3(RmiN~E)-=iO4D>gEUC(OCmfjodKKi>FPWDxD5V8eBTCF z{fzAjZ@bsPe}}%-QtZKoGpA3(cL!epz6HDz_^5`{moMN)1)mDu2>na&N3g&4LURt9 z9l+x=Zcn1GxlTUc)AzseeILy)@H?`uwuS!&TzyIWh2bYApFfFTIY<8^{MhLCMsq^b zWL~WQ&hKYU6Ppv?s>!iB>(g!z_}j_B+^jA8ps%@zJw&_KpPA5D1C29D(CGC31i-Qc0*q^ zB>MMQ=ab{>{j<*Wv~>fTXTgs*ocrMb_$$F9fiGz|Ie2HNy&t;`Y`yioDBsxY=xZ;> z4n%Vkcrx(W=<6<;+}t~dqL~-p3mYH(%V-uy^8tMC#z(&%{Ai7@ajt(m4}NOqXh!&V z8%~@v;B!9KzYRj;`O*h{eeP~-5IMUS#v+G3i8(&{T34~vh`D~_E0^k9y;hL5RC_kI zI`}`$H*0AieASBdcYpXZ8cxi*AI6q%eDvM{UPSW(zS9xYv&{RgXR&9{1Na^b_H)U8 zqunW+Cb_-U_~icunjv8K@?6CK8C*3gF?WPt0$gh&R`;>!T^pyPdAsEh%|Y;0uVPn{ z=PC~4oCWs0I}(0fa9`S;x$%ivH9XcIjr;dxG+#HI@##%&pTloP9M3-2)!k@DZ@$UL zvu0BG`V8l2`Zqpy9JuB&b}jmA;O~ITHeG=LyHGrG8fV189B)`?}M{#H@RM>>l(VH=KM{2LFMk?vpW} z%g#iz2EHG`4{pAR@4oP^;=O2Y^t%z$b0Oz-#hsDduBP4Rn0Lpm?!cL^RncDtJ^*|e z@#_v5^UV4b{aX#Ezg6F2o0HF%@VkSL0y|%`((dwLa~l)h{reR$zeKYu_=bj)vvuCR zIbMqsjbpwM@z)~ec;GF;BZKR?Ddrv3n*12?=V&zmM|;1cvR z5OZ;ObK4fp<-}a1@rn5#e7%2GjZMzm;JY1soxid3h_gSMAHmj*+WWDYI-2@)fAyz#+Nyv18vUunEKRKHe60GOeBAFdn7qb zM4XR^Xz%@`+7GoVqW?rUakUaB{ABkJT9+eotZ^gXTi=sn11>-deN{`pO}i z$>G-o*PSZ%Tt{C&*XJ$A_kA?8fIZ7R`)bT%hk%{;w_E(oqj#|1=;P-2E)V{&;pFE1 zVPrI?fu{!7XXwSZ?p?tvq4B)_m3&S>b9KX612t~3S;09w>fb)5-36K^?LLkE`=&|E zli=$$jp!eOp9j1ani|{KyWnNe_e1|Jn!5kTCT=+G*1C<=`4wB}zi{;R{2S~!Qga>t z9(;cwhxZzeW<4~obu{&F^-L5Sihe2do+({vcVRShz+VUcrW3Q~4uszud=9=n z&`*fQ=Z-1bykuWn18XkQ-(`t&CAe~noeHkc?u&g1@8@UkO8l#uCT-OiRz78Qro_f= zd1hX!&O~4LpICkFO>9#%b=Qi10`#uQ8lPC*^P{h`AlT28uJsVxi@qEV{|EUDg&&8# z;2B-_&$Q(|q}FQq0mQK{$CHEgb8Pgr9}{OM_`kp>kn`P*kA4F*){{5jYY)b%#%8{* zq}@>(pT7xt6}_JeU9~P&`!_ipi@wgy@b2Zu(N990s?{;`pA=2irCNKH-vh*78azMx z^E)vsk8R-}rLFDZYriMwjlp#f3GZhn*F7h^pQ~JV;PBlVj=jQrxOQoL#{VwzSq%Oc zeCxB#QwQdRuX|wPJlQm9H+8StUIP6mwB?$yJ{*pw?vpXkQ1{Uo#IG|bIqciv>t|oj z`KlAM_}%dx7km%x-awq%FNr@s`l=@xht=U%1lN9v-P>^DjA(5IAByHcG^dfzB4}#8 zWnMfx&PL-J8w>t)aP7zBa3pQ5jK=%b!{qE7ZGrx8;&`|54t5N2j>Ffp&vWW_^vk0^ ztl{Lp7udCWF1|HxnXk*q(`VSa8z<(L4acSd*ItgsGjtU+JsVD2b2l9QxoB=9&W-TS zyLIve;?y%>;#>E;Z(L5yvuMkE+P004J%*<4gvnV=t$|prw`i)5v4c9A`ZwpoyTtFb z^&&Cn0ap$&&!$>$X}9WF?S&eP8PR)xUW%B#8_u|SHq~6jE&!{sMtL8r=d4)Of#g=_ zNbqLlX033Y|A#m}<1auQ_m`hJd^WzGJGEwF&$hE5eXr+*)R52c_3Rtg_~dV%p2b%Z z-|k0aW8Uh*Y7D}bzhAw!S8k#YB>2HxOfy@x?I-%pK(}yX*50m z(R{JuKl~AW{?Q+}{6CtHmi-4W!gm4B*1ktL_F!u(IUGR_EAV~6hm-R}XjX;)7~B)Q zA$Szs_MqlsVn$LjB<($?=ylYCY}Ga31e1Rew5+0nn#aN^Y8Stb7a z#Qzcf+vL`j_>ZFT?_-xG{xN9AYdCGK(c;A3Z+zzKJT$-3?t9?Ji0R*zjn`tPUl*V` zpyBZP&PNWFbL?C2hO}FMN1FT}gTDkmzXK}WrcD$5p2VD%JTHd#?@QfBR}=q2+I;+dID1H)D1oW{rQWJ7aQk<1=no(U<+GqLJ>Oni3ZlXIPAv7Rl5@Kq~fhl2M8 z|Jcc)e5P)E`m%Y$iF0fRS1jLWXJ1yQ-EHx$^DZ_k*qmLr(-UVM@V&$w##q&RXJTVD zeQX2pGfk6zRqYDC4&QoTTkJCMAmUsHuCqJivsKdv*Lj-wYd1c)KbmWZU+-}!-_l(K z{|$Yd1pW^2W8irjP7ddT>)sOn9kBKA3*ywgME^NCWWQIQi=aOaydrpU#%f{kFf`)T z8lQIO1;32G8~AiIU5H;bA#o0d9~b-{zGK5r2<}T;=Fq3{nbTJp&nug6+Fg$LTM}m| z*l{*~-JcU@AN2oeIPKQi8mqb#z3bn*z3~^u_bcXi2J#;P{}z3;R^LLLkr}tU$!9lW zde$%2`07jL{V;Kyqvzpkjiv98lAG(_I`BQdbq>aN2)=8=59;)>#`H;i)0gr;621@p zof3QJJY?e<0ETrWX<`|BF8p3l|vncunt$6g0N zho<&j^7*mx!55;hc`3eZe>CoeozT>JOPsnN#>QxEB{%D{YwvUPzksV>iFqmfA7Jms zb@zzX^L~80!TWl}G#$Qlb1)aPp|5=rn+a^~8Xw<@8QU+>TLZIxs@>k`z5iGz>#h}B zg_w`f?sj1Bfu|FHM|`h`ue($1Z}8&iGZ(eiSB7_;SDlHS3ci*67a{&{Xy$Ev_L23x zaOTn1tm=FWzaepIe#7t8_^iD;TVr?Odpx{jXr1)DI}Uw~bG21gukFMR2QLV&eUy9- z?D&>{-Q{9~!QPpDR{a#s87+Qd_JBVCTzffoM#IUu_Eda*?sy4(?U9UU-I1dI8O@yZ zv0KB@UyJ5i*1!_zhc``PP6z)WcuL}2)o|i31bQ8KIaIN9Q zta*u9qjrX`_qP9UJ-(wiK7Gj^uUMPmdm`g-0=Vwju^QXNIhnrf53aSE9L^*DbYNe5 ztb1Kz?nRvX+oABTA76XvM$CF%h>hBCa;VxB^ZtJcn&r{>T;o0b?50UROVLMP&s>B! zb>B$cs9G9Z34BPyiCK4yOZE)6V_2p9LNznsN@q;!-_&?cO@i+o;0GJdn7DUVLX&%S z{moLZ#>eW}Ew(`ikJ*Ta>H8JrHURyXYTyq6*LsVUZ~A^L{Fm^)PWuX)OTqPfwAixv z4sU$oSIvpl>xUViE6|_$UpV>|@%;k4EBd?P-+-^zA7Z{nIud-*$_iydB*rR9`>)`UOTAh4qZ6pWptH$wJz_wg7^{f}G{g{|PF?Scj z&(!H-`8*Bp`SLq4S3y(zDEZe}oVMyrjO~GbJjSHfLu@DT4`{3dRreDA2=r@#t(pFQ zyng=`->Hf3?~MHY-B`q|Ig0PQ@IA@rF!)+0(NBWL-|u)9Z$>^<8)M${FYoXb*R?b| z`c-Lbw8m#%ZbS1|!^y4oel*_Ae64;VH1!-5U-w#X_%Z3rEsc-Ogl0SVXTY<7Uqx@N z-h}wR_IMU+yT&bf`u7|4d=xtzjr(ObayTBm7x+_rUxu&skn!{mUuQ~L{afXe-0s5H zv8p>#tX_+b4TE1C{8qz>S@(h9o6tN9UK+eJV{#6@%b-~u?AhUKDWjrsJ^ajy$I!<|W`Ah@U%EjonA^RUcwL7jH!lH4ZW7cN{cxkYV zvmCy4e~A7kd>=sX?+$8j#;!!~dGR}%cfnsbobj(YjXe*pGdJe=?~kTGnwpp7e;%5d z;XQ-AM_F^~OplEO_RN}(cI);0*wpB)=X=9Dwq4*)1@|MSuS zV9n<)RR8829YwpIM~*|SpUl_h=r0BDM$YwGL2@Wfu&?v1fv>f+AN<)3=QWla;p=x9 zu}$EupX0-?({S=%x#8rq6q>5Z;jc!21)91;##R7t*l>IwZ8&Y!b5L;Uqq()=*l=*& z*`j|9{vCYl97&w|oqO=1@K1O6iuG;t%@|r6y(?DDPrI|ymS_6*@N1(#nsz5dQ{xb; zXUXL0yw_O}D}6L|9wnb0iC_26*c$M&HyoQBzG_;m&d0>B^Ey_q?Zir-c2`7WE$xoJ z?v{x;3HV}sYusYayMJ%cy=f9>IrJOA4+b9ro|$|Gb#kco_9P$g`NF ztgYdS`zCSf9Esk)wQ%2Ef&M6Pt$|q8vE+PxM^iu79VxaD*nM{czWveoEbN)(df2t) zkal0ecN_3*;8(#l=JBobqO5+dHJ150v+1MxkU8xGpXY+|uNs^2tl!bZK4`u%Ur!!^ zevJPirgw(znkMG@sah1XCj8ynOu$y~ukBQR zy@@j_ac*h8$$uEQ{+1~@Jb~{^ov|t(>q*~^ruebZ`#Q`cw7Ug4ZwcRp9Cm^Kk(jk+ zlC$>>=cU$CY+Yjh-1zis0W{vDerWNd8J|2qZ~C~;1XT)5NJ-6n*_&P~mz_c=irIRm1*HuzX|pH+{@`oQ*Mj2u;GAcBu??DDXzFk95@(IZXUuEw$9!$= zX!wg7j<5HGsnGoQXErA0Hu&y{{sOS$;GTUDO`VC!A3quo&*13Cr;&X zaKmYDHZGT4qso7Y9DK?Vl^+Z1HtRJzNBB3XYje5wNzue68v)b_5s&f z9D5hsA3OkDH6d-8Tg_eO(Y^E0|6=dW!@ZpP_wU_cR-qIrQj#Gg8H(5q#v+L%(P$`T zNSRfXGBz2~K*r3XC`6RZWgenIW-=7YT%Pm1UFW@DKaczSe2?cie*fL?)qp@@Hr&<+rdvoUnYU~&j}|k5l-%0_&fuAC~`Lk=DBw#@SJ1S zz;oZu{^_;{K;ykP_52E+W9ZrvPoOWqA@?%i{=f@?Zw8)+eQ6e6bL)%W!#!QUtDE(; z*&uDmx4c3KB?_a;nZ*#e2#$TI@IRzN$%s& z=gjG^Rl>En6`DPjoAB8FQ|t!8DLmVP zpI_+RMjPSyuY}Jst$%bz&&^xxgc!nGD<>*x%zw*eB5tec1+>HFzy2 zKEk*S1LpVFPJ;h;(3}PQ5;PORmq%N@#b@p{hW-R#?vp!-kA65bI{+UD{21E33c0L* zE%dLWp3_k0-q5)I%z;|Msb_ci9|=4jp4XwCjireX*U`^tYZ82#Kz}1@;5d{bcL?e~ z13qJ+xf}Qm)XDXDF*J_~`{x85Hw&ll_aoQ!q+csg1KZjHo)s{Lz83Ku2F*>tS3=`@ z63u}xg@$X&>nQ$yO*nB3ayKJZZP^dG7kv$%*WlwlA$=cJXxzs6@azU$1NfOj@A^&w zUmckH*oGKe-yhR2|LjEYV&ql@=I@nwe~6yr&)UvJ?yvB74axNxCgE$8abvr6#YfLI z>#<5q1s)9S>*D87e~iMIZw1YH!fCgjFxv{|nZft>#7Oju_56gkI1b*=6FZ`rsz4cg*(`u?8a{47CkE8thru5scA@E@S9Md(Y`f^*2PfMyOnZxPPi=HBl8D*X1U zKlp9CPnqaTNw7aGF%mMB*U%>M#V4s~5Tf=iSu*V^7 z(Q|fDkMkdc=RAzV6!0T~zr{F|!k=rr7xbqB_k-ToH}Nj;$IyH4O8vJ1_W<_zN8@Lr zj3@8iM?zDAaXVdn!h2(47V2pWzJqepmhXd!?166k0P)exgb&B_0ch40PR&n(?=GC+ zed-$URe(JviKBrpKz}(`xt9I>n;Lk%E`*QAFu^(V0{VELH0e8QXo}psfH#DGgnTmp z`8!JMLDLAieT7rA=XP?tK=Y|QQ%^ZuyYEqRGw6NRN?b3T+@9dSM(!_o4dFcaKPOFU zJ07_{+sCsF_>F|4_t`jj9pUJCE$)WTSk%Kge=qn4(boIO<@aUEL(>nrKKrGHgMb^O zHvcScYWDpl`t9Jk8k$MMiQ9p{5>BqapP2CTU3kt1pZyY3g;Rs?-NDHhG zWd=b6ZTH+93wtFn}k3hpYb2w_a0~+q72cs{ZSBdvD zR}+oV))M%9{x?4LuZ3nQ=6rYPdqKl%%4fZIpy7PuS;gn!v^yR3zl^qc&RGb}DY&Mm zN}p@ZXMr!_GXeE@A4|Lbd7FgiTYN4!1EmFXOIN1@6Bj;Pxy2KUkkYv3*I%&L0dNg zUxwGs(&pd)KLOWw658Uu<{Nmr@3}Ad`&@}S;uAg#CGG;|{^p-A%C)-^*!ykxoQwSV z5AfmoYJf5EwMguZzI=c=;Psf``177MADTwMJU^Tb{w&l`4cOnaP8#5h|ieJDzJSoN3PF2i7wD@DxB-(YZsrn$lVOMKE`b*^aG*ce)uyqett=e#@yHy zwOs*y_9)kMf_T^I{&Q?!hmX%Zso$?n1%HZm2SDTfCw)I38eXH5Q5)ypkI?%$D{c9H zo$#219}E5l)Z7&sf8Q|ImwUx9=(m8+fx^+>4~=V1yF8POL0k5WhTpq<8$O)>9G@oe z*$H?*;lu;LGvRrGaB7|kp5L=R5}xb8r!KIcv*P1@IQTf^-U>Vjxz__{y?87<9})wE zms0=c(5x>$aT|D_4--p(-xiL~Jk(qRnsMMcwueaL z`knukG>JXo$@<4&E^)v0&k>~t?;*jv0oO(D0pQCECl(54JokeqU!&kS%#l9VdVP2{ z2c9CFU|&`h{dKLENt1SKBbRG4Kl@>?*{JPf`12me@4sIN&$iI}898Hh0yGZ;*Mxp= z@cfw~KZ_+^lqO^HKI*&{KCU_ay_h`ocNgPh-{UzV8=lFiTudl;i{yCF`@8gLI!m0B} zXch^F&m42ka^$`QeMj&-A9DP8Ppl|?`uGQYUJ(vI9^=V5rrNX!tWQBT>&7=>4->8MjBluY`~1b2Q$=<9{ynrviVB+`8a7 zKRq`Rz6ZsV_xeZC?r8a>hHZtT=WC}N|C7)z$1~?2dtHKd?}z@p!rz)1Xlo{Fz83g2 zX;Rx2;PbO;uC)Pt1_~$m^N{}exA<_~-3CveyRw&ZEmwu-Ccr!!+y|boC-}aZcD)u7 zH$d-kOH_gW0qA`e&2>2pd{6M6p9$Yz5`68B&%(L)xxOEfI|R8rC$Nt^A2yagwOxmL z`19dMK*PPOGuraco@J~&4-?$acL6^No=ec~<={Pk5*^V;pU)G^!PgU?8g79n_Y;oo z;m92b%(?1)CgGpA%vgo<|La1-y>}e+d@h)Pwn~&6&mY96e%BNJBKY%XLHYA({`tv- z?>mVez&&x_JQV)?o5g%j>7(J<4|@M@LZS^ce($NoAn{p`GsLGa9Z}CF@EnWW)$lwK znu*{&m*UC&rw%mU>!LXw?VbYs0x{a+8L}ZXezr|agPyP9d!J8uFHHx1DGiSVZ5{rR16HcAHF5U;ibFEzoe|q*tJ=F`1Yw8W3M&eVa`<^%$xw}ID z7I@y*UIWjw3O$d4&s?EaVBW`h|7t2t`uiPfI{>+(fc<_o@!Sw&+gzH&3BV@{$Di*lRt~xMN|W*7 z`;4uHPkG>#z}E`Le-LW(eKUL$=$}O&2a8W%_&1~PfaV?Ge(>)C{tf(%tyiEq4x0MF zdEauky|eh#`5ZJ$;kh+!1?d%o8X$Yf8r`&o@u*+uO*ze{LGS|k6+VB&GVr5 zSt9&K;GYt9*w<(81lJnxQ}#*tcT7^xBJkX2{uCe0hR|^Ro{MX=0vg|=6FmPk1Ml|) zjz7=9lW|?Pkv^KOfxWLLu7=N0_}>T2-vRs-K21^oG4Sb*+-e1O9W|gC3e3G_6g-DP z!};KAl$Zv+pEVMmGl|cj83Sz3jL(a}HIVD`TjtMg(D-jKh3B5RCp0|!oeutM)KCZ4 z;!SB1uL#F~we+d;FlfF5?gRW3{O15a1N=DjjfCUBDX`Z|!oSyJ`j4|@4Oc! z{QGh7_nAMz-zh#1e7C>(NAI&r#)QAK)VJw;MOB4OU z;uF5lChEa|C)B`as}118d*WR9_^g<=ILA%}za0K0sGob+F{sCTS3G%5*OeyM^dZ!6 zCj4Ij|3%^BKKnJR%mKe{6aTlM_r4LH>&~wsC!R)~uOjz$)ZlYnf@g+Dz;h2-37_%M z@V!92c2b+yZ~DSLmg|>ip>yELea!cicI37*dp+;hBM?C)##AUqcU zdk;wsz8~fK9su6YkJJQnJb6!iM7fF9$n}^c*ZWo4+Fg9c)AzCj_ig_!YI4`Ye;WKN z7rEAL3m=YWW#rxp{5t$=0`Cb8&$_-ZCwQ&*2LCvGE(Bi!z90B1z}18^KCVBp8~Vj( zG5)UZgU~cXuCGO+nsCOG^ON@uU&m;6hu-^V;%)GJec&*y+0@^<_+FkrKL_8}^Y2S0 zPQmZq_SEnHChpMh|Hfy${^oC@?XhM2!{SqC4gHPaL{@5yaIk9 z{+{x5@aF=54$VmL#;JL_G>Il^EBs(-GA7$X?{Nr!oN(6oXz&lg^A7QerQ+j%ZlST) z1H$qA33yNB_69!#Z9Og=&(l?Z;xXjzjWKj?!efcnE6VNqjt80pAP#=fD*(K0~2rJzGHkG3x0F zejIW?0sc_>)N=^ha^Dk+fcql%Rpicu=2PK}=kMSvfIm$*?QVv4XF>l4{8vCfA3j{C zU6Jd#7k};vJ0kZa=(j=*TSM~*G`FFiG2lmtPjmvm3H0m0|8!{90KW|%j@zH&GoIJO z^AF^{E}Z_p2|N<|JHbDS-1p%B7WDO?sg7K~UqpiYo5#vEI3AWyVi0gsc)ozPx`|I8 zJ43$~{NvDn3!klk7eVtW@TTy2UN~d*Biecs_yK5+g+K2{mxKQSxjz^0cj5kDhZ;77 zeyni%`y6tAgMO}XG_$48{^q?RJnv1c{{yr&9Jrrw`u+lV@3)CDsNr7J_Nz2$*L!Sy z=0HCQKJ&oe3Vbp&+$Y`N{BCJ4_%-@F=m!FGU;P<1>o0j5;VMr4uU6ZxETIkv+-O2-s2YjPVnu8Q}bHzqkv10`v>?#P$z5fIHau` zr4L>geD*hgt&jLb3+R21Nb~}~8Tk8A&uhR3qpcReX9Ir*e5-K6{YtEYXL-z-Q^0qI z&rtE{@7wU<*gge~&qW#kcfp?nya(D{jpxM6q)D`gkN4H=vAlMTQP1(f`=Twc&4g=C zUwXp76dFD^-3U+DnSSvZs**JEJP$rT^Cz;V{P_UXumN&?o{10lMxQYf_DKvwuGe*P z4-!tDp2OjN#!EaeO=1Q38o;&Tvp)1bzr~;XRi4r8y9(!%iST?(IQ8(^llS!3p>G20 z_xnm53cM?78w{TPdK&x;=~Kg#xTaj!zK>+Sy@A|=fPD{&&#vNwYoMMBpq~KEXTX!8 z`51gf@F#-bT{z><{vLpOssZl-eFJz_fhWi6TWB_g<_PeWgj0j-Pv8HA3IlC!Iz_+;n4UskhH~d9*R2Gl|CAtyS%p~d{&QUcj2_leXkkn^uC=~ z57=j?f9Gm^;&}x$ON7I}09+pR(0>dxL*O$SJlEGY;!{Hf=+6f~4Ve4P9jZC&dK_{& z57)(5d9O}i#Ak1|9{y&n=0Q zp}8Jyy?}mQ4xW4O4CMO$>u^mxS9FDD1w8#+mg~hm#Ak+t*Gn`5bT+WJKYtDNe<)9L z|N5Hr{@<}0x#i%wIk4wa{MUhJ4`_T&i>8jS{r%AwnyJ9mflmYOBb?mrfjth1Y~4{$@@m)8t8f6n1tNtfn8hrH4vVxne&RZEtEcenF8$f9=;~pS_Aw8-qUgw z>i3?L+-1PO3TJKl`6!y+;#2>F@UINbPPnFL!jpUNZ^-4ko+o|ceQDBe3HYPn`G#=n z;W*C%KM{BYa%%zaBAgfmyaYA$27UnbH-_H(VS@A7{Y_uSOOu)#0&j?1p8fc~sot03 zGaLH-!E+2-N)!Ew(D)3Kcog^^X%fEHiAC_K2A=!UP0;)VpL?Kx4E!O`doN0z?t8}P z7UT{^?svk`9}m12u1Q)8uy+P{te-@<$0dqyz(9%{foe3f$tJdTnBz%@LrqoX$k&N z@EaDqb>4>)uZT~b!=OJyd_0%JlWWuW)`VYQivBS0+kwAQIBlJbc6m?n_{4|zXwQcP zuSMSL*k9`h%^C3FnyL*=XVmkY__R9!ny$dS)-^G=M@o}^c|VCyPvkz0_a~_b%`wtM z@3T;195gq=$M>x0zXJBzIB_oYUjQEoPwq>#!ShD$rYVbTyc%Kj7 zS~&4Q;pw(^D6qfQ9l6JdPYqq5cYhOqqA&JLTVB8R_UCPpyBziB+1Xy6lNq-b!imbj z-GRqJe;)W}g;T?7@Qa~$J&6wB%L8-HyajzbV2^Er=O|yt#P+~z(0A`S>F;dusd+2t zJKrb=-z6hA-w7td0^Bmx(p!c;)@XT+0;v#8M=dZx7Il=py&+2LS9r*j6 zk{BvJnp>gS0AsQe{1oBT@F09TLqmNBXugJ~BludteSzP{&)01!KJ9ufBrb<1$7cq3 zUb~Hu`-L>|90*2G;NANrnZT$w!eTnDHN8#`K6FpJ?v*5XY{Vb4ic5SKIo{2fYymxTU@N9NC zJR1uqM#v{^d2G|xk>$mQBRP8y%vJw_J@`+tA#aZBt5PhZExc=)dnPIx`$Szs>o zuS5SP)>j+oeecNix=T1Q3fT9u#3As%4}5p<+=sdLxwmty-a&06fp>;yFSO;kl$tMr z#`|rq#eC@30`u>raP5@9$M?|qtO8#jKE968u(my*@jf4o_ru^jfu};>1^5W$`aGZh zjzDfr=r@DLHKZ+$iT}n>;$2|w34Er$RhsxTh5tD4-VYP2&~8`Z#02mog)0|dxE30p z=M!9m^N{PgnsA+|?KAMrFh2W$e+YV>v74jaJE6H6xxW7DfqL%KZkLy1C7Tp=W5pZOQCnI{(Bkme-+s4I(!K{J3<^Py^>=CFolK|B2ik z3*Pm;4Zg4V)O@ONYWBJg{}c2_6+Zv!Pl2sl27Y7V__((Cc-`i4k?TDz zxjbv_4xj0$=R4>RMZ5RHb0Bj20Ivleg4}k<{S=z3gfkB8OGoG{3P-aJ_%q=%2^#JR zmq5Qa@bAbS4Bq}}>lyHsfjtKjjev*CGvn+%C&9nb(^&dwsv~y?daA>KQD3`snMDxI=t$4=L)j&ihhg0Pu3OdqkmkKL0M>o$&O& z7ylN>T?%af)Ybr=z6T}O`$q1GFNsg^O!756xj&xEpMoWI0a)dud48dhOl9|BL$ znM8Bo!O~|uFN9AwXr2R}FC0D3a@?cNf&Mq(F2KHD$LDuk$0_17KAiLGA(wv-f@g+X zpjnA=n2dfs0?p}Y%lFyT<8y3k;MjIRuKNXm}ra7W@R%b~t$cZBYL$iNu4@ zOa=D3NN^wC2L1IuneaSJtPr32hX7C1nKR>X6J8^|5J-m`otfH2uI&l`ovyn_bzD?bKp4|xHj}JLjOGQ`p~%D#2U1F zi*R{;!5^nU(?PhLIDfPSKLWYO0lzA2t$oIW-vB;6;p1HE{m~5kZNUA2_f}t`f2`pB zIXypYQKq?DIPop;1ZZZ+r@Tb|I2!(Qp|6iI^jxYStv_}UpWJ4Jrkr@sEC270&*c+b z6a22g=RmWE`1pHXCH5De_!0Ug;InqDI~x9{0#k2I;uo|v5qt^oYtp2)$Arr(*&pqt zDX0JaaS8OlOOqHS-dcb35RQHkGy}lb2fji$QAhgZa*cBioCeRj#dUH1&)_@2XA87- z9q=mXn}fezxV-%Q;XVe}5noQ6KipREJmEwsc=mmYaua=^>4n_k(5xq1UJ2#&aWDAa zid=uq^DR*yKAsPWM!*Aw?dOl(gv;xHfAkejbSr$UsVF}B8-QmCm)F<*u|WE0rV1x~ z9|`ZhF>$kS_zeoZKi>-cIl`HT<&n#=+68*vJ27JS0srlU)9%^e z+W>zG&*AXdQn<#{D=xc+&6#92d%i6jGn$^IrznmKO$B@6_)Z^=wI9VEp^;<)~A^LTk zaAIR<-YE^M`=Bt#Cto=Q`U%1b<8u1MA2)+v3cRMY%=1O@@#j3``RZ-y?dK0)-{=n& z4)6O~@HWEH+ykELg7aazGzqW$L}%cGfG-d(Cy_s{1%Fj(S-U%m&z$*2IQ4L^+*kUS*1D16 zlUsteo+vc_TIW_}ny(--`4DKtJyhxa`_xLfI8*j~2@C$14r4Yvy?yj~I) z3Hv(xV<+M0ABJWl;f&jQrODLax)NVbpZen^;RK&MyjMrVefT2OpJxHtnnJTe4@MWqe!83LRX)-3>ml7|CFQ-rZ@tkmCZE2Z)x^Of# zrHRk?;EzV`T=4b8C--jg316e|Re{F=?;)Jn71(RDoW9@>?mxVzUm#8DoF?qB{t@`J z0_Oc_W~tSGg=>q?W2IqBO7<1DpFf7e=l+&u{I#; z{imEh^~ayWiQdTdnKR+DblPnTzNvV7_~T{pHwlNYA)H*_a}(bRM{|!fiOs+-0Y6?i zK8Fh@w*m0g&|e7L37SK|`@WngUs~qr@k#I=Q4xBc$-O71p7VuM=cn+wPB@z1z~2ep z;~&ji;^XrPu*WJI?*qZ!4})(7?{%7(B^-^<4~a*_Cp>SX;r-hF4u6ej5AW^KbG`Un zn)tD_O!KgC;!tS13#Y%gL&N#WJ$yfCyzUa6C1!QrwS*$=O;YQ@f-;JID9@Aj^=S_Jf7j75>9ZBstvxo zaP;&4#wWKw+L|Jq@ck%pM`@7$J|nRA^Y~u|{$gO>%Wg(n-3pDz&TBJ1zJKMM^A+mx z{VN*ZzY@;_UoM<$@w;&JJTrI=CZ-5SUr9Ln7Q%_%z$XHGZ%pny@WX`TBKMGbx~u2}Ndhv$4W zoIi`ePXMkhocIK|m2i9-wkX3R#HTjD4iN157Q6&w;yo}t&pF$Hzg;+O-6NcsiT-Xc zKAN7ue(%lrd!LNP^Ev!W;4cNfSUBODqdx-t(Zcb3R5+R|plJ?`pXHwPuh{-&+N zg;T>T&^tGLYvlUAkmw*B4cGPc;uFUSN8__`;!ODazML2=KDE6GJQ$j-f!7s||0wX& zl$+>+w!B6X_dxR!G@OT%pf3S_1i3ZErv^T+&5|a4>5tqV$o2Rnb^*_`O*8Oyf$J+b z?S3KNZTWMquk)a3C!A;sJO`f5#HVJiwH={%aGe#n$+WaO=3B4Z|S3XdH*u} z8F=0=&Oz=nwBgkjDpYC&<_W$0{z3_dx=kNdxCEceN|{)lg2f8EO^g78Tz;3 zQy#qctHfGpJ_YY{OX_(Ayx-G1(NlcJ;ZWhkPQbrIf1GeUUjV)pdY>7h@tzQTi}!1bg_JwAga z-h<{*;rMucB{~Wxw_|Boy(h5dbM%`-UkZIY;fhM}M_c5UE3ke2dRO8n`1CF%n=i9~5`~7|sA0yZEHn|?3jESFN!#^(U@aLUNjsA+K zN`v(Mdg0`jfalriT=9egwW2_y)A)c^jYafPKaYe}Zt@&Di>DXMyh}|L8fkBf*bD4dYO=pEncU zhvV}Q^asO-_m`i+d)}tbytll4hp4T1o(j*8QG@sJ?qo-^Ua0g1;I1!N4no<9Q2mxkh}AqFE1`y29c4-tWGL<}Bg&m`!|A z7#@AW;w`#zgKt^=OeZUp#!fLj53{U*K?PMut*J_n{P zo^SpBjfo!c83?=v*kh9Lbx(9J4Js*dZff9KTP02S!;w1%_#|mkr=LNBUl&ezt;J^# z@xe>sb3JO9g+4BnKG7BUFyuZ7|6{?g0>2x0zLy}^cvERI|DP95o!21Ob0ARz8eT`9 z0epT-w1ED7^wHy)aT^8A2f*Hca-W?lKG6udFF?Oc{?YsIO(Zy%xK7`P#?K?^JI{@S z#V58yTh+uze=hjp=%b$_qTv~=58C}1dcQYsqPB7qewNHwao^*6KL3H-slw5FpHB^a zfv=M$JokZ%q;dFb#?g2##d8pN?}v%I3f`al8YP;Smicg;d9L$bk+%5$;Rh=>?RG(1 zeuj$P^FNsW&!UEFq)+&K5+q@0WD7>Uluo5Q#a~I_SpISoY)7s8<&>#%g-R`qyLUc#_ew8@*M6x zHX4qPpO+IA;py{m{C%Gaz5%??Z}xP}ym$M4l<-bq`Z{hQl1#@{KPNt*;cvH`^=fX9|eEE&vtmP!G!Pc;U~i1>7cL!*u0B;YU*5Ey!iKh$f_I&S7yUn24L42ZNX^_6ZFHOe8 z_v_?7irhNzdGO>j*J|W)T~`8s5(;~R{@_^=#~}+I5e3hB_AD8hA-(@rs;c* z_7r`|*ZaoP%J`Z+%Je&QE#s#hU)I(}oy+j~$CYX3cPit19b1MU2R;zEhV&Wd-l**u zX~K^epJ)Pnr*QgS_n0V3O2#QSailap-@1?XiN2?B{JW#AA%)&Kf5hr}}Ie-NK~zCrGE;dPYYkMo72S%Tavkb63ETcfQl zfnOC)AIC_a+71GL0{mY&Iu)0c{09Gl;*;A!xv7m~=xdZ%9~##m{rB>5|LnCZYG^G! z8n*iu_`Oii47Ak^ZFvmiKQ%SU5FbB%EjupO4^kDEO_w zb8g=zO~!l_`pdaGQ+#URwO$QhfxYe$jfCUBwQ&0Q724ezdrLL6bqhSV z1@0r9SPOo8@HfMMpm?^M>wW?F3dp^*sKGgB!KW2!+ebK_^_3gXh0wds@b4hEFWTAz zK9#_iLvB0abybT$JZIAG4bXokpTro{@L7kjB_%JShH+@OhUQ5;*MaB01$G~nBlk<; z#Fg;bxtNo_-bSOA^Tbj(bU8ITUDB!h6 zm3humZZuq*TR_j;s^Ax4Y}cT+2GS(92fsgXALXXbRj8paG);xmFR$6u`6cw#p)Zem zu7qZiaD2SJ5_cf?Sm?WpPi=cb{~9zKs-9dI*N~VmO=2=|2WW0pZt6J-{9ND$XzM3k zuf$+zR=|IE@C$@9R^tmFw|6%9i{V)xxtGE7BPizLwDd0zfuOXb;HUi(Xz@C3kLUS%OZwn{dKyx?htPQ=_X4-PQ8S_1$ zIR%<^fS;3Ru0@@KcmB)Btt^~4QJUy)6rXn8cVp)+6VCcNs>uCUj&O1hD|q`(LJj@J z=j^&deEM>h__XEwLVW4~9}Ijq^q;`LD(Y__KAv-ccQ10?#y-g9JiJMK;#=YLcLU`n zt}Q&>hehx?A9Y>?zC3Uv)IR|F>)_v8`i#}7!tRS}egHmggcCE`myMg}aN%;{3R{~!moa^e~Z&j5R`h<`2cZ(!U!f6|w8R8Qh#^mjezJD}#L;QxX6jNvroUWIn&f?q70 zxCWY!jx4KZ4m9ncSzkCcSB2*f%1wV~N|Sn?h5mQw$AI@dw5Rj8M7ty8nV1NDS7=;k z+Fb`4*0Y}Y%+LGb`4n=83a4KSq)+|5pjj@Q7zJD#?QRa<A2>wXu?}z6)(5wSKz!xC59y}*P^P6zmeFuDH z(*W~qu-hFnRiLt^NlO0jpZRq2ZMXvkY4|oB5`T~3IWqghX zt}FjUd+0gOF9m-TYPb^pI#WK`XKF&fv#|T(uiXazI^ona8J@QSpD&yk48A#X+X0^m z{F!iKJB;Bg(3A)6CI4I__bV}3n(*hrvtFThAD$4OzOO>=c;wzHoc_AD;HlClcPr?J zijQVH@rk3LdAF#+_3>Kpx-WxI2k1XMysTe!;O{Zd-1|tHL|yTTm*KMzd==p9fZfOR zwWOxvo6{t|Bm$We?vGmbcX*V;KPN} z$Nk|sPkeIgL4O?Z@4ycWC)xquf_iR){#Wp~K>vvN)YDUZaCPXbLVqkg9|LX#O~rzD zeQTkaBG1I0;?vdw@UB1M>zlFd0o(_*JqX+vo>zfiAGr?-XPm1DC+?R%_1uBnbKtoF zuGg2)90yz*ZG8a#Nnp2|wg!oJJ^s8ca(4zkMVjcZK(0N_dyF1GtV}aen#5YP+qO+u zy*3U_lcEOKu`${`3Yxp1@jTCU;W&2&-%&X66xw|cn$hBOEhY)4k2^ra{ls%J`jzl( zEIzrvgWnE56M^>wz8iQBa6|ZPCO+Zyp76EHIDC)#|Ac0+_-KYgzcchTp?@6h9#&|a zUl+Lt7JBm+B6lz}!-R7lSONZZ=z9TI6wVlWKBVURG_Mk)P}?}+Xu85@eo?c%Iza!O ze4^)geg^&s_^d#?ub`espnnPeXQQ5VP(x+lFQC5%J}&?t1flpuIw9E0FEPdiSal1@`q#yPQAM@G}^d;L`;)>?1z?-4&YF&>VvLj|IOw_}!7qYg7}On^Dg| z@B>gosc>Sx^y$|x&{qSV4Ln^q`a|K#8aM~OgMSs|-VVGi`ZY+r$I92BHgY{@(rz>1 z#8%LZ1mB|Yu~&ca>!R;(Ah%SS`1ci`>vbD)H-_d_PlzYlV& zgFgsk@+~|^!RK!A@wo!{2x-z6^TC(Erz!Mf;MoTF5$GQhpLM~xcNE$>0J#@~-vxL8 z>gj|U`arXjaQZa`HFP;7BU@537knM$4hDa;aQg0R8hjA+mqNd_aQb+yG>PWOy&AX? zeEO=k_`8PS?}Za5fL{syuLqau7m82cYe2tu;bY%+@O%X|`~-e2@Sng<(XW#*o_jzu z9<`k-KJ|G0CMtsOfZUCMs{`+h-1%s?BJf_)XWSkFKO8>gz}JPomvHKA1b!Uwp~4CO z>|FG>!gINBYM2e&9r#4}G=~3`;J<->Gid(AwH_-?Vy4Dt+p_4E$%pdEWd) zI5jr|-W}~;fZR5~`$O{__>riyE%+~;RE1z6HZh>yO#mq0sJ)Z5aHCk9DFxQx0?fQc62mcqrj~1W#_ObZXwh#1sK;II4KjOOr8a1pSe~t$@FP z|4-l_1^yZMO5h)rn=v0NoIZBM_{@fXL*+)lH+<>?Pc3}h&#&Q0pPi&nTXm6pkZ}C# zq20Cc*$4V_;nNJ7UeF8zzZLXvgFgZK&2inI1%DWFe^PGZ4dAN^?7q1#xsInnGa8-` zgZ~=-TL@Jg-IWw&1^&KK*(b?Jj^%bKolQsR19)lZ@MD(0>lkuL`~E`yTuNcs>Mt zHZ*U79|hbJZfg#Yv6GY%&LcR@YvgcCEQSy!L)4SdEy&w2hW z>bwk^uf$i>Ao`;+{J9nm0KdN4&GotjK9|cUaRhjeZThtfe73~+Kcd|9*LzX)v!UM_ z{2<{(Bj5$C%6zJUZwu@_Ep0UxAN(h3@SI6BN586r=bUK>pPJBfKfDaQ$13ga1I&G( z0qWcinnA)DpXtD#0e=L27u4qcD!Cr##GBB29;UYA#V0BNdmSa(0RJo;|Fz&Z1Aam{ z{!5^r0S)mS@GVjQui#G>j;DWrD$yBu8Z_Sk*Oq7IGuLt*?Eg*kRGG9Tp%1vyA+&zFFh5vAPJ_pUF@ZTT$?|^wtXCik2Jc);a-w*yA!y}}rpbq%sAb55_ zuIowkfc|;Z_7-wG31@t60>7bfuIV?(-5Hvnz_T9D)#UyFO#|^2RGdG47N77wkf<(A z>bVVVJqbN)t_01+$UPQ(Yv6l?Q(HCYn*n{Kr7gJ?CNY zz2Wl&eCoo-b;gtT!Slr@K7{9v;5}A}WzwvpPyE4oI|3Tdu|xxSe$}$9hHBt{2VO0l zI){OOPoBA^i@|?K&q7l{jn@;7Pip!5{})1YMS-nZ7yP&KPrDbQHqYVsFG3A>qc&cn zH^ILLJOTJU_*fJFGk~W<|C98Ioy1qrC;qrX*txE|5$gOw_@AONG<}qtaJvcr9n#cu z2zcJt7NY*M(bl%m`)`cK$L%KGhW~Tu*YV)1qRvv_2e9_z=l{3Ueb8gzkJ0eC3jX$t zW|{cZ=4Ybd8{waOvHd?1pWL1Cnt)%YP40gBUUr3|2LFyj^dEMy!(Y*8$X{pnb@b_$ zXP2GjK02)oH$J({b48CbT)F#So^E6DiDmk3_opJhzJ-s+ zr5|#CM1Q*!^;q*gG((`dNqp*DE1YX_gmA{(ds^^0{{bJbw&F8gnuPZU)}L|fFFv@O za)Z6Tg4@EU8T#^#a6GRnc;_rdzXl7(r%9pr=beNT{h+xO?H*lty3Yp}H8^)B`0JoQ zLpbB(_2}9>79YaDr0@}4@-Xz@!qaOZHE$+9cvj(QUth1pTJ+cVm+0q;Piz7GV$^d5 zG-#Fu)lVa`jR?3LUXckYJOEdi81i}9eg9{)7IC8#=Z;1ryky;2VxA@lO{F%q}=Ge zu7khTy(a!UDL1v1icfAk)KFbGnij$d&zbmiRa?<`?uDO$T#o1E;7@{nTi|6FlQ*Hi zSvc`5_(!Bq{qKT*o*15^!B0`&6TPKL{ma4U{Nt}3g0{|rei-~ulz-w=@fn}nfsY3s zfwq+3x#abA(@dZq}ktN;B`TkWR)o5UwhMO!BeXRHoHol7t#f2gg0(%gg^ zxt@@~c5Ahl2YUs-Z;B8UA z&tUPtO?+@w@oDQ1v~`bgG-pBMIgoaJEfTfR)(_~5`xX6Ecpfg#T=%QsU%$|}rjt?U zL1=fBaOQy5QT+E7pSW1+1Myh^{2ly#&WXn7 z!_;w8}`d!zn2s9`qr*Td%{@yY!P3{G16x~)I<$`qK0|mqnQ9rW#y*+UxX8`KQ(*L^jP`xZUy$| z?t3(Tj>vd+fxp*gVg>5q{3)k)7%U$4REbNGCu z_YjNcLe$v<{?7=fo;`)5KMnpqBc%qf!NfVhe%}9gpuZPDa}R23Bb@ngzBFlfqHx-3 zf*QQPMbiQr?%!+!>EpxP#n4m-en9$!&l?Hj`1}49ydC%^1$KM)qt07^ea23% zpX*cGB;mw|^2xP08vYLh|00}N44=$5w{Za4dH|k2GiMArw~x|1No|Lr=0#}hG~~K3 zslN*9|3RAYKIaE-j(R*+;lDszN5G%+c{upGz?T8<4*aP+)0fS~2frddaT4?!0sn^F zLBhEfTf?WdaH5s^{&LqADzK`TuoF|+yS)$zVjl`#Z-#dZ_BG=D= zi4owrSHFaM#-Ps6z;hoPqJE_Y?+J;qsLlIW;!*ItrhQOPWB6<+ocG-${Jhoe6$_;GWPt zEk5xDJl_zXc6o;J+)nIRVC(#xn;NzeAABi1eGbVSUI&^>)Rt@Z*FHo&+#6reo{(6C z`^Z%2PX*q$sLeTkM#z}FEsfjp+3`qddPtM-no8d%l+qc@u|&wOM>U9+VV_2?aNO;#D?7b+s zqx1nJsPIDxBK3NA76wn~F~~g^yncOYWbTS5F|<`$;r4fPY6H$0PS;@Y}-2 zXTS8<>pF1&YU@CMy?1WkObJyW$_gd&55+5JVAD^$%#{-c2kmhQ_`(!j1!Dl`6 zw-V~)p0=*`nY8;9#%-+h8Iu>#?)}n4f1>y;RfNa%1mV=MKse((N&3W<;1>d$Pi{@{ zzF(xR1BDZNpua8AuQkZs5c-wUq#i$8CAeO$M8CGedu~?(9)vMJ18pr(Zv1`rNX^_o zeQpWwzC>RIwS5Y_44S=!Gd|u|b6s|Z<^f=zKcjyOwbd1$_z?IS(~wPWTxxd{ubP z!?kMy|7YOS2)Vq+c?{FXpV8JX@c9frKS0wPp3JR=T<<@LCsb$p`#L*==zV6+_&g1NpWhN}%jb<;i}vt257<7@urFQV-&r{Q%4>tpIUYV|qpf?T zPrL~q?hnnN@m`v^5%>Y*`d*V7dI@K&4ie6o)IklibuGgCjA6a=4=ns$zwgD-`0SMM zeL2CiM6<%*IcGxeJuPv$G^z70^yPBljPnHGBcQpt@V9Op_+2oszQ%iQpAO9;2TMbY10Ud_1?Kc^RI+Lh}^H{6X=lX9Vyl)O-niyspz$ zo)KKzH0UotTVJD(OVw_oHT0d}IkBkUo;}6q8ugH8;w>fS>xP2&IW}<*d|m{8 zANsb^r>*bAC(aN~J=3AjzTy7(T$g@LK)c)%d{&8OE40-Zc&u>R^8OtCNa66=|NZ%g zn4cY#8@>0X=!YYBBebxnoOKU{eqZ7Aac_*nLCE!7jpjXR9B%Il_?#x3>wX+^eLqe3ypcKw z3&(Rc_?f7|^CU4B8eY?#)Zg^04RW6={N3Iy;!|7YVw~+;T4-EH?hD2rNuSy-5YG2W zJr1e=ckzjx#mC>{5Dm{EH-W#p@VCyd%cZTI3T)o@rttQUC!alCTQna)vjgUm?^zk2 zgA0x8o&x>r@`?Wo_&YD`%U;me5l*|DdzHi|9+6MRWPRlRB0g=EVhpRP&a9D~J*=Ar z4d=-X;9H0=e}wZK1(ao(?}(_ZVN&TWyqM*4*3Vf@!X<8yoJ zc~95t-x&VKK;t=<*d2Ub)Zp>S*z#I;0pDBtXuR)bKA!|lf7IY>l-OLF^u^Du!5ct7 z82+~jC*F`g;qz+3N!|rnA~4ckIzEkFBHyo>8o7NTVI?$juDRj zAZb#==V*6bY4;mwc7^5~_&kHQ9>coWUSkp;oZ>uYGeHK}2>G{INH$77qCZ$>@c#i!20g_CZcNNp5@L1lRbE;3 z;HB{4d2+b;)ZY`DAB0n9MYWrH+-~;9ZFm}iMsaZTO##G~>|yDuX5a`bUd(XQL8 z4gLG_Og)c5&$;S*Q0o5(HF!)C;XPiSGl?su&lp~h+Wd?V&wYy8T!;6Z^d>{{I60cX>u%3w%Rh`riTlmeQn#D#95b z_t)58+YFlK!nsC!gFj3-F&cfZ3BD=x&49NOPW>FiO3>6&&8cmI_+X!%QvVvQN7v?g z^@sEc?=#Wl+~xc;;rTZ7wc+V|LBivl$o<;Bb->R+?uEcB_4jwu$9VYvLD)k)Hxk@q z-QUE=(xmTQh10K1r3t?m_+|2srZwvEJPGgpD!JYdQ>VuynD?oTFeZBf_fc-*68H~C zJx^d9-cfC7cM&wzFeZK$h-ND4T#UB1$MwAnd=KEO;d86_^nJ1T%;&MfiO#@n3hbO} z!Wokd;eW39c>W4}k~FD*3Uc>BZYS}HY0$h5{D5$LDgoD%Pxfukjl?SCF2#6u6rVc1 zcg6EQ;f%w(!ikrFC*pefo*N(EyN&Hdz0aJ{cr7Hpl26)d2~W2h{f@x<2&c{g!U_M4 z(Oe5(-{9?#%e7e%WAzMtenkzJgWmx@o}Y<}g;URLXnGX9`{2DU^$ddMKD6b2rN682 zchLMi6`p6vpOhPZr=l&lVgJm5_ zA)NRE{`U%}{t3bfUh7|=nFP(z@c$BH`=m6f*?U)Ff8oqA|E=4^XW~=CE!ew!PD}WE zcFFw$KX)+(zk9p7=U+a~8K~dqO%3fYD8upl@BjZDf&Y%ce@EcIBk%{Bar=zF=A`+`|1@Ed;5KgQR(6gZ)eBz)Y^c9gnpmONHWPkr-yZ){t$q9a z_4Q#%`v3Uf-{<;I@jtcmpK{E1Q~jI#gJ5d!zsP?Yru6GV;xhyMRN%_+e5`2K?QJR? zAHVlYFn@plIPiYop=fpmUZZ_4@xIzkoFPs6<@YlQ-be^)v+d(I^M-Yj_y!SDT&dicA;yQ5vd&r;gj1pZ5aUqV~{{lv8UuEr<+ zoZEiyj_@2G|6Wyc{rmN4_gvxB?D=4gBky_QuRRFQbJ4G};Il6@9~M6L`cgRYl5!Id zp^yIE?X2rkt%cOK2%dT0345Loeqm9MbH)fKcLdrR0?aXNP~>{NUWdl-ACDN~9&->3lVfn=WFw7ZWqr|jA_7vFzrD~!+e zX!kI*<)1-~r{5DMHNT7+en1UBqpdAb&rjg@0)LJ8#MSVuBJ6P8zVD<4ui3=b;xi`K zL33)6Yh6#_><{i^#=+}4_y~A@EPeWTAg=o}@IL^Wvx_lweVperplKzXw*1~W>5G4_ zGvT$I_((XK1;||`eSBIJdVlUcEj167fBJg|^j>QTU&q8n;?tJbc>D*$=VIue!hFd4 zjW~zz3ARM~_;5{KB0g>TJ^d1Aq1{cTNnd<@6PsYJ^1i$UG*_TbzUR*q@b|ii|8V4X z7fx-zp-%57=}RBzeP52x0B9Zo{}y=rMDMdlJkvk_f1>!r8>qo&yy$&~N$~yjeD6rS zCXJuN{ILsi{XTwKFZ`YEj^a}r_eQ@5TKHduQ^OkJjFsnec%KInV|Bff>-$Uad})Hc zPa3->pHJf12G`o}!5Dv!TXLU7yV>)d&$TuZn)8+G=XZbfga2&Q?EWS?1CNkCwapTr zdcK4Y*Um=LMDKQke?acf%1!uvNbG6dj?&~BwSm5uaAG9zAmNP3dZ>rb6w~43eJSNjG~WUDgk~0UXBFe%I*x(9G4KdnUq7>? z=Evc4y>Ql!??KV<8HZ!ywUEB}xhA=M-dQY7#?50D>@i9BxhDM6!twNe7`_4ezCUt( zen_1kNRwC&p9#ReXC=BypWJ%D7eV7bMl%leJO<2jbzRhO3~*O?4rg1!=_BV!Q|U7f z_o}VL9^#|tn({MF_$`E!>$6Jg_p@QnghxZu7n&9D_j7K1z5)NN>Ipvwyzeh*t3CWb z6HdGD!Sf5@1h4N4$o2g<^Xg#n>Ejad!7aew1%I!R)af}He5v>Z&yYMn_*pOd_oYw2 zDu_?Gt<>-w=EFOv=Mv%Mu0*?6A=h&zZFvpG^F;AEzj>^pITD^HBbR%^IcRG(^!tiW zJ-ec<-GP11OzZ`JUZd^Ar%sPsu2DtkpA(;0gYox$D&g0K5);LzkACj6ziYj-!2bM2 zXuKCCjzB&Afx9EO9C*LplJGN8#^f^SkC#66_&lHf9tl045xn0)s8X_oJQ-;J==* z`|b9;KcvoI(AE&>KS#U1r$_JC6B2jJC)dd5VSD>?zrRHK<#mzV{e%+-BA4s;7u4pn zP;xy!@$?xx*!x?s&$5 z&;NwaT@Kgb`*JjU>8zL-D?WXkCZEJtxJF+}lfFEM8k#}>RMD36Z-f3`;Lm|Q=D9~S zg6FT858fLSXA7rJ-}h6G&y&ITz@N_`m5}T86(65Hf_>gj@QmuSXyR(jPhPJdP=h@a zZvbBh?0aIa#VX`_y{9jJtvlFjDs_Gjjn4q_8Hf5GE_m-pz%F1{2cHbgMUvru{)lF zI--VN(xf&&Q=|sIHrPmf!e^oA=L=`7PLfaXAn0ccr%s94q|VX8sm)^>o_kR%rjnCc*`)97!M4h_}XWV#QYM_Q!;8Pj=?eOvSicdA*73i=3 zK0;!GG^zg?cs56F4Pd{9naG-Q{`TFtJM8P+qHqOH>!JmP)9tA!@ICJt+=>7Uq#-XnI z6^-|qw97r;>nrh&G>MV&iJoV$cf}_-_k7<>T#kAkLOt~h-oAWo|26UET({SF;%3yq zePfG4@0^2$6Q_aaeRG`nj0y2(=*tJltqMKo_8sWUJ;1rXZi8p_U*NN+^qG4PqOH5d z=NhFS{@>3{8GpZ4liY96uJ`A}*I1`K+j9?pA9~+&<5>Z9dJi%0no6)PcpvAwxImt% z^G4}2&O3r{jM{wvjVAk;+w#3EJ||!f_-9VSkI-{mYQ7N~pYs!Up=QtX=2 z>@!mM#u$eg@{gxq2T06Com@vvpn1IT{8!uXZwHO{_QWE1X7BR#^}e0@PlWzl;nd9Y zmDfx7nbKs9__fOLzXS8$eHi$6i)-ro))Ai?ddfd|HuSz;@n0yM7$lrAyw8yFJO!G8;&V3h_fk{OZiT0P{d0f`zeW+Cy2_1yPk25CjrZhe1_EC#oWA(k zIi7xh&hY*@u0$8LmGSR{c6~;5uG?4$|CPWkgq`bt{wSO%FPvPTsZs-9-&+E`?~l=N zEe{u;@%L-*>92nVFR{He;dvkAYXys-@#`4T*DU#7P7UvY_c-Jlac}oCLUJb|_X)Kdz1LSXSD=r+?}ztTWlsJ8AM*~^ zS8S_uk-;3eHGam2V+~;pVTm6B3Zpk$o zfwsmAr{?~}_`B9?3*Puitn2f{Cw|n=x2IowXsiZu6v2}@%LOxA6-LY8v5>^TS$Ms2II+gdrK3(IW+khOXqJ6|8t<{p1ewY zVl~>`8J-@K)N>N}+mY+}ka~`RW*gzmnR}q|y)1D6c>XM$`;~TmjpDx{u-9)i`-AuQ zq!KR)rv`pMu{!j%g&p>K6aDo*pLS;fZvy$@OePIJ?-VQ^uPVPmGymK&oVsoq`x$7uU_#t ze4SIHe_0Ll2bcK_8DIAOlo3~z`8*HJ&iZ}ftcz{WEz^_?DD&yBza5LK!lqazZ0XBt>+Z%u41c zLm|mL7oyCG21GI?F1i$=Od0-bU4CzS-Tx=|gZsh#`Ws<^Fw(4CCpkmKjRwlWSA=+JUx8c3ftTF{Z#aF zzxijE)}eOPHZ1h6c`!1Zr1O_^>P*$r>m_Lz%f++)*G9G}!S50Lyn=VHy@LN)JnJ?| zd6@g^q1id`d(xAqmU!m-t9Zt{;u%+qx5iro@y_fXTNT*1PZq{=w)D(vdi0tSp7#pl z*(qv24gH1D_jh5&LSg)WkMBnCn&A0;_#7X2V&LAwjD}JBr#$h$MH)Qch}yxC*?Q() zKlldWGbVZ+C(J%-8hD^Ey`B`tbD2IH2)~;A$##+a8I8o-)AyYp{L|s{UhrE+-}lAi ze@A54LzrHD!>66}WE&INDg)0B%_f1LiC$g@{Lc=}JYo2A3cdR^4t=wNx9*OpZ6yuo z!l>|BRD8bD`cuWT{+~qcR>F+!gYO!1{~`Dm;#s%5<oai-xjq!g~{g3mnP;A4at?+cUdw!mIbY9}ZU{&mCWuF(7u{ELzQ@xVt) z!|?Hd=l0Stt_;3rtmmxoSv@o-1^-##8p6!W>kQsDGG7?_CgRC6IC!ru$4`4<)@0*u zrDOF!(sSI-5N6yUJ^Yy92db7{m#ILtRA&_ z9D2Xtd3B+2zL&dFsprPx$u?Pe7&nFIjF{KY;u)_9lkM=(zY#u-g6BAQO~c@?4t-Vd zmj%CJ@YBRIugyY}IsX%D_)BQ!Ywql$O~pHlZ@(lS&x6&AHTgb!iKn(_QS180gyFY{ zoa;vIZn3}C7SA{My%Vis2wd#-zxco-;Q4Io>}U9uXsl7@SGby zs|%C=o2d2r!~Yc-b`6ZiJr)Ijt}t`IDexci$Fr+=@SDM(6n&?L=Fs5h2mUxThe!VH z#e036W3lwC)kESd#Cbbjn4DV)ljok`-xQ|y0%68c>c#jaY99@JQsnV5fd33(JZlBt zKk&ftKT`P_uSrAZ*20W8&M5is5c*5xL*K6h_X(e=s%4xQe1piaENXX(z9T~OtFY(g zeAa*`hGtUWTZ+EUw^W#%4;DVIA14goIBIJKzjNqUsc(hqy!|Pjweq=xPq)AyL|wa%NRSW(~JU;b>88gEFrqHwqzNv666?p3s zwLWg)nU`<>-lf!Qnl$u1NVTkIfANf(k)Pwr_iY)y=7&$a@cCG^?&)p)&`*$_UYm(W zGetajkTBT}lm>i2_%{fBS@0K&$A3Zi^b7r~k?nG=iHCc54XJGywHHcHh7RGsL_B)` z{+yA=|L>t05g86H^!9xy_%ns+)v?gn*XvKO-IcRkoVPilUp@3AgYP3;OImMjlm~zB zYkXD<&8^ZfD#W87E51T^cw=KmpwinO%Q=ZfwC!YOvrEpD&yqzS>xF#|jCZ5_W#52wj?>cYWMc;cuQ(ru_ z--}1TRJG=PdtYJr?*dN_pH9Nod%Hx~bM@9idiVw6@!3IrJx3p7jl%Q5g70bxe{;P(vAsj4lL$lIC0?_F8qe+QkpUqc>6$@@t&~#&A(n*(ri)izV9LNWH`0J)(;i-PjA=_S0iczXSzx$wArzIe~kw{soN6i=^?(RY@3#xU`CR*DCY z3G8(vPk-^?o~mVS-Iv;*LO)lS4CSHm;{s!lFtzJSga0e4#s8Jy&k@G+6k$fA@R=pc1ogz0;RaP1oZY_EssTH;;nF+hD8 zZ&#K)r%BKL^}b;E`#|VBRhZ#p6~0p?Y>gV93&Xbz{?XtMRV|r6i@rlb?{)AT?d4kL zJ1+3wk?k+(>HA}$@omqMUgrs;IZ~K?y`bRTV>e;+{p3&I&0_A(fX{ZqXsoC9+Q454 zqpuPE=LY{|czzU~zZUCY-v+_AFR*<-mk(oSVe+gQ{+9=TKqYFu-WNvi?-?LxRp|SK zzC++A0&f%g^8))gWE>(rz4DqfN<4jghrXA1)^k|!n}@%j7ct%pz1I!T`r_$(fiV1^ z;rYBU{GwvbU6b#<%=Z;{l%8yr(bvxz;Pcv&=hSM^cS7{a>%(5ska- ztHg6WKPc=BuD2ea0R`{-e63^bUs=*vPyP*r>Gf`Cb`gfZFEshw!@bbtd*N=2{larj z=W7spe-53@{wxW3mP*4M`-i4&@cV_2uW4ksTA1NEGS&`_zgr1?fAREsCHVZDNd2h2 zMjFNek?llj*msvymi+sMzcGC`mWKI05k9`2uqH%AcK!>cwbMz?#u9gVdUrECx*T(JZ}n5f9{DfuF$); z-`h`ycf~WWv7yh;vNfzMW$P|~YNtoGJlCqi^IKu`14DmY_&gGNf1ZLojf5E=1%Fu7 zz7zbMz;lJ^dwk$6REvK{tpj63))xEM`@`=!NB^2M?4zc_-tRu{y-yi=y&4pHA8*u- zkNg))ga0h?oJVcMgSQO-HKKN>@H}4_pL{?3=8@t1*zem#?Ge(jR_((7{^0%DPc%CU zGyEA1=JjCkr-aY1(bt~?Lcf>vWS%5F!;e|?x+VHvC!X4FQM*E(41ey%!}WWI=aW%e zFZj&nbBexxOb53PTtgbp_s?QpE5(!T<(Q-21I)Ar1N$f^Qdmo=4AyXQ#@Nf1hGr&g9QH z;OWmVFfP-3r{VWJwS?anW(*Jh=D=fB%UpbXGWSW9CH!1u_W92FbwQEAy)P7x&sD+< zKL2G+e#Y~b$nWn(VdQ(xHx13EaV+`!Hp#F>545*2kaQh4<&Mz$=1Z9R9wJF$RVP?*Hr0{N9ZA@@HQh8uRjNWJZ3!daKZ+ zzO{Jf<F<1izc}#yf%7vUlcVpgq4DSU*)K#aZM!rc9tGKRlHjM}5clV`Wkychg+!LJ_qea-iA zT++d3+Ai>ndUV$4JlUC!VpM z{Lw54pVb355hh!HH`nse_^}U-&r?Po8|baOL>l_u81sEGa`KryhZ$<6Q&<_ir_QCtQ%3Pe&{vHb=o4hEyD{?d^!)HVIoQoOHwKIZ&cb!)9VyTHD^i}cLVdB7VL8n5Z(n3unYpI*MEk-?wkgnv5l z#Hei@yq{O2-#zdsVMbeF_jiw-LQ^}izmJa0cNe^G*Nfve9}7HR#`}>cKU;cd@W%(P zqgt<}GkqEJsv(|ZG9Oz{Q!TtdGfU1|;u-!7GQ7_n#@6B)YZV!MyQ47r{CsgMu)r^Lx^^(;A|GHRd}$d^QXJ_QDK*FEPXC7bBmGZWFavh5qO0 zwMNvA4$W|3GUxN0JQt>fzppLKrBnE<9hzm~c~kKDoew?-8I_TCxQx>KbA8>AuqA|MO)f%|%hWqi|h$czfgWlIFa?OTuS{ z^nT9h?J@D*r_Q>scrr|j+J(Yo7#_Wz4bR%buC=aQdgk?U)czvOy!Mk1p0A3h@89x4 z^IXh#R`i+_y~@Jp^3Yroeg6#p=)hg2siVA}e^dDwdpkrtV~{X8pB3i#uOYqX=-a<5 zC-e2bMt`yN%xhTq%nN>+^vw75;5!O4W(wQi`>1bdCJ9q}T%mElIl^`H(;FFFzf!&I z;qChorOazZ=G}$K+&cKo|Capm$>VwcWu@9nrC}XTkq9|)KP)ACxz?kr#ELtUtc`E-WJb(e4*Hn?mf21B%a zRA6UVE!L-8nEaormUY{#;H|$WJTDWjEzaBhQQJ0Zn+ubzgD~rGkMxX>3cdYrQ8sJr z`AmU*`)Of(rfQDhrQ%)Z&HD@gt%dF3ZFgboJzkWac^zNyzHd@!i=M(C(r4j*;_n$rWOA7I#Rf{etO$H_+2$e)^N6X zJm-X_lQ8>tiu7pK5hmx_q5m}WKJU=qDt&GBud8jma2@^h=3W*0>FrzT$^W`E;FZ#V zmy5^q5n+3{_E%x@`1nD;Ti^!5XzmwwowqB5nd6?JUl97|h26{fH!L*H;cF>*J{(@c z+XO#N*~s%m;3I^oT_H@i(^N~IkL3wJS$)wT6xmj)7X4S@(;+nHgyx-scc#6B8EZ!E zgQ53h1o`U=)5~jU-kG+PzCu5}?Hu}F0xy+@afUFS{e_w1)xut9Z(nQf%(u3DYK!yM zUObwcqjoE4$o6RPy@ctN`*(Zs=sy&u*QN5o|HR+O=^C4CR&C-WN8fS-&ECkf-ytIo=q&j~O&C4J&2%A?9+M^o%ow$$4dHoSAiQ82HWTb#CB$ z!t-_cl&gWa?FxV6F_EoS)V?h}nTP*hJU&AUA7}OBMTLHPdq+H)QJUxqAuibQIfUhG=ud55a zHBF?4-%*%e9fjGaOM-t+weY_R*OrI3FGKHZ4jQjB`1Zi%%2Teo3T?N`$3N|Jld$>! zZ866|;>qUy1@>dHwZ6S)fqlD?^z==9g?QiZ&Br-De+S<~n04!1Xq?a2rShWo-eIM= z?<(H+d-HLN=Sjl&yd({4H8Aweh0$zMtVy|ie2&=1n7;P^M0)(65N3{d3tQ{$g6Mmw za2;{pe9f_kbCd})d>y8CRH3o%pwM_fy3YI#;?YkJ{bSOQ?XO{_Y~M&jPVXb|sp6UY zu2I`qb4T-nFumqWW4-Uo=Yjb+{%X|vnu*W-;s29xMKPCJ(vW$fu;=LQL*<9RKQxPk z$?Ww+Gp_J-?SE8@|9jH-d7QUrg~{XVCz|f!%XPoE{et)N3VQuERCgBRRLzmve9ZN+ zfq&PiJxe@e8}anoKs^4diDxdCMeRDmjNFfn#aHMKZwG~Dsyw|0KHjE_r`J~E(dYBG zKcs=bRr4Z)&rSGBVfdM$A1zG&b3^ZQmUZy@GrCC6=p?>eH@x||0sc=6L!s{?mWJ!? z8^U2qY=;8zHHnil^HEQ3Mh75127N2tE$H(U; z{4?RXoAhKmNE&=PhTi)c&3eK6ddRw67qxy~fsgkoeV2$we_Ui}ten=AYg;AWKfRqJ zJ+*#*NUa|S@qbx*G!ujWS-8CL=_yT0@z|YE`+G9h1qcp68ucc_NQ7`zjqpzRup;=qCjETbJ`BoUsOzF!d@^)uv z?1R6bGgRn)Z-<5E2x;K`oXsBI?v{qy{emARzLxIywpcv)BJsXvcpr2SkLQzt`wQc_ zLV9XX7*Xo$>l^#g&t1#q=j{ez=Du2BKeqaQZ>@ywY3ySUf7jACuL++9-&=X;J3u`7 zuMJIeVKVsoNw0^s-x)iKFV_ukK2EH+Zl*Nw>qz6Z^7gPa^!iggIX4xLzPEV#4i>hb zZ|8Hl6Qrlsk6G4u^EH8a&60*ZeqDyf&oilgtk76@u5h`2I$zt+PZE!3BVlTPj@pN$ zC-cF==wBaF(ti~C208}t*?VYdj>oFj{ax?pZ+Pw?4LGm)t4mWZtvAmd&-Vi#sJ>|S z2>fT!x0Y%zFL>jFh5ggpBhpY?M?CwkS7;gwTVuVmq0j5jsOa^pa7}5wjR>E)!sPdP z${PAH-QMm!S+!)CBW&K=`XfqxuMXaiBOH4-3FGPK+l>9iJBv3zzam4Kd>D@kqv;@A zOLurXL_X#E>1~tnX(ArYK=I&90(+m*%hyuyJZZoqh4DWsYPSx}3e}=%7W$1te|YF$ z3%;f>>vN)fYHA+dyuX~m<5gkCxdre0W(e2RPj9n>pAfxH5oUk&3w(^$hkda{=(`Ey zxlZ7fLrQD7lX@}VU8KQhHQ`#y;;l@2eELWa9$H{)DhrM0vaG6<^9cEnd8_cbGki7` zwuf^#Pfh*w_Jj0{%>Q<1wiEt0zt(};dsJ)B|M^PeT)ywg0{ix_()g#h=K`N2%sR9T zT&}s`f2Dkw*I;Sr^`J0$+DQMu{_^+n0ROEt_-rnW&kA8irSy328F+JH^!b?nTlnmz zzT`hxys?kVx~e6^zJdK3oL+;1-%hpGyWjc2Un5*ooVVuEfM1IYKF9G~Uzol=H^F_S zFO!G2O~iBVEEkWaljefY?c%{N3%kzSo2msLAs)@!iKT%*N_K=e@$`jJ-O&~%Z8c|9wP{|M<K*sg^YvBaHuIX*hQt8(i{vLcDu=J27gV0iR}}`9Zawi@h!rkLL4&_kF9x(|5h_ zsUZwMQyS*dUp#AaqI|%2N(0_W8uXRH`}jxGNj!Om$p_po@P47`Bc437#N%Hk%xETm zd`5{!(#$#YZ0{k)>dbSPTIoU_23zO}R(2P+p=Cz%C zz&(RMG<+5Xf3tYz@?B`A1%5uVO^DhB!W;vyhkinMb}BTU!%5=Fwt+Bnxk{L^dsQjV zvzL_iX&d>l4zCDvK2{0idAKlhX%=|R(D)d`r?>p^@qS@0^+SKYc=Q8;?=GIcZNqc9 zFd5F3Kbq~M_VK{oq(Q$zJQ*Gk_VMiAng6R;li#JG_HSWwb}MRKKQjEAC^P5CW74qx zkA`NPFypK6d`UcWxgq?Y3BJ29`Ol5o8KFNcGHfS3c^;L9JOe}j-JpNwW!=@{neT6^ z1%EFMK0ijDx}o>Efd0Rs`6+zP7G|^-=GZt^n0f6fOs}(q@jOhJ{Od)p5urawJkMMH z63=>iF5nXjy?q}F{w87e@9bhteEaG`?@R{>GY$%Vx4>P6$=vJW(p;*&LUN4FV*AQks8w=C-4q?`IGhycYn=s>?(El2^qcY&1c#|Th z`)wpWnwrA&`YZSY0x!9!r0*`CJby;*_|T7t`Hl?D%`ClNOv1j0cG54yX*7}o$S+}l* zk8`{g{N=&d4bQ*Dv;Kz*GxsuSjD6pi(YL2G^cq;`t(h%7*PL&(ZfKSZ& zVb<;Hz++?mZ!SFTb-pxSOZRkKNYX_8J+pCM)ze+Q{I!fLo~+Tq&M?bfmC{dmJi^ z&#%&>=_h|OtY2iaS7%`|ZxnnJVa7wk)Gn7Nc>AdBD@@<3qHpiWyd->925wtuTt8Ag zb6hVpw@Jg;Ks>$H5C3a~;U{Yinft5a!CM8tRn!g-&y9i~5c}fH;LC(rhf%`x?H-yr z{Y!o47udQb@Ms2r3<2g5pxwsd39xbqY zERzrG^P70^dNHq_!sPi@da#cH^fSW$Kf-8URV{t53Vg0Kj17fZ!+oOfknnuIU&-@J zWngrTJUfSe6JfHQC{OU1(3}->pCarG&e|X}7YH+#k3xUD@-SLNh9kr?-@4)%{+p8c zJR%-V%gDJf{D%m$COsp=ItBK9tAzd2zT1Z8uBd%Nc{nfT3FFyGdNMpA%=)|-{LJvF zBTWAC;2#UmoLA@2-x!)*13MdI-ub0$PXxYK8nS&XOokJblesJp&4=OHKlEn_GvE7! zS(D~5-|xlad3n^f5N0e=Hhg{v&B2;4IhRX={~Td5*D3sc`_QO8G3NVF;Bmr?z2#5e zx#Gb`$%no}gc%nEzDgMV>#8MB-{{p(8Zz%2e1pJk!gG;6Yss;9nlKq|kI!I!7`S%$ zY#Mp?6=uy}l-?QqSo@yAt>?vPA)fjEBp&~L15XXjQ^DUG_?ZIR>w)O|sP-@Z zt>T!Up~o8LwNE_X>oBC0;Z%JNmpn_xmh_iBS$Yl5Jp6OU%_Y9CKIcpAIr^+F&<Q zC+9`e%S+YsF8k*=^?f%FFZDWeL<#$SI6QB>QyBl2!sV*-cA_xz&G(Qrln?xQq3I&* zI&Y5*D`oTlWy7};&swb%56<_BJS`3W8wiur?}Z?z-*3j;{hkx+?e%r^`dzi=yiF62 z&vaqj(RNq~xzH zOa{+|+V7(8+4A@AzCCz_@$>#sJMW63)c}zZd=KI9_9#QkPwDplcnkwndd0Qv??khe1 z->O%+?sxAqf`1@tFA#4JZ~1w>HN?{qx{!1Lu38JBVlBtqf1kw_KC-c6#u>=EI*XOwO_Lf&Y&%*?gU^kcT(F z_Yb|_OV9f3ANuX3L4TNP$?t0g{+*+pM5JQvU5Gx<21y(Wj}Tw&*QrjH|AzV~uuQS17zBin=GS*xprnb()n*wfoYd4j#a zz`PIHc{USYUg)2d-q;(Dp~fx6GkS*RJz@HuER6r7!%ORSs`v^Od)q@i`Xzx!hsM{; za%sJ7Bpy$Hj?y09xaQdF$zdgpAG@jb=S}G4H3Sb1z1I`opMPOJeXXt~Z*TrAB)E|@ z`1cpjdExWgxxDp{Uimr7hozy{IAJ{Vcs@;@9P@p{XKCaa6#N#Ep;^>cNK;!`yybgD z{az+=dLNbRes8@a+Y(`FeQiXOpCdRh-`i@s5x)`tOwYi!D0A%PX3po*QV0Y*Pm@+d=i@a z!gwBVd8x1G!m;si+C0scd2$oaK!g+$(-73Oj0Ctnzf?#j;QS=e|+-2@%~&Dz1j+s)9;bS|7l_R_K&%Hf1&r|3;0!O zn7bc?@L3u2&1-_Mdlky=?OXYPH(mle=Z5l-O{5ek6NGC9MZyB5zALi1GcexHAB&B>e3Ykd5;P$AB9 z^SNp4t-UawmxSjB;+fZt;#rf8h2irv)JvjvxH8c9b76YbEqeLBFU8~I&+URAk37E# zTkHF(3hdiA#yR`7cxum%42KCDT$f#{W=$@OPH z(YFw0F1{v%eLhm_?^c4JA-;~hz0D2%2hxypQ}spf?-`)i2vM$K ze2zCV`d(OQT>F+Vc}@|o5a(@?aBcnc=I_zM|1{;X-nE;Er`K5N@$t2h@kL-?i`W;w zzTxlhmjLe^y>5%O9WIS?dGmL$Fsg*<>+e({=MTbU^LH|^R>y^YO=0ph2z*naca4u{ zH2y9WdQA!5-!bJ})_)QFy~5;qMeBgi(qi3wyLGJL+QN0jc^gr9+IM;3Y5&`W8Se^{ z=Wf;FpM6&kpMk}CT34sg+tc4;M(y9q>7L%&h{ykM)uP!u^k)?s&-3Bn+r+-}?^hX@ zNyG5>cj2GkG4*{hFZavuHauT?=W^znQG2uWtn;(NCw;#Z z&%CaSIc_BldGb3>^Sj_`OOKDge~fH%R7r;m7sANv^o9!u9c)BNzcLVB{*)c*nDd0J?EoWQpfkN&Y(^UFU)*D2z*u4`uPm=eJ^VL{kPQCDfHI;Quw&XR2>^+ zzE?c>SYgI0`NMA;nze;ltKEd@^^khO`}|@qgVc+hzMkN@Vfc8>(U-?@`%36f5XNVe zFze~(U8^g!w_l6-x`&?wpl>Qq^q0llpN+mh#(cYrXD(+%{<6rnedL*-UX0bnvnJa| ztsk4rd!B!XzxNk8heo#Vg~>cqde`~(`r^rUW9WC&{~hChMED;g%$mQUUdFEfP1rwO z^JsWZFErNqJaRVU#^JM3=ohLldG;whecRtV%|6|x@UhqC;j?~`*%{i2_fKzA3V-)q zBn&X+%QITO)`1~2Yc9Dj$GIEX)&wgnrOa^}+HF#in{u;e%i?1V7 zZ%aepTi@f2=gcCrZ#%R1t@VEilfPl%@AceU*jnE=NxX|~ywltTw!t)PdvbBxc?!x3B8}rTmb&E8NBZSGh;Ye7mllsEH zUi9@^4G#Z}#Iw#F#FNL@AMm@OX&?Kyi}ci8H z^807d`}oJdy|DXwZimU!y?lEc)uKN=YHv^;YWE0yv-BKG?IQDwMF#tRB24YJ(r`|_ z6g~$?L!Kte!MEnR{^H5zV-L@_ zqxPx7-&vmtez9uN4^@7APL@CTd0{g24?IhlIkpVXEsOo)n)?gA`_2}o*TLaaKlts+k=)w1t=ypiEn=~Yr?W8geWJ)|T}NT~?*p$JwQohQ%-ODZ@0{yTDzIRU5z0x1 zrNXSqO!=^178Rb>jZ-Zd4vq}(OXG8;p0+iL%=R)ye|O-I*!OYz?(_+R3f*-aXI+jsrYY!gH3_Ps(p^O`2!eSG`T z;I9$JvtCjAzj=!HaPKq3qnRR1-;v?-p?L2L>-Gx1rFce<>q=`_Pa3Ybw@X9L9krhH zY8vykhIOb=E&F|pc=pTD;eVqvtuVcMg-^Gr^|b>3ALAGpEe#pGR^(h189E5l zceyafCebF^Er>d6qyhnY}Y#*Bc2(w>Kk`HUxS$eS7kny$j z`0Nszk&!lyAPxSDV~!IF z?6qqnJ(@Fw@tLVw)^Lm9r$>f6BU_iyd>o$p#u|PYwY8*SJ--Y7Lhc>A|DLlljcxUlUKB zj^Y`chUQag$Tp+!vDfE;Hy37K>?BOz`-RE5i;g$2^Rqsis~7(37i;DE8>L5ckT9OR zNDu#K(aZIhhR+=F?9&=Cm(48n?b>MlzQ2p{%=H{B~ja4JejW%#?!~PYkm6<@f?S} zwU5ZKL_Fg_VR|hMeGg%d?Ww}_`al?;4MX2E=6*oTWtlW&n-%yFY3MsnpEbkN*97pH zfgg+7PFe@%*eLkd0e zhbS9syJPrY7x-FX?|0`OEX?R0{td*lZobBnr>!vg_ZDWK_L3gWCE}@lMAqZtFU*=(33Ckp5PDzd(a#C}hVrNOX=%t=H~jA#Q>s1i){=gQ zsBJFHIyaNv*lV#;diVA1i*GB{K7M;?eagm_@R&PGy;i@kG?zXPmT)vnI+A#GfH^y>HlD_*ZeLeezq`cxPvs{ zV?)ziJZrvd;ZsvSpH-H84h)|&0$(mnZAJKRF3h+>7)|@=`*!$mC7y9(_-_~38Jx@8 zZ^1W?Ubl+pIR7~G`wKgR@7q>-e15Df;Sq(W@2ee}TEb=Gygek1J-k19gk~RM=D23y zO{K3Xt+y%S8BN5aUlf{F!uEEL_R^Q>r?(%4?cti2f?xBDlIHT@+Xde{__5LJ<>1c~ zt|@PCdz@MF^sxcIk7~)hwRlGN=rvlrvwPcHJo?|oGnXAA!&Xsyk9fx3($~}tZylm` zfiRwxs%3mA-rE0d;n_O$jm4uG7jwB(8u+%s|0rB0Pj4f_bG-D7F9Qz>%?5>!*P(at z-Y<;jREvL4;hMU`+Yo8MRpQb3T=uA?&Bu~|ddobUY2Q)1D11(q-osvNOM~a};?X}? zXsqj^S~ROVm+)%gf1ossTB>yxZwtd`vNZ5li^p@T$WSk8ACSIW9^U4M&jZ3W#d+%+ z_#0t7XQ&qJoZt%aJPw{GjF0`%91{H4!pFMl(x9If_^R-)BR#{%Jo+D`Vbl?ZKTf!o z?(o(~dT@E@-w==fBVn!yw+WN^8ezup(7z=gH1k70Ff=10&*_1kf!fnT|GY3`R@agy zkGDUf*Q>=^)l$*h;r~tG!vp^!Y^}Gt!eqEno~*;7(3~B(sWj*>5Rd-$(98+VQenm` z!QU@^x$f|`y)d5J7TCT!Y3@9)I5{+9h3WgB@cdLfqhDx_jM@!iJ%@>}r2=o87kcC7 zQQJj&##*3y*A z!`l+A4?d?!!+dWQX3cZ0tbv~uxV=2#Hx*{=8J-i>3r)RlrM_=P?aa`74bi_QOwRJ) z7fR2l6ko0z-sXkAXW%_U(^Qx-J~Xcet`&G)Jtt%g6;HMi!mQiG$g{C{#`)oMaMb2` z^t@{E^sxj!K$y9&qjjT~`!W^~+TTcVRr+MD0m|hevI9Vf5WYbAos> ze-xg_hW^3O{47j{7O}S5i)Z{Te|psk?EOnGpGWw#lLmgDz>7n_t$4;U(RVNL_JUp#pD@hsNh1;{);NPZCdt9-%)@z5ewVkLFkD&Aa~a$TLwG&5OeLFA2|ELvvVo zHVl1R;eUs4xo+4i*P(9Iu8jPDh_~KbFV&KNkMLX({DLBz{Z|Tmcn%|l$v?i(*sDvS zv95LaEL4Wt;=C;s&pP}mJ-BORSR;I12>iP=^v!+Us)sxNGY$&>i$Z@?^z!uzpQoi^ zf87whei3GU)(p=l0^cdj_$B!BRLeRq3(a6*`o13ev4QW7zT5UJt?3|knnsnJU0tm zKRi!}HGDq!n}x|!TN-fd(2R~ewL&v2G!w(;z~E1dzSoH-zmFg0`)7E*7ksYmuTi^( ze)mGoqoTHfH1G!o@8gH@P1Kf0uM4Fi&u+rx91xnW;s0r@$v2_jF?`w!lc%Qoa?U;= z9z05z(II+GiP|3m9~QrN>Ls4cGXh^3`c9#LL_A})z#GS!+!%QO$g?=~PXz87`fUS` zkcKtfMwoSICJkd{=*Na;e&ElfVXZDat2E!+#N+>S=*jPOxlMZd_6^PCz(>l5HGClO z!K!8K9{lU7Wz-hWXez!!H@rOW5>Ye z@jNc@r10EVyoYtuBExl|-{I_%&pYCop2Cbz!gE<NtpfazGQ0}^W8UmeiUZ?a}8gQ+JVAo zHtJpStQ)mEO5^o$ziXu7IC&;~{uCx#W>_5lJE)d%U+^cZ7o%b1zgU<#J{EYoY8egX zN&er1za>0-hvyfCkLNQ_we0s}!e{Nsxo7wc2+ewd*A-^&9firfO;PLn_6*Hgfkz6H z;j$u|>;D$d7%YtE_tG%m8HL9FKU^du01nn0Y-{Xx#gm$g?79pNwn|hyNj=KUA3UXY{HHO|9_!OgzWx#L&MQ_-AQY zlP#m~*5UJ1^j#$E`Fd{S3+&roLwvfb7Ccy(^&c4en)?4H#$Ta1KpHa74}Pz}UI+Z= z1b<)PdVz0^UR#`7+AnuX!@he{xV8d$`$ic5sj6i^UM>uOgEWjk#52deL$hPxX2SpW ziaD;754G;g+Ez->I`|l-@0XG7=Utznk>%$BAdYyM^Y&zNFE242ItS|H#-$JaZW%9?zlS*(I`d6Q&}<=jPj@*F20^3RV9rv!g| z)HW7RuO{LdQ^Yea6()1<@H`^2O%X-=Iy6rx18ci7@_1jM9}}9t)ffGf;WHre_5{BLi>PuaqJG9)XV;velJ8V_@|1af@b5;5%Zz56a)ey62*A&&a=zFl)X; z`1||$&HMN`NtolLSJBJ!@prQ`uZ6;_$rXjhea}@bIX4J@e_y?M*AEv@?aJU>8n{AwGUwmknkL@E_Z==h8G04He0z*Aqn`9+IHl0| z_K(8&{~hz1Smd< ze5h?B4ddGAwY@N!LBjO?EBJH6$LofEv-mqBEu|;J;J^)qS%aB~v59s~$o%Gah9JsGM z*^mBvh-e;*Y%}H0d~1sT*FW@os2B6?CEn|1->RaQ>(7e58-#!22c@yrIesg!Z$F|8 zWNWWp;AkUJ*TFmRKScetD_V-v8{%ePRabW)q zP1f+G=sT;Z^?k#oXI?J}qdzzFBZKc7xL(vw(BG-VXP$WGwOiri`@Rsyf1l9r8a^8e zvxW}@KPvbE!ua$lG`{_M=zGZ@P3_>f6(-wCVKgr)8^>7lf_LUA;p4xxYQ6LMZ>=)l zH&sjKBg3;*;7-Ey^*V!pmJg$!_&U1b?FnK0{kL54-#zloj110<=Xa6kxu~rzJ;&-^ z(YI#&9bW&EZW@{A&gNIQsTeE!o~IJbim<_)HUKtu9inhqL{VvQLSE!abj*7Wo5w)iT|EPE}OcbW}Q}t!OGlW^IN90ehErY*RnA+*W zXm(RCG7kt%g?RLLh-diko>SXKnA&wh^Il}$NIX8@gx>!6JRX`uB2VMs9}H}NJUfZU z=V0Nw3hM0#Vb-UnJQ)q*Z?E@>Iqn+%cZPmnVf%QVmxcZb>6!a4p&uOn?ZlI9Nz}ew z^zwcF8|cjC9ckFtCq?adp;;=7=Mn0~$iEBUT0C>VPI|_Hk!_QxJt6en)z`y4{CD2T zRw)hH_6VPz^5@vQGBW=awe6)xGgx}EO^$4v7a80m*U*25ops(vnA&EMp*%FTgC7)p zTk*{0A@QtXui!_EN3*AR<~vO}(RZ#YX&#Y=F-$x;XUd0b_~Ot^i#%HkGj5T_{_Z`k zs^sJIlsvV9f2Yv9=0Wk~+)bGEsS+mh*3!d|&DxmnDbmx+`xktnF!S0ru#ZE=Pcg5j zLNh~{3@zl3PgU?E1N#_5-%*&+xT?hOER0VdX;|k*;+f-lfm;nJ&E<6Isl6>UR|qrT zA2b&-Y$)E?_YF|3f4ctn@L4->KVdSAD)g=yS5@--BlyR}lc$q-&XKi4|G9WHlf>h{ zENcDt=@@0=-P7A@s%5O9bztmRRnpuk%p9*2#=n;I99IuT=I5gJIBDqhWZ)O1r*`wu zUmy*0xkr3ijeoYAgz3AVFrLlAvz@Rt_MIr~pT0d^y{H{pRq}tl&{+4dcsyr?W+Q3H zlWXGjwBGmm7(g>N^p}Wdj*Z2aN$c&lLgP$e*PmHc@>wJe{!c^t}R?k_j}uFXep2X zeh{N`_za5L3#v*PdaIUklQhihW$|UY!`rXooyA+@;D?B>E6&?}!ak3DUD#h4$Tm4@ zS5=k#zZXVxy7c(38+y+R{t02u)49T|Nk#N}H)LZ^r{q#05G+o2LO1!n+T8L-#6NXD%jv&vI$-^xyxo##=9G%JkEl z_d8=&=*LRKntvdk+NI$?Nf>^aFmoIiK7WPgLh)s4R#Th*cBiqoxmEvg_ByQ4nEzUQ zJ^l1HQ`akc`8vZopBmS(=F+o1TZX@nnVRzOme&nmtKq%o-MJjGI8G47q;H`(CFoJ1pfmAFOZ&I`L|p*9`=uqYd(|4e%`Juc=wnu zOzmmHX#BSt;a?GEt?nHW87?o)>jh!=@%Ho8rRNO(4m9`i*8P@}=G1#i{!O1LtwYzC z*R=S5jcfGYA$(5kR;oSqbQu?8a+i|khRTxWozqHu?arw6+Fv}G$94LL_xx81vkor_ z)A!)u-wJ$L$C7?|;BBR092IzM)J~Tk|8Bu|2>tZHp9+(Cli=6ZyzqHhJo)z)kA6b* zIz$@w@2k>Qx|sS2O13XOZ+7e2khe^~ki-$R)7IZL%1Kh6n% zylPpW&4ZsA_!D79TVd8@SUxcP>;Ma<| zxaP3vyT5qncfZNu^LpT^QQJClb_xEQ$WuRXRp8IUbEl}CqnxZE*Eiqxxx@bICLi!R z;pugQ_u~sA_h~2jquD2Vy%_7mV}$!&8u~{f=d;nPfq0ISQPMM3NW<`B1mke&bB^r0 z{*n1lVUCmYgwZUCYufC{zh;rgzK@9~&*1QE6F47R{aC=bGlh7;+fA4Gbdqn=PL*w%TO+{!9ifr%6pZvatGrkRca4}!&nuPyJ zfqM$mYglB?$I7+Bvt4NJ4WIPir_g(U`&=VuFV!;UNA1#L|61qgFbqE~aLo9*9QaCM zjxk>+$?wN*#?68A+*}YoeyqW>X7GE9C-ZBe@wo;+BlNz$G2YNz7|Y{$+dA~$hdv*F z2Z^`8GxduM9YgOtocn&vVtgGry@t#y_tzoPc=*0~p`WH>jCtiTKdOfai)SBs-!Xm_&wk8xXjAyu_mt>$hA=tJgZB`||0%6G{1Wku4FV4p zrmxqN+U}w8@yxh9=5kwPnFaev zzn%QSKAssn2F`Qe*Aw^k7^uE@9uXPFM*d3z`#MkNiQ*ac0>2-9UkU8j9n^MGW^kUr z9ppnEzqUd%KK$*2WnA+I6?DyXnZYVJRbbZs^xcd=ZPnq z&q46%q4)DQ_zk01m*71wGdi4(fhoxa$ z78*Zq!GC1%-2%@PCQrWRy;eMH?&F7R_3)_mb=AXbw6-w%+^6Olm8xYueH^0yAs%1W z6;Gaq;hD!(U-9@f2<+D{jJ#gu^WGCezk@LAb5Ydp8`;(jypOeBfuMhbjnNMu-BRKn|iS(t%JW)Ia!~(#WSyb z&h}yGs{-fa=5E2i6!ZE(nDtphbK%r{9+BrtX~>_?ubzo)`S|;w^!Vg!=ZC~IPS$aYW>xU^ zB+uU+Q0sjHp{X63;RUwWL&A9eDLp@sp8F`TGcUwCycK=@e3jwXgB(8xhsLk1 z7}tm=&#b^+9}nmIJbIlR^UCJ{K0fi;F6LMs8Qu&Z{~nKVnrc~x<0G5bocw!)W>{!m z4&ILi=r4|5EknPHG|uV&6J1?Aeg6~lnjHE4dX|yb0blo+?*_sQKkmT$^%wYdVXlGo zga07#EyB*@@j&qTxb|t0)0%vo^0~&`y-&e!7oPU*Qg|Bs_mgN&63-YNwSH`3eWu3x z{8yOa*euam{&>Ej39uT8)W0-q&~Jw2ZV!LKTK z-{;?5;OXCs;^SijoR3ZZ9VYr$!;{|$_`ZDJp0C;cnuu|nY8iFIb606N9{hMmhL57Q zPw=y2{XdO7evDvz7n*Ivdp$h&TytMD+3(gcCaRYG;^*+>@$+-Ak5$Hh0?!skGbZ?t zgZJ;`(d1hBH4A)mVb;7+U_akRv$t}RKVOsPwb9oi57+p49iD52r(aX!>E|kprt(Lh z$7Bs@==)~j@0vrxGmn$w!t?6T`x?UV|6MYCZZbv%f1!Ae?W2R=GxP_GN0X1&{=Ecq z^ts7+B94>Zg~oH{*mh0+E@*b)?;hR5)3vPC7Lo0)Vh!z+ufP17nmk)Zp1T73HK{co ztA)Rx-?ILG?Z9|4@ao}{&n5g^$T{u1vhX*4H~g1HZ9aGMF+=7Np=lnqe$B`_^ZunaA1nPl1dVyd)L4i1+Aq}hjrR-r+QRTY z!siTO^uES2=0`6-pJ7zSwJZN0)6YHdc_;kywV}@=G`Gd^lh?+)c3l;EUrQPJxZwTH zIHAbw_07kTb)&Xlc=|aWc`i^b`(>ec)+b-5vd^iv{(*MWKMSNQmLo>M-y89Nqw&&TUVt$&9JUR&7r`?k-0 zp1U?Jc;Dyu|1jzLO8pHIW*pg2}r27V>7`J7_B z8+pbEb1aPy%@3-jSH0L5`S|5)0wd4aLE(Qyk7cVO=itB}gnm!)90R`2IJ0x~3jLj-Zzzm@3t{H? zec=04%lJ5aHVRGtADN#&Fn8z2bA0Gm3Nv00{8(tbhSYu@$J@j>2A&Sy&+*Vd75Ha) zGRL0b|DrHC=SSwH;{P3S-1ZLrdZGDNn7(HR9u=B5 zdi@&s>G1zb7`^}Bhw+%OYu)3O;Qc!jJpFu+TAxSc;dzL4En-db_2U=PQ`;#tpDQOm zzD6+~3{AVpFe5ZqLw%c`|x+ln?s-!>4iRTS<>k9;?HH zKTLY&>vIs?KRicXm%84j;{;T>#4v$ z7udQMl_kyjp?NFt0f83^)2o4M>2*)wv%~X?z%Qv5{di#pk14+I@#r;A>%;K#2Sz@2 z+#WuYDog9{&%2RxYIyD~o?+fSy+-?1ma^3oW^5qL8r~H?L&Y-}X8_+4n$v|De$N1! zxuO41KKSn~rP8hYhxfpYPTH-%Zx z{QThY;;H>5GW-z!)1$BVFL^3e3(nUsTZ?BL5V)=|y)F=T9?#j2_3+OZyzkp6`hFLh zVZw~fLbEdPIAOARf7#EsH>xbHbD1!G4=FU(z1gM29~zp*!i>8EKc-s7O~IcaOomg0 z>9tsTaKGR`7j}Pd+XvrWnCnGhN};Kzj- zJ*2_&+0#q7+ZibI|3PP#_{X~cgWb=6YvbRc?|H`O&;F%e2MjM|`&U~Hs#lMPY&rPHDdW{|Jo8#DYR?JJ&M}wD@Od?So(_E@>FL`iYIlfUpT&H)56$xM-zoCEC=K7Ou`={C zL%&gEs2`dk!4D3;W7Hllo^{w-m~nmJ*8;CA%zAph;2M#+U*LzL_R_#UXIZPOBhQS$ zxnDktUJU}z56|JjyD!-mhv%umZx^*W-|?a8CCvI3A~O~8}*N42t|rY z12QzoP-M!~LxvP7ktr1l%|r;HB$7f2nTLoZB|@1plrj$?QV~%S$stHT``-87`+m-Oj==Um4ga6vxe@q7Xr4gsUbIyU3p0uTTvl8{+ z1fL60&lu!>4Lk<9<$`xxlf%bzvM%b`3VktXQjzQWJB7x$6*Omn_rh~0_(R~Upw5%f zYzKZL+H##Af`1sfm!Y;+fgO1p8O6U@6WBgKL31oT-IufQ|1+>dp3d!#+&h7LKqF6& z^U=gpUedU&-HAqjGfK6ISI&XZIJYD`#{=g^UpPM(puZ0Xwoj$RUu|5HV14gx)H5Zi zQ~kUcH7o+3FLFH&&mi|a@P%;xUyhnTfhH$#+rW-*!H^ zg4fwbW4wC{3 z_xH$k{D|86LDL_a-DpeK*D)V_I&${}?|!|78U{jhM_@+}_>=(O3%ME-d$x!ER(M{} z*p6vwe+Bm3I}4vnk^3^*(zWmy?u7nNw7UkH7sKD1pfrEa_yNX zu={l+urHgxA;AP{X&V?Y_VspV>__a^1fE|7pChlJ+O0g zA-5znTA!s+{(ktp2mOrDJ2EGF<-7#{U!b2DYp-Jp+8Phc@gEESb_v#)^a@Xp8?W6X z;cx!C&}$ATG;iJCr-C>BBzTWc$KZYDY#i7=Bhl7T_{;%+IDzJUlKy!8ETHgcy6@U)__X=#E z(eU3CynP0s{`6#g^gZ4qTB97Zpnn#8gW&DC2KY4EI)J{c58k!S3;j9KfbvTqw`^!U zRu2U)y)<3n>2VO>J9vlYt#eNWc3Weh(S7IGocK%kF7#ueIi6s(rFpBlkvCqYq379S z6LPN!tUSH40^bfSA4g~8vgXCmsE_vS3H%W}HHMB8fjtfblXHDd4Pj@|yfHiN; zF9^N&$1d=%0FBl?$A!>Tf#yMIMgngGE(H8swCgw&yz4m+W1{uSaZ94ncs&ih)?P;@ z@V|$TJ&y+e-}@T=L!r4Ext9la=w5T2o9Oj*H{@Or*T~oLo6s9i0iFvV%?;P){_1Ow zt?&X16K-9>!-u>``{f~6Z|a3 zb)#DFjs?iQ0zAi)XYx|;Zyj~IUtN*=CNS@*B9ZIyY=U-o2X=qQ2DWErXmkc}?nmKc zeNpi1fKLNA!!?=_SRt=cp>g~J{S~P5N?^@fxBDsdZ-GA*ddFI54hPn?P`mHr`mTaT z^T+{ScmRA=N?Er^|kIJk6Y!?8$SnJ8k#a_H*;w0nLEMR!jtR62a&7m zRWx3@?$&EQc%3X9*ugV~YLi~iS|iccbo94v@D7c+O>IMBh;p4~zzBqj5 zBsHiH+*4LVlO=N9uRjxBZT}7b+R%4_UgPZ0{%fD=fz_tIo*meI;k-Q`x!r(s0BhZL z?1hik8AmJV%eBa;L37Xb%ngleSV14;P6%xMxWKAkuNMM)Ez-U0e%+7U>VfUw4E_%X zZ_l~GJN81)wYMU8J$Kl%OZ3a}TkwwG(AHMq6f|E4b`2bpaj55`@ON9sg17$Cqz1Kj z7(P7%dwjG{IrptZudnBUFB80@GW@>|?D!m-PQmM5R2}yO?|QVK8f(6}-BHkd8@%p0 zg~r7C7eiyc>UVGtJsWyo>lV;!op&zJTJp62)W8}O$3M6PS|eJ!2luwx-SmxibHecG?xZ8EvhE&q4U-0bdpM9EE0MU|;JjXlo)g^8>ri`ta0x z;@b4SldwYb)6o%F>z?By;J)Y!*RlGc@wnx~nDmc!J;z>0J)grY*e-J)Lk$V=r z)?U|qXK38ku+SLijemdKQ5J1g2#w=jcWC~&p5ej!{@MnO_6Wzh;AaMJ&)VR5 zzv#^7I<>wTR|#J2Dqr`DeYnnOtuX%=au)%Yj``;LF9xr3wRp8R3^gnb-l6w)92!rz z#cQqSHAn8GX8B$e*r9vVxsOIY?xWTak7v&qE7z&}%X+=1WUTXpqcCuR(6}!ngSStw zq%GxWFLS#~kb6JwN3HXYQqZr2enMdTYj3ir&aUQl#xt+8jd`6j9ktM3zV~tsavw*o z>akB<)T8yp{0ZO!=+{TU2a&rMp2CiYfhPeM3+!w0L}0h8d%^wv82DJ!?|2>j?{OA# z+!DOwP1Jcl_$$z_LExVOuV-`B@SmE3cRh$;O=!%IgHM6b zxUKJlcVq^CF8q5(ZJzV>5{-PjAy<2f;~eDbEbX>9wz}V4o7PhIu~K01%K0amd%`*& z+9wxsHD}Cozk4ZsT=S=a9eX0z@c}$_zH%G`UJcDn!MiQ)5!%zumk*8mqV>eQ`fgkl z{`@aa!TJX_zcUupJr^i|6Wb->hV5+?RpB5A4W<+&>7hwa`}dUpUNlZuXKf$|x`8)1P8KtGQ z2j3NV0dQ&P2L$hSTLiZMcmE%KuE@3ihQQXB2VWn#ycR!$zZXDNeA8r|679hI9vlhGd!yUp9i1Dz-0nE3Ie|$x%M9l zANhM67KYxqC~_wO??UdI;9o~>VerpEeXJ;=QeICl*z;%C#T3_K(> zu75r-$88yWG$%bK_d|a%Jnv2PT4Q^IzYO@d&}co->$l)tLlt=H8adhrw&nuhJD}Hn z;rJMHX)t)NC-ORg-0i>*LC^6V6B>nbKTc)T(0P$SnZA zRbct(#XV(e+zaM44}IOs!e6q+31d2e#f%n}+$DzN&iwvWL_*TSJW>Dt&AuAf~~85*sbj@yEFaD38gnEm%! z_^TNyqqMa8z&t-RgMTAv9tN-4d>yMoa}PA%5{Jfp)b({}o|~TneZ|1$D}=@|1pVp` z{^r20=LGlyp|?*H@S1Ptxi3r!jd`_e+za?z_;Ag+68u}x=cuq`pm#jguf$C@UB_&!T92u8J@L5TmQtWE&I$ev=tqIy1b%8@*UUAlZ0N;n9&`$vDgLil|5OG( z7}&Xc0z0Mve;3%f&1z)eL*TOn@8Ej)O=ujtU+hy4`qjW&ph*Yc7MSO^-QlnLGsWwo zL?hg}W=31QXS;^R_l4GZY4y^2WvqM0!F7pe0N%f?qAkbFlu^7VkX%#wmVsyez^&;;x2#(~A@)jAdbN#bnqj%$H+ z@3`jc!C#!p;ESV%&7sK@MtZ#seP7@s!0mw_4y+pWDh>WC;17Va2hNnVH8ZfD9nOhY z*Qm#Q%itY#P^a!+wWHVBR9f0~iKrYj90&G2Pk1_)d*v0uyItOQ1H<1u=Q+oudgMCt z0qZ(CG$xti3%woz{wkHh--r5d3T%Dd(7R^MbK_xw71CXm68bm#B)q;_9$4Sks|@_* zsSy8QV9gWxP75qfuNwn9rh?b?l2)2wsf>DFfky8WN~70r2_G=+qri>=p>d2sZVqT_ zhbB{q^pcMw1>6KaOHvv7OG2YOy|nKbH-i4h&^wNY-cdNP=A?2K2TqUw>s1=L>!8mb zyfvM{Uk?74RP-V7(V8G{z5ao|eDIF^!CNzdnuJ$-A40?DvW>y(`7g(tWHbQI-e=N)Jxahp)qtE1lC+qs0QwRr&D78jY8ogKfOkT zURu4*3Esi`s|WOtCjQbDxh2ErHRKip&%Imgp6-R!@u~>VDex>9yfk|Koyw>!J@~A_ z=`|Gm>HqObkMHZHwsOV)70Pwgfc|jmUp7wY&L9vX-4U-S2XPY=CgEO2k&QSj6rXCJ*k=Fpg@#}|723SRq#uDRv| z&*3E!eWu{E!v9QQhn~e87hv2bC%ke`LQ^HM+R=;ax%PT#^(q2=>%i&3>BY5zYhVs& zc#X7fIQ|HY{W}GAb=Ofqp2NR$4 z_@?eD$BYC^r+d($^~bqfE0!X63v#*7-h_Vjf&MdK&Q`eD z1kWd-e=o4slFae?1A3h+>{AMQjjiKZ@ba;Keqe`d*7pvDr{h=Z!9M{1bAbnkK0T84 zY7Tw5L?d2nujAbWi(dntb5iS@V>Fit*H%tdEjRQJ6;Cv z0H0I9ns1I9YW<7UMkVmP@4CWsM&R_&>curgYntPA;KR^22%I@YdL0Oj`&BS%F#aht zj@y&k^!3x=Uxt61;GO$E^y8u5i?-O8QqbsHJNgEn9$#dR*9d4@!RN-{-LBVjCKA@>sae;&E=Q7nXJS>h@FII!w>oh=i6&d_vBJoUXl zLvPJ#cxv7{eg)>edl+&1Tg075oPWpElO zzm80azxvO$^do4l2#w=*@Mqz9H~6Ng;pgC8+e*~`Byu^ny00DGfpemUAAd0+{F-%W*)$|rL>F}=@IBR@guP>nCT6afi+^@TU^9S~r-x0aiq@hlZf0fWX z7NM>8;nN0q9meow@T2P5CGJJEI}4i2fR_R1Lhjzkb^Tf^iifSf&V$;xUw1%TgOJ-h z{2k}PU)RO{lc9M6^(+Tp61X++aMV)^_())n`B!M`669+BWQpSR;=Zsp>U3??=LSC~ ze5~09&liBR0dGqBuADl-yEe}4FM_vcH{_;(d4D~d%q4m4gGPInqdz?9|0?)Xz}h>q zMzZRtlz0lCn_&5Jjp7^_4$T%|j$1+SEdqNSt_keEFM#G2Xmo$MwsFwsgMI{XmFSE8 zwSGFX;X3{TAKqW}lIx|MX~@k4eq-?VuK`WR(3l?!{(R&f4c`5o4t;*$)1mSFyfJv| z_d>HLG+qP01I`Q0qk$cZ;Zq*`D&U*K$FU50VMjIajlrvrs#B32ns)F^hyGJ&v_`ov zRf0F>{P_pDn%jf%QB(@%dR`t;3GT!$;$ zb#$BqO%~uEL*sre3*Mo5VtyR-TcGIyUTdcH^MD_QrUr7W15XUS=SJJW9-r3GTn!&x zFSk_?niAD@>lg#KM`|N8FPMPU`OX_8Tvm1E0jMD{4LPmUG+bb|NQ5MM6WOE0;ear z;;#zqd#!xJ%fA%#nZn;ScY%L(<9iSH1_NYK38D#eSzBo&xC$OVAp>O z@G8{s2QWRWgFgyf32pU9TdzTLF8I^IyM|uKy$kpv;3ooGe;{(*-#>w$hUTX#x>Enf z4rm(Vx-Sg9V*oT2z<&Y!a$vWc2iNyw~LKlhPQM<(FBz-I&dery-m{bD_Hf_FVlk$WZhd%-^gTsi8rC$IbG z&}fdSFRJ75z;0`EV8;ox^(62{;1kHzJ?PNf^H?o|=aaaj z#zJ2M`d86b186uO^1<^{=--DA@6&Z?_c3@LL9XVZ$5Z#UV>digXtyEy{uMMsfExi% z4s8Dt;3olR3GDa{_#U*|8vMt|T?u|OcwIZs4fWkMoC1Cvxf_7Fc8!P6^{A&ja8~5j z4(xVkVLZ=+-q%;U)5z5x=g>TKodFRfR`+`DI>h9{A`1pO)*{C@*=4u_}i zefR4-=sSnryzVt)%>hRpc-{{FV(?o39lF-`;d+%D`p=*dZ@umXhsMFt64>jia?-$; z4(u`1z3k9BX8srOeSq7bhTqYbbPf%gG#K@9_g zcl{lqSp(bvHB^IMdz@>o6&m|!uQ%ozH4Q!`Q1c7$S%qAkOYQ$4{O^WdYpgZ9fI0q8 zpk1C@cwgTZxem_HtQf0N@ShG(oef+=Iq-#nHCG*bfomc6R`Bf0Ht;_J4}$-bfmMUX zeN2M&_1Ey{-$K#Z)uFZ8*Xtp8zKdMmBa6W6+Bt4UyWc}I1)jP$9S5P|__Tz+RAARu z7WxJ7sRDf`;2-1K`MTT*el&dacWE5k16yA-G;a4U@Y9g{bYS0utf52j4&KYU*X-XF zxeHK31>j@w(f;n-*3dM8=Of_v0qfl5+#lfiQ(*UT40!Fc)-MCk`(i$Lp0W3UzYR5i z6xeO0pkW{91@CrsW^+_UU%H3JW1boQTDR>#0(@oU&II2cH3+-iw!lB52AwN>zU98W z1p29g9c9rj&s4ckLrG}r26p`y0_#lT+CGQ=RkU>mb+!XPANsZMX$ZU!n9r(O&mHw~ zA8F5WJz7_NEp&Yyw*xl^*7?W5GjKV)7oj!Q@p^*Q-r(?YyBEPT2QbfF+8-UuQFAW% zYp=AY*6sg}f7D}qCp2%uvlwdDb+^y?p%GTT)=7ufA8WYowT0(IXo`bB2YktB*FK!j zZ$sl6r0W2mOM!O)*9IPpnziOQ9s|AvHR!zOvHCGI#{1zj8M!NgS3o~2u=~X`!%p}- zja;p_)?W+$2Jlw|c0F%EQwG=W(L|$pyd7-~P4sGm_u%vJISAY@unH}S`_vl!tsaM;*;R-3Ye)9LuHlowu9JV$V<_r> zC9s3ng?j<#{8z~3JmgyO4C>K%I_?YXzT^SVHGzBR!qB*Wo`+YXhApUH&nXVBvA;so z5_3lPnxj7Oap+5e*Bnqi>Vuvi9lRH^B^v3bK=S~6xQ?BG{#Ml16nf1uU(>5X<1x|m zwPQB)Uju6%I&_wHuI>?Ei_)PtzY~~y!J6Q$KMntJ(6@s|^W1ulPhr&447n2myN?aQ zFAD6?xyYX4U2_`7tta%Wph*Yznjqix&}%;1ljFY_HP=h@(mjQCk0V!mv|}Xvbsn() z=g1uZ&8N`Zf@}Q&^e;od6}VeyJU#=#Uy#aZw+49qy-Ekq!zF@uotFdiUaN@Q3aE{L zqfhIeqZja*z^;?~zV1`Et9{(D1pXZJz3{mV`U|1wdbJ+@ngec2&q~IJfOQ|4KNZ-) zG29ir`*I63ye`w>a}=6P;5&e?3S2Gv;u?NN{r6*z>AtY$Eby1`(K*DLG2kB!f7h?~ z0IivbwpN2Lh+IC8d)~@xC33UiTIf05{`&injw0w|3;6dzyK{hbZgI_A+c{Ucw$DfI z5sX__wABMx?K(6MUGq2Ki=zJi;5k0$LX#Uc(?@-A+!okv)kM36fjQ65NAA_o@O_@H zNp14wI<^kEpM}QbnFT)DXB}D_9ok!6=T7h+0P}C^a%@jRa|ZLFBlxGmYpruzPeIcv z87tMD6Pjw!YzChz^zI|)p3dqHt^<7EtPnIm0UrS#71(vY1AYWkw5@RQK!Jrl?Gp;23EV_RUi#lM%xzbTp@ zK6O%diN8UOww?pN0(zeD?t>;B8l7j{cirQz=TYd_1vbw!t=1g#JXdSIGCwGC?Oz%E z5cppiyfwPVo%<_t?*`u;xod!Vy_SJL2mZH#{{{HG&?wY4pUv5BCDgAouHo@;MWc zf_Gavp}7QnMete&Tm#o982obNUXyY)@i*tdYrXaOmqzZ7=sVY_4bW_b z&v($Pe#a*0+kw{^!?6%N|F&m6Xl{m2j#Nh9UkBd?`cZ*BK03D>zY}`*S9`8_eXZv^ z^Z9}|=AQd%XdF*K!#VR>@Q(SwQ=uOi*!6InyF&9m`t@M&zJL1%b~FX> z;TiY>@P7t&e{&ZPy#8cmE z2hDwnMm*OLu0K30vhSKR_HUk&!@u!1`o;6PYIgKWW#n@0eHVS#Ja@nH178iy`-t~= zozS?pb%7n3&~6TBG$$P$fb~ovA4SjLeUETI9SwcAz;1UQ#$h4&S%KZJ+f)Cs{?C8( zH`1M(D|l;ITPKXqA?O>x=e^(^#esFd_zd$Yay1{^uI7p3j#NesH^XNa^jhB>JS*xt zI_S@P^E7g&h2H&b0$%sNgMUN*_C%wc27z6_&auYVr!w#o)H4YF`rH22>x}KF9=Q(w zdmJh@Co2a&@V+jT3ejE3V2xP zUC$TD)pLY{??>^BR3CcnBaRh;-Bw#*-h-M~o_l=%{GwDw?hAn(FTr2e)G;!Zp`U`b zcxKc4W9p-7S_=)&LOKV!=5oNES8DI=;2qy4p7Q0|$Te1Ha)-vm@geZbf!%JKloe@d zwV~0u%kd-lxyZd2{I%fcfY*KMSR0;hSI>RM#Zy+KrSUwYF?48;wqEy|Lw$GTPGzi( zysxvuXE*dZ!`pKc{JBSrMx7;)tLx=pyN|-BFf=?<>8$JduY18Y@R^J2XG7Ha2|PJJ zOTp&>U_JXdHUsPV(e3IS<=}jNGi5gZ?l(Mdg#Ke-o%!v_f7f6;G`wfGuC!g{mj?V2%7e(488j6YxG@s8teRQPp%s~;Lr1C9`J9X zEsi;#6Bj_wXT4jaHi!022cP%XV?19>SrPwUJn+HDbzeHcNBg7WnZWL&?hA+JlKE-i zd#3&!bFHmQ16$J@cqGP6X9?G!f78VJy71TE>~&0rz5v=ygNEzR>V%hX`_Own=vq7e z0p_)95xnckp0Yar58OM+m97r@l?9ql1G|rpgHHkTnjQ;J>#L%+D!`v1w`uUMvm*Gj z;NL;6_NMG<|K@Z7UjbP6tZLAB4FUfHa6jOBfnCE+V4iJs&a{UAjuPijwxnIPt@kl} zy)F&jx$Dqwf6Vi9L*vl$%K6Wx!t>dbO$V%D-u)od*j+Ver0qcxsz19cM6aE_|hrwTtT%KdAgV%GYgYOBcUjnSQtkGU3tjL`D&;S1OpE1zuUbFr(;0?e!KRY-lOG9%ixkmCTn9A^c1Gzjq z>8$A5R=|gAyPl6++x_r7Kd?gI`yp~QhQhjkJ)U|Vaju^C75Z9Z=%^Fen!>3JJQh61 zf!9tyXK}QMTnFc^uA@V1f@}K({=1-QSi|bHw6CDK5E|~kJ;6^+Wz>HN{9fR>z^8%r z%;mTmKEDEU&DXx;cpCVTz#h*v;C1$JT$f%;+BG;H_yy?(zZP9gf9E4^xaFy`*OD&avgIX84b*oRPZ+xZ6z`n&*IL1ok+5UnxUV19%(sOTf1P{~`F2z)OL@ zs+i%wD0sKqDzN)l1p4;iYoN|jX!l{@>Bw!2+{0+MDKwpecMaddXKiTA_keyMd`g2K z8QArU7gqi=f$g&@a&<52eA5!SgVC<)xBj=lzJD8{-D{Cs5&8{*UBk1`tOC9UZCx7J zZM_Q3oA8+wSQ^D4Xa)gyfc`J=y@2-t7X=;)d^E7@xf}c+z;8p78+=#bC($om7soW@ zYM#5To1vM5aqb9yJoLkX?**;{eHqknG(6qbr_g)`oDH}za4z76z|{lW^E}{JpxFsr z4!At}xETC;)OjSZ=kQ8sa$){x9DG(^0nPZx)w71;B-;8I8eY?U@YI^%=z`o#(0mQP z9`s)W&jHR4Tn)HBJTCpST80!f#?0pwsdj*cqa5I)V~wCTE|@f<={(U9DWGi^ZcUlw|**eX9EvJ4H_%!y9ajkhR=`S zwa+^KK+U(p^IGIy488UsxAjP9Tr>BzfzY=H?gvlKxBEilvrt!P=AkX>xwrD1RwQyA z)iM8{LY=Ll>43HtpicR_k1G?szUKO`+8m>y*SI;jcW^zKjCSin|9W7L=M(Vf+5SuL zQ<3`&JZ}KjTypR{-wgaW@Z|Yldxyt?YuzdE8-b_5Q{(L1WAHBo4bN%2pq~K!#ld?_ zc!u18c9+9*3UX^;4&;WW7TV%^`z|~yK+nEkh1|}-1EIeP&t-?ee}&o}M{RuGc?h1I zGt)v#eh|t$4C8gWDDLkOov|gxcU3RbI;=Q0{4Z280YWM z7T1K^;mL7m4L$GiPr!5S;<}UtHQQ7Dl#j2Y)_-H}xs}25y%CMA^_r`Wbl@j|hoR0& z;Pw3F@vIoUaRcbT3Epkp3cfFVIIsFa(-@fVY4G0c6&kmzxna!rTX@~~!1Foe&PFb; z#T@XQW3R)f0W>;Gy9Vz2ozPbQ&^YwW;_;~so@?4|;6H@_<={2X-R>W#?R98|gXcL) z`?7Ptg1#y|3jnJx{|($1AHe5w@V|q<2)wSl+uaS^9hhtHX0&?-p4@9%!GA~iIGVw; zacJDG`fEHA`e)$7J-rV2rO@jc-#+Jn?*{)d;G4teQt(@#9|BLUjgE4tzb*J$@i*}t znc%NI+H;I&xzot)0sTqvM}ga*-Fd;gzaK-R`W+8K^Ac)n3BEKi-{ZXt_3#Y;2Kem2 zcfjY$z>XWCxe=Q5;5{Z>Pqbb+4r9J?{%nVad)zSay6%plfjw56fv<)pE9xu)O^!sP z{A$pY0e&BPwdHvlOxUHf|U-Y%k z&*nK#HYXaj-2r+&hYmun`tHy=V^7^9uI(Vkstxp`px3_U(E9)m-uw5W9`3)KKe~@x z!+7`{0p>GB6X>;uJ9i`WJbOF~Uhi94-xFB1ng0v=x@hZd@Fl_PUiP?E4&Koa_#L!$ z5I*a{vtK;JXiawLy*Sso4?eu#)pu*UL!`ba$t`6RPd`%TUqSmIuAIsU%R$5;5!HQ^_md5##jH3k9p}G*?`MI z&$H#5&}@u4?ZY|K6Pk*^d!f$9(V6Dl{ z)%{|;6*cJIG0*+|>)<^PwZ8fNfzsjQ;GU>`(>{F9LGSz7hjVxnd^Cp69S5H83G@cP zGO#_le)7J{4}CM>>w!B0?+ol3b^#BBCKu*5`R>sF6Mb>y#r5q3AFZE`*1&w9^AYeZ z1G_fO6UQsyd1fvG&11kdP}@3O7oEEtT+eer&pqgO@LiD0KI$yt*b&(E7Y5IDpcMFf z0{i-2gSNywj)Q+Rc+XFcRXgaf06q=81U`eoKMTzBC+EPF(70bi0=woOz*#W|ieUb5 ze^G7D<+{Blctho&y@FM;i|9QbAU z@H%FPW(Rz4jSYeJJ5zt`6gdY)s)K|dY1HgY+iFNUTn zFxThdXscdmJRiP+z6bc+f!$y6j&x{R!LvR1)`5MkMi;}=`@as2_D$Ee1^&F( z8iU^ktZ{bkoxpFx{}J%Kzg~rg?KTF#9{5|dtF_2c8@%R>>&X;-cYjMH8vSgpC~~E- zzBzc#)q>!&0XGY5f9{Wag16^X)TaB(!F3=7{T$#;zypw50@w5!;DgbY+bsb7WMH0M zbzi%F&H;^sebN%Fx{sqTEt6d7>Y;{ff_Gf_|G_sVp340MnsoRqL0=X^qjkg40KEPV zxof@yJogTce=79uJLld>_-mbXI9IvWecBM!M6a`b+LaQ z@N0rs%?ht|!rYg&COB?G?h)|X_vJ6I{t4FCr_lGg;GYNoH~7_o9oM6+Q{aaH_YUka zA0OC#veAQn3M?Y{fpy#FMP%T>lxXh{m!{Fz?Tke|6SnU4D1?orZWB=xIM<< z>cG+{w!=s7u{f9Gxg6JhTWD09>d?C3xDNPNj0ykErhf3h54Z~aIkpSna|`_So`%PP zYtb{%=>2*3B@6g(z!ypQ9MOr=7@y(L=LOce%bxFm=X1*G;H{YreHQrp{b!Bc*HMq- zbKt`8pA7zW)Sm|$?PYGaD|kI4n7;x1A@FB`JtnG2XIJNPt{wn?EU<&?Ezd~aBc%Hb zHE51Ge1=hbWx>xtTYMJojdpcLb)Bz){}DXb#tv~UJb(DS!1M4-)Q}sP=W0EVIJSny z_iQ=n^>2;2Hq~sL7xRI0ReOOoQ=n1(=K1Wvv(tREtMh~Vcn5s$32dLt(0>Tcbo7hQ zK{|WeGjDv($oLK99s+(Acm>)T3jTiJzo6mzvj9BLe%zNgL-SQ&_i-oung@BIS1 zhR>nbz2I06p7X5@a$kd{Rpi=}_o?TGeCI%~+N|eZrnbxvf}UsQEy24lI+Ixc9O}Oa zxC=C#V@;rW6m6A4Z9LoX3^o^#*)AM+M{#0oMI4e_f|7SSM?uU7kr^k6d3x0cKP3KY`&VfA@7(cv z?Sm(;wQ6wRyTC{P?wk1`Nn0BCIneW&bUFCh_zY|X;Ii=l9rfrv6USQcUxU9ApOJ42 z&;6nCeB&ycKnIYuy?3oHr^|!nbF5C_&o0)w`FL~Hp)0xTo=607!^bBSc=ah z>ucLPuMD1=s?Z!uG^(&M_&?BAZt!n`uN1u7Jr>w~(eDO( z%=g0o{ooycfqxzT55ecpgjXAzp!qJa+vVp{UxVgOVE%6H7Vzf-Zv?(Lu>FUkzx-US ze$U*o0UCM^g%7XGMCfk`?6K;P8g@XVxuJSAz8*JyogMn|&`aaE78-sAP}jwu8`@jm z>a;X|p8AfYUA46so+aTqADExX`UklOfv*X@=gDYz(qH50@!teZAMg(V{{js?{{(+2 z@byuH{dc4OlhA0~T<3o9Uj$aJzV}js_4U>8*$Vzf@RtX6yBas+1<))jL%f?{Q|pP%`1;XXW$*sX#QC9K5!BE z7Ykl%opke{84X-E>5DXX1n(NO)_I-e+;|zeTAy7*gWw(1?1#P(G~Cm<2EK!9_cru5 z!KZR)T<87JybgRAJ~sfDhR-tS+k)=_to_=dYvH&Nnwj8l5A52OK=T-CJ_>!77(>UK zXsZe|Lx7J$QvrP8z;5?5XodyvYqU0a<7SCQUta*9uHY{P{}Zr21M6rG|FO`#0<3-6 zaVs#_!`9$ep-#($^N3~bMj!9NMS2=#Oa{}en2 z0pAVH1A$%VeelT>yxUEO=Knh5!LtXj)`9;9e0X24fxbAdm*#`xXJ|NXIiZ;hjn)$f z_wJjZDFaP4w9B*BEzsnJ=AGa@R_cqRb7;(;0?#vm=8rX6(~NZwI<$Y8-;J6-hh_w@ z)?u%KTajB38qI&l^}uPs&7&>*EJeF5q2b;)0Q_m-7Qk8?-Itsg!$a_I2EICSIiIx_ z*(V$HF9fgoskjiH&%%e-dU|N=!#Zz==l96n0^AJvW?-G2?D;Bi7ihYJ-v^%8F+X@- zyK&&Tt_}u&61WX;4Pc%h+JooZcq_)ieQ5{GeMDzn$A$127}&W3p!pdZ-J5>Cm$6x;T)LFuqpT^Gal2Q;U(cit zJr_8%KYFg}+BsKeb;m4V-CvIHfja^}5!gP&T0hNejdk#P@tmMDxnq4`_fgovv8sjf z;l6Vq`tID{;PWlUWDmyeY4|S$)>+!YwTtKK&G6h9diPiFIj9DGy%;_kLvf1n&~E_l z20hPp+-Dm?qcz;^>iNjA6SZkgwx$kp+4n!8nE{RVIOp>HrSrgF0ln5k@44=;@_8nC z25l9Aem;Eo9QQY_m(MC{<1^^r0PY7oAh7GtlJNTao4}qY^`UtR_$uJzf!(h$z%?-r zT>{%vXAHMn8d&SL`NP160y|gtk=xQjF;omnHiaC}!^bX!@ns4^68rU%txp{zf9j({#Z2qgj9`mB$$D(G(%zv_lcQD}6(n;!trkD$3Ju*a|w^!cFIdvOl(+8^bwSVm9yOo}ma4O%lD z95;=pqXICmONXQedGTJj5Vh%C2EEVhKJtBCj+O2O=e~j(v@bi}2G4bpW1{`q zu`0pxZH;lD57#%nzu_9@z-J1u=85m$!{8gE&Qahq0j~tU7i|p&=J@mcFcG;thkS@@ zsrqRErp)<9i5>$ zitF_Vc%6qGKC|g-)#*O2fPN-0_m>C2YyEeu1s;R8&IE6N%^BmLp?5v{p3i3TRc(%Q zWBfhNTHidjPvE+22;Q1TsDbyI)(wZwP7dy~dR}n&XOXIn_bIP+CirkYydik^SJ%k6 z5cHRTuMJ-Nj`cT!Zwt(Jd!yzPz{BCw61iL}4nVULxqM&i9^`I=hCg@Hec|yx1&yAC z-Iu?>_l4(s(3FMdX<*L7cfoG~{u`M41>5EIgKdoBa7HAkP{()VscyINZue9pQ8V>J}G9Q+3Za}DRd zb|w5Zo~}*5Kj7=4_lnK0gI?z=$K}8;0dsw*huqD;oF}J)SGyVuJ)5}QZqVlieke4K zM&L^W>t`kQ(HwU0d4%&sdy3;X_-n4(Cwpj&|F8ES&{lJ_#h=Z+3ZB=3YxM`v+yTt< z2KSnCLgRWohX0x8sB-{(-U8pnE z(oFgTi8tccp|!!`K<==u8tpP+u;Q#*pU&j|Q;0oFR> z(AYXY3GCcf;JLPFPj?gm)_&yBGmHDR3vKbaQghzHXR8!=zSl7fKKh*s`|}x-?+x-f zlxHf<4d<3XTblpoyJ4P`MZ4SwdG_P_tmg%fq0R=z8_?Dq@DsrEOro{d_3&QfGX;On ztLIj?rJp-E_}&7a+24e})(3~49o+6&XnI03AAEoC)sg!?_@dC?5B{ORu6Yo6je~gA zaSHr8^lLGA{+@&P3-yQZeYHzGqxm-jE%QvS{%&#tGFw&Z&ZKGeL3di4H)L+4M& zugKN2u*c+XXt*Ek3yt@_rO4GD;ow;`FKXbv&-3KXXp8&)o#E;0$e#!8MO&N$S~slc z`Az$XLq3i(;70;K4y^mao__@P_|${umZXpJRUaLk|L=hR3)e#P+%XPVwYjb7;In|& zS;C?F$aU%&&B6Ut&qt0|py&Olwbaob8qG=jkHR(8n&4OnJRW*I|6ZPm#zhVCQSf&K zYeUa{p%py00uM-h?QxEhz|>rn_(;d~ za64+?^Sge&?{*)9r|w_JJJ9G1W_=Uj7Vy_|qN6)<3qgM$u+AIyT#k0Rujy}PJJ!Kd z*Vnn4hmN+utAHOyZYS_91KX!7FyDvaUa#7uSImY_2l$VMPbzqa`tH!);n2?}96x|x z1-?A+OQF%+QD~j?Jv%jc_eJ-Y@%hN*{l$H`8T3=2=ed__cqeG;0rTf9I)^wk{*KDP z{2gq~2lu5-Xk7pEs7-Ug!M%+4>5ZXx^o5Vk-uBl$=*SO^o(-i@+uuXe5}JeH=K>!O z?3($0(GF;I?HpXYdVyEXu9H9KqMmyt=iAuGb>v1pF9UxGjm~}!{``ygU@P>!6msVQ zYks=#f5MYz625PvHOGBi1E2cHtp&_^$a8*wB4+(t&+_^`4SyR&Za-7Hf`q z%{|w7HGCdVa;2LCp64!|u{|bNK~oTG+WPR<*+x3nzbkm>wnHw*witXk$KJxYRfEq* z;2%P5)8VhZ%yAN$Jb^t9Z$hv2(~%C1)(Y1@5&FNOzYg_}2;TZfq5mFO^W1R~xCd~0 zV4oFv2Gf0Qe_o5rkgNOGaWV8ig6A2G_d-u-ZU^Rb=zN@o^j^0^KlgDwo8;>Kqu%hj zADU(0^9FXmwgFFt{x9%v1K%9@{G{Q}0{i-&4ea<0_-kOb<>(sNHQWS#Bk-%Zjx~XG zKRW2Cd16mK_qB$e&t=-ntX~w^bD#9&u0NxDDb#*Ry{XJVpnZT~0Ek1kR51$u)7@rGXgnw&zFFxDb4*%xw&UzW+Gq0vw zN=y3#pH1dx#`$;Tj$-_^wtJkLU>@dz=8C`$y$90UIoon@HrLOK73#F81x&U(R}cjzX(lhV9g(U)(7S_y$kvyNUtsrz_Y`Y*5V@RJv*2?paBk??ZkMP>HQX34@=qaG z`Wu(DVb=&oUf^ zfPW2*+wB4VGw_wb>l!)oK+_I9KZm8c>d^h@>w7n_)*{zX6F#chYuzOH3Mwm6^vLhcD*oo5{S*_`7~`0yU# zeZ3Ky_mMjXJokOAC!Qx2?h*L& zeP+Gy=e@Xn%oF>cgy+QnY1bOPr{O3M|2)X;4y^ZooZAMu3*gVajQ7O^_&0?o$4ztC zkp*p)1J84U=B?vzV7*uGI=6$@d(;j-4}KpS>ou>8R{`^$(izEdb$I%^7e~9Chl8Ql zdB$-G@M++Yz?yrmNAt~C>!k5R!8@*m=1OR8g6Dp$C%gv_hsNh>w#)g}5I&Ei-BxIe z*QhA;?BfNI>v5Y7&1-?p_lM_B%S5$Q-&e)Tn@}!{#=G< z;IhzbU3KW^!Va#zTod$j1lO<^wN*u~&S2JX-_f-*&pE?u#C@$a^!&MS{@@)v*U?AM zbiNlVLC-Tu2h>~(cp>z9u5>JchI_{r@Y>fLj|O&scS55z&HT#XT_@LvWAMor8tW?o zcLaVVutRH$L*wbt+0Q<`p#Lp+*YN-QxnU`^RU5fFi`rB7qvJYgxDIHIaukK;aqusL z=ia?Kc(tWk`Lh_U`3~*5j%O0Rau$K-xp6so{)|S?-44$4($Mqz4hX%+VH4W*I+Huh zbT)ACIco*<|9ijqy6|TfyWrC?+LcCae+-{*Q9sYOJWIa>O?`Oo2HzN-e}LEXPOhXg z`aMJU{dZ`p!&7~9UpfPGtzMY;$o6yi=sG%5iAL>J1b;tpW#CcaHezR>p`g#UKv zZvp0hcUSO^&B(nb(d&C0hku~a@8>Ag?qv9Uoz$l9aX-?SxPIM(#@hFdwf-2d3yrT4 ze_wF`+TuE_J}Q*Ydg?;Yxui3#gZsGZcW{o41kZa}d#LN=TxtvbQ)ugj!0w}dhUF*< z4e$5i@V^J17bUs!dOCP}-UJ`dXSKmSLT3qw-e*v*g8Tjuw6zm8_;*3oXRg(EL9cn@ zdbCy;>;84z4t@^wS0%i3S_hmvHn7K;=O{i$E7xbdweTMpxelI}bVhQFgQhidF9S}8 zK0B~#bMR+v6QR-gxc(8~e?zY3r#0P!ci;7FWtU*1U>bJ|piy zZkq&a96w2N<#iu4ycaa)4$UP;Z{U5Xb4lW-&g2;7}r@I zdaYyTi-4aH*gW@No)7hz0*Bu7@pZfuK3@j!(7ogM1o(O2L%=@*b3D05ZG`4lV19m+ zW5V|+PNO!?e?6-@tkGETJxtdB0`&a7(5>*_1kCf*9OO0veh;`L##w8KV_$gccX(7A z-*Xrb&EUYkjylIWIBwjhbln}3LhoFj6Lf}m@LtgKh4t5=X6@tVIR|v^a&UkD7(S1o ztwF#~!c+B}ml*9u?pf$xOt9)uJr155e*v#^zC-JngKGkx`|gEC^Va?4m_G;2GT>^! zI%_$1Y+&D0UqF-nf5z6eO~ZI@!#MEw{oapU`|Ekxq0fGr&zj&o@y!G9Wc~cCvDS94 zdwiaK2YpEc=HK6_jdu0>@U9^}^lD$h{Y%eWj_-kWMsl11UkCW^|G{pH&rLkLj){5{ zI)m+xT$^VHyilEz^@~B2|W4xW;a65bIu;*YMi@75iiE8IrO#QSt;p@ zYSkFJ{-46fnCmCk{2$O3pF?@J;rn$t(AH7p>iqA}*~W8wB{=vOz-iPseP z)CA`9ss3hy`=zzlzw4;EVg4`RkKnU3sX;n@rp&=JmB!pr2AI$9tdsA7^IWPkwu5VL zLDa9k%r(zK&Dqf|&kSx$ITfJco-!4@#^2YX8F)QAJ06YSt#u9aqh{kS$n{xK-{Z5A z)_MD@PUo%zZi}{b4v|Jt27TvqgvQ*SthpdO_51eLtPS3A4ETCr`M9?B;GaTmlfd&@ z=q#-{rgd;9G;d?9=ELW~(6}~@p+mph;2P9lYxFZCud!Matob?g4xO3J^ZI5+ySvbq z_E3k`E9Y{({R6yy24_ueK}v(yXIR{>&i3}UYkb4%6man0Al^Z6Km_fbE)bnJl7 zDQGr2y8vq;fGNtujx|M zqjQ&YHTR6S!vAaF&jLIC0p{m$*~k8&vFCW`F95E9IjMWi{p|#e=8t)uAsr=v8)DqD zK>v4O*PwdrQx)4xV8>?QX3+CzTQ`H}{9J^#^m#G+bN)<2F4q&k zr=dFJ>CoQi;4^}rVeP*gnnHoi9|ivt__u+%Ch)$ih}^lDdt3*&FX(+0x2v3({7mq=b`HM3 zw+j43;BN4_4R{qiQ_yRjcW6F4mLaz^_!rVgY#8))TzWV6Id5wV(AgCmlBdb07Q+{7CerMev^U=RuPjSofec+_R=Y(+gPF z#d@wYx<;qCS|R0Qr{HlwzSf_I$wy0U_-Ob$9t8gta4~!yWM%NKVG43D4~?Ij zJ_g?uK3$T&tG%`G$qxSx$Zd_>9MIeapVOi77=8@TU*OY(Ja88HOap!`G>&$_vjV%V zH0Xyx^E~hf;J1LA1@;)82cIhcqj3$B!5=}tsv|cqJS#wdH~3khce~Aydp$JIfL{Th zvuJk=`0Jp*9sHNTM}hYNKM~mVd=Gve_!q$M0DcmEsf-#p{@b9>22D#~^~*JsM7xg# z?`ypb`sL7M3f{Rh!Si0OkKDq*x__P95Bxjeiv@Pv1Wj-7S3_SWG_F~5)uHR_s2Uo# zI|KX>;0b}PDUEhVL$e6@C3xNoybN=OW1@Lwf8OJRleYA|d}wz+^c&D_$)qjyne$fj z-~PLyZy$P(kFKMmMdG8J#mM#N;H0|^{1W6YLY=e0Yb|nI1kH2cUjaWpc-Pzk_)=)H zAouOy-51Sm~c;upvG``x?gW0`TX6{{o&1 zfuDnBDfkh*LV)ODb7D` zm-o(I^iktujn-9%)^_t10{i-w2haJlCw#2YwKnE8ZGzlaQ9}vv69PMiqqa)Wvya)K zX^q@9(2s;a$F?r?1u#~B!}EJ+xOZQ|vnATP4w!vB4qoR#->2MPu18xOXYPaAYaFk` z^Nrwry>vb_?h4HV$ZZ_FHGcpP0v-dbd%^mR!8>?AE`dMy9nF8oDB!d3;l0NDMdRkV zG!}Z^rvt)M~L~bXvRU0@T<_y;* z)#-M5ewc!`IzzJunCn0a`mN~KIPg02xGmP)1AI5&fxvwNJ65A#gP>Urjpmi(MDQLf zYHo*K=NZRz;2rRJ1(?qfJd18a?iT2K1@FGkfJXb5`R~DVE^%$I2OsYHpCET7+U*{^ z`>u1H+ZqBr&qZ9v#zMn=?JRiJWBs&gh;f?; zz5_7tsb|5nzkmIo_U<}Z&no#AFc92=GeCm7>ktSY9D;@r+}$O(yL$!=!7W&D21!VO z4DPOjyF+m9?%(~^<*BKn>fXQabQLq}th2gzZ|l9^@8rCv@u`Pz(e7aKw2 z|I9VKcbK7#&zSTCo5L9R`ixf3^|9IT-4Oi|;03|cf>#9J*Kl%n9_wBan~AypuJOsg z2fUxXtP1aQoO|$4*5@etH5Kiy3-s*-vX{$5qk`N2l$)d4~BQ|oWVR^ zhTgsJo*Im1USfU&e__KJ|0~dp-^L;QWQ?ujQ*#unGb@%ksxjFc} zhGU<>JLXTKIR{+tor~3blVWxLCgRIXB?Lxbkfad_uPW~st_W~~tUIDxg*cx>!^Sd#c-@yGD z=Q@jHwN_&*fz9V0c<K60!4XYjW^PXtoCH zy9K=G<81H?fgb`Vx5}f&JbfIebv0kCNZalug`L0d!cy@T1taQG7ZrTLje}Ipt-I3&3>mlvB4*TKTpB!p@ zlFvNNH@F-B)?zTeAETd$cC9~q!aFb4{9!Fl@|=hG3*-ABy!FI$u-0DU{Eq$-_^O|= zdJak-tzFMFP2x;S4*kIE;(IYMYriCB`d(k3jc@Ij*jHfh#;*{^wS7$EliL7d9s;hq zlpL0We~y?N!Pi{Js@<6PgkepScE?9E2wZot*yG^yX?H}!iBr#0$#ZY?H^R@4@BZ-F zr{!;dzeWENF*gIdKCf!}n9pc+2a9cqub(q~gQm{k^yNpeb3Gk#>hA?aU-cpQ3u0c6 z{!s7<;5tuZbHICNa4(NU|2??&OLDl1IPajTJs6G8(NzaxHNUZU(fc0hgIoNHQ|rLG zu~vt#@7+lb=D8Al&138luxI7d=v;sLwWI zpW?eR`hSA!y~;87*Vn|k68%r`^=|6qJR5O*AHwY&P0dBkZ)`Vw{khe_Xl5klVPHSA z^?lci6Z6*ph?6{f!M{n&t>8Cld}_!{{F}y)&@WG0L&47Vsp#|hL-pT%>c1y^iyYR* z_i(WHgdfm*r&u4PF-@SbZ^!mmaA zx?{w41$$3$?H%2G)0XRe_BM~1)2__v&$LzbFut{4Vl|K9KZDQtTe{5~U%xk6|9Otw zfd2J{D~F2pJAD1DAy#*T*e~>DGx&k%tq(onXKy$;KSdmUe4cUh{Rp%4)g-#CDw_Wf(4P0v@`uglB_%SrIF?TbQ=T~T4V+S@q&-ImCY&&p0 zyQQs#8crYU9Eo|CtJ)a-{rFnjT^qxRxfwBQ55^V&ztC{v*L@>awWzGVXWe@n-$TK5 zpHG}yh*Nbkc6Gz)Z;e}UAI8@DvlG7i67!zMr>(8gJPy7a{5-yY!?)IL=4%G{S-|_? zJ15v$T6-r}@nctl2Z4Ko|J{7km%1-yOb&y;m-sW|dky?$;Cl9nId0$cY-LSbti?>b zb*HK^shm7tDt_{;^CjlLOSfO=ki+^-AK!YGOk3;F?sUYj&%I;yv*Xz3U~7f@vHl)G z;(HIQdJ?-Ajh|(mO8kk@-v$1$;q=9MzYfh=;98&2TW=>qvoPy_EBF`joePb1%yaqV zrcdAJBF<2-bL6>GeMz2mro_eqUjx1sZ0)LjmpJwLM)KJO-m|jq!_gl{OwY~ovttau_20RII&V;Y=PyCVKi@|Gx`!yV^dqvE8 zQtt$aosIry;vCG{J_p|Wl6zqQadH+^8?VBz+}cfFs)od7ApZWH`K|AH7djQaeOZ#e zEK8i)vE!T->mO1=D{ELaRJlM}VJ|O-c_yW_=9@98dv(mcW{s-5R`jRhTfh66epNovnDfT) zrx3?J)_D})JyO{wi>-)!6amc?X&Y!QC59ZVSS@e;0-y z1oqtD8h%yU^<1zf{~LY%%q}_X46gki-ZkKSdB63u+#!sE=ht||+?O2o0Z&d2bq2+H zf|mz-E_)AjKYoq=w}#WNy4S_bXAj2Ev%oy-9vB;f{zCY(z;Dy{58*e&x6ZHF>)`T@ z{RH-1SpF^V9_@F5V_o>Y-TnAmz_+dtMSGVdfB*MI`2I`(sX3J2U-ntMeupCF?*i<= z@4oG_P!yw$whs8+1^?v#4gXo=Ge;+*`4Rka(?_%7U-+(x{%2xt1%EWYBjF$E;JUZ1 zg66{o{>*u5^c#a;1g}S)tHDpz;Var;_&325(eC%O`&HAV?+gA#oUV+2Z{o~~e!>o} zSXa{SyXX(1t-Znh@tqs}3h>Vp^HuO&4d-0j8{g&8+yj4Nn9w>fwUe5|oEJHQ+}yoH04O z;l#JjoQM7y@^Rm}-(A~>;_ErJHT?Xv) z@45|--D$WBd=K=SHa>mytl1ELJ=*F)oKHKr{Fg*CG1#2%#Mc^oKl%L9aPo1ks}9GW zYB-uH;6KH8Omc8MyQ3e}aO%Kn@CP-V_;rsB{*65AeG4(qN^7{!3wIHJbMQZj`3C&b z;03^SSB#Y=xov^Qdi8fS{Tfbxy(2lc`w-_gd_RDn6zm=8TXL&8ioMhLYPWK&yFqdu z4}2~9Yru=4ITL<=aGj^Iso`G$*LfXttQLa5iTtaN$(e!FLq+RFzGxX1at>?9V;=4WgQ1m_*UxDU1a;RsYtdly&gUzSz39%W#$AE7H zF9W`~;pEx7wVU|fbDZmw&|gHHs{iqIJ>QGwXng+#KXq$2Ia~_=6L=Oh|A7A$T+cPJ zEy3e4p4)+~14p3$gtd1L{B__l$fwS-n00vVPFvNtCD6FX&xd#aj!&LL(bV3|SnUUY z8T=vOiP3nbp9+66*fD<|-kNY<^K$){il)J5~6b(bwk>;j1q( z_tYcs@BW3}_xpW|-g;|2ab3OD^fk_v$7}e`N*{-UJ@a-1S*zCV0qAS(rSCU& za;Q8egnD8G_B@jw z2md<0HDA$>h2|P?)r#0O@K4aL=h_KqYR$xsL_Y@Kv`Hr)o~H_x1xDAMfMqgR8y2ffoV$^CQo%yPGEF=fH2loBwa{)-H4V z5shuR*AAe+TcYpZaK_C$oBOfGEgJW@YqA?LUj$D?yM4j+ycSy@{p#>Lz+VKmwm;PL zm0QirElra=D~I4!I-2_WcleRSw7>Nn6!Wt_*Ut<1eu{nu_}UA}!8&j{Ioyigvwm!R zcWF3lcvtkjz<) zody3EcxCW|4cC~I-P6JKwR>v*#%H~agKwQ3vAH|AeD{Oz4zBxQY%2QrG`x4MdQORL z*Kp>p@{H9P8mk%=`@G@gT%TbEzlx^nd16l7@(CV*ruIens(Ud%OZRT$b3xrL<7>>P zh<_e2>m6>~D=v zK6Uqq)$>JcI(%0EUj}yH^?_fLoO{6^1n!2W;wPUvi-X5Pu7h8azLY-WHVK+hXzpx$@_Yi#0{k1c9<+54nqR?7G@Q1^g0Fg# z_}(RMMYD0k8N=PsTcZXsKAWJi4!cK&62AxfI%i|9dCwQ`4~ybk^O(NWzp;tUNX$C> zV(y(4$iFLbPQiB=_zg65F2r0v&dZ$4(NFkREsE7=4zarDq%RjXoVoL^J^>of^e2h= zB{65BkClJya_}?6be(vPY))V59k$7{`W{^MHn{SS)tx7{b;Ie`eE438<}i5AzIn*u zFtGQBT30dGz?+PT@7@_jTPNdt3HV0vM;(2&;aRp1nyQDfL&$Twj&F@o#m`uIhdct` zb->Qov+&lv`-oX}Cg#4bbr`F;h?)O8@S}I;v~;x|GI!SA3DNsrruytReYAf1Z+N;e zK8{0Q`02s6`y=iCh~`uHF&m#8CPy<7*t>-JEQH4U*s}07wi%Op$4lCpf*kHc?>Nr_ z-xvK!VE4|x=%)jJh`#P=vG?KEZ+vpg8m_Oi-U=^`zWC@D!1oGx?|2{5uKVI^^uH6o z;$+->rrVA2{OVp^+j!guAS&waJVHs)Qu z<|uLYZ~FA{V%q8tu00ifZ*bNB`1&^;jzO~(IoynXk%nW}kk3-+eQ*Cu@F#)2L)My% z)%eG1og{zvW91XR&VpFgy_k1~8;EH=Jhkx|hcAeEcZ-ww&x7kMh%JimQ)mu=zo_9@ zJ&(k8Z8+`L8c16=q4$n7b>pL1lsJB-@d9x!LBB*NX8HH#`K#W^9NQLL@1Bi4L|dy8 zzs5ZI{ND7zHNS<++*9?O5_A80=kMBlYfQSf{}x1F`6vE3@Wa5qKYXW7?JA!d=h%Vh z>kgKfb*99;a}GeW1-=u2Z|U^6V$DMw@66r@>Ukmd3D~vTlXiW+tFtCKKZx&vVDA-m z->&g2JG$?)5=_I4*`onJBUu6N;E{fcdZ z{ zUw85hWqqCytMQ4|b5?A}j=p>|yZ8hSRQRT%F_LcR_O;zPp0GOVnpLvH8(>#<`c>Uu)1`pK+{pD-i#4aINR${1WXx zjK;aByHoVjfsY5*^Fqw~)o|kbcLDk}K4U&9aq2#tw&tdf^^VHuJ!^JA@3YVH@ZUEa zI|shofAG=N`5W67{lWCn`F$LX??K%b{WNI2zs*crTY_%^yQjW_ubP~(`a5H_G}w1! z9fj}VXm$nr?vY9O9pS6_z1=tYUEqb6%Sg4q^Sko@e&jOt2Uf5xfuSXrjM-*zZU!h;Oo$=2A;X$#2*fR z1K&-+6X81=`5%YoAT+PT?*PAh2Upu)pjiUVAo%kd&a>5+Xs$zZ7WfJ9)aW0D9~=IB z@Fd_v!AIb`IsCPa&%D2j<_7Qv4QHG`2j7C`cJM~vr#o$x|1R+BfcrOGIn)?!MQ$@R zoZRMz{|VoZ;1_E+d43H(qk~)c(W)=8S@8WBz8CzgZJi|M8pK=%&C=lK!TW%Z0>4jN z`@;`pP5uphQPXD}x}cv4d{4v4(|)ao#yqRtGcT0R+{MVZr~nI)IKP7r zMl(9tG4zah4&T!lt8ZxcLNxaG7&K#mvj!^vx$!-;qba_|KlU^2)|$yUT+#R%pZfYW zG__`8j}d1MaGiazWgAY+sztHNKekcB(cFsf)!@^?FM=!o`2GO@Hu0@F>%zNcYJDb7 z)xE5ZozO3g=0W&>f=4tQU+b`E?g8kZCg-i;PxuRb8+!Avnwk7>!S?|4XLU4{-*51B zc9d_~2E=);!`Jt!?!~5UYddW%irzXu6n!sn?XOs!9kC-i`=#QlKZku(>m;@y*gfLj z+@xtT7Y{X@oKFV7Nu1?q%iR8|-n!=P@214Rqs2@Pxg%8{hBr-}?e)E7Y4-#0QXO1* z_aV>K8=t<+f&N=Gec>kuZ-{0__-Eli1z&)s?holpZ#4U&nG!rd_z%|7%Od1 z)?x4&-~$?tWo+x~ZQ$1?=ERJTYpD;K*_&_rdnj?XZ#X&J18=Q(0pG2_Pou9I60022 z)*$BPO*C~5M&rCpKwo+{9F61fGQPVJv-WTFf0f%w=}I}?9*_|f?{ zt7E}mgT4!S_JLm*{U(jiUUPlA@0P;Xnm-DDC9vz{8~9_$$2I9Z?ttby^0Y7OG=BWf zdRPF>nXRpi|I6@$!B?SK48Gg@kfI9 z0B2oo-+b$wimlXe#>6}iMY9O_67Z(r+rjgLYa9~)Uih(Fzrv3WzYqE=>Ei?7f#?S{ zewcEBzW1 zycT#B;_pn%DbU=9#&c(kj=uUiwCR)2S?G5s&LhNM7Cbqc`|Nu)%Te1qI9gPZf6X$cgm;MLu^Ib`VGDL zzlh#-RsD+fC(cI1sWqG&-s$M;>#gw}4b4yR*6Ls2t$~}hb`#%oWLxwzkelxrz8L;k z^p4vqXljqw9F~2L-u31>sdqLew~x{HY&g9A?MqvWfR6_MgE-y5H=?O`(kA|Gowh1x z=epiUU41E?HGhi^U*Fq}n2zCU{EpAz^u>2{d*Aodu1kLhp(ir zAJ%aCvLO7NO&|U=`ui1qybIsU;Cm6rePJD2g?x5I@4G|KAb!0&dX@hfk@ikh^m$ip zt%pb9J(sOZbq9-Ci`3joU+$srzSnUK;&_%#5AXZHFNDv$)bH88-}sDk-8rit_21U$ zCj)=b(Ui~0@ZXTLd)8XFB>IcMC*yl4^S*7vZ@e8r5_x=sAk$l)yTQQ&%KX>14Zxx}yWDXYGXkLLPL zTlKw)pT56>@3#$yul*JC9l3iF^I-4`=ojwr6>BUsb^lEK#o=r3hkqRWJ~7Wl|0cZi zUhgzZ9P_judUl^k%$e}L9^TI!4r1v#ClO@ijT7PD$Vt;-Sc2jW}L@`*nWnwq2Vb!G+E*%4bAyi&ti z|8p_6b&rbGeJpX@YxV3Idy$y#uQ%Xb4_ClnL%VfvskX}8U!Ty{#LYMP)Lkg}P-1$P z)txQo+VedI=4`!MkNDQldWOol4JLlQYbg0_48IuI8e(0V9gTZ`Qh3i$>&7i;{0zb8 zof@l{`_4Q6=4k43mDmrAzw2iYG}fQG)0Wj()EZ+Q;h`u`v?w`@4$xi;KQ>Q}_1qnqS2ni+Nub-xJZN##UR_v7Bq;HvSIuo_!Owm>DW2gDgW1 z-5bvPQfeJ0j_Y=*#%F$Ad+QL#``%jcJ?Q%|_+6=k*ZsJc9T;w>Z)Jx%9=2um0BeYHb&;Iei0P z_j|^_{w&r)Iv`Op9B6zVme1Zb~KfT&u+up!*y*t4K&ORS#9 zvzC4&j(5MS;LmS3wjXQN&%3-6Ry~PX4}I6)1szTGdBuj)ckh0lI}^}uoxic;@U8cq zCeGi8zZAUh8l9GyHRiF=;oa|^DYfs?*4Fs?p0PEEle?J?)^_G-2=R|W zKPCEl&wS#nfZlhCK1R&viQ|6EyM-&(1}$doq57}xPO+*dY3u$DUq1_f15G|NsXm;8 zehPB#hyG{qMXa~4;9c9+^De~n*}T?s>;dor4JZGu_@0Mm5%^lSG3(oN=-(sej_94c z+NYV*pYS~%JRZLFxj}3`c*kKmG(#D;?u}0$YkmutdFQ#Z@yW-%KZuyOPzS7U*K9)rQMYpuK4w}dm+zLFv9F?I!wIXH#rPaMknJ2yi{?RqR^NJsO`p zFGo{nZmjlTG}htq&_w%x`~Oc7b9?ZrjKdCK&wA^5{oSJEwlmoGOrA;nXUTbqrq8?| zfv=i+4vpr+ritwW?hf{ys|)jc$`|uH!ta2u=Wh+~!0+?E&hG**)9cSZ4s81L_eJ`3 z48Nyv_B?-TmYC~LJWa!~!E*++zn=nr1bpipe`-zykKQ!NVLbF3G)>0p5A^TO{-=IB z_=$+KI{X3P2OCaX>%gB6z6E>~cwO*X;K#tngFgWO+;G~x3OqhJ?+qT4ad@3L{lWKx zdx94M_W?iJ!Ij4-;(vu^I`Hgh_J-d9-rUY4eqS_08lS!wj)^aYe;hm#JQw&W@blpP z!Fzz;06z;}3OskqIeB&`|M|gBpdSt1JU2&k0eEfn7r`G5-XF~~@C!CRxxE5E2l`>~ z--4F|JCD0JJ~3CbxO-1OKF;GSf1#;bo%q|LxdA*DXWs?zT^mkY)1#RM&As3^!M(umf`>Gme9AZR zuk2{*>+j(&@9;Gy_kioHiS3U51NhpTiN8AhH=S{=?>zxO0eCC=>t5@IrtSube-OMe z#m=MWtn2?4;;alFgM5a8`;fx}4QFio;#+Gh=Du)^or`8_;%@~11^7$wSKx8M8-w>C z=5!5b+=ik#3;cP*>5FGmAL2|woPF?h9uH`I+ByV{^I~17(;3hoWQ5&cxGw};^mB>t}8 zY3EL_MjLHke0L-MYUo!7pA5bP{bKO9!Y>IwQN!tD?XTdM(EkRuwww-s1uubKpA(_}}PHX?${a?gpYC7i@i73jQi$*4)Kvjb-f}+;G~u2>t#|AKtoj z7y6lq>3Lx-b&jqkzH4|5;`9WckG}SPG!xN<1_7yLc+(Yp628ux6U&X`vm>&#r8 z_|--|$EClH=k)BOZp8lqyg9fR{aOirUa)KR7x>xn{hU62jOGn+--eU3>$VpfYh&%- z*rjN0BhLEp^ODa7@XNwG*S9u4`P6!gy$l{5-|J-$DKtL7x<yHJq3yz#k7j99;W4R`;LyE(AX( zxy=NAhc(a>ecde+r|M5^0OMm_>WZctn!1Z7&iiPb3(tiQ(O8R|U(eI$(K`;azz+ha zAOHRT|Bk?aN8rCB@ZS;m|7!&54jKCcEdLe!{ouzr*Cqom5B5G*XH(9;A>hNBKKwfP zdTy={KL&VD@S@BO7>{$6n1wK8sdz+Va8gZP6QpYh)q zeyWBO=K_4EKyx3OGn*#*4Lkb!`Vf3;uA`}YU2IqI+6_l@E&SEs)jI8#|10pHfNy84 zR)(*iFQmT*!#mDj!Jh|Si@x`P?+LE`66=nBRx}@gyMXJnj@WSxC(j4rr}>MR7ok}U zydu~&wmWeyL*w(W>;G>ZP0h`1_}+u>DDbM_v%n)6pI*dqFI3-SPlKOqIBVl5@I+`X z?%?`2-V4DG1wRJ&ev7&*OQyR{fIL=8f*Tnjn9~DL(K2d&j9uubpO`8 zXAEnP2mjh|;&0tF`CYJG8xCJ>MZYAzpOeo>;#BR5emi{UXt=DtSLaBq@{fKiaD5gO zI|Th~%y0j{;6Eb=>s$6qwU@P2ZFv5^fbY7*cQ4C(Mm$W;-ixdWRj*=m(U+ZQYjHH^ zfNL+ryf0<1t=PW#JbE?9;#>8t#-OZfd(62z1-)lnSNN?uaVnPQ(SO?epW@HH>76&p@pT<2G#xgC53*xKmbY*#cNgC_-7os69b-UK`l+^6BJ!}3ke z52NYMm@E&!I{N+K4}l@DRRvZfNdG}JwCwW%CN?*2F!{K*ma~)js z75pl=_I|7zYr}ng3H%A@_Xm#+z6`uF_%ZM$;E`Z82g1Jru9}>_d<(xP*tz})zUDV` zJv04sF6M2T#NQU*q44wLTW3x5ccI@L&8cWSQ%*wv7MkAhD}a5z@EkcE&68uKi!GdJUQC%)&wp8>CC4tURw z`{0izhvD$n>bpC9PD>g zT5K>eYi}l>VI57)!4v4m1doO9=)A9W&c-Lsmgv6#`}cILpU%;_O`ka4CAM#T*2ZDv z@B;C>!;b^@F0=&k-^ce&@Jrwa!PUo@dwi+JSI%W~qW>B^4Zf2#K7DjAEQ)3)e78d{ z@86#D{JH^O>)|-?vl4R@{K??M!B;e#@qe!26h!!`C0^xe=BW{ z#;2{?cfqd{e?ENQLgU{AtaTOJ7kz0Gv;G!X>{m3_+d5~X_wPb35C0v$kAtnBQ^H@^ z@Hm}@hcsN{S#2zhW+eDT@Xamf3rI`d)uyG4nW};oN)e%ihHCZ#eGB_;??i zm6-qP_*PE#cQaz103JbZ-HAUnxb|1fIjufU*uGJ1t=MqA7on{FHf6@dxwyCSu@5@y zq`vMC@842f2;MbZ=T0o=dwo31fjTP2c%EL<_*mVYqJIG1v6=zCa*Mw9d+b2w z>lE-5VE2gkpH0ztKGu3pTmF4jKWoXqiDtY0O~AK^ r^F6r!CQI_Kztxg<>)j)<)A_yQE%|-n!`j~n{#z4OjksZ{KjZu_#e?ld diff --git a/examples/i11/step_scan/pyproject.toml b/examples/i11/step_scan/pyproject.toml deleted file mode 100644 index b47d053..0000000 --- a/examples/i11/step_scan/pyproject.toml +++ /dev/null @@ -1,152 +0,0 @@ -[build-system] -requires = ["setuptools>=64", "setuptools_scm[toml]>=8"] -build-backend = "setuptools.build_meta" - -[project] -name = "XRPD-Toolbox" -classifiers = [ - "Development Status :: 3 - Alpha", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", -] -description = "A repository for useful python data analysis tools for the X-ray powder diffraction beamlines at Diamond Light Source" -dependencies = [ - "numpy", - "h5py", - "matplotlib", - "scipy", - "pyfai", - "pandas", - "lmfit", - "peakutils", - "PyCifRW", - "pyyaml", - "toml", - "PyQt6", - "PyQt5", -] # Add project dependencies here, e.g. ["click", "numpy"] -dynamic = ["version"] -license.file = "LICENSE" -readme = "README.md" -requires-python = ">=3.11" - -[dependency-groups] -dev = [ - "copier", - "pre-commit", - "pyright", - "pytest", - "pytest-cov", - "ruff", - "tox-uv", - "types-mock", -] - -[project.scripts] -XRPD-Toolbox = "xrpd_toolbox.__main__:main" - -[project.urls] -GitHub = "https://github.com/DiamondLightSource/XRPD-Toolbox" - -[[project.authors]] # Further authors may be added by duplicating this section -email = "richard.dixey@diamond.ac.uk" -name = "Richard Dixey" - -[tool.setuptools_scm] -version_file = "src/xrpd_toolbox/_version.py" - -[tool.pyright] -typeCheckingMode = "standard" -reportMissingImports = false # Ignore missing stubs in imported modules - -[tool.pytest.ini_options] -# Run pytest with all our checkers, and don't spam us with massive tracebacks on error -addopts = """ - --tb=native -vv - """ -# https://iscinumpy.gitlab.io/post/bound-version-constraints/#watch-for-warnings -filterwarnings = "error" -# Doctest python code in docs, python code in src docstrings, test functions in tests -testpaths = "docs src tests" - -[tool.coverage.run] -patch = ["subprocess"] -data_file = "/tmp/xrpd_toolbox.coverage" - -[tool.coverage.paths] -# Tests are run from installed location, map back to the src directory -source = ["src", "**/site-packages/"] - -[tool.tox] -skipsdist = true -# envs to runs automatically with tox -p -env_list = ["pre-commit", "type-checking", "tests"] - -[tool.tox.env_run_base] -# Pass all environment variables to the test environments -passenv = ["*"] - -[tool.tox.env.pre-commit] -description = "Run pre-commit on all files" -commands = [ - [ - "pre-commit", - "run", - "--all-files", - "--show-diff-on-failure", - { replace = "posargs", default = [ - ], extend = true }, - ], -] - -[tool.tox.env.type-checking] -description = "Run pyright" -commands = [ - [ - "pyright", - "--pythonpath", - "{env:VIRTUAL_ENV}/bin/python", - "src", - "tests", - { replace = "posargs", default = [ - ], extend = true }, - ], -] - -[tool.tox.env.tests] -description = "Run tests with coverage" -commands = [ - [ - "pytest", - "--cov=xrpd_toolbox", - "--cov-report", - "term", - "--cov-report", - "xml:cov.xml", - { replace = "posargs", default = [ - ], extend = true }, - ], -] - -[tool.ruff] -src = ["src", "tests"] -line-length = 88 -lint.select = [ - "B", # flake8-bugbear - https://docs.astral.sh/ruff/rules/#flake8-bugbear-b - "C4", # flake8-comprehensions - https://docs.astral.sh/ruff/rules/#flake8-comprehensions-c4 - "E", # pycodestyle errors - https://docs.astral.sh/ruff/rules/#error-e - "F", # pyflakes rules - https://docs.astral.sh/ruff/rules/#pyflakes-f - "N", # pep8-naming - https://docs.astral.sh/ruff/rules/#pep8-naming-n - "W", # pycodestyle warnings - https://docs.astral.sh/ruff/rules/#warning-w - "I", # isort - https://docs.astral.sh/ruff/rules/#isort-i - "UP", # pyupgrade - https://docs.astral.sh/ruff/rules/#pyupgrade-up - "SLF", # self - https://docs.astral.sh/ruff/settings/#lintflake8-self -] - -[tool.ruff.lint.per-file-ignores] -# By default, private member access is allowed in tests -# See https://github.com/DiamondLightSource/python-copier-template/issues/154 -# Remove this line to forbid private member access in tests -"tests/**/*" = ["SLF001"] diff --git a/mythen3_1410286.hdf5 b/mythen3_1410286.hdf5 deleted file mode 100644 index b04fe2be4a472065cca452e78608ba93169431e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1728604 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≥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 diff --git a/pyproject.toml b/pyproject.toml index 9d67b98..5687e66 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,9 @@ dependencies = [ "PyQt5", "Dans_Diffraction", "stomp.py", + "ipywidgets", + "pint", + ] # Add project dependencies here, e.g. ["click", "numpy"] dynamic = ["version"] license.file = "LICENSE" diff --git a/src/xrpd_toolbox/calibrant_cifs/Silicon.cif b/src/xrpd_toolbox/calibrant_cifs/Silicon.cif deleted file mode 100644 index 3befb8c..0000000 --- a/src/xrpd_toolbox/calibrant_cifs/Silicon.cif +++ /dev/null @@ -1,226 +0,0 @@ -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/src/xrpd_toolbox/gui/bad_pixel_gui.py b/src/xrpd_toolbox/gui/bad_pixel_gui.py index 96c203b..dd9309f 100644 --- a/src/xrpd_toolbox/gui/bad_pixel_gui.py +++ b/src/xrpd_toolbox/gui/bad_pixel_gui.py @@ -468,7 +468,7 @@ def run_bad_pixel_gui(filepath: str, indices_file: str | None = None) -> None: if __name__ == "__main__": - DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1406731.nxs" + DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1410286.nxs" run_bad_pixel_gui( DATA_FILE, diff --git a/src/xrpd_toolbox/i11/angular_calibration.py b/src/xrpd_toolbox/i11/angular_calibration.py new file mode 100644 index 0000000..8383d27 --- /dev/null +++ b/src/xrpd_toolbox/i11/angular_calibration.py @@ -0,0 +1,1251 @@ +# 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 closest_indices(self, arr1, arr2): + """ + For each value in arr1, find the index of the closest value in arr2. + Returns an array of indices with the same shape as arr1. + """ + 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 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) + # normalized = 1 - (distance / max_dist) + + # resid_for_module = diff * ((normalized) * 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=True, + 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"./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("./outputs/gradient.png") + plt.close() + + peak_fits.to_csv("./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 = [ + 11, + 17, + 27, + ] # 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, + ) + + # print(analysis.deltas) + # quit() + + 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() + # 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 + normalized = 1 - (distance / max_dist) + + return normalized + + +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 + + normalized = module_distance(mod) + + color = cmap(normalized) + + 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 index ee7b85c..ee0f44c 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -3,24 +3,30 @@ 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 copy2 +from shutil import copy, copy2 from typing import Literal import h5py +import matplotlib.pyplot as plt import numpy as np from h5py import Dataset, File -from pydantic import BaseModel +from pydantic import BaseModel, Field -from xrpd_toolbox.utils.daq_messenger import DaqMessenger +from xrpd_toolbox.utils.messenger import Messenger from xrpd_toolbox.utils.mythen_utils import channel_to_angle +from xrpd_toolbox.utils.peaks import fit_peaks from xrpd_toolbox.utils.settings import SettingsBase 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, + save_to_xye, ) # np.set_printoptions(threshold=sys.maxsize) @@ -30,19 +36,54 @@ PSD_RADIUS = 762 # mm MYTHEN_PIXEL_SIZE = 0.05 # mm +PIXEL_NUMBER = np.arange(PIXELS_PER_MODULE, dtype=np.int64) + + +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 + class ModuleConversion(BaseModel): + # TODO: Decide whether it's best to stick beamline offset and centre in here a + # nd then have those be duplicated for every module, + # then when making a MythenModule we can just pass this. Will have to rebuild json + # YES DO THIS. But Do other things first 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, + offset=self.offset, + beamline_offset=zero_offset, + ) + return raw_tth + class AngularCalibration(SettingsBase): - beamline_offset: float - centre: float + beamline_offset: float | int module_0: ModuleConversion module_1: ModuleConversion module_2: ModuleConversion @@ -72,15 +113,8 @@ class AngularCalibration(SettingsBase): module_26: ModuleConversion module_27: ModuleConversion - def __getitem__(self, name): - if name in AngularCalibration.model_fields: - value = getattr(self, name) - return value - else: - raise ValueError(f"{name} not in {self}") - -class MythenReductionSettings(SettingsBase): +class MythenSettings(SettingsBase): active_modules: list[int] = list(range(MODULES_IN_DETECTOR)) bad_modules: list[int] = [] bad_channel_masking: bool = True @@ -89,9 +123,9 @@ class MythenReductionSettings(SettingsBase): modules_in_flatfield: list[int] = list(range(MODULES_IN_DETECTOR)) send_to_ispyb: bool = False rebin_step: float = 0.004 - default_counter: int = 0 + default_counter: int = Field(default=0, ge=0, le=3) edge_bad_channels: int = 15 - error_calc: Literal["internal", "external", "best"] = "internal" + error_calc: Literal["poisson", "std_dev", "max"] = "poisson" data_reduction_mode: Literal[ "step_scan", "time_resolved", "pump_probe", "flat_field", "bad_pixel" ] = "step_scan" @@ -112,8 +146,8 @@ def load_bad_channels(self): return self.bad_channels def _split_bad_channels_into_modules(self, bad_channels: np.ndarray): - """Takes a long array eg. 0, 1, 67, 7655, 32000 - turns it into 28 arrays, [0, 1, 67], ... [67], ... [7655], ...[32000] + """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( @@ -154,35 +188,78 @@ def bad_channels_to_mask(self) -> OrderedDict: mask[module_bad_channels[module]] = True bad_channel_mask[module] = mask - return bad_channel_mask # bad channels are 1 + return bad_channel_mask # bad channels are denoted by 1 class MythenDataLoader: def __init__( self, - file_path: str | Path, - pixels_per_module: int = PIXELS_PER_MODULE, + 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.file_path = Path(file_path) - self.pixels_per_module = pixels_per_module + 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.file_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() - self.raw_data = self.load_data(self.counter) - self.module_data = np.array_split( - self.raw_data, self.n_modules_in_data, axis=-1 - ) + 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 get_delta_path(self) -> str: + 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.file_path, "r") as file: + with h5py.File(self.filepath, "r") as file: base = f"/{self.entry}/{self.mythen_data_path}" for name in delta_subpaths: @@ -196,18 +273,25 @@ def get_delta_path(self) -> str: ) @cached_property - def deltas(self) -> np.ndarray: + 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: - self.delta_path = self.get_delta_path() - deltas = h5_to_array(self.file_path, self.delta_path) + 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.file_path, "r") as file: + 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] @@ -218,29 +302,8 @@ def read_nxs_metadata(self) -> tuple[int, int]: else: raise ValueError(f"Data is None at {self.dataset_path}") - def load_data(self, counter: int) -> np.ndarray: - if not self.file_path.exists(): - raise FileNotFoundError(self.file_path) - - with File(self.file_path, "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.") - self.n_frames = len(data) - data = data[..., counter] - - return np.asarray(data) - else: - raise ValueError( - f"Data at {self.dataset_path} in {self.file_path}is None." - ) + def load_all_data(self, counter: int) -> np.ndarray: + return self.get_data(slice(None), slice(None), counter) class MythenModule: @@ -248,61 +311,81 @@ def __init__( self, data: np.ndarray, conversion: ModuleConversion, - centre: float | int, beamline_offset: float, - deltas: np.ndarray, module_id: int, + positions: np.ndarray, + durations: np.ndarray | None = None, bad_channel_mask: np.ndarray | None = None, - pixels_per_modules: int = PIXELS_PER_MODULE, ): self.data = data self.conversion = conversion - self.centre = centre self.beamline_offset = beamline_offset - self.deltas = deltas + self.positions = positions self.module_id = module_id - self.pixels_per_modules = pixels_per_modules 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 - @cached_property - def pixel_number(self) -> np.ndarray: - """returns a 1d array of integers between 0 and 1280""" - return np.arange(self.pixels_per_modules, dtype=np.int64) + 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 = channel_to_angle( - pixel_number=self.pixel_number, - centre=self.centre, - conv=self.conversion.conv, - offset=self.conversion.offset, - beamline_offset=self.beamline_offset, - ) + raw_tth = self.conversion.return_raw_tth(self.beamline_offset) + return raw_tth @cached_property - def tth_shaped(self) -> np.ndarray: + 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""" - raw_tth_shaped = np.broadcast_to(self.raw_tth, self.data.shape) - tth_shaped = raw_tth_shaped + self.deltas[:, None] - return tth_shaped + 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_shaped.flatten() + return self.tth_2d.flatten() @cached_property def unmasked_error(self) -> np.ndarray: @@ -313,9 +396,14 @@ 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_shaped[:, ~self.bad_channel_mask] + masked_tth = self.tth_2d[:, ~self.bad_channel_mask] return masked_tth.flatten() @cached_property @@ -328,7 +416,7 @@ def __init__( self, filepath: str | Path, angular_calibration: AngularCalibration | None = None, - settings: MythenReductionSettings | None = None, + settings: MythenSettings | None = None, xye_filepath_out: str | Path | None = None, output_directory: str | Path | None = None, filename_suffix: str = "", @@ -336,99 +424,148 @@ def __init__( self.filepath = filepath self.filename_suffix = filename_suffix - if not str(self.filepath).lower().endswith(".nxs"): + 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.filepath), "processed" + str(self.file_dir), "processed" ) - self.file_dir = os.path.dirname(str(self.filepath)) - self.filename = os.path.basename(str(self.filepath)) + 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 MythenReductionSettings() + 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( - file_path=filepath, + 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""" + + return { + "data": self.mythen_data.module_data[n_module], + "conversion": self.calibration[f"module_{nth_active_module}"], + "beamline_offset": self.calibration.beamline_offset, + "module_id": nth_active_module, + "positions": self.mythen_data.positions, + "durations": self.mythen_data.durations, + "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( - data=self.mythen_data.module_data[n_module], - conversion=self.calibration[f"module_{nth_active_module}"], - centre=self.calibration.centre, - beamline_offset=self.calibration.beamline_offset, - deltas=self.mythen_data.deltas, - bad_channel_mask=self.bad_channels.masks[nth_active_module], - module_id=nth_active_module, + **self._make_mythen_module_kwargs(n_module, nth_active_module) ) self.modules[nth_active_module] = module - @cached_property - def good_modules(self) -> list[MythenModule]: - return [ - self.modules[f] - for f in list(self.modules.keys()) - if f not in self.bad_modules - ] # noqa - def generate_xye( - self, masked: bool = True + self, modules: Iterable[int], masked: bool = True ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: if masked: - module_tth_list = [f.tth for f in self.good_modules] - module_counts_list = [f.counts for f in self.good_modules] - module_errors_list = [f.error for f in self.good_modules] + 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 = [f.unmasked_tth for f in self.good_modules] - module_counts_list = [f.unmasked_counts for f in self.good_modules] - module_errors_list = [f.unmasked_error for f in self.good_modules] + 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) - tth = np.concatenate(module_tth_list) - counts = np.concatenate(module_counts_list) - 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_summed_xye( + def generate_binned_xye( self, masked: bool = True, rebin_step: float = 0.004, - error_calc: str = "internal", - sum_counts: bool = True, + error_calc: str = "poisson", + normalise: bool = True, ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: - tth, counts, error = self.generate_xye(masked=masked) + """ + 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? - summed_tth, summed_counts, summed_error = bin_and_propagate_errors( + 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, - sum_counts=sum_counts, ) - return summed_tth, summed_counts, summed_error + return binned_tth, binned_counts, binned_error def communicate_with_control(self, send_to_ispyb: bool = False): """ @@ -439,7 +576,7 @@ def communicate_with_control(self, send_to_ispyb: bool = False): """ - daq = DaqMessenger("i11-control") + daq = Messenger(host="i11-control") daq.connect() daq.send_file(str(self.xye_filepath_out)) # sends message to GDA @@ -449,22 +586,67 @@ def communicate_with_control(self, send_to_ispyb: bool = False): copy2(self.xye_filepath_out, magic_path) # copies to ispyb def process_step_scan(self): - summed_tth, summed_counts, summed_error = self.generate_summed_xye( - masked=self.settings.bad_channel_masking, - rebin_step=self.settings.rebin_step, - error_calc=self.settings.error_calc, - sum_counts=True, + """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, + ) ) - # plt.plot(normalise(summed_tth), normalise(summed_counts)) - # plt.show() + save_to_xye( + self.xye_filepath_out, + self.binned_tth, + self.binned_counts, + self.binned_error, + ) - # save_to_xye(self.xye_filepath_out, summed_tth, summed_counta, summed_error) - self.save_processed_nexus() - # self.communicate_with_control(send_to_ispyb=self.settings.send_to_ispyb) + xye_names_and_data = { + "tth": self.binned_tth, + "counts": self.binned_counts, + "error": self.binned_error, + } - def save_processed_nexus(self): - pass + 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}") + + try: + self.communicate_with_control(send_to_ispyb=self.settings.send_to_ispyb) + 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 @@ -472,6 +654,63 @@ def process_pump_probe(self): def process_time_resolved(self): pass + def plot_diffraction(self, filepath: str | Path | None = None): + plt.figure(figsize=(10, 7)) + + 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, + ) + + si_tth = get_calibrant_peaks("Si", 0.828783) + plt.vlines(si_tth, 0, np.amax(counts), color="red") + + plt.errorbar(tth, counts, error, label=self.settings.error_calc) + plt.legend() + plt.xlabel("tth") + plt.ylabel("Intensity (arb. units)") + + if filepath: + plt.savefig(filepath) + + plt.show() + plt.close() + + amps, fit_xpos, fwhms = fit_peaks(tth, counts, si_tth) + + plt.plot(si_tth, fit_xpos - si_tth) + plt.show() + + def plot_diffraction_by_mod(self, filepath: str | Path | None = None): + plt.figure(figsize=(10, 7)) + + for module in self.good_modules: + 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() + + 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 @@ -498,6 +737,35 @@ def convert_angcal_to_pydantic_json( 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 @@ -507,10 +775,11 @@ def convert_angcal_to_pydantic_json( PARENT_PATH / "i11" / "mythen_calibration" / "mythen3_reduction_config.toml" ) - DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1410286.nxs" + DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1410289.nxs" + + ANG_CAL = "/workspaces/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/processed/ang_cal_020426_cen_639.5_leastsq_[11, 17, 27]_new.json" # noqa - ANG_CAL = PARENT_PATH / "i11" / "mythen_calibration" / "ang_cal_171125_new.json" - settings = MythenReductionSettings.load_from_toml(CONFIG_FILE) + settings = MythenSettings.load_from_toml(CONFIG_FILE) print("Loaded settings:", settings) # print(DATA_FILE) @@ -520,11 +789,19 @@ def convert_angcal_to_pydantic_json( BAD_CHAN_FILE = "/workspaces/XRPD-Toolbox/examples/i11/bad_channels.txt" angular_calibration = AngularCalibration.load_from_json(ANG_CAL) + # angular_calibration.beamline_offset = -0.4979739 + + print(angular_calibration) settings.bad_channels_filepath = BAD_CHAN_FILE + # DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1414223.nxs" + DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/angular_calibration/1410289.nxs" + mythen3 = MythenDetector( filepath=DATA_FILE, settings=settings, angular_calibration=angular_calibration ) - mythen3.process_step_scan() + mythen3.plot_diffraction() + 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 index 6b6a7b3..5540d98 100644 --- a/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py +++ b/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py @@ -2,20 +2,25 @@ import argparse import os import sys -from datetime import datetime 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.daq_messenger import DaqMessenger from xrpd_toolbox.utils.energy import tth_to_q -from xrpd_toolbox.utils.utils import load_int_array_from_file +from xrpd_toolbox.utils.messenger import Messenger +from xrpd_toolbox.utils.mythen_utils import paired_modules +from xrpd_toolbox.utils.utils import AnalysisLogger, load_int_array_from_file + +matplotlib.use("Qt5Agg") # or TkAgg + np.seterr( divide="ignore", invalid="ignore" @@ -28,96 +33,12 @@ np.set_printoptions(threshold=sys.maxsize) -def paired_modules(modules=None): - """ - 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. - """ - - if modules is None: - 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((m, pair)) - - pairs = np.array(pairs) - - return pairs - - -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 calc_intial_module_conv(modules, conv=6.5e-05): - module_conv_dict = {} - - for mod in modules: - if mod > 13: - module_conv_dict[mod] = -conv - else: - module_conv_dict[mod] = conv - - return module_conv_dict - - -class AnalysisLogger: - def __init__(self, log_filepath, logging=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=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 I11Reduction: __slots__ = ( "filepath", "reduced_nxs_filepath_out", "xye_filepath_out", - "xye_filepath_out_Q", + "xye_filepath_out_q", "file_dir", "out_directory", "file_name", @@ -143,7 +64,7 @@ class I11Reduction: "save_nxs_out", "verbose_nxs", "debug_mode", - "save_in_Q_space", + "save_in_q_space", "data_reduction_mode", "wavelength", "raw_flatfield_counts", @@ -165,6 +86,7 @@ class I11Reduction: "angular_corrected_data_unmasked", "out_raw_data", "n_modules_in_data", + "good_modules", "Ie", "Ic4", "whole_data_raw_tth", @@ -282,7 +204,13 @@ def channel_to_angle(module_pixel_number, centre, conv, offset, beamline_offset) @staticmethod def channel_to_angle_in_real_units( - module_pixel_number, centre, offset, beamline_offset, radius, p=0.05 + module_pixel_number, + centre, + offset, + beamline_offset, + radius, + p=0.05, + direction=1, ): """ module_pixel_number: channel number, 0-1280 @@ -659,6 +587,9 @@ def save_nxs_outfile( 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) @@ -674,6 +605,7 @@ def save_nxs_outfile( ################################## # 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 @@ -1057,7 +989,7 @@ def create_bins(self, tth_values: np.ndarray, rebin_step) -> np.ndarray: return bin_centres, bin_edges def bin_and_propagate_errors( - self, x: np.ndarray, y: np.ndarray, e: np.ndarray, error_calc: str = "best" + self, x: np.ndarray, y: np.ndarray, e: np.ndarray, error_calc: str = "poisson" ) -> np.ndarray: """ @@ -1106,12 +1038,16 @@ def bin_and_propagate_errors( std_sums = np.histogram(x, bins=bin_edges, weights=(y - repeated_mean) ** 2)[0] std_errors = np.sqrt(std_sums / counts) - if error_calc == "internal": + if error_calc == "poisson": errors = prop_errors - elif error_calc == "external": + elif error_calc == "std_dev": errors = std_errors - elif error_calc == "best": + 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 @@ -1244,7 +1180,7 @@ def load_toml_config(self) -> bool: 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.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"] @@ -1265,7 +1201,7 @@ def load_toml_config(self) -> bool: 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 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) @@ -1304,8 +1240,8 @@ def set_save_filepaths(self) -> bool: 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( + 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", ) @@ -1372,6 +1308,8 @@ def plot_modules(self, block=True): def plot_modules_by_ring(self, mask=(), block=True): plt.figure(figsize=(10, 4)) + modules_min_max = {} + for n_mod in self.active_modules: if n_mod in mask: continue @@ -1384,14 +1322,108 @@ def plot_modules_by_ring(self, mask=(), block=True): 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("./outputs/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("./outputs/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("./outputs/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[ @@ -1517,6 +1549,50 @@ def plot_raw_vs_xye(self): 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)) @@ -1524,8 +1600,10 @@ def plot_diffraction_by_mod(self, filepath=None, block=True): mod_data = self.angular_corrected_data[ self.angular_corrected_data["n_mod"] == n_mod ] - plt.plot(mod_data["tth"], mod_data["counts"], label=str(n_mod)) - plt.text(np.mean(mod_data["tth"]), np.amin(mod_data["counts"]), str(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)") @@ -1660,21 +1738,21 @@ def data_reduction_mode_standard(self): #####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_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: - # self.logger.log(self.filepath, "is open?") + 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 @@ -1706,9 +1784,9 @@ def data_reduction_mode_time_resolved(self): self.xyedata, "tth", ) - if (self.save_in_Q_space) and (self.beam_energy): + if (self.save_in_q_space) and (self.beam_energy): self.save_xye( - self.xye_filepath_out_Q.replace( + self.xye_filepath_out_q.replace( ".xye", f"_frame_{n_frame + 1}{self.filename_suffix}.xye" ), self.xyedata, @@ -1737,8 +1815,8 @@ def data_reduction_mode_pump_probe(self): 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_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( @@ -1863,8 +1941,8 @@ def data_reduction_mode_0_fast(self): 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_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( @@ -1889,7 +1967,7 @@ def communicate_with_control(self, send_to_ispyb: bool = False): """ try: - daq = DaqMessenger("i11-control") + daq = Messenger("i11-control") daq.connect() daq.send_file(str(self.xye_filepath_out)) # sends message to GDA @@ -1943,10 +2021,6 @@ def __init__( self.logging = logging self.filepath = filepath - if not os.path.exists(self.filepath): - self.logger.log("NXS file does not exist") - quit() - if self.bad_frames is None: self.bad_frames = [] # frames that should be removed, because they are bad @@ -1962,6 +2036,11 @@ def __init__( 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}") @@ -1982,8 +2061,9 @@ def __init__( self.load_toml_config() self.set_save_filepaths() - output_data_modules = set(self.active_modules).difference(set(self.bad_modules)) - self.logger.log("Modules in output data:", output_data_modules) + 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) @@ -2158,7 +2238,7 @@ def __init__( Analysis = I11Reduction( filepath=args.data, config_filepath=args.config, - xye_filepath_out_Q=args.out_q_space_file, + 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, diff --git a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json deleted file mode 100644 index 7cd1aba..0000000 --- a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "centre": 639.5, - "conv_0": 6.570184497741959e-05, - "offset_0": 67.96978209773698, - "conv_1": 6.568315103360132e-05, - "offset_1": 62.96538344998067, - "conv_2": 6.568292984577048e-05, - "offset_2": 57.954158956916906, - "conv_3": 6.566155391015388e-05, - "offset_3": 52.95557701205766, - "conv_4": 6.566551064046604e-05, - "offset_4": 47.9555186087957, - "conv_5": 6.56564416881416e-05, - "offset_5": 42.94753952319434, - "conv_6": 6.563593626034103e-05, - "offset_6": 37.94886671053375, - "conv_7": 6.564169975987083e-05, - "offset_7": 32.93554609049577, - "conv_8": 6.56217783956062e-05, - "offset_8": 27.934354886129004, - "conv_9": 6.562040232230031e-05, - "offset_9": 22.932921824280186, - "conv_10": 6.563425551557966e-05, - "offset_10": 17.93115217829966, - "conv_11": 6.50714144302067e-05, - "offset_11": 12.93714697370569, - "conv_12": 6.559688777484265e-05, - "offset_12": 7.925242220666613, - "conv_13": 6.558346574831002e-05, - "offset_13": 2.9349146500271828, - "conv_14": -6.558871353830087e-05, - "offset_14": 0.43719841617827926, - "conv_15": -6.55873849338328e-05, - "offset_15": 5.43245569047748, - "conv_16": -6.559859936901077e-05, - "offset_16": 10.438755845366217, - "conv_17": -6.559958016268705e-05, - "offset_17": 15.46089825957060, - "conv_18": -6.561026146803566e-05, - "offset_18": 20.434766311618212, - "conv_19": -6.561170974362194e-05, - "offset_19": 25.443743042246087, - "conv_20": -6.562461529722984e-05, - "offset_20": 30.440076040360058, - "conv_21": -6.564163529664693e-05, - "offset_21": 35.44938893414347, - "conv_22": -6.565333081177747e-05, - "offset_22": 40.45283216309983, - "conv_23": -6.564782459391464e-05, - "offset_23": 45.45746776051998, - "conv_24": -6.566850538481755e-05, - "offset_24": 50.490325933600815, - "conv_25": -6.567031885143943e-05, - "offset_25": 55.46414350273406, - "conv_26": -6.56761558320164e-05, - "offset_26": 60.46960365808682, - "conv_27": -6.567657918854628e-05, - "offset_27": 65.48052129001229, - "beamline_offset": -0.49797387571608365 -} diff --git a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.off b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.off deleted file mode 100644 index 73b536c..0000000 --- a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125.off +++ /dev/null @@ -1,29 +0,0 @@ -module 0 offset 67.96978209773698 conv 6.570184497741959e-05 center 639.5 -module 1 offset 62.96538344998067 conv 6.568315103360132e-05 center 639.5 -module 2 offset 57.954158956916906 conv 6.568292984577048e-05 center 639.5 -module 3 offset 52.95557701205766 conv 6.566155391015388e-05 center 639.5 -module 4 offset 47.9555186087957 conv 6.566551064046604e-05 center 639.5 -module 5 offset 42.94753952319434 conv 6.56564416881416e-05 center 639.5 -module 6 offset 37.94886671053375 conv 6.563593626034103e-05 center 639.5 -module 7 offset 32.93554609049577 conv 6.564169975987083e-05 center 639.5 -module 8 offset 27.934354886129004 conv 6.56217783956062e-05 center 639.5 -module 9 offset 22.932921824280186 conv 6.562040232230031e-05 center 639.5 -module 10 offset 17.93115217829966 conv 6.563425551557966e-05 center 639.5 -module 11 offset 12.93714697370569 conv 6.50714144302067e-05 center 639.5 -module 12 offset 7.925242220666613 conv 6.559688777484265e-05 center 639.5 -module 13 offset 2.9349146500271828 conv 6.558346574831002e-05 center 639.5 -module 14 offset 0.43719841617827926 conv -6.558871353830087e-05 center 639.5 -module 15 offset 5.43245569047748 conv -6.55873849338328e-05 center 639.5 -module 16 offset 10.438755845366217 conv -6.559859936901077e-05 center 639.5 -module 17 offset 15.460898259570609 conv -6.559958016268705e-05 center 639.5 #not refined -module 18 offset 20.434766311618212 conv -6.561026146803566e-05 center 639.5 -module 19 offset 25.443743042246087 conv -6.561170974362194e-05 center 639.5 -module 20 offset 30.440076040360058 conv -6.562461529722984e-05 center 639.5 -module 21 offset 35.44938893414347 conv -6.564163529664693e-05 center 639.5 -module 22 offset 40.45283216309983 conv -6.565333081177747e-05 center 639.5 -module 23 offset 45.45746776051998 conv -6.564782459391464e-05 center 639.5 -module 24 offset 50.490325933600815 conv -6.566850538481755e-05 center 639.5 #not refined -module 25 offset 55.46414350273406 conv -6.567031885143943e-05 center 639.5 -module 26 offset 60.46960365808682 conv -6.56761558320164e-05 center 639.5 -module 27 offset 65.48052129001229 conv -6.567657918854628e-05 center 639.5 -beamline_offset -0.49797387571608365 diff --git a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125_new.json b/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125_new.json deleted file mode 100644 index 60b77eb..0000000 --- a/src/xrpd_toolbox/i11/mythen_calibration/ang_cal_171125_new.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "beamline_offset": -0.49797387571608365, - "centre": 639.5, - "module_0": { - "conv": 6.570184497741959e-05, - "offset": 67.96978209773698 - }, - "module_1": { - "conv": 6.568315103360132e-05, - "offset": 62.96538344998067 - }, - "module_2": { - "conv": 6.568292984577048e-05, - "offset": 57.954158956916906 - }, - "module_3": { - "conv": 6.566155391015388e-05, - "offset": 52.95557701205766 - }, - "module_4": { - "conv": 6.566551064046604e-05, - "offset": 47.9555186087957 - }, - "module_5": { - "conv": 6.56564416881416e-05, - "offset": 42.94753952319434 - }, - "module_6": { - "conv": 6.563593626034103e-05, - "offset": 37.94886671053375 - }, - "module_7": { - "conv": 6.564169975987083e-05, - "offset": 32.93554609049577 - }, - "module_8": { - "conv": 6.56217783956062e-05, - "offset": 27.934354886129004 - }, - "module_9": { - "conv": 6.562040232230031e-05, - "offset": 22.932921824280186 - }, - "module_10": { - "conv": 6.563425551557966e-05, - "offset": 17.93115217829966 - }, - "module_11": { - "conv": 6.50714144302067e-05, - "offset": 12.93714697370569 - }, - "module_12": { - "conv": 6.559688777484265e-05, - "offset": 7.925242220666613 - }, - "module_13": { - "conv": 6.558346574831002e-05, - "offset": 2.9349146500271828 - }, - "module_14": { - "conv": -6.558871353830087e-05, - "offset": 0.43719841617827926 - }, - "module_15": { - "conv": -6.55873849338328e-05, - "offset": 5.43245569047748 - }, - "module_16": { - "conv": -6.559859936901077e-05, - "offset": 10.438755845366217 - }, - "module_17": { - "conv": -6.559958016268705e-05, - "offset": 15.460898259570609 - }, - "module_18": { - "conv": -6.561026146803566e-05, - "offset": 20.434766311618212 - }, - "module_19": { - "conv": -6.561170974362194e-05, - "offset": 25.443743042246087 - }, - "module_20": { - "conv": -6.562461529722984e-05, - "offset": 30.440076040360058 - }, - "module_21": { - "conv": -6.564163529664693e-05, - "offset": 35.44938893414347 - }, - "module_22": { - "conv": -6.565333081177747e-05, - "offset": 40.45283216309983 - }, - "module_23": { - "conv": -6.564782459391464e-05, - "offset": 45.45746776051998 - }, - "module_24": { - "conv": -6.566850538481755e-05, - "offset": 50.490325933600815 - }, - "module_25": { - "conv": -6.567031885143943e-05, - "offset": 55.46414350273406 - }, - "module_26": { - "conv": -6.56761558320164e-05, - "offset": 60.46960365808682 - }, - "module_27": { - "conv": -6.567657918854628e-05, - "offset": 65.48052129001229 - } -} diff --git a/src/xrpd_toolbox/i11/mythen_calibration/badchannels.txt b/src/xrpd_toolbox/i11/mythen_calibration/badchannels.txt deleted file mode 100644 index fb42d51..0000000 --- a/src/xrpd_toolbox/i11/mythen_calibration/badchannels.txt +++ /dev/null @@ -1,1984 +0,0 @@ -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 -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 -14624 -14625 -14626 -16398 -16399 -16400 -16401 -16402 -16403 -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 -32130 -32131 -32132 -32133 -33166 -33167 -33168 -34530 -34531 -34532 -34533 -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 diff --git a/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml b/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml deleted file mode 100644 index d2f3619..0000000 --- a/src/xrpd_toolbox/i11/mythen_calibration/mythen3_reduction_config.toml +++ /dev/null @@ -1,50 +0,0 @@ -### 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 = "internal" #this can be "internal" "external" or "best". internal error is propagated poisson errors, external is std_dev of counts in bin (will result in nan values if there is only 1 count in the bin), and "best" 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 = 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) -###### - - -###### -# 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 = "/dls_sw/i11/software/mythen/badchannels.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" diff --git a/src/xrpd_toolbox/i11/mythen_pyfai.py b/src/xrpd_toolbox/i11/mythen_pyfai.py new file mode 100644 index 0000000..f7c4f5a --- /dev/null +++ b/src/xrpd_toolbox/i11/mythen_pyfai.py @@ -0,0 +1,215 @@ +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"], + ): + self.filepath = filepath + self.data_loader = MythenDataLoader(filepath=filepath) + self.data = self.data_loader.module_data + self.calibrant_name = calibrant_name + calibrant = get_calibrant(self.calibrant_name) + calibrant.wavelength = wavelength_in_m + + print(self.data_loader.durations) + + 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 + + initial = Geometry(detector=detector_module, wavelength=wavelength_in_m) + + 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 = 700 # 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=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=["rot3", "wavelength"]) + + # poni_name = "geometry.poni" + + trans = 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}, + ) + + print(trans) + + self.fig, self.ax = plt.subplots() + self.line = self.ax.plot(self.data[0][250])[0] + ligne = plt.Line2D( # type: ignore + xdata=[640, 640], + ydata=[-500, 1000], + figure=self.fig, + linestyle="--", + color="red", + axes=self.ax, + ) + self.ax.add_line(ligne) + self.ax.set_title("spectrum") + self.fig.show() + + # interactive_plot = widgets.interactive( + # self.update, + # module_id=(0, len(self.data) - 1), + # frame_id=(0, self.data[0].shape[0] - 1), + # ) + plt.ylim((0, 1e6)) + plt.show() + + # Work with the first module corresponding to: + name = 0 + print(name) + ds = self.data[name] + module = self.modules[name] + + # Use the previous widget to select: + ## the index where the beam-center is in the middle of the module + zero_pos = 36 + + ## The frame index where the first LaB6 peak enters + # the right-hand side of the spectrum + peak_zero_start = 74 + + ## The frame index where this first LaB6 leaves + # the spectrum or the second LaB6 peak appears: + peak_zero_end = 94 + + # The frames between peak_zero_start and peak_zero_end + # will be used to calibrate roughly the goniometer + # and used later for finer peak extraction + + print(ds, module, zero_pos, peak_zero_start, peak_zero_end) + + def get_position(self, idx): + "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 = "/workspaces/XRPD-Toolbox/examples/i11/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/eiger_500k.py b/src/xrpd_toolbox/i15-1/eiger_500k.py new file mode 100644 index 0000000..ca2a724 --- /dev/null +++ b/src/xrpd_toolbox/i15-1/eiger_500k.py @@ -0,0 +1,159 @@ +from collections.abc import Collection +from functools import cached_property +from pathlib import Path +from typing import Literal + +import numpy as np +from h5py import Dataset, File +from pyFAI.calibrant import get_calibrant +from pyFAI.detectors import Detector +from pyFAI.goniometer import SingleGeometry + +from xrpd_toolbox.utils.settings import SettingsBase +from xrpd_toolbox.utils.utils import ( + get_entry, + h5_to_array, +) + +PIXEL_SIZE = 7.5e-5 # in m +INITIAL_DISTNACE = 700 # mm + + +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(SettingsBase): + 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 = "eiger", + 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): + def __init__(self, filepath: str | Path, settings: EigerSettings): + self.filepath = filepath + self.settings = settings + + self.data_loader = EigerDataLoader(self.filepath) + + super().__init__( + pixel1=PIXEL_SIZE, pixel2=PIXEL_SIZE, max_shape=self.data_loader.data.shape + ) + + 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: + # SingleGeometry() + pass + + def simulate_data(self, calibrant_name: str, wavelength: float): + pass + + 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)) diff --git a/src/xrpd_toolbox/utils/daq_messenger.py b/src/xrpd_toolbox/utils/daq_messenger.py deleted file mode 100644 index 837e42a..0000000 --- a/src/xrpd_toolbox/utils/daq_messenger.py +++ /dev/null @@ -1,99 +0,0 @@ -import json -import time -from collections import deque - -import stomp - - -class DaqScanListener(stomp.ConnectionListener): - def __init__(self): - self.queue = deque() - - def on_error(self, frame): - print(f"received an error {frame.body}") - - def on_message(self, frame): - m = json.loads(frame.body) - self.queue.append(m) - - -class DaqScanListener4(stomp.ConnectionListener): - def __init__(self): - self.queue = deque() - - def on_error(self, headers, message): # type: ignore - print(f"Received an error {message}") - - def on_message(self, headers, message): # type: ignore - m = json.loads(message) - self.queue.append(m) - - -class DaqMessenger: - def __init__(self, beamline): - self.beamline = beamline - self.old_stomp = stomp.__version__[0] == 4 - - def connect(self): - self.conn = stomp.Connection( - [(self.beamline, 61613)], auto_content_length=False - ) - if self.old_stomp: - self.conn.start() # type: ignore - self.conn.connect() - - def disconnect(self): - self.conn.disconnect() - - def on_scan(self, message_function, sleep=1): - dsl = DaqScanListener4() if self.old_stomp else DaqScanListener() - self.conn.set_listener("scan", dsl) - self.conn.subscribe(destination="/topic/gda.messages.scan", id=1, ack="auto") - - while 1: - while dsl.queue: - m = dsl.queue.popleft() - message_function(m) - time.sleep(sleep) - - def send_file(self, path): - message = json.dumps({"filePath": path}) - destination = "/topic/org.dawnsci.file.topic" - self._send_message(destination, message) - - def send_start(self, path): - message = json.dumps( - {"filePath": path, "status": "STARTED", "swmrStatus": "ENABLED"} - ) - destination = "/topic/gda.messages.processing" - self._send_message(destination, message) - - def send_update(self, path): - 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_poni(self, path, status, message): - """ - styatus is ERROR WARN OK - """ - message = json.dumps( - {"calibration_filepath": path, "status": status, "message": message} - ) - destination = "/topic/gda.messages.calibration.xrd2" - self._send_message(destination, message) - - def _send_message(self, destination, message): - if self.old_stomp: - self.conn.send(destination, message, ack="auto") - else: - self.conn.send(destination=destination, body=message, ack="auto") diff --git a/src/xrpd_toolbox/utils/energy.py b/src/xrpd_toolbox/utils/energy.py index a5f5673..544e033 100644 --- a/src/xrpd_toolbox/utils/energy.py +++ b/src/xrpd_toolbox/utils/energy.py @@ -2,6 +2,20 @@ from typing import Literal import numpy as np +import pint + +from xrpd_toolbox.utils.settings import SettingsBase + +ureg = pint.UnitRegistry() + + +class Wavelength(SettingsBase): + value: float + unit: str + + def to(self, target_unit: str) -> float: + quantity = self.value * ureg(self.unit) + return quantity.to(target_unit).magnitude def beam_energy_to_wavelength( diff --git a/src/xrpd_toolbox/utils/messenger.py b/src/xrpd_toolbox/utils/messenger.py new file mode 100644 index 0000000..a26c0f3 --- /dev/null +++ b/src/xrpd_toolbox/utils/messenger.py @@ -0,0 +1,182 @@ +import json +from collections import deque +from pathlib import Path +from time import sleep + +import stomp + + +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, + destination: 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.destination = destination + + self.default_destination = [ + "/topic/public.worker.event", + "/topic/gda.messages.scan", + ] + # /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 not self.destination: + print(f"No destination specified, defaulting to {self.default_destination}") + self.destination = self.default_destination + + if ( + not self.host + and self.beamline + and (self.broker == "rabbitmq") + or (self.broker is None) + ): + 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: + self.setup_connection() + self.connect() + self.subscribe() + + 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.destination, list): + for i, dest in enumerate(self.destination): + self.conn.subscribe(destination=dest, id=i + 1, ack="auto") + else: + self.conn.subscribe(destination=self.destination, id=1, ack="auto") + + def send_file(self, path): + message = json.dumps({"filePath": path}) + destination = "/topic/org.dawnsci.file.topic" + self._send_message(destination, message) + + def send_start(self, path): + message = json.dumps( + {"filePath": path, "status": "STARTED", "swmrStatus": "ENABLED"} + ) + destination = "/topic/gda.messages.processing" + self._send_message(destination, message) + + def send_update(self, path): + 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, message): + self.conn.send(destination=destination, body=message, ack="auto") + + def stop(self): + self.run = False + + def get_message(self): + return self.scan_listener.messages.popleft() + + def listen(self, max_iter: int = 50, interval: float | int = 1.0): + c = 0 + + 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 + + +# if __name__ == "__main__": +# # messenger = Messenger( +# # beamline="i11", port=61613, username="guest", password="guest" +# # ) +# # messenger.listen() + +# m = Messenger( +# host="i11-control", +# port=61613, +# destination=None, +# auto_connect=True, +# ) +# m.listen() diff --git a/src/xrpd_toolbox/utils/mythen_utils.py b/src/xrpd_toolbox/utils/mythen_utils.py index 0288766..934d08e 100644 --- a/src/xrpd_toolbox/utils/mythen_utils.py +++ b/src/xrpd_toolbox/utils/mythen_utils.py @@ -1,6 +1,34 @@ +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_], @@ -8,7 +36,7 @@ def channel_to_angle( conv: int | float, offset: int | float, beamline_offset: int | float, -): +) -> np.ndarray: module_conversions = pixel_number - centre module_conversions = module_conversions * conv module_conversions = np.arctan(module_conversions) @@ -24,7 +52,7 @@ def channel_to_angle_in_real_units( 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) @@ -41,7 +69,7 @@ def channel_to_angle_in_real_units( return raw_tth -def calc_intial_module_conv(conv=6.5e-05): +def calc_intial_module_conv(conv=6.5e-05) -> dict[int, float]: module_conv_dict = {} for mod in range(28): @@ -75,7 +103,16 @@ def paired_modules(): return pairs -def calc_starting_module_offset(initial_module=0.45, offset=2.5): +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() @@ -93,3 +130,44 @@ def calc_starting_module_offset(initial_module=0.45, offset=2.5): 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 diff --git a/src/xrpd_toolbox/utils/peaks.py b/src/xrpd_toolbox/utils/peaks.py index bdc2605..50d71b4 100644 --- a/src/xrpd_toolbox/utils/peaks.py +++ b/src/xrpd_toolbox/utils/peaks.py @@ -2,6 +2,7 @@ import numpy as np from pydantic import BaseModel +from scipy.optimize import curve_fit class Peak(BaseModel): @@ -46,3 +47,46 @@ def multi_gaussian( intensity[start_idx:end_idx] += peak return intensity + + +def fit_peaks(x: np.ndarray, y: np.ndarray, x_pos: Collection[int | float]): + amps, x_positions, fwhms = [], [], [] + + for x_guess in x_pos: + try: + width_guess = 0.03 + # 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 + width_guess = 0.03 + + p0 = [x_guess, amp_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: + x_positions.append(np.nan) + amps.append(np.nan) + fwhms.append(np.nan) + continue + + popt, _ = curve_fit(gaussian, x_fit, y_fit, p0=p0, maxfev=10000) + + x_positions.append(popt[0]) # cen + amps.append(popt[1]) # amp + fwhms.append(popt[2]) # fwhm (actually sigma in your formula) + + except RuntimeError: + x_positions.append(np.nan) + amps.append(np.nan) + fwhms.append(np.nan) + + return ( + np.array(amps), + np.array(x_positions), + np.array(fwhms), + ) diff --git a/src/xrpd_toolbox/utils/settings.py b/src/xrpd_toolbox/utils/settings.py index 94c5160..11d9eb5 100644 --- a/src/xrpd_toolbox/utils/settings.py +++ b/src/xrpd_toolbox/utils/settings.py @@ -10,8 +10,6 @@ class SettingsBase(BaseModel): - supported_file_types: list[str] = SUPPORTED_FILE_TYPES - @classmethod def load_from_toml(cls, filepath: str | Path): with open(filepath, "rb") as file: @@ -42,7 +40,7 @@ def load(cls, filepath: str | Path): elif file_extension == ".toml": return cls.load_from_toml(filepath) else: - raise ValueError(f"Filetype must be: {cls.supported_file_types}") + raise ValueError(f"Filetype must be: {SUPPORTED_FILE_TYPES}") def save_to_toml(self, filepath: str | Path) -> None: if not str(filepath).endswith(".toml"): @@ -94,4 +92,11 @@ def save(self, filepath: str | Path): elif file_extension == ".toml": return self.save_to_toml(filepath) else: - raise ValueError(f"Filetype must be: {self.supported_file_types}") + 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}") diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 6dc98dc..d91f4a4 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -2,11 +2,43 @@ import os import re from collections.abc import Iterable +from datetime import datetime from pathlib import Path import h5py import numpy as np from h5py import Dataset, File +from pyFAI.calibrant import get_calibrant +from scipy.interpolate import interp1d + + +class AnalysisLogger: + def __init__(self, log_filepath, logging=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=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 NexusToDict: @@ -176,8 +208,7 @@ def bin_and_propagate_errors( y: np.ndarray, e: np.ndarray, rebin_step: float | int, - error_calc: str = "best", - sum_counts: bool = True, + error_calc: str = "max", ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: """ Rebin diffraction data with overlap-corrected averaging. @@ -202,43 +233,115 @@ def bin_and_propagate_errors( x = x.copy() x[-1] -= rebin_step / 10_000 - # --- Bin statistics --- + # --- 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 = np.max(bin_counts) - np.median(bin_counts) + # # Effective scaling factor (heuristic) + # scale_factpr = scale or np.max(bin_counts) - np.median(bin_counts) with np.errstate(divide="ignore", invalid="ignore"): - mean = y_sums / bin_counts - intensity = mean if not sum_counts else mean * scale + 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 * mean**2) / (bin_counts - 1) + variance = (y2_sums - bin_counts * intensity**2) / (bin_counts - 1) std_errors = np.sqrt(variance) - # Invalidate bins with <2 points for external error - std_errors[bin_counts < 2] = np.nan - - if error_calc == "internal": + if error_calc == "poisson": errors = prop_errors - elif error_calc == "external": + 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 == "best": + 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}") - if sum_counts: - errors *= scale + ##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 - ##remove Nan's + # --- 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] @@ -246,10 +349,58 @@ def bin_and_propagate_errors( 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 diff --git a/uv.lock b/uv.lock index c0f3f12..805a7c3 100644 --- a/uv.lock +++ b/uv.lock @@ -28,6 +28,15 @@ 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 = "cachetools" version = "6.2.5" @@ -64,6 +73,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" @@ -284,6 +302,15 @@ 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" @@ -320,6 +347,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl", hash = "sha256:7f9dc687dd3256e613b6cc978d9daabfd2bb5deb8adc541fc135ee423ffa98ab", size = 27022, upload-time = "2025-07-04T19:25:54.863Z" }, ] +[[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" @@ -374,6 +410,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, ] +[[package]] +name = "flexcache" +version = "0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload-time = "2024-03-09T03:21:07.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload-time = "2024-03-09T03:21:05.635Z" }, +] + +[[package]] +name = "flexparser" +version = "0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload-time = "2024-11-07T02:00:56.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload-time = "2024-11-07T02:00:54.523Z" }, +] + [[package]] name = "fonttools" version = "4.61.1" @@ -509,6 +569,68 @@ 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.10.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 = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/60/2111715ea11f39b1535bed6024b7dec7918b71e5e5d30855a5b503056b50/ipython-9.10.0.tar.gz", hash = "sha256:cd9e656be97618a0676d058134cd44e6dc7012c0e5cb36a9ce96a8c904adaf77", size = 4426526, upload-time = "2026-02-02T10:00:33.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl", hash = "sha256:c6ab68cc23bba8c7e18e9b932797014cc61ea7fd6f19de180ab9ba73e65ee58d", size = 622774, upload-time = "2026-02-02T10:00:31.503Z" }, +] + +[[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.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + [[package]] name = "jinja2" version = "3.1.6" @@ -534,6 +656,15 @@ 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 = "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.4.9" @@ -880,6 +1011,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" }, ] +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + [[package]] name = "nodeenv" version = "1.10.0" @@ -1096,6 +1239,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/3f/a80ac00acbc6b35166b42850e98a4f466e2c0d9c64054161ba9620f95680/pandas-3.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1c39eab3ad38f2d7a249095f0a3d8f8c22cc0f847e98ccf5bbe732b272e2d9fa", size = 9441003, upload-time = "2026-01-21T15:52:02.281Z" }, ] +[[package]] +name = "parso" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload-time = "2025-08-23T15:15:28.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, +] + [[package]] name = "pathspec" version = "1.0.4" @@ -1118,6 +1270,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.1.0" @@ -1205,6 +1369,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" }, ] +[[package]] +name = "pint" +version = "0.25.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flexcache" }, + { name = "flexparser" }, + { name = "platformdirs" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/74/bc3f671997158aef171194c3c4041e549946f4784b8690baa0626a0a164b/pint-0.25.2.tar.gz", hash = "sha256:85a45d1da8fe9c9f7477fed8aef59ad2b939af3d6611507e1a9cbdacdcd3450a", size = 254467, upload-time = "2025-11-06T22:08:09.184Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/88/550d41e81e6d43335603a960cd9c75c1d88f9cf01bc9d4ee8e86290aba7d/pint-0.25.2-py3-none-any.whl", hash = "sha256:ca35ab1d8eeeb6f7d9942b3cb5f34ca42b61cdd5fb3eae79531553dcca04dda7", size = 306762, upload-time = "2025-11-06T22:08:07.745Z" }, +] + [[package]] name = "platformdirs" version = "4.5.1" @@ -1284,6 +1463,24 @@ 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 = "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" @@ -1881,6 +2078,20 @@ 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 = "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 = "8.2.0" @@ -1991,6 +2202,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/17/221d62937c4130b044bb437caac4181e7e13d5536bbede65264db1f0ac9f/tox_uv-1.29.0-py3-none-any.whl", hash = "sha256:b1d251286edeeb4bc4af1e24c8acfdd9404700143c2199ccdbb4ea195f7de6cc", size = 17254, upload-time = "2025-10-09T20:40:25.885Z" }, ] +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + [[package]] name = "types-mock" version = "5.2.0.20250924" @@ -2097,17 +2317,28 @@ 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 = "h5py" }, + { name = "ipywidgets" }, { name = "lmfit" }, { name = "matplotlib" }, { name = "numpy" }, { name = "pandas" }, { name = "peakutils" }, + { name = "pint" }, { name = "pycifrw" }, { name = "pyfai" }, { name = "pyqt5" }, @@ -2134,11 +2365,13 @@ dev = [ requires-dist = [ { name = "dans-diffraction" }, { name = "h5py" }, + { name = "ipywidgets" }, { name = "lmfit" }, { name = "matplotlib" }, { name = "numpy" }, { name = "pandas" }, { name = "peakutils" }, + { name = "pint" }, { name = "pycifrw" }, { name = "pyfai" }, { name = "pyqt5" }, From 04b28625ee58d4eeab2f129566f5da602fadb965 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 27 Feb 2026 16:08:50 +0000 Subject: [PATCH 44/86] refactored nexus dict, and moved module_to_pixel util --- src/xrpd_toolbox/i11/mythen.py | 13 +---- src/xrpd_toolbox/utils/mythen_utils.py | 12 ++++ src/xrpd_toolbox/utils/utils.py | 81 +++++++++++++++++--------- tests/test_mythen.py | 24 ++++---- 4 files changed, 79 insertions(+), 51 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index ee0f44c..887fc16 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -16,7 +16,7 @@ from pydantic import BaseModel, Field from xrpd_toolbox.utils.messenger import Messenger -from xrpd_toolbox.utils.mythen_utils import channel_to_angle +from xrpd_toolbox.utils.mythen_utils import channel_to_angle, modules_to_pixels from xrpd_toolbox.utils.peaks import fit_peaks from xrpd_toolbox.utils.settings import SettingsBase from xrpd_toolbox.utils.utils import ( @@ -39,17 +39,6 @@ PIXEL_NUMBER = np.arange(PIXELS_PER_MODULE, dtype=np.int64) -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 - - class ModuleConversion(BaseModel): # TODO: Decide whether it's best to stick beamline offset and centre in here a # nd then have those be duplicated for every module, diff --git a/src/xrpd_toolbox/utils/mythen_utils.py b/src/xrpd_toolbox/utils/mythen_utils.py index 934d08e..377b0b7 100644 --- a/src/xrpd_toolbox/utils/mythen_utils.py +++ b/src/xrpd_toolbox/utils/mythen_utils.py @@ -1,3 +1,4 @@ +from collections.abc import Iterable from pathlib import Path import numpy as np @@ -171,3 +172,14 @@ def read_config(mythen3_config_filepath: str | Path) -> list[int]: ] 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/utils.py b/src/xrpd_toolbox/utils/utils.py index d91f4a4..567715b 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -1,6 +1,7 @@ import json import os import re +from collections import defaultdict from collections.abc import Iterable from datetime import datetime from pathlib import Path @@ -41,33 +42,59 @@ def log(self, *args, print_to_console=True): f.write("\n") -class NexusToDict: - def __init__(self, nexus_filepath: str | Path): - self.nexus_dict = {} - - with File(nexus_filepath, "r") as open_nexus_file: - self.recursive_inspect(open_nexus_file) - - def recursive_inspect(self, dataset): - for key in dataset.keys(): - if hasattr(dataset[key], "keys"): - self.recursive_inspect(dataset[key]) - else: - try: - self.nexus_dict[key] = dataset[key][()].decode("UTF-8") - except Exception: - data = dataset[key][()] - - if isinstance(data, np.ndarray) and (len(data) == 1): - data = data.flatten()[0] - - if isinstance(data, bytes): - data = data.decode("UTF-8") - - self.nexus_dict[key] = data - - def get_dict(self) -> dict: - return self.nexus_dict +class NexusDatasetMapper: + def __init__(self, filepath): + self.filepath = 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: diff --git a/tests/test_mythen.py b/tests/test_mythen.py index 9ba9790..faeb9d4 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -3,16 +3,16 @@ import pytest -from xrpd_toolbox.i11.mythen import MythenReductionSettings +from xrpd_toolbox.i11.mythen import MythenSettings CONFIG_FILE = ( - Path(__file__).parent.parent / "examples" / "i11" / "mythen3_reduction_config.toml" + Path(__file__).parent.parent / "config" / "i11" / "mythen3_reduction_config.toml" ) @pytest.fixture def mythen_settings(): - mythen_settings = MythenReductionSettings( + mythen_settings = MythenSettings( active_modules=[1, 2, 3], bad_modules=[4, 5], bad_channel_masking=True, @@ -23,7 +23,7 @@ def mythen_settings(): rebin_step=0.004, default_counter=0, edge_bad_channels=10, - error_calc="internal", + error_calc="poisson", data_reduction_mode="step_scan", bad_channels_filepath="bad_channels.txt", angcal_filepath="angcal.txt", @@ -32,33 +32,33 @@ def mythen_settings(): return mythen_settings -def test_mythen_settings(mythen_settings: MythenReductionSettings): +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 = MythenReductionSettings.load_from_toml(CONFIG_FILE) + settings = MythenSettings.load_from_toml(CONFIG_FILE) - assert isinstance(settings, MythenReductionSettings) + assert isinstance(settings, MythenSettings) -def test_mythen_toml_save_load(mythen_settings: MythenReductionSettings): +def test_mythen_toml_save_load(mythen_settings: MythenSettings): file_path = "file.toml" mythen_settings.save_to_toml(file_path) - loaded_mythen_settings = MythenReductionSettings.load_from_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: MythenReductionSettings): +def test_mythen_yaml_save_load(mythen_settings: MythenSettings): file_path = "file.yaml" mythen_settings.save_to_yaml(file_path) - loaded_mythen_settings = MythenReductionSettings.load_from_yaml(file_path) + loaded_mythen_settings = MythenSettings.load_from_yaml(file_path) assert mythen_settings == loaded_mythen_settings @@ -66,7 +66,7 @@ def test_mythen_yaml_save_load(mythen_settings: MythenReductionSettings): def test_mythen_load_fails_when_incorrect_file_extension( - mythen_settings: MythenReductionSettings, + mythen_settings: MythenSettings, ): file_path = "file.txt" From 359b80e3a355799b2eea6ddf9bbcc5fd5699e253 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 27 Feb 2026 16:09:25 +0000 Subject: [PATCH 45/86] removed todo --- src/xrpd_toolbox/i11/mythen.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 887fc16..9858aad 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -40,10 +40,6 @@ class ModuleConversion(BaseModel): - # TODO: Decide whether it's best to stick beamline offset and centre in here a - # nd then have those be duplicated for every module, - # then when making a MythenModule we can just pass this. Will have to rebuild json - # YES DO THIS. But Do other things first conv: float offset: float centre: float From 0d6fd613af78fc4e521dd39b1395b19fad92fc9f Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 27 Feb 2026 16:10:38 +0000 Subject: [PATCH 46/86] renamed offset to module offset --- src/xrpd_toolbox/i11/mythen.py | 4 ++-- src/xrpd_toolbox/utils/mythen_utils.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 9858aad..288bf8e 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -61,8 +61,8 @@ def return_raw_tth(self, zero_offset: float) -> np.ndarray: pixel_number=PIXEL_NUMBER, centre=self.centre, conv=self.conv, - offset=self.offset, - beamline_offset=zero_offset, + module_offset=self.offset, + zero_offset=zero_offset, ) return raw_tth diff --git a/src/xrpd_toolbox/utils/mythen_utils.py b/src/xrpd_toolbox/utils/mythen_utils.py index 377b0b7..c11c0a5 100644 --- a/src/xrpd_toolbox/utils/mythen_utils.py +++ b/src/xrpd_toolbox/utils/mythen_utils.py @@ -35,13 +35,13 @@ def channel_to_angle( pixel_number: npt.NDArray[np.int_], centre: int | float, conv: int | float, - offset: int | float, - beamline_offset: 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 = offset + np.rad2deg(module_conversions) + beamline_offset + raw_tth = module_offset + np.rad2deg(module_conversions) + zero_offset return raw_tth From 537a29eb9420877d8290c7f381d27e42cec096b6 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Mon, 2 Mar 2026 09:22:21 +0000 Subject: [PATCH 47/86] fixed mythen load paths after mnt --- src/xrpd_toolbox/i11/mythen.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 288bf8e..b09f910 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -639,6 +639,9 @@ def process_pump_probe(self): def process_time_resolved(self): pass + def simulate_data(self, calibrant_name: str): + pass + def plot_diffraction(self, filepath: str | Path | None = None): plt.figure(figsize=(10, 7)) @@ -756,13 +759,11 @@ def convert_angcal_to_new_pydantic_json( print(PARENT_PATH) - CONFIG_FILE = ( - PARENT_PATH / "i11" / "mythen_calibration" / "mythen3_reduction_config.toml" - ) + CONFIG_FILE = "/workspaces/XRPD-Toolbox/config/i11/mythen3_reduction_config.toml" - DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1410289.nxs" + DATA_FILE = "//host-home/projects/outputs/step_scan/1410289.nxs" - ANG_CAL = "/workspaces/XRPD-Toolbox/src/xrpd_toolbox/i11/mythen_calibration/processed/ang_cal_020426_cen_639.5_leastsq_[11, 17, 27]_new.json" # noqa + 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) print("Loaded settings:", settings) @@ -771,7 +772,7 @@ def convert_angcal_to_new_pydantic_json( # MythenDataLoader(DATA_FILE) - BAD_CHAN_FILE = "/workspaces/XRPD-Toolbox/examples/i11/bad_channels.txt" + 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 @@ -781,7 +782,7 @@ def convert_angcal_to_new_pydantic_json( settings.bad_channels_filepath = BAD_CHAN_FILE # DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/step_scan/1414223.nxs" - DATA_FILE = "/workspaces/XRPD-Toolbox/examples/i11/angular_calibration/1410289.nxs" + DATA_FILE = "/host-home/projects/outputs/angular_calibration/1410289.nxs" mythen3 = MythenDetector( filepath=DATA_FILE, settings=settings, angular_calibration=angular_calibration From f916d92f55d1af95309c3a237f3f2f97b2f78a67 Mon Sep 17 00:00:00 2001 From: akz63626 Date: Wed, 11 Mar 2026 15:43:45 +0000 Subject: [PATCH 48/86] experimenting with changes --- pyproject.toml | 2 +- src/xrpd_toolbox/i11/angular_calibration.py | 31 +- src/xrpd_toolbox/i11/mythen.py | 75 +++- .../i11/mythen3_reduction_legacy.py | 9 +- src/xrpd_toolbox/i11/mythen_pyfai.py | 109 ++--- src/xrpd_toolbox/i15-1/eiger_500k.py | 159 ------- src/xrpd_toolbox/{i15-1 => i15_1}/__init__.py | 0 src/xrpd_toolbox/i15_1/eiger_500k.py | 344 +++++++++++++++ src/xrpd_toolbox/utils/energy.py | 18 +- src/xrpd_toolbox/utils/graph.py | 111 +++++ src/xrpd_toolbox/utils/messenger.py | 19 +- src/xrpd_toolbox/utils/peaks.py | 60 ++- tests/test_eiger.py | 52 +++ tests/test_utils.py | 48 ++- uv.lock | 395 ++++++++++++++++++ 15 files changed, 1083 insertions(+), 349 deletions(-) delete mode 100644 src/xrpd_toolbox/i15-1/eiger_500k.py rename src/xrpd_toolbox/{i15-1 => i15_1}/__init__.py (100%) create mode 100644 src/xrpd_toolbox/i15_1/eiger_500k.py create mode 100644 src/xrpd_toolbox/utils/graph.py create mode 100644 tests/test_eiger.py diff --git a/pyproject.toml b/pyproject.toml index 5687e66..9332b67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,8 +28,8 @@ dependencies = [ "PyQt5", "Dans_Diffraction", "stomp.py", + "gql", "ipywidgets", - "pint", ] # Add project dependencies here, e.g. ["click", "numpy"] dynamic = ["version"] diff --git a/src/xrpd_toolbox/i11/angular_calibration.py b/src/xrpd_toolbox/i11/angular_calibration.py index 8383d27..4770e4a 100644 --- a/src/xrpd_toolbox/i11/angular_calibration.py +++ b/src/xrpd_toolbox/i11/angular_calibration.py @@ -241,19 +241,6 @@ def average_within_tolerance(self, arr, tol): return out - def closest_indices(self, arr1, arr2): - """ - For each value in arr1, find the index of the closest value in arr2. - Returns an array of indices with the same shape as arr1. - """ - 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 fit_peaks_across_delta( self, delta_points, @@ -701,7 +688,7 @@ def create_starting_params(self, zero=-0.5): params.add( f"centre_{mod}", value=self.module_centre, - vary=True, + vary=False, min=self.module_centre - 2, max=self.module_centre + 2, ) # maybe 640 or 639.5? @@ -751,7 +738,7 @@ def plot_fit_stats(self, fitted_peaks_for_modules): color="red", ) peak_fits[str(module)] = peak_data_gradient - plt.savefig(f"./outputs/peak_fits_{module}.png") + plt.savefig(f"/host-home/projects/outputs/peak_fits_{module}.png") plt.close() mean_grads = [] @@ -778,10 +765,10 @@ def plot_fit_stats(self, fitted_peaks_for_modules): plt.ylabel("Mean Gradient Of Peak Fit pixel/delta") plt.xlabel("Module number") plt.grid(True) - plt.savefig("./outputs/gradient.png") + plt.savefig("/host-home/projects/outputs/gradient.png") plt.close() - peak_fits.to_csv("./outputs/peak_gradients.csv") + 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: @@ -916,9 +903,7 @@ def __init__( self.active_modules = list(range(28)) self.bad_modules = [ - 11, 17, - 27, ] # 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 @@ -1110,8 +1095,8 @@ def __init__( execute_reduction=True, ) - # print(analysis.deltas) - # quit() + for module in range(28): + print(analysis.module_angular_cal[module]) basename = os.path.basename(check_file) @@ -1120,10 +1105,10 @@ def __init__( 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_by_mod(filepath=f"./outputs/diff_{basename}.png") # noqa # analysis.plot_diffraction() - analysis.plot_modules_by_ring() + analysis.plot_modules_by_ring(output_folder="/host-home/projects/outputs") # analysis.plot_by(["frame"]) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index b09f910..bba781a 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -6,7 +6,7 @@ from collections.abc import Collection, Iterable from functools import cached_property from pathlib import Path -from shutil import copy, copy2 +from shutil import copy from typing import Literal import h5py @@ -17,7 +17,7 @@ from xrpd_toolbox.utils.messenger import Messenger from xrpd_toolbox.utils.mythen_utils import channel_to_angle, modules_to_pixels -from xrpd_toolbox.utils.peaks import fit_peaks +from xrpd_toolbox.utils.peaks import closest_indices, fit_peaks from xrpd_toolbox.utils.settings import SettingsBase from xrpd_toolbox.utils.utils import ( bin_and_propagate_errors, @@ -103,6 +103,7 @@ class MythenSettings(SettingsBase): 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)) @@ -471,13 +472,15 @@ 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], + "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, - "durations": self.mythen_data.durations, + "positions": self.mythen_data.positions[these_frames], + "durations": self.mythen_data.durations[these_frames], "bad_channel_mask": self.bad_channels.masks[nth_active_module], } @@ -566,9 +569,9 @@ def communicate_with_control(self, send_to_ispyb: bool = False): 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 + 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 @@ -642,7 +645,9 @@ def process_time_resolved(self): def simulate_data(self, calibrant_name: str): pass - def plot_diffraction(self, filepath: str | Path | None = None): + def plot_diffraction( + self, filepath: str | Path | None = None, calibrant: str | None = None + ): plt.figure(figsize=(10, 7)) tth, counts, error = self.generate_binned_xye( @@ -651,8 +656,11 @@ def plot_diffraction(self, filepath: str | Path | None = None): error_calc=self.settings.error_calc, ) - si_tth = get_calibrant_peaks("Si", 0.828783) - plt.vlines(si_tth, 0, np.amax(counts), color="red") + if calibrant is not None: + si_tth = get_calibrant_peaks("Si", 0.828783) + indx = closest_indices(si_tth, tth) + peak_heights = counts[indx] + plt.scatter(si_tth, peak_heights, color="red") plt.errorbar(tth, counts, error, label=self.settings.error_calc) plt.legend() @@ -665,10 +673,7 @@ def plot_diffraction(self, filepath: str | Path | None = None): plt.show() plt.close() - amps, fit_xpos, fwhms = fit_peaks(tth, counts, si_tth) - - plt.plot(si_tth, fit_xpos - si_tth) - plt.show() + return tth, counts, error def plot_diffraction_by_mod(self, filepath: str | Path | None = None): plt.figure(figsize=(10, 7)) @@ -691,7 +696,7 @@ def plot_diffraction_by_mod(self, filepath: str | Path | None = None): plt.xlabel("tth") plt.ylabel("Intensity (arb. units)") - # plt.legend() + plt.legend() if filepath: plt.savefig(filepath) @@ -766,6 +771,7 @@ def convert_angcal_to_new_pydantic_json( 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) @@ -777,17 +783,40 @@ def convert_angcal_to_new_pydantic_json( angular_calibration = AngularCalibration.load_from_json(ANG_CAL) # angular_calibration.beamline_offset = -0.4979739 - print(angular_calibration) - 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 - ) + 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() - mythen3.plot_diffraction_by_mod() + # 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 index 5540d98..28eca7c 100644 --- a/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py +++ b/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py @@ -1305,7 +1305,7 @@ def plot_modules(self, block=True): if block is True: plt.close() - def plot_modules_by_ring(self, mask=(), block=True): + def plot_modules_by_ring(self, mask=(), output_folder="./outputs", block=True): plt.figure(figsize=(10, 4)) modules_min_max = {} @@ -1327,7 +1327,7 @@ def plot_modules_by_ring(self, mask=(), block=True): plt.ylabel("Ring number") plt.yticks([0, 1]) plt.xlabel("Angle (tth)") - plt.savefig("./outputs/module_arrangment.png") + plt.savefig(os.path.join(output_folder, "module_arrangment.png")) plt.show(block=block) if block is True: plt.close() @@ -1372,7 +1372,7 @@ def plot_modules_by_ring(self, mask=(), block=True): ax2.scatter(list(self.good_modules), module_sizes) ax2.set_ylabel("Size (mm)") ax1.set_xlabel("Module") - plt.savefig("./outputs/sizes.png") + plt.savefig(os.path.join(output_folder, "sizes.png")) plt.close() for n_mod in self.active_modules[0:-1]: @@ -1416,8 +1416,7 @@ def plot_modules_by_ring(self, mask=(), block=True): plt.plot(np.array(mod2spans) * mm_per_degree) plt.ylabel("size (mm)") plt.xlabel("Index from module") - plt.savefig("./outputs/module_compare.png") - + plt.savefig(os.path.join(output_folder, "module_compare.png")) plt.show() def plot_by(self, parameters=(), x="tth", at_a_time=False): diff --git a/src/xrpd_toolbox/i11/mythen_pyfai.py b/src/xrpd_toolbox/i11/mythen_pyfai.py index f7c4f5a..da10146 100644 --- a/src/xrpd_toolbox/i11/mythen_pyfai.py +++ b/src/xrpd_toolbox/i11/mythen_pyfai.py @@ -49,16 +49,14 @@ def __init__( self, filepath: str | Path, wavelength_in_m: float, - calibrant_name: Literal["Si", "LaB6"], + 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 - calibrant = get_calibrant(self.calibrant_name) - calibrant.wavelength = wavelength_in_m - - print(self.data_loader.durations) + self.calibrant = get_calibrant(self.calibrant_name) + self.calibrant.wavelength = wavelength_in_m self.modules = {} for name, module_dataset in enumerate(self.data): @@ -72,8 +70,35 @@ def __init__( detector_module.mask = mask.reshape(-1, 1) self.modules[name] = detector_module + trans = 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() @@ -82,7 +107,7 @@ def __init__( # 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 = 700 # This is the distance in mm (unit used by Fit2d) + distance = 762 # This is the distance in mm (unit used by Fit2d) rot3 = -0.78539816339 initial.setFit2D(distance, beam_centre_x, beam_centre_y) @@ -90,7 +115,7 @@ def __init__( single_geometry = SingleGeometry( "pe2AD", module_dataset, - calibrant=calibrant, + calibrant=self.calibrant, detector=detector_module, geometry=initial, ) @@ -102,72 +127,12 @@ def __init__( 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=["rot3", "wavelength"]) + single_geometry.geometry_refinement.refine2(fix=["wavelength"]) - # poni_name = "geometry.poni" + def get_data(self, module_id, frame_id: int): + return self.data[module_id][frame_id] - trans = 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}, - ) - - print(trans) - - self.fig, self.ax = plt.subplots() - self.line = self.ax.plot(self.data[0][250])[0] - ligne = plt.Line2D( # type: ignore - xdata=[640, 640], - ydata=[-500, 1000], - figure=self.fig, - linestyle="--", - color="red", - axes=self.ax, - ) - self.ax.add_line(ligne) - self.ax.set_title("spectrum") - self.fig.show() - - # interactive_plot = widgets.interactive( - # self.update, - # module_id=(0, len(self.data) - 1), - # frame_id=(0, self.data[0].shape[0] - 1), - # ) - plt.ylim((0, 1e6)) - plt.show() - - # Work with the first module corresponding to: - name = 0 - print(name) - ds = self.data[name] - module = self.modules[name] - - # Use the previous widget to select: - ## the index where the beam-center is in the middle of the module - zero_pos = 36 - - ## The frame index where the first LaB6 peak enters - # the right-hand side of the spectrum - peak_zero_start = 74 - - ## The frame index where this first LaB6 leaves - # the spectrum or the second LaB6 peak appears: - peak_zero_end = 94 - - # The frames between peak_zero_start and peak_zero_end - # will be used to calibrate roughly the goniometer - # and used later for finer peak extraction - - print(ds, module, zero_pos, peak_zero_start, peak_zero_end) - - def get_position(self, idx): + def get_position(self, idx: int): "Returns the postion of the goniometer for the given frame_id" return self.data_loader.positions[idx] @@ -208,7 +173,7 @@ def update(self, module_id, frame_id): if __name__ == "__main__": - filepath = "/workspaces/XRPD-Toolbox/examples/i11/angular_calibration/1410290.nxs" + filepath = "/host-home/projects/outputs/angular_calibration/1410290.nxs" wavelength = 0.828783 * 1e-10 # 0.828773 calibrant_name = "Si" diff --git a/src/xrpd_toolbox/i15-1/eiger_500k.py b/src/xrpd_toolbox/i15-1/eiger_500k.py deleted file mode 100644 index ca2a724..0000000 --- a/src/xrpd_toolbox/i15-1/eiger_500k.py +++ /dev/null @@ -1,159 +0,0 @@ -from collections.abc import Collection -from functools import cached_property -from pathlib import Path -from typing import Literal - -import numpy as np -from h5py import Dataset, File -from pyFAI.calibrant import get_calibrant -from pyFAI.detectors import Detector -from pyFAI.goniometer import SingleGeometry - -from xrpd_toolbox.utils.settings import SettingsBase -from xrpd_toolbox.utils.utils import ( - get_entry, - h5_to_array, -) - -PIXEL_SIZE = 7.5e-5 # in m -INITIAL_DISTNACE = 700 # mm - - -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(SettingsBase): - 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 = "eiger", - 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): - def __init__(self, filepath: str | Path, settings: EigerSettings): - self.filepath = filepath - self.settings = settings - - self.data_loader = EigerDataLoader(self.filepath) - - super().__init__( - pixel1=PIXEL_SIZE, pixel2=PIXEL_SIZE, max_shape=self.data_loader.data.shape - ) - - 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: - # SingleGeometry() - pass - - def simulate_data(self, calibrant_name: str, wavelength: float): - pass - - 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)) diff --git a/src/xrpd_toolbox/i15-1/__init__.py b/src/xrpd_toolbox/i15_1/__init__.py similarity index 100% rename from src/xrpd_toolbox/i15-1/__init__.py rename to src/xrpd_toolbox/i15_1/__init__.py 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..b13cdad --- /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.utils.settings import SettingsBase +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(SettingsBase): + 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 = "eiger", + 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 = calibrant.fake_calibration_image( + ai, 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/utils/energy.py b/src/xrpd_toolbox/utils/energy.py index 544e033..8d0a769 100644 --- a/src/xrpd_toolbox/utils/energy.py +++ b/src/xrpd_toolbox/utils/energy.py @@ -1,25 +1,11 @@ -from _collections_abc import Iterable +from collections.abc import Iterable from typing import Literal import numpy as np -import pint - -from xrpd_toolbox.utils.settings import SettingsBase - -ureg = pint.UnitRegistry() - - -class Wavelength(SettingsBase): - value: float - unit: str - - def to(self, target_unit: str) -> float: - quantity = self.value * ureg(self.unit) - return quantity.to(target_unit).magnitude def beam_energy_to_wavelength( - beam_energy: float | int, unit: Literal["kev", "ev"] = "kev" + beam_energy: float | int, unit: Literal["keV", "eV", "kev", "ev"] = "kev" ) -> float: """ 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/messenger.py b/src/xrpd_toolbox/utils/messenger.py index a26c0f3..b8f4cfd 100644 --- a/src/xrpd_toolbox/utils/messenger.py +++ b/src/xrpd_toolbox/utils/messenger.py @@ -1,6 +1,7 @@ import json from collections import deque from pathlib import Path +from shutil import copy2 from time import sleep import stomp @@ -166,17 +167,7 @@ def listen(self, max_iter: int = 50, interval: float | int = 1.0): sleep(interval) c += 1 - -# if __name__ == "__main__": -# # messenger = Messenger( -# # beamline="i11", port=61613, username="guest", password="guest" -# # ) -# # messenger.listen() - -# m = Messenger( -# host="i11-control", -# port=61613, -# destination=None, -# auto_connect=True, -# ) -# m.listen() + 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 diff --git a/src/xrpd_toolbox/utils/peaks.py b/src/xrpd_toolbox/utils/peaks.py index 50d71b4..dd476ca 100644 --- a/src/xrpd_toolbox/utils/peaks.py +++ b/src/xrpd_toolbox/utils/peaks.py @@ -1,6 +1,7 @@ from collections.abc import Collection import numpy as np +import peakutils from pydantic import BaseModel from scipy.optimize import curve_fit @@ -49,10 +50,12 @@ def multi_gaussian( return intensity -def fit_peaks(x: np.ndarray, y: np.ndarray, x_pos: Collection[int | float]): - amps, x_positions, fwhms = [], [], [] +def fit_peaks( + x: np.ndarray, y: np.ndarray, initial_x_pos: Collection[int | float] +) -> list[Peak]: + fitted_peaks = [] - for x_guess in x_pos: + for x_guess in initial_x_pos: try: width_guess = 0.03 # Estimate amplitude from nearest data point @@ -69,24 +72,43 @@ def fit_peaks(x: np.ndarray, y: np.ndarray, x_pos: Collection[int | float]): y_fit = y[start_idx:end_idx] if len(y_fit) == 0: - x_positions.append(np.nan) - amps.append(np.nan) - fwhms.append(np.nan) + fitted_peaks.append(Peak(centre=np.nan, amplitude=np.nan, fwhm=np.nan)) continue popt, _ = curve_fit(gaussian, x_fit, y_fit, p0=p0, maxfev=10000) - - x_positions.append(popt[0]) # cen - amps.append(popt[1]) # amp - fwhms.append(popt[2]) # fwhm (actually sigma in your formula) + fitted_peaks.append(Peak(centre=popt[0], amplitude=popt[1], fwhm=popt[2])) except RuntimeError: - x_positions.append(np.nan) - amps.append(np.nan) - fwhms.append(np.nan) - - return ( - np.array(amps), - np.array(x_positions), - np.array(fwhms), - ) + fitted_peaks.append(Peak(centre=np.nan, amplitude=np.nan, fwhm=np.nan)) + + return fitted_peaks + + +def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[Peak]: + """function to get the centre peaks given without guessing""" + + y_smoothed = np.convolve( + y, np.ones(5), mode="same" + ) # smooth the data to reduce noise + + threshold = np.amax(y_smoothed) / 20 + indexes = peakutils.indexes(y_smoothed, thres=threshold, min_dist=30) + + initial_x_pos = x[indexes] + fitted_peaks = fit_peaks(x, y_smoothed, initial_x_pos=initial_x_pos) + + return fitted_peaks + + +def closest_indices(arr1, arr2): + """ + For each value in arr1, find the index of the closest value in arr2. + Returns an array of indices with the same shape as arr1. + """ + 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 diff --git a/tests/test_eiger.py b/tests/test_eiger.py new file mode 100644 index 0000000..71529fe --- /dev/null +++ b/tests/test_eiger.py @@ -0,0 +1,52 @@ +import matplotlib.pyplot as plt +import numpy as np + +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 images[0] > 0 + + +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) == 5 + # assert len(y) == 5 + + plt.plot(x, y, marker="o") + plt.ylabel("Intensity (a.u.)") + plt.title("Simulated 1D Pattern from Eiger Step Scan") + plt.show() + + +if __name__ == "__main__": + eiger.test() diff --git a/tests/test_utils.py b/tests/test_utils.py index ac5abcc..8910644 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -4,7 +4,7 @@ import scipy.integrate as integrate from xrpd_toolbox.utils.energy import beam_energy_to_wavelength, tth_to_q -from xrpd_toolbox.utils.peaks import gaussian +from xrpd_toolbox.utils.peaks import find_and_fit_peaks, gaussian from xrpd_toolbox.utils.utils import ( get_filenumber_from_nxs, get_folder_paths, @@ -105,23 +105,37 @@ def test_get_folder_paths(): assert isinstance(list_of_paths, list) -# def test_peak_bin_and_propagate_errors(): -# x1 = np.arange(0, 10, 0.1) -# y1 = gaussian(x1, amp=10.0, cen=5.0, fwhm=1.0, background=0.1) -# e1 = np.sqrt(y1) +def test_find_and_fit_peaks_with_one_peak(): + np.random.seed(0) # For reproducibility + x = np.linspace(0, 10, 100) + y = gaussian(x, cen=5.0, amp=1.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 n, peak_cen in enumerate(np.linspace(20, 80, 4)): + peak_intensity = gaussian(x, cen=peak_cen, amp=n, 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 -# x2 = np.arange(0.01, 10.01, 0.1) -# y2 = gaussian(x2, amp=20.0, cen=5.0, fwhm=1.0, background=0.1) -# e2 = np.sqrt(y2) + peaks = find_and_fit_peaks(x, y_noisy) -# x_combined = np.concatenate((x1, x2)) -# y_combined = np.concatenate((y1, y2)) -# e_combined = np.concatenate((e1, e2)) + assert len(peaks) == 3 -# binned_x, binned_y, binned_e = bin_and_propagate_errors( -# x_combined, y_combined, e_combined, rebin_step=0.1, error_calc="internal" -# ) -# assert len(binned_x) == len(binned_y) == len(binned_e) -# assert np.amax(binned_y) > np.amax(y1) -# assert np.amax(binned_y) > np.amax(y2) +if __name__ == "__main__": + test_find_and_fit_peaks_with_n_peaks() diff --git a/uv.lock b/uv.lock index 805a7c3..c84ff1f 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.12.1" +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/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, +] + [[package]] name = "asteval" version = "1.0.8" @@ -37,6 +50,15 @@ 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 = "cachetools" version = "6.2.5" @@ -492,6 +514,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.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/9b/037a640a2983b09aed4a823f9cf1729e6d780b0671f854efa4727a7affbe/graphql_core-3.2.7.tar.gz", hash = "sha256:27b6904bdd3b43f2a0556dad5d579bdfdeab1f38e8e8788e555bdcb586a6f62c", size = 513484, upload-time = "2025-11-01T22:30:40.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/14/933037032608787fb92e365883ad6a741c235e0ff992865ec5d904a38f1e/graphql_core-3.2.7-py3-none-any.whl", hash = "sha256:17fc8f3ca4a42913d8e24d9ac9f08deddf0a0b2483076575757f6c412ead2ec0", size = 207262, upload-time = "2025-11-01T22:30:38.912Z" }, +] + [[package]] name = "h5py" version = "3.15.1" @@ -560,6 +606,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b8/58/40fbbcefeda82364720eba5cf2270f98496bdfa19ea75b4cccae79c698e6/identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0", size = 99202, upload-time = "2026-01-12T18:58:56.627Z" }, ] +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + [[package]] name = "iniconfig" version = "2.3.0" @@ -1023,6 +1078,123 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] +[[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 = "nodeenv" version = "1.10.0" @@ -1463,6 +1635,105 @@ 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.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, + { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, + { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, + { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, + { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, + { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, + { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + [[package]] name = "ptyprocess" version = "0.7.0" @@ -2331,6 +2602,7 @@ name = "xrpd-toolbox" source = { editable = "." } dependencies = [ { name = "dans-diffraction" }, + { name = "gql" }, { name = "h5py" }, { name = "ipywidgets" }, { name = "lmfit" }, @@ -2364,6 +2636,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "dans-diffraction" }, + { name = "gql" }, { name = "h5py" }, { name = "ipywidgets" }, { name = "lmfit" }, @@ -2393,3 +2666,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" }, +] From df7b4869c2277f16603726d1663d69601ee04a09 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 11 Mar 2026 15:46:35 +0000 Subject: [PATCH 49/86] ignore some types in peaks.py --- src/xrpd_toolbox/utils/peaks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/xrpd_toolbox/utils/peaks.py b/src/xrpd_toolbox/utils/peaks.py index dd476ca..0d0233d 100644 --- a/src/xrpd_toolbox/utils/peaks.py +++ b/src/xrpd_toolbox/utils/peaks.py @@ -75,7 +75,7 @@ def fit_peaks( fitted_peaks.append(Peak(centre=np.nan, amplitude=np.nan, fwhm=np.nan)) continue - popt, _ = curve_fit(gaussian, x_fit, y_fit, p0=p0, maxfev=10000) + popt, _ = curve_fit(gaussian, x_fit, y_fit, p0=p0, maxfev=10000) # type: ignore fitted_peaks.append(Peak(centre=popt[0], amplitude=popt[1], fwhm=popt[2])) except RuntimeError: @@ -92,7 +92,7 @@ def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[Peak]: ) # smooth the data to reduce noise threshold = np.amax(y_smoothed) / 20 - indexes = peakutils.indexes(y_smoothed, thres=threshold, min_dist=30) + indexes = peakutils.indexes(y_smoothed, thres=threshold, min_dist=30) # type: ignore initial_x_pos = x[indexes] fitted_peaks = fit_peaks(x, y_smoothed, initial_x_pos=initial_x_pos) From 79f379ed2cd99d019b8f8a05873f2b7bd6f72ece Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 11 Mar 2026 15:51:53 +0000 Subject: [PATCH 50/86] ignore missing packages --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 91e69d9..3e41bac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && apt-get dist-clean RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y -RUN apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y +RUN apt-get install --ignore-missing '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y RUN apt-get install fonts-noto-color-emoji -y RUN export DISPLAY=:0 From 2bdf7a6ab507e71195783f6c7d251796fb2eb883 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 11 Mar 2026 15:57:42 +0000 Subject: [PATCH 51/86] modify dockerfile --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3e41bac..59d769c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # The devcontainer should use the developer target and run as root with podman # or docker with user namespaces. -FROM ghcr.io/diamondlightsource/ubuntu-devcontainer:noble-20260113@sha256:d59c106ff0751e5c51a8463f08cf93c6fbd28cac7399c46e32e5c544b7106336 AS developer +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 \ @@ -8,7 +8,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && apt-get dist-clean RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y -RUN apt-get install --ignore-missing '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y +RUN apt-get --ignore-missing install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y RUN apt-get install fonts-noto-color-emoji -y RUN export DISPLAY=:0 From 35b492e4cdf718f2fc2b487222f899db0ffd7ef8 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 11 Mar 2026 16:08:28 +0000 Subject: [PATCH 52/86] modify dockerfile --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 59d769c..1b52b88 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,8 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && apt-get dist-clean RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y -RUN apt-get --ignore-missing install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y +RUN apt-get --ignore-missing install libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y +# RUN apt-get install '^libxcb.*-dev' RUN apt-get install fonts-noto-color-emoji -y RUN export DISPLAY=:0 From c72796c0142f0212cedef4501b390790348e7150 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 11 Mar 2026 16:18:14 +0000 Subject: [PATCH 53/86] remove ubuntu fail points --- .vscode/settings.json | 1 + Dockerfile | 2 +- uv.lock | 41 ----------------------------------------- 3 files changed, 2 insertions(+), 42 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 74bb75e..118c8f8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,4 +11,5 @@ "editor.defaultFormatter": "charliermarsh.ruff", }, "python-envs.defaultEnvManager": "ms-python.python:system", + "python-envs.pythonProjects": [], } diff --git a/Dockerfile b/Dockerfile index 1b52b88..dcc8796 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && apt-get dist-clean RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y -RUN apt-get --ignore-missing install libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y +# RUN apt-get install libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y # RUN apt-get install '^libxcb.*-dev' RUN apt-get install fonts-noto-color-emoji -y RUN export DISPLAY=:0 diff --git a/uv.lock b/uv.lock index c84ff1f..a5b66c9 100644 --- a/uv.lock +++ b/uv.lock @@ -432,30 +432,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, ] -[[package]] -name = "flexcache" -version = "0.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload-time = "2024-03-09T03:21:07.555Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload-time = "2024-03-09T03:21:05.635Z" }, -] - -[[package]] -name = "flexparser" -version = "0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload-time = "2024-11-07T02:00:56.249Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload-time = "2024-11-07T02:00:54.523Z" }, -] - [[package]] name = "fonttools" version = "4.61.1" @@ -1541,21 +1517,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" }, ] -[[package]] -name = "pint" -version = "0.25.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flexcache" }, - { name = "flexparser" }, - { name = "platformdirs" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5f/74/bc3f671997158aef171194c3c4041e549946f4784b8690baa0626a0a164b/pint-0.25.2.tar.gz", hash = "sha256:85a45d1da8fe9c9f7477fed8aef59ad2b939af3d6611507e1a9cbdacdcd3450a", size = 254467, upload-time = "2025-11-06T22:08:09.184Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/88/550d41e81e6d43335603a960cd9c75c1d88f9cf01bc9d4ee8e86290aba7d/pint-0.25.2-py3-none-any.whl", hash = "sha256:ca35ab1d8eeeb6f7d9942b3cb5f34ca42b61cdd5fb3eae79531553dcca04dda7", size = 306762, upload-time = "2025-11-06T22:08:07.745Z" }, -] - [[package]] name = "platformdirs" version = "4.5.1" @@ -2610,7 +2571,6 @@ dependencies = [ { name = "numpy" }, { name = "pandas" }, { name = "peakutils" }, - { name = "pint" }, { name = "pycifrw" }, { name = "pyfai" }, { name = "pyqt5" }, @@ -2644,7 +2604,6 @@ requires-dist = [ { name = "numpy" }, { name = "pandas" }, { name = "peakutils" }, - { name = "pint" }, { name = "pycifrw" }, { name = "pyfai" }, { name = "pyqt5" }, From 79fcdb6ddabd9593c9c311c9fd9329d00f5ee19a Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 11 Mar 2026 16:33:15 +0000 Subject: [PATCH 54/86] fixes and docker fix --- Dockerfile | 4 ++-- src/xrpd_toolbox/gui/bad_pixel_gui.py | 2 +- src/xrpd_toolbox/gui/reprocessor_gui.py | 20 ++++++++++---------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index dcc8796..b201901 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ graphviz \ && apt-get dist-clean -RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y +RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 libgl1 libegl1 -y # RUN apt-get install libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y # RUN apt-get install '^libxcb.*-dev' RUN apt-get install fonts-noto-color-emoji -y @@ -35,7 +35,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 diff --git a/src/xrpd_toolbox/gui/bad_pixel_gui.py b/src/xrpd_toolbox/gui/bad_pixel_gui.py index dd9309f..b3f83a2 100644 --- a/src/xrpd_toolbox/gui/bad_pixel_gui.py +++ b/src/xrpd_toolbox/gui/bad_pixel_gui.py @@ -49,7 +49,7 @@ def __init__( self._pan_start = None self.data = data - self.raw_data = data.raw_data + self.raw_data = data.data self.pixels_per_modules = pixels_per_modules self.current_module = 0 diff --git a/src/xrpd_toolbox/gui/reprocessor_gui.py b/src/xrpd_toolbox/gui/reprocessor_gui.py index b507efa..94d79b5 100644 --- a/src/xrpd_toolbox/gui/reprocessor_gui.py +++ b/src/xrpd_toolbox/gui/reprocessor_gui.py @@ -28,7 +28,7 @@ QWidget, ) -from xrpd_toolbox.i11.mythen import MythenReductionSettings +from xrpd_toolbox.i11.mythen import MythenSettings # ========================= # Worker Thread @@ -40,10 +40,10 @@ class ProcessingWorker(QThread): file_finished = pyqtSignal(Path) file_failed = pyqtSignal(Path, str) - def __init__(self, files: list[Path], settings: MythenReductionSettings) -> None: + def __init__(self, files: list[Path], settings: MythenSettings) -> None: super().__init__() self.files: list[Path] = files - self.settings: MythenReductionSettings = settings + self.settings: MythenSettings = settings def run(self) -> None: for file in self.files: @@ -68,7 +68,7 @@ class MainWindow(QWidget): def __init__( self, settings_path: str | Path | None = None, - settings: MythenReductionSettings | None = None, + settings: MythenSettings | None = None, beamline: str = "i11", settings_columns: int = 1, ) -> None: @@ -80,11 +80,11 @@ def __init__( self.settings_columns: int = max(1, settings_columns) if settings is not None: - self.settings_model: MythenReductionSettings = settings + self.settings_model: MythenSettings = settings elif settings_path is not None: self.settings_path: Path = Path(settings_path) - self.settings_model: MythenReductionSettings = ( - MythenReductionSettings.load_from_toml(settings_path) + self.settings_model: MythenSettings = MythenSettings.load_from_toml( + settings_path ) else: raise ValueError("Either settings or settings_path must be provided.") @@ -312,8 +312,8 @@ def on_selection_changed(self, *_: object) -> None: # Collect settings # --------------------- - def collect_settings(self) -> MythenReductionSettings: - return MythenReductionSettings( + 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(), @@ -383,7 +383,7 @@ def on_all_done(self) -> None: if __name__ == "__main__": app = QApplication(sys.argv) - settings = MythenReductionSettings() + settings = MythenSettings() window = MainWindow(settings=settings, settings_columns=1) window.show() sys.exit(app.exec_()) From 12ce316a836a3d5824945cf0eeb43e18ba91c9b6 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 18 Mar 2026 16:04:02 +0000 Subject: [PATCH 55/86] peaks fitting pe2ad for sample alignmenr --- .devcontainer/devcontainer.json | 5 +- Dockerfile | 24 +- pyproject.toml | 2 +- src/xrpd_toolbox/data_loader.py | 76 ++++ src/xrpd_toolbox/i11/angular_calibration.py | 12 +- src/xrpd_toolbox/i15_1/pe2ad.py | 87 +++++ src/xrpd_toolbox/utils/messenger.py | 14 + src/xrpd_toolbox/utils/peaks.py | 372 +++++++++++++++++--- tests/test_utils.py | 8 +- uv.lock | 119 ++----- 10 files changed, 568 insertions(+), 151 deletions(-) create mode 100644 src/xrpd_toolbox/data_loader.py create mode 100644 src/xrpd_toolbox/i15_1/pe2ad.py diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 39030b4..ae4c50d 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 @@ -73,5 +74,5 @@ // Mount the parent as /workspaces so we can pip install peers as editable "workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind", // After the container is created, recreate the venv then make pre-commit first run faster - "postCreateCommand": "uv venv --clear && uv sync && pre-commit install --install-hooks && echo 'export DISPLAY=:0' >> ~/.bashrc" + "postCreateCommand": "uv venv --clear && uv sync && pre-commit install --install-hooks" } diff --git a/Dockerfile b/Dockerfile index b201901..c2e6eb1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,10 +8,25 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && apt-get dist-clean RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 libgl1 libegl1 -y -# RUN apt-get install libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libegl1 libxcb-cursor0 -y -# RUN apt-get install '^libxcb.*-dev' +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 -RUN export DISPLAY=:0 # The build stage installs the context into the venv FROM developer AS build @@ -48,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/pyproject.toml b/pyproject.toml index 9332b67..75c5d8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ dependencies = [ "pyyaml", "toml", "PyQt6", - "PyQt5", + # "PyQt5", "Dans_Diffraction", "stomp.py", "gql", diff --git a/src/xrpd_toolbox/data_loader.py b/src/xrpd_toolbox/data_loader.py new file mode 100644 index 0000000..d5583ea --- /dev/null +++ b/src/xrpd_toolbox/data_loader.py @@ -0,0 +1,76 @@ +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 + + +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_dataset(self, dataset_path: str) -> Dataset: + 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 not isinstance(data, Dataset): + raise ValueError(f"{dataset_path} is not a dataset") + + return data + + 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]) + + @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/i11/angular_calibration.py b/src/xrpd_toolbox/i11/angular_calibration.py index 4770e4a..2384249 100644 --- a/src/xrpd_toolbox/i11/angular_calibration.py +++ b/src/xrpd_toolbox/i11/angular_calibration.py @@ -495,9 +495,9 @@ def return_residual_for_modules( # max_dist = 13.5 # distance = abs(module_to_analyse - 14) - # normalized = 1 - (distance / max_dist) + # normalised = 1 - (distance / max_dist) - # resid_for_module = diff * ((normalized) * 100) + # resid_for_module = diff * ((normalised) * 100) resid_for_module = diff resid_for_all_modules = np.append(resid_for_all_modules, resid_for_module) @@ -1119,9 +1119,9 @@ def module_distance(module: int): # Normalize so: # distance = 0 → red # distance = max → blue - normalized = 1 - (distance / max_dist) + normalised = 1 - (distance / max_dist) - return normalized + return normalised def plot_convs(conv: pd.DataFrame, steps): @@ -1135,9 +1135,9 @@ def plot_convs(conv: pd.DataFrame, steps): if mod in [11]: continue - normalized = module_distance(mod) + normalised = module_distance(mod) - color = cmap(normalized) + color = cmap(normalised) if mod > 13: line = "--" diff --git a/src/xrpd_toolbox/i15_1/pe2ad.py b/src/xrpd_toolbox/i15_1/pe2ad.py new file mode 100644 index 0000000..24b7791 --- /dev/null +++ b/src/xrpd_toolbox/i15_1/pe2ad.py @@ -0,0 +1,87 @@ +import matplotlib.pyplot as plt +import numpy as np + +from xrpd_toolbox.data_loader import BaseDataLoader +from xrpd_toolbox.utils.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 sum_frames(self): + data = self._get_dataset(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 + + 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, peak.amplitude, peak.centre, peak.fwhm, 0.5) + + plt.plot(indices, tophat) + + plt.plot(indices, trimmed_sample_density) + plt.show() + + +if __name__ == "__main__": + filepath = "/host-home/projects/data/i15-1-95016.nxs" + + pe2ad = PE2AD(filepath) + pe2ad.find_sample_centre() diff --git a/src/xrpd_toolbox/utils/messenger.py b/src/xrpd_toolbox/utils/messenger.py index b8f4cfd..f8b66ad 100644 --- a/src/xrpd_toolbox/utils/messenger.py +++ b/src/xrpd_toolbox/utils/messenger.py @@ -124,11 +124,13 @@ def subscribe(self): self.conn.subscribe(destination=self.destination, id=1, ack="auto") def send_file(self, path): + """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): + """use this in when doing live processing and it has started""" message = json.dumps( {"filePath": path, "status": "STARTED", "swmrStatus": "ENABLED"} ) @@ -136,6 +138,8 @@ def send_start(self, path): 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"} ) @@ -171,3 +175,13 @@ 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/peaks.py b/src/xrpd_toolbox/utils/peaks.py index 0d0233d..24c04cf 100644 --- a/src/xrpd_toolbox/utils/peaks.py +++ b/src/xrpd_toolbox/utils/peaks.py @@ -1,53 +1,308 @@ +import math from collections.abc import Collection +from typing import Literal import numpy as np import peakutils -from pydantic import BaseModel +from pydantic import BaseModel, model_validator from scipy.optimize import curve_fit -class Peak(BaseModel): - centre: int | float - amplitude: int | float - fwhm: int | float +def gaussian_sigma_to_fwhm(sigma: float | int) -> float: + return float(sigma) * 2 * np.sqrt(2 * np.log(2)) + + +def gaussian_fwhm_to_sigma(fwhm: float | int) -> float: + return float(fwhm) / (2 * np.sqrt(2 * np.log(2))) + + +def lorentzian_gamma_to_fwhm(gamma: float | int) -> float: + return 2 * float(gamma) + + +def lorentzian_fwhm_to_gamma(fwhm: float | int) -> float: + return float(fwhm) / 2 def gaussian( - x: np.ndarray, cen: int | float, amp: int | float, fwhm: int | float + x: np.ndarray, + amplitude: float | int, + centre: float | int, + fwhm: float | int, + background: float | int | np.ndarray = 0, + normalised: bool = True, ) -> np.ndarray: - """1-d gaussian: gaussian(x, amp, cen, fwhm)""" + """ + 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. + """ + x_arr = np.asarray(x, dtype=np.float64) + bg = np.asarray(background, dtype=np.float64) - return (amp / (np.sqrt(2 * np.pi) * fwhm)) * np.exp( - -((x - cen) ** 2) / (2 * fwhm**2) - ) + sigma = gaussian_fwhm_to_sigma(fwhm) + if normalised: + prefactor = amplitude / (sigma * np.sqrt(2 * np.pi)) + else: + prefactor = amplitude -def multi_gaussian( + return prefactor * np.exp(-((x_arr - centre) ** 2) / (2 * sigma**2)) + bg + + +def lorentzian( x: np.ndarray, - peaks: Collection[Peak], - background: int | float | np.ndarray, - phase_scale: int | float = 1, -): - """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). + amplitude: float | int, + centre: float | int, + fwhm: float | int, + background: float | int | np.ndarray = 0, + normalised: bool = True, +) -> np.ndarray: + x = np.asarray(x, dtype=float) + bg = np.asarray(background, dtype=float) - peaks: list of (cen, amp, fwhm) + gamma = float(fwhm) / 2 - background: scalar or array, if array must be same shape as x + 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 + bg + + +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. + """ + x_arr = np.asarray(x, dtype=np.float64) + bg = np.asarray(background, dtype=np.float64) - intensity = np.zeros_like(x) + background + fwhm = float(fwhm) + eta = float(eta) - for peak in peaks: - start_idx = np.searchsorted(x, peak.centre - peak.fwhm) - end_idx = np.searchsorted(x, peak.centre + peak.fwhm, side="right") + # Convert FWHM to internal parameters + sigma = gaussian_fwhm_to_sigma(fwhm) + gamma = lorentzian_fwhm_to_gamma(fwhm) - xi = x[start_idx:end_idx] - peak = gaussian(xi, peak.centre, peak.amplitude, peak.fwhm) * phase_scale + if normalised: + gauss = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp( + -((x_arr - centre) ** 2) / (2 * sigma**2) + ) + lorentz = (1 / np.pi) * (gamma / ((x_arr - centre) ** 2 + gamma**2)) + else: + gauss = np.exp(-((x_arr - centre) ** 2) / (2 * sigma**2)) + lorentz = gamma**2 / ((x_arr - centre) ** 2 + gamma**2) - intensity[start_idx:end_idx] += peak + return amplitude * (eta * lorentz + (1 - eta) * gauss) + bg - return intensity + +def smooth_tophat( + x: np.ndarray, + amplitude: float | int, + centre: float | int, + fwhm: float | int, + sharpness: float | int, + background: float | int | np.ndarray = 0, + normalised: bool = True, +) -> np.ndarray: + """ + Smoothed top-hat using FWHM parameterisation. + + FWHM is defined as the distance between half-maximum points. + """ + + x_arr = np.asarray(x, dtype=np.float64) + bg = np.asarray(background, dtype=np.float64) + + fwhm = float(fwhm) + sharpness = float(sharpness) + + # Convert FWHM → effective plateau width + edge_correction = 2 * np.log(3) / sharpness + width = max(fwhm - edge_correction, 1e-12) # avoid negative width + + left = 1 / (1 + np.exp(-sharpness * (x_arr - (centre - width / 2)))) + right = 1 / (1 + np.exp(-sharpness * (x_arr - (centre + width / 2)))) + + core = left - right + + if normalised: + scale = amplitude / fwhm # area ~ fwhm + else: + scale = amplitude + + return scale * core + bg + + +def closest_indices(arr1, arr2): + """ + For each value in arr1, find the index of the closest value in arr2. + Returns an array of indices with the same shape as arr1. + """ + 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 + + +class Peak(BaseModel): + amplitude: float | int + centre: float | int + fwhm: float | int + + peak_type: Literal["gaussian", "lorentzian", "pseudo-voigt"] = "gaussian" + + eta: float | int | None = None # only used for pseudo-voigt - mixing parameter + sharpness: float | int | None = None # only used for tophat + + background: float | int = 0 + normalised: bool = True # if normalised the + # integral under peak is equal to amplitude. ie number of counts in peak + + @model_validator(mode="after") + def validate_parameters(self): + # Allow NaNs to bypass strict validation + if any( + isinstance(v, float) and math.isnan(v) + for v in [self.amplitude, self.centre, self.fwhm] + ): + return self + + # Manual constraints (NaN-safe) + if self.amplitude <= 0: + raise ValueError("amplitude must be > 0") + + if self.fwhm <= 0: + raise ValueError("fwhm must be > 0") + + if self.peak_type == "pseudo-voigt": + if self.eta is None: + raise ValueError("eta must be provided for pseudo-voigt") + if not (0 <= self.eta <= 1): + raise ValueError("eta must be between 0 and 1") + else: + if self.eta is not None: + raise ValueError("eta should only be set for pseudo-voigt") + + if self.peak_type == "top-hat": + if self.sharpness is None: + raise ValueError("eta must be provided for top-hat") + if self.sharpness <= 0: + raise ValueError("sharpness must be gretaer than 0") + else: + if self.sharpness is not None: + raise ValueError("eta should only be set for top-hat") + + return self + + def calculate(self, x: np.ndarray) -> np.ndarray: + if self.peak_type == "gaussian": + return gaussian( + x=x, + amplitude=self.amplitude, + centre=self.centre, + fwhm=self.fwhm, + background=self.background, + normalised=self.normalised, + ) + elif self.peak_type == "lorentzian": + return lorentzian( + x=x, + amplitude=self.amplitude, + centre=self.centre, + fwhm=self.fwhm, + background=self.background, + normalised=self.normalised, + ) + elif self.peak_type == "pseudo-voigt": + assert self.eta is not None + + return pseudo_voigt( + x=x, + amplitude=self.amplitude, + centre=self.centre, + fwhm=self.fwhm, + eta=self.eta, + background=self.background, + normalised=self.normalised, + ) + elif self.peak_type == "top-hat": + assert self.sharpness is not None + + return smooth_tophat( + x=x, + amplitude=self.amplitude, + centre=self.centre, + fwhm=self.fwhm, + sharpness=self.sharpness, + background=self.background, + normalised=self.normalised, + ) + + else: + raise ValueError(f"{self.peak_type} is not an allowed peak type") def fit_peaks( @@ -57,13 +312,16 @@ def fit_peaks( for x_guess in initial_x_pos: try: - width_guess = 0.03 + width_guess = 2 # 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 - width_guess = 0.03 - p0 = [x_guess, amp_guess, 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") @@ -72,18 +330,52 @@ def fit_peaks( y_fit = y[start_idx:end_idx] if len(y_fit) == 0: - fitted_peaks.append(Peak(centre=np.nan, amplitude=np.nan, fwhm=np.nan)) + fitted_peaks.append(Peak(amplitude=np.nan, centre=np.nan, fwhm=np.nan)) continue popt, _ = curve_fit(gaussian, x_fit, y_fit, p0=p0, maxfev=10000) # type: ignore - fitted_peaks.append(Peak(centre=popt[0], amplitude=popt[1], fwhm=popt[2])) + + fitted_peaks.append(Peak(amplitude=popt[0], centre=popt[1], fwhm=popt[2])) except RuntimeError: - fitted_peaks.append(Peak(centre=np.nan, amplitude=np.nan, fwhm=np.nan)) + fitted_peaks.append(Peak(amplitude=np.nan, centre=np.nan, fwhm=np.nan)) return fitted_peaks +def calculate_profile( + x: np.ndarray, + peaks: Collection[Peak], + background: int | float | np.ndarray, + phase_scale: int | float = 1, + wdt: int | float = 5, +): + """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 class: Peak which contain (cen, amp, fwhm) + + background: scalar or array, if array must be same shape as x + """ + + if isinstance(background, np.ndarray): + assert len(x) == len(background) + + intensity = np.zeros_like(x) + background + + for peak in peaks: + 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) * phase_scale + intensity[start_idx:end_idx] += peak_intensity + + return intensity + + def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[Peak]: """function to get the centre peaks given without guessing""" @@ -98,17 +390,3 @@ def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[Peak]: fitted_peaks = fit_peaks(x, y_smoothed, initial_x_pos=initial_x_pos) return fitted_peaks - - -def closest_indices(arr1, arr2): - """ - For each value in arr1, find the index of the closest value in arr2. - Returns an array of indices with the same shape as arr1. - """ - 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 diff --git a/tests/test_utils.py b/tests/test_utils.py index 8910644..ff0154a 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -39,7 +39,7 @@ def test_normalise(): def test_gaussian(): x = np.linspace(0, 10, 100) - y = gaussian(x, cen=5.0, amp=22.0, fwhm=1.0) + 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) @@ -74,7 +74,7 @@ def test_load_int_array_from_file_returns_array_when_contains_ints(): def test_load_int_array_from_file_returns_none_when_file_doesnt_exist(): - test_file = "nob_existent.txt" + test_file = "non_existent.txt" # Test loading the array result = load_int_array_from_file(test_file) @@ -108,7 +108,7 @@ def test_get_folder_paths(): def test_find_and_fit_peaks_with_one_peak(): np.random.seed(0) # For reproducibility x = np.linspace(0, 10, 100) - y = gaussian(x, cen=5.0, amp=1.0, fwhm=1.0) + 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 @@ -126,7 +126,7 @@ def test_find_and_fit_peaks_with_n_peaks(): y_intensity = np.zeros_like(x) for n, peak_cen in enumerate(np.linspace(20, 80, 4)): - peak_intensity = gaussian(x, cen=peak_cen, amp=n, fwhm=1.0) + peak_intensity = gaussian(x, amplitude=n, centre=peak_cen, fwhm=1.0) y_intensity = y_intensity + peak_intensity noise = np.random.normal(0, 0.02, size=y_intensity.shape) diff --git a/uv.lock b/uv.lock index a5b66c9..c38677a 100644 --- a/uv.lock +++ b/uv.lock @@ -1920,61 +1920,6 @@ 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 = "pyqt5" -version = "5.15.11" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyqt5-qt5" }, - { name = "pyqt5-sip" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0e/07/c9ed0bd428df6f87183fca565a79fee19fa7c88c7f00a7f011ab4379e77a/PyQt5-5.15.11.tar.gz", hash = "sha256:fda45743ebb4a27b4b1a51c6d8ef455c4c1b5d610c90d2934c7802b5c1557c52", size = 3216775, upload-time = "2024-07-19T08:39:57.756Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/64/42ec1b0bd72d87f87bde6ceb6869f444d91a2d601f2e67cd05febc0346a1/PyQt5-5.15.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8b03dd9380bb13c804f0bdb0f4956067f281785b5e12303d529f0462f9afdc2", size = 6579776, upload-time = "2024-07-19T08:39:19.775Z" }, - { url = "https://files.pythonhosted.org/packages/49/f5/3fb696f4683ea45d68b7e77302eff173493ac81e43d63adb60fa760b9f91/PyQt5-5.15.11-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:6cd75628f6e732b1ffcfe709ab833a0716c0445d7aec8046a48d5843352becb6", size = 7016415, upload-time = "2024-07-19T08:39:32.977Z" }, - { url = "https://files.pythonhosted.org/packages/b4/8c/4065950f9d013c4b2e588fe33cf04e564c2322842d84dbcbce5ba1dc28b0/PyQt5-5.15.11-cp38-abi3-manylinux_2_17_x86_64.whl", hash = "sha256:cd672a6738d1ae33ef7d9efa8e6cb0a1525ecf53ec86da80a9e1b6ec38c8d0f1", size = 8188103, upload-time = "2024-07-19T08:39:40.561Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f0/ae5a5b4f9b826b29ea4be841b2f2d951bcf5ae1d802f3732b145b57c5355/PyQt5-5.15.11-cp38-abi3-win32.whl", hash = "sha256:76be0322ceda5deecd1708a8d628e698089a1cea80d1a49d242a6d579a40babd", size = 5433308, upload-time = "2024-07-19T08:39:46.932Z" }, - { url = "https://files.pythonhosted.org/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl", hash = "sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517", size = 6865864, upload-time = "2024-07-19T08:39:53.572Z" }, -] - -[[package]] -name = "pyqt5-qt5" -version = "5.15.18" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/90/bf01ac2132400997a3474051dd680a583381ebf98b2f5d64d4e54138dc42/pyqt5_qt5-5.15.18-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:8bb997eb903afa9da3221a0c9e6eaa00413bbeb4394d5706118ad05375684767", size = 39715743, upload-time = "2025-11-09T12:56:42.936Z" }, - { url = "https://files.pythonhosted.org/packages/24/8e/76366484d9f9dbe28e3bdfc688183433a7b82e314216e9b14c89e5fab690/pyqt5_qt5-5.15.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c656af9c1e6aaa7f59bf3d8995f2fa09adbf6762b470ed284c31dca80d686a26", size = 36798484, upload-time = "2025-11-09T12:56:59.998Z" }, - { url = "https://files.pythonhosted.org/packages/9a/46/ffe177f99f897a59dc237a20059020427bd2d3853d713992b8081933ddfe/pyqt5_qt5-5.15.18-py3-none-manylinux2014_x86_64.whl", hash = "sha256:bf2457e6371969736b4f660a0c153258fa03dbc6a181348218e6f05421682af7", size = 60864590, upload-time = "2025-11-09T12:57:26.724Z" }, -] - -[[package]] -name = "pyqt5-sip" -version = "12.18.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/31/5ef342de9faee0f3801088946ae103db9b9eaeba3d6a64fefd5ce74df244/pyqt5_sip-12.18.0.tar.gz", hash = "sha256:71c37db75a0664325de149f43e2a712ec5fa1f90429a21dafbca005cb6767f94", size = 104143, upload-time = "2026-01-13T15:53:19.576Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/59/3dd29bcfde479ac241f618235bf7d76e65e47afdcd91743554d490ae0d19/pyqt5_sip-12.18.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13c32e9025d0ab5fe960ef64dcb4c6f7ec26156ddce2cf2f195600aa26e8f9fe", size = 122724, upload-time = "2026-01-13T15:52:49.875Z" }, - { url = "https://files.pythonhosted.org/packages/87/c4/ac4deee3249d3ceb703103acbbf76d89f3782fa7ad2ca5a15fcb5bcf5c73/pyqt5_sip-12.18.0-cp311-cp311-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dd855149c724634eb1f92d10e04e1be0751068a8521d5f9f06e5c2dbe32fd89f", size = 327560, upload-time = "2026-01-13T15:52:53.584Z" }, - { url = "https://files.pythonhosted.org/packages/79/53/64373ba9311288b0ea6b5ab375d9c9743a41ac93df7137655498c95a08e5/pyqt5_sip-12.18.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:521729e4ce44db555005f4e6987c4a5164d45ea03f5a7d08519813d4776acd15", size = 277067, upload-time = "2026-01-13T15:52:51.22Z" }, - { url = "https://files.pythonhosted.org/packages/ce/dd/4026bba8355ceaba222db0369fe4a480d55aa61d3f14dbe1458886ccc032/pyqt5_sip-12.18.0-cp311-cp311-win32.whl", hash = "sha256:c738949863d88b78f86f28e13151989ca3b1a302934811af41856dc8a27838bd", size = 49323, upload-time = "2026-01-13T15:52:55.859Z" }, - { url = "https://files.pythonhosted.org/packages/41/35/39e549ca7f7c9fbb025912a5db7f55f3b9c22d7f9718f41c2e7a17c806e9/pyqt5_sip-12.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac0be1a8ce145ed78c7e8d45243749405bee7e3a87e9810b0542bca010c50bd7", size = 58795, upload-time = "2026-01-13T15:52:54.995Z" }, - { url = "https://files.pythonhosted.org/packages/2a/61/6d78d702016ac23d2b97634a3b6a831c3f7735f0552a1c8b058db96005d1/pyqt5_sip-12.18.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b29e4cda24748e59e5bd1bdad4812091a86b4b5b08c38b7f781eb55a5166f2b7", size = 124614, upload-time = "2026-01-13T15:52:57.59Z" }, - { url = "https://files.pythonhosted.org/packages/19/bf/8f3efa10ddd3e76c1253865340ab7c2960ef96681d732b1f666c77430612/pyqt5_sip-12.18.0-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:163c2bba5e637c2222ec17d82a2c5aa158184a191923eb7d137cf4cfa0399529", size = 339412, upload-time = "2026-01-13T15:53:00.563Z" }, - { url = "https://files.pythonhosted.org/packages/72/48/f1bcf6729d01bae6729cd790b22fd579dbe34014e8be031e6f10c5b9b2aa/pyqt5_sip-12.18.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ead5e0a64ad852ac60797989d8444a6a5bd834768536b04a07b40b2937d922f6", size = 282376, upload-time = "2026-01-13T15:52:59.172Z" }, - { url = "https://files.pythonhosted.org/packages/dd/b7/d84c764ac9f1366be561255ec9bd88ee224fefdbdb349aee250f3003f0ca/pyqt5_sip-12.18.0-cp312-cp312-win32.whl", hash = "sha256:993fe3ed9a62a92e770f32d5344e3df56c2cacf1471f01b7feaf04818a2df1c4", size = 49523, upload-time = "2026-01-13T15:53:03.068Z" }, - { url = "https://files.pythonhosted.org/packages/ab/e7/ef87178d5afa5f63be38556dc0df8af89f9bf74f2555f4dab6824c0fd150/pyqt5_sip-12.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:9b689e02e400abd1ce0a30cd6eae8eceabcf1bbba0395cb5c86e64ba74351d68", size = 58001, upload-time = "2026-01-13T15:53:02.15Z" }, - { url = "https://files.pythonhosted.org/packages/79/67/8d43d0fea10ff48ddecc8534aead8b855dc80df80653b8b1bf9e1f993063/pyqt5_sip-12.18.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9254e5dd7676b76503ba20edcc919e7ac4a97b6c70a6fb2f9dba9e13b4c60509", size = 124605, upload-time = "2026-01-13T15:53:04.991Z" }, - { url = "https://files.pythonhosted.org/packages/48/2a/b08bc8efeb49c50c6cdac11417dc2c8eaefcac2f0a6382eae7b26dc0f232/pyqt5_sip-12.18.0-cp313-cp313-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c969631ada7293a81e1012b2264a62d69a91995b517586489dfe24421b87b9af", size = 339918, upload-time = "2026-01-13T15:53:08.502Z" }, - { url = "https://files.pythonhosted.org/packages/b6/99/24f82437b2f073cf39296b7c731b6a8bc0f5207911fdd93841a0ea9abe42/pyqt5_sip-12.18.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d84ac384a63285132e67762c87681191c25e28a1df7560287ec3889d9eb223b5", size = 282088, upload-time = "2026-01-13T15:53:06.632Z" }, - { url = "https://files.pythonhosted.org/packages/3e/27/20d3924943df34361fae9c6a0489ae89d0b07571693245c61678d185e4a4/pyqt5_sip-12.18.0-cp313-cp313-win32.whl", hash = "sha256:95bba4670ecf5cba73958b85aa2087c17838a402ed251c38e68060c7665c998b", size = 49501, upload-time = "2026-01-13T15:53:11.159Z" }, - { url = "https://files.pythonhosted.org/packages/3f/36/e251623c12968730730512a9e5150430e36246afbe64894610190b896f61/pyqt5_sip-12.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:aac4adc37df2f2ac1dc259409be1900f07332d140a12c9db7c84112cef64ff59", size = 58076, upload-time = "2026-01-13T15:53:09.928Z" }, - { url = "https://files.pythonhosted.org/packages/37/3a/b46a0116b1aacbb6156b2957eb5cb928c94b49f4626eb2540ca8d16ee757/pyqt5_sip-12.18.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8372ec8704bfd5e09942d0d055a1657eb4f702f4b30847a5e59df0496f99d67f", size = 124594, upload-time = "2026-01-13T15:53:13.159Z" }, - { url = "https://files.pythonhosted.org/packages/58/63/df3037f11391c25c5b0ab233d22e58b8f056cb1ce16d7ecadb844421ce75/pyqt5_sip-12.18.0-cp314-cp314-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fdb45c7cd2af7eccd7370b994d432bfc7965079f845392760724f26771bb59dc", size = 339056, upload-time = "2026-01-13T15:53:16.558Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e7/4f96b84520b8f8b7502682fd43f68f63ca6572b5858f56e5f61c76a54fe2/pyqt5_sip-12.18.0-cp314-cp314-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:92abe984becbde768954d6d0951f56d80a9868d2fd9e738e61fc944f0ff83dd6", size = 282439, upload-time = "2026-01-13T15:53:14.856Z" }, - { url = "https://files.pythonhosted.org/packages/79/8e/ccdf20d373ceba83e1d1b7f818505c375208ffde4a96376dc7dbe592406c/pyqt5_sip-12.18.0-cp314-cp314-win32.whl", hash = "sha256:bd9e3c6f81346f1b08d6db02305cdee20c009b43aa083d44ee2de47a7da0e123", size = 50713, upload-time = "2026-01-13T15:53:18.634Z" }, - { url = "https://files.pythonhosted.org/packages/7f/21/8486ed45977be615ec5371b24b47298b1cb0e1a455b419eddd0215078dba/pyqt5_sip-12.18.0-cp314-cp314-win_amd64.whl", hash = "sha256:6d948f1be619c645cd3bda54952bfdc1aef7c79242dccea6a6858748e61114b9", size = 59622, upload-time = "2026-01-13T15:53:17.714Z" }, -] - [[package]] name = "pyqt6" version = "6.10.2" @@ -1994,43 +1939,43 @@ wheels = [ [[package]] name = "pyqt6-qt6" -version = "6.10.1" +version = "6.10.2" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/1b/137184632cad83a210e7955226744a77945260ca2e75892fe36299d26ada/pyqt6_qt6-6.10.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:4bb2798a95f624b462b70c4f185422235b714b01e55abab32af1740f147948e2", size = 68472463, upload-time = "2025-11-27T14:20:51.694Z" }, - { url = "https://files.pythonhosted.org/packages/af/df/ca795ac3d04243ad63499cfedcf92d8b5f6e3585a2a26c09f34cb58c8e44/pyqt6_qt6-6.10.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0921cc522512cb40dbab673806bc1676924819550e0aec8e3f3fe6907387c5b7", size = 62296168, upload-time = "2025-11-27T14:21:21.232Z" }, - { url = "https://files.pythonhosted.org/packages/f4/7e/9867361252e2a4717dba95c64a0f3a793603f4a52cb9a46abbb041e960f5/pyqt6_qt6-6.10.1-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:04069aea421703b1269c8a1bcf017e36463af284a044239a4ebda3bde0a629fb", size = 83829262, upload-time = "2025-11-27T14:22:00.399Z" }, - { url = "https://files.pythonhosted.org/packages/9b/7b/18f4eb2273a92283fe4d87aa740a400eb14a4e41b8f990aaf563e9767db6/pyqt6_qt6-6.10.1-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:5b9be39e0120e32d0b42cdb844e3ae110ddadd39629c991e511902c06f155aff", size = 82877396, upload-time = "2025-11-27T14:22:36.994Z" }, - { url = "https://files.pythonhosted.org/packages/53/5c/648c515d57bc82909d0597befb03bbc2f7a570f323dba3ad38629669efcb/pyqt6_qt6-6.10.1-py3-none-win_amd64.whl", hash = "sha256:df564d3dc2863b1fde22b39bea9f56ceb2a3ed7d6f0b76d3f96c2d3bc5d71516", size = 76670151, upload-time = "2025-11-27T14:23:11.172Z" }, - { url = "https://files.pythonhosted.org/packages/0a/13/2d2a9c0559bfa53effea5e2c1ed7aebb430186ce0b64cfba235231a049d9/pyqt6_qt6-6.10.1-py3-none-win_arm64.whl", hash = "sha256:48282e0f99682daf4f1e220cfe9f41255e003af38f7728a30d40c76e55c89816", size = 58276316, upload-time = "2025-11-27T14:23:38.744Z" }, + { url = "https://files.pythonhosted.org/packages/9a/eb/f04d547d8ed9f20c7b246db4ef5d93b49cab4692009a10652ed0a8b9d2aa/pyqt6_qt6-6.10.2-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:5761cfccc721da2311c3f1213577f0ff1df07bbbbe3fa3a209a256b82cf057e3", size = 68688870, upload-time = "2026-01-29T12:26:48.619Z" }, + { url = "https://files.pythonhosted.org/packages/ce/c8/d99e65ab01c2402fb6bc4f77abef7244f7d5fb2f2e6d5b0abdf71bb2e4fc/pyqt6_qt6-6.10.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6dda853a8db1b8d1a2ddbbe76cc6c3aa86614cad14056bd3c0435d8feea73b2d", size = 62512013, upload-time = "2026-01-29T12:27:24.642Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fe/01fd9b9d2ca139ef61582f2e2da249fa169229144294c1bb27db59ad8420/pyqt6_qt6-6.10.2-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:19c10b5f0806e9f9bac2c9759bd5d7d19a78967f330fd60a2db409177fa76e49", size = 84028760, upload-time = "2026-01-29T12:28:03.267Z" }, + { url = "https://files.pythonhosted.org/packages/f4/20/a0d027ebb267d3afaf319d94efe1ff4d667004ee83b96701329a4d11fb95/pyqt6_qt6-6.10.2-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:2e60d616861ca4565cd295418d605975aa2dc407ba4b94c1586a70c92e9cb052", size = 83063975, upload-time = "2026-01-29T12:28:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/06/8e/595f215876d507417cc8565e05519916d3b0b76baedea6a1e4e5105633fc/pyqt6_qt6-6.10.2-py3-none-win_amd64.whl", hash = "sha256:c4b7f7d66cc58bddf1bc1ca28dfcf7a45f58cfcb11d81d13a0510409dd4957ac", size = 78433821, upload-time = "2026-01-29T12:29:35.493Z" }, + { url = "https://files.pythonhosted.org/packages/50/5f/2196e2b536217b87cb3d2ce13ef8f7607d08b02f1990a4bd84a88d293a3c/pyqt6_qt6-6.10.2-py3-none-win_arm64.whl", hash = "sha256:7164a6f0c1335358a3026df9865c8f75395b01f60f0dcd2f66c029ec16fc83d2", size = 58354426, upload-time = "2026-01-29T12:30:02.95Z" }, ] [[package]] name = "pyqt6-sip" -version = "13.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/7d/d2916048e2e3960f68cb4e93907639844f7b8ff95897dcc98553776ccdfc/pyqt6_sip-13.11.0.tar.gz", hash = "sha256:d463af37738bda1856c9ef513e5620a37b7a005e9d589c986c3304db4a8a14d3", size = 92509, upload-time = "2026-01-13T16:01:32.16Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/41/1c2097aad646f7ef6be9cfd2fd4814ad6bbdba7d53a622ad56e00f88dc72/pyqt6_sip-13.11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e329ccc3a6502e2b774ef62ab843ac8b3f32191324e8230e6dde78c1c0df5a8", size = 110804, upload-time = "2026-01-13T16:01:02.527Z" }, - { url = "https://files.pythonhosted.org/packages/e0/d3/51143a254a7c9e9650c3eedfc35b967cdcd180a289c6fa2a937c57fe405a/pyqt6_sip-13.11.0-cp311-cp311-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:364424dacdee9e0a2a723646b5608139629ad9bde318dd755d86f5e0ba123c79", size = 291442, upload-time = "2026-01-13T16:01:05.424Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5c/d62e0ded4fdd5abf6a3085a65aa229c863b334758555af1f7b79af9bc003/pyqt6_sip-13.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:132ee69d935c14bb4ced2a811ef333200c7aa50324bd7caadefd7d5874495225", size = 317793, upload-time = "2026-01-13T16:01:04.183Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d4/34f3fb522323a5336e31a51ab7ae3103ebc0c8e741bff9630f29480cdca2/pyqt6_sip-13.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:341e52e702d41872515794dea6265ee56b8625c9d3c74ea0468124f0bd675f8b", size = 54101, upload-time = "2026-01-13T16:01:06.504Z" }, - { url = "https://files.pythonhosted.org/packages/a9/a1/37109ec33ead4b9cc62294b48a1ba2b4899cb0d009eb1763d61e3a89ab21/pyqt6_sip-13.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:489fdd0910f8c1d5d40255b4cd7b45f4a4549f9a599512bc6b2cc8d384e28852", size = 48359, upload-time = "2026-01-13T16:01:07.732Z" }, - { url = "https://files.pythonhosted.org/packages/53/a6/0e4d8fa7d6deb750bd0fdf89024e39c71fb127efb5eeedfab6830ad6679a/pyqt6_sip-13.11.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6b3267cd93b7f4da6fdf9a6a26f3baed8faae06e5cdd76235f2acc2116c40a54", size = 112367, upload-time = "2026-01-13T16:01:09.08Z" }, - { url = "https://files.pythonhosted.org/packages/66/e6/25dc20a03c46000e8b93aaf79347227926b67959283e5aab797daa7f64d8/pyqt6_sip-13.11.0-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c30248d9bbe54c46a78e5d549da50295ecd6584b965597f751e272f000fb8527", size = 301150, upload-time = "2026-01-13T16:01:12.385Z" }, - { url = "https://files.pythonhosted.org/packages/11/9f/e850cd350aade789660cafba38c00777e686040c06b8cd0b45339b80fcba/pyqt6_sip-13.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c367b53a91e575ef66c1375f899713bdaf0a8b2c64b95ac226e9644854a4984", size = 323303, upload-time = "2026-01-13T16:01:10.736Z" }, - { url = "https://files.pythonhosted.org/packages/77/26/5261d62108f7579407230f8c1d4dda43c18b5600ce70bf3becb2f997d5cc/pyqt6_sip-13.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:077958105c2ea2f62be2f1a7611ff8bd44cb52fb5ea8fc8c59ea949144acb7b5", size = 53461, upload-time = "2026-01-13T16:01:13.875Z" }, - { url = "https://files.pythonhosted.org/packages/46/80/6c88b97eda309d6babb7292200bf51165dc06d0204d891b7bf1fb17a8ed0/pyqt6_sip-13.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:52812471619d3d3750b940d7d124cd0954107656924921ac177e098ba36362fb", size = 48650, upload-time = "2026-01-13T16:01:14.897Z" }, - { url = "https://files.pythonhosted.org/packages/df/a0/46abcae4fce175a326185460a02c13ab81332bca7dd55c1e853ba6aee71e/pyqt6_sip-13.11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:929716eebde1a64ffdb6b1715db6a22aefd5634d6df84858c7deb5e85be84fdf", size = 112353, upload-time = "2026-01-13T16:01:16.152Z" }, - { url = "https://files.pythonhosted.org/packages/0e/38/27c3aa3f153fcd83a0765fedf8e44a1136f189a322bcc9c494c5b3793cd7/pyqt6_sip-13.11.0-cp313-cp313-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75144e8a0bcf9d1a9069011890401748af353749f1de1b6a314b880781edf9d", size = 301497, upload-time = "2026-01-13T16:01:20.531Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ac/1053ffce45e4174f0a8174557b88537aa82bf96ba03c7dd208c59de36f69/pyqt6_sip-13.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8082b5f57ffad5dddf5efcf0ef5eaf94841395aa4e7c374c79ef24cf49b0f0ce", size = 323498, upload-time = "2026-01-13T16:01:17.859Z" }, - { url = "https://files.pythonhosted.org/packages/40/d3/447b30d1f00cc50ad9e5c53b2e920068606b16857da83f8036b390c79fad/pyqt6_sip-13.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d49b5bf3d8d36cd7db93ddc54cd09dbba96a3fd926e445ef75499b41e47b5a3", size = 53469, upload-time = "2026-01-13T16:01:21.762Z" }, - { url = "https://files.pythonhosted.org/packages/92/67/77e6fafcabd01c0a11166ab7464509896f137929f82c4f2e03aea1bf41b3/pyqt6_sip-13.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:293eac1b53c66c54b03266cc30015ec77454af679043a4f188b9bb80a9656996", size = 48643, upload-time = "2026-01-13T16:01:22.669Z" }, - { url = "https://files.pythonhosted.org/packages/ff/28/a5178c8e005bafbf9c0fd507f45a3eef619ab582811414a0a461ee75994f/pyqt6_sip-13.11.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4dc9c4df24af0571423c3e85b5c008bad42ed48558eef80fbc3e5d30274c5abb", size = 112431, upload-time = "2026-01-13T16:01:23.832Z" }, - { url = "https://files.pythonhosted.org/packages/13/3c/02770b02b5a05779e26bd02c202c2fd32aa38e225d01f14c06908e33738c/pyqt6_sip-13.11.0-cp314-cp314-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c974d5a193f32e55e746e9b63138503163ac63500dbb1fd67233d8a8d71369bd", size = 301236, upload-time = "2026-01-13T16:01:28.733Z" }, - { url = "https://files.pythonhosted.org/packages/40/47/5af493a698cc520581ca1000b4ab09b8182992053ffe2478062dde5e4671/pyqt6_sip-13.11.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4284540ffccd8349763ddce3518264dde62f20556720d4061b9c895e09011ca0", size = 323919, upload-time = "2026-01-13T16:01:25.122Z" }, - { url = "https://files.pythonhosted.org/packages/b7/2d/64b26e21183a7ff180105871dd5983a8da539d8768921728268dc6d0a73d/pyqt6_sip-13.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:9bd81cb351640abc803ea2fe7262b5adea28615c9b96fd103d1b6f3459937211", size = 55078, upload-time = "2026-01-13T16:01:29.853Z" }, - { url = "https://files.pythonhosted.org/packages/7e/36/23f699fa8b1c3fcc312ecd12661a1df6057d92e16d4def2399b59cf7bf22/pyqt6_sip-13.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:cd95ec98f8edb15bcea832b8657809f69d758bc4151cc6fd7790c0181949e45f", size = 49465, upload-time = "2026-01-13T16:01:31.174Z" }, +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]] @@ -2573,7 +2518,6 @@ dependencies = [ { name = "peakutils" }, { name = "pycifrw" }, { name = "pyfai" }, - { name = "pyqt5" }, { name = "pyqt6" }, { name = "pyyaml" }, { name = "scipy" }, @@ -2606,7 +2550,6 @@ requires-dist = [ { name = "peakutils" }, { name = "pycifrw" }, { name = "pyfai" }, - { name = "pyqt5" }, { name = "pyqt6" }, { name = "pyyaml" }, { name = "scipy" }, From 1cc53842ab5c49b48425eae0547a2b7158f982f8 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 18 Mar 2026 16:39:38 +0000 Subject: [PATCH 56/86] add dls mounts --- .devcontainer/devcontainer.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ae4c50d..4ecd316 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -69,6 +69,19 @@ "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", + "target": "/dls", + "type": "bind" + }, + { + "source": "/dls_sw", + "target": "/dls_sw", + "type": "bind" } ], // Mount the parent as /workspaces so we can pip install peers as editable From 929b27650072744b7e906fb65275b5fc43a703b5 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 18 Mar 2026 17:00:26 +0000 Subject: [PATCH 57/86] comment out mount --- .devcontainer/devcontainer.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4ecd316..43db8cc 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -73,16 +73,16 @@ // 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", - "target": "/dls", - "type": "bind" - }, - { - "source": "/dls_sw", - "target": "/dls_sw", - "type": "bind" - } + // { + // "source": "/dls", + // "target": "/dls", + // "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", From b945f9d3045a9f84d082bdb46838b18fa5db19c2 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 27 Mar 2026 12:05:04 +0000 Subject: [PATCH 58/86] added peak calculations - lp factor still wrong --- cifs/si.cif | 226 + pyproject.toml | 3 + src/xrpd_toolbox/i11/mythen.py | 49 +- .../i11/mythen3_reduction_legacy.py | 2 +- src/xrpd_toolbox/utils/constants.py | 370 + .../utils/constants/atom_form_factors.csv | 212 + ...ternational_tables_of_crystallography.yaml | 9409 ++++++ .../utils/constants/symmetry_operations.yaml | 24300 ++++++++++++++++ src/xrpd_toolbox/utils/energy.py | 49 - src/xrpd_toolbox/utils/peaks.py | 269 +- src/xrpd_toolbox/utils/profile_calculation.py | 861 + src/xrpd_toolbox/utils/symmetry.py | 292 + src/xrpd_toolbox/utils/unit_conversion.py | 121 + src/xrpd_toolbox/utils/utils.py | 5 +- tests/test_utils.py | 4 +- uv.lock | 465 + 16 files changed, 36465 insertions(+), 172 deletions(-) create mode 100644 cifs/si.cif create mode 100644 src/xrpd_toolbox/utils/constants.py create mode 100644 src/xrpd_toolbox/utils/constants/atom_form_factors.csv create mode 100644 src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml create mode 100644 src/xrpd_toolbox/utils/constants/symmetry_operations.yaml delete mode 100644 src/xrpd_toolbox/utils/energy.py create mode 100644 src/xrpd_toolbox/utils/profile_calculation.py create mode 100644 src/xrpd_toolbox/utils/symmetry.py create mode 100644 src/xrpd_toolbox/utils/unit_conversion.py 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/pyproject.toml b/pyproject.toml index 75c5d8b..931652a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,8 +26,11 @@ dependencies = [ "toml", "PyQt6", # "PyQt5", + "spglib", + "pymatgen", "Dans_Diffraction", "stomp.py", + "numba", "gql", "ipywidgets", diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index bba781a..6da539c 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -18,6 +18,7 @@ from xrpd_toolbox.utils.messenger import Messenger from xrpd_toolbox.utils.mythen_utils import channel_to_angle, modules_to_pixels from xrpd_toolbox.utils.peaks import closest_indices, fit_peaks +from xrpd_toolbox.utils.profile_calculation import Structure from xrpd_toolbox.utils.settings import SettingsBase from xrpd_toolbox.utils.utils import ( bin_and_propagate_errors, @@ -657,13 +658,22 @@ def plot_diffraction( ) if calibrant is not None: - si_tth = get_calibrant_peaks("Si", 0.828783) + # si_tth = get_calibrant_peaks("Si", 0.828783) + + si = Structure.load_from_cif("/workspaces/XRPD-Toolbox/cifs/si.cif") + si_tth, _ = si.calculate_peaks(0.828783) + + minpeak, maxpeak = np.amin(tth), np.amax(tth) + + indices = np.where((si_tth >= minpeak) & (si_tth <= maxpeak))[0] + si_tth = si_tth[indices] + indx = closest_indices(si_tth, tth) peak_heights = counts[indx] - plt.scatter(si_tth, peak_heights, color="red") + plt.scatter(si_tth, peak_heights, label="calibrant positions", color="red") - plt.errorbar(tth, counts, error, label=self.settings.error_calc) - plt.legend() + plt.errorbar(tth, counts, error, label="data") + plt.legend(ncols=2) plt.xlabel("tth") plt.ylabel("Intensity (arb. units)") @@ -678,7 +688,10 @@ def plot_diffraction( 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] @@ -688,15 +701,15 @@ def plot_diffraction_by_mod(self, filepath: str | Path | None = None): 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.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() + plt.legend(ncols=2) if filepath: plt.savefig(filepath) @@ -771,7 +784,7 @@ def convert_angcal_to_new_pydantic_json( 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)) + # settings.bad_modules = list(range(27)) print("Loaded settings:", settings) # print(DATA_FILE) @@ -788,6 +801,20 @@ def convert_angcal_to_new_pydantic_json( # 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=None + ) + + mythen3.plot_diffraction_by_mod() + + quit() + active_modules = list(range(28)) for module in range(28): diff --git a/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py b/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py index 28eca7c..bc557cb 100644 --- a/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py +++ b/src/xrpd_toolbox/i11/mythen3_reduction_legacy.py @@ -14,9 +14,9 @@ from h5py import File as h5pyFile from matplotlib.gridspec import GridSpec -from xrpd_toolbox.utils.energy import tth_to_q 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 diff --git a/src/xrpd_toolbox/utils/constants.py b/src/xrpd_toolbox/utils/constants.py new file mode 100644 index 0000000..260150a --- /dev/null +++ b/src/xrpd_toolbox/utils/constants.py @@ -0,0 +1,370 @@ +SPACEGROUP_NUMBER = { + "P1": 1, + "P-1": 2, + "P2": 3, + "P2_1": 4, + "C2": 5, + "Pm": 6, + "Pc": 7, + "Cm": 8, + "Cc": 9, + "P2/m": 10, + "P2_1/m": 11, + "C2/m": 12, + "P2/c": 13, + "P2_1/c": 14, + "C2/c": 15, + "P222": 16, + "P222_1": 17, + "P2_12_12": 18, + "P2_12_12_1": 19, + "C222_1": 20, + "C222": 21, + "F222": 22, + "I222": 23, + "I2_12_12_1": 24, + "Pmm2": 25, + "Pmc2_1": 26, + "Pcc2": 27, + "Pma2": 28, + "Pca2_1": 29, + "Pnc2": 30, + "Pmn2_1": 31, + "Pba2": 32, + "Pna2_1": 33, + "Pnn2": 34, + "Cmm2": 35, + "Cmc2_1": 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, + "P4_1": 76, + "P4_2": 77, + "P4_3": 78, + "I4": 79, + "I4_1": 80, + "P-4": 81, + "I-4": 82, + "P4/m": 83, + "P4_2/m": 84, + "P4/n": 85, + "P4_2/n": 86, + "I4/m": 87, + "I4_1/a": 88, + "P422": 89, + "P42_12": 90, + "P4_122": 91, + "P4_12_12": 92, + "P4_222": 93, + "P4_22_12": 94, + "P4_322": 95, + "P4_32_12": 96, + "I422": 97, + "I4_122": 98, + "P4mm": 99, + "P4bm": 100, + "P4_2cm": 101, + "P4_2nm": 102, + "P4cc": 103, + "P4nc": 104, + "P4_2mc": 105, + "P4_2bc": 106, + "I4mm": 107, + "I4cm": 108, + "I4_1md": 109, + "I4_1cd": 110, + "P-42m": 111, + "P-42c": 112, + "P-42_1m": 113, + "P-42_1c": 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, + "P4_2/mmc": 131, + "P4_2/mcm": 132, + "P4_2/nbc": 133, + "P4_2/nnm": 134, + "P4_2/mbc": 135, + "P4_2/mnm": 136, + "P4_2/nmc": 137, + "P4_2/ncm": 138, + "I4/mmm": 139, + "I4/mcm": 140, + "I4_1/amd": 141, + "I4_1/acd": 142, + "P3": 143, + "P3_1": 144, + "P3_2": 145, + "R3": 146, + "P-3": 147, + "R-3": 148, + "P312": 149, + "P321": 150, + "P3_112": 151, + "P3_121": 152, + "P3_212": 153, + "P3_221": 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, + "P6_1": 169, + "P6_5": 170, + "P6_2": 171, + "P6_4": 172, + "P6_3": 173, + "P-6": 174, + "P6/m": 175, + "P6_3/m": 176, + "P622": 177, + "P6_122": 178, + "P6_522": 179, + "P6_222": 180, + "P6_422": 181, + "P6_322": 182, + "P6mm": 183, + "P6cc": 184, + "P6_3cm": 185, + "P6_3mc": 186, + "P-6m2": 187, + "P-6c2": 188, + "P-62m": 189, + "P-62c": 190, + "P6/mmm": 191, + "P6/mcc": 192, + "P6_3/mcm": 193, + "P6_3/mmc": 194, + "P23": 195, + "F23": 196, + "I23": 197, + "P2_13": 198, + "I2_13": 199, + "Pm-3": 200, + "Pn-3": 201, + "Fm-3": 202, + "Fd-3": 203, + "Im-3": 204, + "Pa-3": 205, + "Ia-3": 206, + "P432": 207, + "P4_232": 208, + "F432": 209, + "F4_132": 210, + "I432": 211, + "P4_332": 212, + "P4_132": 213, + "I4_132": 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, +} + + +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: + number_to_spacegroup = dict( + zip(SPACEGROUP_NUMBER.values(), SPACEGROUP_NUMBER.keys(), strict=True) + ) + + return number_to_spacegroup[spacegroup_number] diff --git a/src/xrpd_toolbox/utils/constants/atom_form_factors.csv b/src/xrpd_toolbox/utils/constants/atom_form_factors.csv new file mode 100644 index 0000000..db3807a --- /dev/null +++ b/src/xrpd_toolbox/utils/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/utils/constants/international_tables_of_crystallography.yaml b/src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml new file mode 100644 index 0000000..ca7916c --- /dev/null +++ b/src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml @@ -0,0 +1,9409 @@ +--- +spacegroups: + 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: + 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 + P121: + 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 + P112: + crystal_class: monoclinic + hall: ' P 2' + hermann_mauguin: P 1 1 2 + symops: ['x,y,z', '-x,-y,z'] + ncsym: ['x,y,z', '-x,-y,z'] + number: 3 + schoenflies: C2^1 + universal_h_m: P 1 1 2 + P211: + crystal_class: monoclinic + hall: ' P 2x' + hermann_mauguin: P 2 1 1 + symops: ['x,y,z', 'x,-y,-z'] + ncsym: ['x,y,z', 'x,-y,-z'] + number: 3 + schoenflies: C2^1 + universal_h_m: P 2 1 1 + P1211: + 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 + P1121: + crystal_class: monoclinic + hall: ' P 2c' + hermann_mauguin: P 1 1 21 + symops: ['x,y,z', '-x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5'] + number: 4 + schoenflies: C2^2 + universal_h_m: P 1 1 21 + P2111: + crystal_class: monoclinic + hall: ' P 2xa' + hermann_mauguin: P 21 1 1 + symops: ['x,y,z', 'x+0.5,-y,-z'] + ncsym: ['x,y,z', 'x+0.5,-y,-z'] + number: 4 + schoenflies: C2^2 + universal_h_m: P 21 1 1 + C121: + 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 + A121: + crystal_class: monoclinic + hall: ' A 2y' + hermann_mauguin: A 1 2 1 + 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'] + number: 5 + schoenflies: C2^3 + universal_h_m: A 1 2 1 + I121: + crystal_class: monoclinic + hall: ' I 2y' + hermann_mauguin: I 1 2 1 + 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'] + number: 5 + schoenflies: C2^3 + universal_h_m: I 1 2 1 + A112: + crystal_class: monoclinic + hall: ' A 2' + hermann_mauguin: A 1 1 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'] + number: 5 + schoenflies: C2^3 + universal_h_m: A 1 1 2 + B112: + crystal_class: monoclinic + hall: ' B 2' + hermann_mauguin: B 1 1 2 + symops: ['x,y,z', '-x,-y,z', 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z'] + number: 5 + schoenflies: C2^3 + universal_h_m: B 1 1 2 + I112: + crystal_class: monoclinic + hall: ' I 2' + hermann_mauguin: I 1 1 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'] + number: 5 + schoenflies: C2^3 + universal_h_m: I 1 1 2 + B211: + crystal_class: monoclinic + hall: ' B 2x' + hermann_mauguin: B 2 1 1 + symops: ['x,y,z', 'x,-y,-z', 'x+0.5,y,z+0.5', 'x+0.5,-y,-z+0.5'] + ncsym: ['x,y,z', 'x,-y,-z'] + number: 5 + schoenflies: C2^3 + universal_h_m: B 2 1 1 + C211: + crystal_class: monoclinic + hall: ' C 2x' + hermann_mauguin: C 2 1 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 2 1 1 + I211: + crystal_class: monoclinic + hall: ' I 2x' + hermann_mauguin: I 2 1 1 + 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'] + number: 5 + schoenflies: C2^3 + universal_h_m: I 2 1 1 + P1m1: + 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 + P11m: + crystal_class: monoclinic + hall: ' P -2' + hermann_mauguin: P 1 1 m + symops: ['x,y,z', 'x,y,-z'] + ncsym: ['x,y,z', 'x,y,-z'] + number: 6 + schoenflies: Cs^1 + universal_h_m: P 1 1 m + Pm11: + crystal_class: monoclinic + hall: ' P -2x' + hermann_mauguin: P m 1 1 + symops: ['x,y,z', '-x,y,z'] + ncsym: ['x,y,z', '-x,y,z'] + number: 6 + schoenflies: Cs^1 + universal_h_m: P m 1 1 + P1c1: + 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 + P1n1: + crystal_class: monoclinic + hall: ' P -2yac' + hermann_mauguin: P 1 n 1 + symops: ['x,y,z', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,-y,z+0.5'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P 1 n 1 + P1a1: + crystal_class: monoclinic + hall: ' P -2ya' + hermann_mauguin: P 1 a 1 + symops: ['x,y,z', 'x+0.5,-y,z'] + ncsym: ['x,y,z', 'x+0.5,-y,z'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P 1 a 1 + P11a: + crystal_class: monoclinic + hall: ' P -2a' + hermann_mauguin: P 1 1 a + symops: ['x,y,z', 'x+0.5,y,-z'] + ncsym: ['x,y,z', 'x+0.5,y,-z'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P 1 1 a + P11n: + crystal_class: monoclinic + hall: ' P -2ab' + hermann_mauguin: P 1 1 n + symops: ['x,y,z', 'x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P 1 1 n + P11b: + crystal_class: monoclinic + hall: ' P -2b' + hermann_mauguin: P 1 1 b + symops: ['x,y,z', 'x,y+0.5,-z'] + ncsym: ['x,y,z', 'x,y+0.5,-z'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P 1 1 b + Pb11: + crystal_class: monoclinic + hall: ' P -2xb' + hermann_mauguin: P b 1 1 + symops: ['x,y,z', '-x,y+0.5,z'] + ncsym: ['x,y,z', '-x,y+0.5,z'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P b 1 1 + Pn11: + crystal_class: monoclinic + hall: ' P -2xbc' + hermann_mauguin: P n 1 1 + symops: ['x,y,z', '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,y+0.5,z+0.5'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P n 1 1 + Pc11: + crystal_class: monoclinic + hall: ' P -2xc' + hermann_mauguin: P c 1 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 c 1 1 + C1m1: + 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 + A1m1: + crystal_class: monoclinic + hall: ' A -2y' + hermann_mauguin: A 1 m 1 + 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'] + number: 8 + schoenflies: Cs^3 + universal_h_m: A 1 m 1 + I1m1: + crystal_class: monoclinic + hall: ' I -2y' + hermann_mauguin: I 1 m 1 + 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'] + number: 8 + schoenflies: Cs^3 + universal_h_m: I 1 m 1 + A11m: + crystal_class: monoclinic + hall: ' A -2' + hermann_mauguin: A 1 1 m + 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'] + number: 8 + schoenflies: Cs^3 + universal_h_m: A 1 1 m + B11m: + crystal_class: monoclinic + hall: ' B -2' + hermann_mauguin: B 1 1 m + symops: ['x,y,z', 'x,y,-z', 'x+0.5,y,z+0.5', 'x+0.5,y,-z+0.5'] + ncsym: ['x,y,z', 'x,y,-z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: B 1 1 m + I11m: + crystal_class: monoclinic + hall: ' I -2' + hermann_mauguin: I 1 1 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'] + ncsym: ['x,y,z', 'x,y,-z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: I 1 1 m + Bm11: + crystal_class: monoclinic + hall: ' B -2x' + hermann_mauguin: B m 1 1 + symops: ['x,y,z', '-x,y,z', 'x+0.5,y,z+0.5', '-x+0.5,y,z+0.5'] + ncsym: ['x,y,z', '-x,y,z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: B m 1 1 + Cm11: + crystal_class: monoclinic + hall: ' C -2x' + hermann_mauguin: C m 1 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 m 1 1 + Im11: + crystal_class: monoclinic + hall: ' I -2x' + hermann_mauguin: I m 1 1 + 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'] + number: 8 + schoenflies: Cs^3 + universal_h_m: I m 1 1 + C1c1: + 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 + A1n1: + crystal_class: monoclinic + hall: ' A -2yab' + hermann_mauguin: A 1 n 1 + symops: ['x,y,z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', 'x+0.5,-y+1,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,-y+0.5,z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: A 1 n 1 + I1a1: + crystal_class: monoclinic + hall: ' I -2ya' + hermann_mauguin: I 1 a 1 + symops: ['x,y,z', 'x+0.5,-y,z', 'x+0.5,y+0.5,z+0.5', 'x+1,-y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,-y,z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: I 1 a 1 + A1a1: + crystal_class: monoclinic + hall: ' A -2ya' + hermann_mauguin: A 1 a 1 + 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'] + ncsym: ['x,y,z', 'x+0.5,-y,z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: A 1 a 1 + C1n1: + crystal_class: monoclinic + hall: ' C -2yac' + hermann_mauguin: C 1 n 1 + symops: ['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'] + ncsym: ['x,y,z', 'x+0.5,-y,z+0.5'] + number: 9 + schoenflies: Cs^4 + universal_h_m: C 1 n 1 + I1c1: + crystal_class: monoclinic + hall: ' I -2yc' + hermann_mauguin: I 1 c 1 + 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+1'] + ncsym: ['x,y,z', 'x,-y,z+0.5'] + number: 9 + schoenflies: Cs^4 + universal_h_m: I 1 c 1 + A11a: + crystal_class: monoclinic + hall: ' A -2a' + hermann_mauguin: A 1 1 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'] + ncsym: ['x,y,z', 'x+0.5,y,-z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: A 1 1 a + B11n: + crystal_class: monoclinic + hall: ' B -2ab' + hermann_mauguin: B 1 1 n + symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x+0.5,y,z+0.5', 'x+1,y+0.5,-z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: B 1 1 n + I11b: + crystal_class: monoclinic + hall: ' I -2b' + hermann_mauguin: I 1 1 b + symops: ['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'] + ncsym: ['x,y,z', 'x,y+0.5,-z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: I 1 1 b + B11b: + crystal_class: monoclinic + hall: ' B -2b' + hermann_mauguin: B 1 1 b + symops: ['x,y,z', 'x,y+0.5,-z', 'x+0.5,y,z+0.5', 'x+0.5,y+0.5,-z+0.5'] + ncsym: ['x,y,z', 'x,y+0.5,-z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: B 1 1 b + A11n: + crystal_class: monoclinic + hall: ' A -2ab' + hermann_mauguin: A 1 1 n + symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,y+0.5,z+0.5', 'x+0.5,y+1,-z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: A 1 1 n + I11a: + crystal_class: monoclinic + hall: ' I -2a' + hermann_mauguin: I 1 1 a + symops: ['x,y,z', 'x+0.5,y,-z', 'x+0.5,y+0.5,z+0.5', 'x+1,y+0.5,-z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y,-z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: I 1 1 a + Bb11: + crystal_class: monoclinic + hall: ' B -2xb' + hermann_mauguin: B b 1 1 + symops: ['x,y,z', '-x,y+0.5,z', 'x+0.5,y,z+0.5', '-x+0.5,y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,y+0.5,z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: B b 1 1 + Cn11: + crystal_class: monoclinic + hall: ' C -2xac' + hermann_mauguin: C n 1 1 + symops: ['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'] + ncsym: ['x,y,z', '-x+0.5,y,z+0.5'] + number: 9 + schoenflies: Cs^4 + universal_h_m: C n 1 1 + Ic11: + crystal_class: monoclinic + hall: ' I -2xc' + hermann_mauguin: I c 1 1 + 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+1'] + ncsym: ['x,y,z', '-x,y,z+0.5'] + number: 9 + schoenflies: Cs^4 + universal_h_m: I c 1 1 + Cc11: + crystal_class: monoclinic + hall: ' C -2xc' + hermann_mauguin: C c 1 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 c 1 1 + Bn11: + crystal_class: monoclinic + hall: ' B -2xab' + hermann_mauguin: B n 1 1 + symops: ['x,y,z', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', '-x+1,y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,y+0.5,z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: B n 1 1 + Ib11: + crystal_class: monoclinic + hall: ' I -2xb' + hermann_mauguin: I b 1 1 + symops: ['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'] + ncsym: ['x,y,z', '-x,y+0.5,z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: I b 1 1 + P12/m1: + 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 + P112/m: + crystal_class: monoclinic + hall: -P 2 + hermann_mauguin: P 1 1 2/m + 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 1 2/m + P2/m11: + crystal_class: monoclinic + hall: -P 2x + hermann_mauguin: P 2/m 1 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 2/m 1 1 + P121/m1: + 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 + P1121/m: + crystal_class: monoclinic + hall: -P 2c + hermann_mauguin: P 1 1 21/m + 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: 11 + schoenflies: C2h^2 + universal_h_m: P 1 1 21/m + P21/m11: + crystal_class: monoclinic + hall: -P 2xa + hermann_mauguin: P 21/m 1 1 + symops: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x-0.5,y,z'] + ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x-0.5,y,z'] + number: 11 + schoenflies: C2h^2 + universal_h_m: P 21/m 1 1 + C12/m1: + 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 + A12/m1: + crystal_class: monoclinic + hall: -A 2y + hermann_mauguin: A 1 2/m 1 + 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: 12 + schoenflies: C2h^3 + universal_h_m: A 1 2/m 1 + I12/m1: + crystal_class: monoclinic + hall: -I 2y + hermann_mauguin: I 1 2/m 1 + 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: 12 + schoenflies: C2h^3 + universal_h_m: I 1 2/m 1 + A112/m: + crystal_class: monoclinic + hall: -A 2 + hermann_mauguin: A 1 1 2/m + 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: 12 + schoenflies: C2h^3 + universal_h_m: A 1 1 2/m + B112/m: + crystal_class: monoclinic + hall: -B 2 + hermann_mauguin: B 1 1 2/m + 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'] + ncsym: ['x,y,z', '-x,-y,z', '-x,-y,-z', 'x,y,-z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: B 1 1 2/m + I112/m: + crystal_class: monoclinic + hall: -I 2 + hermann_mauguin: I 1 1 2/m + 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: 12 + schoenflies: C2h^3 + universal_h_m: I 1 1 2/m + B2/m11: + crystal_class: monoclinic + hall: -B 2x + hermann_mauguin: B 2/m 1 1 + 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'] + ncsym: ['x,y,z', 'x,-y,-z', '-x,-y,-z', '-x,y,z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: B 2/m 1 1 + C2/m11: + crystal_class: monoclinic + hall: -C 2x + hermann_mauguin: C 2/m 1 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 2/m 1 1 + I2/m11: + crystal_class: monoclinic + hall: -I 2x + hermann_mauguin: I 2/m 1 1 + 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: 12 + schoenflies: C2h^3 + universal_h_m: I 2/m 1 1 + P12/c1: + 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 + P12/n1: + crystal_class: monoclinic + hall: -P 2yac + hermann_mauguin: P 1 2/n 1 + 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: 13 + schoenflies: C2h^4 + universal_h_m: P 1 2/n 1 + P12/a1: + crystal_class: monoclinic + hall: -P 2ya + hermann_mauguin: P 1 2/a 1 + symops: ['x,y,z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,-y,z'] + ncsym: ['x,y,z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,-y,z'] + number: 13 + schoenflies: C2h^4 + universal_h_m: P 1 2/a 1 + P112/a: + crystal_class: monoclinic + hall: -P 2a + hermann_mauguin: P 1 1 2/a + symops: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x-0.5,y,-z'] + ncsym: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x-0.5,y,-z'] + number: 13 + schoenflies: C2h^4 + universal_h_m: P 1 1 2/a + P112/n: + crystal_class: monoclinic + hall: -P 2ab + hermann_mauguin: P 1 1 2/n + symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z'] + number: 13 + schoenflies: C2h^4 + universal_h_m: P 1 1 2/n + P112/b: + crystal_class: monoclinic + hall: -P 2b + hermann_mauguin: P 1 1 2/b + 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: 13 + schoenflies: C2h^4 + universal_h_m: P 1 1 2/b + P2/b11: + crystal_class: monoclinic + hall: -P 2xb + hermann_mauguin: P 2/b 1 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: 13 + schoenflies: C2h^4 + universal_h_m: P 2/b 1 1 + P2/n11: + crystal_class: monoclinic + hall: -P 2xbc + hermann_mauguin: P 2/n 1 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: 13 + schoenflies: C2h^4 + universal_h_m: P 2/n 1 1 + P2/c11: + crystal_class: monoclinic + hall: -P 2xc + hermann_mauguin: P 2/c 1 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 2/c 1 1 + P121/c1: + 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 + P121/n1: + crystal_class: monoclinic + hall: -P 2yn + hermann_mauguin: P 1 21/n 1 + symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', 'x-0.5,-y-0.5,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', 'x-0.5,-y-0.5,z-0.5'] + number: 14 + schoenflies: C2h^5 + universal_h_m: P 1 21/n 1 + P121/a1: + crystal_class: monoclinic + hall: -P 2yab + hermann_mauguin: P 1 21/a 1 + symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,-z', 'x-0.5,-y-0.5,z'] + ncsym: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,-z', 'x-0.5,-y-0.5,z'] + number: 14 + schoenflies: C2h^5 + universal_h_m: P 1 21/a 1 + P1121/a: + crystal_class: monoclinic + hall: -P 2ac + hermann_mauguin: P 1 1 21/a + 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: 14 + schoenflies: C2h^5 + universal_h_m: P 1 1 21/a + P1121/n: + crystal_class: monoclinic + hall: -P 2n + hermann_mauguin: P 1 1 21/n + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', '-x,-y,-z', 'x-0.5,y-0.5,-z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', '-x,-y,-z', 'x-0.5,y-0.5,-z-0.5'] + number: 14 + schoenflies: C2h^5 + universal_h_m: P 1 1 21/n + P1121/b: + crystal_class: monoclinic + hall: -P 2bc + hermann_mauguin: P 1 1 21/b + 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 1 21/b + P21/b11: + crystal_class: monoclinic + hall: -P 2xab + hermann_mauguin: P 21/b 1 1 + symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x-0.5,y-0.5,z'] + ncsym: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x-0.5,y-0.5,z'] + number: 14 + schoenflies: C2h^5 + universal_h_m: P 21/b 1 1 + P21/n11: + crystal_class: monoclinic + hall: -P 2xn + hermann_mauguin: P 21/n 1 1 + symops: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z', '-x-0.5,y-0.5,z-0.5'] + ncsym: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z', '-x-0.5,y-0.5,z-0.5'] + number: 14 + schoenflies: C2h^5 + universal_h_m: P 21/n 1 1 + P21/c11: + crystal_class: monoclinic + hall: -P 2xac + hermann_mauguin: P 21/c 1 1 + 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: 14 + schoenflies: C2h^5 + universal_h_m: P 21/c 1 1 + C12/c1: + 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 + A12/n1: + crystal_class: monoclinic + hall: -A 2yab + hermann_mauguin: A 1 2/n 1 + symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,-z', 'x-0.5,-y-0.5,z', 'x,y+0.5,z+0.5', + '-x+0.5,y+1,-z+0.5', '-x,-y+0.5,-z+0.5', 'x-0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,-z', 'x-0.5,-y-0.5,z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: A 1 2/n 1 + I12/a1: + crystal_class: monoclinic + hall: -I 2ya + hermann_mauguin: I 1 2/a 1 + symops: ['x,y,z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,-y,z', 'x+0.5,y+0.5,z+0.5', + '-x+1,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x,-y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,-y,z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: I 1 2/a 1 + A12/a1: + crystal_class: monoclinic + hall: -A 2ya + hermann_mauguin: A 1 2/a 1 + symops: ['x,y,z', '-x+0.5,y,-z', '-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+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,-z', 'x-0.5,-y,z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: A 1 2/a 1 + C12/n1: + crystal_class: monoclinic + hall: -C 2yac + hermann_mauguin: C 1 2/n 1 + symops: ['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,-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'] + number: 15 + schoenflies: C2h^6 + universal_h_m: C 1 2/n 1 + I12/c1: + crystal_class: monoclinic + hall: -I 2yc + hermann_mauguin: I 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+0.5', + '-x+0.5,y+0.5,-z+1', '-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,-y,-z', 'x,-y,z-0.5'] + number: 15 + schoenflies: C2h^6 + universal_h_m: I 1 2/c 1 + A112/a: + crystal_class: monoclinic + hall: -A 2a + hermann_mauguin: A 1 1 2/a + symops: ['x,y,z', '-x+0.5,-y,z', '-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+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,-z', 'x-0.5,y,-z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: A 1 1 2/a + B112/n: + crystal_class: monoclinic + hall: -B 2ab + hermann_mauguin: B 1 1 2/n + symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z', 'x+0.5,y,z+0.5', + '-x+1,-y+0.5,z+0.5', '-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,-y,-z', 'x-0.5,y-0.5,-z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: B 1 1 2/n + I112/b: + crystal_class: monoclinic + hall: -I 2b + hermann_mauguin: I 1 1 2/b + symops: ['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,-z+0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z', '-x,-y,-z', 'x,y-0.5,-z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: I 1 1 2/b + B112/b: + crystal_class: monoclinic + hall: -B 2b + hermann_mauguin: B 1 1 2/b + symops: ['x,y,z', '-x,-y+0.5,z', '-x,-y,-z', 'x,y-0.5,-z', 'x+0.5,y,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'] + ncsym: ['x,y,z', '-x,-y+0.5,z', '-x,-y,-z', 'x,y-0.5,-z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: B 1 1 2/b + A112/n: + crystal_class: monoclinic + hall: -A 2ab + hermann_mauguin: A 1 1 2/n + symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z', 'x,y+0.5,z+0.5', + '-x+0.5,-y+1,z+0.5', '-x,-y+0.5,-z+0.5', 'x-0.5,y,-z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: A 1 1 2/n + I112/a: + crystal_class: monoclinic + hall: -I 2a + hermann_mauguin: I 1 1 2/a + symops: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x-0.5,y,-z', 'x+0.5,y+0.5,z+0.5', + '-x+1,-y+0.5,z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x,y+0.5,-z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x-0.5,y,-z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: I 1 1 2/a + B2/b11: + crystal_class: monoclinic + hall: -B 2xb + hermann_mauguin: B 2/b 1 1 + symops: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y-0.5,z', 'x+0.5,y,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'] + ncsym: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y-0.5,z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: B 2/b 1 1 + C2/n11: + crystal_class: monoclinic + hall: -C 2xac + hermann_mauguin: C 2/n 1 1 + symops: ['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,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'] + number: 15 + schoenflies: C2h^6 + universal_h_m: C 2/n 1 1 + I2/c11: + crystal_class: monoclinic + hall: -I 2xc + hermann_mauguin: I 2/c 1 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+0.5', + 'x+0.5,-y+0.5,-z+1', '-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,-y,-z', '-x,y,z-0.5'] + number: 15 + schoenflies: C2h^6 + universal_h_m: I 2/c 1 1 + C2/c11: + crystal_class: monoclinic + hall: -C 2xc + hermann_mauguin: C 2/c 1 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 2/c 1 1 + B2/n11: + crystal_class: monoclinic + hall: -B 2xab + hermann_mauguin: B 2/n 1 1 + symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x-0.5,y-0.5,z', 'x+0.5,y,z+0.5', + 'x+1,-y+0.5,-z+0.5', '-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,-y,-z', '-x-0.5,y-0.5,z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: B 2/n 1 1 + I2/b11: + crystal_class: monoclinic + hall: -I 2xb + hermann_mauguin: I 2/b 1 1 + symops: ['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,z+0.5'] + ncsym: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y-0.5,z'] + number: 15 + schoenflies: C2h^6 + universal_h_m: I 2/b 1 1 + 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: + 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 + P2122: + crystal_class: orthorhombic + hall: ' P 2a 2a' + hermann_mauguin: P 21 2 2 + symops: ['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'] + number: 17 + schoenflies: D2^2 + universal_h_m: P 21 2 2 + P2212: + crystal_class: orthorhombic + hall: ' P 2 2b' + hermann_mauguin: P 2 21 2 + symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z'] + ncsym: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z'] + number: 17 + schoenflies: D2^2 + universal_h_m: P 2 21 2 + 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 + P22121: + crystal_class: orthorhombic + hall: ' P 2bc 2' + hermann_mauguin: P 2 21 21 + 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: 18 + schoenflies: D2^3 + universal_h_m: P 2 21 21 + P21221: + crystal_class: orthorhombic + hall: ' P 2ac 2ac' + hermann_mauguin: P 21 2 21 + symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z'] + number: 18 + schoenflies: D2^3 + universal_h_m: P 21 2 21 + 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: + 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 + A2122: + crystal_class: orthorhombic + hall: ' A 2a 2a' + hermann_mauguin: A 21 2 2 + symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,-z', '-x,y,-z', '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', '-x,y+0.5,-z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,-z', '-x,y,-z'] + number: 20 + schoenflies: D2^5 + universal_h_m: A 21 2 2 + B2212: + crystal_class: orthorhombic + hall: ' B 2 2b' + hermann_mauguin: B 2 21 2 + symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', 'x+0.5,y,z+0.5', '-x+0.5,-y,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+0.5,-z', '-x,y+0.5,-z'] + number: 20 + schoenflies: D2^5 + universal_h_m: B 2 21 2 + 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 + A222: + crystal_class: orthorhombic + hall: ' A 2 2' + hermann_mauguin: A 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'] + ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z'] + number: 21 + schoenflies: D2^6 + universal_h_m: A 2 2 2 + B222: + crystal_class: orthorhombic + hall: ' B 2 2' + hermann_mauguin: B 2 2 2 + 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'] + ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z'] + number: 21 + schoenflies: D2^6 + universal_h_m: B 2 2 2 + 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: + 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: + 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: + 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 + P2mm: + crystal_class: orthorhombic + hall: ' P -2 2' + hermann_mauguin: P 2 m m + 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 2 m m + Pm2m: + crystal_class: orthorhombic + hall: ' P -2 -2' + hermann_mauguin: P m 2 m + 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 2 m + 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 + Pcm21: + crystal_class: orthorhombic + hall: ' P 2c -2c' + hermann_mauguin: P c m 21 + symops: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] + number: 26 + schoenflies: C2v^2 + universal_h_m: P c m 21 + P21ma: + crystal_class: orthorhombic + hall: ' P -2a 2a' + hermann_mauguin: P 21 m a + symops: ['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'] + number: 26 + schoenflies: C2v^2 + universal_h_m: P 21 m a + P21am: + crystal_class: orthorhombic + hall: ' P -2 2a' + hermann_mauguin: P 21 a m + 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: 26 + schoenflies: C2v^2 + universal_h_m: P 21 a m + Pb21m: + crystal_class: orthorhombic + hall: ' P -2 -2b' + hermann_mauguin: P b 21 m + symops: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] + ncsym: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] + number: 26 + schoenflies: C2v^2 + universal_h_m: P b 21 m + Pm21b: + crystal_class: orthorhombic + hall: ' P -2b -2' + hermann_mauguin: P m 21 b + 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: 26 + schoenflies: C2v^2 + universal_h_m: P m 21 b + 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 + P2aa: + crystal_class: orthorhombic + hall: ' P -2a 2' + hermann_mauguin: P 2 a a + symops: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] + ncsym: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] + number: 27 + schoenflies: C2v^3 + universal_h_m: P 2 a a + Pb2b: + crystal_class: orthorhombic + hall: ' P -2b -2b' + hermann_mauguin: P b 2 b + symops: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] + ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] + number: 27 + schoenflies: C2v^3 + universal_h_m: P b 2 b + 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 + Pbm2: + crystal_class: orthorhombic + hall: ' P 2 -2b' + hermann_mauguin: P b m 2 + symops: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z'] + ncsym: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z'] + number: 28 + schoenflies: C2v^4 + universal_h_m: P b m 2 + P2mb: + crystal_class: orthorhombic + hall: ' P -2b 2' + hermann_mauguin: P 2 m b + 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: 28 + schoenflies: C2v^4 + universal_h_m: P 2 m b + P2cm: + crystal_class: orthorhombic + hall: ' P -2c 2' + hermann_mauguin: P 2 c m + 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: 28 + schoenflies: C2v^4 + universal_h_m: P 2 c m + Pc2m: + crystal_class: orthorhombic + hall: ' P -2c -2c' + hermann_mauguin: P c 2 m + symops: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] + ncsym: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] + number: 28 + schoenflies: C2v^4 + universal_h_m: P c 2 m + Pm2a: + crystal_class: orthorhombic + hall: ' P -2a -2a' + hermann_mauguin: P m 2 a + symops: ['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'] + number: 28 + schoenflies: C2v^4 + universal_h_m: P m 2 a + 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 + Pbc21: + crystal_class: orthorhombic + hall: ' P 2c -2b' + hermann_mauguin: P b c 21 + symops: ['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'] + number: 29 + schoenflies: C2v^5 + universal_h_m: P b c 21 + P21ab: + crystal_class: orthorhombic + hall: ' P -2b 2a' + hermann_mauguin: P 21 a b + symops: ['x,y,z', 'x,y+0.5,-z', 'x+0.5,-y,-z', 'x+0.5,-y+0.5,z'] + ncsym: ['x,y,z', 'x,y+0.5,-z', 'x+0.5,-y,-z', 'x+0.5,-y+0.5,z'] + number: 29 + schoenflies: C2v^5 + universal_h_m: P 21 a b + P21ca: + crystal_class: orthorhombic + hall: ' P -2ac 2a' + hermann_mauguin: P 21 c a + symops: ['x,y,z', 'x+0.5,y,-z+0.5', 'x+0.5,-y,-z', 'x,-y,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y,-z+0.5', 'x+0.5,-y,-z', 'x,-y,z+0.5'] + number: 29 + schoenflies: C2v^5 + universal_h_m: P 21 c a + Pc21b: + crystal_class: orthorhombic + hall: ' P -2bc -2c' + hermann_mauguin: P c 21 b + symops: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] + ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] + number: 29 + schoenflies: C2v^5 + universal_h_m: P c 21 b + Pb21a: + crystal_class: orthorhombic + hall: ' P -2a -2ab' + hermann_mauguin: P b 21 a + symops: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y+0.5,z', '-x,y+0.5,-z'] + ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y+0.5,z', '-x,y+0.5,-z'] + number: 29 + schoenflies: C2v^5 + universal_h_m: P b 21 a + 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 + Pcn2: + crystal_class: orthorhombic + hall: ' P 2 -2ac' + hermann_mauguin: P c n 2 + symops: ['x,y,z', '-x,-y,z', '-x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5'] + number: 30 + schoenflies: C2v^6 + universal_h_m: P c n 2 + P2na: + crystal_class: orthorhombic + hall: ' P -2ac 2' + hermann_mauguin: P 2 n a + 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: 30 + schoenflies: C2v^6 + universal_h_m: P 2 n a + P2an: + crystal_class: orthorhombic + hall: ' P -2ab 2' + hermann_mauguin: P 2 a n + symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,-y,-z', 'x+0.5,-y+0.5,z'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,-y,-z', 'x+0.5,-y+0.5,z'] + number: 30 + schoenflies: C2v^6 + universal_h_m: P 2 a n + Pb2n: + crystal_class: orthorhombic + hall: ' P -2ab -2ab' + hermann_mauguin: P b 2 n + symops: ['x,y,z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', '-x,y,-z'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', '-x,y,-z'] + number: 30 + schoenflies: C2v^6 + universal_h_m: P b 2 n + Pn2b: + crystal_class: orthorhombic + hall: ' P -2bc -2bc' + hermann_mauguin: P n 2 b + symops: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', '-x,y,-z'] + ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', '-x,y,-z'] + number: 30 + schoenflies: C2v^6 + universal_h_m: P n 2 b + 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 + Pnm21: + crystal_class: orthorhombic + hall: ' P 2bc -2bc' + hermann_mauguin: P n m 21 + symops: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] + number: 31 + schoenflies: C2v^7 + universal_h_m: P n m 21 + P21mn: + crystal_class: orthorhombic + hall: ' P -2ab 2ab' + hermann_mauguin: P 21 m n + symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x+0.5,-y+0.5,-z', 'x,-y,z'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', 'x+0.5,-y+0.5,-z', 'x,-y,z'] + number: 31 + schoenflies: C2v^7 + universal_h_m: P 21 m n + P21nm: + crystal_class: orthorhombic + hall: ' P -2 2ac' + hermann_mauguin: P 21 n m + symops: ['x,y,z', 'x,y,-z', 'x+0.5,-y,-z+0.5', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', 'x,y,-z', 'x+0.5,-y,-z+0.5', 'x+0.5,-y,z+0.5'] + number: 31 + schoenflies: C2v^7 + universal_h_m: P 21 n m + Pn21m: + crystal_class: orthorhombic + hall: ' P -2 -2bc' + hermann_mauguin: P n 21 m + 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: 31 + schoenflies: C2v^7 + universal_h_m: P n 21 m + Pm21n: + crystal_class: orthorhombic + hall: ' P -2ab -2' + hermann_mauguin: P m 21 n + symops: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] + number: 31 + schoenflies: C2v^7 + universal_h_m: P m 21 n + 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 + P2cb: + crystal_class: orthorhombic + hall: ' P -2bc 2' + hermann_mauguin: P 2 c b + 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: 32 + schoenflies: C2v^8 + universal_h_m: P 2 c b + Pc2a: + crystal_class: orthorhombic + hall: ' P -2ac -2ac' + hermann_mauguin: P c 2 a + symops: ['x,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', '-x,y,-z'] + ncsym: ['x,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', '-x,y,-z'] + number: 32 + schoenflies: C2v^8 + universal_h_m: P c 2 a + 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 + Pbn21: + crystal_class: orthorhombic + hall: ' P 2c -2ab' + hermann_mauguin: P b n 21 + 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', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z+0.5'] + number: 33 + schoenflies: C2v^9 + universal_h_m: P b n 21 + P21nb: + crystal_class: orthorhombic + hall: ' P -2bc 2a' + hermann_mauguin: P 21 n b + symops: ['x,y,z', 'x,y+0.5,-z+0.5', 'x+0.5,-y,-z', 'x+0.5,-y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', 'x+0.5,-y,-z', 'x+0.5,-y+0.5,z+0.5'] + number: 33 + schoenflies: C2v^9 + universal_h_m: P 21 n b + P21cn: + crystal_class: orthorhombic + hall: ' P -2n 2a' + hermann_mauguin: P 21 c n + symops: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', 'x+0.5,-y,-z', 'x,-y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', 'x+0.5,-y,-z', 'x,-y+0.5,z+0.5'] + number: 33 + schoenflies: C2v^9 + universal_h_m: P 21 c n + Pc21n: + crystal_class: orthorhombic + hall: ' P -2n -2ac' + hermann_mauguin: P c 21 n + symops: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y,z+0.5', '-x,y+0.5,-z'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y,z+0.5', '-x,y+0.5,-z'] + number: 33 + schoenflies: C2v^9 + universal_h_m: P c 21 n + Pn21a: + crystal_class: orthorhombic + hall: ' P -2ac -2n' + hermann_mauguin: P n 21 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'] + 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'] + number: 33 + schoenflies: C2v^9 + universal_h_m: P n 21 a + 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 + P2nn: + crystal_class: orthorhombic + hall: ' P -2n 2' + hermann_mauguin: P 2 n n + symops: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', 'x,-y,-z', 'x+0.5,-y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', 'x,-y,-z', 'x+0.5,-y+0.5,z+0.5'] + number: 34 + schoenflies: C2v^10 + universal_h_m: P 2 n n + Pn2n: + crystal_class: orthorhombic + hall: ' P -2n -2n' + hermann_mauguin: P n 2 n + symops: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-x,y,-z'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-x,y,-z'] + number: 34 + schoenflies: C2v^10 + universal_h_m: P n 2 n + 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 + A2mm: + crystal_class: orthorhombic + hall: ' A -2 2' + hermann_mauguin: A 2 m m + 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: 35 + schoenflies: C2v^11 + universal_h_m: A 2 m m + Bm2m: + crystal_class: orthorhombic + hall: ' B -2 -2' + hermann_mauguin: B m 2 m + 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'] + ncsym: ['x,y,z', 'x,y,-z', '-x,y,z', '-x,y,-z'] + number: 35 + schoenflies: C2v^11 + universal_h_m: B m 2 m + 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 + Ccm21: + crystal_class: orthorhombic + hall: ' C 2c -2c' + hermann_mauguin: C c m 21 + symops: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,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'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] + number: 36 + schoenflies: C2v^12 + universal_h_m: C c m 21 + A21ma: + crystal_class: orthorhombic + hall: ' A -2a 2a' + hermann_mauguin: A 21 m a + symops: ['x,y,z', 'x+0.5,y,-z', 'x+0.5,-y,-z', 'x,-y,z', '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', 'x,-y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y,-z', 'x+0.5,-y,-z', 'x,-y,z'] + number: 36 + schoenflies: C2v^12 + universal_h_m: A 21 m a + A21am: + crystal_class: orthorhombic + hall: ' A -2 2a' + hermann_mauguin: A 21 a m + 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: 36 + schoenflies: C2v^12 + universal_h_m: A 21 a m + Bb21m: + crystal_class: orthorhombic + hall: ' B -2 -2b' + hermann_mauguin: B b 21 m + symops: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z', 'x+0.5,y,z+0.5', 'x+0.5,y,-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+0.5,z', '-x,y+0.5,-z'] + number: 36 + schoenflies: C2v^12 + universal_h_m: B b 21 m + Bm21b: + crystal_class: orthorhombic + hall: ' B -2b -2' + hermann_mauguin: B m 21 b + symops: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z', 'x+0.5,y,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'] + ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] + number: 36 + schoenflies: C2v^12 + universal_h_m: B m 21 b + 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 + A2aa: + crystal_class: orthorhombic + hall: ' A -2a 2' + hermann_mauguin: A 2 a a + symops: ['x,y,z', 'x+0.5,y,-z', '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+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,-z', 'x+0.5,-y,z'] + number: 37 + schoenflies: C2v^13 + universal_h_m: A 2 a a + Bb2b: + crystal_class: orthorhombic + hall: ' B -2b -2b' + hermann_mauguin: B b 2 b + symops: ['x,y,z', 'x,y+0.5,-z', '-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+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+0.5,z', '-x,y,-z'] + number: 37 + schoenflies: C2v^13 + universal_h_m: B b 2 b + 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 + Bmm2: + crystal_class: orthorhombic + hall: ' B 2 -2' + hermann_mauguin: B m m 2 + 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'] + ncsym: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z'] + number: 38 + schoenflies: C2v^14 + universal_h_m: B m m 2 + B2mm: + crystal_class: orthorhombic + hall: ' B -2 2' + hermann_mauguin: B 2 m m + 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'] + ncsym: ['x,y,z', 'x,y,-z', 'x,-y,-z', 'x,-y,z'] + number: 38 + schoenflies: C2v^14 + universal_h_m: B 2 m m + C2mm: + crystal_class: orthorhombic + hall: ' C -2 2' + hermann_mauguin: C 2 m m + 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: 38 + schoenflies: C2v^14 + universal_h_m: C 2 m m + Cm2m: + crystal_class: orthorhombic + hall: ' C -2 -2' + hermann_mauguin: C m 2 m + 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: 38 + schoenflies: C2v^14 + universal_h_m: C m 2 m + Am2m: + crystal_class: orthorhombic + hall: ' A -2 -2' + hermann_mauguin: A m 2 m + 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 2 m + Aem2: + 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 + Bme2: + crystal_class: orthorhombic + hall: ' B 2 -2a' + hermann_mauguin: B m e 2 + symops: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z', 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', + '-x+1,y,z+0.5', 'x+1,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z'] + number: 39 + schoenflies: C2v^15 + universal_h_m: B m e 2 + B2em: + crystal_class: orthorhombic + hall: ' B -2a 2' + hermann_mauguin: B 2 e m + symops: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z', 'x+0.5,y,z+0.5', 'x+1,y,-z+0.5', + 'x+0.5,-y,-z+0.5', 'x+1,-y,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] + number: 39 + schoenflies: C2v^15 + universal_h_m: B 2 e m + C2me: + crystal_class: orthorhombic + hall: ' C -2a 2' + hermann_mauguin: C 2 m e + symops: ['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'] + ncsym: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] + number: 39 + schoenflies: C2v^15 + universal_h_m: C 2 m e + Cm2e: + crystal_class: orthorhombic + hall: ' C -2a -2a' + hermann_mauguin: C m 2 e + symops: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z', 'x+0.5,y+0.5,z', 'x+1,y+0.5,-z', + '-x+1,y+0.5,z', '-x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z'] + number: 39 + schoenflies: C2v^15 + universal_h_m: C m 2 e + Ae2m: + crystal_class: orthorhombic + hall: ' A -2b -2b' + hermann_mauguin: A e 2 m + symops: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z', 'x,y+0.5,z+0.5', 'x,y+1,-z+0.5', + '-x,y+1,z+0.5', '-x,y+0.5,-z+0.5'] + ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] + number: 39 + schoenflies: C2v^15 + universal_h_m: A e 2 m + 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 + Bbm2: + crystal_class: orthorhombic + hall: ' B 2 -2b' + hermann_mauguin: B b m 2 + symops: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z', 'x+0.5,y,z+0.5', '-x+0.5,-y,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+0.5,z', 'x,-y+0.5,z'] + number: 40 + schoenflies: C2v^16 + universal_h_m: B b m 2 + B2mb: + crystal_class: orthorhombic + hall: ' B -2b 2' + hermann_mauguin: B 2 m b + symops: ['x,y,z', 'x,y+0.5,-z', 'x,-y,-z', 'x,-y+0.5,z', 'x+0.5,y,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'] + ncsym: ['x,y,z', 'x,y+0.5,-z', 'x,-y,-z', 'x,-y+0.5,z'] + number: 40 + schoenflies: C2v^16 + universal_h_m: B 2 m b + C2cm: + crystal_class: orthorhombic + hall: ' C -2c 2' + hermann_mauguin: C 2 c m + 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: 40 + schoenflies: C2v^16 + universal_h_m: C 2 c m + Cc2m: + crystal_class: orthorhombic + hall: ' C -2c -2c' + hermann_mauguin: C c 2 m + symops: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-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'] + ncsym: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] + number: 40 + schoenflies: C2v^16 + universal_h_m: C c 2 m + Am2a: + crystal_class: orthorhombic + hall: ' A -2a -2a' + hermann_mauguin: A m 2 a + symops: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z', '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', '-x,y+0.5,-z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z'] + number: 40 + schoenflies: C2v^16 + universal_h_m: A m 2 a + Aea2: + 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 + Bbe2: + crystal_class: orthorhombic + hall: ' B 2 -2ab' + hermann_mauguin: B b e 2 + 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,z+0.5', + '-x+0.5,-y,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+0.5,z', 'x+0.5,-y+0.5,z'] + number: 41 + schoenflies: C2v^17 + universal_h_m: B b e 2 + B2eb: + crystal_class: orthorhombic + hall: ' B -2ab 2' + hermann_mauguin: B 2 e b + symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,-y,-z', 'x+0.5,-y+0.5,z', 'x+0.5,y,z+0.5', + 'x+1,y+0.5,-z+0.5', 'x+0.5,-y,-z+0.5', 'x+1,-y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,-y,-z', 'x+0.5,-y+0.5,z'] + number: 41 + schoenflies: C2v^17 + universal_h_m: B 2 e b + C2eb: + crystal_class: orthorhombic + hall: ' C -2ac 2' + hermann_mauguin: C 2 e b + symops: ['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'] + ncsym: ['x,y,z', 'x+0.5,y,-z+0.5', 'x,-y,-z', 'x+0.5,-y,z+0.5'] + number: 41 + schoenflies: C2v^17 + universal_h_m: C 2 e b + Cc2e: + crystal_class: orthorhombic + hall: ' C -2ac -2ac' + hermann_mauguin: C c 2 e + symops: ['x,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', '-x,y,-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+0.5,y+0.5,-z'] + ncsym: ['x,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', '-x,y,-z'] + number: 41 + schoenflies: C2v^17 + universal_h_m: C c 2 e + Ae2a: + crystal_class: orthorhombic + hall: ' A -2ab -2ab' + hermann_mauguin: A e 2 a + symops: ['x,y,z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', '-x,y,-z', 'x,y+0.5,z+0.5', + 'x+0.5,y+1,-z+0.5', '-x+0.5,y+1,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+0.5,z', '-x,y,-z'] + number: 41 + schoenflies: C2v^17 + universal_h_m: A e 2 a + 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 + F2mm: + crystal_class: orthorhombic + hall: ' F -2 2' + hermann_mauguin: F 2 m m + 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 2 m m + Fm2m: + crystal_class: orthorhombic + hall: ' F -2 -2' + hermann_mauguin: F m 2 m + 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 2 m + 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 + F2dd: + crystal_class: orthorhombic + hall: ' F -2d 2' + hermann_mauguin: F 2 d d + symops: ['x,y,z', 'x+0.25,y+0.25,-z+0.25', 'x,-y,-z', 'x+0.25,-y+0.25,z+0.25', + 'x,y+0.5,z+0.5', 'x+0.25,y+0.75,-z+0.75', 'x,-y+0.5,-z+0.5', 'x+0.25,-y+0.75,z+0.75', + 'x+0.5,y,z+0.5', 'x+0.75,y+0.25,-z+0.75', 'x+0.5,-y,-z+0.5', 'x+0.75,-y+0.25,z+0.75', + 'x+0.5,y+0.5,z', 'x+0.75,y+0.75,-z+0.25', 'x+0.5,-y+0.5,-z', 'x+0.75,-y+0.75,z+0.25'] + ncsym: ['x,y,z', 'x+0.25,y+0.25,-z+0.25', 'x,-y,-z', 'x+0.25,-y+0.25,z+0.25'] + number: 43 + schoenflies: C2v^19 + universal_h_m: F 2 d d + Fd2d: + crystal_class: orthorhombic + hall: ' F -2d -2d' + hermann_mauguin: F d 2 d + symops: ['x,y,z', 'x+0.25,y+0.25,-z+0.25', '-x+0.25,y+0.25,z+0.25', '-x+0.5,y+0.5,-z', + '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.5,y+1,-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+1,y+0.5,-z+0.5', + '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+1,y+1,-z'] + ncsym: ['x,y,z', 'x+0.25,y+0.25,-z+0.25', '-x+0.25,y+0.25,z+0.25', '-x+0.5,y+0.5,-z'] + number: 43 + schoenflies: C2v^19 + universal_h_m: F d 2 d + 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 + I2mm: + crystal_class: orthorhombic + hall: ' I -2 2' + hermann_mauguin: I 2 m m + 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 2 m m + Im2m: + crystal_class: orthorhombic + hall: ' I -2 -2' + hermann_mauguin: I m 2 m + 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 2 m + 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 + I2cb: + crystal_class: orthorhombic + hall: ' I -2a 2' + hermann_mauguin: I 2 c b + symops: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z', 'x+0.5,y+0.5,z+0.5', + 'x+1,y+0.5,-z+0.5', 'x+0.5,-y+0.5,-z+0.5', 'x+1,-y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] + number: 45 + schoenflies: C2v^21 + universal_h_m: I 2 c b + Ic2a: + crystal_class: orthorhombic + hall: ' I -2b -2b' + hermann_mauguin: I c 2 a + symops: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z', 'x+0.5,y+0.5,z+0.5', + 'x+0.5,y+1,-z+0.5', '-x+0.5,y+1,z+0.5', '-x+0.5,y+0.5,-z+0.5'] + ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] + number: 45 + schoenflies: C2v^21 + universal_h_m: I c 2 a + 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 + Ibm2: + crystal_class: orthorhombic + hall: ' I 2 -2b' + hermann_mauguin: I b m 2 + symops: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-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+1,z+0.5', 'x+0.5,-y+1,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z'] + number: 46 + schoenflies: C2v^22 + universal_h_m: I b m 2 + I2mb: + crystal_class: orthorhombic + hall: ' I -2b 2' + hermann_mauguin: I 2 m b + symops: ['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'] + ncsym: ['x,y,z', 'x,y+0.5,-z', 'x,-y,-z', 'x,-y+0.5,z'] + number: 46 + schoenflies: C2v^22 + universal_h_m: I 2 m b + I2cm: + crystal_class: orthorhombic + hall: ' I -2c 2' + hermann_mauguin: I 2 c m + symops: ['x,y,z', 'x,y,-z+0.5', 'x,-y,-z', 'x,-y,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+0.5', 'x+0.5,-y+0.5,z+1'] + ncsym: ['x,y,z', 'x,y,-z+0.5', 'x,-y,-z', 'x,-y,z+0.5'] + number: 46 + schoenflies: C2v^22 + universal_h_m: I 2 c m + Ic2m: + crystal_class: orthorhombic + hall: ' I -2c -2c' + hermann_mauguin: I c 2 m + symops: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z', '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'] + ncsym: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] + number: 46 + schoenflies: C2v^22 + universal_h_m: I c 2 m + Im2a: + crystal_class: orthorhombic + hall: ' I -2a -2a' + hermann_mauguin: I m 2 a + symops: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z', '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', '-x+0.5,y+0.5,-z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z'] + number: 46 + schoenflies: C2v^22 + universal_h_m: I m 2 a + 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:1: + 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 + Pnnn:2: + crystal_class: orthorhombic + hall: -P 2ab 2bc + hermann_mauguin: P n n n + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y-0.5,z-0.5', 'x-0.5,-y,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y-0.5,z-0.5', 'x-0.5,-y,z-0.5'] + number: 48 + schoenflies: D2h^2 + universal_h_m: P n n n :2 + 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 + Pmaa: + crystal_class: orthorhombic + hall: -P 2a 2 + hermann_mauguin: P m a 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'] + 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: 49 + schoenflies: D2h^3 + universal_h_m: P m a a + Pbmb: + crystal_class: orthorhombic + hall: -P 2b 2b + hermann_mauguin: P b m b + symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', + '-x,y-0.5,z', 'x,-y,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', + '-x,y-0.5,z', 'x,-y,z'] + number: 49 + schoenflies: D2h^3 + universal_h_m: P b m b + Pban:1: + 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 + Pban:2: + crystal_class: orthorhombic + hall: -P 2ab 2b + hermann_mauguin: P b a n + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z'] + number: 50 + schoenflies: D2h^4 + universal_h_m: P b a n :2 + Pncb:1: + crystal_class: orthorhombic + hall: ' P 2 2 -1bc' + hermann_mauguin: P n c b + 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', '-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'] + number: 50 + schoenflies: D2h^4 + universal_h_m: P n c b :1 + Pncb:2: + crystal_class: orthorhombic + hall: -P 2b 2bc + hermann_mauguin: P n c b + symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z', '-x,y-0.5,z-0.5', 'x,-y,z-0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z', '-x,y-0.5,z-0.5', 'x,-y,z-0.5'] + number: 50 + schoenflies: D2h^4 + universal_h_m: P n c b :2 + Pcna:1: + crystal_class: orthorhombic + hall: ' P 2 2 -1ac' + hermann_mauguin: P c n a + 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'] + 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: 50 + schoenflies: D2h^4 + universal_h_m: P c n a :1 + Pcna:2: + crystal_class: orthorhombic + hall: -P 2a 2c + hermann_mauguin: P c n a + symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y,z-0.5', 'x-0.5,-y,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y,z-0.5', 'x-0.5,-y,z-0.5'] + number: 50 + schoenflies: D2h^4 + universal_h_m: P c n a :2 + 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 + Pmmb: + crystal_class: orthorhombic + hall: -P 2b 2 + hermann_mauguin: P m m b + 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'] + 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: 51 + schoenflies: D2h^5 + universal_h_m: P m m b + Pbmm: + crystal_class: orthorhombic + hall: -P 2 2b + hermann_mauguin: P b m m + symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', + '-x,y-0.5,z', 'x,-y-0.5,z'] + ncsym: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', + '-x,y-0.5,z', 'x,-y-0.5,z'] + number: 51 + schoenflies: D2h^5 + universal_h_m: P b m m + Pcmm: + crystal_class: orthorhombic + hall: -P 2c 2c + hermann_mauguin: P c m m + symops: ['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,-y,z'] + ncsym: ['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,-y,z'] + number: 51 + schoenflies: D2h^5 + universal_h_m: P c m m + Pmcm: + crystal_class: orthorhombic + hall: -P 2c 2 + hermann_mauguin: P 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'] + 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: 51 + schoenflies: D2h^5 + universal_h_m: P m c m + Pmam: + crystal_class: orthorhombic + hall: -P 2 2a + hermann_mauguin: P m a m + symops: ['x,y,z', '-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'] + ncsym: ['x,y,z', '-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'] + number: 51 + schoenflies: D2h^5 + universal_h_m: P m a m + 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 + Pnnb: + crystal_class: orthorhombic + hall: -P 2b 2n + hermann_mauguin: P n n b + symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z', '-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+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z', '-x-0.5,y-0.5,z-0.5', 'x-0.5,-y,z-0.5'] + number: 52 + schoenflies: D2h^6 + universal_h_m: P n n b + Pbnn: + crystal_class: orthorhombic + hall: -P 2n 2b + hermann_mauguin: P b n n + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x,y-0.5,z', 'x-0.5,-y,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x,y-0.5,z', 'x-0.5,-y,z-0.5'] + number: 52 + schoenflies: D2h^6 + universal_h_m: P b n n + Pcnn: + crystal_class: orthorhombic + hall: -P 2ab 2c + hermann_mauguin: P c n n + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y,z-0.5', 'x-0.5,-y-0.5,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y,z-0.5', 'x-0.5,-y-0.5,z-0.5'] + number: 52 + schoenflies: D2h^6 + universal_h_m: P c n n + Pncn: + crystal_class: orthorhombic + hall: -P 2ab 2n + hermann_mauguin: P n c n + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x-0.5,y-0.5,z-0.5', 'x,-y,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x-0.5,y-0.5,z-0.5', 'x,-y,z-0.5'] + number: 52 + schoenflies: D2h^6 + universal_h_m: P n c n + Pnan: + crystal_class: orthorhombic + hall: -P 2n 2bc + hermann_mauguin: P n a n + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x,y-0.5,z-0.5', 'x-0.5,-y,z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x,y-0.5,z-0.5', 'x-0.5,-y,z'] + number: 52 + schoenflies: D2h^6 + universal_h_m: P n a n + 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 + Pnmb: + crystal_class: orthorhombic + hall: -P 2bc 2bc + hermann_mauguin: P n m b + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y,-z', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x,y-0.5,z-0.5', 'x,-y,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y,-z', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x,y-0.5,z-0.5', 'x,-y,z'] + number: 53 + schoenflies: D2h^7 + universal_h_m: P n m b + Pbmn: + crystal_class: orthorhombic + hall: -P 2ab 2ab + hermann_mauguin: P b m n + symops: ['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', 'x,-y,z'] + ncsym: ['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', 'x,-y,z'] + number: 53 + schoenflies: D2h^7 + universal_h_m: P b m n + Pcnm: + crystal_class: orthorhombic + hall: -P 2 2ac + hermann_mauguin: P c n m + symops: ['x,y,z', '-x,-y,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x,y,-z', '-x-0.5,y,z-0.5', 'x-0.5,-y,z-0.5'] + ncsym: ['x,y,z', '-x,-y,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x,y,-z', '-x-0.5,y,z-0.5', 'x-0.5,-y,z-0.5'] + number: 53 + schoenflies: D2h^7 + universal_h_m: P c n m + Pncm: + crystal_class: orthorhombic + hall: -P 2 2bc + hermann_mauguin: P n c m + symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-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', '-x,-y,-z', + 'x,y,-z', '-x,y-0.5,z-0.5', 'x,-y-0.5,z-0.5'] + number: 53 + schoenflies: D2h^7 + universal_h_m: P n c m + Pman: + crystal_class: orthorhombic + hall: -P 2ab 2 + hermann_mauguin: P m a n + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y,z', 'x-0.5,-y-0.5,z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y,z', 'x-0.5,-y-0.5,z'] + number: 53 + schoenflies: D2h^7 + universal_h_m: P m a n + 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 + Pccb: + crystal_class: orthorhombic + hall: -P 2b 2c + hermann_mauguin: P c c b + 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'] + 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: 54 + schoenflies: D2h^8 + universal_h_m: P c c b + Pbaa: + crystal_class: orthorhombic + hall: -P 2a 2b + hermann_mauguin: P b a a + symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z'] + number: 54 + schoenflies: D2h^8 + universal_h_m: P b a a + Pcaa: + crystal_class: orthorhombic + hall: -P 2ac 2c + hermann_mauguin: P c a a + symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x,y,z-0.5', 'x-0.5,-y,z'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x,y,z-0.5', 'x-0.5,-y,z'] + number: 54 + schoenflies: D2h^8 + universal_h_m: P c a a + Pbcb: + crystal_class: orthorhombic + hall: -P 2bc 2b + hermann_mauguin: P b c b + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x,y,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x,y-0.5,z', 'x,-y,z-0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x,y,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x,y-0.5,z', 'x,-y,z-0.5'] + number: 54 + schoenflies: D2h^8 + universal_h_m: P b c b + Pbab: + crystal_class: orthorhombic + hall: -P 2b 2ab + hermann_mauguin: P b a b + symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x,y-0.5,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x,y-0.5,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y,z'] + number: 54 + schoenflies: D2h^8 + universal_h_m: P b a b + 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 + Pmcb: + crystal_class: orthorhombic + hall: -P 2bc 2 + hermann_mauguin: P m c b + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z', '-x,y+0.5,-z+0.5', '-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', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x,y,z', 'x,-y-0.5,z-0.5'] + number: 55 + schoenflies: D2h^9 + universal_h_m: P m c b + Pcma: + crystal_class: orthorhombic + hall: -P 2ac 2ac + hermann_mauguin: P c m a + symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y,z'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y,z'] + number: 55 + schoenflies: D2h^9 + universal_h_m: P c m a + 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 + Pnaa: + crystal_class: orthorhombic + hall: -P 2ac 2bc + hermann_mauguin: P n a a + symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x,y-0.5,z-0.5', 'x-0.5,-y-0.5,z'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x,y-0.5,z-0.5', 'x-0.5,-y-0.5,z'] + number: 56 + schoenflies: D2h^10 + universal_h_m: P n a a + Pbnb: + crystal_class: orthorhombic + hall: -P 2bc 2ab + hermann_mauguin: P b n b + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x-0.5,y-0.5,z', 'x-0.5,-y,z-0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x-0.5,y-0.5,z', 'x-0.5,-y,z-0.5'] + number: 56 + schoenflies: D2h^10 + universal_h_m: P b n b + 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 + Pcam: + crystal_class: orthorhombic + hall: -P 2c 2ac + hermann_mauguin: P c a m + symops: ['x,y,z', '-x,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z', '-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', '-x,-y,-z', + 'x,y,-z-0.5', '-x-0.5,y,z-0.5', 'x-0.5,-y,z'] + number: 57 + schoenflies: D2h^11 + universal_h_m: P c a m + Pmca: + crystal_class: orthorhombic + hall: -P 2ac 2a + hermann_mauguin: P m c a + symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z', '-x,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x-0.5,y,z', 'x,-y,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z', '-x,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x-0.5,y,z', 'x,-y,z-0.5'] + number: 57 + schoenflies: D2h^11 + universal_h_m: P m c a + Pmab: + crystal_class: orthorhombic + hall: -P 2b 2a + hermann_mauguin: P m a b + symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x,y-0.5,-z', '-x-0.5,y,z', 'x-0.5,-y-0.5,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x,y-0.5,-z', '-x-0.5,y,z', 'x-0.5,-y-0.5,z'] + number: 57 + schoenflies: D2h^11 + universal_h_m: P m a b + Pbma: + crystal_class: orthorhombic + hall: -P 2a 2ab + hermann_mauguin: P b m a + symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z', '-x-0.5,y-0.5,z', 'x,-y-0.5,z'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z', '-x-0.5,y-0.5,z', 'x,-y-0.5,z'] + number: 57 + schoenflies: D2h^11 + universal_h_m: P b m a + Pcmb: + crystal_class: orthorhombic + hall: -P 2bc 2c + hermann_mauguin: P c m b + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x,y,z-0.5', 'x,-y-0.5,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x,y,z-0.5', 'x,-y-0.5,z'] + number: 57 + schoenflies: D2h^11 + universal_h_m: P c m b + 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 + Pmnn: + crystal_class: orthorhombic + hall: -P 2n 2 + hermann_mauguin: P m n n + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x,y,z', 'x-0.5,-y-0.5,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x,y,z', 'x-0.5,-y-0.5,z-0.5'] + number: 58 + schoenflies: D2h^12 + universal_h_m: P m n n + Pnmn: + crystal_class: orthorhombic + hall: -P 2n 2n + hermann_mauguin: P n m n + symops: ['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', 'x,-y,z'] + ncsym: ['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', 'x,-y,z'] + number: 58 + schoenflies: D2h^12 + universal_h_m: P n m n + Pmmn:1: + 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 + Pmmn:2: + crystal_class: orthorhombic + hall: -P 2ab 2a + hermann_mauguin: P m m n + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x-0.5,y,z', 'x,-y-0.5,z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x-0.5,y,z', 'x,-y-0.5,z'] + number: 59 + schoenflies: D2h^13 + universal_h_m: P m m n :2 + Pnmm:1: + crystal_class: orthorhombic + hall: ' P 2bc 2 -1bc' + hermann_mauguin: P n m m + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', + 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', + 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] + number: 59 + schoenflies: D2h^13 + universal_h_m: P n m m :1 + Pnmm:2: + crystal_class: orthorhombic + hall: -P 2c 2bc + hermann_mauguin: P n m m + symops: ['x,y,z', '-x,-y,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', + 'x,y,-z-0.5', '-x,y-0.5,z-0.5', 'x,-y-0.5,z'] + ncsym: ['x,y,z', '-x,-y,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', + 'x,y,-z-0.5', '-x,y-0.5,z-0.5', 'x,-y-0.5,z'] + number: 59 + schoenflies: D2h^13 + universal_h_m: P n m m :2 + Pmnm:1: + crystal_class: orthorhombic + hall: ' P 2ac 2ac -1ac' + hermann_mauguin: P m n m + symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', + 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', + 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] + number: 59 + schoenflies: D2h^13 + universal_h_m: P m n m :1 + Pmnm:2: + crystal_class: orthorhombic + hall: -P 2c 2a + hermann_mauguin: P m n m + symops: ['x,y,z', '-x,-y,z+0.5', 'x+0.5,-y,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x,y,-z-0.5', '-x-0.5,y,z', 'x-0.5,-y,z-0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', 'x+0.5,-y,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x,y,-z-0.5', '-x-0.5,y,z', 'x-0.5,-y,z-0.5'] + number: 59 + schoenflies: D2h^13 + universal_h_m: P m n m :2 + 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 + Pcan: + crystal_class: orthorhombic + hall: -P 2n 2c + hermann_mauguin: P c a n + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x,y,z-0.5', 'x-0.5,-y-0.5,z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x,y,z-0.5', 'x-0.5,-y-0.5,z'] + number: 60 + schoenflies: D2h^14 + universal_h_m: P c a n + Pnca: + crystal_class: orthorhombic + hall: -P 2a 2n + hermann_mauguin: P n c a + symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z', '-x-0.5,y-0.5,z-0.5', 'x,-y-0.5,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z', '-x-0.5,y-0.5,z-0.5', 'x,-y-0.5,z-0.5'] + number: 60 + schoenflies: D2h^14 + universal_h_m: P n c a + Pnab: + crystal_class: orthorhombic + hall: -P 2bc 2n + hermann_mauguin: P n a b + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x-0.5,y-0.5,z-0.5', 'x-0.5,-y,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x-0.5,y-0.5,z-0.5', 'x-0.5,-y,z'] + number: 60 + schoenflies: D2h^14 + universal_h_m: P n a b + Pbna: + crystal_class: orthorhombic + hall: -P 2ac 2b + hermann_mauguin: P b n a + symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x,y-0.5,z', 'x-0.5,-y-0.5,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x,y-0.5,z', 'x-0.5,-y-0.5,z-0.5'] + number: 60 + schoenflies: D2h^14 + universal_h_m: P b n a + Pcnb: + crystal_class: orthorhombic + hall: -P 2b 2ac + hermann_mauguin: P c n b + symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z', '-x-0.5,y,z-0.5', 'x-0.5,-y-0.5,z-0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z', '-x-0.5,y,z-0.5', 'x-0.5,-y-0.5,z-0.5'] + number: 60 + schoenflies: D2h^14 + universal_h_m: P c n b + 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 + Pcab: + crystal_class: orthorhombic + hall: -P 2bc 2ac + hermann_mauguin: P c a b + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x-0.5,y,z-0.5', 'x-0.5,-y-0.5,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x-0.5,y,z-0.5', 'x-0.5,-y-0.5,z'] + number: 61 + schoenflies: D2h^15 + universal_h_m: P c a b + 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 + Pmnb: + crystal_class: orthorhombic + hall: -P 2bc 2a + hermann_mauguin: P m n b + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x-0.5,y,z', 'x-0.5,-y-0.5,z-0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x,y-0.5,-z-0.5', '-x-0.5,y,z', 'x-0.5,-y-0.5,z-0.5'] + number: 62 + schoenflies: D2h^16 + universal_h_m: P m n b + Pbnm: + crystal_class: orthorhombic + hall: -P 2c 2ab + hermann_mauguin: P b n m + 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', '-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', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-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'] + number: 62 + schoenflies: D2h^16 + universal_h_m: P b n m + Pcmn: + crystal_class: orthorhombic + hall: -P 2n 2ac + hermann_mauguin: P c m n + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y-0.5,z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y-0.5,z'] + number: 62 + schoenflies: D2h^16 + universal_h_m: P c m n + Pmcn: + crystal_class: orthorhombic + hall: -P 2n 2a + hermann_mauguin: P m c n + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y,z', 'x,-y-0.5,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z', + 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y,z', 'x,-y-0.5,z-0.5'] + number: 62 + schoenflies: D2h^16 + universal_h_m: P m c n + Pnam: + crystal_class: orthorhombic + hall: -P 2c 2n + hermann_mauguin: P n a m + 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', '-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', '-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: 62 + schoenflies: D2h^16 + universal_h_m: P n a m + 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 + Ccmm: + crystal_class: orthorhombic + hall: -C 2c 2c + hermann_mauguin: C c m m + symops: ['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,-y,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', + 'x+0.5,-y+0.5,z'] + ncsym: ['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,-y,z'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C c m m + Amma: + crystal_class: orthorhombic + hall: -A 2a 2a + hermann_mauguin: A 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', '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', + '-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', + 'x,-y+0.5,z+0.5'] + 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: 63 + schoenflies: D2h^17 + universal_h_m: A m m a + Amam: + crystal_class: orthorhombic + hall: -A 2 2a + hermann_mauguin: A m a m + symops: ['x,y,z', '-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+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', '-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', '-x,-y,-z', 'x,y,-z', + '-x-0.5,y,z', 'x-0.5,-y,z'] + number: 63 + schoenflies: D2h^17 + universal_h_m: A m a m + Bbmm: + crystal_class: orthorhombic + hall: -B 2 2b + hermann_mauguin: B b m m + symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', + '-x,y-0.5,z', 'x,-y-0.5,z', 'x+0.5,y,z+0.5', '-x+0.5,-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,-z+0.5', 'x+0.5,y,-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+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', + '-x,y-0.5,z', 'x,-y-0.5,z'] + number: 63 + schoenflies: D2h^17 + universal_h_m: B b m m + Bmmb: + crystal_class: orthorhombic + hall: -B 2b 2 + hermann_mauguin: B m m b + 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,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', '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'] + 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: 63 + schoenflies: D2h^17 + universal_h_m: B m m b + 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 + Ccme: + crystal_class: orthorhombic + hall: -C 2ac 2ac + hermann_mauguin: C c m e + symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y,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+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+0.5,z'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x,-y,-z', + 'x-0.5,y,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y,z'] + number: 64 + schoenflies: D2h^18 + universal_h_m: C c m e + Aema: + crystal_class: orthorhombic + hall: -A 2ab 2ab + hermann_mauguin: A e m a + symops: ['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', 'x,-y,z', 'x,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5', + 'x+0.5,-y+1,-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,-y+0.5,z+0.5'] + ncsym: ['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', 'x,-y,z'] + number: 64 + schoenflies: D2h^18 + universal_h_m: A e m a + Aeam: + crystal_class: orthorhombic + hall: -A 2 2ab + hermann_mauguin: A e 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', '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', '-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'] + 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: 64 + schoenflies: D2h^18 + universal_h_m: A e a m + Bbem: + crystal_class: orthorhombic + hall: -B 2 2ab + hermann_mauguin: B b e 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', 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', + 'x+1,-y+0.5,-z+0.5', '-x+1,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', 'x+0.5,y,-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+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: 64 + schoenflies: D2h^18 + universal_h_m: B b e m + Bmeb: + crystal_class: orthorhombic + hall: -B 2ab 2 + hermann_mauguin: B m e b + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y,z', 'x-0.5,-y-0.5,z', 'x+0.5,y,z+0.5', '-x+1,-y+0.5,z+0.5', + 'x+0.5,-y,-z+0.5', '-x+1,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', 'x,y-0.5,-z+0.5', + '-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,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y,z', 'x-0.5,-y-0.5,z'] + number: 64 + schoenflies: D2h^18 + universal_h_m: B m e b + 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 + Ammm: + crystal_class: orthorhombic + hall: -A 2 2 + hermann_mauguin: A 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'] + 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: A m m m + Bmmm: + crystal_class: orthorhombic + hall: -B 2 2 + hermann_mauguin: B 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,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'] + 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: B m m m + 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 + Amaa: + crystal_class: orthorhombic + hall: -A 2a 2 + hermann_mauguin: A m a 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,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', + '-x+0.5,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', 'x-0.5,y+0.5,-z+0.5', '-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,-z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,y,-z', + '-x,y,z', 'x-0.5,-y,z'] + number: 66 + schoenflies: D2h^20 + universal_h_m: A m a a + Bbmb: + crystal_class: orthorhombic + hall: -B 2b 2b + hermann_mauguin: B b m b + symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', + '-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+0.5,-y+0.5,-z+0.5', + '-x+0.5,y,-z+0.5', '-x+0.5,-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,z+0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', + '-x,y-0.5,z', 'x,-y,z'] + number: 66 + schoenflies: D2h^20 + universal_h_m: B b m b + Cmma: + 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 + Cmmb: + crystal_class: orthorhombic + hall: -C 2a 2a + hermann_mauguin: C m m b + 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', 'x+0.5,y+0.5,z', '-x+1,-y+0.5,z', 'x+1,-y+0.5,-z', '-x+0.5,y+0.5,-z', + '-x+0.5,-y+0.5,-z', 'x,y+0.5,-z', '-x,y+0.5,z', 'x+0.5,-y+0.5,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: 67 + schoenflies: D2h^21 + universal_h_m: C m m b + Abmm: + crystal_class: orthorhombic + hall: -A 2b 2b + hermann_mauguin: A b m m + symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', + '-x,y-0.5,z', 'x,-y,z', 'x,y+0.5,z+0.5', '-x,-y+1,z+0.5', 'x,-y+1,-z+0.5', '-x,y+0.5,-z+0.5', + '-x,-y+0.5,-z+0.5', 'x,y,-z+0.5', '-x,y,z+0.5', 'x,-y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', + '-x,y-0.5,z', 'x,-y,z'] + number: 67 + schoenflies: D2h^21 + universal_h_m: A b m m + Acmm: + crystal_class: orthorhombic + hall: -A 2 2b + hermann_mauguin: A c m m + symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-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', '-x,-y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', 'x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', + '-x,y-0.5,z', 'x,-y-0.5,z'] + number: 67 + schoenflies: D2h^21 + universal_h_m: A c m m + Bmcm: + crystal_class: orthorhombic + hall: -B 2 2a + hermann_mauguin: B m c m + symops: ['x,y,z', '-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+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', 'x+1,-y,-z+0.5', + '-x+1,y,-z+0.5', '-x+0.5,-y,-z+0.5', 'x+0.5,y,-z+0.5', '-x,y,z+0.5', 'x,-y,z+0.5'] + ncsym: ['x,y,z', '-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'] + number: 67 + schoenflies: D2h^21 + universal_h_m: B m c m + Bmam: + crystal_class: orthorhombic + hall: -B 2a 2 + hermann_mauguin: B m a m + 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,z+0.5', '-x+1,-y,z+0.5', 'x+0.5,-y,-z+0.5', + '-x+1,y,-z+0.5', '-x+0.5,-y,-z+0.5', 'x,y,-z+0.5', '-x+0.5,y,z+0.5', 'x,-y,z+0.5'] + 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: B m a m + Ccce:1: + 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 + Ccca:2: + crystal_class: orthorhombic + hall: -C 2a 2ac + hermann_mauguin: C 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', 'x+0.5,y+0.5,z', '-x+1,-y+0.5,z', + 'x+1,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', 'x,y+0.5,-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+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: 68 + schoenflies: D2h^22 + universal_h_m: C c c a :2 + Cccb:2: + crystal_class: orthorhombic + hall: -C 2a 2c + hermann_mauguin: C c c b + symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y,z-0.5', 'x-0.5,-y,z-0.5', 'x+0.5,y+0.5,z', '-x+1,-y+0.5,z', + 'x+0.5,-y+0.5,-z+0.5', '-x+1,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', 'x,y+0.5,-z', + '-x+0.5,y+0.5,z-0.5', 'x,-y+0.5,z-0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y,z-0.5', 'x-0.5,-y,z-0.5'] + number: 68 + schoenflies: D2h^22 + universal_h_m: C c c b :2 + Aeaa:1: + crystal_class: orthorhombic + hall: ' A 2 2 -1ab' + hermann_mauguin: A e a a + 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', '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+1,-z+0.5', 'x+0.5,y+1,-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,-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: 68 + schoenflies: D2h^22 + universal_h_m: A e a a :1 + Abaa:2: + crystal_class: orthorhombic + hall: -A 2a 2b + hermann_mauguin: A b a a + symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z', 'x,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', + 'x,-y+1,-z+0.5', '-x+0.5,y+1,-z+0.5', '-x,-y+0.5,-z+0.5', 'x-0.5,y+0.5,-z+0.5', + '-x,y,z+0.5', 'x-0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z'] + number: 68 + schoenflies: D2h^22 + universal_h_m: A b a a :2 + Acaa:2: + crystal_class: orthorhombic + hall: -A 2ab 2b + hermann_mauguin: A c a a + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z', 'x,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5', + 'x,-y+1,-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,z+0.5', 'x-0.5,-y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z'] + number: 68 + schoenflies: D2h^22 + universal_h_m: A c a a :2 + Bbeb:1: + crystal_class: orthorhombic + hall: ' B 2 2 -1ab' + hermann_mauguin: B b e b + 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', '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+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+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: 68 + schoenflies: D2h^22 + universal_h_m: B b e b :1 + Bbcb:2: + crystal_class: orthorhombic + hall: -B 2ab 2b + hermann_mauguin: B b c b + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z', 'x+0.5,y,z+0.5', '-x+1,-y+0.5,z+0.5', + 'x+0.5,-y+0.5,-z+0.5', '-x+1,y,-z+0.5', '-x+0.5,-y,-z+0.5', 'x,y-0.5,-z+0.5', + '-x+0.5,y-0.5,z+0.5', 'x,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z'] + number: 68 + schoenflies: D2h^22 + universal_h_m: B b c b :2 + Bbab:2: + crystal_class: orthorhombic + hall: -B 2b 2ab + hermann_mauguin: B b a b + symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x,y-0.5,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y,z', 'x+0.5,y,z+0.5', '-x+0.5,-y+0.5,z+0.5', + 'x+1,-y+0.5,-z+0.5', '-x+1,y,-z+0.5', '-x+0.5,-y,-z+0.5', 'x+0.5,y-0.5,-z+0.5', + '-x,y-0.5,z+0.5', 'x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x,y-0.5,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y,z'] + number: 68 + schoenflies: D2h^22 + universal_h_m: B b a b :2 + 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:1: + 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 + Fddd:2: + crystal_class: orthorhombic + hall: -F 2uv 2vw + hermann_mauguin: F d d d + symops: ['x,y,z', '-x+0.25,-y+0.25,z', 'x,-y+0.25,-z+0.25', '-x+0.25,y,-z+0.25', + '-x,-y,-z', 'x-0.25,y-0.25,-z', '-x,y-0.25,z-0.25', 'x-0.25,-y,z-0.25', 'x,y+0.5,z+0.5', + '-x+0.25,-y+0.75,z+0.5', 'x,-y+0.75,-z+0.75', '-x+0.25,y+0.5,-z+0.75', '-x,-y+0.5,-z+0.5', + 'x-0.25,y+0.25,-z+0.5', '-x,y+0.25,z+0.25', 'x-0.25,-y+0.5,z+0.25', 'x+0.5,y,z+0.5', + '-x+0.75,-y+0.25,z+0.5', 'x+0.5,-y+0.25,-z+0.75', '-x+0.75,y,-z+0.75', '-x+0.5,-y,-z+0.5', + 'x+0.25,y-0.25,-z+0.5', '-x+0.5,y-0.25,z+0.25', 'x+0.25,-y,z+0.25', 'x+0.5,y+0.5,z', + '-x+0.75,-y+0.75,z', 'x+0.5,-y+0.75,-z+0.25', '-x+0.75,y+0.5,-z+0.25', '-x+0.5,-y+0.5,-z', + 'x+0.25,y+0.25,-z', '-x+0.5,y+0.25,z-0.25', 'x+0.25,-y+0.5,z-0.25'] + ncsym: ['x,y,z', '-x+0.25,-y+0.25,z', 'x,-y+0.25,-z+0.25', '-x+0.25,y,-z+0.25', + '-x,-y,-z', 'x-0.25,y-0.25,-z', '-x,y-0.25,z-0.25', 'x-0.25,-y,z-0.25'] + number: 70 + schoenflies: D2h^24 + universal_h_m: F d d d :2 + 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: + 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 + Imcb: + crystal_class: orthorhombic + hall: -I 2a 2 + hermann_mauguin: I m c b + 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+0.5', '-x+1,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', + '-x+1,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', + 'x,-y+0.5,z+0.5'] + 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: 72 + schoenflies: D2h^26 + universal_h_m: I m c b + Icma: + crystal_class: orthorhombic + hall: -I 2b 2b + hermann_mauguin: I c m a + symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', + '-x,y-0.5,z', 'x,-y,z', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5', 'x+0.5,-y+1,-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,-z+0.5', '-x+0.5,y,z+0.5', + 'x+0.5,-y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', + '-x,y-0.5,z', 'x,-y,z'] + number: 72 + schoenflies: D2h^26 + universal_h_m: I c m a + 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 + Icab: + crystal_class: orthorhombic + hall: -I 2a 2b + hermann_mauguin: I c a b + symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z', '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,-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,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z'] + number: 73 + schoenflies: D2h^27 + universal_h_m: I c a b + 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 + Immb: + crystal_class: orthorhombic + hall: -I 2a 2a + hermann_mauguin: I m m b + 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', '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', + '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', '-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+0.5,-y,-z', '-x,y,-z', '-x,-y,-z', 'x-0.5,y,-z', + '-x-0.5,y,z', 'x,-y,z'] + number: 74 + schoenflies: D2h^28 + universal_h_m: I m m b + Ibmm: + crystal_class: orthorhombic + hall: -I 2c 2c + hermann_mauguin: I b m m + symops: ['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,-y,z', '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', + 'x+0.5,-y+0.5,z+0.5'] + ncsym: ['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,-y,z'] + number: 74 + schoenflies: D2h^28 + universal_h_m: I b m m + Icmm: + crystal_class: orthorhombic + hall: -I 2 2b + hermann_mauguin: I c m m + symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', + '-x,y-0.5,z', 'x,-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+1,-z+0.5', + '-x+0.5,y+1,-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,z+0.5', + 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', + '-x,y-0.5,z', 'x,-y-0.5,z'] + number: 74 + schoenflies: D2h^28 + universal_h_m: I c m m + Imcm: + crystal_class: orthorhombic + hall: -I 2 2a + hermann_mauguin: I m c m + symops: ['x,y,z', '-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+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', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,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+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'] + number: 74 + schoenflies: D2h^28 + universal_h_m: I m c m + Imam: + crystal_class: orthorhombic + hall: -I 2c 2 + hermann_mauguin: I m a 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+0.5', '-x+0.5,-y+0.5,z+1', 'x+0.5,-y+0.5,-z+0.5', + '-x+0.5,y+0.5,-z+1', '-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'] + 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: 74 + schoenflies: D2h^28 + universal_h_m: I m a m + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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:1: + 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 + P4/n:2: + crystal_class: tetragonal + hall: -P 4a + hermann_mauguin: P 4/n + 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'] + 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'] + number: 85 + schoenflies: C4h^3 + universal_h_m: P 4/n :2 + P42/n:1: + 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 + P42/n:2: + crystal_class: tetragonal + hall: -P 4bc + hermann_mauguin: P 42/n + symops: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', '-x,-y,-z', + 'y,-x-0.5,-z-0.5', 'x-0.5,y-0.5,-z', '-y-0.5,x,-z-0.5'] + ncsym: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', '-x,-y,-z', + 'y,-x-0.5,-z-0.5', 'x-0.5,y-0.5,-z', '-y-0.5,x,-z-0.5'] + number: 86 + schoenflies: C4h^4 + universal_h_m: P 42/n :2 + 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:1: + 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 + I41/a:2: + crystal_class: tetragonal + hall: -I 4ad + hermann_mauguin: I 41/a + symops: ['x,y,z', '-y+0.75,x+0.25,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.75,-x+0.75,z+0.75', + '-x,-y,-z', 'y-0.75,-x-0.25,-z-0.25', 'x-0.5,y,-z-0.5', '-y-0.75,x-0.75,-z-0.75', + 'x+0.5,y+0.5,z+0.5', '-y+1.25,x+0.75,z+0.75', '-x+1,-y+0.5,z+1', 'y+1.25,-x+1.25,z+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'] + ncsym: ['x,y,z', '-y+0.75,x+0.25,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.75,-x+0.75,z+0.75', + '-x,-y,-z', 'y-0.75,-x-0.25,-z-0.25', 'x-0.5,y,-z-0.5', '-y-0.75,x-0.75,-z-0.75'] + number: 88 + schoenflies: C4h^6 + universal_h_m: I 41/a :2 + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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:1: + 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/nbm:2: + crystal_class: tetragonal + hall: -P 4a 2b + hermann_mauguin: P 4/n b m + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', + 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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-0.5,z', '-y,-x,z', 'x-0.5,-y,z', 'y-0.5,x-0.5,z'] + ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', + 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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-0.5,z', '-y,-x,z', 'x-0.5,-y,z', 'y-0.5,x-0.5,z'] + number: 125 + schoenflies: D4h^3 + universal_h_m: P 4/n b m :2 + P4/nnc:1: + 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/nnc:2: + crystal_class: tetragonal + hall: -P 4a 2bc + hermann_mauguin: P 4/n n c + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x,y-0.5,z-0.5', '-y,-x,z-0.5', 'x-0.5,-y,z-0.5', + 'y-0.5,x-0.5,z-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+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x,y-0.5,z-0.5', '-y,-x,z-0.5', 'x-0.5,-y,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 :2 + 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: + 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:1: + 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/nmm:2: + crystal_class: tetragonal + hall: -P 4a 2a + hermann_mauguin: P 4/n m m + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x+0.5,-y,-z', + 'y+0.5,x+0.5,-z', '-x,y+0.5,-z', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z', + '-y,x-0.5,-z', '-x-0.5,y,z', '-y-0.5,-x-0.5,z', 'x,-y-0.5,z', 'y,x,z'] + ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x+0.5,-y,-z', + 'y+0.5,x+0.5,-z', '-x,y+0.5,-z', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z', + '-y,x-0.5,-z', '-x-0.5,y,z', '-y-0.5,-x-0.5,z', 'x,-y-0.5,z', 'y,x,z'] + number: 129 + schoenflies: D4h^7 + universal_h_m: P 4/n m m :2 + P4/ncc:1: + 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 + P4/ncc:2: + crystal_class: tetragonal + hall: -P 4a 2ac + hermann_mauguin: P 4/n c c + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x+0.5,-y,-z+0.5', + 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x-0.5,y,z-0.5', '-y-0.5,-x-0.5,z-0.5', 'x,-y-0.5,z-0.5', + 'y,x,z-0.5'] + ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x+0.5,-y,-z+0.5', + 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x-0.5,y,z-0.5', '-y-0.5,-x-0.5,z-0.5', 'x,-y-0.5,z-0.5', + 'y,x,z-0.5'] + number: 130 + schoenflies: D4h^8 + universal_h_m: P 4/n c c :2 + 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: + 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:1: + 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/nbc:2: + crystal_class: tetragonal + hall: -P 4ac 2b + hermann_mauguin: P 42/n b c + symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z', + 'y,x,-z+0.5', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z-0.5', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x,y-0.5,z', '-y,-x,z-0.5', 'x-0.5,-y,z', + 'y-0.5,x-0.5,z-0.5'] + ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z', + 'y,x,-z+0.5', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z-0.5', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x,y-0.5,z', '-y,-x,z-0.5', 'x-0.5,-y,z', + 'y-0.5,x-0.5,z-0.5'] + number: 133 + schoenflies: D4h^11 + universal_h_m: P 42/n b c :2 + P42/nnm:1: + 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/nnm:2: + crystal_class: tetragonal + hall: -P 4ac 2bc + hermann_mauguin: P 42/n n m + symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z+0.5', + 'y,x,-z', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y-0.5,-x,-z-0.5', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x,y-0.5,z-0.5', '-y,-x,z', 'x-0.5,-y,z-0.5', + 'y-0.5,x-0.5,z'] + ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z+0.5', + 'y,x,-z', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y-0.5,-x,-z-0.5', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x,y-0.5,z-0.5', '-y,-x,z', 'x-0.5,-y,z-0.5', + 'y-0.5,x-0.5,z'] + number: 134 + schoenflies: D4h^12 + universal_h_m: P 42/n n m :2 + 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: + 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:1: + 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/nmc:2: + crystal_class: tetragonal + hall: -P 4ac 2a + hermann_mauguin: P 42/n m c + symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z', + 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z', '-y,-x,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z-0.5', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x-0.5,y,z', '-y-0.5,-x-0.5,z-0.5', 'x,-y-0.5,z', + 'y,x,z-0.5'] + ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z', + 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z', '-y,-x,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z-0.5', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x-0.5,y,z', '-y-0.5,-x-0.5,z-0.5', 'x,-y-0.5,z', + 'y,x,z-0.5'] + number: 137 + schoenflies: D4h^15 + universal_h_m: P 42/n m c :2 + P42/ncm:1: + 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 + P42/ncm:2: + crystal_class: tetragonal + hall: -P 4ac 2ac + hermann_mauguin: P 42/n c m + symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z+0.5', + 'y+0.5,x+0.5,-z', '-x,y+0.5,-z+0.5', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x,-z-0.5', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x-0.5,y,z-0.5', '-y-0.5,-x-0.5,z', 'x,-y-0.5,z-0.5', + 'y,x,z'] + ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z+0.5', + 'y+0.5,x+0.5,-z', '-x,y+0.5,-z+0.5', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x,-z-0.5', + 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x-0.5,y,z-0.5', '-y-0.5,-x-0.5,z', 'x,-y-0.5,z-0.5', + 'y,x,z'] + number: 138 + schoenflies: D4h^16 + universal_h_m: P 42/n c m :2 + 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: + 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:1: + 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/amd:2: + crystal_class: tetragonal + hall: -I 4bd 2 + hermann_mauguin: I 41/a m 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', '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', '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', '-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+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+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+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+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'] + 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', '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', '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', '-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'] + number: 141 + schoenflies: D4h^19 + universal_h_m: I 41/a m d :2 + I41/acd:1: + 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 + I41/acd:2: + crystal_class: tetragonal + hall: -I 4bd 2c + hermann_mauguin: I 41/a c 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', + '-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', + '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', + '-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'] + 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', + '-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'] + number: 142 + schoenflies: D4h^20 + universal_h_m: I 41/a c d :2 + 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: + 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: + 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:H: + 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 + R3:R: + crystal_class: rhombohedral + hall: ' P 3*' + hermann_mauguin: R 3 + symops: ['x,y,z', 'z,x,y', 'y,z,x'] + ncsym: ['x,y,z', 'z,x,y', 'y,z,x'] + number: 146 + schoenflies: C3^4 + universal_h_m: R 3 :R + 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:H: + 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 + R-3:R: + crystal_class: rhombohedral + hall: -P 3* + hermann_mauguin: R -3 + symops: ['x,y,z', 'z,x,y', 'y,z,x', '-x,-y,-z', '-z,-x,-y', '-y,-z,-x'] + ncsym: ['x,y,z', 'z,x,y', 'y,z,x', '-x,-y,-z', '-z,-x,-y', '-y,-z,-x'] + number: 148 + schoenflies: C3i^2 + universal_h_m: R -3 :R + 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: + 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: + 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: + 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: + 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: + 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:H: + 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 + R32:R: + crystal_class: rhombohedral + hall: ' P 3* 2' + hermann_mauguin: R 3 2 + symops: ['x,y,z', 'z,x,y', 'y,z,x', '-y,-x,-z', '-z,-y,-x', '-x,-z,-y'] + ncsym: ['x,y,z', 'z,x,y', 'y,z,x', '-y,-x,-z', '-z,-y,-x', '-x,-z,-y'] + number: 155 + schoenflies: D3^7 + universal_h_m: R 3 2 :R + 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: + 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: + 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: + 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:H: + 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 + R3m:R: + crystal_class: rhombohedral + hall: ' P 3* -2' + hermann_mauguin: R 3 m + symops: ['x,y,z', 'z,x,y', 'y,z,x', 'y,x,z', 'z,y,x', 'x,z,y'] + ncsym: ['x,y,z', 'z,x,y', 'y,z,x', 'y,x,z', 'z,y,x', 'x,z,y'] + number: 160 + schoenflies: C3v^5 + universal_h_m: R 3 m :R + R3c:H: + 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 + R3c:R: + crystal_class: rhombohedral + hall: ' P 3* -2n' + hermann_mauguin: R 3 c + symops: ['x,y,z', 'z,x,y', 'y,z,x', 'y+0.5,x+0.5,z+0.5', 'z+0.5,y+0.5,x+0.5', + 'x+0.5,z+0.5,y+0.5'] + ncsym: ['x,y,z', 'z,x,y', 'y,z,x', 'y+0.5,x+0.5,z+0.5', 'z+0.5,y+0.5,x+0.5', 'x+0.5,z+0.5,y+0.5'] + number: 161 + schoenflies: C3v^6 + universal_h_m: R 3 c :R + 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: + 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: + 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: + 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:H: + 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-3m:R: + crystal_class: rhombohedral + hall: -P 3* 2 + hermann_mauguin: R -3 m + 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'] + 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 + universal_h_m: R -3 m :R + R-3c:H: + 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 + R-3c:R: + crystal_class: rhombohedral + hall: -P 3* 2n + hermann_mauguin: R -3 c + symops: ['x,y,z', 'z,x,y', 'y,z,x', '-y+0.5,-x+0.5,-z+0.5', '-z+0.5,-y+0.5,-x+0.5', + '-x+0.5,-z+0.5,-y+0.5', '-x,-y,-z', '-z,-x,-y', '-y,-z,-x', 'y-0.5,x-0.5,z-0.5', + 'z-0.5,y-0.5,x-0.5', 'x-0.5,z-0.5,y-0.5'] + ncsym: ['x,y,z', 'z,x,y', 'y,z,x', '-y+0.5,-x+0.5,-z+0.5', '-z+0.5,-y+0.5,-x+0.5', + '-x+0.5,-z+0.5,-y+0.5', '-x,-y,-z', '-z,-x,-y', '-y,-z,-x', 'y-0.5,x-0.5,z-0.5', + 'z-0.5,y-0.5,x-0.5', 'x-0.5,z-0.5,y-0.5'] + number: 167 + schoenflies: D3d^6 + universal_h_m: R -3 c :R + 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: + 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 + P65: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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 + P6522: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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:1: + 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 + Pn-3:2: + crystal_class: cubic + hall: -P 2ab 2bc 3 + hermann_mauguin: P n -3 + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', + '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', + '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x,-y,-z', 'x-0.5,y-0.5,-z', '-x,y-0.5,z-0.5', + 'x-0.5,-y,z-0.5', '-z,-x,-y', 'z-0.5,x-0.5,-y', '-z,x-0.5,y-0.5', 'z-0.5,-x,y-0.5', + '-y,-z,-x', '-y,z-0.5,x-0.5', 'y-0.5,-z,x-0.5', 'y-0.5,z-0.5,-x'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', + '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', + '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x,-y,-z', 'x-0.5,y-0.5,-z', '-x,y-0.5,z-0.5', + 'x-0.5,-y,z-0.5', '-z,-x,-y', 'z-0.5,x-0.5,-y', '-z,x-0.5,y-0.5', 'z-0.5,-x,y-0.5', + '-y,-z,-x', '-y,z-0.5,x-0.5', 'y-0.5,-z,x-0.5', 'y-0.5,z-0.5,-x'] + number: 201 + schoenflies: Th^2 + universal_h_m: P n -3 :2 + 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:1: + 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 + Fd-3:2: + crystal_class: cubic + hall: -F 2uv 2vw 3 + hermann_mauguin: F d -3 + symops: ['x,y,z', '-x+0.25,-y+0.25,z', 'x,-y+0.25,-z+0.25', '-x+0.25,y,-z+0.25', + 'z,x,y', '-z+0.25,-x+0.25,y', 'z,-x+0.25,-y+0.25', '-z+0.25,x,-y+0.25', 'y,z,x', + 'y,-z+0.25,-x+0.25', '-y+0.25,z,-x+0.25', '-y+0.25,-z+0.25,x', '-x,-y,-z', 'x-0.25,y-0.25,-z', + '-x,y-0.25,z-0.25', 'x-0.25,-y,z-0.25', '-z,-x,-y', 'z-0.25,x-0.25,-y', '-z,x-0.25,y-0.25', + 'z-0.25,-x,y-0.25', '-y,-z,-x', '-y,z-0.25,x-0.25', 'y-0.25,-z,x-0.25', 'y-0.25,z-0.25,-x', + 'x,y+0.5,z+0.5', '-x+0.25,-y+0.75,z+0.5', 'x,-y+0.75,-z+0.75', '-x+0.25,y+0.5,-z+0.75', + 'z,x+0.5,y+0.5', '-z+0.25,-x+0.75,y+0.5', 'z,-x+0.75,-y+0.75', '-z+0.25,x+0.5,-y+0.75', + 'y,z+0.5,x+0.5', 'y,-z+0.75,-x+0.75', '-y+0.25,z+0.5,-x+0.75', '-y+0.25,-z+0.75,x+0.5', + '-x,-y+0.5,-z+0.5', 'x-0.25,y+0.25,-z+0.5', '-x,y+0.25,z+0.25', 'x-0.25,-y+0.5,z+0.25', + '-z,-x+0.5,-y+0.5', 'z-0.25,x+0.25,-y+0.5', '-z,x+0.25,y+0.25', 'z-0.25,-x+0.5,y+0.25', + '-y,-z+0.5,-x+0.5', '-y,z+0.25,x+0.25', 'y-0.25,-z+0.5,x+0.25', 'y-0.25,z+0.25,-x+0.5', + 'x+0.5,y,z+0.5', '-x+0.75,-y+0.25,z+0.5', 'x+0.5,-y+0.25,-z+0.75', '-x+0.75,y,-z+0.75', + 'z+0.5,x,y+0.5', '-z+0.75,-x+0.25,y+0.5', 'z+0.5,-x+0.25,-y+0.75', '-z+0.75,x,-y+0.75', + 'y+0.5,z,x+0.5', 'y+0.5,-z+0.25,-x+0.75', '-y+0.75,z,-x+0.75', '-y+0.75,-z+0.25,x+0.5', + '-x+0.5,-y,-z+0.5', 'x+0.25,y-0.25,-z+0.5', '-x+0.5,y-0.25,z+0.25', 'x+0.25,-y,z+0.25', + '-z+0.5,-x,-y+0.5', 'z+0.25,x-0.25,-y+0.5', '-z+0.5,x-0.25,y+0.25', 'z+0.25,-x,y+0.25', + '-y+0.5,-z,-x+0.5', '-y+0.5,z-0.25,x+0.25', 'y+0.25,-z,x+0.25', 'y+0.25,z-0.25,-x+0.5', + 'x+0.5,y+0.5,z', '-x+0.75,-y+0.75,z', 'x+0.5,-y+0.75,-z+0.25', '-x+0.75,y+0.5,-z+0.25', + 'z+0.5,x+0.5,y', '-z+0.75,-x+0.75,y', 'z+0.5,-x+0.75,-y+0.25', '-z+0.75,x+0.5,-y+0.25', + 'y+0.5,z+0.5,x', 'y+0.5,-z+0.75,-x+0.25', '-y+0.75,z+0.5,-x+0.25', '-y+0.75,-z+0.75,x', + '-x+0.5,-y+0.5,-z', 'x+0.25,y+0.25,-z', '-x+0.5,y+0.25,z-0.25', 'x+0.25,-y+0.5,z-0.25', + '-z+0.5,-x+0.5,-y', 'z+0.25,x+0.25,-y', '-z+0.5,x+0.25,y-0.25', 'z+0.25,-x+0.5,y-0.25', + '-y+0.5,-z+0.5,-x', '-y+0.5,z+0.25,x-0.25', 'y+0.25,-z+0.5,x-0.25', 'y+0.25,z+0.25,-x'] + ncsym: ['x,y,z', '-x+0.25,-y+0.25,z', 'x,-y+0.25,-z+0.25', '-x+0.25,y,-z+0.25', + 'z,x,y', '-z+0.25,-x+0.25,y', 'z,-x+0.25,-y+0.25', '-z+0.25,x,-y+0.25', 'y,z,x', + 'y,-z+0.25,-x+0.25', '-y+0.25,z,-x+0.25', '-y+0.25,-z+0.25,x', '-x,-y,-z', 'x-0.25,y-0.25,-z', + '-x,y-0.25,z-0.25', 'x-0.25,-y,z-0.25', '-z,-x,-y', 'z-0.25,x-0.25,-y', '-z,x-0.25,y-0.25', + 'z-0.25,-x,y-0.25', '-y,-z,-x', '-y,z-0.25,x-0.25', 'y-0.25,-z,x-0.25', 'y-0.25,z-0.25,-x'] + number: 203 + schoenflies: Th^4 + universal_h_m: F d -3 :2 + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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: + 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:1: + 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 + Pn-3n:2: + crystal_class: cubic + hall: -P 4a 2bc 3 + hermann_mauguin: P n -3 n + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', + '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', + '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x,-y,-z', + 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x,y-0.5,z-0.5', '-y,-x,z-0.5', + 'x-0.5,-y,z-0.5', 'y-0.5,x-0.5,z-0.5', '-z,-x,-y', 'x-0.5,-z,-y', 'z-0.5,x-0.5,-y', + '-x,z-0.5,-y', '-z,x-0.5,y-0.5', '-x,-z,y-0.5', 'z-0.5,-x,y-0.5', 'x-0.5,z-0.5,y-0.5', + '-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-0.5,x-0.5', + 'y-0.5,z-0.5,-x', '-z,y-0.5,-x', 'z-0.5,-y,-x'] + ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', + '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', + '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x,-y,-z', + 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x,y-0.5,z-0.5', '-y,-x,z-0.5', + 'x-0.5,-y,z-0.5', 'y-0.5,x-0.5,z-0.5', '-z,-x,-y', 'x-0.5,-z,-y', 'z-0.5,x-0.5,-y', + '-x,z-0.5,-y', '-z,x-0.5,y-0.5', '-x,-z,y-0.5', 'z-0.5,-x,y-0.5', 'x-0.5,z-0.5,y-0.5', + '-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-0.5,x-0.5', + 'y-0.5,z-0.5,-x', '-z,y-0.5,-x', 'z-0.5,-y,-x'] + number: 222 + schoenflies: Oh^2 + universal_h_m: P n -3 n :2 + 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:1: + 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 + Pn-3m:2: + crystal_class: cubic + hall: -P 4bc 2bc 3 + hermann_mauguin: P n -3 m + symops: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', 'x,-y+0.5,-z+0.5', + 'y+0.5,x+0.5,-z', '-x+0.5,y,-z+0.5', '-y,-x,-z', 'z,x,y', '-x,z+0.5,y+0.5', + '-z+0.5,-x+0.5,y', 'x+0.5,-z,y+0.5', 'z,-x+0.5,-y+0.5', 'x+0.5,z+0.5,-y', '-z+0.5,x,-y+0.5', + '-x,-z,-y', 'y,z,x', 'y,-z+0.5,-x+0.5', 'z+0.5,y+0.5,-x', '-y+0.5,z,-x+0.5', + '-z,-y,-x', '-y+0.5,-z+0.5,x', 'z+0.5,-y,x+0.5', '-z,y+0.5,x+0.5', '-x,-y,-z', + 'y,-x-0.5,-z-0.5', 'x-0.5,y-0.5,-z', '-y-0.5,x,-z-0.5', '-x,y-0.5,z-0.5', '-y-0.5,-x-0.5,z', + 'x-0.5,-y,z-0.5', 'y,x,z', '-z,-x,-y', 'x,-z-0.5,-y-0.5', 'z-0.5,x-0.5,-y', + '-x-0.5,z,-y-0.5', '-z,x-0.5,y-0.5', '-x-0.5,-z-0.5,y', 'z-0.5,-x,y-0.5', 'x,z,y', + '-y,-z,-x', '-y,z-0.5,x-0.5', '-z-0.5,-y-0.5,x', 'y-0.5,-z,x-0.5', 'z,y,x', + 'y-0.5,z-0.5,-x', '-z-0.5,y,-x-0.5', 'z,-y-0.5,-x-0.5'] + ncsym: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', 'x,-y+0.5,-z+0.5', + 'y+0.5,x+0.5,-z', '-x+0.5,y,-z+0.5', '-y,-x,-z', 'z,x,y', '-x,z+0.5,y+0.5', + '-z+0.5,-x+0.5,y', 'x+0.5,-z,y+0.5', 'z,-x+0.5,-y+0.5', 'x+0.5,z+0.5,-y', '-z+0.5,x,-y+0.5', + '-x,-z,-y', 'y,z,x', 'y,-z+0.5,-x+0.5', 'z+0.5,y+0.5,-x', '-y+0.5,z,-x+0.5', + '-z,-y,-x', '-y+0.5,-z+0.5,x', 'z+0.5,-y,x+0.5', '-z,y+0.5,x+0.5', '-x,-y,-z', + 'y,-x-0.5,-z-0.5', 'x-0.5,y-0.5,-z', '-y-0.5,x,-z-0.5', '-x,y-0.5,z-0.5', '-y-0.5,-x-0.5,z', + 'x-0.5,-y,z-0.5', 'y,x,z', '-z,-x,-y', 'x,-z-0.5,-y-0.5', 'z-0.5,x-0.5,-y', + '-x-0.5,z,-y-0.5', '-z,x-0.5,y-0.5', '-x-0.5,-z-0.5,y', 'z-0.5,-x,y-0.5', 'x,z,y', + '-y,-z,-x', '-y,z-0.5,x-0.5', '-z-0.5,-y-0.5,x', 'y-0.5,-z,x-0.5', 'z,y,x', + 'y-0.5,z-0.5,-x', '-z-0.5,y,-x-0.5', 'z,-y-0.5,-x-0.5'] + number: 224 + schoenflies: Oh^4 + universal_h_m: P n -3 m :2 + 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: + 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:1: + 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-3m:2: + crystal_class: cubic + hall: -F 4vw 2vw 3 + hermann_mauguin: F d -3 m + symops: ['x,y,z', '-y,x+0.25,z+0.25', '-x+0.75,-y+0.25,z+0.5', 'y+0.75,-x,z+0.75', + 'x,-y+0.25,-z+0.25', 'y+0.75,x+0.25,-z+0.5', '-x+0.75,y,-z+0.75', '-y,-x,-z', + 'z,x,y', '-x,z+0.25,y+0.25', '-z+0.75,-x+0.25,y+0.5', 'x+0.75,-z,y+0.75', 'z,-x+0.25,-y+0.25', + 'x+0.75,z+0.25,-y+0.5', '-z+0.75,x,-y+0.75', '-x,-z,-y', 'y,z,x', 'y+0.5,-z+0.75,-x+0.25', + 'z+0.25,y+0.75,-x+0.5', '-y+0.25,z+0.5,-x+0.75', '-z,-y+0.5,-x+0.5', '-y+0.25,-z+0.25,x', + 'z+0.25,-y,x+0.25', '-z+0.5,y+0.25,x+0.75', '-x,-y,-z', 'y,-x-0.25,-z-0.25', + 'x-0.75,y-0.25,-z-0.5', '-y-0.75,x,-z-0.75', '-x,y-0.25,z-0.25', '-y-0.75,-x-0.25,z-0.5', + 'x-0.75,-y,z-0.75', 'y,x,z', '-z,-x,-y', 'x,-z-0.25,-y-0.25', 'z-0.75,x-0.25,-y-0.5', + '-x-0.75,z,-y-0.75', '-z,x-0.25,y-0.25', '-x-0.75,-z-0.25,y-0.5', 'z-0.75,-x,y-0.75', + 'x,z,y', '-y,-z,-x', '-y-0.5,z-0.75,x-0.25', '-z-0.25,-y-0.75,x-0.5', 'y-0.25,-z-0.5,x-0.75', + 'z,y-0.5,x-0.5', 'y-0.25,z-0.25,-x', '-z-0.25,y,-x-0.25', 'z-0.5,-y-0.25,-x-0.75', + 'x,y+0.5,z+0.5', '-y,x+0.75,z+0.75', '-x+0.75,-y+0.75,z+1', 'y+0.75,-x+0.5,z+1.25', + 'x,-y+0.75,-z+0.75', 'y+0.75,x+0.75,-z+1', '-x+0.75,y+0.5,-z+1.25', '-y,-x+0.5,-z+0.5', + 'z,x+0.5,y+0.5', '-x,z+0.75,y+0.75', '-z+0.75,-x+0.75,y+1', 'x+0.75,-z+0.5,y+1.25', + 'z,-x+0.75,-y+0.75', 'x+0.75,z+0.75,-y+1', '-z+0.75,x+0.5,-y+1.25', '-x,-z+0.5,-y+0.5', + 'y,z+0.5,x+0.5', 'y+0.5,-z+1.25,-x+0.75', 'z+0.25,y+1.25,-x+1', '-y+0.25,z+1,-x+1.25', + '-z,-y+1,-x+1', '-y+0.25,-z+0.75,x+0.5', 'z+0.25,-y+0.5,x+0.75', '-z+0.5,y+0.75,x+1.25', + '-x,-y+0.5,-z+0.5', 'y,-x+0.25,-z+0.25', 'x-0.75,y+0.25,-z', '-y-0.75,x+0.5,-z-0.25', + '-x,y+0.25,z+0.25', '-y-0.75,-x+0.25,z', 'x-0.75,-y+0.5,z-0.25', 'y,x+0.5,z+0.5', + '-z,-x+0.5,-y+0.5', 'x,-z+0.25,-y+0.25', 'z-0.75,x+0.25,-y', '-x-0.75,z+0.5,-y-0.25', + '-z,x+0.25,y+0.25', '-x-0.75,-z+0.25,y', 'z-0.75,-x+0.5,y-0.25', 'x,z+0.5,y+0.5', + '-y,-z+0.5,-x+0.5', '-y-0.5,z-0.25,x+0.25', '-z-0.25,-y-0.25,x', 'y-0.25,-z,x-0.25', + 'z,y,x', 'y-0.25,z+0.25,-x+0.5', '-z-0.25,y+0.5,-x+0.25', 'z-0.5,-y+0.25,-x-0.25', + 'x+0.5,y,z+0.5', '-y+0.5,x+0.25,z+0.75', '-x+1.25,-y+0.25,z+1', 'y+1.25,-x,z+1.25', + 'x+0.5,-y+0.25,-z+0.75', 'y+1.25,x+0.25,-z+1', '-x+1.25,y,-z+1.25', '-y+0.5,-x,-z+0.5', + 'z+0.5,x,y+0.5', '-x+0.5,z+0.25,y+0.75', '-z+1.25,-x+0.25,y+1', 'x+1.25,-z,y+1.25', + 'z+0.5,-x+0.25,-y+0.75', 'x+1.25,z+0.25,-y+1', '-z+1.25,x,-y+1.25', '-x+0.5,-z,-y+0.5', + 'y+0.5,z,x+0.5', 'y+1,-z+0.75,-x+0.75', 'z+0.75,y+0.75,-x+1', '-y+0.75,z+0.5,-x+1.25', + '-z+0.5,-y+0.5,-x+1', '-y+0.75,-z+0.25,x+0.5', 'z+0.75,-y,x+0.75', '-z+1,y+0.25,x+1.25', + '-x+0.5,-y,-z+0.5', 'y+0.5,-x-0.25,-z+0.25', 'x-0.25,y-0.25,-z', '-y-0.25,x,-z-0.25', + '-x+0.5,y-0.25,z+0.25', '-y-0.25,-x-0.25,z', 'x-0.25,-y,z-0.25', 'y+0.5,x,z+0.5', + '-z+0.5,-x,-y+0.5', 'x+0.5,-z-0.25,-y+0.25', 'z-0.25,x-0.25,-y', '-x-0.25,z,-y-0.25', + '-z+0.5,x-0.25,y+0.25', '-x-0.25,-z-0.25,y', 'z-0.25,-x,y-0.25', 'x+0.5,z,y+0.5', + '-y+0.5,-z,-x+0.5', '-y,z-0.75,x+0.25', '-z+0.25,-y-0.75,x', 'y+0.25,-z-0.5,x-0.25', + 'z+0.5,y-0.5,x', 'y+0.25,z-0.25,-x+0.5', '-z+0.25,y,-x+0.25', 'z,-y-0.25,-x-0.25', + 'x+0.5,y+0.5,z', '-y+0.5,x+0.75,z+0.25', '-x+1.25,-y+0.75,z+0.5', 'y+1.25,-x+0.5,z+0.75', + 'x+0.5,-y+0.75,-z+0.25', 'y+1.25,x+0.75,-z+0.5', '-x+1.25,y+0.5,-z+0.75', '-y+0.5,-x+0.5,-z', + 'z+0.5,x+0.5,y', '-x+0.5,z+0.75,y+0.25', '-z+1.25,-x+0.75,y+0.5', 'x+1.25,-z+0.5,y+0.75', + 'z+0.5,-x+0.75,-y+0.25', 'x+1.25,z+0.75,-y+0.5', '-z+1.25,x+0.5,-y+0.75', '-x+0.5,-z+0.5,-y', + 'y+0.5,z+0.5,x', 'y+1,-z+1.25,-x+0.25', 'z+0.75,y+1.25,-x+0.5', '-y+0.75,z+1,-x+0.75', + '-z+0.5,-y+1,-x+0.5', '-y+0.75,-z+0.75,x', 'z+0.75,-y+0.5,x+0.25', '-z+1,y+0.75,x+0.75', + '-x+0.5,-y+0.5,-z', 'y+0.5,-x+0.25,-z-0.25', 'x-0.25,y+0.25,-z-0.5', '-y-0.25,x+0.5,-z-0.75', + '-x+0.5,y+0.25,z-0.25', '-y-0.25,-x+0.25,z-0.5', 'x-0.25,-y+0.5,z-0.75', 'y+0.5,x+0.5,z', + '-z+0.5,-x+0.5,-y', 'x+0.5,-z+0.25,-y-0.25', 'z-0.25,x+0.25,-y-0.5', '-x-0.25,z+0.5,-y-0.75', + '-z+0.5,x+0.25,y-0.25', '-x-0.25,-z+0.25,y-0.5', 'z-0.25,-x+0.5,y-0.75', 'x+0.5,z+0.5,y', + '-y+0.5,-z+0.5,-x', '-y,z-0.25,x-0.25', '-z+0.25,-y-0.25,x-0.5', 'y+0.25,-z,x-0.75', + 'z+0.5,y,x-0.5', 'y+0.25,z+0.25,-x', '-z+0.25,y+0.5,-x-0.25', 'z,-y+0.25,-x-0.75'] + ncsym: ['x,y,z', '-y,x+0.25,z+0.25', '-x+0.75,-y+0.25,z+0.5', 'y+0.75,-x,z+0.75', + 'x,-y+0.25,-z+0.25', 'y+0.75,x+0.25,-z+0.5', '-x+0.75,y,-z+0.75', '-y,-x,-z', + 'z,x,y', '-x,z+0.25,y+0.25', '-z+0.75,-x+0.25,y+0.5', 'x+0.75,-z,y+0.75', 'z,-x+0.25,-y+0.25', + 'x+0.75,z+0.25,-y+0.5', '-z+0.75,x,-y+0.75', '-x,-z,-y', 'y,z,x', 'y+0.5,-z+0.75,-x+0.25', + 'z+0.25,y+0.75,-x+0.5', '-y+0.25,z+0.5,-x+0.75', '-z,-y+0.5,-x+0.5', '-y+0.25,-z+0.25,x', + 'z+0.25,-y,x+0.25', '-z+0.5,y+0.25,x+0.75', '-x,-y,-z', 'y,-x-0.25,-z-0.25', + 'x-0.75,y-0.25,-z-0.5', '-y-0.75,x,-z-0.75', '-x,y-0.25,z-0.25', '-y-0.75,-x-0.25,z-0.5', + 'x-0.75,-y,z-0.75', 'y,x,z', '-z,-x,-y', 'x,-z-0.25,-y-0.25', 'z-0.75,x-0.25,-y-0.5', + '-x-0.75,z,-y-0.75', '-z,x-0.25,y-0.25', '-x-0.75,-z-0.25,y-0.5', 'z-0.75,-x,y-0.75', + 'x,z,y', '-y,-z,-x', '-y-0.5,z-0.75,x-0.25', '-z-0.25,-y-0.75,x-0.5', 'y-0.25,-z-0.5,x-0.75', + 'z,y-0.5,x-0.5', 'y-0.25,z-0.25,-x', '-z-0.25,y,-x-0.25', 'z-0.5,-y-0.25,-x-0.75'] + number: 227 + schoenflies: Oh^7 + universal_h_m: F d -3 m :2 + Fd-3c:1: + 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 + Fd-3c:2: + crystal_class: cubic + hall: -F 4ud 2vw 3 + hermann_mauguin: F d -3 c + symops: ['x,y,z', '-y+0.5,x+0.25,z+0.25', '-x+0.25,-y+0.75,z+0.5', 'y+0.75,-x+0.5,z+0.75', + 'x,-y+0.25,-z+0.25', 'y+0.25,x+0.25,-z+0.5', '-x+0.25,y+0.5,-z+0.75', '-y,-x+0.5,-z', + 'z,x,y', '-x+0.5,z+0.25,y+0.25', '-z+0.25,-x+0.75,y+0.5', 'x+0.75,-z+0.5,y+0.75', + 'z,-x+0.25,-y+0.25', 'x+0.25,z+0.25,-y+0.5', '-z+0.25,x+0.5,-y+0.75', '-x,-z+0.5,-y', + 'y,z,x', 'y+0.5,-z+0.25,-x+0.75', 'z+0.25,y+0.75,-x', '-y+0.75,z+0.5,-x+0.25', + '-z+0.5,-y+0.5,-x+0.5', '-y+0.25,-z+0.25,x', 'z+0.25,-y,x+0.75', '-z,y+0.75,x+0.25', + '-x,-y,-z', 'y-0.5,-x-0.25,-z-0.25', 'x-0.25,y-0.75,-z-0.5', '-y-0.75,x-0.5,-z-0.75', + '-x,y-0.25,z-0.25', '-y-0.25,-x-0.25,z-0.5', 'x-0.25,-y-0.5,z-0.75', 'y,x-0.5,z', + '-z,-x,-y', 'x-0.5,-z-0.25,-y-0.25', 'z-0.25,x-0.75,-y-0.5', '-x-0.75,z-0.5,-y-0.75', + '-z,x-0.25,y-0.25', '-x-0.25,-z-0.25,y-0.5', 'z-0.25,-x-0.5,y-0.75', 'x,z-0.5,y', + '-y,-z,-x', '-y-0.5,z-0.25,x-0.75', '-z-0.25,-y-0.75,x', 'y-0.75,-z-0.5,x-0.25', + 'z-0.5,y-0.5,x-0.5', 'y-0.25,z-0.25,-x', '-z-0.25,y,-x-0.75', 'z,-y-0.75,-x-0.25', + 'x,y+0.5,z+0.5', '-y+0.5,x+0.75,z+0.75', '-x+0.25,-y+1.25,z+1', 'y+0.75,-x+1,z+1.25', + 'x,-y+0.75,-z+0.75', 'y+0.25,x+0.75,-z+1', '-x+0.25,y+1,-z+1.25', '-y,-x+1,-z+0.5', + 'z,x+0.5,y+0.5', '-x+0.5,z+0.75,y+0.75', '-z+0.25,-x+1.25,y+1', 'x+0.75,-z+1,y+1.25', + 'z,-x+0.75,-y+0.75', 'x+0.25,z+0.75,-y+1', '-z+0.25,x+1,-y+1.25', '-x,-z+1,-y+0.5', + 'y,z+0.5,x+0.5', 'y+0.5,-z+0.75,-x+1.25', 'z+0.25,y+1.25,-x+0.5', '-y+0.75,z+1,-x+0.75', + '-z+0.5,-y+1,-x+1', '-y+0.25,-z+0.75,x+0.5', 'z+0.25,-y+0.5,x+1.25', '-z,y+1.25,x+0.75', + '-x,-y+0.5,-z+0.5', 'y-0.5,-x+0.25,-z+0.25', 'x-0.25,y-0.25,-z', '-y-0.75,x,-z-0.25', + '-x,y+0.25,z+0.25', '-y-0.25,-x+0.25,z', 'x-0.25,-y,z-0.25', 'y,x,z+0.5', '-z,-x+0.5,-y+0.5', + 'x-0.5,-z+0.25,-y+0.25', 'z-0.25,x-0.25,-y', '-x-0.75,z,-y-0.25', '-z,x+0.25,y+0.25', + '-x-0.25,-z+0.25,y', 'z-0.25,-x,y-0.25', 'x,z,y+0.5', '-y,-z+0.5,-x+0.5', '-y-0.5,z+0.25,x-0.25', + '-z-0.25,-y-0.25,x+0.5', 'y-0.75,-z,x+0.25', 'z-0.5,y,x', 'y-0.25,z+0.25,-x+0.5', + '-z-0.25,y+0.5,-x-0.25', 'z,-y-0.25,-x+0.25', 'x+0.5,y,z+0.5', '-y+1,x+0.25,z+0.75', + '-x+0.75,-y+0.75,z+1', 'y+1.25,-x+0.5,z+1.25', 'x+0.5,-y+0.25,-z+0.75', 'y+0.75,x+0.25,-z+1', + '-x+0.75,y+0.5,-z+1.25', '-y+0.5,-x+0.5,-z+0.5', 'z+0.5,x,y+0.5', '-x+1,z+0.25,y+0.75', + '-z+0.75,-x+0.75,y+1', 'x+1.25,-z+0.5,y+1.25', 'z+0.5,-x+0.25,-y+0.75', 'x+0.75,z+0.25,-y+1', + '-z+0.75,x+0.5,-y+1.25', '-x+0.5,-z+0.5,-y+0.5', 'y+0.5,z,x+0.5', 'y+1,-z+0.25,-x+1.25', + 'z+0.75,y+0.75,-x+0.5', '-y+1.25,z+0.5,-x+0.75', '-z+1,-y+0.5,-x+1', '-y+0.75,-z+0.25,x+0.5', + 'z+0.75,-y,x+1.25', '-z+0.5,y+0.75,x+0.75', '-x+0.5,-y,-z+0.5', 'y,-x-0.25,-z+0.25', + 'x+0.25,y-0.75,-z', '-y-0.25,x-0.5,-z-0.25', '-x+0.5,y-0.25,z+0.25', '-y+0.25,-x-0.25,z', + 'x+0.25,-y-0.5,z-0.25', 'y+0.5,x-0.5,z+0.5', '-z+0.5,-x,-y+0.5', 'x,-z-0.25,-y+0.25', + 'z+0.25,x-0.75,-y', '-x-0.25,z-0.5,-y-0.25', '-z+0.5,x-0.25,y+0.25', '-x+0.25,-z-0.25,y', + 'z+0.25,-x-0.5,y-0.25', 'x+0.5,z-0.5,y+0.5', '-y+0.5,-z,-x+0.5', '-y,z-0.25,x-0.25', + '-z+0.25,-y-0.75,x+0.5', 'y-0.25,-z-0.5,x+0.25', 'z,y-0.5,x', 'y+0.25,z-0.25,-x+0.5', + '-z+0.25,y,-x-0.25', 'z+0.5,-y-0.75,-x+0.25', 'x+0.5,y+0.5,z', '-y+1,x+0.75,z+0.25', + '-x+0.75,-y+1.25,z+0.5', 'y+1.25,-x+1,z+0.75', 'x+0.5,-y+0.75,-z+0.25', 'y+0.75,x+0.75,-z+0.5', + '-x+0.75,y+1,-z+0.75', '-y+0.5,-x+1,-z', 'z+0.5,x+0.5,y', '-x+1,z+0.75,y+0.25', + '-z+0.75,-x+1.25,y+0.5', 'x+1.25,-z+1,y+0.75', 'z+0.5,-x+0.75,-y+0.25', 'x+0.75,z+0.75,-y+0.5', + '-z+0.75,x+1,-y+0.75', '-x+0.5,-z+1,-y', 'y+0.5,z+0.5,x', 'y+1,-z+0.75,-x+0.75', + 'z+0.75,y+1.25,-x', '-y+1.25,z+1,-x+0.25', '-z+1,-y+1,-x+0.5', '-y+0.75,-z+0.75,x', + 'z+0.75,-y+0.5,x+0.75', '-z+0.5,y+1.25,x+0.25', '-x+0.5,-y+0.5,-z', 'y,-x+0.25,-z-0.25', + 'x+0.25,y-0.25,-z-0.5', '-y-0.25,x,-z-0.75', '-x+0.5,y+0.25,z-0.25', '-y+0.25,-x+0.25,z-0.5', + 'x+0.25,-y,z-0.75', 'y+0.5,x,z', '-z+0.5,-x+0.5,-y', 'x,-z+0.25,-y-0.25', 'z+0.25,x-0.25,-y-0.5', + '-x-0.25,z,-y-0.75', '-z+0.5,x+0.25,y-0.25', '-x+0.25,-z+0.25,y-0.5', 'z+0.25,-x,y-0.75', + 'x+0.5,z,y', '-y+0.5,-z+0.5,-x', '-y,z+0.25,x-0.75', '-z+0.25,-y-0.25,x', 'y-0.25,-z,x-0.25', + 'z,y,x-0.5', 'y+0.25,z+0.25,-x', '-z+0.25,y+0.5,-x-0.75', 'z+0.5,-y-0.25,-x-0.25'] + ncsym: ['x,y,z', '-y+0.5,x+0.25,z+0.25', '-x+0.25,-y+0.75,z+0.5', 'y+0.75,-x+0.5,z+0.75', + 'x,-y+0.25,-z+0.25', 'y+0.25,x+0.25,-z+0.5', '-x+0.25,y+0.5,-z+0.75', '-y,-x+0.5,-z', + 'z,x,y', '-x+0.5,z+0.25,y+0.25', '-z+0.25,-x+0.75,y+0.5', 'x+0.75,-z+0.5,y+0.75', + 'z,-x+0.25,-y+0.25', 'x+0.25,z+0.25,-y+0.5', '-z+0.25,x+0.5,-y+0.75', '-x,-z+0.5,-y', + 'y,z,x', 'y+0.5,-z+0.25,-x+0.75', 'z+0.25,y+0.75,-x', '-y+0.75,z+0.5,-x+0.25', + '-z+0.5,-y+0.5,-x+0.5', '-y+0.25,-z+0.25,x', 'z+0.25,-y,x+0.75', '-z,y+0.75,x+0.25', + '-x,-y,-z', 'y-0.5,-x-0.25,-z-0.25', 'x-0.25,y-0.75,-z-0.5', '-y-0.75,x-0.5,-z-0.75', + '-x,y-0.25,z-0.25', '-y-0.25,-x-0.25,z-0.5', 'x-0.25,-y-0.5,z-0.75', 'y,x-0.5,z', + '-z,-x,-y', 'x-0.5,-z-0.25,-y-0.25', 'z-0.25,x-0.75,-y-0.5', '-x-0.75,z-0.5,-y-0.75', + '-z,x-0.25,y-0.25', '-x-0.25,-z-0.25,y-0.5', 'z-0.25,-x-0.5,y-0.75', 'x,z-0.5,y', + '-y,-z,-x', '-y-0.5,z-0.25,x-0.75', '-z-0.25,-y-0.75,x', 'y-0.75,-z-0.5,x-0.25', + 'z-0.5,y-0.5,x-0.5', 'y-0.25,z-0.25,-x', '-z-0.25,y,-x-0.75', 'z,-y-0.75,-x-0.25'] + number: 228 + schoenflies: Oh^8 + universal_h_m: F d -3 c :2 + 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: + 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 + C1: + crystal_class: triclinic + hall: P 1 (1/2*x+1/2*y,1/2*x-1/2*y,-z) + hermann_mauguin: C 1 + symops: ['x,y,z', '+0.5+x,+0.5+y,z'] + ncsym: ['x, y, z'] + number: 1 + schoenflies: C1^1 + universal_h_m: C 1 + A-1: + crystal_class: triclinic + hall: -P 1 (-x,-1/2*y+1/2*z,1/2*y+1/2*z) + hermann_mauguin: A -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: 2 + schoenflies: Ci^1 + universal_h_m: A -1 + B-1: + crystal_class: triclinic + hall: -P 1 (-1/2*x+1/2*z,-y,1/2*x+1/2*z) + hermann_mauguin: B -1 + 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, -y, -z'] + number: 2 + schoenflies: Ci^1 + universal_h_m: B -1 + I-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 + symops: ['x,y,z', '+0.5-x,+0.5-y,+0.5-z', '+0.5+x,+0.5+y,+0.5+z', '-x,-y,-z'] + ncsym: ['x,y,z', '-x,-y,-z'] + number: 2 + schoenflies: D2^4 + universal_h_m: I -1 + R12/c1: + 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) + symops: ['x, y, z', 'y, x, -z+0.5', 'x+0.667, y+0.333, z+0.333', 'y+0.667, x+0.333, + -z+0.833', 'x+0.333, y+0.667, z+0.667', 'y+0.333, x+0.667, -z+1.17', '-x, + -y, -z', '-y, -x, z-0.5', '-x+0.667, -y+0.333, -z+0.333', '-y+0.667, -x+0.333, + z-0.167', '-x+0.333, -y+0.667, -z+0.667', '-y+0.333, -x+0.667, z+0.167'] + ncsym: ['x, y, z', 'y, x, -z+0.5', '-x, -y, -z', '-y, -x, z-0.5'] + number: 15 + schoenflies: C2h^6 + universal_h_m: R 1 2/c 1 + P212121(originshiftx,y,z+1/4): + 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) + symops: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x+0.5,-y,z+0.5'] + number: 19 + schoenflies: D2^4 + universal_h_m: P 21 21 21 (origin shift x,y,z+1/4) + B1211: + crystal_class: monoclinic + hall: P 2yb (1/2*x,y,-1/2*x+z) + hermann_mauguin: B 1 21 1 + symops: ['x, y, z', '-x, y+0.5, -z', 'x+0.5, y, z+0.5', '-x+0.5, y+0.5, -z+0.5'] + ncsym: ['x, y, z', '-x, y+0.5, -z'] + number: 4 + schoenflies: C2^2 + universal_h_m: B 1 21 1 + C-1: + crystal_class: triclinic + hall: -P 1 (1/2*x+1/2*y,1/2*x-1/2*y,-z) + hermann_mauguin: C -1 + symops: ['x, y, z', 'x+0.5, y+0.5, z', '-x, -y, -z', '-x+0.5, -y+0.5, -z'] + ncsym: ['x, y, z', '-x, -y, -z'] + number: 2 + schoenflies: Ci^1 + universal_h_m: C -1 + B121/m1: + crystal_class: monoclinic + hall: -P 2yb (1/2*x,y,-1/2*x+z) + hermann_mauguin: B 1 21/m 1 + symops: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y-0.5,z', 'x+0.5,y,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'] + ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y-0.5,z', 'x+0.5,y,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'] + number: 11 + schoenflies: C2h^2 + universal_h_m: B 1 21/m 1 + P1(-a,-b+c,b+c): + 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) + symops: ['x,y,z', 'x,y+0.5,z+0.5'] + ncsym: ['x,y,z'] + number: 1 + schoenflies: C1^1 + universal_h_m: P 1 (-a,-b+c,b+c) + P1(-a+c,-b,a+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) + symops: ['x,y,z', 'x+0.5,y,z+0.5'] + ncsym: ['x,y,z'] + number: 1 + schoenflies: C1^1 + universal_h_m: P 1 (-a+c,-b,a+c) + P1(b+c,a+c,a+b): + 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) + symops: ['x,y,z', 'x+0.5,y+0.5,z+0.5'] + ncsym: ['x,y,z'] + number: 1 + schoenflies: C1^1 + universal_h_m: P 1 (b+c,a+c,a+b) + P1(-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) + symops: ['x,y,z', 'x,y+0.5,z+0.5', 'x+0.5,y,z+0.5', 'x+0.5,y+0.5,z'] + ncsym: ['x,y,z'] + number: 1 + schoenflies: C1^1 + universal_h_m: P 1 (-a+b+c,a-b+c,a+b-c) + 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) + symops: ['x,y,z', '-x,-y,-z', '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+0.5,z', '-x+0.5,-y+0.5,-z'] + ncsym: ['x,y,z', '-x,-y,-z'] + number: 2 + schoenflies: Ci^1 + universal_h_m: P -1 (-a+b+c,a-b+c,a+b-c) + P121(2*a+c,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) + symops: ['x,y,z', '-x,y,-z', 'x+0.5,y,z+0.5', '-x+0.5,y,-z+0.5'] + ncsym: ['x,y,z', '-x,y,-z'] + number: 3 + schoenflies: C2^1 + universal_h_m: P 1 2 1 (2*a+c,b,c) + C121(a,b,a+2*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) + symops: ['x,y,z', '-x,y,-z', '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,y+0.5,z+0.5', '-x,y+0.5,-z+0.5'] + ncsym: ['x,y,z', '-x,y,-z'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (a,b,a+2*c) + P121(c,2*a+c,b): + 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) + 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: 3 + schoenflies: C2^1 + universal_h_m: P 1 2 1 (c,2*a+c,b) + C121(a+2*c,a,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) + 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,z+0.5', '-x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (a+2*c,a,b) + C121(c-1/4,b-1/4,-a): + 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) + symops: ['x,y,z', '-x,y,-z+0.5', 'x,y+0.5,z+0.5', '-x,y+0.5,-z'] + ncsym: ['x,y,z', '-x,y+0.5,-z'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (c-1/4,b-1/4,-a) + C121(a-1/4,b-1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,y,-z', 'x+0.5,y+0.5,z', '-x,y+0.5,-z'] + ncsym: ['x,y,z', '-x,y+0.5,-z'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (a-1/4,b-1/4,c) + C121(a+c-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) + 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'] + ncsym: ['x,y,z', '-x,y+0.5,-z'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (a+c-1/4,b-1/4,c) + C121(a-1/4,b-1/4,a+2*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) + symops: ['x,y,z', '-x+0.5,y,-z', 'x+0.5,y,z+0.5', '-x,y,-z+0.5', 'x+0.5,y+0.5,z', + '-x,y+0.5,-z', 'x,y+0.5,z+0.5', '-x+0.5,y+0.5,-z+0.5'] + ncsym: ['x,y,z', '-x,y+0.5,-z'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (a-1/4,b-1/4,a+2*c) + C121(c-1/4,a-1/4,b): + 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) + symops: ['x,y,z', '-x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (c-1/4,a-1/4,b) + C121(-a-1/4,c-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) + symops: ['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,-y,z+0.5'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (-a-1/4,c-1/4,b) + P1211(c,2*a+c,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) + 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: 4 + schoenflies: C2^2 + universal_h_m: P 1 21 1 (c,2*a+c,b) + C121(c-1/4,a+c-1/4,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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', '-x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (c-1/4,a+c-1/4,b) + C121(a+2*c-1/4,a-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) + symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,y+0.5,z', '-x+0.5,-y,z', 'x,y+0.5,z+0.5', + '-x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x+0.5,-y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5'] + number: 5 + schoenflies: C2^3 + universal_h_m: C 1 2 1 (a+2*c-1/4,a-1/4,b) + P1m1(2*a+c,b,c): + 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) + symops: ['x,y,z', 'x,-y,z', 'x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', 'x,-y,z'] + number: 6 + schoenflies: Cs^1 + universal_h_m: P 1 m 1 (2*a+c,b,c) + C1m1(a,b,a+2*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) + symops: ['x,y,z', 'x,-y,z', '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,y+0.5,z+0.5', 'x,-y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x,-y,z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (a,b,a+2*c) + P1m1(c,2*a+c,b): + 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) + 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: 6 + schoenflies: Cs^1 + universal_h_m: P 1 m 1 (c,2*a+c,b) + C1m1(a+2*c,a,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) + 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,z+0.5', 'x+0.5,y,-z+0.5'] + ncsym: ['x,y,z', 'x,y,-z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (a+2*c,a,b) + P1m1(b,c,2*a+c): + 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) + 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'] + number: 6 + schoenflies: Cs^1 + universal_h_m: P 1 m 1 (b,c,2*a+c) + C1m1(b,a+2*c,a): + 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) + symops: ['x,y,z', '-x,y,z', '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+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 (b,a+2*c,a) + C1m1(c-1/4,b-1/4,-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) + symops: ['x,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', 'x,-y,z+0.5'] + ncsym: ['x,y,z', 'x,-y,z+0.5'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (c-1/4,b-1/4,-a) + P1c1(2*a+c,b,c): + 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) + 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'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P 1 c 1 (2*a+c,b,c) + C1m1(a-1/4,b-1/4,a+2*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) + symops: ['x,y,z', 'x,-y+0.5,z', 'x+0.5,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', + 'x+0.5,-y,z', 'x,y+0.5,z+0.5', 'x,-y,z+0.5'] + ncsym: ['x,y,z', 'x,-y,z+0.5'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (a-1/4,b-1/4,a+2*c) + C1m1(a+c-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 m 1 (a+c-1/4,b-1/4,c) + symops: ['x,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,-y,z+0.5'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (a+c-1/4,b-1/4,c) + C1m1(a-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) + symops: ['x,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', 'x+0.5,-y,z'] + ncsym: ['x,y,z', 'x+0.5,-y,z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (a-1/4,b-1/4,c) + C1m1(-a-1/4,c-1/4,b): + 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) + 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+0.5,y,-z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (-a-1/4,c-1/4,b) + P1c1(c,2*a+c,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) + symops: ['x,y,z', 'x+0.5,y,-z', 'x+0.5,y+0.5,z', 'x,y+0.5,-z'] + ncsym: ['x,y,z', 'x+0.5,y,-z'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P 1 c 1 (c,2*a+c,b) + C1m1(a+2*c-1/4,a-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 m 1 (a+2*c-1/4,a-1/4,b) + 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', 'x,y+0.5,z+0.5', + 'x,y+0.5,-z', 'x+0.5,y,z+0.5', 'x+0.5,y,-z'] + ncsym: ['x,y,z', 'x+0.5,y,-z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (a+2*c-1/4,a-1/4,b) + C1m1(c-1/4,a+c-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) + 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+0.5,y+0.5,-z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (c-1/4,a+c-1/4,b) + C1m1(c-1/4,a-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) + symops: ['x,y,z', 'x,y,-z+0.5', 'x,y+0.5,z+0.5', 'x,y+0.5,-z'] + ncsym: ['x,y,z', 'x,y+0.5,-z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (c-1/4,a-1/4,b) + P1c1(b,c,2*a+c): + 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) + symops: ['x,y,z', '-x,y+0.5,z', 'x,y+0.5,z+0.5', '-x,y,z+0.5'] + ncsym: ['x,y,z', '-x,y+0.5,z'] + number: 7 + schoenflies: Cs^2 + universal_h_m: P 1 c 1 (b,c,2*a+c) + C1m1(b-1/4,-a-1/4,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) + symops: ['x,y,z', '-x+0.5,y,z', 'x+0.5,y+0.5,z', '-x,y+0.5,z'] + ncsym: ['x,y,z', '-x,y+0.5,z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (b-1/4,-a-1/4,c) + C1m1(b-1/4,a+2*c-1/4,a): + 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) + 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+0.5,y,z+0.5', + '-x,y,z+0.5', 'x+0.5,y+0.5,z', '-x,y+0.5,z'] + ncsym: ['x,y,z', '-x,y+0.5,z'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (b-1/4,a+2*c-1/4,a) + C1m1(b-1/4,c-1/4,a+c): + 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) + symops: ['x,y,z', '-x+0.5,y,z', 'x+0.5,y+0.5,z+0.5', '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,y+0.5,z+0.5'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (b-1/4,c-1/4,a+c) + C1m1(b-1/4,c-1/4,a): + 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) + symops: ['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,y,z+0.5'] + number: 8 + schoenflies: Cs^3 + universal_h_m: C 1 m 1 (b-1/4,c-1/4,a) + P12/m1(2*a+c,b,c): + 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) + 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'] + 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 (2*a+c,b,c) + C12/m1(a,b,a+2*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) + 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,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: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (a,b,a+2*c) + P12/m1(c,2*a+c,b): + 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) + 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: 10 + schoenflies: C2h^1 + universal_h_m: P 1 2/m 1 (c,2*a+c,b) + C12/m1(a+2*c,a,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) + 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', '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'] + 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 (a+2*c,a,b) + P12/m1(b,c,2*a+c): + 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) + 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: 10 + schoenflies: C2h^1 + universal_h_m: P 1 2/m 1 (b,c,2*a+c) + C12/m1(b,a+2*c,a): + 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) + 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: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (b,a+2*c,a) + C12/m1(c-1/4,b+1/4,-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) + symops: ['x,y,z', '-x,y,-z+0.5', '-x,-y+0.5,-z+0.5', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', + '-x,y+0.5,-z', '-x,-y,-z', 'x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y+0.5,z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (c-1/4,b+1/4,-a) + C12/m1(a-1/4,b+1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,y,-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', '-x,-y,-z', 'x+0.5,-y,z'] + ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y+0.5,z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (a-1/4,b+1/4,c) + C12/m1(a+c-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) + 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+0.5,y+0.5,z+0.5', + '-x,y+0.5,-z', '-x,-y,-z', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y+0.5,z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (a+c-1/4,b+1/4,c) + C12/m1(a-1/4,b+1/4,a+2*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) + symops: ['x,y,z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', 'x,-y+0.5,z', 'x+0.5,y,z+0.5', + '-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+0.5,z', '-x,y+0.5,-z', + '-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+0.5,-y,-z+0.5', + 'x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y+0.5,z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (a-1/4,b+1/4,a+2*c) + C12/m1(c-1/4,a+1/4,b): + 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) + symops: ['x,y,z', '-x,-y+0.5,z', '-x,-y+0.5,-z+0.5', 'x,y,-z+0.5', 'x,y+0.5,z+0.5', + '-x,-y,z+0.5', '-x,-y,-z', 'x,y+0.5,-z'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,-y,-z', 'x,y,-z+0.5'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (c-1/4,a+1/4,b) + C12/m1(-a-1/4,c+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) + symops: ['x,y,z', '-x+0.5,-y,z', '-x+0.5,-y,-z+0.5', 'x,y,-z+0.5', 'x+0.5,y,z+0.5', + '-x,-y,z+0.5', '-x,-y,-z', 'x+0.5,y,-z'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,-y,-z', 'x,y,-z+0.5'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (-a-1/4,c+1/4,b) + P121/m1(c,2*a+c,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) + 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: 11 + schoenflies: C2h^2 + universal_h_m: P 1 21/m 1 (c,2*a+c,b) + C12/m1(c-1/4,a+c+1/4,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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x+0.5,-y+0.5,-z+0.5', 'x,y,-z+0.5', 'x+0.5,y+0.5,z+0.5', + '-x,-y,z+0.5', '-x,-y,-z', 'x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,-y,-z', 'x,y,-z+0.5'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (c-1/4,a+c+1/4,b) + C12/m1(a+2*c-1/4,a+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) + symops: ['x,y,z', '-x,-y+0.5,z', '-x,-y+0.5,-z+0.5', 'x,y,-z+0.5', 'x+0.5,y+0.5,z', + '-x+0.5,-y,z', '-x+0.5,-y,-z+0.5', 'x+0.5,y+0.5,-z+0.5', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', + '-x,-y,-z', 'x,y+0.5,-z', 'x+0.5,y,z+0.5', '-x+0.5,-y+0.5,z+0.5', '-x+0.5,-y+0.5,-z', + 'x+0.5,y,-z'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,-y,-z', 'x,y,-z+0.5'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (a+2*c-1/4,a+1/4,b) + P121/m1(b,c,2*a+c): + 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) + symops: ['x,y,z', 'x+0.5,-y,-z', '-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+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,-z', '-x+0.5,y,z'] + number: 11 + schoenflies: C2h^2 + universal_h_m: P 1 21/m 1 (b,c,2*a+c) + C12/m1(b-1/4,c+1/4,a): + 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) + symops: ['x,y,z', 'x,-y,-z+0.5', '-x+0.5,-y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y,z+0.5', + 'x+0.5,-y,-z', '-x,-y,-z', '-x,y,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x+0.5,y,z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (b-1/4,c+1/4,a) + C12/m1(b-1/4,-a+1/4,c): + 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) + symops: ['x,y,z', 'x,-y+0.5,-z', '-x+0.5,-y+0.5,-z', '-x+0.5,y,z', 'x+0.5,y+0.5,z', + 'x+0.5,-y,-z', '-x,-y,-z', '-x,y+0.5,z'] + ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x+0.5,y,z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (b-1/4,-a+1/4,c) + C12/m1(b-1/4,c+1/4,a+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) + symops: ['x,y,z', 'x,-y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,z', 'x+0.5,y+0.5,z+0.5', + 'x+0.5,-y,-z', '-x,-y,-z', '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x+0.5,y,z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (b-1/4,c+1/4,a+c) + C12/m1(b-1/4,a+2*c+1/4,a): + 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) + symops: ['x,y,z', 'x,-y,-z+0.5', '-x+0.5,-y,-z+0.5', '-x+0.5,y,z', 'x,y+0.5,z+0.5', + 'x,-y+0.5,-z', '-x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,y,z+0.5', 'x+0.5,-y,-z', + '-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,-y+0.5,-z+0.5', + '-x,y+0.5,z'] + ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x+0.5,y,z'] + number: 12 + schoenflies: C2h^3 + universal_h_m: C 1 2/m 1 (b-1/4,a+2*c+1/4,a) + P12/c1(2*a+c,b,c): + 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) + symops: ['x,y,z', '-x,y,-z+0.5', '-x,-y,-z', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x+0.5,y,-z', + '-x+0.5,-y,-z+0.5', 'x+0.5,-y,z'] + 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 (2*a+c,b,c) + P12/c1(c,2*a+c,b): + 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) + symops: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x+0.5,y,-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'] + number: 13 + schoenflies: C2h^4 + universal_h_m: P 1 2/c 1 (c,2*a+c,b) + P12/c1(b,c,2*a+c): + 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) + symops: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y+0.5,z', 'x,y+0.5,z+0.5', 'x,-y,-z+0.5', + '-x,-y+0.5,-z+0.5', '-x,y,z+0.5'] + ncsym: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y+0.5,z'] + number: 13 + schoenflies: C2h^4 + universal_h_m: P 1 2/c 1 (b,c,2*a+c) + P121/c1(2*a+c,b,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) + symops: ['x,y,z', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'x,-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+0.5', 'x+0.5,-y+0.5,z'] + 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 (2*a+c,b,c) + P121/c1(c,2*a+c,b): + 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) + symops: ['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,-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'] + number: 14 + schoenflies: C2h^5 + universal_h_m: P 1 21/c 1 (c,2*a+c,b) + P121/c1(b,c,2*a+c): + 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) + symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x+0.5,y+0.5,z', 'x,y+0.5,z+0.5', + 'x+0.5,-y,-z+0.5', '-x,-y+0.5,-z+0.5', '-x+0.5,y,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x+0.5,y+0.5,z'] + number: 14 + schoenflies: C2h^5 + universal_h_m: P 1 21/c 1 (b,c,2*a+c) + Amm2(a,b+1/4,c-1/4): + 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) + symops: ['x,y,z', '-x,-y+0.5,z', '-x,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', + '-x,y+0.5,z+0.5', 'x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5'] + number: 38 + schoenflies: C2v^14 + universal_h_m: A m m 2 (a,b+1/4,c-1/4) + Aem2(b,-a+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) + symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,z', '-x,y,z', 'x+0.5,y,z+0.5', '-x,-y,z+0.5', + 'x,-y,z+0.5', '-x+0.5,y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5'] + number: 39 + schoenflies: C2v^15 + universal_h_m: A e m 2 (b,-a+1/4,c-1/4) + Ima2(a-1/4,b-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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,y,z', 'x+0.5,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', + '-x,-y,z+0.5', '-x+0.5,y+0.5,z+0.5', 'x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5'] + number: 46 + schoenflies: C2v^22 + universal_h_m: I m a 2 (a-1/4,b-1/4,c+1/4) + Fmm2(a,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) + symops: ['x,y,z', '-x,-y+0.5,z', '-x,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', + '-x,y+0.5,z+0.5', 'x,-y,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', + 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y,z', '-x+0.5,y+0.5,z', 'x+0.5,-y,z'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5'] + number: 42 + schoenflies: C2v^18 + universal_h_m: F m m 2 (a,b-1/4,c-1/4) + Aem2(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) + symops: ['x,y,z', '-x,-y+0.5,z', '-x,y+0.5,z', 'x,-y,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', + '-x,y,z+0.5', 'x,-y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] + number: 39 + schoenflies: C2v^15 + universal_h_m: A e m 2 (a,b+1/4,c-1/4) + Amm2(b,-a+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) + symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,z', '-x+0.5,y,z', 'x+0.5,y,z+0.5', '-x,-y,z+0.5', + 'x+0.5,-y,z+0.5', '-x,y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] + number: 38 + schoenflies: C2v^14 + universal_h_m: A m m 2 (b,-a+1/4,c-1/4) + Ima2(b-1/4,-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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,z', '-x+0.5,y+0.5,z', 'x+0.5,y+0.5,z+0.5', + '-x,-y,z+0.5', 'x+0.5,-y+0.5,z+0.5', '-x,y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] + number: 46 + schoenflies: C2v^22 + universal_h_m: I m a 2 (b-1/4,-a-1/4,c+1/4) + Fmm2(a+1/4,b,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) + symops: ['x,y,z', '-x+0.5,-y,z', '-x+0.5,y,z', 'x,-y,z', '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', 'x,-y+0.5,z+0.5', 'x+0.5,y,z+0.5', '-x,-y,z+0.5', '-x,y,z+0.5', + 'x+0.5,-y,z+0.5', 'x+0.5,y+0.5,z', '-x,-y+0.5,z', '-x,y+0.5,z', 'x+0.5,-y+0.5,z'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] + number: 42 + schoenflies: C2v^18 + universal_h_m: F m m 2 (a+1/4,b,c+1/4) + Aem2(-a,c+1/4,b-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) + symops: ['x,y,z', '-x,y,-z+0.5', '-x,y,z+0.5', 'x,y,-z', 'x,y+0.5,z+0.5', '-x,y+0.5,-z', + '-x,y+0.5,z', 'x,y+0.5,-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 (-a,c+1/4,b-1/4) + Amm2(b,c+1/4,a-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) + symops: ['x,y,z', '-x+0.5,y,-z', 'x,y,-z', '-x+0.5,y,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,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] + number: 38 + schoenflies: C2v^14 + universal_h_m: A m m 2 (b,c+1/4,a-1/4) + Ima2(b-1/4,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) + symops: ['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+0.5', + '-x,y+0.5,-z', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z'] + ncsym: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] + number: 46 + schoenflies: C2v^22 + universal_h_m: I m a 2 (b-1/4,c-1/4,a+1/4) + Fmm2(b,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) + symops: ['x,y,z', '-x+0.5,y,-z', 'x,y,-z', '-x+0.5,y,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', 'x,y+0.5,z+0.5', '-x+0.5,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,z+0.5', '-x,y,-z+0.5', 'x+0.5,y,-z+0.5', '-x,y,z+0.5'] + ncsym: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] + number: 42 + schoenflies: C2v^18 + universal_h_m: F m m 2 (b,c-1/4,a-1/4) + Amm2(-a,c+1/4,b-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) + symops: ['x,y,z', '-x,y,-z+0.5', '-x,y,z', 'x,y,-z+0.5', 'x,y+0.5,z+0.5', '-x,y+0.5,-z', + '-x,y+0.5,z+0.5', 'x,y+0.5,-z'] + ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] + number: 38 + schoenflies: C2v^14 + universal_h_m: A m m 2 (-a,c+1/4,b-1/4) + Aem2(b,c+1/4,a-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) + symops: ['x,y,z', '-x+0.5,y,-z', 'x+0.5,y,-z', '-x,y,z', 'x+0.5,y+0.5,z', '-x,y+0.5,-z', + 'x,y+0.5,-z', '-x+0.5,y+0.5,z'] + ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] + number: 39 + schoenflies: C2v^15 + universal_h_m: A e m 2 (b,c+1/4,a-1/4) + Ima2(-a-1/4,c-1/4,b+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) + symops: ['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+0.5', + '-x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x,y+0.5,-z'] + ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] + number: 46 + schoenflies: C2v^22 + universal_h_m: I m a 2 (-a-1/4,c-1/4,b+1/4) + Fmm2(b+1/4,c,a+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) + symops: ['x,y,z', '-x,y,-z+0.5', 'x,y,-z+0.5', '-x,y,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,y+0.5,z+0.5', '-x,y+0.5,-z', 'x,y+0.5,-z', + '-x,y+0.5,z+0.5', 'x+0.5,y,z+0.5', '-x+0.5,y,-z', 'x+0.5,y,-z', '-x+0.5,y,z+0.5'] + ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] + number: 42 + schoenflies: C2v^18 + universal_h_m: F m m 2 (b+1/4,c,a+1/4) + Fmm2(a+1/4,b+1/4,c+1/2): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x+0.5,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', + '-x+0.5,-y,z+0.5', '-x+0.5,y+0.5,z+0.5', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x,-y+0.5,z+0.5', + '-x,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x,-y,z', '-x,y+0.5,z', + 'x+0.5,-y,z'] + ncsym: ['x,y,z', '-x,-y,z', '-x,y,z+0.5', 'x,-y,z+0.5'] + number: 42 + schoenflies: C2v^18 + universal_h_m: F m m 2 (a+1/4,b+1/4,c+1/2) + Fmm2(b+1/4,c+1/4,a+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) + symops: ['x,y,z', '-x+0.5,y,-z+0.5', 'x,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y+0.5,z', + '-x,y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z', 'x,y+0.5,z+0.5', '-x+0.5,y+0.5,-z', + 'x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,y,z+0.5', '-x,y,-z', 'x+0.5,y,-z', + '-x,y,z+0.5'] + ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] + number: 42 + schoenflies: C2v^18 + universal_h_m: F m m 2 (b+1/4,c+1/4,a+1/2) + Cmm2(a-1/4,b-1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x+0.5,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', + '-x,-y,z', '-x,y+0.5,z', 'x+0.5,-y,z'] + ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z'] + number: 35 + schoenflies: C2v^11 + universal_h_m: C m m 2 (a-1/4,b-1/4,c) + Cmm2(b-1/4,c-1/4,a): + 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) + symops: ['x,y,z', '-x+0.5,y,-z+0.5', 'x,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y,z+0.5', + '-x,y,-z', 'x+0.5,y,-z', '-x,y,z+0.5'] + ncsym: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] + number: 35 + schoenflies: C2v^11 + universal_h_m: C m m 2 (b-1/4,c-1/4,a) + Aea2(a,b+1/4,c-1/4): + 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) + symops: ['x,y,z', '-x,-y+0.5,z', '-x+0.5,y+0.5,z', 'x+0.5,-y,z', 'x,y+0.5,z+0.5', + '-x,-y,z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y,z'] + number: 41 + schoenflies: C2v^17 + universal_h_m: A e a 2 (a,b+1/4,c-1/4) + Cmc21(b-1/4,-a-1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,z', '-x+0.5,y,z+0.5', 'x+0.5,y+0.5,z', + '-x,-y,z+0.5', 'x+0.5,-y,z', '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y,z'] + number: 36 + schoenflies: C2v^12 + universal_h_m: C m c 21 (b-1/4,-a-1/4,c) + Iba2(a-1/4,b-1/4,c+1/4): + 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) + 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+0.5,y+0.5,z+0.5', + '-x,-y,z+0.5', '-x,y+0.5,z', '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: 45 + schoenflies: C2v^21 + universal_h_m: I b a 2 (a-1/4,b-1/4,c+1/4) + Aea2(b,-a+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) + symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,z', '-x,y+0.5,z', 'x+0.5,y,z+0.5', + '-x,-y,z+0.5', 'x,-y+0.5,z+0.5', '-x+0.5,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'] + number: 41 + schoenflies: C2v^17 + universal_h_m: A e a 2 (b,-a+1/4,c-1/4) + Cmc21(a-1/4,b-1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', '-x+0.5,y,z', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', + '-x,-y,z+0.5', '-x,y+0.5,z', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y+0.5,z', 'x,-y+0.5,z+0.5'] + number: 36 + schoenflies: C2v^12 + universal_h_m: C m c 21 (a-1/4,b-1/4,c) + Cmc21(-a-1/4,c-1/4,b): + 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) + symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,y,z', 'x,y+0.5,-z+0.5', 'x+0.5,y,z+0.5', + '-x,y+0.5,-z', '-x,y,z+0.5', 'x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] + number: 36 + schoenflies: C2v^12 + universal_h_m: C m c 21 (-a-1/4,c-1/4,b) + Aea2(b,c+1/4,a-1/4): + 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) + symops: ['x,y,z', '-x+0.5,y,-z', 'x+0.5,y,-z+0.5', '-x,y,z+0.5', 'x+0.5,y+0.5,z', + '-x,y+0.5,-z', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] + number: 41 + schoenflies: C2v^17 + universal_h_m: A e a 2 (b,c+1/4,a-1/4) + Iba2(b-1/4,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) + symops: ['x,y,z', '-x+0.5,y,-z+0.5', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y+0.5,z+0.5', + '-x,y+0.5,-z', 'x+0.5,y,-z', '-x,y,z+0.5'] + ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] + number: 45 + schoenflies: C2v^21 + universal_h_m: I b a 2 (b-1/4,c-1/4,a+1/4) + Aea2(-a,c+1/4,b-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) + symops: ['x,y,z', '-x,y,-z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,y,-z', 'x,y+0.5,z+0.5', + '-x,y+0.5,-z', '-x+0.5,y+0.5,z', 'x+0.5,y+0.5,-z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y+0.5,z', '-x,y+0.5,-z'] + number: 41 + schoenflies: C2v^17 + universal_h_m: A e a 2 (-a,c+1/4,b-1/4) + Cmc21(b-1/4,c-1/4,a): + 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) + symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', 'x,y,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', + '-x,y+0.5,-z', 'x+0.5,y,-z', '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y+0.5,z', '-x,y+0.5,-z'] + number: 36 + schoenflies: C2v^12 + universal_h_m: C m c 21 (b-1/4,c-1/4,a) + Ccc2(a-1/4,b-1/4,c): + 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) + 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+0.5,y+0.5,z', + '-x,-y,z', '-x,y+0.5,z+0.5', 'x+0.5,-y,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: 37 + schoenflies: C2v^13 + universal_h_m: C c c 2 (a-1/4,b-1/4,c) + Ccc2(b-1/4,c-1/4,a): + 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) + symops: ['x,y,z', '-x+0.5,y,-z+0.5', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', + '-x,y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', '-x,y,-z'] + number: 37 + schoenflies: C2v^13 + universal_h_m: C c c 2 (b-1/4,c-1/4,a) + Ama2(a+1/4,b+1/4,c-1/4): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,y,z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', + '-x+0.5,-y,z+0.5', '-x,y+0.5,z+0.5', '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: 40 + schoenflies: C2v^16 + universal_h_m: A m a 2 (a+1/4,b+1/4,c-1/4) + Cmc21(a,b+1/4,c): + crystal_class: orthorhombic + hall: ' C 2c -2 (x,y-1/4,z)' + hermann_mauguin: C m c 21 (a,b+1/4,c) + symops: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y,z', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', + '-x+0.5,-y,z+0.5', '-x+0.5,y+0.5,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: 36 + schoenflies: C2v^12 + universal_h_m: C m c 21 (a,b+1/4,c) + Imm2(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) + symops: ['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,z+0.5', '-x+0.5,y+0.5,z+0.5', '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: 44 + schoenflies: C2v^20 + universal_h_m: I m m 2 (a,b-1/4,c) + Ama2(b+1/4,-a+1/4,c-1/4): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', '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+0.5,-y,z+0.5', '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] + number: 40 + schoenflies: C2v^16 + universal_h_m: A m a 2 (b+1/4,-a+1/4,c-1/4) + Cmc21(b,-a+1/4,c): + crystal_class: orthorhombic + hall: ' C 2c -2 (y-1/4,-x,z)' + hermann_mauguin: C m c 21 (b,-a+1/4,c) + symops: ['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,-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,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] + number: 36 + schoenflies: C2v^12 + universal_h_m: C m c 21 (b,-a+1/4,c) + Imm2(a-1/4,b,c+1/4): + 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) + symops: ['x,y,z', '-x+0.5,-y,z', '-x+0.5,y,z', 'x,-y,z', 'x+0.5,y+0.5,z+0.5', + '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] + number: 44 + schoenflies: C2v^20 + universal_h_m: I m m 2 (a-1/4,b,c+1/4) + Cmc21(b,c+1/4,a): + crystal_class: orthorhombic + hall: ' C 2c -2 (y-1/4,z,x)' + hermann_mauguin: C m c 21 (b,c+1/4,a) + symops: ['x,y,z', '-x+0.5,y+0.5,-z', '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+0.5,y,-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: 36 + schoenflies: C2v^12 + universal_h_m: C m c 21 (b,c+1/4,a) + Ama2(b+1/4,c+1/4,a-1/4): + 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) + symops: ['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,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,y,-z', '-x,y+0.5,z+0.5', '-x,y+0.5,-z+0.5'] + number: 40 + schoenflies: C2v^16 + universal_h_m: A m a 2 (b+1/4,c+1/4,a-1/4) + Imm2(b,c-1/4,a): + crystal_class: orthorhombic + hall: ' I 2 -2 (y+1/4,z,x)' + hermann_mauguin: I m m 2 (b,c-1/4,a) + symops: ['x,y,z', '-x+0.5,y,-z', 'x,y,-z', '-x+0.5,y,z', 'x+0.5,y+0.5,z+0.5', + '-x,y+0.5,-z+0.5', 'x+0.5,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: 44 + schoenflies: C2v^20 + universal_h_m: I m m 2 (b,c-1/4,a) + Ama2(-a+1/4,c+1/4,b-1/4): + 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) + symops: ['x,y,z', '-x+0.5,y,-z+0.5', '-x,y,z', 'x+0.5,y,-z+0.5', 'x,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'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] + number: 40 + schoenflies: C2v^16 + universal_h_m: A m a 2 (-a+1/4,c+1/4,b-1/4) + Cmc21(-a,c+1/4,b): + crystal_class: orthorhombic + hall: ' C 2c -2 (-x,z,y-1/4)' + hermann_mauguin: C m c 21 (-a,c+1/4,b) + symops: ['x,y,z', '-x,y+0.5,-z+0.5', '-x,y,z', 'x,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+0.5', 'x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] + number: 36 + schoenflies: C2v^12 + universal_h_m: C m c 21 (-a,c+1/4,b) + Imm2(b-1/4,c,a+1/4): + 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) + symops: ['x,y,z', '-x,y,-z+0.5', '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+0.5,y+0.5,-z', '-x+0.5,y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] + number: 44 + schoenflies: C2v^20 + universal_h_m: I m m 2 (b-1/4,c,a+1/4) + Ama2(a,b+1/4,c-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) + symops: ['x,y,z', '-x,-y+0.5,z', '-x+0.5,y,z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', + '-x,-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,z+0.5', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z'] + number: 40 + schoenflies: C2v^16 + universal_h_m: A m a 2 (a,b+1/4,c-1/4) + Ama2(b,-a+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) + symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,z', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', + '-x,-y,z+0.5', 'x+0.5,-y+0.5,z+0.5', '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z+0.5'] + number: 40 + schoenflies: C2v^16 + universal_h_m: A m a 2 (b,-a+1/4,c-1/4) + Ama2(b,c+1/4,a-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) + symops: ['x,y,z', '-x+0.5,y,-z', 'x,y,-z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,y+0.5,z', + '-x,y+0.5,-z', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y,z+0.5', '-x,y+0.5,-z'] + number: 40 + schoenflies: C2v^16 + universal_h_m: A m a 2 (b,c+1/4,a-1/4) + Ama2(-a,c+1/4,b-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) + symops: ['x,y,z', '-x,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y,-z+0.5', 'x,y+0.5,z+0.5', + '-x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,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'] + number: 40 + schoenflies: C2v^16 + universal_h_m: A m a 2 (-a,c+1/4,b-1/4) + Cccm(c,a,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) + symops: ['x,y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,z', '-x+0.5,-y,-z', '-x+0.5,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,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', '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: 66 + schoenflies: D2h^20 + universal_h_m: C c c m (c,a,b-1/4) + Cccm(b,c,a-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) + symops: ['x,y,z', '-x,y,-z', '-x,-y,z', 'x,-y,-z', '-x,-y+0.5,-z', 'x,-y+0.5,z', + 'x,y+0.5,-z', '-x,y+0.5,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+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: 66 + schoenflies: D2h^20 + universal_h_m: C c c m (b,c,a-1/4) + Cccm(a,b,c-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) + symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z+0.5', 'x,y,-z+0.5', + '-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', + '-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+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: 66 + schoenflies: D2h^20 + universal_h_m: C c c m (a,b,c-1/4) + Fmmm(a-1/4,b-1/4,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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', + 'x,y,-z+0.5', '-x+0.5,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x+0.5,-y,z+0.5', + 'x,-y,-z', '-x+0.5,y+0.5,-z', '-x+0.5,-y,-z', 'x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', + 'x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y,-z', + '-x,-y+0.5,-z', 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', + '-x,-y,z', 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z+0.5', 'x+0.5,y+0.5,-z+0.5', + '-x,y+0.5,z', 'x+0.5,-y,z'] + 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: 69 + schoenflies: D2h^23 + universal_h_m: F m m m (a-1/4,b-1/4,c-1/4) + Cccm(c-1/4,a-1/4,b): + 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) + symops: ['x,y,z', 'x,-y+0.5,-z+0.5', '-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+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,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5', 'x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] + number: 66 + schoenflies: D2h^20 + universal_h_m: C c c m (c-1/4,a-1/4,b) + Cccm(b-1/4,c-1/4,a): + 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) + 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+0.5,-y,-z+0.5', + 'x,-y,z', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', '-x,y,-z', '-x,-y+0.5,z+0.5', + 'x+0.5,-y+0.5,-z', '-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+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] + number: 66 + schoenflies: D2h^20 + universal_h_m: C c c m (b-1/4,c-1/4,a) + Cccm(a-1/4,b-1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z', + 'x,y,-z', '-x+0.5,y,z+0.5', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x,-y,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,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] + number: 66 + schoenflies: D2h^20 + universal_h_m: C c c m (a-1/4,b-1/4,c) + Immm(a+1/4,b-1/4,c+1/4): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', + 'x,y,-z+0.5', '-x+0.5,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', '-x,-y,z+0.5', + 'x+0.5,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', + 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] + number: 71 + schoenflies: D2h^25 + universal_h_m: I m m m (a+1/4,b-1/4,c+1/4) + Fmmm(a+1/4,b+1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', + 'x,y,-z', '-x+0.5,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x+0.5,-y,z+0.5', 'x,-y,-z+0.5', + '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', + 'x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', + '-x,-y+0.5,-z+0.5', 'x+0.5,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', + '-x,-y,z', 'x+0.5,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z', + 'x+0.5,-y,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: 69 + schoenflies: D2h^23 + universal_h_m: F m m m (a+1/4,b+1/4,c) + Fmmm(a+1/2,b+1/4,c+1/4): + 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) + symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,-z+0.5', + 'x,y,-z+0.5', '-x,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', 'x,-y,-z', + '-x,y+0.5,-z', '-x,-y,-z', 'x,y+0.5,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', + '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', + 'x+0.5,y,-z', '-x+0.5,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y,z', + 'x+0.5,-y,-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+0.5,z', 'x+0.5,-y,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: 69 + schoenflies: D2h^23 + universal_h_m: F m m m (a+1/2,b+1/4,c+1/4) + Fmmm(a-1/4,b+1/2,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) + symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y,-z+0.5', + 'x,y,-z+0.5', '-x+0.5,y,z', 'x,-y,z', 'x,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', + 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x+0.5,-y+0.5,-z', 'x,y+0.5,-z', '-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,z+0.5', 'x+0.5,-y,-z', '-x,y,-z', + '-x,-y,-z', 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y,z+0.5', 'x+0.5,y+0.5,z', '-x,-y+0.5,z', + 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', + '-x,y+0.5,z', 'x+0.5,-y+0.5,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y+0.5,-z', + '-x,y+0.5,z', 'x,-y,z'] + number: 69 + schoenflies: D2h^23 + universal_h_m: F m m m (a-1/4,b+1/2,c+1/4) + Ibam(a,b,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) + symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z+0.5', 'x,y,-z+0.5', + '-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+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', + '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: 72 + schoenflies: D2h^26 + universal_h_m: I b a m (a,b,c+1/4) + Cmmm(a-1/4,b-1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', + 'x,y,-z', '-x+0.5,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', '-x,-y,z', 'x+0.5,-y,-z', + '-x,y+0.5,-z', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z', 'x+0.5,-y,z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x+0.5,y+0.5,-z', '-x,y+0.5,z', 'x+0.5,-y,z'] + number: 65 + schoenflies: D2h^19 + universal_h_m: C m m m (a-1/4,b-1/4,c) + Ibam(a+1/4,b-1/4,c+1/4): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z+0.5', + 'x,y,-z+0.5', '-x+0.5,y,z+0.5', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z+0.5', '-x,-y,z+0.5', + '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,y+0.5,z', + 'x+0.5,-y,z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x+0.5,y+0.5,-z', '-x,y+0.5,z', 'x+0.5,-y,z'] + number: 72 + schoenflies: D2h^26 + universal_h_m: I b a m (a+1/4,b-1/4,c+1/4) + Ibam(c,a,b+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) + symops: ['x,y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,z', '-x+0.5,-y,-z', '-x+0.5,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+0.5,y+0.5,-z+0.5', + '-x+0.5,-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'] + ncsym: ['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'] + number: 72 + schoenflies: D2h^26 + universal_h_m: I b a m (c,a,b+1/4) + Cmmm(c-1/4,a-1/4,b): + 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) + symops: ['x,y,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,z', '-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,-y,-z', '-x,y+0.5,-z', + '-x,-y,z+0.5', '-x,-y,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5', 'x,y+0.5,-z'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', + 'x,y+0.5,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5'] + number: 65 + schoenflies: D2h^19 + universal_h_m: C m m m (c-1/4,a-1/4,b) + Ibam(c+1/4,a-1/4,b+1/4): + 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) + symops: ['x,y,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,z', '-x+0.5,-y+0.5,-z+0.5', + '-x+0.5,y,z', 'x+0.5,-y+0.5,z', 'x+0.5,y,-z+0.5', 'x+0.5,y+0.5,z+0.5', 'x+0.5,-y,-z', + '-x+0.5,y+0.5,-z', '-x+0.5,-y,z+0.5', '-x,-y,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5', + 'x,y+0.5,-z'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', + 'x,y+0.5,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5'] + number: 72 + schoenflies: D2h^26 + universal_h_m: I b a m (c+1/4,a-1/4,b+1/4) + Ibam(b,c,a+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) + symops: ['x,y,z', '-x,y,-z', '-x,-y,z', 'x,-y,-z', '-x,-y+0.5,-z', 'x,-y+0.5,z', + 'x,y+0.5,-z', '-x,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+0.5', + 'x+0.5,-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'] + 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: 72 + schoenflies: D2h^26 + universal_h_m: I b a m (b,c,a+1/4) + Cmmm(b-1/4,c-1/4,a): + 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) + symops: ['x,y,z', '-x+0.5,y,-z+0.5', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,-y,-z+0.5', + 'x,-y,z', 'x,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y,z+0.5', '-x,y,-z', '-x,-y,z+0.5', + 'x+0.5,-y,-z', '-x,-y,-z', 'x+0.5,-y,z+0.5', 'x+0.5,y,-z', '-x,y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y,z+0.5'] + number: 65 + schoenflies: D2h^19 + universal_h_m: C m m m (b-1/4,c-1/4,a) + Ibam(b+1/4,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 m (b+1/4,c-1/4,a+1/4) + symops: ['x,y,z', '-x+0.5,y,-z+0.5', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', + 'x,-y+0.5,z', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y+0.5,z+0.5', '-x,y+0.5,-z', + '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x,-y,-z', 'x+0.5,-y,z+0.5', 'x+0.5,y,-z', + '-x,y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y,z+0.5'] + number: 72 + schoenflies: D2h^26 + universal_h_m: I b a m (b+1/4,c-1/4,a+1/4) + Cmcm(b-1/4,c-1/4,a): + 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) + symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y,z', 'x,-y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', + 'x,-y+0.5,z', 'x,y,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', '-x,y+0.5,-z', + '-x,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,-y,-z', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y,-z', + '-x,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: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (b-1/4,c-1/4,a) + Cmcm(c-1/4,b-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) + symops: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,-y+0.5,z', '-x+0.5,y,-z+0.5', '-x,-y+0.5,-z+0.5', + '-x+0.5,y,z', 'x,y,-z+0.5', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', 'x+0.5,-y,-z', + '-x,-y,z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', '-x+0.5,y+0.5,z+0.5', 'x,y+0.5,-z', + 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (c-1/4,b-1/4,-a) + Cmcm(a-1/4,b-1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z', + 'x,y,-z+0.5', '-x+0.5,y,z', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x,-y,z+0.5', + 'x+0.5,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z', + 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', + 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z', 'x+0.5,-y,z+0.5'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (a-1/4,b-1/4,c) + Cmcm(-a-1/4,c-1/4,b): + 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) + symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', 'x,-y,-z+0.5', '-x+0.5,-y+0.5,z', '-x+0.5,-y,-z+0.5', + 'x,-y+0.5,z', '-x+0.5,y,z', 'x,y+0.5,-z+0.5', 'x+0.5,y,z+0.5', '-x,y+0.5,-z', + 'x+0.5,-y,-z', '-x,-y+0.5,z+0.5', '-x,-y,-z', 'x+0.5,-y+0.5,z+0.5', '-x,y,z+0.5', + 'x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', + 'x+0.5,y+0.5,-z', '-x,y,z+0.5', 'x+0.5,-y+0.5,z+0.5'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (-a-1/4,c-1/4,b) + Cmcm(c-1/4,a-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) + symops: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x+0.5,-y+0.5,z', '-x,-y+0.5,-z+0.5', + '-x+0.5,y,z', 'x,-y+0.5,z', 'x+0.5,y,-z+0.5', 'x,y+0.5,z+0.5', 'x+0.5,-y,-z', + '-x,y+0.5,-z', '-x+0.5,-y,z+0.5', '-x,-y,-z', '-x+0.5,y+0.5,z+0.5', 'x,-y,z+0.5', + 'x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', + 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x,-y,z+0.5'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (c-1/4,a-1/4,b) + Cmcm(b-1/4,-a-1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', '-x+0.5,y,-z', 'x,-y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', + 'x,y,-z+0.5', 'x,-y+0.5,z', '-x+0.5,y,z+0.5', 'x+0.5,y+0.5,z', '-x,-y,z+0.5', + '-x,y+0.5,-z', 'x+0.5,-y,-z+0.5', '-x,-y,-z', 'x+0.5,y+0.5,-z+0.5', 'x+0.5,-y,z', + '-x,y+0.5,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', + 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', 'x+0.5,-y,z'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (b-1/4,-a-1/4,c) + Cmce(c-1/4,a-1/4,b): + 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) + symops: ['x,y,z', 'x+0.5,-y,-z+0.5', '-x,y,-z+0.5', '-x+0.5,-y,z', '-x,-y+0.5,-z+0.5', + '-x+0.5,y+0.5,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,-z+0.5', 'x,y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', + '-x,y+0.5,-z', '-x+0.5,-y+0.5,z+0.5', '-x,-y,-z', '-x+0.5,y,z+0.5', 'x,-y,z+0.5', + 'x+0.5,y,-z'] + 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: 64 + schoenflies: D2h^18 + universal_h_m: C m c e (c-1/4,a-1/4,b) + Cmce(-a-1/4,c-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) + symops: ['x,y,z', '-x,y+0.5,-z+0.5', 'x,-y,-z+0.5', '-x,-y+0.5,z', '-x+0.5,-y,-z+0.5', + 'x+0.5,-y+0.5,z', '-x+0.5,y,z', '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', '-x+0.5,-y+0.5,z+0.5', '-x,-y,-z', 'x,-y+0.5,z+0.5', '-x,y,z+0.5', + 'x,y+0.5,-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: 64 + schoenflies: D2h^18 + universal_h_m: C m c e (-a-1/4,c-1/4,b) + Cmce(b-1/4,c-1/4,a): + 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) + symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,-y,-z+0.5', + 'x,-y+0.5,z+0.5', 'x,y,-z+0.5', '-x+0.5,y+0.5,z+0.5', 'x+0.5,y,z+0.5', '-x,y+0.5,-z+0.5', + '-x,-y,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z', 'x+0.5,-y+0.5,z', 'x+0.5,y,-z', + '-x,y+0.5,z'] + ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', + 'x+0.5,y,-z', '-x,y+0.5,z', 'x+0.5,-y+0.5,z'] + number: 64 + schoenflies: D2h^18 + universal_h_m: C m c e (b-1/4,c-1/4,a) + Cmce(b-1/4,-a-1/4,c): + 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) + symops: ['x,y,z', '-x+0.5,-y,z+0.5', '-x+0.5,y,-z', 'x,-y,-z+0.5', '-x+0.5,-y+0.5,-z', + 'x,y+0.5,-z+0.5', 'x,-y+0.5,z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x,-y+0.5,z+0.5', + '-x,y+0.5,-z', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z', 'x+0.5,y,-z+0.5', 'x+0.5,-y,z', + '-x,y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', + 'x+0.5,y,-z+0.5', '-x,y,z+0.5', 'x+0.5,-y,z'] + number: 64 + schoenflies: D2h^18 + universal_h_m: C m c e (b-1/4,-a-1/4,c) + Cmce(a-1/4,b-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) + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x,y,-z+0.5', '-x+0.5,-y+0.5,-z', + 'x+0.5,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y,z+0.5', + 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', 'x,y+0.5,-z+0.5', '-x,y+0.5,z', + 'x,-y,z+0.5'] + ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x,y,-z+0.5', '-x,-y,-z', + 'x,y+0.5,-z+0.5', '-x,y+0.5,z', 'x,-y,z+0.5'] + number: 64 + schoenflies: D2h^18 + universal_h_m: C m c e (a-1/4,b-1/4,c) + Cmce(c-1/4,b-1/4,-a): + 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) + symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y+0.5,z', '-x+0.5,y,-z', '-x,-y+0.5,-z+0.5', + '-x+0.5,y,z+0.5', 'x,y,-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,z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', '-x+0.5,y+0.5,z', 'x,y+0.5,-z', + 'x+0.5,-y,z'] + ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', + 'x,y+0.5,-z', '-x+0.5,y+0.5,z', 'x+0.5,-y,z'] + number: 64 + schoenflies: D2h^18 + universal_h_m: C m c e (c-1/4,b-1/4,-a) + Cmcm(c+1/2,a-1/4,b+1/4): + 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) + symops: ['x,y,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,z', '-x+0.5,-y,-z+0.5', + '-x,y,z', 'x,-y,z', 'x+0.5,y,-z+0.5', 'x,y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-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', 'x,-y+0.5,z+0.5', '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+0.5,-y+0.5,-z', + 'x+0.5,y+0.5,-z', '-x,y,z', 'x,-y,z'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (c+1/2,a-1/4,b+1/4) + Cmcm(-a+1/2,c-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) + symops: ['x,y,z', '-x,y+0.5,-z+0.5', 'x,-y+0.5,-z+0.5', '-x,-y,z', '-x,-y+0.5,-z+0.5', + 'x,-y,z', '-x,y,z', 'x,y+0.5,-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,z+0.5', '-x+0.5,-y+0.5,-z', 'x+0.5,-y,z+0.5', '-x+0.5,y,z+0.5', '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+0.5,-y+0.5,-z', + 'x+0.5,y+0.5,-z', '-x,y,z', 'x,-y,z'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (-a+1/2,c-1/4,b+1/4) + Immm(a,b,c-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) + symops: ['x,y,z', '-x,-y,z', 'x,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z+0.5', 'x,y,-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', '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+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', '-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: 71 + schoenflies: D2h^25 + universal_h_m: I m m m (a,b,c-1/4) + Cmcm(b+1/2,c-1/4,a+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) + symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x+0.5,-y+0.5,z', 'x,-y,-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,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,-y+0.5,-z+0.5', 'x+0.5,-y,z+0.5', 'x+0.5,y,-z+0.5', '-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', '-x,-y+0.5,-z+0.5', + 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (b+1/2,c-1/4,a+1/4) + Cmcm(b+1/2,-a-1/4,c+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) + symops: ['x,y,z', '-x+0.5,-y,z+0.5', '-x+0.5,y,-z+0.5', 'x,-y,-z', '-x+0.5,-y,-z+0.5', + 'x,y,-z', '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+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+0.5,-y+0.5,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', '-x,-y+0.5,-z+0.5', + 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (b+1/2,-a-1/4,c+1/4) + Immm(a-1/4,b,c): + crystal_class: orthorhombic + hall: -I 2 2 (x+1/4,y,z) + hermann_mauguin: I m m m (a-1/4,b,c) + symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z', '-x+0.5,y,-z', '-x+0.5,-y,-z', 'x,y,-z', + '-x+0.5,y,z', 'x,-y,z', 'x+0.5,y+0.5,z+0.5', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', + '-x,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', + 'x+0.5,-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', '-x,-y+0.5,-z+0.5', + 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] + number: 71 + schoenflies: D2h^25 + universal_h_m: I m m m (a-1/4,b,c) + Cmcm(c+1/2,b-1/4,-a+1/4): + 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) + symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x+0.5,-y+0.5,z', '-x,y,-z', '-x+0.5,-y+0.5,-z', + '-x,y,z', 'x,y,-z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,-y,z+0.5', + '-x,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', '-x,y+0.5,z+0.5', 'x,y+0.5,-z+0.5', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', + 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (c+1/2,b-1/4,-a+1/4) + Cmcm(a+1/2,b-1/4,c+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) + symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y,-z', '-x,-y+0.5,-z+0.5', + 'x,y,-z', '-x,y,z', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-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,-z+0.5', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', + 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] + number: 63 + schoenflies: D2h^17 + universal_h_m: C m c m (a+1/2,b-1/4,c+1/4) + Immm(a,b-1/4,c): + crystal_class: orthorhombic + hall: -I 2 2 (x,y+1/4,z) + hermann_mauguin: I m m m (a,b-1/4,c) + symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y+0.5,-z', 'x,y,-z', + '-x,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y,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', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', + 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', + 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] + number: 71 + schoenflies: D2h^25 + universal_h_m: I m m m (a,b-1/4,c) + I4/m(a+b,-a+b,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) + 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', + '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', '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'] + 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 (a+b,-a+b,c) + P4/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) + 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'] + number: 83 + schoenflies: C4h^1 + universal_h_m: P 4/m (a+b,-a+b,c) + I4/m(a+b+1/2,-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) + symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-x+0.5,-y+0.5,-z', + 'y+0.5,-x,-z', 'x,y,-z', '-y,x+0.5,-z', 'x+0.5,y+0.5,z', '-y+0.5,x,z', '-x,-y,z', + 'y,-x+0.5,z', '-x,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', 'x+0.5,y,z+0.5', + '-y+0.5,x+0.5,z+0.5', '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-x,-y+0.5,-z+0.5', 'y,-x,-z+0.5', + 'x+0.5,y,-z+0.5', '-y+0.5,x+0.5,-z+0.5', 'x,y+0.5,z+0.5', '-y,x,z+0.5', '-x+0.5,-y,z+0.5', + 'y+0.5,-x+0.5,z+0.5', '-x+0.5,-y,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x,y+0.5,-z+0.5', + '-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: 87 + schoenflies: C4h^5 + universal_h_m: I 4/m (a+b+1/2,-a+b,c) + P42/m(a+b,-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) + 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+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+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,-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 (a+b,-a+b,c) + I4/m(a+1/2,b,c): + crystal_class: tetragonal + hall: -I 4 (x+1/2,y,z) + hermann_mauguin: I 4/m (a+1/2,b,c) + symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', '-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+0.5', 'y,-x,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-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: 87 + schoenflies: C4h^5 + universal_h_m: I 4/m (a+1/2,b,c) + I4/m(a+1/2,b,c-1/4): + 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) + symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,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', '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'] + 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: 87 + schoenflies: C4h^5 + universal_h_m: I 4/m (a+1/2,b,c-1/4) + P4/m(a+b,-a+b+1/2,c): + 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) + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,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', '-x,-y,z', + 'y+0.5,-x,z', '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z'] + 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'] + number: 83 + schoenflies: C4h^1 + universal_h_m: P 4/m (a+b,-a+b+1/2,c) + I4/m(a-1/4,b-1/4,c+1/4): + 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) + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', '-x+0.5,-y+0.5,-z+0.5', + 'y,-x+0.5,-z+0.5', 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', 'x+0.5,y+0.5,z+0.5', '-y,x+0.5,z+0.5', + '-x,-y,z+0.5', 'y+0.5,-x,z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', + '-y,x+0.5,-z'] + 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'] + number: 87 + schoenflies: C4h^5 + universal_h_m: I 4/m (a-1/4,b-1/4,c+1/4) + I4/m(a+b+1/2,-a+b,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) + symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-x+0.5,-y+0.5,-z+0.5', + 'y+0.5,-x,-z+0.5', 'x,y,-z+0.5', '-y,x+0.5,-z+0.5', 'x+0.5,y+0.5,z', '-y+0.5,x,z', + '-x,-y,z', 'y,-x+0.5,z', '-x,-y,-z+0.5', 'y,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', + '-y+0.5,x,-z+0.5', 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x,-y+0.5,z+0.5', + 'y,-x,z+0.5', '-x,-y+0.5,-z', 'y,-x,-z', 'x+0.5,y,-z', '-y+0.5,x+0.5,-z', 'x,y+0.5,z+0.5', + '-y,x,z+0.5', '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-x+0.5,-y,-z', 'y+0.5,-x+0.5,-z', + 'x,y+0.5,-z', '-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: 87 + schoenflies: C4h^5 + universal_h_m: I 4/m (a+b+1/2,-a+b,c-1/4) + P42/m(a+b,-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) + 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+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+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z', 'x+0.5,y+0.5,-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+0.5', + 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z'] + number: 84 + schoenflies: C4h^2 + universal_h_m: P 42/m (a+b,-a+b,c-1/4) + P42/m(a+b,-a+b+1/2,c): + 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) + symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', '-x+0.5,-y+0.5,-z', + 'y,-x+0.5,-z+0.5', 'x,y,-z', '-y+0.5,x,-z+0.5', 'x+0.5,y+0.5,z', '-y,x+0.5,z+0.5', + '-x,-y,z', 'y+0.5,-x,z+0.5', '-x,-y,-z', 'y+0.5,-x,-z+0.5', 'x+0.5,y+0.5,-z', + '-y,x+0.5,-z+0.5'] + ncsym: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', '-x,-y,-z', + 'y,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z+0.5'] + number: 84 + schoenflies: C4h^2 + universal_h_m: P 42/m (a+b,-a+b+1/2,c) + I4/mmm(a+b,-a+b,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) + 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+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', + '-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', + '-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', + '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', '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', '-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', '-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', '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', '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', + '-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', + '-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', + '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'] + 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 (a+b,-a+b,c) + P4/mmm(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) + 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+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', + '-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', + '-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', + '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'] + 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 (a+b,-a+b,c) + I4/mcm(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) + symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-y,-x,-z+0.5', 'x,-y,-z+0.5', + 'y,x,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', 'y,x,z+0.5', + '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,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', '-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', '-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', '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', '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', '-y+0.5,-x,-z', 'x+0.5,-y,-z', 'y+0.5,x,-z', + '-x+0.5,y,-z', '-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', + 'y+0.5,x,z', '-x+0.5,y,z', '-y+0.5,-x,z', 'x+0.5,-y,z', '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', '-y,-x+0.5,-z', 'x,-y+0.5,-z', 'y,x+0.5,-z', + '-x,y+0.5,-z', '-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', + 'y,x+0.5,z', '-x,y+0.5,z', '-y,-x+0.5,z', 'x,-y+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 (a+b,-a+b,c) + P4/mcc(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) + symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-y,-x,-z+0.5', 'x,-y,-z+0.5', + 'y,x,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', 'y,x,z+0.5', + '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,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', '-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', '-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', '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'] + 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 (a+b,-a+b,c) + I4/mcm(a,b,c+1/4): + crystal_class: tetragonal + hall: -I 4 2c (x,y,z-1/4) + hermann_mauguin: I 4/m c m (a,b,c+1/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,-y,-z+0.5', 'y,-x,-z+0.5', 'x,y,-z+0.5', '-y,x,-z+0.5', '-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+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', '-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: 140 + schoenflies: D4h^18 + universal_h_m: I 4/m c m (a,b,c+1/4) + I4/mmm(a+b+1/2,-a+b,c): + 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) + symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-y,-x,-z', 'x,-y+0.5,-z', + 'y+0.5,x+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', 'y+0.5,-x,-z', 'x,y,-z', + '-y,x+0.5,-z', 'y+0.5,x+0.5,z', '-x+0.5,y,z', '-y,-x,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', + '-y+0.5,x,z', '-x,-y,z', 'y,-x+0.5,z', '-y+0.5,-x+0.5,-z', 'x+0.5,-y,-z', 'y,x,-z', + '-x,y+0.5,-z', '-x,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', 'y,x,z', + '-x,y+0.5,z', '-y+0.5,-x+0.5,z', 'x+0.5,-y,z', 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', + '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-y+0.5,-x,-z+0.5', 'x+0.5,-y+0.5,-z+0.5', + 'y,x+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,-z+0.5', 'y,-x,-z+0.5', 'x+0.5,y,-z+0.5', + '-y+0.5,x+0.5,-z+0.5', 'y,x+0.5,z+0.5', '-x,y,z+0.5', '-y+0.5,-x,z+0.5', 'x+0.5,-y+0.5,z+0.5', + 'x,y+0.5,z+0.5', '-y,x,z+0.5', '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-y,-x+0.5,-z+0.5', + 'x,-y,-z+0.5', 'y+0.5,x,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', + 'y+0.5,-x+0.5,-z+0.5', 'x,y+0.5,-z+0.5', '-y,x,-z+0.5', 'y+0.5,x,z+0.5', '-x+0.5,y+0.5,z+0.5', + '-y,-x+0.5,z+0.5', 'x,-y,z+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+0.5,-z', + 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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+0.5,z', '-y,-x,z', 'x+0.5,-y,z', 'y+0.5,x+0.5,z'] + number: 139 + schoenflies: D4h^17 + universal_h_m: I 4/m m m (a+b+1/2,-a+b,c) + P4/mmm(a+b,-a+b+1/2,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) + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', '-y+0.5,-x+0.5,-z', + 'x,-y+0.5,-z', 'y,x,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', 'y,-x+0.5,-z', 'x,y,-z', + '-y+0.5,x,-z', 'y,x,z', '-x+0.5,y,z', '-y+0.5,-x+0.5,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', + '-y,x+0.5,z', '-x,-y,z', 'y+0.5,-x,z', '-y,-x,-z', 'x+0.5,-y,-z', 'y+0.5,x+0.5,-z', + '-x,y+0.5,-z', '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', 'y+0.5,x+0.5,z', + '-x,y+0.5,z', '-y,-x,z', 'x+0.5,-y,z'] + ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', + 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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+0.5,z', '-y,-x,z', 'x+0.5,-y,z', 'y+0.5,x+0.5,z'] + number: 123 + schoenflies: D4h^1 + universal_h_m: P 4/m m m (a+b,-a+b+1/2,c) + I4/mcm(a-1/4,b-1/4,c+1/4): + 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) + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', + 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z', '-x+0.5,-y+0.5,-z+0.5', 'y,-x+0.5,-z+0.5', + 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', '-x+0.5,y,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x,-y+0.5,z+0.5', + 'y,x,z+0.5', 'x+0.5,y+0.5,z+0.5', '-y,x+0.5,z+0.5', '-x,-y,z+0.5', 'y+0.5,-x,z+0.5', + 'x+0.5,-y,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x,-z+0.5', + '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z', '-y,-x,z', + 'x+0.5,-y,z', 'y+0.5,x+0.5,z'] + ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', + 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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+0.5,z', '-y,-x,z', 'x+0.5,-y,z', 'y+0.5,x+0.5,z'] + number: 140 + schoenflies: D4h^18 + universal_h_m: I 4/m c m (a-1/4,b-1/4,c+1/4) + I4/mcm(a+b,-a+b,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) + 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+0.5', 'y,-x,-z+0.5', 'x,y,-z+0.5', '-y,x,-z+0.5', 'y,x,z+0.5', + '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,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', '-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', '-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', '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', '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', '-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', '-x+0.5,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y,-z', + '-y+0.5,x,-z', 'y+0.5,x,z', '-x+0.5,y,z', '-y+0.5,-x,z', 'x+0.5,-y,z', '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', '-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', '-x,-y+0.5,-z', 'y,-x+0.5,-z', 'x,y+0.5,-z', + '-y,x+0.5,-z', 'y,x+0.5,z', '-x,y+0.5,z', '-y,-x+0.5,z', 'x,-y+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+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: 140 + schoenflies: D4h^18 + universal_h_m: I 4/m c m (a+b,-a+b,c+1/4) + P4/mcc(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) + 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+0.5', 'y,-x,-z+0.5', 'x,y,-z+0.5', '-y,x,-z+0.5', 'y,x,z+0.5', + '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,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', '-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', '-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', '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'] + 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: 124 + schoenflies: D4h^2 + universal_h_m: P 4/m c c (a+b,-a+b,c+1/4) + I4/mcm(a+b+1/2,-a+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) + hermann_mauguin: I 4/m c m (a+b+1/2,-a+b,c) + symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-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', '-x+0.5,-y+0.5,-z', + 'y+0.5,-x,-z', 'x,y,-z', '-y,x+0.5,-z', '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', 'x+0.5,y+0.5,z', '-y+0.5,x,z', '-x,-y,z', 'y,-x+0.5,z', + '-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', + '-x,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', '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', 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', + '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-y+0.5,-x,-z', 'x+0.5,-y+0.5,-z', 'y,x+0.5,-z', + '-x,y,-z', '-x,-y+0.5,-z+0.5', 'y,-x,-z+0.5', 'x+0.5,y,-z+0.5', '-y+0.5,x+0.5,-z+0.5', + 'y,x+0.5,z', '-x,y,z', '-y+0.5,-x,z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', '-y,x,z+0.5', + '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-y,-x+0.5,-z', 'x,-y,-z', 'y+0.5,x,-z', + '-x+0.5,y+0.5,-z', '-x+0.5,-y,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x,y+0.5,-z+0.5', + '-y,x,-z+0.5', 'y+0.5,x,z', '-x+0.5,y+0.5,z', '-y,-x+0.5,z', 'x,-y,z'] + ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', + 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', + 'y+0.5,x+0.5,z+0.5'] + number: 140 + schoenflies: D4h^18 + universal_h_m: I 4/m c m (a+b+1/2,-a+b,c) + P4/mcc(a+b,-a+b+1/2,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) + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', '-y+0.5,-x+0.5,-z+0.5', + 'x,-y+0.5,-z+0.5', 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z', 'y,-x+0.5,-z', + 'x,y,-z', '-y+0.5,x,-z', 'y,x,z+0.5', '-x+0.5,y,z+0.5', '-y+0.5,-x+0.5,z+0.5', + 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-y,x+0.5,z', '-x,-y,z', 'y+0.5,-x,z', '-y,-x,-z+0.5', + 'x+0.5,-y,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', + 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', 'y+0.5,x+0.5,z+0.5', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', + 'x+0.5,-y,z+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+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', + 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', + 'y+0.5,x+0.5,z+0.5'] + number: 124 + schoenflies: D4h^2 + universal_h_m: P 4/m c c (a+b,-a+b+1/2,c) + I4/mmm(a-1/4,b-1/4,c+1/4): + 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) + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', + 'y,-x+0.5,-z+0.5', 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', '-x+0.5,y,z', '-y+0.5,-x+0.5,z', + 'x,-y+0.5,z', 'y,x,z', 'x+0.5,y+0.5,z+0.5', '-y,x+0.5,z+0.5', '-x,-y,z+0.5', + 'y+0.5,-x,z+0.5', 'x+0.5,-y,-z', 'y+0.5,x+0.5,-z', '-x,y+0.5,-z', '-y,-x,-z', + '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', + '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', 'y+0.5,x+0.5,z+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+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', + 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', + 'y+0.5,x+0.5,z+0.5'] + number: 139 + schoenflies: D4h^17 + universal_h_m: I 4/m m m (a-1/4,b-1/4,c+1/4) + I4/mmm(a+1/2,b,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) + symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,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', '-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', '-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+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+0.5', '-y,-x,z+0.5', + 'x+0.5,-y+0.5,z+0.5', 'y,x,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', + '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: 139 + schoenflies: D4h^17 + universal_h_m: I 4/m m m (a+1/2,b,c-1/4) + I4/mcm(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) + symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x,-y,-z', 'y+0.5,x+0.5,-z', + '-x,y,-z', '-y+0.5,-x+0.5,-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', '-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', + '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+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+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+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: 140 + schoenflies: D4h^18 + universal_h_m: I 4/m c m (a+1/2,b,c+1/4) + P42/mcm(a+b,-a+b,c): + 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) + symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-y,-x,-z+0.5', 'x,-y,-z', + 'y,x,-z+0.5', '-x,y,-z', '-x,-y,-z', 'y,-x,-z+0.5', 'x,y,-z', '-y,x,-z+0.5', + 'y,x,z+0.5', '-x,y,z', '-y,-x,z+0.5', 'x,-y,z', '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', '-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+0.5,y+0.5,-z', '-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', '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+0.5,-y+0.5,z'] + 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: 132 + schoenflies: D4h^10 + universal_h_m: P 42/m c m (a+b,-a+b,c) + I4/mmm(a+1/2,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) + symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x,-y,-z', 'y+0.5,x+0.5,-z', + '-x,y,-z', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y+0.5,-x+0.5,-z', 'x,y,-z', '-y+0.5,x+0.5,-z', + '-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+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+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+0.5', '-y,-x,z+0.5', 'x+0.5,-y+0.5,z+0.5', + '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: 139 + schoenflies: D4h^17 + universal_h_m: I 4/m m m (a+1/2,b,c) + P42/mmc(a+b,-a+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) + symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-y,-x,-z', 'x,-y,-z+0.5', + 'y,x,-z', '-x,y,-z+0.5', '-x,-y,-z', 'y,-x,-z+0.5', 'x,y,-z', '-y,x,-z+0.5', + 'y,x,z', '-x,y,z+0.5', '-y,-x,z', 'x,-y,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', '-y+0.5,-x+0.5,-z', 'x+0.5,-y+0.5,-z+0.5', + 'y+0.5,x+0.5,-z', '-x+0.5,y+0.5,-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', 'y+0.5,x+0.5,z', '-x+0.5,y+0.5,z+0.5', + '-y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,z+0.5'] + 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: 131 + schoenflies: D4h^9 + universal_h_m: P 42/m m c (a+b,-a+b,c) + I4/mcm(a+1/2,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) + symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,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', '-x,-y,-z', 'y+0.5,-x+0.5,-z', + 'x,y,-z', '-y+0.5,x+0.5,-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', '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+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'] + 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: 140 + schoenflies: D4h^18 + universal_h_m: I 4/m c m (a+1/2,b,c) + I4/mcm(a+b+1/2,-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-1/4) + hermann_mauguin: I 4/m c m (a+b+1/2,-a+b,c+1/4) + symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-y,-x,-z', 'x,-y+0.5,-z', + 'y+0.5,x+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x,-z+0.5', + 'x,y,-z+0.5', '-y,x+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', 'x+0.5,y+0.5,z', '-y+0.5,x,z', '-x,-y,z', 'y,-x+0.5,z', '-y+0.5,-x+0.5,-z', + 'x+0.5,-y,-z', 'y,x,-z', '-x,y+0.5,-z', '-x,-y,-z+0.5', 'y,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', + '-y+0.5,x,-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', + 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-y+0.5,-x,-z+0.5', + 'x+0.5,-y+0.5,-z+0.5', 'y,x+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,-z', 'y,-x,-z', + 'x+0.5,y,-z', '-y+0.5,x+0.5,-z', 'y,x+0.5,z', '-x,y,z', '-y+0.5,-x,z', 'x+0.5,-y+0.5,z', + 'x,y+0.5,z+0.5', '-y,x,z+0.5', '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-y,-x+0.5,-z+0.5', + 'x,-y,-z+0.5', 'y+0.5,x,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y,-z', 'y+0.5,-x+0.5,-z', + 'x,y+0.5,-z', '-y,x,-z', 'y+0.5,x,z', '-x+0.5,y+0.5,z', '-y,-x+0.5,z', 'x,-y,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+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: 140 + schoenflies: D4h^18 + universal_h_m: I 4/m c m (a+b+1/2,-a+b,c+1/4) + P42/mcm(a+b,-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) + symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-y,-x,-z', 'x,-y,-z+0.5', + 'y,x,-z', '-x,y,-z+0.5', '-x,-y,-z+0.5', 'y,-x,-z', 'x,y,-z+0.5', '-y,x,-z', + 'y,x,z+0.5', '-x,y,z', '-y,-x,z+0.5', 'x,-y,z', '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', '-y+0.5,-x+0.5,-z', 'x+0.5,-y+0.5,-z+0.5', + 'y+0.5,x+0.5,-z', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z', + 'x+0.5,y+0.5,-z+0.5', '-y+0.5,x+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+0.5,-y+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,-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: 132 + schoenflies: D4h^10 + universal_h_m: P 42/m c m (a+b,-a+b,c+1/4) + P42/mcm(a+b,-a+b+1/2,c): + 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) + symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', '-y+0.5,-x+0.5,-z+0.5', + 'x,-y+0.5,-z', 'y,x,-z+0.5', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', 'y,-x+0.5,-z+0.5', + 'x,y,-z', '-y+0.5,x,-z+0.5', 'y,x,z+0.5', '-x+0.5,y,z', '-y+0.5,-x+0.5,z+0.5', + 'x,-y+0.5,z', 'x+0.5,y+0.5,z', '-y,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x,z+0.5', + '-y,-x,-z+0.5', 'x+0.5,-y,-z', 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', + 'y+0.5,-x,-z+0.5', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', 'y+0.5,x+0.5,z+0.5', + '-x,y+0.5,z', '-y,-x,z+0.5', 'x+0.5,-y,z'] + ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z', + 'y,x,-z+0.5', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z+0.5', + 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', '-x,y+0.5,z', '-y,-x,z+0.5', 'x+0.5,-y,z', + 'y+0.5,x+0.5,z+0.5'] + number: 132 + schoenflies: D4h^10 + universal_h_m: P 42/m c m (a+b,-a+b+1/2,c) + I4/mcm(a+1/4,b-1/4,c+1/4): + 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) + symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', 'x,-y+0.5,-z', + 'y+0.5,x+0.5,-z', '-x+0.5,y,-z', '-y,-x,-z', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x,-z+0.5', + 'x,y,-z+0.5', '-y,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+0.5,z+0.5', '-y+0.5,x,z+0.5', '-x,-y,z+0.5', 'y,-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,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', '-x,y+0.5,z', '-y+0.5,-x+0.5,z', + 'x+0.5,-y,z', 'y,x,z'] + ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z', + 'y,x,-z+0.5', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z+0.5', + 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', '-x,y+0.5,z', '-y,-x,z+0.5', 'x+0.5,-y,z', + 'y+0.5,x+0.5,z+0.5'] + number: 140 + schoenflies: D4h^18 + universal_h_m: I 4/m c m (a+1/4,b-1/4,c+1/4) + I4/mmm(a+b+1/2,-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+1/4) + hermann_mauguin: I 4/m m m (a+b+1/2,-a+b,c-1/4) + symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-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', '-x+0.5,-y+0.5,-z+0.5', + 'y+0.5,-x,-z+0.5', 'x,y,-z+0.5', '-y,x+0.5,-z+0.5', 'y+0.5,x+0.5,z', '-x+0.5,y,z', + '-y,-x,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', '-y+0.5,x,z', '-x,-y,z', 'y,-x+0.5,z', + '-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', + '-x,-y,-z+0.5', 'y,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-y+0.5,x,-z+0.5', + 'y,x,z', '-x,y+0.5,z', '-y+0.5,-x+0.5,z', 'x+0.5,-y,z', 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', + '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-y+0.5,-x,-z', 'x+0.5,-y+0.5,-z', 'y,x+0.5,-z', + '-x,y,-z', '-x,-y+0.5,-z', 'y,-x,-z', 'x+0.5,y,-z', '-y+0.5,x+0.5,-z', 'y,x+0.5,z+0.5', + '-x,y,z+0.5', '-y+0.5,-x,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x,y+0.5,z+0.5', '-y,x,z+0.5', + '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-y,-x+0.5,-z', 'x,-y,-z', 'y+0.5,x,-z', + '-x+0.5,y+0.5,-z', '-x+0.5,-y,-z', 'y+0.5,-x+0.5,-z', 'x,y+0.5,-z', '-y,x,-z', + 'y+0.5,x,z+0.5', '-x+0.5,y+0.5,z+0.5', '-y,-x+0.5,z+0.5', 'x,-y,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', + '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: 139 + schoenflies: D4h^17 + universal_h_m: I 4/m m m (a+b+1/2,-a+b,c-1/4) + P42/mmc(a+b,-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) + symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-y,-x,-z+0.5', 'x,-y,-z', + 'y,x,-z+0.5', '-x,y,-z', '-x,-y,-z+0.5', 'y,-x,-z', 'x,y,-z+0.5', '-y,x,-z', + 'y,x,z', '-x,y,z+0.5', '-y,-x,z', 'x,-y,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', '-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+0.5,y+0.5,-z', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z', + 'x+0.5,y+0.5,-z+0.5', '-y+0.5,x+0.5,-z', 'y+0.5,x+0.5,z', '-x+0.5,y+0.5,z+0.5', + '-y+0.5,-x+0.5,z', 'x+0.5,-y+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,-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: 131 + schoenflies: D4h^9 + universal_h_m: P 42/m m c (a+b,-a+b,c-1/4) + P42/mmc(a+b,-a+b+1/2,c): + 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) + symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', '-y+0.5,-x+0.5,-z', + 'x,-y+0.5,-z+0.5', 'y,x,-z', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z', 'y,-x+0.5,-z+0.5', + 'x,y,-z', '-y+0.5,x,-z+0.5', 'y,x,z', '-x+0.5,y,z+0.5', '-y+0.5,-x+0.5,z', 'x,-y+0.5,z+0.5', + 'x+0.5,y+0.5,z', '-y,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x,z+0.5', '-y,-x,-z', + 'x+0.5,-y,-z+0.5', 'y+0.5,x+0.5,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z+0.5', + 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', 'y+0.5,x+0.5,z', '-x,y+0.5,z+0.5', '-y,-x,z', + 'x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z+0.5', + 'y,x,-z', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y+0.5,-x,-z+0.5', + 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', '-x,y+0.5,z+0.5', '-y,-x,z', 'x+0.5,-y,z+0.5', + 'y+0.5,x+0.5,z'] + number: 131 + schoenflies: D4h^9 + universal_h_m: P 42/m m c (a+b,-a+b+1/2,c) + I4/mmm(a+1/4,b-1/4,c+1/4): + 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) + symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '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+0.5,-y+0.5,-z+0.5', + 'y+0.5,-x,-z+0.5', 'x,y,-z+0.5', '-y,x+0.5,-z+0.5', '-x+0.5,y,z', '-y,-x,z', + 'x,-y+0.5,z', 'y+0.5,x+0.5,z', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x,z+0.5', '-x,-y,z+0.5', + 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z', 'y,x,-z', '-x,y+0.5,-z', '-y+0.5,-x+0.5,-z', + '-x,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', '-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'] + ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z+0.5', + 'y,x,-z', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y+0.5,-x,-z+0.5', + 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', '-x,y+0.5,z+0.5', '-y,-x,z', 'x+0.5,-y,z+0.5', + 'y+0.5,x+0.5,z'] + number: 139 + schoenflies: D4h^17 + universal_h_m: I 4/m m m (a+1/4,b-1/4,c+1/4) + P6/m(2*a,2*b,2*c): + 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) + 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+0.5,y,z', 'x-y+0.5,x,z', + '-y+0.5,x-y,z', '-x+0.5,-y,z', '-x+y+0.5,-x,z', 'y+0.5,-x+y,z', '-x+0.5,-y,-z', + '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', + 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', '-x,-y+0.5,z', '-x+y,-x+0.5,z', + 'y,-x+y+0.5,z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', 'x,y+0.5,-z', + 'x-y,x+0.5,-z', '-y,x-y+0.5,-z', 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', + '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z', '-x+0.5,-y+0.5,-z', + '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', + '-y+0.5,x-y+0.5,-z', 'x,y,z+0.5', 'x-y,x,z+0.5', '-y,x-y,z+0.5', '-x,-y,z+0.5', + '-x+y,-x,z+0.5', 'y,-x+y,z+0.5', '-x,-y,-z+0.5', '-x+y,-x,-z+0.5', 'y,-x+y,-z+0.5', + 'x,y,-z+0.5', 'x-y,x,-z+0.5', '-y,x-y,-z+0.5', 'x+0.5,y,z+0.5', 'x-y+0.5,x,z+0.5', + '-y+0.5,x-y,z+0.5', '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z+0.5', 'y+0.5,-x+y,z+0.5', + '-x+0.5,-y,-z+0.5', '-x+y+0.5,-x,-z+0.5', 'y+0.5,-x+y,-z+0.5', 'x+0.5,y,-z+0.5', + 'x-y+0.5,x,-z+0.5', '-y+0.5,x-y,-z+0.5', 'x,y+0.5,z+0.5', 'x-y,x+0.5,z+0.5', + '-y,x-y+0.5,z+0.5', '-x,-y+0.5,z+0.5', '-x+y,-x+0.5,z+0.5', 'y,-x+y+0.5,z+0.5', + '-x,-y+0.5,-z+0.5', '-x+y,-x+0.5,-z+0.5', 'y,-x+y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', + 'x-y,x+0.5,-z+0.5', '-y,x-y+0.5,-z+0.5', 'x+0.5,y+0.5,z+0.5', 'x-y+0.5,x+0.5,z+0.5', + '-y+0.5,x-y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', '-x+y+0.5,-x+0.5,z+0.5', 'y+0.5,-x+y+0.5,z+0.5', + '-x+0.5,-y+0.5,-z+0.5', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', + 'x-y+0.5,x+0.5,-z+0.5', '-y+0.5,x-y+0.5,-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', '-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 (2*a,2*b,2*c) + P6/m(2*a,2*b,c): + crystal_class: hexagonal + hall: -P 6 (1/2*x,1/2*y,z) + hermann_mauguin: P 6/m (2*a,2*b,c) + 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+0.5,y,z', 'x-y+0.5,x,z', + '-y+0.5,x-y,z', '-x+0.5,-y,z', '-x+y+0.5,-x,z', 'y+0.5,-x+y,z', '-x+0.5,-y,-z', + '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', + 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', '-x,-y+0.5,z', '-x+y,-x+0.5,z', + 'y,-x+y+0.5,z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', 'x,y+0.5,-z', + 'x-y,x+0.5,-z', '-y,x-y+0.5,-z', 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', + '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z', '-x+0.5,-y+0.5,-z', + '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', + '-y+0.5,x-y+0.5,-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 (2*a,2*b,c) + P63/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) + 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', + 'x+0.5,y,z', 'x-y+0.5,x,z+0.5', '-y+0.5,x-y,z', '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z', + 'y+0.5,-x+y,z+0.5', '-x+0.5,-y,-z', '-x+y+0.5,-x,-z+0.5', 'y+0.5,-x+y,-z', 'x+0.5,y,-z+0.5', + 'x-y+0.5,x,-z', '-y+0.5,x-y,-z+0.5', 'x,y+0.5,z', 'x-y,x+0.5,z+0.5', '-y,x-y+0.5,z', + '-x,-y+0.5,z+0.5', '-x+y,-x+0.5,z', 'y,-x+y+0.5,z+0.5', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z+0.5', + 'y,-x+y+0.5,-z', 'x,y+0.5,-z+0.5', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z+0.5', 'x+0.5,y+0.5,z', + 'x-y+0.5,x+0.5,z+0.5', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z+0.5', '-x+y+0.5,-x+0.5,z', + 'y+0.5,-x+y+0.5,z+0.5', '-x+0.5,-y+0.5,-z', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z', + 'x+0.5,y+0.5,-z+0.5', 'x-y+0.5,x+0.5,-z', '-y+0.5,x-y+0.5,-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 (2*a,2*b,c) + P6/mmm(2*a,2*b,2*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) + 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+0.5,y,z', 'x-y+0.5,x,z', '-y+0.5,x-y,z', + '-x+0.5,-y,z', '-x+y+0.5,-x,z', 'y+0.5,-x+y,z', '-y+0.5,-x,-z', 'x-y+0.5,-y,-z', + 'x+0.5,x-y,-z', 'y+0.5,x,-z', '-x+y+0.5,y,-z', '-x+0.5,-x+y,-z', '-x+0.5,-y,-z', + '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', + 'y+0.5,x,z', '-x+y+0.5,y,z', '-x+0.5,-x+y,z', '-y+0.5,-x,z', 'x-y+0.5,-y,z', + 'x+0.5,x-y,z', 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', '-x,-y+0.5,z', '-x+y,-x+0.5,z', + 'y,-x+y+0.5,z', '-y,-x+0.5,-z', 'x-y,-y+0.5,-z', 'x,x-y+0.5,-z', 'y,x+0.5,-z', + '-x+y,y+0.5,-z', '-x,-x+y+0.5,-z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', + 'x,y+0.5,-z', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z', 'y,x+0.5,z', '-x+y,y+0.5,z', + '-x,-x+y+0.5,z', '-y,-x+0.5,z', 'x-y,-y+0.5,z', 'x,x-y+0.5,z', 'x+0.5,y+0.5,z', + 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', + 'y+0.5,-x+y+0.5,z', '-y+0.5,-x+0.5,-z', 'x-y+0.5,-y+0.5,-z', 'x+0.5,x-y+0.5,-z', + 'y+0.5,x+0.5,-z', '-x+y+0.5,y+0.5,-z', '-x+0.5,-x+y+0.5,-z', '-x+0.5,-y+0.5,-z', + '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', + '-y+0.5,x-y+0.5,-z', 'y+0.5,x+0.5,z', '-x+y+0.5,y+0.5,z', '-x+0.5,-x+y+0.5,z', + '-y+0.5,-x+0.5,z', 'x-y+0.5,-y+0.5,z', 'x+0.5,x-y+0.5,z', 'x,y,z+0.5', 'x-y,x,z+0.5', + '-y,x-y,z+0.5', '-x,-y,z+0.5', '-x+y,-x,z+0.5', 'y,-x+y,z+0.5', '-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+0.5', '-x+y,-x,-z+0.5', 'y,-x+y,-z+0.5', 'x,y,-z+0.5', 'x-y,x,-z+0.5', + '-y,x-y,-z+0.5', '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+0.5,y,z+0.5', 'x-y+0.5,x,z+0.5', '-y+0.5,x-y,z+0.5', + '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z+0.5', 'y+0.5,-x+y,z+0.5', '-y+0.5,-x,-z+0.5', + 'x-y+0.5,-y,-z+0.5', 'x+0.5,x-y,-z+0.5', 'y+0.5,x,-z+0.5', '-x+y+0.5,y,-z+0.5', + '-x+0.5,-x+y,-z+0.5', '-x+0.5,-y,-z+0.5', '-x+y+0.5,-x,-z+0.5', 'y+0.5,-x+y,-z+0.5', + 'x+0.5,y,-z+0.5', 'x-y+0.5,x,-z+0.5', '-y+0.5,x-y,-z+0.5', 'y+0.5,x,z+0.5', + '-x+y+0.5,y,z+0.5', '-x+0.5,-x+y,z+0.5', '-y+0.5,-x,z+0.5', 'x-y+0.5,-y,z+0.5', + 'x+0.5,x-y,z+0.5', 'x,y+0.5,z+0.5', 'x-y,x+0.5,z+0.5', '-y,x-y+0.5,z+0.5', '-x,-y+0.5,z+0.5', + '-x+y,-x+0.5,z+0.5', 'y,-x+y+0.5,z+0.5', '-y,-x+0.5,-z+0.5', 'x-y,-y+0.5,-z+0.5', + 'x,x-y+0.5,-z+0.5', 'y,x+0.5,-z+0.5', '-x+y,y+0.5,-z+0.5', '-x,-x+y+0.5,-z+0.5', + '-x,-y+0.5,-z+0.5', '-x+y,-x+0.5,-z+0.5', 'y,-x+y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', + 'x-y,x+0.5,-z+0.5', '-y,x-y+0.5,-z+0.5', 'y,x+0.5,z+0.5', '-x+y,y+0.5,z+0.5', + '-x,-x+y+0.5,z+0.5', '-y,-x+0.5,z+0.5', 'x-y,-y+0.5,z+0.5', 'x,x-y+0.5,z+0.5', + 'x+0.5,y+0.5,z+0.5', 'x-y+0.5,x+0.5,z+0.5', '-y+0.5,x-y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', + '-x+y+0.5,-x+0.5,z+0.5', 'y+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'x-y+0.5,-y+0.5,-z+0.5', + 'x+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x+y+0.5,y+0.5,-z+0.5', '-x+0.5,-x+y+0.5,-z+0.5', + '-x+0.5,-y+0.5,-z+0.5', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', + 'x-y+0.5,x+0.5,-z+0.5', '-y+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,z+0.5', '-x+y+0.5,y+0.5,z+0.5', + '-x+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x-y+0.5,-y+0.5,z+0.5', 'x+0.5,x-y+0.5,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', + '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 (2*a,2*b,2*c) + P6/mmm(2*a,2*b,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) + 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+0.5,y,z', 'x-y+0.5,x,z', '-y+0.5,x-y,z', + '-x+0.5,-y,z', '-x+y+0.5,-x,z', 'y+0.5,-x+y,z', '-y+0.5,-x,-z', 'x-y+0.5,-y,-z', + 'x+0.5,x-y,-z', 'y+0.5,x,-z', '-x+y+0.5,y,-z', '-x+0.5,-x+y,-z', '-x+0.5,-y,-z', + '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', + 'y+0.5,x,z', '-x+y+0.5,y,z', '-x+0.5,-x+y,z', '-y+0.5,-x,z', 'x-y+0.5,-y,z', + 'x+0.5,x-y,z', 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', '-x,-y+0.5,z', '-x+y,-x+0.5,z', + 'y,-x+y+0.5,z', '-y,-x+0.5,-z', 'x-y,-y+0.5,-z', 'x,x-y+0.5,-z', 'y,x+0.5,-z', + '-x+y,y+0.5,-z', '-x,-x+y+0.5,-z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', + 'x,y+0.5,-z', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z', 'y,x+0.5,z', '-x+y,y+0.5,z', + '-x,-x+y+0.5,z', '-y,-x+0.5,z', 'x-y,-y+0.5,z', 'x,x-y+0.5,z', 'x+0.5,y+0.5,z', + 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', + 'y+0.5,-x+y+0.5,z', '-y+0.5,-x+0.5,-z', 'x-y+0.5,-y+0.5,-z', 'x+0.5,x-y+0.5,-z', + 'y+0.5,x+0.5,-z', '-x+y+0.5,y+0.5,-z', '-x+0.5,-x+y+0.5,-z', '-x+0.5,-y+0.5,-z', + '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', + '-y+0.5,x-y+0.5,-z', 'y+0.5,x+0.5,z', '-x+y+0.5,y+0.5,z', '-x+0.5,-x+y+0.5,z', + '-y+0.5,-x+0.5,z', 'x-y+0.5,-y+0.5,z', 'x+0.5,x-y+0.5,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 (2*a,2*b,c) + P6/mcc(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) + 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', + 'x+0.5,y,z', 'x-y+0.5,x,z', '-y+0.5,x-y,z', '-x+0.5,-y,z', '-x+y+0.5,-x,z', + 'y+0.5,-x+y,z', '-y+0.5,-x,-z+0.5', 'x-y+0.5,-y,-z+0.5', 'x+0.5,x-y,-z+0.5', + 'y+0.5,x,-z+0.5', '-x+y+0.5,y,-z+0.5', '-x+0.5,-x+y,-z+0.5', '-x+0.5,-y,-z', + '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', + 'y+0.5,x,z+0.5', '-x+y+0.5,y,z+0.5', '-x+0.5,-x+y,z+0.5', '-y+0.5,-x,z+0.5', + 'x-y+0.5,-y,z+0.5', 'x+0.5,x-y,z+0.5', 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', + '-x,-y+0.5,z', '-x+y,-x+0.5,z', 'y,-x+y+0.5,z', '-y,-x+0.5,-z+0.5', 'x-y,-y+0.5,-z+0.5', + 'x,x-y+0.5,-z+0.5', 'y,x+0.5,-z+0.5', '-x+y,y+0.5,-z+0.5', '-x,-x+y+0.5,-z+0.5', + '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', 'x,y+0.5,-z', 'x-y,x+0.5,-z', + '-y,x-y+0.5,-z', 'y,x+0.5,z+0.5', '-x+y,y+0.5,z+0.5', '-x,-x+y+0.5,z+0.5', '-y,-x+0.5,z+0.5', + 'x-y,-y+0.5,z+0.5', 'x,x-y+0.5,z+0.5', 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', + '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z', '-y+0.5,-x+0.5,-z+0.5', + 'x-y+0.5,-y+0.5,-z+0.5', 'x+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x+y+0.5,y+0.5,-z+0.5', + '-x+0.5,-x+y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', + 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', '-y+0.5,x-y+0.5,-z', 'y+0.5,x+0.5,z+0.5', + '-x+y+0.5,y+0.5,z+0.5', '-x+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x-y+0.5,-y+0.5,z+0.5', + 'x+0.5,x-y+0.5,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 (2*a,2*b,c) + P63/mcm(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) + 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', + 'x+0.5,y,z', 'x-y+0.5,x,z+0.5', '-y+0.5,x-y,z', '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z', + 'y+0.5,-x+y,z+0.5', '-y+0.5,-x,-z', 'x-y+0.5,-y,-z+0.5', 'x+0.5,x-y,-z', 'y+0.5,x,-z+0.5', + '-x+y+0.5,y,-z', '-x+0.5,-x+y,-z+0.5', '-x+0.5,-y,-z', '-x+y+0.5,-x,-z+0.5', + 'y+0.5,-x+y,-z', 'x+0.5,y,-z+0.5', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z+0.5', 'y+0.5,x,z', + '-x+y+0.5,y,z+0.5', '-x+0.5,-x+y,z', '-y+0.5,-x,z+0.5', 'x-y+0.5,-y,z', 'x+0.5,x-y,z+0.5', + 'x,y+0.5,z', 'x-y,x+0.5,z+0.5', '-y,x-y+0.5,z', '-x,-y+0.5,z+0.5', '-x+y,-x+0.5,z', + 'y,-x+y+0.5,z+0.5', '-y,-x+0.5,-z', 'x-y,-y+0.5,-z+0.5', 'x,x-y+0.5,-z', 'y,x+0.5,-z+0.5', + '-x+y,y+0.5,-z', '-x,-x+y+0.5,-z+0.5', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z+0.5', + 'y,-x+y+0.5,-z', 'x,y+0.5,-z+0.5', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z+0.5', 'y,x+0.5,z', + '-x+y,y+0.5,z+0.5', '-x,-x+y+0.5,z', '-y,-x+0.5,z+0.5', 'x-y,-y+0.5,z', 'x,x-y+0.5,z+0.5', + 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z+0.5', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z+0.5', + '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,-z', 'x-y+0.5,-y+0.5,-z+0.5', + 'x+0.5,x-y+0.5,-z', 'y+0.5,x+0.5,-z+0.5', '-x+y+0.5,y+0.5,-z', '-x+0.5,-x+y+0.5,-z+0.5', + '-x+0.5,-y+0.5,-z', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z+0.5', + 'x-y+0.5,x+0.5,-z', '-y+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,z', '-x+y+0.5,y+0.5,z+0.5', + '-x+0.5,-x+y+0.5,z', '-y+0.5,-x+0.5,z+0.5', 'x-y+0.5,-y+0.5,z', 'x+0.5,x-y+0.5,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 (2*a,2*b,c) + P63/mmc(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) + 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', + 'x+0.5,y,z', 'x-y+0.5,x,z+0.5', '-y+0.5,x-y,z', '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z', + 'y+0.5,-x+y,z+0.5', '-y+0.5,-x,-z+0.5', 'x-y+0.5,-y,-z', 'x+0.5,x-y,-z+0.5', + 'y+0.5,x,-z', '-x+y+0.5,y,-z+0.5', '-x+0.5,-x+y,-z', '-x+0.5,-y,-z', '-x+y+0.5,-x,-z+0.5', + 'y+0.5,-x+y,-z', 'x+0.5,y,-z+0.5', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z+0.5', 'y+0.5,x,z+0.5', + '-x+y+0.5,y,z', '-x+0.5,-x+y,z+0.5', '-y+0.5,-x,z', 'x-y+0.5,-y,z+0.5', 'x+0.5,x-y,z', + 'x,y+0.5,z', 'x-y,x+0.5,z+0.5', '-y,x-y+0.5,z', '-x,-y+0.5,z+0.5', '-x+y,-x+0.5,z', + 'y,-x+y+0.5,z+0.5', '-y,-x+0.5,-z+0.5', 'x-y,-y+0.5,-z', 'x,x-y+0.5,-z+0.5', + 'y,x+0.5,-z', '-x+y,y+0.5,-z+0.5', '-x,-x+y+0.5,-z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z+0.5', + 'y,-x+y+0.5,-z', 'x,y+0.5,-z+0.5', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z+0.5', 'y,x+0.5,z+0.5', + '-x+y,y+0.5,z', '-x,-x+y+0.5,z+0.5', '-y,-x+0.5,z', 'x-y,-y+0.5,z+0.5', 'x,x-y+0.5,z', + 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z+0.5', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z+0.5', + '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'x-y+0.5,-y+0.5,-z', + 'x+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z', '-x+y+0.5,y+0.5,-z+0.5', '-x+0.5,-x+y+0.5,-z', + '-x+0.5,-y+0.5,-z', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z+0.5', + 'x-y+0.5,x+0.5,-z', '-y+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,z+0.5', '-x+y+0.5,y+0.5,z', + '-x+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,z', 'x-y+0.5,-y+0.5,z+0.5', 'x+0.5,x-y+0.5,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 (2*a,2*b,c) + Fm-3(a-1/4,b-1/4,c-1/4): + 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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', + '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', + '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x+0.5,-y+0.5,-z+0.5', 'x,y,-z+0.5', + '-x+0.5,y,z', 'x,-y+0.5,z', '-z+0.5,-x+0.5,-y+0.5', 'z,x,-y+0.5', '-z+0.5,x,y', + 'z,-x+0.5,y', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z,x', 'y,-z+0.5,x', 'y,z,-x+0.5', + 'x,y+0.5,z+0.5', '-x+0.5,-y,z+0.5', 'x,-y,-z', '-x+0.5,y+0.5,-z', 'z,x+0.5,y+0.5', + '-z+0.5,-x,y+0.5', 'z,-x,-y', '-z+0.5,x+0.5,-y', 'y,z+0.5,x+0.5', 'y,-z,-x', + '-y+0.5,z+0.5,-x', '-y+0.5,-z,x+0.5', '-x+0.5,-y,-z', 'x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', + 'x,-y,z+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', + '-y+0.5,-z,-x', '-y+0.5,z+0.5,x+0.5', 'y,-z,x+0.5', 'y,z+0.5,-x', 'x+0.5,y,z+0.5', + '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y,-z', 'z+0.5,x,y+0.5', '-z,-x+0.5,y+0.5', + 'z+0.5,-x+0.5,-y', '-z,x,-y', 'y+0.5,z,x+0.5', 'y+0.5,-z+0.5,-x', '-y,z,-x', + '-y,-z+0.5,x+0.5', '-x,-y+0.5,-z', 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', + '-z,-x+0.5,-y', 'z+0.5,x,-y', '-z,x,y+0.5', 'z+0.5,-x+0.5,y+0.5', '-y,-z+0.5,-x', + '-y,z,x+0.5', 'y+0.5,-z+0.5,x+0.5', 'y+0.5,z,-x', 'x+0.5,y+0.5,z', '-x,-y,z', + 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z+0.5', 'z+0.5,x+0.5,y', '-z,-x,y', 'z+0.5,-x,-y+0.5', + '-z,x+0.5,-y+0.5', 'y+0.5,z+0.5,x', 'y+0.5,-z,-x+0.5', '-y,z+0.5,-x+0.5', '-y,-z,x', + '-x,-y,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z', 'x+0.5,-y,z', '-z,-x,-y+0.5', + 'z+0.5,x+0.5,-y+0.5', '-z,x+0.5,y', 'z+0.5,-x,y', '-y,-z,-x+0.5', '-y,z+0.5,x', + 'y+0.5,-z,x', '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: 202 + schoenflies: Th^3 + universal_h_m: F m -3 (a-1/4,b-1/4,c-1/4) + Im-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) + symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', + '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', + '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x+0.5,-y+0.5,-z+0.5', 'x,y,-z+0.5', + '-x+0.5,y,z', 'x,-y+0.5,z', '-z+0.5,-x+0.5,-y+0.5', 'z,x,-y+0.5', '-z+0.5,x,y', + 'z,-x+0.5,y', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z,x', 'y,-z+0.5,x', 'y,z,-x+0.5', + 'x+0.5,y+0.5,z+0.5', '-x,-y,z+0.5', 'x+0.5,-y,-z', '-x,y+0.5,-z', 'z+0.5,x+0.5,y+0.5', + '-z,-x,y+0.5', 'z+0.5,-x,-y', '-z,x+0.5,-y', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z,-x', + '-y,z+0.5,-x', '-y,-z,x+0.5', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', + 'x+0.5,-y,z+0.5', '-z,-x,-y', 'z+0.5,x+0.5,-y', '-z,x+0.5,y+0.5', 'z+0.5,-x,y+0.5', + '-y,-z,-x', '-y,z+0.5,x+0.5', 'y+0.5,-z,x+0.5', 'y+0.5,z+0.5,-x'] + ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', + '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', + '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', + 'x+0.5,-y,z+0.5', '-z,-x,-y', 'z+0.5,x+0.5,-y', '-z,x+0.5,y+0.5', 'z+0.5,-x,y+0.5', + '-y,-z,-x', '-y,z+0.5,x+0.5', 'y+0.5,-z,x+0.5', 'y+0.5,z+0.5,-x'] + number: 204 + schoenflies: Th^5 + universal_h_m: I m -3 (a-1/4,b-1/4,c-1/4) + Fm-3c(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) + symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y+0.5,-z+0.5', 'y+0.5,x,-z+0.5', + '-x,y+0.5,-z+0.5', '-y+0.5,-x,-z+0.5', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', + 'z,-x+0.5,-y+0.5', 'x+0.5,z,-y+0.5', '-z,x+0.5,-y+0.5', '-x+0.5,-z,-y+0.5', + 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y+0.5,-x+0.5', '-y+0.5,-z+0.5,x', + 'z,-y+0.5,x+0.5', '-z,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,z', '-y,-x+0.5,z', 'x+0.5,-y,z', + 'y,x+0.5,z', '-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,y', '-x,-z+0.5,y', 'z+0.5,-x,y', 'x,z+0.5,y', + '-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,x', 'y,z,-x+0.5', '-z+0.5,y,-x', 'z+0.5,-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,-z', 'y+0.5,x+0.5,-z', '-x,y,-z', + '-y+0.5,-x+0.5,-z', '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,-y', 'x+0.5,z+0.5,-y', '-z,x,-y', '-x+0.5,-z+0.5,-y', '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,-x', '-y+0.5,-z,x+0.5', + 'z,-y,x', '-z,y,x', '-x+0.5,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y,-z', '-y+0.5,x,-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', '-z+0.5,-x,-y', + 'x+0.5,-z,-y', 'z+0.5,x,-y', '-x+0.5,z,-y', '-z+0.5,x+0.5,y+0.5', '-x,-z,y+0.5', + 'z+0.5,-x+0.5,y+0.5', 'x,z,y+0.5', '-y+0.5,-z,-x', '-y+0.5,z,x', '-z+0.5,-y,x', + 'y+0.5,-z,x', 'z+0.5,y+0.5,x+0.5', 'y,z+0.5,-x', '-z+0.5,y+0.5,-x+0.5', 'z+0.5,-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+0.5,-z', + 'y,x,-z', '-x+0.5,y+0.5,-z', '-y,-x,-z', '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+0.5,-y', 'x,z,-y', '-z+0.5,x+0.5,-y', + '-x,-z,-y', '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+0.5,-x', '-y,-z+0.5,x+0.5', 'z+0.5,-y+0.5,x', '-z+0.5,y+0.5,x', '-x,-y+0.5,-z', + 'y,-x+0.5,-z', 'x,y+0.5,-z', '-y,x+0.5,-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', '-z,-x+0.5,-y', 'x,-z+0.5,-y', 'z,x+0.5,-y', + '-x,z+0.5,-y', '-z,x,y+0.5', '-x+0.5,-z+0.5,y+0.5', 'z,-x,y+0.5', 'x+0.5,z+0.5,y+0.5', + '-y,-z+0.5,-x', '-y,z+0.5,x', '-z,-y+0.5,x', 'y,-z+0.5,x', 'z,y,x+0.5', 'y+0.5,z,-x', + '-z,y,-x+0.5', 'z,-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,-z+0.5', 'y,x+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-y,-x+0.5,-z+0.5', + '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,-y+0.5', + 'x,z+0.5,-y+0.5', '-z+0.5,x,-y+0.5', '-x,-z+0.5,-y+0.5', '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,-x+0.5', '-y,-z,x', 'z+0.5,-y,x+0.5', + '-z+0.5,y,x+0.5', '-x,-y,-z+0.5', 'y,-x,-z+0.5', 'x,y,-z+0.5', '-y,x,-z+0.5', + '-x,y+0.5,z', '-y+0.5,-x,z', 'x,-y+0.5,z', 'y+0.5,x,z', '-z,-x,-y+0.5', 'x,-z,-y+0.5', + 'z,x,-y+0.5', '-x,z,-y+0.5', '-z,x+0.5,y', '-x+0.5,-z,y', 'z,-x+0.5,y', 'x+0.5,z,y', + '-y,-z,-x+0.5', '-y,z,x+0.5', '-z,-y,x+0.5', 'y,-z,x+0.5', 'z,y+0.5,x', 'y+0.5,z+0.5,-x+0.5', + '-z,y+0.5,-x', 'z,-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+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: 226 + schoenflies: Oh^6 + universal_h_m: F m -3 c (a+1/4,b+1/4,c+1/4) + Im-3m(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) + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', + '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', + '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x+0.5,-y+0.5,-z+0.5', + 'y,-x+0.5,-z+0.5', 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', '-x+0.5,y,z', '-y+0.5,-x+0.5,z', + 'x,-y+0.5,z', 'y,x,z', '-z+0.5,-x+0.5,-y+0.5', 'x,-z+0.5,-y+0.5', 'z,x,-y+0.5', + '-x+0.5,z,-y+0.5', '-z+0.5,x,y', '-x+0.5,-z+0.5,y', 'z,-x+0.5,y', 'x,z,y', '-y+0.5,-z+0.5,-x+0.5', + '-y+0.5,z,x', '-z+0.5,-y+0.5,x', 'y,-z+0.5,x', 'z,y,x', 'y,z,-x+0.5', '-z+0.5,y,-x+0.5', + 'z,-y+0.5,-x+0.5', 'x+0.5,y+0.5,z+0.5', '-y,x+0.5,z+0.5', '-x,-y,z+0.5', 'y+0.5,-x,z+0.5', + 'x+0.5,-y,-z', 'y+0.5,x+0.5,-z', '-x,y+0.5,-z', '-y,-x,-z', 'z+0.5,x+0.5,y+0.5', + '-x,z+0.5,y+0.5', '-z,-x,y+0.5', 'x+0.5,-z,y+0.5', 'z+0.5,-x,-y', 'x+0.5,z+0.5,-y', + '-z,x+0.5,-y', '-x,-z,-y', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z,-x', 'z+0.5,y+0.5,-x', + '-y,z+0.5,-x', '-z,-y,-x', '-y,-z,x+0.5', 'z+0.5,-y,x+0.5', '-z,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+0.5,z+0.5', + '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', 'y+0.5,x+0.5,z+0.5', '-z,-x,-y', 'x+0.5,-z,-y', + 'z+0.5,x+0.5,-y', '-x,z+0.5,-y', '-z,x+0.5,y+0.5', '-x,-z,y+0.5', 'z+0.5,-x,y+0.5', + 'x+0.5,z+0.5,y+0.5', '-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+0.5,x+0.5', 'y+0.5,z+0.5,-x', '-z,y+0.5,-x', 'z+0.5,-y,-x'] + ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', + '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', + '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x,-y,-z', + 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', + 'x+0.5,-y,z+0.5', 'y+0.5,x+0.5,z+0.5', '-z,-x,-y', 'x+0.5,-z,-y', 'z+0.5,x+0.5,-y', + '-x,z+0.5,-y', '-z,x+0.5,y+0.5', '-x,-z,y+0.5', 'z+0.5,-x,y+0.5', 'x+0.5,z+0.5,y+0.5', + '-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+0.5,x+0.5', + 'y+0.5,z+0.5,-x', '-z,y+0.5,-x', 'z+0.5,-y,-x'] + number: 229 + schoenflies: Oh^9 + universal_h_m: I m -3 m (a-1/4,b-1/4,c-1/4) + Fm-3m(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) + symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', + 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', + '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', + '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x+0.5,-y+0.5,-z+0.5', + 'y,-x+0.5,-z+0.5', 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', '-x+0.5,y,z', '-y+0.5,-x+0.5,z', + 'x,-y+0.5,z', 'y,x,z', '-z+0.5,-x+0.5,-y+0.5', 'x,-z+0.5,-y+0.5', 'z,x,-y+0.5', + '-x+0.5,z,-y+0.5', '-z+0.5,x,y', '-x+0.5,-z+0.5,y', 'z,-x+0.5,y', 'x,z,y', '-y+0.5,-z+0.5,-x+0.5', + '-y+0.5,z,x', '-z+0.5,-y+0.5,x', 'y,-z+0.5,x', 'z,y,x', 'y,z,-x+0.5', '-z+0.5,y,-x+0.5', + 'z,-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,z+0.5', + 'y,-x,z+0.5', 'x,-y,-z', 'y,x+0.5,-z', '-x+0.5,y+0.5,-z', '-y+0.5,-x,-z', '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,-y', 'x,z+0.5,-y', + '-z+0.5,x+0.5,-y', '-x+0.5,-z,-y', '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,-x', '-y+0.5,-z,x+0.5', 'z,-y,x+0.5', '-z+0.5,y+0.5,x+0.5', + '-x+0.5,-y,-z', 'y,-x,-z', 'x,y+0.5,-z', '-y+0.5,x+0.5,-z', '-x+0.5,y+0.5,z+0.5', + '-y+0.5,-x,z+0.5', 'x,-y,z+0.5', 'y,x+0.5,z+0.5', '-z+0.5,-x,-y', 'x,-z,-y', + 'z,x+0.5,-y', '-x+0.5,z+0.5,-y', '-z+0.5,x+0.5,y+0.5', '-x+0.5,-z,y+0.5', 'z,-x,y+0.5', + 'x,z+0.5,y+0.5', '-y+0.5,-z,-x', '-y+0.5,z+0.5,x+0.5', '-z+0.5,-y,x+0.5', 'y,-z,x+0.5', + 'z,y+0.5,x+0.5', 'y,z+0.5,-x', '-z+0.5,y+0.5,-x', 'z,-y,-x', '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+0.5,-z', 'y+0.5,x,-z', + '-x,y,-z', '-y,-x+0.5,-z', '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+0.5,-y', 'x+0.5,z,-y', '-z,x,-y', '-x,-z+0.5,-y', + 'y+0.5,z,x+0.5', 'y+0.5,-z+0.5,-x', 'z+0.5,y,-x', '-y,z,-x', '-z,-y+0.5,-x', + '-y,-z+0.5,x+0.5', 'z+0.5,-y+0.5,x+0.5', '-z,y,x+0.5', '-x,-y+0.5,-z', 'y+0.5,-x+0.5,-z', + 'x+0.5,y,-z', '-y,x,-z', '-x,y,z+0.5', '-y,-x+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5', + 'y+0.5,x,z+0.5', '-z,-x+0.5,-y', 'x+0.5,-z+0.5,-y', 'z+0.5,x,-y', '-x,z,-y', + '-z,x,y+0.5', '-x,-z+0.5,y+0.5', 'z+0.5,-x+0.5,y+0.5', 'x+0.5,z,y+0.5', '-y,-z+0.5,-x', + '-y,z,x+0.5', '-z,-y+0.5,x+0.5', 'y+0.5,-z+0.5,x+0.5', 'z+0.5,y,x+0.5', 'y+0.5,z,-x', + '-z,y,-x', 'z+0.5,-y+0.5,-x', 'x+0.5,y+0.5,z', '-y,x+0.5,z', '-x,-y,z', 'y+0.5,-x,z', + 'x+0.5,-y,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x,-z+0.5', + 'z+0.5,x+0.5,y', '-x,z+0.5,y', '-z,-x,y', 'x+0.5,-z,y', 'z+0.5,-x,-y+0.5', 'x+0.5,z+0.5,-y+0.5', + '-z,x+0.5,-y+0.5', '-x,-z,-y+0.5', '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,-x+0.5', '-y,-z,x', 'z+0.5,-y,x', '-z,y+0.5,x', '-x,-y,-z+0.5', + 'y+0.5,-x,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-y,x+0.5,-z+0.5', '-x,y+0.5,z', '-y,-x,z', + 'x+0.5,-y,z', 'y+0.5,x+0.5,z', '-z,-x,-y+0.5', 'x+0.5,-z,-y+0.5', 'z+0.5,x+0.5,-y+0.5', + '-x,z+0.5,-y+0.5', '-z,x+0.5,y', '-x,-z,y', 'z+0.5,-x,y', 'x+0.5,z+0.5,y', '-y,-z,-x+0.5', + '-y,z+0.5,x', '-z,-y,x', 'y+0.5,-z,x', 'z+0.5,y+0.5,x', 'y+0.5,z+0.5,-x+0.5', + '-z,y+0.5,-x+0.5', 'z+0.5,-y,-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+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: 225 + schoenflies: Oh^5 + universal_h_m: F m -3 m (a-1/4,b-1/4,c-1/4) + P4bm(a,b,2*c): + crystal_class: tetragonal + hall: ' P 4 -2ab (x,y,1/2*z)' + 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', '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'] + 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+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'] + number: 100 + schoenflies: C4v^2 + universal_h_m: P 4 b m (a,b,2*c) + C1c1(2*a+c,b,c): + crystal_class: monoclinic + hall: ' C -2yc (1/2*x,y,-1/2*x+z)' + hermann_mauguin: C 1 c 1 + symops: ['x,y,z', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', 'x+0.5,-y,z', 'x+0.25,y+0.5,z+0.75', + 'x+0.25,-y+0.5,z+0.25', 'x+0.75,y+0.5,z+0.25', 'x+0.75,-y+0.5,z+0.75'] + ncsym: ['x,y,z', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', 'x+0.5,-y,z'] + number: 9 + schoenflies: Cs^4 + universal_h_m: C 1 c 1 (2*a+c,b,c) + Pmc21(2*a,b,c): + crystal_class: orthorhombic + hall: ' P 2c -2 (1/2*x,y,z)' + hermann_mauguin: P m c 21 + symops: ['x,y,z', '-x,y,z', 'x,-y,z+0.5', '-x,-y,z+0.5', 'x+0.5,y,z', '-x+0.5,y,z', + 'x+0.5,-y,z+0.5', '-x+0.5,-y,z+0.5'] + ncsym: ['x,y,z', '-x,y,z', 'x,-y,z+0.5', '-x,-y,z+0.5'] + number: 26 + schoenflies: C2v^2 + universal_h_m: P m c 21 (2*a,b,c) + Cmm2(2*c,a,b): + crystal_class: orthorhombic + hall: ' C 2 -2 (1/2*z,x,y)' + hermann_mauguin: C 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', 'x+0.5,-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+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: 35 + schoenflies: C2v^11 + universal_h_m: C m m 2 (2*c,a,b) + P121/c1(2*c,2*a+c,b): + crystal_class: monoclinic + hall: -P 2ybc (-1/4*x+1/2*z,1/2*x,y) + hermann_mauguin: P 1 21/c 1 + symops: ['x,y,z', '-x+0.25,-y,z+0.5', '-x,-y,-z', 'x-0.25,y,-z-0.5', 'x+0.75,y+0.5,z', + '-x+1,-y+0.5,z+0.5', '-x+0.75,-y+0.5,-z', 'x+0.5,y+0.5,-z-0.5', 'x+0.25,y+0.5,z', + '-x+0.5,-y+0.5,z+0.5', '-x+0.25,-y+0.5,-z', 'x,y+0.5,-z-0.5', 'x+0.5,y,z', '-x+0.75,-y,z+0.5', + '-x+0.5,-y,-z', 'x+0.25,y,-z-0.5'] + ncsym: ['x,y,z', '-x+0.25,-y,z+0.5', '-x,-y,-z', 'x-0.25,y,-z-0.5'] + number: 14 + schoenflies: C2h^5 + universal_h_m: P 1 21/c 1 (2*c,2*a+c,b) + Pmma(2*b,c,a): + crystal_class: orthorhombic + hall: -P 2a 2a (1/2*y,z,x) + hermann_mauguin: P m m a + 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,z', '-x+0.5,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,-z+0.5', + '-x+0.5,-y,-z', 'x+0.5,-y,-z', '-x+0.5,-y,z-0.5', 'x+0.5,-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: 51 + schoenflies: D2h^5 + universal_h_m: P m m a (2*b,c,a) + Pmma(2*b+1/4,c,a-1/3): + crystal_class: orthorhombic + hall: -P 2a 2a (1/2*y,z+1/3,x-1/4) + hermann_mauguin: P m m a + symops: ['x,y,z', '-x,y,z', 'x,y,-z', '-x,y,-z', 'x+0.5,y,z', '-x+0.5,y,z', 'x+0.5,y,-z', + '-x+0.5,y,-z', '-x,-y+0.667,-z+0.5', 'x,-y+0.667,-z+0.5', '-x,-y+0.667,z+0.5', + 'x,-y+0.667,z+0.5', '-x+0.5,-y+0.667,-z+0.5', 'x+0.5,-y+0.667,-z+0.5', '-x+0.5,-y+0.667,z+0.5', + 'x+0.5,-y+0.667,z+0.5'] + ncsym: ['x,y,z', '-x,y,z', 'x,y,-z', '-x,y,-z', 'x+0.5,y,z', '-x+0.5,y,z', 'x+0.5,y,-z', + '-x+0.5,y,-z'] + number: 51 + schoenflies: D2h^5 + universal_h_m: P m m a (2*b+1/4,c,a-1/3) + P12/c1(a,2*b,c): + crystal_class: monoclinic + hall: -P 2yc (x,1/2*y,z) + hermann_mauguin: P 1 2/c 1 + 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'] + number: 13 + schoenflies: C2h^4 + universal_h_m: P 1 2/c 1 (a,2*b,c) + Pmmm(2*a,2*b,c): + crystal_class: orthorhombic + hall: -P 2 2 (1/2*x,1/2*y,z) + hermann_mauguin: P m m m + symops: ['x,y,z', '-x,y,z', 'x,-y,z', '-x,-y,z', 'x+0.5,y,z', '-x+0.5,y,z', 'x+0.5,-y,z', + '-x+0.5,-y,z', 'x,y+0.5,z', '-x,y+0.5,z', 'x,-y+0.5,z', '-x,-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,-y,-z', 'x,-y,-z', + '-x,y,-z', 'x,y,-z', '-x+0.5,-y,-z', 'x+0.5,-y,-z', '-x+0.5,y,-z', 'x+0.5,y,-z', + '-x,-y+0.5,-z', 'x,-y+0.5,-z', '-x,y+0.5,-z', 'x,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+0.5,y,z', '-x+0.5,y,z', 'x+0.5,-y,z', + '-x+0.5,-y,z'] + number: 47 + schoenflies: D2h^1 + universal_h_m: P m m m (2*a,2*b,c) + P1211(a-1/4,b,c): + crystal_class: monoclinic + hall: ' P 2yb (x+1/4,y,z)' + hermann_mauguin: P 1 21 1 + symops: ['x,y,z', '-x+0.5,y+0.5,-z'] + ncsym: ['x,y,z', '-x+0.5,y+0.5,-z'] + number: 4 + schoenflies: C2^2 + universal_h_m: P 1 21 1 (a-1/4,b,c) + Pnma(c,a-1/4,b): + crystal_class: orthorhombic + hall: -P 2ac 2n (z,x,y+1/4) + hermann_mauguin: P n m a + symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z+0.5', + 'x+0.5,-y+0.5,z+0.5', 'x,y,-z', '-x+0.5,y+0.5,z'] + ncsym: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z+0.5', + 'x+0.5,-y+0.5,z+0.5', 'x,y,-z', '-x+0.5,y+0.5,z'] + number: 62 + schoenflies: D2h^16 + universal_h_m: P n m a (c,a-1/4,b) diff --git a/src/xrpd_toolbox/utils/constants/symmetry_operations.yaml b/src/xrpd_toolbox/utils/constants/symmetry_operations.yaml new file mode 100644 index 0000000..eef9682 --- /dev/null +++ b/src/xrpd_toolbox/utils/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/utils/energy.py b/src/xrpd_toolbox/utils/energy.py deleted file mode 100644 index 8d0a769..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", "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/peaks.py b/src/xrpd_toolbox/utils/peaks.py index 24c04cf..b5e5441 100644 --- a/src/xrpd_toolbox/utils/peaks.py +++ b/src/xrpd_toolbox/utils/peaks.py @@ -4,8 +4,9 @@ import numpy as np import peakutils -from pydantic import BaseModel, model_validator +from pydantic import BaseModel, Field, model_validator from scipy.optimize import curve_fit +from scipy.special import erf def gaussian_sigma_to_fwhm(sigma: float | int) -> float: @@ -58,8 +59,6 @@ def gaussian( NDArray[np.float64] Evaluated Gaussian function. """ - x_arr = np.asarray(x, dtype=np.float64) - bg = np.asarray(background, dtype=np.float64) sigma = gaussian_fwhm_to_sigma(fwhm) @@ -68,7 +67,7 @@ def gaussian( else: prefactor = amplitude - return prefactor * np.exp(-((x_arr - centre) ** 2) / (2 * sigma**2)) + bg + return prefactor * np.exp(-((x - centre) ** 2) / (2 * sigma**2)) + background def lorentzian( @@ -79,9 +78,6 @@ def lorentzian( background: float | int | np.ndarray = 0, normalised: bool = True, ) -> np.ndarray: - x = np.asarray(x, dtype=float) - bg = np.asarray(background, dtype=float) - gamma = float(fwhm) / 2 if normalised: @@ -91,7 +87,7 @@ def lorentzian( prefactor = amplitude core = gamma**2 / ((x - centre) ** 2 + gamma**2) - return prefactor * core + bg + return prefactor * core + background def pseudo_voigt( @@ -133,26 +129,28 @@ def pseudo_voigt( NDArray[np.float64] Evaluated pseudo-Voigt function. """ - x_arr = np.asarray(x, dtype=np.float64) - bg = np.asarray(background, dtype=np.float64) fwhm = float(fwhm) eta = float(eta) - # Convert FWHM to internal parameters - sigma = gaussian_fwhm_to_sigma(fwhm) - gamma = lorentzian_fwhm_to_gamma(fwhm) - - if normalised: - gauss = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp( - -((x_arr - centre) ** 2) / (2 * sigma**2) - ) - lorentz = (1 / np.pi) * (gamma / ((x_arr - centre) ** 2 + gamma**2)) - else: - gauss = np.exp(-((x_arr - centre) ** 2) / (2 * sigma**2)) - lorentz = gamma**2 / ((x_arr - centre) ** 2 + gamma**2) - - return amplitude * (eta * lorentz + (1 - eta) * gauss) + bg + 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, + ) + + return amplitude * (eta * lorentz + (1 - eta) * gauss) + background def smooth_tophat( @@ -160,37 +158,42 @@ def smooth_tophat( amplitude: float | int, centre: float | int, fwhm: float | int, - sharpness: float | int, + eta: float | int, background: float | int | np.ndarray = 0, normalised: bool = True, -) -> np.ndarray: +): """ - Smoothed top-hat using FWHM parameterisation. + Gaussian-smoothed top-hat (fast, analytic normalization). - FWHM is defined as the distance between half-maximum points. + Parameters + ---------- + amplitude : float + Area (if normalized=True) or height (if normalized=False) + centre : float + Centre of the plateau + fwhm : float + Width of the plateau + eta : float + Edge smoothing parameter (0–1) """ - x_arr = np.asarray(x, dtype=np.float64) - bg = np.asarray(background, dtype=np.float64) + # map eta → sigma (smoothing width) + sigma = max(eta * fwhm / 2, 1e-12) - fwhm = float(fwhm) - sharpness = float(sharpness) + half_width = fwhm / 2 - # Convert FWHM → effective plateau width - edge_correction = 2 * np.log(3) / sharpness - width = max(fwhm - edge_correction, 1e-12) # avoid negative width + left = (x - (centre - half_width)) / (np.sqrt(2) * sigma) + right = (x - (centre + half_width)) / (np.sqrt(2) * sigma) - left = 1 / (1 + np.exp(-sharpness * (x_arr - (centre - width / 2)))) - right = 1 / (1 + np.exp(-sharpness * (x_arr - (centre + width / 2)))) - - core = left - right + profile = 0.5 * (erf(left) - erf(right)) if normalised: - scale = amplitude / fwhm # area ~ fwhm + # analytic area = fwhm + scale = amplitude / fwhm else: scale = amplitude - return scale * core + bg + return scale * profile + background def closest_indices(arr1, arr2): @@ -208,14 +211,13 @@ def closest_indices(arr1, arr2): class Peak(BaseModel): - amplitude: float | int + amplitude: float | int = Field(gt=0) centre: float | int - fwhm: float | int + fwhm: float | int = Field(gt=0) - peak_type: Literal["gaussian", "lorentzian", "pseudo-voigt"] = "gaussian" + peak_type: Literal["gaussian", "lorentzian", "pseudo-voigt", "top-hat"] = "gaussian" - eta: float | int | None = None # only used for pseudo-voigt - mixing parameter - sharpness: float | int | None = None # only used for tophat + eta: float | int | None = None # used for pseudo-voigt/tophat - mixing param background: float | int = 0 normalised: bool = True # if normalised the @@ -224,20 +226,8 @@ class Peak(BaseModel): @model_validator(mode="after") def validate_parameters(self): # Allow NaNs to bypass strict validation - if any( - isinstance(v, float) and math.isnan(v) - for v in [self.amplitude, self.centre, self.fwhm] - ): - return self - - # Manual constraints (NaN-safe) - if self.amplitude <= 0: - raise ValueError("amplitude must be > 0") - if self.fwhm <= 0: - raise ValueError("fwhm must be > 0") - - if self.peak_type == "pseudo-voigt": + if self.peak_type in ["pseudo-voigt", "top-hat"]: if self.eta is None: raise ValueError("eta must be provided for pseudo-voigt") if not (0 <= self.eta <= 1): @@ -246,15 +236,6 @@ def validate_parameters(self): if self.eta is not None: raise ValueError("eta should only be set for pseudo-voigt") - if self.peak_type == "top-hat": - if self.sharpness is None: - raise ValueError("eta must be provided for top-hat") - if self.sharpness <= 0: - raise ValueError("sharpness must be gretaer than 0") - else: - if self.sharpness is not None: - raise ValueError("eta should only be set for top-hat") - return self def calculate(self, x: np.ndarray) -> np.ndarray: @@ -289,22 +270,122 @@ def calculate(self, x: np.ndarray) -> np.ndarray: normalised=self.normalised, ) elif self.peak_type == "top-hat": - assert self.sharpness is not None - + assert self.eta is not None return smooth_tophat( x=x, amplitude=self.amplitude, centre=self.centre, fwhm=self.fwhm, - sharpness=self.sharpness, + eta=self.eta, background=self.background, normalised=self.normalised, ) - else: raise ValueError(f"{self.peak_type} is not an allowed peak type") +def caglioti_fwhm( + two_theta: np.ndarray | float, + u, + v: float, + w: float, +) -> np.ndarray | float: + """ + 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) + + +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]: @@ -312,7 +393,8 @@ def fit_peaks( for x_guess in initial_x_pos: try: - width_guess = 2 + 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 @@ -330,7 +412,9 @@ def fit_peaks( y_fit = y[start_idx:end_idx] if len(y_fit) == 0: - fitted_peaks.append(Peak(amplitude=np.nan, centre=np.nan, fwhm=np.nan)) + fitted_peaks.append( + Peak(amplitude=math.nan, centre=math.nan, fwhm=math.nan) + ) continue popt, _ = curve_fit(gaussian, x_fit, y_fit, p0=p0, maxfev=10000) # type: ignore @@ -338,44 +422,13 @@ def fit_peaks( fitted_peaks.append(Peak(amplitude=popt[0], centre=popt[1], fwhm=popt[2])) except RuntimeError: - fitted_peaks.append(Peak(amplitude=np.nan, centre=np.nan, fwhm=np.nan)) + fitted_peaks.append( + Peak(amplitude=math.nan, centre=math.nan, fwhm=math.nan) + ) return fitted_peaks -def calculate_profile( - x: np.ndarray, - peaks: Collection[Peak], - background: int | float | np.ndarray, - phase_scale: int | float = 1, - wdt: int | float = 5, -): - """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 class: Peak which contain (cen, amp, fwhm) - - background: scalar or array, if array must be same shape as x - """ - - if isinstance(background, np.ndarray): - assert len(x) == len(background) - - intensity = np.zeros_like(x) + background - - for peak in peaks: - 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) * phase_scale - intensity[start_idx:end_idx] += peak_intensity - - return intensity - - def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[Peak]: """function to get the centre peaks given without guessing""" diff --git a/src/xrpd_toolbox/utils/profile_calculation.py b/src/xrpd_toolbox/utils/profile_calculation.py new file mode 100644 index 0000000..941cff6 --- /dev/null +++ b/src/xrpd_toolbox/utils/profile_calculation.py @@ -0,0 +1,861 @@ +import os +import re +from collections.abc import Collection, Sequence +from functools import cached_property, lru_cache +from pathlib import Path +from typing import Literal + +import numpy as np +from CifFile import ReadCif +from numba import njit +from pydantic import ConfigDict, Field, model_validator + +from xrpd_toolbox.utils.constants import ( + ELEMENT_ATOMIC_NUMBER, + get_spacegroup_number, +) +from xrpd_toolbox.utils.peaks import Peak +from xrpd_toolbox.utils.settings import SettingsBase +from xrpd_toolbox.utils.symmetry import get_symmetry_tables +from xrpd_toolbox.utils.unit_conversion import ( + beam_energy_to_wavelength, +) + + +@lru_cache +def load_xray_form_factors(): + folder = os.path.dirname(__file__) + + form_factor_filepath = os.path.join(folder, "constants", "atom_form_factors.csv") + + elements = np.genfromtxt( + form_factor_filepath, + skip_header=1, + delimiter=None, + dtype=None, + usecols=[0], + ) + + xrff = np.genfromtxt( + form_factor_filepath, + skip_header=1, + delimiter=None, + dtype=None, + usecols=range(1, 10), + ) + + elements = np.char.replace(elements, "val", "") + + return elements, xrff + + +def calculate_debye_waller_factor(b_iso: np.ndarray, q: np.ndarray): + """q is q space in radians""" + s = q / (4 * np.pi) + dw = np.exp(-b_iso[:, None] * s[None, :] ** 2) + return dw + + +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: + """Compute complex structure factor F(hkl).""" + + phase = 2j * np.pi * (hkl @ positions.T) + + ff = calculate_form_factor(elements, q) + + dw = calculate_debye_waller_factor(b_iso, q) + + return np.sum( + occupancy[None, :] * ff.T * dw.T * np.exp(phase), + axis=1, + ) + + +def get_x_ray_form_factor_parameters(elements: Collection[str]) -> np.ndarray: + """Place holder currently returns ones - should return array of xray form factors + https://lampz.tugraz.at/~hadley/ss1/crystaldiffraction/atomicformfactors/formfactors.php + """ + + element_names, xrff = load_xray_form_factors() + + element_names = np.asarray(element_names) + elements = np.asarray(elements) + + # Build lookup (fast and correct) + lookup = {el: i for i, el in enumerate(element_names)} + + try: + indices = np.array([lookup[e] for e in elements]) + except KeyError as exc: + raise ValueError(f"{exc} not in form factor table") from exc + + return xrff[indices].astype(float) + + +def calculate_form_factor(elements: Collection[str], q: np.ndarray) -> np.ndarray: + params = get_x_ray_form_factor_parameters(elements) + # https://lampz.tugraz.at/~hadley/ss1/crystaldiffraction/atomicformfactors/formfactors.php + + a = params[:, [0, 2, 4, 6]] + b = params[:, [1, 3, 5, 7]] + c = params[:, 8] + + s = q / (4 * np.pi) + + s2 = s**2 + + a = a[:, :, None] + b = b[:, :, None] + s2 = s2[None, None, :] + + ff = np.sum(a * np.exp(-b * s2), axis=1) + c[:, None] + + assert ff.shape[0] == len(elements) + + return ff + + +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 + signs = np.sign(equiv) + + # find first non-zero index along last axis + first_nonzero_idx = np.argmax(equiv != 0, axis=2) + + # gather sign at that index + first_sign = np.take_along_axis( + signs, + first_nonzero_idx[:, :, None], + axis=2, + ).squeeze(-1) + + # flip where negative + flip_mask = first_sign < 0 + equiv = np.where(flip_mask[:, :, None], -equiv, 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.T + + +def q_magnitude(q_vectors: np.ndarray) -> np.ndarray: + """also known as G* in single crystal""" + + return np.linalg.norm(q_vectors, axis=1) + + +def lorentz_polarisation( + theta: np.ndarray, polarisation: float = 0.0, azimuth: float | 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. + """ + + 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) + + +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 + + +####### 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: Sequence[int]) -> 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([hmax, kmax, lmax]) + + q_vec = hkl @ reciprocal_lattice_matrix.T + 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]).T + + +def allowed_reflections( + hkl: np.ndarray, + rotations: np.ndarray, + translations: np.ndarray, + tol: float = 1e-8, +) -> np.ndarray: + """ + Correct systematic absence condition. + """ + + # Apply rotations + hkl_rot = np.einsum("rij,nj->rni", rotations, hkl, optimize=True) + + # Check invariance modulo integer lattice + delta = hkl_rot - hkl[None] + invariant = np.all(np.isclose(delta, np.rint(delta), atol=tol), axis=2) + + # Phase from translations + phase = 2 * np.pi * (hkl @ translations.T) + + # Sum ONLY invariant ops + 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("ni,ij,nj->n", hkl, g_star, hkl) + return 1.0 / np.sqrt(g_hkl) + + +class Atom(SettingsBase): + """This describes an atom""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + label: str # elemnt label ie Si1 Si2 + element: str # element name eg Si + xyz: np.ndarray | list # fractional coorindates of xyz + b_iso: float + occupancy: float = 1.0 + + @property + def x(self): + return self.xyz[0] + + @property + def y(self): + return self.xyz[1] + + @property + def z(self): + return self.xyz[2] + + +def apply_symmetry_operations_to_atoms( + asymmetric_atoms: list[Atom], 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, base_pos, optimize=True) + + translations[:, None, :] + ) % 1.0 + + positions = positions.reshape(-1, 3) + occupancies = np.tile(base_occ, len(rotations)) + b_iso = np.tile(base_b, len(rotations)) + elements = np.tile(base_el, len(rotations)) + + positions = positions % 1.0 + key = np.round(positions * 1e6).astype(int) + _, idx = np.unique(key, 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 Lattice(SettingsBase): + """This decribes the assymetric unit cell lattice - + a, b, c refer to the length of the unit cell in A + alpha, beta, gamma are the angles of the unit cell in degreee""" + + a: float + b: float + c: float + alpha: float # in degrees + beta: float # in degrees + gamma: 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) + + +class Radiation(SettingsBase): + """This defines the type of radiation that is diffracting""" + + radiation: Literal["synchotron-x-ray", "tof-neutron", "cw-neutron", "lab-xray"] + + +class Structure(SettingsBase): + """This should contain everything needed to calculate the structure factor, + peak intensities and peak position of the diffraction peeaks""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + lattice: Lattice + atoms: list[Atom] + spacegroup_symbol: str = "P1" + symmetry_operations: np.ndarray = Field(default=np.array([])) + + @classmethod + def load_from_cif(cls, cif_filepath: str | Path) -> "Structure": + return read_cif(cif_filepath) + + @cached_property + def spacegroup(self): + sg = self.spacegroup_symbol + sg = sg[0].upper() + sg[1:].lower() # upper case first letter + # sg = re.sub(r"\(.*?\)", "", sg) # remove "(...)" + 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"([2346])1", r"\1_1", sg) # 21 → 2_1 etc. + # 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 + + @cached_property + def spacegroup_number(self) -> int: + return get_spacegroup_number(self.spacegroup) + + @cached_property + def element_array(self): + element_array = np.array([a.element for a in self.atoms]) # (N_atoms, 3) + return element_array + + @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 positions + + @property + def occupancies(self): + occ_array = np.array([a.occupancy for a in self.atoms]) # (N_atoms,) + return occ_array + + @property + def b_iso_array(self): + b_iso_array = np.array([a.b_iso for a in self.atoms]) # (N_atoms,) + return b_iso_array + + @cached_property + def atomic_numbers(self): + atomic_numbers = np.array( + [ELEMENT_ATOMIC_NUMBER[a.element] for a in self.atoms] + ) # (N_atoms,) + return atomic_numbers + + @cached_property + def centering(self): + return self.spacegroup.split()[0] + + def reciprocal_lattice_matrix(self): + return reciprocal_lattice_matrix( + a=self.lattice.a, + b=self.lattice.b, + c=self.lattice.c, + alpha=self.lattice.alpha_radians, + beta=self.lattice.beta_radians, + gamma=self.lattice.gamma_radians, + ) + + @property + def volume(self): + return unit_cell_volume( + a=self.lattice.a, + b=self.lattice.b, + c=self.lattice.c, + alpha=self.lattice.alpha, + beta=self.lattice.beta, + gamma=self.lattice.gamma, + degrees=True, + ) + + def get_symmetry_operations(self): + itc = get_symmetry_tables() + sg = itc[self.spacegroup] + return sg.get_rotations_and_translations() + + def calculate_peaks( + self, + wavelength: float | int = 1.5406, + mode: Literal["powder", "single_crystal"] = "powder", + radiation: Literal["x-ray", "neutron"] = "x-ray", + ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + """calculates peaks""" + + reciprocal_lattice_matrix = self.reciprocal_lattice_matrix() + rotations, translations = self.get_symmetry_operations() + + q_max = 4 * np.pi / wavelength + + # generate hkls + hkl = generate_hkl(reciprocal_lattice_matrix, q_max=q_max) + # remove ssystematic absences + mask = allowed_reflections(hkl, rotations, translations) + hkl = hkl[mask] + + if mode == "powder": + hkl, multiplicity = hkl_laue_reduction(hkl, rotations) + # some pxrd refs are equal + else: + hkl = hkl + multiplicity = np.ones(len(hkl)) + + q_vec = q_vectors_from_hkl(hkl, reciprocal_lattice_matrix) + q = q_magnitude(q_vec) + + sort_index = np.argsort(q) + q = q[sort_index] + q_vec = q_vec[sort_index] + hkl = hkl[sort_index] + multiplicity = multiplicity[sort_index] + + 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, + ) + + intensity = np.abs(structure_factor) ** 2 # |F|**2 + # intensity = intensity / (self.volume**2) + + theta = np.arcsin(q * wavelength / (4 * np.pi)) + two_theta_degrees = np.degrees(2 * theta) + + if mode == "powder": + lp_factor = lorentz_polarisation(theta, 0.9) + intensity = intensity * lp_factor + + return hkl, two_theta_degrees, intensity + + else: + return hkl, two_theta_degrees, intensity + + +###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) -> Structure: + """reads data from a cif and returns + list of Atom classes and a unit cell class""" + + block = open_cif(cif_filepath=cif_filepath, block_number=block_number) + + x = np.array(block["_atom_site_fract_x"], dtype=float) + y = np.array(block["_atom_site_fract_y"], dtype=float) + z = np.array(block["_atom_site_fract_z"], dtype=float) + + 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() + + occ = ( + np.array(block["_atom_site_occupancy"], dtype=float) + if "_atom_site_occupancy" in block + else np.ones(len(x)) + ) + + # --- 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=float) + + elif "_atom_site_U_iso_or_equiv" in block: + u_iso = np.array(block["_atom_site_U_iso_or_equiv"], dtype=float) + b_iso = 8 * np.pi**2 * u_iso + else: + b_iso = np.zeros(len(x)) # fallback + + try: + spacegroup_symbol = block["_symmetry_space_group_name_H-M"] + except Exception: + print("_symmetry_space_group_name_H-M not in cif") + spacegroup_symbol = "P1" + + try: + synmmetry_operations = np.array(block["_space_group_symop_operation_xyz"]) + except Exception: + print("No symmetry operation in cif") + synmmetry_operations = np.array([]) + + atoms = [ + Atom( + label=atom_labels[i], + element=elements[i].capitalize(), + xyz=np.array([x[i], y[i], z[i]], dtype=float), + b_iso=float(b_iso[i]), + occupancy=float(occ[i]), + ) + for i in range(len(x)) + ] + + lattice = Lattice( + a=float(block["_cell_length_a"]), + b=float(block["_cell_length_b"]), + c=float(block["_cell_length_c"]), + alpha=float(block["_cell_angle_alpha"]), + beta=float(block["_cell_angle_beta"]), + gamma=float(block["_cell_angle_gamma"]), + ) + + structure = Structure( + lattice=lattice, + atoms=atoms, + spacegroup_symbol=spacegroup_symbol, + symmetry_operations=synmmetry_operations, + ) + + return structure + + +@njit(parallel=True) +def calculate_profile( + x: np.ndarray, + peaks: Collection[Peak], + background: int | float | np.ndarray, + phase_scale: int | float = 1, + wdt: int | float = 5, +): + """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 class: Peak which contain (cen, amp, fwhm) + + background: scalar or array, if array must be same shape as x + """ + + if isinstance(background, np.ndarray): + assert len(x) == len(background) + + intensity = np.zeros_like(x) + + for peak in peaks: + 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 + + +##### more complex pydantic models to do whol profiles + + +class Profile(SettingsBase): + model_config = ConfigDict(arbitrary_types_allowed=True) + + x: np.ndarray + peaks: Collection[Peak] + background: np.ndarray + phase_scale: int | float + wdt: int | float = 5 + + @model_validator(mode="after") + def validate_parameters(self): + assert len(self.x) == len(self.background) + return self + + def calculate_profile(self): + return calculate_profile(self.x, self.peaks, self.background, self.wdt) + + +class ProfileRefinement(SettingsBase): + model_config = ConfigDict( + arbitrary_types_allowed=True, + ) + + x_data: np.ndarray + y_data: np.ndarray + cif_filepath: str | Path | None + wavelength: int | float = 1.5406 # CuKa1 + unit: Literal["tth"] = "tth" + radiation: str = "x-ray" + refinement: str = "Pawley" + structure: Structure | list[Structure] | None = None + + def load_cif(self): + assert self.cif_filepath is not None + + self.structure = read_cif(self.cif_filepath) + + def calculate_peaks(self): + if self.structure is not None: + if isinstance(self.structure, Structure): + return self.structure.calculate_peaks() + elif isinstance(self.structure, list): + return [f.calculate_peaks() for f in self.structure] + else: + raise Exception("Unknown structure") + + +if __name__ == "__main__": + # print(spglib.get_symmetry_from_database(27)) + + from xrpd_toolbox.utils.utils import normalise + + cif_filepath = "/workspaces/XRPD-Toolbox/cifs/si.cif" + + # elements = ["Si", "Si", "Si"] + + # atom_ff = get_x_ray_form_factor_parameters(elements) + + # q_space = np.linspace(0.01, 10, 10000) + + # ff = calculate_form_factor(elements, q_space) + + beam_energy = 15 + wavelength = beam_energy_to_wavelength(beam_energy) + + si_structure = Structure.load_from_cif(cif_filepath) + + print(si_structure.volume) + + print(si_structure.spacegroup) + print(si_structure.spacegroup_number) + + hkl, two_theta_degrees, intensity = si_structure.calculate_peaks( + wavelength=wavelength + ) + + intensity = normalise(intensity) * 4863.94 + + for miller, tth, i in zip(hkl, two_theta_degrees, intensity, strict=True): + print(f"{miller} {tth:.2f} {i:.2f}") + + if tth > 75: + break diff --git a/src/xrpd_toolbox/utils/symmetry.py b/src/xrpd_toolbox/utils/symmetry.py new file mode 100644 index 0000000..7d3d703 --- /dev/null +++ b/src/xrpd_toolbox/utils/symmetry.py @@ -0,0 +1,292 @@ +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.utils.settings import SettingsBase + +_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 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 symmetry_ops_to_translations_and_rotations(ops): + ops = np.asarray(ops, dtype=str) + + # Split into (N,3) + coords = np.char.split(ops, ",") + coords = np.array(coords.tolist(), dtype="U50") + + # --------------------------------- + # NORMALISE: replace "-" with "+-" so we can split on "+" + # --------------------------------- + coords = np.char.replace(coords, "-", "+-") + + # remove leading "+" + coords = np.char.lstrip(coords, "+") + + # split into terms + terms = np.char.split(coords, "+") + terms = np.array(terms.tolist(), dtype=object) # (N,3,list) + + # --------------------------------- + # Flatten terms for vectorisation + # --------------------------------- + flat_terms = np.concatenate(terms.reshape(-1)) + + # Identify axis contributions + 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 + + # Coefficients + coeff = np.ones_like(flat_terms, dtype=float) + + coeff[np.char.startswith(flat_terms, "-")] = -1 + + # Build rotation contributions + rx = np.where(is_x, coeff, 0) + ry = np.where(is_y, coeff, 0) + rz = np.where(is_z, coeff, 0) + + # Translation terms (no x,y,z) + is_const = ~(is_x | is_y | is_z) + const_terms = np.where(is_const, flat_terms, "0") + + # Convert constants safely + const_terms = np.where(const_terms == "", "0", const_terms) + + # Handle fractions + frac_mask = np.char.find(const_terms, "/") >= 0 + + num = np.where(frac_mask, np.char.partition(const_terms, "/")[:, 0], const_terms) + den = np.where(frac_mask, np.char.partition(const_terms, "/")[:, 2], "1") + + const_vals = num.astype(float) / den.astype(float) + + # --------------------------------- + # Reassemble per symmetry op + # --------------------------------- + n_ops = len(ops) + + # Each coord has variable number of terms → need grouping + # lengths = np.array([len(t) for t in flat_terms.reshape(-1, 1)]).flatten() + + # Instead: rebuild via cumulative sums + split_sizes = np.array([len(t) for t in terms.reshape(-1)]) + + idx = np.repeat(np.arange(len(split_sizes)), split_sizes) + + # Sum contributions + 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) + + # reshape back to (N,3) + rotations = np.stack([rx_sum, ry_sum, rz_sum], axis=1).reshape(n_ops, 3, 3) + translations = t_sum.reshape(n_ops, 3) % 1.0 + + rotations = rotations.astype(int) + + return rotations, translations + + +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_symmetry_operations = {} + + for sg in symmetry_operations: + sg_name = sg["universal_h_m"].replace(" ", "") + + sg["symops"] = frac_to_decimal_string(sg["symops"]) + sg["ncsym"] = frac_to_decimal_string(sg["ncsym"]) + + new_symmetry_operations[sg_name] = sg + + itc = IntTabCryst(spacegroups=new_symmetry_operations) + + itc.save_to_yaml( + "/workspaces/XRPD-Toolbox/src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml" + ) + + sg = itc["P 1 21"] + + print(sg) + + +class SpaceGroup(SettingsBase): + 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 get_rotations_and_translations(self): + return symmetry_ops_to_translations_and_rotations(self.symops) + + 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(SettingsBase): + """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) -> SpaceGroup: + sg_name = spacegroup_name.replace(" ", "") + + try: + sg = self.spacegroups[sg_name] + except KeyError: + try: + sg = self.spacegroups[self._assume_first_setting(sg_name)] + except Exception: + sg = None + + if sg is None: + raise KeyError(f"{spacegroup_name} not in ITC") + + return sg + + def __len__(self): + return len(self.spacegroups) + + def _assume_first_setting(self, spacegroup_name): + return 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() + + pnma = itc["Fm-3m"] + + positions = np.array([[0, 0, 0]]) + + pnma.apply_symmetry(positions) diff --git a/src/xrpd_toolbox/utils/unit_conversion.py b/src/xrpd_toolbox/utils/unit_conversion.py new file mode 100644 index 0000000..7106146 --- /dev/null +++ b/src/xrpd_toolbox/utils/unit_conversion.py @@ -0,0 +1,121 @@ +import math +from collections.abc import Iterable +from typing import Literal + +import numpy as np + +# 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 + + +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 diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index 567715b..fb69325 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -181,7 +181,10 @@ def copy_datapath_to_nexus( src.copy(source_path, dst, destination_path) -def normalise_to(data: Iterable[float | int], minval: float | int = 0) -> np.ndarray: +def normalise_to( + data: Iterable[float | int], + minval: float | int = 0, +) -> np.ndarray: """ normalises an array minval is the minimum value that the diff --git a/tests/test_utils.py b/tests/test_utils.py index ff0154a..e2fcdaa 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -3,8 +3,8 @@ import numpy as np import scipy.integrate as integrate -from xrpd_toolbox.utils.energy import beam_energy_to_wavelength, tth_to_q from xrpd_toolbox.utils.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, @@ -47,7 +47,7 @@ def test_gaussian(): 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 diff --git a/uv.lock b/uv.lock index c38677a..0101fc1 100644 --- a/uv.lock +++ b/uv.lock @@ -59,6 +59,15 @@ 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 = "6.2.5" @@ -68,6 +77,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e3/a6/24169d70ec5264b65ba54ba49b3d10f46d6b1ad97e185c94556539b3dfc8/cachetools-6.2.5-py3-none-any.whl", hash = "sha256:db3ae5465e90befb7c74720dd9308d77a09b7cf13433570e07caa0845c30d5fe", size = 11553, upload-time = "2026-01-25T14:57:39.112Z" }, ] +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, +] + [[package]] name = "cfgv" version = "3.5.0" @@ -86,6 +104,95 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload-time = "2023-08-01T19:23:00.661Z" }, ] +[[package]] +name = "charset-normalizer" +version = "3.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d1/0ae20ad77bc949ddd39b51bf383b6ca932f2916074c95cad34ae465ab71f/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", size = 212994, upload-time = "2026-03-15T18:50:30.102Z" }, + { url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/8a18fc411f085b82303cfb7154eed5bd49c77035eb7608d049468b53f87c/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", size = 191673, upload-time = "2026-03-15T18:50:33.433Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a7/11cfe61d6c5c5c7438d6ba40919d0306ed83c9ab957f3d4da2277ff67836/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", size = 201120, upload-time = "2026-03-15T18:50:35.105Z" }, + { url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" }, + { url = "https://files.pythonhosted.org/packages/28/70/039796160b48b18ed466fde0af84c1b090c4e288fae26cd674ad04a2d703/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", size = 192516, upload-time = "2026-03-15T18:50:38.228Z" }, + { url = "https://files.pythonhosted.org/packages/ff/34/c56f3223393d6ff3124b9e78f7de738047c2d6bc40a4f16ac0c9d7a1cb3c/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", size = 218795, upload-time = "2026-03-15T18:50:39.664Z" }, + { url = "https://files.pythonhosted.org/packages/e8/3b/ce2d4f86c5282191a041fdc5a4ce18f1c6bd40a5bd1f74cf8625f08d51c1/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", size = 201833, upload-time = "2026-03-15T18:50:41.552Z" }, + { url = "https://files.pythonhosted.org/packages/3b/9b/b6a9f76b0fd7c5b5ec58b228ff7e85095370282150f0bd50b3126f5506d6/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", size = 213920, upload-time = "2026-03-15T18:50:43.33Z" }, + { url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/32/73/c0b86f3d1458468e11aec870e6b3feac931facbe105a894b552b0e518e79/charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", size = 143703, upload-time = "2026-03-15T18:50:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", size = 153857, upload-time = "2026-03-15T18:50:47.563Z" }, + { url = "https://files.pythonhosted.org/packages/e2/dc/9abe19c9b27e6cd3636036b9d1b387b78c40dedbf0b47f9366737684b4b0/charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", size = 142751, upload-time = "2026-03-15T18:50:49.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, + { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, + { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, + { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, + { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, + { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, + { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, + { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" }, + { url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" }, + { url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" }, + { url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" }, + { url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" }, + { url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" }, + { url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" }, + { url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" }, + { url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" }, + { url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" }, + { url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" }, + { url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" }, + { url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" }, + { url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" }, + { url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" }, + { url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" }, + { url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" }, + { url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" }, + { url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" }, + { url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" }, + { url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" }, + { url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" }, + { url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" }, + { url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" }, + { url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" }, + { url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" }, + { url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -687,6 +794,15 @@ 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" @@ -786,6 +902,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, ] +[[package]] +name = "llvmlite" +version = "0.46.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz", hash = "sha256:227c9fd6d09dce2783c18b754b7cd9d9b3b3515210c46acc2d3c5badd9870ceb", size = 193456, upload-time = "2025-12-08T18:15:36.295Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82f3d39b16f19aa1a56d5fe625883a6ab600d5cc9ea8906cca70ce94cabba067", size = 37232766, upload-time = "2025-12-08T18:14:48.836Z" }, + { url = "https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a3df43900119803bbc52720e758c76f316a9a0f34612a886862dfe0a5591a17e", size = 56275175, upload-time = "2025-12-08T18:14:51.604Z" }, + { url = "https://files.pythonhosted.org/packages/38/f2/ed806f9c003563732da156139c45d970ee435bd0bfa5ed8de87ba972b452/llvmlite-0.46.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de183fefc8022d21b0aa37fc3e90410bc3524aed8617f0ff76732fc6c3af5361", size = 55128630, upload-time = "2025-12-08T18:14:55.107Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8b10bc585c58bdffec9e0c309bb7d51be1f2f15e169a4b4d42f2389e431eb93", size = 38138652, upload-time = "2025-12-08T18:14:58.171Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f8/4db016a5e547d4e054ff2f3b99203d63a497465f81ab78ec8eb2ff7b2304/llvmlite-0.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b9588ad4c63b4f0175a3984b85494f0c927c6b001e3a246a3a7fb3920d9a137", size = 37232767, upload-time = "2025-12-08T18:15:00.737Z" }, + { url = "https://files.pythonhosted.org/packages/aa/85/4890a7c14b4fa54400945cb52ac3cd88545bbdb973c440f98ca41591cdc5/llvmlite-0.46.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3535bd2bb6a2d7ae4012681ac228e5132cdb75fefb1bcb24e33f2f3e0c865ed4", size = 56275176, upload-time = "2025-12-08T18:15:03.936Z" }, + { url = "https://files.pythonhosted.org/packages/6a/07/3d31d39c1a1a08cd5337e78299fca77e6aebc07c059fbd0033e3edfab45c/llvmlite-0.46.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cbfd366e60ff87ea6cc62f50bc4cd800ebb13ed4c149466f50cf2163a473d1e", size = 55128630, upload-time = "2025-12-08T18:15:07.196Z" }, + { url = "https://files.pythonhosted.org/packages/2a/6b/d139535d7590a1bba1ceb68751bef22fadaa5b815bbdf0e858e3875726b2/llvmlite-0.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:398b39db462c39563a97b912d4f2866cd37cba60537975a09679b28fbbc0fb38", size = 38138940, upload-time = "2025-12-08T18:15:10.162Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ff/3eba7eb0aed4b6fca37125387cd417e8c458e750621fce56d2c541f67fa8/llvmlite-0.46.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:30b60892d034bc560e0ec6654737aaa74e5ca327bd8114d82136aa071d611172", size = 37232767, upload-time = "2025-12-08T18:15:13.22Z" }, + { url = "https://files.pythonhosted.org/packages/0e/54/737755c0a91558364b9200702c3c9c15d70ed63f9b98a2c32f1c2aa1f3ba/llvmlite-0.46.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6cc19b051753368a9c9f31dc041299059ee91aceec81bd57b0e385e5d5bf1a54", size = 56275176, upload-time = "2025-12-08T18:15:16.339Z" }, + { url = "https://files.pythonhosted.org/packages/e6/91/14f32e1d70905c1c0aa4e6609ab5d705c3183116ca02ac6df2091868413a/llvmlite-0.46.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bca185892908f9ede48c0acd547fe4dc1bafefb8a4967d47db6cf664f9332d12", size = 55128629, upload-time = "2025-12-08T18:15:19.493Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a7/d526ae86708cea531935ae777b6dbcabe7db52718e6401e0fb9c5edea80e/llvmlite-0.46.0-cp313-cp313-win_amd64.whl", hash = "sha256:67438fd30e12349ebb054d86a5a1a57fd5e87d264d2451bcfafbbbaa25b82a35", size = 38138941, upload-time = "2025-12-08T18:15:22.536Z" }, + { url = "https://files.pythonhosted.org/packages/95/ae/af0ffb724814cc2ea64445acad05f71cff5f799bb7efb22e47ee99340dbc/llvmlite-0.46.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:d252edfb9f4ac1fcf20652258e3f102b26b03eef738dc8a6ffdab7d7d341d547", size = 37232768, upload-time = "2025-12-08T18:15:25.055Z" }, + { url = "https://files.pythonhosted.org/packages/c9/19/5018e5352019be753b7b07f7759cdabb69ca5779fea2494be8839270df4c/llvmlite-0.46.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:379fdd1c59badeff8982cb47e4694a6143bec3bb49aa10a466e095410522064d", size = 56275173, upload-time = "2025-12-08T18:15:28.109Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c9/d57877759d707e84c082163c543853245f91b70c804115a5010532890f18/llvmlite-0.46.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e8cbfff7f6db0fa2c771ad24154e2a7e457c2444d7673e6de06b8b698c3b269", size = 55128628, upload-time = "2025-12-08T18:15:31.098Z" }, + { url = "https://files.pythonhosted.org/packages/30/a8/e61a8c2b3cc7a597073d9cde1fcbb567e9d827f1db30c93cf80422eac70d/llvmlite-0.46.0-cp314-cp314-win_amd64.whl", hash = "sha256:7821eda3ec1f18050f981819756631d60b6d7ab1a6cf806d9efefbe3f4082d61", size = 39153056, upload-time = "2025-12-08T18:15:33.938Z" }, +] + [[package]] name = "lmfit" version = "1.3.4" @@ -1054,6 +1194,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] +[[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" @@ -1171,6 +1333,24 @@ wheels = [ { 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.18.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/96/45218c2fdec4c9f22178f905086e85ef1a6d63862dcc3cd68eb60f1867f5/narwhals-2.18.1.tar.gz", hash = "sha256:652a1fcc9d432bbf114846688884c215f17eb118aa640b7419295d2f910d2a8b", size = 620578, upload-time = "2026-03-24T15:11:25.456Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/c3/06490e98393dcb4d6ce2bf331a39335375c300afaef526897881fbeae6ab/narwhals-2.18.1-py3-none-any.whl", hash = "sha256:a0a8bb80205323851338888ba3a12b4f65d352362c8a94be591244faf36504ad", size = 444952, upload-time = "2026-03-24T15:11:23.801Z" }, +] + +[[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" @@ -1180,6 +1360,34 @@ 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.64.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz", hash = "sha256:95e7300af648baa3308127b1955b52ce6d11889d16e8cfe637b4f85d2fca52b1", size = 2765679, upload-time = "2026-02-18T18:41:20.974Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:766156ee4b8afeeb2b2e23c81307c5d19031f18d5ce76ae2c5fb1429e72fa92b", size = 2682938, upload-time = "2026-02-18T18:40:52.897Z" }, + { url = "https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d17071b4ffc9d39b75d8e6c101a36f0c81b646123859898c9799cb31807c8f78", size = 3747376, upload-time = "2026-02-18T18:40:54.925Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f1/dd2f25e18d75fdf897f730b78c5a7b00cc4450f2405564dbebfaf359f21f/numba-0.64.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ead5630434133bac87fa67526eacb264535e4e9a2d5ec780e0b4fc381a7d275", size = 3453292, upload-time = "2026-02-18T18:40:56.818Z" }, + { url = "https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2b1fd93e7aaac07d6fbaed059c00679f591f2423885c206d8c1b55d65ca3f2d", size = 2749824, upload-time = "2026-02-18T18:40:58.392Z" }, + { url = "https://files.pythonhosted.org/packages/70/a6/9fc52cb4f0d5e6d8b5f4d81615bc01012e3cf24e1052a60f17a68deb8092/numba-0.64.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:69440a8e8bc1a81028446f06b363e28635aa67bd51b1e498023f03b812e0ce68", size = 2683418, upload-time = "2026-02-18T18:40:59.886Z" }, + { url = "https://files.pythonhosted.org/packages/9b/89/1a74ea99b180b7a5587b0301ed1b183a2937c4b4b67f7994689b5d36fc34/numba-0.64.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13721011f693ba558b8dd4e4db7f2640462bba1b855bdc804be45bbeb55031a", size = 3804087, upload-time = "2026-02-18T18:41:01.699Z" }, + { url = "https://files.pythonhosted.org/packages/91/e1/583c647404b15f807410510fec1eb9b80cb8474165940b7749f026f21cbc/numba-0.64.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0b180b1133f2b5d8b3f09d96b6d7a9e51a7da5dda3c09e998b5bcfac85d222c", size = 3504309, upload-time = "2026-02-18T18:41:03.252Z" }, + { url = "https://files.pythonhosted.org/packages/85/23/0fce5789b8a5035e7ace21216a468143f3144e02013252116616c58339aa/numba-0.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:e63dc94023b47894849b8b106db28ccb98b49d5498b98878fac1a38f83ac007a", size = 2752740, upload-time = "2026-02-18T18:41:05.097Z" }, + { url = "https://files.pythonhosted.org/packages/52/80/2734de90f9300a6e2503b35ee50d9599926b90cbb7ac54f9e40074cd07f1/numba-0.64.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3bab2c872194dcd985f1153b70782ec0fbbe348fffef340264eacd3a76d59fd6", size = 2683392, upload-time = "2026-02-18T18:41:06.563Z" }, + { url = "https://files.pythonhosted.org/packages/42/e8/14b5853ebefd5b37723ef365c5318a30ce0702d39057eaa8d7d76392859d/numba-0.64.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:703a246c60832cad231d2e73c1182f25bf3cc8b699759ec8fe58a2dbc689a70c", size = 3812245, upload-time = "2026-02-18T18:41:07.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a2/f60dc6c96d19b7185144265a5fbf01c14993d37ff4cd324b09d0212aa7ce/numba-0.64.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e2e49a7900ee971d32af7609adc0cfe6aa7477c6f6cccdf6d8138538cf7756f", size = 3511328, upload-time = "2026-02-18T18:41:09.504Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2a/fe7003ea7e7237ee7014f8eaeeb7b0d228a2db22572ca85bab2648cf52cb/numba-0.64.0-cp313-cp313-win_amd64.whl", hash = "sha256:396f43c3f77e78d7ec84cdfc6b04969c78f8f169351b3c4db814b97e7acf4245", size = 2752668, upload-time = "2026-02-18T18:41:11.455Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8a/77d26afe0988c592dd97cb8d4e80bfb3dfc7dbdacfca7d74a7c5c81dd8c2/numba-0.64.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f565d55eaeff382cbc86c63c8c610347453af3d1e7afb2b6569aac1c9b5c93ce", size = 2683590, upload-time = "2026-02-18T18:41:12.897Z" }, + { url = "https://files.pythonhosted.org/packages/8e/4b/600b8b7cdbc7f9cebee9ea3d13bb70052a79baf28944024ffcb59f0712e3/numba-0.64.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b55169b18892c783f85e9ad9e6f5297a6d12967e4414e6b71361086025ff0bb", size = 3781163, upload-time = "2026-02-18T18:41:15.377Z" }, + { url = "https://files.pythonhosted.org/packages/ff/73/53f2d32bfa45b7175e9944f6b816d8c32840178c3eee9325033db5bf838e/numba-0.64.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:196bcafa02c9dd1707e068434f6d5cedde0feb787e3432f7f1f0e993cc336c4c", size = 3481172, upload-time = "2026-02-18T18:41:17.281Z" }, + { url = "https://files.pythonhosted.org/packages/b5/00/aebd2f7f1e11e38814bb96e95a27580817a7b340608d3ac085fdbab83174/numba-0.64.0-cp314-cp314-win_amd64.whl", hash = "sha256:213e9acbe7f1c05090592e79020315c1749dd52517b90e94c517dca3f014d4a1", size = 2754700, upload-time = "2026-02-18T18:41:19.277Z" }, +] + [[package]] name = "numexpr" version = "2.14.1" @@ -1318,6 +1526,74 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, ] +[[package]] +name = "orjson" +version = "3.11.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/45/b268004f745ede84e5798b48ee12b05129d19235d0e15267aa57dcdb400b/orjson-3.11.7.tar.gz", hash = "sha256:9b1a67243945819ce55d24a30b59d6a168e86220452d2c96f4d1f093e71c0c49", size = 6144992, upload-time = "2026-02-02T15:38:49.29Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/02/da6cb01fc6087048d7f61522c327edf4250f1683a58a839fdcc435746dd5/orjson-3.11.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9487abc2c2086e7c8eb9a211d2ce8855bae0e92586279d0d27b341d5ad76c85c", size = 228664, upload-time = "2026-02-02T15:37:25.542Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c2/5885e7a5881dba9a9af51bc564e8967225a642b3e03d089289a35054e749/orjson-3.11.7-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:79cacb0b52f6004caf92405a7e1f11e6e2de8bdf9019e4f76b44ba045125cd6b", size = 125344, upload-time = "2026-02-02T15:37:26.92Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1d/4e7688de0a92d1caf600dfd5fb70b4c5bfff51dfa61ac555072ef2d0d32a/orjson-3.11.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e85fe4698b6a56d5e2ebf7ae87544d668eb6bde1ad1226c13f44663f20ec9e", size = 128404, upload-time = "2026-02-02T15:37:28.108Z" }, + { url = "https://files.pythonhosted.org/packages/2f/b2/ec04b74ae03a125db7bd69cffd014b227b7f341e3261bf75b5eb88a1aa92/orjson-3.11.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8d14b71c0b12963fe8a62aac87119f1afdf4cb88a400f61ca5ae581449efcb5", size = 123677, upload-time = "2026-02-02T15:37:30.287Z" }, + { url = "https://files.pythonhosted.org/packages/4c/69/f95bdf960605f08f827f6e3291fe243d8aa9c5c9ff017a8d7232209184c3/orjson-3.11.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91c81ef070c8f3220054115e1ef468b1c9ce8497b4e526cb9f68ab4dc0a7ac62", size = 128950, upload-time = "2026-02-02T15:37:31.595Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1b/de59c57bae1d148ef298852abd31909ac3089cff370dfd4cd84cc99cbc42/orjson-3.11.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:411ebaf34d735e25e358a6d9e7978954a9c9d58cfb47bc6683cdc3964cd2f910", size = 141756, upload-time = "2026-02-02T15:37:32.985Z" }, + { url = "https://files.pythonhosted.org/packages/ee/9e/9decc59f4499f695f65c650f6cfa6cd4c37a3fbe8fa235a0a3614cb54386/orjson-3.11.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a16bcd08ab0bcdfc7e8801d9c4a9cc17e58418e4d48ddc6ded4e9e4b1a94062b", size = 130812, upload-time = "2026-02-02T15:37:34.204Z" }, + { url = "https://files.pythonhosted.org/packages/28/e6/59f932bcabd1eac44e334fe8e3281a92eacfcb450586e1f4bde0423728d8/orjson-3.11.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0b51672e466fd7e56230ffbae7f1639e18d0ce023351fb75da21b71bc2c960", size = 133444, upload-time = "2026-02-02T15:37:35.446Z" }, + { url = "https://files.pythonhosted.org/packages/f1/36/b0f05c0eaa7ca30bc965e37e6a2956b0d67adb87a9872942d3568da846ae/orjson-3.11.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:136dcd6a2e796dfd9ffca9fc027d778567b0b7c9968d092842d3c323cef88aa8", size = 138609, upload-time = "2026-02-02T15:37:36.657Z" }, + { url = "https://files.pythonhosted.org/packages/b8/03/58ec7d302b8d86944c60c7b4b82975d5161fcce4c9bc8c6cb1d6741b6115/orjson-3.11.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7ba61079379b0ae29e117db13bda5f28d939766e410d321ec1624afc6a0b0504", size = 408918, upload-time = "2026-02-02T15:37:38.076Z" }, + { url = "https://files.pythonhosted.org/packages/06/3a/868d65ef9a8b99be723bd510de491349618abd9f62c826cf206d962db295/orjson-3.11.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0527a4510c300e3b406591b0ba69b5dc50031895b0a93743526a3fc45f59d26e", size = 143998, upload-time = "2026-02-02T15:37:39.706Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c7/1e18e1c83afe3349f4f6dc9e14910f0ae5f82eac756d1412ea4018938535/orjson-3.11.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a709e881723c9b18acddcfb8ba357322491ad553e277cf467e1e7e20e2d90561", size = 134802, upload-time = "2026-02-02T15:37:41.002Z" }, + { url = "https://files.pythonhosted.org/packages/d4/0b/ccb7ee1a65b37e8eeb8b267dc953561d72370e85185e459616d4345bab34/orjson-3.11.7-cp311-cp311-win32.whl", hash = "sha256:c43b8b5bab288b6b90dac410cca7e986a4fa747a2e8f94615aea407da706980d", size = 127828, upload-time = "2026-02-02T15:37:42.241Z" }, + { url = "https://files.pythonhosted.org/packages/af/9e/55c776dffda3f381e0f07d010a4f5f3902bf48eaba1bb7684d301acd4924/orjson-3.11.7-cp311-cp311-win_amd64.whl", hash = "sha256:6543001328aa857187f905308a028935864aefe9968af3848401b6fe80dbb471", size = 124941, upload-time = "2026-02-02T15:37:43.444Z" }, + { url = "https://files.pythonhosted.org/packages/aa/8e/424a620fa7d263b880162505fb107ef5e0afaa765b5b06a88312ac291560/orjson-3.11.7-cp311-cp311-win_arm64.whl", hash = "sha256:1ee5cc7160a821dfe14f130bc8e63e7611051f964b463d9e2a3a573204446a4d", size = 126245, upload-time = "2026-02-02T15:37:45.18Z" }, + { url = "https://files.pythonhosted.org/packages/80/bf/76f4f1665f6983385938f0e2a5d7efa12a58171b8456c252f3bae8a4cf75/orjson-3.11.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bd03ea7606833655048dab1a00734a2875e3e86c276e1d772b2a02556f0d895f", size = 228545, upload-time = "2026-02-02T15:37:46.376Z" }, + { url = "https://files.pythonhosted.org/packages/79/53/6c72c002cb13b5a978a068add59b25a8bdf2800ac1c9c8ecdb26d6d97064/orjson-3.11.7-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:89e440ebc74ce8ab5c7bc4ce6757b4a6b1041becb127df818f6997b5c71aa60b", size = 125224, upload-time = "2026-02-02T15:37:47.697Z" }, + { url = "https://files.pythonhosted.org/packages/2c/83/10e48852865e5dd151bdfe652c06f7da484578ed02c5fca938e3632cb0b8/orjson-3.11.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ede977b5fe5ac91b1dffc0a517ca4542d2ec8a6a4ff7b2652d94f640796342a", size = 128154, upload-time = "2026-02-02T15:37:48.954Z" }, + { url = "https://files.pythonhosted.org/packages/6e/52/a66e22a2b9abaa374b4a081d410edab6d1e30024707b87eab7c734afe28d/orjson-3.11.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b7b1dae39230a393df353827c855a5f176271c23434cfd2db74e0e424e693e10", size = 123548, upload-time = "2026-02-02T15:37:50.187Z" }, + { url = "https://files.pythonhosted.org/packages/de/38/605d371417021359f4910c496f764c48ceb8997605f8c25bf1dfe58c0ebe/orjson-3.11.7-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed46f17096e28fb28d2975834836a639af7278aa87c84f68ab08fbe5b8bd75fa", size = 129000, upload-time = "2026-02-02T15:37:51.426Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/af32e842b0ffd2335c89714d48ca4e3917b42f5d6ee5537832e069a4b3ac/orjson-3.11.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3726be79e36e526e3d9c1aceaadbfb4a04ee80a72ab47b3f3c17fefb9812e7b8", size = 141686, upload-time = "2026-02-02T15:37:52.607Z" }, + { url = "https://files.pythonhosted.org/packages/96/0b/fc793858dfa54be6feee940c1463370ece34b3c39c1ca0aa3845f5ba9892/orjson-3.11.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0724e265bc548af1dedebd9cb3d24b4e1c1e685a343be43e87ba922a5c5fff2f", size = 130812, upload-time = "2026-02-02T15:37:53.944Z" }, + { url = "https://files.pythonhosted.org/packages/dc/91/98a52415059db3f374757d0b7f0f16e3b5cd5976c90d1c2b56acaea039e6/orjson-3.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7745312efa9e11c17fbd3cb3097262d079da26930ae9ae7ba28fb738367cbad", size = 133440, upload-time = "2026-02-02T15:37:55.615Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/cb540117bda61791f46381f8c26c8f93e802892830a6055748d3bb1925ab/orjson-3.11.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f904c24bdeabd4298f7a977ef14ca2a022ca921ed670b92ecd16ab6f3d01f867", size = 138386, upload-time = "2026-02-02T15:37:56.814Z" }, + { url = "https://files.pythonhosted.org/packages/63/1a/50a3201c334a7f17c231eee5f841342190723794e3b06293f26e7cf87d31/orjson-3.11.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b9fc4d0f81f394689e0814617aadc4f2ea0e8025f38c226cbf22d3b5ddbf025d", size = 408853, upload-time = "2026-02-02T15:37:58.291Z" }, + { url = "https://files.pythonhosted.org/packages/87/cd/8de1c67d0be44fdc22701e5989c0d015a2adf391498ad42c4dc589cd3013/orjson-3.11.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:849e38203e5be40b776ed2718e587faf204d184fc9a008ae441f9442320c0cab", size = 144130, upload-time = "2026-02-02T15:38:00.163Z" }, + { url = "https://files.pythonhosted.org/packages/0f/fe/d605d700c35dd55f51710d159fc54516a280923cd1b7e47508982fbb387d/orjson-3.11.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4682d1db3bcebd2b64757e0ddf9e87ae5f00d29d16c5cdf3a62f561d08cc3dd2", size = 134818, upload-time = "2026-02-02T15:38:01.507Z" }, + { url = "https://files.pythonhosted.org/packages/e4/e4/15ecc67edb3ddb3e2f46ae04475f2d294e8b60c1825fbe28a428b93b3fbd/orjson-3.11.7-cp312-cp312-win32.whl", hash = "sha256:f4f7c956b5215d949a1f65334cf9d7612dde38f20a95f2315deef167def91a6f", size = 127923, upload-time = "2026-02-02T15:38:02.75Z" }, + { url = "https://files.pythonhosted.org/packages/34/70/2e0855361f76198a3965273048c8e50a9695d88cd75811a5b46444895845/orjson-3.11.7-cp312-cp312-win_amd64.whl", hash = "sha256:bf742e149121dc5648ba0a08ea0871e87b660467ef168a3a5e53bc1fbd64bb74", size = 125007, upload-time = "2026-02-02T15:38:04.032Z" }, + { url = "https://files.pythonhosted.org/packages/68/40/c2051bd19fc467610fed469dc29e43ac65891571138f476834ca192bc290/orjson-3.11.7-cp312-cp312-win_arm64.whl", hash = "sha256:26c3b9132f783b7d7903bf1efb095fed8d4a3a85ec0d334ee8beff3d7a4749d5", size = 126089, upload-time = "2026-02-02T15:38:05.297Z" }, + { url = "https://files.pythonhosted.org/packages/89/25/6e0e52cac5aab51d7b6dcd257e855e1dec1c2060f6b28566c509b4665f62/orjson-3.11.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1d98b30cc1313d52d4af17d9c3d307b08389752ec5f2e5febdfada70b0f8c733", size = 228390, upload-time = "2026-02-02T15:38:06.8Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/a77f48d2fc8a05bbc529e5ff481fb43d914f9e383ea2469d4f3d51df3d00/orjson-3.11.7-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:d897e81f8d0cbd2abb82226d1860ad2e1ab3ff16d7b08c96ca00df9d45409ef4", size = 125189, upload-time = "2026-02-02T15:38:08.181Z" }, + { url = "https://files.pythonhosted.org/packages/89/25/0a16e0729a0e6a1504f9d1a13cdd365f030068aab64cec6958396b9969d7/orjson-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:814be4b49b228cfc0b3c565acf642dd7d13538f966e3ccde61f4f55be3e20785", size = 128106, upload-time = "2026-02-02T15:38:09.41Z" }, + { url = "https://files.pythonhosted.org/packages/66/da/a2e505469d60666a05ab373f1a6322eb671cb2ba3a0ccfc7d4bc97196787/orjson-3.11.7-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d06e5c5fed5caedd2e540d62e5b1c25e8c82431b9e577c33537e5fa4aa909539", size = 123363, upload-time = "2026-02-02T15:38:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/23/bf/ed73f88396ea35c71b38961734ea4a4746f7ca0768bf28fd551d37e48dd0/orjson-3.11.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31c80ce534ac4ea3739c5ee751270646cbc46e45aea7576a38ffec040b4029a1", size = 129007, upload-time = "2026-02-02T15:38:12.138Z" }, + { url = "https://files.pythonhosted.org/packages/73/3c/b05d80716f0225fc9008fbf8ab22841dcc268a626aa550561743714ce3bf/orjson-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f50979824bde13d32b4320eedd513431c921102796d86be3eee0b58e58a3ecd1", size = 141667, upload-time = "2026-02-02T15:38:13.398Z" }, + { url = "https://files.pythonhosted.org/packages/61/e8/0be9b0addd9bf86abfc938e97441dcd0375d494594b1c8ad10fe57479617/orjson-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e54f3808e2b6b945078c41aa8d9b5834b28c50843846e97807e5adb75fa9705", size = 130832, upload-time = "2026-02-02T15:38:14.698Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ec/c68e3b9021a31d9ec15a94931db1410136af862955854ed5dd7e7e4f5bff/orjson-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12b80df61aab7b98b490fe9e4879925ba666fccdfcd175252ce4d9035865ace", size = 133373, upload-time = "2026-02-02T15:38:16.109Z" }, + { url = "https://files.pythonhosted.org/packages/d2/45/f3466739aaafa570cc8e77c6dbb853c48bf56e3b43738020e2661e08b0ac/orjson-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:996b65230271f1a97026fd0e6a753f51fbc0c335d2ad0c6201f711b0da32693b", size = 138307, upload-time = "2026-02-02T15:38:17.453Z" }, + { url = "https://files.pythonhosted.org/packages/e1/84/9f7f02288da1ffb31405c1be07657afd1eecbcb4b64ee2817b6fe0f785fa/orjson-3.11.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ab49d4b2a6a1d415ddb9f37a21e02e0d5dbfe10b7870b21bf779fc21e9156157", size = 408695, upload-time = "2026-02-02T15:38:18.831Z" }, + { url = "https://files.pythonhosted.org/packages/18/07/9dd2f0c0104f1a0295ffbe912bc8d63307a539b900dd9e2c48ef7810d971/orjson-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:390a1dce0c055ddf8adb6aa94a73b45a4a7d7177b5c584b8d1c1947f2ba60fb3", size = 144099, upload-time = "2026-02-02T15:38:20.28Z" }, + { url = "https://files.pythonhosted.org/packages/a5/66/857a8e4a3292e1f7b1b202883bcdeb43a91566cf59a93f97c53b44bd6801/orjson-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1eb80451a9c351a71dfaf5b7ccc13ad065405217726b59fdbeadbcc544f9d223", size = 134806, upload-time = "2026-02-02T15:38:22.186Z" }, + { url = "https://files.pythonhosted.org/packages/0a/5b/6ebcf3defc1aab3a338ca777214966851e92efb1f30dc7fc8285216e6d1b/orjson-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7477aa6a6ec6139c5cb1cc7b214643592169a5494d200397c7fc95d740d5fcf3", size = 127914, upload-time = "2026-02-02T15:38:23.511Z" }, + { url = "https://files.pythonhosted.org/packages/00/04/c6f72daca5092e3117840a1b1e88dfc809cc1470cf0734890d0366b684a1/orjson-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:b9f95dcdea9d4f805daa9ddf02617a89e484c6985fa03055459f90e87d7a0757", size = 124986, upload-time = "2026-02-02T15:38:24.836Z" }, + { url = "https://files.pythonhosted.org/packages/03/ba/077a0f6f1085d6b806937246860fafbd5b17f3919c70ee3f3d8d9c713f38/orjson-3.11.7-cp313-cp313-win_arm64.whl", hash = "sha256:800988273a014a0541483dc81021247d7eacb0c845a9d1a34a422bc718f41539", size = 126045, upload-time = "2026-02-02T15:38:26.216Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:de0a37f21d0d364954ad5de1970491d7fbd0fb1ef7417d4d56a36dc01ba0c0a0", size = 228391, upload-time = "2026-02-02T15:38:27.757Z" }, + { url = "https://files.pythonhosted.org/packages/46/19/e40f6225da4d3aa0c8dc6e5219c5e87c2063a560fe0d72a88deb59776794/orjson-3.11.7-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c2428d358d85e8da9d37cba18b8c4047c55222007a84f97156a5b22028dfbfc0", size = 125188, upload-time = "2026-02-02T15:38:29.241Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7e/c4de2babef2c0817fd1f048fd176aa48c37bec8aef53d2fa932983032cce/orjson-3.11.7-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4bc6c6ac52cdaa267552544c73e486fecbd710b7ac09bc024d5a78555a22f6", size = 128097, upload-time = "2026-02-02T15:38:30.618Z" }, + { url = "https://files.pythonhosted.org/packages/eb/74/233d360632bafd2197f217eee7fb9c9d0229eac0c18128aee5b35b0014fe/orjson-3.11.7-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd0d68edd7dfca1b2eca9361a44ac9f24b078de3481003159929a0573f21a6bf", size = 123364, upload-time = "2026-02-02T15:38:32.363Z" }, + { url = "https://files.pythonhosted.org/packages/79/51/af79504981dd31efe20a9e360eb49c15f06df2b40e7f25a0a52d9ae888e8/orjson-3.11.7-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:623ad1b9548ef63886319c16fa317848e465a21513b31a6ad7b57443c3e0dcf5", size = 129076, upload-time = "2026-02-02T15:38:33.68Z" }, + { url = "https://files.pythonhosted.org/packages/67/e2/da898eb68b72304f8de05ca6715870d09d603ee98d30a27e8a9629abc64b/orjson-3.11.7-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6e776b998ac37c0396093d10290e60283f59cfe0fc3fccbd0ccc4bd04dd19892", size = 141705, upload-time = "2026-02-02T15:38:34.989Z" }, + { url = "https://files.pythonhosted.org/packages/c5/89/15364d92acb3d903b029e28d834edb8780c2b97404cbf7929aa6b9abdb24/orjson-3.11.7-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c6c3af76716f4a9c290371ba2e390ede06f6603edb277b481daf37f6f464e", size = 130855, upload-time = "2026-02-02T15:38:36.379Z" }, + { url = "https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a56df3239294ea5964adf074c54bcc4f0ccd21636049a2cf3ca9cf03b5d03cf1", size = 133386, upload-time = "2026-02-02T15:38:37.704Z" }, + { url = "https://files.pythonhosted.org/packages/b9/0e/45e1dcf10e17d0924b7c9162f87ec7b4ca79e28a0548acf6a71788d3e108/orjson-3.11.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bda117c4148e81f746655d5a3239ae9bd00cb7bc3ca178b5fc5a5997e9744183", size = 138295, upload-time = "2026-02-02T15:38:39.096Z" }, + { url = "https://files.pythonhosted.org/packages/63/d7/4d2e8b03561257af0450f2845b91fbd111d7e526ccdf737267108075e0ba/orjson-3.11.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:23d6c20517a97a9daf1d48b580fcdc6f0516c6f4b5038823426033690b4d2650", size = 408720, upload-time = "2026-02-02T15:38:40.634Z" }, + { url = "https://files.pythonhosted.org/packages/78/cf/d45343518282108b29c12a65892445fc51f9319dc3c552ceb51bb5905ed2/orjson-3.11.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8ff206156006da5b847c9304b6308a01e8cdbc8cce824e2779a5ba71c3def141", size = 144152, upload-time = "2026-02-02T15:38:42.262Z" }, + { url = "https://files.pythonhosted.org/packages/a9/3a/d6001f51a7275aacd342e77b735c71fa04125a3f93c36fee4526bc8c654e/orjson-3.11.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:962d046ee1765f74a1da723f4b33e3b228fe3a48bd307acce5021dfefe0e29b2", size = 134814, upload-time = "2026-02-02T15:38:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d3/f19b47ce16820cc2c480f7f1723e17f6d411b3a295c60c8ad3aa9ff1c96a/orjson-3.11.7-cp314-cp314-win32.whl", hash = "sha256:89e13dd3f89f1c38a9c9eba5fbf7cdc2d1feca82f5f290864b4b7a6aac704576", size = 127997, upload-time = "2026-02-02T15:38:45.06Z" }, + { url = "https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl", hash = "sha256:845c3e0d8ded9c9271cd79596b9b552448b885b97110f628fb687aee2eed11c1", size = 124985, upload-time = "2026-02-02T15:38:46.388Z" }, + { url = "https://files.pythonhosted.org/packages/6f/1c/f2a8d8a1b17514660a614ce5f7aac74b934e69f5abc2700cc7ced882a009/orjson-3.11.7-cp314-cp314-win_arm64.whl", hash = "sha256:4a2e9c5be347b937a2e0203866f12bba36082e89b402ddb9e927d5822e43088d", size = 126038, upload-time = "2026-02-02T15:38:47.703Z" }, +] + [[package]] name = "packaging" version = "26.0" @@ -1327,6 +1603,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] +[[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.0" @@ -1526,6 +1811,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, ] +[[package]] +name = "plotly" +version = "6.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "narwhals" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/24/fb/41efe84970cfddefd4ccf025e2cbfafe780004555f583e93dba3dac2cdef/plotly-6.6.0.tar.gz", hash = "sha256:b897f15f3b02028d69f755f236be890ba950d0a42d7dfc619b44e2d8cea8748c", size = 7027956, upload-time = "2026-03-02T21:10:25.321Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl", hash = "sha256:8d6daf0f87412e0c0bfe72e809d615217ab57cc715899a1e5145135a7800d1d0", size = 9910315, upload-time = "2026-03-02T21:10:18.131Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -1899,6 +2197,65 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pymatgen" +version = "2026.3.23" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pymatgen-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/6d/247a7167913846e30e35b113e91a12e4b1df8fb3881350a02786c505359d/pymatgen-2026.3.23.tar.gz", hash = "sha256:66d3ab6d6e875fa201dfce6475ef02ecb098840cb974ab725ea292ffb746371f", size = 793957, upload-time = "2026-03-23T02:19:14.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/5d/f61bda8fa2b94b6c422b5c7471039cbcc00ee3c24f9eb4852ad043243f85/pymatgen-2026.3.23-py3-none-any.whl", hash = "sha256:b7eb0102c8b79d257ae6dfeb47b91ad270e6de32c73e5ce51a5a1ef536472491", size = 883412, upload-time = "2026-03-23T02:19:12.267Z" }, +] + +[[package]] +name = "pymatgen-core" +version = "2026.3.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bibtexparser" }, + { name = "joblib" }, + { 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/c1/18/b349d2d755f8061113cceb5dc81c150278fed3e30480c397b606321f28fd/pymatgen_core-2026.3.9.tar.gz", hash = "sha256:9fa621fba4e2e330c3563db0b8ce5a78bab0ef3d6531368600e4f77d1296d96d", size = 2463134, upload-time = "2026-03-09T23:17:35.654Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/86/95d420c28aefbde313518bde73132222c645eae6360874658bfeff147ce2/pymatgen_core-2026.3.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37362a5e9fae66a2c7df3f9b1969f70869d8f12f2c1a3b64886f7f41ee489047", size = 2815408, upload-time = "2026-03-10T00:55:05.239Z" }, + { url = "https://files.pythonhosted.org/packages/34/84/c9bcaf20653f59d63ef0afce3a4dff9ec5a13de88b2f8c7a0b44b4204bb0/pymatgen_core-2026.3.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70ce090554c1cbe1fc3f06c44bb0187a56432a9a20fc03c6029a7cd3e13ae945", size = 3837802, upload-time = "2026-03-10T00:55:06.885Z" }, + { url = "https://files.pythonhosted.org/packages/7b/96/f222e6cb958f55fb60fad0aa6416e1b3c0d81ba0e667ca5b8975d1178ebb/pymatgen_core-2026.3.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a1c62af55cff49e3828e7445e5a3c8215ef8f0255057d71b83835ca1648b36a", size = 3865739, upload-time = "2026-03-10T00:55:09.823Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c1/444ab5be2c12bcf91c11d8e75bd7cc9afed3afe55270e1571ced6f196638/pymatgen_core-2026.3.9-cp311-cp311-win32.whl", hash = "sha256:1e894955439efbf0e8c311a38bb078d7dfa716e39365df85a2cf8b5efca50dc9", size = 2770989, upload-time = "2026-03-10T00:55:12.05Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a5/0df243029110c19e1333d9ae63b921ad70190fdb88b944efdbe6afb892b5/pymatgen_core-2026.3.9-cp311-cp311-win_amd64.whl", hash = "sha256:da3d75629c55f6d176b9fc072392c67a471c46b6a4a56543508a405b1ec6d850", size = 2800484, upload-time = "2026-03-10T00:55:14.006Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d0/f5478f484c736c9ec63119c6b04ddc2da15ea29b8076c46a21ce0403c77e/pymatgen_core-2026.3.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0c728d6665b10d0eebe86f89d75df6ed1f60124b24e5558bc7e7860e91348470", size = 2816546, upload-time = "2026-03-10T00:55:15.785Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c0/9138449094a70d911ab3f4965e2ca93dde9e71ed0c5fac4e7bbf11892f9a/pymatgen_core-2026.3.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a063fd6c3fcc35842fa910b3d527abb11cf7e93741a32a0d699c6fa8b5cfc516", size = 3834778, upload-time = "2026-03-10T00:55:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/62/22/e78a6d462f9683eb443c6d4f67502b800d323b59426fead611d6456fe3c1/pymatgen_core-2026.3.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9cc9cdeb00663c1ffbb6f9f7a4653660b093566753db81eb6f0c7b75fb75d31", size = 3874176, upload-time = "2026-03-10T00:55:19.71Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b0/66adbdbdf689fdc09237e150cd2bea248ae4d7cb6e9bf32479a1961dff75/pymatgen_core-2026.3.9-cp312-cp312-win32.whl", hash = "sha256:c4e090e0ca06b5cc601d8860caf8b8ca10450bdc69d9f644862284dbc4441ef9", size = 2769195, upload-time = "2026-03-10T00:55:21.318Z" }, + { url = "https://files.pythonhosted.org/packages/85/57/a0075b8eec7863e861c79c4282c1f1374838cc097faae8e80b98da4520ef/pymatgen_core-2026.3.9-cp312-cp312-win_amd64.whl", hash = "sha256:295be318686db8ab91cdc3f1651d4563b48fd0418092dc6358a091e61b59fc48", size = 2799912, upload-time = "2026-03-10T00:55:24.095Z" }, + { url = "https://files.pythonhosted.org/packages/95/c7/5f2518bbb400c1fb0b95da8f88738866ccbdb91d65962cb737b1710a0b00/pymatgen_core-2026.3.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a7d4d156d6d76c2d96f6dcd344b877921d44a7c04f7ee51d18904daf2ac51ed7", size = 2811721, upload-time = "2026-03-09T23:17:38.043Z" }, + { url = "https://files.pythonhosted.org/packages/81/79/d923b11dd3a304dfaf39345cf9ac079176b3a053001617d1f67a776a6a66/pymatgen_core-2026.3.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9952727d85f4166219102574139be1788cf3b7cc14ef2ff39bede6a0dd376369", size = 3826067, upload-time = "2026-03-10T00:55:25.716Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8d/643e214ae2607746baaead580310ed2d3b52840758c26aeb7803b282808e/pymatgen_core-2026.3.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecc7c5735ace36e0d351fe1da3b3bba4ffeea52786adde62eeaa6ec9a04738ad", size = 3864479, upload-time = "2026-03-10T00:55:27.293Z" }, + { url = "https://files.pythonhosted.org/packages/88/61/a53fc0706e7c10ee7a90815b257cc19529b4eca2e55f855639ab7b69edf2/pymatgen_core-2026.3.9-cp313-cp313-win32.whl", hash = "sha256:610e291628497ac26080a544dff1f813e1050adc3ab0105a3d65215295a3300f", size = 2768981, upload-time = "2026-03-10T00:55:29.299Z" }, + { url = "https://files.pythonhosted.org/packages/74/09/f621e487ba77581e88617604a8e65eaec342d17cd98674cc64c507587f09/pymatgen_core-2026.3.9-cp313-cp313-win_amd64.whl", hash = "sha256:05e3dbe0dbaf5b245fdc87d90c625b0476b67078e028c08bb0e2257f9f9f903e", size = 2799473, upload-time = "2026-03-10T00:55:31.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/98/b262a6291eb4f1167b1ea00f7609b70551675460d28f67c577c584dc804a/pymatgen_core-2026.3.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7618e05ed81591ee03c890397d839ebe281f2f7106d6402b43c3a3b78fdd47d0", size = 2816694, upload-time = "2026-03-10T00:55:33.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/df/46200179dcc751986e90bcf362fe6c8ae199773e7a2b2e8774884d10c3bc/pymatgen_core-2026.3.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e76b3babff3a97d2200d801d3d33b7eeaf24669963830570c5108114c3797ef", size = 3823467, upload-time = "2026-03-10T00:55:35.58Z" }, + { url = "https://files.pythonhosted.org/packages/34/66/2f53fa448b2f776b7c6e520127f93613a828e9a4fadc2dcfd32b5a93b946/pymatgen_core-2026.3.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc4c12e75a7da686742d1d018bfc7b7047ec80b47c6134163ba0d7e0a7ca2dbe", size = 3854582, upload-time = "2026-03-10T00:55:37.413Z" }, + { url = "https://files.pythonhosted.org/packages/1e/4e/168a9c246a1d8378e6233bd69f5bdcc1f91a5953a2d82936ce8251b0093d/pymatgen_core-2026.3.9-cp314-cp314-win32.whl", hash = "sha256:cccb30ab4dbb9f451d5eeaa0ce524352c3ff8fe77f3ed3f7e4a62f874ab89bcd", size = 2746693, upload-time = "2026-03-10T00:55:39.289Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ce/d398ff45282c6ff580ef1a12e210035d05ffb2d41d61c953aba3ee189ed9/pymatgen_core-2026.3.9-cp314-cp314-win_amd64.whl", hash = "sha256:3f78381a30c2549b58d2dc72efa2ba466d1be9922d1dd27dabcb60d6f17ac884", size = 2778261, upload-time = "2026-03-10T00:55:41.1Z" }, +] + [[package]] name = "pyparsing" version = "3.3.2" @@ -2119,6 +2476,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.33.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, +] + +[[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.14.14" @@ -2255,6 +2636,42 @@ 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" @@ -2282,6 +2699,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/b6/ebfd6daef0c19a5ca3ac1fb2fc092331d67af5a30c868f106fcc2504c287/stomp_py-8.2.0-py3-none-any.whl", hash = "sha256:fad24e51b505996015a39ca1632df4e0225c1c552980955e21f2aebfc0d9d85c", size = 42751, upload-time = "2024-10-31T21:59:36.658Z" }, ] +[[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 = "toml" version = "0.10.2" @@ -2379,6 +2817,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/17/221d62937c4130b044bb437caac4181e7e13d5536bbede65264db1f0ac9f/tox_uv-1.29.0-py3-none-any.whl", hash = "sha256:b1d251286edeeb4bc4af1e24c8acfdd9404700143c2199ccdbb4ea195f7de6cc", size = 17254, upload-time = "2025-10-09T20:40:25.885Z" }, ] +[[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.14.3" @@ -2436,6 +2886,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.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + [[package]] name = "uv" version = "0.9.27" @@ -2513,14 +2972,17 @@ dependencies = [ { name = "ipywidgets" }, { name = "lmfit" }, { name = "matplotlib" }, + { name = "numba" }, { name = "numpy" }, { name = "pandas" }, { name = "peakutils" }, { name = "pycifrw" }, { name = "pyfai" }, + { name = "pymatgen" }, { name = "pyqt6" }, { name = "pyyaml" }, { name = "scipy" }, + { name = "spglib" }, { name = "stomp-py" }, { name = "toml" }, ] @@ -2545,14 +3007,17 @@ requires-dist = [ { name = "ipywidgets" }, { name = "lmfit" }, { name = "matplotlib" }, + { name = "numba" }, { name = "numpy" }, { name = "pandas" }, { name = "peakutils" }, { name = "pycifrw" }, { name = "pyfai" }, + { name = "pymatgen" }, { name = "pyqt6" }, { name = "pyyaml" }, { name = "scipy" }, + { name = "spglib" }, { name = "stomp-py" }, { name = "toml" }, ] From 3c1e695e0bfda868aced2b6a8d358cd748a63bd9 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Tue, 14 Apr 2026 20:36:04 +0000 Subject: [PATCH 59/86] add refinement --- cifs/Lab6.cif | 165 + cifs/si_data.txt | 62 + pyproject.toml | 4 +- src/xrpd_toolbox/i11/mythen.py | 37 +- src/xrpd_toolbox/i15_1/eiger_500k.py | 4 +- src/xrpd_toolbox/i15_1/pe2ad.py | 2 +- src/xrpd_toolbox/utils/atom.py | 81 + src/xrpd_toolbox/utils/background.py | 167 + src/xrpd_toolbox/utils/constants.py | 155 +- ...ternational_tables_of_crystallography.yaml | 6591 +---------------- src/xrpd_toolbox/utils/core.py | 228 + src/xrpd_toolbox/utils/form_factors.py | 4096 ++++++++++ src/xrpd_toolbox/utils/lattice.py | 122 + src/xrpd_toolbox/utils/peaks.py | 167 +- src/xrpd_toolbox/utils/profile_calculation.py | 1158 ++- src/xrpd_toolbox/utils/settings.py | 102 - src/xrpd_toolbox/utils/symmetry.py | 258 +- src/xrpd_toolbox/utils/unit_conversion.py | 12 + src/xrpd_toolbox/utils/utils.py | 56 +- uv.lock | 76 +- 20 files changed, 6547 insertions(+), 6996 deletions(-) create mode 100644 cifs/Lab6.cif create mode 100644 cifs/si_data.txt create mode 100644 src/xrpd_toolbox/utils/atom.py create mode 100644 src/xrpd_toolbox/utils/background.py create mode 100644 src/xrpd_toolbox/utils/core.py create mode 100644 src/xrpd_toolbox/utils/form_factors.py create mode 100644 src/xrpd_toolbox/utils/lattice.py delete mode 100644 src/xrpd_toolbox/utils/settings.py 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_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/pyproject.toml b/pyproject.toml index 931652a..275ddb2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,8 +18,10 @@ dependencies = [ "matplotlib", "scipy", "pyfai", - "pandas", + "pydantic", + "numpydantic", "lmfit", + "pandas", "peakutils", "PyCifRW", "pyyaml", diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 6da539c..d8fb47f 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -15,11 +15,11 @@ from h5py import Dataset, File from pydantic import BaseModel, Field +from xrpd_toolbox.utils.core import XRPDBaseModel from xrpd_toolbox.utils.messenger import Messenger from xrpd_toolbox.utils.mythen_utils import channel_to_angle, modules_to_pixels -from xrpd_toolbox.utils.peaks import closest_indices, fit_peaks +from xrpd_toolbox.utils.peaks import fit_peaks from xrpd_toolbox.utils.profile_calculation import Structure -from xrpd_toolbox.utils.settings import SettingsBase from xrpd_toolbox.utils.utils import ( bin_and_propagate_errors, get_calibrant_peaks, @@ -68,7 +68,7 @@ def return_raw_tth(self, zero_offset: float) -> np.ndarray: return raw_tth -class AngularCalibration(SettingsBase): +class AngularCalibration(XRPDBaseModel): beamline_offset: float | int module_0: ModuleConversion module_1: ModuleConversion @@ -100,7 +100,7 @@ class AngularCalibration(SettingsBase): module_27: ModuleConversion -class MythenSettings(SettingsBase): +class MythenSettings(XRPDBaseModel): active_modules: list[int] = list(range(MODULES_IN_DETECTOR)) bad_modules: list[int] = [] bad_channel_masking: bool = True @@ -651,6 +651,8 @@ def plot_diffraction( ): 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, @@ -661,16 +663,25 @@ def plot_diffraction( # si_tth = get_calibrant_peaks("Si", 0.828783) si = Structure.load_from_cif("/workspaces/XRPD-Toolbox/cifs/si.cif") - si_tth, _ = si.calculate_peaks(0.828783) + _, _, si_tth, si_intensity = si.calculate_peaks(0.828783) + + background = np.amin(counts) + + phase_scale = (np.amax(counts) - background) / np.amax(si_intensity) - minpeak, maxpeak = np.amin(tth), np.amax(tth) + print(phase_scale) - indices = np.where((si_tth >= minpeak) & (si_tth <= maxpeak))[0] - si_tth = si_tth[indices] + for t, i in zip(si_tth, si_intensity, strict=True): + print(t, i) - indx = closest_indices(si_tth, tth) - peak_heights = counts[indx] - plt.scatter(si_tth, peak_heights, label="calibrant positions", color="red") + 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) @@ -808,10 +819,10 @@ def convert_angcal_to_new_pydantic_json( ) tth, counts, error = mythen3.plot_diffraction( - filepath="/host-home/projects/outputs/diff.png", calibrant=None + filepath="/host-home/projects/outputs/diff.png", calibrant="Si" ) - mythen3.plot_diffraction_by_mod() + # mythen3.plot_diffraction_by_mod() quit() diff --git a/src/xrpd_toolbox/i15_1/eiger_500k.py b/src/xrpd_toolbox/i15_1/eiger_500k.py index b13cdad..964f03e 100644 --- a/src/xrpd_toolbox/i15_1/eiger_500k.py +++ b/src/xrpd_toolbox/i15_1/eiger_500k.py @@ -17,7 +17,7 @@ from pyFAI.integrator.azimuthal import AzimuthalIntegrator from pyFAI.method_registry import IntegrationMethod -from xrpd_toolbox.utils.settings import SettingsBase +from xrpd_toolbox.utils.settings import XRPDBaseModel from xrpd_toolbox.utils.utils import ( get_entry, h5_to_array, @@ -43,7 +43,7 @@ def calibrate_single_geometry_from_rings( return geometry -class EigerSettings(SettingsBase): +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 diff --git a/src/xrpd_toolbox/i15_1/pe2ad.py b/src/xrpd_toolbox/i15_1/pe2ad.py index 24b7791..13ac0a7 100644 --- a/src/xrpd_toolbox/i15_1/pe2ad.py +++ b/src/xrpd_toolbox/i15_1/pe2ad.py @@ -72,7 +72,7 @@ def find_sample_centre(self): print(peak) plt.plot(indices, peak.calculate(indices)) - tophat = smooth_tophat(indices, peak.amplitude, peak.centre, peak.fwhm, 0.5) + tophat = smooth_tophat(indices, peak.amplitude, peak.centre, peak.fwhm, 0.1) plt.plot(indices, tophat) diff --git a/src/xrpd_toolbox/utils/atom.py b/src/xrpd_toolbox/utils/atom.py new file mode 100644 index 0000000..1cd499d --- /dev/null +++ b/src/xrpd_toolbox/utils/atom.py @@ -0,0 +1,81 @@ +import numpy as np +import numpy.typing as npt +from pydantic import computed_field + +from xrpd_toolbox.utils.settings import XRPDBaseModel + + +class Atom(XRPDBaseModel): + """This describes an atom""" + + label: str # elemnt label ie Si1 Si2 + element: str # element name eg Si + xyz: npt.NDArray[np.float64] # fractional coorindates of xyz #type: ignore + b_iso: float + occupancy: float = 1.0 + + @computed_field + @property + def x(self) -> float: + return float(self.xyz[0]) + + @computed_field + @property + def y(self) -> float: + return float(self.xyz[1]) + + @computed_field + @property + def z(self) -> float: + return float(self.xyz[2]) + + +class Atoms(XRPDBaseModel): + """This is the array version of atoms""" + + model_config = {"arbitrary_types_allowed": True} + + labels: npt.NDArray[np.str_] # element label ie Si1 Si2 + elements: npt.NDArray[np.str_] # element name eg Si + xyz: npt.NDArray[np.float64] # fractional coordinates of xyz + b_iso: npt.NDArray[np.float64] + occupancies: npt.NDArray[np.float64] + + 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/utils/background.py b/src/xrpd_toolbox/utils/background.py new file mode 100644 index 0000000..e75c164 --- /dev/null +++ b/src/xrpd_toolbox/utils/background.py @@ -0,0 +1,167 @@ +from abc import abstractmethod + +import matplotlib.pyplot as plt +import numpy as np + +from xrpd_toolbox.utils.settings import XRPDBaseModel + + +class Background(XRPDBaseModel): + """This describes the background of a profile""" + + x: np.ndarray # x values to evaluate the background at + + @abstractmethod + def calculate(self, x: np.ndarray | None = None) -> np.ndarray: + """Evaluate the background at the given x values""" + NotImplementedError("Must implement calculate method in Background subclass") + + @classmethod + @abstractmethod + def estimate(cls, x: np.ndarray, y: np.ndarray) -> "Background": + """Estimate the background from a profile by taking the minimum value of y""" + NotImplementedError("Must implement estimate method in Background subclass") + + def __call__(self, x: np.ndarray | None = None) -> np.ndarray: + return self.calculate(x) + + def __len__(self): + return len(self.x) + + def __add__(self, other): + if isinstance(other, "Background"): + other = other.calculate() + + return np.asarray(other) + self.calculate(self.x) + + def __radd__(self, other): + return np.asarray(other) + self.calculate(self.x) + + def __array__(self): + return self.calculate() + + def plot(self, show: bool = True): + plt.plot(self.x, self.calculate(), label=f"{type(self).__name__}") + if show: + plt.legend() + plt.show() + + +class ConstantBackground(Background): + """This describes a constant background""" + + value: float + + def calculate(self, x: np.ndarray | None = None) -> np.ndarray: + if x is None: + x = self.x + return np.full_like(x, self.value) + + @classmethod + def estimate(cls, x: np.ndarray, y: np.ndarray) -> "ConstantBackground": + """Estimate the background from a profile by taking the minimum value of y""" + value = np.min(y) + return cls(x=x, value=value) + + def __float__(self): + return float(self.value) + + +class LinearBackground(Background): + slope: float + intercept: float + + def calculate(self, x: np.ndarray | None = None) -> np.ndarray: + if x is None: + x = self.x + return self.slope * x + self.intercept + + @classmethod + def estimate(cls, x: np.ndarray, y: np.ndarray) -> "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(x=x, slope=slope, intercept=intercept) + + +class ChebyshevBackground(Background): + """This describes a Chebyshev polynomial background""" + + coefficients: np.ndarray # coefficients of the Chebyshev polynomial + + def calculate(self, x: np.ndarray | None = None) -> np.ndarray: + if x is None: + x = self.x + return np.polynomial.chebyshev.chebval(x, self.coefficients) + + @classmethod + def estimate( + cls, + x: np.ndarray, + y: np.ndarray, + degree: int = 8, + mask: bool = True, + mask_step: int = 20, + ) -> "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(x=x, coefficients=coefficients) + + +class LinearInterpolationBackground(Background): + y: np.ndarray + indices: np.ndarray + + def calculate(self, x: np.ndarray | None = None) -> np.ndarray: + if x is None: + x = self.x + return np.interp(x, self.x_sample, self.y_sample) + + @property + def x_sample(self): + return self.x[self.indices] + + @property + def y_sample(self): + return self.y[self.indices] + + @classmethod + def estimate( + cls, + x: np.ndarray, + y: np.ndarray, + points: int = 20, + ) -> "LinearInterpolationBackground": + """simple estimate that takes a number of points equal to points, + spaced evenly across x""" + + indices = np.arange( + 0, len(x), len(x) // points + ) # select every mask_step points (20 by default) + + return cls(x=x, y=y, indices=indices) diff --git a/src/xrpd_toolbox/utils/constants.py b/src/xrpd_toolbox/utils/constants.py index 260150a..190563f 100644 --- a/src/xrpd_toolbox/utils/constants.py +++ b/src/xrpd_toolbox/utils/constants.py @@ -2,39 +2,39 @@ "P1": 1, "P-1": 2, "P2": 3, - "P2_1": 4, + "P21": 4, "C2": 5, "Pm": 6, "Pc": 7, "Cm": 8, "Cc": 9, "P2/m": 10, - "P2_1/m": 11, + "P21/m": 11, "C2/m": 12, "P2/c": 13, - "P2_1/c": 14, + "P21/c": 14, "C2/c": 15, "P222": 16, - "P222_1": 17, - "P2_12_12": 18, - "P2_12_12_1": 19, - "C222_1": 20, + "P2221": 17, + "P21212": 18, + "P212121": 19, + "C2221": 20, "C222": 21, "F222": 22, "I222": 23, - "I2_12_12_1": 24, + "I212121": 24, "Pmm2": 25, - "Pmc2_1": 26, + "Pmc21": 26, "Pcc2": 27, "Pma2": 28, - "Pca2_1": 29, + "Pca21": 29, "Pnc2": 30, - "Pmn2_1": 31, + "Pmn21": 31, "Pba2": 32, - "Pna2_1": 33, + "Pna21": 33, "Pnn2": 34, "Cmm2": 35, - "Cmc2_1": 36, + "Cmc21": 36, "Ccc2": 37, "Amm2": 38, "Abm2": 39, @@ -74,45 +74,45 @@ "Ibca": 73, "Imma": 74, "P4": 75, - "P4_1": 76, - "P4_2": 77, - "P4_3": 78, + "P41": 76, + "P42": 77, + "P43": 78, "I4": 79, - "I4_1": 80, + "I41": 80, "P-4": 81, "I-4": 82, "P4/m": 83, - "P4_2/m": 84, + "P42/m": 84, "P4/n": 85, - "P4_2/n": 86, + "P42/n": 86, "I4/m": 87, - "I4_1/a": 88, + "I41/a": 88, "P422": 89, - "P42_12": 90, - "P4_122": 91, - "P4_12_12": 92, - "P4_222": 93, - "P4_22_12": 94, - "P4_322": 95, - "P4_32_12": 96, + "P4212": 90, + "P4122": 91, + "P41212": 92, + "P4222": 93, + "P42212": 94, + "P4322": 95, + "P43212": 96, "I422": 97, - "I4_122": 98, + "I4122": 98, "P4mm": 99, "P4bm": 100, - "P4_2cm": 101, - "P4_2nm": 102, + "P42cm": 101, + "P42nm": 102, "P4cc": 103, "P4nc": 104, - "P4_2mc": 105, - "P4_2bc": 106, + "P42mc": 105, + "P42bc": 106, "I4mm": 107, "I4cm": 108, - "I4_1md": 109, - "I4_1cd": 110, + "I41md": 109, + "I41cd": 110, "P-42m": 111, "P-42c": 112, - "P-42_1m": 113, - "P-42_1c": 114, + "P-421m": 113, + "P-421c": 114, "P-4m2": 115, "P-4c2": 116, "P-4b2": 117, @@ -129,30 +129,30 @@ "P4/mnc": 128, "P4/nmm": 129, "P4/ncc": 130, - "P4_2/mmc": 131, - "P4_2/mcm": 132, - "P4_2/nbc": 133, - "P4_2/nnm": 134, - "P4_2/mbc": 135, - "P4_2/mnm": 136, - "P4_2/nmc": 137, - "P4_2/ncm": 138, + "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, - "I4_1/amd": 141, - "I4_1/acd": 142, + "I41/amd": 141, + "I41/acd": 142, "P3": 143, - "P3_1": 144, - "P3_2": 145, + "P31": 144, + "P32": 145, "R3": 146, "P-3": 147, "R-3": 148, "P312": 149, "P321": 150, - "P3_112": 151, - "P3_121": 152, - "P3_212": 153, - "P3_221": 154, + "P3112": 151, + "P3121": 152, + "P3212": 153, + "P3221": 154, "R32": 155, "P3m1": 156, "P31m": 157, @@ -167,37 +167,37 @@ "R-3m": 166, "R-3c": 167, "P6": 168, - "P6_1": 169, + "P61": 169, "P6_5": 170, - "P6_2": 171, - "P6_4": 172, - "P6_3": 173, + "P62": 171, + "P64": 172, + "P63": 173, "P-6": 174, "P6/m": 175, - "P6_3/m": 176, + "P63/m": 176, "P622": 177, - "P6_122": 178, + "P6122": 178, "P6_522": 179, - "P6_222": 180, - "P6_422": 181, - "P6_322": 182, + "P6222": 180, + "P6422": 181, + "P6322": 182, "P6mm": 183, "P6cc": 184, - "P6_3cm": 185, - "P6_3mc": 186, + "P63cm": 185, + "P63mc": 186, "P-6m2": 187, "P-6c2": 188, "P-62m": 189, "P-62c": 190, "P6/mmm": 191, "P6/mcc": 192, - "P6_3/mcm": 193, - "P6_3/mmc": 194, + "P63/mcm": 193, + "P63/mmc": 194, "P23": 195, "F23": 196, "I23": 197, - "P2_13": 198, - "I2_13": 199, + "P213": 198, + "I213": 199, "Pm-3": 200, "Pn-3": 201, "Fm-3": 202, @@ -206,13 +206,13 @@ "Pa-3": 205, "Ia-3": 206, "P432": 207, - "P4_232": 208, + "P4232": 208, "F432": 209, - "F4_132": 210, + "F4132": 210, "I432": 211, - "P4_332": 212, - "P4_132": 213, - "I4_132": 214, + "P4332": 212, + "P4132": 213, + "I4132": 214, "P-43m": 215, "F-43m": 216, "I-43m": 217, @@ -354,6 +354,11 @@ } +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] @@ -363,8 +368,4 @@ def get_spacegroup_number(spacegroup: str) -> int: def get_spacegroup_symbol(spacegroup_number: int) -> str: - number_to_spacegroup = dict( - zip(SPACEGROUP_NUMBER.values(), SPACEGROUP_NUMBER.keys(), strict=True) - ) - - return number_to_spacegroup[spacegroup_number] + return NUMBER_OF_SPACEGROUP[spacegroup_number] diff --git a/src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml b/src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml index ca7916c..f753f68 100644 --- a/src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml +++ b/src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml @@ -1,6 +1,7 @@ --- spacegroups: P1: + spacegroup: P1 crystal_class: triclinic hall: ' P 1' hermann_mauguin: P 1 @@ -10,6 +11,7 @@ spacegroups: schoenflies: C1^1 universal_h_m: P 1 P-1: + spacegroup: P-1 crystal_class: triclinic hall: -P 1 hermann_mauguin: P -1 @@ -18,7 +20,8 @@ spacegroups: number: 2 schoenflies: Ci^1 universal_h_m: P -1 - P121: + P2: + spacegroup: P2 crystal_class: monoclinic hall: ' P 2y' hermann_mauguin: P 1 2 1 @@ -27,25 +30,8 @@ spacegroups: number: 3 schoenflies: C2^1 universal_h_m: P 1 2 1 - P112: - crystal_class: monoclinic - hall: ' P 2' - hermann_mauguin: P 1 1 2 - symops: ['x,y,z', '-x,-y,z'] - ncsym: ['x,y,z', '-x,-y,z'] - number: 3 - schoenflies: C2^1 - universal_h_m: P 1 1 2 - P211: - crystal_class: monoclinic - hall: ' P 2x' - hermann_mauguin: P 2 1 1 - symops: ['x,y,z', 'x,-y,-z'] - ncsym: ['x,y,z', 'x,-y,-z'] - number: 3 - schoenflies: C2^1 - universal_h_m: P 2 1 1 - P1211: + P21: + spacegroup: P21 crystal_class: monoclinic hall: ' P 2yb' hermann_mauguin: P 1 21 1 @@ -54,25 +40,8 @@ spacegroups: number: 4 schoenflies: C2^2 universal_h_m: P 1 21 1 - P1121: - crystal_class: monoclinic - hall: ' P 2c' - hermann_mauguin: P 1 1 21 - symops: ['x,y,z', '-x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5'] - number: 4 - schoenflies: C2^2 - universal_h_m: P 1 1 21 - P2111: - crystal_class: monoclinic - hall: ' P 2xa' - hermann_mauguin: P 21 1 1 - symops: ['x,y,z', 'x+0.5,-y,-z'] - ncsym: ['x,y,z', 'x+0.5,-y,-z'] - number: 4 - schoenflies: C2^2 - universal_h_m: P 21 1 1 - C121: + C2: + spacegroup: C2 crystal_class: monoclinic hall: ' C 2y' hermann_mauguin: C 1 2 1 @@ -81,79 +50,8 @@ spacegroups: number: 5 schoenflies: C2^3 universal_h_m: C 1 2 1 - A121: - crystal_class: monoclinic - hall: ' A 2y' - hermann_mauguin: A 1 2 1 - 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'] - number: 5 - schoenflies: C2^3 - universal_h_m: A 1 2 1 - I121: - crystal_class: monoclinic - hall: ' I 2y' - hermann_mauguin: I 1 2 1 - 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'] - number: 5 - schoenflies: C2^3 - universal_h_m: I 1 2 1 - A112: - crystal_class: monoclinic - hall: ' A 2' - hermann_mauguin: A 1 1 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'] - number: 5 - schoenflies: C2^3 - universal_h_m: A 1 1 2 - B112: - crystal_class: monoclinic - hall: ' B 2' - hermann_mauguin: B 1 1 2 - symops: ['x,y,z', '-x,-y,z', 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z'] - number: 5 - schoenflies: C2^3 - universal_h_m: B 1 1 2 - I112: - crystal_class: monoclinic - hall: ' I 2' - hermann_mauguin: I 1 1 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'] - number: 5 - schoenflies: C2^3 - universal_h_m: I 1 1 2 - B211: - crystal_class: monoclinic - hall: ' B 2x' - hermann_mauguin: B 2 1 1 - symops: ['x,y,z', 'x,-y,-z', 'x+0.5,y,z+0.5', 'x+0.5,-y,-z+0.5'] - ncsym: ['x,y,z', 'x,-y,-z'] - number: 5 - schoenflies: C2^3 - universal_h_m: B 2 1 1 - C211: - crystal_class: monoclinic - hall: ' C 2x' - hermann_mauguin: C 2 1 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 2 1 1 - I211: - crystal_class: monoclinic - hall: ' I 2x' - hermann_mauguin: I 2 1 1 - 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'] - number: 5 - schoenflies: C2^3 - universal_h_m: I 2 1 1 - P1m1: + Pm: + spacegroup: Pm crystal_class: monoclinic hall: ' P -2y' hermann_mauguin: P 1 m 1 @@ -162,25 +60,8 @@ spacegroups: number: 6 schoenflies: Cs^1 universal_h_m: P 1 m 1 - P11m: - crystal_class: monoclinic - hall: ' P -2' - hermann_mauguin: P 1 1 m - symops: ['x,y,z', 'x,y,-z'] - ncsym: ['x,y,z', 'x,y,-z'] - number: 6 - schoenflies: Cs^1 - universal_h_m: P 1 1 m - Pm11: - crystal_class: monoclinic - hall: ' P -2x' - hermann_mauguin: P m 1 1 - symops: ['x,y,z', '-x,y,z'] - ncsym: ['x,y,z', '-x,y,z'] - number: 6 - schoenflies: Cs^1 - universal_h_m: P m 1 1 - P1c1: + Pc: + spacegroup: Pc crystal_class: monoclinic hall: ' P -2yc' hermann_mauguin: P 1 c 1 @@ -189,79 +70,8 @@ spacegroups: number: 7 schoenflies: Cs^2 universal_h_m: P 1 c 1 - P1n1: - crystal_class: monoclinic - hall: ' P -2yac' - hermann_mauguin: P 1 n 1 - symops: ['x,y,z', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,-y,z+0.5'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P 1 n 1 - P1a1: - crystal_class: monoclinic - hall: ' P -2ya' - hermann_mauguin: P 1 a 1 - symops: ['x,y,z', 'x+0.5,-y,z'] - ncsym: ['x,y,z', 'x+0.5,-y,z'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P 1 a 1 - P11a: - crystal_class: monoclinic - hall: ' P -2a' - hermann_mauguin: P 1 1 a - symops: ['x,y,z', 'x+0.5,y,-z'] - ncsym: ['x,y,z', 'x+0.5,y,-z'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P 1 1 a - P11n: - crystal_class: monoclinic - hall: ' P -2ab' - hermann_mauguin: P 1 1 n - symops: ['x,y,z', 'x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P 1 1 n - P11b: - crystal_class: monoclinic - hall: ' P -2b' - hermann_mauguin: P 1 1 b - symops: ['x,y,z', 'x,y+0.5,-z'] - ncsym: ['x,y,z', 'x,y+0.5,-z'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P 1 1 b - Pb11: - crystal_class: monoclinic - hall: ' P -2xb' - hermann_mauguin: P b 1 1 - symops: ['x,y,z', '-x,y+0.5,z'] - ncsym: ['x,y,z', '-x,y+0.5,z'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P b 1 1 - Pn11: - crystal_class: monoclinic - hall: ' P -2xbc' - hermann_mauguin: P n 1 1 - symops: ['x,y,z', '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,y+0.5,z+0.5'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P n 1 1 - Pc11: - crystal_class: monoclinic - hall: ' P -2xc' - hermann_mauguin: P c 1 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 c 1 1 - C1m1: + Cm: + spacegroup: Cm crystal_class: monoclinic hall: ' C -2y' hermann_mauguin: C 1 m 1 @@ -270,79 +80,8 @@ spacegroups: number: 8 schoenflies: Cs^3 universal_h_m: C 1 m 1 - A1m1: - crystal_class: monoclinic - hall: ' A -2y' - hermann_mauguin: A 1 m 1 - 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'] - number: 8 - schoenflies: Cs^3 - universal_h_m: A 1 m 1 - I1m1: - crystal_class: monoclinic - hall: ' I -2y' - hermann_mauguin: I 1 m 1 - 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'] - number: 8 - schoenflies: Cs^3 - universal_h_m: I 1 m 1 - A11m: - crystal_class: monoclinic - hall: ' A -2' - hermann_mauguin: A 1 1 m - 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'] - number: 8 - schoenflies: Cs^3 - universal_h_m: A 1 1 m - B11m: - crystal_class: monoclinic - hall: ' B -2' - hermann_mauguin: B 1 1 m - symops: ['x,y,z', 'x,y,-z', 'x+0.5,y,z+0.5', 'x+0.5,y,-z+0.5'] - ncsym: ['x,y,z', 'x,y,-z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: B 1 1 m - I11m: - crystal_class: monoclinic - hall: ' I -2' - hermann_mauguin: I 1 1 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'] - ncsym: ['x,y,z', 'x,y,-z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: I 1 1 m - Bm11: - crystal_class: monoclinic - hall: ' B -2x' - hermann_mauguin: B m 1 1 - symops: ['x,y,z', '-x,y,z', 'x+0.5,y,z+0.5', '-x+0.5,y,z+0.5'] - ncsym: ['x,y,z', '-x,y,z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: B m 1 1 - Cm11: - crystal_class: monoclinic - hall: ' C -2x' - hermann_mauguin: C m 1 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 m 1 1 - Im11: - crystal_class: monoclinic - hall: ' I -2x' - hermann_mauguin: I m 1 1 - 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'] - number: 8 - schoenflies: Cs^3 - universal_h_m: I m 1 1 - C1c1: + Cc: + spacegroup: Cc crystal_class: monoclinic hall: ' C -2yc' hermann_mauguin: C 1 c 1 @@ -351,160 +90,8 @@ spacegroups: number: 9 schoenflies: Cs^4 universal_h_m: C 1 c 1 - A1n1: - crystal_class: monoclinic - hall: ' A -2yab' - hermann_mauguin: A 1 n 1 - symops: ['x,y,z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', 'x+0.5,-y+1,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,-y+0.5,z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: A 1 n 1 - I1a1: - crystal_class: monoclinic - hall: ' I -2ya' - hermann_mauguin: I 1 a 1 - symops: ['x,y,z', 'x+0.5,-y,z', 'x+0.5,y+0.5,z+0.5', 'x+1,-y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,-y,z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: I 1 a 1 - A1a1: - crystal_class: monoclinic - hall: ' A -2ya' - hermann_mauguin: A 1 a 1 - 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'] - ncsym: ['x,y,z', 'x+0.5,-y,z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: A 1 a 1 - C1n1: - crystal_class: monoclinic - hall: ' C -2yac' - hermann_mauguin: C 1 n 1 - symops: ['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'] - ncsym: ['x,y,z', 'x+0.5,-y,z+0.5'] - number: 9 - schoenflies: Cs^4 - universal_h_m: C 1 n 1 - I1c1: - crystal_class: monoclinic - hall: ' I -2yc' - hermann_mauguin: I 1 c 1 - 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+1'] - ncsym: ['x,y,z', 'x,-y,z+0.5'] - number: 9 - schoenflies: Cs^4 - universal_h_m: I 1 c 1 - A11a: - crystal_class: monoclinic - hall: ' A -2a' - hermann_mauguin: A 1 1 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'] - ncsym: ['x,y,z', 'x+0.5,y,-z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: A 1 1 a - B11n: - crystal_class: monoclinic - hall: ' B -2ab' - hermann_mauguin: B 1 1 n - symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x+0.5,y,z+0.5', 'x+1,y+0.5,-z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: B 1 1 n - I11b: - crystal_class: monoclinic - hall: ' I -2b' - hermann_mauguin: I 1 1 b - symops: ['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'] - ncsym: ['x,y,z', 'x,y+0.5,-z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: I 1 1 b - B11b: - crystal_class: monoclinic - hall: ' B -2b' - hermann_mauguin: B 1 1 b - symops: ['x,y,z', 'x,y+0.5,-z', 'x+0.5,y,z+0.5', 'x+0.5,y+0.5,-z+0.5'] - ncsym: ['x,y,z', 'x,y+0.5,-z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: B 1 1 b - A11n: - crystal_class: monoclinic - hall: ' A -2ab' - hermann_mauguin: A 1 1 n - symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,y+0.5,z+0.5', 'x+0.5,y+1,-z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: A 1 1 n - I11a: - crystal_class: monoclinic - hall: ' I -2a' - hermann_mauguin: I 1 1 a - symops: ['x,y,z', 'x+0.5,y,-z', 'x+0.5,y+0.5,z+0.5', 'x+1,y+0.5,-z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y,-z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: I 1 1 a - Bb11: - crystal_class: monoclinic - hall: ' B -2xb' - hermann_mauguin: B b 1 1 - symops: ['x,y,z', '-x,y+0.5,z', 'x+0.5,y,z+0.5', '-x+0.5,y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,y+0.5,z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: B b 1 1 - Cn11: - crystal_class: monoclinic - hall: ' C -2xac' - hermann_mauguin: C n 1 1 - symops: ['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'] - ncsym: ['x,y,z', '-x+0.5,y,z+0.5'] - number: 9 - schoenflies: Cs^4 - universal_h_m: C n 1 1 - Ic11: - crystal_class: monoclinic - hall: ' I -2xc' - hermann_mauguin: I c 1 1 - 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+1'] - ncsym: ['x,y,z', '-x,y,z+0.5'] - number: 9 - schoenflies: Cs^4 - universal_h_m: I c 1 1 - Cc11: - crystal_class: monoclinic - hall: ' C -2xc' - hermann_mauguin: C c 1 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 c 1 1 - Bn11: - crystal_class: monoclinic - hall: ' B -2xab' - hermann_mauguin: B n 1 1 - symops: ['x,y,z', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', '-x+1,y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,y+0.5,z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: B n 1 1 - Ib11: - crystal_class: monoclinic - hall: ' I -2xb' - hermann_mauguin: I b 1 1 - symops: ['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'] - ncsym: ['x,y,z', '-x,y+0.5,z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: I b 1 1 - P12/m1: + P2/m: + spacegroup: P2/m crystal_class: monoclinic hall: -P 2y hermann_mauguin: P 1 2/m 1 @@ -513,25 +100,8 @@ spacegroups: number: 10 schoenflies: C2h^1 universal_h_m: P 1 2/m 1 - P112/m: - crystal_class: monoclinic - hall: -P 2 - hermann_mauguin: P 1 1 2/m - 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 1 2/m - P2/m11: - crystal_class: monoclinic - hall: -P 2x - hermann_mauguin: P 2/m 1 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 2/m 1 1 - P121/m1: + P21/m: + spacegroup: P21/m crystal_class: monoclinic hall: -P 2yb hermann_mauguin: P 1 21/m 1 @@ -540,25 +110,8 @@ spacegroups: number: 11 schoenflies: C2h^2 universal_h_m: P 1 21/m 1 - P1121/m: - crystal_class: monoclinic - hall: -P 2c - hermann_mauguin: P 1 1 21/m - 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: 11 - schoenflies: C2h^2 - universal_h_m: P 1 1 21/m - P21/m11: - crystal_class: monoclinic - hall: -P 2xa - hermann_mauguin: P 21/m 1 1 - symops: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x-0.5,y,z'] - ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x-0.5,y,z'] - number: 11 - schoenflies: C2h^2 - universal_h_m: P 21/m 1 1 - C12/m1: + C2/m: + spacegroup: C2/m crystal_class: monoclinic hall: -C 2y hermann_mauguin: C 1 2/m 1 @@ -568,87 +121,8 @@ spacegroups: number: 12 schoenflies: C2h^3 universal_h_m: C 1 2/m 1 - A12/m1: - crystal_class: monoclinic - hall: -A 2y - hermann_mauguin: A 1 2/m 1 - 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: 12 - schoenflies: C2h^3 - universal_h_m: A 1 2/m 1 - I12/m1: - crystal_class: monoclinic - hall: -I 2y - hermann_mauguin: I 1 2/m 1 - 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: 12 - schoenflies: C2h^3 - universal_h_m: I 1 2/m 1 - A112/m: - crystal_class: monoclinic - hall: -A 2 - hermann_mauguin: A 1 1 2/m - 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: 12 - schoenflies: C2h^3 - universal_h_m: A 1 1 2/m - B112/m: - crystal_class: monoclinic - hall: -B 2 - hermann_mauguin: B 1 1 2/m - 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'] - ncsym: ['x,y,z', '-x,-y,z', '-x,-y,-z', 'x,y,-z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: B 1 1 2/m - I112/m: - crystal_class: monoclinic - hall: -I 2 - hermann_mauguin: I 1 1 2/m - 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: 12 - schoenflies: C2h^3 - universal_h_m: I 1 1 2/m - B2/m11: - crystal_class: monoclinic - hall: -B 2x - hermann_mauguin: B 2/m 1 1 - 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'] - ncsym: ['x,y,z', 'x,-y,-z', '-x,-y,-z', '-x,y,z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: B 2/m 1 1 - C2/m11: - crystal_class: monoclinic - hall: -C 2x - hermann_mauguin: C 2/m 1 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 2/m 1 1 - I2/m11: - crystal_class: monoclinic - hall: -I 2x - hermann_mauguin: I 2/m 1 1 - 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: 12 - schoenflies: C2h^3 - universal_h_m: I 2/m 1 1 - P12/c1: + P2/c: + spacegroup: P2/c crystal_class: monoclinic hall: -P 2yc hermann_mauguin: P 1 2/c 1 @@ -657,79 +131,8 @@ spacegroups: number: 13 schoenflies: C2h^4 universal_h_m: P 1 2/c 1 - P12/n1: - crystal_class: monoclinic - hall: -P 2yac - hermann_mauguin: P 1 2/n 1 - 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: 13 - schoenflies: C2h^4 - universal_h_m: P 1 2/n 1 - P12/a1: - crystal_class: monoclinic - hall: -P 2ya - hermann_mauguin: P 1 2/a 1 - symops: ['x,y,z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,-y,z'] - ncsym: ['x,y,z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,-y,z'] - number: 13 - schoenflies: C2h^4 - universal_h_m: P 1 2/a 1 - P112/a: - crystal_class: monoclinic - hall: -P 2a - hermann_mauguin: P 1 1 2/a - symops: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x-0.5,y,-z'] - ncsym: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x-0.5,y,-z'] - number: 13 - schoenflies: C2h^4 - universal_h_m: P 1 1 2/a - P112/n: - crystal_class: monoclinic - hall: -P 2ab - hermann_mauguin: P 1 1 2/n - symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z'] - number: 13 - schoenflies: C2h^4 - universal_h_m: P 1 1 2/n - P112/b: - crystal_class: monoclinic - hall: -P 2b - hermann_mauguin: P 1 1 2/b - 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: 13 - schoenflies: C2h^4 - universal_h_m: P 1 1 2/b - P2/b11: - crystal_class: monoclinic - hall: -P 2xb - hermann_mauguin: P 2/b 1 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: 13 - schoenflies: C2h^4 - universal_h_m: P 2/b 1 1 - P2/n11: - crystal_class: monoclinic - hall: -P 2xbc - hermann_mauguin: P 2/n 1 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: 13 - schoenflies: C2h^4 - universal_h_m: P 2/n 1 1 - P2/c11: - crystal_class: monoclinic - hall: -P 2xc - hermann_mauguin: P 2/c 1 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 2/c 1 1 - P121/c1: + P21/c: + spacegroup: P21/c crystal_class: monoclinic hall: -P 2ybc hermann_mauguin: P 1 21/c 1 @@ -738,79 +141,8 @@ spacegroups: number: 14 schoenflies: C2h^5 universal_h_m: P 1 21/c 1 - P121/n1: - crystal_class: monoclinic - hall: -P 2yn - hermann_mauguin: P 1 21/n 1 - symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', 'x-0.5,-y-0.5,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', 'x-0.5,-y-0.5,z-0.5'] - number: 14 - schoenflies: C2h^5 - universal_h_m: P 1 21/n 1 - P121/a1: - crystal_class: monoclinic - hall: -P 2yab - hermann_mauguin: P 1 21/a 1 - symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,-z', 'x-0.5,-y-0.5,z'] - ncsym: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,-z', 'x-0.5,-y-0.5,z'] - number: 14 - schoenflies: C2h^5 - universal_h_m: P 1 21/a 1 - P1121/a: - crystal_class: monoclinic - hall: -P 2ac - hermann_mauguin: P 1 1 21/a - 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: 14 - schoenflies: C2h^5 - universal_h_m: P 1 1 21/a - P1121/n: - crystal_class: monoclinic - hall: -P 2n - hermann_mauguin: P 1 1 21/n - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', '-x,-y,-z', 'x-0.5,y-0.5,-z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', '-x,-y,-z', 'x-0.5,y-0.5,-z-0.5'] - number: 14 - schoenflies: C2h^5 - universal_h_m: P 1 1 21/n - P1121/b: - crystal_class: monoclinic - hall: -P 2bc - hermann_mauguin: P 1 1 21/b - 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 1 21/b - P21/b11: - crystal_class: monoclinic - hall: -P 2xab - hermann_mauguin: P 21/b 1 1 - symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x-0.5,y-0.5,z'] - ncsym: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x-0.5,y-0.5,z'] - number: 14 - schoenflies: C2h^5 - universal_h_m: P 21/b 1 1 - P21/n11: - crystal_class: monoclinic - hall: -P 2xn - hermann_mauguin: P 21/n 1 1 - symops: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z', '-x-0.5,y-0.5,z-0.5'] - ncsym: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z', '-x-0.5,y-0.5,z-0.5'] - number: 14 - schoenflies: C2h^5 - universal_h_m: P 21/n 1 1 - P21/c11: - crystal_class: monoclinic - hall: -P 2xac - hermann_mauguin: P 21/c 1 1 - 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: 14 - schoenflies: C2h^5 - universal_h_m: P 21/c 1 1 - C12/c1: + C2/c: + spacegroup: C2/c crystal_class: monoclinic hall: -C 2yc hermann_mauguin: C 1 2/c 1 @@ -820,177 +152,8 @@ spacegroups: number: 15 schoenflies: C2h^6 universal_h_m: C 1 2/c 1 - A12/n1: - crystal_class: monoclinic - hall: -A 2yab - hermann_mauguin: A 1 2/n 1 - symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,-z', 'x-0.5,-y-0.5,z', 'x,y+0.5,z+0.5', - '-x+0.5,y+1,-z+0.5', '-x,-y+0.5,-z+0.5', 'x-0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,-z', 'x-0.5,-y-0.5,z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: A 1 2/n 1 - I12/a1: - crystal_class: monoclinic - hall: -I 2ya - hermann_mauguin: I 1 2/a 1 - symops: ['x,y,z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,-y,z', 'x+0.5,y+0.5,z+0.5', - '-x+1,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x,-y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,-y,z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: I 1 2/a 1 - A12/a1: - crystal_class: monoclinic - hall: -A 2ya - hermann_mauguin: A 1 2/a 1 - symops: ['x,y,z', '-x+0.5,y,-z', '-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+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,-z', 'x-0.5,-y,z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: A 1 2/a 1 - C12/n1: - crystal_class: monoclinic - hall: -C 2yac - hermann_mauguin: C 1 2/n 1 - symops: ['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,-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'] - number: 15 - schoenflies: C2h^6 - universal_h_m: C 1 2/n 1 - I12/c1: - crystal_class: monoclinic - hall: -I 2yc - hermann_mauguin: I 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+0.5', - '-x+0.5,y+0.5,-z+1', '-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,-y,-z', 'x,-y,z-0.5'] - number: 15 - schoenflies: C2h^6 - universal_h_m: I 1 2/c 1 - A112/a: - crystal_class: monoclinic - hall: -A 2a - hermann_mauguin: A 1 1 2/a - symops: ['x,y,z', '-x+0.5,-y,z', '-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+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,-z', 'x-0.5,y,-z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: A 1 1 2/a - B112/n: - crystal_class: monoclinic - hall: -B 2ab - hermann_mauguin: B 1 1 2/n - symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z', 'x+0.5,y,z+0.5', - '-x+1,-y+0.5,z+0.5', '-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,-y,-z', 'x-0.5,y-0.5,-z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: B 1 1 2/n - I112/b: - crystal_class: monoclinic - hall: -I 2b - hermann_mauguin: I 1 1 2/b - symops: ['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,-z+0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z', '-x,-y,-z', 'x,y-0.5,-z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: I 1 1 2/b - B112/b: - crystal_class: monoclinic - hall: -B 2b - hermann_mauguin: B 1 1 2/b - symops: ['x,y,z', '-x,-y+0.5,z', '-x,-y,-z', 'x,y-0.5,-z', 'x+0.5,y,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'] - ncsym: ['x,y,z', '-x,-y+0.5,z', '-x,-y,-z', 'x,y-0.5,-z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: B 1 1 2/b - A112/n: - crystal_class: monoclinic - hall: -A 2ab - hermann_mauguin: A 1 1 2/n - symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z', 'x,y+0.5,z+0.5', - '-x+0.5,-y+1,z+0.5', '-x,-y+0.5,-z+0.5', 'x-0.5,y,-z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,-y,-z', 'x-0.5,y-0.5,-z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: A 1 1 2/n - I112/a: - crystal_class: monoclinic - hall: -I 2a - hermann_mauguin: I 1 1 2/a - symops: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x-0.5,y,-z', 'x+0.5,y+0.5,z+0.5', - '-x+1,-y+0.5,z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x,y+0.5,-z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x-0.5,y,-z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: I 1 1 2/a - B2/b11: - crystal_class: monoclinic - hall: -B 2xb - hermann_mauguin: B 2/b 1 1 - symops: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y-0.5,z', 'x+0.5,y,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'] - ncsym: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y-0.5,z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: B 2/b 1 1 - C2/n11: - crystal_class: monoclinic - hall: -C 2xac - hermann_mauguin: C 2/n 1 1 - symops: ['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,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'] - number: 15 - schoenflies: C2h^6 - universal_h_m: C 2/n 1 1 - I2/c11: - crystal_class: monoclinic - hall: -I 2xc - hermann_mauguin: I 2/c 1 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+0.5', - 'x+0.5,-y+0.5,-z+1', '-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,-y,-z', '-x,y,z-0.5'] - number: 15 - schoenflies: C2h^6 - universal_h_m: I 2/c 1 1 - C2/c11: - crystal_class: monoclinic - hall: -C 2xc - hermann_mauguin: C 2/c 1 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 2/c 1 1 - B2/n11: - crystal_class: monoclinic - hall: -B 2xab - hermann_mauguin: B 2/n 1 1 - symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x-0.5,y-0.5,z', 'x+0.5,y,z+0.5', - 'x+1,-y+0.5,-z+0.5', '-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,-y,-z', '-x-0.5,y-0.5,z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: B 2/n 1 1 - I2/b11: - crystal_class: monoclinic - hall: -I 2xb - hermann_mauguin: I 2/b 1 1 - symops: ['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,z+0.5'] - ncsym: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y-0.5,z'] - number: 15 - schoenflies: C2h^6 - universal_h_m: I 2/b 1 1 P222: + spacegroup: P222 crystal_class: orthorhombic hall: ' P 2 2' hermann_mauguin: P 2 2 2 @@ -1000,6 +163,7 @@ spacegroups: 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 @@ -1008,25 +172,8 @@ spacegroups: number: 17 schoenflies: D2^2 universal_h_m: P 2 2 21 - P2122: - crystal_class: orthorhombic - hall: ' P 2a 2a' - hermann_mauguin: P 21 2 2 - symops: ['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'] - number: 17 - schoenflies: D2^2 - universal_h_m: P 21 2 2 - P2212: - crystal_class: orthorhombic - hall: ' P 2 2b' - hermann_mauguin: P 2 21 2 - symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z'] - ncsym: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z'] - number: 17 - schoenflies: D2^2 - universal_h_m: P 2 21 2 P21212: + spacegroup: P21212 crystal_class: orthorhombic hall: ' P 2 2ab' hermann_mauguin: P 21 21 2 @@ -1035,25 +182,8 @@ spacegroups: number: 18 schoenflies: D2^3 universal_h_m: P 21 21 2 - P22121: - crystal_class: orthorhombic - hall: ' P 2bc 2' - hermann_mauguin: P 2 21 21 - 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: 18 - schoenflies: D2^3 - universal_h_m: P 2 21 21 - P21221: - crystal_class: orthorhombic - hall: ' P 2ac 2ac' - hermann_mauguin: P 21 2 21 - symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z'] - number: 18 - schoenflies: D2^3 - universal_h_m: P 21 2 21 P212121: + spacegroup: P212121 crystal_class: orthorhombic hall: ' P 2ac 2ab' hermann_mauguin: P 21 21 21 @@ -1063,6 +193,7 @@ spacegroups: 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 @@ -1072,27 +203,8 @@ spacegroups: number: 20 schoenflies: D2^5 universal_h_m: C 2 2 21 - A2122: - crystal_class: orthorhombic - hall: ' A 2a 2a' - hermann_mauguin: A 21 2 2 - symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,-z', '-x,y,-z', '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', '-x,y+0.5,-z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,-z', '-x,y,-z'] - number: 20 - schoenflies: D2^5 - universal_h_m: A 21 2 2 - B2212: - crystal_class: orthorhombic - hall: ' B 2 2b' - hermann_mauguin: B 2 21 2 - symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', 'x+0.5,y,z+0.5', '-x+0.5,-y,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+0.5,-z', '-x,y+0.5,-z'] - number: 20 - schoenflies: D2^5 - universal_h_m: B 2 21 2 C222: + spacegroup: C222 crystal_class: orthorhombic hall: ' C 2 2' hermann_mauguin: C 2 2 2 @@ -1102,27 +214,8 @@ spacegroups: number: 21 schoenflies: D2^6 universal_h_m: C 2 2 2 - A222: - crystal_class: orthorhombic - hall: ' A 2 2' - hermann_mauguin: A 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'] - ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z'] - number: 21 - schoenflies: D2^6 - universal_h_m: A 2 2 2 - B222: - crystal_class: orthorhombic - hall: ' B 2 2' - hermann_mauguin: B 2 2 2 - 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'] - ncsym: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z'] - number: 21 - schoenflies: D2^6 - universal_h_m: B 2 2 2 F222: + spacegroup: F222 crystal_class: orthorhombic hall: ' F 2 2' hermann_mauguin: F 2 2 2 @@ -1134,6 +227,7 @@ spacegroups: 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 @@ -1144,6 +238,7 @@ spacegroups: 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 @@ -1154,6 +249,7 @@ spacegroups: 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 @@ -1162,25 +258,8 @@ spacegroups: number: 25 schoenflies: C2v^1 universal_h_m: P m m 2 - P2mm: - crystal_class: orthorhombic - hall: ' P -2 2' - hermann_mauguin: P 2 m m - 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 2 m m - Pm2m: - crystal_class: orthorhombic - hall: ' P -2 -2' - hermann_mauguin: P m 2 m - 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 2 m Pmc21: + spacegroup: Pmc21 crystal_class: orthorhombic hall: ' P 2c -2' hermann_mauguin: P m c 21 @@ -1189,52 +268,8 @@ spacegroups: number: 26 schoenflies: C2v^2 universal_h_m: P m c 21 - Pcm21: - crystal_class: orthorhombic - hall: ' P 2c -2c' - hermann_mauguin: P c m 21 - symops: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] - number: 26 - schoenflies: C2v^2 - universal_h_m: P c m 21 - P21ma: - crystal_class: orthorhombic - hall: ' P -2a 2a' - hermann_mauguin: P 21 m a - symops: ['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'] - number: 26 - schoenflies: C2v^2 - universal_h_m: P 21 m a - P21am: - crystal_class: orthorhombic - hall: ' P -2 2a' - hermann_mauguin: P 21 a m - 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: 26 - schoenflies: C2v^2 - universal_h_m: P 21 a m - Pb21m: - crystal_class: orthorhombic - hall: ' P -2 -2b' - hermann_mauguin: P b 21 m - symops: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] - ncsym: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] - number: 26 - schoenflies: C2v^2 - universal_h_m: P b 21 m - Pm21b: - crystal_class: orthorhombic - hall: ' P -2b -2' - hermann_mauguin: P m 21 b - 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: 26 - schoenflies: C2v^2 - universal_h_m: P m 21 b Pcc2: + spacegroup: Pcc2 crystal_class: orthorhombic hall: ' P 2 -2c' hermann_mauguin: P c c 2 @@ -1243,25 +278,8 @@ spacegroups: number: 27 schoenflies: C2v^3 universal_h_m: P c c 2 - P2aa: - crystal_class: orthorhombic - hall: ' P -2a 2' - hermann_mauguin: P 2 a a - symops: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] - ncsym: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] - number: 27 - schoenflies: C2v^3 - universal_h_m: P 2 a a - Pb2b: - crystal_class: orthorhombic - hall: ' P -2b -2b' - hermann_mauguin: P b 2 b - symops: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] - ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] - number: 27 - schoenflies: C2v^3 - universal_h_m: P b 2 b Pma2: + spacegroup: Pma2 crystal_class: orthorhombic hall: ' P 2 -2a' hermann_mauguin: P m a 2 @@ -1270,52 +288,8 @@ spacegroups: number: 28 schoenflies: C2v^4 universal_h_m: P m a 2 - Pbm2: - crystal_class: orthorhombic - hall: ' P 2 -2b' - hermann_mauguin: P b m 2 - symops: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z'] - ncsym: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z'] - number: 28 - schoenflies: C2v^4 - universal_h_m: P b m 2 - P2mb: - crystal_class: orthorhombic - hall: ' P -2b 2' - hermann_mauguin: P 2 m b - 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: 28 - schoenflies: C2v^4 - universal_h_m: P 2 m b - P2cm: - crystal_class: orthorhombic - hall: ' P -2c 2' - hermann_mauguin: P 2 c m - 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: 28 - schoenflies: C2v^4 - universal_h_m: P 2 c m - Pc2m: - crystal_class: orthorhombic - hall: ' P -2c -2c' - hermann_mauguin: P c 2 m - symops: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] - ncsym: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] - number: 28 - schoenflies: C2v^4 - universal_h_m: P c 2 m - Pm2a: - crystal_class: orthorhombic - hall: ' P -2a -2a' - hermann_mauguin: P m 2 a - symops: ['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'] - number: 28 - schoenflies: C2v^4 - universal_h_m: P m 2 a Pca21: + spacegroup: Pca21 crystal_class: orthorhombic hall: ' P 2c -2ac' hermann_mauguin: P c a 21 @@ -1324,52 +298,8 @@ spacegroups: number: 29 schoenflies: C2v^5 universal_h_m: P c a 21 - Pbc21: - crystal_class: orthorhombic - hall: ' P 2c -2b' - hermann_mauguin: P b c 21 - symops: ['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'] - number: 29 - schoenflies: C2v^5 - universal_h_m: P b c 21 - P21ab: - crystal_class: orthorhombic - hall: ' P -2b 2a' - hermann_mauguin: P 21 a b - symops: ['x,y,z', 'x,y+0.5,-z', 'x+0.5,-y,-z', 'x+0.5,-y+0.5,z'] - ncsym: ['x,y,z', 'x,y+0.5,-z', 'x+0.5,-y,-z', 'x+0.5,-y+0.5,z'] - number: 29 - schoenflies: C2v^5 - universal_h_m: P 21 a b - P21ca: - crystal_class: orthorhombic - hall: ' P -2ac 2a' - hermann_mauguin: P 21 c a - symops: ['x,y,z', 'x+0.5,y,-z+0.5', 'x+0.5,-y,-z', 'x,-y,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y,-z+0.5', 'x+0.5,-y,-z', 'x,-y,z+0.5'] - number: 29 - schoenflies: C2v^5 - universal_h_m: P 21 c a - Pc21b: - crystal_class: orthorhombic - hall: ' P -2bc -2c' - hermann_mauguin: P c 21 b - symops: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] - ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] - number: 29 - schoenflies: C2v^5 - universal_h_m: P c 21 b - Pb21a: - crystal_class: orthorhombic - hall: ' P -2a -2ab' - hermann_mauguin: P b 21 a - symops: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y+0.5,z', '-x,y+0.5,-z'] - ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y+0.5,z', '-x,y+0.5,-z'] - number: 29 - schoenflies: C2v^5 - universal_h_m: P b 21 a Pnc2: + spacegroup: Pnc2 crystal_class: orthorhombic hall: ' P 2 -2bc' hermann_mauguin: P n c 2 @@ -1378,52 +308,8 @@ spacegroups: number: 30 schoenflies: C2v^6 universal_h_m: P n c 2 - Pcn2: - crystal_class: orthorhombic - hall: ' P 2 -2ac' - hermann_mauguin: P c n 2 - symops: ['x,y,z', '-x,-y,z', '-x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5'] - number: 30 - schoenflies: C2v^6 - universal_h_m: P c n 2 - P2na: - crystal_class: orthorhombic - hall: ' P -2ac 2' - hermann_mauguin: P 2 n a - 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: 30 - schoenflies: C2v^6 - universal_h_m: P 2 n a - P2an: - crystal_class: orthorhombic - hall: ' P -2ab 2' - hermann_mauguin: P 2 a n - symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,-y,-z', 'x+0.5,-y+0.5,z'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,-y,-z', 'x+0.5,-y+0.5,z'] - number: 30 - schoenflies: C2v^6 - universal_h_m: P 2 a n - Pb2n: - crystal_class: orthorhombic - hall: ' P -2ab -2ab' - hermann_mauguin: P b 2 n - symops: ['x,y,z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', '-x,y,-z'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', '-x,y,-z'] - number: 30 - schoenflies: C2v^6 - universal_h_m: P b 2 n - Pn2b: - crystal_class: orthorhombic - hall: ' P -2bc -2bc' - hermann_mauguin: P n 2 b - symops: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', '-x,y,-z'] - ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', '-x,y,-z'] - number: 30 - schoenflies: C2v^6 - universal_h_m: P n 2 b Pmn21: + spacegroup: Pmn21 crystal_class: orthorhombic hall: ' P 2ac -2' hermann_mauguin: P m n 21 @@ -1432,52 +318,8 @@ spacegroups: number: 31 schoenflies: C2v^7 universal_h_m: P m n 21 - Pnm21: - crystal_class: orthorhombic - hall: ' P 2bc -2bc' - hermann_mauguin: P n m 21 - symops: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] - number: 31 - schoenflies: C2v^7 - universal_h_m: P n m 21 - P21mn: - crystal_class: orthorhombic - hall: ' P -2ab 2ab' - hermann_mauguin: P 21 m n - symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x+0.5,-y+0.5,-z', 'x,-y,z'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', 'x+0.5,-y+0.5,-z', 'x,-y,z'] - number: 31 - schoenflies: C2v^7 - universal_h_m: P 21 m n - P21nm: - crystal_class: orthorhombic - hall: ' P -2 2ac' - hermann_mauguin: P 21 n m - symops: ['x,y,z', 'x,y,-z', 'x+0.5,-y,-z+0.5', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', 'x,y,-z', 'x+0.5,-y,-z+0.5', 'x+0.5,-y,z+0.5'] - number: 31 - schoenflies: C2v^7 - universal_h_m: P 21 n m - Pn21m: - crystal_class: orthorhombic - hall: ' P -2 -2bc' - hermann_mauguin: P n 21 m - 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: 31 - schoenflies: C2v^7 - universal_h_m: P n 21 m - Pm21n: - crystal_class: orthorhombic - hall: ' P -2ab -2' - hermann_mauguin: P m 21 n - symops: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] - number: 31 - schoenflies: C2v^7 - universal_h_m: P m 21 n Pba2: + spacegroup: Pba2 crystal_class: orthorhombic hall: ' P 2 -2ab' hermann_mauguin: P b a 2 @@ -1486,25 +328,8 @@ spacegroups: number: 32 schoenflies: C2v^8 universal_h_m: P b a 2 - P2cb: - crystal_class: orthorhombic - hall: ' P -2bc 2' - hermann_mauguin: P 2 c b - 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: 32 - schoenflies: C2v^8 - universal_h_m: P 2 c b - Pc2a: - crystal_class: orthorhombic - hall: ' P -2ac -2ac' - hermann_mauguin: P c 2 a - symops: ['x,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', '-x,y,-z'] - ncsym: ['x,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', '-x,y,-z'] - number: 32 - schoenflies: C2v^8 - universal_h_m: P c 2 a Pna21: + spacegroup: Pna21 crystal_class: orthorhombic hall: ' P 2c -2n' hermann_mauguin: P n a 21 @@ -1513,52 +338,8 @@ spacegroups: number: 33 schoenflies: C2v^9 universal_h_m: P n a 21 - Pbn21: - crystal_class: orthorhombic - hall: ' P 2c -2ab' - hermann_mauguin: P b n 21 - 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', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z+0.5'] - number: 33 - schoenflies: C2v^9 - universal_h_m: P b n 21 - P21nb: - crystal_class: orthorhombic - hall: ' P -2bc 2a' - hermann_mauguin: P 21 n b - symops: ['x,y,z', 'x,y+0.5,-z+0.5', 'x+0.5,-y,-z', 'x+0.5,-y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', 'x+0.5,-y,-z', 'x+0.5,-y+0.5,z+0.5'] - number: 33 - schoenflies: C2v^9 - universal_h_m: P 21 n b - P21cn: - crystal_class: orthorhombic - hall: ' P -2n 2a' - hermann_mauguin: P 21 c n - symops: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', 'x+0.5,-y,-z', 'x,-y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', 'x+0.5,-y,-z', 'x,-y+0.5,z+0.5'] - number: 33 - schoenflies: C2v^9 - universal_h_m: P 21 c n - Pc21n: - crystal_class: orthorhombic - hall: ' P -2n -2ac' - hermann_mauguin: P c 21 n - symops: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y,z+0.5', '-x,y+0.5,-z'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y,z+0.5', '-x,y+0.5,-z'] - number: 33 - schoenflies: C2v^9 - universal_h_m: P c 21 n - Pn21a: - crystal_class: orthorhombic - hall: ' P -2ac -2n' - hermann_mauguin: P n 21 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'] - 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'] - number: 33 - schoenflies: C2v^9 - universal_h_m: P n 21 a Pnn2: + spacegroup: Pnn2 crystal_class: orthorhombic hall: ' P 2 -2n' hermann_mauguin: P n n 2 @@ -1567,25 +348,8 @@ spacegroups: number: 34 schoenflies: C2v^10 universal_h_m: P n n 2 - P2nn: - crystal_class: orthorhombic - hall: ' P -2n 2' - hermann_mauguin: P 2 n n - symops: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', 'x,-y,-z', 'x+0.5,-y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', 'x,-y,-z', 'x+0.5,-y+0.5,z+0.5'] - number: 34 - schoenflies: C2v^10 - universal_h_m: P 2 n n - Pn2n: - crystal_class: orthorhombic - hall: ' P -2n -2n' - hermann_mauguin: P n 2 n - symops: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-x,y,-z'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', '-x,y,-z'] - number: 34 - schoenflies: C2v^10 - universal_h_m: P n 2 n Cmm2: + spacegroup: Cmm2 crystal_class: orthorhombic hall: ' C 2 -2' hermann_mauguin: C m m 2 @@ -1595,27 +359,8 @@ spacegroups: number: 35 schoenflies: C2v^11 universal_h_m: C m m 2 - A2mm: - crystal_class: orthorhombic - hall: ' A -2 2' - hermann_mauguin: A 2 m m - 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: 35 - schoenflies: C2v^11 - universal_h_m: A 2 m m - Bm2m: - crystal_class: orthorhombic - hall: ' B -2 -2' - hermann_mauguin: B m 2 m - 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'] - ncsym: ['x,y,z', 'x,y,-z', '-x,y,z', '-x,y,-z'] - number: 35 - schoenflies: C2v^11 - universal_h_m: B m 2 m Cmc21: + spacegroup: Cmc21 crystal_class: orthorhombic hall: ' C 2c -2' hermann_mauguin: C m c 21 @@ -1625,57 +370,8 @@ spacegroups: number: 36 schoenflies: C2v^12 universal_h_m: C m c 21 - Ccm21: - crystal_class: orthorhombic - hall: ' C 2c -2c' - hermann_mauguin: C c m 21 - symops: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,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'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] - number: 36 - schoenflies: C2v^12 - universal_h_m: C c m 21 - A21ma: - crystal_class: orthorhombic - hall: ' A -2a 2a' - hermann_mauguin: A 21 m a - symops: ['x,y,z', 'x+0.5,y,-z', 'x+0.5,-y,-z', 'x,-y,z', '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', 'x,-y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y,-z', 'x+0.5,-y,-z', 'x,-y,z'] - number: 36 - schoenflies: C2v^12 - universal_h_m: A 21 m a - A21am: - crystal_class: orthorhombic - hall: ' A -2 2a' - hermann_mauguin: A 21 a m - 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: 36 - schoenflies: C2v^12 - universal_h_m: A 21 a m - Bb21m: - crystal_class: orthorhombic - hall: ' B -2 -2b' - hermann_mauguin: B b 21 m - symops: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z', 'x+0.5,y,z+0.5', 'x+0.5,y,-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+0.5,z', '-x,y+0.5,-z'] - number: 36 - schoenflies: C2v^12 - universal_h_m: B b 21 m - Bm21b: - crystal_class: orthorhombic - hall: ' B -2b -2' - hermann_mauguin: B m 21 b - symops: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z', 'x+0.5,y,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'] - ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] - number: 36 - schoenflies: C2v^12 - universal_h_m: B m 21 b Ccc2: + spacegroup: Ccc2 crystal_class: orthorhombic hall: ' C 2 -2c' hermann_mauguin: C c c 2 @@ -1685,27 +381,8 @@ spacegroups: number: 37 schoenflies: C2v^13 universal_h_m: C c c 2 - A2aa: - crystal_class: orthorhombic - hall: ' A -2a 2' - hermann_mauguin: A 2 a a - symops: ['x,y,z', 'x+0.5,y,-z', '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+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,-z', 'x+0.5,-y,z'] - number: 37 - schoenflies: C2v^13 - universal_h_m: A 2 a a - Bb2b: - crystal_class: orthorhombic - hall: ' B -2b -2b' - hermann_mauguin: B b 2 b - symops: ['x,y,z', 'x,y+0.5,-z', '-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+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+0.5,z', '-x,y,-z'] - number: 37 - schoenflies: C2v^13 - universal_h_m: B b 2 b Amm2: + spacegroup: Amm2 crystal_class: orthorhombic hall: ' A 2 -2' hermann_mauguin: A m m 2 @@ -1715,57 +392,8 @@ spacegroups: number: 38 schoenflies: C2v^14 universal_h_m: A m m 2 - Bmm2: - crystal_class: orthorhombic - hall: ' B 2 -2' - hermann_mauguin: B m m 2 - 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'] - ncsym: ['x,y,z', '-x,-y,z', '-x,y,z', 'x,-y,z'] - number: 38 - schoenflies: C2v^14 - universal_h_m: B m m 2 - B2mm: - crystal_class: orthorhombic - hall: ' B -2 2' - hermann_mauguin: B 2 m m - 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'] - ncsym: ['x,y,z', 'x,y,-z', 'x,-y,-z', 'x,-y,z'] - number: 38 - schoenflies: C2v^14 - universal_h_m: B 2 m m - C2mm: - crystal_class: orthorhombic - hall: ' C -2 2' - hermann_mauguin: C 2 m m - 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: 38 - schoenflies: C2v^14 - universal_h_m: C 2 m m - Cm2m: - crystal_class: orthorhombic - hall: ' C -2 -2' - hermann_mauguin: C m 2 m - 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: 38 - schoenflies: C2v^14 - universal_h_m: C m 2 m - Am2m: - crystal_class: orthorhombic - hall: ' A -2 -2' - hermann_mauguin: A m 2 m - 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 2 m - Aem2: + Abm2: + spacegroup: Abm2 crystal_class: orthorhombic hall: ' A 2 -2b' hermann_mauguin: A e m 2 @@ -1775,57 +403,8 @@ spacegroups: number: 39 schoenflies: C2v^15 universal_h_m: A e m 2 - Bme2: - crystal_class: orthorhombic - hall: ' B 2 -2a' - hermann_mauguin: B m e 2 - symops: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z', 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', - '-x+1,y,z+0.5', 'x+1,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z'] - number: 39 - schoenflies: C2v^15 - universal_h_m: B m e 2 - B2em: - crystal_class: orthorhombic - hall: ' B -2a 2' - hermann_mauguin: B 2 e m - symops: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z', 'x+0.5,y,z+0.5', 'x+1,y,-z+0.5', - 'x+0.5,-y,-z+0.5', 'x+1,-y,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] - number: 39 - schoenflies: C2v^15 - universal_h_m: B 2 e m - C2me: - crystal_class: orthorhombic - hall: ' C -2a 2' - hermann_mauguin: C 2 m e - symops: ['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'] - ncsym: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] - number: 39 - schoenflies: C2v^15 - universal_h_m: C 2 m e - Cm2e: - crystal_class: orthorhombic - hall: ' C -2a -2a' - hermann_mauguin: C m 2 e - symops: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z', 'x+0.5,y+0.5,z', 'x+1,y+0.5,-z', - '-x+1,y+0.5,z', '-x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z'] - number: 39 - schoenflies: C2v^15 - universal_h_m: C m 2 e - Ae2m: - crystal_class: orthorhombic - hall: ' A -2b -2b' - hermann_mauguin: A e 2 m - symops: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z', 'x,y+0.5,z+0.5', 'x,y+1,-z+0.5', - '-x,y+1,z+0.5', '-x,y+0.5,-z+0.5'] - ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] - number: 39 - schoenflies: C2v^15 - universal_h_m: A e 2 m Ama2: + spacegroup: Ama2 crystal_class: orthorhombic hall: ' A 2 -2a' hermann_mauguin: A m a 2 @@ -1835,57 +414,8 @@ spacegroups: number: 40 schoenflies: C2v^16 universal_h_m: A m a 2 - Bbm2: - crystal_class: orthorhombic - hall: ' B 2 -2b' - hermann_mauguin: B b m 2 - symops: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z', 'x+0.5,y,z+0.5', '-x+0.5,-y,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+0.5,z', 'x,-y+0.5,z'] - number: 40 - schoenflies: C2v^16 - universal_h_m: B b m 2 - B2mb: - crystal_class: orthorhombic - hall: ' B -2b 2' - hermann_mauguin: B 2 m b - symops: ['x,y,z', 'x,y+0.5,-z', 'x,-y,-z', 'x,-y+0.5,z', 'x+0.5,y,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'] - ncsym: ['x,y,z', 'x,y+0.5,-z', 'x,-y,-z', 'x,-y+0.5,z'] - number: 40 - schoenflies: C2v^16 - universal_h_m: B 2 m b - C2cm: - crystal_class: orthorhombic - hall: ' C -2c 2' - hermann_mauguin: C 2 c m - 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: 40 - schoenflies: C2v^16 - universal_h_m: C 2 c m - Cc2m: - crystal_class: orthorhombic - hall: ' C -2c -2c' - hermann_mauguin: C c 2 m - symops: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-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'] - ncsym: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] - number: 40 - schoenflies: C2v^16 - universal_h_m: C c 2 m - Am2a: - crystal_class: orthorhombic - hall: ' A -2a -2a' - hermann_mauguin: A m 2 a - symops: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z', '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', '-x,y+0.5,-z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z'] - number: 40 - schoenflies: C2v^16 - universal_h_m: A m 2 a - Aea2: + Aba2: + spacegroup: Aba2 crystal_class: orthorhombic hall: ' A 2 -2ab' hermann_mauguin: A e a 2 @@ -1895,57 +425,8 @@ spacegroups: number: 41 schoenflies: C2v^17 universal_h_m: A e a 2 - Bbe2: - crystal_class: orthorhombic - hall: ' B 2 -2ab' - hermann_mauguin: B b e 2 - 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,z+0.5', - '-x+0.5,-y,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+0.5,z', 'x+0.5,-y+0.5,z'] - number: 41 - schoenflies: C2v^17 - universal_h_m: B b e 2 - B2eb: - crystal_class: orthorhombic - hall: ' B -2ab 2' - hermann_mauguin: B 2 e b - symops: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,-y,-z', 'x+0.5,-y+0.5,z', 'x+0.5,y,z+0.5', - 'x+1,y+0.5,-z+0.5', 'x+0.5,-y,-z+0.5', 'x+1,-y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', 'x,-y,-z', 'x+0.5,-y+0.5,z'] - number: 41 - schoenflies: C2v^17 - universal_h_m: B 2 e b - C2eb: - crystal_class: orthorhombic - hall: ' C -2ac 2' - hermann_mauguin: C 2 e b - symops: ['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'] - ncsym: ['x,y,z', 'x+0.5,y,-z+0.5', 'x,-y,-z', 'x+0.5,-y,z+0.5'] - number: 41 - schoenflies: C2v^17 - universal_h_m: C 2 e b - Cc2e: - crystal_class: orthorhombic - hall: ' C -2ac -2ac' - hermann_mauguin: C c 2 e - symops: ['x,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', '-x,y,-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+0.5,y+0.5,-z'] - ncsym: ['x,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,z+0.5', '-x,y,-z'] - number: 41 - schoenflies: C2v^17 - universal_h_m: C c 2 e - Ae2a: - crystal_class: orthorhombic - hall: ' A -2ab -2ab' - hermann_mauguin: A e 2 a - symops: ['x,y,z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', '-x,y,-z', 'x,y+0.5,z+0.5', - 'x+0.5,y+1,-z+0.5', '-x+0.5,y+1,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+0.5,z', '-x,y,-z'] - number: 41 - schoenflies: C2v^17 - universal_h_m: A e 2 a - Fmm2: + Fmm2: + spacegroup: Fmm2 crystal_class: orthorhombic hall: ' F 2 -2' hermann_mauguin: F m m 2 @@ -1956,29 +437,8 @@ spacegroups: number: 42 schoenflies: C2v^18 universal_h_m: F m m 2 - F2mm: - crystal_class: orthorhombic - hall: ' F -2 2' - hermann_mauguin: F 2 m m - 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 2 m m - Fm2m: - crystal_class: orthorhombic - hall: ' F -2 -2' - hermann_mauguin: F m 2 m - 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 2 m Fdd2: + spacegroup: Fdd2 crystal_class: orthorhombic hall: ' F 2 -2d' hermann_mauguin: F d d 2 @@ -1990,31 +450,8 @@ spacegroups: number: 43 schoenflies: C2v^19 universal_h_m: F d d 2 - F2dd: - crystal_class: orthorhombic - hall: ' F -2d 2' - hermann_mauguin: F 2 d d - symops: ['x,y,z', 'x+0.25,y+0.25,-z+0.25', 'x,-y,-z', 'x+0.25,-y+0.25,z+0.25', - 'x,y+0.5,z+0.5', 'x+0.25,y+0.75,-z+0.75', 'x,-y+0.5,-z+0.5', 'x+0.25,-y+0.75,z+0.75', - 'x+0.5,y,z+0.5', 'x+0.75,y+0.25,-z+0.75', 'x+0.5,-y,-z+0.5', 'x+0.75,-y+0.25,z+0.75', - 'x+0.5,y+0.5,z', 'x+0.75,y+0.75,-z+0.25', 'x+0.5,-y+0.5,-z', 'x+0.75,-y+0.75,z+0.25'] - ncsym: ['x,y,z', 'x+0.25,y+0.25,-z+0.25', 'x,-y,-z', 'x+0.25,-y+0.25,z+0.25'] - number: 43 - schoenflies: C2v^19 - universal_h_m: F 2 d d - Fd2d: - crystal_class: orthorhombic - hall: ' F -2d -2d' - hermann_mauguin: F d 2 d - symops: ['x,y,z', 'x+0.25,y+0.25,-z+0.25', '-x+0.25,y+0.25,z+0.25', '-x+0.5,y+0.5,-z', - '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.5,y+1,-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+1,y+0.5,-z+0.5', - '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+1,y+1,-z'] - ncsym: ['x,y,z', 'x+0.25,y+0.25,-z+0.25', '-x+0.25,y+0.25,z+0.25', '-x+0.5,y+0.5,-z'] - number: 43 - schoenflies: C2v^19 - universal_h_m: F d 2 d Imm2: + spacegroup: Imm2 crystal_class: orthorhombic hall: ' I 2 -2' hermann_mauguin: I m m 2 @@ -2024,27 +461,8 @@ spacegroups: number: 44 schoenflies: C2v^20 universal_h_m: I m m 2 - I2mm: - crystal_class: orthorhombic - hall: ' I -2 2' - hermann_mauguin: I 2 m m - 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 2 m m - Im2m: - crystal_class: orthorhombic - hall: ' I -2 -2' - hermann_mauguin: I m 2 m - 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 2 m Iba2: + spacegroup: Iba2 crystal_class: orthorhombic hall: ' I 2 -2c' hermann_mauguin: I b a 2 @@ -2054,27 +472,8 @@ spacegroups: number: 45 schoenflies: C2v^21 universal_h_m: I b a 2 - I2cb: - crystal_class: orthorhombic - hall: ' I -2a 2' - hermann_mauguin: I 2 c b - symops: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z', 'x+0.5,y+0.5,z+0.5', - 'x+1,y+0.5,-z+0.5', 'x+0.5,-y+0.5,-z+0.5', 'x+1,-y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y,-z', 'x,-y,-z', 'x+0.5,-y,z'] - number: 45 - schoenflies: C2v^21 - universal_h_m: I 2 c b - Ic2a: - crystal_class: orthorhombic - hall: ' I -2b -2b' - hermann_mauguin: I c 2 a - symops: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z', 'x+0.5,y+0.5,z+0.5', - 'x+0.5,y+1,-z+0.5', '-x+0.5,y+1,z+0.5', '-x+0.5,y+0.5,-z+0.5'] - ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] - number: 45 - schoenflies: C2v^21 - universal_h_m: I c 2 a Ima2: + spacegroup: Ima2 crystal_class: orthorhombic hall: ' I 2 -2a' hermann_mauguin: I m a 2 @@ -2084,57 +483,8 @@ spacegroups: number: 46 schoenflies: C2v^22 universal_h_m: I m a 2 - Ibm2: - crystal_class: orthorhombic - hall: ' I 2 -2b' - hermann_mauguin: I b m 2 - symops: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-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+1,z+0.5', 'x+0.5,-y+1,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z', '-x,y+0.5,z', 'x,-y+0.5,z'] - number: 46 - schoenflies: C2v^22 - universal_h_m: I b m 2 - I2mb: - crystal_class: orthorhombic - hall: ' I -2b 2' - hermann_mauguin: I 2 m b - symops: ['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'] - ncsym: ['x,y,z', 'x,y+0.5,-z', 'x,-y,-z', 'x,-y+0.5,z'] - number: 46 - schoenflies: C2v^22 - universal_h_m: I 2 m b - I2cm: - crystal_class: orthorhombic - hall: ' I -2c 2' - hermann_mauguin: I 2 c m - symops: ['x,y,z', 'x,y,-z+0.5', 'x,-y,-z', 'x,-y,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+0.5', 'x+0.5,-y+0.5,z+1'] - ncsym: ['x,y,z', 'x,y,-z+0.5', 'x,-y,-z', 'x,-y,z+0.5'] - number: 46 - schoenflies: C2v^22 - universal_h_m: I 2 c m - Ic2m: - crystal_class: orthorhombic - hall: ' I -2c -2c' - hermann_mauguin: I c 2 m - symops: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z', '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'] - ncsym: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] - number: 46 - schoenflies: C2v^22 - universal_h_m: I c 2 m - Im2a: - crystal_class: orthorhombic - hall: ' I -2a -2a' - hermann_mauguin: I m 2 a - symops: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z', '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', '-x+0.5,y+0.5,-z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y,z', '-x,y,-z'] - number: 46 - schoenflies: C2v^22 - universal_h_m: I m 2 a Pmmm: + spacegroup: Pmmm crystal_class: orthorhombic hall: -P 2 2 hermann_mauguin: P m m m @@ -2145,7 +495,8 @@ spacegroups: number: 47 schoenflies: D2h^1 universal_h_m: P m m m - Pnnn:1: + Pnnn: + spacegroup: Pnnn crystal_class: orthorhombic hall: ' P 2 2 -1n' hermann_mauguin: P n n n @@ -2156,18 +507,8 @@ spacegroups: number: 48 schoenflies: D2h^2 universal_h_m: P n n n :1 - Pnnn:2: - crystal_class: orthorhombic - hall: -P 2ab 2bc - hermann_mauguin: P n n n - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y-0.5,z-0.5', 'x-0.5,-y,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y-0.5,z-0.5', 'x-0.5,-y,z-0.5'] - number: 48 - schoenflies: D2h^2 - universal_h_m: P n n n :2 Pccm: + spacegroup: Pccm crystal_class: orthorhombic hall: -P 2 2c hermann_mauguin: P c c m @@ -2178,29 +519,8 @@ spacegroups: number: 49 schoenflies: D2h^3 universal_h_m: P c c m - Pmaa: - crystal_class: orthorhombic - hall: -P 2a 2 - hermann_mauguin: P m a 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'] - 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: 49 - schoenflies: D2h^3 - universal_h_m: P m a a - Pbmb: - crystal_class: orthorhombic - hall: -P 2b 2b - hermann_mauguin: P b m b - symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', - '-x,y-0.5,z', 'x,-y,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', - '-x,y-0.5,z', 'x,-y,z'] - number: 49 - schoenflies: D2h^3 - universal_h_m: P b m b - Pban:1: + Pban: + spacegroup: Pban crystal_class: orthorhombic hall: ' P 2 2 -1ab' hermann_mauguin: P b a n @@ -2211,62 +531,8 @@ spacegroups: number: 50 schoenflies: D2h^4 universal_h_m: P b a n :1 - Pban:2: - crystal_class: orthorhombic - hall: -P 2ab 2b - hermann_mauguin: P b a n - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z'] - number: 50 - schoenflies: D2h^4 - universal_h_m: P b a n :2 - Pncb:1: - crystal_class: orthorhombic - hall: ' P 2 2 -1bc' - hermann_mauguin: P n c b - 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', '-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'] - number: 50 - schoenflies: D2h^4 - universal_h_m: P n c b :1 - Pncb:2: - crystal_class: orthorhombic - hall: -P 2b 2bc - hermann_mauguin: P n c b - symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z', '-x,y-0.5,z-0.5', 'x,-y,z-0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z', '-x,y-0.5,z-0.5', 'x,-y,z-0.5'] - number: 50 - schoenflies: D2h^4 - universal_h_m: P n c b :2 - Pcna:1: - crystal_class: orthorhombic - hall: ' P 2 2 -1ac' - hermann_mauguin: P c n a - 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'] - 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: 50 - schoenflies: D2h^4 - universal_h_m: P c n a :1 - Pcna:2: - crystal_class: orthorhombic - hall: -P 2a 2c - hermann_mauguin: P c n a - symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y,z-0.5', 'x-0.5,-y,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y,z-0.5', 'x-0.5,-y,z-0.5'] - number: 50 - schoenflies: D2h^4 - universal_h_m: P c n a :2 Pmma: + spacegroup: Pmma crystal_class: orthorhombic hall: -P 2a 2a hermann_mauguin: P m m a @@ -2277,62 +543,8 @@ spacegroups: number: 51 schoenflies: D2h^5 universal_h_m: P m m a - Pmmb: - crystal_class: orthorhombic - hall: -P 2b 2 - hermann_mauguin: P m m b - 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'] - 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: 51 - schoenflies: D2h^5 - universal_h_m: P m m b - Pbmm: - crystal_class: orthorhombic - hall: -P 2 2b - hermann_mauguin: P b m m - symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', - '-x,y-0.5,z', 'x,-y-0.5,z'] - ncsym: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', - '-x,y-0.5,z', 'x,-y-0.5,z'] - number: 51 - schoenflies: D2h^5 - universal_h_m: P b m m - Pcmm: - crystal_class: orthorhombic - hall: -P 2c 2c - hermann_mauguin: P c m m - symops: ['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,-y,z'] - ncsym: ['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,-y,z'] - number: 51 - schoenflies: D2h^5 - universal_h_m: P c m m - Pmcm: - crystal_class: orthorhombic - hall: -P 2c 2 - hermann_mauguin: P 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'] - 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: 51 - schoenflies: D2h^5 - universal_h_m: P m c m - Pmam: - crystal_class: orthorhombic - hall: -P 2 2a - hermann_mauguin: P m a m - symops: ['x,y,z', '-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'] - ncsym: ['x,y,z', '-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'] - number: 51 - schoenflies: D2h^5 - universal_h_m: P m a m Pnna: + spacegroup: Pnna crystal_class: orthorhombic hall: -P 2a 2bc hermann_mauguin: P n n a @@ -2343,62 +555,8 @@ spacegroups: number: 52 schoenflies: D2h^6 universal_h_m: P n n a - Pnnb: - crystal_class: orthorhombic - hall: -P 2b 2n - hermann_mauguin: P n n b - symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z', '-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+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z', '-x-0.5,y-0.5,z-0.5', 'x-0.5,-y,z-0.5'] - number: 52 - schoenflies: D2h^6 - universal_h_m: P n n b - Pbnn: - crystal_class: orthorhombic - hall: -P 2n 2b - hermann_mauguin: P b n n - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x,y-0.5,z', 'x-0.5,-y,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x,y-0.5,z', 'x-0.5,-y,z-0.5'] - number: 52 - schoenflies: D2h^6 - universal_h_m: P b n n - Pcnn: - crystal_class: orthorhombic - hall: -P 2ab 2c - hermann_mauguin: P c n n - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y,z-0.5', 'x-0.5,-y-0.5,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y,z-0.5', 'x-0.5,-y-0.5,z-0.5'] - number: 52 - schoenflies: D2h^6 - universal_h_m: P c n n - Pncn: - crystal_class: orthorhombic - hall: -P 2ab 2n - hermann_mauguin: P n c n - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x-0.5,y-0.5,z-0.5', 'x,-y,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x-0.5,y-0.5,z-0.5', 'x,-y,z-0.5'] - number: 52 - schoenflies: D2h^6 - universal_h_m: P n c n - Pnan: - crystal_class: orthorhombic - hall: -P 2n 2bc - hermann_mauguin: P n a n - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x,y-0.5,z-0.5', 'x-0.5,-y,z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x,y-0.5,z-0.5', 'x-0.5,-y,z'] - number: 52 - schoenflies: D2h^6 - universal_h_m: P n a n Pmna: + spacegroup: Pmna crystal_class: orthorhombic hall: -P 2ac 2 hermann_mauguin: P m n a @@ -2409,62 +567,8 @@ spacegroups: number: 53 schoenflies: D2h^7 universal_h_m: P m n a - Pnmb: - crystal_class: orthorhombic - hall: -P 2bc 2bc - hermann_mauguin: P n m b - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y,-z', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x,y-0.5,z-0.5', 'x,-y,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y,-z', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x,y-0.5,z-0.5', 'x,-y,z'] - number: 53 - schoenflies: D2h^7 - universal_h_m: P n m b - Pbmn: - crystal_class: orthorhombic - hall: -P 2ab 2ab - hermann_mauguin: P b m n - symops: ['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', 'x,-y,z'] - ncsym: ['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', 'x,-y,z'] - number: 53 - schoenflies: D2h^7 - universal_h_m: P b m n - Pcnm: - crystal_class: orthorhombic - hall: -P 2 2ac - hermann_mauguin: P c n m - symops: ['x,y,z', '-x,-y,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x,y,-z', '-x-0.5,y,z-0.5', 'x-0.5,-y,z-0.5'] - ncsym: ['x,y,z', '-x,-y,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x,y,-z', '-x-0.5,y,z-0.5', 'x-0.5,-y,z-0.5'] - number: 53 - schoenflies: D2h^7 - universal_h_m: P c n m - Pncm: - crystal_class: orthorhombic - hall: -P 2 2bc - hermann_mauguin: P n c m - symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-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', '-x,-y,-z', - 'x,y,-z', '-x,y-0.5,z-0.5', 'x,-y-0.5,z-0.5'] - number: 53 - schoenflies: D2h^7 - universal_h_m: P n c m - Pman: - crystal_class: orthorhombic - hall: -P 2ab 2 - hermann_mauguin: P m a n - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y,z', 'x-0.5,-y-0.5,z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y,z', 'x-0.5,-y-0.5,z'] - number: 53 - schoenflies: D2h^7 - universal_h_m: P m a n Pcca: + spacegroup: Pcca crystal_class: orthorhombic hall: -P 2a 2ac hermann_mauguin: P c c a @@ -2475,62 +579,8 @@ spacegroups: number: 54 schoenflies: D2h^8 universal_h_m: P c c a - Pccb: - crystal_class: orthorhombic - hall: -P 2b 2c - hermann_mauguin: P c c b - 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'] - 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: 54 - schoenflies: D2h^8 - universal_h_m: P c c b - Pbaa: - crystal_class: orthorhombic - hall: -P 2a 2b - hermann_mauguin: P b a a - symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z'] - number: 54 - schoenflies: D2h^8 - universal_h_m: P b a a - Pcaa: - crystal_class: orthorhombic - hall: -P 2ac 2c - hermann_mauguin: P c a a - symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x,y,z-0.5', 'x-0.5,-y,z'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x,y,z-0.5', 'x-0.5,-y,z'] - number: 54 - schoenflies: D2h^8 - universal_h_m: P c a a - Pbcb: - crystal_class: orthorhombic - hall: -P 2bc 2b - hermann_mauguin: P b c b - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x,y,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x,y-0.5,z', 'x,-y,z-0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x,y,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x,y-0.5,z', 'x,-y,z-0.5'] - number: 54 - schoenflies: D2h^8 - universal_h_m: P b c b - Pbab: - crystal_class: orthorhombic - hall: -P 2b 2ab - hermann_mauguin: P b a b - symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x,y-0.5,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x,y-0.5,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y,z'] - number: 54 - schoenflies: D2h^8 - universal_h_m: P b a b Pbam: + spacegroup: Pbam crystal_class: orthorhombic hall: -P 2 2ab hermann_mauguin: P b a m @@ -2541,29 +591,8 @@ spacegroups: number: 55 schoenflies: D2h^9 universal_h_m: P b a m - Pmcb: - crystal_class: orthorhombic - hall: -P 2bc 2 - hermann_mauguin: P m c b - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z', '-x,y+0.5,-z+0.5', '-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', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x,y,z', 'x,-y-0.5,z-0.5'] - number: 55 - schoenflies: D2h^9 - universal_h_m: P m c b - Pcma: - crystal_class: orthorhombic - hall: -P 2ac 2ac - hermann_mauguin: P c m a - symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y,z'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y,z'] - number: 55 - schoenflies: D2h^9 - universal_h_m: P c m a Pccn: + spacegroup: Pccn crystal_class: orthorhombic hall: -P 2ab 2ac hermann_mauguin: P c c n @@ -2574,29 +603,8 @@ spacegroups: number: 56 schoenflies: D2h^10 universal_h_m: P c c n - Pnaa: - crystal_class: orthorhombic - hall: -P 2ac 2bc - hermann_mauguin: P n a a - symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x,y-0.5,z-0.5', 'x-0.5,-y-0.5,z'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x,y-0.5,z-0.5', 'x-0.5,-y-0.5,z'] - number: 56 - schoenflies: D2h^10 - universal_h_m: P n a a - Pbnb: - crystal_class: orthorhombic - hall: -P 2bc 2ab - hermann_mauguin: P b n b - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x-0.5,y-0.5,z', 'x-0.5,-y,z-0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x-0.5,y-0.5,z', 'x-0.5,-y,z-0.5'] - number: 56 - schoenflies: D2h^10 - universal_h_m: P b n b Pbcm: + spacegroup: Pbcm crystal_class: orthorhombic hall: -P 2c 2b hermann_mauguin: P b c m @@ -2607,62 +615,8 @@ spacegroups: number: 57 schoenflies: D2h^11 universal_h_m: P b c m - Pcam: - crystal_class: orthorhombic - hall: -P 2c 2ac - hermann_mauguin: P c a m - symops: ['x,y,z', '-x,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z', '-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', '-x,-y,-z', - 'x,y,-z-0.5', '-x-0.5,y,z-0.5', 'x-0.5,-y,z'] - number: 57 - schoenflies: D2h^11 - universal_h_m: P c a m - Pmca: - crystal_class: orthorhombic - hall: -P 2ac 2a - hermann_mauguin: P m c a - symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z', '-x,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x-0.5,y,z', 'x,-y,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z', '-x,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x-0.5,y,z', 'x,-y,z-0.5'] - number: 57 - schoenflies: D2h^11 - universal_h_m: P m c a - Pmab: - crystal_class: orthorhombic - hall: -P 2b 2a - hermann_mauguin: P m a b - symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x,y-0.5,-z', '-x-0.5,y,z', 'x-0.5,-y-0.5,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x,y-0.5,-z', '-x-0.5,y,z', 'x-0.5,-y-0.5,z'] - number: 57 - schoenflies: D2h^11 - universal_h_m: P m a b - Pbma: - crystal_class: orthorhombic - hall: -P 2a 2ab - hermann_mauguin: P b m a - symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z', '-x-0.5,y-0.5,z', 'x,-y-0.5,z'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z', '-x-0.5,y-0.5,z', 'x,-y-0.5,z'] - number: 57 - schoenflies: D2h^11 - universal_h_m: P b m a - Pcmb: - crystal_class: orthorhombic - hall: -P 2bc 2c - hermann_mauguin: P c m b - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x,y,z-0.5', 'x,-y-0.5,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x,y,z-0.5', 'x,-y-0.5,z'] - number: 57 - schoenflies: D2h^11 - universal_h_m: P c m b Pnnm: + spacegroup: Pnnm crystal_class: orthorhombic hall: -P 2 2n hermann_mauguin: P n n m @@ -2673,29 +627,8 @@ spacegroups: number: 58 schoenflies: D2h^12 universal_h_m: P n n m - Pmnn: - crystal_class: orthorhombic - hall: -P 2n 2 - hermann_mauguin: P m n n - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x,y,z', 'x-0.5,-y-0.5,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x,y,z', 'x-0.5,-y-0.5,z-0.5'] - number: 58 - schoenflies: D2h^12 - universal_h_m: P m n n - Pnmn: - crystal_class: orthorhombic - hall: -P 2n 2n - hermann_mauguin: P n m n - symops: ['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', 'x,-y,z'] - ncsym: ['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', 'x,-y,z'] - number: 58 - schoenflies: D2h^12 - universal_h_m: P n m n - Pmmn:1: + Pmmn: + spacegroup: Pmmn crystal_class: orthorhombic hall: ' P 2 2ab -1ab' hermann_mauguin: P m m n @@ -2706,62 +639,8 @@ spacegroups: number: 59 schoenflies: D2h^13 universal_h_m: P m m n :1 - Pmmn:2: - crystal_class: orthorhombic - hall: -P 2ab 2a - hermann_mauguin: P m m n - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x-0.5,y,z', 'x,-y-0.5,z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x-0.5,y,z', 'x,-y-0.5,z'] - number: 59 - schoenflies: D2h^13 - universal_h_m: P m m n :2 - Pnmm:1: - crystal_class: orthorhombic - hall: ' P 2bc 2 -1bc' - hermann_mauguin: P n m m - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', - 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', - 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] - number: 59 - schoenflies: D2h^13 - universal_h_m: P n m m :1 - Pnmm:2: - crystal_class: orthorhombic - hall: -P 2c 2bc - hermann_mauguin: P n m m - symops: ['x,y,z', '-x,-y,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', - 'x,y,-z-0.5', '-x,y-0.5,z-0.5', 'x,-y-0.5,z'] - ncsym: ['x,y,z', '-x,-y,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', - 'x,y,-z-0.5', '-x,y-0.5,z-0.5', 'x,-y-0.5,z'] - number: 59 - schoenflies: D2h^13 - universal_h_m: P n m m :2 - Pmnm:1: - crystal_class: orthorhombic - hall: ' P 2ac 2ac -1ac' - hermann_mauguin: P m n m - symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', - 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', - 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] - number: 59 - schoenflies: D2h^13 - universal_h_m: P m n m :1 - Pmnm:2: - crystal_class: orthorhombic - hall: -P 2c 2a - hermann_mauguin: P m n m - symops: ['x,y,z', '-x,-y,z+0.5', 'x+0.5,-y,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x,y,-z-0.5', '-x-0.5,y,z', 'x-0.5,-y,z-0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', 'x+0.5,-y,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x,y,-z-0.5', '-x-0.5,y,z', 'x-0.5,-y,z-0.5'] - number: 59 - schoenflies: D2h^13 - universal_h_m: P m n m :2 Pbcn: + spacegroup: Pbcn crystal_class: orthorhombic hall: -P 2n 2ab hermann_mauguin: P b c n @@ -2772,62 +651,8 @@ spacegroups: number: 60 schoenflies: D2h^14 universal_h_m: P b c n - Pcan: - crystal_class: orthorhombic - hall: -P 2n 2c - hermann_mauguin: P c a n - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x,y,z-0.5', 'x-0.5,-y-0.5,z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x,y,z-0.5', 'x-0.5,-y-0.5,z'] - number: 60 - schoenflies: D2h^14 - universal_h_m: P c a n - Pnca: - crystal_class: orthorhombic - hall: -P 2a 2n - hermann_mauguin: P n c a - symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z', '-x-0.5,y-0.5,z-0.5', 'x,-y-0.5,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z', '-x-0.5,y-0.5,z-0.5', 'x,-y-0.5,z-0.5'] - number: 60 - schoenflies: D2h^14 - universal_h_m: P n c a - Pnab: - crystal_class: orthorhombic - hall: -P 2bc 2n - hermann_mauguin: P n a b - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x-0.5,y-0.5,z-0.5', 'x-0.5,-y,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x-0.5,y-0.5,z-0.5', 'x-0.5,-y,z'] - number: 60 - schoenflies: D2h^14 - universal_h_m: P n a b - Pbna: - crystal_class: orthorhombic - hall: -P 2ac 2b - hermann_mauguin: P b n a - symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x,y-0.5,z', 'x-0.5,-y-0.5,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x,y-0.5,z', 'x-0.5,-y-0.5,z-0.5'] - number: 60 - schoenflies: D2h^14 - universal_h_m: P b n a - Pcnb: - crystal_class: orthorhombic - hall: -P 2b 2ac - hermann_mauguin: P c n b - symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z', '-x-0.5,y,z-0.5', 'x-0.5,-y-0.5,z-0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z', '-x-0.5,y,z-0.5', 'x-0.5,-y-0.5,z-0.5'] - number: 60 - schoenflies: D2h^14 - universal_h_m: P c n b Pbca: + spacegroup: Pbca crystal_class: orthorhombic hall: -P 2ac 2ab hermann_mauguin: P b c a @@ -2838,18 +663,8 @@ spacegroups: number: 61 schoenflies: D2h^15 universal_h_m: P b c a - Pcab: - crystal_class: orthorhombic - hall: -P 2bc 2ac - hermann_mauguin: P c a b - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x-0.5,y,z-0.5', 'x-0.5,-y-0.5,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x-0.5,y,z-0.5', 'x-0.5,-y-0.5,z'] - number: 61 - schoenflies: D2h^15 - universal_h_m: P c a b Pnma: + spacegroup: Pnma crystal_class: orthorhombic hall: -P 2ac 2n hermann_mauguin: P n m a @@ -2860,62 +675,8 @@ spacegroups: number: 62 schoenflies: D2h^16 universal_h_m: P n m a - Pmnb: - crystal_class: orthorhombic - hall: -P 2bc 2a - hermann_mauguin: P m n b - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x-0.5,y,z', 'x-0.5,-y-0.5,z-0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x,y-0.5,-z-0.5', '-x-0.5,y,z', 'x-0.5,-y-0.5,z-0.5'] - number: 62 - schoenflies: D2h^16 - universal_h_m: P m n b - Pbnm: - crystal_class: orthorhombic - hall: -P 2c 2ab - hermann_mauguin: P b n m - 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', '-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', 'x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,-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'] - number: 62 - schoenflies: D2h^16 - universal_h_m: P b n m - Pcmn: - crystal_class: orthorhombic - hall: -P 2n 2ac - hermann_mauguin: P c m n - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y-0.5,z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y-0.5,z'] - number: 62 - schoenflies: D2h^16 - universal_h_m: P c m n - Pmcn: - crystal_class: orthorhombic - hall: -P 2n 2a - hermann_mauguin: P m c n - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y,z', 'x,-y-0.5,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z', - 'x-0.5,y-0.5,-z-0.5', '-x-0.5,y,z', 'x,-y-0.5,z-0.5'] - number: 62 - schoenflies: D2h^16 - universal_h_m: P m c n - Pnam: - crystal_class: orthorhombic - hall: -P 2c 2n - hermann_mauguin: P n a m - 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', '-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', '-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: 62 - schoenflies: D2h^16 - universal_h_m: P n a m Cmcm: + spacegroup: Cmcm crystal_class: orthorhombic hall: -C 2c 2 hermann_mauguin: C m c m @@ -2928,150 +689,22 @@ spacegroups: number: 63 schoenflies: D2h^17 universal_h_m: C m c m - Ccmm: + Cmce: + spacegroup: Cmce crystal_class: orthorhombic - hall: -C 2c 2c - hermann_mauguin: C c m m - symops: ['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,-y,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', - 'x+0.5,-y+0.5,z'] - ncsym: ['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,-y,z'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C c m m - Amma: - crystal_class: orthorhombic - hall: -A 2a 2a - hermann_mauguin: A 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', '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', - '-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', - 'x,-y+0.5,z+0.5'] - 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: 63 - schoenflies: D2h^17 - universal_h_m: A m m a - Amam: - crystal_class: orthorhombic - hall: -A 2 2a - hermann_mauguin: A m a m - symops: ['x,y,z', '-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+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', '-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', '-x,-y,-z', 'x,y,-z', - '-x-0.5,y,z', 'x-0.5,-y,z'] - number: 63 - schoenflies: D2h^17 - universal_h_m: A m a m - Bbmm: - crystal_class: orthorhombic - hall: -B 2 2b - hermann_mauguin: B b m m - symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', - '-x,y-0.5,z', 'x,-y-0.5,z', 'x+0.5,y,z+0.5', '-x+0.5,-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,-z+0.5', 'x+0.5,y,-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+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', - '-x,y-0.5,z', 'x,-y-0.5,z'] - number: 63 - schoenflies: D2h^17 - universal_h_m: B b m m - Bmmb: - crystal_class: orthorhombic - hall: -B 2b 2 - hermann_mauguin: B m m b - 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,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', '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'] - 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: 63 - schoenflies: D2h^17 - universal_h_m: B m m b - 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 - Ccme: - crystal_class: orthorhombic - hall: -C 2ac 2ac - hermann_mauguin: C c m e - symops: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y,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+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+0.5,z'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x,-y,-z', - 'x-0.5,y,-z-0.5', '-x-0.5,y,z-0.5', 'x,-y,z'] - number: 64 - schoenflies: D2h^18 - universal_h_m: C c m e - Aema: - crystal_class: orthorhombic - hall: -A 2ab 2ab - hermann_mauguin: A e m a - symops: ['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', 'x,-y,z', 'x,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5', - 'x+0.5,-y+1,-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,-y+0.5,z+0.5'] - ncsym: ['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', 'x,-y,z'] - number: 64 - schoenflies: D2h^18 - universal_h_m: A e m a - Aeam: - crystal_class: orthorhombic - hall: -A 2 2ab - hermann_mauguin: A e 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', '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', '-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'] - 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: 64 - schoenflies: D2h^18 - universal_h_m: A e a m - Bbem: - crystal_class: orthorhombic - hall: -B 2 2ab - hermann_mauguin: B b e 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', 'x+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', - 'x+1,-y+0.5,-z+0.5', '-x+1,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', 'x+0.5,y,-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+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: 64 - schoenflies: D2h^18 - universal_h_m: B b e m - Bmeb: - crystal_class: orthorhombic - hall: -B 2ab 2 - hermann_mauguin: B m e b - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y,z', 'x-0.5,-y-0.5,z', 'x+0.5,y,z+0.5', '-x+1,-y+0.5,z+0.5', - 'x+0.5,-y,-z+0.5', '-x+1,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', 'x,y-0.5,-z+0.5', - '-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,-y,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y,z', 'x-0.5,-y-0.5,z'] - number: 64 - schoenflies: D2h^18 - universal_h_m: B m e b - Cmmm: + 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 @@ -3083,31 +716,8 @@ spacegroups: number: 65 schoenflies: D2h^19 universal_h_m: C m m m - Ammm: - crystal_class: orthorhombic - hall: -A 2 2 - hermann_mauguin: A 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'] - 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: A m m m - Bmmm: - crystal_class: orthorhombic - hall: -B 2 2 - hermann_mauguin: B 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,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'] - 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: B m m m Cccm: + spacegroup: Cccm crystal_class: orthorhombic hall: -C 2 2c hermann_mauguin: C c c m @@ -3120,33 +730,8 @@ spacegroups: number: 66 schoenflies: D2h^20 universal_h_m: C c c m - Amaa: - crystal_class: orthorhombic - hall: -A 2a 2 - hermann_mauguin: A m a 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,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', - '-x+0.5,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', 'x-0.5,y+0.5,-z+0.5', '-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,-z', '-x+0.5,y,-z', '-x,-y,-z', 'x-0.5,y,-z', - '-x,y,z', 'x-0.5,-y,z'] - number: 66 - schoenflies: D2h^20 - universal_h_m: A m a a - Bbmb: - crystal_class: orthorhombic - hall: -B 2b 2b - hermann_mauguin: B b m b - symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', - '-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+0.5,-y+0.5,-z+0.5', - '-x+0.5,y,-z+0.5', '-x+0.5,-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,z+0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', - '-x,y-0.5,z', 'x,-y,z'] - number: 66 - schoenflies: D2h^20 - universal_h_m: B b m b - Cmma: + Cmme: + spacegroup: Cmme crystal_class: orthorhombic hall: -C 2a 2 hermann_mauguin: C m m a @@ -3158,67 +743,8 @@ spacegroups: number: 67 schoenflies: D2h^21 universal_h_m: C m m a - Cmmb: - crystal_class: orthorhombic - hall: -C 2a 2a - hermann_mauguin: C m m b - 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', 'x+0.5,y+0.5,z', '-x+1,-y+0.5,z', 'x+1,-y+0.5,-z', '-x+0.5,y+0.5,-z', - '-x+0.5,-y+0.5,-z', 'x,y+0.5,-z', '-x,y+0.5,z', 'x+0.5,-y+0.5,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: 67 - schoenflies: D2h^21 - universal_h_m: C m m b - Abmm: - crystal_class: orthorhombic - hall: -A 2b 2b - hermann_mauguin: A b m m - symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', - '-x,y-0.5,z', 'x,-y,z', 'x,y+0.5,z+0.5', '-x,-y+1,z+0.5', 'x,-y+1,-z+0.5', '-x,y+0.5,-z+0.5', - '-x,-y+0.5,-z+0.5', 'x,y,-z+0.5', '-x,y,z+0.5', 'x,-y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', - '-x,y-0.5,z', 'x,-y,z'] - number: 67 - schoenflies: D2h^21 - universal_h_m: A b m m - Acmm: - crystal_class: orthorhombic - hall: -A 2 2b - hermann_mauguin: A c m m - symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-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', '-x,-y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', 'x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', - '-x,y-0.5,z', 'x,-y-0.5,z'] - number: 67 - schoenflies: D2h^21 - universal_h_m: A c m m - Bmcm: - crystal_class: orthorhombic - hall: -B 2 2a - hermann_mauguin: B m c m - symops: ['x,y,z', '-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+0.5,y,z+0.5', '-x+0.5,-y,z+0.5', 'x+1,-y,-z+0.5', - '-x+1,y,-z+0.5', '-x+0.5,-y,-z+0.5', 'x+0.5,y,-z+0.5', '-x,y,z+0.5', 'x,-y,z+0.5'] - ncsym: ['x,y,z', '-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'] - number: 67 - schoenflies: D2h^21 - universal_h_m: B m c m - Bmam: - crystal_class: orthorhombic - hall: -B 2a 2 - hermann_mauguin: B m a m - 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,z+0.5', '-x+1,-y,z+0.5', 'x+0.5,-y,-z+0.5', - '-x+1,y,-z+0.5', '-x+0.5,-y,-z+0.5', 'x,y,-z+0.5', '-x+0.5,y,z+0.5', 'x,-y,z+0.5'] - 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: B m a m - Ccce:1: + Ccce: + spacegroup: Ccce crystal_class: orthorhombic hall: ' C 2 2 -1ac' hermann_mauguin: C c c e @@ -3231,111 +757,8 @@ spacegroups: number: 68 schoenflies: D2h^22 universal_h_m: C c c e :1 - Ccca:2: - crystal_class: orthorhombic - hall: -C 2a 2ac - hermann_mauguin: C 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', 'x+0.5,y+0.5,z', '-x+1,-y+0.5,z', - 'x+1,-y+0.5,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', 'x,y+0.5,-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+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: 68 - schoenflies: D2h^22 - universal_h_m: C c c a :2 - Cccb:2: - crystal_class: orthorhombic - hall: -C 2a 2c - hermann_mauguin: C c c b - symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y,z-0.5', 'x-0.5,-y,z-0.5', 'x+0.5,y+0.5,z', '-x+1,-y+0.5,z', - 'x+0.5,-y+0.5,-z+0.5', '-x+1,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', 'x,y+0.5,-z', - '-x+0.5,y+0.5,z-0.5', 'x,-y+0.5,z-0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y,z-0.5', 'x-0.5,-y,z-0.5'] - number: 68 - schoenflies: D2h^22 - universal_h_m: C c c b :2 - Aeaa:1: - crystal_class: orthorhombic - hall: ' A 2 2 -1ab' - hermann_mauguin: A e a a - 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', '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+1,-z+0.5', 'x+0.5,y+1,-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,-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: 68 - schoenflies: D2h^22 - universal_h_m: A e a a :1 - Abaa:2: - crystal_class: orthorhombic - hall: -A 2a 2b - hermann_mauguin: A b a a - symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z', 'x,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', - 'x,-y+1,-z+0.5', '-x+0.5,y+1,-z+0.5', '-x,-y+0.5,-z+0.5', 'x-0.5,y+0.5,-z+0.5', - '-x,y,z+0.5', 'x-0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z'] - number: 68 - schoenflies: D2h^22 - universal_h_m: A b a a :2 - Acaa:2: - crystal_class: orthorhombic - hall: -A 2ab 2b - hermann_mauguin: A c a a - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z', 'x,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5', - 'x,-y+1,-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,z+0.5', 'x-0.5,-y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z'] - number: 68 - schoenflies: D2h^22 - universal_h_m: A c a a :2 - Bbeb:1: - crystal_class: orthorhombic - hall: ' B 2 2 -1ab' - hermann_mauguin: B b e b - 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', '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+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+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: 68 - schoenflies: D2h^22 - universal_h_m: B b e b :1 - Bbcb:2: - crystal_class: orthorhombic - hall: -B 2ab 2b - hermann_mauguin: B b c b - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z', 'x+0.5,y,z+0.5', '-x+1,-y+0.5,z+0.5', - 'x+0.5,-y+0.5,-z+0.5', '-x+1,y,-z+0.5', '-x+0.5,-y,-z+0.5', 'x,y-0.5,-z+0.5', - '-x+0.5,y-0.5,z+0.5', 'x,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x-0.5,y-0.5,-z', '-x,y-0.5,z', 'x-0.5,-y,z'] - number: 68 - schoenflies: D2h^22 - universal_h_m: B b c b :2 - Bbab:2: - crystal_class: orthorhombic - hall: -B 2b 2ab - hermann_mauguin: B b a b - symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x,y-0.5,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y,z', 'x+0.5,y,z+0.5', '-x+0.5,-y+0.5,z+0.5', - 'x+1,-y+0.5,-z+0.5', '-x+1,y,-z+0.5', '-x+0.5,-y,-z+0.5', 'x+0.5,y-0.5,-z+0.5', - '-x,y-0.5,z+0.5', 'x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x,y-0.5,-z', '-x-0.5,y-0.5,z', 'x-0.5,-y,z'] - number: 68 - schoenflies: D2h^22 - universal_h_m: B b a b :2 Fmmm: + spacegroup: Fmmm crystal_class: orthorhombic hall: -F 2 2 hermann_mauguin: F m m m @@ -3351,7 +774,8 @@ spacegroups: number: 69 schoenflies: D2h^23 universal_h_m: F m m m - Fddd:1: + Fddd: + spacegroup: Fddd crystal_class: orthorhombic hall: ' F 2 2 -1d' hermann_mauguin: F d d d @@ -3368,24 +792,8 @@ spacegroups: number: 70 schoenflies: D2h^24 universal_h_m: F d d d :1 - Fddd:2: - crystal_class: orthorhombic - hall: -F 2uv 2vw - hermann_mauguin: F d d d - symops: ['x,y,z', '-x+0.25,-y+0.25,z', 'x,-y+0.25,-z+0.25', '-x+0.25,y,-z+0.25', - '-x,-y,-z', 'x-0.25,y-0.25,-z', '-x,y-0.25,z-0.25', 'x-0.25,-y,z-0.25', 'x,y+0.5,z+0.5', - '-x+0.25,-y+0.75,z+0.5', 'x,-y+0.75,-z+0.75', '-x+0.25,y+0.5,-z+0.75', '-x,-y+0.5,-z+0.5', - 'x-0.25,y+0.25,-z+0.5', '-x,y+0.25,z+0.25', 'x-0.25,-y+0.5,z+0.25', 'x+0.5,y,z+0.5', - '-x+0.75,-y+0.25,z+0.5', 'x+0.5,-y+0.25,-z+0.75', '-x+0.75,y,-z+0.75', '-x+0.5,-y,-z+0.5', - 'x+0.25,y-0.25,-z+0.5', '-x+0.5,y-0.25,z+0.25', 'x+0.25,-y,z+0.25', 'x+0.5,y+0.5,z', - '-x+0.75,-y+0.75,z', 'x+0.5,-y+0.75,-z+0.25', '-x+0.75,y+0.5,-z+0.25', '-x+0.5,-y+0.5,-z', - 'x+0.25,y+0.25,-z', '-x+0.5,y+0.25,z-0.25', 'x+0.25,-y+0.5,z-0.25'] - ncsym: ['x,y,z', '-x+0.25,-y+0.25,z', 'x,-y+0.25,-z+0.25', '-x+0.25,y,-z+0.25', - '-x,-y,-z', 'x-0.25,y-0.25,-z', '-x,y-0.25,z-0.25', 'x-0.25,-y,z-0.25'] - number: 70 - schoenflies: D2h^24 - universal_h_m: F d d d :2 Immm: + spacegroup: Immm crystal_class: orthorhombic hall: -I 2 2 hermann_mauguin: I m m m @@ -3399,6 +807,7 @@ spacegroups: 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 @@ -3411,33 +820,8 @@ spacegroups: number: 72 schoenflies: D2h^26 universal_h_m: I b a m - Imcb: - crystal_class: orthorhombic - hall: -I 2a 2 - hermann_mauguin: I m c b - 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+0.5', '-x+1,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', - '-x+1,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', - 'x,-y+0.5,z+0.5'] - 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: 72 - schoenflies: D2h^26 - universal_h_m: I m c b - Icma: - crystal_class: orthorhombic - hall: -I 2b 2b - hermann_mauguin: I c m a - symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', - '-x,y-0.5,z', 'x,-y,z', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y+1,z+0.5', 'x+0.5,-y+1,-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,-z+0.5', '-x+0.5,y,z+0.5', - 'x+0.5,-y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y-0.5,-z', - '-x,y-0.5,z', 'x,-y,z'] - number: 72 - schoenflies: D2h^26 - universal_h_m: I c m a Ibca: + spacegroup: Ibca crystal_class: orthorhombic hall: -I 2b 2c hermann_mauguin: I b c a @@ -3450,20 +834,8 @@ spacegroups: number: 73 schoenflies: D2h^27 universal_h_m: I b c a - Icab: - crystal_class: orthorhombic - hall: -I 2a 2b - hermann_mauguin: I c a b - symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z', '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,-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,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x-0.5,y,-z', '-x,y-0.5,z', 'x-0.5,-y-0.5,z'] - number: 73 - schoenflies: D2h^27 - universal_h_m: I c a b Imma: + spacegroup: Imma crystal_class: orthorhombic hall: -I 2b 2 hermann_mauguin: I m m a @@ -3476,72 +848,8 @@ spacegroups: number: 74 schoenflies: D2h^28 universal_h_m: I m m a - Immb: - crystal_class: orthorhombic - hall: -I 2a 2a - hermann_mauguin: I m m b - 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', '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', - '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', '-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+0.5,-y,-z', '-x,y,-z', '-x,-y,-z', 'x-0.5,y,-z', - '-x-0.5,y,z', 'x,-y,z'] - number: 74 - schoenflies: D2h^28 - universal_h_m: I m m b - Ibmm: - crystal_class: orthorhombic - hall: -I 2c 2c - hermann_mauguin: I b m m - symops: ['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,-y,z', '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', - 'x+0.5,-y+0.5,z+0.5'] - ncsym: ['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,-y,z'] - number: 74 - schoenflies: D2h^28 - universal_h_m: I b m m - Icmm: - crystal_class: orthorhombic - hall: -I 2 2b - hermann_mauguin: I c m m - symops: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', - '-x,y-0.5,z', 'x,-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+1,-z+0.5', - '-x+0.5,y+1,-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,z+0.5', - 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z', 'x,-y+0.5,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x,y,-z', - '-x,y-0.5,z', 'x,-y-0.5,z'] - number: 74 - schoenflies: D2h^28 - universal_h_m: I c m m - Imcm: - crystal_class: orthorhombic - hall: -I 2 2a - hermann_mauguin: I m c m - symops: ['x,y,z', '-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+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', '-x+0.5,-y+0.5,-z+0.5', 'x+0.5,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+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'] - number: 74 - schoenflies: D2h^28 - universal_h_m: I m c m - Imam: - crystal_class: orthorhombic - hall: -I 2c 2 - hermann_mauguin: I m a 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+0.5', '-x+0.5,-y+0.5,z+1', 'x+0.5,-y+0.5,-z+0.5', - '-x+0.5,y+0.5,-z+1', '-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'] - 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: 74 - schoenflies: D2h^28 - universal_h_m: I m a m P4: + spacegroup: P4 crystal_class: tetragonal hall: ' P 4' hermann_mauguin: P 4 @@ -3551,6 +859,7 @@ spacegroups: schoenflies: C4^1 universal_h_m: P 4 P41: + spacegroup: P41 crystal_class: tetragonal hall: ' P 4w' hermann_mauguin: P 41 @@ -3560,6 +869,7 @@ spacegroups: schoenflies: C4^2 universal_h_m: P 41 P42: + spacegroup: P42 crystal_class: tetragonal hall: ' P 4c' hermann_mauguin: P 42 @@ -3569,6 +879,7 @@ spacegroups: schoenflies: C4^3 universal_h_m: P 42 P43: + spacegroup: P43 crystal_class: tetragonal hall: ' P 4cw' hermann_mauguin: P 43 @@ -3578,6 +889,7 @@ spacegroups: schoenflies: C4^4 universal_h_m: P 43 I4: + spacegroup: I4 crystal_class: tetragonal hall: ' I 4' hermann_mauguin: I 4 @@ -3588,6 +900,7 @@ spacegroups: schoenflies: C4^5 universal_h_m: I 4 I41: + spacegroup: I41 crystal_class: tetragonal hall: ' I 4bw' hermann_mauguin: I 41 @@ -3598,6 +911,7 @@ spacegroups: schoenflies: C4^6 universal_h_m: I 41 P-4: + spacegroup: P-4 crystal_class: tetragonal hall: ' P -4' hermann_mauguin: P -4 @@ -3607,6 +921,7 @@ spacegroups: schoenflies: S4^1 universal_h_m: P -4 I-4: + spacegroup: I-4 crystal_class: tetragonal hall: ' I -4' hermann_mauguin: I -4 @@ -3617,6 +932,7 @@ spacegroups: schoenflies: S4^2 universal_h_m: I -4 P4/m: + spacegroup: P4/m crystal_class: tetragonal hall: -P 4 hermann_mauguin: P 4/m @@ -3628,6 +944,7 @@ spacegroups: 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 @@ -3638,7 +955,8 @@ spacegroups: number: 84 schoenflies: C4h^2 universal_h_m: P 42/m - P4/n:1: + P4/n: + spacegroup: P4/n crystal_class: tetragonal hall: ' P 4ab -1ab' hermann_mauguin: P 4/n @@ -3649,18 +967,8 @@ spacegroups: number: 85 schoenflies: C4h^3 universal_h_m: P 4/n :1 - P4/n:2: - crystal_class: tetragonal - hall: -P 4a - hermann_mauguin: P 4/n - 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'] - 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'] - number: 85 - schoenflies: C4h^3 - universal_h_m: P 4/n :2 - P42/n:1: + P42/n: + spacegroup: P42/n crystal_class: tetragonal hall: ' P 4n -1n' hermann_mauguin: P 42/n @@ -3671,18 +979,8 @@ spacegroups: number: 86 schoenflies: C4h^4 universal_h_m: P 42/n :1 - P42/n:2: - crystal_class: tetragonal - hall: -P 4bc - hermann_mauguin: P 42/n - symops: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', '-x,-y,-z', - 'y,-x-0.5,-z-0.5', 'x-0.5,y-0.5,-z', '-y-0.5,x,-z-0.5'] - ncsym: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', '-x,-y,-z', - 'y,-x-0.5,-z-0.5', 'x-0.5,y-0.5,-z', '-y-0.5,x,-z-0.5'] - number: 86 - schoenflies: C4h^4 - universal_h_m: P 42/n :2 I4/m: + spacegroup: I4/m crystal_class: tetragonal hall: -I 4 hermann_mauguin: I 4/m @@ -3695,7 +993,8 @@ spacegroups: number: 87 schoenflies: C4h^5 universal_h_m: I 4/m - I41/a:1: + I41/a: + spacegroup: I41/a crystal_class: tetragonal hall: ' I 4bw -1bw' hermann_mauguin: I 41/a @@ -3708,20 +1007,8 @@ spacegroups: number: 88 schoenflies: C4h^6 universal_h_m: I 41/a :1 - I41/a:2: - crystal_class: tetragonal - hall: -I 4ad - hermann_mauguin: I 41/a - symops: ['x,y,z', '-y+0.75,x+0.25,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.75,-x+0.75,z+0.75', - '-x,-y,-z', 'y-0.75,-x-0.25,-z-0.25', 'x-0.5,y,-z-0.5', '-y-0.75,x-0.75,-z-0.75', - 'x+0.5,y+0.5,z+0.5', '-y+1.25,x+0.75,z+0.75', '-x+1,-y+0.5,z+1', 'y+1.25,-x+1.25,z+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'] - ncsym: ['x,y,z', '-y+0.75,x+0.25,z+0.25', '-x+0.5,-y,z+0.5', 'y+0.75,-x+0.75,z+0.75', - '-x,-y,-z', 'y-0.75,-x-0.25,-z-0.25', 'x-0.5,y,-z-0.5', '-y-0.75,x-0.75,-z-0.75'] - number: 88 - schoenflies: C4h^6 - universal_h_m: I 41/a :2 P422: + spacegroup: P422 crystal_class: tetragonal hall: ' P 4 2' hermann_mauguin: P 4 2 2 @@ -3733,6 +1020,7 @@ spacegroups: 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 @@ -3744,6 +1032,7 @@ spacegroups: 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 @@ -3755,6 +1044,7 @@ spacegroups: 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 @@ -3766,6 +1056,7 @@ spacegroups: 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 @@ -3777,6 +1068,7 @@ spacegroups: 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 @@ -3788,6 +1080,7 @@ spacegroups: 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 @@ -3799,6 +1092,7 @@ spacegroups: 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 @@ -3810,6 +1104,7 @@ spacegroups: 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 @@ -3823,6 +1118,7 @@ spacegroups: 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 @@ -3836,6 +1132,7 @@ spacegroups: 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 @@ -3847,6 +1144,7 @@ spacegroups: 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 @@ -3858,6 +1156,7 @@ spacegroups: 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 @@ -3869,6 +1168,7 @@ spacegroups: 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 @@ -3880,6 +1180,7 @@ spacegroups: 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 @@ -3891,6 +1192,7 @@ spacegroups: 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 @@ -3902,6 +1204,7 @@ spacegroups: 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 @@ -3913,6 +1216,7 @@ spacegroups: 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 @@ -3924,6 +1228,7 @@ spacegroups: 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 @@ -3936,6 +1241,7 @@ spacegroups: 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 @@ -3949,6 +1255,7 @@ spacegroups: 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 @@ -3962,6 +1269,7 @@ spacegroups: 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 @@ -3975,6 +1283,7 @@ spacegroups: 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 @@ -3986,6 +1295,7 @@ spacegroups: 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 @@ -3997,6 +1307,7 @@ spacegroups: 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 @@ -4008,6 +1319,7 @@ spacegroups: 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 @@ -4019,6 +1331,7 @@ spacegroups: 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 @@ -4030,6 +1343,7 @@ spacegroups: 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 @@ -4041,6 +1355,7 @@ spacegroups: 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 @@ -4052,6 +1367,7 @@ spacegroups: 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 @@ -4063,6 +1379,7 @@ spacegroups: 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 @@ -4076,6 +1393,7 @@ spacegroups: 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 @@ -4089,6 +1407,7 @@ spacegroups: 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 @@ -4102,6 +1421,7 @@ spacegroups: 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 @@ -4115,6 +1435,7 @@ spacegroups: 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 @@ -4128,6 +1449,7 @@ spacegroups: 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 @@ -4140,7 +1462,8 @@ spacegroups: number: 124 schoenflies: D4h^2 universal_h_m: P 4/m c c - P4/nbm:1: + P4/nbm: + spacegroup: P4/nbm crystal_class: tetragonal hall: ' P 4 2 -1ab' hermann_mauguin: P 4/n b m @@ -4153,20 +1476,8 @@ spacegroups: number: 125 schoenflies: D4h^3 universal_h_m: P 4/n b m :1 - P4/nbm:2: - crystal_class: tetragonal - hall: -P 4a 2b - hermann_mauguin: P 4/n b m - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', - 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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-0.5,z', '-y,-x,z', 'x-0.5,-y,z', 'y-0.5,x-0.5,z'] - ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', - 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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-0.5,z', '-y,-x,z', 'x-0.5,-y,z', 'y-0.5,x-0.5,z'] - number: 125 - schoenflies: D4h^3 - universal_h_m: P 4/n b m :2 - P4/nnc:1: + P4/nnc: + spacegroup: P4/nnc crystal_class: tetragonal hall: ' P 4 2 -1n' hermann_mauguin: P 4/n n c @@ -4181,22 +1492,8 @@ spacegroups: number: 126 schoenflies: D4h^4 universal_h_m: P 4/n n c :1 - P4/nnc:2: - crystal_class: tetragonal - hall: -P 4a 2bc - hermann_mauguin: P 4/n n c - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x,y-0.5,z-0.5', '-y,-x,z-0.5', 'x-0.5,-y,z-0.5', - 'y-0.5,x-0.5,z-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+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x,y-0.5,z-0.5', '-y,-x,z-0.5', 'x-0.5,-y,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 :2 P4/mbm: + spacegroup: P4/mbm crystal_class: tetragonal hall: -P 4 2ab hermann_mauguin: P 4/m b m @@ -4210,6 +1507,7 @@ spacegroups: 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 @@ -4224,7 +1522,8 @@ spacegroups: number: 128 schoenflies: D4h^6 universal_h_m: P 4/m n c - P4/nmm:1: + P4/nmm: + spacegroup: P4/nmm crystal_class: tetragonal hall: ' P 4ab 2ab -1ab' hermann_mauguin: P 4/n m m @@ -4237,20 +1536,8 @@ spacegroups: number: 129 schoenflies: D4h^7 universal_h_m: P 4/n m m :1 - P4/nmm:2: - crystal_class: tetragonal - hall: -P 4a 2a - hermann_mauguin: P 4/n m m - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x+0.5,-y,-z', - 'y+0.5,x+0.5,-z', '-x,y+0.5,-z', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z', - '-y,x-0.5,-z', '-x-0.5,y,z', '-y-0.5,-x-0.5,z', 'x,-y-0.5,z', 'y,x,z'] - ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x+0.5,-y,-z', - 'y+0.5,x+0.5,-z', '-x,y+0.5,-z', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z', - '-y,x-0.5,-z', '-x-0.5,y,z', '-y-0.5,-x-0.5,z', 'x,-y-0.5,z', 'y,x,z'] - number: 129 - schoenflies: D4h^7 - universal_h_m: P 4/n m m :2 - P4/ncc:1: + P4/ncc: + spacegroup: P4/ncc crystal_class: tetragonal hall: ' P 4ab 2n -1ab' hermann_mauguin: P 4/n c c @@ -4265,22 +1552,8 @@ spacegroups: number: 130 schoenflies: D4h^8 universal_h_m: P 4/n c c :1 - P4/ncc:2: - crystal_class: tetragonal - hall: -P 4a 2ac - hermann_mauguin: P 4/n c c - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x+0.5,-y,-z+0.5', - 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x-0.5,y,z-0.5', '-y-0.5,-x-0.5,z-0.5', 'x,-y-0.5,z-0.5', - 'y,x,z-0.5'] - ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x+0.5,-y,-z+0.5', - 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x-0.5,y,z-0.5', '-y-0.5,-x-0.5,z-0.5', 'x,-y-0.5,z-0.5', - 'y,x,z-0.5'] - number: 130 - schoenflies: D4h^8 - universal_h_m: P 4/n c c :2 P42/mmc: + spacegroup: P42/mmc crystal_class: tetragonal hall: -P 4c 2 hermann_mauguin: P 42/m m c @@ -4294,6 +1567,7 @@ spacegroups: 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 @@ -4306,7 +1580,8 @@ spacegroups: number: 132 schoenflies: D4h^10 universal_h_m: P 42/m c m - P42/nbc:1: + P42/nbc: + spacegroup: P42/nbc crystal_class: tetragonal hall: ' P 4n 2c -1n' hermann_mauguin: P 42/n b c @@ -4321,22 +1596,8 @@ spacegroups: number: 133 schoenflies: D4h^11 universal_h_m: P 42/n b c :1 - P42/nbc:2: - crystal_class: tetragonal - hall: -P 4ac 2b - hermann_mauguin: P 42/n b c - symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z', - 'y,x,-z+0.5', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z-0.5', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x,y-0.5,z', '-y,-x,z-0.5', 'x-0.5,-y,z', - 'y-0.5,x-0.5,z-0.5'] - ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z', - 'y,x,-z+0.5', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z-0.5', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x,y-0.5,z', '-y,-x,z-0.5', 'x-0.5,-y,z', - 'y-0.5,x-0.5,z-0.5'] - number: 133 - schoenflies: D4h^11 - universal_h_m: P 42/n b c :2 - P42/nnm:1: + P42/nnm: + spacegroup: P42/nnm crystal_class: tetragonal hall: ' P 4n 2 -1n' hermann_mauguin: P 42/n n m @@ -4351,22 +1612,8 @@ spacegroups: number: 134 schoenflies: D4h^12 universal_h_m: P 42/n n m :1 - P42/nnm:2: - crystal_class: tetragonal - hall: -P 4ac 2bc - hermann_mauguin: P 42/n n m - symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z+0.5', - 'y,x,-z', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y-0.5,-x,-z-0.5', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x,y-0.5,z-0.5', '-y,-x,z', 'x-0.5,-y,z-0.5', - 'y-0.5,x-0.5,z'] - ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z+0.5', - 'y,x,-z', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y-0.5,-x,-z-0.5', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x,y-0.5,z-0.5', '-y,-x,z', 'x-0.5,-y,z-0.5', - 'y-0.5,x-0.5,z'] - number: 134 - schoenflies: D4h^12 - universal_h_m: P 42/n n m :2 P42/mbc: + spacegroup: P42/mbc crystal_class: tetragonal hall: -P 4c 2ab hermann_mauguin: P 42/m b c @@ -4380,6 +1627,7 @@ spacegroups: 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 @@ -4394,7 +1642,8 @@ spacegroups: number: 136 schoenflies: D4h^14 universal_h_m: P 42/m n m - P42/nmc:1: + P42/nmc: + spacegroup: P42/nmc crystal_class: tetragonal hall: ' P 4n 2n -1n' hermann_mauguin: P 42/n m c @@ -4409,22 +1658,8 @@ spacegroups: number: 137 schoenflies: D4h^15 universal_h_m: P 42/n m c :1 - P42/nmc:2: - crystal_class: tetragonal - hall: -P 4ac 2a - hermann_mauguin: P 42/n m c - symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z', - 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z', '-y,-x,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z-0.5', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x-0.5,y,z', '-y-0.5,-x-0.5,z-0.5', 'x,-y-0.5,z', - 'y,x,z-0.5'] - ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z', - 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z', '-y,-x,-z+0.5', '-x,-y,-z', 'y-0.5,-x,-z-0.5', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x-0.5,y,z', '-y-0.5,-x-0.5,z-0.5', 'x,-y-0.5,z', - 'y,x,z-0.5'] - number: 137 - schoenflies: D4h^15 - universal_h_m: P 42/n m c :2 - P42/ncm:1: + P42/ncm: + spacegroup: P42/ncm crystal_class: tetragonal hall: ' P 4n 2ab -1n' hermann_mauguin: P 42/n c m @@ -4439,22 +1674,8 @@ spacegroups: number: 138 schoenflies: D4h^16 universal_h_m: P 42/n c m :1 - P42/ncm:2: - crystal_class: tetragonal - hall: -P 4ac 2ac - hermann_mauguin: P 42/n c m - symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z+0.5', - 'y+0.5,x+0.5,-z', '-x,y+0.5,-z+0.5', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x,-z-0.5', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x-0.5,y,z-0.5', '-y-0.5,-x-0.5,z', 'x,-y-0.5,z-0.5', - 'y,x,z'] - ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z+0.5', - 'y+0.5,x+0.5,-z', '-x,y+0.5,-z+0.5', '-y,-x,-z', '-x,-y,-z', 'y-0.5,-x,-z-0.5', - 'x-0.5,y-0.5,-z', '-y,x-0.5,-z-0.5', '-x-0.5,y,z-0.5', '-y-0.5,-x-0.5,z', 'x,-y-0.5,z-0.5', - 'y,x,z'] - number: 138 - schoenflies: D4h^16 - universal_h_m: P 42/n c m :2 I4/mmm: + spacegroup: I4/mmm crystal_class: tetragonal hall: -I 4 2 hermann_mauguin: I 4/m m m @@ -4472,6 +1693,7 @@ spacegroups: 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 @@ -4488,7 +1710,8 @@ spacegroups: number: 140 schoenflies: D4h^18 universal_h_m: I 4/m c m - I41/amd:1: + I41/amd: + spacegroup: I41/amd crystal_class: tetragonal hall: ' I 4bw 2bw -1bw' hermann_mauguin: I 41/a m d @@ -4507,26 +1730,8 @@ spacegroups: number: 141 schoenflies: D4h^19 universal_h_m: I 41/a m d :1 - I41/amd:2: - crystal_class: tetragonal - hall: -I 4bd 2 - hermann_mauguin: I 41/a m 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', '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', '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', '-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+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+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+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+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'] - 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', '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', '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', '-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'] - number: 141 - schoenflies: D4h^19 - universal_h_m: I 41/a m d :2 - I41/acd:1: + I41/acd: + spacegroup: I41/acd crystal_class: tetragonal hall: ' I 4bw 2aw -1bw' hermann_mauguin: I 41/a c d @@ -4544,26 +1749,8 @@ spacegroups: number: 142 schoenflies: D4h^20 universal_h_m: I 41/a c d :1 - I41/acd:2: - crystal_class: tetragonal - hall: -I 4bd 2c - hermann_mauguin: I 41/a c 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', - '-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', - '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', - '-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'] - 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', - '-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'] - number: 142 - schoenflies: D4h^20 - universal_h_m: I 41/a c d :2 P3: + spacegroup: P3 crystal_class: trigonal hall: ' P 3' hermann_mauguin: P 3 @@ -4573,6 +1760,7 @@ spacegroups: schoenflies: C3^1 universal_h_m: P 3 P31: + spacegroup: P31 crystal_class: trigonal hall: ' P 31' hermann_mauguin: P 31 @@ -4582,6 +1770,7 @@ spacegroups: schoenflies: C3^2 universal_h_m: P 31 P32: + spacegroup: P32 crystal_class: trigonal hall: ' P 32' hermann_mauguin: P 32 @@ -4590,7 +1779,8 @@ spacegroups: number: 145 schoenflies: C3^3 universal_h_m: P 32 - R3:H: + R3: + spacegroup: R3 crystal_class: rhombohedral hall: ' R 3' hermann_mauguin: R 3 @@ -4601,16 +1791,8 @@ spacegroups: number: 146 schoenflies: C3^4 universal_h_m: R 3 :H - R3:R: - crystal_class: rhombohedral - hall: ' P 3*' - hermann_mauguin: R 3 - symops: ['x,y,z', 'z,x,y', 'y,z,x'] - ncsym: ['x,y,z', 'z,x,y', 'y,z,x'] - number: 146 - schoenflies: C3^4 - universal_h_m: R 3 :R P-3: + spacegroup: P-3 crystal_class: trigonal hall: -P 3 hermann_mauguin: P -3 @@ -4619,7 +1801,8 @@ spacegroups: number: 147 schoenflies: C3i^1 universal_h_m: P -3 - R-3:H: + R-3: + spacegroup: R-3 crystal_class: rhombohedral hall: -R 3 hermann_mauguin: R -3 @@ -4632,16 +1815,8 @@ spacegroups: number: 148 schoenflies: C3i^2 universal_h_m: R -3 :H - R-3:R: - crystal_class: rhombohedral - hall: -P 3* - hermann_mauguin: R -3 - symops: ['x,y,z', 'z,x,y', 'y,z,x', '-x,-y,-z', '-z,-x,-y', '-y,-z,-x'] - ncsym: ['x,y,z', 'z,x,y', 'y,z,x', '-x,-y,-z', '-z,-x,-y', '-y,-z,-x'] - number: 148 - schoenflies: C3i^2 - universal_h_m: R -3 :R P312: + spacegroup: P312 crystal_class: trigonal hall: ' P 3 2' hermann_mauguin: P 3 1 2 @@ -4651,6 +1826,7 @@ spacegroups: 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 @@ -4660,6 +1836,7 @@ spacegroups: 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 @@ -4671,6 +1848,7 @@ spacegroups: 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 @@ -4682,6 +1860,7 @@ spacegroups: 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 @@ -4693,6 +1872,7 @@ spacegroups: 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 @@ -4703,7 +1883,8 @@ spacegroups: number: 154 schoenflies: D3^6 universal_h_m: P 32 2 1 - R32:H: + R32: + spacegroup: R32 crystal_class: rhombohedral hall: ' R 3 2"' hermann_mauguin: R 3 2 @@ -4716,16 +1897,8 @@ spacegroups: number: 155 schoenflies: D3^7 universal_h_m: R 3 2 :H - R32:R: - crystal_class: rhombohedral - hall: ' P 3* 2' - hermann_mauguin: R 3 2 - symops: ['x,y,z', 'z,x,y', 'y,z,x', '-y,-x,-z', '-z,-y,-x', '-x,-z,-y'] - ncsym: ['x,y,z', 'z,x,y', 'y,z,x', '-y,-x,-z', '-z,-y,-x', '-x,-z,-y'] - number: 155 - schoenflies: D3^7 - universal_h_m: R 3 2 :R P3m1: + spacegroup: P3m1 crystal_class: trigonal hall: ' P 3 -2"' hermann_mauguin: P 3 m 1 @@ -4735,6 +1908,7 @@ spacegroups: 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 @@ -4744,6 +1918,7 @@ spacegroups: 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 @@ -4753,6 +1928,7 @@ spacegroups: 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 @@ -4761,7 +1937,8 @@ spacegroups: number: 159 schoenflies: C3v^4 universal_h_m: P 3 1 c - R3m:H: + R3m: + spacegroup: R3m crystal_class: rhombohedral hall: ' R 3 -2"' hermann_mauguin: R 3 m @@ -4774,16 +1951,8 @@ spacegroups: number: 160 schoenflies: C3v^5 universal_h_m: R 3 m :H - R3m:R: - crystal_class: rhombohedral - hall: ' P 3* -2' - hermann_mauguin: R 3 m - symops: ['x,y,z', 'z,x,y', 'y,z,x', 'y,x,z', 'z,y,x', 'x,z,y'] - ncsym: ['x,y,z', 'z,x,y', 'y,z,x', 'y,x,z', 'z,y,x', 'x,z,y'] - number: 160 - schoenflies: C3v^5 - universal_h_m: R 3 m :R - R3c:H: + R3c: + spacegroup: R3c crystal_class: rhombohedral hall: ' R 3 -2"c' hermann_mauguin: R 3 c @@ -4796,17 +1965,8 @@ spacegroups: number: 161 schoenflies: C3v^6 universal_h_m: R 3 c :H - R3c:R: - crystal_class: rhombohedral - hall: ' P 3* -2n' - hermann_mauguin: R 3 c - symops: ['x,y,z', 'z,x,y', 'y,z,x', 'y+0.5,x+0.5,z+0.5', 'z+0.5,y+0.5,x+0.5', - 'x+0.5,z+0.5,y+0.5'] - ncsym: ['x,y,z', 'z,x,y', 'y,z,x', 'y+0.5,x+0.5,z+0.5', 'z+0.5,y+0.5,x+0.5', 'x+0.5,z+0.5,y+0.5'] - number: 161 - schoenflies: C3v^6 - universal_h_m: R 3 c :R P-31m: + spacegroup: P-31m crystal_class: trigonal hall: -P 3 2 hermann_mauguin: P -3 1 m @@ -4818,6 +1978,7 @@ spacegroups: 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 @@ -4829,6 +1990,7 @@ spacegroups: 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 @@ -4840,6 +2002,7 @@ spacegroups: 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 @@ -4850,7 +2013,8 @@ spacegroups: number: 165 schoenflies: D3d^4 universal_h_m: P -3 c 1 - R-3m:H: + R-3m: + spacegroup: R-3m crystal_class: rhombohedral hall: -R 3 2" hermann_mauguin: R -3 m @@ -4869,18 +2033,8 @@ spacegroups: number: 166 schoenflies: D3d^5 universal_h_m: R -3 m :H - R-3m:R: - crystal_class: rhombohedral - hall: -P 3* 2 - hermann_mauguin: R -3 m - 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'] - 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 - universal_h_m: R -3 m :R - R-3c:H: + R-3c: + spacegroup: R-3c crystal_class: rhombohedral hall: -R 3 2"c hermann_mauguin: R -3 c @@ -4899,20 +2053,8 @@ spacegroups: number: 167 schoenflies: D3d^6 universal_h_m: R -3 c :H - R-3c:R: - crystal_class: rhombohedral - hall: -P 3* 2n - hermann_mauguin: R -3 c - symops: ['x,y,z', 'z,x,y', 'y,z,x', '-y+0.5,-x+0.5,-z+0.5', '-z+0.5,-y+0.5,-x+0.5', - '-x+0.5,-z+0.5,-y+0.5', '-x,-y,-z', '-z,-x,-y', '-y,-z,-x', 'y-0.5,x-0.5,z-0.5', - 'z-0.5,y-0.5,x-0.5', 'x-0.5,z-0.5,y-0.5'] - ncsym: ['x,y,z', 'z,x,y', 'y,z,x', '-y+0.5,-x+0.5,-z+0.5', '-z+0.5,-y+0.5,-x+0.5', - '-x+0.5,-z+0.5,-y+0.5', '-x,-y,-z', '-z,-x,-y', '-y,-z,-x', 'y-0.5,x-0.5,z-0.5', - 'z-0.5,y-0.5,x-0.5', 'x-0.5,z-0.5,y-0.5'] - number: 167 - schoenflies: D3d^6 - universal_h_m: R -3 c :R P6: + spacegroup: P6 crystal_class: hexagonal hall: ' P 6' hermann_mauguin: P 6 @@ -4922,6 +2064,7 @@ spacegroups: schoenflies: C6^1 universal_h_m: P 6 P61: + spacegroup: P61 crystal_class: hexagonal hall: ' P 61' hermann_mauguin: P 61 @@ -4932,7 +2075,8 @@ spacegroups: number: 169 schoenflies: C6^2 universal_h_m: P 61 - P65: + P6_5: + spacegroup: P6_5 crystal_class: hexagonal hall: ' P 65' hermann_mauguin: P 65 @@ -4944,6 +2088,7 @@ spacegroups: schoenflies: C6^3 universal_h_m: P 65 P62: + spacegroup: P62 crystal_class: hexagonal hall: ' P 62' hermann_mauguin: P 62 @@ -4955,6 +2100,7 @@ spacegroups: schoenflies: C6^4 universal_h_m: P 62 P64: + spacegroup: P64 crystal_class: hexagonal hall: ' P 64' hermann_mauguin: P 64 @@ -4966,6 +2112,7 @@ spacegroups: schoenflies: C6^5 universal_h_m: P 64 P63: + spacegroup: P63 crystal_class: hexagonal hall: ' P 6c' hermann_mauguin: P 63 @@ -4975,6 +2122,7 @@ spacegroups: schoenflies: C6^6 universal_h_m: P 63 P-6: + spacegroup: P-6 crystal_class: hexagonal hall: ' P -6' hermann_mauguin: P -6 @@ -4984,6 +2132,7 @@ spacegroups: schoenflies: C3h^1 universal_h_m: P -6 P6/m: + spacegroup: P6/m crystal_class: hexagonal hall: -P 6 hermann_mauguin: P 6/m @@ -4995,6 +2144,7 @@ spacegroups: 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 @@ -5006,6 +2156,7 @@ spacegroups: 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 @@ -5017,6 +2168,7 @@ spacegroups: 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 @@ -5029,7 +2181,8 @@ spacegroups: number: 178 schoenflies: D6^2 universal_h_m: P 61 2 2 - P6522: + P6_522: + spacegroup: P6_522 crystal_class: hexagonal hall: ' P 65 2 (0 0 1)' hermann_mauguin: P 65 2 2 @@ -5043,6 +2196,7 @@ spacegroups: 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 @@ -5056,6 +2210,7 @@ spacegroups: 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 @@ -5069,6 +2224,7 @@ spacegroups: 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 @@ -5080,6 +2236,7 @@ spacegroups: 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 @@ -5091,6 +2248,7 @@ spacegroups: 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 @@ -5102,6 +2260,7 @@ spacegroups: 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 @@ -5113,6 +2272,7 @@ spacegroups: 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 @@ -5124,6 +2284,7 @@ spacegroups: 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 @@ -5135,6 +2296,7 @@ spacegroups: 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 @@ -5146,6 +2308,7 @@ spacegroups: 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 @@ -5157,6 +2320,7 @@ spacegroups: 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 @@ -5168,6 +2332,7 @@ spacegroups: 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 @@ -5183,6 +2348,7 @@ spacegroups: 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 @@ -5198,6 +2364,7 @@ spacegroups: 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 @@ -5213,6 +2380,7 @@ spacegroups: 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 @@ -5228,6 +2396,7 @@ spacegroups: 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 @@ -5239,6 +2408,7 @@ spacegroups: 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 @@ -5257,6 +2427,7 @@ spacegroups: 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 @@ -5271,6 +2442,7 @@ spacegroups: 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 @@ -5284,6 +2456,7 @@ spacegroups: 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 @@ -5300,6 +2473,7 @@ spacegroups: 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 @@ -5314,7 +2488,8 @@ spacegroups: number: 200 schoenflies: Th^1 universal_h_m: P m -3 - Pn-3:1: + Pn-3: + spacegroup: Pn-3 crystal_class: cubic hall: ' P 2 2 3 -1n' hermann_mauguin: P n -3 @@ -5331,24 +2506,8 @@ spacegroups: number: 201 schoenflies: Th^2 universal_h_m: P n -3 :1 - Pn-3:2: - crystal_class: cubic - hall: -P 2ab 2bc 3 - hermann_mauguin: P n -3 - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', - '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', - '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x,-y,-z', 'x-0.5,y-0.5,-z', '-x,y-0.5,z-0.5', - 'x-0.5,-y,z-0.5', '-z,-x,-y', 'z-0.5,x-0.5,-y', '-z,x-0.5,y-0.5', 'z-0.5,-x,y-0.5', - '-y,-z,-x', '-y,z-0.5,x-0.5', 'y-0.5,-z,x-0.5', 'y-0.5,z-0.5,-x'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', - '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', - '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x,-y,-z', 'x-0.5,y-0.5,-z', '-x,y-0.5,z-0.5', - 'x-0.5,-y,z-0.5', '-z,-x,-y', 'z-0.5,x-0.5,-y', '-z,x-0.5,y-0.5', 'z-0.5,-x,y-0.5', - '-y,-z,-x', '-y,z-0.5,x-0.5', 'y-0.5,-z,x-0.5', 'y-0.5,z-0.5,-x'] - number: 201 - schoenflies: Th^2 - universal_h_m: P n -3 :2 Fm-3: + spacegroup: Fm-3 crystal_class: cubic hall: -F 2 2 3 hermann_mauguin: F m -3 @@ -5378,7 +2537,8 @@ spacegroups: number: 202 schoenflies: Th^3 universal_h_m: F m -3 - Fd-3:1: + Fd-3: + spacegroup: Fd-3 crystal_class: cubic hall: ' F 2 2 3 -1d' hermann_mauguin: F d -3 @@ -5413,42 +2573,8 @@ spacegroups: number: 203 schoenflies: Th^4 universal_h_m: F d -3 :1 - Fd-3:2: - crystal_class: cubic - hall: -F 2uv 2vw 3 - hermann_mauguin: F d -3 - symops: ['x,y,z', '-x+0.25,-y+0.25,z', 'x,-y+0.25,-z+0.25', '-x+0.25,y,-z+0.25', - 'z,x,y', '-z+0.25,-x+0.25,y', 'z,-x+0.25,-y+0.25', '-z+0.25,x,-y+0.25', 'y,z,x', - 'y,-z+0.25,-x+0.25', '-y+0.25,z,-x+0.25', '-y+0.25,-z+0.25,x', '-x,-y,-z', 'x-0.25,y-0.25,-z', - '-x,y-0.25,z-0.25', 'x-0.25,-y,z-0.25', '-z,-x,-y', 'z-0.25,x-0.25,-y', '-z,x-0.25,y-0.25', - 'z-0.25,-x,y-0.25', '-y,-z,-x', '-y,z-0.25,x-0.25', 'y-0.25,-z,x-0.25', 'y-0.25,z-0.25,-x', - 'x,y+0.5,z+0.5', '-x+0.25,-y+0.75,z+0.5', 'x,-y+0.75,-z+0.75', '-x+0.25,y+0.5,-z+0.75', - 'z,x+0.5,y+0.5', '-z+0.25,-x+0.75,y+0.5', 'z,-x+0.75,-y+0.75', '-z+0.25,x+0.5,-y+0.75', - 'y,z+0.5,x+0.5', 'y,-z+0.75,-x+0.75', '-y+0.25,z+0.5,-x+0.75', '-y+0.25,-z+0.75,x+0.5', - '-x,-y+0.5,-z+0.5', 'x-0.25,y+0.25,-z+0.5', '-x,y+0.25,z+0.25', 'x-0.25,-y+0.5,z+0.25', - '-z,-x+0.5,-y+0.5', 'z-0.25,x+0.25,-y+0.5', '-z,x+0.25,y+0.25', 'z-0.25,-x+0.5,y+0.25', - '-y,-z+0.5,-x+0.5', '-y,z+0.25,x+0.25', 'y-0.25,-z+0.5,x+0.25', 'y-0.25,z+0.25,-x+0.5', - 'x+0.5,y,z+0.5', '-x+0.75,-y+0.25,z+0.5', 'x+0.5,-y+0.25,-z+0.75', '-x+0.75,y,-z+0.75', - 'z+0.5,x,y+0.5', '-z+0.75,-x+0.25,y+0.5', 'z+0.5,-x+0.25,-y+0.75', '-z+0.75,x,-y+0.75', - 'y+0.5,z,x+0.5', 'y+0.5,-z+0.25,-x+0.75', '-y+0.75,z,-x+0.75', '-y+0.75,-z+0.25,x+0.5', - '-x+0.5,-y,-z+0.5', 'x+0.25,y-0.25,-z+0.5', '-x+0.5,y-0.25,z+0.25', 'x+0.25,-y,z+0.25', - '-z+0.5,-x,-y+0.5', 'z+0.25,x-0.25,-y+0.5', '-z+0.5,x-0.25,y+0.25', 'z+0.25,-x,y+0.25', - '-y+0.5,-z,-x+0.5', '-y+0.5,z-0.25,x+0.25', 'y+0.25,-z,x+0.25', 'y+0.25,z-0.25,-x+0.5', - 'x+0.5,y+0.5,z', '-x+0.75,-y+0.75,z', 'x+0.5,-y+0.75,-z+0.25', '-x+0.75,y+0.5,-z+0.25', - 'z+0.5,x+0.5,y', '-z+0.75,-x+0.75,y', 'z+0.5,-x+0.75,-y+0.25', '-z+0.75,x+0.5,-y+0.25', - 'y+0.5,z+0.5,x', 'y+0.5,-z+0.75,-x+0.25', '-y+0.75,z+0.5,-x+0.25', '-y+0.75,-z+0.75,x', - '-x+0.5,-y+0.5,-z', 'x+0.25,y+0.25,-z', '-x+0.5,y+0.25,z-0.25', 'x+0.25,-y+0.5,z-0.25', - '-z+0.5,-x+0.5,-y', 'z+0.25,x+0.25,-y', '-z+0.5,x+0.25,y-0.25', 'z+0.25,-x+0.5,y-0.25', - '-y+0.5,-z+0.5,-x', '-y+0.5,z+0.25,x-0.25', 'y+0.25,-z+0.5,x-0.25', 'y+0.25,z+0.25,-x'] - ncsym: ['x,y,z', '-x+0.25,-y+0.25,z', 'x,-y+0.25,-z+0.25', '-x+0.25,y,-z+0.25', - 'z,x,y', '-z+0.25,-x+0.25,y', 'z,-x+0.25,-y+0.25', '-z+0.25,x,-y+0.25', 'y,z,x', - 'y,-z+0.25,-x+0.25', '-y+0.25,z,-x+0.25', '-y+0.25,-z+0.25,x', '-x,-y,-z', 'x-0.25,y-0.25,-z', - '-x,y-0.25,z-0.25', 'x-0.25,-y,z-0.25', '-z,-x,-y', 'z-0.25,x-0.25,-y', '-z,x-0.25,y-0.25', - 'z-0.25,-x,y-0.25', '-y,-z,-x', '-y,z-0.25,x-0.25', 'y-0.25,-z,x-0.25', 'y-0.25,z-0.25,-x'] - number: 203 - schoenflies: Th^4 - universal_h_m: F d -3 :2 Im-3: + spacegroup: Im-3 crystal_class: cubic hall: -I 2 2 3 hermann_mauguin: I m -3 @@ -5470,6 +2596,7 @@ spacegroups: 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 @@ -5487,6 +2614,7 @@ spacegroups: 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 @@ -5509,6 +2637,7 @@ spacegroups: 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 @@ -5524,6 +2653,7 @@ spacegroups: 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 @@ -5541,6 +2671,7 @@ spacegroups: 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 @@ -5571,6 +2702,7 @@ spacegroups: 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 @@ -5608,6 +2740,7 @@ spacegroups: 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 @@ -5629,6 +2762,7 @@ spacegroups: 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 @@ -5648,6 +2782,7 @@ spacegroups: 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 @@ -5667,6 +2802,7 @@ spacegroups: 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 @@ -5692,6 +2828,7 @@ spacegroups: 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 @@ -5707,6 +2844,7 @@ spacegroups: 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 @@ -5737,6 +2875,7 @@ spacegroups: 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 @@ -5758,6 +2897,7 @@ spacegroups: 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 @@ -5775,6 +2915,7 @@ spacegroups: 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 @@ -5807,6 +2948,7 @@ spacegroups: 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 @@ -5832,6 +2974,7 @@ spacegroups: 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 @@ -5852,7 +2995,8 @@ spacegroups: number: 221 schoenflies: Oh^1 universal_h_m: P m -3 m - Pn-3n:1: + Pn-3n: + spacegroup: Pn-3n crystal_class: cubic hall: ' P 4 2 3 -1n' hermann_mauguin: P n -3 n @@ -5879,34 +3023,8 @@ spacegroups: number: 222 schoenflies: Oh^2 universal_h_m: P n -3 n :1 - Pn-3n:2: - crystal_class: cubic - hall: -P 4a 2bc 3 - hermann_mauguin: P n -3 n - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', - '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', - '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x,-y,-z', - 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x,y-0.5,z-0.5', '-y,-x,z-0.5', - 'x-0.5,-y,z-0.5', 'y-0.5,x-0.5,z-0.5', '-z,-x,-y', 'x-0.5,-z,-y', 'z-0.5,x-0.5,-y', - '-x,z-0.5,-y', '-z,x-0.5,y-0.5', '-x,-z,y-0.5', 'z-0.5,-x,y-0.5', 'x-0.5,z-0.5,y-0.5', - '-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-0.5,x-0.5', - 'y-0.5,z-0.5,-x', '-z,y-0.5,-x', 'z-0.5,-y,-x'] - ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', - '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', - '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x,-y,-z', - 'y-0.5,-x,-z', 'x-0.5,y-0.5,-z', '-y,x-0.5,-z', '-x,y-0.5,z-0.5', '-y,-x,z-0.5', - 'x-0.5,-y,z-0.5', 'y-0.5,x-0.5,z-0.5', '-z,-x,-y', 'x-0.5,-z,-y', 'z-0.5,x-0.5,-y', - '-x,z-0.5,-y', '-z,x-0.5,y-0.5', '-x,-z,y-0.5', 'z-0.5,-x,y-0.5', 'x-0.5,z-0.5,y-0.5', - '-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-0.5,x-0.5', - 'y-0.5,z-0.5,-x', '-z,y-0.5,-x', 'z-0.5,-y,-x'] - number: 222 - schoenflies: Oh^2 - universal_h_m: P n -3 n :2 Pm-3n: + spacegroup: Pm-3n crystal_class: cubic hall: -P 4n 2 3 hermann_mauguin: P m -3 n @@ -5933,7 +3051,8 @@ spacegroups: number: 223 schoenflies: Oh^3 universal_h_m: P m -3 n - Pn-3m:1: + Pn-3m: + spacegroup: Pn-3m crystal_class: cubic hall: ' P 4n 2 3 -1n' hermann_mauguin: P n -3 m @@ -5960,34 +3079,8 @@ spacegroups: number: 224 schoenflies: Oh^4 universal_h_m: P n -3 m :1 - Pn-3m:2: - crystal_class: cubic - hall: -P 4bc 2bc 3 - hermann_mauguin: P n -3 m - symops: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', 'x,-y+0.5,-z+0.5', - 'y+0.5,x+0.5,-z', '-x+0.5,y,-z+0.5', '-y,-x,-z', 'z,x,y', '-x,z+0.5,y+0.5', - '-z+0.5,-x+0.5,y', 'x+0.5,-z,y+0.5', 'z,-x+0.5,-y+0.5', 'x+0.5,z+0.5,-y', '-z+0.5,x,-y+0.5', - '-x,-z,-y', 'y,z,x', 'y,-z+0.5,-x+0.5', 'z+0.5,y+0.5,-x', '-y+0.5,z,-x+0.5', - '-z,-y,-x', '-y+0.5,-z+0.5,x', 'z+0.5,-y,x+0.5', '-z,y+0.5,x+0.5', '-x,-y,-z', - 'y,-x-0.5,-z-0.5', 'x-0.5,y-0.5,-z', '-y-0.5,x,-z-0.5', '-x,y-0.5,z-0.5', '-y-0.5,-x-0.5,z', - 'x-0.5,-y,z-0.5', 'y,x,z', '-z,-x,-y', 'x,-z-0.5,-y-0.5', 'z-0.5,x-0.5,-y', - '-x-0.5,z,-y-0.5', '-z,x-0.5,y-0.5', '-x-0.5,-z-0.5,y', 'z-0.5,-x,y-0.5', 'x,z,y', - '-y,-z,-x', '-y,z-0.5,x-0.5', '-z-0.5,-y-0.5,x', 'y-0.5,-z,x-0.5', 'z,y,x', - 'y-0.5,z-0.5,-x', '-z-0.5,y,-x-0.5', 'z,-y-0.5,-x-0.5'] - ncsym: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', 'x,-y+0.5,-z+0.5', - 'y+0.5,x+0.5,-z', '-x+0.5,y,-z+0.5', '-y,-x,-z', 'z,x,y', '-x,z+0.5,y+0.5', - '-z+0.5,-x+0.5,y', 'x+0.5,-z,y+0.5', 'z,-x+0.5,-y+0.5', 'x+0.5,z+0.5,-y', '-z+0.5,x,-y+0.5', - '-x,-z,-y', 'y,z,x', 'y,-z+0.5,-x+0.5', 'z+0.5,y+0.5,-x', '-y+0.5,z,-x+0.5', - '-z,-y,-x', '-y+0.5,-z+0.5,x', 'z+0.5,-y,x+0.5', '-z,y+0.5,x+0.5', '-x,-y,-z', - 'y,-x-0.5,-z-0.5', 'x-0.5,y-0.5,-z', '-y-0.5,x,-z-0.5', '-x,y-0.5,z-0.5', '-y-0.5,-x-0.5,z', - 'x-0.5,-y,z-0.5', 'y,x,z', '-z,-x,-y', 'x,-z-0.5,-y-0.5', 'z-0.5,x-0.5,-y', - '-x-0.5,z,-y-0.5', '-z,x-0.5,y-0.5', '-x-0.5,-z-0.5,y', 'z-0.5,-x,y-0.5', 'x,z,y', - '-y,-z,-x', '-y,z-0.5,x-0.5', '-z-0.5,-y-0.5,x', 'y-0.5,-z,x-0.5', 'z,y,x', - 'y-0.5,z-0.5,-x', '-z-0.5,y,-x-0.5', 'z,-y-0.5,-x-0.5'] - number: 224 - schoenflies: Oh^4 - universal_h_m: P n -3 m :2 Fm-3m: + spacegroup: Fm-3m crystal_class: cubic hall: -F 4 2 3 hermann_mauguin: F m -3 m @@ -6039,6 +3132,7 @@ spacegroups: 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 @@ -6094,7 +3188,8 @@ spacegroups: number: 226 schoenflies: Oh^6 universal_h_m: F m -3 c - Fd-3m:1: + Fd-3m: + spacegroup: Fd-3m crystal_class: cubic hall: ' F 4d 2 3 -1d' hermann_mauguin: F d -3 m @@ -6161,72 +3256,8 @@ spacegroups: number: 227 schoenflies: Oh^7 universal_h_m: F d -3 m :1 - Fd-3m:2: - crystal_class: cubic - hall: -F 4vw 2vw 3 - hermann_mauguin: F d -3 m - symops: ['x,y,z', '-y,x+0.25,z+0.25', '-x+0.75,-y+0.25,z+0.5', 'y+0.75,-x,z+0.75', - 'x,-y+0.25,-z+0.25', 'y+0.75,x+0.25,-z+0.5', '-x+0.75,y,-z+0.75', '-y,-x,-z', - 'z,x,y', '-x,z+0.25,y+0.25', '-z+0.75,-x+0.25,y+0.5', 'x+0.75,-z,y+0.75', 'z,-x+0.25,-y+0.25', - 'x+0.75,z+0.25,-y+0.5', '-z+0.75,x,-y+0.75', '-x,-z,-y', 'y,z,x', 'y+0.5,-z+0.75,-x+0.25', - 'z+0.25,y+0.75,-x+0.5', '-y+0.25,z+0.5,-x+0.75', '-z,-y+0.5,-x+0.5', '-y+0.25,-z+0.25,x', - 'z+0.25,-y,x+0.25', '-z+0.5,y+0.25,x+0.75', '-x,-y,-z', 'y,-x-0.25,-z-0.25', - 'x-0.75,y-0.25,-z-0.5', '-y-0.75,x,-z-0.75', '-x,y-0.25,z-0.25', '-y-0.75,-x-0.25,z-0.5', - 'x-0.75,-y,z-0.75', 'y,x,z', '-z,-x,-y', 'x,-z-0.25,-y-0.25', 'z-0.75,x-0.25,-y-0.5', - '-x-0.75,z,-y-0.75', '-z,x-0.25,y-0.25', '-x-0.75,-z-0.25,y-0.5', 'z-0.75,-x,y-0.75', - 'x,z,y', '-y,-z,-x', '-y-0.5,z-0.75,x-0.25', '-z-0.25,-y-0.75,x-0.5', 'y-0.25,-z-0.5,x-0.75', - 'z,y-0.5,x-0.5', 'y-0.25,z-0.25,-x', '-z-0.25,y,-x-0.25', 'z-0.5,-y-0.25,-x-0.75', - 'x,y+0.5,z+0.5', '-y,x+0.75,z+0.75', '-x+0.75,-y+0.75,z+1', 'y+0.75,-x+0.5,z+1.25', - 'x,-y+0.75,-z+0.75', 'y+0.75,x+0.75,-z+1', '-x+0.75,y+0.5,-z+1.25', '-y,-x+0.5,-z+0.5', - 'z,x+0.5,y+0.5', '-x,z+0.75,y+0.75', '-z+0.75,-x+0.75,y+1', 'x+0.75,-z+0.5,y+1.25', - 'z,-x+0.75,-y+0.75', 'x+0.75,z+0.75,-y+1', '-z+0.75,x+0.5,-y+1.25', '-x,-z+0.5,-y+0.5', - 'y,z+0.5,x+0.5', 'y+0.5,-z+1.25,-x+0.75', 'z+0.25,y+1.25,-x+1', '-y+0.25,z+1,-x+1.25', - '-z,-y+1,-x+1', '-y+0.25,-z+0.75,x+0.5', 'z+0.25,-y+0.5,x+0.75', '-z+0.5,y+0.75,x+1.25', - '-x,-y+0.5,-z+0.5', 'y,-x+0.25,-z+0.25', 'x-0.75,y+0.25,-z', '-y-0.75,x+0.5,-z-0.25', - '-x,y+0.25,z+0.25', '-y-0.75,-x+0.25,z', 'x-0.75,-y+0.5,z-0.25', 'y,x+0.5,z+0.5', - '-z,-x+0.5,-y+0.5', 'x,-z+0.25,-y+0.25', 'z-0.75,x+0.25,-y', '-x-0.75,z+0.5,-y-0.25', - '-z,x+0.25,y+0.25', '-x-0.75,-z+0.25,y', 'z-0.75,-x+0.5,y-0.25', 'x,z+0.5,y+0.5', - '-y,-z+0.5,-x+0.5', '-y-0.5,z-0.25,x+0.25', '-z-0.25,-y-0.25,x', 'y-0.25,-z,x-0.25', - 'z,y,x', 'y-0.25,z+0.25,-x+0.5', '-z-0.25,y+0.5,-x+0.25', 'z-0.5,-y+0.25,-x-0.25', - 'x+0.5,y,z+0.5', '-y+0.5,x+0.25,z+0.75', '-x+1.25,-y+0.25,z+1', 'y+1.25,-x,z+1.25', - 'x+0.5,-y+0.25,-z+0.75', 'y+1.25,x+0.25,-z+1', '-x+1.25,y,-z+1.25', '-y+0.5,-x,-z+0.5', - 'z+0.5,x,y+0.5', '-x+0.5,z+0.25,y+0.75', '-z+1.25,-x+0.25,y+1', 'x+1.25,-z,y+1.25', - 'z+0.5,-x+0.25,-y+0.75', 'x+1.25,z+0.25,-y+1', '-z+1.25,x,-y+1.25', '-x+0.5,-z,-y+0.5', - 'y+0.5,z,x+0.5', 'y+1,-z+0.75,-x+0.75', 'z+0.75,y+0.75,-x+1', '-y+0.75,z+0.5,-x+1.25', - '-z+0.5,-y+0.5,-x+1', '-y+0.75,-z+0.25,x+0.5', 'z+0.75,-y,x+0.75', '-z+1,y+0.25,x+1.25', - '-x+0.5,-y,-z+0.5', 'y+0.5,-x-0.25,-z+0.25', 'x-0.25,y-0.25,-z', '-y-0.25,x,-z-0.25', - '-x+0.5,y-0.25,z+0.25', '-y-0.25,-x-0.25,z', 'x-0.25,-y,z-0.25', 'y+0.5,x,z+0.5', - '-z+0.5,-x,-y+0.5', 'x+0.5,-z-0.25,-y+0.25', 'z-0.25,x-0.25,-y', '-x-0.25,z,-y-0.25', - '-z+0.5,x-0.25,y+0.25', '-x-0.25,-z-0.25,y', 'z-0.25,-x,y-0.25', 'x+0.5,z,y+0.5', - '-y+0.5,-z,-x+0.5', '-y,z-0.75,x+0.25', '-z+0.25,-y-0.75,x', 'y+0.25,-z-0.5,x-0.25', - 'z+0.5,y-0.5,x', 'y+0.25,z-0.25,-x+0.5', '-z+0.25,y,-x+0.25', 'z,-y-0.25,-x-0.25', - 'x+0.5,y+0.5,z', '-y+0.5,x+0.75,z+0.25', '-x+1.25,-y+0.75,z+0.5', 'y+1.25,-x+0.5,z+0.75', - 'x+0.5,-y+0.75,-z+0.25', 'y+1.25,x+0.75,-z+0.5', '-x+1.25,y+0.5,-z+0.75', '-y+0.5,-x+0.5,-z', - 'z+0.5,x+0.5,y', '-x+0.5,z+0.75,y+0.25', '-z+1.25,-x+0.75,y+0.5', 'x+1.25,-z+0.5,y+0.75', - 'z+0.5,-x+0.75,-y+0.25', 'x+1.25,z+0.75,-y+0.5', '-z+1.25,x+0.5,-y+0.75', '-x+0.5,-z+0.5,-y', - 'y+0.5,z+0.5,x', 'y+1,-z+1.25,-x+0.25', 'z+0.75,y+1.25,-x+0.5', '-y+0.75,z+1,-x+0.75', - '-z+0.5,-y+1,-x+0.5', '-y+0.75,-z+0.75,x', 'z+0.75,-y+0.5,x+0.25', '-z+1,y+0.75,x+0.75', - '-x+0.5,-y+0.5,-z', 'y+0.5,-x+0.25,-z-0.25', 'x-0.25,y+0.25,-z-0.5', '-y-0.25,x+0.5,-z-0.75', - '-x+0.5,y+0.25,z-0.25', '-y-0.25,-x+0.25,z-0.5', 'x-0.25,-y+0.5,z-0.75', 'y+0.5,x+0.5,z', - '-z+0.5,-x+0.5,-y', 'x+0.5,-z+0.25,-y-0.25', 'z-0.25,x+0.25,-y-0.5', '-x-0.25,z+0.5,-y-0.75', - '-z+0.5,x+0.25,y-0.25', '-x-0.25,-z+0.25,y-0.5', 'z-0.25,-x+0.5,y-0.75', 'x+0.5,z+0.5,y', - '-y+0.5,-z+0.5,-x', '-y,z-0.25,x-0.25', '-z+0.25,-y-0.25,x-0.5', 'y+0.25,-z,x-0.75', - 'z+0.5,y,x-0.5', 'y+0.25,z+0.25,-x', '-z+0.25,y+0.5,-x-0.25', 'z,-y+0.25,-x-0.75'] - ncsym: ['x,y,z', '-y,x+0.25,z+0.25', '-x+0.75,-y+0.25,z+0.5', 'y+0.75,-x,z+0.75', - 'x,-y+0.25,-z+0.25', 'y+0.75,x+0.25,-z+0.5', '-x+0.75,y,-z+0.75', '-y,-x,-z', - 'z,x,y', '-x,z+0.25,y+0.25', '-z+0.75,-x+0.25,y+0.5', 'x+0.75,-z,y+0.75', 'z,-x+0.25,-y+0.25', - 'x+0.75,z+0.25,-y+0.5', '-z+0.75,x,-y+0.75', '-x,-z,-y', 'y,z,x', 'y+0.5,-z+0.75,-x+0.25', - 'z+0.25,y+0.75,-x+0.5', '-y+0.25,z+0.5,-x+0.75', '-z,-y+0.5,-x+0.5', '-y+0.25,-z+0.25,x', - 'z+0.25,-y,x+0.25', '-z+0.5,y+0.25,x+0.75', '-x,-y,-z', 'y,-x-0.25,-z-0.25', - 'x-0.75,y-0.25,-z-0.5', '-y-0.75,x,-z-0.75', '-x,y-0.25,z-0.25', '-y-0.75,-x-0.25,z-0.5', - 'x-0.75,-y,z-0.75', 'y,x,z', '-z,-x,-y', 'x,-z-0.25,-y-0.25', 'z-0.75,x-0.25,-y-0.5', - '-x-0.75,z,-y-0.75', '-z,x-0.25,y-0.25', '-x-0.75,-z-0.25,y-0.5', 'z-0.75,-x,y-0.75', - 'x,z,y', '-y,-z,-x', '-y-0.5,z-0.75,x-0.25', '-z-0.25,-y-0.75,x-0.5', 'y-0.25,-z-0.5,x-0.75', - 'z,y-0.5,x-0.5', 'y-0.25,z-0.25,-x', '-z-0.25,y,-x-0.25', 'z-0.5,-y-0.25,-x-0.75'] - number: 227 - schoenflies: Oh^7 - universal_h_m: F d -3 m :2 - Fd-3c:1: + Fd-3c: + spacegroup: Fd-3c crystal_class: cubic hall: ' F 4d 2 3 -1ad' hermann_mauguin: F d -3 c @@ -6293,73 +3324,8 @@ spacegroups: number: 228 schoenflies: Oh^8 universal_h_m: F d -3 c :1 - Fd-3c:2: - crystal_class: cubic - hall: -F 4ud 2vw 3 - hermann_mauguin: F d -3 c - symops: ['x,y,z', '-y+0.5,x+0.25,z+0.25', '-x+0.25,-y+0.75,z+0.5', 'y+0.75,-x+0.5,z+0.75', - 'x,-y+0.25,-z+0.25', 'y+0.25,x+0.25,-z+0.5', '-x+0.25,y+0.5,-z+0.75', '-y,-x+0.5,-z', - 'z,x,y', '-x+0.5,z+0.25,y+0.25', '-z+0.25,-x+0.75,y+0.5', 'x+0.75,-z+0.5,y+0.75', - 'z,-x+0.25,-y+0.25', 'x+0.25,z+0.25,-y+0.5', '-z+0.25,x+0.5,-y+0.75', '-x,-z+0.5,-y', - 'y,z,x', 'y+0.5,-z+0.25,-x+0.75', 'z+0.25,y+0.75,-x', '-y+0.75,z+0.5,-x+0.25', - '-z+0.5,-y+0.5,-x+0.5', '-y+0.25,-z+0.25,x', 'z+0.25,-y,x+0.75', '-z,y+0.75,x+0.25', - '-x,-y,-z', 'y-0.5,-x-0.25,-z-0.25', 'x-0.25,y-0.75,-z-0.5', '-y-0.75,x-0.5,-z-0.75', - '-x,y-0.25,z-0.25', '-y-0.25,-x-0.25,z-0.5', 'x-0.25,-y-0.5,z-0.75', 'y,x-0.5,z', - '-z,-x,-y', 'x-0.5,-z-0.25,-y-0.25', 'z-0.25,x-0.75,-y-0.5', '-x-0.75,z-0.5,-y-0.75', - '-z,x-0.25,y-0.25', '-x-0.25,-z-0.25,y-0.5', 'z-0.25,-x-0.5,y-0.75', 'x,z-0.5,y', - '-y,-z,-x', '-y-0.5,z-0.25,x-0.75', '-z-0.25,-y-0.75,x', 'y-0.75,-z-0.5,x-0.25', - 'z-0.5,y-0.5,x-0.5', 'y-0.25,z-0.25,-x', '-z-0.25,y,-x-0.75', 'z,-y-0.75,-x-0.25', - 'x,y+0.5,z+0.5', '-y+0.5,x+0.75,z+0.75', '-x+0.25,-y+1.25,z+1', 'y+0.75,-x+1,z+1.25', - 'x,-y+0.75,-z+0.75', 'y+0.25,x+0.75,-z+1', '-x+0.25,y+1,-z+1.25', '-y,-x+1,-z+0.5', - 'z,x+0.5,y+0.5', '-x+0.5,z+0.75,y+0.75', '-z+0.25,-x+1.25,y+1', 'x+0.75,-z+1,y+1.25', - 'z,-x+0.75,-y+0.75', 'x+0.25,z+0.75,-y+1', '-z+0.25,x+1,-y+1.25', '-x,-z+1,-y+0.5', - 'y,z+0.5,x+0.5', 'y+0.5,-z+0.75,-x+1.25', 'z+0.25,y+1.25,-x+0.5', '-y+0.75,z+1,-x+0.75', - '-z+0.5,-y+1,-x+1', '-y+0.25,-z+0.75,x+0.5', 'z+0.25,-y+0.5,x+1.25', '-z,y+1.25,x+0.75', - '-x,-y+0.5,-z+0.5', 'y-0.5,-x+0.25,-z+0.25', 'x-0.25,y-0.25,-z', '-y-0.75,x,-z-0.25', - '-x,y+0.25,z+0.25', '-y-0.25,-x+0.25,z', 'x-0.25,-y,z-0.25', 'y,x,z+0.5', '-z,-x+0.5,-y+0.5', - 'x-0.5,-z+0.25,-y+0.25', 'z-0.25,x-0.25,-y', '-x-0.75,z,-y-0.25', '-z,x+0.25,y+0.25', - '-x-0.25,-z+0.25,y', 'z-0.25,-x,y-0.25', 'x,z,y+0.5', '-y,-z+0.5,-x+0.5', '-y-0.5,z+0.25,x-0.25', - '-z-0.25,-y-0.25,x+0.5', 'y-0.75,-z,x+0.25', 'z-0.5,y,x', 'y-0.25,z+0.25,-x+0.5', - '-z-0.25,y+0.5,-x-0.25', 'z,-y-0.25,-x+0.25', 'x+0.5,y,z+0.5', '-y+1,x+0.25,z+0.75', - '-x+0.75,-y+0.75,z+1', 'y+1.25,-x+0.5,z+1.25', 'x+0.5,-y+0.25,-z+0.75', 'y+0.75,x+0.25,-z+1', - '-x+0.75,y+0.5,-z+1.25', '-y+0.5,-x+0.5,-z+0.5', 'z+0.5,x,y+0.5', '-x+1,z+0.25,y+0.75', - '-z+0.75,-x+0.75,y+1', 'x+1.25,-z+0.5,y+1.25', 'z+0.5,-x+0.25,-y+0.75', 'x+0.75,z+0.25,-y+1', - '-z+0.75,x+0.5,-y+1.25', '-x+0.5,-z+0.5,-y+0.5', 'y+0.5,z,x+0.5', 'y+1,-z+0.25,-x+1.25', - 'z+0.75,y+0.75,-x+0.5', '-y+1.25,z+0.5,-x+0.75', '-z+1,-y+0.5,-x+1', '-y+0.75,-z+0.25,x+0.5', - 'z+0.75,-y,x+1.25', '-z+0.5,y+0.75,x+0.75', '-x+0.5,-y,-z+0.5', 'y,-x-0.25,-z+0.25', - 'x+0.25,y-0.75,-z', '-y-0.25,x-0.5,-z-0.25', '-x+0.5,y-0.25,z+0.25', '-y+0.25,-x-0.25,z', - 'x+0.25,-y-0.5,z-0.25', 'y+0.5,x-0.5,z+0.5', '-z+0.5,-x,-y+0.5', 'x,-z-0.25,-y+0.25', - 'z+0.25,x-0.75,-y', '-x-0.25,z-0.5,-y-0.25', '-z+0.5,x-0.25,y+0.25', '-x+0.25,-z-0.25,y', - 'z+0.25,-x-0.5,y-0.25', 'x+0.5,z-0.5,y+0.5', '-y+0.5,-z,-x+0.5', '-y,z-0.25,x-0.25', - '-z+0.25,-y-0.75,x+0.5', 'y-0.25,-z-0.5,x+0.25', 'z,y-0.5,x', 'y+0.25,z-0.25,-x+0.5', - '-z+0.25,y,-x-0.25', 'z+0.5,-y-0.75,-x+0.25', 'x+0.5,y+0.5,z', '-y+1,x+0.75,z+0.25', - '-x+0.75,-y+1.25,z+0.5', 'y+1.25,-x+1,z+0.75', 'x+0.5,-y+0.75,-z+0.25', 'y+0.75,x+0.75,-z+0.5', - '-x+0.75,y+1,-z+0.75', '-y+0.5,-x+1,-z', 'z+0.5,x+0.5,y', '-x+1,z+0.75,y+0.25', - '-z+0.75,-x+1.25,y+0.5', 'x+1.25,-z+1,y+0.75', 'z+0.5,-x+0.75,-y+0.25', 'x+0.75,z+0.75,-y+0.5', - '-z+0.75,x+1,-y+0.75', '-x+0.5,-z+1,-y', 'y+0.5,z+0.5,x', 'y+1,-z+0.75,-x+0.75', - 'z+0.75,y+1.25,-x', '-y+1.25,z+1,-x+0.25', '-z+1,-y+1,-x+0.5', '-y+0.75,-z+0.75,x', - 'z+0.75,-y+0.5,x+0.75', '-z+0.5,y+1.25,x+0.25', '-x+0.5,-y+0.5,-z', 'y,-x+0.25,-z-0.25', - 'x+0.25,y-0.25,-z-0.5', '-y-0.25,x,-z-0.75', '-x+0.5,y+0.25,z-0.25', '-y+0.25,-x+0.25,z-0.5', - 'x+0.25,-y,z-0.75', 'y+0.5,x,z', '-z+0.5,-x+0.5,-y', 'x,-z+0.25,-y-0.25', 'z+0.25,x-0.25,-y-0.5', - '-x-0.25,z,-y-0.75', '-z+0.5,x+0.25,y-0.25', '-x+0.25,-z+0.25,y-0.5', 'z+0.25,-x,y-0.75', - 'x+0.5,z,y', '-y+0.5,-z+0.5,-x', '-y,z+0.25,x-0.75', '-z+0.25,-y-0.25,x', 'y-0.25,-z,x-0.25', - 'z,y,x-0.5', 'y+0.25,z+0.25,-x', '-z+0.25,y+0.5,-x-0.75', 'z+0.5,-y-0.25,-x-0.25'] - ncsym: ['x,y,z', '-y+0.5,x+0.25,z+0.25', '-x+0.25,-y+0.75,z+0.5', 'y+0.75,-x+0.5,z+0.75', - 'x,-y+0.25,-z+0.25', 'y+0.25,x+0.25,-z+0.5', '-x+0.25,y+0.5,-z+0.75', '-y,-x+0.5,-z', - 'z,x,y', '-x+0.5,z+0.25,y+0.25', '-z+0.25,-x+0.75,y+0.5', 'x+0.75,-z+0.5,y+0.75', - 'z,-x+0.25,-y+0.25', 'x+0.25,z+0.25,-y+0.5', '-z+0.25,x+0.5,-y+0.75', '-x,-z+0.5,-y', - 'y,z,x', 'y+0.5,-z+0.25,-x+0.75', 'z+0.25,y+0.75,-x', '-y+0.75,z+0.5,-x+0.25', - '-z+0.5,-y+0.5,-x+0.5', '-y+0.25,-z+0.25,x', 'z+0.25,-y,x+0.75', '-z,y+0.75,x+0.25', - '-x,-y,-z', 'y-0.5,-x-0.25,-z-0.25', 'x-0.25,y-0.75,-z-0.5', '-y-0.75,x-0.5,-z-0.75', - '-x,y-0.25,z-0.25', '-y-0.25,-x-0.25,z-0.5', 'x-0.25,-y-0.5,z-0.75', 'y,x-0.5,z', - '-z,-x,-y', 'x-0.5,-z-0.25,-y-0.25', 'z-0.25,x-0.75,-y-0.5', '-x-0.75,z-0.5,-y-0.75', - '-z,x-0.25,y-0.25', '-x-0.25,-z-0.25,y-0.5', 'z-0.25,-x-0.5,y-0.75', 'x,z-0.5,y', - '-y,-z,-x', '-y-0.5,z-0.25,x-0.75', '-z-0.25,-y-0.75,x', 'y-0.75,-z-0.5,x-0.25', - 'z-0.5,y-0.5,x-0.5', 'y-0.25,z-0.25,-x', '-z-0.25,y,-x-0.75', 'z,-y-0.75,-x-0.25'] - number: 228 - schoenflies: Oh^8 - universal_h_m: F d -3 c :2 Im-3m: + spacegroup: Im-3m crystal_class: cubic hall: -I 4 2 3 hermann_mauguin: I m -3 m @@ -6393,6 +3359,7 @@ spacegroups: 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 @@ -6435,2975 +3402,3 @@ spacegroups: number: 230 schoenflies: Oh^10 universal_h_m: I a -3 d - C1: - crystal_class: triclinic - hall: P 1 (1/2*x+1/2*y,1/2*x-1/2*y,-z) - hermann_mauguin: C 1 - symops: ['x,y,z', '+0.5+x,+0.5+y,z'] - ncsym: ['x, y, z'] - number: 1 - schoenflies: C1^1 - universal_h_m: C 1 - A-1: - crystal_class: triclinic - hall: -P 1 (-x,-1/2*y+1/2*z,1/2*y+1/2*z) - hermann_mauguin: A -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: 2 - schoenflies: Ci^1 - universal_h_m: A -1 - B-1: - crystal_class: triclinic - hall: -P 1 (-1/2*x+1/2*z,-y,1/2*x+1/2*z) - hermann_mauguin: B -1 - 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, -y, -z'] - number: 2 - schoenflies: Ci^1 - universal_h_m: B -1 - I-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 - symops: ['x,y,z', '+0.5-x,+0.5-y,+0.5-z', '+0.5+x,+0.5+y,+0.5+z', '-x,-y,-z'] - ncsym: ['x,y,z', '-x,-y,-z'] - number: 2 - schoenflies: D2^4 - universal_h_m: I -1 - R12/c1: - 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) - symops: ['x, y, z', 'y, x, -z+0.5', 'x+0.667, y+0.333, z+0.333', 'y+0.667, x+0.333, - -z+0.833', 'x+0.333, y+0.667, z+0.667', 'y+0.333, x+0.667, -z+1.17', '-x, - -y, -z', '-y, -x, z-0.5', '-x+0.667, -y+0.333, -z+0.333', '-y+0.667, -x+0.333, - z-0.167', '-x+0.333, -y+0.667, -z+0.667', '-y+0.333, -x+0.667, z+0.167'] - ncsym: ['x, y, z', 'y, x, -z+0.5', '-x, -y, -z', '-y, -x, z-0.5'] - number: 15 - schoenflies: C2h^6 - universal_h_m: R 1 2/c 1 - P212121(originshiftx,y,z+1/4): - 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) - symops: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z', '-x+0.5,-y,z+0.5'] - number: 19 - schoenflies: D2^4 - universal_h_m: P 21 21 21 (origin shift x,y,z+1/4) - B1211: - crystal_class: monoclinic - hall: P 2yb (1/2*x,y,-1/2*x+z) - hermann_mauguin: B 1 21 1 - symops: ['x, y, z', '-x, y+0.5, -z', 'x+0.5, y, z+0.5', '-x+0.5, y+0.5, -z+0.5'] - ncsym: ['x, y, z', '-x, y+0.5, -z'] - number: 4 - schoenflies: C2^2 - universal_h_m: B 1 21 1 - C-1: - crystal_class: triclinic - hall: -P 1 (1/2*x+1/2*y,1/2*x-1/2*y,-z) - hermann_mauguin: C -1 - symops: ['x, y, z', 'x+0.5, y+0.5, z', '-x, -y, -z', '-x+0.5, -y+0.5, -z'] - ncsym: ['x, y, z', '-x, -y, -z'] - number: 2 - schoenflies: Ci^1 - universal_h_m: C -1 - B121/m1: - crystal_class: monoclinic - hall: -P 2yb (1/2*x,y,-1/2*x+z) - hermann_mauguin: B 1 21/m 1 - symops: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y-0.5,z', 'x+0.5,y,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'] - ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y-0.5,z', 'x+0.5,y,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'] - number: 11 - schoenflies: C2h^2 - universal_h_m: B 1 21/m 1 - P1(-a,-b+c,b+c): - 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) - symops: ['x,y,z', 'x,y+0.5,z+0.5'] - ncsym: ['x,y,z'] - number: 1 - schoenflies: C1^1 - universal_h_m: P 1 (-a,-b+c,b+c) - P1(-a+c,-b,a+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) - symops: ['x,y,z', 'x+0.5,y,z+0.5'] - ncsym: ['x,y,z'] - number: 1 - schoenflies: C1^1 - universal_h_m: P 1 (-a+c,-b,a+c) - P1(b+c,a+c,a+b): - 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) - symops: ['x,y,z', 'x+0.5,y+0.5,z+0.5'] - ncsym: ['x,y,z'] - number: 1 - schoenflies: C1^1 - universal_h_m: P 1 (b+c,a+c,a+b) - P1(-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) - symops: ['x,y,z', 'x,y+0.5,z+0.5', 'x+0.5,y,z+0.5', 'x+0.5,y+0.5,z'] - ncsym: ['x,y,z'] - number: 1 - schoenflies: C1^1 - universal_h_m: P 1 (-a+b+c,a-b+c,a+b-c) - 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) - symops: ['x,y,z', '-x,-y,-z', '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+0.5,z', '-x+0.5,-y+0.5,-z'] - ncsym: ['x,y,z', '-x,-y,-z'] - number: 2 - schoenflies: Ci^1 - universal_h_m: P -1 (-a+b+c,a-b+c,a+b-c) - P121(2*a+c,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) - symops: ['x,y,z', '-x,y,-z', 'x+0.5,y,z+0.5', '-x+0.5,y,-z+0.5'] - ncsym: ['x,y,z', '-x,y,-z'] - number: 3 - schoenflies: C2^1 - universal_h_m: P 1 2 1 (2*a+c,b,c) - C121(a,b,a+2*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) - symops: ['x,y,z', '-x,y,-z', '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,y+0.5,z+0.5', '-x,y+0.5,-z+0.5'] - ncsym: ['x,y,z', '-x,y,-z'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (a,b,a+2*c) - P121(c,2*a+c,b): - 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) - 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: 3 - schoenflies: C2^1 - universal_h_m: P 1 2 1 (c,2*a+c,b) - C121(a+2*c,a,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) - 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,z+0.5', '-x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (a+2*c,a,b) - C121(c-1/4,b-1/4,-a): - 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) - symops: ['x,y,z', '-x,y,-z+0.5', 'x,y+0.5,z+0.5', '-x,y+0.5,-z'] - ncsym: ['x,y,z', '-x,y+0.5,-z'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (c-1/4,b-1/4,-a) - C121(a-1/4,b-1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,y,-z', 'x+0.5,y+0.5,z', '-x,y+0.5,-z'] - ncsym: ['x,y,z', '-x,y+0.5,-z'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (a-1/4,b-1/4,c) - C121(a+c-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) - 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'] - ncsym: ['x,y,z', '-x,y+0.5,-z'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (a+c-1/4,b-1/4,c) - C121(a-1/4,b-1/4,a+2*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) - symops: ['x,y,z', '-x+0.5,y,-z', 'x+0.5,y,z+0.5', '-x,y,-z+0.5', 'x+0.5,y+0.5,z', - '-x,y+0.5,-z', 'x,y+0.5,z+0.5', '-x+0.5,y+0.5,-z+0.5'] - ncsym: ['x,y,z', '-x,y+0.5,-z'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (a-1/4,b-1/4,a+2*c) - C121(c-1/4,a-1/4,b): - 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) - symops: ['x,y,z', '-x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (c-1/4,a-1/4,b) - C121(-a-1/4,c-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) - symops: ['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,-y,z+0.5'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (-a-1/4,c-1/4,b) - P1211(c,2*a+c,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) - 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: 4 - schoenflies: C2^2 - universal_h_m: P 1 21 1 (c,2*a+c,b) - C121(c-1/4,a+c-1/4,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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', '-x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (c-1/4,a+c-1/4,b) - C121(a+2*c-1/4,a-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) - symops: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,y+0.5,z', '-x+0.5,-y,z', 'x,y+0.5,z+0.5', - '-x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x+0.5,-y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5'] - number: 5 - schoenflies: C2^3 - universal_h_m: C 1 2 1 (a+2*c-1/4,a-1/4,b) - P1m1(2*a+c,b,c): - 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) - symops: ['x,y,z', 'x,-y,z', 'x+0.5,y,z+0.5', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', 'x,-y,z'] - number: 6 - schoenflies: Cs^1 - universal_h_m: P 1 m 1 (2*a+c,b,c) - C1m1(a,b,a+2*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) - symops: ['x,y,z', 'x,-y,z', '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,y+0.5,z+0.5', 'x,-y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x,-y,z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (a,b,a+2*c) - P1m1(c,2*a+c,b): - 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) - 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: 6 - schoenflies: Cs^1 - universal_h_m: P 1 m 1 (c,2*a+c,b) - C1m1(a+2*c,a,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) - 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,z+0.5', 'x+0.5,y,-z+0.5'] - ncsym: ['x,y,z', 'x,y,-z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (a+2*c,a,b) - P1m1(b,c,2*a+c): - 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) - 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'] - number: 6 - schoenflies: Cs^1 - universal_h_m: P 1 m 1 (b,c,2*a+c) - C1m1(b,a+2*c,a): - 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) - symops: ['x,y,z', '-x,y,z', '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+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 (b,a+2*c,a) - C1m1(c-1/4,b-1/4,-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) - symops: ['x,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', 'x,-y,z+0.5'] - ncsym: ['x,y,z', 'x,-y,z+0.5'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (c-1/4,b-1/4,-a) - P1c1(2*a+c,b,c): - 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) - 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'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P 1 c 1 (2*a+c,b,c) - C1m1(a-1/4,b-1/4,a+2*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) - symops: ['x,y,z', 'x,-y+0.5,z', 'x+0.5,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', - 'x+0.5,-y,z', 'x,y+0.5,z+0.5', 'x,-y,z+0.5'] - ncsym: ['x,y,z', 'x,-y,z+0.5'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (a-1/4,b-1/4,a+2*c) - C1m1(a+c-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 m 1 (a+c-1/4,b-1/4,c) - symops: ['x,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,-y,z+0.5'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (a+c-1/4,b-1/4,c) - C1m1(a-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) - symops: ['x,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', 'x+0.5,-y,z'] - ncsym: ['x,y,z', 'x+0.5,-y,z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (a-1/4,b-1/4,c) - C1m1(-a-1/4,c-1/4,b): - 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) - 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+0.5,y,-z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (-a-1/4,c-1/4,b) - P1c1(c,2*a+c,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) - symops: ['x,y,z', 'x+0.5,y,-z', 'x+0.5,y+0.5,z', 'x,y+0.5,-z'] - ncsym: ['x,y,z', 'x+0.5,y,-z'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P 1 c 1 (c,2*a+c,b) - C1m1(a+2*c-1/4,a-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 m 1 (a+2*c-1/4,a-1/4,b) - 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', 'x,y+0.5,z+0.5', - 'x,y+0.5,-z', 'x+0.5,y,z+0.5', 'x+0.5,y,-z'] - ncsym: ['x,y,z', 'x+0.5,y,-z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (a+2*c-1/4,a-1/4,b) - C1m1(c-1/4,a+c-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) - 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+0.5,y+0.5,-z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (c-1/4,a+c-1/4,b) - C1m1(c-1/4,a-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) - symops: ['x,y,z', 'x,y,-z+0.5', 'x,y+0.5,z+0.5', 'x,y+0.5,-z'] - ncsym: ['x,y,z', 'x,y+0.5,-z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (c-1/4,a-1/4,b) - P1c1(b,c,2*a+c): - 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) - symops: ['x,y,z', '-x,y+0.5,z', 'x,y+0.5,z+0.5', '-x,y,z+0.5'] - ncsym: ['x,y,z', '-x,y+0.5,z'] - number: 7 - schoenflies: Cs^2 - universal_h_m: P 1 c 1 (b,c,2*a+c) - C1m1(b-1/4,-a-1/4,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) - symops: ['x,y,z', '-x+0.5,y,z', 'x+0.5,y+0.5,z', '-x,y+0.5,z'] - ncsym: ['x,y,z', '-x,y+0.5,z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (b-1/4,-a-1/4,c) - C1m1(b-1/4,a+2*c-1/4,a): - 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) - 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+0.5,y,z+0.5', - '-x,y,z+0.5', 'x+0.5,y+0.5,z', '-x,y+0.5,z'] - ncsym: ['x,y,z', '-x,y+0.5,z'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (b-1/4,a+2*c-1/4,a) - C1m1(b-1/4,c-1/4,a+c): - 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) - symops: ['x,y,z', '-x+0.5,y,z', 'x+0.5,y+0.5,z+0.5', '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,y+0.5,z+0.5'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (b-1/4,c-1/4,a+c) - C1m1(b-1/4,c-1/4,a): - 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) - symops: ['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,y,z+0.5'] - number: 8 - schoenflies: Cs^3 - universal_h_m: C 1 m 1 (b-1/4,c-1/4,a) - P12/m1(2*a+c,b,c): - 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) - 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'] - 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 (2*a+c,b,c) - C12/m1(a,b,a+2*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) - 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,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: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (a,b,a+2*c) - P12/m1(c,2*a+c,b): - 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) - 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: 10 - schoenflies: C2h^1 - universal_h_m: P 1 2/m 1 (c,2*a+c,b) - C12/m1(a+2*c,a,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) - 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', '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'] - 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 (a+2*c,a,b) - P12/m1(b,c,2*a+c): - 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) - 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: 10 - schoenflies: C2h^1 - universal_h_m: P 1 2/m 1 (b,c,2*a+c) - C12/m1(b,a+2*c,a): - 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) - 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: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (b,a+2*c,a) - C12/m1(c-1/4,b+1/4,-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) - symops: ['x,y,z', '-x,y,-z+0.5', '-x,-y+0.5,-z+0.5', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', - '-x,y+0.5,-z', '-x,-y,-z', 'x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y+0.5,z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (c-1/4,b+1/4,-a) - C12/m1(a-1/4,b+1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,y,-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', '-x,-y,-z', 'x+0.5,-y,z'] - ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y+0.5,z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (a-1/4,b+1/4,c) - C12/m1(a+c-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) - 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+0.5,y+0.5,z+0.5', - '-x,y+0.5,-z', '-x,-y,-z', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y+0.5,z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (a+c-1/4,b+1/4,c) - C12/m1(a-1/4,b+1/4,a+2*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) - symops: ['x,y,z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', 'x,-y+0.5,z', 'x+0.5,y,z+0.5', - '-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+0.5,z', '-x,y+0.5,-z', - '-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+0.5,-y,-z+0.5', - 'x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,y+0.5,-z', '-x,-y,-z', 'x,-y+0.5,z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (a-1/4,b+1/4,a+2*c) - C12/m1(c-1/4,a+1/4,b): - 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) - symops: ['x,y,z', '-x,-y+0.5,z', '-x,-y+0.5,-z+0.5', 'x,y,-z+0.5', 'x,y+0.5,z+0.5', - '-x,-y,z+0.5', '-x,-y,-z', 'x,y+0.5,-z'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,-y,-z', 'x,y,-z+0.5'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (c-1/4,a+1/4,b) - C12/m1(-a-1/4,c+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) - symops: ['x,y,z', '-x+0.5,-y,z', '-x+0.5,-y,-z+0.5', 'x,y,-z+0.5', 'x+0.5,y,z+0.5', - '-x,-y,z+0.5', '-x,-y,-z', 'x+0.5,y,-z'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,-y,-z', 'x,y,-z+0.5'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (-a-1/4,c+1/4,b) - P121/m1(c,2*a+c,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) - 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: 11 - schoenflies: C2h^2 - universal_h_m: P 1 21/m 1 (c,2*a+c,b) - C12/m1(c-1/4,a+c+1/4,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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x+0.5,-y+0.5,-z+0.5', 'x,y,-z+0.5', 'x+0.5,y+0.5,z+0.5', - '-x,-y,z+0.5', '-x,-y,-z', 'x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,-y,-z', 'x,y,-z+0.5'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (c-1/4,a+c+1/4,b) - C12/m1(a+2*c-1/4,a+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) - symops: ['x,y,z', '-x,-y+0.5,z', '-x,-y+0.5,-z+0.5', 'x,y,-z+0.5', 'x+0.5,y+0.5,z', - '-x+0.5,-y,z', '-x+0.5,-y,-z+0.5', 'x+0.5,y+0.5,-z+0.5', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', - '-x,-y,-z', 'x,y+0.5,-z', 'x+0.5,y,z+0.5', '-x+0.5,-y+0.5,z+0.5', '-x+0.5,-y+0.5,-z', - 'x+0.5,y,-z'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,-y,-z', 'x,y,-z+0.5'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (a+2*c-1/4,a+1/4,b) - P121/m1(b,c,2*a+c): - 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) - symops: ['x,y,z', 'x+0.5,-y,-z', '-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+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,-z', '-x+0.5,y,z'] - number: 11 - schoenflies: C2h^2 - universal_h_m: P 1 21/m 1 (b,c,2*a+c) - C12/m1(b-1/4,c+1/4,a): - 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) - symops: ['x,y,z', 'x,-y,-z+0.5', '-x+0.5,-y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y,z+0.5', - 'x+0.5,-y,-z', '-x,-y,-z', '-x,y,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x+0.5,y,z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (b-1/4,c+1/4,a) - C12/m1(b-1/4,-a+1/4,c): - 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) - symops: ['x,y,z', 'x,-y+0.5,-z', '-x+0.5,-y+0.5,-z', '-x+0.5,y,z', 'x+0.5,y+0.5,z', - 'x+0.5,-y,-z', '-x,-y,-z', '-x,y+0.5,z'] - ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x+0.5,y,z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (b-1/4,-a+1/4,c) - C12/m1(b-1/4,c+1/4,a+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) - symops: ['x,y,z', 'x,-y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,z', 'x+0.5,y+0.5,z+0.5', - 'x+0.5,-y,-z', '-x,-y,-z', '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x+0.5,y,z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (b-1/4,c+1/4,a+c) - C12/m1(b-1/4,a+2*c+1/4,a): - 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) - symops: ['x,y,z', 'x,-y,-z+0.5', '-x+0.5,-y,-z+0.5', '-x+0.5,y,z', 'x,y+0.5,z+0.5', - 'x,-y+0.5,-z', '-x+0.5,-y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,y,z+0.5', 'x+0.5,-y,-z', - '-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,-y+0.5,-z+0.5', - '-x,y+0.5,z'] - ncsym: ['x,y,z', 'x+0.5,-y,-z', '-x,-y,-z', '-x+0.5,y,z'] - number: 12 - schoenflies: C2h^3 - universal_h_m: C 1 2/m 1 (b-1/4,a+2*c+1/4,a) - P12/c1(2*a+c,b,c): - 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) - symops: ['x,y,z', '-x,y,-z+0.5', '-x,-y,-z', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x+0.5,y,-z', - '-x+0.5,-y,-z+0.5', 'x+0.5,-y,z'] - 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 (2*a+c,b,c) - P12/c1(c,2*a+c,b): - 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) - symops: ['x,y,z', '-x+0.5,-y,z', '-x,-y,-z', 'x+0.5,y,-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'] - number: 13 - schoenflies: C2h^4 - universal_h_m: P 1 2/c 1 (c,2*a+c,b) - P12/c1(b,c,2*a+c): - 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) - symops: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y+0.5,z', 'x,y+0.5,z+0.5', 'x,-y,-z+0.5', - '-x,-y+0.5,-z+0.5', '-x,y,z+0.5'] - ncsym: ['x,y,z', 'x,-y+0.5,-z', '-x,-y,-z', '-x,y+0.5,z'] - number: 13 - schoenflies: C2h^4 - universal_h_m: P 1 2/c 1 (b,c,2*a+c) - P121/c1(2*a+c,b,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) - symops: ['x,y,z', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'x,-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+0.5', 'x+0.5,-y+0.5,z'] - 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 (2*a+c,b,c) - P121/c1(c,2*a+c,b): - 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) - symops: ['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,-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'] - number: 14 - schoenflies: C2h^5 - universal_h_m: P 1 21/c 1 (c,2*a+c,b) - P121/c1(b,c,2*a+c): - 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) - symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x+0.5,y+0.5,z', 'x,y+0.5,z+0.5', - 'x+0.5,-y,-z+0.5', '-x,-y+0.5,-z+0.5', '-x+0.5,y,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y,-z', '-x+0.5,y+0.5,z'] - number: 14 - schoenflies: C2h^5 - universal_h_m: P 1 21/c 1 (b,c,2*a+c) - Amm2(a,b+1/4,c-1/4): - 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) - symops: ['x,y,z', '-x,-y+0.5,z', '-x,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', - '-x,y+0.5,z+0.5', 'x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5'] - number: 38 - schoenflies: C2v^14 - universal_h_m: A m m 2 (a,b+1/4,c-1/4) - Aem2(b,-a+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) - symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y,z', '-x,y,z', 'x+0.5,y,z+0.5', '-x,-y,z+0.5', - 'x,-y,z+0.5', '-x+0.5,y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5'] - number: 39 - schoenflies: C2v^15 - universal_h_m: A e m 2 (b,-a+1/4,c-1/4) - Ima2(a-1/4,b-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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,y,z', 'x+0.5,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', - '-x,-y,z+0.5', '-x+0.5,y+0.5,z+0.5', 'x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5'] - number: 46 - schoenflies: C2v^22 - universal_h_m: I m a 2 (a-1/4,b-1/4,c+1/4) - Fmm2(a,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) - symops: ['x,y,z', '-x,-y+0.5,z', '-x,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', - '-x,y+0.5,z+0.5', 'x,-y,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', - 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y,z', '-x+0.5,y+0.5,z', 'x+0.5,-y,z'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z', 'x,-y,z+0.5'] - number: 42 - schoenflies: C2v^18 - universal_h_m: F m m 2 (a,b-1/4,c-1/4) - Aem2(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) - symops: ['x,y,z', '-x,-y+0.5,z', '-x,y+0.5,z', 'x,-y,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', - '-x,y,z+0.5', 'x,-y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] - number: 39 - schoenflies: C2v^15 - universal_h_m: A e m 2 (a,b+1/4,c-1/4) - Amm2(b,-a+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) - symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,z', '-x+0.5,y,z', 'x+0.5,y,z+0.5', '-x,-y,z+0.5', - 'x+0.5,-y,z+0.5', '-x,y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] - number: 38 - schoenflies: C2v^14 - universal_h_m: A m m 2 (b,-a+1/4,c-1/4) - Ima2(b-1/4,-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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,z', '-x+0.5,y+0.5,z', 'x+0.5,y+0.5,z+0.5', - '-x,-y,z+0.5', 'x+0.5,-y+0.5,z+0.5', '-x,y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] - number: 46 - schoenflies: C2v^22 - universal_h_m: I m a 2 (b-1/4,-a-1/4,c+1/4) - Fmm2(a+1/4,b,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) - symops: ['x,y,z', '-x+0.5,-y,z', '-x+0.5,y,z', 'x,-y,z', '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', 'x,-y+0.5,z+0.5', 'x+0.5,y,z+0.5', '-x,-y,z+0.5', '-x,y,z+0.5', - 'x+0.5,-y,z+0.5', 'x+0.5,y+0.5,z', '-x,-y+0.5,z', '-x,y+0.5,z', 'x+0.5,-y+0.5,z'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y,z+0.5', 'x,-y,z'] - number: 42 - schoenflies: C2v^18 - universal_h_m: F m m 2 (a+1/4,b,c+1/4) - Aem2(-a,c+1/4,b-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) - symops: ['x,y,z', '-x,y,-z+0.5', '-x,y,z+0.5', 'x,y,-z', 'x,y+0.5,z+0.5', '-x,y+0.5,-z', - '-x,y+0.5,z', 'x,y+0.5,-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 (-a,c+1/4,b-1/4) - Amm2(b,c+1/4,a-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) - symops: ['x,y,z', '-x+0.5,y,-z', 'x,y,-z', '-x+0.5,y,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,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] - number: 38 - schoenflies: C2v^14 - universal_h_m: A m m 2 (b,c+1/4,a-1/4) - Ima2(b-1/4,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) - symops: ['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+0.5', - '-x,y+0.5,-z', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z'] - ncsym: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] - number: 46 - schoenflies: C2v^22 - universal_h_m: I m a 2 (b-1/4,c-1/4,a+1/4) - Fmm2(b,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) - symops: ['x,y,z', '-x+0.5,y,-z', 'x,y,-z', '-x+0.5,y,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', 'x,y+0.5,z+0.5', '-x+0.5,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,z+0.5', '-x,y,-z+0.5', 'x+0.5,y,-z+0.5', '-x,y,z+0.5'] - ncsym: ['x,y,z', 'x,y,-z', '-x,y+0.5,z', '-x,y+0.5,-z'] - number: 42 - schoenflies: C2v^18 - universal_h_m: F m m 2 (b,c-1/4,a-1/4) - Amm2(-a,c+1/4,b-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) - symops: ['x,y,z', '-x,y,-z+0.5', '-x,y,z', 'x,y,-z+0.5', 'x,y+0.5,z+0.5', '-x,y+0.5,-z', - '-x,y+0.5,z+0.5', 'x,y+0.5,-z'] - ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] - number: 38 - schoenflies: C2v^14 - universal_h_m: A m m 2 (-a,c+1/4,b-1/4) - Aem2(b,c+1/4,a-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) - symops: ['x,y,z', '-x+0.5,y,-z', 'x+0.5,y,-z', '-x,y,z', 'x+0.5,y+0.5,z', '-x,y+0.5,-z', - 'x,y+0.5,-z', '-x+0.5,y+0.5,z'] - ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] - number: 39 - schoenflies: C2v^15 - universal_h_m: A e m 2 (b,c+1/4,a-1/4) - Ima2(-a-1/4,c-1/4,b+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) - symops: ['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+0.5', - '-x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x,y+0.5,-z'] - ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] - number: 46 - schoenflies: C2v^22 - universal_h_m: I m a 2 (-a-1/4,c-1/4,b+1/4) - Fmm2(b+1/4,c,a+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) - symops: ['x,y,z', '-x,y,-z+0.5', 'x,y,-z+0.5', '-x,y,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,y+0.5,z+0.5', '-x,y+0.5,-z', 'x,y+0.5,-z', - '-x,y+0.5,z+0.5', 'x+0.5,y,z+0.5', '-x+0.5,y,-z', 'x+0.5,y,-z', '-x+0.5,y,z+0.5'] - ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y,z', '-x,y+0.5,-z'] - number: 42 - schoenflies: C2v^18 - universal_h_m: F m m 2 (b+1/4,c,a+1/4) - Fmm2(a+1/4,b+1/4,c+1/2): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x+0.5,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', - '-x+0.5,-y,z+0.5', '-x+0.5,y+0.5,z+0.5', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x,-y+0.5,z+0.5', - '-x,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x,-y,z', '-x,y+0.5,z', - 'x+0.5,-y,z'] - ncsym: ['x,y,z', '-x,-y,z', '-x,y,z+0.5', 'x,-y,z+0.5'] - number: 42 - schoenflies: C2v^18 - universal_h_m: F m m 2 (a+1/4,b+1/4,c+1/2) - Fmm2(b+1/4,c+1/4,a+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) - symops: ['x,y,z', '-x+0.5,y,-z+0.5', 'x,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y+0.5,z', - '-x,y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z', 'x,y+0.5,z+0.5', '-x+0.5,y+0.5,-z', - 'x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,y,z+0.5', '-x,y,-z', 'x+0.5,y,-z', - '-x,y,z+0.5'] - ncsym: ['x,y,z', 'x,y+0.5,-z', '-x,y+0.5,z', '-x,y,-z'] - number: 42 - schoenflies: C2v^18 - universal_h_m: F m m 2 (b+1/4,c+1/4,a+1/2) - Cmm2(a-1/4,b-1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x+0.5,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', - '-x,-y,z', '-x,y+0.5,z', 'x+0.5,-y,z'] - ncsym: ['x,y,z', '-x,-y,z', '-x+0.5,y,z', 'x+0.5,-y,z'] - number: 35 - schoenflies: C2v^11 - universal_h_m: C m m 2 (a-1/4,b-1/4,c) - Cmm2(b-1/4,c-1/4,a): - 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) - symops: ['x,y,z', '-x+0.5,y,-z+0.5', 'x,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y,z+0.5', - '-x,y,-z', 'x+0.5,y,-z', '-x,y,z+0.5'] - ncsym: ['x,y,z', 'x,y,-z+0.5', '-x,y,z+0.5', '-x,y,-z'] - number: 35 - schoenflies: C2v^11 - universal_h_m: C m m 2 (b-1/4,c-1/4,a) - Aea2(a,b+1/4,c-1/4): - 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) - symops: ['x,y,z', '-x,-y+0.5,z', '-x+0.5,y+0.5,z', 'x+0.5,-y,z', 'x,y+0.5,z+0.5', - '-x,-y,z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y,z'] - number: 41 - schoenflies: C2v^17 - universal_h_m: A e a 2 (a,b+1/4,c-1/4) - Cmc21(b-1/4,-a-1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,z', '-x+0.5,y,z+0.5', 'x+0.5,y+0.5,z', - '-x,-y,z+0.5', 'x+0.5,-y,z', '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,-y,z'] - number: 36 - schoenflies: C2v^12 - universal_h_m: C m c 21 (b-1/4,-a-1/4,c) - Iba2(a-1/4,b-1/4,c+1/4): - 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) - 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+0.5,y+0.5,z+0.5', - '-x,-y,z+0.5', '-x,y+0.5,z', '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: 45 - schoenflies: C2v^21 - universal_h_m: I b a 2 (a-1/4,b-1/4,c+1/4) - Aea2(b,-a+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) - symops: ['x,y,z', '-x+0.5,-y,z', 'x+0.5,-y+0.5,z', '-x,y+0.5,z', 'x+0.5,y,z+0.5', - '-x,-y,z+0.5', 'x,-y+0.5,z+0.5', '-x+0.5,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'] - number: 41 - schoenflies: C2v^17 - universal_h_m: A e a 2 (b,-a+1/4,c-1/4) - Cmc21(a-1/4,b-1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', '-x+0.5,y,z', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', - '-x,-y,z+0.5', '-x,y+0.5,z', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x,y+0.5,z', 'x,-y+0.5,z+0.5'] - number: 36 - schoenflies: C2v^12 - universal_h_m: C m c 21 (a-1/4,b-1/4,c) - Cmc21(-a-1/4,c-1/4,b): - 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) - symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,y,z', 'x,y+0.5,-z+0.5', 'x+0.5,y,z+0.5', - '-x,y+0.5,-z', '-x,y,z+0.5', 'x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] - number: 36 - schoenflies: C2v^12 - universal_h_m: C m c 21 (-a-1/4,c-1/4,b) - Aea2(b,c+1/4,a-1/4): - 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) - symops: ['x,y,z', '-x+0.5,y,-z', 'x+0.5,y,-z+0.5', '-x,y,z+0.5', 'x+0.5,y+0.5,z', - '-x,y+0.5,-z', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] - number: 41 - schoenflies: C2v^17 - universal_h_m: A e a 2 (b,c+1/4,a-1/4) - Iba2(b-1/4,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) - symops: ['x,y,z', '-x+0.5,y,-z+0.5', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y+0.5,z+0.5', - '-x,y+0.5,-z', 'x+0.5,y,-z', '-x,y,z+0.5'] - ncsym: ['x,y,z', 'x,y+0.5,-z+0.5', '-x,y,z+0.5', '-x,y+0.5,-z'] - number: 45 - schoenflies: C2v^21 - universal_h_m: I b a 2 (b-1/4,c-1/4,a+1/4) - Aea2(-a,c+1/4,b-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) - symops: ['x,y,z', '-x,y,-z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,y,-z', 'x,y+0.5,z+0.5', - '-x,y+0.5,-z', '-x+0.5,y+0.5,z', 'x+0.5,y+0.5,-z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y+0.5,z', '-x,y+0.5,-z'] - number: 41 - schoenflies: C2v^17 - universal_h_m: A e a 2 (-a,c+1/4,b-1/4) - Cmc21(b-1/4,c-1/4,a): - 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) - symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', 'x,y,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', - '-x,y+0.5,-z', 'x+0.5,y,-z', '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y,-z', '-x+0.5,y+0.5,z', '-x,y+0.5,-z'] - number: 36 - schoenflies: C2v^12 - universal_h_m: C m c 21 (b-1/4,c-1/4,a) - Ccc2(a-1/4,b-1/4,c): - 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) - 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+0.5,y+0.5,z', - '-x,-y,z', '-x,y+0.5,z+0.5', 'x+0.5,-y,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: 37 - schoenflies: C2v^13 - universal_h_m: C c c 2 (a-1/4,b-1/4,c) - Ccc2(b-1/4,c-1/4,a): - 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) - symops: ['x,y,z', '-x+0.5,y,-z+0.5', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', - '-x,y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', '-x,y,-z'] - number: 37 - schoenflies: C2v^13 - universal_h_m: C c c 2 (b-1/4,c-1/4,a) - Ama2(a+1/4,b+1/4,c-1/4): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', '-x,y,z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', - '-x+0.5,-y,z+0.5', '-x,y+0.5,z+0.5', '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: 40 - schoenflies: C2v^16 - universal_h_m: A m a 2 (a+1/4,b+1/4,c-1/4) - Cmc21(a,b+1/4,c): - crystal_class: orthorhombic - hall: ' C 2c -2 (x,y-1/4,z)' - hermann_mauguin: C m c 21 (a,b+1/4,c) - symops: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y,z', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', - '-x+0.5,-y,z+0.5', '-x+0.5,y+0.5,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: 36 - schoenflies: C2v^12 - universal_h_m: C m c 21 (a,b+1/4,c) - Imm2(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) - symops: ['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,z+0.5', '-x+0.5,y+0.5,z+0.5', '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: 44 - schoenflies: C2v^20 - universal_h_m: I m m 2 (a,b-1/4,c) - Ama2(b+1/4,-a+1/4,c-1/4): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', '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+0.5,-y,z+0.5', '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] - number: 40 - schoenflies: C2v^16 - universal_h_m: A m a 2 (b+1/4,-a+1/4,c-1/4) - Cmc21(b,-a+1/4,c): - crystal_class: orthorhombic - hall: ' C 2c -2 (y-1/4,-x,z)' - hermann_mauguin: C m c 21 (b,-a+1/4,c) - symops: ['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,-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,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] - number: 36 - schoenflies: C2v^12 - universal_h_m: C m c 21 (b,-a+1/4,c) - Imm2(a-1/4,b,c+1/4): - 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) - symops: ['x,y,z', '-x+0.5,-y,z', '-x+0.5,y,z', 'x,-y,z', 'x+0.5,y+0.5,z+0.5', - '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', '-x,y+0.5,z+0.5', 'x,-y,z'] - number: 44 - schoenflies: C2v^20 - universal_h_m: I m m 2 (a-1/4,b,c+1/4) - Cmc21(b,c+1/4,a): - crystal_class: orthorhombic - hall: ' C 2c -2 (y-1/4,z,x)' - hermann_mauguin: C m c 21 (b,c+1/4,a) - symops: ['x,y,z', '-x+0.5,y+0.5,-z', '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+0.5,y,-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: 36 - schoenflies: C2v^12 - universal_h_m: C m c 21 (b,c+1/4,a) - Ama2(b+1/4,c+1/4,a-1/4): - 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) - symops: ['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,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,y,-z', '-x,y+0.5,z+0.5', '-x,y+0.5,-z+0.5'] - number: 40 - schoenflies: C2v^16 - universal_h_m: A m a 2 (b+1/4,c+1/4,a-1/4) - Imm2(b,c-1/4,a): - crystal_class: orthorhombic - hall: ' I 2 -2 (y+1/4,z,x)' - hermann_mauguin: I m m 2 (b,c-1/4,a) - symops: ['x,y,z', '-x+0.5,y,-z', 'x,y,-z', '-x+0.5,y,z', 'x+0.5,y+0.5,z+0.5', - '-x,y+0.5,-z+0.5', 'x+0.5,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: 44 - schoenflies: C2v^20 - universal_h_m: I m m 2 (b,c-1/4,a) - Ama2(-a+1/4,c+1/4,b-1/4): - 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) - symops: ['x,y,z', '-x+0.5,y,-z+0.5', '-x,y,z', 'x+0.5,y,-z+0.5', 'x,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'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] - number: 40 - schoenflies: C2v^16 - universal_h_m: A m a 2 (-a+1/4,c+1/4,b-1/4) - Cmc21(-a,c+1/4,b): - crystal_class: orthorhombic - hall: ' C 2c -2 (-x,z,y-1/4)' - hermann_mauguin: C m c 21 (-a,c+1/4,b) - symops: ['x,y,z', '-x,y+0.5,-z+0.5', '-x,y,z', 'x,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+0.5', 'x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] - number: 36 - schoenflies: C2v^12 - universal_h_m: C m c 21 (-a,c+1/4,b) - Imm2(b-1/4,c,a+1/4): - 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) - symops: ['x,y,z', '-x,y,-z+0.5', '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+0.5,y+0.5,-z', '-x+0.5,y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z', '-x,y,z', '-x+0.5,y+0.5,-z'] - number: 44 - schoenflies: C2v^20 - universal_h_m: I m m 2 (b-1/4,c,a+1/4) - Ama2(a,b+1/4,c-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) - symops: ['x,y,z', '-x,-y+0.5,z', '-x+0.5,y,z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', - '-x,-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,z+0.5', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y+0.5,z'] - number: 40 - schoenflies: C2v^16 - universal_h_m: A m a 2 (a,b+1/4,c-1/4) - Ama2(b,-a+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) - symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,z', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', - '-x,-y,z+0.5', 'x+0.5,-y+0.5,z+0.5', '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x,-y,z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,-y+0.5,z+0.5'] - number: 40 - schoenflies: C2v^16 - universal_h_m: A m a 2 (b,-a+1/4,c-1/4) - Ama2(b,c+1/4,a-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) - symops: ['x,y,z', '-x+0.5,y,-z', 'x,y,-z+0.5', '-x+0.5,y,z+0.5', 'x+0.5,y+0.5,z', - '-x,y+0.5,-z', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y,z+0.5', '-x,y+0.5,-z'] - number: 40 - schoenflies: C2v^16 - universal_h_m: A m a 2 (b,c+1/4,a-1/4) - Ama2(-a,c+1/4,b-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) - symops: ['x,y,z', '-x,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y,-z+0.5', 'x,y+0.5,z+0.5', - '-x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,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'] - number: 40 - schoenflies: C2v^16 - universal_h_m: A m a 2 (-a,c+1/4,b-1/4) - Cccm(c,a,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) - symops: ['x,y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,z', '-x+0.5,-y,-z', '-x+0.5,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,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', '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: 66 - schoenflies: D2h^20 - universal_h_m: C c c m (c,a,b-1/4) - Cccm(b,c,a-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) - symops: ['x,y,z', '-x,y,-z', '-x,-y,z', 'x,-y,-z', '-x,-y+0.5,-z', 'x,-y+0.5,z', - 'x,y+0.5,-z', '-x,y+0.5,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+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: 66 - schoenflies: D2h^20 - universal_h_m: C c c m (b,c,a-1/4) - Cccm(a,b,c-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) - symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z+0.5', 'x,y,-z+0.5', - '-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', - '-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+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: 66 - schoenflies: D2h^20 - universal_h_m: C c c m (a,b,c-1/4) - Fmmm(a-1/4,b-1/4,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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', - 'x,y,-z+0.5', '-x+0.5,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x+0.5,-y,z+0.5', - 'x,-y,-z', '-x+0.5,y+0.5,-z', '-x+0.5,-y,-z', 'x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', - 'x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y,-z', - '-x,-y+0.5,-z', 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', - '-x,-y,z', 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z+0.5', 'x+0.5,y+0.5,-z+0.5', - '-x,y+0.5,z', 'x+0.5,-y,z'] - 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: 69 - schoenflies: D2h^23 - universal_h_m: F m m m (a-1/4,b-1/4,c-1/4) - Cccm(c-1/4,a-1/4,b): - 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) - symops: ['x,y,z', 'x,-y+0.5,-z+0.5', '-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+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,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5', 'x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] - number: 66 - schoenflies: D2h^20 - universal_h_m: C c c m (c-1/4,a-1/4,b) - Cccm(b-1/4,c-1/4,a): - 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) - 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+0.5,-y,-z+0.5', - 'x,-y,z', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', '-x,y,-z', '-x,-y+0.5,z+0.5', - 'x+0.5,-y+0.5,-z', '-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+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] - number: 66 - schoenflies: D2h^20 - universal_h_m: C c c m (b-1/4,c-1/4,a) - Cccm(a-1/4,b-1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z', - 'x,y,-z', '-x+0.5,y,z+0.5', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x,-y,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,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] - number: 66 - schoenflies: D2h^20 - universal_h_m: C c c m (a-1/4,b-1/4,c) - Immm(a+1/4,b-1/4,c+1/4): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', - 'x,y,-z+0.5', '-x+0.5,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', '-x,-y,z+0.5', - 'x+0.5,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', - 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] - number: 71 - schoenflies: D2h^25 - universal_h_m: I m m m (a+1/4,b-1/4,c+1/4) - Fmmm(a+1/4,b+1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', - 'x,y,-z', '-x+0.5,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x+0.5,-y,z+0.5', 'x,-y,-z+0.5', - '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', - 'x,-y,z+0.5', 'x+0.5,y,z+0.5', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', - '-x,-y+0.5,-z+0.5', 'x+0.5,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', - '-x,-y,z', 'x+0.5,-y,-z', '-x,y+0.5,-z', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z', - 'x+0.5,-y,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: 69 - schoenflies: D2h^23 - universal_h_m: F m m m (a+1/4,b+1/4,c) - Fmmm(a+1/2,b+1/4,c+1/4): - 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) - symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,-z+0.5', - 'x,y,-z+0.5', '-x,y,z', 'x,-y+0.5,z', 'x,y+0.5,z+0.5', '-x,-y,z+0.5', 'x,-y,-z', - '-x,y+0.5,-z', '-x,-y,-z', 'x,y+0.5,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', - '-x+0.5,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', - 'x+0.5,y,-z', '-x+0.5,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y,z', - 'x+0.5,-y,-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+0.5,z', 'x+0.5,-y,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: 69 - schoenflies: D2h^23 - universal_h_m: F m m m (a+1/2,b+1/4,c+1/4) - Fmmm(a-1/4,b+1/2,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) - symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y,-z+0.5', - 'x,y,-z+0.5', '-x+0.5,y,z', 'x,-y,z', 'x,y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', - 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x+0.5,-y+0.5,-z', 'x,y+0.5,-z', '-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,z+0.5', 'x+0.5,-y,-z', '-x,y,-z', - '-x,-y,-z', 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y,z+0.5', 'x+0.5,y+0.5,z', '-x,-y+0.5,z', - 'x+0.5,-y+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', - '-x,y+0.5,z', 'x+0.5,-y+0.5,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y,-z', 'x,y+0.5,-z', - '-x,y+0.5,z', 'x,-y,z'] - number: 69 - schoenflies: D2h^23 - universal_h_m: F m m m (a-1/4,b+1/2,c+1/4) - Ibam(a,b,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) - symops: ['x,y,z', '-x,-y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,-z+0.5', 'x,y,-z+0.5', - '-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+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', - '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: 72 - schoenflies: D2h^26 - universal_h_m: I b a m (a,b,c+1/4) - Cmmm(a-1/4,b-1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', - 'x,y,-z', '-x+0.5,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', '-x,-y,z', 'x+0.5,-y,-z', - '-x,y+0.5,-z', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z', 'x+0.5,-y,z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x+0.5,y+0.5,-z', '-x,y+0.5,z', 'x+0.5,-y,z'] - number: 65 - schoenflies: D2h^19 - universal_h_m: C m m m (a-1/4,b-1/4,c) - Ibam(a+1/4,b-1/4,c+1/4): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z+0.5', - 'x,y,-z+0.5', '-x+0.5,y,z+0.5', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z+0.5', '-x,-y,z+0.5', - '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,y+0.5,z', - 'x+0.5,-y,z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x+0.5,y+0.5,-z', '-x,y+0.5,z', 'x+0.5,-y,z'] - number: 72 - schoenflies: D2h^26 - universal_h_m: I b a m (a+1/4,b-1/4,c+1/4) - Ibam(c,a,b+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) - symops: ['x,y,z', 'x,-y,-z', '-x,y,-z', '-x,-y,z', '-x+0.5,-y,-z', '-x+0.5,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+0.5,y+0.5,-z+0.5', - '-x+0.5,-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'] - ncsym: ['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'] - number: 72 - schoenflies: D2h^26 - universal_h_m: I b a m (c,a,b+1/4) - Cmmm(c-1/4,a-1/4,b): - 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) - symops: ['x,y,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,z', '-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,-y,-z', '-x,y+0.5,-z', - '-x,-y,z+0.5', '-x,-y,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5', 'x,y+0.5,-z'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', - 'x,y+0.5,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5'] - number: 65 - schoenflies: D2h^19 - universal_h_m: C m m m (c-1/4,a-1/4,b) - Ibam(c+1/4,a-1/4,b+1/4): - 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) - symops: ['x,y,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,z', '-x+0.5,-y+0.5,-z+0.5', - '-x+0.5,y,z', 'x+0.5,-y+0.5,z', 'x+0.5,y,-z+0.5', 'x+0.5,y+0.5,z+0.5', 'x+0.5,-y,-z', - '-x+0.5,y+0.5,-z', '-x+0.5,-y,z+0.5', '-x,-y,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5', - 'x,y+0.5,-z'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', - 'x,y+0.5,-z', '-x,y+0.5,z+0.5', 'x,-y,z+0.5'] - number: 72 - schoenflies: D2h^26 - universal_h_m: I b a m (c+1/4,a-1/4,b+1/4) - Ibam(b,c,a+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) - symops: ['x,y,z', '-x,y,-z', '-x,-y,z', 'x,-y,-z', '-x,-y+0.5,-z', 'x,-y+0.5,z', - 'x,y+0.5,-z', '-x,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+0.5', - 'x+0.5,-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'] - 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: 72 - schoenflies: D2h^26 - universal_h_m: I b a m (b,c,a+1/4) - Cmmm(b-1/4,c-1/4,a): - 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) - symops: ['x,y,z', '-x+0.5,y,-z+0.5', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,-y,-z+0.5', - 'x,-y,z', 'x,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,y,z+0.5', '-x,y,-z', '-x,-y,z+0.5', - 'x+0.5,-y,-z', '-x,-y,-z', 'x+0.5,-y,z+0.5', 'x+0.5,y,-z', '-x,y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y,z+0.5'] - number: 65 - schoenflies: D2h^19 - universal_h_m: C m m m (b-1/4,c-1/4,a) - Ibam(b+1/4,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 m (b+1/4,c-1/4,a+1/4) - symops: ['x,y,z', '-x+0.5,y,-z+0.5', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', - 'x,-y+0.5,z', 'x,y+0.5,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y+0.5,z+0.5', '-x,y+0.5,-z', - '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x,-y,-z', 'x+0.5,-y,z+0.5', 'x+0.5,y,-z', - '-x,y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y,z+0.5'] - number: 72 - schoenflies: D2h^26 - universal_h_m: I b a m (b+1/4,c-1/4,a+1/4) - Cmcm(b-1/4,c-1/4,a): - 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) - symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y,z', 'x,-y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', - 'x,-y+0.5,z', 'x,y,-z+0.5', '-x+0.5,y+0.5,z', 'x+0.5,y,z+0.5', '-x,y+0.5,-z', - '-x,-y,z+0.5', 'x+0.5,-y+0.5,-z', '-x,-y,-z', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y,-z', - '-x,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: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (b-1/4,c-1/4,a) - Cmcm(c-1/4,b-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) - symops: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,-y+0.5,z', '-x+0.5,y,-z+0.5', '-x,-y+0.5,-z+0.5', - '-x+0.5,y,z', 'x,y,-z+0.5', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', 'x+0.5,-y,-z', - '-x,-y,z+0.5', '-x+0.5,y+0.5,-z', '-x,-y,-z', '-x+0.5,y+0.5,z+0.5', 'x,y+0.5,-z', - 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,-y,z+0.5'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (c-1/4,b-1/4,-a) - Cmcm(a-1/4,b-1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z', - 'x,y,-z+0.5', '-x+0.5,y,z', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x,-y,z+0.5', - 'x+0.5,-y,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z', - 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x+0.5,y,-z+0.5', '-x,-y,-z', - 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z', 'x+0.5,-y,z+0.5'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (a-1/4,b-1/4,c) - Cmcm(-a-1/4,c-1/4,b): - 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) - symops: ['x,y,z', '-x+0.5,y+0.5,-z+0.5', 'x,-y,-z+0.5', '-x+0.5,-y+0.5,z', '-x+0.5,-y,-z+0.5', - 'x,-y+0.5,z', '-x+0.5,y,z', 'x,y+0.5,-z+0.5', 'x+0.5,y,z+0.5', '-x,y+0.5,-z', - 'x+0.5,-y,-z', '-x,-y+0.5,z+0.5', '-x,-y,-z', 'x+0.5,-y+0.5,z+0.5', '-x,y,z+0.5', - 'x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', - 'x+0.5,y+0.5,-z', '-x,y,z+0.5', 'x+0.5,-y+0.5,z+0.5'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (-a-1/4,c-1/4,b) - Cmcm(c-1/4,a-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) - symops: ['x,y,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x+0.5,-y+0.5,z', '-x,-y+0.5,-z+0.5', - '-x+0.5,y,z', 'x,-y+0.5,z', 'x+0.5,y,-z+0.5', 'x,y+0.5,z+0.5', 'x+0.5,-y,-z', - '-x,y+0.5,-z', '-x+0.5,-y,z+0.5', '-x,-y,-z', '-x+0.5,y+0.5,z+0.5', 'x,-y,z+0.5', - 'x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x+0.5,-y+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', - 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', 'x,-y,z+0.5'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (c-1/4,a-1/4,b) - Cmcm(b-1/4,-a-1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', '-x+0.5,y,-z', 'x,-y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', - 'x,y,-z+0.5', 'x,-y+0.5,z', '-x+0.5,y,z+0.5', 'x+0.5,y+0.5,z', '-x,-y,z+0.5', - '-x,y+0.5,-z', 'x+0.5,-y,-z+0.5', '-x,-y,-z', 'x+0.5,y+0.5,-z+0.5', 'x+0.5,-y,z', - '-x,y+0.5,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', - 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', 'x+0.5,-y,z'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (b-1/4,-a-1/4,c) - Cmce(c-1/4,a-1/4,b): - 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) - symops: ['x,y,z', 'x+0.5,-y,-z+0.5', '-x,y,-z+0.5', '-x+0.5,-y,z', '-x,-y+0.5,-z+0.5', - '-x+0.5,y+0.5,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,-z+0.5', 'x,y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', - '-x,y+0.5,-z', '-x+0.5,-y+0.5,z+0.5', '-x,-y,-z', '-x+0.5,y,z+0.5', 'x,-y,z+0.5', - 'x+0.5,y,-z'] - 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: 64 - schoenflies: D2h^18 - universal_h_m: C m c e (c-1/4,a-1/4,b) - Cmce(-a-1/4,c-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) - symops: ['x,y,z', '-x,y+0.5,-z+0.5', 'x,-y,-z+0.5', '-x,-y+0.5,z', '-x+0.5,-y,-z+0.5', - 'x+0.5,-y+0.5,z', '-x+0.5,y,z', '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', '-x+0.5,-y+0.5,z+0.5', '-x,-y,-z', 'x,-y+0.5,z+0.5', '-x,y,z+0.5', - 'x,y+0.5,-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: 64 - schoenflies: D2h^18 - universal_h_m: C m c e (-a-1/4,c-1/4,b) - Cmce(b-1/4,c-1/4,a): - 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) - symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,-y,-z+0.5', - 'x,-y+0.5,z+0.5', 'x,y,-z+0.5', '-x+0.5,y+0.5,z+0.5', 'x+0.5,y,z+0.5', '-x,y+0.5,-z+0.5', - '-x,-y,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z', 'x+0.5,-y+0.5,z', 'x+0.5,y,-z', - '-x,y+0.5,z'] - ncsym: ['x,y,z', '-x+0.5,-y,z', 'x,-y+0.5,-z', '-x+0.5,y+0.5,-z', '-x,-y,-z', - 'x+0.5,y,-z', '-x,y+0.5,z', 'x+0.5,-y+0.5,z'] - number: 64 - schoenflies: D2h^18 - universal_h_m: C m c e (b-1/4,c-1/4,a) - Cmce(b-1/4,-a-1/4,c): - 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) - symops: ['x,y,z', '-x+0.5,-y,z+0.5', '-x+0.5,y,-z', 'x,-y,-z+0.5', '-x+0.5,-y+0.5,-z', - 'x,y+0.5,-z+0.5', 'x,-y+0.5,z', '-x+0.5,y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x,-y+0.5,z+0.5', - '-x,y+0.5,-z', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z', 'x+0.5,y,-z+0.5', 'x+0.5,-y,z', - '-x,y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x,-y,-z+0.5', '-x+0.5,y,-z', '-x,-y,-z', - 'x+0.5,y,-z+0.5', '-x,y,z+0.5', 'x+0.5,-y,z'] - number: 64 - schoenflies: D2h^18 - universal_h_m: C m c e (b-1/4,-a-1/4,c) - Cmce(a-1/4,b-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) - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x,y,-z+0.5', '-x+0.5,-y+0.5,-z', - 'x+0.5,y,-z+0.5', '-x+0.5,y,z', 'x+0.5,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-x+0.5,-y,z+0.5', - 'x+0.5,-y,-z', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', 'x,y+0.5,-z+0.5', '-x,y+0.5,z', - 'x,-y,z+0.5'] - ncsym: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z', '-x,y,-z+0.5', '-x,-y,-z', - 'x,y+0.5,-z+0.5', '-x,y+0.5,z', 'x,-y,z+0.5'] - number: 64 - schoenflies: D2h^18 - universal_h_m: C m c e (a-1/4,b-1/4,c) - Cmce(c-1/4,b-1/4,-a): - 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) - symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x,-y+0.5,z', '-x+0.5,y,-z', '-x,-y+0.5,-z+0.5', - '-x+0.5,y,z+0.5', 'x,y,-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,z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x,-y,-z', '-x+0.5,y+0.5,z', 'x,y+0.5,-z', - 'x+0.5,-y,z'] - ncsym: ['x,y,z', '-x,-y+0.5,z', 'x+0.5,-y+0.5,-z', '-x+0.5,y,-z', '-x,-y,-z', - 'x,y+0.5,-z', '-x+0.5,y+0.5,z', 'x+0.5,-y,z'] - number: 64 - schoenflies: D2h^18 - universal_h_m: C m c e (c-1/4,b-1/4,-a) - Cmcm(c+1/2,a-1/4,b+1/4): - 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) - symops: ['x,y,z', 'x+0.5,-y,-z+0.5', '-x+0.5,y,-z+0.5', '-x,-y,z', '-x+0.5,-y,-z+0.5', - '-x,y,z', 'x,-y,z', 'x+0.5,y,-z+0.5', 'x,y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-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', 'x,-y+0.5,z+0.5', '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+0.5,-y+0.5,-z', - 'x+0.5,y+0.5,-z', '-x,y,z', 'x,-y,z'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (c+1/2,a-1/4,b+1/4) - Cmcm(-a+1/2,c-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) - symops: ['x,y,z', '-x,y+0.5,-z+0.5', 'x,-y+0.5,-z+0.5', '-x,-y,z', '-x,-y+0.5,-z+0.5', - 'x,-y,z', '-x,y,z', 'x,y+0.5,-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,z+0.5', '-x+0.5,-y+0.5,-z', 'x+0.5,-y,z+0.5', '-x+0.5,y,z+0.5', '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+0.5,-y+0.5,-z', - 'x+0.5,y+0.5,-z', '-x,y,z', 'x,-y,z'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (-a+1/2,c-1/4,b+1/4) - Immm(a,b,c-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) - symops: ['x,y,z', '-x,-y,z', 'x,-y,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z+0.5', 'x,y,-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', '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+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', '-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: 71 - schoenflies: D2h^25 - universal_h_m: I m m m (a,b,c-1/4) - Cmcm(b+1/2,c-1/4,a+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) - symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x+0.5,-y+0.5,z', 'x,-y,-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,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,-y+0.5,-z+0.5', 'x+0.5,-y,z+0.5', 'x+0.5,y,-z+0.5', '-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', '-x,-y+0.5,-z+0.5', - 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (b+1/2,c-1/4,a+1/4) - Cmcm(b+1/2,-a-1/4,c+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) - symops: ['x,y,z', '-x+0.5,-y,z+0.5', '-x+0.5,y,-z+0.5', 'x,-y,-z', '-x+0.5,-y,-z+0.5', - 'x,y,-z', '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+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+0.5,-y+0.5,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', '-x,-y+0.5,-z+0.5', - 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (b+1/2,-a-1/4,c+1/4) - Immm(a-1/4,b,c): - crystal_class: orthorhombic - hall: -I 2 2 (x+1/4,y,z) - hermann_mauguin: I m m m (a-1/4,b,c) - symops: ['x,y,z', '-x+0.5,-y,z', 'x,-y,-z', '-x+0.5,y,-z', '-x+0.5,-y,-z', 'x,y,-z', - '-x+0.5,y,z', 'x,-y,z', 'x+0.5,y+0.5,z+0.5', '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z+0.5', - '-x,y+0.5,-z+0.5', '-x,-y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z+0.5', - 'x+0.5,-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', '-x,-y+0.5,-z+0.5', - 'x,y,-z', '-x,y+0.5,z+0.5', 'x,-y,z'] - number: 71 - schoenflies: D2h^25 - universal_h_m: I m m m (a-1/4,b,c) - Cmcm(c+1/2,b-1/4,-a+1/4): - 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) - symops: ['x,y,z', 'x+0.5,-y+0.5,-z', '-x+0.5,-y+0.5,z', '-x,y,-z', '-x+0.5,-y+0.5,-z', - '-x,y,z', 'x,y,-z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', 'x+0.5,-y,-z+0.5', '-x+0.5,-y,z+0.5', - '-x,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', '-x,y+0.5,z+0.5', 'x,y+0.5,-z+0.5', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', - 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (c+1/2,b-1/4,-a+1/4) - Cmcm(a+1/2,b-1/4,c+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) - symops: ['x,y,z', '-x,-y+0.5,z+0.5', 'x,-y+0.5,-z+0.5', '-x,y,-z', '-x,-y+0.5,-z+0.5', - 'x,y,-z', '-x,y,z', 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-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,-z+0.5', 'x+0.5,y+0.5,-z', '-x+0.5,y+0.5,z', 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', - 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] - number: 63 - schoenflies: D2h^17 - universal_h_m: C m c m (a+1/2,b-1/4,c+1/4) - Immm(a,b-1/4,c): - crystal_class: orthorhombic - hall: -I 2 2 (x,y+1/4,z) - hermann_mauguin: I m m m (a,b-1/4,c) - symops: ['x,y,z', '-x,-y+0.5,z', 'x,-y+0.5,-z', '-x,y,-z', '-x,-y+0.5,-z', 'x,y,-z', - '-x,y,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z+0.5', '-x+0.5,-y,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', 'x+0.5,y+0.5,-z+0.5', '-x+0.5,y+0.5,z+0.5', - 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x+0.5,-y,z+0.5', 'x+0.5,-y,-z+0.5', '-x,y,-z', '-x+0.5,-y,-z+0.5', - 'x,y,-z', '-x,y,z', 'x+0.5,-y,z+0.5'] - number: 71 - schoenflies: D2h^25 - universal_h_m: I m m m (a,b-1/4,c) - I4/m(a+b,-a+b,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) - 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', - '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', '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'] - 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 (a+b,-a+b,c) - P4/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) - 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'] - number: 83 - schoenflies: C4h^1 - universal_h_m: P 4/m (a+b,-a+b,c) - I4/m(a+b+1/2,-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) - symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-x+0.5,-y+0.5,-z', - 'y+0.5,-x,-z', 'x,y,-z', '-y,x+0.5,-z', 'x+0.5,y+0.5,z', '-y+0.5,x,z', '-x,-y,z', - 'y,-x+0.5,z', '-x,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', 'x+0.5,y,z+0.5', - '-y+0.5,x+0.5,z+0.5', '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-x,-y+0.5,-z+0.5', 'y,-x,-z+0.5', - 'x+0.5,y,-z+0.5', '-y+0.5,x+0.5,-z+0.5', 'x,y+0.5,z+0.5', '-y,x,z+0.5', '-x+0.5,-y,z+0.5', - 'y+0.5,-x+0.5,z+0.5', '-x+0.5,-y,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x,y+0.5,-z+0.5', - '-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: 87 - schoenflies: C4h^5 - universal_h_m: I 4/m (a+b+1/2,-a+b,c) - P42/m(a+b,-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) - 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+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+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,-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 (a+b,-a+b,c) - I4/m(a+1/2,b,c): - crystal_class: tetragonal - hall: -I 4 (x+1/2,y,z) - hermann_mauguin: I 4/m (a+1/2,b,c) - symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', '-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+0.5', 'y,-x,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-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: 87 - schoenflies: C4h^5 - universal_h_m: I 4/m (a+1/2,b,c) - I4/m(a+1/2,b,c-1/4): - 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) - symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,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', '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'] - 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: 87 - schoenflies: C4h^5 - universal_h_m: I 4/m (a+1/2,b,c-1/4) - P4/m(a+b,-a+b+1/2,c): - 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) - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,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', '-x,-y,z', - 'y+0.5,-x,z', '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z'] - 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'] - number: 83 - schoenflies: C4h^1 - universal_h_m: P 4/m (a+b,-a+b+1/2,c) - I4/m(a-1/4,b-1/4,c+1/4): - 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) - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', '-x+0.5,-y+0.5,-z+0.5', - 'y,-x+0.5,-z+0.5', 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', 'x+0.5,y+0.5,z+0.5', '-y,x+0.5,z+0.5', - '-x,-y,z+0.5', 'y+0.5,-x,z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', - '-y,x+0.5,-z'] - 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'] - number: 87 - schoenflies: C4h^5 - universal_h_m: I 4/m (a-1/4,b-1/4,c+1/4) - I4/m(a+b+1/2,-a+b,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) - symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-x+0.5,-y+0.5,-z+0.5', - 'y+0.5,-x,-z+0.5', 'x,y,-z+0.5', '-y,x+0.5,-z+0.5', 'x+0.5,y+0.5,z', '-y+0.5,x,z', - '-x,-y,z', 'y,-x+0.5,z', '-x,-y,-z+0.5', 'y,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', - '-y+0.5,x,-z+0.5', 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x,-y+0.5,z+0.5', - 'y,-x,z+0.5', '-x,-y+0.5,-z', 'y,-x,-z', 'x+0.5,y,-z', '-y+0.5,x+0.5,-z', 'x,y+0.5,z+0.5', - '-y,x,z+0.5', '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-x+0.5,-y,-z', 'y+0.5,-x+0.5,-z', - 'x,y+0.5,-z', '-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: 87 - schoenflies: C4h^5 - universal_h_m: I 4/m (a+b+1/2,-a+b,c-1/4) - P42/m(a+b,-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) - 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+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+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z', 'x+0.5,y+0.5,-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+0.5', - 'y,-x,-z', 'x+0.5,y+0.5,-z+0.5', '-y,x,-z'] - number: 84 - schoenflies: C4h^2 - universal_h_m: P 42/m (a+b,-a+b,c-1/4) - P42/m(a+b,-a+b+1/2,c): - 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) - symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', '-x+0.5,-y+0.5,-z', - 'y,-x+0.5,-z+0.5', 'x,y,-z', '-y+0.5,x,-z+0.5', 'x+0.5,y+0.5,z', '-y,x+0.5,z+0.5', - '-x,-y,z', 'y+0.5,-x,z+0.5', '-x,-y,-z', 'y+0.5,-x,-z+0.5', 'x+0.5,y+0.5,-z', - '-y,x+0.5,-z+0.5'] - ncsym: ['x,y,z', '-y,x+0.5,z+0.5', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z+0.5', '-x,-y,-z', - 'y,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z+0.5'] - number: 84 - schoenflies: C4h^2 - universal_h_m: P 42/m (a+b,-a+b+1/2,c) - I4/mmm(a+b,-a+b,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) - 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+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', - '-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', - '-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', - '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', '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', '-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', '-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', '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', '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', - '-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', - '-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', - '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'] - 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 (a+b,-a+b,c) - P4/mmm(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) - 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+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', - '-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', - '-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', - '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'] - 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 (a+b,-a+b,c) - I4/mcm(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) - symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-y,-x,-z+0.5', 'x,-y,-z+0.5', - 'y,x,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', 'y,x,z+0.5', - '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,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', '-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', '-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', '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', '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', '-y+0.5,-x,-z', 'x+0.5,-y,-z', 'y+0.5,x,-z', - '-x+0.5,y,-z', '-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', - 'y+0.5,x,z', '-x+0.5,y,z', '-y+0.5,-x,z', 'x+0.5,-y,z', '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', '-y,-x+0.5,-z', 'x,-y+0.5,-z', 'y,x+0.5,-z', - '-x,y+0.5,-z', '-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', - 'y,x+0.5,z', '-x,y+0.5,z', '-y,-x+0.5,z', 'x,-y+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 (a+b,-a+b,c) - P4/mcc(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) - symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', '-y,-x,-z+0.5', 'x,-y,-z+0.5', - 'y,x,-z+0.5', '-x,y,-z+0.5', '-x,-y,-z', 'y,-x,-z', 'x,y,-z', '-y,x,-z', 'y,x,z+0.5', - '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,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', '-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', '-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', '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'] - 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 (a+b,-a+b,c) - I4/mcm(a,b,c+1/4): - crystal_class: tetragonal - hall: -I 4 2c (x,y,z-1/4) - hermann_mauguin: I 4/m c m (a,b,c+1/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,-y,-z+0.5', 'y,-x,-z+0.5', 'x,y,-z+0.5', '-y,x,-z+0.5', '-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+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', '-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: 140 - schoenflies: D4h^18 - universal_h_m: I 4/m c m (a,b,c+1/4) - I4/mmm(a+b+1/2,-a+b,c): - 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) - symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-y,-x,-z', 'x,-y+0.5,-z', - 'y+0.5,x+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', 'y+0.5,-x,-z', 'x,y,-z', - '-y,x+0.5,-z', 'y+0.5,x+0.5,z', '-x+0.5,y,z', '-y,-x,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', - '-y+0.5,x,z', '-x,-y,z', 'y,-x+0.5,z', '-y+0.5,-x+0.5,-z', 'x+0.5,-y,-z', 'y,x,-z', - '-x,y+0.5,-z', '-x,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', 'y,x,z', - '-x,y+0.5,z', '-y+0.5,-x+0.5,z', 'x+0.5,-y,z', 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', - '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-y+0.5,-x,-z+0.5', 'x+0.5,-y+0.5,-z+0.5', - 'y,x+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,-z+0.5', 'y,-x,-z+0.5', 'x+0.5,y,-z+0.5', - '-y+0.5,x+0.5,-z+0.5', 'y,x+0.5,z+0.5', '-x,y,z+0.5', '-y+0.5,-x,z+0.5', 'x+0.5,-y+0.5,z+0.5', - 'x,y+0.5,z+0.5', '-y,x,z+0.5', '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-y,-x+0.5,-z+0.5', - 'x,-y,-z+0.5', 'y+0.5,x,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y,-z+0.5', - 'y+0.5,-x+0.5,-z+0.5', 'x,y+0.5,-z+0.5', '-y,x,-z+0.5', 'y+0.5,x,z+0.5', '-x+0.5,y+0.5,z+0.5', - '-y,-x+0.5,z+0.5', 'x,-y,z+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+0.5,-z', - 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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+0.5,z', '-y,-x,z', 'x+0.5,-y,z', 'y+0.5,x+0.5,z'] - number: 139 - schoenflies: D4h^17 - universal_h_m: I 4/m m m (a+b+1/2,-a+b,c) - P4/mmm(a+b,-a+b+1/2,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) - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', '-y+0.5,-x+0.5,-z', - 'x,-y+0.5,-z', 'y,x,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', 'y,-x+0.5,-z', 'x,y,-z', - '-y+0.5,x,-z', 'y,x,z', '-x+0.5,y,z', '-y+0.5,-x+0.5,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', - '-y,x+0.5,z', '-x,-y,z', 'y+0.5,-x,z', '-y,-x,-z', 'x+0.5,-y,-z', 'y+0.5,x+0.5,-z', - '-x,y+0.5,-z', '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', 'y+0.5,x+0.5,z', - '-x,y+0.5,z', '-y,-x,z', 'x+0.5,-y,z'] - ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', - 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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+0.5,z', '-y,-x,z', 'x+0.5,-y,z', 'y+0.5,x+0.5,z'] - number: 123 - schoenflies: D4h^1 - universal_h_m: P 4/m m m (a+b,-a+b+1/2,c) - I4/mcm(a-1/4,b-1/4,c+1/4): - 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) - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', - 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z', '-x+0.5,-y+0.5,-z+0.5', 'y,-x+0.5,-z+0.5', - 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', '-x+0.5,y,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x,-y+0.5,z+0.5', - 'y,x,z+0.5', 'x+0.5,y+0.5,z+0.5', '-y,x+0.5,z+0.5', '-x,-y,z+0.5', 'y+0.5,-x,z+0.5', - 'x+0.5,-y,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x,-z+0.5', - '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z', '-y,-x,z', - 'x+0.5,-y,z', 'y+0.5,x+0.5,z'] - ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z', - 'y,x,-z', '-x+0.5,y,-z', '-y+0.5,-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+0.5,z', '-y,-x,z', 'x+0.5,-y,z', 'y+0.5,x+0.5,z'] - number: 140 - schoenflies: D4h^18 - universal_h_m: I 4/m c m (a-1/4,b-1/4,c+1/4) - I4/mcm(a+b,-a+b,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) - 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+0.5', 'y,-x,-z+0.5', 'x,y,-z+0.5', '-y,x,-z+0.5', 'y,x,z+0.5', - '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,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', '-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', '-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', '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', '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', '-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', '-x+0.5,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y,-z', - '-y+0.5,x,-z', 'y+0.5,x,z', '-x+0.5,y,z', '-y+0.5,-x,z', 'x+0.5,-y,z', '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', '-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', '-x,-y+0.5,-z', 'y,-x+0.5,-z', 'x,y+0.5,-z', - '-y,x+0.5,-z', 'y,x+0.5,z', '-x,y+0.5,z', '-y,-x+0.5,z', 'x,-y+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+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: 140 - schoenflies: D4h^18 - universal_h_m: I 4/m c m (a+b,-a+b,c+1/4) - P4/mcc(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) - 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+0.5', 'y,-x,-z+0.5', 'x,y,-z+0.5', '-y,x,-z+0.5', 'y,x,z+0.5', - '-x,y,z+0.5', '-y,-x,z+0.5', 'x,-y,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', '-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', '-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', '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'] - 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: 124 - schoenflies: D4h^2 - universal_h_m: P 4/m c c (a+b,-a+b,c+1/4) - I4/mcm(a+b+1/2,-a+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) - hermann_mauguin: I 4/m c m (a+b+1/2,-a+b,c) - symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-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', '-x+0.5,-y+0.5,-z', - 'y+0.5,-x,-z', 'x,y,-z', '-y,x+0.5,-z', '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', 'x+0.5,y+0.5,z', '-y+0.5,x,z', '-x,-y,z', 'y,-x+0.5,z', - '-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', - '-x,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', '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', 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', - '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-y+0.5,-x,-z', 'x+0.5,-y+0.5,-z', 'y,x+0.5,-z', - '-x,y,-z', '-x,-y+0.5,-z+0.5', 'y,-x,-z+0.5', 'x+0.5,y,-z+0.5', '-y+0.5,x+0.5,-z+0.5', - 'y,x+0.5,z', '-x,y,z', '-y+0.5,-x,z', 'x+0.5,-y+0.5,z', 'x,y+0.5,z+0.5', '-y,x,z+0.5', - '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-y,-x+0.5,-z', 'x,-y,-z', 'y+0.5,x,-z', - '-x+0.5,y+0.5,-z', '-x+0.5,-y,-z+0.5', 'y+0.5,-x+0.5,-z+0.5', 'x,y+0.5,-z+0.5', - '-y,x,-z+0.5', 'y+0.5,x,z', '-x+0.5,y+0.5,z', '-y,-x+0.5,z', 'x,-y,z'] - ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', - 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', - 'y+0.5,x+0.5,z+0.5'] - number: 140 - schoenflies: D4h^18 - universal_h_m: I 4/m c m (a+b+1/2,-a+b,c) - P4/mcc(a+b,-a+b+1/2,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) - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', '-y+0.5,-x+0.5,-z+0.5', - 'x,-y+0.5,-z+0.5', 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z', 'y,-x+0.5,-z', - 'x,y,-z', '-y+0.5,x,-z', 'y,x,z+0.5', '-x+0.5,y,z+0.5', '-y+0.5,-x+0.5,z+0.5', - 'x,-y+0.5,z+0.5', 'x+0.5,y+0.5,z', '-y,x+0.5,z', '-x,-y,z', 'y+0.5,-x,z', '-y,-x,-z+0.5', - 'x+0.5,-y,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', - 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', 'y+0.5,x+0.5,z+0.5', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', - 'x+0.5,-y,z+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+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', - 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', - 'y+0.5,x+0.5,z+0.5'] - number: 124 - schoenflies: D4h^2 - universal_h_m: P 4/m c c (a+b,-a+b+1/2,c) - I4/mmm(a-1/4,b-1/4,c+1/4): - 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) - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', - 'y,-x+0.5,-z+0.5', 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', '-x+0.5,y,z', '-y+0.5,-x+0.5,z', - 'x,-y+0.5,z', 'y,x,z', 'x+0.5,y+0.5,z+0.5', '-y,x+0.5,z+0.5', '-x,-y,z+0.5', - 'y+0.5,-x,z+0.5', 'x+0.5,-y,-z', 'y+0.5,x+0.5,-z', '-x,y+0.5,-z', '-y,-x,-z', - '-x,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', - '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', 'y+0.5,x+0.5,z+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+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z', - 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', - 'y+0.5,x+0.5,z+0.5'] - number: 139 - schoenflies: D4h^17 - universal_h_m: I 4/m m m (a-1/4,b-1/4,c+1/4) - I4/mmm(a+1/2,b,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) - symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,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', '-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', '-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+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+0.5', '-y,-x,z+0.5', - 'x+0.5,-y+0.5,z+0.5', 'y,x,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', - '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: 139 - schoenflies: D4h^17 - universal_h_m: I 4/m m m (a+1/2,b,c-1/4) - I4/mcm(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) - symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x,-y,-z', 'y+0.5,x+0.5,-z', - '-x,y,-z', '-y+0.5,-x+0.5,-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', '-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', - '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+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+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+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: 140 - schoenflies: D4h^18 - universal_h_m: I 4/m c m (a+1/2,b,c+1/4) - P42/mcm(a+b,-a+b,c): - 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) - symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-y,-x,-z+0.5', 'x,-y,-z', - 'y,x,-z+0.5', '-x,y,-z', '-x,-y,-z', 'y,-x,-z+0.5', 'x,y,-z', '-y,x,-z+0.5', - 'y,x,z+0.5', '-x,y,z', '-y,-x,z+0.5', 'x,-y,z', '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', '-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+0.5,y+0.5,-z', '-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', '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+0.5,-y+0.5,z'] - 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: 132 - schoenflies: D4h^10 - universal_h_m: P 42/m c m (a+b,-a+b,c) - I4/mmm(a+1/2,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) - symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,z', 'x,-y,-z', 'y+0.5,x+0.5,-z', - '-x,y,-z', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y+0.5,-x+0.5,-z', 'x,y,-z', '-y+0.5,x+0.5,-z', - '-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+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+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+0.5', '-y,-x,z+0.5', 'x+0.5,-y+0.5,z+0.5', - '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: 139 - schoenflies: D4h^17 - universal_h_m: I 4/m m m (a+1/2,b,c) - P42/mmc(a+b,-a+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) - symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-y,-x,-z', 'x,-y,-z+0.5', - 'y,x,-z', '-x,y,-z+0.5', '-x,-y,-z', 'y,-x,-z+0.5', 'x,y,-z', '-y,x,-z+0.5', - 'y,x,z', '-x,y,z+0.5', '-y,-x,z', 'x,-y,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', '-y+0.5,-x+0.5,-z', 'x+0.5,-y+0.5,-z+0.5', - 'y+0.5,x+0.5,-z', '-x+0.5,y+0.5,-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', 'y+0.5,x+0.5,z', '-x+0.5,y+0.5,z+0.5', - '-y+0.5,-x+0.5,z', 'x+0.5,-y+0.5,z+0.5'] - 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: 131 - schoenflies: D4h^9 - universal_h_m: P 42/m m c (a+b,-a+b,c) - I4/mcm(a+1/2,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) - symops: ['x,y,z', '-y+0.5,x+0.5,z', '-x,-y,z', 'y+0.5,-x+0.5,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', '-x,-y,-z', 'y+0.5,-x+0.5,-z', - 'x,y,-z', '-y+0.5,x+0.5,-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', '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+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'] - 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: 140 - schoenflies: D4h^18 - universal_h_m: I 4/m c m (a+1/2,b,c) - I4/mcm(a+b+1/2,-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-1/4) - hermann_mauguin: I 4/m c m (a+b+1/2,-a+b,c+1/4) - symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-y,-x,-z', 'x,-y+0.5,-z', - 'y+0.5,x+0.5,-z', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x,-z+0.5', - 'x,y,-z+0.5', '-y,x+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', 'x+0.5,y+0.5,z', '-y+0.5,x,z', '-x,-y,z', 'y,-x+0.5,z', '-y+0.5,-x+0.5,-z', - 'x+0.5,-y,-z', 'y,x,-z', '-x,y+0.5,-z', '-x,-y,-z+0.5', 'y,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', - '-y+0.5,x,-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', - 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-y+0.5,-x,-z+0.5', - 'x+0.5,-y+0.5,-z+0.5', 'y,x+0.5,-z+0.5', '-x,y,-z+0.5', '-x,-y+0.5,-z', 'y,-x,-z', - 'x+0.5,y,-z', '-y+0.5,x+0.5,-z', 'y,x+0.5,z', '-x,y,z', '-y+0.5,-x,z', 'x+0.5,-y+0.5,z', - 'x,y+0.5,z+0.5', '-y,x,z+0.5', '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-y,-x+0.5,-z+0.5', - 'x,-y,-z+0.5', 'y+0.5,x,-z+0.5', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y,-z', 'y+0.5,-x+0.5,-z', - 'x,y+0.5,-z', '-y,x,-z', 'y+0.5,x,z', '-x+0.5,y+0.5,z', '-y,-x+0.5,z', 'x,-y,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+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: 140 - schoenflies: D4h^18 - universal_h_m: I 4/m c m (a+b+1/2,-a+b,c+1/4) - P42/mcm(a+b,-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) - symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-y,-x,-z', 'x,-y,-z+0.5', - 'y,x,-z', '-x,y,-z+0.5', '-x,-y,-z+0.5', 'y,-x,-z', 'x,y,-z+0.5', '-y,x,-z', - 'y,x,z+0.5', '-x,y,z', '-y,-x,z+0.5', 'x,-y,z', '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', '-y+0.5,-x+0.5,-z', 'x+0.5,-y+0.5,-z+0.5', - 'y+0.5,x+0.5,-z', '-x+0.5,y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z', - 'x+0.5,y+0.5,-z+0.5', '-y+0.5,x+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+0.5,-y+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,-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: 132 - schoenflies: D4h^10 - universal_h_m: P 42/m c m (a+b,-a+b,c+1/4) - P42/mcm(a+b,-a+b+1/2,c): - 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) - symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', '-y+0.5,-x+0.5,-z+0.5', - 'x,-y+0.5,-z', 'y,x,-z+0.5', '-x+0.5,y,-z', '-x+0.5,-y+0.5,-z', 'y,-x+0.5,-z+0.5', - 'x,y,-z', '-y+0.5,x,-z+0.5', 'y,x,z+0.5', '-x+0.5,y,z', '-y+0.5,-x+0.5,z+0.5', - 'x,-y+0.5,z', 'x+0.5,y+0.5,z', '-y,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x,z+0.5', - '-y,-x,-z+0.5', 'x+0.5,-y,-z', 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z', '-x,-y,-z', - 'y+0.5,-x,-z+0.5', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', 'y+0.5,x+0.5,z+0.5', - '-x,y+0.5,z', '-y,-x,z+0.5', 'x+0.5,-y,z'] - ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z', - 'y,x,-z+0.5', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z+0.5', - 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', '-x,y+0.5,z', '-y,-x,z+0.5', 'x+0.5,-y,z', - 'y+0.5,x+0.5,z+0.5'] - number: 132 - schoenflies: D4h^10 - universal_h_m: P 42/m c m (a+b,-a+b+1/2,c) - I4/mcm(a+1/4,b-1/4,c+1/4): - 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) - symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', 'x,-y+0.5,-z', - 'y+0.5,x+0.5,-z', '-x+0.5,y,-z', '-y,-x,-z', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x,-z+0.5', - 'x,y,-z+0.5', '-y,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+0.5,z+0.5', '-y+0.5,x,z+0.5', '-x,-y,z+0.5', 'y,-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,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', '-x,y+0.5,z', '-y+0.5,-x+0.5,z', - 'x+0.5,-y,z', 'y,x,z'] - ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z', - 'y,x,-z+0.5', '-x+0.5,y,-z', '-y+0.5,-x+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z+0.5', - 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', '-x,y+0.5,z', '-y,-x,z+0.5', 'x+0.5,-y,z', - 'y+0.5,x+0.5,z+0.5'] - number: 140 - schoenflies: D4h^18 - universal_h_m: I 4/m c m (a+1/4,b-1/4,c+1/4) - I4/mmm(a+b+1/2,-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+1/4) - hermann_mauguin: I 4/m m m (a+b+1/2,-a+b,c-1/4) - symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '-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', '-x+0.5,-y+0.5,-z+0.5', - 'y+0.5,-x,-z+0.5', 'x,y,-z+0.5', '-y,x+0.5,-z+0.5', 'y+0.5,x+0.5,z', '-x+0.5,y,z', - '-y,-x,z', 'x,-y+0.5,z', 'x+0.5,y+0.5,z', '-y+0.5,x,z', '-x,-y,z', 'y,-x+0.5,z', - '-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', - '-x,-y,-z+0.5', 'y,-x+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-y+0.5,x,-z+0.5', - 'y,x,z', '-x,y+0.5,z', '-y+0.5,-x+0.5,z', 'x+0.5,-y,z', 'x+0.5,y,z+0.5', '-y+0.5,x+0.5,z+0.5', - '-x,-y+0.5,z+0.5', 'y,-x,z+0.5', '-y+0.5,-x,-z', 'x+0.5,-y+0.5,-z', 'y,x+0.5,-z', - '-x,y,-z', '-x,-y+0.5,-z', 'y,-x,-z', 'x+0.5,y,-z', '-y+0.5,x+0.5,-z', 'y,x+0.5,z+0.5', - '-x,y,z+0.5', '-y+0.5,-x,z+0.5', 'x+0.5,-y+0.5,z+0.5', 'x,y+0.5,z+0.5', '-y,x,z+0.5', - '-x+0.5,-y,z+0.5', 'y+0.5,-x+0.5,z+0.5', '-y,-x+0.5,-z', 'x,-y,-z', 'y+0.5,x,-z', - '-x+0.5,y+0.5,-z', '-x+0.5,-y,-z', 'y+0.5,-x+0.5,-z', 'x,y+0.5,-z', '-y,x,-z', - 'y+0.5,x,z+0.5', '-x+0.5,y+0.5,z+0.5', '-y,-x+0.5,z+0.5', 'x,-y,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', - '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: 139 - schoenflies: D4h^17 - universal_h_m: I 4/m m m (a+b+1/2,-a+b,c-1/4) - P42/mmc(a+b,-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) - symops: ['x,y,z', '-y,x,z+0.5', '-x,-y,z', 'y,-x,z+0.5', '-y,-x,-z+0.5', 'x,-y,-z', - 'y,x,-z+0.5', '-x,y,-z', '-x,-y,-z+0.5', 'y,-x,-z', 'x,y,-z+0.5', '-y,x,-z', - 'y,x,z', '-x,y,z+0.5', '-y,-x,z', 'x,-y,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', '-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+0.5,y+0.5,-z', '-x+0.5,-y+0.5,-z+0.5', 'y+0.5,-x+0.5,-z', - 'x+0.5,y+0.5,-z+0.5', '-y+0.5,x+0.5,-z', 'y+0.5,x+0.5,z', '-x+0.5,y+0.5,z+0.5', - '-y+0.5,-x+0.5,z', 'x+0.5,-y+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,-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: 131 - schoenflies: D4h^9 - universal_h_m: P 42/m m c (a+b,-a+b,c-1/4) - P42/mmc(a+b,-a+b+1/2,c): - 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) - symops: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', '-y+0.5,-x+0.5,-z', - 'x,-y+0.5,-z+0.5', 'y,x,-z', '-x+0.5,y,-z+0.5', '-x+0.5,-y+0.5,-z', 'y,-x+0.5,-z+0.5', - 'x,y,-z', '-y+0.5,x,-z+0.5', 'y,x,z', '-x+0.5,y,z+0.5', '-y+0.5,-x+0.5,z', 'x,-y+0.5,z+0.5', - 'x+0.5,y+0.5,z', '-y,x+0.5,z+0.5', '-x,-y,z', 'y+0.5,-x,z+0.5', '-y,-x,-z', - 'x+0.5,-y,-z+0.5', 'y+0.5,x+0.5,-z', '-x,y+0.5,-z+0.5', '-x,-y,-z', 'y+0.5,-x,-z+0.5', - 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', 'y+0.5,x+0.5,z', '-x,y+0.5,z+0.5', '-y,-x,z', - 'x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z+0.5', - 'y,x,-z', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y+0.5,-x,-z+0.5', - 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', '-x,y+0.5,z+0.5', '-y,-x,z', 'x+0.5,-y,z+0.5', - 'y+0.5,x+0.5,z'] - number: 131 - schoenflies: D4h^9 - universal_h_m: P 42/m m c (a+b,-a+b+1/2,c) - I4/mmm(a+1/4,b-1/4,c+1/4): - 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) - symops: ['x,y,z', '-y,x+0.5,z', '-x+0.5,-y+0.5,z', 'y+0.5,-x,z', '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+0.5,-y+0.5,-z+0.5', - 'y+0.5,-x,-z+0.5', 'x,y,-z+0.5', '-y,x+0.5,-z+0.5', '-x+0.5,y,z', '-y,-x,z', - 'x,-y+0.5,z', 'y+0.5,x+0.5,z', 'x+0.5,y+0.5,z+0.5', '-y+0.5,x,z+0.5', '-x,-y,z+0.5', - 'y,-x+0.5,z+0.5', 'x+0.5,-y,-z', 'y,x,-z', '-x,y+0.5,-z', '-y+0.5,-x+0.5,-z', - '-x,-y,-z', 'y,-x+0.5,-z', 'x+0.5,y+0.5,-z', '-y+0.5,x,-z', '-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'] - ncsym: ['x,y,z', '-y+0.5,x,z+0.5', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z+0.5', 'x,-y+0.5,-z+0.5', - 'y,x,-z', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z', '-x,-y,-z', 'y+0.5,-x,-z+0.5', - 'x+0.5,y+0.5,-z', '-y,x+0.5,-z+0.5', '-x,y+0.5,z+0.5', '-y,-x,z', 'x+0.5,-y,z+0.5', - 'y+0.5,x+0.5,z'] - number: 139 - schoenflies: D4h^17 - universal_h_m: I 4/m m m (a+1/4,b-1/4,c+1/4) - P6/m(2*a,2*b,2*c): - 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) - 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+0.5,y,z', 'x-y+0.5,x,z', - '-y+0.5,x-y,z', '-x+0.5,-y,z', '-x+y+0.5,-x,z', 'y+0.5,-x+y,z', '-x+0.5,-y,-z', - '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', - 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', '-x,-y+0.5,z', '-x+y,-x+0.5,z', - 'y,-x+y+0.5,z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', 'x,y+0.5,-z', - 'x-y,x+0.5,-z', '-y,x-y+0.5,-z', 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', - '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z', '-x+0.5,-y+0.5,-z', - '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', - '-y+0.5,x-y+0.5,-z', 'x,y,z+0.5', 'x-y,x,z+0.5', '-y,x-y,z+0.5', '-x,-y,z+0.5', - '-x+y,-x,z+0.5', 'y,-x+y,z+0.5', '-x,-y,-z+0.5', '-x+y,-x,-z+0.5', 'y,-x+y,-z+0.5', - 'x,y,-z+0.5', 'x-y,x,-z+0.5', '-y,x-y,-z+0.5', 'x+0.5,y,z+0.5', 'x-y+0.5,x,z+0.5', - '-y+0.5,x-y,z+0.5', '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z+0.5', 'y+0.5,-x+y,z+0.5', - '-x+0.5,-y,-z+0.5', '-x+y+0.5,-x,-z+0.5', 'y+0.5,-x+y,-z+0.5', 'x+0.5,y,-z+0.5', - 'x-y+0.5,x,-z+0.5', '-y+0.5,x-y,-z+0.5', 'x,y+0.5,z+0.5', 'x-y,x+0.5,z+0.5', - '-y,x-y+0.5,z+0.5', '-x,-y+0.5,z+0.5', '-x+y,-x+0.5,z+0.5', 'y,-x+y+0.5,z+0.5', - '-x,-y+0.5,-z+0.5', '-x+y,-x+0.5,-z+0.5', 'y,-x+y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', - 'x-y,x+0.5,-z+0.5', '-y,x-y+0.5,-z+0.5', 'x+0.5,y+0.5,z+0.5', 'x-y+0.5,x+0.5,z+0.5', - '-y+0.5,x-y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', '-x+y+0.5,-x+0.5,z+0.5', 'y+0.5,-x+y+0.5,z+0.5', - '-x+0.5,-y+0.5,-z+0.5', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', - 'x-y+0.5,x+0.5,-z+0.5', '-y+0.5,x-y+0.5,-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', '-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 (2*a,2*b,2*c) - P6/m(2*a,2*b,c): - crystal_class: hexagonal - hall: -P 6 (1/2*x,1/2*y,z) - hermann_mauguin: P 6/m (2*a,2*b,c) - 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+0.5,y,z', 'x-y+0.5,x,z', - '-y+0.5,x-y,z', '-x+0.5,-y,z', '-x+y+0.5,-x,z', 'y+0.5,-x+y,z', '-x+0.5,-y,-z', - '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', - 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', '-x,-y+0.5,z', '-x+y,-x+0.5,z', - 'y,-x+y+0.5,z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', 'x,y+0.5,-z', - 'x-y,x+0.5,-z', '-y,x-y+0.5,-z', 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', - '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z', '-x+0.5,-y+0.5,-z', - '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', - '-y+0.5,x-y+0.5,-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 (2*a,2*b,c) - P63/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) - 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', - 'x+0.5,y,z', 'x-y+0.5,x,z+0.5', '-y+0.5,x-y,z', '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z', - 'y+0.5,-x+y,z+0.5', '-x+0.5,-y,-z', '-x+y+0.5,-x,-z+0.5', 'y+0.5,-x+y,-z', 'x+0.5,y,-z+0.5', - 'x-y+0.5,x,-z', '-y+0.5,x-y,-z+0.5', 'x,y+0.5,z', 'x-y,x+0.5,z+0.5', '-y,x-y+0.5,z', - '-x,-y+0.5,z+0.5', '-x+y,-x+0.5,z', 'y,-x+y+0.5,z+0.5', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z+0.5', - 'y,-x+y+0.5,-z', 'x,y+0.5,-z+0.5', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z+0.5', 'x+0.5,y+0.5,z', - 'x-y+0.5,x+0.5,z+0.5', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z+0.5', '-x+y+0.5,-x+0.5,z', - 'y+0.5,-x+y+0.5,z+0.5', '-x+0.5,-y+0.5,-z', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z', - 'x+0.5,y+0.5,-z+0.5', 'x-y+0.5,x+0.5,-z', '-y+0.5,x-y+0.5,-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 (2*a,2*b,c) - P6/mmm(2*a,2*b,2*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) - 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+0.5,y,z', 'x-y+0.5,x,z', '-y+0.5,x-y,z', - '-x+0.5,-y,z', '-x+y+0.5,-x,z', 'y+0.5,-x+y,z', '-y+0.5,-x,-z', 'x-y+0.5,-y,-z', - 'x+0.5,x-y,-z', 'y+0.5,x,-z', '-x+y+0.5,y,-z', '-x+0.5,-x+y,-z', '-x+0.5,-y,-z', - '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', - 'y+0.5,x,z', '-x+y+0.5,y,z', '-x+0.5,-x+y,z', '-y+0.5,-x,z', 'x-y+0.5,-y,z', - 'x+0.5,x-y,z', 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', '-x,-y+0.5,z', '-x+y,-x+0.5,z', - 'y,-x+y+0.5,z', '-y,-x+0.5,-z', 'x-y,-y+0.5,-z', 'x,x-y+0.5,-z', 'y,x+0.5,-z', - '-x+y,y+0.5,-z', '-x,-x+y+0.5,-z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', - 'x,y+0.5,-z', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z', 'y,x+0.5,z', '-x+y,y+0.5,z', - '-x,-x+y+0.5,z', '-y,-x+0.5,z', 'x-y,-y+0.5,z', 'x,x-y+0.5,z', 'x+0.5,y+0.5,z', - 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', - 'y+0.5,-x+y+0.5,z', '-y+0.5,-x+0.5,-z', 'x-y+0.5,-y+0.5,-z', 'x+0.5,x-y+0.5,-z', - 'y+0.5,x+0.5,-z', '-x+y+0.5,y+0.5,-z', '-x+0.5,-x+y+0.5,-z', '-x+0.5,-y+0.5,-z', - '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', - '-y+0.5,x-y+0.5,-z', 'y+0.5,x+0.5,z', '-x+y+0.5,y+0.5,z', '-x+0.5,-x+y+0.5,z', - '-y+0.5,-x+0.5,z', 'x-y+0.5,-y+0.5,z', 'x+0.5,x-y+0.5,z', 'x,y,z+0.5', 'x-y,x,z+0.5', - '-y,x-y,z+0.5', '-x,-y,z+0.5', '-x+y,-x,z+0.5', 'y,-x+y,z+0.5', '-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+0.5', '-x+y,-x,-z+0.5', 'y,-x+y,-z+0.5', 'x,y,-z+0.5', 'x-y,x,-z+0.5', - '-y,x-y,-z+0.5', '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+0.5,y,z+0.5', 'x-y+0.5,x,z+0.5', '-y+0.5,x-y,z+0.5', - '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z+0.5', 'y+0.5,-x+y,z+0.5', '-y+0.5,-x,-z+0.5', - 'x-y+0.5,-y,-z+0.5', 'x+0.5,x-y,-z+0.5', 'y+0.5,x,-z+0.5', '-x+y+0.5,y,-z+0.5', - '-x+0.5,-x+y,-z+0.5', '-x+0.5,-y,-z+0.5', '-x+y+0.5,-x,-z+0.5', 'y+0.5,-x+y,-z+0.5', - 'x+0.5,y,-z+0.5', 'x-y+0.5,x,-z+0.5', '-y+0.5,x-y,-z+0.5', 'y+0.5,x,z+0.5', - '-x+y+0.5,y,z+0.5', '-x+0.5,-x+y,z+0.5', '-y+0.5,-x,z+0.5', 'x-y+0.5,-y,z+0.5', - 'x+0.5,x-y,z+0.5', 'x,y+0.5,z+0.5', 'x-y,x+0.5,z+0.5', '-y,x-y+0.5,z+0.5', '-x,-y+0.5,z+0.5', - '-x+y,-x+0.5,z+0.5', 'y,-x+y+0.5,z+0.5', '-y,-x+0.5,-z+0.5', 'x-y,-y+0.5,-z+0.5', - 'x,x-y+0.5,-z+0.5', 'y,x+0.5,-z+0.5', '-x+y,y+0.5,-z+0.5', '-x,-x+y+0.5,-z+0.5', - '-x,-y+0.5,-z+0.5', '-x+y,-x+0.5,-z+0.5', 'y,-x+y+0.5,-z+0.5', 'x,y+0.5,-z+0.5', - 'x-y,x+0.5,-z+0.5', '-y,x-y+0.5,-z+0.5', 'y,x+0.5,z+0.5', '-x+y,y+0.5,z+0.5', - '-x,-x+y+0.5,z+0.5', '-y,-x+0.5,z+0.5', 'x-y,-y+0.5,z+0.5', 'x,x-y+0.5,z+0.5', - 'x+0.5,y+0.5,z+0.5', 'x-y+0.5,x+0.5,z+0.5', '-y+0.5,x-y+0.5,z+0.5', '-x+0.5,-y+0.5,z+0.5', - '-x+y+0.5,-x+0.5,z+0.5', 'y+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'x-y+0.5,-y+0.5,-z+0.5', - 'x+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x+y+0.5,y+0.5,-z+0.5', '-x+0.5,-x+y+0.5,-z+0.5', - '-x+0.5,-y+0.5,-z+0.5', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z+0.5', 'x+0.5,y+0.5,-z+0.5', - 'x-y+0.5,x+0.5,-z+0.5', '-y+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,z+0.5', '-x+y+0.5,y+0.5,z+0.5', - '-x+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x-y+0.5,-y+0.5,z+0.5', 'x+0.5,x-y+0.5,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', - '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 (2*a,2*b,2*c) - P6/mmm(2*a,2*b,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) - 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+0.5,y,z', 'x-y+0.5,x,z', '-y+0.5,x-y,z', - '-x+0.5,-y,z', '-x+y+0.5,-x,z', 'y+0.5,-x+y,z', '-y+0.5,-x,-z', 'x-y+0.5,-y,-z', - 'x+0.5,x-y,-z', 'y+0.5,x,-z', '-x+y+0.5,y,-z', '-x+0.5,-x+y,-z', '-x+0.5,-y,-z', - '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', - 'y+0.5,x,z', '-x+y+0.5,y,z', '-x+0.5,-x+y,z', '-y+0.5,-x,z', 'x-y+0.5,-y,z', - 'x+0.5,x-y,z', 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', '-x,-y+0.5,z', '-x+y,-x+0.5,z', - 'y,-x+y+0.5,z', '-y,-x+0.5,-z', 'x-y,-y+0.5,-z', 'x,x-y+0.5,-z', 'y,x+0.5,-z', - '-x+y,y+0.5,-z', '-x,-x+y+0.5,-z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', - 'x,y+0.5,-z', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z', 'y,x+0.5,z', '-x+y,y+0.5,z', - '-x,-x+y+0.5,z', '-y,-x+0.5,z', 'x-y,-y+0.5,z', 'x,x-y+0.5,z', 'x+0.5,y+0.5,z', - 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', - 'y+0.5,-x+y+0.5,z', '-y+0.5,-x+0.5,-z', 'x-y+0.5,-y+0.5,-z', 'x+0.5,x-y+0.5,-z', - 'y+0.5,x+0.5,-z', '-x+y+0.5,y+0.5,-z', '-x+0.5,-x+y+0.5,-z', '-x+0.5,-y+0.5,-z', - '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', - '-y+0.5,x-y+0.5,-z', 'y+0.5,x+0.5,z', '-x+y+0.5,y+0.5,z', '-x+0.5,-x+y+0.5,z', - '-y+0.5,-x+0.5,z', 'x-y+0.5,-y+0.5,z', 'x+0.5,x-y+0.5,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 (2*a,2*b,c) - P6/mcc(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) - 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', - 'x+0.5,y,z', 'x-y+0.5,x,z', '-y+0.5,x-y,z', '-x+0.5,-y,z', '-x+y+0.5,-x,z', - 'y+0.5,-x+y,z', '-y+0.5,-x,-z+0.5', 'x-y+0.5,-y,-z+0.5', 'x+0.5,x-y,-z+0.5', - 'y+0.5,x,-z+0.5', '-x+y+0.5,y,-z+0.5', '-x+0.5,-x+y,-z+0.5', '-x+0.5,-y,-z', - '-x+y+0.5,-x,-z', 'y+0.5,-x+y,-z', 'x+0.5,y,-z', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z', - 'y+0.5,x,z+0.5', '-x+y+0.5,y,z+0.5', '-x+0.5,-x+y,z+0.5', '-y+0.5,-x,z+0.5', - 'x-y+0.5,-y,z+0.5', 'x+0.5,x-y,z+0.5', 'x,y+0.5,z', 'x-y,x+0.5,z', '-y,x-y+0.5,z', - '-x,-y+0.5,z', '-x+y,-x+0.5,z', 'y,-x+y+0.5,z', '-y,-x+0.5,-z+0.5', 'x-y,-y+0.5,-z+0.5', - 'x,x-y+0.5,-z+0.5', 'y,x+0.5,-z+0.5', '-x+y,y+0.5,-z+0.5', '-x,-x+y+0.5,-z+0.5', - '-x,-y+0.5,-z', '-x+y,-x+0.5,-z', 'y,-x+y+0.5,-z', 'x,y+0.5,-z', 'x-y,x+0.5,-z', - '-y,x-y+0.5,-z', 'y,x+0.5,z+0.5', '-x+y,y+0.5,z+0.5', '-x,-x+y+0.5,z+0.5', '-y,-x+0.5,z+0.5', - 'x-y,-y+0.5,z+0.5', 'x,x-y+0.5,z+0.5', 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z', '-y+0.5,x-y+0.5,z', - '-x+0.5,-y+0.5,z', '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z', '-y+0.5,-x+0.5,-z+0.5', - 'x-y+0.5,-y+0.5,-z+0.5', 'x+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x+y+0.5,y+0.5,-z+0.5', - '-x+0.5,-x+y+0.5,-z+0.5', '-x+0.5,-y+0.5,-z', '-x+y+0.5,-x+0.5,-z', 'y+0.5,-x+y+0.5,-z', - 'x+0.5,y+0.5,-z', 'x-y+0.5,x+0.5,-z', '-y+0.5,x-y+0.5,-z', 'y+0.5,x+0.5,z+0.5', - '-x+y+0.5,y+0.5,z+0.5', '-x+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,z+0.5', 'x-y+0.5,-y+0.5,z+0.5', - 'x+0.5,x-y+0.5,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 (2*a,2*b,c) - P63/mcm(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) - 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', - 'x+0.5,y,z', 'x-y+0.5,x,z+0.5', '-y+0.5,x-y,z', '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z', - 'y+0.5,-x+y,z+0.5', '-y+0.5,-x,-z', 'x-y+0.5,-y,-z+0.5', 'x+0.5,x-y,-z', 'y+0.5,x,-z+0.5', - '-x+y+0.5,y,-z', '-x+0.5,-x+y,-z+0.5', '-x+0.5,-y,-z', '-x+y+0.5,-x,-z+0.5', - 'y+0.5,-x+y,-z', 'x+0.5,y,-z+0.5', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z+0.5', 'y+0.5,x,z', - '-x+y+0.5,y,z+0.5', '-x+0.5,-x+y,z', '-y+0.5,-x,z+0.5', 'x-y+0.5,-y,z', 'x+0.5,x-y,z+0.5', - 'x,y+0.5,z', 'x-y,x+0.5,z+0.5', '-y,x-y+0.5,z', '-x,-y+0.5,z+0.5', '-x+y,-x+0.5,z', - 'y,-x+y+0.5,z+0.5', '-y,-x+0.5,-z', 'x-y,-y+0.5,-z+0.5', 'x,x-y+0.5,-z', 'y,x+0.5,-z+0.5', - '-x+y,y+0.5,-z', '-x,-x+y+0.5,-z+0.5', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z+0.5', - 'y,-x+y+0.5,-z', 'x,y+0.5,-z+0.5', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z+0.5', 'y,x+0.5,z', - '-x+y,y+0.5,z+0.5', '-x,-x+y+0.5,z', '-y,-x+0.5,z+0.5', 'x-y,-y+0.5,z', 'x,x-y+0.5,z+0.5', - 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z+0.5', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z+0.5', - '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,-z', 'x-y+0.5,-y+0.5,-z+0.5', - 'x+0.5,x-y+0.5,-z', 'y+0.5,x+0.5,-z+0.5', '-x+y+0.5,y+0.5,-z', '-x+0.5,-x+y+0.5,-z+0.5', - '-x+0.5,-y+0.5,-z', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z+0.5', - 'x-y+0.5,x+0.5,-z', '-y+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,z', '-x+y+0.5,y+0.5,z+0.5', - '-x+0.5,-x+y+0.5,z', '-y+0.5,-x+0.5,z+0.5', 'x-y+0.5,-y+0.5,z', 'x+0.5,x-y+0.5,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 (2*a,2*b,c) - P63/mmc(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) - 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', - 'x+0.5,y,z', 'x-y+0.5,x,z+0.5', '-y+0.5,x-y,z', '-x+0.5,-y,z+0.5', '-x+y+0.5,-x,z', - 'y+0.5,-x+y,z+0.5', '-y+0.5,-x,-z+0.5', 'x-y+0.5,-y,-z', 'x+0.5,x-y,-z+0.5', - 'y+0.5,x,-z', '-x+y+0.5,y,-z+0.5', '-x+0.5,-x+y,-z', '-x+0.5,-y,-z', '-x+y+0.5,-x,-z+0.5', - 'y+0.5,-x+y,-z', 'x+0.5,y,-z+0.5', 'x-y+0.5,x,-z', '-y+0.5,x-y,-z+0.5', 'y+0.5,x,z+0.5', - '-x+y+0.5,y,z', '-x+0.5,-x+y,z+0.5', '-y+0.5,-x,z', 'x-y+0.5,-y,z+0.5', 'x+0.5,x-y,z', - 'x,y+0.5,z', 'x-y,x+0.5,z+0.5', '-y,x-y+0.5,z', '-x,-y+0.5,z+0.5', '-x+y,-x+0.5,z', - 'y,-x+y+0.5,z+0.5', '-y,-x+0.5,-z+0.5', 'x-y,-y+0.5,-z', 'x,x-y+0.5,-z+0.5', - 'y,x+0.5,-z', '-x+y,y+0.5,-z+0.5', '-x,-x+y+0.5,-z', '-x,-y+0.5,-z', '-x+y,-x+0.5,-z+0.5', - 'y,-x+y+0.5,-z', 'x,y+0.5,-z+0.5', 'x-y,x+0.5,-z', '-y,x-y+0.5,-z+0.5', 'y,x+0.5,z+0.5', - '-x+y,y+0.5,z', '-x,-x+y+0.5,z+0.5', '-y,-x+0.5,z', 'x-y,-y+0.5,z+0.5', 'x,x-y+0.5,z', - 'x+0.5,y+0.5,z', 'x-y+0.5,x+0.5,z+0.5', '-y+0.5,x-y+0.5,z', '-x+0.5,-y+0.5,z+0.5', - '-x+y+0.5,-x+0.5,z', 'y+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'x-y+0.5,-y+0.5,-z', - 'x+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,-z', '-x+y+0.5,y+0.5,-z+0.5', '-x+0.5,-x+y+0.5,-z', - '-x+0.5,-y+0.5,-z', '-x+y+0.5,-x+0.5,-z+0.5', 'y+0.5,-x+y+0.5,-z', 'x+0.5,y+0.5,-z+0.5', - 'x-y+0.5,x+0.5,-z', '-y+0.5,x-y+0.5,-z+0.5', 'y+0.5,x+0.5,z+0.5', '-x+y+0.5,y+0.5,z', - '-x+0.5,-x+y+0.5,z+0.5', '-y+0.5,-x+0.5,z', 'x-y+0.5,-y+0.5,z+0.5', 'x+0.5,x-y+0.5,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 (2*a,2*b,c) - Fm-3(a-1/4,b-1/4,c-1/4): - 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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', - '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', - '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x+0.5,-y+0.5,-z+0.5', 'x,y,-z+0.5', - '-x+0.5,y,z', 'x,-y+0.5,z', '-z+0.5,-x+0.5,-y+0.5', 'z,x,-y+0.5', '-z+0.5,x,y', - 'z,-x+0.5,y', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z,x', 'y,-z+0.5,x', 'y,z,-x+0.5', - 'x,y+0.5,z+0.5', '-x+0.5,-y,z+0.5', 'x,-y,-z', '-x+0.5,y+0.5,-z', 'z,x+0.5,y+0.5', - '-z+0.5,-x,y+0.5', 'z,-x,-y', '-z+0.5,x+0.5,-y', 'y,z+0.5,x+0.5', 'y,-z,-x', - '-y+0.5,z+0.5,-x', '-y+0.5,-z,x+0.5', '-x+0.5,-y,-z', 'x,y+0.5,-z', '-x+0.5,y+0.5,z+0.5', - 'x,-y,z+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', - '-y+0.5,-z,-x', '-y+0.5,z+0.5,x+0.5', 'y,-z,x+0.5', 'y,z+0.5,-x', 'x+0.5,y,z+0.5', - '-x,-y+0.5,z+0.5', 'x+0.5,-y+0.5,-z', '-x,y,-z', 'z+0.5,x,y+0.5', '-z,-x+0.5,y+0.5', - 'z+0.5,-x+0.5,-y', '-z,x,-y', 'y+0.5,z,x+0.5', 'y+0.5,-z+0.5,-x', '-y,z,-x', - '-y,-z+0.5,x+0.5', '-x,-y+0.5,-z', 'x+0.5,y,-z', '-x,y,z+0.5', 'x+0.5,-y+0.5,z+0.5', - '-z,-x+0.5,-y', 'z+0.5,x,-y', '-z,x,y+0.5', 'z+0.5,-x+0.5,y+0.5', '-y,-z+0.5,-x', - '-y,z,x+0.5', 'y+0.5,-z+0.5,x+0.5', 'y+0.5,z,-x', 'x+0.5,y+0.5,z', '-x,-y,z', - 'x+0.5,-y,-z+0.5', '-x,y+0.5,-z+0.5', 'z+0.5,x+0.5,y', '-z,-x,y', 'z+0.5,-x,-y+0.5', - '-z,x+0.5,-y+0.5', 'y+0.5,z+0.5,x', 'y+0.5,-z,-x+0.5', '-y,z+0.5,-x+0.5', '-y,-z,x', - '-x,-y,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-x,y+0.5,z', 'x+0.5,-y,z', '-z,-x,-y+0.5', - 'z+0.5,x+0.5,-y+0.5', '-z,x+0.5,y', 'z+0.5,-x,y', '-y,-z,-x+0.5', '-y,z+0.5,x', - 'y+0.5,-z,x', '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: 202 - schoenflies: Th^3 - universal_h_m: F m -3 (a-1/4,b-1/4,c-1/4) - Im-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) - symops: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', - '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', - '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x+0.5,-y+0.5,-z+0.5', 'x,y,-z+0.5', - '-x+0.5,y,z', 'x,-y+0.5,z', '-z+0.5,-x+0.5,-y+0.5', 'z,x,-y+0.5', '-z+0.5,x,y', - 'z,-x+0.5,y', '-y+0.5,-z+0.5,-x+0.5', '-y+0.5,z,x', 'y,-z+0.5,x', 'y,z,-x+0.5', - 'x+0.5,y+0.5,z+0.5', '-x,-y,z+0.5', 'x+0.5,-y,-z', '-x,y+0.5,-z', 'z+0.5,x+0.5,y+0.5', - '-z,-x,y+0.5', 'z+0.5,-x,-y', '-z,x+0.5,-y', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z,-x', - '-y,z+0.5,-x', '-y,-z,x+0.5', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', - 'x+0.5,-y,z+0.5', '-z,-x,-y', 'z+0.5,x+0.5,-y', '-z,x+0.5,y+0.5', 'z+0.5,-x,y+0.5', - '-y,-z,-x', '-y,z+0.5,x+0.5', 'y+0.5,-z,x+0.5', 'y+0.5,z+0.5,-x'] - ncsym: ['x,y,z', '-x+0.5,-y+0.5,z', 'x,-y+0.5,-z+0.5', '-x+0.5,y,-z+0.5', 'z,x,y', - '-z+0.5,-x+0.5,y', 'z,-x+0.5,-y+0.5', '-z+0.5,x,-y+0.5', 'y,z,x', 'y,-z+0.5,-x+0.5', - '-y+0.5,z,-x+0.5', '-y+0.5,-z+0.5,x', '-x,-y,-z', 'x+0.5,y+0.5,-z', '-x,y+0.5,z+0.5', - 'x+0.5,-y,z+0.5', '-z,-x,-y', 'z+0.5,x+0.5,-y', '-z,x+0.5,y+0.5', 'z+0.5,-x,y+0.5', - '-y,-z,-x', '-y,z+0.5,x+0.5', 'y+0.5,-z,x+0.5', 'y+0.5,z+0.5,-x'] - number: 204 - schoenflies: Th^5 - universal_h_m: I m -3 (a-1/4,b-1/4,c-1/4) - Fm-3c(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) - symops: ['x,y,z', '-y,x,z', '-x,-y,z', 'y,-x,z', 'x,-y+0.5,-z+0.5', 'y+0.5,x,-z+0.5', - '-x,y+0.5,-z+0.5', '-y+0.5,-x,-z+0.5', 'z,x,y', '-x,z,y', '-z,-x,y', 'x,-z,y', - 'z,-x+0.5,-y+0.5', 'x+0.5,z,-y+0.5', '-z,x+0.5,-y+0.5', '-x+0.5,-z,-y+0.5', - 'y,z,x', 'y,-z,-x', 'z,y,-x', '-y,z,-x', '-z,-y+0.5,-x+0.5', '-y+0.5,-z+0.5,x', - 'z,-y+0.5,x+0.5', '-z,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,z', '-y,-x+0.5,z', 'x+0.5,-y,z', - 'y,x+0.5,z', '-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,y', '-x,-z+0.5,y', 'z+0.5,-x,y', 'x,z+0.5,y', - '-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,x', 'y,z,-x+0.5', '-z+0.5,y,-x', 'z+0.5,-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,-z', 'y+0.5,x+0.5,-z', '-x,y,-z', - '-y+0.5,-x+0.5,-z', '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,-y', 'x+0.5,z+0.5,-y', '-z,x,-y', '-x+0.5,-z+0.5,-y', '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,-x', '-y+0.5,-z,x+0.5', - 'z,-y,x', '-z,y,x', '-x+0.5,-y,-z', 'y+0.5,-x,-z', 'x+0.5,y,-z', '-y+0.5,x,-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', '-z+0.5,-x,-y', - 'x+0.5,-z,-y', 'z+0.5,x,-y', '-x+0.5,z,-y', '-z+0.5,x+0.5,y+0.5', '-x,-z,y+0.5', - 'z+0.5,-x+0.5,y+0.5', 'x,z,y+0.5', '-y+0.5,-z,-x', '-y+0.5,z,x', '-z+0.5,-y,x', - 'y+0.5,-z,x', 'z+0.5,y+0.5,x+0.5', 'y,z+0.5,-x', '-z+0.5,y+0.5,-x+0.5', 'z+0.5,-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+0.5,-z', - 'y,x,-z', '-x+0.5,y+0.5,-z', '-y,-x,-z', '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+0.5,-y', 'x,z,-y', '-z+0.5,x+0.5,-y', - '-x,-z,-y', '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+0.5,-x', '-y,-z+0.5,x+0.5', 'z+0.5,-y+0.5,x', '-z+0.5,y+0.5,x', '-x,-y+0.5,-z', - 'y,-x+0.5,-z', 'x,y+0.5,-z', '-y,x+0.5,-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', '-z,-x+0.5,-y', 'x,-z+0.5,-y', 'z,x+0.5,-y', - '-x,z+0.5,-y', '-z,x,y+0.5', '-x+0.5,-z+0.5,y+0.5', 'z,-x,y+0.5', 'x+0.5,z+0.5,y+0.5', - '-y,-z+0.5,-x', '-y,z+0.5,x', '-z,-y+0.5,x', 'y,-z+0.5,x', 'z,y,x+0.5', 'y+0.5,z,-x', - '-z,y,-x+0.5', 'z,-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,-z+0.5', 'y,x+0.5,-z+0.5', '-x+0.5,y,-z+0.5', '-y,-x+0.5,-z+0.5', - '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,-y+0.5', - 'x,z+0.5,-y+0.5', '-z+0.5,x,-y+0.5', '-x,-z+0.5,-y+0.5', '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,-x+0.5', '-y,-z,x', 'z+0.5,-y,x+0.5', - '-z+0.5,y,x+0.5', '-x,-y,-z+0.5', 'y,-x,-z+0.5', 'x,y,-z+0.5', '-y,x,-z+0.5', - '-x,y+0.5,z', '-y+0.5,-x,z', 'x,-y+0.5,z', 'y+0.5,x,z', '-z,-x,-y+0.5', 'x,-z,-y+0.5', - 'z,x,-y+0.5', '-x,z,-y+0.5', '-z,x+0.5,y', '-x+0.5,-z,y', 'z,-x+0.5,y', 'x+0.5,z,y', - '-y,-z,-x+0.5', '-y,z,x+0.5', '-z,-y,x+0.5', 'y,-z,x+0.5', 'z,y+0.5,x', 'y+0.5,z+0.5,-x+0.5', - '-z,y+0.5,-x', 'z,-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+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: 226 - schoenflies: Oh^6 - universal_h_m: F m -3 c (a+1/4,b+1/4,c+1/4) - Im-3m(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) - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', - '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', - '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x+0.5,-y+0.5,-z+0.5', - 'y,-x+0.5,-z+0.5', 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', '-x+0.5,y,z', '-y+0.5,-x+0.5,z', - 'x,-y+0.5,z', 'y,x,z', '-z+0.5,-x+0.5,-y+0.5', 'x,-z+0.5,-y+0.5', 'z,x,-y+0.5', - '-x+0.5,z,-y+0.5', '-z+0.5,x,y', '-x+0.5,-z+0.5,y', 'z,-x+0.5,y', 'x,z,y', '-y+0.5,-z+0.5,-x+0.5', - '-y+0.5,z,x', '-z+0.5,-y+0.5,x', 'y,-z+0.5,x', 'z,y,x', 'y,z,-x+0.5', '-z+0.5,y,-x+0.5', - 'z,-y+0.5,-x+0.5', 'x+0.5,y+0.5,z+0.5', '-y,x+0.5,z+0.5', '-x,-y,z+0.5', 'y+0.5,-x,z+0.5', - 'x+0.5,-y,-z', 'y+0.5,x+0.5,-z', '-x,y+0.5,-z', '-y,-x,-z', 'z+0.5,x+0.5,y+0.5', - '-x,z+0.5,y+0.5', '-z,-x,y+0.5', 'x+0.5,-z,y+0.5', 'z+0.5,-x,-y', 'x+0.5,z+0.5,-y', - '-z,x+0.5,-y', '-x,-z,-y', 'y+0.5,z+0.5,x+0.5', 'y+0.5,-z,-x', 'z+0.5,y+0.5,-x', - '-y,z+0.5,-x', '-z,-y,-x', '-y,-z,x+0.5', 'z+0.5,-y,x+0.5', '-z,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+0.5,z+0.5', - '-y,-x,z+0.5', 'x+0.5,-y,z+0.5', 'y+0.5,x+0.5,z+0.5', '-z,-x,-y', 'x+0.5,-z,-y', - 'z+0.5,x+0.5,-y', '-x,z+0.5,-y', '-z,x+0.5,y+0.5', '-x,-z,y+0.5', 'z+0.5,-x,y+0.5', - 'x+0.5,z+0.5,y+0.5', '-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+0.5,x+0.5', 'y+0.5,z+0.5,-x', '-z,y+0.5,-x', 'z+0.5,-y,-x'] - ncsym: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', - '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', - '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x,-y,-z', - 'y+0.5,-x,-z', 'x+0.5,y+0.5,-z', '-y,x+0.5,-z', '-x,y+0.5,z+0.5', '-y,-x,z+0.5', - 'x+0.5,-y,z+0.5', 'y+0.5,x+0.5,z+0.5', '-z,-x,-y', 'x+0.5,-z,-y', 'z+0.5,x+0.5,-y', - '-x,z+0.5,-y', '-z,x+0.5,y+0.5', '-x,-z,y+0.5', 'z+0.5,-x,y+0.5', 'x+0.5,z+0.5,y+0.5', - '-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+0.5,x+0.5', - 'y+0.5,z+0.5,-x', '-z,y+0.5,-x', 'z+0.5,-y,-x'] - number: 229 - schoenflies: Oh^9 - universal_h_m: I m -3 m (a-1/4,b-1/4,c-1/4) - Fm-3m(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) - symops: ['x,y,z', '-y+0.5,x,z', '-x+0.5,-y+0.5,z', 'y,-x+0.5,z', 'x,-y+0.5,-z+0.5', - 'y,x,-z+0.5', '-x+0.5,y,-z+0.5', '-y+0.5,-x+0.5,-z+0.5', 'z,x,y', '-x+0.5,z,y', - '-z+0.5,-x+0.5,y', 'x,-z+0.5,y', 'z,-x+0.5,-y+0.5', 'x,z,-y+0.5', '-z+0.5,x,-y+0.5', - '-x+0.5,-z+0.5,-y+0.5', '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+0.5,-x+0.5', '-y+0.5,-z+0.5,x', 'z,-y+0.5,x', '-z+0.5,y,x', '-x+0.5,-y+0.5,-z+0.5', - 'y,-x+0.5,-z+0.5', 'x,y,-z+0.5', '-y+0.5,x,-z+0.5', '-x+0.5,y,z', '-y+0.5,-x+0.5,z', - 'x,-y+0.5,z', 'y,x,z', '-z+0.5,-x+0.5,-y+0.5', 'x,-z+0.5,-y+0.5', 'z,x,-y+0.5', - '-x+0.5,z,-y+0.5', '-z+0.5,x,y', '-x+0.5,-z+0.5,y', 'z,-x+0.5,y', 'x,z,y', '-y+0.5,-z+0.5,-x+0.5', - '-y+0.5,z,x', '-z+0.5,-y+0.5,x', 'y,-z+0.5,x', 'z,y,x', 'y,z,-x+0.5', '-z+0.5,y,-x+0.5', - 'z,-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,z+0.5', - 'y,-x,z+0.5', 'x,-y,-z', 'y,x+0.5,-z', '-x+0.5,y+0.5,-z', '-y+0.5,-x,-z', '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,-y', 'x,z+0.5,-y', - '-z+0.5,x+0.5,-y', '-x+0.5,-z,-y', '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,-x', '-y+0.5,-z,x+0.5', 'z,-y,x+0.5', '-z+0.5,y+0.5,x+0.5', - '-x+0.5,-y,-z', 'y,-x,-z', 'x,y+0.5,-z', '-y+0.5,x+0.5,-z', '-x+0.5,y+0.5,z+0.5', - '-y+0.5,-x,z+0.5', 'x,-y,z+0.5', 'y,x+0.5,z+0.5', '-z+0.5,-x,-y', 'x,-z,-y', - 'z,x+0.5,-y', '-x+0.5,z+0.5,-y', '-z+0.5,x+0.5,y+0.5', '-x+0.5,-z,y+0.5', 'z,-x,y+0.5', - 'x,z+0.5,y+0.5', '-y+0.5,-z,-x', '-y+0.5,z+0.5,x+0.5', '-z+0.5,-y,x+0.5', 'y,-z,x+0.5', - 'z,y+0.5,x+0.5', 'y,z+0.5,-x', '-z+0.5,y+0.5,-x', 'z,-y,-x', '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+0.5,-z', 'y+0.5,x,-z', - '-x,y,-z', '-y,-x+0.5,-z', '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+0.5,-y', 'x+0.5,z,-y', '-z,x,-y', '-x,-z+0.5,-y', - 'y+0.5,z,x+0.5', 'y+0.5,-z+0.5,-x', 'z+0.5,y,-x', '-y,z,-x', '-z,-y+0.5,-x', - '-y,-z+0.5,x+0.5', 'z+0.5,-y+0.5,x+0.5', '-z,y,x+0.5', '-x,-y+0.5,-z', 'y+0.5,-x+0.5,-z', - 'x+0.5,y,-z', '-y,x,-z', '-x,y,z+0.5', '-y,-x+0.5,z+0.5', 'x+0.5,-y+0.5,z+0.5', - 'y+0.5,x,z+0.5', '-z,-x+0.5,-y', 'x+0.5,-z+0.5,-y', 'z+0.5,x,-y', '-x,z,-y', - '-z,x,y+0.5', '-x,-z+0.5,y+0.5', 'z+0.5,-x+0.5,y+0.5', 'x+0.5,z,y+0.5', '-y,-z+0.5,-x', - '-y,z,x+0.5', '-z,-y+0.5,x+0.5', 'y+0.5,-z+0.5,x+0.5', 'z+0.5,y,x+0.5', 'y+0.5,z,-x', - '-z,y,-x', 'z+0.5,-y+0.5,-x', 'x+0.5,y+0.5,z', '-y,x+0.5,z', '-x,-y,z', 'y+0.5,-x,z', - 'x+0.5,-y,-z+0.5', 'y+0.5,x+0.5,-z+0.5', '-x,y+0.5,-z+0.5', '-y,-x,-z+0.5', - 'z+0.5,x+0.5,y', '-x,z+0.5,y', '-z,-x,y', 'x+0.5,-z,y', 'z+0.5,-x,-y+0.5', 'x+0.5,z+0.5,-y+0.5', - '-z,x+0.5,-y+0.5', '-x,-z,-y+0.5', '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,-x+0.5', '-y,-z,x', 'z+0.5,-y,x', '-z,y+0.5,x', '-x,-y,-z+0.5', - 'y+0.5,-x,-z+0.5', 'x+0.5,y+0.5,-z+0.5', '-y,x+0.5,-z+0.5', '-x,y+0.5,z', '-y,-x,z', - 'x+0.5,-y,z', 'y+0.5,x+0.5,z', '-z,-x,-y+0.5', 'x+0.5,-z,-y+0.5', 'z+0.5,x+0.5,-y+0.5', - '-x,z+0.5,-y+0.5', '-z,x+0.5,y', '-x,-z,y', 'z+0.5,-x,y', 'x+0.5,z+0.5,y', '-y,-z,-x+0.5', - '-y,z+0.5,x', '-z,-y,x', 'y+0.5,-z,x', 'z+0.5,y+0.5,x', 'y+0.5,z+0.5,-x+0.5', - '-z,y+0.5,-x+0.5', 'z+0.5,-y,-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+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: 225 - schoenflies: Oh^5 - universal_h_m: F m -3 m (a-1/4,b-1/4,c-1/4) - P4bm(a,b,2*c): - crystal_class: tetragonal - hall: ' P 4 -2ab (x,y,1/2*z)' - 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', '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'] - 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+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'] - number: 100 - schoenflies: C4v^2 - universal_h_m: P 4 b m (a,b,2*c) - C1c1(2*a+c,b,c): - crystal_class: monoclinic - hall: ' C -2yc (1/2*x,y,-1/2*x+z)' - hermann_mauguin: C 1 c 1 - symops: ['x,y,z', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', 'x+0.5,-y,z', 'x+0.25,y+0.5,z+0.75', - 'x+0.25,-y+0.5,z+0.25', 'x+0.75,y+0.5,z+0.25', 'x+0.75,-y+0.5,z+0.75'] - ncsym: ['x,y,z', 'x,-y,z+0.5', 'x+0.5,y,z+0.5', 'x+0.5,-y,z'] - number: 9 - schoenflies: Cs^4 - universal_h_m: C 1 c 1 (2*a+c,b,c) - Pmc21(2*a,b,c): - crystal_class: orthorhombic - hall: ' P 2c -2 (1/2*x,y,z)' - hermann_mauguin: P m c 21 - symops: ['x,y,z', '-x,y,z', 'x,-y,z+0.5', '-x,-y,z+0.5', 'x+0.5,y,z', '-x+0.5,y,z', - 'x+0.5,-y,z+0.5', '-x+0.5,-y,z+0.5'] - ncsym: ['x,y,z', '-x,y,z', 'x,-y,z+0.5', '-x,-y,z+0.5'] - number: 26 - schoenflies: C2v^2 - universal_h_m: P m c 21 (2*a,b,c) - Cmm2(2*c,a,b): - crystal_class: orthorhombic - hall: ' C 2 -2 (1/2*z,x,y)' - hermann_mauguin: C 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', 'x+0.5,-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+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: 35 - schoenflies: C2v^11 - universal_h_m: C m m 2 (2*c,a,b) - P121/c1(2*c,2*a+c,b): - crystal_class: monoclinic - hall: -P 2ybc (-1/4*x+1/2*z,1/2*x,y) - hermann_mauguin: P 1 21/c 1 - symops: ['x,y,z', '-x+0.25,-y,z+0.5', '-x,-y,-z', 'x-0.25,y,-z-0.5', 'x+0.75,y+0.5,z', - '-x+1,-y+0.5,z+0.5', '-x+0.75,-y+0.5,-z', 'x+0.5,y+0.5,-z-0.5', 'x+0.25,y+0.5,z', - '-x+0.5,-y+0.5,z+0.5', '-x+0.25,-y+0.5,-z', 'x,y+0.5,-z-0.5', 'x+0.5,y,z', '-x+0.75,-y,z+0.5', - '-x+0.5,-y,-z', 'x+0.25,y,-z-0.5'] - ncsym: ['x,y,z', '-x+0.25,-y,z+0.5', '-x,-y,-z', 'x-0.25,y,-z-0.5'] - number: 14 - schoenflies: C2h^5 - universal_h_m: P 1 21/c 1 (2*c,2*a+c,b) - Pmma(2*b,c,a): - crystal_class: orthorhombic - hall: -P 2a 2a (1/2*y,z,x) - hermann_mauguin: P m m a - 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,z', '-x+0.5,y,z', 'x+0.5,y,-z+0.5', '-x+0.5,y,-z+0.5', - '-x+0.5,-y,-z', 'x+0.5,-y,-z', '-x+0.5,-y,z-0.5', 'x+0.5,-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: 51 - schoenflies: D2h^5 - universal_h_m: P m m a (2*b,c,a) - Pmma(2*b+1/4,c,a-1/3): - crystal_class: orthorhombic - hall: -P 2a 2a (1/2*y,z+1/3,x-1/4) - hermann_mauguin: P m m a - symops: ['x,y,z', '-x,y,z', 'x,y,-z', '-x,y,-z', 'x+0.5,y,z', '-x+0.5,y,z', 'x+0.5,y,-z', - '-x+0.5,y,-z', '-x,-y+0.667,-z+0.5', 'x,-y+0.667,-z+0.5', '-x,-y+0.667,z+0.5', - 'x,-y+0.667,z+0.5', '-x+0.5,-y+0.667,-z+0.5', 'x+0.5,-y+0.667,-z+0.5', '-x+0.5,-y+0.667,z+0.5', - 'x+0.5,-y+0.667,z+0.5'] - ncsym: ['x,y,z', '-x,y,z', 'x,y,-z', '-x,y,-z', 'x+0.5,y,z', '-x+0.5,y,z', 'x+0.5,y,-z', - '-x+0.5,y,-z'] - number: 51 - schoenflies: D2h^5 - universal_h_m: P m m a (2*b+1/4,c,a-1/3) - P12/c1(a,2*b,c): - crystal_class: monoclinic - hall: -P 2yc (x,1/2*y,z) - hermann_mauguin: P 1 2/c 1 - 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'] - number: 13 - schoenflies: C2h^4 - universal_h_m: P 1 2/c 1 (a,2*b,c) - Pmmm(2*a,2*b,c): - crystal_class: orthorhombic - hall: -P 2 2 (1/2*x,1/2*y,z) - hermann_mauguin: P m m m - symops: ['x,y,z', '-x,y,z', 'x,-y,z', '-x,-y,z', 'x+0.5,y,z', '-x+0.5,y,z', 'x+0.5,-y,z', - '-x+0.5,-y,z', 'x,y+0.5,z', '-x,y+0.5,z', 'x,-y+0.5,z', '-x,-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,-y,-z', 'x,-y,-z', - '-x,y,-z', 'x,y,-z', '-x+0.5,-y,-z', 'x+0.5,-y,-z', '-x+0.5,y,-z', 'x+0.5,y,-z', - '-x,-y+0.5,-z', 'x,-y+0.5,-z', '-x,y+0.5,-z', 'x,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+0.5,y,z', '-x+0.5,y,z', 'x+0.5,-y,z', - '-x+0.5,-y,z'] - number: 47 - schoenflies: D2h^1 - universal_h_m: P m m m (2*a,2*b,c) - P1211(a-1/4,b,c): - crystal_class: monoclinic - hall: ' P 2yb (x+1/4,y,z)' - hermann_mauguin: P 1 21 1 - symops: ['x,y,z', '-x+0.5,y+0.5,-z'] - ncsym: ['x,y,z', '-x+0.5,y+0.5,-z'] - number: 4 - schoenflies: C2^2 - universal_h_m: P 1 21 1 (a-1/4,b,c) - Pnma(c,a-1/4,b): - crystal_class: orthorhombic - hall: -P 2ac 2n (z,x,y+1/4) - hermann_mauguin: P n m a - symops: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z+0.5', - 'x+0.5,-y+0.5,z+0.5', 'x,y,-z', '-x+0.5,y+0.5,z'] - ncsym: ['x,y,z', '-x+0.5,y+0.5,-z', '-x,-y,z+0.5', 'x+0.5,-y+0.5,-z+0.5', '-x,-y,-z+0.5', - 'x+0.5,-y+0.5,z+0.5', 'x,y,-z', '-x+0.5,y+0.5,z'] - number: 62 - schoenflies: D2h^16 - universal_h_m: P n m a (c,a-1/4,b) diff --git a/src/xrpd_toolbox/utils/core.py b/src/xrpd_toolbox/utils/core.py new file mode 100644 index 0000000..eee8ecb --- /dev/null +++ b/src/xrpd_toolbox/utils/core.py @@ -0,0 +1,228 @@ +from __future__ import annotations + +import json +import tomllib +from pathlib import Path + +import numpy as np +import toml +import yaml +from pydantic import BaseModel + +SUPPORTED_FILE_TYPES = [".json", ".toml", ".yaml"] + + +class XRPDBaseModel(BaseModel): + model_config = { + "arbitrary_types_allowed": True, + "json_encoders": {np.ndarray: lambda v: v.tolist()}, + } + + @classmethod + def load_from_toml(cls, filepath: str | Path): + with open(filepath, "rb") as file: + settings_dict = tomllib.load(file) + + return cls(**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(**settings_dict) + + @classmethod + def load_from_json(cls, filepath: str | Path): + with open(filepath, "rb") as file: + settings_dict = json.load(file) + return cls(**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}") + + +class Parameter(XRPDBaseModel): + value: int | float + refine: bool = True + + __array_priority__ = 1000 # ensures numpy uses this class first + + # Conversions + def __float__(self) -> float: + return float(self.value) + + def __int__(self) -> int: + return int(self.value) + + def __array__(self, dtype=None): + return np.asarray(self.value, dtype=dtype) + + # Internal helper + def _get_value(self, other: int | float | Parameter) -> int | float: + return other.value if isinstance(other, Parameter) else other + + # Arithmetic (forward) + def __add__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self.value + self._get_value(other)) + + def __sub__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self.value - self._get_value(other)) + + def __mul__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self.value * self._get_value(other)) + + def __truediv__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self.value / self._get_value(other)) + + def __floordiv__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self.value // self._get_value(other)) + + def __mod__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self.value % self._get_value(other)) + + def __pow__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self.value ** self._get_value(other)) + + # Arithmetic (reverse) + def __radd__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self._get_value(other) + self.value) + + def __rsub__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self._get_value(other) - self.value) + + def __rmul__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self._get_value(other) * self.value) + + def __rtruediv__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self._get_value(other) / self.value) + + def __rfloordiv__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self._get_value(other) // self.value) + + def __rmod__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self._get_value(other) % self.value) + + def __rpow__(self, other: int | float | Parameter) -> Parameter: + return Parameter(value=self._get_value(other) ** self.value) + + # ------------------------ + # In-place operations + # ------------------------ + def __iadd__(self, other: int | float | Parameter): + self.value += self._get_value(other) + return self + + def __isub__(self, other: int | float | Parameter): + self.value -= self._get_value(other) + return self + + def __imul__(self, other: int | float | Parameter): + self.value *= self._get_value(other) + return self + + def __itruediv__(self, other: int | float | Parameter): + self.value /= self._get_value(other) + return self + + # Unary + def __neg__(self) -> Parameter: + return Parameter(value=-self.value) + + def __pos__(self) -> Parameter: + return Parameter(value=+self.value) + + def __abs__(self) -> Parameter: + return Parameter(value=abs(self.value)) + + # Comparisons + def __eq__(self, other: object) -> bool: + if isinstance(other, Parameter): + return self.value == other.value + return self.value == other + + def __lt__(self, other: int | float | Parameter) -> bool: + return self.value < self._get_value(other) + + def __le__(self, other: int | float | Parameter) -> bool: + return self.value <= self._get_value(other) + + def __gt__(self, other: int | float | Parameter) -> bool: + return self.value > self._get_value(other) + + def __ge__(self, other: int | float | Parameter) -> bool: + return self.value >= self._get_value(other) + + +if __name__ == "__main__": + x = Parameter(value=3) + + print(x) diff --git a/src/xrpd_toolbox/utils/form_factors.py b/src/xrpd_toolbox/utils/form_factors.py new file mode 100644 index 0000000..9b55296 --- /dev/null +++ b/src/xrpd_toolbox/utils/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/utils/lattice.py b/src/xrpd_toolbox/utils/lattice.py new file mode 100644 index 0000000..a858401 --- /dev/null +++ b/src/xrpd_toolbox/utils/lattice.py @@ -0,0 +1,122 @@ +import numpy as np + +from xrpd_toolbox.utils.settings import XRPDBaseModel + + +class Lattice(XRPDBaseModel): + """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: float # in Angstrom + b: float + c: float + alpha: float # in degrees + beta: float # in degrees + gamma: 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, + **kwargs, + ): + super().__init__(a=a, b=b, c=c, alpha=alpha, beta=beta, gamma=gamma) + + +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, **kwargs): + super().__init__(a=a, b=b, c=c, alpha=90.0, beta=beta, gamma=90.0) + + +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, **kwargs): + super().__init__(a=a, b=b, c=c, alpha=90.0, beta=90.0, gamma=90.0) + + +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, **kwargs): + super().__init__(a=a, b=a, c=c, alpha=90.0, beta=90.0, gamma=90.0) + + +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, **kwargs): + super().__init__(a=a, b=a, c=c, alpha=90.0, beta=90.0, gamma=120.0) + + +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, **kwargs): + super().__init__(a=a, b=a, c=c, alpha=90.0, beta=90.0, gamma=120.0) + + +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, **kwargs): + super().__init__(a=a, b=a, c=a, alpha=alpha, beta=alpha, gamma=alpha) + + +class CubicLattice(Lattice): + """This is a special case of the lattice + where a = b = c and alpha = beta = gamma = 90""" + + def __init__(self, a: float, **kwargs): + super().__init__(a=a, b=a, c=a, alpha=90.0, beta=90.0, gamma=90.0) diff --git a/src/xrpd_toolbox/utils/peaks.py b/src/xrpd_toolbox/utils/peaks.py index b5e5441..cff869c 100644 --- a/src/xrpd_toolbox/utils/peaks.py +++ b/src/xrpd_toolbox/utils/peaks.py @@ -1,30 +1,43 @@ import math +from abc import abstractmethod from collections.abc import Collection -from typing import Literal +from typing import Literal, TypeAlias import numpy as np import peakutils -from pydantic import BaseModel, Field, model_validator +from numba import njit +from pydantic import Field from scipy.optimize import curve_fit from scipy.special import erf +from xrpd_toolbox.utils.settings import XRPDBaseModel +IMPLEMENTED_PEAK_FUNCTONS: TypeAlias = Literal[ + "gaussian", "lorentzian", "pseudo_voigt", "tophat" +] + + +@njit() def gaussian_sigma_to_fwhm(sigma: float | int) -> float: return float(sigma) * 2 * np.sqrt(2 * np.log(2)) +@njit() def gaussian_fwhm_to_sigma(fwhm: float | int) -> float: return float(fwhm) / (2 * np.sqrt(2 * np.log(2))) +@njit() def lorentzian_gamma_to_fwhm(gamma: float | int) -> float: return 2 * float(gamma) +@njit() def lorentzian_fwhm_to_gamma(fwhm: float | int) -> float: return float(fwhm) / 2 +@njit() def gaussian( x: np.ndarray, amplitude: float | int, @@ -70,6 +83,7 @@ def gaussian( return prefactor * np.exp(-((x - centre) ** 2) / (2 * sigma**2)) + background +@njit() def lorentzian( x: np.ndarray, amplitude: float | int, @@ -90,6 +104,7 @@ def lorentzian( return prefactor * core + background +@njit() def pseudo_voigt( x: np.ndarray, amplitude: float | int, @@ -150,7 +165,9 @@ def pseudo_voigt( normalised=normalised, ) - return amplitude * (eta * lorentz + (1 - eta) * gauss) + background + pv = eta * lorentz + (1.0 - eta) * gauss + pv = pv + background + return pv def smooth_tophat( @@ -158,7 +175,7 @@ def smooth_tophat( amplitude: float | int, centre: float | int, fwhm: float | int, - eta: float | int, + epsilon: float | int, background: float | int | np.ndarray = 0, normalised: bool = True, ): @@ -173,12 +190,12 @@ def smooth_tophat( Centre of the plateau fwhm : float Width of the plateau - eta : float + epsilon : float Edge smoothing parameter (0–1) """ - # map eta → sigma (smoothing width) - sigma = max(eta * fwhm / 2, 1e-12) + # map epsilon - sigma (smoothing width) + sigma = max(epsilon * fwhm / 2, 1e-12) half_width = fwhm / 2 @@ -210,85 +227,77 @@ def closest_indices(arr1, arr2): return idx -class Peak(BaseModel): +class BasePeak(XRPDBaseModel): amplitude: float | int = Field(gt=0) centre: float | int - fwhm: float | int = Field(gt=0) + fwhm: float | int = Field(gt=0, default=0.1) + background: float | int = 0 + normalised: bool = True # if normalised the - peak_type: Literal["gaussian", "lorentzian", "pseudo-voigt", "top-hat"] = "gaussian" + @abstractmethod + def calculate(self, x: np.ndarray) -> np.ndarray: + NotImplementedError("Must implement calculate method in peak subclass") - eta: float | int | None = None # used for pseudo-voigt/tophat - mixing param - background: float | int = 0 - normalised: bool = True # if normalised the - # integral under peak is equal to amplitude. ie number of counts in peak +class GaussianPeak(BasePeak): + def calculate(self, x: np.ndarray) -> np.ndarray: + return gaussian(x, self.amplitude, self.centre, self.fwhm) + + +class LorentzianPeak(BasePeak): + def calculate(self, x: np.ndarray) -> np.ndarray: + return lorentzian(x, self.amplitude, self.centre, self.fwhm) + + +class PseudoVoigtPeak(BasePeak): + eta: float | int = Field( + ge=0, le=1, default=0.5 + ) # used for pseudo-voigt - mixing param - @model_validator(mode="after") - def validate_parameters(self): - # Allow NaNs to bypass strict validation + def calculate(self, x: np.ndarray) -> np.ndarray: + return pseudo_voigt( + x, + self.amplitude, + self.centre, + self.fwhm, + self.eta, + ) - if self.peak_type in ["pseudo-voigt", "top-hat"]: - if self.eta is None: - raise ValueError("eta must be provided for pseudo-voigt") - if not (0 <= self.eta <= 1): - raise ValueError("eta must be between 0 and 1") - else: - if self.eta is not None: - raise ValueError("eta should only be set for pseudo-voigt") - return self +class TopHatPeak(BasePeak): + epsilon: float | int = Field(ge=0, le=1, default=0) # used for tophat - smoothing def calculate(self, x: np.ndarray) -> np.ndarray: - if self.peak_type == "gaussian": - return gaussian( - x=x, - amplitude=self.amplitude, - centre=self.centre, - fwhm=self.fwhm, - background=self.background, - normalised=self.normalised, - ) - elif self.peak_type == "lorentzian": - return lorentzian( - x=x, - amplitude=self.amplitude, - centre=self.centre, - fwhm=self.fwhm, - background=self.background, - normalised=self.normalised, - ) - elif self.peak_type == "pseudo-voigt": - assert self.eta is not None - - return pseudo_voigt( - x=x, - amplitude=self.amplitude, - centre=self.centre, - fwhm=self.fwhm, - eta=self.eta, - background=self.background, - normalised=self.normalised, + return smooth_tophat( + x, + self.amplitude, + self.centre, + self.fwhm, + self.epsilon, + ) + + +def peak_factory(peak_type: str): + 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}" ) - elif self.peak_type == "top-hat": - assert self.eta is not None - return smooth_tophat( - x=x, - amplitude=self.amplitude, - centre=self.centre, - fwhm=self.fwhm, - eta=self.eta, - background=self.background, - normalised=self.normalised, - ) - else: - raise ValueError(f"{self.peak_type} is not an allowed peak type") def caglioti_fwhm( two_theta: np.ndarray | float, - u, - v: float, - w: float, + u: float | int, + v: float | int, + w: float | int, ) -> np.ndarray | float: """ Compute FWHM using the Caglioti function. @@ -388,7 +397,7 @@ def estimate_fwhm( def fit_peaks( x: np.ndarray, y: np.ndarray, initial_x_pos: Collection[int | float] -) -> list[Peak]: +) -> list[BasePeak]: fitted_peaks = [] for x_guess in initial_x_pos: @@ -413,23 +422,25 @@ def fit_peaks( if len(y_fit) == 0: fitted_peaks.append( - Peak(amplitude=math.nan, centre=math.nan, fwhm=math.nan) + 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(Peak(amplitude=popt[0], centre=popt[1], fwhm=popt[2])) + fitted_peaks.append( + GaussianPeak(amplitude=popt[0], centre=popt[1], fwhm=popt[2]) + ) except RuntimeError: fitted_peaks.append( - Peak(amplitude=math.nan, centre=math.nan, fwhm=math.nan) + GaussianPeak(amplitude=math.nan, centre=math.nan, fwhm=math.nan) ) return fitted_peaks -def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[Peak]: +def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[BasePeak]: """function to get the centre peaks given without guessing""" y_smoothed = np.convolve( @@ -443,3 +454,7 @@ def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[Peak]: fitted_peaks = fit_peaks(x, y_smoothed, initial_x_pos=initial_x_pos) return fitted_peaks + + +if __name__ == "__main__": + pass diff --git a/src/xrpd_toolbox/utils/profile_calculation.py b/src/xrpd_toolbox/utils/profile_calculation.py index 941cff6..45fb4f4 100644 --- a/src/xrpd_toolbox/utils/profile_calculation.py +++ b/src/xrpd_toolbox/utils/profile_calculation.py @@ -1,127 +1,187 @@ -import os -import re from collections.abc import Collection, Sequence -from functools import cached_property, lru_cache +from functools import cached_property from pathlib import Path -from typing import Literal +from typing import Literal, TypeAlias +import matplotlib.pyplot as plt import numpy as np +import numpy.typing as npt from CifFile import ReadCif -from numba import njit -from pydantic import ConfigDict, Field, model_validator +from numba import njit, prange +from pydantic import model_validator +from xrpd_toolbox.utils.atom import Atoms +from xrpd_toolbox.utils.background import Background from xrpd_toolbox.utils.constants import ( ELEMENT_ATOMIC_NUMBER, - get_spacegroup_number, ) -from xrpd_toolbox.utils.peaks import Peak -from xrpd_toolbox.utils.settings import SettingsBase -from xrpd_toolbox.utils.symmetry import get_symmetry_tables +from xrpd_toolbox.utils.core import XRPDBaseModel +from xrpd_toolbox.utils.form_factors import X_RAY_FORM_FACTORS +from xrpd_toolbox.utils.lattice import Lattice +from xrpd_toolbox.utils.peaks import BasePeak, peak_factory +from xrpd_toolbox.utils.symmetry import ( + SpaceGroup, + format_space_group_name, + get_symmetry_tables, +) from xrpd_toolbox.utils.unit_conversion import ( beam_energy_to_wavelength, + q_space_to_s, + q_space_to_theta, ) +from xrpd_toolbox.utils.utils import parse_numbers_with_error, timeit +XUnit: TypeAlias = Literal["tth", "tof", "q", "d"] -@lru_cache -def load_xray_form_factors(): - folder = os.path.dirname(__file__) +DataType: TypeAlias = Literal[ + "xray", + "lab-xray", + "tof-neutron", + "cw-neutron", +] - form_factor_filepath = os.path.join(folder, "constants", "atom_form_factors.csv") +CrystalType: TypeAlias = Literal["powder", "single-crystal"] - elements = np.genfromtxt( - form_factor_filepath, - skip_header=1, - delimiter=None, - dtype=None, - usecols=[0], - ) - xrff = np.genfromtxt( - form_factor_filepath, - skip_header=1, - delimiter=None, - dtype=None, - usecols=range(1, 10), - ) +# TODO: do the comment below +# Use U_iso for computation / modeling +# Accept B_iso when reading external data - elements = np.char.replace(elements, "val", "") +# uiso- = direct measure of atomic displacement (mean-square displacement). +# biso - debye waller factor - return elements, xrff +@njit() +def u_iso_to_b_iso(u_iso: np.ndarray) -> np.ndarray: + return 8 * np.pi**2 * u_iso -def calculate_debye_waller_factor(b_iso: np.ndarray, q: np.ndarray): - """q is q space in radians""" - s = q / (4 * np.pi) - dw = np.exp(-b_iso[:, None] * s[None, :] ** 2) - return dw +@njit() +def b_iso_to_u_iso(b_iso: np.ndarray) -> np.ndarray: + return b_iso / (8 * np.pi**2) -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: - """Compute complex structure factor F(hkl).""" - phase = 2j * np.pi * (hkl @ positions.T) +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] - ff = calculate_form_factor(elements, q) + # Find group boundaries + dt = np.diff(tth) + new_group = np.concatenate(([True], dt > tol)) - dw = calculate_debye_waller_factor(b_iso, q) + # Indices where groups start + group_starts = np.flatnonzero(new_group) - return np.sum( - occupancy[None, :] * ff.T * dw.T * np.exp(phase), - axis=1, - ) + # Sum intensities per group + merged_intensity = np.add.reduceat(inten, group_starts) + # Representative 2θ (take first in each group) + merged_tth = tth[group_starts] -def get_x_ray_form_factor_parameters(elements: Collection[str]) -> np.ndarray: - """Place holder currently returns ones - should return array of xray form factors - https://lampz.tugraz.at/~hadley/ss1/crystaldiffraction/atomicformfactors/formfactors.php + # 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 - element_names, xrff = load_xray_form_factors() - element_names = np.asarray(element_names) - elements = np.asarray(elements) +def calculate_form_factor(elements: Collection[str], s: np.ndarray) -> np.ndarray: + params = np.asarray([X_RAY_FORM_FACTORS[el] for el in elements]) - # Build lookup (fast and correct) - lookup = {el: i for i, el in enumerate(element_names)} + if params.shape[0] != len(elements): + raise ValueError("Element form factor parameters not found for all elements") - try: - indices = np.array([lookup[e] for e in elements]) - except KeyError as exc: - raise ValueError(f"{exc} not in form factor table") from exc + 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, :, :]) - return xrff[indices].astype(float) + ff = np.sum(a[None, :, :] * exp_term, axis=2) + c[None, :] + return ff # (n_atoms, s) -def calculate_form_factor(elements: Collection[str], q: np.ndarray) -> np.ndarray: - params = get_x_ray_form_factor_parameters(elements) - # https://lampz.tugraz.at/~hadley/ss1/crystaldiffraction/atomicformfactors/formfactors.php - a = params[:, [0, 2, 4, 6]] - b = params[:, [1, 3, 5, 7]] - c = params[:, 8] +@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)) - s = q / (4 * np.pi) - s2 = s**2 +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) - a = a[:, :, None] - b = b[:, :, None] - s2 = s2[None, None, :] + 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) - ff = np.sum(a * np.exp(-b * s2), axis=1) + c[:, None] + f_hkl = np.sum( + occupancy * ff * dw * np.exp(phase), + axis=1, + ) - assert ff.shape[0] == len(elements) + ###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 ff + return f_hkl +# @njit +@timeit def hkl_laue_reduction( hkl: np.ndarray, rotations: np.ndarray ) -> tuple[np.ndarray, np.ndarray]: @@ -136,21 +196,7 @@ def hkl_laue_reduction( equiv = np.transpose(equiv, (1, 0, 2)) # enforce "first non-zero positive" rule - signs = np.sign(equiv) - - # find first non-zero index along last axis - first_nonzero_idx = np.argmax(equiv != 0, axis=2) - - # gather sign at that index - first_sign = np.take_along_axis( - signs, - first_nonzero_idx[:, :, None], - axis=2, - ).squeeze(-1) - - # flip where negative - flip_mask = first_sign < 0 - equiv = np.where(flip_mask[:, :, None], -equiv, equiv) + equiv = np.abs(equiv) # sort to get positive hkls order = np.lexsort((equiv[:, :, 2], equiv[:, :, 1], equiv[:, :, 0])) @@ -169,7 +215,7 @@ def q_vectors_from_hkl( ) -> np.ndarray: """Also know as G in single crystal""" - return hkl @ reciprocal_lattice_matrix.T + return hkl @ reciprocal_lattice_matrix def q_magnitude(q_vectors: np.ndarray) -> np.ndarray: @@ -178,8 +224,11 @@ def q_magnitude(q_vectors: np.ndarray) -> np.ndarray: return np.linalg.norm(q_vectors, axis=1) +@njit def lorentz_polarisation( - theta: np.ndarray, polarisation: float = 0.0, azimuth: float | None = None + theta: np.ndarray, + polarisation: float | int = 0.0, + azimuth: float | int | None = None, ) -> np.ndarray: """ Lorentz–polarisation factor for X-ray diffraction. @@ -200,6 +249,8 @@ def lorentz_polarisation( 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 @@ -214,6 +265,7 @@ def lorentz_polarisation( ) / (sin2theta * cos2theta) +@njit def unit_cell_volume( a: float | np.ndarray, b: float | np.ndarray, @@ -263,6 +315,21 @@ def unit_cell_volume( 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 @@ -335,7 +402,7 @@ def generate_hkl(reciprocal_lattice_matrix: np.ndarray, q_max: float) -> np.ndar hkl = generate_h_k_l([hmax, kmax, lmax]) - q_vec = hkl @ reciprocal_lattice_matrix.T + q_vec = hkl @ reciprocal_lattice_matrix q = np.linalg.norm(q_vec, axis=1) return hkl[q <= q_max] @@ -358,7 +425,7 @@ def reciprocal_lattice_matrix( 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]).T + return np.vstack([a_star, b_star, c_star]) def allowed_reflections( @@ -367,83 +434,62 @@ def allowed_reflections( translations: np.ndarray, tol: float = 1e-8, ) -> np.ndarray: - """ - Correct systematic absence condition. - """ - - # Apply rotations hkl_rot = np.einsum("rij,nj->rni", rotations, hkl, optimize=True) - - # Check invariance modulo integer lattice delta = hkl_rot - hkl[None] invariant = np.all(np.isclose(delta, np.rint(delta), atol=tol), axis=2) - - # Phase from translations phase = 2 * np.pi * (hkl @ translations.T) - - # Sum ONLY invariant ops 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("ni,ij,nj->n", hkl, g_star, hkl) + g_hkl = np.einsum("mi,ij,nj->n", hkl, g_star, hkl, optimize=True) return 1.0 / np.sqrt(g_hkl) -class Atom(SettingsBase): - """This describes an atom""" - - model_config = ConfigDict(arbitrary_types_allowed=True) +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) - label: str # elemnt label ie Si1 Si2 - element: str # element name eg Si - xyz: np.ndarray | list # fractional coorindates of xyz - b_iso: float - occupancy: float = 1.0 + scatter_vec = q_space / (4 * np.pi) - @property - def x(self): - return self.xyz[0] - - @property - def y(self): - return self.xyz[1] + form_factors = calculate_form_factor(elements, scatter_vec).T - @property - def z(self): - return self.xyz[2] + 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: list[Atom], rotations: np.ndarray, translations: np.ndarray + 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]) + # 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, base_pos, optimize=True) + np.einsum("sij,aj->sai", rotations, asymmetric_atoms.xyz, optimize=True) + translations[:, None, :] - ) % 1.0 + ) + + positions = positions % 1.0 + positions = np.round(positions, 10) positions = positions.reshape(-1, 3) - occupancies = np.tile(base_occ, len(rotations)) - b_iso = np.tile(base_b, len(rotations)) - elements = np.tile(base_el, len(rotations)) + 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)) - positions = positions % 1.0 - key = np.round(positions * 1e6).astype(int) - _, idx = np.unique(key, axis=0, return_index=True) + # key = np.round(positions * 1e8).astype(int) + _, idx = np.unique(positions, axis=0, return_index=True) positions = positions[idx] occupancies = occupancies[idx] @@ -456,101 +502,106 @@ def apply_symmetry_operations_to_atoms( # pydantic models to store the data -class Lattice(SettingsBase): - """This decribes the assymetric unit cell lattice - - a, b, c refer to the length of the unit cell in A - alpha, beta, gamma are the angles of the unit cell in degreee""" - - a: float - b: float - c: float - alpha: float # in degrees - beta: float # in degrees - gamma: 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) - - -class Radiation(SettingsBase): +class Radiation(XRPDBaseModel): """This defines the type of radiation that is diffracting""" - radiation: Literal["synchotron-x-ray", "tof-neutron", "cw-neutron", "lab-xray"] + 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) -class Structure(SettingsBase): - """This should contain everything needed to calculate the structure factor, - peak intensities and peak position of the diffraction peeaks""" + return self - model_config = ConfigDict(arbitrary_types_allowed=True) +class Structure(XRPDBaseModel): + """This should contain everything needed to calculate the structure factor, + peak intensities and peak position of the diffraction peeaks lattice: Lattice - atoms: list[Atom] + atoms: Atoms + spacegroup_symbol: str = "P1" + symmetry_operations: np.ndarray + """ + spacegroup_symbol: str = "P1" - symmetry_operations: np.ndarray = Field(default=np.array([])) + lattice: Lattice + atoms: Atoms + source: str | None = None + # symmetry_operations: npt.NDArray[np.str_] | None = None @classmethod - def load_from_cif(cls, cif_filepath: str | Path) -> "Structure": - return read_cif(cif_filepath) + def load_from_cif( + cls, cif_filepath: str | Path, enforce_symmetry: bool = True + ) -> "Structure": + spacegroup_symbol, lattice, atoms, symmetry_operations = read_cif(cif_filepath) + + structure = cls( + spacegroup_symbol=spacegroup_symbol, + lattice=lattice, + atoms=atoms, + source=str(cif_filepath), + # symmetry_operations=symmetry_operations, + ) + + return structure @cached_property def spacegroup(self): - sg = self.spacegroup_symbol - sg = sg[0].upper() + sg[1:].lower() # upper case first letter - # sg = re.sub(r"\(.*?\)", "", sg) # remove "(...)" - 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"([2346])1", r"\1_1", sg) # 21 → 2_1 etc. - # 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 format_space_group_name(self.spacegroup_symbol) + + @cached_property + def spacegroup_class(self) -> SpaceGroup: + itc = get_symmetry_tables() + sg = itc[self.spacegroup] return sg @cached_property def spacegroup_number(self) -> int: - return get_spacegroup_number(self.spacegroup) + itc = get_symmetry_tables() + sg = itc[self.spacegroup] + return int(sg["number"]) - @cached_property + # @cached_property + @property def element_array(self): - element_array = np.array([a.element for a in self.atoms]) # (N_atoms, 3) - return element_array + # 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 positions + # 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 occ_array + # 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 b_iso_array + # b_iso_array = np.array([a.b_iso for a in self.atoms]) # (N_atoms,) + return self.atoms.b_iso - @cached_property + # @cached_property + @property def atomic_numbers(self): atomic_numbers = np.array( - [ELEMENT_ATOMIC_NUMBER[a.element] for a in self.atoms] + [ELEMENT_ATOMIC_NUMBER[el] for el in self.atoms.elements] ) # (N_atoms,) return atomic_numbers @cached_property def centering(self): - return self.spacegroup.split()[0] + return list(self.spacegroup)[0] def reciprocal_lattice_matrix(self): return reciprocal_lattice_matrix( @@ -574,46 +625,105 @@ def volume(self): degrees=True, ) + # TODO: Make this read from the cif file if provided + @timeit def get_symmetry_operations(self): + # if self.symmetry_operations is None: itc = get_symmetry_tables() sg = itc[self.spacegroup] - return sg.get_rotations_and_translations() + sym_ops = sg.get_rotations_and_translations() + + # else: + # sym_ops = self.symmetry_operations + + return sym_ops + + @timeit + 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_peaks( self, wavelength: float | int = 1.5406, - mode: Literal["powder", "single_crystal"] = "powder", - radiation: Literal["x-ray", "neutron"] = "x-ray", - ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + 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 - # generate hkls - hkl = generate_hkl(reciprocal_lattice_matrix, q_max=q_max) - # remove ssystematic absences - mask = allowed_reflections(hkl, rotations, translations) - hkl = hkl[mask] + 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": - hkl, multiplicity = hkl_laue_reduction(hkl, rotations) - # some pxrd refs are equal + if multiplicity_method: + hkl, multiplicity = hkl_laue_reduction(hkl, rotations) + # some pxrd refs are equal + else: + multiplicity = np.ones(len(hkl)) else: - hkl = hkl 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 + two_theta_degrees = 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 ) @@ -627,20 +737,222 @@ def calculate_peaks( q=q, ) - intensity = np.abs(structure_factor) ** 2 # |F|**2 - # intensity = intensity / (self.volume**2) + f_abs = np.abs(structure_factor) + structure_factor_squared = f_abs**2 # |F|**2 + + intensity = structure_factor_squared - theta = np.arcsin(q * wavelength / (4 * np.pi)) - two_theta_degrees = np.degrees(2 * theta) + 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) + lp_factor = lorentz_polarisation(theta, 0.9) # 0 for unpolarized intensity = intensity * lp_factor - return hkl, two_theta_degrees, intensity + two_theta_degrees, intensity, hkl = merge_peaks( + two_theta_degrees, intensity, hkl + ) - else: - return hkl, two_theta_degrees, intensity + return hkl, f_abs, two_theta_degrees, intensity + + def to_peaks( + self, + wavelength: float | int = 1.5406, + mode: CrystalType = "powder", + peak_type: str = "gaussian", + radiation: DataType = "xray", + ): + hkl, f_abs, two_theta_degrees, intensity = self.calculate_peaks( + 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)) + + 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_peaks( + 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 = CalculatedProfile( + 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( + [ + [-1, -1, -1], + [-1, -1, 0], + [-1, -1, 1], + [-1, 0, -1], + [-1, 0, 0], + [-1, 0, 1], + [-1, 1, -1], + [-1, 1, 0], + [-1, 1, 1], + [0, -1, -1], + [0, -1, 0], + [0, -1, 1], + [0, 0, -1], + [0, 0, 0], + [0, 0, 1], + [0, 1, -1], + [0, 1, 0], + [0, 1, 1], + [1, -1, -1], + [1, -1, 0], + [1, -1, 1], + [1, 0, -1], + [1, 0, 0], + [1, 0, 1], + [1, 1, -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}") + + # ---------------------------- + # Coordinate transform + # ---------------------------- + # if cartesian: + # coords = positions @ self.lattice.matrix.T + # xlabel, ylabel, zlabel = "x (Å)", "y (Å)", "z (Å)" + # else: + 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() ###cif reader @@ -662,15 +974,21 @@ def get_symmetry_operation_from_cif(cif_filepath: str | Path, block_number: int return synmmetry_operations -def read_cif(cif_filepath: str | Path, block_number: int = 0) -> Structure: +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=float) - y = np.array(block["_atom_site_fract_y"], dtype=float) - z = np.array(block["_atom_site_fract_z"], dtype=float) + 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"]) @@ -679,21 +997,27 @@ def read_cif(cif_filepath: str | Path, block_number: int = 0) -> Structure: else: elements = atom_labels.copy() - occ = ( - np.array(block["_atom_site_occupancy"], dtype=float) + 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=float) + 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=float) - b_iso = 8 * np.pi**2 * u_iso + u_iso = np.array(block["_atom_site_U_iso_or_equiv"], dtype=str) + b_iso = u_iso_to_b_iso(u_iso) else: - b_iso = np.zeros(len(x)) # fallback + b_iso = np.tile(0.5, len(x)) # fallback + + b_iso, b_iso_e = parse_numbers_with_error(b_iso) try: spacegroup_symbol = block["_symmetry_space_group_name_H-M"] @@ -701,47 +1025,92 @@ def read_cif(cif_filepath: str | Path, block_number: int = 0) -> Structure: print("_symmetry_space_group_name_H-M not in cif") spacegroup_symbol = "P1" - try: - synmmetry_operations = np.array(block["_space_group_symop_operation_xyz"]) - except Exception: + 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") - synmmetry_operations = np.array([]) - - atoms = [ - Atom( - label=atom_labels[i], - element=elements[i].capitalize(), - xyz=np.array([x[i], y[i], z[i]], dtype=float), - b_iso=float(b_iso[i]), - occupancy=float(occ[i]), - ) - for i in range(len(x)) - ] - - lattice = Lattice( - a=float(block["_cell_length_a"]), - b=float(block["_cell_length_b"]), - c=float(block["_cell_length_c"]), - alpha=float(block["_cell_angle_alpha"]), - beta=float(block["_cell_angle_beta"]), - gamma=float(block["_cell_angle_gamma"]), - ) + symmetry_operations = np.array([]) + + atoms = { + "labels": atom_labels, + "elements": elements, + "xyz": np.column_stack((x, y, z)), + "b_iso": b_iso, + "occupancies": occupancies, + } + + # atoms = [ + # Atom( + # label=atom_labels[i], + # element=elements[i], + # xyz=np.array([x[i], y[i], z[i]], dtype=float), + # b_iso=float(b_iso[i]), + # occupancy=float(occupancies[i]), + # ) + # for i in range(len(x)) + # ] + + 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 - structure = Structure( - lattice=lattice, - atoms=atoms, - spacegroup_symbol=spacegroup_symbol, - symmetry_operations=synmmetry_operations, - ) - return structure +def calculate_profile( + x: np.ndarray, + peaks: Sequence[BasePeak], + background: int | float | np.ndarray | Background = 0, + phase_scale: int | float = 1, + wdt: int | float = 5, +): + """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 class: Peak which contain (cen, amp, fwhm) + + background: scalar or array, if array must be same shape as x + """ + + if isinstance(background, np.ndarray): + assert len(x) == len(background) + + intensity = np.zeros_like(x) + + for peak in peaks: + 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 @njit(parallel=True) -def calculate_profile( +def calculate_profile_parallel( x: np.ndarray, - peaks: Collection[Peak], - background: int | float | np.ndarray, + peaks: Sequence[BasePeak], + background: int | float | np.ndarray | Background = 0, phase_scale: int | float = 1, wdt: int | float = 5, ): @@ -753,12 +1122,16 @@ def calculate_profile( background: scalar or array, if array must be same shape as x """ + raise NotImplementedError("Not implemented well yet") + if isinstance(background, np.ndarray): assert len(x) == len(background) intensity = np.zeros_like(x) - for peak in peaks: + for peak_index in prange(len(peaks)): + peak = peaks[peak_index] + assert peak.background == 0 start_idx = np.searchsorted(x, peak.centre - (wdt * peak.fwhm)) @@ -766,6 +1139,7 @@ def calculate_profile( xi = x[start_idx:end_idx] peak_intensity = peak.calculate(xi) + intensity[start_idx:end_idx] += peak_intensity intensity = (intensity * phase_scale) + background @@ -773,89 +1147,253 @@ def calculate_profile( return intensity -##### more complex pydantic models to do whol profiles +class XYEData(XRPDBaseModel): + x: npt.NDArray[np.float64] + y: npt.NDArray[np.float64] + e: npt.NDArray[np.float64] | None = None + + @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 + + +class ScatteringData(XYEData): + x_unit: XUnit = "tth" + data_type: DataType = "xray" + wavelength: int | float | None = None # for x-ray or CW neutron data + bank: int | None = None # for multi bank data ie neutron tof + source: str | None = None # for tracking where the data came from + + @model_validator(mode="after") + def validate_data_units(self): + if self.data_type == "x-ray": + assert self.x_unit != "tof" + + return self + + def plot(self, show: bool = True): + 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() -class Profile(SettingsBase): - model_config = ConfigDict(arbitrary_types_allowed=True) + # 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, + filename: str | Path, + x_unit: XUnit, + data_type: DataType, + wavelength: float | None = None, + ) -> "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 + """ + + try: + x, y, e = np.genfromtxt(str(filename), unpack=True, dtype=float) + except ValueError: + x, y = np.genfromtxt(str(filename), 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(filename), + ) + @classmethod + def from_fullprof( + cls, + filename: str | Path, + x_unit: XUnit, + data_type: DataType, + wavelength: float | None = None, + ) -> "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 + """ + + x, y, e = np.genfromtxt( + str(filename), + 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(filename), + ) + + +##### more complex pydantic models to do whole profiles + + +class CalculatedProfile(XRPDBaseModel): x: np.ndarray - peaks: Collection[Peak] - background: np.ndarray - phase_scale: int | float + peaks: Collection[BasePeak] + background: np.ndarray | int | float | Background = 0.0 + phase_scale: int | float = 1.0 wdt: int | float = 5 @model_validator(mode="after") def validate_parameters(self): - assert len(self.x) == len(self.background) + if not isinstance(self.background, (int, float)): + assert len(self.x) == len(self.background) return self + @property + def sorted_peaks(self): + return sorted(self.peaks, key=lambda p: p.centre) + + @timeit def calculate_profile(self): - return calculate_profile(self.x, self.peaks, self.background, self.wdt) + """calculates the profile with the parameters stored within self""" + + return calculate_profile( + x=self.x, + peaks=self.sorted_peaks, + background=self.background, + phase_scale=self.phase_scale, + wdt=self.wdt, + ) + + def refine( + self, + data: ScatteringData | XYEData | np.ndarray, + ): + """refine the profile against the data using the specified method""" -class ProfileRefinement(SettingsBase): - model_config = ConfigDict( - arbitrary_types_allowed=True, - ) +class ProfileRefinement(XRPDBaseModel): + data: ScatteringData # | list[ScatteringData] + refinement: Literal["Pawley", "Rietveld"] = "Pawley" + structure: Structure | Collection[Structure] | None = None + + """How can we divide down a reitveld refinement - + peaks pos/intensity, peak width function, background, detecor parameters + """ - x_data: np.ndarray - y_data: np.ndarray - cif_filepath: str | Path | None - wavelength: int | float = 1.5406 # CuKa1 - unit: Literal["tth"] = "tth" - radiation: str = "x-ray" - refinement: str = "Pawley" - structure: Structure | list[Structure] | None = None + def load_cif(self, cif_filepath: str | Path) -> Structure: + structure = Structure.load_from_cif(cif_filepath) - def load_cif(self): - assert self.cif_filepath is not None + return structure - self.structure = read_cif(self.cif_filepath) + 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 self.structure is not None: if isinstance(self.structure, Structure): return self.structure.calculate_peaks() - elif isinstance(self.structure, list): - return [f.calculate_peaks() for f in self.structure] + elif isinstance(self.structure, Collection): + raise NotImplementedError( + "Multiple phase calculation not implemented yet" + ) else: raise Exception("Unknown structure") + def residual(self): + peaks = self.calculate_peaks() + assert peaks is not None + hkl, f_abs, two_theta_degrees, intensity = peaks + residual = np.sum((self.data.y - intensity) ** 2) + return residual + if __name__ == "__main__": - # print(spglib.get_symmetry_from_database(27)) + cif_filepath = "/workspaces/XRPD-Toolbox/cifs/Si.cif" + two_theta_degrees = np.linspace(2, 150, 10000) - from xrpd_toolbox.utils.utils import normalise + # # elements = ["Si", "H", "O"] + # # plot_form_factors(elements) - cif_filepath = "/workspaces/XRPD-Toolbox/cifs/si.cif" + beam_energy = 15 + wavelength = beam_energy_to_wavelength(beam_energy) - # elements = ["Si", "Si", "Si"] + radiation = Radiation(radiation="xray", energy=beam_energy) - # atom_ff = get_x_ray_form_factor_parameters(elements) + si_structure = Structure.load_from_cif(cif_filepath) - # q_space = np.linspace(0.01, 10, 10000) + print(si_structure.model_dump_json()) - # ff = calculate_form_factor(elements, q_space) + data = ScatteringData.from_xye( + "/workspaces/outputs/step_scan/1414223.nxs_summed_mythen3.xye", + x_unit="tth", + data_type="xray", + wavelength=wavelength, + ) - beam_energy = 15 - wavelength = beam_energy_to_wavelength(beam_energy) + from xrpd_toolbox.utils.background import ( + ChebyshevBackground, + ) - si_structure = Structure.load_from_cif(cif_filepath) + background = ChebyshevBackground.estimate(data.x, data.y) + + # data.plot(False) + # background.plot() - print(si_structure.volume) + # print(data.model_dump_json()) - print(si_structure.spacegroup) - print(si_structure.spacegroup_number) + peaks = si_structure.to_peaks(wavelength=wavelength) - hkl, two_theta_degrees, intensity = si_structure.calculate_peaks( - wavelength=wavelength + # si_structure.plot_unit_cell() + + profile = CalculatedProfile( + x=data.x, peaks=peaks, background=background, phase_scale=1000 ) - intensity = normalise(intensity) * 4863.94 + calculated_profile1 = profile.calculate_profile() + + print(si_structure.model_dump()) + + # print(si_structure.spacegroup) + + # calculated_profile1 = si_structure.calculate_profile( + # x=two_theta_degrees, + # wavelength=wavelength, + # mode="powder", + # peak_type="gaussian", + # ) + + # si_structure.lattice.a += 0.2 + # si_structure.lattice.b += 0.2 + # si_structure.lattice.c += 0.2 - for miller, tth, i in zip(hkl, two_theta_degrees, intensity, strict=True): - print(f"{miller} {tth:.2f} {i:.2f}") + # calculated_profile2 = si_structure.calculate_profile( + # x=two_theta_degrees, + # wavelength=wavelength, + # mode="powder", + # peak_type="gaussian", + # ) - if tth > 75: - break + plt.plot(data.x, calculated_profile1, label="original lattice") + # plt.plot(two_theta_degrees, calculated_profile2, label="modified lattice") + plt.xlabel("2θ (degrees)") + plt.ylabel("Intensity (a.u.)") + plt.legend() + plt.show() diff --git a/src/xrpd_toolbox/utils/settings.py b/src/xrpd_toolbox/utils/settings.py deleted file mode 100644 index 11d9eb5..0000000 --- a/src/xrpd_toolbox/utils/settings.py +++ /dev/null @@ -1,102 +0,0 @@ -import json -import tomllib -from pathlib import Path - -import toml -import yaml -from pydantic import BaseModel - -SUPPORTED_FILE_TYPES = [".json", ".toml", ".yaml"] - - -class SettingsBase(BaseModel): - @classmethod - def load_from_toml(cls, filepath: str | Path): - with open(filepath, "rb") as file: - settings_dict = tomllib.load(file) - - return cls(**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(**settings_dict) - - @classmethod - def load_from_json(cls, filepath: str | Path): - with open(filepath, "rb") as file: - settings_dict = json.load(file) - return cls(**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}") diff --git a/src/xrpd_toolbox/utils/symmetry.py b/src/xrpd_toolbox/utils/symmetry.py index 7d3d703..ab3d90f 100644 --- a/src/xrpd_toolbox/utils/symmetry.py +++ b/src/xrpd_toolbox/utils/symmetry.py @@ -6,7 +6,8 @@ import numpy as np from yaml import safe_load -from xrpd_toolbox.utils.settings import SettingsBase +from xrpd_toolbox.utils.constants import get_spacegroup_symbol +from xrpd_toolbox.utils.settings import XRPDBaseModel _FRAC_RE = re.compile(r"([+-]?\d+)/(\d+)") @@ -38,6 +39,22 @@ def _replace_frac(match): 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, @@ -65,88 +82,6 @@ def lattice_to_matrix( return np.vstack([a_vec, b_vec, c_vec]) -def symmetry_ops_to_translations_and_rotations(ops): - ops = np.asarray(ops, dtype=str) - - # Split into (N,3) - coords = np.char.split(ops, ",") - coords = np.array(coords.tolist(), dtype="U50") - - # --------------------------------- - # NORMALISE: replace "-" with "+-" so we can split on "+" - # --------------------------------- - coords = np.char.replace(coords, "-", "+-") - - # remove leading "+" - coords = np.char.lstrip(coords, "+") - - # split into terms - terms = np.char.split(coords, "+") - terms = np.array(terms.tolist(), dtype=object) # (N,3,list) - - # --------------------------------- - # Flatten terms for vectorisation - # --------------------------------- - flat_terms = np.concatenate(terms.reshape(-1)) - - # Identify axis contributions - 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 - - # Coefficients - coeff = np.ones_like(flat_terms, dtype=float) - - coeff[np.char.startswith(flat_terms, "-")] = -1 - - # Build rotation contributions - rx = np.where(is_x, coeff, 0) - ry = np.where(is_y, coeff, 0) - rz = np.where(is_z, coeff, 0) - - # Translation terms (no x,y,z) - is_const = ~(is_x | is_y | is_z) - const_terms = np.where(is_const, flat_terms, "0") - - # Convert constants safely - const_terms = np.where(const_terms == "", "0", const_terms) - - # Handle fractions - frac_mask = np.char.find(const_terms, "/") >= 0 - - num = np.where(frac_mask, np.char.partition(const_terms, "/")[:, 0], const_terms) - den = np.where(frac_mask, np.char.partition(const_terms, "/")[:, 2], "1") - - const_vals = num.astype(float) / den.astype(float) - - # --------------------------------- - # Reassemble per symmetry op - # --------------------------------- - n_ops = len(ops) - - # Each coord has variable number of terms → need grouping - # lengths = np.array([len(t) for t in flat_terms.reshape(-1, 1)]).flatten() - - # Instead: rebuild via cumulative sums - split_sizes = np.array([len(t) for t in terms.reshape(-1)]) - - idx = np.repeat(np.arange(len(split_sizes)), split_sizes) - - # Sum contributions - 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) - - # reshape back to (N,3) - rotations = np.stack([rx_sum, ry_sum, rz_sum], axis=1).reshape(n_ops, 3, 3) - translations = t_sum.reshape(n_ops, 3) % 1.0 - - rotations = rotations.astype(int) - - return rotations, translations - - def _convert_symmetry_operations_yaml(): constants_folder = os.path.join(os.path.dirname(__file__), "constants") @@ -160,28 +95,30 @@ def _convert_symmetry_operations_yaml(): except Exception: raise - new_symmetry_operations = {} + new_spacegroups = {} for sg in symmetry_operations: - sg_name = sg["universal_h_m"].replace(" ", "") - sg["symops"] = frac_to_decimal_string(sg["symops"]) sg["ncsym"] = frac_to_decimal_string(sg["ncsym"]) - new_symmetry_operations[sg_name] = sg + sg_name = get_spacegroup_symbol(sg["number"]) - itc = IntTabCryst(spacegroups=new_symmetry_operations) + 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" ) - sg = itc["P 1 21"] - - print(sg) - -class SpaceGroup(SettingsBase): +class SpaceGroup(XRPDBaseModel): + spacegroup: str crystal_class: str hall: str hermann_mauguin: str @@ -210,8 +147,76 @@ class SpaceGroup(SettingsBase): # 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): - return symmetry_ops_to_translations_and_rotations(self.symops) + 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 @@ -230,7 +235,7 @@ def apply_symmetry(self, xyz: np.ndarray) -> np.ndarray: return pos -class IntTabCryst(SettingsBase): +class IntTabCryst(XRPDBaseModel): """The international crystallographuc tables in digital format The space groups are loaded from a yaml file @@ -241,18 +246,36 @@ class IntTabCryst(SettingsBase): spacegroups: dict[str, SpaceGroup] - def __getitem__(self, spacegroup_name: str) -> SpaceGroup: - sg_name = spacegroup_name.replace(" ", "") + 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(" ", "") - try: - sg = self.spacegroups[sg_name] - except KeyError: - try: - sg = self.spacegroups[self._assume_first_setting(sg_name)] - except Exception: - sg = None + 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 @@ -260,8 +283,17 @@ def __getitem__(self, spacegroup_name: str) -> SpaceGroup: 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 spacegroup_name + ":1" + return str(spacegroup_name) + ":1" @classmethod def load(cls, filepath: str | Path | None = None) -> "IntTabCryst": @@ -285,8 +317,18 @@ def get_symmetry_tables(): itc = get_symmetry_tables() - pnma = itc["Fm-3m"] + 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]]) - positions = np.array([[0, 0, 0]]) + # spacegroup.apply_symmetry(positions) - pnma.apply_symmetry(positions) + # print(itc["P42/mnm"]) diff --git a/src/xrpd_toolbox/utils/unit_conversion.py b/src/xrpd_toolbox/utils/unit_conversion.py index 7106146..e237abf 100644 --- a/src/xrpd_toolbox/utils/unit_conversion.py +++ b/src/xrpd_toolbox/utils/unit_conversion.py @@ -3,6 +3,7 @@ from typing import Literal import numpy as np +from numba import njit # constants ev_to_j = 1.602176634e-19 # electron volt to joule factor @@ -96,6 +97,11 @@ def d_to_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 @@ -119,3 +125,9 @@ def d_to_tof(d: float | np.ndarray, difa: float, difc: float, tzero: float = 0.0 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 fb69325..ccea26c 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -2,9 +2,11 @@ import os import re from collections import defaultdict -from collections.abc import Iterable +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 @@ -14,7 +16,7 @@ class AnalysisLogger: - def __init__(self, log_filepath, logging=False): + def __init__(self, log_filepath: str | Path, logging: bool = False): self.log_filepath = log_filepath self.logging = logging @@ -43,8 +45,8 @@ def log(self, *args, print_to_console=True): class NexusDatasetMapper: - def __init__(self, filepath): - self.filepath = filepath + def __init__(self, filepath: str | Path): + self.filepath = str(filepath) self._mapping = defaultdict(list) self._build_mapping() @@ -434,3 +436,49 @@ def rebin_together(x1, y1, x2, y2, num_points=None): y2_interp = f2(x_common) return x_common, y1_interp, y2_interp + + +def timeit(f): + """use this as a decorator to time a function""" + + @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 diff --git a/uv.lock b/uv.lock index 0101fc1..1f5fbe8 100644 --- a/uv.lock +++ b/uv.lock @@ -1526,6 +1526,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, ] +[[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.7" @@ -2493,11 +2506,62 @@ wheels = [ [[package]] name = "ruamel-yaml" -version = "0.19.1" +version = "0.18.17" 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" }, +dependencies = [ + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.15' and platform_python_implementation == 'CPython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/2b/7a1f1ebcd6b3f14febdc003e658778d81e76b40df2267904ee6b13f0c5c6/ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c", size = 149602, upload-time = "2025-12-17T20:02:55.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d", size = 121594, upload-time = "2025-12-17T20:02:07.657Z" }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/97/60fda20e2fb54b83a61ae14648b0817c8f5d84a3821e40bfbdae1437026a/ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600", size = 225794, upload-time = "2025-11-16T16:12:59.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/80/8ce7b9af532aa94dd83360f01ce4716264db73de6bc8efd22c32341f6658/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c583229f336682b7212a43d2fa32c30e643d3076178fb9f7a6a14dde85a2d8bd", size = 147998, upload-time = "2025-11-16T16:13:13.241Z" }, + { url = "https://files.pythonhosted.org/packages/53/09/de9d3f6b6701ced5f276d082ad0f980edf08ca67114523d1b9264cd5e2e0/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56ea19c157ed8c74b6be51b5fa1c3aff6e289a041575f0556f66e5fb848bb137", size = 132743, upload-time = "2025-11-16T16:13:14.265Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f7/73a9b517571e214fe5c246698ff3ed232f1ef863c8ae1667486625ec688a/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5fea0932358e18293407feb921d4f4457db837b67ec1837f87074667449f9401", size = 731459, upload-time = "2025-11-16T20:22:44.338Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a2/0dc0013169800f1c331a6f55b1282c1f4492a6d32660a0cf7b89e6684919/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71831bd61fbdb7aa0399d5c4da06bea37107ab5c79ff884cc07f2450910262", size = 749289, upload-time = "2025-11-16T16:13:15.633Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ed/3fb20a1a96b8dc645d88c4072df481fe06e0289e4d528ebbdcc044ebc8b3/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617d35dc765715fa86f8c3ccdae1e4229055832c452d4ec20856136acc75053f", size = 777630, upload-time = "2025-11-16T16:13:16.898Z" }, + { url = "https://files.pythonhosted.org/packages/60/50/6842f4628bc98b7aa4733ab2378346e1441e150935ad3b9f3c3c429d9408/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b45498cc81a4724a2d42273d6cfc243c0547ad7c6b87b4f774cb7bcc131c98d", size = 744368, upload-time = "2025-11-16T16:13:18.117Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b0/128ae8e19a7d794c2e36130a72b3bb650ce1dd13fb7def6cf10656437dcf/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:def5663361f6771b18646620fca12968aae730132e104688766cf8a3b1d65922", size = 745233, upload-time = "2025-11-16T20:22:45.833Z" }, + { url = "https://files.pythonhosted.org/packages/75/05/91130633602d6ba7ce3e07f8fc865b40d2a09efd4751c740df89eed5caf9/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:014181cdec565c8745b7cbc4de3bf2cc8ced05183d986e6d1200168e5bb59490", size = 770963, upload-time = "2025-11-16T16:13:19.344Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4b/fd4542e7f33d7d1bc64cc9ac9ba574ce8cf145569d21f5f20133336cdc8c/ruamel_yaml_clib-0.2.15-cp311-cp311-win32.whl", hash = "sha256:d290eda8f6ada19e1771b54e5706b8f9807e6bb08e873900d5ba114ced13e02c", size = 102640, upload-time = "2025-11-16T16:13:20.498Z" }, + { url = "https://files.pythonhosted.org/packages/bb/eb/00ff6032c19c7537371e3119287999570867a0eafb0154fccc80e74bf57a/ruamel_yaml_clib-0.2.15-cp311-cp311-win_amd64.whl", hash = "sha256:bdc06ad71173b915167702f55d0f3f027fc61abd975bd308a0968c02db4a4c3e", size = 121996, upload-time = "2025-11-16T16:13:21.855Z" }, + { url = "https://files.pythonhosted.org/packages/72/4b/5fde11a0722d676e469d3d6f78c6a17591b9c7e0072ca359801c4bd17eee/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff", size = 149088, upload-time = "2025-11-16T16:13:22.836Z" }, + { url = "https://files.pythonhosted.org/packages/85/82/4d08ac65ecf0ef3b046421985e66301a242804eb9a62c93ca3437dc94ee0/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2", size = 134553, upload-time = "2025-11-16T16:13:24.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/cb/22366d68b280e281a932403b76da7a988108287adff2bfa5ce881200107a/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1", size = 737468, upload-time = "2025-11-16T20:22:47.335Z" }, + { url = "https://files.pythonhosted.org/packages/71/73/81230babf8c9e33770d43ed9056f603f6f5f9665aea4177a2c30ae48e3f3/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71845d377c7a47afc6592aacfea738cc8a7e876d586dfba814501d8c53c1ba60", size = 753349, upload-time = "2025-11-16T16:13:26.269Z" }, + { url = "https://files.pythonhosted.org/packages/61/62/150c841f24cda9e30f588ef396ed83f64cfdc13b92d2f925bb96df337ba9/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e5499db1ccbc7f4b41f0565e4f799d863ea720e01d3e99fa0b7b5fcd7802c9", size = 788211, upload-time = "2025-11-16T16:13:27.441Z" }, + { url = "https://files.pythonhosted.org/packages/30/93/e79bd9cbecc3267499d9ead919bd61f7ddf55d793fb5ef2b1d7d92444f35/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b293a37dc97e2b1e8a1aec62792d1e52027087c8eea4fc7b5abd2bdafdd6642", size = 743203, upload-time = "2025-11-16T16:13:28.671Z" }, + { url = "https://files.pythonhosted.org/packages/8d/06/1eb640065c3a27ce92d76157f8efddb184bd484ed2639b712396a20d6dce/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:512571ad41bba04eac7268fe33f7f4742210ca26a81fe0c75357fa682636c690", size = 747292, upload-time = "2025-11-16T20:22:48.584Z" }, + { url = "https://files.pythonhosted.org/packages/a5/21/ee353e882350beab65fcc47a91b6bdc512cace4358ee327af2962892ff16/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5e9f630c73a490b758bf14d859a39f375e6999aea5ddd2e2e9da89b9953486a", size = 771624, upload-time = "2025-11-16T16:13:29.853Z" }, + { url = "https://files.pythonhosted.org/packages/57/34/cc1b94057aa867c963ecf9ea92ac59198ec2ee3a8d22a126af0b4d4be712/ruamel_yaml_clib-0.2.15-cp312-cp312-win32.whl", hash = "sha256:f4421ab780c37210a07d138e56dd4b51f8642187cdfb433eb687fe8c11de0144", size = 100342, upload-time = "2025-11-16T16:13:31.067Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e5/8925a4208f131b218f9a7e459c0d6fcac8324ae35da269cb437894576366/ruamel_yaml_clib-0.2.15-cp312-cp312-win_amd64.whl", hash = "sha256:2b216904750889133d9222b7b873c199d48ecbb12912aca78970f84a5aa1a4bc", size = 119013, upload-time = "2025-11-16T16:13:32.164Z" }, + { url = "https://files.pythonhosted.org/packages/17/5e/2f970ce4c573dc30c2f95825f2691c96d55560268ddc67603dc6ea2dd08e/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dcec721fddbb62e60c2801ba08c87010bd6b700054a09998c4d09c08147b8fb", size = 147450, upload-time = "2025-11-16T16:13:33.542Z" }, + { url = "https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471", size = 133139, upload-time = "2025-11-16T16:13:34.587Z" }, + { url = "https://files.pythonhosted.org/packages/dc/19/40d676802390f85784235a05788fd28940923382e3f8b943d25febbb98b7/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46895c17ead5e22bea5e576f1db7e41cb273e8d062c04a6a49013d9f60996c25", size = 731474, upload-time = "2025-11-16T20:22:49.934Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bb/6ef5abfa43b48dd55c30d53e997f8f978722f02add61efba31380d73e42e/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a", size = 748047, upload-time = "2025-11-16T16:13:35.633Z" }, + { url = "https://files.pythonhosted.org/packages/ff/5d/e4f84c9c448613e12bd62e90b23aa127ea4c46b697f3d760acc32cb94f25/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf", size = 782129, upload-time = "2025-11-16T16:13:36.781Z" }, + { url = "https://files.pythonhosted.org/packages/de/4b/e98086e88f76c00c88a6bcf15eae27a1454f661a9eb72b111e6bbb69024d/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab0df0648d86a7ecbd9c632e8f8d6b21bb21b5fc9d9e095c796cacf32a728d2d", size = 736848, upload-time = "2025-11-16T16:13:37.952Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5c/5964fcd1fd9acc53b7a3a5d9a05ea4f95ead9495d980003a557deb9769c7/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:331fb180858dd8534f0e61aa243b944f25e73a4dae9962bd44c46d1761126bbf", size = 741630, upload-time = "2025-11-16T20:22:51.718Z" }, + { url = "https://files.pythonhosted.org/packages/07/1e/99660f5a30fceb58494598e7d15df883a07292346ef5696f0c0ae5dee8c6/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4c928ddf6bce586285daa6d90680b9c291cfd045fc40aad34e445d57b1bf51", size = 766619, upload-time = "2025-11-16T16:13:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/fa0344a9327b58b54970e56a27b32416ffbcfe4dcc0700605516708579b2/ruamel_yaml_clib-0.2.15-cp313-cp313-win32.whl", hash = "sha256:bf0846d629e160223805db9fe8cc7aec16aaa11a07310c50c8c7164efa440aec", size = 100171, upload-time = "2025-11-16T16:13:40.456Z" }, + { url = "https://files.pythonhosted.org/packages/06/c4/c124fbcef0684fcf3c9b72374c2a8c35c94464d8694c50f37eef27f5a145/ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl", hash = "sha256:45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6", size = 118845, upload-time = "2025-11-16T16:13:41.481Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bd/ab8459c8bb759c14a146990bf07f632c1cbec0910d4853feeee4be2ab8bb/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:753faf20b3a5906faf1fc50e4ddb8c074cb9b251e00b14c18b28492f933ac8ef", size = 147248, upload-time = "2025-11-16T16:13:42.872Z" }, + { url = "https://files.pythonhosted.org/packages/69/f2/c4cec0a30f1955510fde498aac451d2e52b24afdbcb00204d3a951b772c3/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:480894aee0b29752560a9de46c0e5f84a82602f2bc5c6cde8db9a345319acfdf", size = 133764, upload-time = "2025-11-16T16:13:43.932Z" }, + { url = "https://files.pythonhosted.org/packages/82/c7/2480d062281385a2ea4f7cc9476712446e0c548cd74090bff92b4b49e898/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d3b58ab2454b4747442ac76fab66739c72b1e2bb9bd173d7694b9f9dbc9c000", size = 730537, upload-time = "2025-11-16T20:22:52.918Z" }, + { url = "https://files.pythonhosted.org/packages/75/08/e365ee305367559f57ba6179d836ecc3d31c7d3fdff2a40ebf6c32823a1f/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfd309b316228acecfa30670c3887dcedf9b7a44ea39e2101e75d2654522acd4", size = 746944, upload-time = "2025-11-16T16:13:45.338Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/8b56b08db91e569d0a4fbfa3e492ed2026081bdd7e892f63ba1c88a2f548/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2812ff359ec1f30129b62372e5f22a52936fac13d5d21e70373dbca5d64bb97c", size = 778249, upload-time = "2025-11-16T16:13:46.871Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1d/70dbda370bd0e1a92942754c873bd28f513da6198127d1736fa98bb2a16f/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7e74ea87307303ba91073b63e67f2c667e93f05a8c63079ee5b7a5c8d0d7b043", size = 737140, upload-time = "2025-11-16T16:13:48.349Z" }, + { url = "https://files.pythonhosted.org/packages/5b/87/822d95874216922e1120afb9d3fafa795a18fdd0c444f5c4c382f6dac761/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:713cd68af9dfbe0bb588e144a61aad8dcc00ef92a82d2e87183ca662d242f524", size = 741070, upload-time = "2025-11-16T20:22:54.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/17/4e01a602693b572149f92c983c1f25bd608df02c3f5cf50fd1f94e124a59/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:542d77b72786a35563f97069b9379ce762944e67055bea293480f7734b2c7e5e", size = 765882, upload-time = "2025-11-16T16:13:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/9f/17/7999399081d39ebb79e807314de6b611e1d1374458924eb2a489c01fc5ad/ruamel_yaml_clib-0.2.15-cp314-cp314-win32.whl", hash = "sha256:424ead8cef3939d690c4b5c85ef5b52155a231ff8b252961b6516ed7cf05f6aa", size = 102567, upload-time = "2025-11-16T16:13:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/67/be582a7370fdc9e6846c5be4888a530dcadd055eef5b932e0e85c33c7d73/ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467", size = 122847, upload-time = "2025-11-16T16:13:51.807Z" }, ] [[package]] @@ -2974,9 +3038,11 @@ dependencies = [ { name = "matplotlib" }, { name = "numba" }, { name = "numpy" }, + { name = "numpydantic" }, { name = "pandas" }, { name = "peakutils" }, { name = "pycifrw" }, + { name = "pydantic" }, { name = "pyfai" }, { name = "pymatgen" }, { name = "pyqt6" }, @@ -3009,9 +3075,11 @@ requires-dist = [ { name = "matplotlib" }, { name = "numba" }, { name = "numpy" }, + { name = "numpydantic" }, { name = "pandas" }, { name = "peakutils" }, { name = "pycifrw" }, + { name = "pydantic" }, { name = "pyfai" }, { name = "pymatgen" }, { name = "pyqt6" }, From 1d5c114f6029fffff6c7cfdaf883d078565ec09b Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 08:49:31 +0000 Subject: [PATCH 60/86] fix core import --- src/xrpd_toolbox/utils/atom.py | 2 +- src/xrpd_toolbox/utils/background.py | 2 +- src/xrpd_toolbox/utils/lattice.py | 2 +- src/xrpd_toolbox/utils/peaks.py | 2 +- src/xrpd_toolbox/utils/symmetry.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xrpd_toolbox/utils/atom.py b/src/xrpd_toolbox/utils/atom.py index 1cd499d..cadea91 100644 --- a/src/xrpd_toolbox/utils/atom.py +++ b/src/xrpd_toolbox/utils/atom.py @@ -2,7 +2,7 @@ import numpy.typing as npt from pydantic import computed_field -from xrpd_toolbox.utils.settings import XRPDBaseModel +from xrpd_toolbox.utils.core import XRPDBaseModel class Atom(XRPDBaseModel): diff --git a/src/xrpd_toolbox/utils/background.py b/src/xrpd_toolbox/utils/background.py index e75c164..30cf903 100644 --- a/src/xrpd_toolbox/utils/background.py +++ b/src/xrpd_toolbox/utils/background.py @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt import numpy as np -from xrpd_toolbox.utils.settings import XRPDBaseModel +from xrpd_toolbox.utils.core import XRPDBaseModel class Background(XRPDBaseModel): diff --git a/src/xrpd_toolbox/utils/lattice.py b/src/xrpd_toolbox/utils/lattice.py index a858401..b963c36 100644 --- a/src/xrpd_toolbox/utils/lattice.py +++ b/src/xrpd_toolbox/utils/lattice.py @@ -1,6 +1,6 @@ import numpy as np -from xrpd_toolbox.utils.settings import XRPDBaseModel +from xrpd_toolbox.utils.core import XRPDBaseModel class Lattice(XRPDBaseModel): diff --git a/src/xrpd_toolbox/utils/peaks.py b/src/xrpd_toolbox/utils/peaks.py index cff869c..07fc86e 100644 --- a/src/xrpd_toolbox/utils/peaks.py +++ b/src/xrpd_toolbox/utils/peaks.py @@ -10,7 +10,7 @@ from scipy.optimize import curve_fit from scipy.special import erf -from xrpd_toolbox.utils.settings import XRPDBaseModel +from xrpd_toolbox.utils.core import XRPDBaseModel IMPLEMENTED_PEAK_FUNCTONS: TypeAlias = Literal[ "gaussian", "lorentzian", "pseudo_voigt", "tophat" diff --git a/src/xrpd_toolbox/utils/symmetry.py b/src/xrpd_toolbox/utils/symmetry.py index ab3d90f..117fb81 100644 --- a/src/xrpd_toolbox/utils/symmetry.py +++ b/src/xrpd_toolbox/utils/symmetry.py @@ -7,7 +7,7 @@ from yaml import safe_load from xrpd_toolbox.utils.constants import get_spacegroup_symbol -from xrpd_toolbox.utils.settings import XRPDBaseModel +from xrpd_toolbox.utils.core import XRPDBaseModel _FRAC_RE = re.compile(r"([+-]?\d+)/(\d+)") From 81058cb91fb952d9bf26859db17c3bb1320c99a3 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 08:50:54 +0000 Subject: [PATCH 61/86] changed cif name --- cifs/si.cif | 226 ---------------------------------------------------- 1 file changed, 226 deletions(-) delete mode 100644 cifs/si.cif diff --git a/cifs/si.cif b/cifs/si.cif deleted file mode 100644 index 3befb8c..0000000 --- a/cifs/si.cif +++ /dev/null @@ -1,226 +0,0 @@ -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 From 218caf66ae9df815e3bf0a67457d0c049cf6b176 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 08:51:06 +0000 Subject: [PATCH 62/86] changed cif name --- cifs/Si.cif | 226 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 cifs/Si.cif 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 From 91e723bfa2ce07623f0805d68645db1fea2da554 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 08:55:42 +0000 Subject: [PATCH 63/86] moved fitting files --- src/xrpd_toolbox/{utils => }/core.py | 0 src/xrpd_toolbox/fit_engine/__init__.py | 0 src/xrpd_toolbox/{utils => fit_engine}/atom.py | 0 .../{utils => fit_engine}/background.py | 0 .../{utils => fit_engine}/constants.py | 0 .../constants/atom_form_factors.csv | 0 .../international_tables_of_crystallography.yaml | 0 .../constants/symmetry_operations.yaml | 0 .../{utils => fit_engine}/form_factors.py | 0 .../{utils => fit_engine}/lattice.py | 0 src/xrpd_toolbox/{utils => fit_engine}/peaks.py | 0 .../{utils => fit_engine}/profile_calculation.py | 16 ++++++++-------- .../{utils => fit_engine}/symmetry.py | 0 13 files changed, 8 insertions(+), 8 deletions(-) rename src/xrpd_toolbox/{utils => }/core.py (100%) create mode 100644 src/xrpd_toolbox/fit_engine/__init__.py rename src/xrpd_toolbox/{utils => fit_engine}/atom.py (100%) rename src/xrpd_toolbox/{utils => fit_engine}/background.py (100%) rename src/xrpd_toolbox/{utils => fit_engine}/constants.py (100%) rename src/xrpd_toolbox/{utils => fit_engine}/constants/atom_form_factors.csv (100%) rename src/xrpd_toolbox/{utils => fit_engine}/constants/international_tables_of_crystallography.yaml (100%) rename src/xrpd_toolbox/{utils => fit_engine}/constants/symmetry_operations.yaml (100%) rename src/xrpd_toolbox/{utils => fit_engine}/form_factors.py (100%) rename src/xrpd_toolbox/{utils => fit_engine}/lattice.py (100%) rename src/xrpd_toolbox/{utils => fit_engine}/peaks.py (100%) rename src/xrpd_toolbox/{utils => fit_engine}/profile_calculation.py (98%) rename src/xrpd_toolbox/{utils => fit_engine}/symmetry.py (100%) diff --git a/src/xrpd_toolbox/utils/core.py b/src/xrpd_toolbox/core.py similarity index 100% rename from src/xrpd_toolbox/utils/core.py rename to src/xrpd_toolbox/core.py diff --git a/src/xrpd_toolbox/fit_engine/__init__.py b/src/xrpd_toolbox/fit_engine/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/xrpd_toolbox/utils/atom.py b/src/xrpd_toolbox/fit_engine/atom.py similarity index 100% rename from src/xrpd_toolbox/utils/atom.py rename to src/xrpd_toolbox/fit_engine/atom.py diff --git a/src/xrpd_toolbox/utils/background.py b/src/xrpd_toolbox/fit_engine/background.py similarity index 100% rename from src/xrpd_toolbox/utils/background.py rename to src/xrpd_toolbox/fit_engine/background.py diff --git a/src/xrpd_toolbox/utils/constants.py b/src/xrpd_toolbox/fit_engine/constants.py similarity index 100% rename from src/xrpd_toolbox/utils/constants.py rename to src/xrpd_toolbox/fit_engine/constants.py diff --git a/src/xrpd_toolbox/utils/constants/atom_form_factors.csv b/src/xrpd_toolbox/fit_engine/constants/atom_form_factors.csv similarity index 100% rename from src/xrpd_toolbox/utils/constants/atom_form_factors.csv rename to src/xrpd_toolbox/fit_engine/constants/atom_form_factors.csv diff --git a/src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml b/src/xrpd_toolbox/fit_engine/constants/international_tables_of_crystallography.yaml similarity index 100% rename from src/xrpd_toolbox/utils/constants/international_tables_of_crystallography.yaml rename to src/xrpd_toolbox/fit_engine/constants/international_tables_of_crystallography.yaml diff --git a/src/xrpd_toolbox/utils/constants/symmetry_operations.yaml b/src/xrpd_toolbox/fit_engine/constants/symmetry_operations.yaml similarity index 100% rename from src/xrpd_toolbox/utils/constants/symmetry_operations.yaml rename to src/xrpd_toolbox/fit_engine/constants/symmetry_operations.yaml diff --git a/src/xrpd_toolbox/utils/form_factors.py b/src/xrpd_toolbox/fit_engine/form_factors.py similarity index 100% rename from src/xrpd_toolbox/utils/form_factors.py rename to src/xrpd_toolbox/fit_engine/form_factors.py diff --git a/src/xrpd_toolbox/utils/lattice.py b/src/xrpd_toolbox/fit_engine/lattice.py similarity index 100% rename from src/xrpd_toolbox/utils/lattice.py rename to src/xrpd_toolbox/fit_engine/lattice.py diff --git a/src/xrpd_toolbox/utils/peaks.py b/src/xrpd_toolbox/fit_engine/peaks.py similarity index 100% rename from src/xrpd_toolbox/utils/peaks.py rename to src/xrpd_toolbox/fit_engine/peaks.py diff --git a/src/xrpd_toolbox/utils/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py similarity index 98% rename from src/xrpd_toolbox/utils/profile_calculation.py rename to src/xrpd_toolbox/fit_engine/profile_calculation.py index 45fb4f4..ec91048 100644 --- a/src/xrpd_toolbox/utils/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -10,16 +10,16 @@ from numba import njit, prange from pydantic import model_validator -from xrpd_toolbox.utils.atom import Atoms -from xrpd_toolbox.utils.background import Background -from xrpd_toolbox.utils.constants import ( +from xrpd_toolbox.core import XRPDBaseModel +from xrpd_toolbox.fit_engine.atom import Atoms +from xrpd_toolbox.fit_engine.background import Background +from xrpd_toolbox.fit_engine.constants import ( ELEMENT_ATOMIC_NUMBER, ) -from xrpd_toolbox.utils.core import XRPDBaseModel -from xrpd_toolbox.utils.form_factors import X_RAY_FORM_FACTORS -from xrpd_toolbox.utils.lattice import Lattice -from xrpd_toolbox.utils.peaks import BasePeak, peak_factory -from xrpd_toolbox.utils.symmetry import ( +from xrpd_toolbox.fit_engine.form_factors import X_RAY_FORM_FACTORS +from xrpd_toolbox.fit_engine.lattice import Lattice +from xrpd_toolbox.fit_engine.peaks import BasePeak, peak_factory +from xrpd_toolbox.fit_engine.symmetry import ( SpaceGroup, format_space_group_name, get_symmetry_tables, diff --git a/src/xrpd_toolbox/utils/symmetry.py b/src/xrpd_toolbox/fit_engine/symmetry.py similarity index 100% rename from src/xrpd_toolbox/utils/symmetry.py rename to src/xrpd_toolbox/fit_engine/symmetry.py From 8464e3a67e29eaf65e5177a8e3d75ad50498303b Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 08:56:09 +0000 Subject: [PATCH 64/86] renamed file --- src/xrpd_toolbox/fit_engine/symmetry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/xrpd_toolbox/fit_engine/symmetry.py b/src/xrpd_toolbox/fit_engine/symmetry.py index 117fb81..f14cf25 100644 --- a/src/xrpd_toolbox/fit_engine/symmetry.py +++ b/src/xrpd_toolbox/fit_engine/symmetry.py @@ -6,8 +6,8 @@ import numpy as np from yaml import safe_load -from xrpd_toolbox.utils.constants import get_spacegroup_symbol -from xrpd_toolbox.utils.core import XRPDBaseModel +from xrpd_toolbox.core import XRPDBaseModel +from xrpd_toolbox.fit_engine.constants import get_spacegroup_symbol _FRAC_RE = re.compile(r"([+-]?\d+)/(\d+)") From 3044d29752de5fb977db45f26e14ab182b91942b Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 08:57:15 +0000 Subject: [PATCH 65/86] changed import locations --- src/xrpd_toolbox/fit_engine/atom.py | 2 +- src/xrpd_toolbox/fit_engine/background.py | 2 +- src/xrpd_toolbox/fit_engine/lattice.py | 2 +- src/xrpd_toolbox/fit_engine/peaks.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/xrpd_toolbox/fit_engine/atom.py b/src/xrpd_toolbox/fit_engine/atom.py index cadea91..e9fb31d 100644 --- a/src/xrpd_toolbox/fit_engine/atom.py +++ b/src/xrpd_toolbox/fit_engine/atom.py @@ -2,7 +2,7 @@ import numpy.typing as npt from pydantic import computed_field -from xrpd_toolbox.utils.core import XRPDBaseModel +from xrpd_toolbox.core import XRPDBaseModel class Atom(XRPDBaseModel): diff --git a/src/xrpd_toolbox/fit_engine/background.py b/src/xrpd_toolbox/fit_engine/background.py index 30cf903..17b6c83 100644 --- a/src/xrpd_toolbox/fit_engine/background.py +++ b/src/xrpd_toolbox/fit_engine/background.py @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt import numpy as np -from xrpd_toolbox.utils.core import XRPDBaseModel +from xrpd_toolbox.core import XRPDBaseModel class Background(XRPDBaseModel): diff --git a/src/xrpd_toolbox/fit_engine/lattice.py b/src/xrpd_toolbox/fit_engine/lattice.py index b963c36..a4ce58f 100644 --- a/src/xrpd_toolbox/fit_engine/lattice.py +++ b/src/xrpd_toolbox/fit_engine/lattice.py @@ -1,6 +1,6 @@ import numpy as np -from xrpd_toolbox.utils.core import XRPDBaseModel +from xrpd_toolbox.core import XRPDBaseModel class Lattice(XRPDBaseModel): diff --git a/src/xrpd_toolbox/fit_engine/peaks.py b/src/xrpd_toolbox/fit_engine/peaks.py index 07fc86e..7999e02 100644 --- a/src/xrpd_toolbox/fit_engine/peaks.py +++ b/src/xrpd_toolbox/fit_engine/peaks.py @@ -10,7 +10,7 @@ from scipy.optimize import curve_fit from scipy.special import erf -from xrpd_toolbox.utils.core import XRPDBaseModel +from xrpd_toolbox.core import XRPDBaseModel IMPLEMENTED_PEAK_FUNCTONS: TypeAlias = Literal[ "gaussian", "lorentzian", "pseudo_voigt", "tophat" From 1e1613690887ad891e9be5323aae97de5ea51c57 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 08:58:32 +0000 Subject: [PATCH 66/86] change import locations --- src/xrpd_toolbox/i11/mythen.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index d8fb47f..6178bbf 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -15,11 +15,11 @@ from h5py import Dataset, File from pydantic import BaseModel, Field -from xrpd_toolbox.utils.core import XRPDBaseModel +from xrpd_toolbox.core import XRPDBaseModel +from xrpd_toolbox.fit_engine.peaks import fit_peaks +from xrpd_toolbox.fit_engine.profile_calculation import Structure from xrpd_toolbox.utils.messenger import Messenger from xrpd_toolbox.utils.mythen_utils import channel_to_angle, modules_to_pixels -from xrpd_toolbox.utils.peaks import fit_peaks -from xrpd_toolbox.utils.profile_calculation import Structure from xrpd_toolbox.utils.utils import ( bin_and_propagate_errors, get_calibrant_peaks, From f537a24a916206a1dcb8e47e7a33d6eb6bce8193 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 09:19:31 +0000 Subject: [PATCH 67/86] add fit engine import to background --- src/xrpd_toolbox/fit_engine/profile_calculation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index ec91048..c921361 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -1348,7 +1348,7 @@ def residual(self): wavelength=wavelength, ) - from xrpd_toolbox.utils.background import ( + from xrpd_toolbox.fit_engine.background import ( ChebyshevBackground, ) From d7922c169d08049eb8fdf8d6197eb919250e69ea Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 09:25:12 +0000 Subject: [PATCH 68/86] remove redudant shifts --- .../fit_engine/profile_calculation.py | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index c921361..17baf88 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -831,31 +831,12 @@ def plot_unit_cell( shifts = np.array( [ - [-1, -1, -1], - [-1, -1, 0], - [-1, -1, 1], - [-1, 0, -1], - [-1, 0, 0], - [-1, 0, 1], - [-1, 1, -1], - [-1, 1, 0], - [-1, 1, 1], - [0, -1, -1], - [0, -1, 0], - [0, -1, 1], - [0, 0, -1], [0, 0, 0], [0, 0, 1], - [0, 1, -1], [0, 1, 0], [0, 1, 1], - [1, -1, -1], - [1, -1, 0], - [1, -1, 1], - [1, 0, -1], [1, 0, 0], [1, 0, 1], - [1, 1, -1], [1, 1, 0], [1, 1, 1], ], @@ -1338,6 +1319,7 @@ def residual(self): radiation = Radiation(radiation="xray", energy=beam_energy) si_structure = Structure.load_from_cif(cif_filepath) + si_structure.plot_unit_cell() print(si_structure.model_dump_json()) @@ -1361,8 +1343,6 @@ def residual(self): peaks = si_structure.to_peaks(wavelength=wavelength) - # si_structure.plot_unit_cell() - profile = CalculatedProfile( x=data.x, peaks=peaks, background=background, phase_scale=1000 ) From 36927c7982822b96afbe6c23192f5d73fd0edee6 Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Wed, 15 Apr 2026 10:06:48 +0000 Subject: [PATCH 69/86] tidy up --- src/xrpd_toolbox/core.py | 12 +- src/xrpd_toolbox/fit_engine/background.py | 8 +- src/xrpd_toolbox/fit_engine/lattice.py | 4 + src/xrpd_toolbox/fit_engine/peaks.py | 108 ++++++++++-------- .../fit_engine/profile_calculation.py | 71 +++++------- 5 files changed, 99 insertions(+), 104 deletions(-) diff --git a/src/xrpd_toolbox/core.py b/src/xrpd_toolbox/core.py index eee8ecb..245c441 100644 --- a/src/xrpd_toolbox/core.py +++ b/src/xrpd_toolbox/core.py @@ -114,8 +114,6 @@ class Parameter(XRPDBaseModel): value: int | float refine: bool = True - __array_priority__ = 1000 # ensures numpy uses this class first - # Conversions def __float__(self) -> float: return float(self.value) @@ -174,9 +172,7 @@ def __rmod__(self, other: int | float | Parameter) -> Parameter: def __rpow__(self, other: int | float | Parameter) -> Parameter: return Parameter(value=self._get_value(other) ** self.value) - # ------------------------ # In-place operations - # ------------------------ def __iadd__(self, other: int | float | Parameter): self.value += self._get_value(other) return self @@ -223,6 +219,10 @@ def __ge__(self, other: int | float | Parameter) -> bool: if __name__ == "__main__": - x = Parameter(value=3) + import numpy as np + + x = np.array([1, 1, 1]) + Parameter(value=3) + + g = XRPDBaseModel() - print(x) + print(x, g) diff --git a/src/xrpd_toolbox/fit_engine/background.py b/src/xrpd_toolbox/fit_engine/background.py index 17b6c83..edbd5b4 100644 --- a/src/xrpd_toolbox/fit_engine/background.py +++ b/src/xrpd_toolbox/fit_engine/background.py @@ -32,13 +32,13 @@ def __add__(self, other): if isinstance(other, "Background"): other = other.calculate() - return np.asarray(other) + self.calculate(self.x) + return self.calculate(self.x) + np.asarray(other) def __radd__(self, other): return np.asarray(other) + self.calculate(self.x) - def __array__(self): - return self.calculate() + def __array__(self, other): + return other + self.calculate() def plot(self, show: bool = True): plt.plot(self.x, self.calculate(), label=f"{type(self).__name__}") @@ -107,7 +107,7 @@ def estimate( y: np.ndarray, degree: int = 8, mask: bool = True, - mask_step: int = 20, + mask_step: int = 50, ) -> "ChebyshevBackground": # this is a very simple estimation method that fits # a Chebyshev polynomial to the data diff --git a/src/xrpd_toolbox/fit_engine/lattice.py b/src/xrpd_toolbox/fit_engine/lattice.py index a4ce58f..a796c86 100644 --- a/src/xrpd_toolbox/fit_engine/lattice.py +++ b/src/xrpd_toolbox/fit_engine/lattice.py @@ -120,3 +120,7 @@ class CubicLattice(Lattice): def __init__(self, a: float, **kwargs): super().__init__(a=a, b=a, c=a, alpha=90.0, beta=90.0, gamma=90.0) + + +if __name__ == "__main__": + pass diff --git a/src/xrpd_toolbox/fit_engine/peaks.py b/src/xrpd_toolbox/fit_engine/peaks.py index 7999e02..abc597f 100644 --- a/src/xrpd_toolbox/fit_engine/peaks.py +++ b/src/xrpd_toolbox/fit_engine/peaks.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import math from abc import abstractmethod from collections.abc import Collection @@ -227,56 +229,6 @@ def closest_indices(arr1, arr2): return idx -class BasePeak(XRPDBaseModel): - amplitude: float | int = Field(gt=0) - centre: float | int - fwhm: float | int = Field(gt=0, default=0.1) - background: float | int = 0 - normalised: bool = True # if normalised the - - @abstractmethod - def calculate(self, x: np.ndarray) -> np.ndarray: - NotImplementedError("Must implement calculate method in peak subclass") - - -class GaussianPeak(BasePeak): - def calculate(self, x: np.ndarray) -> np.ndarray: - return gaussian(x, self.amplitude, self.centre, self.fwhm) - - -class LorentzianPeak(BasePeak): - def calculate(self, x: np.ndarray) -> np.ndarray: - return lorentzian(x, self.amplitude, self.centre, self.fwhm) - - -class PseudoVoigtPeak(BasePeak): - eta: 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, - self.amplitude, - self.centre, - self.fwhm, - self.eta, - ) - - -class TopHatPeak(BasePeak): - epsilon: float | int = Field(ge=0, le=1, default=0) # used for tophat - smoothing - - def calculate(self, x: np.ndarray) -> np.ndarray: - return smooth_tophat( - x, - self.amplitude, - self.centre, - self.fwhm, - self.epsilon, - ) - - def peak_factory(peak_type: str): match peak_type: case "gaussian": @@ -456,5 +408,61 @@ def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[BasePeak]: return fitted_peaks +class BasePeak(XRPDBaseModel): + amplitude: float | int = Field(gt=0) + centre: float | int + fwhm: float | int = Field(gt=0, default=0.1) + background: float | int = 0 + normalised: bool = True # if normalised the + + @abstractmethod + def calculate(self, x: np.ndarray) -> np.ndarray: + NotImplementedError("Must implement calculate method in peak subclass") + + +class GaussianPeak(BasePeak): + def calculate(self, x: np.ndarray) -> np.ndarray: + return gaussian(x, self.amplitude, self.centre, self.fwhm) + + +class LorentzianPeak(BasePeak): + def calculate(self, x: np.ndarray) -> np.ndarray: + return lorentzian(x, self.amplitude, self.centre, self.fwhm) + + +class PseudoVoigtPeak(BasePeak): + eta: 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, + self.amplitude, + self.centre, + self.fwhm, + self.eta, + ) + + +class TopHatPeak(BasePeak): + epsilon: float | int = Field(ge=0, le=1, default=0) # used for tophat - smoothing + + def calculate(self, x: np.ndarray) -> np.ndarray: + return smooth_tophat( + x, + self.amplitude, + self.centre, + self.fwhm, + self.epsilon, + ) + + +class PeakShapeFunction(XRPDBaseModel): + @abstractmethod + def calculate(self): + pass + + if __name__ == "__main__": pass diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index 17baf88..0ad96b8 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -61,6 +61,20 @@ def b_iso_to_u_iso(b_iso: np.ndarray) -> np.ndarray: return b_iso / (8 * np.pi**2) +def calculate_chi_squared( + ycalc: np.ndarray, yobs: np.ndarray, y_err: np.ndarray | None +): + if y_err is not None: + wi = 1 / (y_err**2) + else: + wi = 1 / ycalc + + residual = wi * ((yobs - ycalc) ** 2) + chi_squared = np.sum(residual) + + return chi_squared + + def merge_peaks( two_theta, intensity, hkl, tol=1e-5 ) -> tuple[np.ndarray, np.ndarray, list]: @@ -868,19 +882,10 @@ def plot_unit_cell( for el, pos in zip(elements, positions, strict=True): print(f"{el}: {pos}") - # ---------------------------- - # Coordinate transform - # ---------------------------- - # if cartesian: - # coords = positions @ self.lattice.matrix.T - # xlabel, ylabel, zlabel = "x (Å)", "y (Å)", "z (Å)" - # else: coords = positions xlabel, ylabel, zlabel = "a", "b", "c" - # ---------------------------- # Colors - # ---------------------------- unique_elements = np.unique(elements) cmap = plt.cm.get_cmap("tab10", len(unique_elements)) @@ -888,14 +893,10 @@ def plot_unit_cell( 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") @@ -911,9 +912,7 @@ def plot_unit_cell( # label=unique_elements, ) - # ---------------------------- # Formatting - # ---------------------------- ax.set_xlabel(xlabel) ax.set_ylabel(ylabel) ax.set_zlabel(zlabel) @@ -1022,17 +1021,6 @@ def read_cif(cif_filepath: str | Path, block_number: int = 0) -> tuple: "occupancies": occupancies, } - # atoms = [ - # Atom( - # label=atom_labels[i], - # element=elements[i], - # xyz=np.array([x[i], y[i], z[i]], dtype=float), - # b_iso=float(b_iso[i]), - # occupancy=float(occupancies[i]), - # ) - # for i in range(len(x)) - # ] - 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"]) @@ -1230,8 +1218,6 @@ def from_fullprof( ##### more complex pydantic models to do whole profiles - - class CalculatedProfile(XRPDBaseModel): x: np.ndarray peaks: Collection[BasePeak] @@ -1271,6 +1257,7 @@ def refine( class ProfileRefinement(XRPDBaseModel): data: ScatteringData # | list[ScatteringData] refinement: Literal["Pawley", "Rietveld"] = "Pawley" + background: np.ndarray | float | int | Background = 0 structure: Structure | Collection[Structure] | None = None """How can we divide down a reitveld refinement - @@ -1298,33 +1285,29 @@ def calculate_peaks(self): else: raise Exception("Unknown structure") - def residual(self): + def chi_squared(self): + # http://pd.chem.ucl.ac.uk/pdnn/refine1/practice.htm + peaks = self.calculate_peaks() + assert peaks is not None hkl, f_abs, two_theta_degrees, intensity = peaks - residual = np.sum((self.data.y - intensity) ** 2) - return residual + + return calculate_chi_squared(intensity, self.data.y, self.data.e) if __name__ == "__main__": cif_filepath = "/workspaces/XRPD-Toolbox/cifs/Si.cif" - two_theta_degrees = np.linspace(2, 150, 10000) - - # # elements = ["Si", "H", "O"] - # # plot_form_factors(elements) + si_structure = Structure.load_from_cif(cif_filepath) + si_structure.plot_unit_cell() + print(si_structure) beam_energy = 15 wavelength = beam_energy_to_wavelength(beam_energy) - radiation = Radiation(radiation="xray", energy=beam_energy) - si_structure = Structure.load_from_cif(cif_filepath) - si_structure.plot_unit_cell() - - print(si_structure.model_dump_json()) - data = ScatteringData.from_xye( - "/workspaces/outputs/step_scan/1414223.nxs_summed_mythen3.xye", + "/workspaces/outputs/1429744_summed_mythen3.xye", x_unit="tth", data_type="xray", wavelength=wavelength, @@ -1336,8 +1319,8 @@ def residual(self): background = ChebyshevBackground.estimate(data.x, data.y) - # data.plot(False) - # background.plot() + data.plot(False) + background.plot() # print(data.model_dump_json()) From bd6dfb7510d4f3fa2de7eca72c359f3d16d0f227 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 15 Apr 2026 11:48:35 +0000 Subject: [PATCH 70/86] add coeffs to background --- src/xrpd_toolbox/fit_engine/background.py | 27 ++++++++++--------- .../fit_engine/profile_calculation.py | 7 ++++- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/xrpd_toolbox/fit_engine/background.py b/src/xrpd_toolbox/fit_engine/background.py index edbd5b4..a656cf1 100644 --- a/src/xrpd_toolbox/fit_engine/background.py +++ b/src/xrpd_toolbox/fit_engine/background.py @@ -37,8 +37,8 @@ def __add__(self, other): def __radd__(self, other): return np.asarray(other) + self.calculate(self.x) - def __array__(self, other): - return other + self.calculate() + def __array__(self): + return self.calculate() def plot(self, show: bool = True): plt.plot(self.x, self.calculate(), label=f"{type(self).__name__}") @@ -100,6 +100,12 @@ def calculate(self, x: np.ndarray | None = None) -> np.ndarray: x = self.x 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] + @classmethod def estimate( cls, @@ -134,22 +140,14 @@ def estimate( class LinearInterpolationBackground(Background): - y: np.ndarray - indices: np.ndarray + x_sample: np.ndarray + y_sample: np.ndarray def calculate(self, x: np.ndarray | None = None) -> np.ndarray: if x is None: x = self.x return np.interp(x, self.x_sample, self.y_sample) - @property - def x_sample(self): - return self.x[self.indices] - - @property - def y_sample(self): - return self.y[self.indices] - @classmethod def estimate( cls, @@ -164,4 +162,7 @@ def estimate( 0, len(x), len(x) // points ) # select every mask_step points (20 by default) - return cls(x=x, y=y, indices=indices) + x_sample = x[indices] + y_sample = y[indices] + + return cls(x=x, x_sample=x_sample, y_sample=y_sample) diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index 0ad96b8..66e30d5 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -1307,7 +1307,8 @@ def chi_squared(self): radiation = Radiation(radiation="xray", energy=beam_energy) data = ScatteringData.from_xye( - "/workspaces/outputs/1429744_summed_mythen3.xye", + "/workspaces/outputs/step_scan/1410696.nxs_summed_mythen3.xye", + # "/workspaces/outputs/1429744_summed_mythen3.xye", x_unit="tth", data_type="xray", wavelength=wavelength, @@ -1318,6 +1319,10 @@ def chi_squared(self): ) background = ChebyshevBackground.estimate(data.x, data.y) + background.add_coefficient() + print(background.coefficients) + background.remove_coefficient() + print(background.coefficients) data.plot(False) background.plot() From 3c68b3af382e202bbf4456f0a5315e5b7598fbd4 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 23 Apr 2026 14:48:53 +0000 Subject: [PATCH 71/86] basic refinement --- src/xrpd_toolbox/core.py | 407 ++++++++++++++---- src/xrpd_toolbox/fit_engine/atom.py | 6 - src/xrpd_toolbox/fit_engine/background.py | 17 +- src/xrpd_toolbox/fit_engine/lattice.py | 212 +++++++-- src/xrpd_toolbox/fit_engine/peaks.py | 128 +++++- .../fit_engine/profile_calculation.py | 405 ++++++++++------- tests/test_mythen.py | 20 +- tests/test_utils.py | 2 +- 8 files changed, 872 insertions(+), 325 deletions(-) diff --git a/src/xrpd_toolbox/core.py b/src/xrpd_toolbox/core.py index 245c441..49141e5 100644 --- a/src/xrpd_toolbox/core.py +++ b/src/xrpd_toolbox/core.py @@ -1,41 +1,245 @@ from __future__ import annotations import json +import math +import operator import tomllib +from numbers import Real from pathlib import Path +from typing import get_args, get_origin import numpy as np import toml import yaml -from pydantic import BaseModel +from pydantic import BaseModel, computed_field, field_serializer, field_validator SUPPORTED_FILE_TYPES = [".json", ".toml", ".yaml"] +def annotation_contains_type(annotation, clstype) -> bool: + if annotation is clstype: + return True + + origin = get_origin(annotation) + if origin is None: + return False + + return any(annotation_contains_type(arg, clstype) for arg in get_args(annotation)) + + +class Parameter(BaseModel, Real): + value: float + refine: bool = True + bounds: list[float] = [-np.inf, np.inf] + + # model_config = { + # "arbitrary_types_allowed": False, + # "validate_assignment": True, + # } + + # @field_validator("value", mode="before") + # @classmethod + # def coerce_value(cls, v): + # if isinstance(v, Parameter): + # return v.value + # if isinstance(v, dict): + # return v.get("value") + # return v + + # 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=None): + return np.asarray(self.value, dtype=dtype) + + def __array_priority__(self): + return 1000 + + # misc + def __repr__(self): + return f"{{value={self.value}, refine={self.refine}}}" + + 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 + + +ParameterLike = int | float | Parameter +FloatParameterLike = float | Parameter +IntParameterLike = int | Parameter + + +def to_parameter(v): + if isinstance(v, Parameter): + return v + if isinstance(v, dict): + return Parameter.model_validate(v) + if isinstance(v, (int, float)): + return Parameter(value=float(v)) + raise TypeError("Invalid Parameter input") + + class XRPDBaseModel(BaseModel): model_config = { "arbitrary_types_allowed": True, - "json_encoders": {np.ndarray: lambda v: v.tolist()}, } + @computed_field + def name(self) -> str: + return self.__class__.__name__ + + def _serialize_numpy(self, v: np.ndarray) -> list: + return v.tolist() + + def _serialize_tuple(self, v: tuple) -> list: + return list(v) + + @field_serializer("*", when_used="always") + def serialize_special_types(self, value): + if isinstance(value, np.ndarray): + return self._serialize_numpy(value) + + if isinstance(value, tuple): + return self._serialize_tuple(value) + + return value + + @field_validator("*", mode="before") + @classmethod + def _coerce_special_types(cls, v, info): + field = cls.model_fields[info.field_name] + annotation = field.annotation + + if annotation_contains_type(annotation, np.ndarray) and isinstance(v, list): + return np.asarray(v) + + return v + @classmethod def load_from_toml(cls, filepath: str | Path): with open(filepath, "rb") as file: settings_dict = tomllib.load(file) - return cls(**settings_dict) + 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(**settings_dict) + 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(**settings_dict) + return cls.model_validate(settings_dict) @classmethod def load(cls, filepath: str | Path): @@ -110,119 +314,146 @@ def __getitem__(self, name): raise ValueError(f"{name} not in {self}") -class Parameter(XRPDBaseModel): - value: int | float - refine: bool = True - - # Conversions - def __float__(self) -> float: - return float(self.value) - - def __int__(self) -> int: - return int(self.value) - - def __array__(self, dtype=None): - return np.asarray(self.value, dtype=dtype) - - # Internal helper - def _get_value(self, other: int | float | Parameter) -> int | float: - return other.value if isinstance(other, Parameter) else other +class RefinementBaseModel(XRPDBaseModel): + """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 parameterise(self, refine: bool = False): + for name, val in type(self).model_fields.items(): + if ( + val.annotation is ParameterLike + or FloatParameterLike + or IntParameterLike + ): + field = getattr(self, name) + + if not isinstance(field, Parameter): + setattr(self, name, Parameter(value=float(field), refine=refine)) + + def path_to_string(self, path): + 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,) - # Arithmetic (forward) - def __add__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self.value + self._get_value(other)) + if isinstance(value, Parameter): + yield path, value + continue - def __sub__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self.value - self._get_value(other)) + if isinstance(value, RefinementBaseModel): + yield from value.iter_parameters(path) + continue - def __mul__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self.value * self._get_value(other)) + if isinstance(value, (list, tuple)): + for i, v in enumerate(value): + subpath = path + (i,) - def __truediv__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self.value / self._get_value(other)) + if isinstance(v, Parameter): + yield subpath, v + elif isinstance(v, RefinementBaseModel): + yield from v.iter_parameters(subpath) + continue - def __floordiv__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self.value // self._get_value(other)) + if isinstance(value, dict): + for k, v in value.items(): + subpath = path + (k,) - def __mod__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self.value % self._get_value(other)) + if isinstance(v, Parameter): + yield subpath, v + elif isinstance(v, RefinementBaseModel): + yield from v.iter_parameters(subpath) - def __pow__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self.value ** self._get_value(other)) + def get_refinement_parameters(self): + result = {} + seen = set() - # Arithmetic (reverse) - def __radd__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self._get_value(other) + self.value) + add_seen = seen.add - def __rsub__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self._get_value(other) - self.value) + for path, p in self.iter_parameters(): + if not p.refine: + continue - def __rmul__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self._get_value(other) * self.value) + pid = id(p) + if pid in seen: + continue - def __rtruediv__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self._get_value(other) / self.value) + add_seen(pid) - def __rfloordiv__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self._get_value(other) // self.value) + # Only build string here (once) + key = self.path_to_string(path) + result[key] = p.value - def __rmod__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self._get_value(other) % self.value) + return result - def __rpow__(self, other: int | float | Parameter) -> Parameter: - return Parameter(value=self._get_value(other) ** self.value) + def get_param_by_path(self, path: str) -> Parameter: + obj = self + tokens = path.split(".") - # In-place operations - def __iadd__(self, other: int | float | Parameter): - self.value += self._get_value(other) - return self + 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) - def __isub__(self, other: int | float | Parameter): - self.value -= self._get_value(other) - return self + if not isinstance(obj, Parameter): + raise TypeError(f"{path} does not resolve to Parameter") - def __imul__(self, other: int | float | Parameter): - self.value *= self._get_value(other) - return self + return obj - def __itruediv__(self, other: int | float | Parameter): - self.value /= self._get_value(other) - return self + return obj - # Unary - def __neg__(self) -> Parameter: - return Parameter(value=-self.value) + def set_refinement_parameters(self, values: dict[str, float]): + # Build mapping once + path_map = {} + seen = set() - def __pos__(self) -> Parameter: - return Parameter(value=+self.value) + add_seen = seen.add - def __abs__(self) -> Parameter: - return Parameter(value=abs(self.value)) + for path, p in self.iter_parameters(): + if not p.refine: + continue - # Comparisons - def __eq__(self, other: object) -> bool: - if isinstance(other, Parameter): - return self.value == other.value - return self.value == other + pid = id(p) + if pid in seen: + continue - def __lt__(self, other: int | float | Parameter) -> bool: - return self.value < self._get_value(other) + add_seen(pid) + path_map[self.path_to_string(path)] = p - def __le__(self, other: int | float | Parameter) -> bool: - return self.value <= self._get_value(other) + # Apply updates + for key, val in values.items(): + path_map[key].value = float(val) - def __gt__(self, other: int | float | Parameter) -> bool: - return self.value > self._get_value(other) + def refine_none(self): + for _, param in self.iter_parameters(): + param.refine = False - def __ge__(self, other: int | float | Parameter) -> bool: - return self.value >= self._get_value(other) + def refine_all(self): + for _, param in self.iter_parameters(): + param.refine = True if __name__ == "__main__": import numpy as np - x = np.array([1, 1, 1]) + Parameter(value=3) + a = Parameter(value=3, refine=True) + + print(a) - g = XRPDBaseModel() + x = 1.0 + Parameter(value=3) - print(x, g) + print(x) diff --git a/src/xrpd_toolbox/fit_engine/atom.py b/src/xrpd_toolbox/fit_engine/atom.py index e9fb31d..bd2516f 100644 --- a/src/xrpd_toolbox/fit_engine/atom.py +++ b/src/xrpd_toolbox/fit_engine/atom.py @@ -1,6 +1,5 @@ import numpy as np import numpy.typing as npt -from pydantic import computed_field from xrpd_toolbox.core import XRPDBaseModel @@ -14,17 +13,14 @@ class Atom(XRPDBaseModel): b_iso: float occupancy: float = 1.0 - @computed_field @property def x(self) -> float: return float(self.xyz[0]) - @computed_field @property def y(self) -> float: return float(self.xyz[1]) - @computed_field @property def z(self) -> float: return float(self.xyz[2]) @@ -33,8 +29,6 @@ def z(self) -> float: class Atoms(XRPDBaseModel): """This is the array version of atoms""" - model_config = {"arbitrary_types_allowed": True} - labels: npt.NDArray[np.str_] # element label ie Si1 Si2 elements: npt.NDArray[np.str_] # element name eg Si xyz: npt.NDArray[np.float64] # fractional coordinates of xyz diff --git a/src/xrpd_toolbox/fit_engine/background.py b/src/xrpd_toolbox/fit_engine/background.py index a656cf1..58046c4 100644 --- a/src/xrpd_toolbox/fit_engine/background.py +++ b/src/xrpd_toolbox/fit_engine/background.py @@ -1,26 +1,27 @@ -from abc import abstractmethod - import matplotlib.pyplot as plt import numpy as np from xrpd_toolbox.core import XRPDBaseModel +# TODO: Should we store x here too?; it adds a lot of data to the serialisation class Background(XRPDBaseModel): """This describes the background of a profile""" x: np.ndarray # x values to evaluate the background at - @abstractmethod def calculate(self, x: np.ndarray | None = None) -> np.ndarray: """Evaluate the background at the given x values""" - NotImplementedError("Must implement calculate method in Background subclass") + raise NotImplementedError( + "Must implement calculate method in Background subclass" + ) @classmethod - @abstractmethod def estimate(cls, x: np.ndarray, y: np.ndarray) -> "Background": """Estimate the background from a profile by taking the minimum value of y""" - NotImplementedError("Must implement estimate method in Background subclass") + raise NotImplementedError( + "Must implement estimate method in Background subclass" + ) def __call__(self, x: np.ndarray | None = None) -> np.ndarray: return self.calculate(x) @@ -158,6 +159,10 @@ def estimate( """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) diff --git a/src/xrpd_toolbox/fit_engine/lattice.py b/src/xrpd_toolbox/fit_engine/lattice.py index a796c86..61f97ea 100644 --- a/src/xrpd_toolbox/fit_engine/lattice.py +++ b/src/xrpd_toolbox/fit_engine/lattice.py @@ -1,19 +1,27 @@ import numpy as np -from xrpd_toolbox.core import XRPDBaseModel +from xrpd_toolbox.core import Parameter, RefinementBaseModel +MIN_POSSIBLE_LATTICE = ( + 0.53 # Single hydrogen atom is 0.53 angstroms so it can never be smaller than this +) -class Lattice(XRPDBaseModel): + +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: float # in Angstrom - b: float - c: float - alpha: float # in degrees - beta: float # in degrees - gamma: float # in degrees + 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): @@ -62,65 +70,215 @@ def __init__( alpha: float, beta: float, gamma: float, + parameterise: bool = True, **kwargs, ): - super().__init__(a=a, b=b, c=c, alpha=alpha, beta=beta, gamma=gamma) + 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, **kwargs): - super().__init__(a=a, b=b, c=c, alpha=90.0, beta=beta, gamma=90.0) + 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, **kwargs): - super().__init__(a=a, b=b, c=c, alpha=90.0, beta=90.0, gamma=90.0) + 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, **kwargs): - super().__init__(a=a, b=a, c=c, alpha=90.0, beta=90.0, gamma=90.0) + 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, **kwargs): - super().__init__(a=a, b=a, c=c, alpha=90.0, beta=90.0, gamma=120.0) + 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, **kwargs): - super().__init__(a=a, b=a, c=c, alpha=90.0, beta=90.0, gamma=120.0) + 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, **kwargs): - super().__init__(a=a, b=a, c=a, alpha=alpha, beta=alpha, gamma=alpha) + 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): - """This is a special case of the lattice - where a = b = c and alpha = beta = gamma = 90""" - def __init__(self, a: float, **kwargs): - super().__init__(a=a, b=a, c=a, alpha=90.0, beta=90.0, gamma=90.0) +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__": - pass + 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/peaks.py b/src/xrpd_toolbox/fit_engine/peaks.py index abc597f..53e50a4 100644 --- a/src/xrpd_toolbox/fit_engine/peaks.py +++ b/src/xrpd_toolbox/fit_engine/peaks.py @@ -2,7 +2,7 @@ import math from abc import abstractmethod -from collections.abc import Collection +from collections.abc import Collection, Sequence from typing import Literal, TypeAlias import numpy as np @@ -12,7 +12,8 @@ from scipy.optimize import curve_fit from scipy.special import erf -from xrpd_toolbox.core import XRPDBaseModel +from xrpd_toolbox.core import Parameter, RefinementBaseModel, XRPDBaseModel +from xrpd_toolbox.fit_engine.background import Background IMPLEMENTED_PEAK_FUNCTONS: TypeAlias = Literal[ "gaussian", "lorentzian", "pseudo_voigt", "tophat" @@ -408,11 +409,10 @@ def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[BasePeak]: return fitted_peaks -class BasePeak(XRPDBaseModel): - amplitude: float | int = Field(gt=0) - centre: float | int - fwhm: float | int = Field(gt=0, default=0.1) - background: float | int = 0 +class BasePeak(RefinementBaseModel): + amplitude: Parameter | float = Field(gt=0) + centre: Parameter | float + fwhm: Parameter | float = Field(gt=0, default=Parameter(value=0.02)) normalised: bool = True # if normalised the @abstractmethod @@ -422,39 +422,43 @@ def calculate(self, x: np.ndarray) -> np.ndarray: class GaussianPeak(BasePeak): def calculate(self, x: np.ndarray) -> np.ndarray: - return gaussian(x, self.amplitude, self.centre, self.fwhm) + return gaussian(x, float(self.amplitude), float(self.centre), float(self.fwhm)) class LorentzianPeak(BasePeak): def calculate(self, x: np.ndarray) -> np.ndarray: - return lorentzian(x, self.amplitude, self.centre, self.fwhm) + return lorentzian( + x, float(self.amplitude), float(self.centre), float(self.fwhm) + ) class PseudoVoigtPeak(BasePeak): - eta: float | int = Field( + 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, - self.amplitude, - self.centre, - self.fwhm, - self.eta, + float(self.amplitude), + float(self.centre), + float(self.fwhm), + float(self.eta), ) class TopHatPeak(BasePeak): - epsilon: float | int = Field(ge=0, le=1, default=0) # used for tophat - smoothing + epsilon: Parameter | float | int = Field( + ge=0, le=1, default=0 + ) # used for tophat - smoothing def calculate(self, x: np.ndarray) -> np.ndarray: return smooth_tophat( x, - self.amplitude, - self.centre, - self.fwhm, - self.epsilon, + float(self.amplitude), + float(self.centre), + float(self.fwhm), + float(self.epsilon), ) @@ -464,5 +468,89 @@ def calculate(self): pass +def calculate_profile( + x: np.ndarray, + peaks: Sequence[BasePeak], + background: int | float | np.ndarray | Background = 0, + phase_scale: int | float = 1, + wdt: int | float = 5, +): + """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 class: Peak which contain (cen, amp, fwhm) + + background: scalar or array, if array must be same shape as x + """ + + if isinstance(background, np.ndarray): + assert len(x) == len(background) + + intensity = np.zeros_like(x) + + for peak in peaks: + 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 + + +@njit(parallel=True) +def calculate_profile_parallel( + x: np.ndarray, + peaks: Sequence[BasePeak], + background: int | float | np.ndarray | Background = 0, + phase_scale: int | float = 1, + wdt: int | float = 5, +): + """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 class: Peak which contain (cen, amp, fwhm) + + background: scalar or array, if array must be same shape as x + """ + + 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 + + if __name__ == "__main__": - pass + 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/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index 66e30d5..b4e2883 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -5,20 +5,23 @@ import matplotlib.pyplot as plt import numpy as np -import numpy.typing as npt from CifFile import ReadCif -from numba import njit, prange -from pydantic import model_validator +from numba import njit +from pydantic import Field, computed_field, model_validator +from scipy import optimize -from xrpd_toolbox.core import XRPDBaseModel +from xrpd_toolbox.core import Parameter, RefinementBaseModel, XRPDBaseModel from xrpd_toolbox.fit_engine.atom import Atoms from xrpd_toolbox.fit_engine.background import Background from xrpd_toolbox.fit_engine.constants import ( ELEMENT_ATOMIC_NUMBER, ) from xrpd_toolbox.fit_engine.form_factors import X_RAY_FORM_FACTORS -from xrpd_toolbox.fit_engine.lattice import Lattice -from xrpd_toolbox.fit_engine.peaks import BasePeak, peak_factory +from xrpd_toolbox.fit_engine.lattice import ( + Lattice, + crystal_lattice_factory, +) +from xrpd_toolbox.fit_engine.peaks import BasePeak, calculate_profile, peak_factory from xrpd_toolbox.fit_engine.symmetry import ( SpaceGroup, format_space_group_name, @@ -51,6 +54,9 @@ # biso - debye waller factor +ITC_TABLES = get_symmetry_tables() + + @njit() def u_iso_to_b_iso(u_iso: np.ndarray) -> np.ndarray: return 8 * np.pi**2 * u_iso @@ -194,7 +200,7 @@ def calculate_structure_factor( return f_hkl -# @njit +@njit @timeit def hkl_laue_reduction( hkl: np.ndarray, rotations: np.ndarray @@ -392,7 +398,7 @@ def allowed_reflections_simple(hkl: np.ndarray, centering: str): raise ValueError(f"Unknown centering: {centering}") -def generate_h_k_l(hkl_max: Sequence[int]) -> np.ndarray: +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] @@ -414,7 +420,7 @@ def generate_hkl(reciprocal_lattice_matrix: np.ndarray, q_max: float) -> np.ndar kmax = int(np.ceil(q_max / norms[1])) lmax = int(np.ceil(q_max / norms[2])) - hkl = generate_h_k_l([hmax, kmax, lmax]) + hkl = generate_h_k_l(np.array([hmax, kmax, lmax])) q_vec = hkl @ reciprocal_lattice_matrix q = np.linalg.norm(q_vec, axis=1) @@ -516,7 +522,7 @@ def apply_symmetry_operations_to_atoms( # pydantic models to store the data -class Radiation(XRPDBaseModel): +class Radiation(RefinementBaseModel): """This defines the type of radiation that is diffracting""" radiation: DataType @@ -535,7 +541,7 @@ def check_wavelength_or_energy(self): return self -class Structure(XRPDBaseModel): +class Structure(RefinementBaseModel): """This should contain everything needed to calculate the structure factor, peak intensities and peak position of the diffraction peeaks lattice: Lattice @@ -544,42 +550,24 @@ class Structure(XRPDBaseModel): symmetry_operations: np.ndarray """ - spacegroup_symbol: str = "P1" + spacegroup: str = "P1" lattice: Lattice atoms: Atoms source: str | None = None # symmetry_operations: npt.NDArray[np.str_] | None = None @classmethod - def load_from_cif( - cls, cif_filepath: str | Path, enforce_symmetry: bool = True - ) -> "Structure": - spacegroup_symbol, lattice, atoms, symmetry_operations = read_cif(cif_filepath) - - structure = cls( - spacegroup_symbol=spacegroup_symbol, - lattice=lattice, - atoms=atoms, - source=str(cif_filepath), - # symmetry_operations=symmetry_operations, - ) - - return structure - - @cached_property - def spacegroup(self): - return format_space_group_name(self.spacegroup_symbol) + def load_from_cif(cls, cif_filepath: str | Path) -> "Structure": + return cif_to_structure(cif_filepath) @cached_property def spacegroup_class(self) -> SpaceGroup: - itc = get_symmetry_tables() - sg = itc[self.spacegroup] + sg = ITC_TABLES[self.spacegroup] return sg @cached_property def spacegroup_number(self) -> int: - itc = get_symmetry_tables() - sg = itc[self.spacegroup] + sg = ITC_TABLES[self.spacegroup] return int(sg["number"]) # @cached_property @@ -619,32 +607,30 @@ def centering(self): def reciprocal_lattice_matrix(self): return reciprocal_lattice_matrix( - a=self.lattice.a, - b=self.lattice.b, - c=self.lattice.c, - alpha=self.lattice.alpha_radians, - beta=self.lattice.beta_radians, - gamma=self.lattice.gamma_radians, + 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=self.lattice.a, - b=self.lattice.b, - c=self.lattice.c, - alpha=self.lattice.alpha, - beta=self.lattice.beta, - gamma=self.lattice.gamma, + 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 - @timeit def get_symmetry_operations(self): # if self.symmetry_operations is None: - itc = get_symmetry_tables() - sg = itc[self.spacegroup] + sg = ITC_TABLES[self.spacegroup] sym_ops = sg.get_rotations_and_translations() # else: @@ -652,7 +638,6 @@ def get_symmetry_operations(self): return sym_ops - @timeit def generate_structure_hkls( self, reciprocal_lattice_matrix: np.ndarray, @@ -671,7 +656,7 @@ def generate_structure_hkls( return hkl[mask] @timeit - def calculate_peaks( + def calculate_reflections( self, wavelength: float | int = 1.5406, mode: CrystalType = "powder", @@ -783,7 +768,7 @@ def to_peaks( peak_type: str = "gaussian", radiation: DataType = "xray", ): - hkl, f_abs, two_theta_degrees, intensity = self.calculate_peaks( + hkl, f_abs, two_theta_degrees, intensity = self.calculate_reflections( wavelength=wavelength, mode=mode, radiation=radiation ) @@ -807,7 +792,7 @@ def calculate_profile( wdt: int | float = 5, radiation: DataType = "xray", ) -> np.ndarray: - hkl, f_abs, two_theta_degrees, intensity = self.calculate_peaks( + hkl, f_abs, two_theta_degrees, intensity = self.calculate_reflections( wavelength=wavelength, mode=mode, radiation=radiation ) @@ -1040,86 +1025,32 @@ def read_cif(cif_filepath: str | Path, block_number: int = 0) -> tuple: return spacegroup_symbol, lattice, atoms, symmetry_operations -def calculate_profile( - x: np.ndarray, - peaks: Sequence[BasePeak], - background: int | float | np.ndarray | Background = 0, - phase_scale: int | float = 1, - wdt: int | float = 5, -): - """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). +def cif_to_structure(cif_filepath: str | Path) -> Structure: + spacegroup_symbol, lattice, atoms, symmetry_operations = read_cif(str(cif_filepath)) - peaks: list of class: Peak which contain (cen, amp, fwhm) + spacegroup = format_space_group_name(spacegroup_symbol) - background: scalar or array, if array must be same shape as x - """ - - if isinstance(background, np.ndarray): - assert len(x) == len(background) - - intensity = np.zeros_like(x) - - for peak in peaks: - 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 - - -@njit(parallel=True) -def calculate_profile_parallel( - x: np.ndarray, - peaks: Sequence[BasePeak], - background: int | float | np.ndarray | Background = 0, - phase_scale: int | float = 1, - wdt: int | float = 5, -): - """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). + sg = ITC_TABLES[spacegroup] + crystal_class = sg["crystal_class"] - peaks: list of class: Peak which contain (cen, amp, fwhm) + latticecls = crystal_lattice_factory(crystal_class) + lattice = latticecls.model_validate(lattice) - background: scalar or array, if array must be same shape as x - """ - - 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 prange(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 + structure = Structure( + spacegroup=spacegroup, + lattice=lattice, + atoms=atoms, + source=str(cif_filepath), + # symmetry_operations=symmetry_operations, + ) - return intensity + return structure class XYEData(XRPDBaseModel): - x: npt.NDArray[np.float64] - y: npt.NDArray[np.float64] - e: npt.NDArray[np.float64] | None = None + x: np.ndarray + y: np.ndarray + e: np.ndarray | None = None @model_validator(mode="after") def validate_data(self): @@ -1133,8 +1064,7 @@ def validate_data(self): class ScatteringData(XYEData): x_unit: XUnit = "tth" data_type: DataType = "xray" - wavelength: int | float | None = None # for x-ray or CW neutron data - bank: int | None = None # for multi bank data ie neutron tof + wavelength: int | float # for x-ray or CW neutron data source: str | None = None # for tracking where the data came from @model_validator(mode="after") @@ -1162,7 +1092,7 @@ def from_xye( filename: str | Path, x_unit: XUnit, data_type: DataType, - wavelength: float | None = None, + wavelength: float, ) -> "ScatteringData": """Loads scattering data from a CSV file. The file should have 3 (or 2) columns: x, y and optionally e (error) @@ -1191,7 +1121,7 @@ def from_fullprof( filename: str | Path, x_unit: XUnit, data_type: DataType, - wavelength: float | None = None, + wavelength: float, ) -> "ScatteringData": """Loads scattering data from a .xy or .dat file. The file should have 3 columns x, y and error @@ -1218,11 +1148,11 @@ def from_fullprof( ##### more complex pydantic models to do whole profiles -class CalculatedProfile(XRPDBaseModel): +class CalculatedProfile(RefinementBaseModel): x: np.ndarray peaks: Collection[BasePeak] background: np.ndarray | int | float | Background = 0.0 - phase_scale: int | float = 1.0 + phase_scale: int | float | Parameter = Parameter(value=1, bounds=[0, np.inf]) wdt: int | float = 5 @model_validator(mode="after") @@ -1243,31 +1173,30 @@ def calculate_profile(self): x=self.x, peaks=self.sorted_peaks, background=self.background, - phase_scale=self.phase_scale, + phase_scale=float(self.phase_scale), wdt=self.wdt, ) - def refine( - self, - data: ScatteringData | XYEData | np.ndarray, - ): - """refine the profile against the data using the specified method""" - -class ProfileRefinement(XRPDBaseModel): - data: ScatteringData # | list[ScatteringData] +class ProfileRefinement(RefinementBaseModel): + phase_scale: int | float | Parameter = Parameter(value=1) refinement: Literal["Pawley", "Rietveld"] = "Pawley" - background: np.ndarray | float | int | Background = 0 structure: Structure | Collection[Structure] | None = None + background: np.ndarray | float | int | Background | Parameter = 0 + zero_offset: int | float | Parameter = Parameter( + value=0, + ) + data: ScatteringData # | list[ScatteringData] + calculated_intensity: np.ndarray | None = Field(default=None, exclude=True) """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: - structure = Structure.load_from_cif(cif_filepath) + self.structure = Structure.load_from_cif(cif_filepath) - return structure + return self.structure def save_cif(self, output_path: str | Path): """Saves the structure to a CIF file.""" @@ -1277,7 +1206,7 @@ def save_cif(self, output_path: str | Path): def calculate_peaks(self): if self.structure is not None: if isinstance(self.structure, Structure): - return self.structure.calculate_peaks() + return self.structure.calculate_reflections() elif isinstance(self.structure, Collection): raise NotImplementedError( "Multiple phase calculation not implemented yet" @@ -1285,21 +1214,143 @@ def calculate_peaks(self): else: raise Exception("Unknown structure") - def chi_squared(self): + def calculate_profile(self) -> np.ndarray: + if isinstance(self.structure, Structure): + peaks = self.structure.to_peaks(self.data.wavelength) + elif isinstance(self.structure, list): + peaks = [] + + for struct in self.structure: + peaks.append(struct.to_peaks(self.data.wavelength)) + else: + raise ValueError("Structure is of unknown type") + + if isinstance(self.background, Parameter): + background = float(self.background) + else: + background = self.background + + self.calculated_intensity = calculate_profile( + x=self.data.x, + peaks=peaks, + background=background, + phase_scale=float(self.phase_scale), + ) + + 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 - peaks = self.calculate_peaks() + self.calculated_intensity = self.calculate_profile() + + print(f"Chi Squared = {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() + + plt.scatter(self.data.x, self.data.y, label="Obs", color="black", s=2) + plt.plot(self.data.x, self.calculated_intensity, label="Calc", color="red") + plt.plot( + self.data.x, + self.data.y - self.calculated_intensity, + label="Obs-Calc", + color="blue", + ) + plt.xlabel(f"{self.data.x_unit}") + plt.ylabel("Intensity (a.u.)") + plt.legend() + plt.show() + + +def optimise_model( + model: ProfileRefinement, method="least_squares", bounds=None, **kwargs +): + params = [] + seen = set() + + for _, p in model.iter_parameters(): + if not p.refine: + continue + + pid = id(p) + if pid in seen: + continue + + seen.add(pid) + params.append(p) + + if not params: + raise ValueError("No refinable parameters") - assert peaks is not None - hkl, f_abs, two_theta_degrees, intensity = peaks + n = len(params) - return calculate_chi_squared(intensity, self.data.y, self.data.e) + # initial vector + x0 = np.empty(n, dtype=float) + lower = np.empty(n, dtype=float) + upper = np.empty(n, dtype=float) + + for i, p in enumerate(params): + x0[i] = float(p.value) + lower[i], upper[i] = p.bounds + + # tight update loop (this is the only unavoidable cost) + def update(x): + for i in range(n): + params[i].value = float(x[i]) + + def residual(x): + update(x) + return np.asarray(model.calculate_residual(), dtype=float) + + if method == "least_squares": + result = optimize.least_squares( + residual, + x0, + bounds=(lower, upper), + **kwargs, + ) + else: + + def objective(x): + r = residual(x) + return float(r @ r) + + result = optimize.minimize( + objective, + x0, + bounds=list(zip(lower, upper, strict=True)) if bounds is None else bounds, + **kwargs, + ) + + # final update + update(result.x) + + updated = {i: float(result.x[i]) for i in range(n)} + + return updated, model, result if __name__ == "__main__": cif_filepath = "/workspaces/XRPD-Toolbox/cifs/Si.cif" si_structure = Structure.load_from_cif(cif_filepath) - si_structure.plot_unit_cell() + # si_structure.plot_unit_cell() print(si_structure) beam_energy = 15 @@ -1316,28 +1367,48 @@ def chi_squared(self): from xrpd_toolbox.fit_engine.background import ( ChebyshevBackground, + # LinearInterpolationBackground, ) background = ChebyshevBackground.estimate(data.x, data.y) - background.add_coefficient() - print(background.coefficients) - background.remove_coefficient() - print(background.coefficients) + # background.add_coefficient() + # print(background.coefficients) + # background.remove_coefficient() + # print(background.coefficients) - data.plot(False) - background.plot() + # data.plot(False) + # background.plot() # print(data.model_dump_json()) - peaks = si_structure.to_peaks(wavelength=wavelength) + # peaks = si_structure.to_peaks(wavelength=wavelength) + # profile = CalculatedProfile( + # x=data.x, + # peaks=peaks, + # background=background, + # ) - profile = CalculatedProfile( - x=data.x, peaks=peaks, background=background, phase_scale=1000 + refinment = ProfileRefinement( + data=data, background=background, structure=si_structure, phase_scale=2e-5 ) - calculated_profile1 = profile.calculate_profile() + # refinment.plot() + + updated, new_model, result = optimise_model(refinment) + + # new_model.plot() + + # print(refinment.calculate_residual()) + + # calculated_profile1 = profile.calculate_profile() - print(si_structure.model_dump()) + output_name = "/workspaces/outputs/test.toml" + + print(refinment.save(output_name)) + + ProfileRefinement.load(output_name) + + # print(profile.get_refinement_parameters()) # print(si_structure.spacegroup) @@ -1359,9 +1430,9 @@ def chi_squared(self): # peak_type="gaussian", # ) - plt.plot(data.x, calculated_profile1, label="original lattice") - # plt.plot(two_theta_degrees, calculated_profile2, label="modified lattice") - plt.xlabel("2θ (degrees)") - plt.ylabel("Intensity (a.u.)") - plt.legend() - plt.show() + # plt.plot(data.x, calculated_profile1, label="original lattice") + # # plt.plot(two_theta_degrees, calculated_profile2, label="modified lattice") + # plt.xlabel("2θ (degrees)") + # plt.ylabel("Intensity (a.u.)") + # plt.legend() + # plt.show() diff --git a/tests/test_mythen.py b/tests/test_mythen.py index faeb9d4..88069d8 100644 --- a/tests/test_mythen.py +++ b/tests/test_mythen.py @@ -77,21 +77,21 @@ def test_mythen_load_fails_when_incorrect_file_extension( mythen_settings.save_to_toml(file_path) -def test_mythen_data_loader(): - pass +# def test_mythen_data_loader(): +# pass -def test_mythen_step_scan_process(): - raise Exception("Not done") +# def test_mythen_step_scan_process(): +# raise Exception("Not done") -def test_mythen_flatefield_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_pump_probe_process(): +# raise Exception("Not done") -def test_mythen_time_resolved_process(): - raise Exception("Not done") +# def test_mythen_time_resolved_process(): +# raise Exception("Not done") diff --git a/tests/test_utils.py b/tests/test_utils.py index e2fcdaa..15d7006 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -2,8 +2,8 @@ import numpy as np import scipy.integrate as integrate - from xrpd_toolbox.utils.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, From fd58fabd81fef7cc96240b21e4455e2d41380764 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 23 Apr 2026 15:17:35 +0000 Subject: [PATCH 72/86] add extrav tests --- .../fit_engine/profile_calculation.py | 19 ++++++++++--------- src/xrpd_toolbox/utils/unit_conversion.py | 7 ++++--- tests/test_core.py | 9 +++++++++ tests/test_lattice.py | 17 +++++++++++++++++ 4 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 tests/test_core.py create mode 100644 tests/test_lattice.py diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index b4e2883..1049ad7 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -6,7 +6,8 @@ import matplotlib.pyplot as plt import numpy as np from CifFile import ReadCif -from numba import njit + +# from numba import njit from pydantic import Field, computed_field, model_validator from scipy import optimize @@ -57,12 +58,12 @@ ITC_TABLES = get_symmetry_tables() -@njit() +# @njit() def u_iso_to_b_iso(u_iso: np.ndarray) -> np.ndarray: return 8 * np.pi**2 * u_iso -@njit() +# @njit() def b_iso_to_u_iso(b_iso: np.ndarray) -> np.ndarray: return b_iso / (8 * np.pi**2) @@ -115,7 +116,7 @@ def merge_peaks( return merged_tth, merged_intensity, merged_hkl -@njit() +# @njit() def absorption_correction( theta: np.ndarray, mu: float, @@ -161,7 +162,7 @@ def calculate_form_factor(elements: Collection[str], s: np.ndarray) -> np.ndarra return ff # (n_atoms, s) -@njit() +# @njit() def calculate_debye_waller_factor(b_iso: np.ndarray, s: np.ndarray): """s is scattering vector in radians""" # (n_hkl, n_atoms) @@ -200,7 +201,7 @@ def calculate_structure_factor( return f_hkl -@njit +# @njit @timeit def hkl_laue_reduction( hkl: np.ndarray, rotations: np.ndarray @@ -244,7 +245,7 @@ def q_magnitude(q_vectors: np.ndarray) -> np.ndarray: return np.linalg.norm(q_vectors, axis=1) -@njit +# @njit def lorentz_polarisation( theta: np.ndarray, polarisation: float | int = 0.0, @@ -285,7 +286,7 @@ def lorentz_polarisation( ) / (sin2theta * cos2theta) -@njit +# @njit def unit_cell_volume( a: float | np.ndarray, b: float | np.ndarray, @@ -1396,7 +1397,7 @@ def objective(x): updated, new_model, result = optimise_model(refinment) - # new_model.plot() + new_model.plot() # print(refinment.calculate_residual()) diff --git a/src/xrpd_toolbox/utils/unit_conversion.py b/src/xrpd_toolbox/utils/unit_conversion.py index e237abf..04e3b18 100644 --- a/src/xrpd_toolbox/utils/unit_conversion.py +++ b/src/xrpd_toolbox/utils/unit_conversion.py @@ -3,7 +3,8 @@ from typing import Literal import numpy as np -from numba import njit + +# from numba import njit # constants ev_to_j = 1.602176634e-19 # electron volt to joule factor @@ -97,7 +98,7 @@ def d_to_two_theta( return two_theta -@njit() +# @njit() def q_space_to_theta(q: np.ndarray | float | int, wavelength: int | float): return np.arcsin(q * wavelength / (4 * np.pi)) @@ -127,7 +128,7 @@ def d_to_tof(d: float | np.ndarray, difa: float, difc: float, tzero: float = 0.0 return tof -@njit() +# @njit() def q_space_to_s(q: np.ndarray) -> np.ndarray: s = q / (4 * np.pi) return s diff --git a/tests/test_core.py b/tests/test_core.py new file mode 100644 index 0000000..163654f --- /dev/null +++ b/tests/test_core.py @@ -0,0 +1,9 @@ +from xrpd_toolbox.core import Parameter + + +def test_parameter_maths(): + a = Parameter(value=3, refine=True) + + x = 1.0 + a + assert isinstance(x, float) + assert x == 4.0 diff --git a/tests/test_lattice.py b/tests/test_lattice.py new file mode 100644 index 0000000..306e0f3 --- /dev/null +++ b/tests/test_lattice.py @@ -0,0 +1,17 @@ +from xrpd_toolbox.fit_engine.lattice import CubicLattice, Lattice + + +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) From 76e4721f0207600838fdacf2c4a0cf2b58da04e9 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 30 Apr 2026 11:21:39 +0000 Subject: [PATCH 73/86] Added background refinement --- cifs/CeO2.cif | 267 ++++++++ src/xrpd_toolbox/core.py | 645 +++++++++++++----- src/xrpd_toolbox/fit_engine/atom.py | 15 +- src/xrpd_toolbox/fit_engine/background.py | 138 ++-- src/xrpd_toolbox/fit_engine/form_factors.py | 28 +- .../fit_engine/peak_shape_functions.py | 381 +++++++++++ src/xrpd_toolbox/fit_engine/peaks.py | 53 +- src/xrpd_toolbox/fit_engine/phase_matching.py | 2 + .../fit_engine/profile_calculation.py | 509 +++++--------- src/xrpd_toolbox/fit_engine/refiner.py | 163 +++++ src/xrpd_toolbox/i11/mythen.py | 2 +- src/xrpd_toolbox/i15_1/pe2ad.py | 9 + src/xrpd_toolbox/utils/cif_reader.py | 134 ++++ 13 files changed, 1739 insertions(+), 607 deletions(-) create mode 100644 cifs/CeO2.cif create mode 100644 src/xrpd_toolbox/fit_engine/peak_shape_functions.py create mode 100644 src/xrpd_toolbox/fit_engine/phase_matching.py create mode 100644 src/xrpd_toolbox/fit_engine/refiner.py create mode 100644 src/xrpd_toolbox/utils/cif_reader.py 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/src/xrpd_toolbox/core.py b/src/xrpd_toolbox/core.py index 49141e5..b35f722 100644 --- a/src/xrpd_toolbox/core.py +++ b/src/xrpd_toolbox/core.py @@ -1,174 +1,382 @@ from __future__ import annotations +import ast import json import math -import operator +import operator as op import tomllib +from abc import abstractmethod from numbers import Real from pathlib import Path -from typing import get_args, get_origin +from typing import Annotated, Any import numpy as np import toml import yaml -from pydantic import BaseModel, computed_field, field_serializer, field_validator +from pydantic import ( + BaseModel, + BeforeValidator, + ConfigDict, + PlainSerializer, + model_serializer, + model_validator, +) SUPPORTED_FILE_TYPES = [".json", ".toml", ".yaml"] -def annotation_contains_type(annotation, clstype) -> bool: - if annotation is clstype: - return True +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 AST EVALUATOR (NO eval) +# ============================================================ + +OPS = { + ast.Add: op.add, + ast.Sub: op.sub, + ast.Mult: op.mul, + ast.Div: op.truediv, + ast.Pow: op.pow, + ast.Mod: op.mod, + ast.FloorDiv: op.floordiv, + ast.USub: op.neg, + ast.UAdd: lambda x: x, +} + + +def evaluate_binary_operation( + binary_operation: ast.AST, ctx: dict[str, float] +) -> float: + if isinstance(binary_operation, ast.Constant): + value = binary_operation.value + + if isinstance(value, (int, float)): + return float(value) + else: + raise TypeError(f"Unsupported constant type: {type(value)}") + + elif isinstance(binary_operation, ast.Name): + return float(ctx[binary_operation.id]) + + elif isinstance(binary_operation, ast.BinOp): + return OPS[type(binary_operation.op)]( + evaluate_binary_operation(binary_operation.left, ctx), + evaluate_binary_operation(binary_operation.right, ctx), + ) + + elif isinstance(binary_operation, ast.UnaryOp): + return OPS[type(binary_operation.op)]( + evaluate_binary_operation(binary_operation.operand, ctx) + ) - origin = get_origin(annotation) - if origin is None: - return False + else: + raise ValueError("Unsupported expression") - return any(annotation_contains_type(arg, clstype) for arg in get_args(annotation)) + +def evaluate_expression(expr: str, ctx: dict[str, float]) -> float: + ast_expression = ast.parse(expr, mode="eval") + + return evaluate_binary_operation(ast_expression.body, ctx) + + +# ============================================================ +# PARAMETER (FULLY LAZY, NO GLOBAL METHODS) +# ============================================================ class Parameter(BaseModel, Real): - value: float + value: float | int | str refine: bool = True bounds: list[float] = [-np.inf, np.inf] - # model_config = { - # "arbitrary_types_allowed": False, - # "validate_assignment": True, - # } - - # @field_validator("value", mode="before") - # @classmethod - # def coerce_value(cls, v): - # if isinstance(v, Parameter): - # return v.value - # if isinstance(v, dict): - # return v.get("value") - # return v - - # helpers - def get_other_value(self, other): - if isinstance(other, Parameter): - return other.value - return other + _name: str | None = None + _model: Any = None # back-reference to model - def _op(self, other, fn): - return fn(self.value, self.get_other_value(other)) + def _ctx(self) -> dict[str, float]: + """ + IMPORTANT: + Only uses RAW values, never float(v), never recursion. + """ + return {k: v.value for k, v in self._model._params.items()} # noqa - def _rop(self, other, fn): - return fn(self.get_other_value(other), self.value) + def _compute_value(self) -> float: + 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() - # required conversions def __float__(self): - return float(self.value) + return self._compute_value() - def __int__(self): - return int(self.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 __complex__(self): - return complex(self.value) + def _to_expression(self, other, op): + if isinstance(other, Parameter): + return Parameter(value=f"({self._expr()} {op} {other._expr()})") # noqa + else: + return Parameter(value=f"({self._expr()} {op} {other})") - # Real abstract methods - def __trunc__(self): - return math.trunc(self.value) + # arithmetic + def __add__(self, other): + return self._to_expression(other, "+") - def __floor__(self): - return math.floor(self.value) + def __radd__(self, other): + return self._to_expression(other, "+") - def __ceil__(self): - return math.ceil(self.value) + def __sub__(self, other): + return self._to_expression(other, "-") - def __round__(self, ndigits=None): - return round(self.value, ndigits) + 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 -self.value - - def __pos__(self): - return +self.value + return Parameter(value=f"-({self._expr()})") def __abs__(self): - return abs(self.value) + return Parameter(value=f"abs({self._expr()})") # comparisons def __eq__(self, other): - return self.value == self.get_other_value(other) + return float(self) == float(other) def __lt__(self, other): - return self.value < self.get_other_value(other) + return float(self) < float(other) def __le__(self, other): - return self.value <= self.get_other_value(other) + return float(self) <= float(other) def __gt__(self, other): - return self.value > self.get_other_value(other) + return float(self) > float(other) def __ge__(self, other): - return self.value >= self.get_other_value(other) + return float(self) >= float(other) - # arithmetic - def __add__(self, other): - return self._op(other, operator.add) + # Real interface + def __complex__(self): + return complex(float(self)) - def __radd__(self, other): - return self._rop(other, operator.add) + def __pos__(self): + return self - def __sub__(self, other): - return self._op(other, operator.sub) + # numeric + def __int__(self): + return int(float(self)) - def __rsub__(self, other): - return self._rop(other, operator.sub) + def __trunc__(self): + return int(float(self)) - def __mul__(self, other): - return self._op(other, operator.mul) + def __floor__(self): + return math.floor(float(self)) - def __rmul__(self, other): - return self._rop(other, operator.mul) + def __ceil__(self): + return math.ceil(float(self)) - def __truediv__(self, other): - return self._op(other, operator.truediv) + def __round__(self, n=None): + return round(float(self), n) - def __rtruediv__(self, other): - return self._rop(other, operator.truediv) + def __array__(self): + return np.array([self._compute_value()], dtype=float) - def __floordiv__(self, other): - return self._op(other, operator.floordiv) + @property + def real(self): + return float(self) - def __rfloordiv__(self, other): - return self._rop(other, operator.floordiv) + @property + def imag(self): + return 0 - def __mod__(self, other): - return self._op(other, operator.mod) + def conjugate(self): + return self - def __rmod__(self, other): - return self._rop(other, operator.mod) + def __divmod__(self, other): + return divmod(float(self), float(other)) - def __pow__(self, other): - return self._op(other, operator.pow) + def __rdivmod__(self, other): + return divmod(float(other), float(self)) - def __rpow__(self, other): - return self._rop(other, operator.pow) - # numpy support - def __array__(self, dtype=None): - return np.asarray(self.value, dtype=dtype) +# class Parameter(BaseModel, Real): +# """A parameter acts like a value, that can be refined""" - def __array_priority__(self): - return 1000 +# value: float +# refine: bool = Field(default=True) +# bounds: list[float] = Field(default=[-np.inf, np.inf], repr=False) - # misc - def __repr__(self): - return f"{{value={self.value}, refine={self.refine}}}" +# def set_refine(self): +# self.refine = True - 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 +# 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 @@ -176,51 +384,87 @@ def link(self, other: Parameter): IntParameterLike = int | Parameter -def to_parameter(v): - if isinstance(v, Parameter): - return v - if isinstance(v, dict): - return Parameter.model_validate(v) - if isinstance(v, (int, float)): - return Parameter(value=float(v)) - raise TypeError("Invalid Parameter input") +class ParameterArray(BaseModel): + """Parameter array should be use for things that contain an array of coeeficients + see: Chebychev background""" + parameter_array: list[Parameter] -class XRPDBaseModel(BaseModel): - model_config = { - "arbitrary_types_allowed": True, - } + @model_serializer(mode="plain") + def serialize(self): + if not self.parameter_array: + return {} - @computed_field - def name(self) -> str: - return self.__class__.__name__ + out = { + "value": [], + "refine": [], + "lower_bounds": [], + "upper_bounds": [], + } - def _serialize_numpy(self, v: np.ndarray) -> list: - return v.tolist() + for p in self.parameter_array: + out["value"].append(p.value) + out["refine"].append(p.refine) - def _serialize_tuple(self, v: tuple) -> list: - return list(v) + lb, ub = p.bounds + out["lower_bounds"].append(lb) + out["upper_bounds"].append(ub) - @field_serializer("*", when_used="always") - def serialize_special_types(self, value): - if isinstance(value, np.ndarray): - return self._serialize_numpy(value) + return out - if isinstance(value, tuple): - return self._serialize_tuple(value) + @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: str | int | slice): + if isinstance(key, str) and key in type(self).model_fields: + return getattr(self, key) + elif 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}") - return value + def __array__(self): + return np.array([f.value for f in self.parameter_array], dtype=float) - @field_validator("*", mode="before") @classmethod - def _coerce_special_types(cls, v, info): - field = cls.model_fields[info.field_name] - annotation = field.annotation + 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]) - if annotation_contains_type(annotation, np.ndarray) and isinstance(v, list): - return np.asarray(v) - return v +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=False, arbitrary_types_allowed=True, validate_assignment=True + ) @classmethod def load_from_toml(cls, filepath: str | Path): @@ -313,14 +557,17 @@ def __getitem__(self, name): else: raise ValueError(f"{name} not in {self}") + def __setitem__(self, name, value): + setattr(self, name, value) + -class RefinementBaseModel(XRPDBaseModel): +class RefinementBaseModel(XRPDBaseModel, extra="allow"): """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 parameterise(self, refine: bool = False): + def parameterise_all(self, refine: bool = False): for name, val in type(self).model_fields.items(): if ( val.annotation is ParameterLike @@ -332,7 +579,7 @@ def parameterise(self, refine: bool = False): if not isinstance(field, Parameter): setattr(self, name, Parameter(value=float(field), refine=refine)) - def path_to_string(self, path): + def path_to_string(self, path) -> str: out = [] for p in path: if isinstance(p, int): @@ -352,11 +599,15 @@ def iter_parameters(self, prefix=()): yield path, value continue - if isinstance(value, RefinementBaseModel): + 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) - continue - if isinstance(value, (list, tuple)): + elif isinstance(value, (list, tuple)): for i, v in enumerate(value): subpath = path + (i,) @@ -364,9 +615,8 @@ def iter_parameters(self, prefix=()): yield subpath, v elif isinstance(v, RefinementBaseModel): yield from v.iter_parameters(subpath) - continue - if isinstance(value, dict): + elif isinstance(value, dict): for k, v in value.items(): subpath = path + (k,) @@ -375,21 +625,73 @@ def iter_parameters(self, prefix=()): elif isinstance(v, RefinementBaseModel): yield from v.iter_parameters(subpath) - def get_refinement_parameters(self): + def model_post_init(self, __context: Any): + self._params = self._collect_parameters() + self._bind_parameters() + + 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) -> None: + for name, param in self._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() - add_seen = seen.add - 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 - add_seen(pid) + seen.add(pid) # Only build string here (once) key = self.path_to_string(path) @@ -414,8 +716,6 @@ def get_param_by_path(self, path: str) -> Parameter: return obj - return obj - def set_refinement_parameters(self, values: dict[str, float]): # Build mapping once path_map = {} @@ -438,13 +738,36 @@ def set_refinement_parameters(self, values: dict[str, float]): for key, val in values.items(): path_map[key].value = float(val) - def refine_none(self): - for _, param in self.iter_parameters(): - param.refine = False + 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 = [] - def refine_all(self): - for _, param in self.iter_parameters(): - param.refine = True + for name, param in self.iter_parameters(): + if name[-1] in keep_fixed: + continue + else: + param.refine = True + + +class Model(RefinementBaseModel): + """A model can be refined by the refiner. It must contain: + calculate_residual""" + + @abstractmethod + def calculate_residual(self): + raise NotImplementedError( + "Must implmenet calculate_residual for Model subclass" + ) if __name__ == "__main__": @@ -452,8 +775,16 @@ def refine_all(self): a = Parameter(value=3, refine=True) + rf = RefinementBaseModel() + print(a) x = 1.0 + Parameter(value=3) print(x) + + rf["a"] = 1 + + print(rf.model_dump_json()) + + print(rf) diff --git a/src/xrpd_toolbox/fit_engine/atom.py b/src/xrpd_toolbox/fit_engine/atom.py index bd2516f..42caa5f 100644 --- a/src/xrpd_toolbox/fit_engine/atom.py +++ b/src/xrpd_toolbox/fit_engine/atom.py @@ -1,7 +1,6 @@ import numpy as np -import numpy.typing as npt -from xrpd_toolbox.core import XRPDBaseModel +from xrpd_toolbox.core import SerialisableNDArray, XRPDBaseModel class Atom(XRPDBaseModel): @@ -9,7 +8,7 @@ class Atom(XRPDBaseModel): label: str # elemnt label ie Si1 Si2 element: str # element name eg Si - xyz: npt.NDArray[np.float64] # fractional coorindates of xyz #type: ignore + xyz: SerialisableNDArray # fractional coorindates of xyz #type: ignore b_iso: float occupancy: float = 1.0 @@ -29,11 +28,11 @@ def z(self) -> float: class Atoms(XRPDBaseModel): """This is the array version of atoms""" - labels: npt.NDArray[np.str_] # element label ie Si1 Si2 - elements: npt.NDArray[np.str_] # element name eg Si - xyz: npt.NDArray[np.float64] # fractional coordinates of xyz - b_iso: npt.NDArray[np.float64] - occupancies: npt.NDArray[np.float64] + 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): diff --git a/src/xrpd_toolbox/fit_engine/background.py b/src/xrpd_toolbox/fit_engine/background.py index 58046c4..050bb93 100644 --- a/src/xrpd_toolbox/fit_engine/background.py +++ b/src/xrpd_toolbox/fit_engine/background.py @@ -1,84 +1,86 @@ -import matplotlib.pyplot as plt +from __future__ import annotations + +from typing import Annotated, Literal + import numpy as np +from pydantic import Field -from xrpd_toolbox.core import XRPDBaseModel +from xrpd_toolbox.core import ( + Parameter, + ParameterArray, + RefinementBaseModel, + SerialisableNDArray, +) -# TODO: Should we store x here too?; it adds a lot of data to the serialisation -class Background(XRPDBaseModel): +# 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 # x values to evaluate the background at + # _x: np.ndarray - def calculate(self, x: np.ndarray | None = None) -> 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) -> "Background": + 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 | None = None) -> np.ndarray: + def __call__(self, x: np.ndarray) -> np.ndarray: return self.calculate(x) - def __len__(self): - return len(self.x) - - def __add__(self, other): - if isinstance(other, "Background"): - other = other.calculate() - - return self.calculate(self.x) + np.asarray(other) - - def __radd__(self, other): - return np.asarray(other) + self.calculate(self.x) - - def __array__(self): - return self.calculate() - - def plot(self, show: bool = True): - plt.plot(self.x, self.calculate(), label=f"{type(self).__name__}") - if show: - plt.legend() - plt.show() - class ConstantBackground(Background): """This describes a constant background""" - value: float + background_type: Literal["ConstantBackground"] = "ConstantBackground" + value: float | Parameter = Parameter(value=0) - def calculate(self, x: np.ndarray | None = None) -> np.ndarray: - if x is None: - x = self.x + 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) -> "ConstantBackground": + 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(x=x, value=value) + return cls(value=Parameter(value=value)) def __float__(self): return float(self.value) class LinearBackground(Background): - slope: float - intercept: float + background_type: Literal["LinearBackground"] = "LinearBackground" - def calculate(self, x: np.ndarray | None = None) -> np.ndarray: - if x is None: - x = self.x - return self.slope * x + self.intercept + 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) -> "LinearBackground": + def estimate( + cls, + x: np.ndarray, + y: np.ndarray, + **kwargs, + ) -> LinearBackground: min_x = np.min(x) max_x = np.max(x) @@ -88,24 +90,26 @@ def estimate(cls, x: np.ndarray, y: np.ndarray) -> "LinearBackground": slope = (max_y - min_y) / (max_x - min_x) intercept = min_y - slope * min_x - return cls(x=x, slope=slope, intercept=intercept) + return cls(slope=Parameter(value=slope), intercept=Parameter(value=intercept)) class ChebyshevBackground(Background): - """This describes a Chebyshev polynomial background""" + background_type: Literal["ChebyshevBackground"] = "ChebyshevBackground" - coefficients: np.ndarray # coefficients of the Chebyshev polynomial + """This describes a Chebyshev polynomial background - GSAS style""" - def calculate(self, x: np.ndarray | None = None) -> np.ndarray: - if x is None: - x = self.x + 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] + self.coefficients = self.coefficients[0:-1] # type: ignore - mypy is just being stupid here @classmethod def estimate( @@ -115,7 +119,8 @@ def estimate( degree: int = 8, mask: bool = True, mask_step: int = 50, - ) -> "ChebyshevBackground": + **kwargs, + ) -> ChebyshevBackground: # this is a very simple estimation method that fits # a Chebyshev polynomial to the data @@ -137,16 +142,21 @@ def estimate( coefficients = np.polynomial.chebyshev.chebfit( x_selected, y_selected, deg=degree ) - return cls(x=x, coefficients=coefficients) + return cls(coefficients=coefficients) class LinearInterpolationBackground(Background): - x_sample: np.ndarray - y_sample: np.ndarray + """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 | None = None) -> np.ndarray: - if x is None: - x = self.x + def calculate(self, x: np.ndarray) -> np.ndarray: return np.interp(x, self.x_sample, self.y_sample) @classmethod @@ -155,7 +165,8 @@ def estimate( x: np.ndarray, y: np.ndarray, points: int = 20, - ) -> "LinearInterpolationBackground": + **kwargs, + ) -> LinearInterpolationBackground: """simple estimate that takes a number of points equal to points, spaced evenly across x""" @@ -170,4 +181,15 @@ def estimate( x_sample = x[indices] y_sample = y[indices] - return cls(x=x, x_sample=x_sample, y_sample=y_sample) + y_sample_parameter = ParameterArray.from_array(y_sample, **kwargs) + + return cls(x_sample=x_sample, y_sample=y_sample_parameter) + + +BackgroundType = Annotated[ + ConstantBackground + | LinearBackground + | LinearInterpolationBackground + | ChebyshevBackground, + Field(discriminator="background_type"), +] diff --git a/src/xrpd_toolbox/fit_engine/form_factors.py b/src/xrpd_toolbox/fit_engine/form_factors.py index 9b55296..a44ad64 100644 --- a/src/xrpd_toolbox/fit_engine/form_factors.py +++ b/src/xrpd_toolbox/fit_engine/form_factors.py @@ -1308,7 +1308,7 @@ 96.064972, 0.052450, ], - "H1- ": [ + "H1-": [ 0.702260, 0.763666, 0.248678, @@ -1360,7 +1360,7 @@ 24.603704, 58.954, ], - "O1- ": [ + "O1-": [ 3.106934, 3.235142, 1.148886, @@ -1373,7 +1373,7 @@ 65.693512, 0.630, ], - "O2- ": [ + "O2-": [ 3.990247, 2.300563, 0.607200, @@ -1386,7 +1386,7 @@ 47.299709, 0.379, ], - "F1- ": [ + "F1-": [ 0.457649, 3.841561, 1.432771, @@ -1477,7 +1477,7 @@ 60.320301, 0.000, ], - "K1+ ": [ + "K1+": [ -17.609339, 1.494873, 7.150305, @@ -1555,7 +1555,7 @@ 10.193876, 0.023, ], - "V2+ ": [ + "V2+": [ 7.754356, 2.064100, 2.576998, @@ -1568,7 +1568,7 @@ 22.055786, 0.467, ], - "V3+ ": [ + "V3+": [ 9.958480, 1.596350, 1.483442, @@ -1581,7 +1581,7 @@ 0.328826, 0.388, ], - "V5+ ": [ + "V5+": [ 15.575018, 8.448095, 1.612040, @@ -1841,7 +1841,7 @@ 13.821799, 0.118, ], - "Y3+ ": [ + "Y3+": [ 46.660366, 10.369686, 4.623042, @@ -2114,7 +2114,7 @@ 16.433775, 5.718, ], - "I1- ": [ + "I1-": [ 20.010330, 17.835524, 8.104130, @@ -2426,7 +2426,7 @@ 17.070732, 0.001, ], - "W6+ ": [ + "W6+": [ 29.729357, 17.247808, 15.184488, @@ -2673,7 +2673,7 @@ 18.596891, 3.871, ], - "U3+ ": [ + "U3+": [ 15.360309, 32.395657, 21.961290, @@ -2686,7 +2686,7 @@ 39.604965, 16.330, ], - "U4+ ": [ + "U4+": [ 15.355091, 32.235306, 0.557745, @@ -2699,7 +2699,7 @@ 15.908239, 3.553, ], - "U6+ ": [ + "U6+": [ 15.333844, 31.770849, 21.274414, 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..5b04627 --- /dev/null +++ b/src/xrpd_toolbox/fit_engine/peak_shape_functions.py @@ -0,0 +1,381 @@ +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, 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 index 53e50a4..840f71e 100644 --- a/src/xrpd_toolbox/fit_engine/peaks.py +++ b/src/xrpd_toolbox/fit_engine/peaks.py @@ -3,7 +3,7 @@ import math from abc import abstractmethod from collections.abc import Collection, Sequence -from typing import Literal, TypeAlias +from typing import Annotated, Literal, TypeAlias import numpy as np import peakutils @@ -12,7 +12,7 @@ from scipy.optimize import curve_fit from scipy.special import erf -from xrpd_toolbox.core import Parameter, RefinementBaseModel, XRPDBaseModel +from xrpd_toolbox.core import Parameter, RefinementBaseModel from xrpd_toolbox.fit_engine.background import Background IMPLEMENTED_PEAK_FUNCTONS: TypeAlias = Literal[ @@ -246,29 +246,6 @@ def peak_factory(peak_type: str): ) -def caglioti_fwhm( - two_theta: np.ndarray | float, - u: float | int, - v: float | int, - w: float | int, -) -> np.ndarray | float: - """ - 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) - - def estimate_fwhm( x_values: np.ndarray, y_values: np.ndarray, @@ -421,11 +398,15 @@ def calculate(self, x: np.ndarray) -> np.ndarray: class GaussianPeak(BasePeak): + 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)) class LorentzianPeak(BasePeak): + 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) @@ -433,6 +414,8 @@ def calculate(self, x: np.ndarray) -> np.ndarray: class PseudoVoigtPeak(BasePeak): + 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 @@ -448,6 +431,8 @@ def calculate(self, x: np.ndarray) -> np.ndarray: class TopHatPeak(BasePeak): + peak_type: Literal["tophat"] = "tophat" + epsilon: Parameter | float | int = Field( ge=0, le=1, default=0 ) # used for tophat - smoothing @@ -462,12 +447,6 @@ def calculate(self, x: np.ndarray) -> np.ndarray: ) -class PeakShapeFunction(XRPDBaseModel): - @abstractmethod - def calculate(self): - pass - - def calculate_profile( x: np.ndarray, peaks: Sequence[BasePeak], @@ -492,10 +471,16 @@ def calculate_profile( start_idx = np.searchsorted(x, peak.centre - (wdt * peak.fwhm)) end_idx = np.searchsorted(x, peak.centre + (wdt * 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 @@ -542,6 +527,12 @@ def calculate_profile_parallel( return intensity +PeakType = Annotated[ + GaussianPeak | LorentzianPeak | PseudoVoigtPeak | TopHatPeak, + Field(discriminator="peak_type"), +] + + if __name__ == "__main__": gauss = PseudoVoigtPeak(amplitude=1, centre=1, fwhm=1) 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 index 1049ad7..49f7912 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -5,15 +5,22 @@ import matplotlib.pyplot as plt import numpy as np -from CifFile import ReadCif # from numba import njit from pydantic import Field, computed_field, model_validator -from scipy import optimize -from xrpd_toolbox.core import Parameter, RefinementBaseModel, XRPDBaseModel +from xrpd_toolbox.core import ( + Model, + Parameter, + RefinementBaseModel, + SerialisableNDArray, + XRPDBaseModel, +) from xrpd_toolbox.fit_engine.atom import Atoms -from xrpd_toolbox.fit_engine.background import Background +from xrpd_toolbox.fit_engine.background import ( + Background, + BackgroundType, +) from xrpd_toolbox.fit_engine.constants import ( ELEMENT_ATOMIC_NUMBER, ) @@ -22,18 +29,27 @@ Lattice, crystal_lattice_factory, ) -from xrpd_toolbox.fit_engine.peaks import BasePeak, calculate_profile, peak_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.refiner import refine_model from xrpd_toolbox.fit_engine.symmetry import ( SpaceGroup, format_space_group_name, get_symmetry_tables, ) +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, ) -from xrpd_toolbox.utils.utils import parse_numbers_with_error, timeit XUnit: TypeAlias = Literal["tth", "tof", "q", "d"] @@ -47,37 +63,19 @@ CrystalType: TypeAlias = Literal["powder", "single-crystal"] -# 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 - - ITC_TABLES = get_symmetry_tables() -# @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) - - def calculate_chi_squared( ycalc: np.ndarray, yobs: np.ndarray, y_err: np.ndarray | None -): +) -> float: if y_err is not None: - wi = 1 / (y_err**2) + wi = 1 / y_err**2 else: - wi = 1 / ycalc + wi = 1 / yobs - residual = wi * ((yobs - ycalc) ** 2) - chi_squared = np.sum(residual) + residual = (wi * (yobs - ycalc)) ** 2 + chi_squared = float(np.sum(residual)) return chi_squared @@ -202,7 +200,7 @@ def calculate_structure_factor( # @njit -@timeit +# @timeit def hkl_laue_reduction( hkl: np.ndarray, rotations: np.ndarray ) -> tuple[np.ndarray, np.ndarray]: @@ -480,6 +478,8 @@ def plot_form_factors(elements: Sequence[str], q_space: np.ndarray | None = None 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() @@ -554,6 +554,7 @@ class Structure(RefinementBaseModel): spacegroup: str = "P1" lattice: Lattice atoms: Atoms + name: str | None = None source: str | None = None # symmetry_operations: npt.NDArray[np.str_] | None = None @@ -656,7 +657,7 @@ def generate_structure_hkls( mask = allowed_reflections(hkl, rotations, translations) return hkl[mask] - @timeit + # @timeit def calculate_reflections( self, wavelength: float | int = 1.5406, @@ -717,7 +718,7 @@ def calculate_reflections( theta = q_space_to_theta(q, wavelength=wavelength) # in radians still two_theta = 2 * theta - two_theta_degrees = np.degrees(two_theta) + peak_centres_tthdeg = np.degrees(two_theta) # positions = self.positions # occupancies = self.occupancies @@ -756,11 +757,11 @@ def calculate_reflections( lp_factor = lorentz_polarisation(theta, 0.9) # 0 for unpolarized intensity = intensity * lp_factor - two_theta_degrees, intensity, hkl = merge_peaks( - two_theta_degrees, intensity, hkl + peak_centres_tthdeg, intensity, hkl = merge_peaks( + peak_centres_tthdeg, intensity, hkl ) - return hkl, f_abs, two_theta_degrees, intensity + return hkl, f_abs, peak_centres_tthdeg, intensity def to_peaks( self, @@ -769,15 +770,15 @@ def to_peaks( peak_type: str = "gaussian", radiation: DataType = "xray", ): - hkl, f_abs, two_theta_degrees, intensity = self.calculate_reflections( - wavelength=wavelength, mode=mode, radiation=radiation + 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, two_theta_degrees, strict=True): + for inten, tth in zip(intensity, peak_centres_two_theta_degrees, strict=True): peaks.append(peak_func(amplitude=inten, centre=tth)) return peaks @@ -804,7 +805,7 @@ def calculate_profile( for inten, tth in zip(intensity, two_theta_degrees, strict=True): peaks.append(peak_func(amplitude=inten, centre=tth)) - profile = CalculatedProfile( + profile = PeakProfile( x=x, peaks=peaks, background=backround, phase_scale=phase_scale, wdt=wdt ) @@ -921,113 +922,10 @@ def plot_unit_cell( plt.show() -###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) - 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) - - try: - spacegroup_symbol = block["_symmetry_space_group_name_H-M"] - except Exception: - 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([]) - - 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 - - def cif_to_structure(cif_filepath: str | Path) -> Structure: - spacegroup_symbol, lattice, atoms, symmetry_operations = read_cif(str(cif_filepath)) + spacegroup_symbol, lattice, atoms, symmetry_operations, name = read_cif( + str(cif_filepath) + ) spacegroup = format_space_group_name(spacegroup_symbol) @@ -1042,6 +940,7 @@ def cif_to_structure(cif_filepath: str | Path) -> Structure: lattice=lattice, atoms=atoms, source=str(cif_filepath), + name=name, # symmetry_operations=symmetry_operations, ) @@ -1049,9 +948,9 @@ def cif_to_structure(cif_filepath: str | Path) -> Structure: class XYEData(XRPDBaseModel): - x: np.ndarray - y: np.ndarray - e: np.ndarray | None = None + x: SerialisableNDArray = Field(repr=False) + y: SerialisableNDArray = Field(repr=False) + e: SerialisableNDArray | None = Field(default=None, repr=False) @model_validator(mode="after") def validate_data(self): @@ -1065,7 +964,7 @@ def validate_data(self): class ScatteringData(XYEData): x_unit: XUnit = "tth" data_type: DataType = "xray" - wavelength: int | float # for x-ray or CW neutron data + wavelength: Parameter # for x-ray or CW neutron data source: str | None = None # for tracking where the data came from @model_validator(mode="after") @@ -1076,6 +975,7 @@ def validate_data_units(self): 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.)") @@ -1093,13 +993,18 @@ def from_xye( filename: str | Path, x_unit: XUnit, data_type: DataType, - wavelength: float, + 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(filename), unpack=True, dtype=float) except ValueError: @@ -1122,13 +1027,17 @@ def from_fullprof( filename: str | Path, x_unit: XUnit, data_type: DataType, - wavelength: float, + 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(filename), skip_header=1, @@ -1149,24 +1058,18 @@ def from_fullprof( ##### more complex pydantic models to do whole profiles -class CalculatedProfile(RefinementBaseModel): - x: np.ndarray - peaks: Collection[BasePeak] +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 - phase_scale: int | float | Parameter = Parameter(value=1, bounds=[0, np.inf]) wdt: int | float = 5 - @model_validator(mode="after") - def validate_parameters(self): - if not isinstance(self.background, (int, float)): - assert len(self.x) == len(self.background) - return self - @property def sorted_peaks(self): return sorted(self.peaks, key=lambda p: p.centre) - @timeit + # @timeit def calculate_profile(self): """calculates the profile with the parameters stored within self""" @@ -1179,23 +1082,42 @@ def calculate_profile(self): ) -class ProfileRefinement(RefinementBaseModel): - phase_scale: int | float | Parameter = Parameter(value=1) - refinement: Literal["Pawley", "Rietveld"] = "Pawley" - structure: Structure | Collection[Structure] | None = None - background: np.ndarray | float | int | Background | Parameter = 0 - zero_offset: int | float | Parameter = Parameter( - value=0, - ) +class CalculatedReflections(XRPDBaseModel): + peak_centres: list[float] + intensity: list[float] + structure_factor: list[float] + hkl: list[list[int]] | None = None + + +class ReitveldRefinement(Model): + 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]) data: ScatteringData # | list[ScatteringData] - calculated_intensity: np.ndarray | None = Field(default=None, exclude=True) + 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: - self.structure = Structure.load_from_cif(cif_filepath) + 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 @@ -1205,38 +1127,37 @@ def save_cif(self, output_path: str | Path): raise NotImplementedError("CIF writing not implemented yet") def calculate_peaks(self): - if self.structure is not None: - 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") + 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 isinstance(self.structure, Structure): - peaks = self.structure.to_peaks(self.data.wavelength) - elif isinstance(self.structure, list): - peaks = [] + if not isinstance(self.structure, Structure): + raise NotImplementedError("Not yet implemented for mullti-phase patterns") - for struct in self.structure: - peaks.append(struct.to_peaks(self.data.wavelength)) - else: - raise ValueError("Structure is of unknown type") + 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, Parameter): - background = float(self.background) + if isinstance(self.background, Background): + background = self.background.calculate(x=self.data.x) else: background = self.background - self.calculated_intensity = calculate_profile( - x=self.data.x, - peaks=peaks, - background=background, - phase_scale=float(self.phase_scale), - ) + self.calculated_intensity = ( + calculated_intensity * float(self.phase_scale) + ) + background return self.calculated_intensity @@ -1248,6 +1169,8 @@ def chi_squared(self) -> float: self.calculated_intensity, self.data.y, self.data.e ) + print(f"chi squared: {chi_squared:.3e}") + return chi_squared else: @@ -1258,19 +1181,23 @@ def calculate_residual(self) -> np.ndarray: self.calculated_intensity = self.calculate_profile() - print(f"Chi Squared = {self.chi_squared}") + _ = 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 self.calculated_intensity is None: + self.calculated_intensity = self.calculate_profile() + + # print(self.data.y) + # print(self.calculated_intensity) + plt.figure(figsize=(16, 10)) plt.scatter(self.data.x, self.data.y, label="Obs", color="black", s=2) plt.plot(self.data.x, self.calculated_intensity, label="Calc", color="red") plt.plot( - self.data.x, - self.data.y - self.calculated_intensity, + self.data.x - self.zero_offset, + (self.data.y - self.calculated_intensity) - np.amax(self.data.y) / 10, label="Obs-Calc", color="blue", ) @@ -1278,162 +1205,68 @@ def plot(self): plt.ylabel("Intensity (a.u.)") plt.legend() plt.show() + plt.close() -def optimise_model( - model: ProfileRefinement, method="least_squares", bounds=None, **kwargs -): - params = [] - seen = set() - - for _, p in model.iter_parameters(): - if not p.refine: - continue - - pid = id(p) - if pid in seen: - continue - - seen.add(pid) - params.append(p) - - if not params: - raise ValueError("No refinable parameters") - - n = len(params) - - # initial vector - x0 = np.empty(n, dtype=float) - lower = np.empty(n, dtype=float) - upper = np.empty(n, dtype=float) - - for i, p in enumerate(params): - x0[i] = float(p.value) - lower[i], upper[i] = p.bounds +if __name__ == "__main__": + output_name = "/workspaces/outputs/test.toml" - # tight update loop (this is the only unavoidable cost) - def update(x): - for i in range(n): - params[i].value = float(x[i]) + def test_refine_silicon(): + cif_filepath = "/workspaces/XRPD-Toolbox/cifs/Si.cif" + si_structure = Structure.load_from_cif(cif_filepath) - def residual(x): - update(x) - return np.asarray(model.calculate_residual(), dtype=float) + beam_energy = 15 + wavelength = beam_energy_to_wavelength(beam_energy) - if method == "least_squares": - result = optimize.least_squares( - residual, - x0, - bounds=(lower, upper), - **kwargs, + 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), ) - else: - - def objective(x): - r = residual(x) - return float(r @ r) - result = optimize.minimize( - objective, - x0, - bounds=list(zip(lower, upper, strict=True)) if bounds is None else bounds, - **kwargs, + from xrpd_toolbox.fit_engine.background import ( + # ChebyshevBackground, + LinearInterpolationBackground, ) - # final update - update(result.x) - - updated = {i: float(result.x[i]) for i in range(n)} - - return updated, model, result - - -if __name__ == "__main__": - cif_filepath = "/workspaces/XRPD-Toolbox/cifs/Si.cif" - si_structure = Structure.load_from_cif(cif_filepath) - # si_structure.plot_unit_cell() - print(si_structure) - - beam_energy = 15 - wavelength = beam_energy_to_wavelength(beam_energy) - radiation = Radiation(radiation="xray", energy=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=wavelength, - ) - - from xrpd_toolbox.fit_engine.background import ( - ChebyshevBackground, - # LinearInterpolationBackground, - ) - - background = ChebyshevBackground.estimate(data.x, data.y) - # background.add_coefficient() - # print(background.coefficients) - # background.remove_coefficient() - # print(background.coefficients) - - # data.plot(False) - # background.plot() - - # print(data.model_dump_json()) - - # peaks = si_structure.to_peaks(wavelength=wavelength) - # profile = CalculatedProfile( - # x=data.x, - # peaks=peaks, - # background=background, - # ) + background = LinearInterpolationBackground.estimate(data.x, data.y) - refinment = ProfileRefinement( - data=data, background=background, structure=si_structure, phase_scale=2e-5 - ) + model = ReitveldRefinement( + data=data, background=background, structure=si_structure + ) - # refinment.plot() + assert isinstance(model.background, Background) + model.background.refine_none() - updated, new_model, result = optimise_model(refinment) + print(model.get_refinement_parameters()) - new_model.plot() + model.irf.refine_none() - # print(refinment.calculate_residual()) + updated, model, result = refine_model(model, plot=False, plot_every=5) - # calculated_profile1 = profile.calculate_profile() + model.irf.refine_all() + updated, model, result = refine_model(model, plot=False, plot_every=1) - output_name = "/workspaces/outputs/test.toml" + model.save(output_name) - print(refinment.save(output_name)) + return model - ProfileRefinement.load(output_name) + def test_load_refinement_and_refine(): + loaded_refinement = ReitveldRefinement.load(output_name) - # print(profile.get_refinement_parameters()) + loaded_refinement.calculate_profile() + loaded_refinement.plot() - # print(si_structure.spacegroup) + # refine_model(loaded_refinement) - # calculated_profile1 = si_structure.calculate_profile( - # x=two_theta_degrees, - # wavelength=wavelength, - # mode="powder", - # peak_type="gaussian", - # ) + # model = test_refine_silicon() + test_load_refinement_and_refine() - # si_structure.lattice.a += 0.2 - # si_structure.lattice.b += 0.2 - # si_structure.lattice.c += 0.2 + two_theta = np.linspace(1, 70, 1000) - # calculated_profile2 = si_structure.calculate_profile( - # x=two_theta_degrees, - # wavelength=wavelength, - # mode="powder", - # peak_type="gaussian", - # ) + width = FCJPseudoVoigt().calculate_peak_widths(two_theta)[0] - # plt.plot(data.x, calculated_profile1, label="original lattice") - # # plt.plot(two_theta_degrees, calculated_profile2, label="modified lattice") - # plt.xlabel("2θ (degrees)") - # plt.ylabel("Intensity (a.u.)") - # plt.legend() - # plt.show() + plt.plot(two_theta, width) + plt.show() diff --git a/src/xrpd_toolbox/fit_engine/refiner.py b/src/xrpd_toolbox/fit_engine/refiner.py new file mode 100644 index 0000000..aed4872 --- /dev/null +++ b/src/xrpd_toolbox/fit_engine/refiner.py @@ -0,0 +1,163 @@ +from copy import deepcopy +from typing import cast + +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.backends.backend_agg import FigureCanvasAgg +from scipy import optimize + +# from xrpd_toolbox.fit_engine.profile_calculation import ReitveldRefinement +from xrpd_toolbox.utils.utils import timeit + + +def setup_plot(model): + 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", + animated=True, + label="Observed", + ) + + (line_calc,) = ax.plot(x, y_calc, color="red", animated=True, label="Calculated") + + (line_diff,) = ax.plot( + x, y_obs - y_calc + offset, color="blue", animated=True, label="Obs - Calc" + ) + + ax.legend() + ax.set_xlabel(model.data.x_unit) + ax.set_ylabel("Intensity") + + canvas = cast(FigureCanvasAgg, fig.canvas) + + canvas.draw() + background = canvas.copy_from_bbox(ax.bbox) + + return fig, ax, (line_obs, line_calc, line_diff, offset), canvas, background + + +def update_plot(model, lines, ax, canvas, background): + line_obs, line_calc, line_diff, offset = 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 + offset) + + canvas.restore_region(background) + + ax.draw_artist(line_obs) + ax.draw_artist(line_calc) + ax.draw_artist(line_diff) + + canvas.blit(ax.bbox) + canvas.flush_events() + + +# refinement algorithm +def refine_model( + model, + method="least_squares", + bounds=None, + plot: bool = False, + plot_every: int = 5, + **kwargs, +): + params = [] + # seen = set() + + new_model = deepcopy(model) + + for _, p in new_model.iter_parameters(): + if (not p.refine) or (not isinstance(p.value, (int | float))): + continue + + params.append(p) + + if not params: + raise ValueError("No refinable parameters") + + n = len(params) + + x0 = np.empty(n, dtype=float) + lower = np.empty(n, dtype=float) + upper = np.empty(n, dtype=float) + + for i, p in enumerate(params): + x0[i] = float(p.value) + lower[i], upper[i] = p.bounds + + def update(x): + for i in range(n): + params[i].value = float(x[i]) + + if plot: + counter = {"i": 0} + + fig, ax, lines, canvas, background = setup_plot(new_model) + + def maybe_update_plot(): + counter["i"] += 1 + if counter["i"] % plot_every == 0: + update_plot(new_model, lines, ax, canvas, background) + + else: + + def maybe_update_plot(): + pass + + @timeit + def residual(x): + update(x) + + print(new_model.get_refinement_parameters()) + y_calc = new_model.calculate_profile() + _ = new_model.chi_squared + r = new_model.data.y - y_calc + + maybe_update_plot() + + return np.asarray(r, dtype=float) + + if method == "least_squares": + result = optimize.least_squares( + residual, + x0, + bounds=(lower, upper), + **kwargs, + ) + + else: + + def objective(x): + r = residual(x) + return float(r @ r) + + result = optimize.minimize( + objective, + x0, + bounds=list(zip(lower, upper, strict=True)) if bounds is None else bounds, + **kwargs, + ) + + update(result.x) + + updated = {i: float(result.x[i]) for i in range(n)} + + if plot: + plt.close() + + return updated, new_model, result diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 6178bbf..71513b1 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -663,7 +663,7 @@ def plot_diffraction( # 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_peaks(0.828783) + _, _, si_tth, si_intensity = si.calculate_reflections(0.828783) background = np.amin(counts) diff --git a/src/xrpd_toolbox/i15_1/pe2ad.py b/src/xrpd_toolbox/i15_1/pe2ad.py index 13ac0a7..e67be6e 100644 --- a/src/xrpd_toolbox/i15_1/pe2ad.py +++ b/src/xrpd_toolbox/i15_1/pe2ad.py @@ -83,5 +83,14 @@ def find_sample_centre(self): if __name__ == "__main__": filepath = "/host-home/projects/data/i15-1-95016.nxs" + sample_alignment_scans = { + "carbon_black": 94519, + "water": 94520, + "GaIn": 94521, + "NIST_Si": 95016, + "NaCl": 95017, + "HKUST1": 95018, + } + pe2ad = PE2AD(filepath) pe2ad.find_sample_centre() 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 From 133002e45015e094dd7467346f95a74650cac0ff Mon Sep 17 00:00:00 2001 From: Richard Dixey Date: Thu, 30 Apr 2026 12:55:00 +0000 Subject: [PATCH 74/86] add sample alignment data --- .devcontainer/devcontainer.json | 4 +- src/xrpd_toolbox/i15_1/pe2ad.py | 42 +++++- .../sample_alignment_data/GaIn-94521.csv | 121 ++++++++++++++++++ .../sample_alignment_data/HKUST1-95018.csv | 121 ++++++++++++++++++ .../sample_alignment_data/NIST_Si-95016.csv | 121 ++++++++++++++++++ .../sample_alignment_data/NaCl-95017.csv | 121 ++++++++++++++++++ .../carbon_black-94519.csv | 121 ++++++++++++++++++ .../sample_alignment_data/water-94520.csv | 121 ++++++++++++++++++ 8 files changed, 765 insertions(+), 7 deletions(-) create mode 100644 src/xrpd_toolbox/i15_1/sample_alignment_data/GaIn-94521.csv create mode 100644 src/xrpd_toolbox/i15_1/sample_alignment_data/HKUST1-95018.csv create mode 100644 src/xrpd_toolbox/i15_1/sample_alignment_data/NIST_Si-95016.csv create mode 100644 src/xrpd_toolbox/i15_1/sample_alignment_data/NaCl-95017.csv create mode 100644 src/xrpd_toolbox/i15_1/sample_alignment_data/carbon_black-94519.csv create mode 100644 src/xrpd_toolbox/i15_1/sample_alignment_data/water-94520.csv diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 43db8cc..aea9292 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -74,8 +74,8 @@ // 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", - // "target": "/dls", + // "source": "/dls/i15-1/data", + // "target": "/dls/i15-1/data", // "type": "bind" // }, // { diff --git a/src/xrpd_toolbox/i15_1/pe2ad.py b/src/xrpd_toolbox/i15_1/pe2ad.py index e67be6e..b0fbf2b 100644 --- a/src/xrpd_toolbox/i15_1/pe2ad.py +++ b/src/xrpd_toolbox/i15_1/pe2ad.py @@ -2,7 +2,7 @@ import numpy as np from xrpd_toolbox.data_loader import BaseDataLoader -from xrpd_toolbox.utils.peaks import fit_peaks, smooth_tophat +from xrpd_toolbox.fit_engine.peaks import fit_peaks, smooth_tophat class PE2AD(BaseDataLoader): @@ -72,7 +72,13 @@ def find_sample_centre(self): print(peak) plt.plot(indices, peak.calculate(indices)) - tophat = smooth_tophat(indices, peak.amplitude, peak.centre, peak.fwhm, 0.1) + tophat = smooth_tophat( + indices, + float(peak.amplitude), + float(peak.amplitude), + float(peak.amplitude), + 0.1, + ) plt.plot(indices, tophat) @@ -81,7 +87,12 @@ def find_sample_centre(self): if __name__ == "__main__": - filepath = "/host-home/projects/data/i15-1-95016.nxs" + import os + + folder = "/dls/i15-1/data/2026/cm44163-1/" + file = "i15-1-95016.nxs" + + prefix = "i15-1-" sample_alignment_scans = { "carbon_black": 94519, @@ -92,5 +103,26 @@ def find_sample_centre(self): "HKUST1": 95018, } - pe2ad = PE2AD(filepath) - pe2ad.find_sample_centre() + 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_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 From e152d45f98d4d515400f75aaabafda8418c7224d Mon Sep 17 00:00:00 2001 From: RCJD-Diamond Date: Fri, 1 May 2026 16:21:16 +0000 Subject: [PATCH 75/86] add intiial sample_alignment fitter --- pyproject.toml | 1 + src/xrpd_toolbox/core.py | 167 +++++++++++------- src/xrpd_toolbox/fit_engine/peaks.py | 43 +++-- .../fit_engine/profile_calculation.py | 34 ++-- src/xrpd_toolbox/fit_engine/refiner.py | 17 +- src/xrpd_toolbox/i15_1/sample_alignment.py | 159 +++++++++++++++++ src/xrpd_toolbox/utils/utils.py | 59 +++++++ uv.lock | 61 +++++++ 8 files changed, 452 insertions(+), 89 deletions(-) create mode 100644 src/xrpd_toolbox/i15_1/sample_alignment.py diff --git a/pyproject.toml b/pyproject.toml index 275ddb2..acb91a8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ dependencies = [ # "PyQt5", "spglib", "pymatgen", + "scikit-learn", "Dans_Diffraction", "stomp.py", "numba", diff --git a/src/xrpd_toolbox/core.py b/src/xrpd_toolbox/core.py index b35f722..74ef244 100644 --- a/src/xrpd_toolbox/core.py +++ b/src/xrpd_toolbox/core.py @@ -1,14 +1,12 @@ from __future__ import annotations -import ast import json import math -import operator as op import tomllib from abc import abstractmethod from numbers import Real from pathlib import Path -from typing import Annotated, Any +from typing import Annotated, Any, get_args import numpy as np import toml @@ -39,62 +37,50 @@ def to_ndarray(v): PlainSerializer(lambda x: x.tolist(), return_type=list), ] - -# ============================================================ -# SAFE AST EVALUATOR (NO eval) -# ============================================================ - -OPS = { - ast.Add: op.add, - ast.Sub: op.sub, - ast.Mult: op.mul, - ast.Div: op.truediv, - ast.Pow: op.pow, - ast.Mod: op.mod, - ast.FloorDiv: op.floordiv, - ast.USub: op.neg, - ast.UAdd: lambda x: x, +SAFE_GLOBALS = { + "__builtins__": {}, + "abs": abs, + "sin": math.sin, + "cos": math.cos, + "tan": math.tan, + "sqrt": math.sqrt, + "log": math.log, + "exp": math.exp, } -def evaluate_binary_operation( - binary_operation: ast.AST, ctx: dict[str, float] -) -> float: - if isinstance(binary_operation, ast.Constant): - value = binary_operation.value - - if isinstance(value, (int, float)): - return float(value) - else: - raise TypeError(f"Unsupported constant type: {type(value)}") +def safe_pow(a, b): + if abs(a) > 1e6 or abs(b) > 100: + raise ValueError("too large") + return a**b - elif isinstance(binary_operation, ast.Name): - return float(ctx[binary_operation.id]) - elif isinstance(binary_operation, ast.BinOp): - return OPS[type(binary_operation.op)]( - evaluate_binary_operation(binary_operation.left, ctx), - evaluate_binary_operation(binary_operation.right, ctx), - ) +def safe_exp(x): + if x > 700: # float overflow boundary + raise ValueError("exp too large") + return math.exp(x) - elif isinstance(binary_operation, ast.UnaryOp): - return OPS[type(binary_operation.op)]( - evaluate_binary_operation(binary_operation.operand, ctx) - ) - else: - raise ValueError("Unsupported expression") +# 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: - ast_expression = ast.parse(expr, mode="eval") + """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""" - return evaluate_binary_operation(ast_expression.body, ctx) + # 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") -# ============================================================ -# PARAMETER (FULLY LAZY, NO GLOBAL METHODS) -# ============================================================ + return float(eval(expr, SAFE_GLOBALS, ctx)) class Parameter(BaseModel, Real): @@ -103,16 +89,18 @@ class Parameter(BaseModel, Real): bounds: list[float] = [-np.inf, np.inf] _name: str | None = None - _model: Any = None # back-reference to model + _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: v.value for k, v in self._model._params.items()} # noqa + 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): @@ -120,6 +108,13 @@ def _compute_value(self) -> float: 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() @@ -128,15 +123,21 @@ def _expr(self): a number or _name in the expression""" return self._name or str(self.value) - def _to_expression(self, other, op): + 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): - return self._to_expression(other, "+") + 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, "+") @@ -379,9 +380,13 @@ def __rdivmod__(self, other): # self.set_to = other.__name__ -ParameterLike = int | float | Parameter -FloatParameterLike = float | Parameter -IntParameterLike = int | Parameter +# ParameterLike = int | float | Parameter +# FloatParameterLike = float | Parameter +# IntParameterLike = int | Parameter + + +def is_parameter_like(annotation): + return Parameter in get_args(annotation) class ParameterArray(BaseModel): @@ -567,17 +572,47 @@ class RefinementBaseModel(XRPDBaseModel, extra="allow"): 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 = [lower, upper] + return bounds + def parameterise_all(self, refine: bool = False): - for name, val in type(self).model_fields.items(): - if ( - val.annotation is ParameterLike - or FloatParameterLike - or IntParameterLike - ): + 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): - setattr(self, name, Parameter(value=float(field), refine=refine)) + bounds = self.get_bounds_from_metadata(field_info.metadata) + + setattr( + self, + name, + Parameter(value=float(field), refine=refine, bounds=bounds), + ) def path_to_string(self, path) -> str: out = [] @@ -626,8 +661,8 @@ def iter_parameters(self, prefix=()): yield from v.iter_parameters(subpath) def model_post_init(self, __context: Any): - self._params = self._collect_parameters() - self._bind_parameters() + params = self._collect_parameters() + self._bind_parameters(params) def _collect_parameters(self) -> dict[str, Parameter]: params: dict[str, Parameter] = {} @@ -638,8 +673,8 @@ def _collect_parameters(self) -> dict[str, Parameter]: return params - def _bind_parameters(self) -> None: - for name, param in self._params.items(): + def _bind_parameters(self, params: dict) -> None: + for name, param in params.items(): param._name = name # noqa param._model = self # noqa @@ -764,7 +799,7 @@ class Model(RefinementBaseModel): calculate_residual""" @abstractmethod - def calculate_residual(self): + def calculate_profile(self): raise NotImplementedError( "Must implmenet calculate_residual for Model subclass" ) diff --git a/src/xrpd_toolbox/fit_engine/peaks.py b/src/xrpd_toolbox/fit_engine/peaks.py index 840f71e..5b3105b 100644 --- a/src/xrpd_toolbox/fit_engine/peaks.py +++ b/src/xrpd_toolbox/fit_engine/peaks.py @@ -370,15 +370,18 @@ def fit_peaks( return fitted_peaks -def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[BasePeak]: +def find_and_fit_peaks( + x: np.ndarray, y: np.ndarray, smoothing: int = 5 +) -> list[BasePeak]: """function to get the centre peaks given without guessing""" y_smoothed = np.convolve( - y, np.ones(5), mode="same" + y, np.ones(smoothing), mode="same" ) # smooth the data to reduce noise - threshold = np.amax(y_smoothed) / 20 - indexes = peakutils.indexes(y_smoothed, thres=threshold, min_dist=30) # type: ignore + 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) @@ -388,7 +391,7 @@ def find_and_fit_peaks(x: np.ndarray, y: np.ndarray) -> list[BasePeak]: class BasePeak(RefinementBaseModel): amplitude: Parameter | float = Field(gt=0) - centre: Parameter | float + centre: Parameter | float = Field(gt=0) fwhm: Parameter | float = Field(gt=0, default=Parameter(value=0.02)) normalised: bool = True # if normalised the @@ -401,7 +404,13 @@ class GaussianPeak(BasePeak): 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)) + return gaussian( + x, + float(self.amplitude), + float(self.centre), + float(self.fwhm), + normalised=self.normalised, + ) class LorentzianPeak(BasePeak): @@ -409,7 +418,11 @@ class LorentzianPeak(BasePeak): def calculate(self, x: np.ndarray) -> np.ndarray: return lorentzian( - x, float(self.amplitude), float(self.centre), float(self.fwhm) + x, + float(self.amplitude), + float(self.centre), + float(self.fwhm), + normalised=self.normalised, ) @@ -427,6 +440,7 @@ def calculate(self, x: np.ndarray) -> np.ndarray: float(self.centre), float(self.fwhm), float(self.eta), + normalised=self.normalised, ) @@ -434,7 +448,7 @@ class TopHatPeak(BasePeak): peak_type: Literal["tophat"] = "tophat" epsilon: Parameter | float | int = Field( - ge=0, le=1, default=0 + ge=0, le=1, default=0.1 ) # used for tophat - smoothing def calculate(self, x: np.ndarray) -> np.ndarray: @@ -444,9 +458,16 @@ def calculate(self, x: np.ndarray) -> np.ndarray: 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(BasePeak): +# peak_type: Literal["mutatable"] = "mutatable" + + def calculate_profile( x: np.ndarray, peaks: Sequence[BasePeak], @@ -468,8 +489,10 @@ def calculate_profile( intensity = np.zeros_like(x) for peak in peaks: - start_idx = np.searchsorted(x, peak.centre - (wdt * peak.fwhm)) - end_idx = np.searchsorted(x, peak.centre + (wdt * peak.fwhm), side="right") + 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 diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index 49f7912..b907f6f 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -951,6 +951,7 @@ class XYEData(XRPDBaseModel): x: SerialisableNDArray = Field(repr=False) y: SerialisableNDArray = Field(repr=False) e: SerialisableNDArray | None = Field(default=None, repr=False) + source: str | None = None # for tracking where the data came from @model_validator(mode="after") def validate_data(self): @@ -960,12 +961,21 @@ def validate_data(self): 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)) + class ScatteringData(XYEData): x_unit: XUnit = "tth" data_type: DataType = "xray" wavelength: Parameter # for x-ray or CW neutron data - source: str | None = None # for tracking where the data came from @model_validator(mode="after") def validate_data_units(self): @@ -990,7 +1000,7 @@ def plot(self, show: bool = True): @classmethod def from_xye( cls, - filename: str | Path, + filepath: str | Path, x_unit: XUnit, data_type: DataType, wavelength: float | Parameter, @@ -1006,9 +1016,9 @@ def from_xye( wavelength = Parameter(value=wavelength, refine=False) try: - x, y, e = np.genfromtxt(str(filename), unpack=True, dtype=float) + x, y, e = np.genfromtxt(str(filepath), unpack=True, dtype=float) except ValueError: - x, y = np.genfromtxt(str(filename), unpack=True, dtype=float) + x, y = np.genfromtxt(str(filepath), unpack=True, dtype=float) e = None return cls( @@ -1018,13 +1028,13 @@ def from_xye( x_unit=x_unit, data_type=data_type, wavelength=wavelength, - source=str(filename), + source=str(filepath), ) @classmethod def from_fullprof( cls, - filename: str | Path, + filepath: str | Path, x_unit: XUnit, data_type: DataType, wavelength: float | Parameter, @@ -1039,7 +1049,7 @@ def from_fullprof( else: wavelength = Parameter(value=wavelength, refine=False) x, y, e = np.genfromtxt( - str(filename), + str(filepath), skip_header=1, comments="!", unpack=True, @@ -1053,7 +1063,7 @@ def from_fullprof( x_unit=x_unit, data_type=data_type, wavelength=wavelength, - source=str(filename), + source=str(filepath), ) @@ -1159,6 +1169,8 @@ def calculate_profile(self) -> np.ndarray: calculated_intensity * float(self.phase_scale) ) + background + _ = self.chi_squared + return self.calculated_intensity @computed_field @@ -1244,7 +1256,7 @@ def test_refine_silicon(): model.irf.refine_none() - updated, model, result = refine_model(model, plot=False, plot_every=5) + updated, model, result = refine_model(model, plot=True, plot_every=5) model.irf.refine_all() updated, model, result = refine_model(model, plot=False, plot_every=1) @@ -1261,8 +1273,8 @@ def test_load_refinement_and_refine(): # refine_model(loaded_refinement) - # model = test_refine_silicon() - test_load_refinement_and_refine() + model = test_refine_silicon() + # test_load_refinement_and_refine() two_theta = np.linspace(1, 70, 1000) diff --git a/src/xrpd_toolbox/fit_engine/refiner.py b/src/xrpd_toolbox/fit_engine/refiner.py index aed4872..fb97cd5 100644 --- a/src/xrpd_toolbox/fit_engine/refiner.py +++ b/src/xrpd_toolbox/fit_engine/refiner.py @@ -1,3 +1,4 @@ +import time from copy import deepcopy from typing import cast @@ -37,7 +38,13 @@ def setup_plot(model): ) ax.legend() - ax.set_xlabel(model.data.x_unit) + + try: + x_unit = model.data.x_unit + except Exception: + x_unit = "index" + + ax.set_xlabel(x_unit) ax.set_ylabel("Intensity") canvas = cast(FigureCanvasAgg, fig.canvas) @@ -74,6 +81,8 @@ def refine_model( bounds=None, plot: bool = False, plot_every: int = 5, + step_time: int | float | None = None, + max_nfev: int = 1000, **kwargs, ): params = [] @@ -122,10 +131,13 @@ def maybe_update_plot(): @timeit def residual(x): update(x) + if step_time is not None: + time.sleep(step_time) print(new_model.get_refinement_parameters()) + print(new_model.background) + y_calc = new_model.calculate_profile() - _ = new_model.chi_squared r = new_model.data.y - y_calc maybe_update_plot() @@ -137,6 +149,7 @@ def residual(x): residual, x0, bounds=(lower, upper), + max_nfev=max_nfev, **kwargs, ) 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..4bb35bc --- /dev/null +++ b/src/xrpd_toolbox/i15_1/sample_alignment.py @@ -0,0 +1,159 @@ +import math +import os + +import matplotlib.pyplot as plt +import numpy as np +from scipy.signal import find_peaks + +from xrpd_toolbox.core import Model, Parameter +from xrpd_toolbox.fit_engine.background import ConstantBackground +from xrpd_toolbox.fit_engine.peaks import ( + PeakType, + TopHatPeak, + calculate_profile, +) +from xrpd_toolbox.fit_engine.profile_calculation import XYEData +from xrpd_toolbox.fit_engine.refiner import refine_model +from xrpd_toolbox.utils.utils import cluster_points_auto + + +class SampleAligner(Model): + data: XYEData + background: ConstantBackground + sample_and_capillary: list[PeakType] = [] + + def get_peak_info(self, labels, peak_position, peak_intensity): + 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) / 10 + + 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 use_simple_peak_model(self): + # capillary_edge = GaussianPeak( + # amplitude=np.ptp(self.data.y), + # centre=self.data.x.max() / 3, + # fwhm=np.ptp(self.data.x) / 20, + # normalised=False, + # ) + # capillary_edge.parameterise_all(refine=True) + # self.sample_and_capillary.append(capillary_edge) + + # sample1 = TopHatPeak( + # amplitude=np.ptp(self.data.y), + # centre=self.data.x.max() / 2, + # fwhm=np.ptp(self.data.x) / 5, + # normalised=False, + # ) + # sample1.parameterise_all(refine=True) + # sample1.amplitude.bounds = [0, np.amax(self.data.y)] + # sample1.fwhm.bounds = [0, np.inf] + # sample1.centre.bounds = [0, np.amax(self.data.x)] + + # sample1.epsilon.refine = False + + # sample2 = sample1.__deepcopy__() + # sample3 = sample2.__deepcopy__() + + # sample1.centre.value = sample1.centre.value - 10 + # sample2.centre.value = sample2.centre.value + 20 + + # # print(self.background) + # # print(sample1) + # # print(sample2) + # # quit() + + # self.sample_and_capillary.extend([sample1, sample2, sample3]) + + def calculate_profile(self): + return calculate_profile( + self.data.x, self.sample_and_capillary + ) + self.background.calculate(self.data.x) + + def get_initial_peaks(self, smoothing: int = 5): + 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: + sample_peak = TopHatPeak.model_validate(peak) + sample_peak.parameterise_all(refine=True) + sample_peak.normalised = False + assert isinstance(sample_peak.centre, Parameter) + sample_peak.centre.bounds = [np.amin(self.data.x), np.amax(self.data.x)] + + self.sample_and_capillary.append(sample_peak) + + # print(self.sample_and_capillary) + # plt.scatter(peak_position, peak_intensity) + # plt.plot(self.data.x, self.data.y) + # plt.show() + + def plot_data(self): + if self.data.source is not None: + plt.title(os.path.basename(self.data.source)) + + # profile = calculate_profile(self.data.x, self.sample_and_capillary) + + # profile = profile + self.background.calculate(self.data.x) + + # plt.plot(self.data.x, profile) + plt.plot(self.data.x, self.data.y) + plt.plot(self.data.x, self.background.calculate(data.x)) + plt.show() + + +if __name__ == "__main__": + 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)] + + for filepath in sample_alignment_files: + data = XYEData.from_csv(filepath) + background = ConstantBackground.estimate(data.x, data.y) + background.refine_none() + + print(background.value) + + sample_alignment = SampleAligner(data=data, background=background) + + # sample_alignment.plot_data() + sample_alignment.get_initial_peaks() + + updated, new_model, result = refine_model( + sample_alignment, plot=True, step_time=0.1, max_nfev=10 + ) + + # sample_alignment.plot_data() diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index ccea26c..d827ba2 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -482,3 +482,62 @@ def parse_numbers_with_error( 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/uv.lock b/uv.lock index 1f5fbe8..bc5e073 100644 --- a/uv.lock +++ b/uv.lock @@ -2590,6 +2590,56 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, ] +[[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.0" @@ -2784,6 +2834,15 @@ 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" @@ -3047,6 +3106,7 @@ dependencies = [ { name = "pymatgen" }, { name = "pyqt6" }, { name = "pyyaml" }, + { name = "scikit-learn" }, { name = "scipy" }, { name = "spglib" }, { name = "stomp-py" }, @@ -3084,6 +3144,7 @@ requires-dist = [ { name = "pymatgen" }, { name = "pyqt6" }, { name = "pyyaml" }, + { name = "scikit-learn" }, { name = "scipy" }, { name = "spglib" }, { name = "stomp-py" }, From b2a235e86e3a0c2f126d046583a74024ef2c29e2 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 7 May 2026 09:38:59 +0000 Subject: [PATCH 76/86] fixed refinement plotting, replaced refiner with fitting_core and improve sample alignment --- src/xrpd_toolbox/core.py | 354 ++++------ src/xrpd_toolbox/fit_engine/background.py | 66 +- src/xrpd_toolbox/fit_engine/fitting_core.py | 614 ++++++++++++++++++ src/xrpd_toolbox/fit_engine/lattice.py | 3 +- .../fit_engine/peak_shape_functions.py | 3 +- src/xrpd_toolbox/fit_engine/peaks.py | 230 +++++-- .../fit_engine/profile_calculation.py | 173 +---- src/xrpd_toolbox/fit_engine/refiner.py | 176 ----- src/xrpd_toolbox/i11/mythen_pyfai.py | 12 +- src/xrpd_toolbox/i15_1/sample_alignment.py | 302 +++++++-- src/xrpd_toolbox/utils/utils.py | 52 +- tests/test_core.py | 240 ++++++- tests/test_lattice.py | 90 ++- 13 files changed, 1613 insertions(+), 702 deletions(-) create mode 100644 src/xrpd_toolbox/fit_engine/fitting_core.py delete mode 100644 src/xrpd_toolbox/fit_engine/refiner.py diff --git a/src/xrpd_toolbox/core.py b/src/xrpd_toolbox/core.py index 74ef244..e8c5971 100644 --- a/src/xrpd_toolbox/core.py +++ b/src/xrpd_toolbox/core.py @@ -3,11 +3,11 @@ import json import math import tomllib -from abc import abstractmethod from numbers import Real from pathlib import Path -from typing import Annotated, Any, get_args +from typing import Annotated, Any, Literal, TypeAlias, get_args +import matplotlib.pyplot as plt import numpy as np import toml import yaml @@ -15,6 +15,7 @@ BaseModel, BeforeValidator, ConfigDict, + Field, PlainSerializer, model_serializer, model_validator, @@ -22,6 +23,15 @@ 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): @@ -445,10 +455,8 @@ def deserialize(cls, data): return data - def __getitem__(self, key: str | int | slice): - if isinstance(key, str) and key in type(self).model_fields: - return getattr(self, key) - elif isinstance(key, int): + 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]) @@ -566,242 +574,126 @@ def __setitem__(self, name, value): setattr(self, name, value) -class RefinementBaseModel(XRPDBaseModel, extra="allow"): - """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 = [lower, 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 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 +class XYEData(XRPDBaseModel): + x: SerialisableNDArray = Field(repr=False) + y: SerialisableNDArray = Field(repr=False) + e: SerialisableNDArray | None = Field(default=None, repr=False) + source: str | None = None # for tracking where the data came from - # # --- 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 + @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) - # 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 self - return obj + @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 - def set_refinement_parameters(self, values: dict[str, float]): - # Build mapping once - path_map = {} - seen = set() + return cls(x=x, y=y, e=e, source=str(filepath)) - add_seen = seen.add - for path, p in self.iter_parameters(): - if not p.refine: - continue +# 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" + data_type: DataType = "xray" + wavelength: Parameter # for x-ray or CW neutron data - pid = id(p) - if pid in seen: - continue + @model_validator(mode="after") + def validate_data_units(self): + if self.data_type == "x-ray": + assert self.x_unit != "tof" - add_seen(pid) - path_map[self.path_to_string(path)] = p + return self - # Apply updates - for key, val in values.items(): - path_map[key].value = float(val) + 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})") - def refine_none(self, keep_refined: list[str] | None = None): - if keep_refined is None: - keep_refined = [] + if show: + plt.legend() + plt.show() - for name, param in self.iter_parameters(): - if name[-1] in keep_refined: - continue - else: - param.refine = False + # 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 + """ - 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 + 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 + """ -class Model(RefinementBaseModel): - """A model can be refined by the refiner. It must contain: - calculate_residual""" + 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, + ) - @abstractmethod - def calculate_profile(self): - raise NotImplementedError( - "Must implmenet calculate_residual for Model subclass" + return cls( + x=x, + y=y, + e=e, + x_unit=x_unit, + data_type=data_type, + wavelength=wavelength, + source=str(filepath), ) @@ -810,16 +702,8 @@ def calculate_profile(self): a = Parameter(value=3, refine=True) - rf = RefinementBaseModel() - print(a) x = 1.0 + Parameter(value=3) print(x) - - rf["a"] = 1 - - print(rf.model_dump_json()) - - print(rf) diff --git a/src/xrpd_toolbox/fit_engine/background.py b/src/xrpd_toolbox/fit_engine/background.py index 050bb93..edb6a7a 100644 --- a/src/xrpd_toolbox/fit_engine/background.py +++ b/src/xrpd_toolbox/fit_engine/background.py @@ -8,9 +8,9 @@ from xrpd_toolbox.core import ( Parameter, ParameterArray, - RefinementBaseModel, SerialisableNDArray, ) +from xrpd_toolbox.fit_engine.fitting_core import RefinementBaseModel # TODO: Should we store x here too?; If so store it as private @@ -186,10 +186,72 @@ def estimate( 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, + | ChebyshevBackground + | SplitBackground, Field(discriminator="background_type"), ] 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..f43fd04 --- /dev/null +++ b/src/xrpd_toolbox/fit_engine/fitting_core.py @@ -0,0 +1,614 @@ +"""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, cast + +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, + is_parameter_like, +) +from xrpd_toolbox.utils.utils import calculate_chi_squared + +# 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", +] + + +class RefinementBaseModel(XRPDBaseModel, extra="allow"): + """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 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""" + + 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]: + 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, model.data.y, model.data.e) + print(f"Chi-squared: {chi_squared}") + + 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/lattice.py b/src/xrpd_toolbox/fit_engine/lattice.py index 61f97ea..e750037 100644 --- a/src/xrpd_toolbox/fit_engine/lattice.py +++ b/src/xrpd_toolbox/fit_engine/lattice.py @@ -1,6 +1,7 @@ import numpy as np -from xrpd_toolbox.core import Parameter, RefinementBaseModel +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 diff --git a/src/xrpd_toolbox/fit_engine/peak_shape_functions.py b/src/xrpd_toolbox/fit_engine/peak_shape_functions.py index 5b04627..714cc73 100644 --- a/src/xrpd_toolbox/fit_engine/peak_shape_functions.py +++ b/src/xrpd_toolbox/fit_engine/peak_shape_functions.py @@ -5,7 +5,8 @@ from numba import njit from pydantic import Field -from xrpd_toolbox.core import Parameter, RefinementBaseModel +from xrpd_toolbox.core import Parameter +from xrpd_toolbox.fit_engine.fitting_core import RefinementBaseModel def caglioti_fwhm( diff --git a/src/xrpd_toolbox/fit_engine/peaks.py b/src/xrpd_toolbox/fit_engine/peaks.py index 5b3105b..63cf2e3 100644 --- a/src/xrpd_toolbox/fit_engine/peaks.py +++ b/src/xrpd_toolbox/fit_engine/peaks.py @@ -1,3 +1,9 @@ +"""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 @@ -12,8 +18,9 @@ from scipy.optimize import curve_fit from scipy.special import erf -from xrpd_toolbox.core import Parameter, RefinementBaseModel +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" @@ -22,21 +29,25 @@ @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 @@ -95,6 +106,30 @@ def lorentzian( 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: @@ -182,25 +217,33 @@ def smooth_tophat( background: float | int | np.ndarray = 0, normalised: bool = True, ): - """ - Gaussian-smoothed top-hat (fast, analytic normalization). + """Return a Gaussian-smoothed top-hat profile. Parameters ---------- - amplitude : float - Area (if normalized=True) or height (if normalized=False) - centre : float - Centre of the plateau - fwhm : float - Width of the plateau - epsilon : float - Edge smoothing parameter (0–1) - """ + 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. - # map epsilon - sigma (smoothing width) - sigma = max(epsilon * fwhm / 2, 1e-12) + Returns + ------- + NDArray[np.float64] + Evaluated smooth top-hat function. + """ - half_width = fwhm / 2 + 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) @@ -208,7 +251,8 @@ def smooth_tophat( profile = 0.5 * (erf(left) - erf(right)) if normalised: - # analytic area = fwhm + # area is already fwhm * 1.0 (plateau height = 1) + # so amplitude is converted to height scale = amplitude / fwhm else: scale = amplitude @@ -216,10 +260,20 @@ def smooth_tophat( return scale * profile + background -def closest_indices(arr1, arr2): - """ - For each value in arr1, find the index of the closest value in arr2. - Returns an array of indices with the same shape as arr1. +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) @@ -231,6 +285,23 @@ def closest_indices(arr1, arr2): 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 @@ -327,7 +398,23 @@ def estimate_fwhm( def fit_peaks( x: np.ndarray, y: np.ndarray, initial_x_pos: Collection[int | float] -) -> list[BasePeak]: +) -> 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: @@ -370,10 +457,23 @@ def fit_peaks( return fitted_peaks -def find_and_fit_peaks( - x: np.ndarray, y: np.ndarray, smoothing: int = 5 -) -> list[BasePeak]: - """function to get the centre peaks given without guessing""" +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" @@ -389,7 +489,13 @@ def find_and_fit_peaks( return fitted_peaks -class BasePeak(RefinementBaseModel): +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)) @@ -397,10 +503,13 @@ class BasePeak(RefinementBaseModel): @abstractmethod def calculate(self, x: np.ndarray) -> np.ndarray: - NotImplementedError("Must implement calculate method in peak subclass") + """Evaluate the peak shape on a coordinate array.""" + raise NotImplementedError("Must implement calculate method in peak subclass") + +class GaussianPeak(Peak): + """Gaussian peak model class.""" -class GaussianPeak(BasePeak): peak_type: Literal["gaussian"] = "gaussian" def calculate(self, x: np.ndarray) -> np.ndarray: @@ -413,7 +522,9 @@ def calculate(self, x: np.ndarray) -> np.ndarray: ) -class LorentzianPeak(BasePeak): +class LorentzianPeak(Peak): + """Lorentzian peak model class.""" + peak_type: Literal["lorentzian"] = "lorentzian" def calculate(self, x: np.ndarray) -> np.ndarray: @@ -426,7 +537,9 @@ def calculate(self, x: np.ndarray) -> np.ndarray: ) -class PseudoVoigtPeak(BasePeak): +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( @@ -444,7 +557,9 @@ def calculate(self, x: np.ndarray) -> np.ndarray: ) -class TopHatPeak(BasePeak): +class TopHatPeak(Peak): + """Smoothed top-hat peak model class.""" + peak_type: Literal["tophat"] = "tophat" epsilon: Parameter | float | int = Field( @@ -464,23 +579,36 @@ def calculate(self, x: np.ndarray) -> np.ndarray: # 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(BasePeak): +# class MutatablePeak(Peak): # peak_type: Literal["mutatable"] = "mutatable" def calculate_profile( x: np.ndarray, - peaks: Sequence[BasePeak], + peaks: Sequence[Peak], background: int | float | np.ndarray | Background = 0, phase_scale: int | float = 1, wdt: int | float = 5, ): - """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). + """Calculate the combined peak profile and optional background. - peaks: list of class: Peak which contain (cen, amp, fwhm) + 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. - background: scalar or array, if array must be same shape as x + Returns + ------- + numpy.ndarray + Summed intensity profile for the input coordinates. """ if isinstance(background, np.ndarray): @@ -512,17 +640,35 @@ def calculate_profile( @njit(parallel=True) def calculate_profile_parallel( x: np.ndarray, - peaks: Sequence[BasePeak], + peaks: Sequence[Peak], background: int | float | np.ndarray | Background = 0, phase_scale: int | float = 1, wdt: int | float = 5, ): - """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). + """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. - peaks: list of class: Peak which contain (cen, amp, fwhm) + Returns + ------- + numpy.ndarray + Combined intensity profile. - background: scalar or array, if array must be same shape as x + Notes + ----- + This implementation is currently not completed and raises + NotImplementedError by design. """ raise NotImplementedError("Not implemented well yet") diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index b907f6f..52a6390 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -10,11 +10,10 @@ from pydantic import Field, computed_field, model_validator from xrpd_toolbox.core import ( - Model, + DataType, Parameter, - RefinementBaseModel, + ScatteringData, SerialisableNDArray, - XRPDBaseModel, ) from xrpd_toolbox.fit_engine.atom import Atoms from xrpd_toolbox.fit_engine.background import ( @@ -24,6 +23,11 @@ from xrpd_toolbox.fit_engine.constants import ( ELEMENT_ATOMIC_NUMBER, ) +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, @@ -38,7 +42,6 @@ calculate_profile, peak_factory, ) -from xrpd_toolbox.fit_engine.refiner import refine_model from xrpd_toolbox.fit_engine.symmetry import ( SpaceGroup, format_space_group_name, @@ -50,15 +53,7 @@ q_space_to_s, q_space_to_theta, ) - -XUnit: TypeAlias = Literal["tth", "tof", "q", "d"] - -DataType: TypeAlias = Literal[ - "xray", - "lab-xray", - "tof-neutron", - "cw-neutron", -] +from xrpd_toolbox.utils.utils import calculate_chi_squared CrystalType: TypeAlias = Literal["powder", "single-crystal"] @@ -66,20 +61,6 @@ ITC_TABLES = get_symmetry_tables() -def calculate_chi_squared( - ycalc: np.ndarray, yobs: np.ndarray, y_err: np.ndarray | None -) -> float: - if y_err is not None: - wi = 1 / y_err**2 - else: - wi = 1 / yobs - - residual = (wi * (yobs - ycalc)) ** 2 - chi_squared = float(np.sum(residual)) - - return chi_squared - - def merge_peaks( two_theta, intensity, hkl, tol=1e-5 ) -> tuple[np.ndarray, np.ndarray, list]: @@ -947,126 +928,6 @@ def cif_to_structure(cif_filepath: str | Path) -> Structure: return structure -class XYEData(XRPDBaseModel): - x: SerialisableNDArray = Field(repr=False) - y: SerialisableNDArray = Field(repr=False) - e: SerialisableNDArray | None = Field(default=None, repr=False) - 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)) - - -class ScatteringData(XYEData): - x_unit: XUnit = "tth" - data_type: DataType = "xray" - wavelength: Parameter # for x-ray or CW neutron data - - @model_validator(mode="after") - def validate_data_units(self): - if self.data_type == "x-ray": - assert self.x_unit != "tof" - - 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), - ) - - ##### more complex pydantic models to do whole profiles class PeakProfile(RefinementBaseModel): phase_scale: int | float | Parameter = Parameter(value=1e-5, bounds=[0, np.inf]) @@ -1092,18 +953,10 @@ def calculate_profile(self): ) -class CalculatedReflections(XRPDBaseModel): - peak_centres: list[float] - intensity: list[float] - structure_factor: list[float] - hkl: list[list[int]] | None = None - - -class ReitveldRefinement(Model): +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]) - data: ScatteringData # | list[ScatteringData] irf: IntrumentResolutionFunction = Field(default=FCJPseudoVoigt()) background: np.ndarray | float | int | BackgroundType | Parameter = Parameter( value=0 @@ -1169,8 +1022,6 @@ def calculate_profile(self) -> np.ndarray: calculated_intensity * float(self.phase_scale) ) + background - _ = self.chi_squared - return self.calculated_intensity @computed_field @@ -1181,8 +1032,6 @@ def chi_squared(self) -> float: self.calculated_intensity, self.data.y, self.data.e ) - print(f"chi squared: {chi_squared:.3e}") - return chi_squared else: @@ -1256,10 +1105,10 @@ def test_refine_silicon(): model.irf.refine_none() - updated, model, result = refine_model(model, plot=True, plot_every=5) + updated, model, result = refine_model(model, plot=True) model.irf.refine_all() - updated, model, result = refine_model(model, plot=False, plot_every=1) + updated, model, result = refine_model(model, plot=True) model.save(output_name) diff --git a/src/xrpd_toolbox/fit_engine/refiner.py b/src/xrpd_toolbox/fit_engine/refiner.py deleted file mode 100644 index fb97cd5..0000000 --- a/src/xrpd_toolbox/fit_engine/refiner.py +++ /dev/null @@ -1,176 +0,0 @@ -import time -from copy import deepcopy -from typing import cast - -import matplotlib.pyplot as plt -import numpy as np -from matplotlib.backends.backend_agg import FigureCanvasAgg -from scipy import optimize - -# from xrpd_toolbox.fit_engine.profile_calculation import ReitveldRefinement -from xrpd_toolbox.utils.utils import timeit - - -def setup_plot(model): - 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", - animated=True, - label="Observed", - ) - - (line_calc,) = ax.plot(x, y_calc, color="red", animated=True, label="Calculated") - - (line_diff,) = ax.plot( - x, y_obs - y_calc + offset, color="blue", animated=True, label="Obs - Calc" - ) - - ax.legend() - - try: - x_unit = model.data.x_unit - except Exception: - x_unit = "index" - - ax.set_xlabel(x_unit) - ax.set_ylabel("Intensity") - - canvas = cast(FigureCanvasAgg, fig.canvas) - - canvas.draw() - background = canvas.copy_from_bbox(ax.bbox) - - return fig, ax, (line_obs, line_calc, line_diff, offset), canvas, background - - -def update_plot(model, lines, ax, canvas, background): - line_obs, line_calc, line_diff, offset = 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 + offset) - - canvas.restore_region(background) - - ax.draw_artist(line_obs) - ax.draw_artist(line_calc) - ax.draw_artist(line_diff) - - canvas.blit(ax.bbox) - canvas.flush_events() - - -# refinement algorithm -def refine_model( - model, - method="least_squares", - bounds=None, - plot: bool = False, - plot_every: int = 5, - step_time: int | float | None = None, - max_nfev: int = 1000, - **kwargs, -): - params = [] - # seen = set() - - new_model = deepcopy(model) - - for _, p in new_model.iter_parameters(): - if (not p.refine) or (not isinstance(p.value, (int | float))): - continue - - params.append(p) - - if not params: - raise ValueError("No refinable parameters") - - n = len(params) - - x0 = np.empty(n, dtype=float) - lower = np.empty(n, dtype=float) - upper = np.empty(n, dtype=float) - - for i, p in enumerate(params): - x0[i] = float(p.value) - lower[i], upper[i] = p.bounds - - def update(x): - for i in range(n): - params[i].value = float(x[i]) - - if plot: - counter = {"i": 0} - - fig, ax, lines, canvas, background = setup_plot(new_model) - - def maybe_update_plot(): - counter["i"] += 1 - if counter["i"] % plot_every == 0: - update_plot(new_model, lines, ax, canvas, background) - - else: - - def maybe_update_plot(): - pass - - @timeit - def residual(x): - update(x) - if step_time is not None: - time.sleep(step_time) - - print(new_model.get_refinement_parameters()) - print(new_model.background) - - y_calc = new_model.calculate_profile() - r = new_model.data.y - y_calc - - maybe_update_plot() - - return np.asarray(r, dtype=float) - - if method == "least_squares": - result = optimize.least_squares( - residual, - x0, - bounds=(lower, upper), - max_nfev=max_nfev, - **kwargs, - ) - - else: - - def objective(x): - r = residual(x) - return float(r @ r) - - result = optimize.minimize( - objective, - x0, - bounds=list(zip(lower, upper, strict=True)) if bounds is None else bounds, - **kwargs, - ) - - update(result.x) - - updated = {i: float(result.x[i]) for i in range(n)} - - if plot: - plt.close() - - return updated, new_model, result diff --git a/src/xrpd_toolbox/i11/mythen_pyfai.py b/src/xrpd_toolbox/i11/mythen_pyfai.py index da10146..a3f53fb 100644 --- a/src/xrpd_toolbox/i11/mythen_pyfai.py +++ b/src/xrpd_toolbox/i11/mythen_pyfai.py @@ -70,7 +70,7 @@ def __init__( detector_module.mask = mask.reshape(-1, 1) self.modules[name] = detector_module - trans = ExtendedTransformation( + ExtendedTransformation( dist_expr="dist", poni1_expr="poni1", poni2_expr="poni2", @@ -165,11 +165,11 @@ def peak_picking(self, module_name, frame_id, threshold=500): 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() + # 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__": diff --git a/src/xrpd_toolbox/i15_1/sample_alignment.py b/src/xrpd_toolbox/i15_1/sample_alignment.py index 4bb35bc..b1cd4bb 100644 --- a/src/xrpd_toolbox/i15_1/sample_alignment.py +++ b/src/xrpd_toolbox/i15_1/sample_alignment.py @@ -1,3 +1,9 @@ +"""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 @@ -5,24 +11,59 @@ import numpy as np from scipy.signal import find_peaks -from xrpd_toolbox.core import Model, Parameter -from xrpd_toolbox.fit_engine.background import ConstantBackground +from xrpd_toolbox.core import Parameter, XRPDBaseModel, XYEData +from xrpd_toolbox.fit_engine.background import ( + BackgroundType, + ConstantBackground, +) +from xrpd_toolbox.fit_engine.fitting_core import Model from xrpd_toolbox.fit_engine.peaks import ( + Peak, PeakType, - TopHatPeak, calculate_profile, + peak_factory, ) -from xrpd_toolbox.fit_engine.profile_calculation import XYEData -from xrpd_toolbox.fit_engine.refiner import refine_model from xrpd_toolbox.utils.utils import cluster_points_auto -class SampleAligner(Model): - data: XYEData - background: ConstantBackground +class SampleCenteringResult(XRPDBaseModel): + """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] = [] 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) @@ -38,7 +79,7 @@ def get_peak_info(self, labels, peak_position, peak_intensity): average_peak_spread = np.ptp(group_positions) if average_peak_spread == 0: - average_peak_spread = np.ptp(self.data.x) / 10 + average_peak_spread = np.ptp(self.data.x) / 20 peak = { "group": int(group), @@ -51,48 +92,29 @@ def get_peak_info(self, labels, peak_position, peak_intensity): return grouped_peaks - # def use_simple_peak_model(self): - # capillary_edge = GaussianPeak( - # amplitude=np.ptp(self.data.y), - # centre=self.data.x.max() / 3, - # fwhm=np.ptp(self.data.x) / 20, - # normalised=False, - # ) - # capillary_edge.parameterise_all(refine=True) - # self.sample_and_capillary.append(capillary_edge) - - # sample1 = TopHatPeak( - # amplitude=np.ptp(self.data.y), - # centre=self.data.x.max() / 2, - # fwhm=np.ptp(self.data.x) / 5, - # normalised=False, - # ) - # sample1.parameterise_all(refine=True) - # sample1.amplitude.bounds = [0, np.amax(self.data.y)] - # sample1.fwhm.bounds = [0, np.inf] - # sample1.centre.bounds = [0, np.amax(self.data.x)] - - # sample1.epsilon.refine = False - - # sample2 = sample1.__deepcopy__() - # sample3 = sample2.__deepcopy__() - - # sample1.centre.value = sample1.centre.value - 10 - # sample2.centre.value = sample2.centre.value + 20 - - # # print(self.background) - # # print(sample1) - # # print(sample2) - # # quit() - - # self.sample_and_capillary.extend([sample1, sample2, sample3]) - 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, smoothing: int = 5): + 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] @@ -108,32 +130,186 @@ def get_initial_peaks(self, smoothing: int = 5): ): continue else: - sample_peak = TopHatPeak.model_validate(peak) + 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 = [np.amin(self.data.x), np.amax(self.data.x)] - + 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 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: plt.title(os.path.basename(self.data.source)) - # profile = calculate_profile(self.data.x, self.sample_and_capillary) + profile = calculate_profile(self.data.x, self.sample_and_capillary) - # profile = profile + self.background.calculate(self.data.x) + profile = profile + self.background.calculate(self.data.x) - # plt.plot(self.data.x, profile) - plt.plot(self.data.x, self.data.y) - plt.plot(self.data.x, self.background.calculate(data.x)) + plt.scatter(self.data.x, self.data.y, label="Obs", color="black", s=5) + plt.plot(self.data.x, profile, label="Calc", color="red") + plt.plot( + self.data.x, self.background.calculate(self.data.x), label="background" + ) + plt.plot(self.data.x, self.data.y - profile, label="Obs-Calc", color="blue") plt.show() + 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] + + 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_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_builder(data, "gaussian") + _, gauss_model, gauss_result = gauss_model.refine() + + tophat_model = sample_alignment_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 + if __name__ == "__main__": folder = "/workspaces/XRPD-Toolbox/src/xrpd_toolbox/i15_1/sample_alignment_data" @@ -141,19 +317,15 @@ def plot_data(self): sample_alignment_files = [os.path.join(folder, f) for f in os.listdir(folder)] for filepath in sample_alignment_files: - data = XYEData.from_csv(filepath) - background = ConstantBackground.estimate(data.x, data.y) - background.refine_none() + best_model = run_sample_alignment(data=filepath) - print(background.value) + sample_centre_result = best_model.get_sample_centre() + _ = best_model.get_best_peaks() - sample_alignment = SampleAligner(data=data, background=background) + print(sample_centre_result.model_dump_json()) - # sample_alignment.plot_data() - sample_alignment.get_initial_peaks() + plt.vlines(sample_centre_result.centre, 0, best_model.data.y.max()) - updated, new_model, result = refine_model( - sample_alignment, plot=True, step_time=0.1, max_nfev=10 - ) + best_model.plot_data() - # sample_alignment.plot_data() + print("-----") diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index d827ba2..a0321c9 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -15,7 +15,28 @@ from scipy.interpolate import interp1d +def calculate_chi_squared( + ycalc: np.ndarray, yobs: np.ndarray, y_err: np.ndarray | None +) -> float: + """calculates chi_squared (the minimisation cost function) that is familiar to + those who do retiveld refinements""" + + if y_err is not None: + wi = 1 / y_err**2 + else: + wi = 1 / yobs + + residual = (wi * (yobs - ycalc)) ** 2 + chi_squared = float(np.sum(residual)) + + return chi_squared + + +# 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 @@ -34,7 +55,7 @@ def __init__(self, log_filepath: str | Path, logging: bool = False): f.write(f"Datetime: {datetime.now()}\n") f.write("================================\n") - def log(self, *args, print_to_console=True): + def log(self, *args, print_to_console: bool = True): if print_to_console: print(*args) @@ -189,7 +210,7 @@ def normalise_to( ) -> np.ndarray: """ normalises an array - minval is the minimum value that the + minval is the minimum value that the processed array is scaled to. """ @@ -198,8 +219,17 @@ def normalise_to( return (data_array - minval) / (np.amax(data_array) - minval) -def normalise(data: np.ndarray | list) -> np.ndarray: - return (data - np.min(data)) / (np.max(data) - np.min(data)) +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: @@ -439,7 +469,19 @@ def rebin_together(x1, y1, x2, y2, num_points=None): def timeit(f): - """use this as a decorator to time a function""" + """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): diff --git a/tests/test_core.py b/tests/test_core.py index 163654f..8eeffda 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1,9 +1,237 @@ -from xrpd_toolbox.core import Parameter +from pathlib import Path +import numpy as np +import pytest +from xrpd_toolbox.fit_engine.refiner import RefinementBaseModel -def test_parameter_maths(): - a = Parameter(value=3, refine=True) +from xrpd_toolbox.core import ( + Parameter, + ParameterArray, + ScatteringData, + XRPDBaseModel, + XYEData, + evaluate_expression, + is_parameter_like, + safe_exp, + safe_pow, + to_ndarray, +) - x = 1.0 + a - assert isinstance(x, float) - assert x == 4.0 + +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_lattice.py b/tests/test_lattice.py index 306e0f3..bc55f76 100644 --- a/tests/test_lattice.py +++ b/tests/test_lattice.py @@ -1,4 +1,18 @@ -from xrpd_toolbox.fit_engine.lattice import CubicLattice, Lattice +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(): @@ -15,3 +29,77 @@ def test_cubic_lattice(): 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") From 42f86e09d13728ae27888dd77ae24a797a564b5a Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 7 May 2026 10:02:49 +0000 Subject: [PATCH 77/86] fixed refinement plotting, replaced refiner with fitting_core and improve sample alignment --- src/xrpd_toolbox/i15_1/sample_alignment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrpd_toolbox/i15_1/sample_alignment.py b/src/xrpd_toolbox/i15_1/sample_alignment.py index b1cd4bb..ff5f6d8 100644 --- a/src/xrpd_toolbox/i15_1/sample_alignment.py +++ b/src/xrpd_toolbox/i15_1/sample_alignment.py @@ -320,7 +320,7 @@ def run_sample_alignment(data: XYEData | str) -> SampleAligner: best_model = run_sample_alignment(data=filepath) sample_centre_result = best_model.get_sample_centre() - _ = best_model.get_best_peaks() + # _ = best_model.get_best_peaks() print(sample_centre_result.model_dump_json()) From d08d5f4c29c8f1b98965d9435d910500db032541 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 7 May 2026 15:58:03 +0000 Subject: [PATCH 78/86] add tests for profile and sample alignment --- src/xrpd_toolbox/core.py | 18 ++- src/xrpd_toolbox/fit_engine/fitting_core.py | 119 +++++++++++++++++- .../fit_engine/profile_calculation.py | 31 ++--- src/xrpd_toolbox/i15_1/sample_alignment.py | 45 ++++--- src/xrpd_toolbox/utils/messenger.py | 64 ++++++---- tests/test_core.py | 3 +- tests/test_profile_calc.py | 69 ++++++++++ tests/test_sample_alignment.py | 56 +++++++++ 8 files changed, 330 insertions(+), 75 deletions(-) create mode 100644 tests/test_profile_calc.py create mode 100644 tests/test_sample_alignment.py diff --git a/src/xrpd_toolbox/core.py b/src/xrpd_toolbox/core.py index e8c5971..761314c 100644 --- a/src/xrpd_toolbox/core.py +++ b/src/xrpd_toolbox/core.py @@ -5,7 +5,7 @@ import tomllib from numbers import Real from pathlib import Path -from typing import Annotated, Any, Literal, TypeAlias, get_args +from typing import Annotated, Any, Literal, TypeAlias import matplotlib.pyplot as plt import numpy as np @@ -395,10 +395,6 @@ def __rdivmod__(self, other): # IntParameterLike = int | Parameter -def is_parameter_like(annotation): - return Parameter in get_args(annotation) - - class ParameterArray(BaseModel): """Parameter array should be use for things that contain an array of coeeficients see: Chebychev background""" @@ -476,7 +472,7 @@ class XRPDBaseModel(BaseModel): serialised/deserialise from file but wont be used for a refinement.""" model_config = ConfigDict( - from_attributes=False, arbitrary_types_allowed=True, validate_assignment=True + from_attributes=True, arbitrary_types_allowed=True, validate_assignment=True ) @classmethod @@ -578,6 +574,8 @@ 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") @@ -603,14 +601,14 @@ def from_csv(cls, filepath: str | Path): # 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" + x_unit: XUnit = "tth" # type: ignore[override] data_type: DataType = "xray" - wavelength: Parameter # for x-ray or CW neutron data + wavelength: float | Parameter # for x-ray or CW neutron data @model_validator(mode="after") def validate_data_units(self): - if self.data_type == "x-ray": - assert self.x_unit != "tof" + if self.data_type == "xray": + assert self.x_unit != "tof", "x_unit cannot be 'tof' for xray data" return self diff --git a/src/xrpd_toolbox/fit_engine/fitting_core.py b/src/xrpd_toolbox/fit_engine/fitting_core.py index f43fd04..9960d35 100644 --- a/src/xrpd_toolbox/fit_engine/fitting_core.py +++ b/src/xrpd_toolbox/fit_engine/fitting_core.py @@ -12,7 +12,17 @@ from collections.abc import Callable, Sequence from copy import deepcopy from dataclasses import dataclass -from typing import Any, Generic, Literal, Self, TypeVar, cast +from typing import ( + Any, + Generic, + Literal, + Self, + TypeVar, + Union, + cast, + get_args, + get_origin, +) import matplotlib.pyplot as plt import numpy as np @@ -26,9 +36,9 @@ Parameter, ParameterArray, ScatteringData, + SerialisableNDArray, XRPDBaseModel, XYEData, - is_parameter_like, ) from xrpd_toolbox.utils.utils import calculate_chi_squared @@ -54,8 +64,29 @@ ] -class RefinementBaseModel(XRPDBaseModel, extra="allow"): - """In the RefinementBaseModel ANYTHING that is a Parameter can be refined. +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""" @@ -102,6 +133,34 @@ def parameterise_all(self, refine: bool = False): Parameter(value=float(field), refine=refine, bounds=bounds), ) + def deparameterise(self, value, parent, key): + print(key, value, type(value)) + + 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: @@ -287,7 +346,10 @@ def refine_all(self, keep_fixed: list[str] | None = None): class Model(RefinementBaseModel, Generic[ModelDataVar]): """A model can be refined by the refiner. It must contain: - data and a way to calculate_profile""" + data and a way to calculate_profile + + This class should contain RefinementBaseModel classes or Parameters/Parameter arrays + """ data: ModelDataVar @@ -310,6 +372,8 @@ def refine( verbose: bool = True, **kwargs: Any, ) -> tuple[dict[str, float], Self, optimize.OptimizeResult]: + """This optimises the model""" + return refine_model( self, method=method, @@ -605,6 +669,51 @@ def _objective(x: np.ndarray) -> float: return updated, optimized_model, result +class PlotData(XRPDBaseModel): + data: XYEData + calc: SerialisableNDArray + diff: SerialisableNDArray + background: SerialisableNDArray | float | None = None + markers: SerialisableNDArray | None = None + title: str | None = None + + def plot(self): + 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() + plt.show() + + if __name__ == "__main__": rf = RefinementBaseModel() rf["a"] = 1 diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index 52a6390..5cc86f5 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -25,6 +25,7 @@ ) from xrpd_toolbox.fit_engine.fitting_core import ( Model, + PlotData, RefinementBaseModel, refine_model, ) @@ -1050,23 +1051,18 @@ def plot(self): # if self.calculated_intensity is None: self.calculated_intensity = self.calculate_profile() - # print(self.data.y) - # print(self.calculated_intensity) - - plt.figure(figsize=(16, 10)) - plt.scatter(self.data.x, self.data.y, label="Obs", color="black", s=2) - plt.plot(self.data.x, self.calculated_intensity, label="Calc", color="red") - plt.plot( - self.data.x - self.zero_offset, - (self.data.y - self.calculated_intensity) - np.amax(self.data.y) / 10, - label="Obs-Calc", - color="blue", + if isinstance(self.background, Background): + background = self.background.calculate(self.data.x) + else: + background = float(self.background) + + plot_data = PlotData( + data=self.data, + calc=self.calculated_intensity, + diff=self.data.y - self.calculated_intensity, + background=background, ) - plt.xlabel(f"{self.data.x_unit}") - plt.ylabel("Intensity (a.u.)") - plt.legend() - plt.show() - plt.close() + plot_data.plot() if __name__ == "__main__": @@ -1107,9 +1103,6 @@ def test_refine_silicon(): updated, model, result = refine_model(model, plot=True) - model.irf.refine_all() - updated, model, result = refine_model(model, plot=True) - model.save(output_name) return model diff --git a/src/xrpd_toolbox/i15_1/sample_alignment.py b/src/xrpd_toolbox/i15_1/sample_alignment.py index ff5f6d8..3343edc 100644 --- a/src/xrpd_toolbox/i15_1/sample_alignment.py +++ b/src/xrpd_toolbox/i15_1/sample_alignment.py @@ -7,26 +7,26 @@ import math import os -import matplotlib.pyplot as plt import numpy as np from scipy.signal import find_peaks -from xrpd_toolbox.core import Parameter, XRPDBaseModel, XYEData +from xrpd_toolbox.core import Parameter, XYEData from xrpd_toolbox.fit_engine.background import ( BackgroundType, ConstantBackground, ) -from xrpd_toolbox.fit_engine.fitting_core import Model +from xrpd_toolbox.fit_engine.fitting_core import Model, PlotData, RefinementBaseModel from xrpd_toolbox.fit_engine.peaks import ( Peak, PeakType, calculate_profile, peak_factory, ) +from xrpd_toolbox.utils.messenger import Messenger from xrpd_toolbox.utils.utils import cluster_points_auto -class SampleCenteringResult(XRPDBaseModel): +class SampleCenteringResult(RefinementBaseModel): """This is what contains the results and can be serisalised and sent back to the bluesky plan""" @@ -45,6 +45,7 @@ class SampleAligner(Model[XYEData]): 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. @@ -164,19 +165,24 @@ def plot_data(self): the background model, and the residual (observed minus calculated). """ if self.data.source is not None: - plt.title(os.path.basename(self.data.source)) + 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) - plt.scatter(self.data.x, self.data.y, label="Obs", color="black", s=5) - plt.plot(self.data.x, profile, label="Calc", color="red") - plt.plot( - self.data.x, self.background.calculate(self.data.x), label="background" + plot_data = PlotData( + data=self.data, + calc=profile, + diff=self.data.y - profile, + background=self.background.calculate(self.data.x), + title=title, + markers=np.array(self.centre), ) - plt.plot(self.data.x, self.data.y - profile, label="Obs-Calc", color="blue") - plt.show() + plot_data.plot() + + return plot_data def peaks_to_arrays( self, peaks: list[PeakType] @@ -239,6 +245,8 @@ def get_sample_centre(self) -> SampleCenteringResult: sample_centre = centres[max_index] + self.centre = sample_centre + return SampleCenteringResult( centre=sample_centre, peaks=middle_peaks, scores=scores.tolist() ) @@ -315,6 +323,9 @@ def run_sample_alignment(data: XYEData | str) -> SampleAligner: 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)] + messenger = Messenger("i15-1") + + listener = Messenger("i15-1", destinations=["/topic/public.data.plot"]) for filepath in sample_alignment_files: best_model = run_sample_alignment(data=filepath) @@ -324,8 +335,14 @@ def run_sample_alignment(data: XYEData | str) -> SampleAligner: print(sample_centre_result.model_dump_json()) - plt.vlines(sample_centre_result.centre, 0, best_model.data.y.max()) + sample_centre_result.deparameterise_all() + + print(sample_centre_result.model_dump_json()) + + # plot_data = best_model.plot_data() - best_model.plot_data() + # messenger.send_plot_data(plot_data) + # listener.listen(max_iter=5) + # listener.stop() print("-----") diff --git a/src/xrpd_toolbox/utils/messenger.py b/src/xrpd_toolbox/utils/messenger.py index f8b66ad..0ad17d7 100644 --- a/src/xrpd_toolbox/utils/messenger.py +++ b/src/xrpd_toolbox/utils/messenger.py @@ -6,6 +6,18 @@ import stomp +from xrpd_toolbox.fit_engine.fitting_core import PlotData + +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() @@ -42,7 +54,7 @@ def __init__( port: int = 61613, username: str | None = None, password: str | None = None, - destination: Path | list[Path] | str | list[str] | None = None, + destinations: Path | list[Path] | str | list[str] | None = None, auto_connect: bool = True, **kwargs, ): @@ -55,28 +67,22 @@ def __init__( self.username = username self.password = password self.auto_connect = auto_connect - self.destination = destination + self.destinations = destinations - self.default_destination = [ - "/topic/public.worker.event", - "/topic/gda.messages.scan", - ] # /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 not self.destination: - print(f"No destination specified, defaulting to {self.default_destination}") - self.destination = self.default_destination + if not self.destinations: + print(f"No destination specified, defaulting to {DEFAULT_DESTINATIONS}") + self.destinations = DEFAULT_DESTINATIONS - if ( - not self.host - and self.beamline - and (self.broker == "rabbitmq") - or (self.broker is None) - ): + 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" @@ -117,25 +123,25 @@ def disconnect(self): self.conn.disconnect() def subscribe(self): - if isinstance(self.destination, list): - for i, dest in enumerate(self.destination): + 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.destination, id=1, ack="auto") + self.conn.subscribe(destination=self.destinations, id=1, ack="auto") - def send_file(self, path): + 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) + self.send_message(destination, message) - def send_start(self, path): + 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) + self.send_message(destination, message) def send_update(self, path): """use this in when doing live processing and it has started""" @@ -144,26 +150,34 @@ def send_update(self, path): {"filePath": path, "status": "UPDATED", "swmrStatus": "ACTIVE"} ) destination = "/topic/gda.messages.processing" - self._send_message(destination, message) + 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) + self.send_message(destination, message) - def _send_message(self, destination, message): + def send_message(self, destination: str, message: str): self.conn.send(destination=destination, body=message, ack="auto") + print(f"Message sent to: {destination}") 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: PlotData): + """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: diff --git a/tests/test_core.py b/tests/test_core.py index 8eeffda..7cb6ac2 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -2,7 +2,6 @@ import numpy as np import pytest -from xrpd_toolbox.fit_engine.refiner import RefinementBaseModel from xrpd_toolbox.core import ( Parameter, @@ -11,11 +10,11 @@ XRPDBaseModel, XYEData, evaluate_expression, - is_parameter_like, 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(): diff --git a/tests/test_profile_calc.py b/tests/test_profile_calc.py new file mode 100644 index 0000000..cc8b5e3 --- /dev/null +++ b/tests/test_profile_calc.py @@ -0,0 +1,69 @@ +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) + + return None + + +@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..b98defe --- /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_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.396, + "carbon_black-94519.csv": 36.77, + "water-94520.csv": 55.23, +} + + +def test_sample_alignment_builder_from_csv(): + model = sample_alignment_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) From d2133274b4ce11d0d273678038860840f34beb39 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 7 May 2026 16:27:49 +0000 Subject: [PATCH 79/86] added poblish to plot data --- src/xrpd_toolbox/fit_engine/fitting_core.py | 46 --------------- .../fit_engine/profile_calculation.py | 2 +- src/xrpd_toolbox/i15_1/sample_alignment.py | 9 ++- src/xrpd_toolbox/plotting.py | 58 +++++++++++++++++++ src/xrpd_toolbox/utils/messenger.py | 4 +- tests/test_profile_calc.py | 5 -- tests/test_sample_alignment.py | 2 +- 7 files changed, 68 insertions(+), 58 deletions(-) create mode 100644 src/xrpd_toolbox/plotting.py diff --git a/src/xrpd_toolbox/fit_engine/fitting_core.py b/src/xrpd_toolbox/fit_engine/fitting_core.py index 9960d35..0aaa994 100644 --- a/src/xrpd_toolbox/fit_engine/fitting_core.py +++ b/src/xrpd_toolbox/fit_engine/fitting_core.py @@ -36,7 +36,6 @@ Parameter, ParameterArray, ScatteringData, - SerialisableNDArray, XRPDBaseModel, XYEData, ) @@ -669,51 +668,6 @@ def _objective(x: np.ndarray) -> float: return updated, optimized_model, result -class PlotData(XRPDBaseModel): - data: XYEData - calc: SerialisableNDArray - diff: SerialisableNDArray - background: SerialisableNDArray | float | None = None - markers: SerialisableNDArray | None = None - title: str | None = None - - def plot(self): - 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() - plt.show() - - if __name__ == "__main__": rf = RefinementBaseModel() rf["a"] = 1 diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index 5cc86f5..086effe 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -25,7 +25,6 @@ ) from xrpd_toolbox.fit_engine.fitting_core import ( Model, - PlotData, RefinementBaseModel, refine_model, ) @@ -48,6 +47,7 @@ format_space_group_name, get_symmetry_tables, ) +from xrpd_toolbox.plotting import PlotData from xrpd_toolbox.utils.cif_reader import read_cif from xrpd_toolbox.utils.unit_conversion import ( beam_energy_to_wavelength, diff --git a/src/xrpd_toolbox/i15_1/sample_alignment.py b/src/xrpd_toolbox/i15_1/sample_alignment.py index 3343edc..f7ad04b 100644 --- a/src/xrpd_toolbox/i15_1/sample_alignment.py +++ b/src/xrpd_toolbox/i15_1/sample_alignment.py @@ -15,13 +15,14 @@ BackgroundType, ConstantBackground, ) -from xrpd_toolbox.fit_engine.fitting_core import Model, PlotData, RefinementBaseModel +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 PlotData from xrpd_toolbox.utils.messenger import Messenger from xrpd_toolbox.utils.utils import cluster_points_auto @@ -320,10 +321,11 @@ def run_sample_alignment(data: XYEData | str) -> SampleAligner: 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)] - messenger = Messenger("i15-1") listener = Messenger("i15-1", destinations=["/topic/public.data.plot"]) @@ -339,7 +341,8 @@ def run_sample_alignment(data: XYEData | str) -> SampleAligner: print(sample_centre_result.model_dump_json()) - # plot_data = best_model.plot_data() + plot_data = best_model.plot_data() + plot_data.publish(BEAMLINE) # messenger.send_plot_data(plot_data) # listener.listen(max_iter=5) diff --git a/src/xrpd_toolbox/plotting.py b/src/xrpd_toolbox/plotting.py new file mode 100644 index 0000000..ff5c23f --- /dev/null +++ b/src/xrpd_toolbox/plotting.py @@ -0,0 +1,58 @@ +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 PlotData(XRPDBaseModel): + data: XYEData + calc: SerialisableNDArray + diff: SerialisableNDArray + background: SerialisableNDArray | float | None = None + markers: SerialisableNDArray | None = None + title: str | None = None + + def plot(self): + 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() + plt.show() + + def publish(self, beamline: str): + messenger = Messenger(beamline) + messenger.send_plot_data(self) diff --git a/src/xrpd_toolbox/utils/messenger.py b/src/xrpd_toolbox/utils/messenger.py index 0ad17d7..f76e1ca 100644 --- a/src/xrpd_toolbox/utils/messenger.py +++ b/src/xrpd_toolbox/utils/messenger.py @@ -6,7 +6,7 @@ import stomp -from xrpd_toolbox.fit_engine.fitting_core import PlotData +from xrpd_toolbox.core import XRPDBaseModel DEFAULT_BROKER = "rabbitmq" DEFAULT_DESTINATIONS = [ @@ -170,7 +170,7 @@ def stop(self): def get_message(self): return self.scan_listener.messages.popleft() - def send_plot_data(self, plot_data: PlotData): + 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()) diff --git a/tests/test_profile_calc.py b/tests/test_profile_calc.py index cc8b5e3..81d224c 100644 --- a/tests/test_profile_calc.py +++ b/tests/test_profile_calc.py @@ -47,15 +47,10 @@ def test_refine_silicon(): model.background.refine_none() print(model.get_refinement_parameters()) - model.irf.refine_none() - model.refine(plot=False) - model.save(OUTPUT_NAME) - return None - @pytest.mark.skipif( not Path(OUTPUT_NAME).exists(), diff --git a/tests/test_sample_alignment.py b/tests/test_sample_alignment.py index b98defe..abdd36a 100644 --- a/tests/test_sample_alignment.py +++ b/tests/test_sample_alignment.py @@ -19,7 +19,7 @@ "GaIn-94521.csv": 70.02, "HKUST1-95018.csv": 71.05, "NIST_Si-95016.csv": 84.37, - "NaCl-95017.csv": 55.396, + "NaCl-95017.csv": 55.39, "carbon_black-94519.csv": 36.77, "water-94520.csv": 55.23, } From 9239027cb63ce8e374f1e21fbe8ff3c10f4bbad3 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Thu, 7 May 2026 16:56:37 +0000 Subject: [PATCH 80/86] remove print from deparameterise --- src/xrpd_toolbox/fit_engine/fitting_core.py | 2 -- src/xrpd_toolbox/i15_1/sample_alignment.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/xrpd_toolbox/fit_engine/fitting_core.py b/src/xrpd_toolbox/fit_engine/fitting_core.py index 0aaa994..dc6a162 100644 --- a/src/xrpd_toolbox/fit_engine/fitting_core.py +++ b/src/xrpd_toolbox/fit_engine/fitting_core.py @@ -133,8 +133,6 @@ def parameterise_all(self, refine: bool = False): ) def deparameterise(self, value, parent, key): - print(key, value, type(value)) - if isinstance(value, Parameter): setattr(parent, key, float(value.value)) return diff --git a/src/xrpd_toolbox/i15_1/sample_alignment.py b/src/xrpd_toolbox/i15_1/sample_alignment.py index f7ad04b..c8189a6 100644 --- a/src/xrpd_toolbox/i15_1/sample_alignment.py +++ b/src/xrpd_toolbox/i15_1/sample_alignment.py @@ -179,7 +179,7 @@ def plot_data(self): diff=self.data.y - profile, background=self.background.calculate(self.data.x), title=title, - markers=np.array(self.centre), + markers=np.array([self.centre]), ) plot_data.plot() From c51a1d28b8c8d6b997feb297b62d54c3d43b365c Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Fri, 8 May 2026 11:58:31 +0000 Subject: [PATCH 81/86] made messenger more robust --- src/xrpd_toolbox/i15_1/sample_alignment.py | 2 +- src/xrpd_toolbox/utils/messenger.py | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/xrpd_toolbox/i15_1/sample_alignment.py b/src/xrpd_toolbox/i15_1/sample_alignment.py index c8189a6..cd38697 100644 --- a/src/xrpd_toolbox/i15_1/sample_alignment.py +++ b/src/xrpd_toolbox/i15_1/sample_alignment.py @@ -342,7 +342,7 @@ def run_sample_alignment(data: XYEData | str) -> SampleAligner: print(sample_centre_result.model_dump_json()) plot_data = best_model.plot_data() - plot_data.publish(BEAMLINE) + # plot_data.publish(BEAMLINE) # messenger.send_plot_data(plot_data) # listener.listen(max_iter=5) diff --git a/src/xrpd_toolbox/utils/messenger.py b/src/xrpd_toolbox/utils/messenger.py index f76e1ca..a429817 100644 --- a/src/xrpd_toolbox/utils/messenger.py +++ b/src/xrpd_toolbox/utils/messenger.py @@ -98,9 +98,12 @@ def __init__( self.run = True if self.auto_connect: - self.setup_connection() - self.connect() - self.subscribe() + 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( @@ -160,8 +163,11 @@ def send_finished(self, path): self.send_message(destination, message) def send_message(self, destination: str, message: str): - self.conn.send(destination=destination, body=message, ack="auto") - print(f"Message sent to: {destination}") + 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""" From 4d7c25373000dde207c363189d39c7e9fb9d0e72 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 13 May 2026 09:51:33 +0000 Subject: [PATCH 82/86] move fit stats to file and add Rwp and Rp and GOF --- src/xrpd_toolbox/core.py | 10 + src/xrpd_toolbox/fit_engine/fit_statistics.py | 201 ++++++++++++++++++ src/xrpd_toolbox/fit_engine/fitting_core.py | 16 +- .../fit_engine/profile_calculation.py | 6 +- src/xrpd_toolbox/i11/mythen.py | 21 +- src/xrpd_toolbox/i15_1/sample_alignment.py | 6 +- src/xrpd_toolbox/plotting.py | 24 ++- src/xrpd_toolbox/utils/utils.py | 17 -- 8 files changed, 261 insertions(+), 40 deletions(-) create mode 100644 src/xrpd_toolbox/fit_engine/fit_statistics.py diff --git a/src/xrpd_toolbox/core.py b/src/xrpd_toolbox/core.py index 761314c..4d53c37 100644 --- a/src/xrpd_toolbox/core.py +++ b/src/xrpd_toolbox/core.py @@ -596,6 +596,16 @@ def from_csv(cls, filepath: str | Path): 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 - 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 index dc6a162..a4256da 100644 --- a/src/xrpd_toolbox/fit_engine/fitting_core.py +++ b/src/xrpd_toolbox/fit_engine/fitting_core.py @@ -39,7 +39,11 @@ XRPDBaseModel, XYEData, ) -from xrpd_toolbox.utils.utils import calculate_chi_squared +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[ @@ -603,8 +607,16 @@ def _evaluate(x: np.ndarray) -> np.ndarray: y_calc = optimized_model.calculate_profile() residuals = y_obs - np.asarray(y_calc, dtype=float) - chi_squared = calculate_chi_squared(y_calc, model.data.y, model.data.e) + 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: diff --git a/src/xrpd_toolbox/fit_engine/profile_calculation.py b/src/xrpd_toolbox/fit_engine/profile_calculation.py index 086effe..9c28678 100644 --- a/src/xrpd_toolbox/fit_engine/profile_calculation.py +++ b/src/xrpd_toolbox/fit_engine/profile_calculation.py @@ -23,6 +23,7 @@ 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, @@ -47,14 +48,13 @@ format_space_group_name, get_symmetry_tables, ) -from xrpd_toolbox.plotting import PlotData +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, ) -from xrpd_toolbox.utils.utils import calculate_chi_squared CrystalType: TypeAlias = Literal["powder", "single-crystal"] @@ -1056,7 +1056,7 @@ def plot(self): else: background = float(self.background) - plot_data = PlotData( + plot_data = FittedDataPlot( data=self.data, calc=self.calculated_intensity, diff=self.data.y - self.calculated_intensity, diff --git a/src/xrpd_toolbox/i11/mythen.py b/src/xrpd_toolbox/i11/mythen.py index 71513b1..1a95877 100644 --- a/src/xrpd_toolbox/i11/mythen.py +++ b/src/xrpd_toolbox/i11/mythen.py @@ -13,11 +13,12 @@ import matplotlib.pyplot as plt import numpy as np from h5py import Dataset, File -from pydantic import BaseModel, Field +from pydantic import Field -from xrpd_toolbox.core import XRPDBaseModel +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 ( @@ -27,7 +28,6 @@ h5_to_array, load_int_array_from_file, save_data_to_h5, - save_to_xye, ) # np.set_printoptions(threshold=sys.maxsize) @@ -40,7 +40,7 @@ PIXEL_NUMBER = np.arange(PIXELS_PER_MODULE, dtype=np.int64) -class ModuleConversion(BaseModel): +class ModuleConversion(XRPDBaseModel): conv: float offset: float centre: float @@ -68,6 +68,7 @@ def return_raw_tth(self, zero_offset: float) -> np.ndarray: return raw_tth +# TODO: Make module_n a dict? class AngularCalibration(XRPDBaseModel): beamline_offset: float | int module_0: ModuleConversion @@ -588,12 +589,10 @@ def process_step_scan(self): ) ) - save_to_xye( - self.xye_filepath_out, - self.binned_tth, - self.binned_counts, - self.binned_error, + 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, @@ -609,8 +608,12 @@ def process_step_scan(self): 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 diff --git a/src/xrpd_toolbox/i15_1/sample_alignment.py b/src/xrpd_toolbox/i15_1/sample_alignment.py index cd38697..a659b88 100644 --- a/src/xrpd_toolbox/i15_1/sample_alignment.py +++ b/src/xrpd_toolbox/i15_1/sample_alignment.py @@ -22,7 +22,7 @@ calculate_profile, peak_factory, ) -from xrpd_toolbox.plotting import PlotData +from xrpd_toolbox.plotting import FittedDataPlot from xrpd_toolbox.utils.messenger import Messenger from xrpd_toolbox.utils.utils import cluster_points_auto @@ -173,7 +173,7 @@ def plot_data(self): profile = calculate_profile(self.data.x, self.sample_and_capillary) profile = profile + self.background.calculate(self.data.x) - plot_data = PlotData( + plot_data = FittedDataPlot( data=self.data, calc=profile, diff=self.data.y - profile, @@ -342,7 +342,7 @@ def run_sample_alignment(data: XYEData | str) -> SampleAligner: print(sample_centre_result.model_dump_json()) plot_data = best_model.plot_data() - # plot_data.publish(BEAMLINE) + plot_data.publish(BEAMLINE) # messenger.send_plot_data(plot_data) # listener.listen(max_iter=5) diff --git a/src/xrpd_toolbox/plotting.py b/src/xrpd_toolbox/plotting.py index ff5c23f..556d9a0 100644 --- a/src/xrpd_toolbox/plotting.py +++ b/src/xrpd_toolbox/plotting.py @@ -9,13 +9,29 @@ from xrpd_toolbox.utils.messenger import Messenger -class PlotData(XRPDBaseModel): +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 - title: str | None = None def plot(self): if isinstance(self.background, float): @@ -52,7 +68,3 @@ def plot(self): plt.ylabel(self.data.y_unit) plt.legend() plt.show() - - def publish(self, beamline: str): - messenger = Messenger(beamline) - messenger.send_plot_data(self) diff --git a/src/xrpd_toolbox/utils/utils.py b/src/xrpd_toolbox/utils/utils.py index a0321c9..7fe0d4e 100644 --- a/src/xrpd_toolbox/utils/utils.py +++ b/src/xrpd_toolbox/utils/utils.py @@ -15,23 +15,6 @@ from scipy.interpolate import interp1d -def calculate_chi_squared( - ycalc: np.ndarray, yobs: np.ndarray, y_err: np.ndarray | None -) -> float: - """calculates chi_squared (the minimisation cost function) that is familiar to - those who do retiveld refinements""" - - if y_err is not None: - wi = 1 / y_err**2 - else: - wi = 1 / yobs - - residual = (wi * (yobs - ycalc)) ** 2 - chi_squared = float(np.sum(residual)) - - return chi_squared - - # 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 From 822f73c4b6a8f71206cb40e1fdcf97a0879a5f1d Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 13 May 2026 11:02:53 +0000 Subject: [PATCH 83/86] allow sample loader to load from filepath and datasetpath --- src/xrpd_toolbox/data_loader.py | 44 +++++++++++++++------- src/xrpd_toolbox/i15_1/eiger_500k.py | 2 +- src/xrpd_toolbox/i15_1/pe2ad.py | 17 --------- src/xrpd_toolbox/i15_1/sample_alignment.py | 43 ++++++++++++++++----- src/xrpd_toolbox/plotting.py | 7 +++- src/xrpd_toolbox/utils/messenger.py | 3 ++ tests/test_sample_alignment.py | 4 +- 7 files changed, 75 insertions(+), 45 deletions(-) diff --git a/src/xrpd_toolbox/data_loader.py b/src/xrpd_toolbox/data_loader.py index d5583ea..4d20184 100644 --- a/src/xrpd_toolbox/data_loader.py +++ b/src/xrpd_toolbox/data_loader.py @@ -7,6 +7,19 @@ 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. @@ -28,20 +41,6 @@ def get_entries(self): return paths - def _get_dataset(self, dataset_path: str) -> Dataset: - 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 not isinstance(data, Dataset): - raise ValueError(f"{dataset_path} is not a dataset") - - return data - def get_data(self, dataset_path: str | None = None, selection=...) -> np.ndarray: dataset_path = dataset_path or self.dataset_path @@ -61,6 +60,23 @@ def get_data(self, dataset_path: str | None = None, selection=...) -> np.ndarray 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.""" diff --git a/src/xrpd_toolbox/i15_1/eiger_500k.py b/src/xrpd_toolbox/i15_1/eiger_500k.py index 964f03e..84fc9ec 100644 --- a/src/xrpd_toolbox/i15_1/eiger_500k.py +++ b/src/xrpd_toolbox/i15_1/eiger_500k.py @@ -59,7 +59,7 @@ class EigerDataLoader: def __init__( self, filepath: str | Path, - eiger_data_path: str = "eiger", + eiger_data_path: str = "data", tth_path: str = "tth", ): self.filepath = filepath diff --git a/src/xrpd_toolbox/i15_1/pe2ad.py b/src/xrpd_toolbox/i15_1/pe2ad.py index b0fbf2b..ae278e2 100644 --- a/src/xrpd_toolbox/i15_1/pe2ad.py +++ b/src/xrpd_toolbox/i15_1/pe2ad.py @@ -24,23 +24,6 @@ def find_center2(self, x): return int(densest_idx) - def sum_frames(self): - data = self._get_dataset(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 - def find_sample_centre(self): summed_images = self.sum_frames() centre_index = self.find_center2(summed_images) diff --git a/src/xrpd_toolbox/i15_1/sample_alignment.py b/src/xrpd_toolbox/i15_1/sample_alignment.py index a659b88..aec2bca 100644 --- a/src/xrpd_toolbox/i15_1/sample_alignment.py +++ b/src/xrpd_toolbox/i15_1/sample_alignment.py @@ -6,11 +6,13 @@ 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, @@ -159,7 +161,7 @@ def get_initial_peaks(self, peak_type: str = "tophat", smoothing: int = 5): # plt.plot(self.data.x, self.data.y) # plt.show() - def plot_data(self): + def get_plot_data(self): """Plot the observed data, calculated profile, background, and residual. The plot shows the observed intensities, the current fitted profile, @@ -181,7 +183,6 @@ def plot_data(self): title=title, markers=np.array([self.centre]), ) - plot_data.plot() return plot_data @@ -270,7 +271,7 @@ def get_sample_centre(self) -> SampleCenteringResult: # print(cen, amp, fw, cs, score) -def sample_alignment_builder( +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 @@ -299,10 +300,10 @@ def sample_alignment_builder( def run_sample_alignment(data: XYEData | str) -> SampleAligner: - gauss_model = sample_alignment_builder(data, "gaussian") + gauss_model = sample_alignment_model_builder(data, "gaussian") _, gauss_model, gauss_result = gauss_model.refine() - tophat_model = sample_alignment_builder(data, "tophat") + tophat_model = sample_alignment_model_builder(data, "tophat") _, tophat_model, tophat_result = tophat_model.refine() if gauss_result.cost < tophat_result.cost: @@ -320,6 +321,30 @@ def run_sample_alignment(data: XYEData | str) -> SampleAligner: 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" @@ -335,14 +360,14 @@ def run_sample_alignment(data: XYEData | str) -> SampleAligner: sample_centre_result = best_model.get_sample_centre() # _ = best_model.get_best_peaks() - print(sample_centre_result.model_dump_json()) - sample_centre_result.deparameterise_all() print(sample_centre_result.model_dump_json()) - plot_data = best_model.plot_data() - plot_data.publish(BEAMLINE) + 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) diff --git a/src/xrpd_toolbox/plotting.py b/src/xrpd_toolbox/plotting.py index 556d9a0..c627221 100644 --- a/src/xrpd_toolbox/plotting.py +++ b/src/xrpd_toolbox/plotting.py @@ -33,7 +33,7 @@ class FittedDataPlot(DataPlot): background: SerialisableNDArray | float | None = None markers: SerialisableNDArray | None = None - def plot(self): + 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): @@ -67,4 +67,7 @@ def plot(self): plt.xlabel(self.data.x_unit) plt.ylabel(self.data.y_unit) plt.legend() - plt.show() + if save_to is not None: + plt.savefig(save_to) + else: + plt.show() diff --git a/src/xrpd_toolbox/utils/messenger.py b/src/xrpd_toolbox/utils/messenger.py index a429817..7330a19 100644 --- a/src/xrpd_toolbox/utils/messenger.py +++ b/src/xrpd_toolbox/utils/messenger.py @@ -75,6 +75,9 @@ def __init__( # "/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 diff --git a/tests/test_sample_alignment.py b/tests/test_sample_alignment.py index abdd36a..ed7a2e8 100644 --- a/tests/test_sample_alignment.py +++ b/tests/test_sample_alignment.py @@ -6,7 +6,7 @@ from xrpd_toolbox.i15_1.sample_alignment import ( SampleAligner, run_sample_alignment, - sample_alignment_builder, + sample_alignment_model_builder, ) REPO_ROOT = Path(__file__).resolve().parents[1] @@ -26,7 +26,7 @@ def test_sample_alignment_builder_from_csv(): - model = sample_alignment_builder(str(TEST_FILE), peak_type="tophat") + model = sample_alignment_model_builder(str(TEST_FILE), peak_type="tophat") assert isinstance(model, SampleAligner) assert isinstance(model.background, ConstantBackground) From 52e9e6bb4fbd60a4396f91f3a3e9c505731d3a09 Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 13 May 2026 11:07:22 +0000 Subject: [PATCH 84/86] update uvlock --- uv.lock | 2850 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 1464 insertions(+), 1386 deletions(-) diff --git a/uv.lock b/uv.lock index bc5e073..bb99e34 100644 --- a/uv.lock +++ b/uv.lock @@ -21,15 +21,15 @@ wheels = [ [[package]] name = "anyio" -version = "4.12.1" +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/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +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/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, + { 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]] @@ -70,20 +70,20 @@ sdist = { url = "https://files.pythonhosted.org/packages/44/1c/577d3ce406e88f370 [[package]] name = "cachetools" -version = "6.2.5" +version = "7.0.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/86/e7/18ea2907d2ca91e9c0697596b8e60cd485b091152eb4109fad1e468e457d/cachetools-6.2.5.tar.gz", hash = "sha256:6d8bfbba1ba94412fb9d9196c4da7a87e9d4928fffc5e93542965dca4740c77f", size = 32168, upload-time = "2026-01-25T14:57:40.349Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/7b/1755ed2c6bfabd1d98b37ae73152f8dcf94aa40fee119d163c19ed484704/cachetools-7.0.6.tar.gz", hash = "sha256:e5d524d36d65703a87243a26ff08ad84f73352adbeafb1cde81e207b456aaf24", size = 37526, upload-time = "2026-04-20T19:02:23.289Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/a6/24169d70ec5264b65ba54ba49b3d10f46d6b1ad97e185c94556539b3dfc8/cachetools-6.2.5-py3-none-any.whl", hash = "sha256:db3ae5465e90befb7c74720dd9308d77a09b7cf13433570e07caa0845c30d5fe", size = 11553, upload-time = "2026-01-25T14:57:39.112Z" }, + { 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.2.25" +version = "2026.4.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +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/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, + { 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]] @@ -95,102 +95,93 @@ 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 = "chardet" -version = "5.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload-time = "2023-08-01T19:23:02.662Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload-time = "2023-08-01T19:23:00.661Z" }, -] - [[package]] name = "charset-normalizer" -version = "3.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d1/0ae20ad77bc949ddd39b51bf383b6ca932f2916074c95cad34ae465ab71f/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", size = 212994, upload-time = "2026-03-15T18:50:30.102Z" }, - { url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" }, - { url = "https://files.pythonhosted.org/packages/25/3c/8a18fc411f085b82303cfb7154eed5bd49c77035eb7608d049468b53f87c/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", size = 191673, upload-time = "2026-03-15T18:50:33.433Z" }, - { url = "https://files.pythonhosted.org/packages/ff/a7/11cfe61d6c5c5c7438d6ba40919d0306ed83c9ab957f3d4da2277ff67836/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", size = 201120, upload-time = "2026-03-15T18:50:35.105Z" }, - { url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" }, - { url = "https://files.pythonhosted.org/packages/28/70/039796160b48b18ed466fde0af84c1b090c4e288fae26cd674ad04a2d703/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", size = 192516, upload-time = "2026-03-15T18:50:38.228Z" }, - { url = "https://files.pythonhosted.org/packages/ff/34/c56f3223393d6ff3124b9e78f7de738047c2d6bc40a4f16ac0c9d7a1cb3c/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", size = 218795, upload-time = "2026-03-15T18:50:39.664Z" }, - { url = "https://files.pythonhosted.org/packages/e8/3b/ce2d4f86c5282191a041fdc5a4ce18f1c6bd40a5bd1f74cf8625f08d51c1/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", size = 201833, upload-time = "2026-03-15T18:50:41.552Z" }, - { url = "https://files.pythonhosted.org/packages/3b/9b/b6a9f76b0fd7c5b5ec58b228ff7e85095370282150f0bd50b3126f5506d6/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", size = 213920, upload-time = "2026-03-15T18:50:43.33Z" }, - { url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" }, - { url = "https://files.pythonhosted.org/packages/32/73/c0b86f3d1458468e11aec870e6b3feac931facbe105a894b552b0e518e79/charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", size = 143703, upload-time = "2026-03-15T18:50:46.103Z" }, - { url = "https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", size = 153857, upload-time = "2026-03-15T18:50:47.563Z" }, - { url = "https://files.pythonhosted.org/packages/e2/dc/9abe19c9b27e6cd3636036b9d1b387b78c40dedbf0b47f9366737684b4b0/charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", size = 142751, upload-time = "2026-03-15T18:50:49.234Z" }, - { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, - { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, - { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, - { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, - { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, - { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, - { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, - { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, - { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, - { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, - { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, - { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, - { url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" }, - { url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" }, - { url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" }, - { url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" }, - { url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" }, - { url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" }, - { url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" }, - { url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" }, - { url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" }, - { url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" }, - { url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" }, - { url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" }, - { url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" }, - { url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" }, - { url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" }, - { url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" }, - { url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" }, - { url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" }, - { url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" }, - { url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" }, - { url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" }, - { url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" }, - { url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" }, - { url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" }, - { url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" }, - { url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" }, - { url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" }, - { url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" }, - { url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" }, - { url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" }, - { url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" }, - { url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" }, - { url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" }, - { url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" }, - { url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" }, - { url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" }, - { url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" }, - { url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" }, - { url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" }, - { url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" }, - { url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" }, - { url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" }, - { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, +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]] @@ -295,7 +286,7 @@ wheels = [ [[package]] name = "copier" -version = "9.11.3" +version = "9.14.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, @@ -312,96 +303,108 @@ dependencies = [ { name = "pyyaml" }, { name = "questionary" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/be/35bb44c0c7c278bd9144f5934aa10a2d532cedea4e16494c6552aa7132e1/copier-9.11.3.tar.gz", hash = "sha256:f4da98c7f3dd2243480433541b3b4d9daa788bce13b7b6d43c0c6d84bd50e889", size = 610458, upload-time = "2026-01-23T17:19:11.561Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/0f/9762830def619c9aa2cb7cf2ab59ade60bfd8a83325767ad3edca597d29f/copier-9.14.3.tar.gz", hash = "sha256:8737a14af1540ad19d6a6d59a05ff07bb0a81b286cca9ee79163572352df6e5e", size = 625641, upload-time = "2026-04-10T14:40:39.848Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/01/74922a1c552137c05a41fee0c61153753dddc9117d19c7c5902c146c25ab/copier-9.11.3-py3-none-any.whl", hash = "sha256:ab4bc7e2944edc030b4c14ec84fffd6bf810b9b8fd56938e8ccbab1b169ea6ca", size = 56905, upload-time = "2026-01-23T17:19:09.999Z" }, + { url = "https://files.pythonhosted.org/packages/75/3f/aa2458b3b88e59b0be1a06685f237c944375186f4652eb9b5d43bb5ebe21/copier-9.14.3-py3-none-any.whl", hash = "sha256:b237bb8a7fba91fbe0580ee54292e7a4c915028f08389f1ee99332fb70d2cab1", size = 59764, upload-time = "2026-04-10T14:40:37.646Z" }, ] [[package]] name = "coverage" -version = "7.13.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ad/49/349848445b0e53660e258acbcc9b0d014895b6739237920886672240f84b/coverage-7.13.2.tar.gz", hash = "sha256:044c6951ec37146b72a50cc81ef02217d27d4c3640efd2640311393cbbf143d3", size = 826523, upload-time = "2026-01-25T13:00:04.889Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/01/abca50583a8975bb6e1c59eff67ed8e48bb127c07dad5c28d9e96ccc09ec/coverage-7.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:060ebf6f2c51aff5ba38e1f43a2095e087389b1c69d559fde6049a4b0001320e", size = 218971, upload-time = "2026-01-25T12:57:36.953Z" }, - { url = "https://files.pythonhosted.org/packages/eb/0e/b6489f344d99cd1e5b4d5e1be52dfd3f8a3dc5112aa6c33948da8cabad4e/coverage-7.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1ea8ca9db5e7469cd364552985e15911548ea5b69c48a17291f0cac70484b2e", size = 219473, upload-time = "2026-01-25T12:57:38.934Z" }, - { url = "https://files.pythonhosted.org/packages/17/11/db2f414915a8e4ec53f60b17956c27f21fb68fcf20f8a455ce7c2ccec638/coverage-7.13.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b780090d15fd58f07cf2011943e25a5f0c1c894384b13a216b6c86c8a8a7c508", size = 249896, upload-time = "2026-01-25T12:57:40.365Z" }, - { url = "https://files.pythonhosted.org/packages/80/06/0823fe93913663c017e508e8810c998c8ebd3ec2a5a85d2c3754297bdede/coverage-7.13.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:88a800258d83acb803c38175b4495d293656d5fac48659c953c18e5f539a274b", size = 251810, upload-time = "2026-01-25T12:57:42.045Z" }, - { url = "https://files.pythonhosted.org/packages/61/dc/b151c3cc41b28cdf7f0166c5fa1271cbc305a8ec0124cce4b04f74791a18/coverage-7.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6326e18e9a553e674d948536a04a80d850a5eeefe2aae2e6d7cf05d54046c01b", size = 253920, upload-time = "2026-01-25T12:57:44.026Z" }, - { url = "https://files.pythonhosted.org/packages/2d/35/e83de0556e54a4729a2b94ea816f74ce08732e81945024adee46851c2264/coverage-7.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:59562de3f797979e1ff07c587e2ac36ba60ca59d16c211eceaa579c266c5022f", size = 250025, upload-time = "2026-01-25T12:57:45.624Z" }, - { url = "https://files.pythonhosted.org/packages/39/67/af2eb9c3926ce3ea0d58a0d2516fcbdacf7a9fc9559fe63076beaf3f2596/coverage-7.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:27ba1ed6f66b0e2d61bfa78874dffd4f8c3a12f8e2b5410e515ab345ba7bc9c3", size = 251612, upload-time = "2026-01-25T12:57:47.713Z" }, - { url = "https://files.pythonhosted.org/packages/26/62/5be2e25f3d6c711d23b71296f8b44c978d4c8b4e5b26871abfc164297502/coverage-7.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8be48da4d47cc68754ce643ea50b3234557cbefe47c2f120495e7bd0a2756f2b", size = 249670, upload-time = "2026-01-25T12:57:49.378Z" }, - { url = "https://files.pythonhosted.org/packages/b3/51/400d1b09a8344199f9b6a6fc1868005d766b7ea95e7882e494fa862ca69c/coverage-7.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2a47a4223d3361b91176aedd9d4e05844ca67d7188456227b6bf5e436630c9a1", size = 249395, upload-time = "2026-01-25T12:57:50.86Z" }, - { url = "https://files.pythonhosted.org/packages/e0/36/f02234bc6e5230e2f0a63fd125d0a2093c73ef20fdf681c7af62a140e4e7/coverage-7.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c6f141b468740197d6bd38f2b26ade124363228cc3f9858bd9924ab059e00059", size = 250298, upload-time = "2026-01-25T12:57:52.287Z" }, - { url = "https://files.pythonhosted.org/packages/b0/06/713110d3dd3151b93611c9cbfc65c15b4156b44f927fced49ac0b20b32a4/coverage-7.13.2-cp311-cp311-win32.whl", hash = "sha256:89567798404af067604246e01a49ef907d112edf2b75ef814b1364d5ce267031", size = 221485, upload-time = "2026-01-25T12:57:53.876Z" }, - { url = "https://files.pythonhosted.org/packages/16/0c/3ae6255fa1ebcb7dec19c9a59e85ef5f34566d1265c70af5b2fc981da834/coverage-7.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:21dd57941804ae2ac7e921771a5e21bbf9aabec317a041d164853ad0a96ce31e", size = 222421, upload-time = "2026-01-25T12:57:55.433Z" }, - { url = "https://files.pythonhosted.org/packages/b5/37/fabc3179af4d61d89ea47bd04333fec735cd5e8b59baad44fed9fc4170d7/coverage-7.13.2-cp311-cp311-win_arm64.whl", hash = "sha256:10758e0586c134a0bafa28f2d37dd2cdb5e4a90de25c0fc0c77dabbad46eca28", size = 221088, upload-time = "2026-01-25T12:57:57.41Z" }, - { url = "https://files.pythonhosted.org/packages/46/39/e92a35f7800222d3f7b2cbb7bbc3b65672ae8d501cb31801b2d2bd7acdf1/coverage-7.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f106b2af193f965d0d3234f3f83fc35278c7fb935dfbde56ae2da3dd2c03b84d", size = 219142, upload-time = "2026-01-25T12:58:00.448Z" }, - { url = "https://files.pythonhosted.org/packages/45/7a/8bf9e9309c4c996e65c52a7c5a112707ecdd9fbaf49e10b5a705a402bbb4/coverage-7.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f45d21dc4d5d6bd29323f0320089ef7eae16e4bef712dff79d184fa7330af3", size = 219503, upload-time = "2026-01-25T12:58:02.451Z" }, - { url = "https://files.pythonhosted.org/packages/87/93/17661e06b7b37580923f3f12406ac91d78aeed293fb6da0b69cc7957582f/coverage-7.13.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fae91dfecd816444c74531a9c3d6ded17a504767e97aa674d44f638107265b99", size = 251006, upload-time = "2026-01-25T12:58:04.059Z" }, - { url = "https://files.pythonhosted.org/packages/12/f0/f9e59fb8c310171497f379e25db060abef9fa605e09d63157eebec102676/coverage-7.13.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:264657171406c114787b441484de620e03d8f7202f113d62fcd3d9688baa3e6f", size = 253750, upload-time = "2026-01-25T12:58:05.574Z" }, - { url = "https://files.pythonhosted.org/packages/e5/b1/1935e31add2232663cf7edd8269548b122a7d100047ff93475dbaaae673e/coverage-7.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae47d8dcd3ded0155afbb59c62bd8ab07ea0fd4902e1c40567439e6db9dcaf2f", size = 254862, upload-time = "2026-01-25T12:58:07.647Z" }, - { url = "https://files.pythonhosted.org/packages/af/59/b5e97071ec13df5f45da2b3391b6cdbec78ba20757bc92580a5b3d5fa53c/coverage-7.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a0b33e9fd838220b007ce8f299114d406c1e8edb21336af4c97a26ecfd185aa", size = 251420, upload-time = "2026-01-25T12:58:09.309Z" }, - { url = "https://files.pythonhosted.org/packages/3f/75/9495932f87469d013dc515fb0ce1aac5fa97766f38f6b1a1deb1ee7b7f3a/coverage-7.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3becbea7f3ce9a2d4d430f223ec15888e4deb31395840a79e916368d6004cce", size = 252786, upload-time = "2026-01-25T12:58:10.909Z" }, - { url = "https://files.pythonhosted.org/packages/6a/59/af550721f0eb62f46f7b8cb7e6f1860592189267b1c411a4e3a057caacee/coverage-7.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f819c727a6e6eeb8711e4ce63d78c620f69630a2e9d53bc95ca5379f57b6ba94", size = 250928, upload-time = "2026-01-25T12:58:12.449Z" }, - { url = "https://files.pythonhosted.org/packages/9b/b1/21b4445709aae500be4ab43bbcfb4e53dc0811c3396dcb11bf9f23fd0226/coverage-7.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4f7b71757a3ab19f7ba286e04c181004c1d61be921795ee8ba6970fd0ec91da5", size = 250496, upload-time = "2026-01-25T12:58:14.047Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b1/0f5d89dfe0392990e4f3980adbde3eb34885bc1effb2dc369e0bf385e389/coverage-7.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b7fc50d2afd2e6b4f6f2f403b70103d280a8e0cb35320cbbe6debcda02a1030b", size = 252373, upload-time = "2026-01-25T12:58:15.976Z" }, - { url = "https://files.pythonhosted.org/packages/01/c9/0cf1a6a57a9968cc049a6b896693faa523c638a5314b1fc374eb2b2ac904/coverage-7.13.2-cp312-cp312-win32.whl", hash = "sha256:292250282cf9bcf206b543d7608bda17ca6fc151f4cbae949fc7e115112fbd41", size = 221696, upload-time = "2026-01-25T12:58:17.517Z" }, - { url = "https://files.pythonhosted.org/packages/4d/05/d7540bf983f09d32803911afed135524570f8c47bb394bf6206c1dc3a786/coverage-7.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:eeea10169fac01549a7921d27a3e517194ae254b542102267bef7a93ed38c40e", size = 222504, upload-time = "2026-01-25T12:58:19.115Z" }, - { url = "https://files.pythonhosted.org/packages/15/8b/1a9f037a736ced0a12aacf6330cdaad5008081142a7070bc58b0f7930cbc/coverage-7.13.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a5b567f0b635b592c917f96b9a9cb3dbd4c320d03f4bf94e9084e494f2e8894", size = 221120, upload-time = "2026-01-25T12:58:21.334Z" }, - { url = "https://files.pythonhosted.org/packages/a7/f0/3d3eac7568ab6096ff23791a526b0048a1ff3f49d0e236b2af6fb6558e88/coverage-7.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed75de7d1217cf3b99365d110975f83af0528c849ef5180a12fd91b5064df9d6", size = 219168, upload-time = "2026-01-25T12:58:23.376Z" }, - { url = "https://files.pythonhosted.org/packages/a3/a6/f8b5cfeddbab95fdef4dcd682d82e5dcff7a112ced57a959f89537ee9995/coverage-7.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97e596de8fa9bada4d88fde64a3f4d37f1b6131e4faa32bad7808abc79887ddc", size = 219537, upload-time = "2026-01-25T12:58:24.932Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e6/8d8e6e0c516c838229d1e41cadcec91745f4b1031d4db17ce0043a0423b4/coverage-7.13.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:68c86173562ed4413345410c9480a8d64864ac5e54a5cda236748031e094229f", size = 250528, upload-time = "2026-01-25T12:58:26.567Z" }, - { url = "https://files.pythonhosted.org/packages/8e/78/befa6640f74092b86961f957f26504c8fba3d7da57cc2ab7407391870495/coverage-7.13.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7be4d613638d678b2b3773b8f687537b284d7074695a43fe2fbbfc0e31ceaed1", size = 253132, upload-time = "2026-01-25T12:58:28.251Z" }, - { url = "https://files.pythonhosted.org/packages/9d/10/1630db1edd8ce675124a2ee0f7becc603d2bb7b345c2387b4b95c6907094/coverage-7.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7f63ce526a96acd0e16c4af8b50b64334239550402fb1607ce6a584a6d62ce9", size = 254374, upload-time = "2026-01-25T12:58:30.294Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1d/0d9381647b1e8e6d310ac4140be9c428a0277330991e0c35bdd751e338a4/coverage-7.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:406821f37f864f968e29ac14c3fccae0fec9fdeba48327f0341decf4daf92d7c", size = 250762, upload-time = "2026-01-25T12:58:32.036Z" }, - { url = "https://files.pythonhosted.org/packages/43/e4/5636dfc9a7c871ee8776af83ee33b4c26bc508ad6cee1e89b6419a366582/coverage-7.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ee68e5a4e3e5443623406b905db447dceddffee0dceb39f4e0cd9ec2a35004b5", size = 252502, upload-time = "2026-01-25T12:58:33.961Z" }, - { url = "https://files.pythonhosted.org/packages/02/2a/7ff2884d79d420cbb2d12fed6fff727b6d0ef27253140d3cdbbd03187ee0/coverage-7.13.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2ee0e58cca0c17dd9c6c1cdde02bb705c7b3fbfa5f3b0b5afeda20d4ebff8ef4", size = 250463, upload-time = "2026-01-25T12:58:35.529Z" }, - { url = "https://files.pythonhosted.org/packages/91/c0/ba51087db645b6c7261570400fc62c89a16278763f36ba618dc8657a187b/coverage-7.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e5bbb5018bf76a56aabdb64246b5288d5ae1b7d0dd4d0534fe86df2c2992d1c", size = 250288, upload-time = "2026-01-25T12:58:37.226Z" }, - { url = "https://files.pythonhosted.org/packages/03/07/44e6f428551c4d9faf63ebcefe49b30e5c89d1be96f6a3abd86a52da9d15/coverage-7.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a55516c68ef3e08e134e818d5e308ffa6b1337cc8b092b69b24287bf07d38e31", size = 252063, upload-time = "2026-01-25T12:58:38.821Z" }, - { url = "https://files.pythonhosted.org/packages/c2/67/35b730ad7e1859dd57e834d1bc06080d22d2f87457d53f692fce3f24a5a9/coverage-7.13.2-cp313-cp313-win32.whl", hash = "sha256:5b20211c47a8abf4abc3319d8ce2464864fa9f30c5fcaf958a3eed92f4f1fef8", size = 221716, upload-time = "2026-01-25T12:58:40.484Z" }, - { url = "https://files.pythonhosted.org/packages/0d/82/e5fcf5a97c72f45fc14829237a6550bf49d0ab882ac90e04b12a69db76b4/coverage-7.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:14f500232e521201cf031549fb1ebdfc0a40f401cf519157f76c397e586c3beb", size = 222522, upload-time = "2026-01-25T12:58:43.247Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f1/25d7b2f946d239dd2d6644ca2cc060d24f97551e2af13b6c24c722ae5f97/coverage-7.13.2-cp313-cp313-win_arm64.whl", hash = "sha256:9779310cb5a9778a60c899f075a8514c89fa6d10131445c2207fc893e0b14557", size = 221145, upload-time = "2026-01-25T12:58:45Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f7/080376c029c8f76fadfe43911d0daffa0cbdc9f9418a0eead70c56fb7f4b/coverage-7.13.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e64fa5a1e41ce5df6b547cbc3d3699381c9e2c2c369c67837e716ed0f549d48e", size = 219861, upload-time = "2026-01-25T12:58:46.586Z" }, - { url = "https://files.pythonhosted.org/packages/42/11/0b5e315af5ab35f4c4a70e64d3314e4eec25eefc6dec13be3a7d5ffe8ac5/coverage-7.13.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b01899e82a04085b6561eb233fd688474f57455e8ad35cd82286463ba06332b7", size = 220207, upload-time = "2026-01-25T12:58:48.277Z" }, - { url = "https://files.pythonhosted.org/packages/b2/0c/0874d0318fb1062117acbef06a09cf8b63f3060c22265adaad24b36306b7/coverage-7.13.2-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:838943bea48be0e2768b0cf7819544cdedc1bbb2f28427eabb6eb8c9eb2285d3", size = 261504, upload-time = "2026-01-25T12:58:49.904Z" }, - { url = "https://files.pythonhosted.org/packages/83/5e/1cd72c22ecb30751e43a72f40ba50fcef1b7e93e3ea823bd9feda8e51f9a/coverage-7.13.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:93d1d25ec2b27e90bcfef7012992d1f5121b51161b8bffcda756a816cf13c2c3", size = 263582, upload-time = "2026-01-25T12:58:51.582Z" }, - { url = "https://files.pythonhosted.org/packages/9b/da/8acf356707c7a42df4d0657020308e23e5a07397e81492640c186268497c/coverage-7.13.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93b57142f9621b0d12349c43fc7741fe578e4bc914c1e5a54142856cfc0bf421", size = 266008, upload-time = "2026-01-25T12:58:53.234Z" }, - { url = "https://files.pythonhosted.org/packages/41/41/ea1730af99960309423c6ea8d6a4f1fa5564b2d97bd1d29dda4b42611f04/coverage-7.13.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f06799ae1bdfff7ccb8665d75f8291c69110ba9585253de254688aa8a1ccc6c5", size = 260762, upload-time = "2026-01-25T12:58:55.372Z" }, - { url = "https://files.pythonhosted.org/packages/22/fa/02884d2080ba71db64fdc127b311db60e01fe6ba797d9c8363725e39f4d5/coverage-7.13.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7f9405ab4f81d490811b1d91c7a20361135a2df4c170e7f0b747a794da5b7f23", size = 263571, upload-time = "2026-01-25T12:58:57.52Z" }, - { url = "https://files.pythonhosted.org/packages/d2/6b/4083aaaeba9b3112f55ac57c2ce7001dc4d8fa3fcc228a39f09cc84ede27/coverage-7.13.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f9ab1d5b86f8fbc97a5b3cd6280a3fd85fef3b028689d8a2c00918f0d82c728c", size = 261200, upload-time = "2026-01-25T12:58:59.255Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d2/aea92fa36d61955e8c416ede9cf9bf142aa196f3aea214bb67f85235a050/coverage-7.13.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:f674f59712d67e841525b99e5e2b595250e39b529c3bda14764e4f625a3fa01f", size = 260095, upload-time = "2026-01-25T12:59:01.066Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ae/04ffe96a80f107ea21b22b2367175c621da920063260a1c22f9452fd7866/coverage-7.13.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c6cadac7b8ace1ba9144feb1ae3cb787a6065ba6d23ffc59a934b16406c26573", size = 262284, upload-time = "2026-01-25T12:59:02.802Z" }, - { url = "https://files.pythonhosted.org/packages/1c/7a/6f354dcd7dfc41297791d6fb4e0d618acb55810bde2c1fd14b3939e05c2b/coverage-7.13.2-cp313-cp313t-win32.whl", hash = "sha256:14ae4146465f8e6e6253eba0cccd57423e598a4cb925958b240c805300918343", size = 222389, upload-time = "2026-01-25T12:59:04.563Z" }, - { url = "https://files.pythonhosted.org/packages/8d/d5/080ad292a4a3d3daf411574be0a1f56d6dee2c4fdf6b005342be9fac807f/coverage-7.13.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9074896edd705a05769e3de0eac0a8388484b503b68863dd06d5e473f874fd47", size = 223450, upload-time = "2026-01-25T12:59:06.677Z" }, - { url = "https://files.pythonhosted.org/packages/88/96/df576fbacc522e9fb8d1c4b7a7fc62eb734be56e2cba1d88d2eabe08ea3f/coverage-7.13.2-cp313-cp313t-win_arm64.whl", hash = "sha256:69e526e14f3f854eda573d3cf40cffd29a1a91c684743d904c33dbdcd0e0f3e7", size = 221707, upload-time = "2026-01-25T12:59:08.363Z" }, - { url = "https://files.pythonhosted.org/packages/55/53/1da9e51a0775634b04fcc11eb25c002fc58ee4f92ce2e8512f94ac5fc5bf/coverage-7.13.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:387a825f43d680e7310e6f325b2167dd093bc8ffd933b83e9aa0983cf6e0a2ef", size = 219213, upload-time = "2026-01-25T12:59:11.909Z" }, - { url = "https://files.pythonhosted.org/packages/46/35/b3caac3ebbd10230fea5a33012b27d19e999a17c9285c4228b4b2e35b7da/coverage-7.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f0d7fea9d8e5d778cd5a9e8fc38308ad688f02040e883cdc13311ef2748cb40f", size = 219549, upload-time = "2026-01-25T12:59:13.638Z" }, - { url = "https://files.pythonhosted.org/packages/76/9c/e1cf7def1bdc72c1907e60703983a588f9558434a2ff94615747bd73c192/coverage-7.13.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e080afb413be106c95c4ee96b4fffdc9e2fa56a8bbf90b5c0918e5c4449412f5", size = 250586, upload-time = "2026-01-25T12:59:15.808Z" }, - { url = "https://files.pythonhosted.org/packages/ba/49/f54ec02ed12be66c8d8897270505759e057b0c68564a65c429ccdd1f139e/coverage-7.13.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a7fc042ba3c7ce25b8a9f097eb0f32a5ce1ccdb639d9eec114e26def98e1f8a4", size = 253093, upload-time = "2026-01-25T12:59:17.491Z" }, - { url = "https://files.pythonhosted.org/packages/fb/5e/aaf86be3e181d907e23c0f61fccaeb38de8e6f6b47aed92bf57d8fc9c034/coverage-7.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d0ba505e021557f7f8173ee8cd6b926373d8653e5ff7581ae2efce1b11ef4c27", size = 254446, upload-time = "2026-01-25T12:59:19.752Z" }, - { url = "https://files.pythonhosted.org/packages/28/c8/a5fa01460e2d75b0c853b392080d6829d3ca8b5ab31e158fa0501bc7c708/coverage-7.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7de326f80e3451bd5cc7239ab46c73ddb658fe0b7649476bc7413572d36cd548", size = 250615, upload-time = "2026-01-25T12:59:21.928Z" }, - { url = "https://files.pythonhosted.org/packages/86/0b/6d56315a55f7062bb66410732c24879ccb2ec527ab6630246de5fe45a1df/coverage-7.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:abaea04f1e7e34841d4a7b343904a3f59481f62f9df39e2cd399d69a187a9660", size = 252452, upload-time = "2026-01-25T12:59:23.592Z" }, - { url = "https://files.pythonhosted.org/packages/30/19/9bc550363ebc6b0ea121977ee44d05ecd1e8bf79018b8444f1028701c563/coverage-7.13.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9f93959ee0c604bccd8e0697be21de0887b1f73efcc3aa73a3ec0fd13feace92", size = 250418, upload-time = "2026-01-25T12:59:25.392Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/580530a31ca2f0cc6f07a8f2ab5460785b02bb11bdf815d4c4d37a4c5169/coverage-7.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:13fe81ead04e34e105bf1b3c9f9cdf32ce31736ee5d90a8d2de02b9d3e1bcb82", size = 250231, upload-time = "2026-01-25T12:59:27.888Z" }, - { url = "https://files.pythonhosted.org/packages/e2/42/dd9093f919dc3088cb472893651884bd675e3df3d38a43f9053656dca9a2/coverage-7.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d6d16b0f71120e365741bca2cb473ca6fe38930bc5431c5e850ba949f708f892", size = 251888, upload-time = "2026-01-25T12:59:29.636Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a6/0af4053e6e819774626e133c3d6f70fae4d44884bfc4b126cb647baee8d3/coverage-7.13.2-cp314-cp314-win32.whl", hash = "sha256:9b2f4714bb7d99ba3790ee095b3b4ac94767e1347fe424278a0b10acb3ff04fe", size = 221968, upload-time = "2026-01-25T12:59:31.424Z" }, - { url = "https://files.pythonhosted.org/packages/c4/cc/5aff1e1f80d55862442855517bb8ad8ad3a68639441ff6287dde6a58558b/coverage-7.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:e4121a90823a063d717a96e0a0529c727fb31ea889369a0ee3ec00ed99bf6859", size = 222783, upload-time = "2026-01-25T12:59:33.118Z" }, - { url = "https://files.pythonhosted.org/packages/de/20/09abafb24f84b3292cc658728803416c15b79f9ee5e68d25238a895b07d9/coverage-7.13.2-cp314-cp314-win_arm64.whl", hash = "sha256:6873f0271b4a15a33e7590f338d823f6f66f91ed147a03938d7ce26efd04eee6", size = 221348, upload-time = "2026-01-25T12:59:34.939Z" }, - { url = "https://files.pythonhosted.org/packages/b6/60/a3820c7232db63be060e4019017cd3426751c2699dab3c62819cdbcea387/coverage-7.13.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f61d349f5b7cd95c34017f1927ee379bfbe9884300d74e07cf630ccf7a610c1b", size = 219950, upload-time = "2026-01-25T12:59:36.624Z" }, - { url = "https://files.pythonhosted.org/packages/fd/37/e4ef5975fdeb86b1e56db9a82f41b032e3d93a840ebaf4064f39e770d5c5/coverage-7.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a43d34ce714f4ca674c0d90beb760eb05aad906f2c47580ccee9da8fe8bfb417", size = 220209, upload-time = "2026-01-25T12:59:38.339Z" }, - { url = "https://files.pythonhosted.org/packages/54/df/d40e091d00c51adca1e251d3b60a8b464112efa3004949e96a74d7c19a64/coverage-7.13.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bff1b04cb9d4900ce5c56c4942f047dc7efe57e2608cb7c3c8936e9970ccdbee", size = 261576, upload-time = "2026-01-25T12:59:40.446Z" }, - { url = "https://files.pythonhosted.org/packages/c5/44/5259c4bed54e3392e5c176121af9f71919d96dde853386e7730e705f3520/coverage-7.13.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6ae99e4560963ad8e163e819e5d77d413d331fd00566c1e0856aa252303552c1", size = 263704, upload-time = "2026-01-25T12:59:42.346Z" }, - { url = "https://files.pythonhosted.org/packages/16/bd/ae9f005827abcbe2c70157459ae86053971c9fa14617b63903abbdce26d9/coverage-7.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e79a8c7d461820257d9aa43716c4efc55366d7b292e46b5b37165be1d377405d", size = 266109, upload-time = "2026-01-25T12:59:44.073Z" }, - { url = "https://files.pythonhosted.org/packages/a2/c0/8e279c1c0f5b1eaa3ad9b0fb7a5637fc0379ea7d85a781c0fe0bb3cfc2ab/coverage-7.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:060ee84f6a769d40c492711911a76811b4befb6fba50abb450371abb720f5bd6", size = 260686, upload-time = "2026-01-25T12:59:45.804Z" }, - { url = "https://files.pythonhosted.org/packages/b2/47/3a8112627e9d863e7cddd72894171c929e94491a597811725befdcd76bce/coverage-7.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bca209d001fd03ea2d978f8a4985093240a355c93078aee3f799852c23f561a", size = 263568, upload-time = "2026-01-25T12:59:47.929Z" }, - { url = "https://files.pythonhosted.org/packages/92/bc/7ea367d84afa3120afc3ce6de294fd2dcd33b51e2e7fbe4bbfd200f2cb8c/coverage-7.13.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:6b8092aa38d72f091db61ef83cb66076f18f02da3e1a75039a4f218629600e04", size = 261174, upload-time = "2026-01-25T12:59:49.717Z" }, - { url = "https://files.pythonhosted.org/packages/33/b7/f1092dcecb6637e31cc2db099581ee5c61a17647849bae6b8261a2b78430/coverage-7.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4a3158dc2dcce5200d91ec28cd315c999eebff355437d2765840555d765a6e5f", size = 260017, upload-time = "2026-01-25T12:59:51.463Z" }, - { url = "https://files.pythonhosted.org/packages/2b/cd/f3d07d4b95fbe1a2ef0958c15da614f7e4f557720132de34d2dc3aa7e911/coverage-7.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3973f353b2d70bd9796cc12f532a05945232ccae966456c8ed7034cb96bbfd6f", size = 262337, upload-time = "2026-01-25T12:59:53.407Z" }, - { url = "https://files.pythonhosted.org/packages/e0/db/b0d5b2873a07cb1e06a55d998697c0a5a540dcefbf353774c99eb3874513/coverage-7.13.2-cp314-cp314t-win32.whl", hash = "sha256:79f6506a678a59d4ded048dc72f1859ebede8ec2b9a2d509ebe161f01c2879d3", size = 222749, upload-time = "2026-01-25T12:59:56.316Z" }, - { url = "https://files.pythonhosted.org/packages/e5/2f/838a5394c082ac57d85f57f6aba53093b30d9089781df72412126505716f/coverage-7.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:196bfeabdccc5a020a57d5a368c681e3a6ceb0447d153aeccc1ab4d70a5032ba", size = 223857, upload-time = "2026-01-25T12:59:58.201Z" }, - { url = "https://files.pythonhosted.org/packages/44/d4/b608243e76ead3a4298824b50922b89ef793e50069ce30316a65c1b4d7ef/coverage-7.13.2-cp314-cp314t-win_arm64.whl", hash = "sha256:69269ab58783e090bfbf5b916ab3d188126e22d6070bbfc93098fdd474ef937c", size = 221881, upload-time = "2026-01-25T13:00:00.449Z" }, - { url = "https://files.pythonhosted.org/packages/d2/db/d291e30fdf7ea617a335531e72294e0c723356d7fdde8fba00610a76bda9/coverage-7.13.2-py3-none-any.whl", hash = "sha256:40ce1ea1e25125556d8e76bd0b61500839a07944cc287ac21d5626f3e620cad5", size = 210943, upload-time = "2026-01-25T13:00:02.388Z" }, +version = "7.13.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, + { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, + { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, + { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, + { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, + { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, + { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, + { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, + { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, + { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, + { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, + { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, + { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, + { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, + { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, + { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, + { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, + { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, + { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, + { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, + { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, + { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, + { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, + { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, + { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, + { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, + { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, + { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, + { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, + { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, + { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, + { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, + { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, + { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, + { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, + { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, + { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, + { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, + { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, + { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, + { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, ] [package.optional-dependencies] @@ -459,21 +462,24 @@ wheels = [ ] [[package]] -name = "docopt" -version = "0.6.2" +name = "docopt-ng" +version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload-time = "2014-06-16T11:18:57.406Z" } +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.25.0" +version = "1.26.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/2f/194d9a34c4d831c6563d2d990720850f0baef9ab60cb4ad8ae0eff6acd34/dunamai-1.25.0.tar.gz", hash = "sha256:a7f8360ea286d3dbaf0b6a1473f9253280ac93d619836ad4514facb70c0719d1", size = 46155, upload-time = "2025-07-04T19:25:56.082Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/67/d5611975faaa5e4a920f4b19e4caccd5df0facb925687850f1e45f5876f2/dunamai-1.26.1.tar.gz", hash = "sha256:3b46007bd65b00b4824ead0a1aee365fd22d0ec2b9c219497d4fd48f52860c8b", size = 45567, upload-time = "2026-04-04T14:07:11.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl", hash = "sha256:7f9dc687dd3256e613b6cc978d9daabfd2bb5deb8adc541fc135ee423ffa98ab", size = 27022, upload-time = "2025-07-04T19:25:54.863Z" }, + { 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]] @@ -532,60 +538,60 @@ wheels = [ [[package]] name = "filelock" -version = "3.20.3" +version = "3.29.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz", hash = "sha256:69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", size = 57571, upload-time = "2026-04-19T15:39:10.068Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, + { url = "https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl", hash = "sha256:96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", size = 39812, upload-time = "2026-04-19T15:39:08.752Z" }, ] [[package]] name = "fonttools" -version = "4.61.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" }, - { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" }, - { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" }, - { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" }, - { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" }, - { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" }, - { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" }, - { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" }, - { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, - { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, - { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, - { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, - { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, - { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, - { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, - { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, - { url = "https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c", size = 2846454, upload-time = "2025-12-12T17:30:24.938Z" }, - { url = "https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e", size = 2398191, upload-time = "2025-12-12T17:30:27.343Z" }, - { url = "https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5", size = 4928410, upload-time = "2025-12-12T17:30:29.771Z" }, - { url = "https://files.pythonhosted.org/packages/b0/8d/6fb3494dfe61a46258cd93d979cf4725ded4eb46c2a4ca35e4490d84daea/fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd", size = 4984460, upload-time = "2025-12-12T17:30:32.073Z" }, - { url = "https://files.pythonhosted.org/packages/f7/f1/a47f1d30b3dc00d75e7af762652d4cbc3dff5c2697a0dbd5203c81afd9c3/fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3", size = 4925800, upload-time = "2025-12-12T17:30:34.339Z" }, - { url = "https://files.pythonhosted.org/packages/a7/01/e6ae64a0981076e8a66906fab01539799546181e32a37a0257b77e4aa88b/fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d", size = 5067859, upload-time = "2025-12-12T17:30:36.593Z" }, - { url = "https://files.pythonhosted.org/packages/73/aa/28e40b8d6809a9b5075350a86779163f074d2b617c15d22343fce81918db/fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c", size = 2267821, upload-time = "2025-12-12T17:30:38.478Z" }, - { url = "https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b", size = 2318169, upload-time = "2025-12-12T17:30:40.951Z" }, - { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" }, - { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" }, - { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" }, - { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" }, - { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" }, - { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" }, - { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" }, - { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" }, - { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" }, - { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" }, - { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" }, - { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" }, - { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" }, - { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, +version = "4.62.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:40975849bac44fb0b9253d77420c6d8b523ac4dcdcefeff6e4d706838a5b80f7", size = 2871039, upload-time = "2026-03-13T13:52:33.127Z" }, + { url = "https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9dde91633f77fa576879a0c76b1d89de373cae751a98ddf0109d54e173b40f14", size = 2416346, upload-time = "2026-03-13T13:52:35.676Z" }, + { url = "https://files.pythonhosted.org/packages/aa/53/5276ceba7bff95da7793a07c5284e1da901cf00341ce5e2f3273056c0cca/fonttools-4.62.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6acb4109f8bee00fec985c8c7afb02299e35e9c94b57287f3ea542f28bd0b0a7", size = 5100897, upload-time = "2026-03-13T13:52:38.102Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1c5c25671ce8805e0d080e2ffdeca7f1e86778c5cbfbeae86d7f866d8830517b", size = 5071078, upload-time = "2026-03-13T13:52:41.305Z" }, + { url = "https://files.pythonhosted.org/packages/e3/be/d378fca4c65ea1956fee6d90ace6e861776809cbbc5af22388a090c3c092/fonttools-4.62.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5d8825e1140f04e6c99bb7d37a9e31c172f3bc208afbe02175339e699c710e1", size = 5076908, upload-time = "2026-03-13T13:52:44.122Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d9/ae6a1d0693a4185a84605679c8a1f719a55df87b9c6e8e817bfdd9ef5936/fonttools-4.62.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:268abb1cb221e66c014acc234e872b7870d8b5d4657a83a8f4205094c32d2416", size = 5202275, upload-time = "2026-03-13T13:52:46.591Z" }, + { url = "https://files.pythonhosted.org/packages/54/6c/af95d9c4efb15cabff22642b608342f2bd67137eea6107202d91b5b03184/fonttools-4.62.1-cp311-cp311-win32.whl", hash = "sha256:942b03094d7edbb99bdf1ae7e9090898cad7bf9030b3d21f33d7072dbcb51a53", size = 2293075, upload-time = "2026-03-13T13:52:48.711Z" }, + { url = "https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:e8514f4924375f77084e81467e63238b095abda5107620f49421c368a6017ed2", size = 2344593, upload-time = "2026-03-13T13:52:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/47/d4/dbacced3953544b9a93088cc10ef2b596d348c983d5c67a404fa41ec51ba/fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974", size = 2870219, upload-time = "2026-03-13T13:52:53.664Z" }, + { url = "https://files.pythonhosted.org/packages/66/9e/a769c8e99b81e5a87ab7e5e7236684de4e96246aae17274e5347d11ebd78/fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9", size = 2414891, upload-time = "2026-03-13T13:52:56.493Z" }, + { url = "https://files.pythonhosted.org/packages/69/64/f19a9e3911968c37e1e620e14dfc5778299e1474f72f4e57c5ec771d9489/fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936", size = 5033197, upload-time = "2026-03-13T13:52:59.179Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/99c8b3c3888c5c474c08dbfd7c8899786de9604b727fcefb055b42c84bba/fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392", size = 4988768, upload-time = "2026-03-13T13:53:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/0f904540d3e6ab463c1243a0d803504826a11604c72dd58c2949796a1762/fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04", size = 4971512, upload-time = "2026-03-13T13:53:05.678Z" }, + { url = "https://files.pythonhosted.org/packages/29/0b/5cbef6588dc9bd6b5c9ad6a4d5a8ca384d0cea089da31711bbeb4f9654a6/fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d", size = 5122723, upload-time = "2026-03-13T13:53:08.662Z" }, + { url = "https://files.pythonhosted.org/packages/4a/47/b3a5342d381595ef439adec67848bed561ab7fdb1019fa522e82101b7d9c/fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c", size = 2281278, upload-time = "2026-03-13T13:53:10.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/b1/0c2ab56a16f409c6c8a68816e6af707827ad5d629634691ff60a52879792/fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42", size = 2331414, upload-time = "2026-03-13T13:53:13.992Z" }, + { url = "https://files.pythonhosted.org/packages/3b/56/6f389de21c49555553d6a5aeed5ac9767631497ac836c4f076273d15bd72/fonttools-4.62.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79", size = 2865155, upload-time = "2026-03-13T13:53:16.132Z" }, + { url = "https://files.pythonhosted.org/packages/03/c5/0e3966edd5ec668d41dfe418787726752bc07e2f5fd8c8f208615e61fa89/fonttools-4.62.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe", size = 2412802, upload-time = "2026-03-13T13:53:18.878Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/e6ac4b44026de7786fe46e3bfa0c87e51d5d70a841054065d49cd62bb909/fonttools-4.62.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68", size = 5013926, upload-time = "2026-03-13T13:53:21.379Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/8b1e801939839d405f1f122e7d175cebe9aeb4e114f95bfc45e3152af9a7/fonttools-4.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1", size = 4964575, upload-time = "2026-03-13T13:53:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/46/76/7d051671e938b1881670528fec69cc4044315edd71a229c7fd712eaa5119/fonttools-4.62.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069", size = 4953693, upload-time = "2026-03-13T13:53:26.569Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ae/b41f8628ec0be3c1b934fc12b84f4576a5c646119db4d3bdd76a217c90b5/fonttools-4.62.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9", size = 5094920, upload-time = "2026-03-13T13:53:29.329Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/53a1e9469331a23dcc400970a27a4caa3d9f6edbf5baab0260285238b884/fonttools-4.62.1-cp313-cp313-win32.whl", hash = "sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24", size = 2279928, upload-time = "2026-03-13T13:53:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/38/60/35186529de1db3c01f5ad625bde07c1f576305eab6d86bbda4c58445f721/fonttools-4.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056", size = 2330514, upload-time = "2026-03-13T13:53:34.991Z" }, + { url = "https://files.pythonhosted.org/packages/36/f0/2888cdac391807d68d90dcb16ef858ddc1b5309bfc6966195a459dd326e2/fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca", size = 2864442, upload-time = "2026-03-13T13:53:37.509Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b2/e521803081f8dc35990816b82da6360fa668a21b44da4b53fc9e77efcd62/fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca", size = 2410901, upload-time = "2026-03-13T13:53:40.55Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/8c3511ff06e53110039358dbbdc1a65d72157a054638387aa2ada300a8b8/fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782", size = 4999608, upload-time = "2026-03-13T13:53:42.798Z" }, + { url = "https://files.pythonhosted.org/packages/28/63/cd0c3b26afe60995a5295f37c246a93d454023726c3261cfbb3559969bb9/fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae", size = 4912726, upload-time = "2026-03-13T13:53:45.405Z" }, + { url = "https://files.pythonhosted.org/packages/70/b9/ac677cb07c24c685cf34f64e140617d58789d67a3dd524164b63648c6114/fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7", size = 4951422, upload-time = "2026-03-13T13:53:48.326Z" }, + { url = "https://files.pythonhosted.org/packages/e6/10/11c08419a14b85b7ca9a9faca321accccc8842dd9e0b1c8a72908de05945/fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a", size = 5060979, upload-time = "2026-03-13T13:53:51.366Z" }, + { url = "https://files.pythonhosted.org/packages/4e/3c/12eea4a4cf054e7ab058ed5ceada43b46809fce2bf319017c4d63ae55bb4/fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800", size = 2283733, upload-time = "2026-03-13T13:53:53.606Z" }, + { url = "https://files.pythonhosted.org/packages/6b/67/74b070029043186b5dd13462c958cb7c7f811be0d2e634309d9a1ffb1505/fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e", size = 2335663, upload-time = "2026-03-13T13:53:56.23Z" }, + { url = "https://files.pythonhosted.org/packages/42/c5/4d2ed3ca6e33617fc5624467da353337f06e7f637707478903c785bd8e20/fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82", size = 2947288, upload-time = "2026-03-13T13:53:59.397Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e9/7ab11ddfda48ed0f89b13380e5595ba572619c27077be0b2c447a63ff351/fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260", size = 2449023, upload-time = "2026-03-13T13:54:01.642Z" }, + { url = "https://files.pythonhosted.org/packages/b2/10/a800fa090b5e8819942e54e19b55fc7c21fe14a08757c3aa3ca8db358939/fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4", size = 5137599, upload-time = "2026-03-13T13:54:04.495Z" }, + { url = "https://files.pythonhosted.org/packages/37/dc/8ccd45033fffd74deb6912fa1ca524643f584b94c87a16036855b498a1ed/fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b", size = 4920933, upload-time = "2026-03-13T13:54:07.557Z" }, + { url = "https://files.pythonhosted.org/packages/99/eb/e618adefb839598d25ac8136cd577925d6c513dc0d931d93b8af956210f0/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87", size = 5016232, upload-time = "2026-03-13T13:54:10.611Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5f/9b5c9bfaa8ec82def8d8168c4f13615990d6ce5996fe52bd49bfb5e05134/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c", size = 5042987, upload-time = "2026-03-13T13:54:13.569Z" }, + { url = "https://files.pythonhosted.org/packages/90/aa/dfbbe24c6a6afc5c203d90cc0343e24bcbb09e76d67c4d6eef8c2558d7ba/fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a", size = 2348021, upload-time = "2026-03-13T13:54:16.98Z" }, + { url = "https://files.pythonhosted.org/packages/13/6f/ae9c4e4dd417948407b680855c2c7790efb52add6009aaecff1e3bc50e8e/fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e", size = 2414147, upload-time = "2026-03-13T13:54:19.416Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, ] [[package]] @@ -614,54 +620,62 @@ wheels = [ [[package]] name = "graphql-core" -version = "3.2.7" +version = "3.2.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ac/9b/037a640a2983b09aed4a823f9cf1729e6d780b0671f854efa4727a7affbe/graphql_core-3.2.7.tar.gz", hash = "sha256:27b6904bdd3b43f2a0556dad5d579bdfdeab1f38e8e8788e555bdcb586a6f62c", size = 513484, upload-time = "2025-11-01T22:30:40.436Z" } +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/0a/14/933037032608787fb92e365883ad6a741c235e0ff992865ec5d904a38f1e/graphql_core-3.2.7-py3-none-any.whl", hash = "sha256:17fc8f3ca4a42913d8e24d9ac9f08deddf0a0b2483076575757f6c412ead2ec0", size = 207262, upload-time = "2025-11-01T22:30:38.912Z" }, + { 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.15.1" +version = "3.16.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/6a/0d79de0b025aa85dc8864de8e97659c94cf3d23148394a954dc5ca52f8c8/h5py-3.15.1.tar.gz", hash = "sha256:c86e3ed45c4473564de55aa83b6fc9e5ead86578773dfbd93047380042e26b69", size = 426236, upload-time = "2025-10-16T10:35:27.404Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/fd/8349b48b15b47768042cff06ad6e1c229f0a4bd89225bf6b6894fea27e6d/h5py-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5aaa330bcbf2830150c50897ea5dcbed30b5b6d56897289846ac5b9e529ec243", size = 3434135, upload-time = "2025-10-16T10:33:47.954Z" }, - { url = "https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c970fb80001fffabb0109eaf95116c8e7c0d3ca2de854e0901e8a04c1f098509", size = 2870958, upload-time = "2025-10-16T10:33:50.907Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e3/c255cafc9b85e6ea04e2ad1bba1416baa1d7f57fc98a214be1144087690c/h5py-3.15.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80e5bb5b9508d5d9da09f81fd00abbb3f85da8143e56b1585d59bc8ceb1dba8b", size = 4504770, upload-time = "2025-10-16T10:33:54.357Z" }, - { url = "https://files.pythonhosted.org/packages/8b/23/4ab1108e87851ccc69694b03b817d92e142966a6c4abd99e17db77f2c066/h5py-3.15.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b849ba619a066196169763c33f9f0f02e381156d61c03e000bb0100f9950faf", size = 4700329, upload-time = "2025-10-16T10:33:57.616Z" }, - { url = "https://files.pythonhosted.org/packages/a4/e4/932a3a8516e4e475b90969bf250b1924dbe3612a02b897e426613aed68f4/h5py-3.15.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e7f6c841efd4e6e5b7e82222eaf90819927b6d256ab0f3aca29675601f654f3c", size = 4152456, upload-time = "2025-10-16T10:34:00.843Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0a/f74d589883b13737021b2049ac796328f188dbb60c2ed35b101f5b95a3fc/h5py-3.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ca8a3a22458956ee7b40d8e39c9a9dc01f82933e4c030c964f8b875592f4d831", size = 4617295, upload-time = "2025-10-16T10:34:04.154Z" }, - { url = "https://files.pythonhosted.org/packages/23/95/499b4e56452ef8b6c95a271af0dde08dac4ddb70515a75f346d4f400579b/h5py-3.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:550e51131376889656feec4aff2170efc054a7fe79eb1da3bb92e1625d1ac878", size = 2882129, upload-time = "2025-10-16T10:34:06.886Z" }, - { url = "https://files.pythonhosted.org/packages/ce/bb/cfcc70b8a42222ba3ad4478bcef1791181ea908e2adbd7d53c66395edad5/h5py-3.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:b39239947cb36a819147fc19e86b618dcb0953d1cd969f5ed71fc0de60392427", size = 2477121, upload-time = "2025-10-16T10:34:09.579Z" }, - { url = "https://files.pythonhosted.org/packages/62/b8/c0d9aa013ecfa8b7057946c080c0c07f6fa41e231d2e9bd306a2f8110bdc/h5py-3.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:316dd0f119734f324ca7ed10b5627a2de4ea42cc4dfbcedbee026aaa361c238c", size = 3399089, upload-time = "2025-10-16T10:34:12.135Z" }, - { url = "https://files.pythonhosted.org/packages/a4/5e/3c6f6e0430813c7aefe784d00c6711166f46225f5d229546eb53032c3707/h5py-3.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b51469890e58e85d5242e43aab29f5e9c7e526b951caab354f3ded4ac88e7b76", size = 2847803, upload-time = "2025-10-16T10:34:14.564Z" }, - { url = "https://files.pythonhosted.org/packages/00/69/ba36273b888a4a48d78f9268d2aee05787e4438557450a8442946ab8f3ec/h5py-3.15.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a33bfd5dfcea037196f7778534b1ff7e36a7f40a89e648c8f2967292eb6898e", size = 4914884, upload-time = "2025-10-16T10:34:18.452Z" }, - { url = "https://files.pythonhosted.org/packages/3a/30/d1c94066343a98bb2cea40120873193a4fed68c4ad7f8935c11caf74c681/h5py-3.15.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25c8843fec43b2cc368aa15afa1cdf83fc5e17b1c4e10cd3771ef6c39b72e5ce", size = 5109965, upload-time = "2025-10-16T10:34:21.853Z" }, - { url = "https://files.pythonhosted.org/packages/81/3d/d28172116eafc3bc9f5991b3cb3fd2c8a95f5984f50880adfdf991de9087/h5py-3.15.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a308fd8681a864c04423c0324527237a0484e2611e3441f8089fd00ed56a8171", size = 4561870, upload-time = "2025-10-16T10:34:26.69Z" }, - { url = "https://files.pythonhosted.org/packages/a5/83/393a7226024238b0f51965a7156004eaae1fcf84aa4bfecf7e582676271b/h5py-3.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f4a016df3f4a8a14d573b496e4d1964deb380e26031fc85fb40e417e9131888a", size = 5037161, upload-time = "2025-10-16T10:34:30.383Z" }, - { url = "https://files.pythonhosted.org/packages/cf/51/329e7436bf87ca6b0fe06dd0a3795c34bebe4ed8d6c44450a20565d57832/h5py-3.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:59b25cf02411bf12e14f803fef0b80886444c7fe21a5ad17c6a28d3f08098a1e", size = 2874165, upload-time = "2025-10-16T10:34:33.461Z" }, - { url = "https://files.pythonhosted.org/packages/09/a8/2d02b10a66747c54446e932171dd89b8b4126c0111b440e6bc05a7c852ec/h5py-3.15.1-cp312-cp312-win_arm64.whl", hash = "sha256:61d5a58a9851e01ee61c932bbbb1c98fe20aba0a5674776600fb9a361c0aa652", size = 2458214, upload-time = "2025-10-16T10:34:35.733Z" }, - { url = "https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8440fd8bee9500c235ecb7aa1917a0389a2adb80c209fa1cc485bd70e0d94a5", size = 3376511, upload-time = "2025-10-16T10:34:38.596Z" }, - { url = "https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ab2219dbc6fcdb6932f76b548e2b16f34a1f52b7666e998157a4dfc02e2c4123", size = 2826143, upload-time = "2025-10-16T10:34:41.342Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c2/fc6375d07ea3962df7afad7d863fe4bde18bb88530678c20d4c90c18de1d/h5py-3.15.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8cb02c3a96255149ed3ac811eeea25b655d959c6dd5ce702c9a95ff11859eb5", size = 4908316, upload-time = "2025-10-16T10:34:44.619Z" }, - { url = "https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:121b2b7a4c1915d63737483b7bff14ef253020f617c2fb2811f67a4bed9ac5e8", size = 5103710, upload-time = "2025-10-16T10:34:48.639Z" }, - { url = "https://files.pythonhosted.org/packages/e0/f6/11f1e2432d57d71322c02a97a5567829a75f223a8c821764a0e71a65cde8/h5py-3.15.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59b0d63b318bf3cc06687def2b45afd75926bbc006f7b8cd2b1a231299fc8599", size = 4556042, upload-time = "2025-10-16T10:34:51.841Z" }, - { url = "https://files.pythonhosted.org/packages/18/88/3eda3ef16bfe7a7dbc3d8d6836bbaa7986feb5ff091395e140dc13927bcc/h5py-3.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e02fe77a03f652500d8bff288cbf3675f742fc0411f5a628fa37116507dc7cc0", size = 5030639, upload-time = "2025-10-16T10:34:55.257Z" }, - { url = "https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:dea78b092fd80a083563ed79a3171258d4a4d307492e7cf8b2313d464c82ba52", size = 2864363, upload-time = "2025-10-16T10:34:58.099Z" }, - { url = "https://files.pythonhosted.org/packages/5d/c9/35021cc9cd2b2915a7da3026e3d77a05bed1144a414ff840953b33937fb9/h5py-3.15.1-cp313-cp313-win_arm64.whl", hash = "sha256:c256254a8a81e2bddc0d376e23e2a6d2dc8a1e8a2261835ed8c1281a0744cd97", size = 2449570, upload-time = "2025-10-16T10:35:00.473Z" }, - { url = "https://files.pythonhosted.org/packages/a0/2c/926eba1514e4d2e47d0e9eb16c784e717d8b066398ccfca9b283917b1bfb/h5py-3.15.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5f4fb0567eb8517c3ecd6b3c02c4f4e9da220c8932604960fd04e24ee1254763", size = 3380368, upload-time = "2025-10-16T10:35:03.117Z" }, - { url = "https://files.pythonhosted.org/packages/65/4b/d715ed454d3baa5f6ae1d30b7eca4c7a1c1084f6a2edead9e801a1541d62/h5py-3.15.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:954e480433e82d3872503104f9b285d369048c3a788b2b1a00e53d1c47c98dd2", size = 2833793, upload-time = "2025-10-16T10:35:05.623Z" }, - { url = "https://files.pythonhosted.org/packages/ef/d4/ef386c28e4579314610a8bffebbee3b69295b0237bc967340b7c653c6c10/h5py-3.15.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd125c131889ebbef0849f4a0e29cf363b48aba42f228d08b4079913b576bb3a", size = 4903199, upload-time = "2025-10-16T10:35:08.972Z" }, - { url = "https://files.pythonhosted.org/packages/33/5d/65c619e195e0b5e54ea5a95c1bb600c8ff8715e0d09676e4cce56d89f492/h5py-3.15.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28a20e1a4082a479b3d7db2169f3a5034af010b90842e75ebbf2e9e49eb4183e", size = 5097224, upload-time = "2025-10-16T10:35:12.808Z" }, - { url = "https://files.pythonhosted.org/packages/30/30/5273218400bf2da01609e1292f562c94b461fcb73c7a9e27fdadd43abc0a/h5py-3.15.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa8df5267f545b4946df8ca0d93d23382191018e4cda2deda4c2cedf9a010e13", size = 4551207, upload-time = "2025-10-16T10:35:16.24Z" }, - { url = "https://files.pythonhosted.org/packages/d3/39/a7ef948ddf4d1c556b0b2b9559534777bccc318543b3f5a1efdf6b556c9c/h5py-3.15.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99d374a21f7321a4c6ab327c4ab23bd925ad69821aeb53a1e75dd809d19f67fa", size = 5025426, upload-time = "2025-10-16T10:35:19.831Z" }, - { url = "https://files.pythonhosted.org/packages/b6/d8/7368679b8df6925b8415f9dcc9ab1dab01ddc384d2b2c24aac9191bd9ceb/h5py-3.15.1-cp314-cp314-win_amd64.whl", hash = "sha256:9c73d1d7cdb97d5b17ae385153472ce118bed607e43be11e9a9deefaa54e0734", size = 2865704, upload-time = "2025-10-16T10:35:22.658Z" }, - { url = "https://files.pythonhosted.org/packages/d3/b7/4a806f85d62c20157e62e58e03b27513dc9c55499768530acc4f4c5ce4be/h5py-3.15.1-cp314-cp314-win_arm64.whl", hash = "sha256:a6d8c5a05a76aca9a494b4c53ce8a9c29023b7f64f625c6ce1841e92a362ccdf", size = 2465544, upload-time = "2025-10-16T10:35:25.695Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/db/33/acd0ce6863b6c0d7735007df01815403f5589a21ff8c2e1ee2587a38f548/h5py-3.16.0.tar.gz", hash = "sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738", size = 446526, upload-time = "2026-03-06T13:49:08.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:719439d14b83f74eeb080e9650a6c7aa6d0d9ea0ca7f804347b05fac6fbf18af", size = 3721663, upload-time = "2026-03-06T13:47:49.599Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c3f0a0e136f2e95dd0b67146abb6668af4f1a69c81ef8651a2d316e8e01de447", size = 3087630, upload-time = "2026-03-06T13:47:51.249Z" }, + { url = "https://files.pythonhosted.org/packages/98/a8/2594cef906aee761601eff842c7dc598bea2b394a3e1c00966832b8eeb7c/h5py-3.16.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a6fbc5367d4046801f9b7db9191b31895f22f1c6df1f9987d667854cac493538", size = 4823472, upload-time = "2026-03-06T13:47:53.085Z" }, + { url = "https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3", size = 5027150, upload-time = "2026-03-06T13:47:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/2e/fd/301739083c2fc4fd89950f9bcfce75d6e14b40b0ca3d40e48a8993d1722c/h5py-3.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:314b6054fe0b1051c2b0cb2df5cbdab15622fb05e80f202e3b6a5eee0d6fe365", size = 4814544, upload-time = "2026-03-06T13:47:56.893Z" }, + { url = "https://files.pythonhosted.org/packages/4c/42/2193ed41ccee78baba8fcc0cff2c925b8b9ee3793305b23e1f22c20bf4c7/h5py-3.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ffbab2fedd6581f6aa31cf1639ca2cb86e02779de525667892ebf4cc9fd26434", size = 5034013, upload-time = "2026-03-06T13:47:59.01Z" }, + { url = "https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:17d1f1630f92ad74494a9a7392ab25982ce2b469fc62da6074c0ce48366a2999", size = 3191673, upload-time = "2026-03-06T13:48:00.626Z" }, + { url = "https://files.pythonhosted.org/packages/f2/48/239cbe352ac4f2b8243a8e620fa1a2034635f633731493a7ff1ed71e8658/h5py-3.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b9c49dd58dc44cf70af944784e2c2038b6f799665d0dcbbc812a26e0faa859", size = 2673834, upload-time = "2026-03-06T13:48:02.579Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c0/5d4119dba94093bbafede500d3defd2f5eab7897732998c04b54021e530b/h5py-3.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d", size = 3685604, upload-time = "2026-03-06T13:48:04.198Z" }, + { url = "https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d", size = 3061940, upload-time = "2026-03-06T13:48:05.783Z" }, + { url = "https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527", size = 5198852, upload-time = "2026-03-06T13:48:07.482Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e", size = 5405250, upload-time = "2026-03-06T13:48:09.628Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/9790c1655eabeb85b92b1ecab7d7e62a2069e53baefd58c98f0909c7a948/h5py-3.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794", size = 5190108, upload-time = "2026-03-06T13:48:11.26Z" }, + { url = "https://files.pythonhosted.org/packages/51/d7/ab693274f1bd7e8c5f9fdd6c7003a88d59bedeaf8752716a55f532924fbb/h5py-3.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074", size = 5419216, upload-time = "2026-03-06T13:48:13.322Z" }, + { url = "https://files.pythonhosted.org/packages/03/c1/0976b235cf29ead553e22f2fb6385a8252b533715e00d0ae52ed7b900582/h5py-3.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6", size = 3182868, upload-time = "2026-03-06T13:48:15.759Z" }, + { url = "https://files.pythonhosted.org/packages/14/d9/866b7e570b39070f92d47b0ff1800f0f8239b6f9e45f02363d7112336c1f/h5py-3.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:39c2838fb1e8d97bcf1755e60ad1f3dd76a7b2a475928dc321672752678b96db", size = 2653286, upload-time = "2026-03-06T13:48:17.279Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9e/6142ebfda0cb6e9349c091eae73c2e01a770b7659255248d637bec54a88b/h5py-3.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:370a845f432c2c9619db8eed334d1e610c6015796122b0e57aa46312c22617d9", size = 3671808, upload-time = "2026-03-06T13:48:19.737Z" }, + { url = "https://files.pythonhosted.org/packages/b0/65/5e088a45d0f43cd814bc5bec521c051d42005a472e804b1a36c48dada09b/h5py-3.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42108e93326c50c2810025aade9eac9d6827524cdccc7d4b75a546e5ab308edb", size = 3045837, upload-time = "2026-03-06T13:48:21.854Z" }, + { url = "https://files.pythonhosted.org/packages/da/1e/6172269e18cc5a484e2913ced33339aad588e02ba407fafd00d369e22ef3/h5py-3.16.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524", size = 5193860, upload-time = "2026-03-06T13:48:24.071Z" }, + { url = "https://files.pythonhosted.org/packages/bd/98/ef2b6fe2903e377cbe870c3b2800d62552f1e3dbe81ce49e1923c53d1c5c/h5py-3.16.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402", size = 5400417, upload-time = "2026-03-06T13:48:25.728Z" }, + { url = "https://files.pythonhosted.org/packages/bc/81/5b62d760039eed64348c98129d17061fdfc7839fc9c04eaaad6dee1004e4/h5py-3.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7", size = 5185214, upload-time = "2026-03-06T13:48:27.436Z" }, + { url = "https://files.pythonhosted.org/packages/28/c4/532123bcd9080e250696779c927f2cb906c8bf3447df98f5ceb8dcded539/h5py-3.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff", size = 5414598, upload-time = "2026-03-06T13:48:29.49Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/a27997f84341fc0dfcdd1fe4179b6ba6c32a7aa880fdb8c514d4dad6fba3/h5py-3.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:18f2bbcd545e6991412253b98727374c356d67caa920e68dc79eab36bf5fedad", size = 3175509, upload-time = "2026-03-06T13:48:31.131Z" }, + { url = "https://files.pythonhosted.org/packages/a5/23/bb8647521d4fd770c30a76cfc6cb6a2f5495868904054e92f2394c5a78ff/h5py-3.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:656f00e4d903199a1d58df06b711cf3ca632b874b4207b7dbec86185b5c8c7d4", size = 2647362, upload-time = "2026-03-06T13:48:33.411Z" }, + { url = "https://files.pythonhosted.org/packages/48/3c/7fcd9b4c9eed82e91fb15568992561019ae7a829d1f696b2c844355d95dd/h5py-3.16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9c9d307c0ef862d1cd5714f72ecfafe0a5d7529c44845afa8de9f46e5ba8bd65", size = 3678608, upload-time = "2026-03-06T13:48:35.183Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b7/9366ed44ced9b7ef357ab48c94205280276db9d7f064aa3012a97227e966/h5py-3.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210", size = 3054773, upload-time = "2026-03-06T13:48:37.139Z" }, + { url = "https://files.pythonhosted.org/packages/58/a5/4964bc0e91e86340c2bbda83420225b2f770dcf1eb8a39464871ad769436/h5py-3.16.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965", size = 5198886, upload-time = "2026-03-06T13:48:38.879Z" }, + { url = "https://files.pythonhosted.org/packages/f1/16/d905e7f53e661ce2c24686c38048d8e2b750ffc4350009d41c4e6c6c9826/h5py-3.16.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd", size = 5404883, upload-time = "2026-03-06T13:48:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f2/58f34cb74af46d39f4cd18ea20909a8514960c5a3e5b92fd06a28161e0a8/h5py-3.16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c", size = 5192039, upload-time = "2026-03-06T13:48:43.117Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ca/934a39c24ce2e2db017268c08da0537c20fa0be7e1549be3e977313fc8f5/h5py-3.16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc", size = 5421526, upload-time = "2026-03-06T13:48:44.838Z" }, + { url = "https://files.pythonhosted.org/packages/3e/14/615a450205e1b56d16c6783f5ccd116cde05550faad70ae077c955654a75/h5py-3.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:fa48993a0b799737ba7fd21e2350fa0a60701e58180fae9f2de834bc39a147ab", size = 3183263, upload-time = "2026-03-06T13:48:47.117Z" }, + { url = "https://files.pythonhosted.org/packages/7b/48/a6faef5ed632cae0c65ac6b214a6614a0b510c3183532c521bdb0055e117/h5py-3.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:1897a771a7f40d05c262fc8f37376ec37873218544b70216872876c627640f63", size = 2663450, upload-time = "2026-03-06T13:48:48.707Z" }, + { url = "https://files.pythonhosted.org/packages/5d/32/0c8bb8aedb62c772cf7c1d427c7d1951477e8c2835f872bc0a13d1f85f86/h5py-3.16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:15922e485844f77c0b9d275396d435db3baa58292a9c2176a386e072e0cf2491", size = 3760693, upload-time = "2026-03-06T13:48:50.453Z" }, + { url = "https://files.pythonhosted.org/packages/1d/1f/fcc5977d32d6387c5c9a694afee716a5e20658ac08b3ff24fdec79fb05f2/h5py-3.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:df02dd29bd247f98674634dfe41f89fd7c16ba3d7de8695ec958f58404a4e618", size = 3181305, upload-time = "2026-03-06T13:48:52.221Z" }, + { url = "https://files.pythonhosted.org/packages/f5/a1/af87f64b9f986889884243643621ebbd4ac72472ba8ec8cec891ac8e2ca1/h5py-3.16.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242", size = 5074061, upload-time = "2026-03-06T13:48:54.089Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d0/146f5eaff3dc246a9c7f6e5e4f42bd45cc613bce16693bcd4d1f7c958bf5/h5py-3.16.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16", size = 5279216, upload-time = "2026-03-06T13:48:56.75Z" }, + { url = "https://files.pythonhosted.org/packages/a1/9d/12a13424f1e604fc7df9497b73c0356fb78c2fb206abd7465ce47226e8fd/h5py-3.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7", size = 5070068, upload-time = "2026-03-06T13:48:59.169Z" }, + { url = "https://files.pythonhosted.org/packages/41/8c/bbe98f813722b4873818a8db3e15aa3e625b59278566905ac439725e8070/h5py-3.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725", size = 5300253, upload-time = "2026-03-06T13:49:02.033Z" }, + { url = "https://files.pythonhosted.org/packages/32/9e/87e6705b4d6890e7cecdf876e2a7d3e40654a2ae37482d79a6f1b87f7b92/h5py-3.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4c6ab014ab704b4feaa719ae783b86522ed0bf1f82184704ed3c9e4e3228796e", size = 3381671, upload-time = "2026-03-06T13:49:04.351Z" }, + { url = "https://files.pythonhosted.org/packages/96/91/9fad90cfc5f9b2489c7c26ad897157bce82f0e9534a986a221b99760b23b/h5py-3.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:faca8fb4e4319c09d83337adc80b2ca7d5c5a343c2d6f1b6388f32cfecca13c1", size = 2740706, upload-time = "2026-03-06T13:49:06.347Z" }, ] [[package]] @@ -682,20 +696,20 @@ wheels = [ [[package]] name = "identify" -version = "2.6.16" +version = "2.6.19" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5b/8d/e8b97e6bd3fb6fb271346f7981362f1e04d6a7463abd0de79e1fda17c067/identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980", size = 99360, upload-time = "2026-01-12T18:58:58.201Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/58/40fbbcefeda82364720eba5cf2270f98496bdfa19ea75b4cccae79c698e6/identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0", size = 99202, upload-time = "2026-01-12T18:58:56.627Z" }, + { 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.11" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +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/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, + { 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]] @@ -709,7 +723,7 @@ wheels = [ [[package]] name = "ipython" -version = "9.10.0" +version = "9.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -719,14 +733,15 @@ dependencies = [ { 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/a6/60/2111715ea11f39b1535bed6024b7dec7918b71e5e5d30855a5b503056b50/ipython-9.10.0.tar.gz", hash = "sha256:cd9e656be97618a0676d058134cd44e6dc7012c0e5cb36a9ce96a8c904adaf77", size = 4426526, upload-time = "2026-02-02T10:00:33.594Z" } +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/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl", hash = "sha256:c6ab68cc23bba8c7e18e9b932797014cc61ea7fd6f19de180ab9ba73e65ee58d", size = 622774, upload-time = "2026-02-02T10:00:31.503Z" }, + { 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]] @@ -759,14 +774,14 @@ wheels = [ [[package]] name = "jedi" -version = "0.19.2" +version = "0.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +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/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, + { 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]] @@ -814,116 +829,136 @@ wheels = [ [[package]] name = "kiwisolver" -version = "1.4.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, - { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, - { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, - { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, - { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, - { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, - { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, - { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, - { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, - { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, - { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, - { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, - { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, - { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, - { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, - { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, - { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, - { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, - { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, - { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, - { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, - { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, - { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, - { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, - { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, - { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, - { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, - { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, - { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, - { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, - { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, - { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, - { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, - { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, - { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, - { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, - { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, - { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, - { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, - { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, - { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, - { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, - { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, - { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, - { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, - { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, - { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, - { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, - { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, - { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, - { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, - { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, - { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, - { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, - { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, - { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, - { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, - { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, - { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, - { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/dd/a495a9c104be1c476f0386e714252caf2b7eca883915422a64c50b88c6f5/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c", size = 122798, upload-time = "2026-03-09T13:12:58.963Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb", size = 66216, upload-time = "2026-03-09T13:13:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac", size = 63911, upload-time = "2026-03-09T13:13:01.671Z" }, + { url = "https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27", size = 1438209, upload-time = "2026-03-09T13:13:03.385Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/76621246f5165e5372f02f5e6f3f48ea336a8f9e96e43997d45b240ed8cd/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398", size = 1248888, upload-time = "2026-03-09T13:13:05.231Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c1/31559ec6fb39a5b48035ce29bb63ade628f321785f38c384dee3e2c08bc1/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db", size = 1266304, upload-time = "2026-03-09T13:13:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ef/1cb8276f2d29cc6a41e0a042f27946ca347d3a4a75acf85d0a16aa6dcc82/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc", size = 1319650, upload-time = "2026-03-09T13:13:08.607Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/5ba3cecd7ce6236ae4a80f67e5d5531287337d0e1f076ca87a5abe4cd5d0/kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679", size = 970949, upload-time = "2026-03-09T13:13:10.299Z" }, + { url = "https://files.pythonhosted.org/packages/5a/69/dc61f7ae9a2f071f26004ced87f078235b5507ab6e5acd78f40365655034/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309", size = 2199125, upload-time = "2026-03-09T13:13:11.841Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7b/abbe0f1b5afa85f8d084b73e90e5f801c0939eba16ac2e49af7c61a6c28d/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2", size = 2293783, upload-time = "2026-03-09T13:13:14.399Z" }, + { url = "https://files.pythonhosted.org/packages/8a/80/5908ae149d96d81580d604c7f8aefd0e98f4fd728cf172f477e9f2a81744/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c", size = 1960726, upload-time = "2026-03-09T13:13:16.047Z" }, + { url = "https://files.pythonhosted.org/packages/84/08/a78cb776f8c085b7143142ce479859cfec086bd09ee638a317040b6ef420/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08", size = 2464738, upload-time = "2026-03-09T13:13:17.897Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e1/65584da5356ed6cb12c63791a10b208860ac40a83de165cb6a6751a686e3/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4", size = 2270718, upload-time = "2026-03-09T13:13:19.421Z" }, + { url = "https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b", size = 73480, upload-time = "2026-03-09T13:13:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0e/2ee5debc4f77a625778fec5501ff3e8036fe361b7ee28ae402a485bb9694/kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac", size = 64930, upload-time = "2026-03-09T13:13:21.997Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, + { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, + { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, + { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, + { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, + { url = "https://files.pythonhosted.org/packages/e9/eb/5fcbbbf9a0e2c3a35effb88831a483345326bbc3a030a3b5b69aee647f84/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232", size = 59532, upload-time = "2026-03-09T13:15:47.047Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9b/e17104555bb4db148fd52327feea1e96be4b88e8e008b029002c281a21ab/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a", size = 57420, upload-time = "2026-03-09T13:15:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/48/44/2b5b95b7aa39fb2d8d9d956e0f3d5d45aef2ae1d942d4c3ffac2f9cfed1a/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737", size = 79892, upload-time = "2026-03-09T13:15:49.694Z" }, + { url = "https://files.pythonhosted.org/packages/52/7d/7157f9bba6b455cfb4632ed411e199fc8b8977642c2b12082e1bd9e6d173/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16", size = 77603, upload-time = "2026-03-09T13:15:50.945Z" }, + { 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.46.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz", hash = "sha256:227c9fd6d09dce2783c18b754b7cd9d9b3b3515210c46acc2d3c5badd9870ceb", size = 193456, upload-time = "2025-12-08T18:15:36.295Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82f3d39b16f19aa1a56d5fe625883a6ab600d5cc9ea8906cca70ce94cabba067", size = 37232766, upload-time = "2025-12-08T18:14:48.836Z" }, - { url = "https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a3df43900119803bbc52720e758c76f316a9a0f34612a886862dfe0a5591a17e", size = 56275175, upload-time = "2025-12-08T18:14:51.604Z" }, - { url = "https://files.pythonhosted.org/packages/38/f2/ed806f9c003563732da156139c45d970ee435bd0bfa5ed8de87ba972b452/llvmlite-0.46.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de183fefc8022d21b0aa37fc3e90410bc3524aed8617f0ff76732fc6c3af5361", size = 55128630, upload-time = "2025-12-08T18:14:55.107Z" }, - { url = "https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8b10bc585c58bdffec9e0c309bb7d51be1f2f15e169a4b4d42f2389e431eb93", size = 38138652, upload-time = "2025-12-08T18:14:58.171Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f8/4db016a5e547d4e054ff2f3b99203d63a497465f81ab78ec8eb2ff7b2304/llvmlite-0.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b9588ad4c63b4f0175a3984b85494f0c927c6b001e3a246a3a7fb3920d9a137", size = 37232767, upload-time = "2025-12-08T18:15:00.737Z" }, - { url = "https://files.pythonhosted.org/packages/aa/85/4890a7c14b4fa54400945cb52ac3cd88545bbdb973c440f98ca41591cdc5/llvmlite-0.46.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3535bd2bb6a2d7ae4012681ac228e5132cdb75fefb1bcb24e33f2f3e0c865ed4", size = 56275176, upload-time = "2025-12-08T18:15:03.936Z" }, - { url = "https://files.pythonhosted.org/packages/6a/07/3d31d39c1a1a08cd5337e78299fca77e6aebc07c059fbd0033e3edfab45c/llvmlite-0.46.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cbfd366e60ff87ea6cc62f50bc4cd800ebb13ed4c149466f50cf2163a473d1e", size = 55128630, upload-time = "2025-12-08T18:15:07.196Z" }, - { url = "https://files.pythonhosted.org/packages/2a/6b/d139535d7590a1bba1ceb68751bef22fadaa5b815bbdf0e858e3875726b2/llvmlite-0.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:398b39db462c39563a97b912d4f2866cd37cba60537975a09679b28fbbc0fb38", size = 38138940, upload-time = "2025-12-08T18:15:10.162Z" }, - { url = "https://files.pythonhosted.org/packages/e6/ff/3eba7eb0aed4b6fca37125387cd417e8c458e750621fce56d2c541f67fa8/llvmlite-0.46.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:30b60892d034bc560e0ec6654737aaa74e5ca327bd8114d82136aa071d611172", size = 37232767, upload-time = "2025-12-08T18:15:13.22Z" }, - { url = "https://files.pythonhosted.org/packages/0e/54/737755c0a91558364b9200702c3c9c15d70ed63f9b98a2c32f1c2aa1f3ba/llvmlite-0.46.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6cc19b051753368a9c9f31dc041299059ee91aceec81bd57b0e385e5d5bf1a54", size = 56275176, upload-time = "2025-12-08T18:15:16.339Z" }, - { url = "https://files.pythonhosted.org/packages/e6/91/14f32e1d70905c1c0aa4e6609ab5d705c3183116ca02ac6df2091868413a/llvmlite-0.46.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bca185892908f9ede48c0acd547fe4dc1bafefb8a4967d47db6cf664f9332d12", size = 55128629, upload-time = "2025-12-08T18:15:19.493Z" }, - { url = "https://files.pythonhosted.org/packages/4a/a7/d526ae86708cea531935ae777b6dbcabe7db52718e6401e0fb9c5edea80e/llvmlite-0.46.0-cp313-cp313-win_amd64.whl", hash = "sha256:67438fd30e12349ebb054d86a5a1a57fd5e87d264d2451bcfafbbbaa25b82a35", size = 38138941, upload-time = "2025-12-08T18:15:22.536Z" }, - { url = "https://files.pythonhosted.org/packages/95/ae/af0ffb724814cc2ea64445acad05f71cff5f799bb7efb22e47ee99340dbc/llvmlite-0.46.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:d252edfb9f4ac1fcf20652258e3f102b26b03eef738dc8a6ffdab7d7d341d547", size = 37232768, upload-time = "2025-12-08T18:15:25.055Z" }, - { url = "https://files.pythonhosted.org/packages/c9/19/5018e5352019be753b7b07f7759cdabb69ca5779fea2494be8839270df4c/llvmlite-0.46.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:379fdd1c59badeff8982cb47e4694a6143bec3bb49aa10a466e095410522064d", size = 56275173, upload-time = "2025-12-08T18:15:28.109Z" }, - { url = "https://files.pythonhosted.org/packages/9f/c9/d57877759d707e84c082163c543853245f91b70c804115a5010532890f18/llvmlite-0.46.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e8cbfff7f6db0fa2c771ad24154e2a7e457c2444d7673e6de06b8b698c3b269", size = 55128628, upload-time = "2025-12-08T18:15:31.098Z" }, - { url = "https://files.pythonhosted.org/packages/30/a8/e61a8c2b3cc7a597073d9cde1fcbb567e9d827f1db30c93cf80422eac70d/llvmlite-0.46.0-cp314-cp314-win_amd64.whl", hash = "sha256:7821eda3ec1f18050f981819756631d60b6d7ab1a6cf806d9efefbe3f4082d61", size = 39153056, upload-time = "2025-12-08T18:15:33.938Z" }, +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]] @@ -944,104 +979,104 @@ wheels = [ [[package]] name = "lxml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365, upload-time = "2025-09-22T04:00:45.672Z" }, - { url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793, upload-time = "2025-09-22T04:00:47.783Z" }, - { url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362, upload-time = "2025-09-22T04:00:49.845Z" }, - { url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152, upload-time = "2025-09-22T04:00:51.709Z" }, - { url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539, upload-time = "2025-09-22T04:00:53.593Z" }, - { url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853, upload-time = "2025-09-22T04:00:55.524Z" }, - { url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133, upload-time = "2025-09-22T04:00:57.269Z" }, - { url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944, upload-time = "2025-09-22T04:00:59.052Z" }, - { url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535, upload-time = "2025-09-22T04:01:01.335Z" }, - { url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343, upload-time = "2025-09-22T04:01:03.13Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419, upload-time = "2025-09-22T04:01:05.013Z" }, - { url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008, upload-time = "2025-09-22T04:01:07.327Z" }, - { url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906, upload-time = "2025-09-22T04:01:09.452Z" }, - { url = "https://files.pythonhosted.org/packages/2d/d9/5be3a6ab2784cdf9accb0703b65e1b64fcdd9311c9f007630c7db0cfcce1/lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46", size = 3610357, upload-time = "2025-09-22T04:01:11.102Z" }, - { url = "https://files.pythonhosted.org/packages/e2/7d/ca6fb13349b473d5732fb0ee3eec8f6c80fc0688e76b7d79c1008481bf1f/lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078", size = 4036583, upload-time = "2025-09-22T04:01:12.766Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a2/51363b5ecd3eab46563645f3a2c3836a2fc67d01a1b87c5017040f39f567/lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285", size = 3680591, upload-time = "2025-09-22T04:01:14.874Z" }, - { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, - { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, - { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, - { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, - { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, - { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, - { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, - { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, - { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, - { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, - { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, - { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, - { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, - { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, - { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, - { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, - { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, - { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, - { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, - { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, - { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, - { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, - { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, - { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, - { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, - { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, - { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, - { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, - { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, - { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, - { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, - { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, - { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, - { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, - { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, - { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, - { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, - { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, - { url = "https://files.pythonhosted.org/packages/0b/11/29d08bc103a62c0eba8016e7ed5aeebbf1e4312e83b0b1648dd203b0e87d/lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700", size = 3949829, upload-time = "2025-09-22T04:04:45.608Z" }, - { url = "https://files.pythonhosted.org/packages/12/b3/52ab9a3b31e5ab8238da241baa19eec44d2ab426532441ee607165aebb52/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee", size = 4226277, upload-time = "2025-09-22T04:04:47.754Z" }, - { url = "https://files.pythonhosted.org/packages/a0/33/1eaf780c1baad88224611df13b1c2a9dfa460b526cacfe769103ff50d845/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f", size = 4330433, upload-time = "2025-09-22T04:04:49.907Z" }, - { url = "https://files.pythonhosted.org/packages/7a/c1/27428a2ff348e994ab4f8777d3a0ad510b6b92d37718e5887d2da99952a2/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9", size = 4272119, upload-time = "2025-09-22T04:04:51.801Z" }, - { url = "https://files.pythonhosted.org/packages/f0/d0/3020fa12bcec4ab62f97aab026d57c2f0cfd480a558758d9ca233bb6a79d/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a", size = 4417314, upload-time = "2025-09-22T04:04:55.024Z" }, - { url = "https://files.pythonhosted.org/packages/6c/77/d7f491cbc05303ac6801651aabeb262d43f319288c1ea96c66b1d2692ff3/lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e", size = 3518768, upload-time = "2025-09-22T04:04:57.097Z" }, +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/28/30/9abc9e34c657c33834eaf6cd02124c61bdf5944d802aa48e69be8da3585d/lxml-6.1.0.tar.gz", hash = "sha256:bfd57d8008c4965709a919c3e9a98f76c2c7cb319086b3d26858250620023b13", size = 4197006, upload-time = "2026-04-18T04:32:51.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/5d/3bccad330292946f97962df9d5f2d3ae129cce6e212732a781e856b91e07/lxml-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cec05be8c876f92a5aa07b01d60bbb4d11cfbdd654cad0561c0d7b5c043a61b9", size = 8526232, upload-time = "2026-04-18T04:27:40.389Z" }, + { url = "https://files.pythonhosted.org/packages/a7/51/adc8826570a112f83bb4ddb3a2ab510bbc2ccd62c1b9fe1f34fae2d90b57/lxml-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03e048b6ce8e77b09c734e931584894ecd58d08296804ca2d0b184c933ce50", size = 4595448, upload-time = "2026-04-18T04:27:44.208Z" }, + { url = "https://files.pythonhosted.org/packages/54/84/5a9ec07cbe1d2334a6465f863b949a520d2699a755738986dcd3b6b89e3f/lxml-6.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:942454ff253da14218f972b23dc72fa4edf6c943f37edd19cd697618b626fac5", size = 4923771, upload-time = "2026-04-18T04:32:17.402Z" }, + { url = "https://files.pythonhosted.org/packages/a7/23/851cfa33b6b38adb628e45ad51fb27105fa34b2b3ba9d1d4aa7a9428dfe0/lxml-6.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d036ee7b99d5148072ac7c9b847193decdfeac633db350363f7bce4fff108f0e", size = 5068101, upload-time = "2026-04-18T04:32:21.437Z" }, + { url = "https://files.pythonhosted.org/packages/b0/38/41bf99c2023c6b79916ba057d83e9db21d642f473cac210201222882d38b/lxml-6.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ae5d8d5427f3cc317e7950f2da7ad276df0cfa37b8de2f5658959e618ea8512", size = 5002573, upload-time = "2026-04-18T04:32:25.373Z" }, + { url = "https://files.pythonhosted.org/packages/c2/20/053aa10bdc39747e1e923ce2d45413075e84f70a136045bb09e5eaca41d3/lxml-6.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:363e47283bde87051b821826e71dde47f107e08614e1aa312ba0c5711e77738c", size = 5202816, upload-time = "2026-04-18T04:32:29.393Z" }, + { url = "https://files.pythonhosted.org/packages/9a/da/bc710fad8bf04b93baee752c192eaa2210cd3a84f969d0be7830fea55802/lxml-6.1.0-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:f504d861d9f2a8f94020130adac88d66de93841707a23a86244263d1e54682f5", size = 5329999, upload-time = "2026-04-18T04:32:34.019Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/bf035dedbdf7fab49411aa52e4236f3445e98d38647d85419e6c0d2806b9/lxml-6.1.0-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:23a5dc68e08ed13331d61815c08f260f46b4a60fdd1640bbeb82cf89a9d90289", size = 4659643, upload-time = "2026-04-18T04:32:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4f/22be31f33727a5e4c7b01b0a874503026e50329b259d3587e0b923cf964b/lxml-6.1.0-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f15401d8d3dbf239e23c818afc10c7207f7b95f9a307e092122b6f86dd43209a", size = 5265963, upload-time = "2026-04-18T04:32:41.881Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2b/d44d0e5c79226017f4ab8c87a802ebe4f89f97e6585a8e4166dffcdd7b6e/lxml-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fcf3da95e93349e0647d48d4b36a12783105bcc74cb0c416952f9988410846a3", size = 5045444, upload-time = "2026-04-18T04:32:44.512Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c3/3f034fec1594c331a6dbf9491238fdcc9d66f68cc529e109ec75b97197e1/lxml-6.1.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:0d082495c5fcf426e425a6e28daaba1fcb6d8f854a4ff01effb1f1f381203eb9", size = 4712703, upload-time = "2026-04-18T04:32:47.16Z" }, + { url = "https://files.pythonhosted.org/packages/12/16/0b83fccc158218aca75a7aa33e97441df737950734246b9fffa39301603d/lxml-6.1.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:e3c4f84b24a1fcba435157d111c4b755099c6ff00a3daee1ad281817de75ed11", size = 5252745, upload-time = "2026-04-18T04:32:50.427Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ee/12e6c1b39a77666c02eaa77f94a870aaf63c4ac3a497b2d52319448b01c6/lxml-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:976a6b39b1b13e8c354ad8d3f261f3a4ac6609518af91bdb5094760a08f132c4", size = 5226822, upload-time = "2026-04-18T04:32:53.437Z" }, + { url = "https://files.pythonhosted.org/packages/34/20/c7852904858b4723af01d2fc14b5d38ff57cb92f01934a127ebd9a9e51aa/lxml-6.1.0-cp311-cp311-win32.whl", hash = "sha256:857efde87d365706590847b916baff69c0bc9252dc5af030e378c9800c0b10e3", size = 3594026, upload-time = "2026-04-18T04:27:31.903Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/d60c732b56da5085175c07c74b2df4e6d181b0c9a61e1691474f06ef4b39/lxml-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:183bfb45a493081943be7ea2b5adfc2b611e1cf377cefa8b8a8be404f45ef9a7", size = 4025114, upload-time = "2026-04-18T04:27:34.077Z" }, + { url = "https://files.pythonhosted.org/packages/c2/df/c84dcc175fd690823436d15b41cb920cd5ba5e14cd8bfb00949d5903b320/lxml-6.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:19f4164243fc206d12ed3d866e80e74f5bc3627966520da1a5f97e42c32a3f39", size = 3667742, upload-time = "2026-04-18T04:27:38.45Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d4/9326838b59dc36dfae42eec9656b97520f9997eee1de47b8316aaeed169c/lxml-6.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d2f17a16cd8751e8eb233a7e41aecdf8e511712e00088bf9be455f604cd0d28d", size = 8570663, upload-time = "2026-04-18T04:27:48.253Z" }, + { url = "https://files.pythonhosted.org/packages/d8/a4/053745ce1f8303ccbb788b86c0db3a91b973675cefc42566a188637b7c40/lxml-6.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0cea5b1d3e6e77d71bd2b9972eb2446221a69dc52bb0b9c3c6f6e5700592d93", size = 4624024, upload-time = "2026-04-18T04:27:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/90/97/a517944b20f8fd0932ad2109482bee4e29fe721416387a363306667941f6/lxml-6.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc46da94826188ed45cb53bd8e3fc076ae22675aea2087843d4735627f867c6d", size = 4930895, upload-time = "2026-04-18T04:32:56.29Z" }, + { url = "https://files.pythonhosted.org/packages/94/7c/e08a970727d556caa040a44773c7b7e3ad0f0d73dedc863543e9a8b931f2/lxml-6.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9147d8e386ec3b82c3b15d88927f734f565b0aaadef7def562b853adca45784a", size = 5093820, upload-time = "2026-04-18T04:32:58.94Z" }, + { url = "https://files.pythonhosted.org/packages/88/ee/2a5c2aa2c32016a226ca25d3e1056a8102ea6e1fe308bf50213586635400/lxml-6.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5715e0e28736a070f3f34a7ccc09e2fdcba0e3060abbcf61a1a5718ff6d6b105", size = 5005790, upload-time = "2026-04-18T04:33:01.272Z" }, + { url = "https://files.pythonhosted.org/packages/e3/38/a0db9be8f38ad6043ab9429487c128dd1d30f07956ef43040402f8da49e8/lxml-6.1.0-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4937460dc5df0cdd2f06a86c285c28afda06aefa3af949f9477d3e8df430c485", size = 5630827, upload-time = "2026-04-18T04:33:04.036Z" }, + { url = "https://files.pythonhosted.org/packages/31/ba/3c13d3fc24b7cacf675f808a3a1baabf43a30d0cd24c98f94548e9aa58eb/lxml-6.1.0-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc783ee3147e60a25aa0445ea82b3e8aabb83b240f2b95d32cb75587ff781814", size = 5240445, upload-time = "2026-04-18T04:33:06.87Z" }, + { url = "https://files.pythonhosted.org/packages/55/ba/eeef4ccba09b2212fe239f46c1692a98db1878e0872ae320756488878a94/lxml-6.1.0-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:40d9189f80075f2e1f88db21ef815a2b17b28adf8e50aaf5c789bfe737027f32", size = 5350121, upload-time = "2026-04-18T04:33:09.365Z" }, + { url = "https://files.pythonhosted.org/packages/7e/01/1da87c7b587c38d0cbe77a01aae3b9c1c49ed47d76918ef3db8fc151b1ca/lxml-6.1.0-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:05b9b8787e35bec69e68daf4952b2e6dfcfb0db7ecf1a06f8cdfbbac4eb71aad", size = 4694949, upload-time = "2026-04-18T04:33:11.628Z" }, + { url = "https://files.pythonhosted.org/packages/a1/88/7db0fe66d5aaf128443ee1623dec3db1576f3e4c17751ec0ef5866468590/lxml-6.1.0-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0f08beb0182e3e9a86fae124b3c47a7b41b7b69b225e1377db983802404e54", size = 5243901, upload-time = "2026-04-18T04:33:13.95Z" }, + { url = "https://files.pythonhosted.org/packages/00/a8/1346726af7d1f6fca1f11223ba34001462b0a3660416986d37641708d57c/lxml-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73becf6d8c81d4c76b1014dbd3584cb26d904492dcf73ca85dc8bff08dcd6d2d", size = 5048054, upload-time = "2026-04-18T04:33:16.965Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b7/85057012f035d1a0c87e02f8c723ca3c3e6e0728bcf4cb62080b21b1c1e3/lxml-6.1.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1ae225f66e5938f4fa29d37e009a3bb3b13032ac57eb4eb42afa44f6e4054e69", size = 4777324, upload-time = "2026-04-18T04:33:19.832Z" }, + { url = "https://files.pythonhosted.org/packages/75/6c/ad2f94a91073ef570f33718040e8e160d5fb93331cf1ab3ca1323f939e2d/lxml-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:690022c7fae793b0489aa68a658822cea83e0d5933781811cabbf5ea3bcfe73d", size = 5645702, upload-time = "2026-04-18T04:33:22.436Z" }, + { url = "https://files.pythonhosted.org/packages/3b/89/0bb6c0bd549c19004c60eea9dc554dd78fd647b72314ef25d460e0d208c6/lxml-6.1.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:63aeafc26aac0be8aff14af7871249e87ea1319be92090bfd632ec68e03b16a5", size = 5232901, upload-time = "2026-04-18T04:33:26.21Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d9/d609a11fb567da9399f525193e2b49847b5a409cdebe737f06a8b7126bdc/lxml-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:264c605ab9c0e4aa1a679636f4582c4d3313700009fac3ec9c3412ed0d8f3e1d", size = 5261333, upload-time = "2026-04-18T04:33:28.984Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3a/ac3f99ec8ac93089e7dd556f279e0d14c24de0a74a507e143a2e4b496e7c/lxml-6.1.0-cp312-cp312-win32.whl", hash = "sha256:56971379bc5ee8037c5a0f09fa88f66cdb7d37c3e38af3e45cf539f41131ac1f", size = 3596289, upload-time = "2026-04-18T04:27:42.819Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a7/0a915557538593cb1bbeedcd40e13c7a261822c26fecbbdb71dad0c2f540/lxml-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:bba078de0031c219e5dd06cf3e6bf8fb8e6e64a77819b358f53bb132e3e03366", size = 3997059, upload-time = "2026-04-18T04:27:46.764Z" }, + { url = "https://files.pythonhosted.org/packages/92/96/a5dc078cf0126fbfbc35611d77ecd5da80054b5893e28fb213a5613b9e1d/lxml-6.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:c3592631e652afa34999a088f98ba7dfc7d6aff0d535c410bea77a71743f3819", size = 3659552, upload-time = "2026-04-18T04:27:51.133Z" }, + { url = "https://files.pythonhosted.org/packages/08/03/69347590f1cf4a6d5a4944bb6099e6d37f334784f16062234e1f892fdb1d/lxml-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0092f2b107b69601adf562a57c956fbb596e05e3e6651cabd3054113b007e45", size = 8559689, upload-time = "2026-04-18T04:31:57.785Z" }, + { url = "https://files.pythonhosted.org/packages/3f/58/25e00bb40b185c974cfe156c110474d9a8a8390d5f7c92a4e328189bb60e/lxml-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fc7140d7a7386e6b545d41b7358f4d02b656d4053f5fa6859f92f4b9c2572c4d", size = 4617892, upload-time = "2026-04-18T04:32:01.78Z" }, + { url = "https://files.pythonhosted.org/packages/f5/54/92ad98a94ac318dc4f97aaac22ff8d1b94212b2ae8af5b6e9b354bf825f7/lxml-6.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:419c58fc92cc3a2c3fa5f78c63dbf5da70c1fa9c1b25f25727ecee89a96c7de2", size = 4923489, upload-time = "2026-04-18T04:33:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/15/3b/a20aecfab42bdf4f9b390590d345857ad3ffd7c51988d1c89c53a0c73faf/lxml-6.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:37fabd1452852636cf38ecdcc9dd5ca4bba7a35d6c53fa09725deeb894a87491", size = 5082162, upload-time = "2026-04-18T04:33:34.262Z" }, + { url = "https://files.pythonhosted.org/packages/45/26/2cdb3d281ac1bd175603e290cbe4bad6eff127c0f8de90bafd6f8548f0fd/lxml-6.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2853c8b2170cc6cd54a6b4d50d2c1a8a7aeca201f23804b4898525c7a152cfc", size = 4993247, upload-time = "2026-04-18T04:33:36.674Z" }, + { url = "https://files.pythonhosted.org/packages/f6/05/d735aef963740022a08185c84821f689fc903acb3d50326e6b1e9886cc22/lxml-6.1.0-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8e369cbd690e788c8d15e56222d91a09c6a417f49cbc543040cba0fe2e25a79e", size = 5613042, upload-time = "2026-04-18T04:33:39.205Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b8/ead7c10efff731738c72e59ed6eb5791854879fbed7ae98781a12006263a/lxml-6.1.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e69aa6805905807186eb00e66c6d97a935c928275182eb02ee40ba00da9623b2", size = 5228304, upload-time = "2026-04-18T04:33:41.647Z" }, + { url = "https://files.pythonhosted.org/packages/6b/10/e9842d2ec322ea65f0a7270aa0315a53abed06058b88ef1b027f620e7a5f/lxml-6.1.0-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:4bd1bdb8a9e0e2dd229de19b5f8aebac80e916921b4b2c6ef8a52bc131d0c1f9", size = 5341578, upload-time = "2026-04-18T04:33:44.596Z" }, + { url = "https://files.pythonhosted.org/packages/89/54/40d9403d7c2775fa7301d3ddd3464689bfe9ba71acc17dfff777071b4fdc/lxml-6.1.0-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:cbd7b79cdcb4986ad78a2662625882747f09db5e4cd7b2ae178a88c9c51b3dfe", size = 4700209, upload-time = "2026-04-18T04:33:47.552Z" }, + { url = "https://files.pythonhosted.org/packages/85/b2/bbdcc2cf45dfc7dfffef4fd97e5c47b15919b6a365247d95d6f684ef5e82/lxml-6.1.0-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:43e4d297f11080ec9d64a4b1ad7ac02b4484c9f0e2179d9c4ef78e886e747b88", size = 5232365, upload-time = "2026-04-18T04:33:50.249Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/b06875665e53aaba7127611a7bed3b7b9658e20b22bc2dd217a0b7ab0091/lxml-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cc16682cc987a3da00aa56a3aa3075b08edb10d9b1e476938cfdbee8f3b67181", size = 5043654, upload-time = "2026-04-18T04:33:52.71Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9c/e71a069d09641c1a7abeb30e693f828c7c90a41cbe3d650b2d734d876f85/lxml-6.1.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d6d8efe71429635f0559579092bb5e60560d7b9115ee38c4adbea35632e7fa24", size = 4769326, upload-time = "2026-04-18T04:33:55.244Z" }, + { url = "https://files.pythonhosted.org/packages/cc/06/7a9cd84b3d4ed79adf35f874750abb697dec0b4a81a836037b36e47c091a/lxml-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e39ab3a28af7784e206d8606ec0e4bcad0190f63a492bca95e94e5a4aef7f6e", size = 5635879, upload-time = "2026-04-18T04:33:58.509Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f0/9d57916befc1e54c451712c7ee48e9e74e80ae4d03bdce49914e0aee42cd/lxml-6.1.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9eb667bf50856c4a58145f8ca2d5e5be160191e79eb9e30855a476191b3c3495", size = 5224048, upload-time = "2026-04-18T04:34:00.943Z" }, + { url = "https://files.pythonhosted.org/packages/99/75/90c4eefda0c08c92221fe0753db2d6699a4c628f76ff4465ec20dea84cc1/lxml-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7f4a77d6f7edf9230cee3e1f7f6764722a41604ee5681844f18db9a81ea0ec33", size = 5250241, upload-time = "2026-04-18T04:34:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/5e/73/16596f7e4e38fa33084b9ccbccc22a15f82a290a055126f2c1541236d2ff/lxml-6.1.0-cp313-cp313-win32.whl", hash = "sha256:28902146ffbe5222df411c5d19e5352490122e14447e98cd118907ee3fd6ee62", size = 3596938, upload-time = "2026-04-18T04:31:56.206Z" }, + { url = "https://files.pythonhosted.org/packages/8e/63/981401c5680c1eb30893f00a19641ac80db5d1e7086c62cb4b13ed813038/lxml-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:4a1503c56e4e2b38dc76f2f2da7bae69670c0f1933e27cfa34b2fa5876410b16", size = 3995728, upload-time = "2026-04-18T04:31:58.763Z" }, + { url = "https://files.pythonhosted.org/packages/e7/e8/c358a38ac3e541d16a1b527e4e9cb78c0419b0506a070ace11777e5e8404/lxml-6.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:e0af85773850417d994d019741239b901b22c6680206f46a34766926e466141d", size = 3658372, upload-time = "2026-04-18T04:32:03.629Z" }, + { url = "https://files.pythonhosted.org/packages/eb/45/cee4cf203ef0bab5c52afc118da61d6b460c928f2893d40023cfa27e0b80/lxml-6.1.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ab863fd37458fed6456525f297d21239d987800c46e67da5ef04fc6b3dd93ac8", size = 8576713, upload-time = "2026-04-18T04:32:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a7/eda05babeb7e046839204eaf254cd4d7c9130ce2bbf0d9e90ea41af5654d/lxml-6.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6fd8b1df8254ff4fd93fd31da1fc15770bde23ac045be9bb1f87425702f61cc9", size = 4623874, upload-time = "2026-04-18T04:32:10.755Z" }, + { url = "https://files.pythonhosted.org/packages/e7/e9/db5846de9b436b91890a62f29d80cd849ea17948a49bf532d5278ee69a9e/lxml-6.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:47024feaae386a92a146af0d2aeed65229bf6fff738e6a11dda6b0015fb8fd03", size = 4949535, upload-time = "2026-04-18T04:34:06.657Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ba/0d3593373dcae1d68f40dc3c41a5a92f2544e68115eb2f62319a4c2a6500/lxml-6.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3f00972f84450204cd5d93a5395965e348956aaceaadec693a22ec743f8ae3eb", size = 5086881, upload-time = "2026-04-18T04:34:09.556Z" }, + { url = "https://files.pythonhosted.org/packages/43/76/759a7484539ad1af0d125a9afe9c3fb5f82a8779fd1f5f56319d9e4ea2fd/lxml-6.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97faa0860e13b05b15a51fb4986421ef7a30f0b3334061c416e0981e9450ca4c", size = 5031305, upload-time = "2026-04-18T04:34:12.336Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b9/c1f0daf981a11e47636126901fd4ab82429e18c57aeb0fc3ad2940b42d8b/lxml-6.1.0-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:972a6451204798675407beaad97b868d0c733d9a74dafefc63120b81b8c2de28", size = 5647522, upload-time = "2026-04-18T04:34:14.89Z" }, + { url = "https://files.pythonhosted.org/packages/31/e6/1f533dcd205275363d9ba3511bcec52fa2df86abf8abe6a5f2c599f0dc31/lxml-6.1.0-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fe022f20bc4569ec66b63b3fb275a3d628d9d32da6326b2982584104db6d3086", size = 5239310, upload-time = "2026-04-18T04:34:17.652Z" }, + { url = "https://files.pythonhosted.org/packages/c3/8c/4175fb709c78a6e315ed814ed33be3defd8b8721067e70419a6cf6f971da/lxml-6.1.0-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:75c4c7c619a744f972f4451bf5adf6d0fb00992a1ffc9fd78e13b0bc817cc99f", size = 5350799, upload-time = "2026-04-18T04:34:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/6ffdebc5994975f0dde4acb59761902bd9d9bb84422b9a0bd239a7da9ca8/lxml-6.1.0-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3648f20d25102a22b6061c688beb3a805099ea4beb0a01ce62975d926944d292", size = 4697693, upload-time = "2026-04-18T04:34:23.541Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/565f36bd5c73294602d48e04d23f81ff4c8736be6ba5e1d1ec670ac9be80/lxml-6.1.0-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:77b9f99b17cbf14026d1e618035077060fc7195dd940d025149f3e2e830fbfcb", size = 5250708, upload-time = "2026-04-18T04:34:26.001Z" }, + { url = "https://files.pythonhosted.org/packages/5a/11/a68ab9dd18c5c499404deb4005f4bc4e0e88e5b72cd755ad96efec81d18d/lxml-6.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32662519149fd7a9db354175aa5e417d83485a8039b8aaa62f873ceee7ea4cad", size = 5084737, upload-time = "2026-04-18T04:34:28.32Z" }, + { url = "https://files.pythonhosted.org/packages/ab/78/e8f41e2c74f4af564e6a0348aea69fb6daaefa64bc071ef469823d22cc18/lxml-6.1.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:73d658216fc173cf2c939e90e07b941c5e12736b0bf6a99e7af95459cfe8eabb", size = 4737817, upload-time = "2026-04-18T04:34:30.784Z" }, + { url = "https://files.pythonhosted.org/packages/06/2d/aa4e117aa2ce2f3b35d9ff246be74a2f8e853baba5d2a92c64744474603a/lxml-6.1.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ac4db068889f8772a4a698c5980ec302771bb545e10c4b095d4c8be26749616f", size = 5670753, upload-time = "2026-04-18T04:34:33.675Z" }, + { url = "https://files.pythonhosted.org/packages/08/f5/dd745d50c0409031dbfcc4881740542a01e54d6f0110bd420fa7782110b8/lxml-6.1.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:45e9dfbd1b661eb64ba0d4dbe762bd210c42d86dd1e5bd2bdf89d634231beb43", size = 5238071, upload-time = "2026-04-18T04:34:36.12Z" }, + { url = "https://files.pythonhosted.org/packages/3e/74/ad424f36d0340a904665867dab310a3f1f4c96ff4039698de83b77f44c1f/lxml-6.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:89e8d73d09ac696a5ba42ec69787913d53284f12092f651506779314f10ba585", size = 5264319, upload-time = "2026-04-18T04:34:39.035Z" }, + { url = "https://files.pythonhosted.org/packages/53/36/a15d8b3514ec889bfd6aa3609107fcb6c9189f8dc347f1c0b81eded8d87c/lxml-6.1.0-cp314-cp314-win32.whl", hash = "sha256:ebe33f4ec1b2de38ceb225a1749a2965855bffeef435ba93cd2d5d540783bf2f", size = 3657139, upload-time = "2026-04-18T04:32:20.006Z" }, + { url = "https://files.pythonhosted.org/packages/1a/a4/263ebb0710851a3c6c937180a9a86df1206fdfe53cc43005aa2237fd7736/lxml-6.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:398443df51c538bd578529aa7e5f7afc6c292644174b47961f3bf87fe5741120", size = 4064195, upload-time = "2026-04-18T04:32:23.876Z" }, + { url = "https://files.pythonhosted.org/packages/80/68/2000f29d323b6c286de077ad20b429fc52272e44eae6d295467043e56012/lxml-6.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:8c8984e1d8c4b3949e419158fda14d921ff703a9ed8a47236c6eb7a2b6cb4946", size = 3741870, upload-time = "2026-04-18T04:32:27.922Z" }, + { url = "https://files.pythonhosted.org/packages/30/e9/21383c7c8d43799f0da90224c0d7c921870d476ec9b3e01e1b2c0b8237c5/lxml-6.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1081dd10bc6fa437db2500e13993abf7cc30716d0a2f40e65abb935f02ec559c", size = 8827548, upload-time = "2026-04-18T04:32:15.094Z" }, + { url = "https://files.pythonhosted.org/packages/a5/01/c6bc11cd587030dd4f719f65c5657960649fe3e19196c844c75bf32cd0d6/lxml-6.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:dabecc48db5f42ba348d1f5d5afdc54c6c4cc758e676926c7cd327045749517d", size = 4735866, upload-time = "2026-04-18T04:32:18.924Z" }, + { url = "https://files.pythonhosted.org/packages/f3/01/757132fff5f4acf25463b5298f1a46099f3a94480b806547b29ce5e385de/lxml-6.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e3dd5fe19c9e0ac818a9c7f132a5e43c1339ec1cbbfecb1a938bd3a47875b7c9", size = 4969476, upload-time = "2026-04-18T04:34:41.889Z" }, + { url = "https://files.pythonhosted.org/packages/fd/fb/1bc8b9d27ed64be7c8903db6c89e74dc8c2cd9ec630a7462e4654316dc5b/lxml-6.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9e7b0a4ca6dcc007a4cef00a761bba2dea959de4bd2df98f926b33c92ca5dfb9", size = 5103719, upload-time = "2026-04-18T04:34:44.797Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e7/5bf82fa28133536a54601aae633b14988e89ed61d4c1eb6b899b023233aa/lxml-6.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d27bbe326c6b539c64b42638b18bc6003a8d88f76213a97ac9ed4f885efeab7", size = 5027890, upload-time = "2026-04-18T04:34:47.634Z" }, + { url = "https://files.pythonhosted.org/packages/2d/20/e048db5d4b4ea0366648aa595f26bb764b2670903fc585b87436d0a5032c/lxml-6.1.0-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4e425db0c5445ef0ad56b0eec54f89b88b2d884656e536a90b2f52aecb4ca86", size = 5596008, upload-time = "2026-04-18T04:34:51.503Z" }, + { url = "https://files.pythonhosted.org/packages/9a/c2/d10807bc8da4824b39e5bd01b5d05c077b6fd01bd91584167edf6b269d22/lxml-6.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b89b098105b8599dc57adac95d1813409ac476d3c948a498775d3d0c6124bfb", size = 5224451, upload-time = "2026-04-18T04:34:54.263Z" }, + { url = "https://files.pythonhosted.org/packages/3c/15/2ebea45bea427e7f0057e9ce7b2d62c5aba20c6b001cca89ed0aadb3ad41/lxml-6.1.0-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:c4a699432846df86cc3de502ee85f445ebad748a1c6021d445f3e514d2cd4b1c", size = 5312135, upload-time = "2026-04-18T04:34:56.818Z" }, + { url = "https://files.pythonhosted.org/packages/31/e2/87eeae151b0be2a308d49a7ec444ff3eb192b14251e62addb29d0bf3778f/lxml-6.1.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:30e7b2ed63b6c8e97cca8af048589a788ab5c9c905f36d9cf1c2bb549f450d2f", size = 4639126, upload-time = "2026-04-18T04:34:59.704Z" }, + { url = "https://files.pythonhosted.org/packages/a3/51/8a3f6a20902ad604dd746ec7b4000311b240d389dac5e9d95adefd349e0c/lxml-6.1.0-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:022981127642fe19866d2907d76241bb07ed21749601f727d5d5dd1ce5d1b773", size = 5232579, upload-time = "2026-04-18T04:35:02.658Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d2/650d619bdbe048d2c3f2c31edb00e35670a5e2d65b4fe3b61bce37b19121/lxml-6.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:23cad0cc86046d4222f7f418910e46b89971c5a45d3c8abfad0f64b7b05e4a9b", size = 5084206, upload-time = "2026-04-18T04:35:05.175Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8a/672ca1a3cbeabd1f511ca275a916c0514b747f4b85bdaae103b8fa92f307/lxml-6.1.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:21c3302068f50d1e8728c67c87ba92aa87043abee517aa2576cca1855326b405", size = 4758906, upload-time = "2026-04-18T04:35:08.098Z" }, + { url = "https://files.pythonhosted.org/packages/be/f1/ef4b691da85c916cb2feb1eec7414f678162798ac85e042fa164419ac05c/lxml-6.1.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:be10838781cb3be19251e276910cd508fe127e27c3242e50521521a0f3781690", size = 5620553, upload-time = "2026-04-18T04:35:11.23Z" }, + { url = "https://files.pythonhosted.org/packages/59/17/94e81def74107809755ac2782fdad4404420f1c92ca83433d117a6d5acf0/lxml-6.1.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2173a7bffe97667bbf0767f8a99e587740a8c56fdf3befac4b09cb29a80276fd", size = 5229458, upload-time = "2026-04-18T04:35:14.254Z" }, + { url = "https://files.pythonhosted.org/packages/21/55/c4be91b0f830a871fc1b0d730943d56013b683d4671d5198260e2eae722b/lxml-6.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c6854e9cf99c84beb004eecd7d3a3868ef1109bf2b1df92d7bc11e96a36c2180", size = 5247861, upload-time = "2026-04-18T04:35:17.006Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ca/77123e4d77df3cb1e968ade7b1f808f5d3a5c1c96b18a33895397de292c1/lxml-6.1.0-cp314-cp314t-win32.whl", hash = "sha256:00750d63ef0031a05331b9223463b1c7c02b9004cef2346a5b2877f0f9494dd2", size = 3897377, upload-time = "2026-04-18T04:32:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/64/ce/3554833989d074267c063209bae8b09815e5656456a2d332b947806b05ff/lxml-6.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:80410c3a7e3c617af04de17caa9f9f20adaa817093293d69eae7d7d0522836f5", size = 4392701, upload-time = "2026-04-18T04:32:12.113Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a0/9b916c68c0e57752c07f8f64b30138d9d4059dbeb27b90274dedbea128ff/lxml-6.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:26dd9f57ee3bd41e7d35b4c98a2ffd89ed11591649f421f0ec19f67d50ec67ac", size = 3817120, upload-time = "2026-04-18T04:32:15.803Z" }, + { url = "https://files.pythonhosted.org/packages/f2/88/55143966481409b1740a3ac669e611055f49efd68087a5ce41582325db3e/lxml-6.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:546b66c0dd1bb8d9fa89d7123e5fa19a8aff3a1f2141eb22df96112afb17b842", size = 3930134, upload-time = "2026-04-18T04:32:35.008Z" }, + { url = "https://files.pythonhosted.org/packages/b5/97/28b985c2983938d3cb696dd5501423afb90a8c3e869ef5d3c62569282c0f/lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5cfa1a34df366d9dc0d5eaf420f4cf2bb1e1bebe1066d1c2fc28c179f8a4004c", size = 4210749, upload-time = "2026-04-18T04:36:03.626Z" }, + { url = "https://files.pythonhosted.org/packages/29/67/dfab2b7d58214921935ccea7ce9b3df9b7d46f305d12f0f532ac7cf6b804/lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db88156fcf544cdbf0d95588051515cfdfd4c876fc66444eb98bceb5d6db76de", size = 4318463, upload-time = "2026-04-18T04:36:06.309Z" }, + { url = "https://files.pythonhosted.org/packages/32/a2/4ac7eb32a4d997dd352c32c32399aae27b3f268d440e6f9cfa405b575d2f/lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:07f98f5496f96bf724b1e3c933c107f0cbf2745db18c03d2e13a291c3afd2635", size = 4251124, upload-time = "2026-04-18T04:36:09.056Z" }, + { url = "https://files.pythonhosted.org/packages/33/ef/d6abd850bb4822f9b720cfe36b547a558e694881010ff7d012191e8769c6/lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4642e04449a1e164b5ff71ffd901ddb772dfabf5c9adf1b7be5dffe1212bc037", size = 4401758, upload-time = "2026-04-18T04:36:11.803Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/3ee09a5b60cb44c4f2fbc1c9015cfd6ff5afc08f991cab295d3024dcbf2d/lxml-6.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7da13bb6fbadfafb474e0226a30570a3445cfd47c86296f2446dafbd77079ace", size = 3508860, upload-time = "2026-04-18T04:32:48.619Z" }, ] [[package]] @@ -1120,7 +1155,7 @@ wheels = [ [[package]] name = "matplotlib" -version = "3.10.8" +version = "3.10.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "contourpy" }, @@ -1133,65 +1168,65 @@ dependencies = [ { name = "pyparsing" }, { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", size = 8251215, upload-time = "2025-12-10T22:55:16.175Z" }, - { url = "https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", size = 8139625, upload-time = "2025-12-10T22:55:17.712Z" }, - { url = "https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", size = 8712614, upload-time = "2025-12-10T22:55:20.8Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", size = 9540997, upload-time = "2025-12-10T22:55:23.258Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", size = 9596825, upload-time = "2025-12-10T22:55:25.217Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", size = 8135090, upload-time = "2025-12-10T22:55:27.162Z" }, - { url = "https://files.pythonhosted.org/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", size = 8012377, upload-time = "2025-12-10T22:55:29.185Z" }, - { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, - { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, - { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, - { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, - { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, - { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", size = 8261076, upload-time = "2025-12-10T22:55:44.648Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", size = 8148794, upload-time = "2025-12-10T22:55:46.252Z" }, - { url = "https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", size = 8718474, upload-time = "2025-12-10T22:55:47.864Z" }, - { url = "https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", size = 9549637, upload-time = "2025-12-10T22:55:50.048Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", size = 9613678, upload-time = "2025-12-10T22:55:52.21Z" }, - { url = "https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", size = 8142686, upload-time = "2025-12-10T22:55:54.253Z" }, - { url = "https://files.pythonhosted.org/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", size = 8012917, upload-time = "2025-12-10T22:55:56.268Z" }, - { url = "https://files.pythonhosted.org/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", size = 8305679, upload-time = "2025-12-10T22:55:57.856Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", size = 8198336, upload-time = "2025-12-10T22:55:59.371Z" }, - { url = "https://files.pythonhosted.org/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", size = 8731653, upload-time = "2025-12-10T22:56:01.032Z" }, - { url = "https://files.pythonhosted.org/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", size = 9561356, upload-time = "2025-12-10T22:56:02.95Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", size = 9614000, upload-time = "2025-12-10T22:56:05.411Z" }, - { url = "https://files.pythonhosted.org/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", size = 8220043, upload-time = "2025-12-10T22:56:07.551Z" }, - { url = "https://files.pythonhosted.org/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", size = 8062075, upload-time = "2025-12-10T22:56:09.178Z" }, - { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" }, - { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" }, - { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" }, - { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" }, - { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" }, - { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" }, - { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" }, - { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" }, - { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" }, - { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" }, - { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" }, - { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" }, - { url = "https://files.pythonhosted.org/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", size = 8249198, upload-time = "2025-12-10T22:56:45.584Z" }, - { url = "https://files.pythonhosted.org/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", size = 8136817, upload-time = "2025-12-10T22:56:47.339Z" }, - { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb", size = 8306860, upload-time = "2026-04-24T00:12:01.207Z" }, + { url = "https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb", size = 8199254, upload-time = "2026-04-24T00:12:04.239Z" }, + { url = "https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb", size = 8777092, upload-time = "2026-04-24T00:12:06.793Z" }, + { url = "https://files.pythonhosted.org/packages/55/fa/3ce7adfe9ba101748f465211660d9c6374c876b671bdb8c2bb6d347e8b94/matplotlib-3.10.9-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9", size = 9595691, upload-time = "2026-04-24T00:12:09.706Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/6960a76686ed668f2c60f84e9799ba4c0d56abdb36b1577b60c1d061d1ec/matplotlib-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb", size = 9659771, upload-time = "2026-04-24T00:12:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f", size = 8205112, upload-time = "2026-04-24T00:12:15.773Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ee/cb57ad4754f3e7b9174ce6ce66d9205fb827067e48a9f58ac09d7e7d6b77/matplotlib-3.10.9-cp311-cp311-win_arm64.whl", hash = "sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80", size = 8132310, upload-time = "2026-04-24T00:12:18.645Z" }, + { url = "https://files.pythonhosted.org/packages/35/c6/5581e26c72233ebb2a2a6fed2d24fb7c66b4700120b813f51b0555acf0b6/matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1", size = 8319908, upload-time = "2026-04-24T00:12:21.323Z" }, + { url = "https://files.pythonhosted.org/packages/b7/18/4880dd762e40cd360c1bf06e890c5a97b997e91cb324602b1a19950ad5ce/matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320", size = 8216016, upload-time = "2026-04-24T00:12:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/32/91/d024616abdba99e83120e07a20658976f6a343646710760c4a51df126029/matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285", size = 8789336, upload-time = "2026-04-24T00:12:26.096Z" }, + { url = "https://files.pythonhosted.org/packages/5c/04/030a2f61ef2158f5e4c259487a92ac877732499fb33d871585d89e03c42d/matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2", size = 9604602, upload-time = "2026-04-24T00:12:29.052Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c2/541e4d09d87bb6b5830fc28b4c887a9a8cf4e1c6cee698a8c05552ae2003/matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf", size = 9670966, upload-time = "2026-04-24T00:12:32.131Z" }, + { url = "https://files.pythonhosted.org/packages/04/a1/4571fc46e7702de8d0c2dc54ad1b2f8e29328dea3ee90831181f7353d93c/matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6", size = 8217462, upload-time = "2026-04-24T00:12:35.226Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d0/2269edb12aa30c13c8bcc9382892e39943ce1d28aab4ec296e0381798e81/matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42", size = 8136688, upload-time = "2026-04-24T00:12:37.442Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d3/8d4f6afbecb49fc04e060a57c0fce39ea51cc163a6bd87303ccd698e4fa6/matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f", size = 8320331, upload-time = "2026-04-24T00:12:39.688Z" }, + { url = "https://files.pythonhosted.org/packages/63/d9/9e14bc7564bf92d5ffa801ae5fac819ce74b925dfb55e3ebde61a3bbad3e/matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e", size = 8216461, upload-time = "2026-04-24T00:12:42.494Z" }, + { url = "https://files.pythonhosted.org/packages/8a/17/4402d0d14ccf1dfc70932600b68097fbbf9c898a4871d2cbbe79c7801a32/matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f", size = 8790091, upload-time = "2026-04-24T00:12:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0b/322aeec06dd9b91411f92028b37d447342770a24392aa4813e317064dad5/matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838", size = 9605027, upload-time = "2026-04-24T00:12:47.583Z" }, + { url = "https://files.pythonhosted.org/packages/74/88/5f13482f55e7b00bcfc09838b093c2456e1379978d2a146844aae05350ad/matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2", size = 9671269, upload-time = "2026-04-24T00:12:50.878Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e0/0840fd2f93da988ec660b8ad1984abe9f25d2aed22a5e394ff1c68c88307/matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921", size = 8217588, upload-time = "2026-04-24T00:12:53.784Z" }, + { url = "https://files.pythonhosted.org/packages/47/b9/d706d06dd605c49b9f83a2aed8c13e3e5db70697d7a80b7e3d7915de6b17/matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8", size = 8136913, upload-time = "2026-04-24T00:12:56.501Z" }, + { url = "https://files.pythonhosted.org/packages/9b/45/6e32d96978264c8ca8c4b1010adb955a1a49cfaf314e212bbc8908f04a61/matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9", size = 8368019, upload-time = "2026-04-24T00:12:58.896Z" }, + { url = "https://files.pythonhosted.org/packages/86/0a/c8e3d3bba245f0f7fc424937f8ff7ef77291a36af3edb97ccd78aa93d84f/matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4", size = 8264645, upload-time = "2026-04-24T00:13:01.406Z" }, + { url = "https://files.pythonhosted.org/packages/3d/aa/5bf5a14fe4fed73a4209a155606f8096ff797aad89c6c35179026571133e/matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc", size = 8802194, upload-time = "2026-04-24T00:13:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5e/b4be852d6bba6fd15893fadf91ff26ae49cb91aac789e95dde9d342e664f/matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99", size = 9622684, upload-time = "2026-04-24T00:13:06.647Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/ed428c971139112ef730f62770654d609467346d09d4b62617e1afd68a5a/matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d", size = 9680790, upload-time = "2026-04-24T00:13:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/e7/09/052e884aaf2b985c63cb79f715f1d5b6a3eaa7de78f6a52b9dbc077d5b53/matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8", size = 8287571, upload-time = "2026-04-24T00:13:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/f4/38/ae27288e788c35a4250491422f3db7750366fc8c97d6f36fbdecfc1f5518/matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38", size = 8188292, upload-time = "2026-04-24T00:13:15.546Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e6/3bd8afd04949f02eabc1c17115ea5255e19cacd4d06fc5abdde4eeb0052c/matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d", size = 8321276, upload-time = "2026-04-24T00:13:18.318Z" }, + { url = "https://files.pythonhosted.org/packages/41/86/86231232fff41c9f8e4a1a7d7a597d349a02527109c3af7d618366122139/matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f", size = 8218218, upload-time = "2026-04-24T00:13:20.974Z" }, + { url = "https://files.pythonhosted.org/packages/85/8f/becc9722cafc64f5d2eb0b7c1bf5f585271c618a45dbd8fabeb021f898b6/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b", size = 9608145, upload-time = "2026-04-24T00:13:23.228Z" }, + { url = "https://files.pythonhosted.org/packages/32/5d/f7e914f7d9325abff4057cee62c0fa70263683189f774473cbfb534cd13b/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2", size = 9885085, upload-time = "2026-04-24T00:13:25.849Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fd/fa69f2221534e80cc5772ac2b7d222011a2acafc2ec7216d5dd174c864ae/matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716", size = 9672358, upload-time = "2026-04-24T00:13:28.906Z" }, + { url = "https://files.pythonhosted.org/packages/ab/1a/5a4f747a8b271cbb024946d2dd3c913ab5032ba430626f8c3528ada96b4b/matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f", size = 8349970, upload-time = "2026-04-24T00:13:31.904Z" }, + { url = "https://files.pythonhosted.org/packages/64/dc/95d60ecaefe30680a154b52ea96ab4b0dab547f1fd6aa12f5fb655e89cae/matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456", size = 8272785, upload-time = "2026-04-24T00:13:34.511Z" }, + { url = "https://files.pythonhosted.org/packages/70/a0/005d68bc8b8418300ce6591f18586910a8526806e2ab663933d9f20a41e9/matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe", size = 8367999, upload-time = "2026-04-24T00:13:36.962Z" }, + { url = "https://files.pythonhosted.org/packages/22/05/1236cc9290be70b2498af20ca348add76e3fffe7f67b477db5133a84f3ea/matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6", size = 8264543, upload-time = "2026-04-24T00:13:39.851Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c2/071f5a5ff6c5bd63aaaf2f45c811d9bf2ced94bde188d9e1a519e21d0cba/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c", size = 9622800, upload-time = "2026-04-24T00:13:42.296Z" }, + { url = "https://files.pythonhosted.org/packages/95/57/da7d1f10a85624b9e7db68e069dd94e58dc41dbf9463c5921632ecbe3661/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4", size = 9888561, upload-time = "2026-04-24T00:13:45.026Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/ef8d6bb59b0edb6c16c968b70f548aa13b54348972def5aa6ac85df67145/matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf", size = 9680884, upload-time = "2026-04-24T00:13:48.066Z" }, + { url = "https://files.pythonhosted.org/packages/61/1c/d21bfeb9931881ebe96bcfcff27c7ae4b160ae0ec291a714c42641a56d75/matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39", size = 8432333, upload-time = "2026-04-24T00:13:51.008Z" }, + { url = "https://files.pythonhosted.org/packages/78/23/92493c3e6e1b635ccfff146f7b99e674808787915420373ac399283764c2/matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c", size = 8324785, upload-time = "2026-04-24T00:13:53.633Z" }, + { url = "https://files.pythonhosted.org/packages/63/e2/9f66ca6a651a52abfe0d4964ce01439ed34f3f1e119de10ff3a07f403043/matplotlib-3.10.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20", size = 8304420, upload-time = "2026-04-24T00:14:04.57Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e8/467c03568218792906aa87b5e7bb379b605e056ed0c74fe00c051786d925/matplotlib-3.10.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba", size = 8197981, upload-time = "2026-04-24T00:14:07.233Z" }, + { 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.1" +version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +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/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, + { 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]] @@ -1335,11 +1370,11 @@ wheels = [ [[package]] name = "narwhals" -version = "2.18.1" +version = "2.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/59/96/45218c2fdec4c9f22178f905086e85ef1a6d63862dcc3cd68eb60f1867f5/narwhals-2.18.1.tar.gz", hash = "sha256:652a1fcc9d432bbf114846688884c215f17eb118aa640b7419295d2f910d2a8b", size = 620578, upload-time = "2026-03-24T15:11:25.456Z" } +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/3f/c3/06490e98393dcb4d6ce2bf331a39335375c300afaef526897881fbeae6ab/narwhals-2.18.1-py3-none-any.whl", hash = "sha256:a0a8bb80205323851338888ba3a12b4f65d352362c8a94be591244faf36504ad", size = 444952, upload-time = "2026-03-24T15:11:23.801Z" }, + { 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]] @@ -1362,30 +1397,34 @@ wheels = [ [[package]] name = "numba" -version = "0.64.0" +version = "0.65.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "llvmlite" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz", hash = "sha256:95e7300af648baa3308127b1955b52ce6d11889d16e8cfe637b4f85d2fca52b1", size = 2765679, upload-time = "2026-02-18T18:41:20.974Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:766156ee4b8afeeb2b2e23c81307c5d19031f18d5ce76ae2c5fb1429e72fa92b", size = 2682938, upload-time = "2026-02-18T18:40:52.897Z" }, - { url = "https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d17071b4ffc9d39b75d8e6c101a36f0c81b646123859898c9799cb31807c8f78", size = 3747376, upload-time = "2026-02-18T18:40:54.925Z" }, - { url = "https://files.pythonhosted.org/packages/c0/f1/dd2f25e18d75fdf897f730b78c5a7b00cc4450f2405564dbebfaf359f21f/numba-0.64.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ead5630434133bac87fa67526eacb264535e4e9a2d5ec780e0b4fc381a7d275", size = 3453292, upload-time = "2026-02-18T18:40:56.818Z" }, - { url = "https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2b1fd93e7aaac07d6fbaed059c00679f591f2423885c206d8c1b55d65ca3f2d", size = 2749824, upload-time = "2026-02-18T18:40:58.392Z" }, - { url = "https://files.pythonhosted.org/packages/70/a6/9fc52cb4f0d5e6d8b5f4d81615bc01012e3cf24e1052a60f17a68deb8092/numba-0.64.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:69440a8e8bc1a81028446f06b363e28635aa67bd51b1e498023f03b812e0ce68", size = 2683418, upload-time = "2026-02-18T18:40:59.886Z" }, - { url = "https://files.pythonhosted.org/packages/9b/89/1a74ea99b180b7a5587b0301ed1b183a2937c4b4b67f7994689b5d36fc34/numba-0.64.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13721011f693ba558b8dd4e4db7f2640462bba1b855bdc804be45bbeb55031a", size = 3804087, upload-time = "2026-02-18T18:41:01.699Z" }, - { url = "https://files.pythonhosted.org/packages/91/e1/583c647404b15f807410510fec1eb9b80cb8474165940b7749f026f21cbc/numba-0.64.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0b180b1133f2b5d8b3f09d96b6d7a9e51a7da5dda3c09e998b5bcfac85d222c", size = 3504309, upload-time = "2026-02-18T18:41:03.252Z" }, - { url = "https://files.pythonhosted.org/packages/85/23/0fce5789b8a5035e7ace21216a468143f3144e02013252116616c58339aa/numba-0.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:e63dc94023b47894849b8b106db28ccb98b49d5498b98878fac1a38f83ac007a", size = 2752740, upload-time = "2026-02-18T18:41:05.097Z" }, - { url = "https://files.pythonhosted.org/packages/52/80/2734de90f9300a6e2503b35ee50d9599926b90cbb7ac54f9e40074cd07f1/numba-0.64.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3bab2c872194dcd985f1153b70782ec0fbbe348fffef340264eacd3a76d59fd6", size = 2683392, upload-time = "2026-02-18T18:41:06.563Z" }, - { url = "https://files.pythonhosted.org/packages/42/e8/14b5853ebefd5b37723ef365c5318a30ce0702d39057eaa8d7d76392859d/numba-0.64.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:703a246c60832cad231d2e73c1182f25bf3cc8b699759ec8fe58a2dbc689a70c", size = 3812245, upload-time = "2026-02-18T18:41:07.963Z" }, - { url = "https://files.pythonhosted.org/packages/8a/a2/f60dc6c96d19b7185144265a5fbf01c14993d37ff4cd324b09d0212aa7ce/numba-0.64.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e2e49a7900ee971d32af7609adc0cfe6aa7477c6f6cccdf6d8138538cf7756f", size = 3511328, upload-time = "2026-02-18T18:41:09.504Z" }, - { url = "https://files.pythonhosted.org/packages/9c/2a/fe7003ea7e7237ee7014f8eaeeb7b0d228a2db22572ca85bab2648cf52cb/numba-0.64.0-cp313-cp313-win_amd64.whl", hash = "sha256:396f43c3f77e78d7ec84cdfc6b04969c78f8f169351b3c4db814b97e7acf4245", size = 2752668, upload-time = "2026-02-18T18:41:11.455Z" }, - { url = "https://files.pythonhosted.org/packages/3d/8a/77d26afe0988c592dd97cb8d4e80bfb3dfc7dbdacfca7d74a7c5c81dd8c2/numba-0.64.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f565d55eaeff382cbc86c63c8c610347453af3d1e7afb2b6569aac1c9b5c93ce", size = 2683590, upload-time = "2026-02-18T18:41:12.897Z" }, - { url = "https://files.pythonhosted.org/packages/8e/4b/600b8b7cdbc7f9cebee9ea3d13bb70052a79baf28944024ffcb59f0712e3/numba-0.64.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b55169b18892c783f85e9ad9e6f5297a6d12967e4414e6b71361086025ff0bb", size = 3781163, upload-time = "2026-02-18T18:41:15.377Z" }, - { url = "https://files.pythonhosted.org/packages/ff/73/53f2d32bfa45b7175e9944f6b816d8c32840178c3eee9325033db5bf838e/numba-0.64.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:196bcafa02c9dd1707e068434f6d5cedde0feb787e3432f7f1f0e993cc336c4c", size = 3481172, upload-time = "2026-02-18T18:41:17.281Z" }, - { url = "https://files.pythonhosted.org/packages/b5/00/aebd2f7f1e11e38814bb96e95a27580817a7b340608d3ac085fdbab83174/numba-0.64.0-cp314-cp314-win_amd64.whl", hash = "sha256:213e9acbe7f1c05090592e79020315c1749dd52517b90e94c517dca3f014d4a1", size = 2754700, upload-time = "2026-02-18T18:41:19.277Z" }, +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]] @@ -1449,81 +1488,81 @@ wheels = [ [[package]] name = "numpy" -version = "2.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563, upload-time = "2026-01-10T06:42:14.615Z" }, - { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658, upload-time = "2026-01-10T06:42:17.298Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132, upload-time = "2026-01-10T06:42:19.637Z" }, - { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159, upload-time = "2026-01-10T06:42:21.44Z" }, - { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058, upload-time = "2026-01-10T06:42:23.546Z" }, - { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501, upload-time = "2026-01-10T06:42:25.909Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627, upload-time = "2026-01-10T06:42:28.938Z" }, - { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052, upload-time = "2026-01-10T06:42:31.312Z" }, - { url = "https://files.pythonhosted.org/packages/6a/93/098e1162ae7522fc9b618d6272b77404c4656c72432ecee3abc029aa3de0/numpy-2.4.1-cp311-cp311-win32.whl", hash = "sha256:0f118ce6b972080ba0758c6087c3617b5ba243d806268623dc34216d69099ba0", size = 6236575, upload-time = "2026-01-10T06:42:33.872Z" }, - { url = "https://files.pythonhosted.org/packages/8c/de/f5e79650d23d9e12f38a7bc6b03ea0835b9575494f8ec94c11c6e773b1b1/numpy-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:18e14c4d09d55eef39a6ab5b08406e84bc6869c1e34eef45564804f90b7e0574", size = 12604479, upload-time = "2026-01-10T06:42:35.778Z" }, - { url = "https://files.pythonhosted.org/packages/dd/65/e1097a7047cff12ce3369bd003811516b20ba1078dbdec135e1cd7c16c56/numpy-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:6461de5113088b399d655d45c3897fa188766415d0f568f175ab071c8873bd73", size = 10578325, upload-time = "2026-01-10T06:42:38.518Z" }, - { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, - { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, - { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, - { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, - { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, - { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, - { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015, upload-time = "2026-01-10T06:42:59.631Z" }, - { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730, upload-time = "2026-01-10T06:43:01.627Z" }, - { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166, upload-time = "2026-01-10T06:43:03.673Z" }, - { url = "https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d797454e37570cfd61143b73b8debd623c3c0952959adb817dd310a483d58a1b", size = 16652495, upload-time = "2026-01-10T06:43:06.283Z" }, - { url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f", size = 12368657, upload-time = "2026-01-10T06:43:09.094Z" }, - { url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9", size = 5197256, upload-time = "2026-01-10T06:43:13.634Z" }, - { url = "https://files.pythonhosted.org/packages/17/39/569452228de3f5de9064ac75137082c6214be1f5c532016549a7923ab4b5/numpy-2.4.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b55aa56165b17aaf15520beb9cbd33c9039810e0d9643dd4379e44294c7303e", size = 6545212, upload-time = "2026-01-10T06:43:15.661Z" }, - { url = "https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0faba4a331195bfa96f93dd9dfaa10b2c7aa8cda3a02b7fd635e588fe821bf5", size = 14402871, upload-time = "2026-01-10T06:43:17.324Z" }, - { url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8", size = 16359305, upload-time = "2026-01-10T06:43:19.376Z" }, - { url = "https://files.pythonhosted.org/packages/32/91/789132c6666288eaa20ae8066bb99eba1939362e8f1a534949a215246e97/numpy-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49e792ec351315e16da54b543db06ca8a86985ab682602d90c60ef4ff4db2a9c", size = 16181909, upload-time = "2026-01-10T06:43:21.808Z" }, - { url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2", size = 18284380, upload-time = "2026-01-10T06:43:23.957Z" }, - { url = "https://files.pythonhosted.org/packages/67/78/722b62bd31842ff029412271556a1a27a98f45359dea78b1548a3a9996aa/numpy-2.4.1-cp313-cp313-win32.whl", hash = "sha256:3d1a100e48cb266090a031397863ff8a30050ceefd798f686ff92c67a486753d", size = 5957089, upload-time = "2026-01-10T06:43:27.535Z" }, - { url = "https://files.pythonhosted.org/packages/da/a6/cf32198b0b6e18d4fbfa9a21a992a7fca535b9bb2b0cdd217d4a3445b5ca/numpy-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:92a0e65272fd60bfa0d9278e0484c2f52fe03b97aedc02b357f33fe752c52ffb", size = 12307230, upload-time = "2026-01-10T06:43:29.298Z" }, - { url = "https://files.pythonhosted.org/packages/44/6c/534d692bfb7d0afe30611320c5fb713659dcb5104d7cc182aff2aea092f5/numpy-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:20d4649c773f66cc2fc36f663e091f57c3b7655f936a4c681b4250855d1da8f5", size = 10313125, upload-time = "2026-01-10T06:43:31.782Z" }, - { url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7", size = 12496156, upload-time = "2026-01-10T06:43:34.237Z" }, - { url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d", size = 5324663, upload-time = "2026-01-10T06:43:36.211Z" }, - { url = "https://files.pythonhosted.org/packages/fe/55/7a621694010d92375ed82f312b2f28017694ed784775269115323e37f5e2/numpy-2.4.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:98b35775e03ab7f868908b524fc0a84d38932d8daf7b7e1c3c3a1b6c7a2c9f15", size = 6645224, upload-time = "2026-01-10T06:43:37.884Z" }, - { url = "https://files.pythonhosted.org/packages/50/96/9fa8635ed9d7c847d87e30c834f7109fac5e88549d79ef3324ab5c20919f/numpy-2.4.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941c2a93313d030f219f3a71fd3d91a728b82979a5e8034eb2e60d394a2b83f9", size = 14462352, upload-time = "2026-01-10T06:43:39.479Z" }, - { url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2", size = 16407279, upload-time = "2026-01-10T06:43:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/86/1c/95c86e17c6b0b31ce6ef219da00f71113b220bcb14938c8d9a05cee0ff53/numpy-2.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2302dc0224c1cbc49bb94f7064f3f923a971bfae45c33870dcbff63a2a550505", size = 16248316, upload-time = "2026-01-10T06:43:44.121Z" }, - { url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2", size = 18329884, upload-time = "2026-01-10T06:43:46.613Z" }, - { url = "https://files.pythonhosted.org/packages/37/a4/b073f3e9d77f9aec8debe8ca7f9f6a09e888ad1ba7488f0c3b36a94c03ac/numpy-2.4.1-cp313-cp313t-win32.whl", hash = "sha256:382ad67d99ef49024f11d1ce5dcb5ad8432446e4246a4b014418ba3a1175a1f4", size = 6081138, upload-time = "2026-01-10T06:43:48.854Z" }, - { url = "https://files.pythonhosted.org/packages/16/16/af42337b53844e67752a092481ab869c0523bc95c4e5c98e4dac4e9581ac/numpy-2.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:62fea415f83ad8fdb6c20840578e5fbaf5ddd65e0ec6c3c47eda0f69da172510", size = 12447478, upload-time = "2026-01-10T06:43:50.476Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f8/fa85b2eac68ec631d0b631abc448552cb17d39afd17ec53dcbcc3537681a/numpy-2.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a7870e8c5fc11aef57d6fea4b4085e537a3a60ad2cdd14322ed531fdca68d261", size = 10382981, upload-time = "2026-01-10T06:43:52.575Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046, upload-time = "2026-01-10T06:43:54.797Z" }, - { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858, upload-time = "2026-01-10T06:43:57.099Z" }, - { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417, upload-time = "2026-01-10T06:43:59.037Z" }, - { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643, upload-time = "2026-01-10T06:44:01.852Z" }, - { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963, upload-time = "2026-01-10T06:44:04.047Z" }, - { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811, upload-time = "2026-01-10T06:44:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643, upload-time = "2026-01-10T06:44:08.33Z" }, - { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601, upload-time = "2026-01-10T06:44:10.841Z" }, - { url = "https://files.pythonhosted.org/packages/80/9a/0d44b468cad50315127e884802351723daca7cf1c98d102929468c81d439/numpy-2.4.1-cp314-cp314-win32.whl", hash = "sha256:727c6c3275ddefa0dc078524a85e064c057b4f4e71ca5ca29a19163c607be745", size = 6005722, upload-time = "2026-01-10T06:44:13.332Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bb/c6513edcce5a831810e2dddc0d3452ce84d208af92405a0c2e58fd8e7881/numpy-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:7d5d7999df434a038d75a748275cd6c0094b0ecdb0837342b332a82defc4dc4d", size = 12438590, upload-time = "2026-01-10T06:44:15.006Z" }, - { url = "https://files.pythonhosted.org/packages/e9/da/a598d5cb260780cf4d255102deba35c1d072dc028c4547832f45dd3323a8/numpy-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:ce9ce141a505053b3c7bce3216071f3bf5c182b8b28930f14cd24d43932cd2df", size = 10596180, upload-time = "2026-01-10T06:44:17.386Z" }, - { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774, upload-time = "2026-01-10T06:44:19.467Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274, upload-time = "2026-01-10T06:44:23.189Z" }, - { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306, upload-time = "2026-01-10T06:44:25.012Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653, upload-time = "2026-01-10T06:44:26.706Z" }, - { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144, upload-time = "2026-01-10T06:44:29.378Z" }, - { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425, upload-time = "2026-01-10T06:44:31.721Z" }, - { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" }, - { url = "https://files.pythonhosted.org/packages/23/12/8b5fc6b9c487a09a7957188e0943c9ff08432c65e34567cabc1623b03a51/numpy-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:5de60946f14ebe15e713a6f22850c2372fa72f4ff9a432ab44aa90edcadaa65a", size = 6152482, upload-time = "2026-01-10T06:44:36.798Z" }, - { url = "https://files.pythonhosted.org/packages/00/a5/9f8ca5856b8940492fc24fbe13c1bc34d65ddf4079097cf9e53164d094e1/numpy-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8f085da926c0d491ffff3096f91078cc97ea67e7e6b65e490bc8dcda65663be2", size = 12627117, upload-time = "2026-01-10T06:44:38.828Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0d/eca3d962f9eef265f01a8e0d20085c6dd1f443cbffc11b6dede81fd82356/numpy-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6436cffb4f2bf26c974344439439c95e152c9a527013f26b3577be6c2ca64295", size = 10667121, upload-time = "2026-01-10T06:44:41.644Z" }, - { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202, upload-time = "2026-01-10T06:44:43.738Z" }, - { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985, upload-time = "2026-01-10T06:44:45.945Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484, upload-time = "2026-01-10T06:44:48.012Z" }, - { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216, upload-time = "2026-01-10T06:44:49.725Z" }, - { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937, upload-time = "2026-01-10T06:44:51.498Z" }, - { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830, upload-time = "2026-01-10T06:44:53.931Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/c6/4218570d8c8ecc9704b5157a3348e486e84ef4be0ed3e38218ab473c83d2/numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db", size = 16976799, upload-time = "2026-03-29T13:18:15.438Z" }, + { url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" }, + { url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40", size = 6806482, upload-time = "2026-03-29T13:18:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" }, + { url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" }, + { url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ce/13a09ed65f5d0ce5c7dd0669250374c6e379910f97af2c08c57b0608eee4/numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e", size = 6239499, upload-time = "2026-03-29T13:18:40.372Z" }, + { url = "https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e", size = 12614257, upload-time = "2026-03-29T13:18:42.95Z" }, + { url = "https://files.pythonhosted.org/packages/87/c5/8168052f080c26fa984c413305012be54741c9d0d74abd7fbeeccae3889f/numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e", size = 10486775, upload-time = "2026-03-29T13:18:45.835Z" }, + { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, + { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, + { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, + { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, + { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, + { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, + { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, + { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, + { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, + { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, + { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, + { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, + { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, + { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, + { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, + { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, + { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, + { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/6b/33/8fae8f964a4f63ed528264ddf25d2b683d0b663e3cba26961eb838a7c1bd/numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4", size = 16854491, upload-time = "2026-03-29T13:21:38.03Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" }, + { url = "https://files.pythonhosted.org/packages/d6/77/063baa20b08b431038c7f9ff5435540c7b7265c78cf56012a483019ca72d/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3", size = 6715557, upload-time = "2026-03-29T13:21:47.406Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" }, + { 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]] @@ -1541,79 +1580,79 @@ wheels = [ [[package]] name = "orjson" -version = "3.11.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/45/b268004f745ede84e5798b48ee12b05129d19235d0e15267aa57dcdb400b/orjson-3.11.7.tar.gz", hash = "sha256:9b1a67243945819ce55d24a30b59d6a168e86220452d2c96f4d1f093e71c0c49", size = 6144992, upload-time = "2026-02-02T15:38:49.29Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/37/02/da6cb01fc6087048d7f61522c327edf4250f1683a58a839fdcc435746dd5/orjson-3.11.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9487abc2c2086e7c8eb9a211d2ce8855bae0e92586279d0d27b341d5ad76c85c", size = 228664, upload-time = "2026-02-02T15:37:25.542Z" }, - { url = "https://files.pythonhosted.org/packages/c1/c2/5885e7a5881dba9a9af51bc564e8967225a642b3e03d089289a35054e749/orjson-3.11.7-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:79cacb0b52f6004caf92405a7e1f11e6e2de8bdf9019e4f76b44ba045125cd6b", size = 125344, upload-time = "2026-02-02T15:37:26.92Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1d/4e7688de0a92d1caf600dfd5fb70b4c5bfff51dfa61ac555072ef2d0d32a/orjson-3.11.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e85fe4698b6a56d5e2ebf7ae87544d668eb6bde1ad1226c13f44663f20ec9e", size = 128404, upload-time = "2026-02-02T15:37:28.108Z" }, - { url = "https://files.pythonhosted.org/packages/2f/b2/ec04b74ae03a125db7bd69cffd014b227b7f341e3261bf75b5eb88a1aa92/orjson-3.11.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8d14b71c0b12963fe8a62aac87119f1afdf4cb88a400f61ca5ae581449efcb5", size = 123677, upload-time = "2026-02-02T15:37:30.287Z" }, - { url = "https://files.pythonhosted.org/packages/4c/69/f95bdf960605f08f827f6e3291fe243d8aa9c5c9ff017a8d7232209184c3/orjson-3.11.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91c81ef070c8f3220054115e1ef468b1c9ce8497b4e526cb9f68ab4dc0a7ac62", size = 128950, upload-time = "2026-02-02T15:37:31.595Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1b/de59c57bae1d148ef298852abd31909ac3089cff370dfd4cd84cc99cbc42/orjson-3.11.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:411ebaf34d735e25e358a6d9e7978954a9c9d58cfb47bc6683cdc3964cd2f910", size = 141756, upload-time = "2026-02-02T15:37:32.985Z" }, - { url = "https://files.pythonhosted.org/packages/ee/9e/9decc59f4499f695f65c650f6cfa6cd4c37a3fbe8fa235a0a3614cb54386/orjson-3.11.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a16bcd08ab0bcdfc7e8801d9c4a9cc17e58418e4d48ddc6ded4e9e4b1a94062b", size = 130812, upload-time = "2026-02-02T15:37:34.204Z" }, - { url = "https://files.pythonhosted.org/packages/28/e6/59f932bcabd1eac44e334fe8e3281a92eacfcb450586e1f4bde0423728d8/orjson-3.11.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0b51672e466fd7e56230ffbae7f1639e18d0ce023351fb75da21b71bc2c960", size = 133444, upload-time = "2026-02-02T15:37:35.446Z" }, - { url = "https://files.pythonhosted.org/packages/f1/36/b0f05c0eaa7ca30bc965e37e6a2956b0d67adb87a9872942d3568da846ae/orjson-3.11.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:136dcd6a2e796dfd9ffca9fc027d778567b0b7c9968d092842d3c323cef88aa8", size = 138609, upload-time = "2026-02-02T15:37:36.657Z" }, - { url = "https://files.pythonhosted.org/packages/b8/03/58ec7d302b8d86944c60c7b4b82975d5161fcce4c9bc8c6cb1d6741b6115/orjson-3.11.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7ba61079379b0ae29e117db13bda5f28d939766e410d321ec1624afc6a0b0504", size = 408918, upload-time = "2026-02-02T15:37:38.076Z" }, - { url = "https://files.pythonhosted.org/packages/06/3a/868d65ef9a8b99be723bd510de491349618abd9f62c826cf206d962db295/orjson-3.11.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0527a4510c300e3b406591b0ba69b5dc50031895b0a93743526a3fc45f59d26e", size = 143998, upload-time = "2026-02-02T15:37:39.706Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c7/1e18e1c83afe3349f4f6dc9e14910f0ae5f82eac756d1412ea4018938535/orjson-3.11.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a709e881723c9b18acddcfb8ba357322491ad553e277cf467e1e7e20e2d90561", size = 134802, upload-time = "2026-02-02T15:37:41.002Z" }, - { url = "https://files.pythonhosted.org/packages/d4/0b/ccb7ee1a65b37e8eeb8b267dc953561d72370e85185e459616d4345bab34/orjson-3.11.7-cp311-cp311-win32.whl", hash = "sha256:c43b8b5bab288b6b90dac410cca7e986a4fa747a2e8f94615aea407da706980d", size = 127828, upload-time = "2026-02-02T15:37:42.241Z" }, - { url = "https://files.pythonhosted.org/packages/af/9e/55c776dffda3f381e0f07d010a4f5f3902bf48eaba1bb7684d301acd4924/orjson-3.11.7-cp311-cp311-win_amd64.whl", hash = "sha256:6543001328aa857187f905308a028935864aefe9968af3848401b6fe80dbb471", size = 124941, upload-time = "2026-02-02T15:37:43.444Z" }, - { url = "https://files.pythonhosted.org/packages/aa/8e/424a620fa7d263b880162505fb107ef5e0afaa765b5b06a88312ac291560/orjson-3.11.7-cp311-cp311-win_arm64.whl", hash = "sha256:1ee5cc7160a821dfe14f130bc8e63e7611051f964b463d9e2a3a573204446a4d", size = 126245, upload-time = "2026-02-02T15:37:45.18Z" }, - { url = "https://files.pythonhosted.org/packages/80/bf/76f4f1665f6983385938f0e2a5d7efa12a58171b8456c252f3bae8a4cf75/orjson-3.11.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bd03ea7606833655048dab1a00734a2875e3e86c276e1d772b2a02556f0d895f", size = 228545, upload-time = "2026-02-02T15:37:46.376Z" }, - { url = "https://files.pythonhosted.org/packages/79/53/6c72c002cb13b5a978a068add59b25a8bdf2800ac1c9c8ecdb26d6d97064/orjson-3.11.7-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:89e440ebc74ce8ab5c7bc4ce6757b4a6b1041becb127df818f6997b5c71aa60b", size = 125224, upload-time = "2026-02-02T15:37:47.697Z" }, - { url = "https://files.pythonhosted.org/packages/2c/83/10e48852865e5dd151bdfe652c06f7da484578ed02c5fca938e3632cb0b8/orjson-3.11.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ede977b5fe5ac91b1dffc0a517ca4542d2ec8a6a4ff7b2652d94f640796342a", size = 128154, upload-time = "2026-02-02T15:37:48.954Z" }, - { url = "https://files.pythonhosted.org/packages/6e/52/a66e22a2b9abaa374b4a081d410edab6d1e30024707b87eab7c734afe28d/orjson-3.11.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b7b1dae39230a393df353827c855a5f176271c23434cfd2db74e0e424e693e10", size = 123548, upload-time = "2026-02-02T15:37:50.187Z" }, - { url = "https://files.pythonhosted.org/packages/de/38/605d371417021359f4910c496f764c48ceb8997605f8c25bf1dfe58c0ebe/orjson-3.11.7-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed46f17096e28fb28d2975834836a639af7278aa87c84f68ab08fbe5b8bd75fa", size = 129000, upload-time = "2026-02-02T15:37:51.426Z" }, - { url = "https://files.pythonhosted.org/packages/44/98/af32e842b0ffd2335c89714d48ca4e3917b42f5d6ee5537832e069a4b3ac/orjson-3.11.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3726be79e36e526e3d9c1aceaadbfb4a04ee80a72ab47b3f3c17fefb9812e7b8", size = 141686, upload-time = "2026-02-02T15:37:52.607Z" }, - { url = "https://files.pythonhosted.org/packages/96/0b/fc793858dfa54be6feee940c1463370ece34b3c39c1ca0aa3845f5ba9892/orjson-3.11.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0724e265bc548af1dedebd9cb3d24b4e1c1e685a343be43e87ba922a5c5fff2f", size = 130812, upload-time = "2026-02-02T15:37:53.944Z" }, - { url = "https://files.pythonhosted.org/packages/dc/91/98a52415059db3f374757d0b7f0f16e3b5cd5976c90d1c2b56acaea039e6/orjson-3.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7745312efa9e11c17fbd3cb3097262d079da26930ae9ae7ba28fb738367cbad", size = 133440, upload-time = "2026-02-02T15:37:55.615Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b6/cb540117bda61791f46381f8c26c8f93e802892830a6055748d3bb1925ab/orjson-3.11.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f904c24bdeabd4298f7a977ef14ca2a022ca921ed670b92ecd16ab6f3d01f867", size = 138386, upload-time = "2026-02-02T15:37:56.814Z" }, - { url = "https://files.pythonhosted.org/packages/63/1a/50a3201c334a7f17c231eee5f841342190723794e3b06293f26e7cf87d31/orjson-3.11.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b9fc4d0f81f394689e0814617aadc4f2ea0e8025f38c226cbf22d3b5ddbf025d", size = 408853, upload-time = "2026-02-02T15:37:58.291Z" }, - { url = "https://files.pythonhosted.org/packages/87/cd/8de1c67d0be44fdc22701e5989c0d015a2adf391498ad42c4dc589cd3013/orjson-3.11.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:849e38203e5be40b776ed2718e587faf204d184fc9a008ae441f9442320c0cab", size = 144130, upload-time = "2026-02-02T15:38:00.163Z" }, - { url = "https://files.pythonhosted.org/packages/0f/fe/d605d700c35dd55f51710d159fc54516a280923cd1b7e47508982fbb387d/orjson-3.11.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4682d1db3bcebd2b64757e0ddf9e87ae5f00d29d16c5cdf3a62f561d08cc3dd2", size = 134818, upload-time = "2026-02-02T15:38:01.507Z" }, - { url = "https://files.pythonhosted.org/packages/e4/e4/15ecc67edb3ddb3e2f46ae04475f2d294e8b60c1825fbe28a428b93b3fbd/orjson-3.11.7-cp312-cp312-win32.whl", hash = "sha256:f4f7c956b5215d949a1f65334cf9d7612dde38f20a95f2315deef167def91a6f", size = 127923, upload-time = "2026-02-02T15:38:02.75Z" }, - { url = "https://files.pythonhosted.org/packages/34/70/2e0855361f76198a3965273048c8e50a9695d88cd75811a5b46444895845/orjson-3.11.7-cp312-cp312-win_amd64.whl", hash = "sha256:bf742e149121dc5648ba0a08ea0871e87b660467ef168a3a5e53bc1fbd64bb74", size = 125007, upload-time = "2026-02-02T15:38:04.032Z" }, - { url = "https://files.pythonhosted.org/packages/68/40/c2051bd19fc467610fed469dc29e43ac65891571138f476834ca192bc290/orjson-3.11.7-cp312-cp312-win_arm64.whl", hash = "sha256:26c3b9132f783b7d7903bf1efb095fed8d4a3a85ec0d334ee8beff3d7a4749d5", size = 126089, upload-time = "2026-02-02T15:38:05.297Z" }, - { url = "https://files.pythonhosted.org/packages/89/25/6e0e52cac5aab51d7b6dcd257e855e1dec1c2060f6b28566c509b4665f62/orjson-3.11.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1d98b30cc1313d52d4af17d9c3d307b08389752ec5f2e5febdfada70b0f8c733", size = 228390, upload-time = "2026-02-02T15:38:06.8Z" }, - { url = "https://files.pythonhosted.org/packages/a5/29/a77f48d2fc8a05bbc529e5ff481fb43d914f9e383ea2469d4f3d51df3d00/orjson-3.11.7-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:d897e81f8d0cbd2abb82226d1860ad2e1ab3ff16d7b08c96ca00df9d45409ef4", size = 125189, upload-time = "2026-02-02T15:38:08.181Z" }, - { url = "https://files.pythonhosted.org/packages/89/25/0a16e0729a0e6a1504f9d1a13cdd365f030068aab64cec6958396b9969d7/orjson-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:814be4b49b228cfc0b3c565acf642dd7d13538f966e3ccde61f4f55be3e20785", size = 128106, upload-time = "2026-02-02T15:38:09.41Z" }, - { url = "https://files.pythonhosted.org/packages/66/da/a2e505469d60666a05ab373f1a6322eb671cb2ba3a0ccfc7d4bc97196787/orjson-3.11.7-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d06e5c5fed5caedd2e540d62e5b1c25e8c82431b9e577c33537e5fa4aa909539", size = 123363, upload-time = "2026-02-02T15:38:10.73Z" }, - { url = "https://files.pythonhosted.org/packages/23/bf/ed73f88396ea35c71b38961734ea4a4746f7ca0768bf28fd551d37e48dd0/orjson-3.11.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31c80ce534ac4ea3739c5ee751270646cbc46e45aea7576a38ffec040b4029a1", size = 129007, upload-time = "2026-02-02T15:38:12.138Z" }, - { url = "https://files.pythonhosted.org/packages/73/3c/b05d80716f0225fc9008fbf8ab22841dcc268a626aa550561743714ce3bf/orjson-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f50979824bde13d32b4320eedd513431c921102796d86be3eee0b58e58a3ecd1", size = 141667, upload-time = "2026-02-02T15:38:13.398Z" }, - { url = "https://files.pythonhosted.org/packages/61/e8/0be9b0addd9bf86abfc938e97441dcd0375d494594b1c8ad10fe57479617/orjson-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e54f3808e2b6b945078c41aa8d9b5834b28c50843846e97807e5adb75fa9705", size = 130832, upload-time = "2026-02-02T15:38:14.698Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ec/c68e3b9021a31d9ec15a94931db1410136af862955854ed5dd7e7e4f5bff/orjson-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12b80df61aab7b98b490fe9e4879925ba666fccdfcd175252ce4d9035865ace", size = 133373, upload-time = "2026-02-02T15:38:16.109Z" }, - { url = "https://files.pythonhosted.org/packages/d2/45/f3466739aaafa570cc8e77c6dbb853c48bf56e3b43738020e2661e08b0ac/orjson-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:996b65230271f1a97026fd0e6a753f51fbc0c335d2ad0c6201f711b0da32693b", size = 138307, upload-time = "2026-02-02T15:38:17.453Z" }, - { url = "https://files.pythonhosted.org/packages/e1/84/9f7f02288da1ffb31405c1be07657afd1eecbcb4b64ee2817b6fe0f785fa/orjson-3.11.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ab49d4b2a6a1d415ddb9f37a21e02e0d5dbfe10b7870b21bf779fc21e9156157", size = 408695, upload-time = "2026-02-02T15:38:18.831Z" }, - { url = "https://files.pythonhosted.org/packages/18/07/9dd2f0c0104f1a0295ffbe912bc8d63307a539b900dd9e2c48ef7810d971/orjson-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:390a1dce0c055ddf8adb6aa94a73b45a4a7d7177b5c584b8d1c1947f2ba60fb3", size = 144099, upload-time = "2026-02-02T15:38:20.28Z" }, - { url = "https://files.pythonhosted.org/packages/a5/66/857a8e4a3292e1f7b1b202883bcdeb43a91566cf59a93f97c53b44bd6801/orjson-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1eb80451a9c351a71dfaf5b7ccc13ad065405217726b59fdbeadbcc544f9d223", size = 134806, upload-time = "2026-02-02T15:38:22.186Z" }, - { url = "https://files.pythonhosted.org/packages/0a/5b/6ebcf3defc1aab3a338ca777214966851e92efb1f30dc7fc8285216e6d1b/orjson-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7477aa6a6ec6139c5cb1cc7b214643592169a5494d200397c7fc95d740d5fcf3", size = 127914, upload-time = "2026-02-02T15:38:23.511Z" }, - { url = "https://files.pythonhosted.org/packages/00/04/c6f72daca5092e3117840a1b1e88dfc809cc1470cf0734890d0366b684a1/orjson-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:b9f95dcdea9d4f805daa9ddf02617a89e484c6985fa03055459f90e87d7a0757", size = 124986, upload-time = "2026-02-02T15:38:24.836Z" }, - { url = "https://files.pythonhosted.org/packages/03/ba/077a0f6f1085d6b806937246860fafbd5b17f3919c70ee3f3d8d9c713f38/orjson-3.11.7-cp313-cp313-win_arm64.whl", hash = "sha256:800988273a014a0541483dc81021247d7eacb0c845a9d1a34a422bc718f41539", size = 126045, upload-time = "2026-02-02T15:38:26.216Z" }, - { url = "https://files.pythonhosted.org/packages/e9/1e/745565dca749813db9a093c5ebc4bac1a9475c64d54b95654336ac3ed961/orjson-3.11.7-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:de0a37f21d0d364954ad5de1970491d7fbd0fb1ef7417d4d56a36dc01ba0c0a0", size = 228391, upload-time = "2026-02-02T15:38:27.757Z" }, - { url = "https://files.pythonhosted.org/packages/46/19/e40f6225da4d3aa0c8dc6e5219c5e87c2063a560fe0d72a88deb59776794/orjson-3.11.7-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c2428d358d85e8da9d37cba18b8c4047c55222007a84f97156a5b22028dfbfc0", size = 125188, upload-time = "2026-02-02T15:38:29.241Z" }, - { url = "https://files.pythonhosted.org/packages/9d/7e/c4de2babef2c0817fd1f048fd176aa48c37bec8aef53d2fa932983032cce/orjson-3.11.7-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4bc6c6ac52cdaa267552544c73e486fecbd710b7ac09bc024d5a78555a22f6", size = 128097, upload-time = "2026-02-02T15:38:30.618Z" }, - { url = "https://files.pythonhosted.org/packages/eb/74/233d360632bafd2197f217eee7fb9c9d0229eac0c18128aee5b35b0014fe/orjson-3.11.7-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd0d68edd7dfca1b2eca9361a44ac9f24b078de3481003159929a0573f21a6bf", size = 123364, upload-time = "2026-02-02T15:38:32.363Z" }, - { url = "https://files.pythonhosted.org/packages/79/51/af79504981dd31efe20a9e360eb49c15f06df2b40e7f25a0a52d9ae888e8/orjson-3.11.7-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:623ad1b9548ef63886319c16fa317848e465a21513b31a6ad7b57443c3e0dcf5", size = 129076, upload-time = "2026-02-02T15:38:33.68Z" }, - { url = "https://files.pythonhosted.org/packages/67/e2/da898eb68b72304f8de05ca6715870d09d603ee98d30a27e8a9629abc64b/orjson-3.11.7-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6e776b998ac37c0396093d10290e60283f59cfe0fc3fccbd0ccc4bd04dd19892", size = 141705, upload-time = "2026-02-02T15:38:34.989Z" }, - { url = "https://files.pythonhosted.org/packages/c5/89/15364d92acb3d903b029e28d834edb8780c2b97404cbf7929aa6b9abdb24/orjson-3.11.7-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c6c3af76716f4a9c290371ba2e390ede06f6603edb277b481daf37f6f464e", size = 130855, upload-time = "2026-02-02T15:38:36.379Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8b/ecdad52d0b38d4b8f514be603e69ccd5eacf4e7241f972e37e79792212ec/orjson-3.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a56df3239294ea5964adf074c54bcc4f0ccd21636049a2cf3ca9cf03b5d03cf1", size = 133386, upload-time = "2026-02-02T15:38:37.704Z" }, - { url = "https://files.pythonhosted.org/packages/b9/0e/45e1dcf10e17d0924b7c9162f87ec7b4ca79e28a0548acf6a71788d3e108/orjson-3.11.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bda117c4148e81f746655d5a3239ae9bd00cb7bc3ca178b5fc5a5997e9744183", size = 138295, upload-time = "2026-02-02T15:38:39.096Z" }, - { url = "https://files.pythonhosted.org/packages/63/d7/4d2e8b03561257af0450f2845b91fbd111d7e526ccdf737267108075e0ba/orjson-3.11.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:23d6c20517a97a9daf1d48b580fcdc6f0516c6f4b5038823426033690b4d2650", size = 408720, upload-time = "2026-02-02T15:38:40.634Z" }, - { url = "https://files.pythonhosted.org/packages/78/cf/d45343518282108b29c12a65892445fc51f9319dc3c552ceb51bb5905ed2/orjson-3.11.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8ff206156006da5b847c9304b6308a01e8cdbc8cce824e2779a5ba71c3def141", size = 144152, upload-time = "2026-02-02T15:38:42.262Z" }, - { url = "https://files.pythonhosted.org/packages/a9/3a/d6001f51a7275aacd342e77b735c71fa04125a3f93c36fee4526bc8c654e/orjson-3.11.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:962d046ee1765f74a1da723f4b33e3b228fe3a48bd307acce5021dfefe0e29b2", size = 134814, upload-time = "2026-02-02T15:38:43.627Z" }, - { url = "https://files.pythonhosted.org/packages/1d/d3/f19b47ce16820cc2c480f7f1723e17f6d411b3a295c60c8ad3aa9ff1c96a/orjson-3.11.7-cp314-cp314-win32.whl", hash = "sha256:89e13dd3f89f1c38a9c9eba5fbf7cdc2d1feca82f5f290864b4b7a6aac704576", size = 127997, upload-time = "2026-02-02T15:38:45.06Z" }, - { url = "https://files.pythonhosted.org/packages/12/df/172771902943af54bf661a8d102bdf2e7f932127968080632bda6054b62c/orjson-3.11.7-cp314-cp314-win_amd64.whl", hash = "sha256:845c3e0d8ded9c9271cd79596b9b552448b885b97110f628fb687aee2eed11c1", size = 124985, upload-time = "2026-02-02T15:38:46.388Z" }, - { url = "https://files.pythonhosted.org/packages/6f/1c/f2a8d8a1b17514660a614ce5f7aac74b934e69f5abc2700cc7ced882a009/orjson-3.11.7-cp314-cp314-win_arm64.whl", hash = "sha256:4a2e9c5be347b937a2e0203866f12bba36082e89b402ddb9e927d5822e43088d", size = 126038, upload-time = "2026-02-02T15:38:47.703Z" }, +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.0" +version = "26.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, + { 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]] @@ -1627,80 +1666,80 @@ wheels = [ [[package]] name = "pandas" -version = "3.0.0" +version = "3.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/da/b1dc0481ab8d55d0f46e343cfe67d4551a0e14fcee52bd38ca1bd73258d8/pandas-3.0.0.tar.gz", hash = "sha256:0facf7e87d38f721f0af46fe70d97373a37701b1c09f7ed7aeeb292ade5c050f", size = 4633005, upload-time = "2026-01-21T15:52:04.726Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/1e/b184654a856e75e975a6ee95d6577b51c271cd92cb2b020c9378f53e0032/pandas-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d64ce01eb9cdca96a15266aa679ae50212ec52757c79204dbc7701a222401850", size = 10313247, upload-time = "2026-01-21T15:50:15.775Z" }, - { url = "https://files.pythonhosted.org/packages/dd/5e/e04a547ad0f0183bf151fd7c7a477468e3b85ff2ad231c566389e6cc9587/pandas-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:613e13426069793aa1ec53bdcc3b86e8d32071daea138bbcf4fa959c9cdaa2e2", size = 9913131, upload-time = "2026-01-21T15:50:18.611Z" }, - { url = "https://files.pythonhosted.org/packages/a2/93/bb77bfa9fc2aba9f7204db807d5d3fb69832ed2854c60ba91b4c65ba9219/pandas-3.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0192fee1f1a8e743b464a6607858ee4b071deb0b118eb143d71c2a1d170996d5", size = 10741925, upload-time = "2026-01-21T15:50:21.058Z" }, - { url = "https://files.pythonhosted.org/packages/62/fb/89319812eb1d714bfc04b7f177895caeba8ab4a37ef6712db75ed786e2e0/pandas-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b853319dec8d5e0c8b875374c078ef17f2269986a78168d9bd57e49bf650ae", size = 11245979, upload-time = "2026-01-21T15:50:23.413Z" }, - { url = "https://files.pythonhosted.org/packages/a9/63/684120486f541fc88da3862ed31165b3b3e12b6a1c7b93be4597bc84e26c/pandas-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:707a9a877a876c326ae2cb640fbdc4ef63b0a7b9e2ef55c6df9942dcee8e2af9", size = 11756337, upload-time = "2026-01-21T15:50:25.932Z" }, - { url = "https://files.pythonhosted.org/packages/39/92/7eb0ad232312b59aec61550c3c81ad0743898d10af5df7f80bc5e5065416/pandas-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:afd0aa3d0b5cda6e0b8ffc10dbcca3b09ef3cbcd3fe2b27364f85fdc04e1989d", size = 12325517, upload-time = "2026-01-21T15:50:27.952Z" }, - { url = "https://files.pythonhosted.org/packages/51/27/bf9436dd0a4fc3130acec0828951c7ef96a0631969613a9a35744baf27f6/pandas-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:113b4cca2614ff7e5b9fee9b6f066618fe73c5a83e99d721ffc41217b2bf57dd", size = 9881576, upload-time = "2026-01-21T15:50:30.149Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2b/c618b871fce0159fd107516336e82891b404e3f340821853c2fc28c7830f/pandas-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c14837eba8e99a8da1527c0280bba29b0eb842f64aa94982c5e21227966e164b", size = 9140807, upload-time = "2026-01-21T15:50:32.308Z" }, - { url = "https://files.pythonhosted.org/packages/0b/38/db33686f4b5fa64d7af40d96361f6a4615b8c6c8f1b3d334eee46ae6160e/pandas-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9803b31f5039b3c3b10cc858c5e40054adb4b29b4d81cb2fd789f4121c8efbcd", size = 10334013, upload-time = "2026-01-21T15:50:34.771Z" }, - { url = "https://files.pythonhosted.org/packages/a5/7b/9254310594e9774906bacdd4e732415e1f86ab7dbb4b377ef9ede58cd8ec/pandas-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14c2a4099cd38a1d18ff108168ea417909b2dea3bd1ebff2ccf28ddb6a74d740", size = 9874154, upload-time = "2026-01-21T15:50:36.67Z" }, - { url = "https://files.pythonhosted.org/packages/63/d4/726c5a67a13bc66643e66d2e9ff115cead482a44fc56991d0c4014f15aaf/pandas-3.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d257699b9a9960e6125686098d5714ac59d05222bef7a5e6af7a7fd87c650801", size = 10384433, upload-time = "2026-01-21T15:50:39.132Z" }, - { url = "https://files.pythonhosted.org/packages/bf/2e/9211f09bedb04f9832122942de8b051804b31a39cfbad199a819bb88d9f3/pandas-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69780c98f286076dcafca38d8b8eee1676adf220199c0a39f0ecbf976b68151a", size = 10864519, upload-time = "2026-01-21T15:50:41.043Z" }, - { url = "https://files.pythonhosted.org/packages/00/8d/50858522cdc46ac88b9afdc3015e298959a70a08cd21e008a44e9520180c/pandas-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4a66384f017240f3858a4c8a7cf21b0591c3ac885cddb7758a589f0f71e87ebb", size = 11394124, upload-time = "2026-01-21T15:50:43.377Z" }, - { url = "https://files.pythonhosted.org/packages/86/3f/83b2577db02503cd93d8e95b0f794ad9d4be0ba7cb6c8bcdcac964a34a42/pandas-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be8c515c9bc33989d97b89db66ea0cececb0f6e3c2a87fcc8b69443a6923e95f", size = 11920444, upload-time = "2026-01-21T15:50:45.932Z" }, - { url = "https://files.pythonhosted.org/packages/64/2d/4f8a2f192ed12c90a0aab47f5557ece0e56b0370c49de9454a09de7381b2/pandas-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a453aad8c4f4e9f166436994a33884442ea62aa8b27d007311e87521b97246e1", size = 9730970, upload-time = "2026-01-21T15:50:47.962Z" }, - { url = "https://files.pythonhosted.org/packages/d4/64/ff571be435cf1e643ca98d0945d76732c0b4e9c37191a89c8550b105eed1/pandas-3.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:da768007b5a33057f6d9053563d6b74dd6d029c337d93c6d0d22a763a5c2ecc0", size = 9041950, upload-time = "2026-01-21T15:50:50.422Z" }, - { url = "https://files.pythonhosted.org/packages/6f/fa/7f0ac4ca8877c57537aaff2a842f8760e630d8e824b730eb2e859ffe96ca/pandas-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b78d646249b9a2bc191040988c7bb524c92fa8534fb0898a0741d7e6f2ffafa6", size = 10307129, upload-time = "2026-01-21T15:50:52.877Z" }, - { url = "https://files.pythonhosted.org/packages/6f/11/28a221815dcea4c0c9414dfc845e34a84a6a7dabc6da3194498ed5ba4361/pandas-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc9cba7b355cb4162442a88ce495e01cb605f17ac1e27d6596ac963504e0305f", size = 9850201, upload-time = "2026-01-21T15:50:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/ba/da/53bbc8c5363b7e5bd10f9ae59ab250fc7a382ea6ba08e4d06d8694370354/pandas-3.0.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c9a1a149aed3b6c9bf246033ff91e1b02d529546c5d6fb6b74a28fea0cf4c70", size = 10354031, upload-time = "2026-01-21T15:50:57.463Z" }, - { url = "https://files.pythonhosted.org/packages/f7/a3/51e02ebc2a14974170d51e2410dfdab58870ea9bcd37cda15bd553d24dc4/pandas-3.0.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95683af6175d884ee89471842acfca29172a85031fccdabc35e50c0984470a0e", size = 10861165, upload-time = "2026-01-21T15:50:59.32Z" }, - { url = "https://files.pythonhosted.org/packages/a5/fe/05a51e3cac11d161472b8297bd41723ea98013384dd6d76d115ce3482f9b/pandas-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1fbbb5a7288719e36b76b4f18d46ede46e7f916b6c8d9915b756b0a6c3f792b3", size = 11359359, upload-time = "2026-01-21T15:51:02.014Z" }, - { url = "https://files.pythonhosted.org/packages/ee/56/ba620583225f9b85a4d3e69c01df3e3870659cc525f67929b60e9f21dcd1/pandas-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e8b9808590fa364416b49b2a35c1f4cf2785a6c156935879e57f826df22038e", size = 11912907, upload-time = "2026-01-21T15:51:05.175Z" }, - { url = "https://files.pythonhosted.org/packages/c9/8c/c6638d9f67e45e07656b3826405c5cc5f57f6fd07c8b2572ade328c86e22/pandas-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:98212a38a709feb90ae658cb6227ea3657c22ba8157d4b8f913cd4c950de5e7e", size = 9732138, upload-time = "2026-01-21T15:51:07.569Z" }, - { url = "https://files.pythonhosted.org/packages/7b/bf/bd1335c3bf1770b6d8fed2799993b11c4971af93bb1b729b9ebbc02ca2ec/pandas-3.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:177d9df10b3f43b70307a149d7ec49a1229a653f907aa60a48f1877d0e6be3be", size = 9033568, upload-time = "2026-01-21T15:51:09.484Z" }, - { url = "https://files.pythonhosted.org/packages/8e/c6/f5e2171914d5e29b9171d495344097d54e3ffe41d2d85d8115baba4dc483/pandas-3.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2713810ad3806767b89ad3b7b69ba153e1c6ff6d9c20f9c2140379b2a98b6c98", size = 10741936, upload-time = "2026-01-21T15:51:11.693Z" }, - { url = "https://files.pythonhosted.org/packages/51/88/9a0164f99510a1acb9f548691f022c756c2314aad0d8330a24616c14c462/pandas-3.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:15d59f885ee5011daf8335dff47dcb8a912a27b4ad7826dc6cbe809fd145d327", size = 10393884, upload-time = "2026-01-21T15:51:14.197Z" }, - { url = "https://files.pythonhosted.org/packages/e0/53/b34d78084d88d8ae2b848591229da8826d1e65aacf00b3abe34023467648/pandas-3.0.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24e6547fb64d2c92665dd2adbfa4e85fa4fd70a9c070e7cfb03b629a0bbab5eb", size = 10310740, upload-time = "2026-01-21T15:51:16.093Z" }, - { url = "https://files.pythonhosted.org/packages/5b/d3/bee792e7c3d6930b74468d990604325701412e55d7aaf47460a22311d1a5/pandas-3.0.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48ee04b90e2505c693d3f8e8f524dab8cb8aaf7ddcab52c92afa535e717c4812", size = 10700014, upload-time = "2026-01-21T15:51:18.818Z" }, - { url = "https://files.pythonhosted.org/packages/55/db/2570bc40fb13aaed1cbc3fbd725c3a60ee162477982123c3adc8971e7ac1/pandas-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66f72fb172959af42a459e27a8d8d2c7e311ff4c1f7db6deb3b643dbc382ae08", size = 11323737, upload-time = "2026-01-21T15:51:20.784Z" }, - { url = "https://files.pythonhosted.org/packages/bc/2e/297ac7f21c8181b62a4cccebad0a70caf679adf3ae5e83cb676194c8acc3/pandas-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4a4a400ca18230976724a5066f20878af785f36c6756e498e94c2a5e5d57779c", size = 11771558, upload-time = "2026-01-21T15:51:22.977Z" }, - { url = "https://files.pythonhosted.org/packages/0a/46/e1c6876d71c14332be70239acce9ad435975a80541086e5ffba2f249bcf6/pandas-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:940eebffe55528074341a5a36515f3e4c5e25e958ebbc764c9502cfc35ba3faa", size = 10473771, upload-time = "2026-01-21T15:51:25.285Z" }, - { url = "https://files.pythonhosted.org/packages/c0/db/0270ad9d13c344b7a36fa77f5f8344a46501abf413803e885d22864d10bf/pandas-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:597c08fb9fef0edf1e4fa2f9828dd27f3d78f9b8c9b4a748d435ffc55732310b", size = 10312075, upload-time = "2026-01-21T15:51:28.5Z" }, - { url = "https://files.pythonhosted.org/packages/09/9f/c176f5e9717f7c91becfe0f55a52ae445d3f7326b4a2cf355978c51b7913/pandas-3.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:447b2d68ac5edcbf94655fe909113a6dba6ef09ad7f9f60c80477825b6c489fe", size = 9900213, upload-time = "2026-01-21T15:51:30.955Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e7/63ad4cc10b257b143e0a5ebb04304ad806b4e1a61c5da25f55896d2ca0f4/pandas-3.0.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:debb95c77ff3ed3ba0d9aa20c3a2f19165cc7956362f9873fce1ba0a53819d70", size = 10428768, upload-time = "2026-01-21T15:51:33.018Z" }, - { url = "https://files.pythonhosted.org/packages/9e/0e/4e4c2d8210f20149fd2248ef3fff26623604922bd564d915f935a06dd63d/pandas-3.0.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fedabf175e7cd82b69b74c30adbaa616de301291a5231138d7242596fc296a8d", size = 10882954, upload-time = "2026-01-21T15:51:35.287Z" }, - { url = "https://files.pythonhosted.org/packages/c6/60/c9de8ac906ba1f4d2250f8a951abe5135b404227a55858a75ad26f84db47/pandas-3.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:412d1a89aab46889f3033a386912efcdfa0f1131c5705ff5b668dda88305e986", size = 11430293, upload-time = "2026-01-21T15:51:37.57Z" }, - { url = "https://files.pythonhosted.org/packages/a1/69/806e6637c70920e5787a6d6896fd707f8134c2c55cd761e7249a97b7dc5a/pandas-3.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e979d22316f9350c516479dd3a92252be2937a9531ed3a26ec324198a99cdd49", size = 11952452, upload-time = "2026-01-21T15:51:39.618Z" }, - { url = "https://files.pythonhosted.org/packages/cb/de/918621e46af55164c400ab0ef389c9d969ab85a43d59ad1207d4ddbe30a5/pandas-3.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:083b11415b9970b6e7888800c43c82e81a06cd6b06755d84804444f0007d6bb7", size = 9851081, upload-time = "2026-01-21T15:51:41.758Z" }, - { url = "https://files.pythonhosted.org/packages/91/a1/3562a18dd0bd8c73344bfa26ff90c53c72f827df119d6d6b1dacc84d13e3/pandas-3.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:5db1e62cb99e739fa78a28047e861b256d17f88463c76b8dafc7c1338086dca8", size = 9174610, upload-time = "2026-01-21T15:51:44.312Z" }, - { url = "https://files.pythonhosted.org/packages/ce/26/430d91257eaf366f1737d7a1c158677caaf6267f338ec74e3a1ec444111c/pandas-3.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:697b8f7d346c68274b1b93a170a70974cdc7d7354429894d5927c1effdcccd73", size = 10761999, upload-time = "2026-01-21T15:51:46.899Z" }, - { url = "https://files.pythonhosted.org/packages/ec/1a/954eb47736c2b7f7fe6a9d56b0cb6987773c00faa3c6451a43db4beb3254/pandas-3.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8cb3120f0d9467ed95e77f67a75e030b67545bcfa08964e349252d674171def2", size = 10410279, upload-time = "2026-01-21T15:51:48.89Z" }, - { url = "https://files.pythonhosted.org/packages/20/fc/b96f3a5a28b250cd1b366eb0108df2501c0f38314a00847242abab71bb3a/pandas-3.0.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33fd3e6baa72899746b820c31e4b9688c8e1b7864d7aec2de7ab5035c285277a", size = 10330198, upload-time = "2026-01-21T15:51:51.015Z" }, - { url = "https://files.pythonhosted.org/packages/90/b3/d0e2952f103b4fbef1ef22d0c2e314e74fc9064b51cee30890b5e3286ee6/pandas-3.0.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8942e333dc67ceda1095227ad0febb05a3b36535e520154085db632c40ad084", size = 10728513, upload-time = "2026-01-21T15:51:53.387Z" }, - { url = "https://files.pythonhosted.org/packages/76/81/832894f286df828993dc5fd61c63b231b0fb73377e99f6c6c369174cf97e/pandas-3.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:783ac35c4d0fe0effdb0d67161859078618b1b6587a1af15928137525217a721", size = 11345550, upload-time = "2026-01-21T15:51:55.329Z" }, - { url = "https://files.pythonhosted.org/packages/34/a0/ed160a00fb4f37d806406bc0a79a8b62fe67f29d00950f8d16203ff3409b/pandas-3.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:125eb901e233f155b268bbef9abd9afb5819db74f0e677e89a61b246228c71ac", size = 11799386, upload-time = "2026-01-21T15:51:57.457Z" }, - { url = "https://files.pythonhosted.org/packages/36/c8/2ac00d7255252c5e3cf61b35ca92ca25704b0188f7454ca4aec08a33cece/pandas-3.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b86d113b6c109df3ce0ad5abbc259fe86a1bd4adfd4a31a89da42f84f65509bb", size = 10873041, upload-time = "2026-01-21T15:52:00.034Z" }, - { url = "https://files.pythonhosted.org/packages/e6/3f/a80ac00acbc6b35166b42850e98a4f466e2c0d9c64054161ba9620f95680/pandas-3.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1c39eab3ad38f2d7a249095f0a3d8f8c22cc0f847e98ccf5bbe732b272e2d9fa", size = 9441003, upload-time = "2026-01-21T15:52:02.281Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/da/99/b342345300f13440fe9fe385c3c481e2d9a595ee3bab4d3219247ac94e9a/pandas-3.0.2.tar.gz", hash = "sha256:f4753e73e34c8d83221ba58f232433fca2748be8b18dbca02d242ed153945043", size = 4645855, upload-time = "2026-03-31T06:48:30.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a727a73cbdba2f7458dc82449e2315899d5140b449015d822f515749a46cbbe0", size = 10326926, upload-time = "2026-03-31T06:46:08.29Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbbd4aa20ca51e63b53bbde6a0fa4254b1aaabb74d2f542df7a7959feb1d760c", size = 9926987, upload-time = "2026-03-31T06:46:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/52/77/9b1c2d6070b5dbe239a7bc889e21bfa58720793fb902d1e070695d87c6d0/pandas-3.0.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:339dda302bd8369dedeae979cb750e484d549b563c3f54f3922cb8ff4978c5eb", size = 10757067, upload-time = "2026-03-31T06:46:14.903Z" }, + { url = "https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:61c2fd96d72b983a9891b2598f286befd4ad262161a609c92dc1652544b46b76", size = 11258787, upload-time = "2026-03-31T06:46:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/90/e3/3f1126d43d3702ca8773871a81c9f15122a1f412342cc56284ffda5b1f70/pandas-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c934008c733b8bbea273ea308b73b3156f0181e5b72960790b09c18a2794fe1e", size = 11771616, upload-time = "2026-03-31T06:46:20.532Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cf/0f4e268e1f5062e44a6bda9f925806721cd4c95c2b808a4c82ebe914f96b/pandas-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:60a80bb4feacbef5e1447a3f82c33209c8b7e07f28d805cfd1fb951e5cb443aa", size = 12337623, upload-time = "2026-03-31T06:46:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed72cb3f45190874eb579c64fa92d9df74e98fd63e2be7f62bce5ace0ade61df", size = 9897372, upload-time = "2026-03-31T06:46:26.703Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/781516b808a99ddf288143cec46b342b3016c3414d137da1fdc3290d8860/pandas-3.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f12b1a9e332c01e09510586f8ca9b108fd631fd656af82e452d7315ef6df5f9f", size = 9154922, upload-time = "2026-03-31T06:46:30.284Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b0/c20bd4d6d3f736e6bd6b55794e9cd0a617b858eaad27c8f410ea05d953b7/pandas-3.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:232a70ebb568c0c4d2db4584f338c1577d81e3af63292208d615907b698a0f18", size = 10347921, upload-time = "2026-03-31T06:46:33.36Z" }, + { url = "https://files.pythonhosted.org/packages/35/d0/4831af68ce30cc2d03c697bea8450e3225a835ef497d0d70f31b8cdde965/pandas-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:970762605cff1ca0d3f71ed4f3a769ea8f85fc8e6348f6e110b8fea7e6eb5a14", size = 9888127, upload-time = "2026-03-31T06:46:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/61/a9/16ea9346e1fc4a96e2896242d9bc674764fb9049b0044c0132502f7a771e/pandas-3.0.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aff4e6f4d722e0652707d7bcb190c445fe58428500c6d16005b02401764b1b3d", size = 10399577, upload-time = "2026-03-31T06:46:39.224Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a8/3a61a721472959ab0ce865ef05d10b0d6bfe27ce8801c99f33d4fa996e65/pandas-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef8b27695c3d3dc78403c9a7d5e59a62d5464a7e1123b4e0042763f7104dc74f", size = 10880030, upload-time = "2026-03-31T06:46:42.412Z" }, + { url = "https://files.pythonhosted.org/packages/da/65/7225c0ea4d6ce9cb2160a7fb7f39804871049f016e74782e5dade4d14109/pandas-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f8d68083e49e16b84734eb1a4dcae4259a75c90fb6e2251ab9a00b61120c06ab", size = 11409468, upload-time = "2026-03-31T06:46:45.2Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/46e7c76032639f2132359b5cf4c785dd8cf9aea5ea64699eac752f02b9db/pandas-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:32cc41f310ebd4a296d93515fcac312216adfedb1894e879303987b8f1e2b97d", size = 11936381, upload-time = "2026-03-31T06:46:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/8b/721a9cff6fa6a91b162eb51019c6243b82b3226c71bb6c8ef4a9bd65cbc6/pandas-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:a4785e1d6547d8427c5208b748ae2efb64659a21bd82bf440d4262d02bfa02a4", size = 9744993, upload-time = "2026-03-31T06:46:51.488Z" }, + { url = "https://files.pythonhosted.org/packages/d5/18/7f0bd34ae27b28159aa80f2a6799f47fda34f7fb938a76e20c7b7fe3b200/pandas-3.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:08504503f7101300107ecdc8df73658e4347586db5cfdadabc1592e9d7e7a0fd", size = 9056118, upload-time = "2026-03-31T06:46:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ca/3e639a1ea6fcd0617ca4e8ca45f62a74de33a56ae6cd552735470b22c8d3/pandas-3.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5918ba197c951dec132b0c5929a00c0bf05d5942f590d3c10a807f6e15a57d3", size = 10321105, upload-time = "2026-03-31T06:46:57.327Z" }, + { url = "https://files.pythonhosted.org/packages/0b/77/dbc82ff2fb0e63c6564356682bf201edff0ba16c98630d21a1fb312a8182/pandas-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d606a041c89c0a474a4702d532ab7e73a14fe35c8d427b972a625c8e46373668", size = 9864088, upload-time = "2026-03-31T06:46:59.935Z" }, + { url = "https://files.pythonhosted.org/packages/5c/2b/341f1b04bbca2e17e13cd3f08c215b70ef2c60c5356ef1e8c6857449edc7/pandas-3.0.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:710246ba0616e86891b58ab95f2495143bb2bc83ab6b06747c74216f583a6ac9", size = 10369066, upload-time = "2026-03-31T06:47:02.792Z" }, + { url = "https://files.pythonhosted.org/packages/12/c5/cbb1ffefb20a93d3f0e1fdcda699fb84976210d411b008f97f48bf6ce27e/pandas-3.0.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d3cfe227c725b1f3dff4278b43d8c784656a42a9325b63af6b1492a8232209e", size = 10876780, upload-time = "2026-03-31T06:47:06.205Z" }, + { url = "https://files.pythonhosted.org/packages/98/fe/2249ae5e0a69bd0ddf17353d0a5d26611d70970111f5b3600cdc8be883e7/pandas-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c3b723df9087a9a9a840e263ebd9f88b64a12075d1bf2ea401a5a42f254f084d", size = 11375181, upload-time = "2026-03-31T06:47:09.383Z" }, + { url = "https://files.pythonhosted.org/packages/de/64/77a38b09e70b6464883b8d7584ab543e748e42c1b5d337a2ee088e0df741/pandas-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3096110bf9eac0070b7208465f2740e2d8a670d5cb6530b5bb884eca495fd39", size = 11928899, upload-time = "2026-03-31T06:47:12.686Z" }, + { url = "https://files.pythonhosted.org/packages/5e/52/42855bf626868413f761addd574acc6195880ae247a5346477a4361c3acb/pandas-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:07a10f5c36512eead51bc578eb3354ad17578b22c013d89a796ab5eee90cd991", size = 9746574, upload-time = "2026-03-31T06:47:15.64Z" }, + { url = "https://files.pythonhosted.org/packages/88/39/21304ae06a25e8bf9fc820d69b29b2c495b2ae580d1e143146c309941760/pandas-3.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:5fdbfa05931071aba28b408e59226186b01eb5e92bea2ab78b65863ca3228d84", size = 9047156, upload-time = "2026-03-31T06:47:18.595Z" }, + { url = "https://files.pythonhosted.org/packages/72/20/7defa8b27d4f330a903bb68eea33be07d839c5ea6bdda54174efcec0e1d2/pandas-3.0.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:dbc20dea3b9e27d0e66d74c42b2d0c1bed9c2ffe92adea33633e3bedeb5ac235", size = 10756238, upload-time = "2026-03-31T06:47:22.012Z" }, + { url = "https://files.pythonhosted.org/packages/e9/95/49433c14862c636afc0e9b2db83ff16b3ad92959364e52b2955e44c8e94c/pandas-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b75c347eff42497452116ce05ef461822d97ce5b9ff8df6edacb8076092c855d", size = 10408520, upload-time = "2026-03-31T06:47:25.197Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f8/462ad2b5881d6b8ec8e5f7ed2ea1893faa02290d13870a1600fe72ad8efc/pandas-3.0.2-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1478075142e83a5571782ad007fb201ed074bdeac7ebcc8890c71442e96adf7", size = 10324154, upload-time = "2026-03-31T06:47:28.097Z" }, + { url = "https://files.pythonhosted.org/packages/0a/65/d1e69b649cbcddda23ad6e4c40ef935340f6f652a006e5cbc3555ac8adb3/pandas-3.0.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5880314e69e763d4c8b27937090de570f1fb8d027059a7ada3f7f8e98bdcb677", size = 10714449, upload-time = "2026-03-31T06:47:30.85Z" }, + { url = "https://files.pythonhosted.org/packages/47/a4/85b59bc65b8190ea3689882db6cdf32a5003c0ccd5a586c30fdcc3ffc4fc/pandas-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b5329e26898896f06035241a626d7c335daa479b9bbc82be7c2742d048e41172", size = 11338475, upload-time = "2026-03-31T06:47:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c4/bc6966c6e38e5d9478b935272d124d80a589511ed1612a5d21d36f664c68/pandas-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:81526c4afd31971f8b62671442a4b2b51e0aa9acc3819c9f0f12a28b6fcf85f1", size = 11786568, upload-time = "2026-03-31T06:47:36.941Z" }, + { url = "https://files.pythonhosted.org/packages/e8/74/09298ca9740beed1d3504e073d67e128aa07e5ca5ca2824b0c674c0b8676/pandas-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:7cadd7e9a44ec13b621aec60f9150e744cfc7a3dd32924a7e2f45edff31823b0", size = 10488652, upload-time = "2026-03-31T06:47:40.612Z" }, + { url = "https://files.pythonhosted.org/packages/bb/40/c6ea527147c73b24fc15c891c3fcffe9c019793119c5742b8784a062c7db/pandas-3.0.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:db0dbfd2a6cdf3770aa60464d50333d8f3d9165b2f2671bcc299b72de5a6677b", size = 10326084, upload-time = "2026-03-31T06:47:43.834Z" }, + { url = "https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0555c5882688a39317179ab4a0ed41d3ebc8812ab14c69364bbee8fb7a3f6288", size = 9914146, upload-time = "2026-03-31T06:47:46.67Z" }, + { url = "https://files.pythonhosted.org/packages/8d/77/3a227ff3337aa376c60d288e1d61c5d097131d0ac71f954d90a8f369e422/pandas-3.0.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01f31a546acd5574ef77fe199bc90b55527c225c20ccda6601cf6b0fd5ed597c", size = 10444081, upload-time = "2026-03-31T06:47:49.681Z" }, + { url = "https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535", size = 10897535, upload-time = "2026-03-31T06:47:53.033Z" }, + { url = "https://files.pythonhosted.org/packages/06/9d/98cc7a7624f7932e40f434299260e2917b090a579d75937cb8a57b9d2de3/pandas-3.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0f48afd9bb13300ffb5a3316973324c787054ba6665cda0da3fbd67f451995db", size = 11446992, upload-time = "2026-03-31T06:47:56.193Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cd/19ff605cc3760e80602e6826ddef2824d8e7050ed80f2e11c4b079741dc3/pandas-3.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6c4d8458b97a35717b62469a4ea0e85abd5ed8687277f5ccfc67f8a5126f8c53", size = 11968257, upload-time = "2026-03-31T06:47:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:b35d14bb5d8285d9494fe93815a9e9307c0876e10f1e8e89ac5b88f728ec8dcf", size = 9865893, upload-time = "2026-03-31T06:48:02.038Z" }, + { url = "https://files.pythonhosted.org/packages/08/71/e5ec979dd2e8a093dacb8864598c0ff59a0cee0bbcdc0bfec16a51684d4f/pandas-3.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:63d141b56ef686f7f0d714cfb8de4e320475b86bf4b620aa0b7da89af8cbdbbb", size = 9188644, upload-time = "2026-03-31T06:48:05.045Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6c/7b45d85db19cae1eb524f2418ceaa9d85965dcf7b764ed151386b7c540f0/pandas-3.0.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:140f0cffb1fa2524e874dde5b477d9defe10780d8e9e220d259b2c0874c89d9d", size = 10776246, upload-time = "2026-03-31T06:48:07.789Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3e/7b00648b086c106e81766f25322b48aa8dfa95b55e621dbdf2fdd413a117/pandas-3.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae37e833ff4fed0ba352f6bdd8b73ba3ab3256a85e54edfd1ab51ae40cca0af8", size = 10424801, upload-time = "2026-03-31T06:48:10.897Z" }, + { url = "https://files.pythonhosted.org/packages/da/6e/558dd09a71b53b4008e7fc8a98ec6d447e9bfb63cdaeea10e5eb9b2dabe8/pandas-3.0.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d888a5c678a419a5bb41a2a93818e8ed9fd3172246555c0b37b7cc27027effd", size = 10345643, upload-time = "2026-03-31T06:48:13.7Z" }, + { url = "https://files.pythonhosted.org/packages/be/e3/921c93b4d9a280409451dc8d07b062b503bbec0531d2627e73a756e99a82/pandas-3.0.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b444dc64c079e84df91baa8bf613d58405645461cabca929d9178f2cd392398d", size = 10743641, upload-time = "2026-03-31T06:48:16.659Z" }, + { url = "https://files.pythonhosted.org/packages/56/ca/fd17286f24fa3b4d067965d8d5d7e14fe557dd4f979a0b068ac0deaf8228/pandas-3.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4544c7a54920de8eeacaa1466a6b7268ecfbc9bc64ab4dbb89c6bbe94d5e0660", size = 11361993, upload-time = "2026-03-31T06:48:19.475Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a5/2f6ed612056819de445a433ca1f2821ac3dab7f150d569a59e9cc105de1d/pandas-3.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:734be7551687c00fbd760dc0522ed974f82ad230d4a10f54bf51b80d44a08702", size = 11815274, upload-time = "2026-03-31T06:48:22.695Z" }, + { url = "https://files.pythonhosted.org/packages/00/2f/b622683e99ec3ce00b0854bac9e80868592c5b051733f2cf3a868e5fea26/pandas-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:57a07209bebcbcf768d2d13c9b78b852f9a15978dac41b9e6421a81ad4cdd276", size = 10888530, upload-time = "2026-03-31T06:48:25.806Z" }, + { 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.5" +version = "0.8.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload-time = "2025-08-23T15:15:28.028Z" } +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/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, + { 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.0.4" +version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/17/9c3094b822982b9f1ea666d8580ce59000f61f87c1663556fb72031ad9ec/pathspec-1.1.0.tar.gz", hash = "sha256:f5d7c555da02fd8dde3e4a2354b6aba817a89112fa8f333f7917a2a4834dd080", size = 133918, upload-time = "2026-04-23T01:46:22.298Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c9/8eed0486f074e9f1ca7f8ce5ad663e65f12fdab344028d658fa1b03d35e0/pathspec-1.1.0-py3-none-any.whl", hash = "sha256:574b128f7456bd899045ccd142dd446af7e6cfd0072d63ad73fbc55fbb4aaa42", size = 56264, upload-time = "2026-04-23T01:46:20.606Z" }, ] [[package]] @@ -1730,111 +1769,111 @@ wheels = [ [[package]] name = "pillow" -version = "12.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/c4/bf8328039de6cc22182c3ef007a2abfbbdab153661c0a9aa78af8d706391/pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3", size = 5304057, upload-time = "2026-01-02T09:10:46.627Z" }, - { url = "https://files.pythonhosted.org/packages/43/06/7264c0597e676104cc22ca73ee48f752767cd4b1fe084662620b17e10120/pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0", size = 4657811, upload-time = "2026-01-02T09:10:49.548Z" }, - { url = "https://files.pythonhosted.org/packages/72/64/f9189e44474610daf83da31145fa56710b627b5c4c0b9c235e34058f6b31/pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451", size = 6232243, upload-time = "2026-01-02T09:10:51.62Z" }, - { url = "https://files.pythonhosted.org/packages/ef/30/0df458009be6a4caca4ca2c52975e6275c387d4e5c95544e34138b41dc86/pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e", size = 8037872, upload-time = "2026-01-02T09:10:53.446Z" }, - { url = "https://files.pythonhosted.org/packages/e4/86/95845d4eda4f4f9557e25381d70876aa213560243ac1a6d619c46caaedd9/pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84", size = 6345398, upload-time = "2026-01-02T09:10:55.426Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1f/8e66ab9be3aaf1435bc03edd1ebdf58ffcd17f7349c1d970cafe87af27d9/pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0", size = 7034667, upload-time = "2026-01-02T09:10:57.11Z" }, - { url = "https://files.pythonhosted.org/packages/f9/f6/683b83cb9b1db1fb52b87951b1c0b99bdcfceaa75febf11406c19f82cb5e/pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b", size = 6458743, upload-time = "2026-01-02T09:10:59.331Z" }, - { url = "https://files.pythonhosted.org/packages/9a/7d/de833d63622538c1d58ce5395e7c6cb7e7dce80decdd8bde4a484e095d9f/pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18", size = 7159342, upload-time = "2026-01-02T09:11:01.82Z" }, - { url = "https://files.pythonhosted.org/packages/8c/40/50d86571c9e5868c42b81fe7da0c76ca26373f3b95a8dd675425f4a92ec1/pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64", size = 6328655, upload-time = "2026-01-02T09:11:04.556Z" }, - { url = "https://files.pythonhosted.org/packages/6c/af/b1d7e301c4cd26cd45d4af884d9ee9b6fab893b0ad2450d4746d74a6968c/pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75", size = 7031469, upload-time = "2026-01-02T09:11:06.538Z" }, - { url = "https://files.pythonhosted.org/packages/48/36/d5716586d887fb2a810a4a61518a327a1e21c8b7134c89283af272efe84b/pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304", size = 2452515, upload-time = "2026-01-02T09:11:08.226Z" }, - { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, - { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, - { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, - { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, - { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, - { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" }, - { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" }, - { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" }, - { url = "https://files.pythonhosted.org/packages/dd/c7/2530a4aa28248623e9d7f27316b42e27c32ec410f695929696f2e0e4a778/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1", size = 4062543, upload-time = "2026-01-02T09:11:31.566Z" }, - { url = "https://files.pythonhosted.org/packages/8f/1f/40b8eae823dc1519b87d53c30ed9ef085506b05281d313031755c1705f73/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179", size = 4138373, upload-time = "2026-01-02T09:11:33.367Z" }, - { url = "https://files.pythonhosted.org/packages/d4/77/6fa60634cf06e52139fd0e89e5bbf055e8166c691c42fb162818b7fda31d/pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0", size = 3601241, upload-time = "2026-01-02T09:11:35.011Z" }, - { url = "https://files.pythonhosted.org/packages/4f/bf/28ab865de622e14b747f0cd7877510848252d950e43002e224fb1c9ababf/pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587", size = 5262410, upload-time = "2026-01-02T09:11:36.682Z" }, - { url = "https://files.pythonhosted.org/packages/1c/34/583420a1b55e715937a85bd48c5c0991598247a1fd2eb5423188e765ea02/pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac", size = 4657312, upload-time = "2026-01-02T09:11:38.535Z" }, - { url = "https://files.pythonhosted.org/packages/1d/fd/f5a0896839762885b3376ff04878f86ab2b097c2f9a9cdccf4eda8ba8dc0/pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b", size = 6232605, upload-time = "2026-01-02T09:11:40.602Z" }, - { url = "https://files.pythonhosted.org/packages/98/aa/938a09d127ac1e70e6ed467bd03834350b33ef646b31edb7452d5de43792/pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea", size = 8041617, upload-time = "2026-01-02T09:11:42.721Z" }, - { url = "https://files.pythonhosted.org/packages/17/e8/538b24cb426ac0186e03f80f78bc8dc7246c667f58b540bdd57c71c9f79d/pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c", size = 6346509, upload-time = "2026-01-02T09:11:44.955Z" }, - { url = "https://files.pythonhosted.org/packages/01/9a/632e58ec89a32738cabfd9ec418f0e9898a2b4719afc581f07c04a05e3c9/pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc", size = 7038117, upload-time = "2026-01-02T09:11:46.736Z" }, - { url = "https://files.pythonhosted.org/packages/c7/a2/d40308cf86eada842ca1f3ffa45d0ca0df7e4ab33c83f81e73f5eaed136d/pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644", size = 6460151, upload-time = "2026-01-02T09:11:48.625Z" }, - { url = "https://files.pythonhosted.org/packages/f1/88/f5b058ad6453a085c5266660a1417bdad590199da1b32fb4efcff9d33b05/pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c", size = 7164534, upload-time = "2026-01-02T09:11:50.445Z" }, - { url = "https://files.pythonhosted.org/packages/19/ce/c17334caea1db789163b5d855a5735e47995b0b5dc8745e9a3605d5f24c0/pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171", size = 6332551, upload-time = "2026-01-02T09:11:52.234Z" }, - { url = "https://files.pythonhosted.org/packages/e5/07/74a9d941fa45c90a0d9465098fe1ec85de3e2afbdc15cc4766622d516056/pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a", size = 7040087, upload-time = "2026-01-02T09:11:54.822Z" }, - { url = "https://files.pythonhosted.org/packages/88/09/c99950c075a0e9053d8e880595926302575bc742b1b47fe1bbcc8d388d50/pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45", size = 2452470, upload-time = "2026-01-02T09:11:56.522Z" }, - { url = "https://files.pythonhosted.org/packages/b5/ba/970b7d85ba01f348dee4d65412476321d40ee04dcb51cd3735b9dc94eb58/pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d", size = 5264816, upload-time = "2026-01-02T09:11:58.227Z" }, - { url = "https://files.pythonhosted.org/packages/10/60/650f2fb55fdba7a510d836202aa52f0baac633e50ab1cf18415d332188fb/pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0", size = 4660472, upload-time = "2026-01-02T09:12:00.798Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c0/5273a99478956a099d533c4f46cbaa19fd69d606624f4334b85e50987a08/pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554", size = 6268974, upload-time = "2026-01-02T09:12:02.572Z" }, - { url = "https://files.pythonhosted.org/packages/b4/26/0bf714bc2e73d5267887d47931d53c4ceeceea6978148ed2ab2a4e6463c4/pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e", size = 8073070, upload-time = "2026-01-02T09:12:04.75Z" }, - { url = "https://files.pythonhosted.org/packages/43/cf/1ea826200de111a9d65724c54f927f3111dc5ae297f294b370a670c17786/pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82", size = 6380176, upload-time = "2026-01-02T09:12:06.626Z" }, - { url = "https://files.pythonhosted.org/packages/03/e0/7938dd2b2013373fd85d96e0f38d62b7a5a262af21ac274250c7ca7847c9/pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4", size = 7067061, upload-time = "2026-01-02T09:12:08.624Z" }, - { url = "https://files.pythonhosted.org/packages/86/ad/a2aa97d37272a929a98437a8c0ac37b3cf012f4f8721e1bd5154699b2518/pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0", size = 6491824, upload-time = "2026-01-02T09:12:10.488Z" }, - { url = "https://files.pythonhosted.org/packages/a4/44/80e46611b288d51b115826f136fb3465653c28f491068a72d3da49b54cd4/pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b", size = 7190911, upload-time = "2026-01-02T09:12:12.772Z" }, - { url = "https://files.pythonhosted.org/packages/86/77/eacc62356b4cf81abe99ff9dbc7402750044aed02cfd6a503f7c6fc11f3e/pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65", size = 6336445, upload-time = "2026-01-02T09:12:14.775Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3c/57d81d0b74d218706dafccb87a87ea44262c43eef98eb3b164fd000e0491/pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0", size = 7045354, upload-time = "2026-01-02T09:12:16.599Z" }, - { url = "https://files.pythonhosted.org/packages/ac/82/8b9b97bba2e3576a340f93b044a3a3a09841170ab4c1eb0d5c93469fd32f/pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8", size = 2454547, upload-time = "2026-01-02T09:12:18.704Z" }, - { url = "https://files.pythonhosted.org/packages/8c/87/bdf971d8bbcf80a348cc3bacfcb239f5882100fe80534b0ce67a784181d8/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91", size = 4062533, upload-time = "2026-01-02T09:12:20.791Z" }, - { url = "https://files.pythonhosted.org/packages/ff/4f/5eb37a681c68d605eb7034c004875c81f86ec9ef51f5be4a63eadd58859a/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796", size = 4138546, upload-time = "2026-01-02T09:12:23.664Z" }, - { url = "https://files.pythonhosted.org/packages/11/6d/19a95acb2edbace40dcd582d077b991646b7083c41b98da4ed7555b59733/pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd", size = 3601163, upload-time = "2026-01-02T09:12:26.338Z" }, - { url = "https://files.pythonhosted.org/packages/fc/36/2b8138e51cb42e4cc39c3297713455548be855a50558c3ac2beebdc251dd/pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13", size = 5266086, upload-time = "2026-01-02T09:12:28.782Z" }, - { url = "https://files.pythonhosted.org/packages/53/4b/649056e4d22e1caa90816bf99cef0884aed607ed38075bd75f091a607a38/pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e", size = 4657344, upload-time = "2026-01-02T09:12:31.117Z" }, - { url = "https://files.pythonhosted.org/packages/6c/6b/c5742cea0f1ade0cd61485dc3d81f05261fc2276f537fbdc00802de56779/pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643", size = 6232114, upload-time = "2026-01-02T09:12:32.936Z" }, - { url = "https://files.pythonhosted.org/packages/bf/8f/9f521268ce22d63991601aafd3d48d5ff7280a246a1ef62d626d67b44064/pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5", size = 8042708, upload-time = "2026-01-02T09:12:34.78Z" }, - { url = "https://files.pythonhosted.org/packages/1a/eb/257f38542893f021502a1bbe0c2e883c90b5cff26cc33b1584a841a06d30/pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de", size = 6347762, upload-time = "2026-01-02T09:12:36.748Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5a/8ba375025701c09b309e8d5163c5a4ce0102fa86bbf8800eb0d7ac87bc51/pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9", size = 7039265, upload-time = "2026-01-02T09:12:39.082Z" }, - { url = "https://files.pythonhosted.org/packages/cf/dc/cf5e4cdb3db533f539e88a7bbf9f190c64ab8a08a9bc7a4ccf55067872e4/pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a", size = 6462341, upload-time = "2026-01-02T09:12:40.946Z" }, - { url = "https://files.pythonhosted.org/packages/d0/47/0291a25ac9550677e22eda48510cfc4fa4b2ef0396448b7fbdc0a6946309/pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a", size = 7165395, upload-time = "2026-01-02T09:12:42.706Z" }, - { url = "https://files.pythonhosted.org/packages/4f/4c/e005a59393ec4d9416be06e6b45820403bb946a778e39ecec62f5b2b991e/pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030", size = 6431413, upload-time = "2026-01-02T09:12:44.944Z" }, - { url = "https://files.pythonhosted.org/packages/1c/af/f23697f587ac5f9095d67e31b81c95c0249cd461a9798a061ed6709b09b5/pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94", size = 7176779, upload-time = "2026-01-02T09:12:46.727Z" }, - { url = "https://files.pythonhosted.org/packages/b3/36/6a51abf8599232f3e9afbd16d52829376a68909fe14efe29084445db4b73/pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4", size = 2543105, upload-time = "2026-01-02T09:12:49.243Z" }, - { url = "https://files.pythonhosted.org/packages/82/54/2e1dd20c8749ff225080d6ba465a0cab4387f5db0d1c5fb1439e2d99923f/pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2", size = 5268571, upload-time = "2026-01-02T09:12:51.11Z" }, - { url = "https://files.pythonhosted.org/packages/57/61/571163a5ef86ec0cf30d265ac2a70ae6fc9e28413d1dc94fa37fae6bda89/pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61", size = 4660426, upload-time = "2026-01-02T09:12:52.865Z" }, - { url = "https://files.pythonhosted.org/packages/5e/e1/53ee5163f794aef1bf84243f755ee6897a92c708505350dd1923f4afec48/pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51", size = 6269908, upload-time = "2026-01-02T09:12:54.884Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/b4b4106ff0ee1afa1dc599fde6ab230417f800279745124f6c50bcffed8e/pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc", size = 8074733, upload-time = "2026-01-02T09:12:56.802Z" }, - { url = "https://files.pythonhosted.org/packages/19/9f/80b411cbac4a732439e629a26ad3ef11907a8c7fc5377b7602f04f6fe4e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14", size = 6381431, upload-time = "2026-01-02T09:12:58.823Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b7/d65c45db463b66ecb6abc17c6ba6917a911202a07662247e1355ce1789e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8", size = 7068529, upload-time = "2026-01-02T09:13:00.885Z" }, - { url = "https://files.pythonhosted.org/packages/50/96/dfd4cd726b4a45ae6e3c669fc9e49deb2241312605d33aba50499e9d9bd1/pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924", size = 6492981, upload-time = "2026-01-02T09:13:03.314Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1c/b5dc52cf713ae46033359c5ca920444f18a6359ce1020dd3e9c553ea5bc6/pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef", size = 7191878, upload-time = "2026-01-02T09:13:05.276Z" }, - { url = "https://files.pythonhosted.org/packages/53/26/c4188248bd5edaf543864fe4834aebe9c9cb4968b6f573ce014cc42d0720/pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988", size = 6438703, upload-time = "2026-01-02T09:13:07.491Z" }, - { url = "https://files.pythonhosted.org/packages/b8/0e/69ed296de8ea05cb03ee139cee600f424ca166e632567b2d66727f08c7ed/pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6", size = 7182927, upload-time = "2026-01-02T09:13:09.841Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f5/68334c015eed9b5cff77814258717dec591ded209ab5b6fb70e2ae873d1d/pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831", size = 2545104, upload-time = "2026-01-02T09:13:12.068Z" }, - { url = "https://files.pythonhosted.org/packages/8b/bc/224b1d98cffd7164b14707c91aac83c07b047fbd8f58eba4066a3e53746a/pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377", size = 5228605, upload-time = "2026-01-02T09:13:14.084Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ca/49ca7769c4550107de049ed85208240ba0f330b3f2e316f24534795702ce/pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72", size = 4622245, upload-time = "2026-01-02T09:13:15.964Z" }, - { url = "https://files.pythonhosted.org/packages/73/48/fac807ce82e5955bcc2718642b94b1bd22a82a6d452aea31cbb678cddf12/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c", size = 5247593, upload-time = "2026-01-02T09:13:17.913Z" }, - { url = "https://files.pythonhosted.org/packages/d2/95/3e0742fe358c4664aed4fd05d5f5373dcdad0b27af52aa0972568541e3f4/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd", size = 6989008, upload-time = "2026-01-02T09:13:20.083Z" }, - { url = "https://files.pythonhosted.org/packages/5a/74/fe2ac378e4e202e56d50540d92e1ef4ff34ed687f3c60f6a121bcf99437e/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc", size = 5313824, upload-time = "2026-01-02T09:13:22.405Z" }, - { url = "https://files.pythonhosted.org/packages/f3/77/2a60dee1adee4e2655ac328dd05c02a955c1cd683b9f1b82ec3feb44727c/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a", size = 5963278, upload-time = "2026-01-02T09:13:24.706Z" }, - { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" }, +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, + { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, + { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, + { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, + { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, + { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, + { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, + { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, + { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, + { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, + { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, + { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, ] [[package]] name = "platformdirs" -version = "4.5.1" +version = "4.9.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, + { 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.6.0" +version = "6.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "narwhals" }, { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/fb/41efe84970cfddefd4ccf025e2cbfafe780004555f583e93dba3dac2cdef/plotly-6.6.0.tar.gz", hash = "sha256:b897f15f3b02028d69f755f236be890ba950d0a42d7dfc619b44e2d8cea8748c", size = 7027956, upload-time = "2026-03-02T21:10:25.321Z" } +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/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl", hash = "sha256:8d6daf0f87412e0c0bfe72e809d615217ab57cc715899a1e5145135a7800d1d0", size = 9910315, upload-time = "2026-03-02T21:10:18.131Z" }, + { 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]] @@ -1869,7 +1908,7 @@ wheels = [ [[package]] name = "pre-commit" -version = "4.5.1" +version = "4.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -1878,9 +1917,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/22/2de9408ac81acbb8a7d05d4cc064a152ccf33b3d480ebe0cd292153db239/pre_commit-4.6.0.tar.gz", hash = "sha256:718d2208cef53fdc38206e40524a6d4d9576d103eb16f0fec11c875e7716e9d9", size = 198525, upload-time = "2026-04-21T20:31:41.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, + { 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]] @@ -1909,101 +1948,141 @@ wheels = [ [[package]] name = "propcache" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, - { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, - { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, - { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, - { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, - { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, - { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, - { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, - { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, - { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, - { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, - { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, - { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, - { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, - { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, - { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, - { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, - { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, - { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, - { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, - { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, - { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, - { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, - { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, - { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, - { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, - { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, - { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, - { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, - { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, - { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, - { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, - { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, - { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, - { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, - { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, - { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, - { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, - { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, - { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, - { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, - { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, - { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, - { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, - { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, - { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, - { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, - { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, - { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, - { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, - { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, - { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, - { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, - { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, - { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, - { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, - { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, - { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, - { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, - { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, - { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, - { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, - { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, - { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, - { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, - { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, - { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, - { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, - { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, - { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, - { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, - { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, - { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +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]] @@ -2054,7 +2133,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.5" +version = "2.13.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -2062,111 +2141,116 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, + { url = "https://files.pythonhosted.org/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, ] [[package]] name = "pydantic-core" -version = "2.41.5" +version = "2.46.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, - { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, - { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, - { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, - { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, - { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, - { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, - { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, - { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, - { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, - { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, - { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, - { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, - { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, - { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, - { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, - { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, - { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, - { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, - { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, - { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, - { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, - { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, - { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, - { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, - { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, - { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, - { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, - { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a2/1ba90a83e85a3f94c796b184f3efde9c72f2830dcda493eea8d59ba78e6d/pydantic_core-2.46.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ab124d49d0459b2373ecf54118a45c28a1e6d4192a533fbc915e70f556feb8e5", size = 2106740, upload-time = "2026-04-20T14:41:20.932Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f6/99ae893c89a0b9d3daec9f95487aa676709aa83f67643b3f0abaf4ab628a/pydantic_core-2.46.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cca67d52a5c7a16aed2b3999e719c4bcf644074eac304a5d3d62dd70ae7d4b2c", size = 1948293, upload-time = "2026-04-20T14:43:42.115Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b8/2e8e636dc9e3f16c2e16bf0849e24be82c5ee82c603c65fc0326666328fc/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c024e08c0ba23e6fd68c771a521e9d6a792f2ebb0fa734296b36394dc30390e", size = 1973222, upload-time = "2026-04-20T14:41:57.841Z" }, + { url = "https://files.pythonhosted.org/packages/34/36/0e730beec4d83c5306f417afbd82ff237d9a21e83c5edf675f31ed84c1fe/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6645ce7eec4928e29a1e3b3d5c946621d105d3e79f0c9cddf07c2a9770949287", size = 2053852, upload-time = "2026-04-20T14:40:43.077Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f0/3071131f47e39136a17814576e0fada9168569f7f8c0e6ac4d1ede6a4958/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a712c7118e6c5ea96562f7b488435172abb94a3c53c22c9efc1412264a45cbbe", size = 2221134, upload-time = "2026-04-20T14:43:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a9/a2dc023eec5aa4b02a467874bad32e2446957d2adcab14e107eab502e978/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69a868ef3ff206343579021c40faf3b1edc64b1cc508ff243a28b0a514ccb050", size = 2279785, upload-time = "2026-04-20T14:41:19.285Z" }, + { url = "https://files.pythonhosted.org/packages/0a/44/93f489d16fb63fbd41c670441536541f6e8cfa1e5a69f40bc9c5d30d8c90/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc7e8c32db809aa0f6ea1d6869ebc8518a65d5150fdfad8bcae6a49ae32a22e2", size = 2089404, upload-time = "2026-04-20T14:43:10.108Z" }, + { url = "https://files.pythonhosted.org/packages/2a/78/8692e3aa72b2d004f7a5d937f1dfdc8552ba26caf0bec75f342c40f00dec/pydantic_core-2.46.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3481bd1341dc85779ee506bc8e1196a277ace359d89d28588a9468c3ecbe63fa", size = 2114898, upload-time = "2026-04-20T14:44:51.475Z" }, + { url = "https://files.pythonhosted.org/packages/6a/62/e83133f2e7832532060175cebf1f13748f4c7e7e7165cdd1f611f174494b/pydantic_core-2.46.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8690eba565c6d68ffd3a8655525cbdd5246510b44a637ee2c6c03a7ebfe64d3c", size = 2157856, upload-time = "2026-04-20T14:43:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ec/6a500e3ad7718ee50583fae79c8651f5d37e3abce1fa9ae177ae65842c53/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4de88889d7e88d50d40ee5b39d5dac0bcaef9ba91f7e536ac064e6b2834ecccf", size = 2180168, upload-time = "2026-04-20T14:42:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/d8/53/8267811054b1aa7fc1dc7ded93812372ef79a839f5e23558136a6afbfde1/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e480080975c1ef7f780b8f99ed72337e7cc5efea2e518a20a692e8e7b278eb8b", size = 2322885, upload-time = "2026-04-20T14:41:05.253Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c1/1c0acdb3aa0856ddc4ecc55214578f896f2de16f400cf51627eb3c26c1c4/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de3a5c376f8cd94da9a1b8fd3dd1c16c7a7b216ed31dc8ce9fd7a22bf13b836e", size = 2360328, upload-time = "2026-04-20T14:41:43.991Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d0/ef39cd0f4a926814f360e71c1adeab48ad214d9727e4deb48eedfb5bce1a/pydantic_core-2.46.3-cp311-cp311-win32.whl", hash = "sha256:fc331a5314ffddd5385b9ee9d0d2fee0b13c27e0e02dad71b1ae5d6561f51eeb", size = 1979464, upload-time = "2026-04-20T14:43:12.215Z" }, + { url = "https://files.pythonhosted.org/packages/18/9c/f41951b0d858e343f1cf09398b2a7b3014013799744f2c4a8ad6a3eec4f2/pydantic_core-2.46.3-cp311-cp311-win_amd64.whl", hash = "sha256:b5b9c6cf08a8a5e502698f5e153056d12c34b8fb30317e0c5fd06f45162a6346", size = 2070837, upload-time = "2026-04-20T14:41:47.707Z" }, + { url = "https://files.pythonhosted.org/packages/9f/1e/264a17cd582f6ed50950d4d03dd5fefd84e570e238afe1cb3e25cf238769/pydantic_core-2.46.3-cp311-cp311-win_arm64.whl", hash = "sha256:5dfd51cf457482f04ec49491811a2b8fd5b843b64b11eecd2d7a1ee596ea78a6", size = 2053647, upload-time = "2026-04-20T14:42:27.535Z" }, + { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, + { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, + { url = "https://files.pythonhosted.org/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, + { url = "https://files.pythonhosted.org/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, + { url = "https://files.pythonhosted.org/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, + { url = "https://files.pythonhosted.org/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, + { url = "https://files.pythonhosted.org/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, + { url = "https://files.pythonhosted.org/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, + { url = "https://files.pythonhosted.org/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, + { url = "https://files.pythonhosted.org/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, + { url = "https://files.pythonhosted.org/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, + { url = "https://files.pythonhosted.org/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, + { url = "https://files.pythonhosted.org/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, + { url = "https://files.pythonhosted.org/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, + { url = "https://files.pythonhosted.org/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, + { url = "https://files.pythonhosted.org/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, + { url = "https://files.pythonhosted.org/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, + { url = "https://files.pythonhosted.org/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, + { url = "https://files.pythonhosted.org/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, + { url = "https://files.pythonhosted.org/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, + { url = "https://files.pythonhosted.org/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, + { url = "https://files.pythonhosted.org/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, + { url = "https://files.pythonhosted.org/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, + { url = "https://files.pythonhosted.org/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, + { url = "https://files.pythonhosted.org/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, + { url = "https://files.pythonhosted.org/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, + { url = "https://files.pythonhosted.org/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, + { url = "https://files.pythonhosted.org/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, + { url = "https://files.pythonhosted.org/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, + { url = "https://files.pythonhosted.org/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, + { url = "https://files.pythonhosted.org/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, + { url = "https://files.pythonhosted.org/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, + { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, + { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/66/7f/03dbad45cd3aa9083fbc93c210ae8b005af67e4136a14186950a747c6874/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:9715525891ed524a0a1eb6d053c74d4d4ad5017677fb00af0b7c2644a31bae46", size = 2105683, upload-time = "2026-04-20T14:42:19.779Z" }, + { url = "https://files.pythonhosted.org/packages/26/22/4dc186ac8ea6b257e9855031f51b62a9637beac4d68ac06bee02f046f836/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:9d2f400712a99a013aff420ef1eb9be077f8189a36c1e3ef87660b4e1088a874", size = 1940052, upload-time = "2026-04-20T14:43:59.274Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ca/d376391a5aff1f2e8188960d7873543608130a870961c2b6b5236627c116/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd2aab0e2e9dc2daf36bd2686c982535d5e7b1d930a1344a7bb6e82baab42a76", size = 1988172, upload-time = "2026-04-20T14:41:17.469Z" }, + { url = "https://files.pythonhosted.org/packages/0e/6b/523b9f85c23788755d6ab949329de692a2e3a584bc6beb67fef5e035aa9d/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9d76736da5f362fabfeea6a69b13b7f2be405c6d6966f06b2f6bfff7e64531", size = 2128596, upload-time = "2026-04-20T14:40:41.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, + { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, + { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, + { url = "https://files.pythonhosted.org/packages/1f/da/99d40830684f81dec901cac521b5b91c095394cc1084b9433393cde1c2df/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:13afdd885f3d71280cf286b13b310ee0f7ccfefd1dbbb661514a474b726e2f25", size = 2107973, upload-time = "2026-04-20T14:42:06.175Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/87024121818d75bbb2a98ddbaf638e40e7a18b5e0f5492c9ca4b1b316107/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f91c0aff3e3ee0928edd1232c57f643a7a003e6edf1860bc3afcdc749cb513f3", size = 1947191, upload-time = "2026-04-20T14:43:14.319Z" }, + { url = "https://files.pythonhosted.org/packages/60/62/0c1acfe10945b83a6a59d19fbaa92f48825381509e5701b855c08f13db76/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6529d1d128321a58d30afcc97b49e98836542f68dd41b33c2e972bb9e5290536", size = 2123791, upload-time = "2026-04-20T14:43:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/3b2393b4c8f44285561dc30b00cf307a56a2eff7c483a824db3b8221ca51/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:975c267cff4f7e7272eacbe50f6cc03ca9a3da4c4fbd66fffd89c94c1e311aa1", size = 2153197, upload-time = "2026-04-20T14:44:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ba/75/5af02fb35505051eee727c061f2881c555ab4f8ddb2d42da715a42c9731b/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2b8e4f2bbdf71415c544b4b1138b8060db7b6611bc927e8064c769f64bed651c", size = 2181073, upload-time = "2026-04-20T14:43:20.729Z" }, + { url = "https://files.pythonhosted.org/packages/10/92/7e0e1bd9ca3c68305db037560ca2876f89b2647deb2f8b6319005de37505/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e61ea8e9fff9606d09178f577ff8ccdd7206ff73d6552bcec18e1033c4254b85", size = 2315886, upload-time = "2026-04-20T14:44:04.826Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d8/101655f27eaf3e44558ead736b2795d12500598beed4683f279396fa186e/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b504bda01bafc69b6d3c7a0c7f039dcf60f47fab70e06fe23f57b5c75bdc82b8", size = 2360528, upload-time = "2026-04-20T14:40:47.431Z" }, + { url = "https://files.pythonhosted.org/packages/07/0f/1c34a74c8d07136f0d729ffe5e1fdab04fbdaa7684f61a92f92511a84a15/pydantic_core-2.46.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b00b76f7142fc60c762ce579bd29c8fa44aaa56592dd3c54fab3928d0d4ca6ff", size = 2184144, upload-time = "2026-04-20T14:42:57Z" }, ] [[package]] name = "pyfai" -version = "2025.12.1" +version = "2026.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fabio" }, @@ -2177,58 +2261,56 @@ dependencies = [ { name = "scipy" }, { name = "silx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/8b/25a4b3ec765ac65162d3c10c93850f245f536d11d2fd4a5c676999e7b564/pyfai-2025.12.1.tar.gz", hash = "sha256:88b5a7334af419de7ffba40c772896e85bd51dc1f05c099eb52c30f1d7752a2e", size = 68401729, upload-time = "2025-12-19T07:50:12.013Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/92/87fd57c44a987ae7a5e04dccb0b96da05d0ef31623bb7ca87297a4c76b7b/pyfai-2025.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:115b7c5b3dc4c3a618199d78e4d2589931839452fcadc24fdbf09afe4fae5d9f", size = 5818184, upload-time = "2025-12-19T08:08:20.471Z" }, - { url = "https://files.pythonhosted.org/packages/2e/51/3b8edef0dd33835e783dcc1850dc7a83c39ce68b9d374e35d22f00f72890/pyfai-2025.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d2d178fc30022a708065dfa4a2a4f3ee81d61f401137d8c4c697f7c65abab91b", size = 5293688, upload-time = "2025-12-19T08:08:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/c1/b1/0d1d952fdd59d82a14e322ce2e5b9565f357190f05aadbdf4036b08fa4d8/pyfai-2025.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c23fd9c2b70c6192f9d8cc04dc05ba6d0eebae364091e0bc9f4a4b85de84b20", size = 7274175, upload-time = "2025-12-19T08:08:24.58Z" }, - { url = "https://files.pythonhosted.org/packages/6f/4a/0c328e0e920441f3ecfce0463bb3ac0d3682d1637a45eba57bb6d913bd29/pyfai-2025.12.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29b3dd7fc283faa5de98ef53f542646b05f4f47bf3d12174643e7f28204bdbe1", size = 7330309, upload-time = "2025-12-19T07:35:53.918Z" }, - { url = "https://files.pythonhosted.org/packages/e0/41/47146f56af9b419ddf8dcdc284a9e5cc8afaf9db9bcb05fae64881e99e7a/pyfai-2025.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:932fc7fa6e59aef90d85a7f3bd9f0a08af732c69394fca6947c5c5f07dea4976", size = 5441508, upload-time = "2025-12-19T08:08:27.577Z" }, - { url = "https://files.pythonhosted.org/packages/4a/34/65f7f8afee39e5fe7c736cd404573cb27981c3f468245948748223121b84/pyfai-2025.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:403faa1250d9130fde290b84d7a2cc9d35bcdabf779e201cadf912b7e9f85397", size = 5599237, upload-time = "2025-12-19T08:08:29.413Z" }, - { url = "https://files.pythonhosted.org/packages/a9/a5/1a1ac47f858e1961d1f6ac1311c12e4449adf9e9a2142a60bf2846e30e68/pyfai-2025.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce6a2268e556e790b51fe5baa4a23d5c2e213f0b5324dc641ff1626e3a6f7cf9", size = 5186423, upload-time = "2025-12-19T08:08:32.321Z" }, - { url = "https://files.pythonhosted.org/packages/51/91/3c51be7b1ec6412b08e3b621759702303b6a61d57fb77bb71e061ca98cd4/pyfai-2025.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0e102a9c6fe54862c9d56b2016e210433ab4629495381309b70c8ae62cd018a", size = 6935701, upload-time = "2025-12-19T08:08:34.296Z" }, - { url = "https://files.pythonhosted.org/packages/04/58/d830542956a6bfb24d3e7964bee06ebc17871255f1f50a7b4070a57b7f60/pyfai-2025.12.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f582e5606a121a0d1f8102f7c0212648d84b99e76348b6999698c613d0b2a31", size = 7041230, upload-time = "2025-12-19T07:35:56.179Z" }, - { url = "https://files.pythonhosted.org/packages/b4/28/e0e425f74bd06bce57c0e58f69dbbb31b74441228eae9223525817d66131/pyfai-2025.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:4a032f01dbbd0bbbdfe4bf3e24c8b50452dcc0bb5eddd16dcbacb3916d9e886d", size = 5274496, upload-time = "2025-12-19T08:08:36.772Z" }, - { url = "https://files.pythonhosted.org/packages/f7/7d/292cf095a8a6b5109ff31cf1130f70b42bc77cf7bd35fbf7440d91b36279/pyfai-2025.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f0676be03e85bb4adffd872dc0b3565fdc425a034081acf0ef3f4178b3d1367", size = 5602116, upload-time = "2025-12-19T08:08:38.668Z" }, - { url = "https://files.pythonhosted.org/packages/10/90/e9bfa09405caebd5b4e7b817ad1170955dd887520880a64ef19c302e4cbb/pyfai-2025.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a5a5c59ae25832998ab4fbf2cd1f583c5843f8c5940da300a4d65d715efa457b", size = 5163166, upload-time = "2025-12-19T08:08:40.578Z" }, - { url = "https://files.pythonhosted.org/packages/23/a6/7bbc8ddd8c93a62b9eeb16797aa887e2814de4370aba7939d180d3a51cb6/pyfai-2025.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8138dace04ac8ac5dc04a9d279970a528935dba18a16f99c26e3a8fd218ba8a4", size = 6911563, upload-time = "2025-12-19T08:08:42.792Z" }, - { url = "https://files.pythonhosted.org/packages/01/5c/af3f4236c85fd3fbc219ed1401997eb9659586076086ba3e796c0da55ea0/pyfai-2025.12.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bb1167aafbd20e03c252d99b51743f1c1eec6da7d980a6b3fc0d255b109b824", size = 7007113, upload-time = "2025-12-19T07:35:58.505Z" }, - { url = "https://files.pythonhosted.org/packages/b9/39/0a823de16e5620ee3d605635ef6ab89ce8531a52f386fe735c0f2d0aa3ab/pyfai-2025.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:905bafbbc763b41e306b756ae97d7e353e64ff0665737fc6c6f4a818090cbba8", size = 5269115, upload-time = "2025-12-19T08:08:45.646Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d9/793533c5a231e9392e3ee32e471080d3100e7ebda448a0e3d630129eef33/pyfai-2025.12.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e4c333dd344699d7da7c74b1ae7d9c135a15f306f76e50a53b011e036b7103be", size = 5193739, upload-time = "2025-12-19T08:08:47.928Z" }, - { url = "https://files.pythonhosted.org/packages/7b/06/b4e915f035c4f3d23f1f1c12b374a7e55224147db5b1c3bfcd91af3ddbec/pyfai-2025.12.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab297f55e9d7ab6d2bedcfd8b24e10d4074a2b7bcf92702c93bdf8b6fa24266f", size = 7024334, upload-time = "2025-12-19T07:36:00.446Z" }, - { url = "https://files.pythonhosted.org/packages/28/4f/1d7577ecfad3ff2258cbc1793ab9e1bb0a81c7c9c8e1e335f06a2fa49057/pyfai-2025.12.1-cp314-cp314-win_amd64.whl", hash = "sha256:928d881adba2376c2bebade8dcbb87a49ded9b2242616d3c9d1aeae7d018e0a7", size = 5361609, upload-time = "2025-12-19T08:08:52.754Z" }, - { url = "https://files.pythonhosted.org/packages/b8/38/f49e3a6a72f7ef619e1d051f179e6c4082b55a23583b92d97fb6c825ecfa/pyfai-2025.12.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc7919c31aa87de4b2706f4faaebc1e61b1558ce3717a2173df2c9ef93ca2dc9", size = 6644333, upload-time = "2025-12-19T07:36:02.8Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ea/5085e6563a20e24addc4e2016873815a1c361302fe2b68c7dc64b8172947/pyfai-2025.12.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e66858246ff5e55334a55925c3491e602e88cafc28d2abf24f4685d45faee36b", size = 5987214, upload-time = "2025-12-19T08:08:50.842Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/05/43/5a2b3f2b7e21edc9c68cd28c294aeb61e54b5e851fdd9a22c732580024d3/pyfai-2026.3.0.tar.gz", hash = "sha256:7c4ca81502185ba0582d677b680cadd295f9ef94c735484a51179506efe579ab", size = 69256766, upload-time = "2026-03-23T15:11:40.306Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/e9/51cd51d3ede6d631ee202e4aac77e0da5ab99745f74157d47a139fcbf684/pyfai-2026.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8894d70572a1ba491c3a0c4d85caf755bf6bf23de1df7e29ee1836f72e998109", size = 5828216, upload-time = "2026-03-23T15:11:01.144Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ab/1245aeec58a39c739ab9148f5bb7b75426e48141551ed8b10213b46b7c11/pyfai-2026.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26c2a16539a17c39383c93bd04980fd02d3717c72e6b96a7cca8bdc473381c70", size = 5301787, upload-time = "2026-03-23T15:11:02.959Z" }, + { url = "https://files.pythonhosted.org/packages/72/e6/8c81c8b8117f9fd12e5d386b9c0cd422196dc646c3c56e22aa9a106ef76d/pyfai-2026.3.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:082ff3ef949562bc280f0d73b7172ac108180d40809e58bd71e6954c304ed0cf", size = 7345400, upload-time = "2026-03-23T15:11:04.699Z" }, + { url = "https://files.pythonhosted.org/packages/06/17/d0f72e181df0e9407d881b4a599948876a51c05dd6c9de90393c5ac14e29/pyfai-2026.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:14ecb80c2ae657ab3563ef97f95cfc8f9ec02a6f7801c6224852285a3151275f", size = 5452629, upload-time = "2026-03-23T15:11:07.079Z" }, + { url = "https://files.pythonhosted.org/packages/ab/74/d95cd3b1dee67e1ee3544a605c943ec0bab0c9cdcd628fd895c3e210b767/pyfai-2026.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5e993e8bbf4cd32b941e7cb26e97703a1110de440e9bce18172785f5153046d4", size = 5609793, upload-time = "2026-03-23T15:11:08.899Z" }, + { url = "https://files.pythonhosted.org/packages/3f/9a/031a49950e0c9a612a047548b1f014c04793d9e859895f90100f724cb5d9/pyfai-2026.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e3785e85679cffe30c0403230f11286dcc756be4de395c516eebf8a27c01a1e", size = 5194137, upload-time = "2026-03-23T15:11:10.849Z" }, + { url = "https://files.pythonhosted.org/packages/a2/32/6babc2cfc0d009e59969f16a130fbc528264a2bdadadeff0bdd666dd91ef/pyfai-2026.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:789dd569d7138c56cddc9f1d7b544b8900a6d66ad4ad8c0d666821ce1fb135eb", size = 7045105, upload-time = "2026-03-23T15:11:13.159Z" }, + { url = "https://files.pythonhosted.org/packages/d2/31/8350f9797fc3eaecd60d698530e454e672d930813ff66b7782a577520049/pyfai-2026.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:167624b8b822a467afd9d84105e39e3ac03bd4716b0e2869c476782518f4e31d", size = 5285498, upload-time = "2026-03-23T15:11:16.702Z" }, + { url = "https://files.pythonhosted.org/packages/37/0b/2a9858ff7eff0fbb0e46eb216e39c874118b0a59ad65c1dfd96027267ee2/pyfai-2026.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fd8bf7b6a1f78f182c30c9943154b7747bed0746fcf84b0e73f697219ca6e9f0", size = 5610619, upload-time = "2026-03-23T15:11:18.46Z" }, + { url = "https://files.pythonhosted.org/packages/f4/07/c0e46fc15a91ff2ff6a2f2af406c5690f5c88f7ebc991b665054074c50a4/pyfai-2026.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9835a3ec62af12962005e15118da4ca966fe0ef8535d44f135ef95a9eba39061", size = 5170790, upload-time = "2026-03-23T15:11:20.699Z" }, + { url = "https://files.pythonhosted.org/packages/4a/82/4fef61b62347aab44db53e423a09de9307ed4619b36cdc3abbc40a7cd878/pyfai-2026.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85922a5c99a0a160bccf4423ddae54b931baa0ddd85f084fa3b745f02820241d", size = 7023349, upload-time = "2026-03-23T15:11:23.141Z" }, + { url = "https://files.pythonhosted.org/packages/42/47/6ebf7bf5bad7361e94f4792e85978601e3c68c6931a72309c6fcf862d269/pyfai-2026.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:d765e3d0301630f15ceae09e529ebb681904dd2c2588d80ef91ffc7a856e1023", size = 5279571, upload-time = "2026-03-23T15:11:25.03Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f1/a0dd72da8a1d1e6fb54c88c21a8cf61203dbb0556fab866d73803b256526/pyfai-2026.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8c6fec4e6907b6bcdfdbbc14673bdf45f09eb1628a1d56f569dca372999a9cb6", size = 5201169, upload-time = "2026-03-23T15:11:26.835Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f6/59995ff519cd36bba4f77df2c15b28569b4bf1ecf711fc8ca84616027f71/pyfai-2026.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c4ce01c062816ea417e860a0817a8e8799bc7b5752e24cbe689905edd4322c45", size = 7040784, upload-time = "2026-03-23T15:11:28.909Z" }, + { url = "https://files.pythonhosted.org/packages/51/6a/d09a55f93a4c6170305e54bd7f6c558248024c3d42a97befac9adac29bf8/pyfai-2026.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:4148c0658cb29729a381e8337946cfb92b10db051896fb971aca53fdcceff054", size = 5373673, upload-time = "2026-03-23T15:11:35.651Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5f/93351df22c6c6b9b4f8be4861513077ed4c362b29c48b2ac9cd618ba87d8/pyfai-2026.3.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da050ead7a7c56e5f73a386ea4015faaaf20ea24666cc37488475c2fd76b2595", size = 6654409, upload-time = "2026-03-23T15:11:31.225Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d3/a9cc9664b5276a774b2d43bdcf53c323c0635b7235ed0ea3e16620046909/pyfai-2026.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8c8320f6de1ea0858d554c6667991563150cc6e0c2b7411aae89024718680b91", size = 5999249, upload-time = "2026-03-23T15:11:33.505Z" }, ] [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { 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.3.23" +version = "2026.5.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pymatgen-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/6d/247a7167913846e30e35b113e91a12e4b1df8fb3881350a02786c505359d/pymatgen-2026.3.23.tar.gz", hash = "sha256:66d3ab6d6e875fa201dfce6475ef02ecb098840cb974ab725ea292ffb746371f", size = 793957, upload-time = "2026-03-23T02:19:14.249Z" } +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/03/5d/f61bda8fa2b94b6c422b5c7471039cbcc00ee3c24f9eb4852ad043243f85/pymatgen-2026.3.23-py3-none-any.whl", hash = "sha256:b7eb0102c8b79d257ae6dfeb47b91ad270e6de32c73e5ce51a5a1ef536472491", size = 883412, upload-time = "2026-03-23T02:19:12.267Z" }, + { 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.3.9" +version = "2026.4.16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bibtexparser" }, { name = "joblib" }, + { name = "lxml" }, { name = "matplotlib" }, { name = "monty" }, { name = "networkx" }, @@ -2245,28 +2327,28 @@ dependencies = [ { name = "tqdm" }, { name = "uncertainties" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/18/b349d2d755f8061113cceb5dc81c150278fed3e30480c397b606321f28fd/pymatgen_core-2026.3.9.tar.gz", hash = "sha256:9fa621fba4e2e330c3563db0b8ce5a78bab0ef3d6531368600e4f77d1296d96d", size = 2463134, upload-time = "2026-03-09T23:17:35.654Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/86/95d420c28aefbde313518bde73132222c645eae6360874658bfeff147ce2/pymatgen_core-2026.3.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37362a5e9fae66a2c7df3f9b1969f70869d8f12f2c1a3b64886f7f41ee489047", size = 2815408, upload-time = "2026-03-10T00:55:05.239Z" }, - { url = "https://files.pythonhosted.org/packages/34/84/c9bcaf20653f59d63ef0afce3a4dff9ec5a13de88b2f8c7a0b44b4204bb0/pymatgen_core-2026.3.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70ce090554c1cbe1fc3f06c44bb0187a56432a9a20fc03c6029a7cd3e13ae945", size = 3837802, upload-time = "2026-03-10T00:55:06.885Z" }, - { url = "https://files.pythonhosted.org/packages/7b/96/f222e6cb958f55fb60fad0aa6416e1b3c0d81ba0e667ca5b8975d1178ebb/pymatgen_core-2026.3.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a1c62af55cff49e3828e7445e5a3c8215ef8f0255057d71b83835ca1648b36a", size = 3865739, upload-time = "2026-03-10T00:55:09.823Z" }, - { url = "https://files.pythonhosted.org/packages/a6/c1/444ab5be2c12bcf91c11d8e75bd7cc9afed3afe55270e1571ced6f196638/pymatgen_core-2026.3.9-cp311-cp311-win32.whl", hash = "sha256:1e894955439efbf0e8c311a38bb078d7dfa716e39365df85a2cf8b5efca50dc9", size = 2770989, upload-time = "2026-03-10T00:55:12.05Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a5/0df243029110c19e1333d9ae63b921ad70190fdb88b944efdbe6afb892b5/pymatgen_core-2026.3.9-cp311-cp311-win_amd64.whl", hash = "sha256:da3d75629c55f6d176b9fc072392c67a471c46b6a4a56543508a405b1ec6d850", size = 2800484, upload-time = "2026-03-10T00:55:14.006Z" }, - { url = "https://files.pythonhosted.org/packages/c7/d0/f5478f484c736c9ec63119c6b04ddc2da15ea29b8076c46a21ce0403c77e/pymatgen_core-2026.3.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0c728d6665b10d0eebe86f89d75df6ed1f60124b24e5558bc7e7860e91348470", size = 2816546, upload-time = "2026-03-10T00:55:15.785Z" }, - { url = "https://files.pythonhosted.org/packages/8c/c0/9138449094a70d911ab3f4965e2ca93dde9e71ed0c5fac4e7bbf11892f9a/pymatgen_core-2026.3.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a063fd6c3fcc35842fa910b3d527abb11cf7e93741a32a0d699c6fa8b5cfc516", size = 3834778, upload-time = "2026-03-10T00:55:17.876Z" }, - { url = "https://files.pythonhosted.org/packages/62/22/e78a6d462f9683eb443c6d4f67502b800d323b59426fead611d6456fe3c1/pymatgen_core-2026.3.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9cc9cdeb00663c1ffbb6f9f7a4653660b093566753db81eb6f0c7b75fb75d31", size = 3874176, upload-time = "2026-03-10T00:55:19.71Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b0/66adbdbdf689fdc09237e150cd2bea248ae4d7cb6e9bf32479a1961dff75/pymatgen_core-2026.3.9-cp312-cp312-win32.whl", hash = "sha256:c4e090e0ca06b5cc601d8860caf8b8ca10450bdc69d9f644862284dbc4441ef9", size = 2769195, upload-time = "2026-03-10T00:55:21.318Z" }, - { url = "https://files.pythonhosted.org/packages/85/57/a0075b8eec7863e861c79c4282c1f1374838cc097faae8e80b98da4520ef/pymatgen_core-2026.3.9-cp312-cp312-win_amd64.whl", hash = "sha256:295be318686db8ab91cdc3f1651d4563b48fd0418092dc6358a091e61b59fc48", size = 2799912, upload-time = "2026-03-10T00:55:24.095Z" }, - { url = "https://files.pythonhosted.org/packages/95/c7/5f2518bbb400c1fb0b95da8f88738866ccbdb91d65962cb737b1710a0b00/pymatgen_core-2026.3.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a7d4d156d6d76c2d96f6dcd344b877921d44a7c04f7ee51d18904daf2ac51ed7", size = 2811721, upload-time = "2026-03-09T23:17:38.043Z" }, - { url = "https://files.pythonhosted.org/packages/81/79/d923b11dd3a304dfaf39345cf9ac079176b3a053001617d1f67a776a6a66/pymatgen_core-2026.3.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9952727d85f4166219102574139be1788cf3b7cc14ef2ff39bede6a0dd376369", size = 3826067, upload-time = "2026-03-10T00:55:25.716Z" }, - { url = "https://files.pythonhosted.org/packages/2c/8d/643e214ae2607746baaead580310ed2d3b52840758c26aeb7803b282808e/pymatgen_core-2026.3.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecc7c5735ace36e0d351fe1da3b3bba4ffeea52786adde62eeaa6ec9a04738ad", size = 3864479, upload-time = "2026-03-10T00:55:27.293Z" }, - { url = "https://files.pythonhosted.org/packages/88/61/a53fc0706e7c10ee7a90815b257cc19529b4eca2e55f855639ab7b69edf2/pymatgen_core-2026.3.9-cp313-cp313-win32.whl", hash = "sha256:610e291628497ac26080a544dff1f813e1050adc3ab0105a3d65215295a3300f", size = 2768981, upload-time = "2026-03-10T00:55:29.299Z" }, - { url = "https://files.pythonhosted.org/packages/74/09/f621e487ba77581e88617604a8e65eaec342d17cd98674cc64c507587f09/pymatgen_core-2026.3.9-cp313-cp313-win_amd64.whl", hash = "sha256:05e3dbe0dbaf5b245fdc87d90c625b0476b67078e028c08bb0e2257f9f9f903e", size = 2799473, upload-time = "2026-03-10T00:55:31.253Z" }, - { url = "https://files.pythonhosted.org/packages/ce/98/b262a6291eb4f1167b1ea00f7609b70551675460d28f67c577c584dc804a/pymatgen_core-2026.3.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7618e05ed81591ee03c890397d839ebe281f2f7106d6402b43c3a3b78fdd47d0", size = 2816694, upload-time = "2026-03-10T00:55:33.515Z" }, - { url = "https://files.pythonhosted.org/packages/e0/df/46200179dcc751986e90bcf362fe6c8ae199773e7a2b2e8774884d10c3bc/pymatgen_core-2026.3.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e76b3babff3a97d2200d801d3d33b7eeaf24669963830570c5108114c3797ef", size = 3823467, upload-time = "2026-03-10T00:55:35.58Z" }, - { url = "https://files.pythonhosted.org/packages/34/66/2f53fa448b2f776b7c6e520127f93613a828e9a4fadc2dcfd32b5a93b946/pymatgen_core-2026.3.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc4c12e75a7da686742d1d018bfc7b7047ec80b47c6134163ba0d7e0a7ca2dbe", size = 3854582, upload-time = "2026-03-10T00:55:37.413Z" }, - { url = "https://files.pythonhosted.org/packages/1e/4e/168a9c246a1d8378e6233bd69f5bdcc1f91a5953a2d82936ce8251b0093d/pymatgen_core-2026.3.9-cp314-cp314-win32.whl", hash = "sha256:cccb30ab4dbb9f451d5eeaa0ce524352c3ff8fe77f3ed3f7e4a62f874ab89bcd", size = 2746693, upload-time = "2026-03-10T00:55:39.289Z" }, - { url = "https://files.pythonhosted.org/packages/4d/ce/d398ff45282c6ff580ef1a12e210035d05ffb2d41d61c953aba3ee189ed9/pymatgen_core-2026.3.9-cp314-cp314-win_amd64.whl", hash = "sha256:3f78381a30c2549b58d2dc72efa2ba466d1be9922d1dd27dabcb60d6f17ac884", size = 2778261, upload-time = "2026-03-10T00:55:41.1Z" }, +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]] @@ -2292,32 +2374,32 @@ wheels = [ [[package]] name = "pyqt6" -version = "6.10.2" +version = "6.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyqt6-qt6" }, { name = "pyqt6-sip" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/03/e756f52e8b0d7bb5527baf8c46d59af0746391943bdb8655acba22ee4168/pyqt6-6.10.2.tar.gz", hash = "sha256:6c0db5d8cbb9a3e7e2b5b51d0ff3f283121fa27b864db6d2f35b663c9be5cc83", size = 1085573, upload-time = "2026-01-08T16:40:00.244Z" } +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/fb/3f/f073a980969aa485ef288eb2e3b94c223ba9c7ac9941543f19b51659b98d/pyqt6-6.10.2-cp39-abi3-macosx_10_14_universal2.whl", hash = "sha256:37ae7c1183fe4dd0c6aefd2006a35731245de1cb6f817bb9e414a3e4848dfd6d", size = 60244482, upload-time = "2026-01-08T16:38:50.837Z" }, - { url = "https://files.pythonhosted.org/packages/ec/3e/9a015651ec71cea2e2f960c37edeb21623ba96a74956c0827def837f7c6b/pyqt6-6.10.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:78e1b3d5763e4cbc84485aef600e0aba5e1932fd263b716f92cd1a40dfa5e924", size = 37899440, upload-time = "2026-01-08T16:39:09.027Z" }, - { url = "https://files.pythonhosted.org/packages/51/74/a88fec2b99700270ca5d7dc7d650236a4990ed6fc88e055ca0fc8a339ee3/pyqt6-6.10.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:bbc3af541bbecd27301bfe69fe445aa1611a9b490bd3de77306b12df632f7ec6", size = 40748467, upload-time = "2026-01-08T16:39:29.551Z" }, - { url = "https://files.pythonhosted.org/packages/75/34/be7a55529607b21db00a49ca53cb07c3092d2a5a95ea19bb95cfa0346904/pyqt6-6.10.2-cp39-abi3-win_amd64.whl", hash = "sha256:bd328cb70bc382c48861cd5f0a11b2b8ae6f5692d5a2d6679ba52785dced327b", size = 26015391, upload-time = "2026-01-08T16:39:42.946Z" }, - { url = "https://files.pythonhosted.org/packages/af/de/d9c88f976602b7884fec4ad54a4575d48e23e4f390e5357ea83917358846/pyqt6-6.10.2-cp39-abi3-win_arm64.whl", hash = "sha256:7901ba1df024b7ee9fdacfb2b7661aeb3749ae8b0bef65428077de3e0450eabb", size = 26208415, upload-time = "2026-01-08T16:39:57.751Z" }, + { 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.10.2" +version = "6.11.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/eb/f04d547d8ed9f20c7b246db4ef5d93b49cab4692009a10652ed0a8b9d2aa/pyqt6_qt6-6.10.2-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:5761cfccc721da2311c3f1213577f0ff1df07bbbbe3fa3a209a256b82cf057e3", size = 68688870, upload-time = "2026-01-29T12:26:48.619Z" }, - { url = "https://files.pythonhosted.org/packages/ce/c8/d99e65ab01c2402fb6bc4f77abef7244f7d5fb2f2e6d5b0abdf71bb2e4fc/pyqt6_qt6-6.10.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6dda853a8db1b8d1a2ddbbe76cc6c3aa86614cad14056bd3c0435d8feea73b2d", size = 62512013, upload-time = "2026-01-29T12:27:24.642Z" }, - { url = "https://files.pythonhosted.org/packages/d5/fe/01fd9b9d2ca139ef61582f2e2da249fa169229144294c1bb27db59ad8420/pyqt6_qt6-6.10.2-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:19c10b5f0806e9f9bac2c9759bd5d7d19a78967f330fd60a2db409177fa76e49", size = 84028760, upload-time = "2026-01-29T12:28:03.267Z" }, - { url = "https://files.pythonhosted.org/packages/f4/20/a0d027ebb267d3afaf319d94efe1ff4d667004ee83b96701329a4d11fb95/pyqt6_qt6-6.10.2-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:2e60d616861ca4565cd295418d605975aa2dc407ba4b94c1586a70c92e9cb052", size = 83063975, upload-time = "2026-01-29T12:28:48.928Z" }, - { url = "https://files.pythonhosted.org/packages/06/8e/595f215876d507417cc8565e05519916d3b0b76baedea6a1e4e5105633fc/pyqt6_qt6-6.10.2-py3-none-win_amd64.whl", hash = "sha256:c4b7f7d66cc58bddf1bc1ca28dfcf7a45f58cfcb11d81d13a0510409dd4957ac", size = 78433821, upload-time = "2026-01-29T12:29:35.493Z" }, - { url = "https://files.pythonhosted.org/packages/50/5f/2196e2b536217b87cb3d2ce13ef8f7607d08b02f1990a4bd84a88d293a3c/pyqt6_qt6-6.10.2-py3-none-win_arm64.whl", hash = "sha256:7164a6f0c1335358a3026df9865c8f75395b01f60f0dcd2f66c029ec16fc83d2", size = 58354426, upload-time = "2026-01-29T12:30:02.95Z" }, + { 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]] @@ -2350,20 +2432,20 @@ wheels = [ [[package]] name = "pyright" -version = "1.1.408" +version = "1.1.409" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/b2/5db700e52554b8f025faa9c3c624c59f1f6c8841ba81ab97641b54322f16/pyright-1.1.408.tar.gz", hash = "sha256:f28f2321f96852fa50b5829ea492f6adb0e6954568d1caa3f3af3a5f555eb684", size = 4400578, upload-time = "2026-01-08T08:07:38.795Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/4e/3aa27f74211522dba7e9cbc3e74de779c6d4b654c54e50a4840623be8014/pyright-1.1.409.tar.gz", hash = "sha256:986ee05beca9e077c165758ad123667c679e050059a2546aa02473930394bc93", size = 4430434, upload-time = "2026-04-23T11:02:03.799Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/82/a2c93e32800940d9573fb28c346772a14778b84ba7524e691b324620ab89/pyright-1.1.408-py3-none-any.whl", hash = "sha256:090b32865f4fdb1e0e6cd82bf5618480d48eecd2eb2e70f960982a3d9a4c17c1", size = 6399144, upload-time = "2026-01-08T08:07:37.082Z" }, + { url = "https://files.pythonhosted.org/packages/16/6b/330d8ebae582b30c2959a1ef4c3bc344ebde48c2ff0c3f113c4710735e11/pyright-1.1.409-py3-none-any.whl", hash = "sha256:aa3ea228cab90c845c7a60d28db7a844c04315356392aa09fafcee98c8c22fb3", size = 6438161, upload-time = "2026-04-23T11:02:01.309Z" }, ] [[package]] name = "pytest" -version = "9.0.2" +version = "9.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -2372,23 +2454,23 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] [[package]] name = "pytest-cov" -version = "7.0.0" +version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage", extra = ["toml"] }, { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, ] [[package]] @@ -2403,6 +2485,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] +[[package]] +name = "python-discovery" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/ef/3bae0e537cfe91e8431efcba4434463d2c5a65f5a89edd47c6cf2f03c55f/python_discovery-1.2.2.tar.gz", hash = "sha256:876e9c57139eb757cb5878cbdd9ae5379e5d96266c99ef731119e04fffe533bb", size = 58872, upload-time = "2026-04-07T17:28:49.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/db/795879cc3ddfe338599bddea6388cc5100b088db0a4caf6e6c1af1c27e04/python_discovery-1.2.2-py3-none-any.whl", hash = "sha256:e1ae95d9af875e78f15e19aed0c6137ab1bb49c200f21f5061786490c9585c7a", size = 31894, upload-time = "2026-04-07T17:28:48.09Z" }, +] + [[package]] name = "pywin32" version = "311" @@ -2491,7 +2586,7 @@ wheels = [ [[package]] name = "requests" -version = "2.33.0" +version = "2.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -2499,95 +2594,43 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } +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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, + { 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.18.17" +version = "0.19.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ruamel-yaml-clib", marker = "python_full_version < '3.15' and platform_python_implementation == 'CPython'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3a/2b/7a1f1ebcd6b3f14febdc003e658778d81e76b40df2267904ee6b13f0c5c6/ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c", size = 149602, upload-time = "2025-12-17T20:02:55.757Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d", size = 121594, upload-time = "2025-12-17T20:02:07.657Z" }, -] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ea/97/60fda20e2fb54b83a61ae14648b0817c8f5d84a3821e40bfbdae1437026a/ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600", size = 225794, upload-time = "2025-11-16T16:12:59.761Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/80/8ce7b9af532aa94dd83360f01ce4716264db73de6bc8efd22c32341f6658/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c583229f336682b7212a43d2fa32c30e643d3076178fb9f7a6a14dde85a2d8bd", size = 147998, upload-time = "2025-11-16T16:13:13.241Z" }, - { url = "https://files.pythonhosted.org/packages/53/09/de9d3f6b6701ced5f276d082ad0f980edf08ca67114523d1b9264cd5e2e0/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56ea19c157ed8c74b6be51b5fa1c3aff6e289a041575f0556f66e5fb848bb137", size = 132743, upload-time = "2025-11-16T16:13:14.265Z" }, - { url = "https://files.pythonhosted.org/packages/0e/f7/73a9b517571e214fe5c246698ff3ed232f1ef863c8ae1667486625ec688a/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5fea0932358e18293407feb921d4f4457db837b67ec1837f87074667449f9401", size = 731459, upload-time = "2025-11-16T20:22:44.338Z" }, - { url = "https://files.pythonhosted.org/packages/9b/a2/0dc0013169800f1c331a6f55b1282c1f4492a6d32660a0cf7b89e6684919/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71831bd61fbdb7aa0399d5c4da06bea37107ab5c79ff884cc07f2450910262", size = 749289, upload-time = "2025-11-16T16:13:15.633Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ed/3fb20a1a96b8dc645d88c4072df481fe06e0289e4d528ebbdcc044ebc8b3/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617d35dc765715fa86f8c3ccdae1e4229055832c452d4ec20856136acc75053f", size = 777630, upload-time = "2025-11-16T16:13:16.898Z" }, - { url = "https://files.pythonhosted.org/packages/60/50/6842f4628bc98b7aa4733ab2378346e1441e150935ad3b9f3c3c429d9408/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b45498cc81a4724a2d42273d6cfc243c0547ad7c6b87b4f774cb7bcc131c98d", size = 744368, upload-time = "2025-11-16T16:13:18.117Z" }, - { url = "https://files.pythonhosted.org/packages/d3/b0/128ae8e19a7d794c2e36130a72b3bb650ce1dd13fb7def6cf10656437dcf/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:def5663361f6771b18646620fca12968aae730132e104688766cf8a3b1d65922", size = 745233, upload-time = "2025-11-16T20:22:45.833Z" }, - { url = "https://files.pythonhosted.org/packages/75/05/91130633602d6ba7ce3e07f8fc865b40d2a09efd4751c740df89eed5caf9/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:014181cdec565c8745b7cbc4de3bf2cc8ced05183d986e6d1200168e5bb59490", size = 770963, upload-time = "2025-11-16T16:13:19.344Z" }, - { url = "https://files.pythonhosted.org/packages/fd/4b/fd4542e7f33d7d1bc64cc9ac9ba574ce8cf145569d21f5f20133336cdc8c/ruamel_yaml_clib-0.2.15-cp311-cp311-win32.whl", hash = "sha256:d290eda8f6ada19e1771b54e5706b8f9807e6bb08e873900d5ba114ced13e02c", size = 102640, upload-time = "2025-11-16T16:13:20.498Z" }, - { url = "https://files.pythonhosted.org/packages/bb/eb/00ff6032c19c7537371e3119287999570867a0eafb0154fccc80e74bf57a/ruamel_yaml_clib-0.2.15-cp311-cp311-win_amd64.whl", hash = "sha256:bdc06ad71173b915167702f55d0f3f027fc61abd975bd308a0968c02db4a4c3e", size = 121996, upload-time = "2025-11-16T16:13:21.855Z" }, - { url = "https://files.pythonhosted.org/packages/72/4b/5fde11a0722d676e469d3d6f78c6a17591b9c7e0072ca359801c4bd17eee/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff", size = 149088, upload-time = "2025-11-16T16:13:22.836Z" }, - { url = "https://files.pythonhosted.org/packages/85/82/4d08ac65ecf0ef3b046421985e66301a242804eb9a62c93ca3437dc94ee0/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2", size = 134553, upload-time = "2025-11-16T16:13:24.151Z" }, - { url = "https://files.pythonhosted.org/packages/b9/cb/22366d68b280e281a932403b76da7a988108287adff2bfa5ce881200107a/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1", size = 737468, upload-time = "2025-11-16T20:22:47.335Z" }, - { url = "https://files.pythonhosted.org/packages/71/73/81230babf8c9e33770d43ed9056f603f6f5f9665aea4177a2c30ae48e3f3/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71845d377c7a47afc6592aacfea738cc8a7e876d586dfba814501d8c53c1ba60", size = 753349, upload-time = "2025-11-16T16:13:26.269Z" }, - { url = "https://files.pythonhosted.org/packages/61/62/150c841f24cda9e30f588ef396ed83f64cfdc13b92d2f925bb96df337ba9/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e5499db1ccbc7f4b41f0565e4f799d863ea720e01d3e99fa0b7b5fcd7802c9", size = 788211, upload-time = "2025-11-16T16:13:27.441Z" }, - { url = "https://files.pythonhosted.org/packages/30/93/e79bd9cbecc3267499d9ead919bd61f7ddf55d793fb5ef2b1d7d92444f35/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b293a37dc97e2b1e8a1aec62792d1e52027087c8eea4fc7b5abd2bdafdd6642", size = 743203, upload-time = "2025-11-16T16:13:28.671Z" }, - { url = "https://files.pythonhosted.org/packages/8d/06/1eb640065c3a27ce92d76157f8efddb184bd484ed2639b712396a20d6dce/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:512571ad41bba04eac7268fe33f7f4742210ca26a81fe0c75357fa682636c690", size = 747292, upload-time = "2025-11-16T20:22:48.584Z" }, - { url = "https://files.pythonhosted.org/packages/a5/21/ee353e882350beab65fcc47a91b6bdc512cace4358ee327af2962892ff16/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5e9f630c73a490b758bf14d859a39f375e6999aea5ddd2e2e9da89b9953486a", size = 771624, upload-time = "2025-11-16T16:13:29.853Z" }, - { url = "https://files.pythonhosted.org/packages/57/34/cc1b94057aa867c963ecf9ea92ac59198ec2ee3a8d22a126af0b4d4be712/ruamel_yaml_clib-0.2.15-cp312-cp312-win32.whl", hash = "sha256:f4421ab780c37210a07d138e56dd4b51f8642187cdfb433eb687fe8c11de0144", size = 100342, upload-time = "2025-11-16T16:13:31.067Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e5/8925a4208f131b218f9a7e459c0d6fcac8324ae35da269cb437894576366/ruamel_yaml_clib-0.2.15-cp312-cp312-win_amd64.whl", hash = "sha256:2b216904750889133d9222b7b873c199d48ecbb12912aca78970f84a5aa1a4bc", size = 119013, upload-time = "2025-11-16T16:13:32.164Z" }, - { url = "https://files.pythonhosted.org/packages/17/5e/2f970ce4c573dc30c2f95825f2691c96d55560268ddc67603dc6ea2dd08e/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dcec721fddbb62e60c2801ba08c87010bd6b700054a09998c4d09c08147b8fb", size = 147450, upload-time = "2025-11-16T16:13:33.542Z" }, - { url = "https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471", size = 133139, upload-time = "2025-11-16T16:13:34.587Z" }, - { url = "https://files.pythonhosted.org/packages/dc/19/40d676802390f85784235a05788fd28940923382e3f8b943d25febbb98b7/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46895c17ead5e22bea5e576f1db7e41cb273e8d062c04a6a49013d9f60996c25", size = 731474, upload-time = "2025-11-16T20:22:49.934Z" }, - { url = "https://files.pythonhosted.org/packages/ce/bb/6ef5abfa43b48dd55c30d53e997f8f978722f02add61efba31380d73e42e/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a", size = 748047, upload-time = "2025-11-16T16:13:35.633Z" }, - { url = "https://files.pythonhosted.org/packages/ff/5d/e4f84c9c448613e12bd62e90b23aa127ea4c46b697f3d760acc32cb94f25/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf", size = 782129, upload-time = "2025-11-16T16:13:36.781Z" }, - { url = "https://files.pythonhosted.org/packages/de/4b/e98086e88f76c00c88a6bcf15eae27a1454f661a9eb72b111e6bbb69024d/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab0df0648d86a7ecbd9c632e8f8d6b21bb21b5fc9d9e095c796cacf32a728d2d", size = 736848, upload-time = "2025-11-16T16:13:37.952Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5c/5964fcd1fd9acc53b7a3a5d9a05ea4f95ead9495d980003a557deb9769c7/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:331fb180858dd8534f0e61aa243b944f25e73a4dae9962bd44c46d1761126bbf", size = 741630, upload-time = "2025-11-16T20:22:51.718Z" }, - { url = "https://files.pythonhosted.org/packages/07/1e/99660f5a30fceb58494598e7d15df883a07292346ef5696f0c0ae5dee8c6/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4c928ddf6bce586285daa6d90680b9c291cfd045fc40aad34e445d57b1bf51", size = 766619, upload-time = "2025-11-16T16:13:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/36/2f/fa0344a9327b58b54970e56a27b32416ffbcfe4dcc0700605516708579b2/ruamel_yaml_clib-0.2.15-cp313-cp313-win32.whl", hash = "sha256:bf0846d629e160223805db9fe8cc7aec16aaa11a07310c50c8c7164efa440aec", size = 100171, upload-time = "2025-11-16T16:13:40.456Z" }, - { url = "https://files.pythonhosted.org/packages/06/c4/c124fbcef0684fcf3c9b72374c2a8c35c94464d8694c50f37eef27f5a145/ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl", hash = "sha256:45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6", size = 118845, upload-time = "2025-11-16T16:13:41.481Z" }, - { url = "https://files.pythonhosted.org/packages/3e/bd/ab8459c8bb759c14a146990bf07f632c1cbec0910d4853feeee4be2ab8bb/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:753faf20b3a5906faf1fc50e4ddb8c074cb9b251e00b14c18b28492f933ac8ef", size = 147248, upload-time = "2025-11-16T16:13:42.872Z" }, - { url = "https://files.pythonhosted.org/packages/69/f2/c4cec0a30f1955510fde498aac451d2e52b24afdbcb00204d3a951b772c3/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:480894aee0b29752560a9de46c0e5f84a82602f2bc5c6cde8db9a345319acfdf", size = 133764, upload-time = "2025-11-16T16:13:43.932Z" }, - { url = "https://files.pythonhosted.org/packages/82/c7/2480d062281385a2ea4f7cc9476712446e0c548cd74090bff92b4b49e898/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d3b58ab2454b4747442ac76fab66739c72b1e2bb9bd173d7694b9f9dbc9c000", size = 730537, upload-time = "2025-11-16T20:22:52.918Z" }, - { url = "https://files.pythonhosted.org/packages/75/08/e365ee305367559f57ba6179d836ecc3d31c7d3fdff2a40ebf6c32823a1f/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfd309b316228acecfa30670c3887dcedf9b7a44ea39e2101e75d2654522acd4", size = 746944, upload-time = "2025-11-16T16:13:45.338Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5c/8b56b08db91e569d0a4fbfa3e492ed2026081bdd7e892f63ba1c88a2f548/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2812ff359ec1f30129b62372e5f22a52936fac13d5d21e70373dbca5d64bb97c", size = 778249, upload-time = "2025-11-16T16:13:46.871Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1d/70dbda370bd0e1a92942754c873bd28f513da6198127d1736fa98bb2a16f/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7e74ea87307303ba91073b63e67f2c667e93f05a8c63079ee5b7a5c8d0d7b043", size = 737140, upload-time = "2025-11-16T16:13:48.349Z" }, - { url = "https://files.pythonhosted.org/packages/5b/87/822d95874216922e1120afb9d3fafa795a18fdd0c444f5c4c382f6dac761/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:713cd68af9dfbe0bb588e144a61aad8dcc00ef92a82d2e87183ca662d242f524", size = 741070, upload-time = "2025-11-16T20:22:54.151Z" }, - { url = "https://files.pythonhosted.org/packages/b9/17/4e01a602693b572149f92c983c1f25bd608df02c3f5cf50fd1f94e124a59/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:542d77b72786a35563f97069b9379ce762944e67055bea293480f7734b2c7e5e", size = 765882, upload-time = "2025-11-16T16:13:49.526Z" }, - { url = "https://files.pythonhosted.org/packages/9f/17/7999399081d39ebb79e807314de6b611e1d1374458924eb2a489c01fc5ad/ruamel_yaml_clib-0.2.15-cp314-cp314-win32.whl", hash = "sha256:424ead8cef3939d690c4b5c85ef5b52155a231ff8b252961b6516ed7cf05f6aa", size = 102567, upload-time = "2025-11-16T16:13:50.78Z" }, - { url = "https://files.pythonhosted.org/packages/d2/67/be582a7370fdc9e6846c5be4888a530dcadd055eef5b932e0e85c33c7d73/ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467", size = 122847, upload-time = "2025-11-16T16:13:51.807Z" }, +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.14.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, - { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, - { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, - { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, - { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, - { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, - { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, - { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, - { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, - { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, - { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, - { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, - { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, - { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, - { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, - { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, - { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, +version = "0.15.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, + { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, + { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, + { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, + { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, + { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, + { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, + { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, + { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, + { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, + { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, + { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, + { 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]] @@ -2642,103 +2685,116 @@ wheels = [ [[package]] name = "scipy" -version = "1.17.0" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/4b/c89c131aa87cad2b77a54eb0fb94d633a842420fa7e919dc2f922037c3d8/scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd", size = 31381316, upload-time = "2026-01-10T21:24:33.42Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5f/a6b38f79a07d74989224d5f11b55267714707582908a5f1ae854cf9a9b84/scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558", size = 27966760, upload-time = "2026-01-10T21:24:38.911Z" }, - { url = "https://files.pythonhosted.org/packages/c1/20/095ad24e031ee8ed3c5975954d816b8e7e2abd731e04f8be573de8740885/scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7", size = 20138701, upload-time = "2026-01-10T21:24:43.249Z" }, - { url = "https://files.pythonhosted.org/packages/89/11/4aad2b3858d0337756f3323f8960755704e530b27eb2a94386c970c32cbe/scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6", size = 22480574, upload-time = "2026-01-10T21:24:47.266Z" }, - { url = "https://files.pythonhosted.org/packages/85/bd/f5af70c28c6da2227e510875cadf64879855193a687fb19951f0f44cfd6b/scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042", size = 32862414, upload-time = "2026-01-10T21:24:52.566Z" }, - { url = "https://files.pythonhosted.org/packages/ef/df/df1457c4df3826e908879fe3d76bc5b6e60aae45f4ee42539512438cfd5d/scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4", size = 35112380, upload-time = "2026-01-10T21:24:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/5f/bb/88e2c16bd1dd4de19d80d7c5e238387182993c2fb13b4b8111e3927ad422/scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0", size = 34922676, upload-time = "2026-01-10T21:25:04.287Z" }, - { url = "https://files.pythonhosted.org/packages/02/ba/5120242cc735f71fc002cff0303d536af4405eb265f7c60742851e7ccfe9/scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449", size = 37507599, upload-time = "2026-01-10T21:25:09.851Z" }, - { url = "https://files.pythonhosted.org/packages/52/c8/08629657ac6c0da198487ce8cd3de78e02cfde42b7f34117d56a3fe249dc/scipy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:255c0da161bd7b32a6c898e7891509e8a9289f0b1c6c7d96142ee0d2b114c2ea", size = 36380284, upload-time = "2026-01-10T21:25:15.632Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4a/465f96d42c6f33ad324a40049dfd63269891db9324aa66c4a1c108c6f994/scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379", size = 24370427, upload-time = "2026-01-10T21:25:20.514Z" }, - { url = "https://files.pythonhosted.org/packages/0b/11/7241a63e73ba5a516f1930ac8d5b44cbbfabd35ac73a2d08ca206df007c4/scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57", size = 31364580, upload-time = "2026-01-10T21:25:25.717Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1d/5057f812d4f6adc91a20a2d6f2ebcdb517fdbc87ae3acc5633c9b97c8ba5/scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e", size = 27969012, upload-time = "2026-01-10T21:25:30.921Z" }, - { url = "https://files.pythonhosted.org/packages/e3/21/f6ec556c1e3b6ec4e088da667d9987bb77cc3ab3026511f427dc8451187d/scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8", size = 20140691, upload-time = "2026-01-10T21:25:34.802Z" }, - { url = "https://files.pythonhosted.org/packages/7a/fe/5e5ad04784964ba964a96f16c8d4676aa1b51357199014dce58ab7ec5670/scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306", size = 22463015, upload-time = "2026-01-10T21:25:39.277Z" }, - { url = "https://files.pythonhosted.org/packages/4a/69/7c347e857224fcaf32a34a05183b9d8a7aca25f8f2d10b8a698b8388561a/scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742", size = 32724197, upload-time = "2026-01-10T21:25:44.084Z" }, - { url = "https://files.pythonhosted.org/packages/d1/fe/66d73b76d378ba8cc2fe605920c0c75092e3a65ae746e1e767d9d020a75a/scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b", size = 35009148, upload-time = "2026-01-10T21:25:50.591Z" }, - { url = "https://files.pythonhosted.org/packages/af/07/07dec27d9dc41c18d8c43c69e9e413431d20c53a0339c388bcf72f353c4b/scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d", size = 34798766, upload-time = "2026-01-10T21:25:59.41Z" }, - { url = "https://files.pythonhosted.org/packages/81/61/0470810c8a093cdacd4ba7504b8a218fd49ca070d79eca23a615f5d9a0b0/scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e", size = 37405953, upload-time = "2026-01-10T21:26:07.75Z" }, - { url = "https://files.pythonhosted.org/packages/92/ce/672ed546f96d5d41ae78c4b9b02006cedd0b3d6f2bf5bb76ea455c320c28/scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8", size = 36328121, upload-time = "2026-01-10T21:26:16.509Z" }, - { url = "https://files.pythonhosted.org/packages/9d/21/38165845392cae67b61843a52c6455d47d0cc2a40dd495c89f4362944654/scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b", size = 24314368, upload-time = "2026-01-10T21:26:23.087Z" }, - { url = "https://files.pythonhosted.org/packages/0c/51/3468fdfd49387ddefee1636f5cf6d03ce603b75205bf439bbf0e62069bfd/scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6", size = 31344101, upload-time = "2026-01-10T21:26:30.25Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9a/9406aec58268d437636069419e6977af953d1e246df941d42d3720b7277b/scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269", size = 27950385, upload-time = "2026-01-10T21:26:36.801Z" }, - { url = "https://files.pythonhosted.org/packages/4f/98/e7342709e17afdfd1b26b56ae499ef4939b45a23a00e471dfb5375eea205/scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72", size = 20122115, upload-time = "2026-01-10T21:26:42.107Z" }, - { url = "https://files.pythonhosted.org/packages/fd/0e/9eeeb5357a64fd157cbe0302c213517c541cc16b8486d82de251f3c68ede/scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61", size = 22442402, upload-time = "2026-01-10T21:26:48.029Z" }, - { url = "https://files.pythonhosted.org/packages/c9/10/be13397a0e434f98e0c79552b2b584ae5bb1c8b2be95db421533bbca5369/scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6", size = 32696338, upload-time = "2026-01-10T21:26:55.521Z" }, - { url = "https://files.pythonhosted.org/packages/63/1e/12fbf2a3bb240161651c94bb5cdd0eae5d4e8cc6eaeceb74ab07b12a753d/scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752", size = 34977201, upload-time = "2026-01-10T21:27:03.501Z" }, - { url = "https://files.pythonhosted.org/packages/19/5b/1a63923e23ccd20bd32156d7dd708af5bbde410daa993aa2500c847ab2d2/scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d", size = 34777384, upload-time = "2026-01-10T21:27:11.423Z" }, - { url = "https://files.pythonhosted.org/packages/39/22/b5da95d74edcf81e540e467202a988c50fef41bd2011f46e05f72ba07df6/scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea", size = 37379586, upload-time = "2026-01-10T21:27:20.171Z" }, - { url = "https://files.pythonhosted.org/packages/b9/b6/8ac583d6da79e7b9e520579f03007cb006f063642afd6b2eeb16b890bf93/scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812", size = 36287211, upload-time = "2026-01-10T21:28:43.122Z" }, - { url = "https://files.pythonhosted.org/packages/55/fb/7db19e0b3e52f882b420417644ec81dd57eeef1bd1705b6f689d8ff93541/scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2", size = 24312646, upload-time = "2026-01-10T21:28:49.893Z" }, - { url = "https://files.pythonhosted.org/packages/20/b6/7feaa252c21cc7aff335c6c55e1b90ab3e3306da3f048109b8b639b94648/scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3", size = 31693194, upload-time = "2026-01-10T21:27:27.454Z" }, - { url = "https://files.pythonhosted.org/packages/76/bb/bbb392005abce039fb7e672cb78ac7d158700e826b0515cab6b5b60c26fb/scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97", size = 28365415, upload-time = "2026-01-10T21:27:34.26Z" }, - { url = "https://files.pythonhosted.org/packages/37/da/9d33196ecc99fba16a409c691ed464a3a283ac454a34a13a3a57c0d66f3a/scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e", size = 20537232, upload-time = "2026-01-10T21:27:40.306Z" }, - { url = "https://files.pythonhosted.org/packages/56/9d/f4b184f6ddb28e9a5caea36a6f98e8ecd2a524f9127354087ce780885d83/scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07", size = 22791051, upload-time = "2026-01-10T21:27:46.539Z" }, - { url = "https://files.pythonhosted.org/packages/9b/9d/025cccdd738a72140efc582b1641d0dd4caf2e86c3fb127568dc80444e6e/scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00", size = 32815098, upload-time = "2026-01-10T21:27:54.389Z" }, - { url = "https://files.pythonhosted.org/packages/48/5f/09b879619f8bca15ce392bfc1894bd9c54377e01d1b3f2f3b595a1b4d945/scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45", size = 35031342, upload-time = "2026-01-10T21:28:03.012Z" }, - { url = "https://files.pythonhosted.org/packages/f2/9a/f0f0a9f0aa079d2f106555b984ff0fbb11a837df280f04f71f056ea9c6e4/scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209", size = 34893199, upload-time = "2026-01-10T21:28:10.832Z" }, - { url = "https://files.pythonhosted.org/packages/90/b8/4f0f5cf0c5ea4d7548424e6533e6b17d164f34a6e2fb2e43ffebb6697b06/scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04", size = 37438061, upload-time = "2026-01-10T21:28:19.684Z" }, - { url = "https://files.pythonhosted.org/packages/f9/cc/2bd59140ed3b2fa2882fb15da0a9cb1b5a6443d67cfd0d98d4cec83a57ec/scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0", size = 36328593, upload-time = "2026-01-10T21:28:28.007Z" }, - { url = "https://files.pythonhosted.org/packages/13/1b/c87cc44a0d2c7aaf0f003aef2904c3d097b422a96c7e7c07f5efd9073c1b/scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67", size = 24625083, upload-time = "2026-01-10T21:28:35.188Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2d/51006cd369b8e7879e1c630999a19d1fbf6f8b5ed3e33374f29dc87e53b3/scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a", size = 31346803, upload-time = "2026-01-10T21:28:57.24Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2e/2349458c3ce445f53a6c93d4386b1c4c5c0c540917304c01222ff95ff317/scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2", size = 27967182, upload-time = "2026-01-10T21:29:04.107Z" }, - { url = "https://files.pythonhosted.org/packages/5e/7c/df525fbfa77b878d1cfe625249529514dc02f4fd5f45f0f6295676a76528/scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467", size = 20139125, upload-time = "2026-01-10T21:29:10.179Z" }, - { url = "https://files.pythonhosted.org/packages/33/11/fcf9d43a7ed1234d31765ec643b0515a85a30b58eddccc5d5a4d12b5f194/scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e", size = 22443554, upload-time = "2026-01-10T21:29:15.888Z" }, - { url = "https://files.pythonhosted.org/packages/80/5c/ea5d239cda2dd3d31399424967a24d556cf409fbea7b5b21412b0fd0a44f/scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67", size = 32757834, upload-time = "2026-01-10T21:29:23.406Z" }, - { url = "https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73", size = 34995775, upload-time = "2026-01-10T21:29:31.915Z" }, - { url = "https://files.pythonhosted.org/packages/c5/43/176c0c3c07b3f7df324e7cdd933d3e2c4898ca202b090bd5ba122f9fe270/scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b", size = 34841240, upload-time = "2026-01-10T21:29:39.995Z" }, - { url = "https://files.pythonhosted.org/packages/44/8c/d1f5f4b491160592e7f084d997de53a8e896a3ac01cd07e59f43ca222744/scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b", size = 37394463, upload-time = "2026-01-10T21:29:48.723Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ec/42a6657f8d2d087e750e9a5dde0b481fd135657f09eaf1cf5688bb23c338/scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061", size = 37053015, upload-time = "2026-01-10T21:30:51.418Z" }, - { url = "https://files.pythonhosted.org/packages/27/58/6b89a6afd132787d89a362d443a7bddd511b8f41336a1ae47f9e4f000dc4/scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb", size = 24951312, upload-time = "2026-01-10T21:30:56.771Z" }, - { url = "https://files.pythonhosted.org/packages/e9/01/f58916b9d9ae0112b86d7c3b10b9e685625ce6e8248df139d0fcb17f7397/scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1", size = 31706502, upload-time = "2026-01-10T21:29:56.326Z" }, - { url = "https://files.pythonhosted.org/packages/59/8e/2912a87f94a7d1f8b38aabc0faf74b82d3b6c9e22be991c49979f0eceed8/scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1", size = 28380854, upload-time = "2026-01-10T21:30:01.554Z" }, - { url = "https://files.pythonhosted.org/packages/bd/1c/874137a52dddab7d5d595c1887089a2125d27d0601fce8c0026a24a92a0b/scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232", size = 20552752, upload-time = "2026-01-10T21:30:05.93Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f0/7518d171cb735f6400f4576cf70f756d5b419a07fe1867da34e2c2c9c11b/scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d", size = 22803972, upload-time = "2026-01-10T21:30:10.651Z" }, - { url = "https://files.pythonhosted.org/packages/7c/74/3498563a2c619e8a3ebb4d75457486c249b19b5b04a30600dfd9af06bea5/scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba", size = 32829770, upload-time = "2026-01-10T21:30:16.359Z" }, - { url = "https://files.pythonhosted.org/packages/48/d1/7b50cedd8c6c9d6f706b4b36fa8544d829c712a75e370f763b318e9638c1/scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db", size = 35051093, upload-time = "2026-01-10T21:30:22.987Z" }, - { url = "https://files.pythonhosted.org/packages/e2/82/a2d684dfddb87ba1b3ea325df7c3293496ee9accb3a19abe9429bce94755/scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf", size = 34909905, upload-time = "2026-01-10T21:30:28.704Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5e/e565bd73991d42023eb82bb99e51c5b3d9e2c588ca9d4b3e2cc1d3ca62a6/scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f", size = 37457743, upload-time = "2026-01-10T21:30:34.819Z" }, - { url = "https://files.pythonhosted.org/packages/58/a8/a66a75c3d8f1fb2b83f66007d6455a06a6f6cf5618c3dc35bc9b69dd096e/scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088", size = 37098574, upload-time = "2026-01-10T21:30:40.782Z" }, - { url = "https://files.pythonhosted.org/packages/56/a5/df8f46ef7da168f1bc52cd86e09a9de5c6f19cc1da04454d51b7d4f43408/scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff", size = 25246266, upload-time = "2026-01-10T21:30:45.923Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" }, + { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, + { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, + { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, ] [[package]] name = "silx" -version = "2.2.2" +version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fabio" }, { name = "h5py" }, { name = "numpy" }, { name = "packaging" }, + { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/34/ee443851672fc1a8f27e0a7c212c567118fd1892d1cb798c6d5c405c6efe/silx-2.2.2.tar.gz", hash = "sha256:5d9ba367b5715cc4cb9011388f3d71200d7beb7676c910952fd1350a342c571f", size = 19102274, upload-time = "2025-04-08T11:44:59.716Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/71/9574dc9420258b1daaba18e6032b888a25768510394ed39c4047b39ae10d/silx-2.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0658063adb7652b7360f438ac62d7d42531114011e77e2ffa3740a99c91aac6", size = 6182793, upload-time = "2025-04-08T11:43:47.45Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4d/19c7e652bbdedbff3d0b47fb6cae21638359c57fe64e1b3e9cf4b4f36761/silx-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d21cb7ca1dd74b561592798a6b2e4583095f5a7e3d2a23478918c59d366b9beb", size = 13863034, upload-time = "2025-04-08T11:43:54.279Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6f/1444c4b7a7402bcd7d7a849117aace61bff239ff85bded9e91b08fb929d0/silx-2.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41794f85a00b11cc571ef7f4cb4fbccbd2448f496ebac5fb1be5f6c7b44a8f85", size = 14320761, upload-time = "2025-04-08T11:43:57.45Z" }, - { url = "https://files.pythonhosted.org/packages/d3/fb/4c08c29a262f75e60911db0f039e7011f9a2daf1000659cbe5a950737434/silx-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:962efdfc3d22a7dbca7e5884cd6bfdbb24424e79891444a89cc1d0c5e0fdacb6", size = 13972613, upload-time = "2025-04-08T11:44:00.437Z" }, - { url = "https://files.pythonhosted.org/packages/47/9f/b47b7f9183db61ddb6d3d52b27a2d70ed9fee5715b6db4ca0d48d4d2db05/silx-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:9994b78600c7e04407bdbb0091a931067d6fa9b424ffb6001a3a6c29023d7c64", size = 4289910, upload-time = "2025-04-08T11:44:03.529Z" }, - { url = "https://files.pythonhosted.org/packages/ba/6b/c74371b63d6dfb52d0d63ef655365507b7ae7da3e146258dc0d66a58c1d8/silx-2.2.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6568187b9e68f1f5ddbdcc4c36047decdd1339ca4b78a1216982424098d94459", size = 6200667, upload-time = "2025-04-08T11:44:05.334Z" }, - { url = "https://files.pythonhosted.org/packages/fa/cc/8099693ae0218c9b75bdfc146ef57fe110927d3424c2d25da3097b709c59/silx-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bf84e40474804d095bbb7596d9a93625b90b6453b52298b679a2683fa58654e", size = 13674069, upload-time = "2025-04-08T11:44:07.341Z" }, - { url = "https://files.pythonhosted.org/packages/81/ba/1dd6d950015bbfbf279d22d382fde00593b76223beef720ac7e28d88b29c/silx-2.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248dcf396089190fb4cb5a9adde77ea3ac62500e33bfabc8e15374ce9e2e881b", size = 14097036, upload-time = "2025-04-08T11:44:10.841Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a2/8ca963a9a00ff84a6835123573e014d2742d6dee0303310340877d0da445/silx-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:005bf5d407445b779b56550fad8a05e646010bf78d5c57cf33a7e43264b43a7c", size = 13822086, upload-time = "2025-04-08T11:44:15.021Z" }, - { url = "https://files.pythonhosted.org/packages/55/e9/09f4b8c08c151295848f2a5a400295219f932002c9237d638cb4d785f1bd/silx-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:8923f3681c538806b894391295632acf984a5d5e3ab72443a8f8668686e84f02", size = 4278379, upload-time = "2025-04-08T11:44:17.895Z" }, - { url = "https://files.pythonhosted.org/packages/70/18/0ca21fb486a18eed2e7d4d889ca79386c6b400e599fcdb68110140247b61/silx-2.2.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5a99cd66fef51ca6db45fc05663c1896d7266c6a0cc6a94923a0ebc9a470e6f9", size = 6161652, upload-time = "2025-04-08T11:44:19.729Z" }, - { url = "https://files.pythonhosted.org/packages/79/8f/bffbaa5743069a41b89129c823b905116ecf31edebe64fa30c6d435dbc69/silx-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ea7fa7b79464d3f9b8d0cdf2a5b2272fe323be48faa01e606c5d18b4c4725b", size = 13617350, upload-time = "2025-04-08T11:44:22.009Z" }, - { url = "https://files.pythonhosted.org/packages/20/f0/f872e812e61d1deba97b1d9fc2cf3c8b10f9d0c3560986bcb465b51953f3/silx-2.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2655c01d3b53bf5cd3aaf3a7265530956d77412b1c8eb2bd58205197cc18bc7f", size = 14017340, upload-time = "2025-04-08T11:44:25.602Z" }, - { url = "https://files.pythonhosted.org/packages/4d/c1/00299b27ecc5b539a7d4d2a1f63434e824ae2627c0c4881d3651f58e3133/silx-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b08d3972a88d4f3167cbe00ff5ef9599086534ab650e8df7439f22e24dcee370", size = 13803813, upload-time = "2025-04-08T11:44:28.11Z" }, - { url = "https://files.pythonhosted.org/packages/a9/13/772c94f553a1b8476037909cac4d69be0eb70a8a9efd66488d866673dc05/silx-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:eee31cec33d4cf496044231cbf86b8aa0f5b1bd7536db4a69d54e7762b591a75", size = 4274649, upload-time = "2025-04-08T11:44:30.596Z" }, - { url = "https://files.pythonhosted.org/packages/f6/e4/04360d089942253abb8cdd20ac1288873a4ad80404bf2ffb479e70914163/silx-2.2.2-cp314-cp314-win_amd64.whl", hash = "sha256:8703dbbb048ef0993be311a02c747f980171bc57cc26c04c6249f09a5d519092", size = 4190966, upload-time = "2025-10-31T08:18:21.821Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/0c/c0/affb60bf42fa4123ddffc2ef9bf98eeb6d48b935fff94441619ba5ce6a3f/silx-3.0.0.tar.gz", hash = "sha256:c40c084a134e55103be9f3d51ebc7ee8834cf0c68a6e63fcb1fb5de5b8725e91", size = 20399493, upload-time = "2026-04-24T09:36:10.136Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/5a/6c539b120cbd766c929cf016032ef0875281e48bfa31e9ca976d4d68342a/silx-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:36133d034f534f044f4f9c2f9ce9105411a3d61394c2c24ce10544da6dacdb1e", size = 4504434, upload-time = "2026-04-24T09:35:15.619Z" }, + { url = "https://files.pythonhosted.org/packages/1e/fe/dd3f19914134af8d81e0ae9392c495858bd5e21796ad8f899d46981c150e/silx-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5a389ca0997a897499c4d153062141b11e0222f6ccb7c78d57c339ed5867e522", size = 4313357, upload-time = "2026-04-24T09:35:17.834Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c5/7e726aa98cfaf128fba24fdbb5c494422fad76d40ff7f88a936414790f9c/silx-3.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a16ec6fa4d2f9e74faef3aeacded9c6c2ea001d08773020459255d3ce3075dca", size = 4896003, upload-time = "2026-04-24T09:35:20.018Z" }, + { url = "https://files.pythonhosted.org/packages/f8/18/7399503eff391a5dfcd7e7bcb046b01e677085adeb4548e93814fdf5843e/silx-3.0.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4af59ba305621cc73e342f88713d2bcdfd860ddd55f7eda5bd63f063bb95ce10", size = 5182374, upload-time = "2026-04-24T09:35:22.086Z" }, + { url = "https://files.pythonhosted.org/packages/be/7b/283c14a1bf156301d1145f09dac3b223ebc884266a6a99cf96a966f23d1c/silx-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e114870ec54d83a564bdad299281e683772c2face63eb39250fb38113f6529af", size = 5011862, upload-time = "2026-04-24T09:35:23.889Z" }, + { url = "https://files.pythonhosted.org/packages/94/a1/66a8bf19e028946083344e1d2fd502351c6fae18f34ec77a0568c2971e22/silx-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:97dc1833ee36c04aec76fd7282b86782ca2a55f4d6f4a4691d10dcc2237520a7", size = 4424369, upload-time = "2026-04-24T09:35:25.61Z" }, + { url = "https://files.pythonhosted.org/packages/32/58/a7c7b6c87882efd1089cb611faa27424820a7c61b9f152fc2bb978e78425/silx-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:edd1c6c6eb4d7bc2ebbc617bff993f4993bef17be007efa98f6570ccf926594d", size = 4117923, upload-time = "2026-04-24T09:35:27.576Z" }, + { url = "https://files.pythonhosted.org/packages/21/90/c6a780c78ca5ebfc33a2d08664ec1f72d07d1d1a6f1b2595d1a896ccd28f/silx-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cf71b6c7a09d44685da9ef52dc2e7fb7faa6fd70ab7000e1ed7acff6f2e4a0c9", size = 4495750, upload-time = "2026-04-24T09:35:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/41/9f/2be0aea7aa908b89f2cd77eec147b25400d0cda9886ee6ec6d537ccf499a/silx-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f565f57436b41454ac9efd0852f41b2e9301e9a48e2f526f9c3dc171e4d1bad", size = 4291937, upload-time = "2026-04-24T09:35:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/57/07/4e5c4b5dcfb4b14613b0dbdcd54997c8a7ed64a7f50883896a43ed96e12b/silx-3.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac24c1c67e68336b033b67f26d115c2b3a3dec88a06e0c95bb259f8c66282f4a", size = 4783906, upload-time = "2026-04-24T09:35:33.036Z" }, + { url = "https://files.pythonhosted.org/packages/25/42/766d4340869ed30ff52ad36c9e9a6154e3969532196fe043656702697d1a/silx-3.0.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2de5ed41afd4609c28769a7fdce2e0ff8ba2910c79cfb90810f22b264d811b5d", size = 5058680, upload-time = "2026-04-24T09:35:35.125Z" }, + { url = "https://files.pythonhosted.org/packages/df/e1/565f53d837552dddabdacd8e38c26f66096e197a38824becfc9057edc20c/silx-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b4028d4a551cba68e62521aec877eaa5cb3141fbb3ec7036567b50134449080", size = 4929821, upload-time = "2026-04-24T09:35:37.122Z" }, + { url = "https://files.pythonhosted.org/packages/26/1e/4fb4d010114b45de0dc43c0a15c3a43aa36aff38620776e8b15e67bb7cc2/silx-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:2e6ea994b308ce681e27e0dc49d757c42a3a601bcead2f786067e5f035e9d1e9", size = 4352810, upload-time = "2026-04-24T09:35:39.215Z" }, + { url = "https://files.pythonhosted.org/packages/4c/70/bb3ec5c42cca1a1385add2f6c4bd4dc303974af35718e806dbb7d3227b6c/silx-3.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:836f3fcc84ac1d07951987bb269123966151e3f01a8e8aa4396f86d9a4ef2d0b", size = 4100785, upload-time = "2026-04-24T09:35:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/a6/19/a3f3c0b1e1e6ed1e30731a7cd3180c1fac8198f43cadb8b0b37ec460c488/silx-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:10da3ba96e18d7722fa98a19bd754b502a23119ec6f374e053fc15ab054350cc", size = 4485581, upload-time = "2026-04-24T09:35:43.521Z" }, + { url = "https://files.pythonhosted.org/packages/3e/96/f674eb41e06bef92e64c019f6095103ac4de9352d225df7c3d0842c757da/silx-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9155e2ced8dd4abc8e7d83bb127770c4541eed7eb86be6fd7326176a51330908", size = 4282006, upload-time = "2026-04-24T09:35:45.901Z" }, + { url = "https://files.pythonhosted.org/packages/a6/22/1097f60076d1e2a61dd7c06230f5e15c358df5b670e49011e1c99a3f485d/silx-3.0.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f83e5bc13074fa4a42e97573e676ab995f57898f6772d9dd7368bda8dd97f7b", size = 4784830, upload-time = "2026-04-24T09:35:47.576Z" }, + { url = "https://files.pythonhosted.org/packages/81/d5/3479f665b8ad327b521436da144f22deb5133c46abbd9d7bf0a79b0ce6cc/silx-3.0.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ac1cce5285e0ad65d2324ea56575834b7694de3119ca3e220b91b7415035322a", size = 5056691, upload-time = "2026-04-24T09:35:49.408Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e4/a17cbafd781862a9cd571b3d3f74558cc44b8a84c3f7d15685386ea7a247/silx-3.0.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb7cfbbd1f47890d5935c7a52870c5bc7979d07463838be3e617a121e7b76d8", size = 4927115, upload-time = "2026-04-24T09:35:51.678Z" }, + { url = "https://files.pythonhosted.org/packages/cb/92/1b6248b2b48a1cecaf8f47c22a43691959056d8cddc62d1d9b38bfa4efd5/silx-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:b287b0a0f950951043a6f2acbf737200833ddcbc15c88ad6c5893d2e44ed3744", size = 4350519, upload-time = "2026-04-24T09:35:53.682Z" }, + { url = "https://files.pythonhosted.org/packages/02/8e/54654905da9b93f3c428c9b66e96de7320889a44452f582b9499a88fd50e/silx-3.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:5eded9aadcd7b23a017261d99cf968078c98b744aad7d7a4a7eeb0ce5a232aff", size = 4095587, upload-time = "2026-04-24T09:35:55.64Z" }, + { url = "https://files.pythonhosted.org/packages/e5/75/b0361ce6cdfb34c9705c71abc15d5483f83f82ddf6b7ba930eade7970196/silx-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3553cbcac2444cbce0c41128f525b478d474e83b54924b3ed75da81a639c8579", size = 4490831, upload-time = "2026-04-24T09:35:57.251Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d1/a3b7beda1546362687848701499afe029ff75aaecd22402e32d26f06a90c/silx-3.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a0382c5693a1785081c8ed9b4d3102c148da73e042646de7815a62a087f767d1", size = 4290347, upload-time = "2026-04-24T09:35:58.89Z" }, + { url = "https://files.pythonhosted.org/packages/16/03/d1ae50a167bff8e53920980258de9dc608265f9f7e7807b78c88a56d87d0/silx-3.0.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:141ad1c1fdf9edfea7e202856e54ad87e452478b0593999a45c06f861ecc9795", size = 4808918, upload-time = "2026-04-24T09:36:00.928Z" }, + { url = "https://files.pythonhosted.org/packages/94/71/f48a99e0eda72b189a43b169de2c407947f9d91ccf45e27f30925ed2b8cd/silx-3.0.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e599a2ae64ce16e02dee6ed8c8c4cff7bc2bd8b99c1891232b2e8d606263ad2", size = 5076720, upload-time = "2026-04-24T09:36:02.587Z" }, + { url = "https://files.pythonhosted.org/packages/af/62/8b6ebca9b198099101a84a8c28d27a683bd8d5259116bde6ae891afd6f95/silx-3.0.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1fdb1df0b745b4c4f4be13ae88a8e3b8603e0c85adc9377b83de24e36454aba", size = 4929466, upload-time = "2026-04-24T09:36:04.259Z" }, + { url = "https://files.pythonhosted.org/packages/93/e8/fb2092a0d369aed72a1f22a2684874cc84fefa1d64f6bb95bbf9575c71b7/silx-3.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:600aafba55bb6e972c8f861841d6f62adcdff64f21d6f540a94a29bcb34a23c5", size = 4398842, upload-time = "2026-04-24T09:36:05.922Z" }, + { url = "https://files.pythonhosted.org/packages/08/01/40abbf389b817983f8dfe7d1723a210dec6e6fe488d0364627d8ac27a8ed/silx-3.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:97b79c2dd8efdeb254732e934b49d68ef10a2e92c471ae04272e85441059eb6e", size = 4146008, upload-time = "2026-04-24T09:36:08.082Z" }, ] [[package]] @@ -2802,15 +2858,15 @@ wheels = [ [[package]] name = "stomp-py" -version = "8.2.0" +version = "9.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "docopt" }, + { name = "docopt-ng" }, { name = "websocket-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/66/c07f01feb5fbc669c4333c76eb02fb8149c653c25ba9769477f8427d5e55/stomp_py-8.2.0.tar.gz", hash = "sha256:9908689361e263bf198e6acfb3c4386759fb7df7d141f4384d7414771c68d7fc", size = 39286, upload-time = "2024-10-31T21:59:38.465Z" } +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/7b/b6/ebfd6daef0c19a5ca3ac1fb2fc092331d67af5a30c868f106fcc2504c287/stomp_py-8.2.0-py3-none-any.whl", hash = "sha256:fad24e51b505996015a39ca1632df4e0225c1c552980955e21f2aebfc0d9d85c", size = 42751, upload-time = "2024-10-31T21:59:36.658Z" }, + { 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]] @@ -2854,90 +2910,111 @@ wheels = [ [[package]] name = "tomli" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, - { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, - { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, - { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, - { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, - { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" }, - { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, - { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, - { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, - { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, - { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, - { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, - { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, - { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, - { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" }, - { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" }, - { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" }, - { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530, upload-time = "2026-01-11T11:22:13.865Z" }, - { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227, upload-time = "2026-01-11T11:22:15.224Z" }, - { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748, upload-time = "2026-01-11T11:22:16.009Z" }, - { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" }, - { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" }, - { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" }, - { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" }, - { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" }, - { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567, upload-time = "2026-01-11T11:22:24.033Z" }, - { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556, upload-time = "2026-01-11T11:22:25.378Z" }, - { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014, upload-time = "2026-01-11T11:22:26.138Z" }, - { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" }, - { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" }, - { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" }, - { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" }, - { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" }, - { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106, upload-time = "2026-01-11T11:22:34.451Z" }, - { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504, upload-time = "2026-01-11T11:22:35.764Z" }, - { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561, upload-time = "2026-01-11T11:22:36.624Z" }, - { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "tomli-w" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" }, ] [[package]] name = "tox" -version = "4.34.1" +version = "4.53.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools" }, - { name = "chardet" }, { name = "colorama" }, { name = "filelock" }, { name = "packaging" }, { name = "platformdirs" }, { name = "pluggy" }, { name = "pyproject-api" }, + { name = "python-discovery" }, + { name = "tomli-w" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/9b/5909f40b281ebd37c2f83de5087b9cb8a9a64c33745f334be0aeaedadbbc/tox-4.34.1.tar.gz", hash = "sha256:ef1e82974c2f5ea02954d590ee0b967fad500c3879b264ea19efb9a554f3cc60", size = 205306, upload-time = "2026-01-09T17:42:59.895Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/01/d87a00063fa670ce4c48a9706b615a95ddf2c9ef5558d43af6071f166fd4/tox-4.53.0.tar.gz", hash = "sha256:62c780e42f87d34ee60f2ea20342156253794fdcbd6885fd797d98ee05009f22", size = 274048, upload-time = "2026-04-14T13:44:13.782Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/0f/fe6629e277ce615e53d0a0b65dc23c88b15a402bb7dbf771f17bbd18f1c4/tox-4.34.1-py3-none-any.whl", hash = "sha256:5610d69708bab578d618959b023f8d7d5d3386ed14a2392aeebf9c583615af60", size = 176812, upload-time = "2026-01-09T17:42:58.629Z" }, + { url = "https://files.pythonhosted.org/packages/16/03/02e2a03f3756cfb66e7e1bac41b06953f12cec75ddb961d56695d4d43dc4/tox-4.53.0-py3-none-any.whl", hash = "sha256:cc4e716d18c4889aa179d785175c438fa60c35deef20ce689ec288d8fb656096", size = 212164, upload-time = "2026-04-14T13:44:11.997Z" }, ] [[package]] name = "tox-uv" -version = "1.29.0" +version = "1.35.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tox-uv-bare" }, + { name = "uv" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/b1/652dcd3b7d6cb027a0c3b5aa951168f3ace9060f77eff882c7c889942a71/tox_uv-1.35.1-py3-none-any.whl", hash = "sha256:a3e2c320cf6e75d20e71be8493fd48b208614d733ebfbc70f23e6731230e0e65", size = 6565, upload-time = "2026-04-10T16:12:58.519Z" }, +] + +[[package]] +name = "tox-uv-bare" +version = "1.35.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "tox" }, - { name = "uv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/90/06752775b8cfadba8856190f5beae9f552547e0f287e0246677972107375/tox_uv-1.29.0.tar.gz", hash = "sha256:30fa9e6ad507df49d3c6a2f88894256bcf90f18e240a00764da6ecab1db24895", size = 23427, upload-time = "2025-10-09T20:40:27.384Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/d8/d65653a00b3e438625a25b7c931e96dc9721d8d8a8b3372ceeb1f83e60e5/tox_uv_bare-1.35.1.tar.gz", hash = "sha256:ea4c3b5a4013e04ca31d99a1d930917b7cc5378e202739e600c8f4a15562e662", size = 32003, upload-time = "2026-04-10T16:13:01.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/17/221d62937c4130b044bb437caac4181e7e13d5536bbede65264db1f0ac9f/tox_uv-1.29.0-py3-none-any.whl", hash = "sha256:b1d251286edeeb4bc4af1e24c8acfdd9404700143c2199ccdbb4ea195f7de6cc", size = 17254, upload-time = "2025-10-09T20:40:25.885Z" }, + { 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]] @@ -2954,20 +3031,20 @@ wheels = [ [[package]] name = "traitlets" -version = "5.14.3" +version = "5.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, + { 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.20250924" +version = "5.2.0.20260408" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/50/c3/00cf1e62c27fd195aaf22b249884f82643141b73f151ff019aa24c99bd17/types_mock-5.2.0.20250924.tar.gz", hash = "sha256:953197543b4183f00363e8e626f6c7abea1a3f7a4dd69d199addb70b01b6bb35", size = 11319, upload-time = "2025-09-24T02:53:33.093Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/4f/a17fd8f0bdeb8d97842e4a825907e7ef7d0360e29728b7a0442d245e28e9/types_mock-5.2.0.20260408.tar.gz", hash = "sha256:0bca3ca21943ba25bca6888b2383b91938f5978a189c840656e255073d53868d", size = 11494, upload-time = "2026-04-08T04:31:46.301Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/85/52004fb81add2b05494cbd1c0dab71f3706f19935cabb4ad220643884382/types_mock-5.2.0.20250924-py3-none-any.whl", hash = "sha256:23617ffb4cf948c085db69ec90bd474afbce634ef74995045ae0a5748afbe57d", size = 10499, upload-time = "2025-09-24T02:53:32.054Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f8/dc90b73af9c04a9ff89eb785d4b63482ac74c365668a22a0b609a8e90ce9/types_mock-5.2.0.20260408-py3-none-any.whl", hash = "sha256:7754cdaadb81127124804acf2abea413705c1ac22f7bd2bd8417710d2e507216", size = 10500, upload-time = "2026-04-08T04:31:45.404Z" }, ] [[package]] @@ -2993,11 +3070,11 @@ wheels = [ [[package]] name = "tzdata" -version = "2025.3" +version = "2026.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, ] [[package]] @@ -3011,60 +3088,61 @@ wheels = [ [[package]] name = "urllib3" -version = "2.6.3" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +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/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, + { 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.9.27" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/92/70/611bcee4385b7aa00cf7acf29bc51854c365ee09ddb2cdb14b07a36b4db8/uv-0.9.27.tar.gz", hash = "sha256:9147862902b5d40894f78339803225e39b0535c4c04537188de160eb7635e46b", size = 3830404, upload-time = "2026-01-26T23:27:43.442Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/f1/9e9afb9fadb73f7914a0fc63b6f9d182b6fe6b1e55deb7cbdc29ff31299f/uv-0.9.27-py3-none-linux_armv6l.whl", hash = "sha256:ce3f16e66a96dcdc63f6ada9f7747686930986d2df104a9dd2d09664b2d870c8", size = 22011502, upload-time = "2026-01-26T23:27:31.714Z" }, - { url = "https://files.pythonhosted.org/packages/ea/b2/c36a87f5c745d310b7d8a53df053d6a87864aa38e3a964b0845eb6de37cc/uv-0.9.27-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a662a7df5cc781ae7baa65171b5d488d946ea93e61b7bbeda5a24d21a0cd9003", size = 21081065, upload-time = "2026-01-26T23:28:11.895Z" }, - { url = "https://files.pythonhosted.org/packages/44/1d/be2d80573c531389933059f6e5ef265ef7324c268f3ade80e500aa627f6b/uv-0.9.27-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8f00158023e77600da602c5f1fa97cd8c2eef987d6aba34c16cf04a3e5a932f4", size = 19844905, upload-time = "2026-01-26T23:27:34.486Z" }, - { url = "https://files.pythonhosted.org/packages/3e/f7/59679af9f0446d8ffc1239e3356390c95925e0004549b64df3f189b1422b/uv-0.9.27-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:5f2393051ed2023cc7d6ff99e41184b7c7bb7da001bc727cd4bee6da96f4a966", size = 21592623, upload-time = "2026-01-26T23:27:51.132Z" }, - { url = "https://files.pythonhosted.org/packages/e2/31/0faaad82951fc6b14dfad8e187e43747a528aa50ee283385f903e86d67d1/uv-0.9.27-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:3f8cf7a50a95ae5cb0366d24edf79d15b3ba380b462af49e3404f9f7b91101c7", size = 21636917, upload-time = "2026-01-26T23:27:46.252Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8a/e181c32b7f5309fd987667d368fb944822c713e92a7eba3c73d2eddec6cd/uv-0.9.27-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c331e0445465ea6029e2dd0f5499024e552136c10069fac0ca21708f2aeb1ce6", size = 21633082, upload-time = "2026-01-26T23:28:09.417Z" }, - { url = "https://files.pythonhosted.org/packages/da/0e/1d44157bc8e5d1c382db087d9a30ab85fc7b5c2d610fb2e3d861c5a69d9b/uv-0.9.27-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a56e0c92da67060d4c86a3b92b2c69e8fb1d61933636764aba16531ddb13f6e3", size = 22843044, upload-time = "2026-01-26T23:27:29.091Z" }, - { url = "https://files.pythonhosted.org/packages/eb/76/7c1b13e4dc8237dd3721f4ec933bb2e5be400fd2812cf98dc2be645a0f7d/uv-0.9.27-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0c9b2e874f5207a50b852726f3a0740eadf30baf2c7973380d697f4e3166d347", size = 24141329, upload-time = "2026-01-26T23:27:39.705Z" }, - { url = "https://files.pythonhosted.org/packages/6f/04/551749fd863cb43290c9a3f4348ccdd88ec0445c26a00ba840d776572867/uv-0.9.27-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79841a2e4df4a32f22fbb0919c3e513226684572fba227b37467ba6404f3fafd", size = 23637517, upload-time = "2026-01-26T23:27:37.111Z" }, - { url = "https://files.pythonhosted.org/packages/d9/c6/78b619a51a6646af4633714b161f980ab764cc892e0f79228162fba51fe8/uv-0.9.27-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33902c95b561ac67d15c339fe1eaf39e068372c7464c79c3bd0e2bf9ee914dcb", size = 22864516, upload-time = "2026-01-26T23:27:56.35Z" }, - { url = "https://files.pythonhosted.org/packages/15/19/b35928e55307beb69b60b88446df3cb8d7ff3ba0993fc2214a43266c17d1/uv-0.9.27-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79939f7e92d707fb84933509df747d1b88b00d94ebe41f3a1e30916cc33c7307", size = 22746151, upload-time = "2026-01-26T23:27:26.166Z" }, - { url = "https://files.pythonhosted.org/packages/9f/70/fbab20d40afe7ac9ec20011acec75f8bb3b9b83dfbe2cdb1405cad7a8cf2/uv-0.9.27-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:7e2d4183a0dca7596ea6385e9d5a0a87ada4f71a70aa110e2b22234370b8d8ef", size = 21661188, upload-time = "2026-01-26T23:27:53.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/02/4d4cf298bd22e53d6c289404b093cf876e64ee1fb946cc32a6f965030629/uv-0.9.27-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1555ab7bc8501144e8771e54a628eb02cb95f3612d54659bb7132576260feee5", size = 22397798, upload-time = "2026-01-26T23:28:07.102Z" }, - { url = "https://files.pythonhosted.org/packages/97/29/3acef6a0eea58afbf7f7a08e4258430e3c7394a6b1e28249450f4c0ddc60/uv-0.9.27-py3-none-musllinux_1_1_i686.whl", hash = "sha256:542731a6f53072e725959a9c839b195048715d840213d9834d36f74fa4249855", size = 22111665, upload-time = "2026-01-26T23:27:58.762Z" }, - { url = "https://files.pythonhosted.org/packages/13/15/1e7b34f02e8f53c9498311f991421e794ad57fa60a2d3e41b43485e914e4/uv-0.9.27-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:4f534ad701ca3fffac4a8e1df2a36930e6a0cbf4dad52aeabc2c3c9e2cbbe65e", size = 22951420, upload-time = "2026-01-26T23:27:48.818Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c5/c3bb3a5885891ed8fe7dcc897db03366f3e19da8bf48ae8f5ea4da34545d/uv-0.9.27-py3-none-win32.whl", hash = "sha256:18aab0e19634997366907a9b8a1648e79b0fa34d1b86d8e8ee1e7ba5b9faa6ae", size = 20817398, upload-time = "2026-01-26T23:28:14.265Z" }, - { url = "https://files.pythonhosted.org/packages/db/19/22d2671928f6d2fef1edfdbf758abbb5a0f218b69fd23bd5fd52bbe5b078/uv-0.9.27-py3-none-win_amd64.whl", hash = "sha256:f961c53f83ae6a01e3ffacc584c91044958bc6db003e803c490e106a79981222", size = 23412228, upload-time = "2026-01-26T23:28:01.547Z" }, - { url = "https://files.pythonhosted.org/packages/17/eb/9a71112e2266b79da552a4b2ffb52331ca7171437b901705427f8e54e77c/uv-0.9.27-py3-none-win_arm64.whl", hash = "sha256:463327fb343c3085a3333389d6e5908cb48203b327707790c06bdc8f2ca57b95", size = 21836206, upload-time = "2026-01-26T23:28:04.411Z" }, +version = "0.11.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/7d/17750123a8c8e324627534fe1ae2e7a46689db8492f1a834ab4fd229a7d8/uv-0.11.7.tar.gz", hash = "sha256:46d971489b00bdb27e0aa715e4a5cd4ef2c28ea5b6ef78f2b67bf861eb44b405", size = 4083385, upload-time = "2026-04-15T21:42:55.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/5b/2bb2ab6fe6c78c2be10852482ef0cae5f3171460a6e5e24c32c9a0843163/uv-0.11.7-py3-none-linux_armv6l.whl", hash = "sha256:f422d39530516b1dfb28bb6e90c32bb7dacd50f6a383cd6e40c1a859419fbc8c", size = 23757265, upload-time = "2026-04-15T21:43:14.494Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f5/36ff27b01e60a88712628c8a5a6003b8e418883c24e084e506095844a797/uv-0.11.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8b2fe1ec6775dad10183e3fdce430a5b37b7857d49763c884f3a67eaa8ca6f8a", size = 23184529, upload-time = "2026-04-15T21:42:30.225Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fa/f379be661316698f877e78f4c51e5044be0b6f390803387237ad92c4057f/uv-0.11.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:162fa961a9a081dcea6e889c79f738a5ae56507047e4672964972e33c301bea9", size = 21780167, upload-time = "2026-04-15T21:42:44.942Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/fbed29775b0612f4f5679d3226268f1a347161abc1727b4080fb41d9f46f/uv-0.11.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:5985a15a92bd9a170fc1947abb1fbc3e9828c5a430ad85b5bed8356c20b67a71", size = 23609640, upload-time = "2026-04-15T21:42:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/ad/de/989a69634a869a22322770120557c2d8cbba5b77ec7cfad326b4ec0f0547/uv-0.11.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:fab0bb43fbbc0ee5b5fee212078d2300c371b725faff7cf72eeaafa0bff0606b", size = 23322484, upload-time = "2026-04-15T21:43:26.52Z" }, + { url = "https://files.pythonhosted.org/packages/24/08/c1af05ea602eb4eb75d86badb6b0594cc104c3ca83ccf06d9ed4dd2186ad/uv-0.11.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23d457d6731ebdb83f1bffebe4894edab2ef43c1ec5488433c74300db4958924", size = 23326385, upload-time = "2026-04-15T21:42:41.32Z" }, + { url = "https://files.pythonhosted.org/packages/68/99/e246962da06383e992ecab55000c62a50fb36efef855ea7264fad4816bf4/uv-0.11.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d6a17507b8139b8803f445a03fd097f732ce8356b1b7b13cdb4dd8ef7f4b2e0", size = 24985751, upload-time = "2026-04-15T21:42:37.777Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/b0b68083859579ce811996c1480765ec6a2442b44c451eaef53e6218fbae/uv-0.11.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd48823ca4b505124389f49ae50626ba9f57212b9047738efc95126ed5f3844d", size = 25724160, upload-time = "2026-04-15T21:43:18.762Z" }, + { url = "https://files.pythonhosted.org/packages/4e/19/5970e89d9e458fd3c4966bbc586a685a1c0ab0a8bf334503f63fa20b925b/uv-0.11.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb91f52ee67e10d5290f2c2897e2171357f1a10966de38d83eefa93d96843b0c", size = 25028512, upload-time = "2026-04-15T21:43:02.721Z" }, + { url = "https://files.pythonhosted.org/packages/83/eb/4e1557daf6693cb446ed28185664ad6682fd98c6dbac9e433cbc35df450a/uv-0.11.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e4d5e31bea86e1b6e0f5a0f95e14e80018e6f6c0129256d2915a4b3d793644d", size = 24933975, upload-time = "2026-04-15T21:42:18.828Z" }, + { url = "https://files.pythonhosted.org/packages/68/55/3b517ec8297f110d6981f525cccf26f86e30883fbb9c282769cffbcdcfca/uv-0.11.7-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:ceae53b202ea92bc954759bc7c7570cdcd5c3512fce15701198c19fd2dfb8605", size = 23706403, upload-time = "2026-04-15T21:43:10.664Z" }, + { url = "https://files.pythonhosted.org/packages/dc/30/7d93a0312d60e147722967036dc8ea37baab4802784bddc22464cb707deb/uv-0.11.7-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:f97e9f4e4d44fb5c4dfaa05e858ef3414a96416a2e4af270ecd88a3e5fb049a9", size = 24495797, upload-time = "2026-04-15T21:42:26.538Z" }, + { url = "https://files.pythonhosted.org/packages/8c/89/d49480bdab7725d36982793857e461d471bde8e1b7f438ffccee677a7bf8/uv-0.11.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:750ee5b96959b807cf442b73dd8b55111862d63f258f896787ea5f06b68aaca9", size = 24580471, upload-time = "2026-04-15T21:42:52.871Z" }, + { url = "https://files.pythonhosted.org/packages/b6/9f/c57dc03b48be17b564e304eb9ff982890c12dfb888b1ce370788733329ab/uv-0.11.7-py3-none-musllinux_1_1_i686.whl", hash = "sha256:f394331f0507e80ee732cb3df737589de53bed999dd02a6d24682f08c2f8ac4f", size = 24113637, upload-time = "2026-04-15T21:42:34.094Z" }, + { url = "https://files.pythonhosted.org/packages/13/ba/b87e358b629a68258527e3490e73b7b148770f4d2257842dea3b7981d4e8/uv-0.11.7-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:0df59ab0c6a4b14a763e8445e1c303af9abeb53cdfa4428daf9ff9642c0a3cce", size = 25119850, upload-time = "2026-04-15T21:43:22.529Z" }, + { url = "https://files.pythonhosted.org/packages/4b/74/16d229e1d8574bcbafa6dc643ac20b70c3e581f42ac31a6f4fd53035ffe3/uv-0.11.7-py3-none-win32.whl", hash = "sha256:553e67cc766d013ce24353fecd4ea5533d2aedcfd35f9fac430e07b1d1f23ed4", size = 22918454, upload-time = "2026-04-15T21:42:58.702Z" }, + { url = "https://files.pythonhosted.org/packages/a6/1d/b73e473da616ac758b8918fb218febcc46ddf64cba9e03894dfa226b28bd/uv-0.11.7-py3-none-win_amd64.whl", hash = "sha256:5674dfb5944513f4b3735b05c2deba6b1b01151f46729d533d413a9a905f8c5d", size = 25447744, upload-time = "2026-04-15T21:42:48.813Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bb/e6bfdea92ed270f3445a5a3c17599d041b3f2dbc5026c09e02830a03bbaf/uv-0.11.7-py3-none-win_arm64.whl", hash = "sha256:6158b7e39464f1aa1e040daa0186cae4749a78b5cd80ac769f32ca711b8976b1", size = 23941816, upload-time = "2026-04-15T21:43:06.732Z" }, ] [[package]] name = "virtualenv" -version = "20.36.1" +version = "21.2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, + { name = "python-discovery" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/98/3a7e644e19cb26133488caff231be390579860bbbb3da35913c49a1d0a46/virtualenv-21.2.4.tar.gz", hash = "sha256:b294ef68192638004d72524ce7ef303e9d0cf5a44c95ce2e54a7500a6381cada", size = 5850742, upload-time = "2026-04-14T22:15:31.438Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" }, + { url = "https://files.pythonhosted.org/packages/27/8d/edd0bd910ff803c308ee9a6b7778621af0d10252219ad9f19ef4d4982a61/virtualenv-21.2.4-py3-none-any.whl", hash = "sha256:29d21e941795206138d0f22f4e45ff7050e5da6c6472299fb7103318763861ac", size = 5831232, upload-time = "2026-04-14T22:15:29.342Z" }, ] [[package]] name = "wcwidth" -version = "0.5.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/6e/62daec357285b927e82263a81f3b4c1790215bc77c42530ce4a69d501a43/wcwidth-0.5.0.tar.gz", hash = "sha256:f89c103c949a693bf563377b2153082bf58e309919dfb7f27b04d862a0089333", size = 246585, upload-time = "2026-01-27T01:31:44.942Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/3e/45583b67c2ff08ad5a582d316fcb2f11d6cf0a50c7707ac09d212d25bc98/wcwidth-0.5.0-py3-none-any.whl", hash = "sha256:1efe1361b83b0ff7877b81ba57c8562c99cf812158b778988ce17ec061095695", size = 93772, upload-time = "2026-01-27T01:31:43.432Z" }, + { 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]] From cd78a9df505370cdbe29ee93e24cd914bd5af2fd Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 13 May 2026 11:28:20 +0000 Subject: [PATCH 85/86] fix utils tests --- src/xrpd_toolbox/core.py | 7 +++++++ tests/test_utils.py | 39 +++++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/xrpd_toolbox/core.py b/src/xrpd_toolbox/core.py index 4d53c37..62fd7e2 100644 --- a/src/xrpd_toolbox/core.py +++ b/src/xrpd_toolbox/core.py @@ -3,6 +3,7 @@ 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 @@ -705,6 +706,12 @@ def from_fullprof( ) +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 diff --git a/tests/test_utils.py b/tests/test_utils.py index 15d7006..5e1b793 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,9 +1,10 @@ import os import numpy as np +import pytest import scipy.integrate as integrate -from xrpd_toolbox.utils.peaks import find_and_fit_peaks, gaussian +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, @@ -56,35 +57,35 @@ def test_beam_energy_to_wavelength(): assert round(wavelength_in_angstrom, 2) == 1.0 -def test_load_int_array_from_file_returns_array_when_contains_ints(): - test_file = "int_array.txt" +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 - with open(test_file, "w") as f: - for i in range(1, 6): - f.write(f"{i}\n") + 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) - # Clean up - os.remove(test_file) - -def test_load_int_array_from_file_returns_none_when_file_doesnt_exist(): +def test_load_int_array_from_file_raises_when_file_doesnt_exist(): test_file = "non_existent.txt" - # Test loading the array + 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) - -def test_load_int_array_from_file_returns_none_when_file_empty(): - test_file = "int_array.txt" - # Create a temporary file with open(test_file, "w") as f: f.write("") @@ -125,8 +126,8 @@ def test_find_and_fit_peaks_with_n_peaks(): y_intensity = np.zeros_like(x) - for n, peak_cen in enumerate(np.linspace(20, 80, 4)): - peak_intensity = gaussian(x, amplitude=n, centre=peak_cen, fwhm=1.0) + 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) @@ -134,7 +135,9 @@ def test_find_and_fit_peaks_with_n_peaks(): peaks = find_and_fit_peaks(x, y_noisy) - assert len(peaks) == 3 + assert len(peaks) == 4 + + assert np.allclose([float(p.centre) for p in peaks], [20, 40, 60, 80], atol=0.5) if __name__ == "__main__": From 91df5f19df282bb2cf5a297377c23d2f8bb5897e Mon Sep 17 00:00:00 2001 From: RJCD-Diamond Date: Wed, 13 May 2026 11:32:39 +0000 Subject: [PATCH 86/86] fix eiger test --- src/xrpd_toolbox/i15_1/eiger_500k.py | 6 +++--- tests/test_eiger.py | 13 +++++-------- tests/test_profile_calc.py | 2 ++ 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/xrpd_toolbox/i15_1/eiger_500k.py b/src/xrpd_toolbox/i15_1/eiger_500k.py index 84fc9ec..3ada7a5 100644 --- a/src/xrpd_toolbox/i15_1/eiger_500k.py +++ b/src/xrpd_toolbox/i15_1/eiger_500k.py @@ -17,7 +17,7 @@ from pyFAI.integrator.azimuthal import AzimuthalIntegrator from pyFAI.method_registry import IntegrationMethod -from xrpd_toolbox.utils.settings import XRPDBaseModel +from xrpd_toolbox.core import XRPDBaseModel from xrpd_toolbox.utils.utils import ( get_entry, h5_to_array, @@ -249,8 +249,8 @@ def simulate_data( ai_copy = deepcopy(self.ai) ai_copy.rot2 = position - simulated_image = calibrant.fake_calibration_image( - ai, shape=self.max_shape, resolution=resolution + simulated_image = self.calibrant.fake_calibration_image( + ai_copy, shape=self.max_shape, resolution=resolution ) simulated_ais.append(ai_copy) diff --git a/tests/test_eiger.py b/tests/test_eiger.py index 71529fe..a1fa8d1 100644 --- a/tests/test_eiger.py +++ b/tests/test_eiger.py @@ -1,5 +1,5 @@ -import matplotlib.pyplot as plt import numpy as np +import pytest from xrpd_toolbox.i15_1.eiger_500k import Eiger500K @@ -30,22 +30,19 @@ def test_simulated_eiger(): ) assert images[0].shape == (1024, 512) - assert images[0] > 0 + 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) == 5 - # assert len(y) == 5 - plt.plot(x, y, marker="o") - plt.ylabel("Intensity (a.u.)") - plt.title("Simulated 1D Pattern from Eiger Step Scan") - plt.show() + assert len(x) > 0 + assert len(y) == len(x) if __name__ == "__main__": diff --git a/tests/test_profile_calc.py b/tests/test_profile_calc.py index 81d224c..b008337 100644 --- a/tests/test_profile_calc.py +++ b/tests/test_profile_calc.py @@ -1,3 +1,4 @@ +import os from pathlib import Path import pytest @@ -50,6 +51,7 @@ def test_refine_silicon(): model.irf.refine_none() model.refine(plot=False) model.save(OUTPUT_NAME) + os.remove(OUTPUT_NAME) @pytest.mark.skipif(

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