diff --git a/docs/examples/data/new_device_calib.xlsx b/docs/examples/data/new_device_calib.xlsx new file mode 100644 index 0000000..bcaf75c Binary files /dev/null and b/docs/examples/data/new_device_calib.xlsx differ diff --git a/docs/examples/data/new_device_kinetic.xlsx b/docs/examples/data/new_device_kinetic.xlsx new file mode 100644 index 0000000..8dac39c Binary files /dev/null and b/docs/examples/data/new_device_kinetic.xlsx differ diff --git a/docs/examples/data/~$20240719_biotek_FDH.V9_0.02enzyme_kinetics.xlsx b/docs/examples/data/~$20240719_biotek_FDH.V9_0.02enzyme_kinetics.xlsx deleted file mode 100644 index 1ac3755..0000000 Binary files a/docs/examples/data/~$20240719_biotek_FDH.V9_0.02enzyme_kinetics.xlsx and /dev/null differ diff --git a/docs/examples/data/~$plate_map_SAHH_kinetics.xlsx b/docs/examples/data/~$plate_map_SAHH_kinetics.xlsx deleted file mode 100644 index 1ac3755..0000000 Binary files a/docs/examples/data/~$plate_map_SAHH_kinetics.xlsx and /dev/null differ diff --git a/mtphandler/plate_manager.py b/mtphandler/plate_manager.py index 72c19f0..989c6b0 100644 --- a/mtphandler/plate_manager.py +++ b/mtphandler/plate_manager.py @@ -497,6 +497,56 @@ def _assign_species_to_all_except( f" {init_conc} {conc_unit} to all wells except {well_ids}." ) + def create_assignment_spreadsheet( + self, + path: str = "assignment.xlsx", + ): + """Create an Excel spreadsheet for assigning initial concentrations. The spreadsheet + contains a separate sheet for each species defined on the plate, with validation + to allow only numerical values in the input cells and prevent changes to all other cells. + """ + + with pd.ExcelWriter(path, engine="xlsxwriter") as writer: + df = pd.DataFrame( + index=[chr(65 + i) for i in range(8)], + columns=[str(i + 1) for i in range(12)], + ) + df.to_excel(writer, sheet_name="pH", index=True) + worksheet = writer.sheets["pH"] + + worksheet.data_validation( + "B2:M9", + { + "validate": "decimal", + "criteria": "between", + "minimum": 0, + "maximum": 12, + "error_message": "pH must be a numerical value between 0 and 12", + }, + ) + for species in self.molecules + self.proteins: + df = pd.DataFrame( + index=[chr(65 + i) for i in range(8)], + columns=[str(i + 1) for i in range(12)], + ) + + df.to_excel(writer, sheet_name=species.id, index=True) + + worksheet = writer.sheets[species.id] + + worksheet.data_validation( + "B2:M9", + { + "validate": "decimal", + "criteria": "between", + "minimum": 0, + "maximum": 1e18, + "error_message": "This cell only accepts numerical values", + }, + ) + + print(f"Created assignment spreadsheet at {path}.") + def assign_init_conditions_from_spreadsheet( self, conc_unit: UnitDefinition, @@ -1115,6 +1165,43 @@ def read_tekan_magellan( return cls(**data) + @classmethod + def read_new_device( + cls, + path: str, + temperature: float, + ph: float | None = None, + name: str | None = None, + temperature_unit: UnitDefinition = C, + ) -> PlateManager: + """Read a `*.xlsx` file exported from a new device and create a PlateManager object. + + Args: + path (str): Path to the file. + temperature (float): The temperature of the measurements. + ph (float | None, optional): The pH value of the measurements. Defaults to None. + name (str | None, optional): Name of the plate. Defaults to None. + temperature_unit (UnitDefinition, optional): Unit of temperature. Defaults to C. + + Returns: + PlateManager: PlateManager object. + """ + from mtphandler.readers import read_new_device as reader + + data: dict[str, Any] = { + "plate": reader( + path=path, + temperature=[temperature], + temperature_unit=temperature_unit, + ph=ph, + ) + } + + if name is not None: + data["name"] = name + + return cls(**data) + @classmethod def read_multiskan_sky( cls, @@ -1143,137 +1230,11 @@ def read_multiskan_sky( if __name__ == "__main__": - # path = ( - # "/Users/max/Documents/GitHub/MTPHandler/docs/examples/data/spectra_max_190.txt" - # ) - - # pm = PlateManager.read_spectra_max_190(path, ph=6.9) - # pm.visualize() - - # pm - - # h1 = pm.get_well("H1") - - # print(h1.id) - # print(h1.x_pos) - # print(h1.y_pos) - # print(h1.measurements[0].absorption[0]) - # print(h1.measurements[0].absorption[-1]) - - # path = "/Users/max/Documents/GitHub/MTPHandler/docs/examples/data/tekan_spark.xlsx" - # from mtphandler.model import Plate - - # p = PlateManager.read_tecan_spark(path, 7.4) - - # print(p.plate.temperatures) - - # p.visualize() - - # path = "/Users/max/Documents/GitHub/MTPHandler/docs/examples/data/magellan.xlsx" - - # plate = PlateManager.read_tekan_magellan(path, wavelength=600, ph=7) - - # plate.visualize() - - # path = ( - # "/Users/max/Documents/training_course/jules/Spectramax190 molecular Devices.txt" - # ) - - # from mtphandler.units import mM - - # pm = PlateManager.read_spectra_max_190(path, ph=7) - # # pm.visualize() - # testo = pm.define_molecule("testo", 60857, "testosterone") - # mpi = pm.define_molecule("mpi", 60961, "methylparaben") - - # pm.assign_species( - # species=testo, - # init_conc=0.1, - # conc_unit=mM, - # to="all", - # ) - - # path = ( - # "/Users/max/Documents/GitHub/MTPHandler/docs/examples/data/ BioTek_Epoch2.xlsx" - # ) - - # from mtphandler.units import mM - - # p = PlateManager.read_biotek(path, ph=7.4) - # p.visualize() - - # testo = p.define_molecule("testo", 60857, "testosterone") - # aldolase = p.define_protein("aldolase", "Aldolase") + path = "docs/examples/data/ BioTek_Epoch2.xlsx" - # p.assign_init_conditions( - # species=testo, - # init_conc=0.1, - # conc_unit=mM, - # to="all", - # ) + p = PlateManager.read_biotek(path) + p.define_molecule("alc", 123) + p.define_molecule("ala", 124) + p.define_protein("asd", "adfaddf") - # aldo = p.define_protein("aldolase", "Aldolase") - # p.assign_init_conditions( - # species=aldo, init_conc=0.1, conc_unit=mM, to="all", contributes_to_signal=False - # ) - - # enz = p.to_enzymeml(name="Test EnzymeML", wells_with_protein_only=False) - - # with open("enz.json", "w") as f: - # f.write(enz.model_dump_json(indent=4)) - # print(len(enz.measurements)) - - # from mtphandler.units import C, min - - # path = "docs/examples/data/multiskan_spectrum_1500.txt" - - # ph = 7.0 - # wavelength = 450.0 - - # time = np.arange(0, 15.5, 0.5).tolist() - # print(f"the thime is {time}") - - # plate = PlateManager.read_multiskan_spectrum_1500( - # path=path, - # ph=ph, - # time=time, - # time_unit=min, - # temperature=37.0, - # temperature_unit=C, - # ) - # plate.visualize() - - path = ( - "/Users/max/Documents/GitHub/MTPHandler/docs/examples/data/Multiskan Sky.xlsx" - ) - - p = PlateManager.read_multiskan_sky(path, ph=None) - p.visualize(darkmode=True) - print(p) - - -class BlankResult(BaseModel): - species_id: str = Field( - description="The id of the species for which the blank was calculated.", - default=None, - ) - wavelength: float = Field( - description="The wavelength at which the blank was calculated.", - default=None, - ) - control_well_ids: list[str] = Field( - description="The ids of the wells used to calculate the blank.", - default=[], - ) - mean_contribution: float = Field( - description="The mean contribution of the species to the signal.", - default=None, - ) - std_contribution: float = Field( - description="The standard deviation of the contribution of the species to the signal.", - default=None, - ) - applied_to_well_ids: list[str] = Field( - description="The ids of the wells to which the blank was applied.", - default=[], - ) + p.create_assignment_spreadsheet() diff --git a/mtphandler/readers/__init__.py b/mtphandler/readers/__init__.py index 2aecda4..0c5b8eb 100644 --- a/mtphandler/readers/__init__.py +++ b/mtphandler/readers/__init__.py @@ -5,3 +5,4 @@ from .tekan_magellan import read_tekan_magellan # noqa from .tekan_spark import read_tekan_spark # noqa from .multiskan_sky import read_multiskan_sky # noqa +from .new_device import read_new_device # noqa diff --git a/mtphandler/readers/new_device.py b/mtphandler/readers/new_device.py new file mode 100644 index 0000000..2836a40 --- /dev/null +++ b/mtphandler/readers/new_device.py @@ -0,0 +1,163 @@ +from __future__ import annotations + +import re + +import pandas as pd + +from mtphandler.model import Plate, UnitDefinition +from mtphandler.readers.utils import id_to_xy +from mtphandler.units import second + + +def read_new_device( + path: str, + ph: float | None, + temperature: list[float], + temperature_unit: UnitDefinition, +) -> Plate: + pattern = r"\(([A-H][0-9]{2})\)" + + if isinstance(temperature, (int | float)): + temperature = [temperature] + + df = pd.read_excel(path) + + wavelength = float(df.iloc[4, 0].split(" ")[1]) + time_str = df.iloc[1, 0] + timestamp = str(pd.to_datetime(time_str, format="%m/%d/%Y %I:%M:%S %p")) + name = df.iloc[0, 0] + + # Check for "Reading", "Abs", or "Sample" in the DataFrame + if "Reading" in df.values: + plate = handle_timecourse_read( + df, path, name, timestamp, temperature_unit, wavelength, ph, pattern + ) + elif any(keyword in df.values for keyword in ["Abs", "Sample"]): + plate = handle_endpoint_read( + df, path, name, timestamp, temperature_unit, wavelength, ph, pattern + ) + else: + raise ValueError( + "Could not find 'Reading', 'Abs', or 'Sample' in the DataFrame." + ) + + return plate + + +def handle_timecourse_read( + df: pd.DataFrame, + path: str, + name: str, + timestamp: str, + temperature_unit: UnitDefinition, + wavelength: float, + ph: float | None, + pattern: str, +) -> Plate: + """Handles the case where 'Reading' is found in the DataFrame.""" + + row_number = df[df.iloc[:, 0] == "Reading"].index[0] + df = pd.read_excel(path, skiprows=row_number + 1).dropna(axis=0, how="any") + time = df.pop("avg. time [s]").values.tolist() + + plate = Plate( + name=name, + date_measured=timestamp, + temperature_unit=temperature_unit, + ) + + # Iterate over the columns + for column in df.columns: + match = re.search(pattern, column) + if match: + well_id = match.group(1) + name_id = column.split(" ")[0] + x, y = id_to_xy(well_id) + well = plate.add_to_wells( + id=name_id, + x_pos=x, + y_pos=y, + ph=ph, + ) + + well.add_to_measurements( + wavelength=wavelength, + absorption=df[column].values.tolist(), + time=time, + time_unit=second, + ) + + return plate + + +def handle_endpoint_read( + df: pd.DataFrame, + path: str, + name: str, + timestamp: str, + temperature_unit: UnitDefinition, + wavelength: float, + ph: float | None, + pattern: str, +) -> Plate: + """Handles the case where 'Abs' or 'Sample' is found in the DataFrame.""" + + absorption_row = df[df.iloc[:, 0] == "Abs"].index[0] + sample_row = df[df.iloc[:, 0] == "Sample"].index[0] + + absorption_df = pd.read_excel( + path, + skiprows=absorption_row + 1, + nrows=8, + usecols=range(13), + index_col=0, + ) + + sample_df = pd.read_excel( + path, + skiprows=sample_row + 1, + usecols=range(13), + nrows=8, + index_col=0, + ) + + plate = Plate( + name=name, + date_measured=timestamp, + temperature_unit=temperature_unit, + ) + + for row_id in range(8): + for column_id in range(12): + if pd.isnull(sample_df.iloc[row_id, column_id]) or pd.isnull( + absorption_df.iloc[row_id, column_id] + ): + continue + print(sample_df.iloc[row_id, column_id]) + well = plate.add_to_wells( + id=sample_df.iloc[row_id, column_id], + x_pos=column_id, + y_pos=row_id, + ph=ph, + ) + + well.add_to_measurements( + wavelength=wavelength, + absorption=[absorption_df.iloc[row_id, column_id]], + time=[0], + time_unit=second, + ) + + return plate + + +if __name__ == "__main__": + path = "docs/examples/data/new_device_calib.xlsx" + from mtphandler.units import C + + plate = read_new_device( + path=path, + ph=7.4, + temperature=[37.0], + temperature_unit=C, + ) diff --git a/mtphandler/readers/utils.py b/mtphandler/readers/utils.py index 889e7ac..9427dff 100644 --- a/mtphandler/readers/utils.py +++ b/mtphandler/readers/utils.py @@ -10,8 +10,10 @@ def xy_to_id(x: int, y: int) -> str: def id_to_xy(well_id: str) -> tuple[int, int]: - """Well ID to well coordinates""" - return int(well_id[1:]) - 1, ord(well_id[0].upper()) - 65 + """Convert well ID (e.g., A01 or A1) to well coordinates""" + row = ord(well_id[0].upper()) - 65 + column = int(well_id[1:]) - 1 + return column, row def get_well(self, id: str) -> Well: for well in self.plate.wells: @@ -26,3 +28,6 @@ def get_well(self, id: str) -> Well: print(id_to_xy("A1")) print(id_to_xy("H12")) print(id_to_xy("C3")) + print(id_to_xy("A02")) + print(id_to_xy("A01")) + print(id_to_xy("A11")) diff --git a/plate_visualization.json b/plate_visualization.json new file mode 100644 index 0000000..52dcaf9 --- /dev/null +++ b/plate_visualization.json @@ -0,0 +1 @@ +{"data":[{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.116],"type":"scatter","xaxis":"x","yaxis":"y"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1386],"type":"scatter","xaxis":"x2","yaxis":"y2"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1772],"type":"scatter","xaxis":"x3","yaxis":"y3"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1791],"type":"scatter","xaxis":"x4","yaxis":"y4"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1539],"type":"scatter","xaxis":"x5","yaxis":"y5"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1704],"type":"scatter","xaxis":"x6","yaxis":"y6"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1283],"type":"scatter","xaxis":"x13","yaxis":"y13"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1316],"type":"scatter","xaxis":"x14","yaxis":"y14"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1428],"type":"scatter","xaxis":"x15","yaxis":"y15"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1251],"type":"scatter","xaxis":"x16","yaxis":"y16"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.146],"type":"scatter","xaxis":"x17","yaxis":"y17"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[3.1377],"type":"scatter","xaxis":"x18","yaxis":"y18"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[2.783],"type":"scatter","xaxis":"x25","yaxis":"y25"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[2.7561],"type":"scatter","xaxis":"x26","yaxis":"y26"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[2.7958],"type":"scatter","xaxis":"x27","yaxis":"y27"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[2.771],"type":"scatter","xaxis":"x28","yaxis":"y28"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[2.7757],"type":"scatter","xaxis":"x29","yaxis":"y29"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[2.7618],"type":"scatter","xaxis":"x30","yaxis":"y30"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[1.4891],"type":"scatter","xaxis":"x37","yaxis":"y37"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[1.5532],"type":"scatter","xaxis":"x38","yaxis":"y38"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[1.5261],"type":"scatter","xaxis":"x39","yaxis":"y39"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[1.5429],"type":"scatter","xaxis":"x40","yaxis":"y40"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[1.5438],"type":"scatter","xaxis":"x41","yaxis":"y41"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[1.5431],"type":"scatter","xaxis":"x42","yaxis":"y42"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.3782],"type":"scatter","xaxis":"x49","yaxis":"y49"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.3826],"type":"scatter","xaxis":"x50","yaxis":"y50"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.3676],"type":"scatter","xaxis":"x51","yaxis":"y51"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.3392],"type":"scatter","xaxis":"x52","yaxis":"y52"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.344],"type":"scatter","xaxis":"x53","yaxis":"y53"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.3439],"type":"scatter","xaxis":"x54","yaxis":"y54"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.1991],"type":"scatter","xaxis":"x61","yaxis":"y61"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.2067],"type":"scatter","xaxis":"x62","yaxis":"y62"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.2132],"type":"scatter","xaxis":"x63","yaxis":"y63"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.1944],"type":"scatter","xaxis":"x64","yaxis":"y64"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.1915],"type":"scatter","xaxis":"x65","yaxis":"y65"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.1935],"type":"scatter","xaxis":"x66","yaxis":"y66"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.0708],"type":"scatter","xaxis":"x73","yaxis":"y73"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.072],"type":"scatter","xaxis":"x74","yaxis":"y74"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.072],"type":"scatter","xaxis":"x75","yaxis":"y75"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.0682],"type":"scatter","xaxis":"x76","yaxis":"y76"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.0683],"type":"scatter","xaxis":"x77","yaxis":"y77"},{"hovertemplate":"%{y:.2f}\u003cbr\u003e","line":{"color":"#636EFA"},"mode":"lines","name":"340.0 nm","showlegend":false,"x":[0.0],"y":[0.0685],"type":"scatter","xaxis":"x78","yaxis":"y78"}],"layout":{"template":{"data":{"barpolar":[{"marker":{"line":{"color":"rgb(17,17,17)","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#f2f5fa"},"error_y":{"color":"#f2f5fa"},"marker":{"line":{"color":"rgb(17,17,17)","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#A2B1C6","gridcolor":"#506784","linecolor":"#506784","minorgridcolor":"#506784","startlinecolor":"#A2B1C6"},"baxis":{"endlinecolor":"#A2B1C6","gridcolor":"#506784","linecolor":"#506784","minorgridcolor":"#506784","startlinecolor":"#A2B1C6"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmapgl":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmapgl"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"line":{"color":"#283442"}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"marker":{"line":{"color":"#283442"}},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#506784"},"line":{"color":"rgb(17,17,17)"}},"header":{"fill":{"color":"#2a3f5f"},"line":{"color":"rgb(17,17,17)"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#f2f5fa","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#f2f5fa"},"geo":{"bgcolor":"rgb(17,17,17)","lakecolor":"rgb(17,17,17)","landcolor":"rgb(17,17,17)","showlakes":true,"showland":true,"subunitcolor":"#506784"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"dark"},"paper_bgcolor":"rgb(17,17,17)","plot_bgcolor":"rgb(17,17,17)","polar":{"angularaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"bgcolor":"rgb(17,17,17)","radialaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","gridwidth":2,"linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3"},"yaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","gridwidth":2,"linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3"},"zaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","gridwidth":2,"linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3"}},"shapedefaults":{"line":{"color":"#f2f5fa"}},"sliderdefaults":{"bgcolor":"#C8D4E3","bordercolor":"rgb(17,17,17)","borderwidth":1,"tickwidth":0},"ternary":{"aaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"baxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"bgcolor":"rgb(17,17,17)","caxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""}},"title":{"x":0.05},"updatemenudefaults":{"bgcolor":"#506784","borderwidth":0},"xaxis":{"automargin":true,"gridcolor":"#283442","linecolor":"#506784","ticks":"","title":{"standoff":15},"zerolinecolor":"#283442","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#283442","linecolor":"#506784","ticks":"","title":{"standoff":15},"zerolinecolor":"#283442","zerolinewidth":2}}},"xaxis":{"anchor":"y","domain":[0.0,0.06805555555555555],"matches":"x85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis":{"anchor":"x","domain":[0.9296875,1.0],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis2":{"anchor":"y2","domain":[0.08472222222222221,0.15277777777777776],"matches":"x86","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis2":{"anchor":"x2","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis3":{"anchor":"y3","domain":[0.16944444444444443,0.2375],"matches":"x87","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis3":{"anchor":"x3","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis4":{"anchor":"y4","domain":[0.25416666666666665,0.3222222222222222],"matches":"x88","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis4":{"anchor":"x4","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis5":{"anchor":"y5","domain":[0.33888888888888885,0.4069444444444444],"matches":"x89","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis5":{"anchor":"x5","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis6":{"anchor":"y6","domain":[0.42361111111111105,0.4916666666666666],"matches":"x90","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis6":{"anchor":"x6","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis7":{"anchor":"y7","domain":[0.5083333333333333,0.5763888888888888],"matches":"x91","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis7":{"anchor":"x7","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis8":{"anchor":"y8","domain":[0.5930555555555554,0.661111111111111],"matches":"x92","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis8":{"anchor":"x8","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis9":{"anchor":"y9","domain":[0.6777777777777777,0.7458333333333332],"matches":"x93","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis9":{"anchor":"x9","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis10":{"anchor":"y10","domain":[0.7625,0.8305555555555555],"matches":"x94","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis10":{"anchor":"x10","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis11":{"anchor":"y11","domain":[0.8472222222222221,0.9152777777777776],"matches":"x95","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis11":{"anchor":"x11","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis12":{"anchor":"y12","domain":[0.9319444444444444,0.9999999999999999],"matches":"x96","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis12":{"anchor":"x12","domain":[0.9296875,1.0],"matches":"y","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis13":{"anchor":"y13","domain":[0.0,0.06805555555555555],"matches":"x85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis13":{"anchor":"x13","domain":[0.796875,0.8671875],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis14":{"anchor":"y14","domain":[0.08472222222222221,0.15277777777777776],"matches":"x86","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis14":{"anchor":"x14","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis15":{"anchor":"y15","domain":[0.16944444444444443,0.2375],"matches":"x87","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis15":{"anchor":"x15","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis16":{"anchor":"y16","domain":[0.25416666666666665,0.3222222222222222],"matches":"x88","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis16":{"anchor":"x16","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis17":{"anchor":"y17","domain":[0.33888888888888885,0.4069444444444444],"matches":"x89","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis17":{"anchor":"x17","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis18":{"anchor":"y18","domain":[0.42361111111111105,0.4916666666666666],"matches":"x90","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis18":{"anchor":"x18","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis19":{"anchor":"y19","domain":[0.5083333333333333,0.5763888888888888],"matches":"x91","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis19":{"anchor":"x19","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis20":{"anchor":"y20","domain":[0.5930555555555554,0.661111111111111],"matches":"x92","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis20":{"anchor":"x20","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis21":{"anchor":"y21","domain":[0.6777777777777777,0.7458333333333332],"matches":"x93","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis21":{"anchor":"x21","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis22":{"anchor":"y22","domain":[0.7625,0.8305555555555555],"matches":"x94","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis22":{"anchor":"x22","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis23":{"anchor":"y23","domain":[0.8472222222222221,0.9152777777777776],"matches":"x95","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis23":{"anchor":"x23","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis24":{"anchor":"y24","domain":[0.9319444444444444,0.9999999999999999],"matches":"x96","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis24":{"anchor":"x24","domain":[0.796875,0.8671875],"matches":"y13","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis25":{"anchor":"y25","domain":[0.0,0.06805555555555555],"matches":"x85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis25":{"anchor":"x25","domain":[0.6640625,0.734375],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis26":{"anchor":"y26","domain":[0.08472222222222221,0.15277777777777776],"matches":"x86","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis26":{"anchor":"x26","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis27":{"anchor":"y27","domain":[0.16944444444444443,0.2375],"matches":"x87","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis27":{"anchor":"x27","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis28":{"anchor":"y28","domain":[0.25416666666666665,0.3222222222222222],"matches":"x88","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis28":{"anchor":"x28","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis29":{"anchor":"y29","domain":[0.33888888888888885,0.4069444444444444],"matches":"x89","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis29":{"anchor":"x29","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis30":{"anchor":"y30","domain":[0.42361111111111105,0.4916666666666666],"matches":"x90","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis30":{"anchor":"x30","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis31":{"anchor":"y31","domain":[0.5083333333333333,0.5763888888888888],"matches":"x91","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis31":{"anchor":"x31","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis32":{"anchor":"y32","domain":[0.5930555555555554,0.661111111111111],"matches":"x92","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis32":{"anchor":"x32","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis33":{"anchor":"y33","domain":[0.6777777777777777,0.7458333333333332],"matches":"x93","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis33":{"anchor":"x33","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis34":{"anchor":"y34","domain":[0.7625,0.8305555555555555],"matches":"x94","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis34":{"anchor":"x34","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis35":{"anchor":"y35","domain":[0.8472222222222221,0.9152777777777776],"matches":"x95","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis35":{"anchor":"x35","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis36":{"anchor":"y36","domain":[0.9319444444444444,0.9999999999999999],"matches":"x96","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis36":{"anchor":"x36","domain":[0.6640625,0.734375],"matches":"y25","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis37":{"anchor":"y37","domain":[0.0,0.06805555555555555],"matches":"x85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis37":{"anchor":"x37","domain":[0.53125,0.6015625],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis38":{"anchor":"y38","domain":[0.08472222222222221,0.15277777777777776],"matches":"x86","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis38":{"anchor":"x38","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis39":{"anchor":"y39","domain":[0.16944444444444443,0.2375],"matches":"x87","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis39":{"anchor":"x39","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis40":{"anchor":"y40","domain":[0.25416666666666665,0.3222222222222222],"matches":"x88","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis40":{"anchor":"x40","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis41":{"anchor":"y41","domain":[0.33888888888888885,0.4069444444444444],"matches":"x89","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis41":{"anchor":"x41","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis42":{"anchor":"y42","domain":[0.42361111111111105,0.4916666666666666],"matches":"x90","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis42":{"anchor":"x42","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis43":{"anchor":"y43","domain":[0.5083333333333333,0.5763888888888888],"matches":"x91","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis43":{"anchor":"x43","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis44":{"anchor":"y44","domain":[0.5930555555555554,0.661111111111111],"matches":"x92","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis44":{"anchor":"x44","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis45":{"anchor":"y45","domain":[0.6777777777777777,0.7458333333333332],"matches":"x93","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis45":{"anchor":"x45","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis46":{"anchor":"y46","domain":[0.7625,0.8305555555555555],"matches":"x94","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis46":{"anchor":"x46","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis47":{"anchor":"y47","domain":[0.8472222222222221,0.9152777777777776],"matches":"x95","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis47":{"anchor":"x47","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis48":{"anchor":"y48","domain":[0.9319444444444444,0.9999999999999999],"matches":"x96","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis48":{"anchor":"x48","domain":[0.53125,0.6015625],"matches":"y37","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis49":{"anchor":"y49","domain":[0.0,0.06805555555555555],"matches":"x85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis49":{"anchor":"x49","domain":[0.3984375,0.46875],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis50":{"anchor":"y50","domain":[0.08472222222222221,0.15277777777777776],"matches":"x86","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis50":{"anchor":"x50","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis51":{"anchor":"y51","domain":[0.16944444444444443,0.2375],"matches":"x87","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis51":{"anchor":"x51","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis52":{"anchor":"y52","domain":[0.25416666666666665,0.3222222222222222],"matches":"x88","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis52":{"anchor":"x52","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis53":{"anchor":"y53","domain":[0.33888888888888885,0.4069444444444444],"matches":"x89","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis53":{"anchor":"x53","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis54":{"anchor":"y54","domain":[0.42361111111111105,0.4916666666666666],"matches":"x90","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis54":{"anchor":"x54","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis55":{"anchor":"y55","domain":[0.5083333333333333,0.5763888888888888],"matches":"x91","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis55":{"anchor":"x55","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis56":{"anchor":"y56","domain":[0.5930555555555554,0.661111111111111],"matches":"x92","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis56":{"anchor":"x56","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis57":{"anchor":"y57","domain":[0.6777777777777777,0.7458333333333332],"matches":"x93","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis57":{"anchor":"x57","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis58":{"anchor":"y58","domain":[0.7625,0.8305555555555555],"matches":"x94","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis58":{"anchor":"x58","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis59":{"anchor":"y59","domain":[0.8472222222222221,0.9152777777777776],"matches":"x95","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis59":{"anchor":"x59","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis60":{"anchor":"y60","domain":[0.9319444444444444,0.9999999999999999],"matches":"x96","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis60":{"anchor":"x60","domain":[0.3984375,0.46875],"matches":"y49","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis61":{"anchor":"y61","domain":[0.0,0.06805555555555555],"matches":"x85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis61":{"anchor":"x61","domain":[0.265625,0.3359375],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis62":{"anchor":"y62","domain":[0.08472222222222221,0.15277777777777776],"matches":"x86","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis62":{"anchor":"x62","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis63":{"anchor":"y63","domain":[0.16944444444444443,0.2375],"matches":"x87","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis63":{"anchor":"x63","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis64":{"anchor":"y64","domain":[0.25416666666666665,0.3222222222222222],"matches":"x88","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis64":{"anchor":"x64","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis65":{"anchor":"y65","domain":[0.33888888888888885,0.4069444444444444],"matches":"x89","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis65":{"anchor":"x65","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis66":{"anchor":"y66","domain":[0.42361111111111105,0.4916666666666666],"matches":"x90","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis66":{"anchor":"x66","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis67":{"anchor":"y67","domain":[0.5083333333333333,0.5763888888888888],"matches":"x91","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis67":{"anchor":"x67","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis68":{"anchor":"y68","domain":[0.5930555555555554,0.661111111111111],"matches":"x92","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis68":{"anchor":"x68","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis69":{"anchor":"y69","domain":[0.6777777777777777,0.7458333333333332],"matches":"x93","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis69":{"anchor":"x69","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis70":{"anchor":"y70","domain":[0.7625,0.8305555555555555],"matches":"x94","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis70":{"anchor":"x70","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis71":{"anchor":"y71","domain":[0.8472222222222221,0.9152777777777776],"matches":"x95","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis71":{"anchor":"x71","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis72":{"anchor":"y72","domain":[0.9319444444444444,0.9999999999999999],"matches":"x96","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis72":{"anchor":"x72","domain":[0.265625,0.3359375],"matches":"y61","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis73":{"anchor":"y73","domain":[0.0,0.06805555555555555],"matches":"x85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis73":{"anchor":"x73","domain":[0.1328125,0.203125],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis74":{"anchor":"y74","domain":[0.08472222222222221,0.15277777777777776],"matches":"x86","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis74":{"anchor":"x74","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis75":{"anchor":"y75","domain":[0.16944444444444443,0.2375],"matches":"x87","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis75":{"anchor":"x75","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis76":{"anchor":"y76","domain":[0.25416666666666665,0.3222222222222222],"matches":"x88","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis76":{"anchor":"x76","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis77":{"anchor":"y77","domain":[0.33888888888888885,0.4069444444444444],"matches":"x89","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis77":{"anchor":"x77","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis78":{"anchor":"y78","domain":[0.42361111111111105,0.4916666666666666],"matches":"x90","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis78":{"anchor":"x78","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis79":{"anchor":"y79","domain":[0.5083333333333333,0.5763888888888888],"matches":"x91","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis79":{"anchor":"x79","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis80":{"anchor":"y80","domain":[0.5930555555555554,0.661111111111111],"matches":"x92","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis80":{"anchor":"x80","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis81":{"anchor":"y81","domain":[0.6777777777777777,0.7458333333333332],"matches":"x93","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis81":{"anchor":"x81","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis82":{"anchor":"y82","domain":[0.7625,0.8305555555555555],"matches":"x94","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis82":{"anchor":"x82","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis83":{"anchor":"y83","domain":[0.8472222222222221,0.9152777777777776],"matches":"x95","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis83":{"anchor":"x83","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis84":{"anchor":"y84","domain":[0.9319444444444444,0.9999999999999999],"matches":"x96","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis84":{"anchor":"x84","domain":[0.1328125,0.203125],"matches":"y73","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis85":{"anchor":"y85","domain":[0.0,0.06805555555555555],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis85":{"anchor":"x85","domain":[0.0,0.0703125],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis86":{"anchor":"y86","domain":[0.08472222222222221,0.15277777777777776],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis86":{"anchor":"x86","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis87":{"anchor":"y87","domain":[0.16944444444444443,0.2375],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis87":{"anchor":"x87","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis88":{"anchor":"y88","domain":[0.25416666666666665,0.3222222222222222],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis88":{"anchor":"x88","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis89":{"anchor":"y89","domain":[0.33888888888888885,0.4069444444444444],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis89":{"anchor":"x89","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis90":{"anchor":"y90","domain":[0.42361111111111105,0.4916666666666666],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis90":{"anchor":"x90","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis91":{"anchor":"y91","domain":[0.5083333333333333,0.5763888888888888],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis91":{"anchor":"x91","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis92":{"anchor":"y92","domain":[0.5930555555555554,0.661111111111111],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis92":{"anchor":"x92","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis93":{"anchor":"y93","domain":[0.6777777777777777,0.7458333333333332],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis93":{"anchor":"x93","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis94":{"anchor":"y94","domain":[0.7625,0.8305555555555555],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis94":{"anchor":"x94","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis95":{"anchor":"y95","domain":[0.8472222222222221,0.9152777777777776],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis95":{"anchor":"x95","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"xaxis96":{"anchor":"y96","domain":[0.9319444444444444,0.9999999999999999],"showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"yaxis96":{"anchor":"x96","domain":[0.0,0.0703125],"matches":"y85","showticklabels":false,"gridcolor":"#1e1e1e","zeroline":false,"showline":false},"annotations":[{"font":{"size":16},"showarrow":false,"text":"A1","x":0.034027777777777775,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A2","x":0.11875,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A3","x":0.20347222222222222,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A4","x":0.2881944444444444,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A5","x":0.3729166666666666,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A6","x":0.4576388888888888,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A7","x":0.5423611111111111,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A8","x":0.6270833333333332,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A9","x":0.7118055555555555,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A10","x":0.7965277777777777,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A11","x":0.8812499999999999,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"A12","x":0.9659722222222221,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B1","x":0.034027777777777775,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B2","x":0.11875,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B3","x":0.20347222222222222,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B4","x":0.2881944444444444,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B5","x":0.3729166666666666,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B6","x":0.4576388888888888,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B7","x":0.5423611111111111,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B8","x":0.6270833333333332,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B9","x":0.7118055555555555,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B10","x":0.7965277777777777,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B11","x":0.8812499999999999,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"B12","x":0.9659722222222221,"xanchor":"center","xref":"paper","y":0.8671875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C1","x":0.034027777777777775,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C2","x":0.11875,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C3","x":0.20347222222222222,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C4","x":0.2881944444444444,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C5","x":0.3729166666666666,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C6","x":0.4576388888888888,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C7","x":0.5423611111111111,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C8","x":0.6270833333333332,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C9","x":0.7118055555555555,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C10","x":0.7965277777777777,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C11","x":0.8812499999999999,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"C12","x":0.9659722222222221,"xanchor":"center","xref":"paper","y":0.734375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D1","x":0.034027777777777775,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D2","x":0.11875,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D3","x":0.20347222222222222,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D4","x":0.2881944444444444,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D5","x":0.3729166666666666,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D6","x":0.4576388888888888,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D7","x":0.5423611111111111,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D8","x":0.6270833333333332,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D9","x":0.7118055555555555,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D10","x":0.7965277777777777,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D11","x":0.8812499999999999,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"D12","x":0.9659722222222221,"xanchor":"center","xref":"paper","y":0.6015625,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E1","x":0.034027777777777775,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E2","x":0.11875,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E3","x":0.20347222222222222,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E4","x":0.2881944444444444,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E5","x":0.3729166666666666,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E6","x":0.4576388888888888,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E7","x":0.5423611111111111,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E8","x":0.6270833333333332,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E9","x":0.7118055555555555,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E10","x":0.7965277777777777,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E11","x":0.8812499999999999,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"E12","x":0.9659722222222221,"xanchor":"center","xref":"paper","y":0.46875,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F1","x":0.034027777777777775,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F2","x":0.11875,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F3","x":0.20347222222222222,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F4","x":0.2881944444444444,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F5","x":0.3729166666666666,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F6","x":0.4576388888888888,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F7","x":0.5423611111111111,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F8","x":0.6270833333333332,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F9","x":0.7118055555555555,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F10","x":0.7965277777777777,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F11","x":0.8812499999999999,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"F12","x":0.9659722222222221,"xanchor":"center","xref":"paper","y":0.3359375,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G1","x":0.034027777777777775,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G2","x":0.11875,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G3","x":0.20347222222222222,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G4","x":0.2881944444444444,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G5","x":0.3729166666666666,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G6","x":0.4576388888888888,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G7","x":0.5423611111111111,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G8","x":0.6270833333333332,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G9","x":0.7118055555555555,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G10","x":0.7965277777777777,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G11","x":0.8812499999999999,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"G12","x":0.9659722222222221,"xanchor":"center","xref":"paper","y":0.203125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H1","x":0.034027777777777775,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H2","x":0.11875,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H3","x":0.20347222222222222,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H4","x":0.2881944444444444,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H5","x":0.3729166666666666,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H6","x":0.4576388888888888,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H7","x":0.5423611111111111,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H8","x":0.6270833333333332,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H9","x":0.7118055555555555,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H10","x":0.7965277777777777,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H11","x":0.8812499999999999,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"H12","x":0.9659722222222221,"xanchor":"center","xref":"paper","y":0.0703125,"yanchor":"bottom","yref":"paper"}],"font":{"color":"#e5e5e5"},"title":{"font":{"color":"#e5e5e5"},"text":"MTP assay"},"margin":{"l":20,"r":20,"t":100,"b":20},"plot_bgcolor":"#1e1e1e","paper_bgcolor":"#1e1e1e","hovermode":"x"}} \ No newline at end of file diff --git a/tests/unit_tests/test_readers/test_multiscan.py b/tests/unit_tests/test_readers/test_multiscan.py index 50405ea..0652d74 100644 --- a/tests/unit_tests/test_readers/test_multiscan.py +++ b/tests/unit_tests/test_readers/test_multiscan.py @@ -12,7 +12,6 @@ def test_read_multiskan_spectrum_1500(): # Arrange path = "docs/examples/data/multiskan_spectrum_1500.txt" - print(time) # Act plate = read_multiskan_spectrum_1500( diff --git a/tests/unit_tests/test_readers/test_new_device.py b/tests/unit_tests/test_readers/test_new_device.py new file mode 100644 index 0000000..e52e8a5 --- /dev/null +++ b/tests/unit_tests/test_readers/test_new_device.py @@ -0,0 +1,42 @@ +from mtphandler.readers import read_new_device +from mtphandler.units import C + + +def test_new_reader_kinetic(): + path = "docs/examples/data/new_device_kinetic.xlsx" + + plate = read_new_device( + path=path, + ph=7.4, + temperature=[37.0], + temperature_unit=C, + ) + + assert len(plate.wells) == 72 + assert plate.wells[0].x_pos == 0 + assert plate.wells[0].y_pos == 0 + assert plate.wells[0].id == "ArODH0001" + assert plate.wells[-1].x_pos == 11 + assert plate.wells[-1].y_pos == 5 + assert plate.wells[-1].id == "mODH-582" + assert plate.wells[-1].measurements[0].absorption[0] == 0.5626 + assert plate.wells[-1].measurements[0].absorption[-1] == 0.6376 + + +def test_new_reader_endpoint(): + path = "docs/examples/data/new_device_calib.xlsx" + + plate = read_new_device( + path=path, + ph=7.4, + temperature=[37.0], + temperature_unit=C, + ) + + assert len(plate.wells) == 42 + assert plate.wells[0].x_pos == 0 + assert plate.wells[0].y_pos == 0 + assert plate.wells[0].id == "NADH0001" + assert plate.wells[0].measurements[0].absorption[0] == 3.116 + assert plate.name == "NADH_NADPH_calib.skax" + assert plate.date_measured == "2023-08-08 04:06:03"