From da30c9a52d43ca6e27e99315f618943adff8f9b6 Mon Sep 17 00:00:00 2001 From: Julie-Fabre Date: Fri, 3 Apr 2026 19:25:32 -0400 Subject: [PATCH 1/5] bombcell extension, sliding rpv options --- .../core/analyzer_extension_core.py | 50 +- src/spikeinterface/curation/__init__.py | 7 + .../curation/bombcell_curation.py | 235 +++++- .../curation/bombcell_pipeline.py | 684 ++++++++++++++++++ .../metrics/quality/misc_metrics.py | 105 ++- .../metrics/quality/quality_metrics.py | 4 + 6 files changed, 1035 insertions(+), 50 deletions(-) create mode 100644 src/spikeinterface/curation/bombcell_pipeline.py diff --git a/src/spikeinterface/core/analyzer_extension_core.py b/src/spikeinterface/core/analyzer_extension_core.py index 1c261e3cad..3486e902fb 100644 --- a/src/spikeinterface/core/analyzer_extension_core.py +++ b/src/spikeinterface/core/analyzer_extension_core.py @@ -1341,7 +1341,11 @@ def _run(self, **job_kwargs): if self.tmp_data_to_save is not None: for k in self.tmp_data_to_save: - self.data[k] = tmp_data[k] + if k in tmp_data: + self.data[k] = tmp_data[k] + elif extension is not None and k in extension.data: + # Propagate previously saved tmp_data for metrics not recomputed + self.data[k] = extension.data[k] def _get_data(self): # convert to correct dtype @@ -1359,10 +1363,22 @@ def _select_extension_data(self, unit_ids: list[int | str]): Returns ------- dict - Dictionary containing the selected metrics DataFrame. + Dictionary containing the selected metrics DataFrame and any tmp_data arrays. """ new_metrics = self.data["metrics"].loc[np.array(unit_ids)] - return dict(metrics=new_metrics) + result = dict(metrics=new_metrics) + + if self.tmp_data_to_save is not None: + keep_indices = self.sorting_analyzer.sorting.ids_to_indices(unit_ids) + for k, is_per_unit in self.tmp_data_to_save.items(): + if k not in self.data: + continue + if is_per_unit: + result[k] = self.data[k][keep_indices] + else: + result[k] = self.data[k] + + return result def _merge_extension_data( self, @@ -1412,11 +1428,15 @@ def _merge_extension_data( new_data["metrics"] = self._cast_metrics(metrics) if self.tmp_data_to_save is not None: - for k in self.tmp_data_to_save: - new_arr = _update_data_after_merge_or_split( - self.sorting_analyzer, new_sorting_analyzer, self.data[k], new_tmp_data[k], new_unit_ids - ) - new_data[k] = new_arr + for k, is_per_unit in self.tmp_data_to_save.items(): + if k not in self.data or k not in new_tmp_data: + continue + if is_per_unit: + new_data[k] = _update_data_after_merge_or_split( + self.sorting_analyzer, new_sorting_analyzer, self.data[k], new_tmp_data[k], new_unit_ids + ) + else: + new_data[k] = new_tmp_data[k] return new_data @@ -1460,11 +1480,15 @@ def _split_extension_data( new_data["metrics"] = self._cast_metrics(metrics) if self.tmp_data_to_save is not None: - for k in self.tmp_data_to_save: - new_arr = _update_data_after_merge_or_split( - self.sorting_analyzer, new_sorting_analyzer, self.data[k], new_tmp_data[k], new_unit_ids_f - ) - new_data[k] = new_arr + for k, is_per_unit in self.tmp_data_to_save.items(): + if k not in self.data or k not in new_tmp_data: + continue + if is_per_unit: + new_data[k] = _update_data_after_merge_or_split( + self.sorting_analyzer, new_sorting_analyzer, self.data[k], new_tmp_data[k], new_unit_ids_f + ) + else: + new_data[k] = new_tmp_data[k] return new_data diff --git a/src/spikeinterface/curation/__init__.py b/src/spikeinterface/curation/__init__.py index 16bdddd870..ea41aaefb6 100644 --- a/src/spikeinterface/curation/__init__.py +++ b/src/spikeinterface/curation/__init__.py @@ -29,4 +29,11 @@ bombcell_get_default_thresholds, bombcell_label_units, save_bombcell_results, + save_valid_periods, +) +from .bombcell_pipeline import ( + get_default_preprocessing_params, + get_default_qc_params, + preprocess_for_bombcell, + run_bombcell_qc, ) diff --git a/src/spikeinterface/curation/bombcell_curation.py b/src/spikeinterface/curation/bombcell_curation.py index 9e0b17632e..4a70d9feaa 100644 --- a/src/spikeinterface/curation/bombcell_curation.py +++ b/src/spikeinterface/curation/bombcell_curation.py @@ -9,6 +9,7 @@ """ import operator +import warnings from pathlib import Path import json import numpy as np @@ -30,11 +31,16 @@ "snr", "amplitude_cutoff", "num_spikes", - "rp_contamination", + "rpv", # maps to rp_contamination or sliding_rp_violation "presence_ratio", "drift_ptp", + "isolation_distance", + "l_ratio", ] +# RPV metric column names (bombcell accepts "rpv" as threshold key and maps to whichever exists) +RPV_METRIC_COLUMNS = ["sliding_rp_violation", "rp_contamination"] + DEFAULT_NON_SOMATIC_METRICS = [ "peak_before_to_trough_ratio", "peak_before_width", @@ -43,6 +49,15 @@ "main_peak_to_trough_ratio", ] +# Metrics belonging to the built-in non-somatic groups. +# The compound logic is: (width_group AND ratio_group) OR main_peak_group +# Any metric in the "non-somatic" threshold section that is NOT listed here +# is treated as a standalone condition OR'd into the final result. +_NON_SOMATIC_WIDTH_GROUP = {"peak_before_width", "trough_width"} +_NON_SOMATIC_RATIO_GROUP = {"peak_before_to_trough_ratio", "peak_before_to_peak_after_ratio"} +_NON_SOMATIC_MAIN_PEAK_GROUP = {"main_peak_to_trough_ratio"} +_NON_SOMATIC_BUILTIN_METRICS = _NON_SOMATIC_WIDTH_GROUP | _NON_SOMATIC_RATIO_GROUP | _NON_SOMATIC_MAIN_PEAK_GROUP + def bombcell_get_default_thresholds() -> dict: """ @@ -66,9 +81,11 @@ def bombcell_get_default_thresholds() -> dict: "snr": {"greater": 5, "less": None}, "amplitude_cutoff": {"greater": None, "less": 0.2}, "num_spikes": {"greater": 300, "less": None}, - "rp_contamination": {"greater": None, "less": 0.1}, + "rpv": {"greater": None, "less": 0.1}, # applies to rp_contamination or sliding_rp_violation "presence_ratio": {"greater": 0.7, "less": None}, "drift_ptp": {"greater": None, "less": 100}, # um + "isolation_distance": {"greater": 20, "less": None}, + "l_ratio": {"greater": None, "less": 0.3}, }, "non-somatic": { "peak_before_to_trough_ratio": {"greater": None, "less": 3}, @@ -86,6 +103,10 @@ def bombcell_label_units( label_non_somatic: bool = True, split_non_somatic_good_mua: bool = False, external_metrics: "pd.DataFrame | list[pd.DataFrame] | None" = None, + use_valid_periods: bool = False, + valid_periods_params: dict | None = None, + recompute_quality_metrics: bool = True, + **job_kwargs, ) -> "pd.DataFrame": """ Label units based on quality metrics and template metrics using Bombcell logic: @@ -111,7 +132,11 @@ def bombcell_label_units( - Large main peak to trough ratio (using "main_peak_to_trough_ratio" metric) If units have a narrow peak and a large ratio OR a large main peak to trough ratio, - they are labeled as non-somatic. If `split_non_somatic_good_mua` is True, non-somatic units are further split + they are labeled as non-somatic. Custom metrics can also be added to the "non-somatic" + threshold section — any metric not part of the built-in groups (width, ratio, main_peak) + is treated as a standalone condition OR'd into the non-somatic detection. + + If `split_non_somatic_good_mua` is True, non-somatic units are further split into "non_soma_good" and "non_soma_mua", otherwise they are all labeled as "non_soma". Parameters @@ -129,6 +154,25 @@ def bombcell_label_units( If True, split non-somatic into "non_soma_good" and "non_soma_mua". external_metrics: "pd.DataFrame | list[pd.DataFrame]" | None = None External metrics DataFrame(s) (index = unit_ids) to use instead of those from SortingAnalyzer. + use_valid_periods : bool, default: False + If True, compute valid time periods per unit and recompute quality metrics restricted to + those periods before labeling. This uses the ``valid_unit_periods`` extension to identify + chunks with acceptable false positive (refractory violations) and false negative (amplitude + cutoff) rates. The FP/FN thresholds are derived from the bombcell thresholds + (``rpv`` → ``fp_threshold``, ``amplitude_cutoff`` → ``fn_threshold``). + Requires ``amplitude_scalings`` extension and Numba. + valid_periods_params : dict or None, default: None + Additional parameters passed to the ``valid_unit_periods`` extension computation. + Use this to set ``refractory_period_ms``, ``censored_period_ms``, ``period_mode``, + ``period_duration_s_absolute``, etc. Parameters ``fp_threshold`` and ``fn_threshold`` + are automatically derived from bombcell thresholds if not explicitly provided here. + recompute_quality_metrics : bool, default: True + If ``use_valid_periods`` is True, whether to recompute quality metrics restricted to valid + periods. If False, the existing quality metrics are used as-is (useful if you already + computed them with ``use_valid_periods=True``). + **job_kwargs + Job keyword arguments (n_jobs, chunk_duration, progress_bar) passed to + ``valid_unit_periods`` and ``quality_metrics`` computation when ``use_valid_periods=True``. Returns ------- @@ -143,6 +187,61 @@ def bombcell_label_units( """ import pandas as pd + # Parse thresholds early so we can derive valid_periods params from them + if thresholds is None: + thresholds_dict = bombcell_get_default_thresholds() + elif isinstance(thresholds, (str, Path)): + with open(thresholds, "r") as f: + thresholds_dict = json.load(f) + elif isinstance(thresholds, dict): + thresholds_dict = thresholds + else: + raise ValueError("thresholds must be a dict, a JSON file path, or None") + + # Compute valid periods and recompute quality metrics if requested + if use_valid_periods: + if sorting_analyzer is None: + raise ValueError("use_valid_periods=True requires a sorting_analyzer") + + # Derive fp/fn thresholds from bombcell thresholds + vp_params = dict(valid_periods_params) if valid_periods_params is not None else {} + + if "fp_threshold" not in vp_params: + rpv_thresh = thresholds_dict.get("mua", {}).get("rpv", {}).get("less", None) + if rpv_thresh is not None: + vp_params["fp_threshold"] = rpv_thresh + + if "fn_threshold" not in vp_params: + ac_thresh = thresholds_dict.get("mua", {}).get("amplitude_cutoff", {}).get("less", None) + if ac_thresh is not None: + vp_params["fn_threshold"] = ac_thresh + + # Compute valid_unit_periods + if sorting_analyzer.has_extension("valid_unit_periods"): + sorting_analyzer.delete_extension("valid_unit_periods") + sorting_analyzer.compute("valid_unit_periods", **vp_params, **job_kwargs) + + # Recompute quality metrics restricted to valid periods + if recompute_quality_metrics: + # Preserve existing quality metric settings (metric_names, metric_params) + qm_ext = sorting_analyzer.get_extension("quality_metrics") + if qm_ext is not None: + existing_params = qm_ext.params.copy() + existing_params.pop("periods", None) + existing_params.pop("use_valid_periods", None) + sorting_analyzer.delete_extension("quality_metrics") + sorting_analyzer.compute( + "quality_metrics", + use_valid_periods=True, + **existing_params, + **job_kwargs, + ) + else: + raise ValueError( + "use_valid_periods=True with recompute_quality_metrics=True requires " + "quality_metrics to have been computed at least once." + ) + if sorting_analyzer is not None: combined_metrics = sorting_analyzer.get_metrics_extension_data() if combined_metrics.empty: @@ -161,15 +260,30 @@ def bombcell_label_units( else: combined_metrics = external_metrics - if thresholds is None: - thresholds_dict = bombcell_get_default_thresholds() - elif isinstance(thresholds, (str, Path)): - with open(thresholds, "r") as f: - thresholds_dict = json.load(f) - elif isinstance(thresholds, dict): - thresholds_dict = thresholds - else: - raise ValueError("thresholds must be a dict, a JSON file path, or None") + # Map "rpv" threshold to actual column name (rp_contamination or sliding_rp_violation) + if "mua" in thresholds_dict and "rpv" in thresholds_dict["mua"]: + rpv_thresh = thresholds_dict["mua"].pop("rpv") + for col in RPV_METRIC_COLUMNS: + if col in combined_metrics.columns: + thresholds_dict["mua"][col] = rpv_thresh + break + + # Filter out threshold metrics that are not present in the metrics DataFrame. + # This allows optional metrics (e.g. isolation_distance, l_ratio) to be included + # in the default thresholds without crashing when they haven't been computed. + available_columns = set(combined_metrics.columns) + for section in ("noise", "mua", "non-somatic"): + if section not in thresholds_dict: + continue + missing = [m for m in thresholds_dict[section] if m not in available_columns] + if missing: + warnings.warn( + f"Bombcell thresholds reference metrics not found in the metrics DataFrame " + f"(section '{section}'): {missing}. These will be skipped. " + f"Compute them first if you want them included in the labeling." + ) + for m in missing: + del thresholds_dict[section][m] n_units = len(combined_metrics) @@ -263,6 +377,22 @@ def bombcell_label_units( # (ratio AND width) OR standalone main_peak_to_trough is_non_somatic = (ratio_conditions & width_conditions) | large_main_peak + # Standalone custom metrics: any metric in non-somatic thresholds that is not + # part of the built-in groups is OR'd in as its own independent condition. + standalone_metrics = { + m: non_somatic_thresholds[m] for m in non_somatic_thresholds if m not in _NON_SOMATIC_BUILTIN_METRICS + } + for metric_name, thresh in standalone_metrics.items(): + standalone_labels = threshold_metrics_label_units( + metrics=combined_metrics, + thresholds={metric_name: thresh}, + pass_label="pass", + fail_label="fail", + operator="and", + nan_policy="ignore", + ) + is_non_somatic = is_non_somatic | (standalone_labels["label"] == "fail") + if split_non_somatic_good_mua: good_mask = unit_labels["label"] == "good" mua_mask = unit_labels["label"] == "mua" @@ -360,3 +490,84 @@ def save_bombcell_results( narrow_df = pd.DataFrame(rows) narrow_df.to_csv(folder / "labeling_results_narrow.csv", index=False) + + +def save_valid_periods( + sorting_analyzer, + folder, +) -> None: + """ + Save valid time periods per unit to a TSV file for downstream analysis. + + This function extracts the valid_unit_periods extension data and saves it + in a simple, human-readable TSV format with times in seconds. + + Parameters + ---------- + sorting_analyzer : SortingAnalyzer + Analyzer with the valid_unit_periods extension computed. + folder : str or Path + Folder to save the TSV file. + + Returns + ------- + None + + Notes + ----- + The output file `valid_periods.tsv` contains one row per valid period with columns: + + - unit_id: The unit identifier + - segment_index: Recording segment (0-indexed) + - start_time_s: Start of valid period in seconds + - end_time_s: End of valid period in seconds + - duration_s: Duration of valid period in seconds + + This file can be easily loaded with pandas or any TSV reader for downstream + analysis, filtering spikes to valid periods, or visualization. + """ + from pathlib import Path + import pandas as pd + + folder = Path(folder) + folder.mkdir(parents=True, exist_ok=True) + + if not sorting_analyzer.has_extension("valid_unit_periods"): + return + + vp_ext = sorting_analyzer.get_extension("valid_unit_periods") + valid_periods = vp_ext.get_data(outputs="numpy") + + if len(valid_periods) == 0: + # No valid periods found - save empty file with header + df = pd.DataFrame(columns=["unit_id", "segment_index", "start_time_s", "end_time_s", "duration_s"]) + df.to_csv(folder / "valid_periods.tsv", sep="\t", index=False) + return + + fs = sorting_analyzer.sampling_frequency + unit_ids = sorting_analyzer.unit_ids + + rows = [] + for period in valid_periods: + unit_index = period["unit_index"] + unit_id = unit_ids[unit_index] + segment_index = period["segment_index"] + start_sample = period["start_sample_index"] + end_sample = period["end_sample_index"] + + start_time_s = start_sample / fs + end_time_s = end_sample / fs + duration_s = end_time_s - start_time_s + + rows.append( + { + "unit_id": unit_id, + "segment_index": segment_index, + "start_time_s": round(start_time_s, 6), + "end_time_s": round(end_time_s, 6), + "duration_s": round(duration_s, 6), + } + ) + + df = pd.DataFrame(rows) + df.to_csv(folder / "valid_periods.tsv", sep="\t", index=False) diff --git a/src/spikeinterface/curation/bombcell_pipeline.py b/src/spikeinterface/curation/bombcell_pipeline.py new file mode 100644 index 0000000000..6506704b5c --- /dev/null +++ b/src/spikeinterface/curation/bombcell_pipeline.py @@ -0,0 +1,684 @@ +""" +BombCell pipeline functions for preprocessing and quality control. + +This module provides wrapper functions for running the full BombCell quality +control pipeline on spike-sorted data. + +Functions +--------- +get_default_preprocessing_params + Get default parameters for preprocessing and SortingAnalyzer creation. +get_default_qc_params + Get default parameters for quality metrics and BombCell labeling. +preprocess_for_bombcell + Preprocess recording and create SortingAnalyzer with required extensions. +run_bombcell_qc + Compute quality metrics, run BombCell labeling, and generate plots. + +See Also +-------- +bombcell_get_default_thresholds : Get default classification thresholds. +bombcell_label_units : Core labeling function. +""" + +from __future__ import annotations +from pathlib import Path + + +def get_default_preprocessing_params(): + """ + Get default parameters for preprocessing and SortingAnalyzer creation. + + Returns a dictionary that can be modified and passed to preprocess_for_bombcell(). + + Returns + ------- + dict + Dictionary with the following keys: + + **Highpass Filtering** + + freq_min : float, default: 300.0 + Highpass filter cutoff frequency in Hz. Removes low-frequency noise + and LFP signals. Standard value for spike detection is 300 Hz. + Lower values (150-250 Hz) may be used if spikes have significant + low-frequency components. + + **Bad Channel Detection** + + detect_bad_channels : bool, default: True + Whether to automatically detect and remove bad channels before + further processing. Recommended to leave enabled. + + bad_channel_method : str, default: "coherence+psd" + Method for detecting bad channels: + - "coherence+psd": Combines coherence with neighbors and power + spectral density analysis. Best for Neuropixels. (recommended) + - "mad": Median absolute deviation of signal amplitude. + - "std": Standard deviation based detection. + + **Phase Shift Correction** + + apply_phase_shift : bool, default: True + Whether to apply inter-sample phase shift correction. Essential for + Neuropixels probes where ADCs are multiplexed and channels are sampled + at slightly different times. Corrects for timing offsets that can + affect spike waveform shapes. Disable for non-Neuropixels probes. + + **Common Reference** + + apply_cmr : bool, default: True + Whether to apply common reference to remove correlated noise. + Highly recommended for Neuropixels recordings. + + cmr_reference : str, default: "global" + Type of common reference: + - "global": Use all channels (recommended for Neuropixels). + - "local": Use nearby channels only (for probes with distinct groups). + - "single": Reference to a single channel. + + cmr_operator : str, default: "median" + Operation for computing reference signal: + - "median": More robust to outliers (recommended). + - "average": Standard mean reference. + + **SortingAnalyzer Settings** + + sparse : bool, default: True + Use sparse waveform representation, storing only channels near each + unit. Significantly reduces memory usage for high-channel-count probes. + Recommended True for Neuropixels. + + return_in_uV : bool, default: True + Convert waveforms to microvolts using gain/offset from probe metadata. + Required for amplitude-based quality metrics to be meaningful. + + **Waveform Extraction** + + max_spikes_per_unit : int, default: 500 + Maximum number of spikes to extract per unit for waveform analysis. + Higher values give better templates but use more memory/time. + 500 is typically sufficient for stable template estimation. + + ms_before : float, default: 3.0 + Milliseconds before spike peak to extract. 3.0 ms captures the + pre-spike baseline and any pre-depolarization. + + ms_after : float, default: 3.0 + Milliseconds after spike peak to extract. 3.0 ms captures the + repolarization and afterhyperpolarization. + + **Template Computation** + + template_operators : list, default: ["average", "median", "std"] + Statistics to compute for templates: + - "average": Mean waveform (standard template). + - "median": Median waveform (robust to outliers). + - "std": Standard deviation (waveform variability). + + include_multi_channel_metrics : bool, default: True + Compute template metrics across multiple channels, including: + - exp_decay: Exponential decay of amplitude across channels. + - velocity: Propagation velocity estimate. + Required for BombCell noise detection. Leave True. + + Examples + -------- + >>> params = get_default_preprocessing_params() + >>> params["freq_min"] = 250.0 # Lower cutoff for some cell types + >>> params["max_spikes_per_unit"] = 1000 # More spikes for better templates + >>> analyzer, rec, bad_chs = preprocess_for_bombcell(recording, sorting, "analyzer.zarr", params=params) + """ + return { + # Highpass filtering + "freq_min": 300.0, + # Bad channel detection + "detect_bad_channels": True, + "bad_channel_method": "coherence+psd", + # Phase shift (Neuropixels) + "apply_phase_shift": True, + # Common reference + "apply_cmr": True, + "cmr_reference": "global", + "cmr_operator": "median", + # SortingAnalyzer + "sparse": True, + "return_in_uV": True, + # Waveforms + "max_spikes_per_unit": 500, + "ms_before": 3.0, + "ms_after": 3.0, + # Templates + "template_operators": ["average", "median", "std"], + "include_multi_channel_metrics": True, + } + + +def get_default_qc_params(): + """ + Get default parameters for quality metrics and BombCell labeling. + + Returns a dictionary that can be modified and passed to run_bombcell_qc(). + + Returns + ------- + dict + Dictionary with the following keys: + + **Quality Metrics Selection** + + compute_amplitude_cutoff : bool, default: False + Whether to compute amplitude_cutoff metric (estimated percentage of + missing spikes). Requires spike_amplitudes extension which is slow + to compute for large recordings. When enabled, spike_amplitudes will + be computed automatically if not already present. + + compute_distance_metrics : bool, default: False + Whether to compute isolation_distance and l_ratio metrics. + These require PCA computation and are slow for large datasets. + Useful for chronic recordings where cluster stability matters. + Not recommended for acute recordings with expected drift. + + compute_drift : bool, default: True + Whether to compute drift metrics (drift_ptp, drift_std, drift_mad). + Measures how much units move over the recording. Important for + acute recordings. drift_ptp (peak-to-peak drift in um) is used + by BombCell MUA thresholds. + + rp_method : str, default: "sliding_rp" + Method for computing refractory period violations: + - "sliding_rp": IBL/Steinmetz method that sweeps across RP values + and estimates contamination. More robust. (recommended) + - "llobet": Single RP value method from Llobet et al. + + **BombCell Labeling Options** + + label_non_somatic : bool, default: True + Whether to detect and label non-somatic (axonal/dendritic) units. + These have distinctive waveform shapes: narrow initial peak, + often triphasic. Set False to skip this classification. + + split_non_somatic_good_mua : bool, default: False + If True, split non-somatic units into "non_soma_good" and + "non_soma_mua" based on whether they pass MUA thresholds. + If False, all non-somatic units are labeled "non_soma". + + use_valid_periods : bool, default: False + If True, identify valid time periods per unit (where the unit + has stable amplitude and low refractory violations) and compute + quality metrics only on those periods. Useful for recordings + with unstable periods. Requires amplitude_scalings extension. + + **Presence Ratio Parameters** + + presence_ratio_bin_duration_s : float, default: 60 + Bin duration in seconds for computing presence ratio. + Presence ratio = fraction of bins containing at least one spike. + 60s bins are standard; shorter bins are stricter. + + **Refractory Period Violation Parameters** + + refractory_period_ms : float, default: 2.0 + Refractory period duration in milliseconds. Spikes closer than + this are considered violations. 2.0 ms is conservative; some + fast-spiking neurons may need 1.0-1.5 ms. + + censored_period_ms : float, default: 0.1 + Censored period in milliseconds. Spikes within this period of + each other are not counted (accounts for detection artifacts). + 0.1 ms is standard. + + **Sliding RP Method Parameters** (used if rp_method="sliding_rp") + + sliding_rp_exclude_below_ms : float, default: 0.5 + Exclude refractory periods below this value when sweeping. + Avoids artifacts from very short intervals. + + sliding_rp_max_ms : float, default: 10.0 + Maximum refractory period to test when sweeping. + + sliding_rp_confidence : float, default: 0.9 + Confidence level for contamination estimate. Higher values + give more conservative (higher) contamination estimates. + + **Drift Parameters** + + drift_interval_s : float, default: 60 + Interval in seconds for computing drift. Unit positions are + estimated in each interval and drift is the movement across intervals. + + drift_min_spikes : int, default: 100 + Minimum spikes required per interval to estimate position. + Intervals with fewer spikes are skipped. + + **Plotting Options** + + plot_histograms : bool, default: True + Generate histograms of all metrics with threshold lines. + Saved as "metric_histograms.png". + + plot_waveforms : bool, default: True + Generate waveform overlay plots grouped by label (good, mua, noise, etc.). + Saved as "waveforms_by_label.png". + + plot_upset : bool, default: True + Generate UpSet plots showing which metrics fail together. + Useful for understanding why units are labeled noise/mua. + Requires 'upsetplot' package. Saved as "upset_plot_*.png". + + waveform_ylims : tuple or None, default: (-300, 100) + Y-axis limits for waveform plots in microvolts. + None for automatic scaling. + + figsize_histograms : tuple, default: (15, 10) + Figure size (width, height) in inches for histogram plot. + + Examples + -------- + >>> params = get_default_qc_params() + >>> # Stricter for chronic recordings + >>> params["compute_distance_metrics"] = True + >>> params["compute_drift"] = False # Less relevant for chronic + >>> # More lenient refractory period for fast-spiking neurons + >>> params["refractory_period_ms"] = 1.5 + >>> labels, metrics, figs = run_bombcell_qc(analyzer, params=params) + """ + return { + # Which metrics to compute + "compute_amplitude_cutoff": False, # slow - requires spike_amplitudes + "compute_distance_metrics": False, + "compute_drift": True, + "rp_method": "sliding_rp", + # BombCell labeling options + "label_non_somatic": True, + "split_non_somatic_good_mua": False, + "use_valid_periods": False, + # Presence ratio + "presence_ratio_bin_duration_s": 60, + # Refractory period violations + "refractory_period_ms": 2.0, + "censored_period_ms": 0.1, + # Sliding RP method + "sliding_rp_exclude_below_ms": 0.5, + "sliding_rp_max_ms": 10.0, + "sliding_rp_confidence": 0.9, + # Drift + "drift_interval_s": 60, + "drift_min_spikes": 100, + # Plotting + "plot_histograms": True, + "plot_waveforms": True, + "plot_upset": True, + "waveform_ylims": (-300, 100), + "figsize_histograms": (15, 10), + } + + +def preprocess_for_bombcell( + recording, + sorting, + analyzer_folder: str | Path, + params: dict | None = None, + rerun_extensions: bool = False, + n_jobs: int = -1, + progress_bar: bool = True, +): + """ + Preprocess recording and create SortingAnalyzer with extensions for BombCell. + + This function applies standard preprocessing steps (filtering, bad channel + removal, phase shift correction, common reference) and creates a SortingAnalyzer + with all extensions required for BombCell quality control. + + Parameters + ---------- + recording : BaseRecording + Raw recording to preprocess. Typically loaded with si.read_spikeglx() + or si.read_openephys(). + sorting : BaseSorting + Spike sorting result. Can be loaded with si.read_sorter_folder() or + any other sorting loader. + analyzer_folder : str or Path + Path to save the SortingAnalyzer. Will be created in zarr format. + If folder exists, loads existing analyzer instead of creating new one. + params : dict or None, default: None + Preprocessing parameters from get_default_preprocessing_params(). + If None, uses all default values. + rerun_extensions : bool, default: False + If True, recompute all extensions even if they already exist. + Useful after changing parameters. + n_jobs : int, default: -1 + Number of parallel jobs for computation. -1 uses all available CPUs. + progress_bar : bool, default: True + Show progress bars during computation. + + Returns + ------- + analyzer : SortingAnalyzer + SortingAnalyzer saved to analyzer_folder with computed extensions: + random_spikes, waveforms, templates, noise_levels, unit_locations, + spike_locations, template_metrics. Note: spike_amplitudes is computed + on-demand by run_bombcell_qc() if compute_amplitude_cutoff=True. + rec_preprocessed : BaseRecording + Preprocessed recording (lazy chain, not saved to disk). + Can be used for further analysis or passed to other functions. + bad_channel_ids : list or None + List of channel IDs that were detected as bad and removed. + None if detect_bad_channels=False. + + Examples + -------- + Basic usage with defaults: + + >>> analyzer, rec, bad_chs = preprocess_for_bombcell(recording, sorting, "analyzer.zarr") + + With custom parameters: + + >>> params = get_default_preprocessing_params() + >>> params["freq_min"] = 250.0 + >>> params["detect_bad_channels"] = False # Already cleaned + >>> analyzer, rec, bad_chs = preprocess_for_bombcell( + ... recording, sorting, "analyzer.zarr", params=params + ... ) + + Rerun extensions after parameter change: + + >>> analyzer, rec, bad_chs = preprocess_for_bombcell( + ... recording, sorting, "analyzer.zarr", rerun_extensions=True + ... ) + """ + import spikeinterface.full as si + + if params is None: + params = get_default_preprocessing_params() + + analyzer_folder = Path(analyzer_folder) + job_kwargs = dict(n_jobs=n_jobs, chunk_duration="1s", progress_bar=progress_bar) + + # Preprocess + rec = si.highpass_filter(recording, freq_min=params["freq_min"]) + + bad_channel_ids = None + if params["detect_bad_channels"]: + bad_channel_ids, _ = si.detect_bad_channels(rec, method=params["bad_channel_method"]) + bad_channel_ids = list(bad_channel_ids) + if len(bad_channel_ids) > 0: + rec = rec.remove_channels(bad_channel_ids) + + if params["apply_phase_shift"]: + rec = si.phase_shift(rec) + + if params["apply_cmr"]: + rec = si.common_reference(rec, reference=params["cmr_reference"], operator=params["cmr_operator"]) + + rec_preprocessed = rec + + # Create or load analyzer + if analyzer_folder.exists(): + analyzer = si.load_sorting_analyzer(analyzer_folder) + if not analyzer.has_recording(): + analyzer.set_temporary_recording(rec_preprocessed) + else: + analyzer = si.create_sorting_analyzer( + sorting=sorting, + recording=rec_preprocessed, + sparse=params["sparse"], + format="zarr", + folder=analyzer_folder, + return_in_uV=params["return_in_uV"], + ) + + # Compute extensions + def _compute(name, **kwargs): + if analyzer.has_extension(name) and not rerun_extensions: + return + if analyzer.has_extension(name): + analyzer.delete_extension(name) + analyzer.compute(name, **kwargs) + + _compute("random_spikes", method="uniform", max_spikes_per_unit=params["max_spikes_per_unit"]) + _compute("waveforms", ms_before=params["ms_before"], ms_after=params["ms_after"], **job_kwargs) + _compute("templates", operators=list(params["template_operators"])) + _compute("noise_levels") + # spike_amplitudes computed on-demand by run_bombcell_qc if compute_amplitude_cutoff=True + _compute("unit_locations") + _compute("spike_locations", **job_kwargs) + _compute("template_metrics", include_multi_channel_metrics=params["include_multi_channel_metrics"]) + + return analyzer, rec_preprocessed, bad_channel_ids + + +def run_bombcell_qc( + sorting_analyzer, + output_folder: str | Path = "bombcell", + params: dict | None = None, + thresholds: dict | None = None, + valid_periods_params: dict | None = None, + rerun_quality_metrics: bool = False, + rerun_pca: bool = False, + n_jobs: int = -1, + progress_bar: bool = True, +): + """ + Compute quality metrics and run BombCell unit labeling. + + This function computes quality metrics on the SortingAnalyzer, runs the + BombCell labeling algorithm to classify units as good/mua/noise/non_soma, + generates diagnostic plots, and saves results. + + Parameters + ---------- + sorting_analyzer : SortingAnalyzer + Analyzer with template_metrics extension computed (from preprocess_for_bombcell). + output_folder : str or Path, default: "bombcell" + Folder to save results (CSV files and plots). Set to None to skip saving. + Created if it doesn't exist. + params : dict or None, default: None + QC parameters from get_default_qc_params(). If None, uses defaults. + thresholds : dict or None, default: None + BombCell classification thresholds from bombcell_get_default_thresholds(). + If None, uses defaults. Structure: + + - "noise": Thresholds for waveform quality. Failing ANY -> "noise". + - "mua": Thresholds for spike quality. Failing ANY -> "mua". + - "non-somatic": Thresholds for waveform shape. Determines non-somatic units. + + Each threshold is {"greater": value, "less": value}. Use None to disable. + See bombcell_get_default_thresholds() docstring for all thresholds. + + valid_periods_params : dict or None, default: None + Parameters for valid_unit_periods extension if params["use_valid_periods"]=True. + Keys: refractory_period_ms, censored_period_ms, period_mode, + period_duration_s_absolute, minimum_valid_period_duration. + rerun_quality_metrics : bool, default: False + Force recomputation of quality metrics even if they exist. + rerun_pca : bool, default: False + Force recomputation of PCA (only relevant if compute_distance_metrics=True). + n_jobs : int, default: -1 + Number of parallel jobs. + progress_bar : bool, default: True + Show progress bars. + + Returns + ------- + labels : pd.DataFrame + DataFrame with unit_ids as index and "bombcell_label" column. + Possible labels: "good", "mua", "noise", "non_soma" + (or "non_soma_good"/"non_soma_mua" if split_non_somatic_good_mua=True). + metrics : pd.DataFrame + Combined DataFrame of all quality metrics and template metrics. + Index is unit_ids, columns are metric names. + figures : dict + Dictionary of matplotlib figures: + - "histograms": Metric histograms with threshold lines. + - "waveforms": Waveform overlays grouped by label. + - "upset": List of UpSet plot figures (one per label type). + + Saved Files (in output_folder) + ------------------------------ + - labeling_results_wide.csv: One row per unit with all metrics and label. + - labeling_results_narrow.csv: One row per unit-metric with pass/fail status. + - valid_periods.tsv: Valid time periods per unit (only if use_valid_periods=True). + Columns: unit_id, segment_index, start_time_s, end_time_s, duration_s. + - metric_histograms.png: Histogram of each metric with threshold lines. + - waveforms_by_label.png: Waveform overlays for each label category. + - upset_plot_*.png: UpSet plots showing metric failure combinations. + + Examples + -------- + Basic usage with defaults: + + >>> labels, metrics, figs = run_bombcell_qc(analyzer) + + With custom parameters and thresholds: + + >>> params = get_default_qc_params() + >>> params["compute_distance_metrics"] = True # For chronic recordings + >>> params["refractory_period_ms"] = 1.5 # For fast-spiking neurons + >>> + >>> thresholds = bombcell_get_default_thresholds() + >>> thresholds["mua"]["rpv"]["less"] = 0.05 # Stricter RP violations + >>> thresholds["mua"]["num_spikes"]["greater"] = 100 # Lower spike threshold + >>> + >>> labels, metrics, figs = run_bombcell_qc( + ... analyzer, + ... output_folder="qc_results", + ... params=params, + ... thresholds=thresholds, + ... ) + + Get good units for downstream analysis: + + >>> good_units = labels[labels["bombcell_label"] == "good"].index.tolist() + >>> mua_units = labels[labels["bombcell_label"] == "mua"].index.tolist() + """ + from .bombcell_curation import ( + bombcell_get_default_thresholds, + bombcell_label_units, + save_bombcell_results, + save_valid_periods, + ) + + if params is None: + params = get_default_qc_params() + + if thresholds is None: + thresholds = bombcell_get_default_thresholds() + + job_kwargs = dict(n_jobs=n_jobs, chunk_duration="1s", progress_bar=progress_bar) + + if output_folder is not None: + output_folder = Path(output_folder) + output_folder.mkdir(parents=True, exist_ok=True) + + # Build QM params + qm_params = { + "presence_ratio": {"bin_duration_s": params["presence_ratio_bin_duration_s"]}, + "rp_violation": { + "refractory_period_ms": params["refractory_period_ms"], + "censored_period_ms": params["censored_period_ms"], + }, + "sliding_rp_violation": { + "exclude_ref_period_below_ms": params["sliding_rp_exclude_below_ms"], + "max_ref_period_ms": params["sliding_rp_max_ms"], + "confidence_threshold": params["sliding_rp_confidence"], + }, + "drift": { + "interval_s": params["drift_interval_s"], + "min_spikes_per_interval": params["drift_min_spikes"], + }, + } + + # Build metric names + metric_names = ["amplitude_median", "snr", "num_spikes", "presence_ratio", "firing_rate"] + + if params["compute_amplitude_cutoff"]: + metric_names.append("amplitude_cutoff") + # amplitude_cutoff requires spike_amplitudes or amplitude_scalings + if not sorting_analyzer.has_extension("spike_amplitudes") and not sorting_analyzer.has_extension( + "amplitude_scalings" + ): + sorting_analyzer.compute("spike_amplitudes", **job_kwargs) + + if params["rp_method"] == "sliding_rp": + metric_names.append("sliding_rp_violation") + else: + metric_names.append("rp_violation") + + if params["compute_drift"]: + metric_names.append("drift") + + if params["compute_distance_metrics"]: + metric_names.append("mahalanobis") + if not sorting_analyzer.has_extension("principal_components") or rerun_pca: + if sorting_analyzer.has_extension("principal_components"): + sorting_analyzer.delete_extension("principal_components") + sorting_analyzer.compute("principal_components", n_components=5, mode="by_channel_local", **job_kwargs) + + if params["use_valid_periods"] and not sorting_analyzer.has_extension("amplitude_scalings"): + sorting_analyzer.compute("amplitude_scalings", **job_kwargs) + + # Compute quality metrics + if sorting_analyzer.has_extension("quality_metrics") and rerun_quality_metrics: + sorting_analyzer.delete_extension("quality_metrics") + + if not sorting_analyzer.has_extension("quality_metrics"): + sorting_analyzer.compute("quality_metrics", metric_names=metric_names, metric_params=qm_params, **job_kwargs) + + # Run BombCell + labels = bombcell_label_units( + sorting_analyzer=sorting_analyzer, + thresholds=thresholds, + label_non_somatic=params["label_non_somatic"], + split_non_somatic_good_mua=params["split_non_somatic_good_mua"], + use_valid_periods=params["use_valid_periods"], + valid_periods_params=valid_periods_params, + **job_kwargs, + ) + + metrics = sorting_analyzer.get_metrics_extension_data() + + # Plots + figures = {} + if params["plot_histograms"] or params["plot_waveforms"] or params["plot_upset"]: + import spikeinterface.widgets as sw + + if params["plot_histograms"]: + w = sw.plot_metric_histograms(sorting_analyzer, thresholds, figsize=params["figsize_histograms"]) + figures["histograms"] = w.figure + + if params["plot_waveforms"]: + w = sw.plot_unit_labels(sorting_analyzer, labels["bombcell_label"], ylims=params["waveform_ylims"]) + figures["waveforms"] = w.figure + + if params["plot_upset"]: + w = sw.plot_bombcell_labels_upset( + sorting_analyzer, + unit_labels=labels["bombcell_label"], + thresholds=thresholds, + unit_labels_to_plot=["noise", "mua"], + ) + figures["upset"] = w.figures + + # Save + if output_folder is not None: + save_bombcell_results( + metrics=metrics, + unit_label=labels["bombcell_label"].values, + thresholds=thresholds, + folder=output_folder, + ) + if params["use_valid_periods"]: + save_valid_periods(sorting_analyzer, output_folder) + if "histograms" in figures: + figures["histograms"].savefig(output_folder / "metric_histograms.png", dpi=150, bbox_inches="tight") + if "waveforms" in figures: + figures["waveforms"].savefig(output_folder / "waveforms_by_label.png", dpi=150, bbox_inches="tight") + if "upset" in figures: + for i, fig in enumerate(figures["upset"]): + fig.savefig(output_folder / f"upset_plot_{i}.png", dpi=150, bbox_inches="tight") + + print(f"Labeled {len(labels)} units:") + print(labels["bombcell_label"].value_counts().to_string()) + + return labels, metrics, figures diff --git a/src/spikeinterface/metrics/quality/misc_metrics.py b/src/spikeinterface/metrics/quality/misc_metrics.py index 3d6911b383..660fa9c7cb 100644 --- a/src/spikeinterface/metrics/quality/misc_metrics.py +++ b/src/spikeinterface/metrics/quality/misc_metrics.py @@ -546,6 +546,7 @@ class RPViolation(BaseMetric): def compute_sliding_rp_violations( sorting_analyzer, unit_ids=None, + tmp_data=None, periods=None, min_spikes=0, bin_size_ms=0.25, @@ -553,11 +554,12 @@ def compute_sliding_rp_violations( exclude_ref_period_below_ms=0.5, max_ref_period_ms=10, contamination_values=None, + confidence_threshold=0.9, ): """ Compute sliding refractory period violations, a metric developed by IBL which computes contamination by using a sliding refractory period. - This metric computes the minimum contamination with at least 90% confidence. + This metric computes the minimum contamination with at least ``confidence_threshold`` confidence. Parameters ---------- @@ -565,6 +567,9 @@ def compute_sliding_rp_violations( A SortingAnalyzer object. unit_ids : list or None List of unit ids to compute the sliding RP violations. If None, all units are used. + tmp_data : dict or None + Shared data dict from the metric extension. When provided, per-tauR contamination + curves and rp_centers are written to it for persistent storage. periods : array of unit_period_dtype | None, default: None Periods (segment_index, start_sample_index, end_sample_index, unit_index) on which to compute the metric. If None, the entire recording duration is used. @@ -581,11 +586,17 @@ def compute_sliding_rp_violations( Maximum refractory period to test in ms. contamination_values : 1d array or None, default: None The contamination values to test, If None, it is set to np.arange(0.5, 35, 0.5). + confidence_threshold : float, default: 0.9 + Confidence threshold (between 0 and 1) for determining the minimum contamination. + A higher value requires stronger statistical evidence. Default is 0.9 (90% confidence). Returns ------- - contamination : dict of floats - The minimum contamination at 90% confidence. + result : namedtuple + Named tuple with fields: + + - ``sliding_rp_violation`` : dict of floats — minimum contamination per unit. + - ``sliding_rp_estimated_tauR`` : dict of floats — estimated refractory period (s) per unit. References ---------- @@ -593,6 +604,8 @@ def compute_sliding_rp_violations( This code was adapted from: https://github.com/SteinmetzLab/slidingRefractory/blob/1.0.0/python/slidingRP/metrics.py """ + res = namedtuple("sliding_rp_result", ["sliding_rp_violation", "sliding_rp_estimated_tauR"]) + total_durations = compute_total_durations_per_unit(sorting_analyzer, periods=periods) sorting = sorting_analyzer.sorting sorting = sorting.select_periods(periods=periods) @@ -602,7 +615,18 @@ def compute_sliding_rp_violations( fs = sorting_analyzer.sampling_frequency + # Pre-compute rp_centers so we know the array size even if all units are skipped + if contamination_values is None: + contamination_values_arr = np.arange(0.5, 35, 0.5) / 100 + else: + contamination_values_arr = np.asarray(contamination_values) + rp_bin_size = bin_size_ms / 1000 + rp_edges = np.arange(0, max_ref_period_ms / 1000, rp_bin_size) + rp_centers = rp_edges + rp_bin_size / 2 + contamination = {} + estimated_tauR = {} + per_tauR_contam_list = [] spikes, slices = sorting.to_reordered_spike_vector( ["sample_index", "segment_index", "unit_index"], return_order=False @@ -618,13 +642,15 @@ def compute_sliding_rp_violations( unit_n_spikes = len(sub_spikes) if unit_n_spikes <= min_spikes: contamination[unit_id] = np.nan + estimated_tauR[unit_id] = np.nan + per_tauR_contam_list.append(np.full(len(rp_centers), np.nan)) continue duration = total_durations[unit_id] sub_sorting = NumpySorting(sub_spikes, fs, unit_ids=[unit_id]) - contamination[unit_id] = slidingRP_violations( + min_contam, est_tauR, contam_at_each_tauR, _ = slidingRP_violations( sub_sorting, duration, bin_size_ms, @@ -632,9 +658,18 @@ def compute_sliding_rp_violations( exclude_ref_period_below_ms, max_ref_period_ms, contamination_values, + confidence_threshold=confidence_threshold, ) + contamination[unit_id] = min_contam + estimated_tauR[unit_id] = est_tauR + per_tauR_contam_list.append(contam_at_each_tauR) + + # Store per-tauR data in tmp_data for persistent storage by the extension + if tmp_data is not None: + tmp_data["sliding_rp_per_tauR_contamination"] = np.array(per_tauR_contam_list) + tmp_data["sliding_rp_rp_centers"] = rp_centers - return contamination + return res(contamination, estimated_tauR) class SlidingRPViolation(BaseMetric): @@ -647,11 +682,14 @@ class SlidingRPViolation(BaseMetric): "exclude_ref_period_below_ms": 0.5, "max_ref_period_ms": 10, "contamination_values": None, + "confidence_threshold": 0.9, } - metric_columns = {"sliding_rp_violation": float} + metric_columns = {"sliding_rp_violation": float, "sliding_rp_estimated_tauR": float} metric_descriptions = { - "sliding_rp_violation": "Minimum contamination at 90% confidence using sliding refractory period method." + "sliding_rp_violation": "Minimum contamination at specified confidence using sliding refractory period method.", + "sliding_rp_estimated_tauR": "Estimated refractory period (seconds) at which the minimum contamination was found.", } + needs_tmp_data = True supports_periods = True @@ -1696,7 +1734,7 @@ def slidingRP_violations( exclude_ref_period_below_ms=0.5, max_ref_period_ms=10, contamination_values=None, - return_conf_matrix=False, + confidence_threshold=0.9, ): """ A metric developed by IBL which determines whether the refractory period violations @@ -1706,8 +1744,10 @@ def slidingRP_violations( Parameters ---------- - spike_samples : ndarray_like or list (for multi-segment) - The spike times in samples. + sorting : BaseSorting + A sorting object (typically single-unit). + duration : float + Total duration in seconds. bin_size_ms : float The size (in ms) of binning for the autocorrelogram. window_size_s : float, default: 1 @@ -1718,16 +1758,23 @@ def slidingRP_violations( Maximum refractory period to test in ms. contamination_values : 1d array or None, default: None The contamination values to test, if None it is set to np.arange(0.5, 35, 0.5) / 100. - return_conf_matrix : bool, default: False - If True, the confidence matrix (n_contaminations, n_ref_periods) is returned. + confidence_threshold : float, default: 0.9 + Confidence threshold (between 0 and 1). Default is 0.9 (90% confidence). Code adapted from: https://github.com/SteinmetzLab/slidingRefractory/blob/master/python/slidingRP/metrics.py#L166 Returns ------- - min_cont_with_90_confidence : dict of floats - The minimum contamination with confidence > 90%. + min_contamination : float + The minimum contamination with confidence above the specified threshold. + estimated_tauR : float + The refractory period (in seconds) at which the minimum contamination was found. + contamination_at_each_tauR : np.ndarray + 1D array of length ``n_rp_centers``. For each tauR tested, the minimum + contamination with confidence above the threshold (NaN where none passes). + rp_centers : np.ndarray + 1D array of the refractory period centers tested (in seconds). """ if contamination_values is None: contamination_values = np.arange(0.5, 35, 0.5) / 100 # vector of contamination values to test @@ -1767,18 +1814,26 @@ def slidingRP_violations( ) test_rp_centers_mask = rp_centers > exclude_ref_period_below_ms / 1000.0 # (in seconds) - # only test for refractory period durations greater than 'exclude_ref_period_below_ms' - inds_confidence90 = np.row_stack(np.where(conf_matrix[:, test_rp_centers_mask] > 0.9)) - - if len(inds_confidence90[0]) > 0: - minI = np.min(inds_confidence90[0][0]) - min_cont_with_90_confidence = contamination_values[minI] + # For each tauR, find the minimum contamination where confidence exceeds threshold + contamination_at_each_tauR = np.full(len(rp_centers), np.nan) + for j in range(len(rp_centers)): + passing = np.where(conf_matrix[:, j] > confidence_threshold)[0] + if len(passing) > 0: + contamination_at_each_tauR[j] = contamination_values[passing[0]] + + # Only test for refractory period durations greater than 'exclude_ref_period_below_ms' + masked_contam = contamination_at_each_tauR.copy() + masked_contam[~test_rp_centers_mask] = np.nan + + if np.any(~np.isnan(masked_contam)): + best_idx = np.nanargmin(masked_contam) + min_contamination = masked_contam[best_idx] + estimated_tauR = rp_centers[best_idx] else: - min_cont_with_90_confidence = np.nan - if return_conf_matrix: - return min_cont_with_90_confidence, conf_matrix - else: - return min_cont_with_90_confidence + min_contamination = np.nan + estimated_tauR = np.nan + + return min_contamination, estimated_tauR, contamination_at_each_tauR, rp_centers def _compute_rp_contamination_one_unit( diff --git a/src/spikeinterface/metrics/quality/quality_metrics.py b/src/spikeinterface/metrics/quality/quality_metrics.py index 399908ec03..7bee4df335 100644 --- a/src/spikeinterface/metrics/quality/quality_metrics.py +++ b/src/spikeinterface/metrics/quality/quality_metrics.py @@ -46,6 +46,10 @@ class ComputeQualityMetrics(BaseMetricExtension): need_job_kwargs = True need_backward_compatibility_on_load = True metric_list = misc_metrics_list + pca_metrics_list + tmp_data_to_save = { + "sliding_rp_per_tauR_contamination": True, # (n_units, n_rp_centers) + "sliding_rp_rp_centers": False, # (n_rp_centers,) — same for all units + } @classmethod def get_required_dependencies(cls, **params): From 3a395f2a104cef022803ed4d8c3e2da720598b6b Mon Sep 17 00:00:00 2001 From: Julie-Fabre Date: Fri, 3 Apr 2026 19:30:30 -0400 Subject: [PATCH 2/5] bombcell extension, sliding rpv options --- .../metrics/quality/misc_metrics.py | 24 +------------------ .../metrics/quality/quality_metrics.py | 4 ---- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/src/spikeinterface/metrics/quality/misc_metrics.py b/src/spikeinterface/metrics/quality/misc_metrics.py index 660fa9c7cb..7260d34a3f 100644 --- a/src/spikeinterface/metrics/quality/misc_metrics.py +++ b/src/spikeinterface/metrics/quality/misc_metrics.py @@ -546,7 +546,6 @@ class RPViolation(BaseMetric): def compute_sliding_rp_violations( sorting_analyzer, unit_ids=None, - tmp_data=None, periods=None, min_spikes=0, bin_size_ms=0.25, @@ -567,9 +566,6 @@ def compute_sliding_rp_violations( A SortingAnalyzer object. unit_ids : list or None List of unit ids to compute the sliding RP violations. If None, all units are used. - tmp_data : dict or None - Shared data dict from the metric extension. When provided, per-tauR contamination - curves and rp_centers are written to it for persistent storage. periods : array of unit_period_dtype | None, default: None Periods (segment_index, start_sample_index, end_sample_index, unit_index) on which to compute the metric. If None, the entire recording duration is used. @@ -615,18 +611,8 @@ def compute_sliding_rp_violations( fs = sorting_analyzer.sampling_frequency - # Pre-compute rp_centers so we know the array size even if all units are skipped - if contamination_values is None: - contamination_values_arr = np.arange(0.5, 35, 0.5) / 100 - else: - contamination_values_arr = np.asarray(contamination_values) - rp_bin_size = bin_size_ms / 1000 - rp_edges = np.arange(0, max_ref_period_ms / 1000, rp_bin_size) - rp_centers = rp_edges + rp_bin_size / 2 - contamination = {} estimated_tauR = {} - per_tauR_contam_list = [] spikes, slices = sorting.to_reordered_spike_vector( ["sample_index", "segment_index", "unit_index"], return_order=False @@ -643,14 +629,13 @@ def compute_sliding_rp_violations( if unit_n_spikes <= min_spikes: contamination[unit_id] = np.nan estimated_tauR[unit_id] = np.nan - per_tauR_contam_list.append(np.full(len(rp_centers), np.nan)) continue duration = total_durations[unit_id] sub_sorting = NumpySorting(sub_spikes, fs, unit_ids=[unit_id]) - min_contam, est_tauR, contam_at_each_tauR, _ = slidingRP_violations( + min_contam, est_tauR, _, _ = slidingRP_violations( sub_sorting, duration, bin_size_ms, @@ -662,12 +647,6 @@ def compute_sliding_rp_violations( ) contamination[unit_id] = min_contam estimated_tauR[unit_id] = est_tauR - per_tauR_contam_list.append(contam_at_each_tauR) - - # Store per-tauR data in tmp_data for persistent storage by the extension - if tmp_data is not None: - tmp_data["sliding_rp_per_tauR_contamination"] = np.array(per_tauR_contam_list) - tmp_data["sliding_rp_rp_centers"] = rp_centers return res(contamination, estimated_tauR) @@ -689,7 +668,6 @@ class SlidingRPViolation(BaseMetric): "sliding_rp_violation": "Minimum contamination at specified confidence using sliding refractory period method.", "sliding_rp_estimated_tauR": "Estimated refractory period (seconds) at which the minimum contamination was found.", } - needs_tmp_data = True supports_periods = True diff --git a/src/spikeinterface/metrics/quality/quality_metrics.py b/src/spikeinterface/metrics/quality/quality_metrics.py index 7bee4df335..399908ec03 100644 --- a/src/spikeinterface/metrics/quality/quality_metrics.py +++ b/src/spikeinterface/metrics/quality/quality_metrics.py @@ -46,10 +46,6 @@ class ComputeQualityMetrics(BaseMetricExtension): need_job_kwargs = True need_backward_compatibility_on_load = True metric_list = misc_metrics_list + pca_metrics_list - tmp_data_to_save = { - "sliding_rp_per_tauR_contamination": True, # (n_units, n_rp_centers) - "sliding_rp_rp_centers": False, # (n_rp_centers,) — same for all units - } @classmethod def get_required_dependencies(cls, **params): From 6929c76a55681583aaf50d09f83d29bba3cbc66a Mon Sep 17 00:00:00 2001 From: Julie-Fabre Date: Fri, 3 Apr 2026 19:33:24 -0400 Subject: [PATCH 3/5] extension --- .../core/analyzer_extension_core.py | 50 +++++-------------- 1 file changed, 13 insertions(+), 37 deletions(-) diff --git a/src/spikeinterface/core/analyzer_extension_core.py b/src/spikeinterface/core/analyzer_extension_core.py index 3486e902fb..1c261e3cad 100644 --- a/src/spikeinterface/core/analyzer_extension_core.py +++ b/src/spikeinterface/core/analyzer_extension_core.py @@ -1341,11 +1341,7 @@ def _run(self, **job_kwargs): if self.tmp_data_to_save is not None: for k in self.tmp_data_to_save: - if k in tmp_data: - self.data[k] = tmp_data[k] - elif extension is not None and k in extension.data: - # Propagate previously saved tmp_data for metrics not recomputed - self.data[k] = extension.data[k] + self.data[k] = tmp_data[k] def _get_data(self): # convert to correct dtype @@ -1363,22 +1359,10 @@ def _select_extension_data(self, unit_ids: list[int | str]): Returns ------- dict - Dictionary containing the selected metrics DataFrame and any tmp_data arrays. + Dictionary containing the selected metrics DataFrame. """ new_metrics = self.data["metrics"].loc[np.array(unit_ids)] - result = dict(metrics=new_metrics) - - if self.tmp_data_to_save is not None: - keep_indices = self.sorting_analyzer.sorting.ids_to_indices(unit_ids) - for k, is_per_unit in self.tmp_data_to_save.items(): - if k not in self.data: - continue - if is_per_unit: - result[k] = self.data[k][keep_indices] - else: - result[k] = self.data[k] - - return result + return dict(metrics=new_metrics) def _merge_extension_data( self, @@ -1428,15 +1412,11 @@ def _merge_extension_data( new_data["metrics"] = self._cast_metrics(metrics) if self.tmp_data_to_save is not None: - for k, is_per_unit in self.tmp_data_to_save.items(): - if k not in self.data or k not in new_tmp_data: - continue - if is_per_unit: - new_data[k] = _update_data_after_merge_or_split( - self.sorting_analyzer, new_sorting_analyzer, self.data[k], new_tmp_data[k], new_unit_ids - ) - else: - new_data[k] = new_tmp_data[k] + for k in self.tmp_data_to_save: + new_arr = _update_data_after_merge_or_split( + self.sorting_analyzer, new_sorting_analyzer, self.data[k], new_tmp_data[k], new_unit_ids + ) + new_data[k] = new_arr return new_data @@ -1480,15 +1460,11 @@ def _split_extension_data( new_data["metrics"] = self._cast_metrics(metrics) if self.tmp_data_to_save is not None: - for k, is_per_unit in self.tmp_data_to_save.items(): - if k not in self.data or k not in new_tmp_data: - continue - if is_per_unit: - new_data[k] = _update_data_after_merge_or_split( - self.sorting_analyzer, new_sorting_analyzer, self.data[k], new_tmp_data[k], new_unit_ids_f - ) - else: - new_data[k] = new_tmp_data[k] + for k in self.tmp_data_to_save: + new_arr = _update_data_after_merge_or_split( + self.sorting_analyzer, new_sorting_analyzer, self.data[k], new_tmp_data[k], new_unit_ids_f + ) + new_data[k] = new_arr return new_data From a0aa13b5dc83d0ddbfda39239cab3f82f74dfcec Mon Sep 17 00:00:00 2001 From: Julie-Fabre Date: Fri, 3 Apr 2026 20:05:57 -0400 Subject: [PATCH 4/5] remove sliding rpv changes - that will be its own PR --- .../how_to/full_pipeline_with_bombcell.ipynb | 3885 +++++++++++++++++ .../curation/bombcell_pipeline.py | 6 - .../metrics/quality/misc_metrics.py | 83 +- .../metrics/quality/quality_metrics.py | 14 - 4 files changed, 3910 insertions(+), 78 deletions(-) create mode 100644 examples/how_to/full_pipeline_with_bombcell.ipynb diff --git a/examples/how_to/full_pipeline_with_bombcell.ipynb b/examples/how_to/full_pipeline_with_bombcell.ipynb new file mode 100644 index 0000000000..3f2b48c46f --- /dev/null +++ b/examples/how_to/full_pipeline_with_bombcell.ipynb @@ -0,0 +1,3885 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a8qopee02yw", + "metadata": {}, + "source": [ + "# Full pipeline: preprocessing, spike sorting, and bombcell quality control\n", + "\n", + "This notebook walks through a complete Neuropixels analysis pipeline:\n", + "\n", + "1. Load a SpikeGLX recording\n", + "2. Preprocess (highpass filter, remove bad channels, phase shift, common reference)\n", + "3. Run Kilosort4\n", + "4. Create a SortingAnalyzer and compute the metrics required by bombcell\n", + "5. Run bombcell to automatically label units as good, MUA, or noise\n", + "\n", + "\n", + "TODO: \n", + "- time chunks\n", + "- GUI\n", + "- methods & supp. fig generation like in bombcell native \n", + "- update docs to point to this file etc " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "hnxdcyfpx2j", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8il4izzoh1c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jf5479/anaconda3/envs/spike_interface/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import spikeinterface.full as si\n", + "import spikeinterface.curation as sc\n", + "import spikeinterface.widgets as sw\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from pathlib import Path\n", + "from pprint import pprint" + ] + }, + { + "cell_type": "markdown", + "id": "1reksnrez08", + "metadata": {}, + "source": [ + "## 1. Load the recording\n", + "\n", + "Point `spikeglx_folder` to your SpikeGLX recording folder. The AP stream is loaded automatically with probe geometry from the `.meta` file." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "gqqsj6x3myw", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Preprocessed recording exists: True\n" + ] + } + ], + "source": [ + "# Edit this path to point to your SpikeGLX recording folder\n", + "spikeglx_folder = Path(\"/Volumes/witten/Julie/bombcell_test_datasets/from_Scott_striatum_empty_units/TowersTask_g0/\")\n", + "base_folder = spikeglx_folder # Output folders will be created inside/alongside the recording\n", + "\n", + "# Define output paths\n", + "preprocessed_folder = base_folder / \"preprocessed\"\n", + "kilosort_folder = base_folder / \"kilosort4_output\"\n", + "analyzer_folder = base_folder / \"sorting_analyzer.zarr\"\n", + "\n", + "# Check if preprocessed recording already exists\n", + "preprocessed_exists = (preprocessed_folder / \"si_folder.json\").exists()\n", + "print(f\"Preprocessed recording exists: {preprocessed_exists}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6h3aeypaz3v", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
SpikeGLXRecordingExtractor: 384 channels - 30000.036975 Hz - 1 segments - 136,752,912 samples - 4,558.42s (1.27 hours) - int16 dtype - 97.81 GiB
Channel IDs
    ['imec0.ap#AP0' 'imec0.ap#AP1' 'imec0.ap#AP2' 'imec0.ap#AP3'\n", + " 'imec0.ap#AP4' 'imec0.ap#AP5' 'imec0.ap#AP6' 'imec0.ap#AP7'\n", + " 'imec0.ap#AP8' 'imec0.ap#AP9' 'imec0.ap#AP10' 'imec0.ap#AP11'\n", + " 'imec0.ap#AP12' 'imec0.ap#AP13' 'imec0.ap#AP14' 'imec0.ap#AP15'\n", + " 'imec0.ap#AP16' 'imec0.ap#AP17' 'imec0.ap#AP18' 'imec0.ap#AP19'\n", + " 'imec0.ap#AP20' 'imec0.ap#AP21' 'imec0.ap#AP22' 'imec0.ap#AP23'\n", + " 'imec0.ap#AP24' 'imec0.ap#AP25' 'imec0.ap#AP26' 'imec0.ap#AP27'\n", + " 'imec0.ap#AP28' 'imec0.ap#AP29' 'imec0.ap#AP30' 'imec0.ap#AP31'\n", + " 'imec0.ap#AP32' 'imec0.ap#AP33' 'imec0.ap#AP34' 'imec0.ap#AP35'\n", + " 'imec0.ap#AP36' 'imec0.ap#AP37' 'imec0.ap#AP38' 'imec0.ap#AP39'\n", + " 'imec0.ap#AP40' 'imec0.ap#AP41' 'imec0.ap#AP42' 'imec0.ap#AP43'\n", + " 'imec0.ap#AP44' 'imec0.ap#AP45' 'imec0.ap#AP46' 'imec0.ap#AP47'\n", + " 'imec0.ap#AP48' 'imec0.ap#AP49' 'imec0.ap#AP50' 'imec0.ap#AP51'\n", + " 'imec0.ap#AP52' 'imec0.ap#AP53' 'imec0.ap#AP54' 'imec0.ap#AP55'\n", + " 'imec0.ap#AP56' 'imec0.ap#AP57' 'imec0.ap#AP58' 'imec0.ap#AP59'\n", + " 'imec0.ap#AP60' 'imec0.ap#AP61' 'imec0.ap#AP62' 'imec0.ap#AP63'\n", + " 'imec0.ap#AP64' 'imec0.ap#AP65' 'imec0.ap#AP66' 'imec0.ap#AP67'\n", + " 'imec0.ap#AP68' 'imec0.ap#AP69' 'imec0.ap#AP70' 'imec0.ap#AP71'\n", + " 'imec0.ap#AP72' 'imec0.ap#AP73' 'imec0.ap#AP74' 'imec0.ap#AP75'\n", + " 'imec0.ap#AP76' 'imec0.ap#AP77' 'imec0.ap#AP78' 'imec0.ap#AP79'\n", + " 'imec0.ap#AP80' 'imec0.ap#AP81' 'imec0.ap#AP82' 'imec0.ap#AP83'\n", + " 'imec0.ap#AP84' 'imec0.ap#AP85' 'imec0.ap#AP86' 'imec0.ap#AP87'\n", + " 'imec0.ap#AP88' 'imec0.ap#AP89' 'imec0.ap#AP90' 'imec0.ap#AP91'\n", + " 'imec0.ap#AP92' 'imec0.ap#AP93' 'imec0.ap#AP94' 'imec0.ap#AP95'\n", + " 'imec0.ap#AP96' 'imec0.ap#AP97' 'imec0.ap#AP98' 'imec0.ap#AP99'\n", + " 'imec0.ap#AP100' 'imec0.ap#AP101' 'imec0.ap#AP102' 'imec0.ap#AP103'\n", + " 'imec0.ap#AP104' 'imec0.ap#AP105' 'imec0.ap#AP106' 'imec0.ap#AP107'\n", + " 'imec0.ap#AP108' 'imec0.ap#AP109' 'imec0.ap#AP110' 'imec0.ap#AP111'\n", + " 'imec0.ap#AP112' 'imec0.ap#AP113' 'imec0.ap#AP114' 'imec0.ap#AP115'\n", + " 'imec0.ap#AP116' 'imec0.ap#AP117' 'imec0.ap#AP118' 'imec0.ap#AP119'\n", + " 'imec0.ap#AP120' 'imec0.ap#AP121' 'imec0.ap#AP122' 'imec0.ap#AP123'\n", + " 'imec0.ap#AP124' 'imec0.ap#AP125' 'imec0.ap#AP126' 'imec0.ap#AP127'\n", + " 'imec0.ap#AP128' 'imec0.ap#AP129' 'imec0.ap#AP130' 'imec0.ap#AP131'\n", + " 'imec0.ap#AP132' 'imec0.ap#AP133' 'imec0.ap#AP134' 'imec0.ap#AP135'\n", + " 'imec0.ap#AP136' 'imec0.ap#AP137' 'imec0.ap#AP138' 'imec0.ap#AP139'\n", + " 'imec0.ap#AP140' 'imec0.ap#AP141' 'imec0.ap#AP142' 'imec0.ap#AP143'\n", + " 'imec0.ap#AP144' 'imec0.ap#AP145' 'imec0.ap#AP146' 'imec0.ap#AP147'\n", + " 'imec0.ap#AP148' 'imec0.ap#AP149' 'imec0.ap#AP150' 'imec0.ap#AP151'\n", + " 'imec0.ap#AP152' 'imec0.ap#AP153' 'imec0.ap#AP154' 'imec0.ap#AP155'\n", + " 'imec0.ap#AP156' 'imec0.ap#AP157' 'imec0.ap#AP158' 'imec0.ap#AP159'\n", + " 'imec0.ap#AP160' 'imec0.ap#AP161' 'imec0.ap#AP162' 'imec0.ap#AP163'\n", + " 'imec0.ap#AP164' 'imec0.ap#AP165' 'imec0.ap#AP166' 'imec0.ap#AP167'\n", + " 'imec0.ap#AP168' 'imec0.ap#AP169' 'imec0.ap#AP170' 'imec0.ap#AP171'\n", + " 'imec0.ap#AP172' 'imec0.ap#AP173' 'imec0.ap#AP174' 'imec0.ap#AP175'\n", + " 'imec0.ap#AP176' 'imec0.ap#AP177' 'imec0.ap#AP178' 'imec0.ap#AP179'\n", + " 'imec0.ap#AP180' 'imec0.ap#AP181' 'imec0.ap#AP182' 'imec0.ap#AP183'\n", + " 'imec0.ap#AP184' 'imec0.ap#AP185' 'imec0.ap#AP186' 'imec0.ap#AP187'\n", + " 'imec0.ap#AP188' 'imec0.ap#AP189' 'imec0.ap#AP190' 'imec0.ap#AP191'\n", + " 'imec0.ap#AP192' 'imec0.ap#AP193' 'imec0.ap#AP194' 'imec0.ap#AP195'\n", + " 'imec0.ap#AP196' 'imec0.ap#AP197' 'imec0.ap#AP198' 'imec0.ap#AP199'\n", + " 'imec0.ap#AP200' 'imec0.ap#AP201' 'imec0.ap#AP202' 'imec0.ap#AP203'\n", + " 'imec0.ap#AP204' 'imec0.ap#AP205' 'imec0.ap#AP206' 'imec0.ap#AP207'\n", + " 'imec0.ap#AP208' 'imec0.ap#AP209' 'imec0.ap#AP210' 'imec0.ap#AP211'\n", + " 'imec0.ap#AP212' 'imec0.ap#AP213' 'imec0.ap#AP214' 'imec0.ap#AP215'\n", + " 'imec0.ap#AP216' 'imec0.ap#AP217' 'imec0.ap#AP218' 'imec0.ap#AP219'\n", + " 'imec0.ap#AP220' 'imec0.ap#AP221' 'imec0.ap#AP222' 'imec0.ap#AP223'\n", + " 'imec0.ap#AP224' 'imec0.ap#AP225' 'imec0.ap#AP226' 'imec0.ap#AP227'\n", + " 'imec0.ap#AP228' 'imec0.ap#AP229' 'imec0.ap#AP230' 'imec0.ap#AP231'\n", + " 'imec0.ap#AP232' 'imec0.ap#AP233' 'imec0.ap#AP234' 'imec0.ap#AP235'\n", + " 'imec0.ap#AP236' 'imec0.ap#AP237' 'imec0.ap#AP238' 'imec0.ap#AP239'\n", + " 'imec0.ap#AP240' 'imec0.ap#AP241' 'imec0.ap#AP242' 'imec0.ap#AP243'\n", + " 'imec0.ap#AP244' 'imec0.ap#AP245' 'imec0.ap#AP246' 'imec0.ap#AP247'\n", + " 'imec0.ap#AP248' 'imec0.ap#AP249' 'imec0.ap#AP250' 'imec0.ap#AP251'\n", + " 'imec0.ap#AP252' 'imec0.ap#AP253' 'imec0.ap#AP254' 'imec0.ap#AP255'\n", + " 'imec0.ap#AP256' 'imec0.ap#AP257' 'imec0.ap#AP258' 'imec0.ap#AP259'\n", + " 'imec0.ap#AP260' 'imec0.ap#AP261' 'imec0.ap#AP262' 'imec0.ap#AP263'\n", + " 'imec0.ap#AP264' 'imec0.ap#AP265' 'imec0.ap#AP266' 'imec0.ap#AP267'\n", + " 'imec0.ap#AP268' 'imec0.ap#AP269' 'imec0.ap#AP270' 'imec0.ap#AP271'\n", + " 'imec0.ap#AP272' 'imec0.ap#AP273' 'imec0.ap#AP274' 'imec0.ap#AP275'\n", + " 'imec0.ap#AP276' 'imec0.ap#AP277' 'imec0.ap#AP278' 'imec0.ap#AP279'\n", + " 'imec0.ap#AP280' 'imec0.ap#AP281' 'imec0.ap#AP282' 'imec0.ap#AP283'\n", + " 'imec0.ap#AP284' 'imec0.ap#AP285' 'imec0.ap#AP286' 'imec0.ap#AP287'\n", + " 'imec0.ap#AP288' 'imec0.ap#AP289' 'imec0.ap#AP290' 'imec0.ap#AP291'\n", + " 'imec0.ap#AP292' 'imec0.ap#AP293' 'imec0.ap#AP294' 'imec0.ap#AP295'\n", + " 'imec0.ap#AP296' 'imec0.ap#AP297' 'imec0.ap#AP298' 'imec0.ap#AP299'\n", + " 'imec0.ap#AP300' 'imec0.ap#AP301' 'imec0.ap#AP302' 'imec0.ap#AP303'\n", + " 'imec0.ap#AP304' 'imec0.ap#AP305' 'imec0.ap#AP306' 'imec0.ap#AP307'\n", + " 'imec0.ap#AP308' 'imec0.ap#AP309' 'imec0.ap#AP310' 'imec0.ap#AP311'\n", + " 'imec0.ap#AP312' 'imec0.ap#AP313' 'imec0.ap#AP314' 'imec0.ap#AP315'\n", + " 'imec0.ap#AP316' 'imec0.ap#AP317' 'imec0.ap#AP318' 'imec0.ap#AP319'\n", + " 'imec0.ap#AP320' 'imec0.ap#AP321' 'imec0.ap#AP322' 'imec0.ap#AP323'\n", + " 'imec0.ap#AP324' 'imec0.ap#AP325' 'imec0.ap#AP326' 'imec0.ap#AP327'\n", + " 'imec0.ap#AP328' 'imec0.ap#AP329' 'imec0.ap#AP330' 'imec0.ap#AP331'\n", + " 'imec0.ap#AP332' 'imec0.ap#AP333' 'imec0.ap#AP334' 'imec0.ap#AP335'\n", + " 'imec0.ap#AP336' 'imec0.ap#AP337' 'imec0.ap#AP338' 'imec0.ap#AP339'\n", + " 'imec0.ap#AP340' 'imec0.ap#AP341' 'imec0.ap#AP342' 'imec0.ap#AP343'\n", + " 'imec0.ap#AP344' 'imec0.ap#AP345' 'imec0.ap#AP346' 'imec0.ap#AP347'\n", + " 'imec0.ap#AP348' 'imec0.ap#AP349' 'imec0.ap#AP350' 'imec0.ap#AP351'\n", + " 'imec0.ap#AP352' 'imec0.ap#AP353' 'imec0.ap#AP354' 'imec0.ap#AP355'\n", + " 'imec0.ap#AP356' 'imec0.ap#AP357' 'imec0.ap#AP358' 'imec0.ap#AP359'\n", + " 'imec0.ap#AP360' 'imec0.ap#AP361' 'imec0.ap#AP362' 'imec0.ap#AP363'\n", + " 'imec0.ap#AP364' 'imec0.ap#AP365' 'imec0.ap#AP366' 'imec0.ap#AP367'\n", + " 'imec0.ap#AP368' 'imec0.ap#AP369' 'imec0.ap#AP370' 'imec0.ap#AP371'\n", + " 'imec0.ap#AP372' 'imec0.ap#AP373' 'imec0.ap#AP374' 'imec0.ap#AP375'\n", + " 'imec0.ap#AP376' 'imec0.ap#AP377' 'imec0.ap#AP378' 'imec0.ap#AP379'\n", + " 'imec0.ap#AP380' 'imec0.ap#AP381' 'imec0.ap#AP382' 'imec0.ap#AP383']
Annotations
  • is_filtered : False
  • probe_0_planar_contour : [[-2.700e+01 9.989e+03]\n", + " [-2.700e+01 -1.100e+01]\n", + " [ 8.000e+00 -2.170e+02]\n", + " [ 4.300e+01 -1.100e+01]\n", + " [ 4.300e+01 9.989e+03]\n", + " [ 2.230e+02 9.989e+03]\n", + " [ 2.230e+02 -1.100e+01]\n", + " [ 2.580e+02 -2.170e+02]\n", + " [ 2.930e+02 -1.100e+01]\n", + " [ 2.930e+02 9.989e+03]\n", + " [ 4.730e+02 9.989e+03]\n", + " [ 4.730e+02 -1.100e+01]\n", + " [ 5.080e+02 -2.170e+02]\n", + " [ 5.430e+02 -1.100e+01]\n", + " [ 5.430e+02 9.989e+03]\n", + " [ 7.230e+02 9.989e+03]\n", + " [ 7.230e+02 -1.100e+01]\n", + " [ 7.580e+02 -2.170e+02]\n", + " [ 7.930e+02 -1.100e+01]\n", + " [ 7.930e+02 9.989e+03]]
  • probes_info : [{'model_name': 'NP2010', 'manufacturer': 'imec', 'description': 'duplicate of PRB2_4_2_0640_0', 'shank_tips': [[8.0, -217.0], [258.0, -217.0], [508.0, -217.0], [758.0, -217.0]], 'adc_bit_depth': 14, 'num_readout_channels': 384, 'ap_sample_frequency_hz': 30000.0, 'lf_sample_frequency_hz': 0.0, 'adc_sampling_table': '(24,16)(0 1 32 33 64 65 96 97 128 129 160 161 192 193 224 225 256 257 288 289 320 321 352 353)(2 3 34 35 66 67 98 99 130 131 162 163 194 195 226 227 258 259 290 291 322 323 354 355)(4 5 36 37 68 69 100 101 132 133 164 165 196 197 228 229 260 261 292 293 324 325 356 357)(6 7 38 39 70 71 102 103 134 135 166 167 198 199 230 231 262 263 294 295 326 327 358 359)(8 9 40 41 72 73 104 105 136 137 168 169 200 201 232 233 264 265 296 297 328 329 360 361)(10 11 42 43 74 75 106 107 138 139 170 171 202 203 234 235 266 267 298 299 330 331 362 363)(12 13 44 45 76 77 108 109 140 141 172 173 204 205 236 237 268 269 300 301 332 333 364 365)(14 15 46 47 78 79 110 111 142 143 174 175 206 207 238 239 270 271 302 303 334 335 366 367)(16 17 48 49 80 81 112 113 144 145 176 177 208 209 240 241 272 273 304 305 336 337 368 369)(18 19 50 51 82 83 114 115 146 147 178 179 210 211 242 243 274 275 306 307 338 339 370 371)(20 21 52 53 84 85 116 117 148 149 180 181 212 213 244 245 276 277 308 309 340 341 372 373)(22 23 54 55 86 87 118 119 150 151 182 183 214 215 246 247 278 279 310 311 342 343 374 375)(24 25 56 57 88 89 120 121 152 153 184 185 216 217 248 249 280 281 312 313 344 345 376 377)(26 27 58 59 90 91 122 123 154 155 186 187 218 219 250 251 282 283 314 315 346 347 378 379)(28 29 60 61 92 93 124 125 156 157 188 189 220 221 252 253 284 285 316 317 348 349 380 381)(30 31 62 63 94 95 126 127 158 159 190 191 222 223 254 255 286 287 318 319 350 351 382 383)', 'num_adcs': 24, 'num_channels_per_adc': 16, 'serial_number': '20403317573', 'part_number': 'NP2010', 'port': '1', 'slot': '2'}]
Properties
    gain_to_uV[0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945]
    offset_to_uV[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
    physical_unit['uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV']
    gain_to_physical_unit[0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945]
    offset_to_physical_unit[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
    channel_name['AP0' 'AP1' 'AP2' 'AP3' 'AP4' 'AP5' 'AP6' 'AP7' 'AP8' 'AP9' 'AP10' 'AP11'\n", + " 'AP12' 'AP13' 'AP14' 'AP15' 'AP16' 'AP17' 'AP18' 'AP19' 'AP20' 'AP21'\n", + " 'AP22' 'AP23' 'AP24' 'AP25' 'AP26' 'AP27' 'AP28' 'AP29' 'AP30' 'AP31'\n", + " 'AP32' 'AP33' 'AP34' 'AP35' 'AP36' 'AP37' 'AP38' 'AP39' 'AP40' 'AP41'\n", + " 'AP42' 'AP43' 'AP44' 'AP45' 'AP46' 'AP47' 'AP48' 'AP49' 'AP50' 'AP51'\n", + " 'AP52' 'AP53' 'AP54' 'AP55' 'AP56' 'AP57' 'AP58' 'AP59' 'AP60' 'AP61'\n", + " 'AP62' 'AP63' 'AP64' 'AP65' 'AP66' 'AP67' 'AP68' 'AP69' 'AP70' 'AP71'\n", + " 'AP72' 'AP73' 'AP74' 'AP75' 'AP76' 'AP77' 'AP78' 'AP79' 'AP80' 'AP81'\n", + " 'AP82' 'AP83' 'AP84' 'AP85' 'AP86' 'AP87' 'AP88' 'AP89' 'AP90' 'AP91'\n", + " 'AP92' 'AP93' 'AP94' 'AP95' 'AP96' 'AP97' 'AP98' 'AP99' 'AP100' 'AP101'\n", + " 'AP102' 'AP103' 'AP104' 'AP105' 'AP106' 'AP107' 'AP108' 'AP109' 'AP110'\n", + " 'AP111' 'AP112' 'AP113' 'AP114' 'AP115' 'AP116' 'AP117' 'AP118' 'AP119'\n", + " 'AP120' 'AP121' 'AP122' 'AP123' 'AP124' 'AP125' 'AP126' 'AP127' 'AP128'\n", + " 'AP129' 'AP130' 'AP131' 'AP132' 'AP133' 'AP134' 'AP135' 'AP136' 'AP137'\n", + " 'AP138' 'AP139' 'AP140' 'AP141' 'AP142' 'AP143' 'AP144' 'AP145' 'AP146'\n", + " 'AP147' 'AP148' 'AP149' 'AP150' 'AP151' 'AP152' 'AP153' 'AP154' 'AP155'\n", + " 'AP156' 'AP157' 'AP158' 'AP159' 'AP160' 'AP161' 'AP162' 'AP163' 'AP164'\n", + " 'AP165' 'AP166' 'AP167' 'AP168' 'AP169' 'AP170' 'AP171' 'AP172' 'AP173'\n", + " 'AP174' 'AP175' 'AP176' 'AP177' 'AP178' 'AP179' 'AP180' 'AP181' 'AP182'\n", + " 'AP183' 'AP184' 'AP185' 'AP186' 'AP187' 'AP188' 'AP189' 'AP190' 'AP191'\n", + " 'AP192' 'AP193' 'AP194' 'AP195' 'AP196' 'AP197' 'AP198' 'AP199' 'AP200'\n", + " 'AP201' 'AP202' 'AP203' 'AP204' 'AP205' 'AP206' 'AP207' 'AP208' 'AP209'\n", + " 'AP210' 'AP211' 'AP212' 'AP213' 'AP214' 'AP215' 'AP216' 'AP217' 'AP218'\n", + " 'AP219' 'AP220' 'AP221' 'AP222' 'AP223' 'AP224' 'AP225' 'AP226' 'AP227'\n", + " 'AP228' 'AP229' 'AP230' 'AP231' 'AP232' 'AP233' 'AP234' 'AP235' 'AP236'\n", + " 'AP237' 'AP238' 'AP239' 'AP240' 'AP241' 'AP242' 'AP243' 'AP244' 'AP245'\n", + " 'AP246' 'AP247' 'AP248' 'AP249' 'AP250' 'AP251' 'AP252' 'AP253' 'AP254'\n", + " 'AP255' 'AP256' 'AP257' 'AP258' 'AP259' 'AP260' 'AP261' 'AP262' 'AP263'\n", + " 'AP264' 'AP265' 'AP266' 'AP267' 'AP268' 'AP269' 'AP270' 'AP271' 'AP272'\n", + " 'AP273' 'AP274' 'AP275' 'AP276' 'AP277' 'AP278' 'AP279' 'AP280' 'AP281'\n", + " 'AP282' 'AP283' 'AP284' 'AP285' 'AP286' 'AP287' 'AP288' 'AP289' 'AP290'\n", + " 'AP291' 'AP292' 'AP293' 'AP294' 'AP295' 'AP296' 'AP297' 'AP298' 'AP299'\n", + " 'AP300' 'AP301' 'AP302' 'AP303' 'AP304' 'AP305' 'AP306' 'AP307' 'AP308'\n", + " 'AP309' 'AP310' 'AP311' 'AP312' 'AP313' 'AP314' 'AP315' 'AP316' 'AP317'\n", + " 'AP318' 'AP319' 'AP320' 'AP321' 'AP322' 'AP323' 'AP324' 'AP325' 'AP326'\n", + " 'AP327' 'AP328' 'AP329' 'AP330' 'AP331' 'AP332' 'AP333' 'AP334' 'AP335'\n", + " 'AP336' 'AP337' 'AP338' 'AP339' 'AP340' 'AP341' 'AP342' 'AP343' 'AP344'\n", + " 'AP345' 'AP346' 'AP347' 'AP348' 'AP349' 'AP350' 'AP351' 'AP352' 'AP353'\n", + " 'AP354' 'AP355' 'AP356' 'AP357' 'AP358' 'AP359' 'AP360' 'AP361' 'AP362'\n", + " 'AP363' 'AP364' 'AP365' 'AP366' 'AP367' 'AP368' 'AP369' 'AP370' 'AP371'\n", + " 'AP372' 'AP373' 'AP374' 'AP375' 'AP376' 'AP377' 'AP378' 'AP379' 'AP380'\n", + " 'AP381' 'AP382' 'AP383']
    contact_vector[(0, 500., 3600., 'square', 12., '2', 's2e480', 0, 'um', 1., 0., 0., 1., 0, 1, 0, 0, 0)\n", + " (0, 532., 3600., 'square', 12., '2', 's2e481', 1, 'um', 1., 0., 0., 1., 1, 1, 0, 1, 0)\n", + " (0, 500., 3615., 'square', 12., '2', 's2e482', 2, 'um', 1., 0., 0., 1., 2, 1, 0, 0, 1)\n", + " (0, 532., 3615., 'square', 12., '2', 's2e483', 3, 'um', 1., 0., 0., 1., 3, 1, 0, 1, 1)\n", + " (0, 500., 3630., 'square', 12., '2', 's2e484', 4, 'um', 1., 0., 0., 1., 4, 1, 0, 0, 2)\n", + " (0, 532., 3630., 'square', 12., '2', 's2e485', 5, 'um', 1., 0., 0., 1., 5, 1, 0, 1, 2)\n", + " (0, 500., 3645., 'square', 12., '2', 's2e486', 6, 'um', 1., 0., 0., 1., 6, 1, 0, 0, 3)\n", + " (0, 532., 3645., 'square', 12., '2', 's2e487', 7, 'um', 1., 0., 0., 1., 7, 1, 0, 1, 3)\n", + " (0, 500., 3660., 'square', 12., '2', 's2e488', 8, 'um', 1., 0., 0., 1., 8, 1, 0, 0, 4)\n", + " (0, 532., 3660., 'square', 12., '2', 's2e489', 9, 'um', 1., 0., 0., 1., 9, 1, 0, 1, 4)\n", + " (0, 500., 3675., 'square', 12., '2', 's2e490', 10, 'um', 1., 0., 0., 1., 10, 1, 0, 0, 5)\n", + " (0, 532., 3675., 'square', 12., '2', 's2e491', 11, 'um', 1., 0., 0., 1., 11, 1, 0, 1, 5)\n", + " (0, 500., 3690., 'square', 12., '2', 's2e492', 12, 'um', 1., 0., 0., 1., 12, 1, 0, 0, 6)\n", + " (0, 532., 3690., 'square', 12., '2', 's2e493', 13, 'um', 1., 0., 0., 1., 13, 1, 0, 1, 6)\n", + " (0, 500., 3705., 'square', 12., '2', 's2e494', 14, 'um', 1., 0., 0., 1., 14, 1, 0, 0, 7)\n", + " (0, 532., 3705., 'square', 12., '2', 's2e495', 15, 'um', 1., 0., 0., 1., 15, 1, 0, 1, 7)\n", + " (0, 500., 3720., 'square', 12., '2', 's2e496', 16, 'um', 1., 0., 0., 1., 16, 1, 0, 0, 8)\n", + " (0, 532., 3720., 'square', 12., '2', 's2e497', 17, 'um', 1., 0., 0., 1., 17, 1, 0, 1, 8)\n", + " (0, 500., 3735., 'square', 12., '2', 's2e498', 18, 'um', 1., 0., 0., 1., 18, 1, 0, 0, 9)\n", + " (0, 532., 3735., 'square', 12., '2', 's2e499', 19, 'um', 1., 0., 0., 1., 19, 1, 0, 1, 9)\n", + " (0, 500., 3750., 'square', 12., '2', 's2e500', 20, 'um', 1., 0., 0., 1., 20, 1, 0, 0, 10)\n", + " (0, 532., 3750., 'square', 12., '2', 's2e501', 21, 'um', 1., 0., 0., 1., 21, 1, 0, 1, 10)\n", + " (0, 500., 3765., 'square', 12., '2', 's2e502', 22, 'um', 1., 0., 0., 1., 22, 1, 0, 0, 11)\n", + " (0, 532., 3765., 'square', 12., '2', 's2e503', 23, 'um', 1., 0., 0., 1., 23, 1, 0, 1, 11)\n", + " (0, 500., 3780., 'square', 12., '2', 's2e504', 24, 'um', 1., 0., 0., 1., 24, 1, 0, 0, 12)\n", + " (0, 532., 3780., 'square', 12., '2', 's2e505', 25, 'um', 1., 0., 0., 1., 25, 1, 0, 1, 12)\n", + " (0, 500., 3795., 'square', 12., '2', 's2e506', 26, 'um', 1., 0., 0., 1., 26, 1, 0, 0, 13)\n", + " (0, 532., 3795., 'square', 12., '2', 's2e507', 27, 'um', 1., 0., 0., 1., 27, 1, 0, 1, 13)\n", + " (0, 500., 3810., 'square', 12., '2', 's2e508', 28, 'um', 1., 0., 0., 1., 28, 1, 0, 0, 14)\n", + " (0, 532., 3810., 'square', 12., '2', 's2e509', 29, 'um', 1., 0., 0., 1., 29, 1, 0, 1, 14)\n", + " (0, 500., 3825., 'square', 12., '2', 's2e510', 30, 'um', 1., 0., 0., 1., 30, 1, 0, 0, 15)\n", + " (0, 532., 3825., 'square', 12., '2', 's2e511', 31, 'um', 1., 0., 0., 1., 31, 1, 0, 1, 15)\n", + " (0, 500., 3840., 'square', 12., '2', 's2e512', 32, 'um', 1., 0., 0., 1., 32, 1, 0, 2, 0)\n", + " (0, 532., 3840., 'square', 12., '2', 's2e513', 33, 'um', 1., 0., 0., 1., 33, 1, 0, 3, 0)\n", + " (0, 500., 3855., 'square', 12., '2', 's2e514', 34, 'um', 1., 0., 0., 1., 34, 1, 0, 2, 1)\n", + " (0, 532., 3855., 'square', 12., '2', 's2e515', 35, 'um', 1., 0., 0., 1., 35, 1, 0, 3, 1)\n", + " (0, 500., 3870., 'square', 12., '2', 's2e516', 36, 'um', 1., 0., 0., 1., 36, 1, 0, 2, 2)\n", + " (0, 532., 3870., 'square', 12., '2', 's2e517', 37, 'um', 1., 0., 0., 1., 37, 1, 0, 3, 2)\n", + " (0, 500., 3885., 'square', 12., '2', 's2e518', 38, 'um', 1., 0., 0., 1., 38, 1, 0, 2, 3)\n", + " (0, 532., 3885., 'square', 12., '2', 's2e519', 39, 'um', 1., 0., 0., 1., 39, 1, 0, 3, 3)\n", + " (0, 500., 3900., 'square', 12., '2', 's2e520', 40, 'um', 1., 0., 0., 1., 40, 1, 0, 2, 4)\n", + " (0, 532., 3900., 'square', 12., '2', 's2e521', 41, 'um', 1., 0., 0., 1., 41, 1, 0, 3, 4)\n", + " (0, 500., 3915., 'square', 12., '2', 's2e522', 42, 'um', 1., 0., 0., 1., 42, 1, 0, 2, 5)\n", + " (0, 532., 3915., 'square', 12., '2', 's2e523', 43, 'um', 1., 0., 0., 1., 43, 1, 0, 3, 5)\n", + " (0, 500., 3930., 'square', 12., '2', 's2e524', 44, 'um', 1., 0., 0., 1., 44, 1, 0, 2, 6)\n", + " (0, 532., 3930., 'square', 12., '2', 's2e525', 45, 'um', 1., 0., 0., 1., 45, 1, 0, 3, 6)\n", + " (0, 500., 3945., 'square', 12., '2', 's2e526', 46, 'um', 1., 0., 0., 1., 46, 1, 0, 2, 7)\n", + " (0, 532., 3945., 'square', 12., '2', 's2e527', 47, 'um', 1., 0., 0., 1., 47, 1, 0, 3, 7)\n", + " (0, 750., 3600., 'square', 12., '3', 's3e480', 48, 'um', 1., 0., 0., 1., 48, 1, 0, 2, 8)\n", + " (0, 782., 3600., 'square', 12., '3', 's3e481', 49, 'um', 1., 0., 0., 1., 49, 1, 0, 3, 8)\n", + " (0, 750., 3615., 'square', 12., '3', 's3e482', 50, 'um', 1., 0., 0., 1., 50, 1, 0, 2, 9)\n", + " (0, 782., 3615., 'square', 12., '3', 's3e483', 51, 'um', 1., 0., 0., 1., 51, 1, 0, 3, 9)\n", + " (0, 750., 3630., 'square', 12., '3', 's3e484', 52, 'um', 1., 0., 0., 1., 52, 1, 0, 2, 10)\n", + " (0, 782., 3630., 'square', 12., '3', 's3e485', 53, 'um', 1., 0., 0., 1., 53, 1, 0, 3, 10)\n", + " (0, 750., 3645., 'square', 12., '3', 's3e486', 54, 'um', 1., 0., 0., 1., 54, 1, 0, 2, 11)\n", + " (0, 782., 3645., 'square', 12., '3', 's3e487', 55, 'um', 1., 0., 0., 1., 55, 1, 0, 3, 11)\n", + " (0, 750., 3660., 'square', 12., '3', 's3e488', 56, 'um', 1., 0., 0., 1., 56, 1, 0, 2, 12)\n", + " (0, 782., 3660., 'square', 12., '3', 's3e489', 57, 'um', 1., 0., 0., 1., 57, 1, 0, 3, 12)\n", + " (0, 750., 3675., 'square', 12., '3', 's3e490', 58, 'um', 1., 0., 0., 1., 58, 1, 0, 2, 13)\n", + " (0, 782., 3675., 'square', 12., '3', 's3e491', 59, 'um', 1., 0., 0., 1., 59, 1, 0, 3, 13)\n", + " (0, 750., 3690., 'square', 12., '3', 's3e492', 60, 'um', 1., 0., 0., 1., 60, 1, 0, 2, 14)\n", + " (0, 782., 3690., 'square', 12., '3', 's3e493', 61, 'um', 1., 0., 0., 1., 61, 1, 0, 3, 14)\n", + " (0, 750., 3705., 'square', 12., '3', 's3e494', 62, 'um', 1., 0., 0., 1., 62, 1, 0, 2, 15)\n", + " (0, 782., 3705., 'square', 12., '3', 's3e495', 63, 'um', 1., 0., 0., 1., 63, 1, 0, 3, 15)\n", + " (0, 750., 3720., 'square', 12., '3', 's3e496', 64, 'um', 1., 0., 0., 1., 64, 1, 0, 4, 0)\n", + " (0, 782., 3720., 'square', 12., '3', 's3e497', 65, 'um', 1., 0., 0., 1., 65, 1, 0, 5, 0)\n", + " (0, 750., 3735., 'square', 12., '3', 's3e498', 66, 'um', 1., 0., 0., 1., 66, 1, 0, 4, 1)\n", + " (0, 782., 3735., 'square', 12., '3', 's3e499', 67, 'um', 1., 0., 0., 1., 67, 1, 0, 5, 1)\n", + " (0, 750., 3750., 'square', 12., '3', 's3e500', 68, 'um', 1., 0., 0., 1., 68, 1, 0, 4, 2)\n", + " (0, 782., 3750., 'square', 12., '3', 's3e501', 69, 'um', 1., 0., 0., 1., 69, 1, 0, 5, 2)\n", + " (0, 750., 3765., 'square', 12., '3', 's3e502', 70, 'um', 1., 0., 0., 1., 70, 1, 0, 4, 3)\n", + " (0, 782., 3765., 'square', 12., '3', 's3e503', 71, 'um', 1., 0., 0., 1., 71, 1, 0, 5, 3)\n", + " (0, 750., 3780., 'square', 12., '3', 's3e504', 72, 'um', 1., 0., 0., 1., 72, 1, 0, 4, 4)\n", + " (0, 782., 3780., 'square', 12., '3', 's3e505', 73, 'um', 1., 0., 0., 1., 73, 1, 0, 5, 4)\n", + " (0, 750., 3795., 'square', 12., '3', 's3e506', 74, 'um', 1., 0., 0., 1., 74, 1, 0, 4, 5)\n", + " (0, 782., 3795., 'square', 12., '3', 's3e507', 75, 'um', 1., 0., 0., 1., 75, 1, 0, 5, 5)\n", + " (0, 750., 3810., 'square', 12., '3', 's3e508', 76, 'um', 1., 0., 0., 1., 76, 1, 0, 4, 6)\n", + " (0, 782., 3810., 'square', 12., '3', 's3e509', 77, 'um', 1., 0., 0., 1., 77, 1, 0, 5, 6)\n", + " (0, 750., 3825., 'square', 12., '3', 's3e510', 78, 'um', 1., 0., 0., 1., 78, 1, 0, 4, 7)\n", + " (0, 782., 3825., 'square', 12., '3', 's3e511', 79, 'um', 1., 0., 0., 1., 79, 1, 0, 5, 7)\n", + " (0, 750., 3840., 'square', 12., '3', 's3e512', 80, 'um', 1., 0., 0., 1., 80, 1, 0, 4, 8)\n", + " (0, 782., 3840., 'square', 12., '3', 's3e513', 81, 'um', 1., 0., 0., 1., 81, 1, 0, 5, 8)\n", + " (0, 750., 3855., 'square', 12., '3', 's3e514', 82, 'um', 1., 0., 0., 1., 82, 1, 0, 4, 9)\n", + " (0, 782., 3855., 'square', 12., '3', 's3e515', 83, 'um', 1., 0., 0., 1., 83, 1, 0, 5, 9)\n", + " (0, 750., 3870., 'square', 12., '3', 's3e516', 84, 'um', 1., 0., 0., 1., 84, 1, 0, 4, 10)\n", + " (0, 782., 3870., 'square', 12., '3', 's3e517', 85, 'um', 1., 0., 0., 1., 85, 1, 0, 5, 10)\n", + " (0, 750., 3885., 'square', 12., '3', 's3e518', 86, 'um', 1., 0., 0., 1., 86, 1, 0, 4, 11)\n", + " (0, 782., 3885., 'square', 12., '3', 's3e519', 87, 'um', 1., 0., 0., 1., 87, 1, 0, 5, 11)\n", + " (0, 750., 3900., 'square', 12., '3', 's3e520', 88, 'um', 1., 0., 0., 1., 88, 1, 0, 4, 12)\n", + " (0, 782., 3900., 'square', 12., '3', 's3e521', 89, 'um', 1., 0., 0., 1., 89, 1, 0, 5, 12)\n", + " (0, 750., 3915., 'square', 12., '3', 's3e522', 90, 'um', 1., 0., 0., 1., 90, 1, 0, 4, 13)\n", + " (0, 782., 3915., 'square', 12., '3', 's3e523', 91, 'um', 1., 0., 0., 1., 91, 1, 0, 5, 13)\n", + " (0, 750., 3930., 'square', 12., '3', 's3e524', 92, 'um', 1., 0., 0., 1., 92, 1, 0, 4, 14)\n", + " (0, 782., 3930., 'square', 12., '3', 's3e525', 93, 'um', 1., 0., 0., 1., 93, 1, 0, 5, 14)\n", + " (0, 750., 3945., 'square', 12., '3', 's3e526', 94, 'um', 1., 0., 0., 1., 94, 1, 0, 4, 15)\n", + " (0, 782., 3945., 'square', 12., '3', 's3e527', 95, 'um', 1., 0., 0., 1., 95, 1, 0, 5, 15)\n", + " (0, 500., 3960., 'square', 12., '2', 's2e528', 96, 'um', 1., 0., 0., 1., 96, 1, 0, 6, 0)\n", + " (0, 532., 3960., 'square', 12., '2', 's2e529', 97, 'um', 1., 0., 0., 1., 97, 1, 0, 7, 0)\n", + " (0, 500., 3975., 'square', 12., '2', 's2e530', 98, 'um', 1., 0., 0., 1., 98, 1, 0, 6, 1)\n", + " (0, 532., 3975., 'square', 12., '2', 's2e531', 99, 'um', 1., 0., 0., 1., 99, 1, 0, 7, 1)\n", + " (0, 500., 3990., 'square', 12., '2', 's2e532', 100, 'um', 1., 0., 0., 1., 100, 1, 0, 6, 2)\n", + " (0, 532., 3990., 'square', 12., '2', 's2e533', 101, 'um', 1., 0., 0., 1., 101, 1, 0, 7, 2)\n", + " (0, 500., 4005., 'square', 12., '2', 's2e534', 102, 'um', 1., 0., 0., 1., 102, 1, 0, 6, 3)\n", + " (0, 532., 4005., 'square', 12., '2', 's2e535', 103, 'um', 1., 0., 0., 1., 103, 1, 0, 7, 3)\n", + " (0, 500., 4020., 'square', 12., '2', 's2e536', 104, 'um', 1., 0., 0., 1., 104, 1, 0, 6, 4)\n", + " (0, 532., 4020., 'square', 12., '2', 's2e537', 105, 'um', 1., 0., 0., 1., 105, 1, 0, 7, 4)\n", + " (0, 500., 4035., 'square', 12., '2', 's2e538', 106, 'um', 1., 0., 0., 1., 106, 1, 0, 6, 5)\n", + " (0, 532., 4035., 'square', 12., '2', 's2e539', 107, 'um', 1., 0., 0., 1., 107, 1, 0, 7, 5)\n", + " (0, 500., 4050., 'square', 12., '2', 's2e540', 108, 'um', 1., 0., 0., 1., 108, 1, 0, 6, 6)\n", + " (0, 532., 4050., 'square', 12., '2', 's2e541', 109, 'um', 1., 0., 0., 1., 109, 1, 0, 7, 6)\n", + " (0, 500., 4065., 'square', 12., '2', 's2e542', 110, 'um', 1., 0., 0., 1., 110, 1, 0, 6, 7)\n", + " (0, 532., 4065., 'square', 12., '2', 's2e543', 111, 'um', 1., 0., 0., 1., 111, 1, 0, 7, 7)\n", + " (0, 500., 4080., 'square', 12., '2', 's2e544', 112, 'um', 1., 0., 0., 1., 112, 1, 0, 6, 8)\n", + " (0, 532., 4080., 'square', 12., '2', 's2e545', 113, 'um', 1., 0., 0., 1., 113, 1, 0, 7, 8)\n", + " (0, 500., 4095., 'square', 12., '2', 's2e546', 114, 'um', 1., 0., 0., 1., 114, 1, 0, 6, 9)\n", + " (0, 532., 4095., 'square', 12., '2', 's2e547', 115, 'um', 1., 0., 0., 1., 115, 1, 0, 7, 9)\n", + " (0, 500., 4110., 'square', 12., '2', 's2e548', 116, 'um', 1., 0., 0., 1., 116, 1, 0, 6, 10)\n", + " (0, 532., 4110., 'square', 12., '2', 's2e549', 117, 'um', 1., 0., 0., 1., 117, 1, 0, 7, 10)\n", + " (0, 500., 4125., 'square', 12., '2', 's2e550', 118, 'um', 1., 0., 0., 1., 118, 1, 0, 6, 11)\n", + " (0, 532., 4125., 'square', 12., '2', 's2e551', 119, 'um', 1., 0., 0., 1., 119, 1, 0, 7, 11)\n", + " (0, 500., 4140., 'square', 12., '2', 's2e552', 120, 'um', 1., 0., 0., 1., 120, 1, 0, 6, 12)\n", + " (0, 532., 4140., 'square', 12., '2', 's2e553', 121, 'um', 1., 0., 0., 1., 121, 1, 0, 7, 12)\n", + " (0, 500., 4155., 'square', 12., '2', 's2e554', 122, 'um', 1., 0., 0., 1., 122, 1, 0, 6, 13)\n", + " (0, 532., 4155., 'square', 12., '2', 's2e555', 123, 'um', 1., 0., 0., 1., 123, 1, 0, 7, 13)\n", + " (0, 500., 4170., 'square', 12., '2', 's2e556', 124, 'um', 1., 0., 0., 1., 124, 1, 0, 6, 14)\n", + " (0, 532., 4170., 'square', 12., '2', 's2e557', 125, 'um', 1., 0., 0., 1., 125, 1, 0, 7, 14)\n", + " (0, 500., 4185., 'square', 12., '2', 's2e558', 126, 'um', 1., 0., 0., 1., 126, 1, 0, 6, 15)\n", + " (0, 532., 4185., 'square', 12., '2', 's2e559', 127, 'um', 1., 0., 0., 1., 127, 1, 0, 7, 15)\n", + " (0, 500., 4200., 'square', 12., '2', 's2e560', 128, 'um', 1., 0., 0., 1., 128, 1, 0, 8, 0)\n", + " (0, 532., 4200., 'square', 12., '2', 's2e561', 129, 'um', 1., 0., 0., 1., 129, 1, 0, 9, 0)\n", + " (0, 500., 4215., 'square', 12., '2', 's2e562', 130, 'um', 1., 0., 0., 1., 130, 1, 0, 8, 1)\n", + " (0, 532., 4215., 'square', 12., '2', 's2e563', 131, 'um', 1., 0., 0., 1., 131, 1, 0, 9, 1)\n", + " (0, 500., 4230., 'square', 12., '2', 's2e564', 132, 'um', 1., 0., 0., 1., 132, 1, 0, 8, 2)\n", + " (0, 532., 4230., 'square', 12., '2', 's2e565', 133, 'um', 1., 0., 0., 1., 133, 1, 0, 9, 2)\n", + " (0, 500., 4245., 'square', 12., '2', 's2e566', 134, 'um', 1., 0., 0., 1., 134, 1, 0, 8, 3)\n", + " (0, 532., 4245., 'square', 12., '2', 's2e567', 135, 'um', 1., 0., 0., 1., 135, 1, 0, 9, 3)\n", + " (0, 500., 4260., 'square', 12., '2', 's2e568', 136, 'um', 1., 0., 0., 1., 136, 1, 0, 8, 4)\n", + " (0, 532., 4260., 'square', 12., '2', 's2e569', 137, 'um', 1., 0., 0., 1., 137, 1, 0, 9, 4)\n", + " (0, 500., 4275., 'square', 12., '2', 's2e570', 138, 'um', 1., 0., 0., 1., 138, 1, 0, 8, 5)\n", + " (0, 532., 4275., 'square', 12., '2', 's2e571', 139, 'um', 1., 0., 0., 1., 139, 1, 0, 9, 5)\n", + " (0, 500., 4290., 'square', 12., '2', 's2e572', 140, 'um', 1., 0., 0., 1., 140, 1, 0, 8, 6)\n", + " (0, 532., 4290., 'square', 12., '2', 's2e573', 141, 'um', 1., 0., 0., 1., 141, 1, 0, 9, 6)\n", + " (0, 500., 4305., 'square', 12., '2', 's2e574', 142, 'um', 1., 0., 0., 1., 142, 1, 0, 8, 7)\n", + " (0, 532., 4305., 'square', 12., '2', 's2e575', 143, 'um', 1., 0., 0., 1., 143, 1, 0, 9, 7)\n", + " (0, 750., 3960., 'square', 12., '3', 's3e528', 144, 'um', 1., 0., 0., 1., 144, 1, 0, 8, 8)\n", + " (0, 782., 3960., 'square', 12., '3', 's3e529', 145, 'um', 1., 0., 0., 1., 145, 1, 0, 9, 8)\n", + " (0, 750., 3975., 'square', 12., '3', 's3e530', 146, 'um', 1., 0., 0., 1., 146, 1, 0, 8, 9)\n", + " (0, 782., 3975., 'square', 12., '3', 's3e531', 147, 'um', 1., 0., 0., 1., 147, 1, 0, 9, 9)\n", + " (0, 750., 3990., 'square', 12., '3', 's3e532', 148, 'um', 1., 0., 0., 1., 148, 1, 0, 8, 10)\n", + " (0, 782., 3990., 'square', 12., '3', 's3e533', 149, 'um', 1., 0., 0., 1., 149, 1, 0, 9, 10)\n", + " (0, 750., 4005., 'square', 12., '3', 's3e534', 150, 'um', 1., 0., 0., 1., 150, 1, 0, 8, 11)\n", + " (0, 782., 4005., 'square', 12., '3', 's3e535', 151, 'um', 1., 0., 0., 1., 151, 1, 0, 9, 11)\n", + " (0, 750., 4020., 'square', 12., '3', 's3e536', 152, 'um', 1., 0., 0., 1., 152, 1, 0, 8, 12)\n", + " (0, 782., 4020., 'square', 12., '3', 's3e537', 153, 'um', 1., 0., 0., 1., 153, 1, 0, 9, 12)\n", + " (0, 750., 4035., 'square', 12., '3', 's3e538', 154, 'um', 1., 0., 0., 1., 154, 1, 0, 8, 13)\n", + " (0, 782., 4035., 'square', 12., '3', 's3e539', 155, 'um', 1., 0., 0., 1., 155, 1, 0, 9, 13)\n", + " (0, 750., 4050., 'square', 12., '3', 's3e540', 156, 'um', 1., 0., 0., 1., 156, 1, 0, 8, 14)\n", + " (0, 782., 4050., 'square', 12., '3', 's3e541', 157, 'um', 1., 0., 0., 1., 157, 1, 0, 9, 14)\n", + " (0, 750., 4065., 'square', 12., '3', 's3e542', 158, 'um', 1., 0., 0., 1., 158, 1, 0, 8, 15)\n", + " (0, 782., 4065., 'square', 12., '3', 's3e543', 159, 'um', 1., 0., 0., 1., 159, 1, 0, 9, 15)\n", + " (0, 750., 4080., 'square', 12., '3', 's3e544', 160, 'um', 1., 0., 0., 1., 160, 1, 0, 10, 0)\n", + " (0, 782., 4080., 'square', 12., '3', 's3e545', 161, 'um', 1., 0., 0., 1., 161, 1, 0, 11, 0)\n", + " (0, 750., 4095., 'square', 12., '3', 's3e546', 162, 'um', 1., 0., 0., 1., 162, 1, 0, 10, 1)\n", + " (0, 782., 4095., 'square', 12., '3', 's3e547', 163, 'um', 1., 0., 0., 1., 163, 1, 0, 11, 1)\n", + " (0, 750., 4110., 'square', 12., '3', 's3e548', 164, 'um', 1., 0., 0., 1., 164, 1, 0, 10, 2)\n", + " (0, 782., 4110., 'square', 12., '3', 's3e549', 165, 'um', 1., 0., 0., 1., 165, 1, 0, 11, 2)\n", + " (0, 750., 4125., 'square', 12., '3', 's3e550', 166, 'um', 1., 0., 0., 1., 166, 1, 0, 10, 3)\n", + " (0, 782., 4125., 'square', 12., '3', 's3e551', 167, 'um', 1., 0., 0., 1., 167, 1, 0, 11, 3)\n", + " (0, 750., 4140., 'square', 12., '3', 's3e552', 168, 'um', 1., 0., 0., 1., 168, 1, 0, 10, 4)\n", + " (0, 782., 4140., 'square', 12., '3', 's3e553', 169, 'um', 1., 0., 0., 1., 169, 1, 0, 11, 4)\n", + " (0, 750., 4155., 'square', 12., '3', 's3e554', 170, 'um', 1., 0., 0., 1., 170, 1, 0, 10, 5)\n", + " (0, 782., 4155., 'square', 12., '3', 's3e555', 171, 'um', 1., 0., 0., 1., 171, 1, 0, 11, 5)\n", + " (0, 750., 4170., 'square', 12., '3', 's3e556', 172, 'um', 1., 0., 0., 1., 172, 1, 0, 10, 6)\n", + " (0, 782., 4170., 'square', 12., '3', 's3e557', 173, 'um', 1., 0., 0., 1., 173, 1, 0, 11, 6)\n", + " (0, 750., 4185., 'square', 12., '3', 's3e558', 174, 'um', 1., 0., 0., 1., 174, 1, 0, 10, 7)\n", + " (0, 782., 4185., 'square', 12., '3', 's3e559', 175, 'um', 1., 0., 0., 1., 175, 1, 0, 11, 7)\n", + " (0, 750., 4200., 'square', 12., '3', 's3e560', 176, 'um', 1., 0., 0., 1., 176, 1, 0, 10, 8)\n", + " (0, 782., 4200., 'square', 12., '3', 's3e561', 177, 'um', 1., 0., 0., 1., 177, 1, 0, 11, 8)\n", + " (0, 750., 4215., 'square', 12., '3', 's3e562', 178, 'um', 1., 0., 0., 1., 178, 1, 0, 10, 9)\n", + " (0, 782., 4215., 'square', 12., '3', 's3e563', 179, 'um', 1., 0., 0., 1., 179, 1, 0, 11, 9)\n", + " (0, 750., 4230., 'square', 12., '3', 's3e564', 180, 'um', 1., 0., 0., 1., 180, 1, 0, 10, 10)\n", + " (0, 782., 4230., 'square', 12., '3', 's3e565', 181, 'um', 1., 0., 0., 1., 181, 1, 0, 11, 10)\n", + " (0, 750., 4245., 'square', 12., '3', 's3e566', 182, 'um', 1., 0., 0., 1., 182, 1, 0, 10, 11)\n", + " (0, 782., 4245., 'square', 12., '3', 's3e567', 183, 'um', 1., 0., 0., 1., 183, 1, 0, 11, 11)\n", + " (0, 750., 4260., 'square', 12., '3', 's3e568', 184, 'um', 1., 0., 0., 1., 184, 1, 0, 10, 12)\n", + " (0, 782., 4260., 'square', 12., '3', 's3e569', 185, 'um', 1., 0., 0., 1., 185, 1, 0, 11, 12)\n", + " (0, 750., 4275., 'square', 12., '3', 's3e570', 186, 'um', 1., 0., 0., 1., 186, 1, 0, 10, 13)\n", + " (0, 782., 4275., 'square', 12., '3', 's3e571', 187, 'um', 1., 0., 0., 1., 187, 1, 0, 11, 13)\n", + " (0, 750., 4290., 'square', 12., '3', 's3e572', 188, 'um', 1., 0., 0., 1., 188, 1, 0, 10, 14)\n", + " (0, 782., 4290., 'square', 12., '3', 's3e573', 189, 'um', 1., 0., 0., 1., 189, 1, 0, 11, 14)\n", + " (0, 750., 4305., 'square', 12., '3', 's3e574', 190, 'um', 1., 0., 0., 1., 190, 1, 0, 10, 15)\n", + " (0, 782., 4305., 'square', 12., '3', 's3e575', 191, 'um', 1., 0., 0., 1., 191, 1, 0, 11, 15)\n", + " (0, 500., 2880., 'square', 12., '2', 's2e384', 192, 'um', 1., 0., 0., 1., 192, 1, 0, 12, 0)\n", + " (0, 532., 2880., 'square', 12., '2', 's2e385', 193, 'um', 1., 0., 0., 1., 193, 1, 0, 13, 0)\n", + " (0, 500., 2895., 'square', 12., '2', 's2e386', 194, 'um', 1., 0., 0., 1., 194, 1, 0, 12, 1)\n", + " (0, 532., 2895., 'square', 12., '2', 's2e387', 195, 'um', 1., 0., 0., 1., 195, 1, 0, 13, 1)\n", + " (0, 500., 2910., 'square', 12., '2', 's2e388', 196, 'um', 1., 0., 0., 1., 196, 1, 0, 12, 2)\n", + " (0, 532., 2910., 'square', 12., '2', 's2e389', 197, 'um', 1., 0., 0., 1., 197, 1, 0, 13, 2)\n", + " (0, 500., 2925., 'square', 12., '2', 's2e390', 198, 'um', 1., 0., 0., 1., 198, 1, 0, 12, 3)\n", + " (0, 532., 2925., 'square', 12., '2', 's2e391', 199, 'um', 1., 0., 0., 1., 199, 1, 0, 13, 3)\n", + " (0, 500., 2940., 'square', 12., '2', 's2e392', 200, 'um', 1., 0., 0., 1., 200, 1, 0, 12, 4)\n", + " (0, 532., 2940., 'square', 12., '2', 's2e393', 201, 'um', 1., 0., 0., 1., 201, 1, 0, 13, 4)\n", + " (0, 500., 2955., 'square', 12., '2', 's2e394', 202, 'um', 1., 0., 0., 1., 202, 1, 0, 12, 5)\n", + " (0, 532., 2955., 'square', 12., '2', 's2e395', 203, 'um', 1., 0., 0., 1., 203, 1, 0, 13, 5)\n", + " (0, 500., 2970., 'square', 12., '2', 's2e396', 204, 'um', 1., 0., 0., 1., 204, 1, 0, 12, 6)\n", + " (0, 532., 2970., 'square', 12., '2', 's2e397', 205, 'um', 1., 0., 0., 1., 205, 1, 0, 13, 6)\n", + " (0, 500., 2985., 'square', 12., '2', 's2e398', 206, 'um', 1., 0., 0., 1., 206, 1, 0, 12, 7)\n", + " (0, 532., 2985., 'square', 12., '2', 's2e399', 207, 'um', 1., 0., 0., 1., 207, 1, 0, 13, 7)\n", + " (0, 500., 3000., 'square', 12., '2', 's2e400', 208, 'um', 1., 0., 0., 1., 208, 1, 0, 12, 8)\n", + " (0, 532., 3000., 'square', 12., '2', 's2e401', 209, 'um', 1., 0., 0., 1., 209, 1, 0, 13, 8)\n", + " (0, 500., 3015., 'square', 12., '2', 's2e402', 210, 'um', 1., 0., 0., 1., 210, 1, 0, 12, 9)\n", + " (0, 532., 3015., 'square', 12., '2', 's2e403', 211, 'um', 1., 0., 0., 1., 211, 1, 0, 13, 9)\n", + " (0, 500., 3030., 'square', 12., '2', 's2e404', 212, 'um', 1., 0., 0., 1., 212, 1, 0, 12, 10)\n", + " (0, 532., 3030., 'square', 12., '2', 's2e405', 213, 'um', 1., 0., 0., 1., 213, 1, 0, 13, 10)\n", + " (0, 500., 3045., 'square', 12., '2', 's2e406', 214, 'um', 1., 0., 0., 1., 214, 1, 0, 12, 11)\n", + " (0, 532., 3045., 'square', 12., '2', 's2e407', 215, 'um', 1., 0., 0., 1., 215, 1, 0, 13, 11)\n", + " (0, 500., 3060., 'square', 12., '2', 's2e408', 216, 'um', 1., 0., 0., 1., 216, 1, 0, 12, 12)\n", + " (0, 532., 3060., 'square', 12., '2', 's2e409', 217, 'um', 1., 0., 0., 1., 217, 1, 0, 13, 12)\n", + " (0, 500., 3075., 'square', 12., '2', 's2e410', 218, 'um', 1., 0., 0., 1., 218, 1, 0, 12, 13)\n", + " (0, 532., 3075., 'square', 12., '2', 's2e411', 219, 'um', 1., 0., 0., 1., 219, 1, 0, 13, 13)\n", + " (0, 500., 3090., 'square', 12., '2', 's2e412', 220, 'um', 1., 0., 0., 1., 220, 1, 0, 12, 14)\n", + " (0, 532., 3090., 'square', 12., '2', 's2e413', 221, 'um', 1., 0., 0., 1., 221, 1, 0, 13, 14)\n", + " (0, 500., 3105., 'square', 12., '2', 's2e414', 222, 'um', 1., 0., 0., 1., 222, 1, 0, 12, 15)\n", + " (0, 532., 3105., 'square', 12., '2', 's2e415', 223, 'um', 1., 0., 0., 1., 223, 1, 0, 13, 15)\n", + " (0, 500., 3120., 'square', 12., '2', 's2e416', 224, 'um', 1., 0., 0., 1., 224, 1, 0, 14, 0)\n", + " (0, 532., 3120., 'square', 12., '2', 's2e417', 225, 'um', 1., 0., 0., 1., 225, 1, 0, 15, 0)\n", + " (0, 500., 3135., 'square', 12., '2', 's2e418', 226, 'um', 1., 0., 0., 1., 226, 1, 0, 14, 1)\n", + " (0, 532., 3135., 'square', 12., '2', 's2e419', 227, 'um', 1., 0., 0., 1., 227, 1, 0, 15, 1)\n", + " (0, 500., 3150., 'square', 12., '2', 's2e420', 228, 'um', 1., 0., 0., 1., 228, 1, 0, 14, 2)\n", + " (0, 532., 3150., 'square', 12., '2', 's2e421', 229, 'um', 1., 0., 0., 1., 229, 1, 0, 15, 2)\n", + " (0, 500., 3165., 'square', 12., '2', 's2e422', 230, 'um', 1., 0., 0., 1., 230, 1, 0, 14, 3)\n", + " (0, 532., 3165., 'square', 12., '2', 's2e423', 231, 'um', 1., 0., 0., 1., 231, 1, 0, 15, 3)\n", + " (0, 500., 3180., 'square', 12., '2', 's2e424', 232, 'um', 1., 0., 0., 1., 232, 1, 0, 14, 4)\n", + " (0, 532., 3180., 'square', 12., '2', 's2e425', 233, 'um', 1., 0., 0., 1., 233, 1, 0, 15, 4)\n", + " (0, 500., 3195., 'square', 12., '2', 's2e426', 234, 'um', 1., 0., 0., 1., 234, 1, 0, 14, 5)\n", + " (0, 532., 3195., 'square', 12., '2', 's2e427', 235, 'um', 1., 0., 0., 1., 235, 1, 0, 15, 5)\n", + " (0, 500., 3210., 'square', 12., '2', 's2e428', 236, 'um', 1., 0., 0., 1., 236, 1, 0, 14, 6)\n", + " (0, 532., 3210., 'square', 12., '2', 's2e429', 237, 'um', 1., 0., 0., 1., 237, 1, 0, 15, 6)\n", + " (0, 500., 3225., 'square', 12., '2', 's2e430', 238, 'um', 1., 0., 0., 1., 238, 1, 0, 14, 7)\n", + " (0, 532., 3225., 'square', 12., '2', 's2e431', 239, 'um', 1., 0., 0., 1., 239, 1, 0, 15, 7)\n", + " (0, 750., 2880., 'square', 12., '3', 's3e384', 240, 'um', 1., 0., 0., 1., 240, 1, 0, 14, 8)\n", + " (0, 782., 2880., 'square', 12., '3', 's3e385', 241, 'um', 1., 0., 0., 1., 241, 1, 0, 15, 8)\n", + " (0, 750., 2895., 'square', 12., '3', 's3e386', 242, 'um', 1., 0., 0., 1., 242, 1, 0, 14, 9)\n", + " (0, 782., 2895., 'square', 12., '3', 's3e387', 243, 'um', 1., 0., 0., 1., 243, 1, 0, 15, 9)\n", + " (0, 750., 2910., 'square', 12., '3', 's3e388', 244, 'um', 1., 0., 0., 1., 244, 1, 0, 14, 10)\n", + " (0, 782., 2910., 'square', 12., '3', 's3e389', 245, 'um', 1., 0., 0., 1., 245, 1, 0, 15, 10)\n", + " (0, 750., 2925., 'square', 12., '3', 's3e390', 246, 'um', 1., 0., 0., 1., 246, 1, 0, 14, 11)\n", + " (0, 782., 2925., 'square', 12., '3', 's3e391', 247, 'um', 1., 0., 0., 1., 247, 1, 0, 15, 11)\n", + " (0, 750., 2940., 'square', 12., '3', 's3e392', 248, 'um', 1., 0., 0., 1., 248, 1, 0, 14, 12)\n", + " (0, 782., 2940., 'square', 12., '3', 's3e393', 249, 'um', 1., 0., 0., 1., 249, 1, 0, 15, 12)\n", + " (0, 750., 2955., 'square', 12., '3', 's3e394', 250, 'um', 1., 0., 0., 1., 250, 1, 0, 14, 13)\n", + " (0, 782., 2955., 'square', 12., '3', 's3e395', 251, 'um', 1., 0., 0., 1., 251, 1, 0, 15, 13)\n", + " (0, 750., 2970., 'square', 12., '3', 's3e396', 252, 'um', 1., 0., 0., 1., 252, 1, 0, 14, 14)\n", + " (0, 782., 2970., 'square', 12., '3', 's3e397', 253, 'um', 1., 0., 0., 1., 253, 1, 0, 15, 14)\n", + " (0, 750., 2985., 'square', 12., '3', 's3e398', 254, 'um', 1., 0., 0., 1., 254, 1, 0, 14, 15)\n", + " (0, 782., 2985., 'square', 12., '3', 's3e399', 255, 'um', 1., 0., 0., 1., 255, 1, 0, 15, 15)\n", + " (0, 750., 3000., 'square', 12., '3', 's3e400', 256, 'um', 1., 0., 0., 1., 256, 1, 0, 16, 0)\n", + " (0, 782., 3000., 'square', 12., '3', 's3e401', 257, 'um', 1., 0., 0., 1., 257, 1, 0, 17, 0)\n", + " (0, 750., 3015., 'square', 12., '3', 's3e402', 258, 'um', 1., 0., 0., 1., 258, 1, 0, 16, 1)\n", + " (0, 782., 3015., 'square', 12., '3', 's3e403', 259, 'um', 1., 0., 0., 1., 259, 1, 0, 17, 1)\n", + " (0, 750., 3030., 'square', 12., '3', 's3e404', 260, 'um', 1., 0., 0., 1., 260, 1, 0, 16, 2)\n", + " (0, 782., 3030., 'square', 12., '3', 's3e405', 261, 'um', 1., 0., 0., 1., 261, 1, 0, 17, 2)\n", + " (0, 750., 3045., 'square', 12., '3', 's3e406', 262, 'um', 1., 0., 0., 1., 262, 1, 0, 16, 3)\n", + " (0, 782., 3045., 'square', 12., '3', 's3e407', 263, 'um', 1., 0., 0., 1., 263, 1, 0, 17, 3)\n", + " (0, 750., 3060., 'square', 12., '3', 's3e408', 264, 'um', 1., 0., 0., 1., 264, 1, 0, 16, 4)\n", + " (0, 782., 3060., 'square', 12., '3', 's3e409', 265, 'um', 1., 0., 0., 1., 265, 1, 0, 17, 4)\n", + " (0, 750., 3075., 'square', 12., '3', 's3e410', 266, 'um', 1., 0., 0., 1., 266, 1, 0, 16, 5)\n", + " (0, 782., 3075., 'square', 12., '3', 's3e411', 267, 'um', 1., 0., 0., 1., 267, 1, 0, 17, 5)\n", + " (0, 750., 3090., 'square', 12., '3', 's3e412', 268, 'um', 1., 0., 0., 1., 268, 1, 0, 16, 6)\n", + " (0, 782., 3090., 'square', 12., '3', 's3e413', 269, 'um', 1., 0., 0., 1., 269, 1, 0, 17, 6)\n", + " (0, 750., 3105., 'square', 12., '3', 's3e414', 270, 'um', 1., 0., 0., 1., 270, 1, 0, 16, 7)\n", + " (0, 782., 3105., 'square', 12., '3', 's3e415', 271, 'um', 1., 0., 0., 1., 271, 1, 0, 17, 7)\n", + " (0, 750., 3120., 'square', 12., '3', 's3e416', 272, 'um', 1., 0., 0., 1., 272, 1, 0, 16, 8)\n", + " (0, 782., 3120., 'square', 12., '3', 's3e417', 273, 'um', 1., 0., 0., 1., 273, 1, 0, 17, 8)\n", + " (0, 750., 3135., 'square', 12., '3', 's3e418', 274, 'um', 1., 0., 0., 1., 274, 1, 0, 16, 9)\n", + " (0, 782., 3135., 'square', 12., '3', 's3e419', 275, 'um', 1., 0., 0., 1., 275, 1, 0, 17, 9)\n", + " (0, 750., 3150., 'square', 12., '3', 's3e420', 276, 'um', 1., 0., 0., 1., 276, 1, 0, 16, 10)\n", + " (0, 782., 3150., 'square', 12., '3', 's3e421', 277, 'um', 1., 0., 0., 1., 277, 1, 0, 17, 10)\n", + " (0, 750., 3165., 'square', 12., '3', 's3e422', 278, 'um', 1., 0., 0., 1., 278, 1, 0, 16, 11)\n", + " (0, 782., 3165., 'square', 12., '3', 's3e423', 279, 'um', 1., 0., 0., 1., 279, 1, 0, 17, 11)\n", + " (0, 750., 3180., 'square', 12., '3', 's3e424', 280, 'um', 1., 0., 0., 1., 280, 1, 0, 16, 12)\n", + " (0, 782., 3180., 'square', 12., '3', 's3e425', 281, 'um', 1., 0., 0., 1., 281, 1, 0, 17, 12)\n", + " (0, 750., 3195., 'square', 12., '3', 's3e426', 282, 'um', 1., 0., 0., 1., 282, 1, 0, 16, 13)\n", + " (0, 782., 3195., 'square', 12., '3', 's3e427', 283, 'um', 1., 0., 0., 1., 283, 1, 0, 17, 13)\n", + " (0, 750., 3210., 'square', 12., '3', 's3e428', 284, 'um', 1., 0., 0., 1., 284, 1, 0, 16, 14)\n", + " (0, 782., 3210., 'square', 12., '3', 's3e429', 285, 'um', 1., 0., 0., 1., 285, 1, 0, 17, 14)\n", + " (0, 750., 3225., 'square', 12., '3', 's3e430', 286, 'um', 1., 0., 0., 1., 286, 1, 0, 16, 15)\n", + " (0, 782., 3225., 'square', 12., '3', 's3e431', 287, 'um', 1., 0., 0., 1., 287, 1, 0, 17, 15)\n", + " (0, 500., 3240., 'square', 12., '2', 's2e432', 288, 'um', 1., 0., 0., 1., 288, 1, 0, 18, 0)\n", + " (0, 532., 3240., 'square', 12., '2', 's2e433', 289, 'um', 1., 0., 0., 1., 289, 1, 0, 19, 0)\n", + " (0, 500., 3255., 'square', 12., '2', 's2e434', 290, 'um', 1., 0., 0., 1., 290, 1, 0, 18, 1)\n", + " (0, 532., 3255., 'square', 12., '2', 's2e435', 291, 'um', 1., 0., 0., 1., 291, 1, 0, 19, 1)\n", + " (0, 500., 3270., 'square', 12., '2', 's2e436', 292, 'um', 1., 0., 0., 1., 292, 1, 0, 18, 2)\n", + " (0, 532., 3270., 'square', 12., '2', 's2e437', 293, 'um', 1., 0., 0., 1., 293, 1, 0, 19, 2)\n", + " (0, 500., 3285., 'square', 12., '2', 's2e438', 294, 'um', 1., 0., 0., 1., 294, 1, 0, 18, 3)\n", + " (0, 532., 3285., 'square', 12., '2', 's2e439', 295, 'um', 1., 0., 0., 1., 295, 1, 0, 19, 3)\n", + " (0, 500., 3300., 'square', 12., '2', 's2e440', 296, 'um', 1., 0., 0., 1., 296, 1, 0, 18, 4)\n", + " (0, 532., 3300., 'square', 12., '2', 's2e441', 297, 'um', 1., 0., 0., 1., 297, 1, 0, 19, 4)\n", + " (0, 500., 3315., 'square', 12., '2', 's2e442', 298, 'um', 1., 0., 0., 1., 298, 1, 0, 18, 5)\n", + " (0, 532., 3315., 'square', 12., '2', 's2e443', 299, 'um', 1., 0., 0., 1., 299, 1, 0, 19, 5)\n", + " (0, 500., 3330., 'square', 12., '2', 's2e444', 300, 'um', 1., 0., 0., 1., 300, 1, 0, 18, 6)\n", + " (0, 532., 3330., 'square', 12., '2', 's2e445', 301, 'um', 1., 0., 0., 1., 301, 1, 0, 19, 6)\n", + " (0, 500., 3345., 'square', 12., '2', 's2e446', 302, 'um', 1., 0., 0., 1., 302, 1, 0, 18, 7)\n", + " (0, 532., 3345., 'square', 12., '2', 's2e447', 303, 'um', 1., 0., 0., 1., 303, 1, 0, 19, 7)\n", + " (0, 500., 3360., 'square', 12., '2', 's2e448', 304, 'um', 1., 0., 0., 1., 304, 1, 0, 18, 8)\n", + " (0, 532., 3360., 'square', 12., '2', 's2e449', 305, 'um', 1., 0., 0., 1., 305, 1, 0, 19, 8)\n", + " (0, 500., 3375., 'square', 12., '2', 's2e450', 306, 'um', 1., 0., 0., 1., 306, 1, 0, 18, 9)\n", + " (0, 532., 3375., 'square', 12., '2', 's2e451', 307, 'um', 1., 0., 0., 1., 307, 1, 0, 19, 9)\n", + " (0, 500., 3390., 'square', 12., '2', 's2e452', 308, 'um', 1., 0., 0., 1., 308, 1, 0, 18, 10)\n", + " (0, 532., 3390., 'square', 12., '2', 's2e453', 309, 'um', 1., 0., 0., 1., 309, 1, 0, 19, 10)\n", + " (0, 500., 3405., 'square', 12., '2', 's2e454', 310, 'um', 1., 0., 0., 1., 310, 1, 0, 18, 11)\n", + " (0, 532., 3405., 'square', 12., '2', 's2e455', 311, 'um', 1., 0., 0., 1., 311, 1, 0, 19, 11)\n", + " (0, 500., 3420., 'square', 12., '2', 's2e456', 312, 'um', 1., 0., 0., 1., 312, 1, 0, 18, 12)\n", + " (0, 532., 3420., 'square', 12., '2', 's2e457', 313, 'um', 1., 0., 0., 1., 313, 1, 0, 19, 12)\n", + " (0, 500., 3435., 'square', 12., '2', 's2e458', 314, 'um', 1., 0., 0., 1., 314, 1, 0, 18, 13)\n", + " (0, 532., 3435., 'square', 12., '2', 's2e459', 315, 'um', 1., 0., 0., 1., 315, 1, 0, 19, 13)\n", + " (0, 500., 3450., 'square', 12., '2', 's2e460', 316, 'um', 1., 0., 0., 1., 316, 1, 0, 18, 14)\n", + " (0, 532., 3450., 'square', 12., '2', 's2e461', 317, 'um', 1., 0., 0., 1., 317, 1, 0, 19, 14)\n", + " (0, 500., 3465., 'square', 12., '2', 's2e462', 318, 'um', 1., 0., 0., 1., 318, 1, 0, 18, 15)\n", + " (0, 532., 3465., 'square', 12., '2', 's2e463', 319, 'um', 1., 0., 0., 1., 319, 1, 0, 19, 15)\n", + " (0, 500., 3480., 'square', 12., '2', 's2e464', 320, 'um', 1., 0., 0., 1., 320, 1, 0, 20, 0)\n", + " (0, 532., 3480., 'square', 12., '2', 's2e465', 321, 'um', 1., 0., 0., 1., 321, 1, 0, 21, 0)\n", + " (0, 500., 3495., 'square', 12., '2', 's2e466', 322, 'um', 1., 0., 0., 1., 322, 1, 0, 20, 1)\n", + " (0, 532., 3495., 'square', 12., '2', 's2e467', 323, 'um', 1., 0., 0., 1., 323, 1, 0, 21, 1)\n", + " (0, 500., 3510., 'square', 12., '2', 's2e468', 324, 'um', 1., 0., 0., 1., 324, 1, 0, 20, 2)\n", + " (0, 532., 3510., 'square', 12., '2', 's2e469', 325, 'um', 1., 0., 0., 1., 325, 1, 0, 21, 2)\n", + " (0, 500., 3525., 'square', 12., '2', 's2e470', 326, 'um', 1., 0., 0., 1., 326, 1, 0, 20, 3)\n", + " (0, 532., 3525., 'square', 12., '2', 's2e471', 327, 'um', 1., 0., 0., 1., 327, 1, 0, 21, 3)\n", + " (0, 500., 3540., 'square', 12., '2', 's2e472', 328, 'um', 1., 0., 0., 1., 328, 1, 0, 20, 4)\n", + " (0, 532., 3540., 'square', 12., '2', 's2e473', 329, 'um', 1., 0., 0., 1., 329, 1, 0, 21, 4)\n", + " (0, 500., 3555., 'square', 12., '2', 's2e474', 330, 'um', 1., 0., 0., 1., 330, 1, 0, 20, 5)\n", + " (0, 532., 3555., 'square', 12., '2', 's2e475', 331, 'um', 1., 0., 0., 1., 331, 1, 0, 21, 5)\n", + " (0, 500., 3570., 'square', 12., '2', 's2e476', 332, 'um', 1., 0., 0., 1., 332, 1, 0, 20, 6)\n", + " (0, 532., 3570., 'square', 12., '2', 's2e477', 333, 'um', 1., 0., 0., 1., 333, 1, 0, 21, 6)\n", + " (0, 500., 3585., 'square', 12., '2', 's2e478', 334, 'um', 1., 0., 0., 1., 334, 1, 0, 20, 7)\n", + " (0, 532., 3585., 'square', 12., '2', 's2e479', 335, 'um', 1., 0., 0., 1., 335, 1, 0, 21, 7)\n", + " (0, 750., 3240., 'square', 12., '3', 's3e432', 336, 'um', 1., 0., 0., 1., 336, 1, 0, 20, 8)\n", + " (0, 782., 3240., 'square', 12., '3', 's3e433', 337, 'um', 1., 0., 0., 1., 337, 1, 0, 21, 8)\n", + " (0, 750., 3255., 'square', 12., '3', 's3e434', 338, 'um', 1., 0., 0., 1., 338, 1, 0, 20, 9)\n", + " (0, 782., 3255., 'square', 12., '3', 's3e435', 339, 'um', 1., 0., 0., 1., 339, 1, 0, 21, 9)\n", + " (0, 750., 3270., 'square', 12., '3', 's3e436', 340, 'um', 1., 0., 0., 1., 340, 1, 0, 20, 10)\n", + " (0, 782., 3270., 'square', 12., '3', 's3e437', 341, 'um', 1., 0., 0., 1., 341, 1, 0, 21, 10)\n", + " (0, 750., 3285., 'square', 12., '3', 's3e438', 342, 'um', 1., 0., 0., 1., 342, 1, 0, 20, 11)\n", + " (0, 782., 3285., 'square', 12., '3', 's3e439', 343, 'um', 1., 0., 0., 1., 343, 1, 0, 21, 11)\n", + " (0, 750., 3300., 'square', 12., '3', 's3e440', 344, 'um', 1., 0., 0., 1., 344, 1, 0, 20, 12)\n", + " (0, 782., 3300., 'square', 12., '3', 's3e441', 345, 'um', 1., 0., 0., 1., 345, 1, 0, 21, 12)\n", + " (0, 750., 3315., 'square', 12., '3', 's3e442', 346, 'um', 1., 0., 0., 1., 346, 1, 0, 20, 13)\n", + " (0, 782., 3315., 'square', 12., '3', 's3e443', 347, 'um', 1., 0., 0., 1., 347, 1, 0, 21, 13)\n", + " (0, 750., 3330., 'square', 12., '3', 's3e444', 348, 'um', 1., 0., 0., 1., 348, 1, 0, 20, 14)\n", + " (0, 782., 3330., 'square', 12., '3', 's3e445', 349, 'um', 1., 0., 0., 1., 349, 1, 0, 21, 14)\n", + " (0, 750., 3345., 'square', 12., '3', 's3e446', 350, 'um', 1., 0., 0., 1., 350, 1, 0, 20, 15)\n", + " (0, 782., 3345., 'square', 12., '3', 's3e447', 351, 'um', 1., 0., 0., 1., 351, 1, 0, 21, 15)\n", + " (0, 750., 3360., 'square', 12., '3', 's3e448', 352, 'um', 1., 0., 0., 1., 352, 1, 0, 22, 0)\n", + " (0, 782., 3360., 'square', 12., '3', 's3e449', 353, 'um', 1., 0., 0., 1., 353, 1, 0, 23, 0)\n", + " (0, 750., 3375., 'square', 12., '3', 's3e450', 354, 'um', 1., 0., 0., 1., 354, 1, 0, 22, 1)\n", + " (0, 782., 3375., 'square', 12., '3', 's3e451', 355, 'um', 1., 0., 0., 1., 355, 1, 0, 23, 1)\n", + " (0, 750., 3390., 'square', 12., '3', 's3e452', 356, 'um', 1., 0., 0., 1., 356, 1, 0, 22, 2)\n", + " (0, 782., 3390., 'square', 12., '3', 's3e453', 357, 'um', 1., 0., 0., 1., 357, 1, 0, 23, 2)\n", + " (0, 750., 3405., 'square', 12., '3', 's3e454', 358, 'um', 1., 0., 0., 1., 358, 1, 0, 22, 3)\n", + " (0, 782., 3405., 'square', 12., '3', 's3e455', 359, 'um', 1., 0., 0., 1., 359, 1, 0, 23, 3)\n", + " (0, 750., 3420., 'square', 12., '3', 's3e456', 360, 'um', 1., 0., 0., 1., 360, 1, 0, 22, 4)\n", + " (0, 782., 3420., 'square', 12., '3', 's3e457', 361, 'um', 1., 0., 0., 1., 361, 1, 0, 23, 4)\n", + " (0, 750., 3435., 'square', 12., '3', 's3e458', 362, 'um', 1., 0., 0., 1., 362, 1, 0, 22, 5)\n", + " (0, 782., 3435., 'square', 12., '3', 's3e459', 363, 'um', 1., 0., 0., 1., 363, 1, 0, 23, 5)\n", + " (0, 750., 3450., 'square', 12., '3', 's3e460', 364, 'um', 1., 0., 0., 1., 364, 1, 0, 22, 6)\n", + " (0, 782., 3450., 'square', 12., '3', 's3e461', 365, 'um', 1., 0., 0., 1., 365, 1, 0, 23, 6)\n", + " (0, 750., 3465., 'square', 12., '3', 's3e462', 366, 'um', 1., 0., 0., 1., 366, 1, 0, 22, 7)\n", + " (0, 782., 3465., 'square', 12., '3', 's3e463', 367, 'um', 1., 0., 0., 1., 367, 1, 0, 23, 7)\n", + " (0, 750., 3480., 'square', 12., '3', 's3e464', 368, 'um', 1., 0., 0., 1., 368, 1, 0, 22, 8)\n", + " (0, 782., 3480., 'square', 12., '3', 's3e465', 369, 'um', 1., 0., 0., 1., 369, 1, 0, 23, 8)\n", + " (0, 750., 3495., 'square', 12., '3', 's3e466', 370, 'um', 1., 0., 0., 1., 370, 1, 0, 22, 9)\n", + " (0, 782., 3495., 'square', 12., '3', 's3e467', 371, 'um', 1., 0., 0., 1., 371, 1, 0, 23, 9)\n", + " (0, 750., 3510., 'square', 12., '3', 's3e468', 372, 'um', 1., 0., 0., 1., 372, 1, 0, 22, 10)\n", + " (0, 782., 3510., 'square', 12., '3', 's3e469', 373, 'um', 1., 0., 0., 1., 373, 1, 0, 23, 10)\n", + " (0, 750., 3525., 'square', 12., '3', 's3e470', 374, 'um', 1., 0., 0., 1., 374, 1, 0, 22, 11)\n", + " (0, 782., 3525., 'square', 12., '3', 's3e471', 375, 'um', 1., 0., 0., 1., 375, 1, 0, 23, 11)\n", + " (0, 750., 3540., 'square', 12., '3', 's3e472', 376, 'um', 1., 0., 0., 1., 376, 1, 0, 22, 12)\n", + " (0, 782., 3540., 'square', 12., '3', 's3e473', 377, 'um', 1., 0., 0., 1., 377, 1, 0, 23, 12)\n", + " (0, 750., 3555., 'square', 12., '3', 's3e474', 378, 'um', 1., 0., 0., 1., 378, 1, 0, 22, 13)\n", + " (0, 782., 3555., 'square', 12., '3', 's3e475', 379, 'um', 1., 0., 0., 1., 379, 1, 0, 23, 13)\n", + " (0, 750., 3570., 'square', 12., '3', 's3e476', 380, 'um', 1., 0., 0., 1., 380, 1, 0, 22, 14)\n", + " (0, 782., 3570., 'square', 12., '3', 's3e477', 381, 'um', 1., 0., 0., 1., 381, 1, 0, 23, 14)\n", + " (0, 750., 3585., 'square', 12., '3', 's3e478', 382, 'um', 1., 0., 0., 1., 382, 1, 0, 22, 15)\n", + " (0, 782., 3585., 'square', 12., '3', 's3e479', 383, 'um', 1., 0., 0., 1., 383, 1, 0, 23, 15)]
    location[[ 500. 3600.]\n", + " [ 532. 3600.]\n", + " [ 500. 3615.]\n", + " [ 532. 3615.]\n", + " [ 500. 3630.]\n", + " [ 532. 3630.]\n", + " [ 500. 3645.]\n", + " [ 532. 3645.]\n", + " [ 500. 3660.]\n", + " [ 532. 3660.]\n", + " [ 500. 3675.]\n", + " [ 532. 3675.]\n", + " [ 500. 3690.]\n", + " [ 532. 3690.]\n", + " [ 500. 3705.]\n", + " [ 532. 3705.]\n", + " [ 500. 3720.]\n", + " [ 532. 3720.]\n", + " [ 500. 3735.]\n", + " [ 532. 3735.]\n", + " [ 500. 3750.]\n", + " [ 532. 3750.]\n", + " [ 500. 3765.]\n", + " [ 532. 3765.]\n", + " [ 500. 3780.]\n", + " [ 532. 3780.]\n", + " [ 500. 3795.]\n", + " [ 532. 3795.]\n", + " [ 500. 3810.]\n", + " [ 532. 3810.]\n", + " [ 500. 3825.]\n", + " [ 532. 3825.]\n", + " [ 500. 3840.]\n", + " [ 532. 3840.]\n", + " [ 500. 3855.]\n", + " [ 532. 3855.]\n", + " [ 500. 3870.]\n", + " [ 532. 3870.]\n", + " [ 500. 3885.]\n", + " [ 532. 3885.]\n", + " [ 500. 3900.]\n", + " [ 532. 3900.]\n", + " [ 500. 3915.]\n", + " [ 532. 3915.]\n", + " [ 500. 3930.]\n", + " [ 532. 3930.]\n", + " [ 500. 3945.]\n", + " [ 532. 3945.]\n", + " [ 750. 3600.]\n", + " [ 782. 3600.]\n", + " [ 750. 3615.]\n", + " [ 782. 3615.]\n", + " [ 750. 3630.]\n", + " [ 782. 3630.]\n", + " [ 750. 3645.]\n", + " [ 782. 3645.]\n", + " [ 750. 3660.]\n", + " [ 782. 3660.]\n", + " [ 750. 3675.]\n", + " [ 782. 3675.]\n", + " [ 750. 3690.]\n", + " [ 782. 3690.]\n", + " [ 750. 3705.]\n", + " [ 782. 3705.]\n", + " [ 750. 3720.]\n", + " [ 782. 3720.]\n", + " [ 750. 3735.]\n", + " [ 782. 3735.]\n", + " [ 750. 3750.]\n", + " [ 782. 3750.]\n", + " [ 750. 3765.]\n", + " [ 782. 3765.]\n", + " [ 750. 3780.]\n", + " [ 782. 3780.]\n", + " [ 750. 3795.]\n", + " [ 782. 3795.]\n", + " [ 750. 3810.]\n", + " [ 782. 3810.]\n", + " [ 750. 3825.]\n", + " [ 782. 3825.]\n", + " [ 750. 3840.]\n", + " [ 782. 3840.]\n", + " [ 750. 3855.]\n", + " [ 782. 3855.]\n", + " [ 750. 3870.]\n", + " [ 782. 3870.]\n", + " [ 750. 3885.]\n", + " [ 782. 3885.]\n", + " [ 750. 3900.]\n", + " [ 782. 3900.]\n", + " [ 750. 3915.]\n", + " [ 782. 3915.]\n", + " [ 750. 3930.]\n", + " [ 782. 3930.]\n", + " [ 750. 3945.]\n", + " [ 782. 3945.]\n", + " [ 500. 3960.]\n", + " [ 532. 3960.]\n", + " [ 500. 3975.]\n", + " [ 532. 3975.]\n", + " [ 500. 3990.]\n", + " [ 532. 3990.]\n", + " [ 500. 4005.]\n", + " [ 532. 4005.]\n", + " [ 500. 4020.]\n", + " [ 532. 4020.]\n", + " [ 500. 4035.]\n", + " [ 532. 4035.]\n", + " [ 500. 4050.]\n", + " [ 532. 4050.]\n", + " [ 500. 4065.]\n", + " [ 532. 4065.]\n", + " [ 500. 4080.]\n", + " [ 532. 4080.]\n", + " [ 500. 4095.]\n", + " [ 532. 4095.]\n", + " [ 500. 4110.]\n", + " [ 532. 4110.]\n", + " [ 500. 4125.]\n", + " [ 532. 4125.]\n", + " [ 500. 4140.]\n", + " [ 532. 4140.]\n", + " [ 500. 4155.]\n", + " [ 532. 4155.]\n", + " [ 500. 4170.]\n", + " [ 532. 4170.]\n", + " [ 500. 4185.]\n", + " [ 532. 4185.]\n", + " [ 500. 4200.]\n", + " [ 532. 4200.]\n", + " [ 500. 4215.]\n", + " [ 532. 4215.]\n", + " [ 500. 4230.]\n", + " [ 532. 4230.]\n", + " [ 500. 4245.]\n", + " [ 532. 4245.]\n", + " [ 500. 4260.]\n", + " [ 532. 4260.]\n", + " [ 500. 4275.]\n", + " [ 532. 4275.]\n", + " [ 500. 4290.]\n", + " [ 532. 4290.]\n", + " [ 500. 4305.]\n", + " [ 532. 4305.]\n", + " [ 750. 3960.]\n", + " [ 782. 3960.]\n", + " [ 750. 3975.]\n", + " [ 782. 3975.]\n", + " [ 750. 3990.]\n", + " [ 782. 3990.]\n", + " [ 750. 4005.]\n", + " [ 782. 4005.]\n", + " [ 750. 4020.]\n", + " [ 782. 4020.]\n", + " [ 750. 4035.]\n", + " [ 782. 4035.]\n", + " [ 750. 4050.]\n", + " [ 782. 4050.]\n", + " [ 750. 4065.]\n", + " [ 782. 4065.]\n", + " [ 750. 4080.]\n", + " [ 782. 4080.]\n", + " [ 750. 4095.]\n", + " [ 782. 4095.]\n", + " [ 750. 4110.]\n", + " [ 782. 4110.]\n", + " [ 750. 4125.]\n", + " [ 782. 4125.]\n", + " [ 750. 4140.]\n", + " [ 782. 4140.]\n", + " [ 750. 4155.]\n", + " [ 782. 4155.]\n", + " [ 750. 4170.]\n", + " [ 782. 4170.]\n", + " [ 750. 4185.]\n", + " [ 782. 4185.]\n", + " [ 750. 4200.]\n", + " [ 782. 4200.]\n", + " [ 750. 4215.]\n", + " [ 782. 4215.]\n", + " [ 750. 4230.]\n", + " [ 782. 4230.]\n", + " [ 750. 4245.]\n", + " [ 782. 4245.]\n", + " [ 750. 4260.]\n", + " [ 782. 4260.]\n", + " [ 750. 4275.]\n", + " [ 782. 4275.]\n", + " [ 750. 4290.]\n", + " [ 782. 4290.]\n", + " [ 750. 4305.]\n", + " [ 782. 4305.]\n", + " [ 500. 2880.]\n", + " [ 532. 2880.]\n", + " [ 500. 2895.]\n", + " [ 532. 2895.]\n", + " [ 500. 2910.]\n", + " [ 532. 2910.]\n", + " [ 500. 2925.]\n", + " [ 532. 2925.]\n", + " [ 500. 2940.]\n", + " [ 532. 2940.]\n", + " [ 500. 2955.]\n", + " [ 532. 2955.]\n", + " [ 500. 2970.]\n", + " [ 532. 2970.]\n", + " [ 500. 2985.]\n", + " [ 532. 2985.]\n", + " [ 500. 3000.]\n", + " [ 532. 3000.]\n", + " [ 500. 3015.]\n", + " [ 532. 3015.]\n", + " [ 500. 3030.]\n", + " [ 532. 3030.]\n", + " [ 500. 3045.]\n", + " [ 532. 3045.]\n", + " [ 500. 3060.]\n", + " [ 532. 3060.]\n", + " [ 500. 3075.]\n", + " [ 532. 3075.]\n", + " [ 500. 3090.]\n", + " [ 532. 3090.]\n", + " [ 500. 3105.]\n", + " [ 532. 3105.]\n", + " [ 500. 3120.]\n", + " [ 532. 3120.]\n", + " [ 500. 3135.]\n", + " [ 532. 3135.]\n", + " [ 500. 3150.]\n", + " [ 532. 3150.]\n", + " [ 500. 3165.]\n", + " [ 532. 3165.]\n", + " [ 500. 3180.]\n", + " [ 532. 3180.]\n", + " [ 500. 3195.]\n", + " [ 532. 3195.]\n", + " [ 500. 3210.]\n", + " [ 532. 3210.]\n", + " [ 500. 3225.]\n", + " [ 532. 3225.]\n", + " [ 750. 2880.]\n", + " [ 782. 2880.]\n", + " [ 750. 2895.]\n", + " [ 782. 2895.]\n", + " [ 750. 2910.]\n", + " [ 782. 2910.]\n", + " [ 750. 2925.]\n", + " [ 782. 2925.]\n", + " [ 750. 2940.]\n", + " [ 782. 2940.]\n", + " [ 750. 2955.]\n", + " [ 782. 2955.]\n", + " [ 750. 2970.]\n", + " [ 782. 2970.]\n", + " [ 750. 2985.]\n", + " [ 782. 2985.]\n", + " [ 750. 3000.]\n", + " [ 782. 3000.]\n", + " [ 750. 3015.]\n", + " [ 782. 3015.]\n", + " [ 750. 3030.]\n", + " [ 782. 3030.]\n", + " [ 750. 3045.]\n", + " [ 782. 3045.]\n", + " [ 750. 3060.]\n", + " [ 782. 3060.]\n", + " [ 750. 3075.]\n", + " [ 782. 3075.]\n", + " [ 750. 3090.]\n", + " [ 782. 3090.]\n", + " [ 750. 3105.]\n", + " [ 782. 3105.]\n", + " [ 750. 3120.]\n", + " [ 782. 3120.]\n", + " [ 750. 3135.]\n", + " [ 782. 3135.]\n", + " [ 750. 3150.]\n", + " [ 782. 3150.]\n", + " [ 750. 3165.]\n", + " [ 782. 3165.]\n", + " [ 750. 3180.]\n", + " [ 782. 3180.]\n", + " [ 750. 3195.]\n", + " [ 782. 3195.]\n", + " [ 750. 3210.]\n", + " [ 782. 3210.]\n", + " [ 750. 3225.]\n", + " [ 782. 3225.]\n", + " [ 500. 3240.]\n", + " [ 532. 3240.]\n", + " [ 500. 3255.]\n", + " [ 532. 3255.]\n", + " [ 500. 3270.]\n", + " [ 532. 3270.]\n", + " [ 500. 3285.]\n", + " [ 532. 3285.]\n", + " [ 500. 3300.]\n", + " [ 532. 3300.]\n", + " [ 500. 3315.]\n", + " [ 532. 3315.]\n", + " [ 500. 3330.]\n", + " [ 532. 3330.]\n", + " [ 500. 3345.]\n", + " [ 532. 3345.]\n", + " [ 500. 3360.]\n", + " [ 532. 3360.]\n", + " [ 500. 3375.]\n", + " [ 532. 3375.]\n", + " [ 500. 3390.]\n", + " [ 532. 3390.]\n", + " [ 500. 3405.]\n", + " [ 532. 3405.]\n", + " [ 500. 3420.]\n", + " [ 532. 3420.]\n", + " [ 500. 3435.]\n", + " [ 532. 3435.]\n", + " [ 500. 3450.]\n", + " [ 532. 3450.]\n", + " [ 500. 3465.]\n", + " [ 532. 3465.]\n", + " [ 500. 3480.]\n", + " [ 532. 3480.]\n", + " [ 500. 3495.]\n", + " [ 532. 3495.]\n", + " [ 500. 3510.]\n", + " [ 532. 3510.]\n", + " [ 500. 3525.]\n", + " [ 532. 3525.]\n", + " [ 500. 3540.]\n", + " [ 532. 3540.]\n", + " [ 500. 3555.]\n", + " [ 532. 3555.]\n", + " [ 500. 3570.]\n", + " [ 532. 3570.]\n", + " [ 500. 3585.]\n", + " [ 532. 3585.]\n", + " [ 750. 3240.]\n", + " [ 782. 3240.]\n", + " [ 750. 3255.]\n", + " [ 782. 3255.]\n", + " [ 750. 3270.]\n", + " [ 782. 3270.]\n", + " [ 750. 3285.]\n", + " [ 782. 3285.]\n", + " [ 750. 3300.]\n", + " [ 782. 3300.]\n", + " [ 750. 3315.]\n", + " [ 782. 3315.]\n", + " [ 750. 3330.]\n", + " [ 782. 3330.]\n", + " [ 750. 3345.]\n", + " [ 782. 3345.]\n", + " [ 750. 3360.]\n", + " [ 782. 3360.]\n", + " [ 750. 3375.]\n", + " [ 782. 3375.]\n", + " [ 750. 3390.]\n", + " [ 782. 3390.]\n", + " [ 750. 3405.]\n", + " [ 782. 3405.]\n", + " [ 750. 3420.]\n", + " [ 782. 3420.]\n", + " [ 750. 3435.]\n", + " [ 782. 3435.]\n", + " [ 750. 3450.]\n", + " [ 782. 3450.]\n", + " [ 750. 3465.]\n", + " [ 782. 3465.]\n", + " [ 750. 3480.]\n", + " [ 782. 3480.]\n", + " [ 750. 3495.]\n", + " [ 782. 3495.]\n", + " [ 750. 3510.]\n", + " [ 782. 3510.]\n", + " [ 750. 3525.]\n", + " [ 782. 3525.]\n", + " [ 750. 3540.]\n", + " [ 782. 3540.]\n", + " [ 750. 3555.]\n", + " [ 782. 3555.]\n", + " [ 750. 3570.]\n", + " [ 782. 3570.]\n", + " [ 750. 3585.]\n", + " [ 782. 3585.]]
    group[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1\n", + " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + " 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
    inter_sample_shift[0. 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25\n", + " 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625\n", + " 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875\n", + " 0.9375 0.9375 0. 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875\n", + " 0.25 0.25 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5\n", + " 0.5625 0.5625 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125\n", + " 0.875 0.875 0.9375 0.9375 0. 0. 0.0625 0.0625 0.125 0.125\n", + " 0.1875 0.1875 0.25 0.25 0.3125 0.3125 0.375 0.375 0.4375 0.4375\n", + " 0.5 0.5 0.5625 0.5625 0.625 0.625 0.6875 0.6875 0.75 0.75\n", + " 0.8125 0.8125 0.875 0.875 0.9375 0.9375 0. 0. 0.0625 0.0625\n", + " 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125 0.3125 0.375 0.375\n", + " 0.4375 0.4375 0.5 0.5 0.5625 0.5625 0.625 0.625 0.6875 0.6875\n", + " 0.75 0.75 0.8125 0.8125 0.875 0.875 0.9375 0.9375 0. 0.\n", + " 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125 0.3125\n", + " 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625 0.625 0.625\n", + " 0.6875 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875 0.9375 0.9375\n", + " 0. 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25\n", + " 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625\n", + " 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875\n", + " 0.9375 0.9375 0. 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875\n", + " 0.25 0.25 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5\n", + " 0.5625 0.5625 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125\n", + " 0.875 0.875 0.9375 0.9375 0. 0. 0.0625 0.0625 0.125 0.125\n", + " 0.1875 0.1875 0.25 0.25 0.3125 0.3125 0.375 0.375 0.4375 0.4375\n", + " 0.5 0.5 0.5625 0.5625 0.625 0.625 0.6875 0.6875 0.75 0.75\n", + " 0.8125 0.8125 0.875 0.875 0.9375 0.9375 0. 0. 0.0625 0.0625\n", + " 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125 0.3125 0.375 0.375\n", + " 0.4375 0.4375 0.5 0.5 0.5625 0.5625 0.625 0.625 0.6875 0.6875\n", + " 0.75 0.75 0.8125 0.8125 0.875 0.875 0.9375 0.9375 0. 0.\n", + " 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125 0.3125\n", + " 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625 0.625 0.625\n", + " 0.6875 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875 0.9375 0.9375\n", + " 0. 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25\n", + " 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625\n", + " 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875\n", + " 0.9375 0.9375 0. 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875\n", + " 0.25 0.25 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5\n", + " 0.5625 0.5625 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125\n", + " 0.875 0.875 0.9375 0.9375]
" + ], + "text/plain": [ + "SpikeGLXRecordingExtractor: 384 channels - 30000.036975 Hz - 1 segments - 136,752,912 samples \n", + " 4,558.42s (1.27 hours) - int16 dtype - 97.81 GiB" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "raw_rec = si.read_spikeglx(spikeglx_folder, stream_name=\"imec0.ap\", load_sync_channel=False)\n", + "raw_rec\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "mtihnsyrv3k", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xycontact_shapeswidthshank_idscontact_ids
0500.03600.0square12.02s2e480
1532.03600.0square12.02s2e481
2500.03615.0square12.02s2e482
3532.03615.0square12.02s2e483
4500.03630.0square12.02s2e484
.....................
379782.03555.0square12.03s3e475
380750.03570.0square12.03s3e476
381782.03570.0square12.03s3e477
382750.03585.0square12.03s3e478
383782.03585.0square12.03s3e479
\n", + "

384 rows \u00d7 6 columns

\n", + "
" + ], + "text/plain": [ + " x y contact_shapes width shank_ids contact_ids\n", + "0 500.0 3600.0 square 12.0 2 s2e480\n", + "1 532.0 3600.0 square 12.0 2 s2e481\n", + "2 500.0 3615.0 square 12.0 2 s2e482\n", + "3 532.0 3615.0 square 12.0 2 s2e483\n", + "4 500.0 3630.0 square 12.0 2 s2e484\n", + ".. ... ... ... ... ... ...\n", + "379 782.0 3555.0 square 12.0 3 s3e475\n", + "380 750.0 3570.0 square 12.0 3 s3e476\n", + "381 782.0 3570.0 square 12.0 3 s3e477\n", + "382 750.0 3585.0 square 12.0 3 s3e478\n", + "383 782.0 3585.0 square 12.0 3 s3e479\n", + "\n", + "[384 rows x 6 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Verify probe geometry is loaded\n", + "raw_rec.get_probe().to_dataframe()" + ] + }, + { + "cell_type": "markdown", + "id": "d3ru7deps9", + "metadata": {}, + "source": [ + "## 2. Preprocess the recording\n", + "\n", + "We apply four standard preprocessing steps for Neuropixels data:\n", + "\n", + "1. **Highpass filter** at 300 Hz to remove slow drifts\n", + "2. **Detect and remove bad channels** (dead or noisy channels)\n", + "3. **Phase shift** to correct for the inter-sample acquisition delays across channels\n", + "4. **Common median reference** to remove shared noise\n", + "\n", + "All of these are **lazy** \u2014 no data is computed until we save or access traces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "sf555gea50f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Skipping highpass filter (preprocessed recording exists)\n" + ] + } + ], + "source": [ + "# Step 1: Highpass filter\n", + "if not preprocessed_exists:\n", + " rec_filtered = si.highpass_filter(raw_rec, freq_min=300.0)\n", + "else:\n", + " print(\"Skipping highpass filter (preprocessed recording exists)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "q4w58gdhxx", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Skipping bad channel detection (preprocessed recording exists)\n" + ] + } + ], + "source": [ + "# Step 2: Detect and remove bad channels\n", + "import json\n", + "bad_channels_file = preprocessed_folder / \"bad_channels.json\"\n", + "\n", + "if not preprocessed_exists:\n", + " bad_channel_ids, channel_labels = si.detect_bad_channels(rec_filtered)\n", + " print(f\"Bad channels detected: {bad_channel_ids}\")\n", + " rec_clean = rec_filtered.remove_channels(bad_channel_ids)\n", + " \n", + " # Save bad channel info for future reference\n", + " preprocessed_folder.mkdir(parents=True, exist_ok=True)\n", + " bad_channel_info = {\n", + " \"bad_channel_ids\": [str(ch) for ch in bad_channel_ids],\n", + " \"channel_labels\": {str(k): v for k, v in zip(raw_rec.channel_ids, channel_labels)},\n", + " }\n", + " with open(bad_channels_file, \"w\") as f:\n", + " json.dump(bad_channel_info, f, indent=2)\n", + "else:\n", + " print(\"Skipping bad channel detection (preprocessed recording exists)\")\n", + " if bad_channels_file.exists():\n", + " with open(bad_channels_file, \"r\") as f:\n", + " bad_channel_info = json.load(f)\n", + " print(f\"Bad channels that were removed: {bad_channel_info['bad_channel_ids']}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "y2regt08znf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Skipping phase shift (preprocessed recording exists)\n" + ] + } + ], + "source": [ + "# Step 3: Phase shift correction (compensates inter-sample delays on Neuropixels)\n", + "if not preprocessed_exists:\n", + " rec_shifted = si.phase_shift(rec_clean)\n", + "else:\n", + " print(\"Skipping phase shift (preprocessed recording exists)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "17qiiy36ue6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Skipping common reference (preprocessed recording exists)\n" + ] + } + ], + "source": [ + "# Step 4: Common median reference\n", + "if not preprocessed_exists:\n", + " rec_cmr = si.common_reference(rec_shifted, reference=\"global\", operator=\"median\")\n", + "else:\n", + " print(\"Skipping common reference (preprocessed recording exists)\")" + ] + }, + { + "cell_type": "markdown", + "id": "sorxn5iqsmb", + "metadata": {}, + "source": [ + "### Visualize preprocessing\n", + "\n", + "Compare traces at each stage to verify the preprocessing looks sensible." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "gs6u6g8djvk", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Skipping visualization (loaded from cache, intermediate recordings not available)\n" + ] + } + ], + "source": [ + "# Only run visualization if we computed preprocessing (intermediate recordings exist)\n", + "if not preprocessed_exists:\n", + " fig, axs = plt.subplots(ncols=3, figsize=(20, 10))\n", + " si.plot_traces(rec_filtered, backend=\"matplotlib\", clim=(-50, 50), ax=axs[0])\n", + " si.plot_traces(rec_shifted, backend=\"matplotlib\", clim=(-50, 50), ax=axs[1])\n", + " si.plot_traces(rec_cmr, backend=\"matplotlib\", clim=(-50, 50), ax=axs[2])\n", + " for i, label in enumerate((\"highpass\", \"phase_shift\", \"cmr\")):\n", + " axs[i].set_title(label)\n", + " plt.show()\n", + "else:\n", + " print(\"Skipping visualization (loaded from cache, intermediate recordings not available)\")" + ] + }, + { + "cell_type": "markdown", + "id": "lta5qn1pgml", + "metadata": {}, + "source": [ + "### Save preprocessed recording to disk\n", + "\n", + "Kilosort4 requires a binary file as input, so we save the preprocessed data. This also speeds up all downstream access. Adjust `n_jobs` to match your machine." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "qfhu772o4v", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading existing preprocessed recording from /Volumes/witten/Julie/bombcell_test_datasets/from_Scott_striatum_empty_units/TowersTask_g0/preprocessed\n" + ] + }, + { + "data": { + "text/html": [ + "
BinaryFolderRecording: 380 channels - 30000.036975 Hz - 1 segments - 136,752,912 samples - 4,558.42s (1.27 hours) - int16 dtype - 96.79 GiB
Channel IDs
    ['imec0.ap#AP0' 'imec0.ap#AP1' 'imec0.ap#AP2' 'imec0.ap#AP3'\n", + " 'imec0.ap#AP4' 'imec0.ap#AP5' 'imec0.ap#AP6' 'imec0.ap#AP7'\n", + " 'imec0.ap#AP8' 'imec0.ap#AP9' 'imec0.ap#AP10' 'imec0.ap#AP11'\n", + " 'imec0.ap#AP12' 'imec0.ap#AP13' 'imec0.ap#AP14' 'imec0.ap#AP15'\n", + " 'imec0.ap#AP16' 'imec0.ap#AP17' 'imec0.ap#AP18' 'imec0.ap#AP19'\n", + " 'imec0.ap#AP20' 'imec0.ap#AP21' 'imec0.ap#AP22' 'imec0.ap#AP23'\n", + " 'imec0.ap#AP24' 'imec0.ap#AP25' 'imec0.ap#AP26' 'imec0.ap#AP27'\n", + " 'imec0.ap#AP28' 'imec0.ap#AP29' 'imec0.ap#AP30' 'imec0.ap#AP31'\n", + " 'imec0.ap#AP32' 'imec0.ap#AP33' 'imec0.ap#AP34' 'imec0.ap#AP35'\n", + " 'imec0.ap#AP36' 'imec0.ap#AP37' 'imec0.ap#AP38' 'imec0.ap#AP39'\n", + " 'imec0.ap#AP40' 'imec0.ap#AP41' 'imec0.ap#AP42' 'imec0.ap#AP43'\n", + " 'imec0.ap#AP44' 'imec0.ap#AP45' 'imec0.ap#AP46' 'imec0.ap#AP47'\n", + " 'imec0.ap#AP48' 'imec0.ap#AP49' 'imec0.ap#AP50' 'imec0.ap#AP51'\n", + " 'imec0.ap#AP52' 'imec0.ap#AP53' 'imec0.ap#AP54' 'imec0.ap#AP55'\n", + " 'imec0.ap#AP56' 'imec0.ap#AP57' 'imec0.ap#AP58' 'imec0.ap#AP59'\n", + " 'imec0.ap#AP60' 'imec0.ap#AP61' 'imec0.ap#AP62' 'imec0.ap#AP63'\n", + " 'imec0.ap#AP64' 'imec0.ap#AP65' 'imec0.ap#AP66' 'imec0.ap#AP67'\n", + " 'imec0.ap#AP68' 'imec0.ap#AP69' 'imec0.ap#AP70' 'imec0.ap#AP71'\n", + " 'imec0.ap#AP72' 'imec0.ap#AP73' 'imec0.ap#AP74' 'imec0.ap#AP75'\n", + " 'imec0.ap#AP76' 'imec0.ap#AP77' 'imec0.ap#AP78' 'imec0.ap#AP79'\n", + " 'imec0.ap#AP80' 'imec0.ap#AP81' 'imec0.ap#AP82' 'imec0.ap#AP83'\n", + " 'imec0.ap#AP84' 'imec0.ap#AP85' 'imec0.ap#AP86' 'imec0.ap#AP87'\n", + " 'imec0.ap#AP88' 'imec0.ap#AP89' 'imec0.ap#AP90' 'imec0.ap#AP91'\n", + " 'imec0.ap#AP92' 'imec0.ap#AP93' 'imec0.ap#AP94' 'imec0.ap#AP95'\n", + " 'imec0.ap#AP96' 'imec0.ap#AP97' 'imec0.ap#AP98' 'imec0.ap#AP99'\n", + " 'imec0.ap#AP100' 'imec0.ap#AP101' 'imec0.ap#AP102' 'imec0.ap#AP103'\n", + " 'imec0.ap#AP104' 'imec0.ap#AP105' 'imec0.ap#AP106' 'imec0.ap#AP107'\n", + " 'imec0.ap#AP108' 'imec0.ap#AP109' 'imec0.ap#AP110' 'imec0.ap#AP111'\n", + " 'imec0.ap#AP112' 'imec0.ap#AP113' 'imec0.ap#AP114' 'imec0.ap#AP115'\n", + " 'imec0.ap#AP116' 'imec0.ap#AP117' 'imec0.ap#AP118' 'imec0.ap#AP119'\n", + " 'imec0.ap#AP120' 'imec0.ap#AP121' 'imec0.ap#AP122' 'imec0.ap#AP123'\n", + " 'imec0.ap#AP124' 'imec0.ap#AP125' 'imec0.ap#AP126' 'imec0.ap#AP128'\n", + " 'imec0.ap#AP129' 'imec0.ap#AP130' 'imec0.ap#AP131' 'imec0.ap#AP132'\n", + " 'imec0.ap#AP133' 'imec0.ap#AP134' 'imec0.ap#AP135' 'imec0.ap#AP136'\n", + " 'imec0.ap#AP137' 'imec0.ap#AP138' 'imec0.ap#AP139' 'imec0.ap#AP140'\n", + " 'imec0.ap#AP141' 'imec0.ap#AP142' 'imec0.ap#AP143' 'imec0.ap#AP144'\n", + " 'imec0.ap#AP145' 'imec0.ap#AP146' 'imec0.ap#AP147' 'imec0.ap#AP148'\n", + " 'imec0.ap#AP149' 'imec0.ap#AP150' 'imec0.ap#AP151' 'imec0.ap#AP152'\n", + " 'imec0.ap#AP153' 'imec0.ap#AP154' 'imec0.ap#AP155' 'imec0.ap#AP156'\n", + " 'imec0.ap#AP157' 'imec0.ap#AP158' 'imec0.ap#AP159' 'imec0.ap#AP160'\n", + " 'imec0.ap#AP161' 'imec0.ap#AP162' 'imec0.ap#AP163' 'imec0.ap#AP164'\n", + " 'imec0.ap#AP165' 'imec0.ap#AP166' 'imec0.ap#AP167' 'imec0.ap#AP168'\n", + " 'imec0.ap#AP169' 'imec0.ap#AP170' 'imec0.ap#AP171' 'imec0.ap#AP172'\n", + " 'imec0.ap#AP173' 'imec0.ap#AP174' 'imec0.ap#AP175' 'imec0.ap#AP176'\n", + " 'imec0.ap#AP177' 'imec0.ap#AP178' 'imec0.ap#AP179' 'imec0.ap#AP180'\n", + " 'imec0.ap#AP181' 'imec0.ap#AP182' 'imec0.ap#AP184' 'imec0.ap#AP185'\n", + " 'imec0.ap#AP186' 'imec0.ap#AP187' 'imec0.ap#AP189' 'imec0.ap#AP190'\n", + " 'imec0.ap#AP191' 'imec0.ap#AP192' 'imec0.ap#AP193' 'imec0.ap#AP194'\n", + " 'imec0.ap#AP195' 'imec0.ap#AP196' 'imec0.ap#AP197' 'imec0.ap#AP198'\n", + " 'imec0.ap#AP199' 'imec0.ap#AP200' 'imec0.ap#AP201' 'imec0.ap#AP202'\n", + " 'imec0.ap#AP203' 'imec0.ap#AP204' 'imec0.ap#AP205' 'imec0.ap#AP206'\n", + " 'imec0.ap#AP207' 'imec0.ap#AP208' 'imec0.ap#AP209' 'imec0.ap#AP210'\n", + " 'imec0.ap#AP211' 'imec0.ap#AP212' 'imec0.ap#AP213' 'imec0.ap#AP214'\n", + " 'imec0.ap#AP215' 'imec0.ap#AP216' 'imec0.ap#AP217' 'imec0.ap#AP218'\n", + " 'imec0.ap#AP219' 'imec0.ap#AP220' 'imec0.ap#AP221' 'imec0.ap#AP222'\n", + " 'imec0.ap#AP223' 'imec0.ap#AP224' 'imec0.ap#AP225' 'imec0.ap#AP226'\n", + " 'imec0.ap#AP227' 'imec0.ap#AP228' 'imec0.ap#AP229' 'imec0.ap#AP230'\n", + " 'imec0.ap#AP231' 'imec0.ap#AP232' 'imec0.ap#AP233' 'imec0.ap#AP234'\n", + " 'imec0.ap#AP235' 'imec0.ap#AP236' 'imec0.ap#AP237' 'imec0.ap#AP238'\n", + " 'imec0.ap#AP239' 'imec0.ap#AP240' 'imec0.ap#AP241' 'imec0.ap#AP242'\n", + " 'imec0.ap#AP243' 'imec0.ap#AP244' 'imec0.ap#AP245' 'imec0.ap#AP246'\n", + " 'imec0.ap#AP247' 'imec0.ap#AP248' 'imec0.ap#AP249' 'imec0.ap#AP250'\n", + " 'imec0.ap#AP251' 'imec0.ap#AP252' 'imec0.ap#AP253' 'imec0.ap#AP254'\n", + " 'imec0.ap#AP255' 'imec0.ap#AP256' 'imec0.ap#AP257' 'imec0.ap#AP258'\n", + " 'imec0.ap#AP259' 'imec0.ap#AP260' 'imec0.ap#AP261' 'imec0.ap#AP262'\n", + " 'imec0.ap#AP263' 'imec0.ap#AP264' 'imec0.ap#AP265' 'imec0.ap#AP266'\n", + " 'imec0.ap#AP267' 'imec0.ap#AP268' 'imec0.ap#AP269' 'imec0.ap#AP270'\n", + " 'imec0.ap#AP271' 'imec0.ap#AP272' 'imec0.ap#AP273' 'imec0.ap#AP274'\n", + " 'imec0.ap#AP275' 'imec0.ap#AP276' 'imec0.ap#AP277' 'imec0.ap#AP278'\n", + " 'imec0.ap#AP279' 'imec0.ap#AP280' 'imec0.ap#AP281' 'imec0.ap#AP282'\n", + " 'imec0.ap#AP283' 'imec0.ap#AP284' 'imec0.ap#AP285' 'imec0.ap#AP286'\n", + " 'imec0.ap#AP287' 'imec0.ap#AP288' 'imec0.ap#AP289' 'imec0.ap#AP290'\n", + " 'imec0.ap#AP291' 'imec0.ap#AP292' 'imec0.ap#AP293' 'imec0.ap#AP294'\n", + " 'imec0.ap#AP295' 'imec0.ap#AP296' 'imec0.ap#AP297' 'imec0.ap#AP298'\n", + " 'imec0.ap#AP299' 'imec0.ap#AP300' 'imec0.ap#AP301' 'imec0.ap#AP302'\n", + " 'imec0.ap#AP303' 'imec0.ap#AP304' 'imec0.ap#AP305' 'imec0.ap#AP306'\n", + " 'imec0.ap#AP307' 'imec0.ap#AP308' 'imec0.ap#AP309' 'imec0.ap#AP310'\n", + " 'imec0.ap#AP311' 'imec0.ap#AP312' 'imec0.ap#AP313' 'imec0.ap#AP314'\n", + " 'imec0.ap#AP315' 'imec0.ap#AP316' 'imec0.ap#AP317' 'imec0.ap#AP318'\n", + " 'imec0.ap#AP319' 'imec0.ap#AP320' 'imec0.ap#AP321' 'imec0.ap#AP322'\n", + " 'imec0.ap#AP323' 'imec0.ap#AP324' 'imec0.ap#AP325' 'imec0.ap#AP326'\n", + " 'imec0.ap#AP327' 'imec0.ap#AP328' 'imec0.ap#AP329' 'imec0.ap#AP330'\n", + " 'imec0.ap#AP331' 'imec0.ap#AP332' 'imec0.ap#AP333' 'imec0.ap#AP334'\n", + " 'imec0.ap#AP335' 'imec0.ap#AP336' 'imec0.ap#AP337' 'imec0.ap#AP338'\n", + " 'imec0.ap#AP339' 'imec0.ap#AP340' 'imec0.ap#AP341' 'imec0.ap#AP342'\n", + " 'imec0.ap#AP343' 'imec0.ap#AP344' 'imec0.ap#AP345' 'imec0.ap#AP346'\n", + " 'imec0.ap#AP347' 'imec0.ap#AP348' 'imec0.ap#AP349' 'imec0.ap#AP350'\n", + " 'imec0.ap#AP351' 'imec0.ap#AP352' 'imec0.ap#AP353' 'imec0.ap#AP354'\n", + " 'imec0.ap#AP355' 'imec0.ap#AP356' 'imec0.ap#AP357' 'imec0.ap#AP358'\n", + " 'imec0.ap#AP359' 'imec0.ap#AP360' 'imec0.ap#AP361' 'imec0.ap#AP362'\n", + " 'imec0.ap#AP363' 'imec0.ap#AP364' 'imec0.ap#AP365' 'imec0.ap#AP366'\n", + " 'imec0.ap#AP367' 'imec0.ap#AP368' 'imec0.ap#AP369' 'imec0.ap#AP371'\n", + " 'imec0.ap#AP372' 'imec0.ap#AP373' 'imec0.ap#AP374' 'imec0.ap#AP375'\n", + " 'imec0.ap#AP376' 'imec0.ap#AP377' 'imec0.ap#AP378' 'imec0.ap#AP379'\n", + " 'imec0.ap#AP380' 'imec0.ap#AP381' 'imec0.ap#AP382' 'imec0.ap#AP383']
Annotations
  • is_filtered : True
  • probe_0_planar_contour : [[-27.0, 9989.0], [-27.0, -11.0], [8.0, -217.0], [43.0, -11.0], [43.0, 9989.0], [223.0, 9989.0], [223.0, -11.0], [258.0, -217.0], [293.0, -11.0], [293.0, 9989.0], [473.0, 9989.0], [473.0, -11.0], [508.0, -217.0], [543.0, -11.0], [543.0, 9989.0], [723.0, 9989.0], [723.0, -11.0], [758.0, -217.0], [793.0, -11.0], [793.0, 9989.0]]
  • probes_info : [{'model_name': 'NP2010', 'manufacturer': 'imec', 'description': 'duplicate of PRB2_4_2_0640_0', 'shank_tips': [[8.0, -217.0], [258.0, -217.0], [508.0, -217.0], [758.0, -217.0]], 'adc_bit_depth': 14, 'num_readout_channels': 384, 'ap_sample_frequency_hz': 30000.0, 'lf_sample_frequency_hz': 0.0, 'num_adcs': 24, 'num_channels_per_adc': 16, 'probe_type': '24', 'serial_number': '20403317573', 'part_number': 'NP2010', 'port': '1', 'slot': '2'}]
Properties
    gain_to_uV[0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945]
    offset_to_uV[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0]
    contact_vector[(0, 500., 3600., 'square', 12., '2', 's2e480', 0, 'um', 1., 0., 0., 1., 0, 0, 0, 1, 0)\n", + " (0, 532., 3600., 'square', 12., '2', 's2e481', 1, 'um', 1., 0., 0., 1., 1, 0, 1, 1, 0)\n", + " (0, 500., 3615., 'square', 12., '2', 's2e482', 2, 'um', 1., 0., 0., 1., 0, 1, 2, 1, 0)\n", + " (0, 532., 3615., 'square', 12., '2', 's2e483', 3, 'um', 1., 0., 0., 1., 1, 1, 3, 1, 0)\n", + " (0, 500., 3630., 'square', 12., '2', 's2e484', 4, 'um', 1., 0., 0., 1., 0, 2, 4, 1, 0)\n", + " (0, 532., 3630., 'square', 12., '2', 's2e485', 5, 'um', 1., 0., 0., 1., 1, 2, 5, 1, 0)\n", + " (0, 500., 3645., 'square', 12., '2', 's2e486', 6, 'um', 1., 0., 0., 1., 0, 3, 6, 1, 0)\n", + " (0, 532., 3645., 'square', 12., '2', 's2e487', 7, 'um', 1., 0., 0., 1., 1, 3, 7, 1, 0)\n", + " (0, 500., 3660., 'square', 12., '2', 's2e488', 8, 'um', 1., 0., 0., 1., 0, 4, 8, 1, 0)\n", + " (0, 532., 3660., 'square', 12., '2', 's2e489', 9, 'um', 1., 0., 0., 1., 1, 4, 9, 1, 0)\n", + " (0, 500., 3675., 'square', 12., '2', 's2e490', 10, 'um', 1., 0., 0., 1., 0, 5, 10, 1, 0)\n", + " (0, 532., 3675., 'square', 12., '2', 's2e491', 11, 'um', 1., 0., 0., 1., 1, 5, 11, 1, 0)\n", + " (0, 500., 3690., 'square', 12., '2', 's2e492', 12, 'um', 1., 0., 0., 1., 0, 6, 12, 1, 0)\n", + " (0, 532., 3690., 'square', 12., '2', 's2e493', 13, 'um', 1., 0., 0., 1., 1, 6, 13, 1, 0)\n", + " (0, 500., 3705., 'square', 12., '2', 's2e494', 14, 'um', 1., 0., 0., 1., 0, 7, 14, 1, 0)\n", + " (0, 532., 3705., 'square', 12., '2', 's2e495', 15, 'um', 1., 0., 0., 1., 1, 7, 15, 1, 0)\n", + " (0, 500., 3720., 'square', 12., '2', 's2e496', 16, 'um', 1., 0., 0., 1., 0, 8, 16, 1, 0)\n", + " (0, 532., 3720., 'square', 12., '2', 's2e497', 17, 'um', 1., 0., 0., 1., 1, 8, 17, 1, 0)\n", + " (0, 500., 3735., 'square', 12., '2', 's2e498', 18, 'um', 1., 0., 0., 1., 0, 9, 18, 1, 0)\n", + " (0, 532., 3735., 'square', 12., '2', 's2e499', 19, 'um', 1., 0., 0., 1., 1, 9, 19, 1, 0)\n", + " (0, 500., 3750., 'square', 12., '2', 's2e500', 20, 'um', 1., 0., 0., 1., 0, 10, 20, 1, 0)\n", + " (0, 532., 3750., 'square', 12., '2', 's2e501', 21, 'um', 1., 0., 0., 1., 1, 10, 21, 1, 0)\n", + " (0, 500., 3765., 'square', 12., '2', 's2e502', 22, 'um', 1., 0., 0., 1., 0, 11, 22, 1, 0)\n", + " (0, 532., 3765., 'square', 12., '2', 's2e503', 23, 'um', 1., 0., 0., 1., 1, 11, 23, 1, 0)\n", + " (0, 500., 3780., 'square', 12., '2', 's2e504', 24, 'um', 1., 0., 0., 1., 0, 12, 24, 1, 0)\n", + " (0, 532., 3780., 'square', 12., '2', 's2e505', 25, 'um', 1., 0., 0., 1., 1, 12, 25, 1, 0)\n", + " (0, 500., 3795., 'square', 12., '2', 's2e506', 26, 'um', 1., 0., 0., 1., 0, 13, 26, 1, 0)\n", + " (0, 532., 3795., 'square', 12., '2', 's2e507', 27, 'um', 1., 0., 0., 1., 1, 13, 27, 1, 0)\n", + " (0, 500., 3810., 'square', 12., '2', 's2e508', 28, 'um', 1., 0., 0., 1., 0, 14, 28, 1, 0)\n", + " (0, 532., 3810., 'square', 12., '2', 's2e509', 29, 'um', 1., 0., 0., 1., 1, 14, 29, 1, 0)\n", + " (0, 500., 3825., 'square', 12., '2', 's2e510', 30, 'um', 1., 0., 0., 1., 0, 15, 30, 1, 0)\n", + " (0, 532., 3825., 'square', 12., '2', 's2e511', 31, 'um', 1., 0., 0., 1., 1, 15, 31, 1, 0)\n", + " (0, 500., 3840., 'square', 12., '2', 's2e512', 32, 'um', 1., 0., 0., 1., 2, 0, 32, 1, 0)\n", + " (0, 532., 3840., 'square', 12., '2', 's2e513', 33, 'um', 1., 0., 0., 1., 3, 0, 33, 1, 0)\n", + " (0, 500., 3855., 'square', 12., '2', 's2e514', 34, 'um', 1., 0., 0., 1., 2, 1, 34, 1, 0)\n", + " (0, 532., 3855., 'square', 12., '2', 's2e515', 35, 'um', 1., 0., 0., 1., 3, 1, 35, 1, 0)\n", + " (0, 500., 3870., 'square', 12., '2', 's2e516', 36, 'um', 1., 0., 0., 1., 2, 2, 36, 1, 0)\n", + " (0, 532., 3870., 'square', 12., '2', 's2e517', 37, 'um', 1., 0., 0., 1., 3, 2, 37, 1, 0)\n", + " (0, 500., 3885., 'square', 12., '2', 's2e518', 38, 'um', 1., 0., 0., 1., 2, 3, 38, 1, 0)\n", + " (0, 532., 3885., 'square', 12., '2', 's2e519', 39, 'um', 1., 0., 0., 1., 3, 3, 39, 1, 0)\n", + " (0, 500., 3900., 'square', 12., '2', 's2e520', 40, 'um', 1., 0., 0., 1., 2, 4, 40, 1, 0)\n", + " (0, 532., 3900., 'square', 12., '2', 's2e521', 41, 'um', 1., 0., 0., 1., 3, 4, 41, 1, 0)\n", + " (0, 500., 3915., 'square', 12., '2', 's2e522', 42, 'um', 1., 0., 0., 1., 2, 5, 42, 1, 0)\n", + " (0, 532., 3915., 'square', 12., '2', 's2e523', 43, 'um', 1., 0., 0., 1., 3, 5, 43, 1, 0)\n", + " (0, 500., 3930., 'square', 12., '2', 's2e524', 44, 'um', 1., 0., 0., 1., 2, 6, 44, 1, 0)\n", + " (0, 532., 3930., 'square', 12., '2', 's2e525', 45, 'um', 1., 0., 0., 1., 3, 6, 45, 1, 0)\n", + " (0, 500., 3945., 'square', 12., '2', 's2e526', 46, 'um', 1., 0., 0., 1., 2, 7, 46, 1, 0)\n", + " (0, 532., 3945., 'square', 12., '2', 's2e527', 47, 'um', 1., 0., 0., 1., 3, 7, 47, 1, 0)\n", + " (0, 750., 3600., 'square', 12., '3', 's3e480', 48, 'um', 1., 0., 0., 1., 2, 8, 48, 1, 0)\n", + " (0, 782., 3600., 'square', 12., '3', 's3e481', 49, 'um', 1., 0., 0., 1., 3, 8, 49, 1, 0)\n", + " (0, 750., 3615., 'square', 12., '3', 's3e482', 50, 'um', 1., 0., 0., 1., 2, 9, 50, 1, 0)\n", + " (0, 782., 3615., 'square', 12., '3', 's3e483', 51, 'um', 1., 0., 0., 1., 3, 9, 51, 1, 0)\n", + " (0, 750., 3630., 'square', 12., '3', 's3e484', 52, 'um', 1., 0., 0., 1., 2, 10, 52, 1, 0)\n", + " (0, 782., 3630., 'square', 12., '3', 's3e485', 53, 'um', 1., 0., 0., 1., 3, 10, 53, 1, 0)\n", + " (0, 750., 3645., 'square', 12., '3', 's3e486', 54, 'um', 1., 0., 0., 1., 2, 11, 54, 1, 0)\n", + " (0, 782., 3645., 'square', 12., '3', 's3e487', 55, 'um', 1., 0., 0., 1., 3, 11, 55, 1, 0)\n", + " (0, 750., 3660., 'square', 12., '3', 's3e488', 56, 'um', 1., 0., 0., 1., 2, 12, 56, 1, 0)\n", + " (0, 782., 3660., 'square', 12., '3', 's3e489', 57, 'um', 1., 0., 0., 1., 3, 12, 57, 1, 0)\n", + " (0, 750., 3675., 'square', 12., '3', 's3e490', 58, 'um', 1., 0., 0., 1., 2, 13, 58, 1, 0)\n", + " (0, 782., 3675., 'square', 12., '3', 's3e491', 59, 'um', 1., 0., 0., 1., 3, 13, 59, 1, 0)\n", + " (0, 750., 3690., 'square', 12., '3', 's3e492', 60, 'um', 1., 0., 0., 1., 2, 14, 60, 1, 0)\n", + " (0, 782., 3690., 'square', 12., '3', 's3e493', 61, 'um', 1., 0., 0., 1., 3, 14, 61, 1, 0)\n", + " (0, 750., 3705., 'square', 12., '3', 's3e494', 62, 'um', 1., 0., 0., 1., 2, 15, 62, 1, 0)\n", + " (0, 782., 3705., 'square', 12., '3', 's3e495', 63, 'um', 1., 0., 0., 1., 3, 15, 63, 1, 0)\n", + " (0, 750., 3720., 'square', 12., '3', 's3e496', 64, 'um', 1., 0., 0., 1., 4, 0, 64, 1, 0)\n", + " (0, 782., 3720., 'square', 12., '3', 's3e497', 65, 'um', 1., 0., 0., 1., 5, 0, 65, 1, 0)\n", + " (0, 750., 3735., 'square', 12., '3', 's3e498', 66, 'um', 1., 0., 0., 1., 4, 1, 66, 1, 0)\n", + " (0, 782., 3735., 'square', 12., '3', 's3e499', 67, 'um', 1., 0., 0., 1., 5, 1, 67, 1, 0)\n", + " (0, 750., 3750., 'square', 12., '3', 's3e500', 68, 'um', 1., 0., 0., 1., 4, 2, 68, 1, 0)\n", + " (0, 782., 3750., 'square', 12., '3', 's3e501', 69, 'um', 1., 0., 0., 1., 5, 2, 69, 1, 0)\n", + " (0, 750., 3765., 'square', 12., '3', 's3e502', 70, 'um', 1., 0., 0., 1., 4, 3, 70, 1, 0)\n", + " (0, 782., 3765., 'square', 12., '3', 's3e503', 71, 'um', 1., 0., 0., 1., 5, 3, 71, 1, 0)\n", + " (0, 750., 3780., 'square', 12., '3', 's3e504', 72, 'um', 1., 0., 0., 1., 4, 4, 72, 1, 0)\n", + " (0, 782., 3780., 'square', 12., '3', 's3e505', 73, 'um', 1., 0., 0., 1., 5, 4, 73, 1, 0)\n", + " (0, 750., 3795., 'square', 12., '3', 's3e506', 74, 'um', 1., 0., 0., 1., 4, 5, 74, 1, 0)\n", + " (0, 782., 3795., 'square', 12., '3', 's3e507', 75, 'um', 1., 0., 0., 1., 5, 5, 75, 1, 0)\n", + " (0, 750., 3810., 'square', 12., '3', 's3e508', 76, 'um', 1., 0., 0., 1., 4, 6, 76, 1, 0)\n", + " (0, 782., 3810., 'square', 12., '3', 's3e509', 77, 'um', 1., 0., 0., 1., 5, 6, 77, 1, 0)\n", + " (0, 750., 3825., 'square', 12., '3', 's3e510', 78, 'um', 1., 0., 0., 1., 4, 7, 78, 1, 0)\n", + " (0, 782., 3825., 'square', 12., '3', 's3e511', 79, 'um', 1., 0., 0., 1., 5, 7, 79, 1, 0)\n", + " (0, 750., 3840., 'square', 12., '3', 's3e512', 80, 'um', 1., 0., 0., 1., 4, 8, 80, 1, 0)\n", + " (0, 782., 3840., 'square', 12., '3', 's3e513', 81, 'um', 1., 0., 0., 1., 5, 8, 81, 1, 0)\n", + " (0, 750., 3855., 'square', 12., '3', 's3e514', 82, 'um', 1., 0., 0., 1., 4, 9, 82, 1, 0)\n", + " (0, 782., 3855., 'square', 12., '3', 's3e515', 83, 'um', 1., 0., 0., 1., 5, 9, 83, 1, 0)\n", + " (0, 750., 3870., 'square', 12., '3', 's3e516', 84, 'um', 1., 0., 0., 1., 4, 10, 84, 1, 0)\n", + " (0, 782., 3870., 'square', 12., '3', 's3e517', 85, 'um', 1., 0., 0., 1., 5, 10, 85, 1, 0)\n", + " (0, 750., 3885., 'square', 12., '3', 's3e518', 86, 'um', 1., 0., 0., 1., 4, 11, 86, 1, 0)\n", + " (0, 782., 3885., 'square', 12., '3', 's3e519', 87, 'um', 1., 0., 0., 1., 5, 11, 87, 1, 0)\n", + " (0, 750., 3900., 'square', 12., '3', 's3e520', 88, 'um', 1., 0., 0., 1., 4, 12, 88, 1, 0)\n", + " (0, 782., 3900., 'square', 12., '3', 's3e521', 89, 'um', 1., 0., 0., 1., 5, 12, 89, 1, 0)\n", + " (0, 750., 3915., 'square', 12., '3', 's3e522', 90, 'um', 1., 0., 0., 1., 4, 13, 90, 1, 0)\n", + " (0, 782., 3915., 'square', 12., '3', 's3e523', 91, 'um', 1., 0., 0., 1., 5, 13, 91, 1, 0)\n", + " (0, 750., 3930., 'square', 12., '3', 's3e524', 92, 'um', 1., 0., 0., 1., 4, 14, 92, 1, 0)\n", + " (0, 782., 3930., 'square', 12., '3', 's3e525', 93, 'um', 1., 0., 0., 1., 5, 14, 93, 1, 0)\n", + " (0, 750., 3945., 'square', 12., '3', 's3e526', 94, 'um', 1., 0., 0., 1., 4, 15, 94, 1, 0)\n", + " (0, 782., 3945., 'square', 12., '3', 's3e527', 95, 'um', 1., 0., 0., 1., 5, 15, 95, 1, 0)\n", + " (0, 500., 3960., 'square', 12., '2', 's2e528', 96, 'um', 1., 0., 0., 1., 6, 0, 96, 1, 0)\n", + " (0, 532., 3960., 'square', 12., '2', 's2e529', 97, 'um', 1., 0., 0., 1., 7, 0, 97, 1, 0)\n", + " (0, 500., 3975., 'square', 12., '2', 's2e530', 98, 'um', 1., 0., 0., 1., 6, 1, 98, 1, 0)\n", + " (0, 532., 3975., 'square', 12., '2', 's2e531', 99, 'um', 1., 0., 0., 1., 7, 1, 99, 1, 0)\n", + " (0, 500., 3990., 'square', 12., '2', 's2e532', 100, 'um', 1., 0., 0., 1., 6, 2, 100, 1, 0)\n", + " (0, 532., 3990., 'square', 12., '2', 's2e533', 101, 'um', 1., 0., 0., 1., 7, 2, 101, 1, 0)\n", + " (0, 500., 4005., 'square', 12., '2', 's2e534', 102, 'um', 1., 0., 0., 1., 6, 3, 102, 1, 0)\n", + " (0, 532., 4005., 'square', 12., '2', 's2e535', 103, 'um', 1., 0., 0., 1., 7, 3, 103, 1, 0)\n", + " (0, 500., 4020., 'square', 12., '2', 's2e536', 104, 'um', 1., 0., 0., 1., 6, 4, 104, 1, 0)\n", + " (0, 532., 4020., 'square', 12., '2', 's2e537', 105, 'um', 1., 0., 0., 1., 7, 4, 105, 1, 0)\n", + " (0, 500., 4035., 'square', 12., '2', 's2e538', 106, 'um', 1., 0., 0., 1., 6, 5, 106, 1, 0)\n", + " (0, 532., 4035., 'square', 12., '2', 's2e539', 107, 'um', 1., 0., 0., 1., 7, 5, 107, 1, 0)\n", + " (0, 500., 4050., 'square', 12., '2', 's2e540', 108, 'um', 1., 0., 0., 1., 6, 6, 108, 1, 0)\n", + " (0, 532., 4050., 'square', 12., '2', 's2e541', 109, 'um', 1., 0., 0., 1., 7, 6, 109, 1, 0)\n", + " (0, 500., 4065., 'square', 12., '2', 's2e542', 110, 'um', 1., 0., 0., 1., 6, 7, 110, 1, 0)\n", + " (0, 532., 4065., 'square', 12., '2', 's2e543', 111, 'um', 1., 0., 0., 1., 7, 7, 111, 1, 0)\n", + " (0, 500., 4080., 'square', 12., '2', 's2e544', 112, 'um', 1., 0., 0., 1., 6, 8, 112, 1, 0)\n", + " (0, 532., 4080., 'square', 12., '2', 's2e545', 113, 'um', 1., 0., 0., 1., 7, 8, 113, 1, 0)\n", + " (0, 500., 4095., 'square', 12., '2', 's2e546', 114, 'um', 1., 0., 0., 1., 6, 9, 114, 1, 0)\n", + " (0, 532., 4095., 'square', 12., '2', 's2e547', 115, 'um', 1., 0., 0., 1., 7, 9, 115, 1, 0)\n", + " (0, 500., 4110., 'square', 12., '2', 's2e548', 116, 'um', 1., 0., 0., 1., 6, 10, 116, 1, 0)\n", + " (0, 532., 4110., 'square', 12., '2', 's2e549', 117, 'um', 1., 0., 0., 1., 7, 10, 117, 1, 0)\n", + " (0, 500., 4125., 'square', 12., '2', 's2e550', 118, 'um', 1., 0., 0., 1., 6, 11, 118, 1, 0)\n", + " (0, 532., 4125., 'square', 12., '2', 's2e551', 119, 'um', 1., 0., 0., 1., 7, 11, 119, 1, 0)\n", + " (0, 500., 4140., 'square', 12., '2', 's2e552', 120, 'um', 1., 0., 0., 1., 6, 12, 120, 1, 0)\n", + " (0, 532., 4140., 'square', 12., '2', 's2e553', 121, 'um', 1., 0., 0., 1., 7, 12, 121, 1, 0)\n", + " (0, 500., 4155., 'square', 12., '2', 's2e554', 122, 'um', 1., 0., 0., 1., 6, 13, 122, 1, 0)\n", + " (0, 532., 4155., 'square', 12., '2', 's2e555', 123, 'um', 1., 0., 0., 1., 7, 13, 123, 1, 0)\n", + " (0, 500., 4170., 'square', 12., '2', 's2e556', 124, 'um', 1., 0., 0., 1., 6, 14, 124, 1, 0)\n", + " (0, 532., 4170., 'square', 12., '2', 's2e557', 125, 'um', 1., 0., 0., 1., 7, 14, 125, 1, 0)\n", + " (0, 500., 4185., 'square', 12., '2', 's2e558', 126, 'um', 1., 0., 0., 1., 6, 15, 126, 1, 0)\n", + " (0, 500., 4200., 'square', 12., '2', 's2e560', 127, 'um', 1., 0., 0., 1., 8, 0, 128, 1, 0)\n", + " (0, 532., 4200., 'square', 12., '2', 's2e561', 128, 'um', 1., 0., 0., 1., 9, 0, 129, 1, 0)\n", + " (0, 500., 4215., 'square', 12., '2', 's2e562', 129, 'um', 1., 0., 0., 1., 8, 1, 130, 1, 0)\n", + " (0, 532., 4215., 'square', 12., '2', 's2e563', 130, 'um', 1., 0., 0., 1., 9, 1, 131, 1, 0)\n", + " (0, 500., 4230., 'square', 12., '2', 's2e564', 131, 'um', 1., 0., 0., 1., 8, 2, 132, 1, 0)\n", + " (0, 532., 4230., 'square', 12., '2', 's2e565', 132, 'um', 1., 0., 0., 1., 9, 2, 133, 1, 0)\n", + " (0, 500., 4245., 'square', 12., '2', 's2e566', 133, 'um', 1., 0., 0., 1., 8, 3, 134, 1, 0)\n", + " (0, 532., 4245., 'square', 12., '2', 's2e567', 134, 'um', 1., 0., 0., 1., 9, 3, 135, 1, 0)\n", + " (0, 500., 4260., 'square', 12., '2', 's2e568', 135, 'um', 1., 0., 0., 1., 8, 4, 136, 1, 0)\n", + " (0, 532., 4260., 'square', 12., '2', 's2e569', 136, 'um', 1., 0., 0., 1., 9, 4, 137, 1, 0)\n", + " (0, 500., 4275., 'square', 12., '2', 's2e570', 137, 'um', 1., 0., 0., 1., 8, 5, 138, 1, 0)\n", + " (0, 532., 4275., 'square', 12., '2', 's2e571', 138, 'um', 1., 0., 0., 1., 9, 5, 139, 1, 0)\n", + " (0, 500., 4290., 'square', 12., '2', 's2e572', 139, 'um', 1., 0., 0., 1., 8, 6, 140, 1, 0)\n", + " (0, 532., 4290., 'square', 12., '2', 's2e573', 140, 'um', 1., 0., 0., 1., 9, 6, 141, 1, 0)\n", + " (0, 500., 4305., 'square', 12., '2', 's2e574', 141, 'um', 1., 0., 0., 1., 8, 7, 142, 1, 0)\n", + " (0, 532., 4305., 'square', 12., '2', 's2e575', 142, 'um', 1., 0., 0., 1., 9, 7, 143, 1, 0)\n", + " (0, 750., 3960., 'square', 12., '3', 's3e528', 143, 'um', 1., 0., 0., 1., 8, 8, 144, 1, 0)\n", + " (0, 782., 3960., 'square', 12., '3', 's3e529', 144, 'um', 1., 0., 0., 1., 9, 8, 145, 1, 0)\n", + " (0, 750., 3975., 'square', 12., '3', 's3e530', 145, 'um', 1., 0., 0., 1., 8, 9, 146, 1, 0)\n", + " (0, 782., 3975., 'square', 12., '3', 's3e531', 146, 'um', 1., 0., 0., 1., 9, 9, 147, 1, 0)\n", + " (0, 750., 3990., 'square', 12., '3', 's3e532', 147, 'um', 1., 0., 0., 1., 8, 10, 148, 1, 0)\n", + " (0, 782., 3990., 'square', 12., '3', 's3e533', 148, 'um', 1., 0., 0., 1., 9, 10, 149, 1, 0)\n", + " (0, 750., 4005., 'square', 12., '3', 's3e534', 149, 'um', 1., 0., 0., 1., 8, 11, 150, 1, 0)\n", + " (0, 782., 4005., 'square', 12., '3', 's3e535', 150, 'um', 1., 0., 0., 1., 9, 11, 151, 1, 0)\n", + " (0, 750., 4020., 'square', 12., '3', 's3e536', 151, 'um', 1., 0., 0., 1., 8, 12, 152, 1, 0)\n", + " (0, 782., 4020., 'square', 12., '3', 's3e537', 152, 'um', 1., 0., 0., 1., 9, 12, 153, 1, 0)\n", + " (0, 750., 4035., 'square', 12., '3', 's3e538', 153, 'um', 1., 0., 0., 1., 8, 13, 154, 1, 0)\n", + " (0, 782., 4035., 'square', 12., '3', 's3e539', 154, 'um', 1., 0., 0., 1., 9, 13, 155, 1, 0)\n", + " (0, 750., 4050., 'square', 12., '3', 's3e540', 155, 'um', 1., 0., 0., 1., 8, 14, 156, 1, 0)\n", + " (0, 782., 4050., 'square', 12., '3', 's3e541', 156, 'um', 1., 0., 0., 1., 9, 14, 157, 1, 0)\n", + " (0, 750., 4065., 'square', 12., '3', 's3e542', 157, 'um', 1., 0., 0., 1., 8, 15, 158, 1, 0)\n", + " (0, 782., 4065., 'square', 12., '3', 's3e543', 158, 'um', 1., 0., 0., 1., 9, 15, 159, 1, 0)\n", + " (0, 750., 4080., 'square', 12., '3', 's3e544', 159, 'um', 1., 0., 0., 1., 10, 0, 160, 1, 0)\n", + " (0, 782., 4080., 'square', 12., '3', 's3e545', 160, 'um', 1., 0., 0., 1., 11, 0, 161, 1, 0)\n", + " (0, 750., 4095., 'square', 12., '3', 's3e546', 161, 'um', 1., 0., 0., 1., 10, 1, 162, 1, 0)\n", + " (0, 782., 4095., 'square', 12., '3', 's3e547', 162, 'um', 1., 0., 0., 1., 11, 1, 163, 1, 0)\n", + " (0, 750., 4110., 'square', 12., '3', 's3e548', 163, 'um', 1., 0., 0., 1., 10, 2, 164, 1, 0)\n", + " (0, 782., 4110., 'square', 12., '3', 's3e549', 164, 'um', 1., 0., 0., 1., 11, 2, 165, 1, 0)\n", + " (0, 750., 4125., 'square', 12., '3', 's3e550', 165, 'um', 1., 0., 0., 1., 10, 3, 166, 1, 0)\n", + " (0, 782., 4125., 'square', 12., '3', 's3e551', 166, 'um', 1., 0., 0., 1., 11, 3, 167, 1, 0)\n", + " (0, 750., 4140., 'square', 12., '3', 's3e552', 167, 'um', 1., 0., 0., 1., 10, 4, 168, 1, 0)\n", + " (0, 782., 4140., 'square', 12., '3', 's3e553', 168, 'um', 1., 0., 0., 1., 11, 4, 169, 1, 0)\n", + " (0, 750., 4155., 'square', 12., '3', 's3e554', 169, 'um', 1., 0., 0., 1., 10, 5, 170, 1, 0)\n", + " (0, 782., 4155., 'square', 12., '3', 's3e555', 170, 'um', 1., 0., 0., 1., 11, 5, 171, 1, 0)\n", + " (0, 750., 4170., 'square', 12., '3', 's3e556', 171, 'um', 1., 0., 0., 1., 10, 6, 172, 1, 0)\n", + " (0, 782., 4170., 'square', 12., '3', 's3e557', 172, 'um', 1., 0., 0., 1., 11, 6, 173, 1, 0)\n", + " (0, 750., 4185., 'square', 12., '3', 's3e558', 173, 'um', 1., 0., 0., 1., 10, 7, 174, 1, 0)\n", + " (0, 782., 4185., 'square', 12., '3', 's3e559', 174, 'um', 1., 0., 0., 1., 11, 7, 175, 1, 0)\n", + " (0, 750., 4200., 'square', 12., '3', 's3e560', 175, 'um', 1., 0., 0., 1., 10, 8, 176, 1, 0)\n", + " (0, 782., 4200., 'square', 12., '3', 's3e561', 176, 'um', 1., 0., 0., 1., 11, 8, 177, 1, 0)\n", + " (0, 750., 4215., 'square', 12., '3', 's3e562', 177, 'um', 1., 0., 0., 1., 10, 9, 178, 1, 0)\n", + " (0, 782., 4215., 'square', 12., '3', 's3e563', 178, 'um', 1., 0., 0., 1., 11, 9, 179, 1, 0)\n", + " (0, 750., 4230., 'square', 12., '3', 's3e564', 179, 'um', 1., 0., 0., 1., 10, 10, 180, 1, 0)\n", + " (0, 782., 4230., 'square', 12., '3', 's3e565', 180, 'um', 1., 0., 0., 1., 11, 10, 181, 1, 0)\n", + " (0, 750., 4245., 'square', 12., '3', 's3e566', 181, 'um', 1., 0., 0., 1., 10, 11, 182, 1, 0)\n", + " (0, 750., 4260., 'square', 12., '3', 's3e568', 182, 'um', 1., 0., 0., 1., 10, 12, 184, 1, 0)\n", + " (0, 782., 4260., 'square', 12., '3', 's3e569', 183, 'um', 1., 0., 0., 1., 11, 12, 185, 1, 0)\n", + " (0, 750., 4275., 'square', 12., '3', 's3e570', 184, 'um', 1., 0., 0., 1., 10, 13, 186, 1, 0)\n", + " (0, 782., 4275., 'square', 12., '3', 's3e571', 185, 'um', 1., 0., 0., 1., 11, 13, 187, 1, 0)\n", + " (0, 782., 4290., 'square', 12., '3', 's3e573', 186, 'um', 1., 0., 0., 1., 11, 14, 189, 1, 0)\n", + " (0, 750., 4305., 'square', 12., '3', 's3e574', 187, 'um', 1., 0., 0., 1., 10, 15, 190, 1, 0)\n", + " (0, 782., 4305., 'square', 12., '3', 's3e575', 188, 'um', 1., 0., 0., 1., 11, 15, 191, 1, 0)\n", + " (0, 500., 2880., 'square', 12., '2', 's2e384', 189, 'um', 1., 0., 0., 1., 12, 0, 192, 1, 0)\n", + " (0, 532., 2880., 'square', 12., '2', 's2e385', 190, 'um', 1., 0., 0., 1., 13, 0, 193, 1, 0)\n", + " (0, 500., 2895., 'square', 12., '2', 's2e386', 191, 'um', 1., 0., 0., 1., 12, 1, 194, 1, 0)\n", + " (0, 532., 2895., 'square', 12., '2', 's2e387', 192, 'um', 1., 0., 0., 1., 13, 1, 195, 1, 0)\n", + " (0, 500., 2910., 'square', 12., '2', 's2e388', 193, 'um', 1., 0., 0., 1., 12, 2, 196, 1, 0)\n", + " (0, 532., 2910., 'square', 12., '2', 's2e389', 194, 'um', 1., 0., 0., 1., 13, 2, 197, 1, 0)\n", + " (0, 500., 2925., 'square', 12., '2', 's2e390', 195, 'um', 1., 0., 0., 1., 12, 3, 198, 1, 0)\n", + " (0, 532., 2925., 'square', 12., '2', 's2e391', 196, 'um', 1., 0., 0., 1., 13, 3, 199, 1, 0)\n", + " (0, 500., 2940., 'square', 12., '2', 's2e392', 197, 'um', 1., 0., 0., 1., 12, 4, 200, 1, 0)\n", + " (0, 532., 2940., 'square', 12., '2', 's2e393', 198, 'um', 1., 0., 0., 1., 13, 4, 201, 1, 0)\n", + " (0, 500., 2955., 'square', 12., '2', 's2e394', 199, 'um', 1., 0., 0., 1., 12, 5, 202, 1, 0)\n", + " (0, 532., 2955., 'square', 12., '2', 's2e395', 200, 'um', 1., 0., 0., 1., 13, 5, 203, 1, 0)\n", + " (0, 500., 2970., 'square', 12., '2', 's2e396', 201, 'um', 1., 0., 0., 1., 12, 6, 204, 1, 0)\n", + " (0, 532., 2970., 'square', 12., '2', 's2e397', 202, 'um', 1., 0., 0., 1., 13, 6, 205, 1, 0)\n", + " (0, 500., 2985., 'square', 12., '2', 's2e398', 203, 'um', 1., 0., 0., 1., 12, 7, 206, 1, 0)\n", + " (0, 532., 2985., 'square', 12., '2', 's2e399', 204, 'um', 1., 0., 0., 1., 13, 7, 207, 1, 0)\n", + " (0, 500., 3000., 'square', 12., '2', 's2e400', 205, 'um', 1., 0., 0., 1., 12, 8, 208, 1, 0)\n", + " (0, 532., 3000., 'square', 12., '2', 's2e401', 206, 'um', 1., 0., 0., 1., 13, 8, 209, 1, 0)\n", + " (0, 500., 3015., 'square', 12., '2', 's2e402', 207, 'um', 1., 0., 0., 1., 12, 9, 210, 1, 0)\n", + " (0, 532., 3015., 'square', 12., '2', 's2e403', 208, 'um', 1., 0., 0., 1., 13, 9, 211, 1, 0)\n", + " (0, 500., 3030., 'square', 12., '2', 's2e404', 209, 'um', 1., 0., 0., 1., 12, 10, 212, 1, 0)\n", + " (0, 532., 3030., 'square', 12., '2', 's2e405', 210, 'um', 1., 0., 0., 1., 13, 10, 213, 1, 0)\n", + " (0, 500., 3045., 'square', 12., '2', 's2e406', 211, 'um', 1., 0., 0., 1., 12, 11, 214, 1, 0)\n", + " (0, 532., 3045., 'square', 12., '2', 's2e407', 212, 'um', 1., 0., 0., 1., 13, 11, 215, 1, 0)\n", + " (0, 500., 3060., 'square', 12., '2', 's2e408', 213, 'um', 1., 0., 0., 1., 12, 12, 216, 1, 0)\n", + " (0, 532., 3060., 'square', 12., '2', 's2e409', 214, 'um', 1., 0., 0., 1., 13, 12, 217, 1, 0)\n", + " (0, 500., 3075., 'square', 12., '2', 's2e410', 215, 'um', 1., 0., 0., 1., 12, 13, 218, 1, 0)\n", + " (0, 532., 3075., 'square', 12., '2', 's2e411', 216, 'um', 1., 0., 0., 1., 13, 13, 219, 1, 0)\n", + " (0, 500., 3090., 'square', 12., '2', 's2e412', 217, 'um', 1., 0., 0., 1., 12, 14, 220, 1, 0)\n", + " (0, 532., 3090., 'square', 12., '2', 's2e413', 218, 'um', 1., 0., 0., 1., 13, 14, 221, 1, 0)\n", + " (0, 500., 3105., 'square', 12., '2', 's2e414', 219, 'um', 1., 0., 0., 1., 12, 15, 222, 1, 0)\n", + " (0, 532., 3105., 'square', 12., '2', 's2e415', 220, 'um', 1., 0., 0., 1., 13, 15, 223, 1, 0)\n", + " (0, 500., 3120., 'square', 12., '2', 's2e416', 221, 'um', 1., 0., 0., 1., 14, 0, 224, 1, 0)\n", + " (0, 532., 3120., 'square', 12., '2', 's2e417', 222, 'um', 1., 0., 0., 1., 15, 0, 225, 1, 0)\n", + " (0, 500., 3135., 'square', 12., '2', 's2e418', 223, 'um', 1., 0., 0., 1., 14, 1, 226, 1, 0)\n", + " (0, 532., 3135., 'square', 12., '2', 's2e419', 224, 'um', 1., 0., 0., 1., 15, 1, 227, 1, 0)\n", + " (0, 500., 3150., 'square', 12., '2', 's2e420', 225, 'um', 1., 0., 0., 1., 14, 2, 228, 1, 0)\n", + " (0, 532., 3150., 'square', 12., '2', 's2e421', 226, 'um', 1., 0., 0., 1., 15, 2, 229, 1, 0)\n", + " (0, 500., 3165., 'square', 12., '2', 's2e422', 227, 'um', 1., 0., 0., 1., 14, 3, 230, 1, 0)\n", + " (0, 532., 3165., 'square', 12., '2', 's2e423', 228, 'um', 1., 0., 0., 1., 15, 3, 231, 1, 0)\n", + " (0, 500., 3180., 'square', 12., '2', 's2e424', 229, 'um', 1., 0., 0., 1., 14, 4, 232, 1, 0)\n", + " (0, 532., 3180., 'square', 12., '2', 's2e425', 230, 'um', 1., 0., 0., 1., 15, 4, 233, 1, 0)\n", + " (0, 500., 3195., 'square', 12., '2', 's2e426', 231, 'um', 1., 0., 0., 1., 14, 5, 234, 1, 0)\n", + " (0, 532., 3195., 'square', 12., '2', 's2e427', 232, 'um', 1., 0., 0., 1., 15, 5, 235, 1, 0)\n", + " (0, 500., 3210., 'square', 12., '2', 's2e428', 233, 'um', 1., 0., 0., 1., 14, 6, 236, 1, 0)\n", + " (0, 532., 3210., 'square', 12., '2', 's2e429', 234, 'um', 1., 0., 0., 1., 15, 6, 237, 1, 0)\n", + " (0, 500., 3225., 'square', 12., '2', 's2e430', 235, 'um', 1., 0., 0., 1., 14, 7, 238, 1, 0)\n", + " (0, 532., 3225., 'square', 12., '2', 's2e431', 236, 'um', 1., 0., 0., 1., 15, 7, 239, 1, 0)\n", + " (0, 750., 2880., 'square', 12., '3', 's3e384', 237, 'um', 1., 0., 0., 1., 14, 8, 240, 1, 0)\n", + " (0, 782., 2880., 'square', 12., '3', 's3e385', 238, 'um', 1., 0., 0., 1., 15, 8, 241, 1, 0)\n", + " (0, 750., 2895., 'square', 12., '3', 's3e386', 239, 'um', 1., 0., 0., 1., 14, 9, 242, 1, 0)\n", + " (0, 782., 2895., 'square', 12., '3', 's3e387', 240, 'um', 1., 0., 0., 1., 15, 9, 243, 1, 0)\n", + " (0, 750., 2910., 'square', 12., '3', 's3e388', 241, 'um', 1., 0., 0., 1., 14, 10, 244, 1, 0)\n", + " (0, 782., 2910., 'square', 12., '3', 's3e389', 242, 'um', 1., 0., 0., 1., 15, 10, 245, 1, 0)\n", + " (0, 750., 2925., 'square', 12., '3', 's3e390', 243, 'um', 1., 0., 0., 1., 14, 11, 246, 1, 0)\n", + " (0, 782., 2925., 'square', 12., '3', 's3e391', 244, 'um', 1., 0., 0., 1., 15, 11, 247, 1, 0)\n", + " (0, 750., 2940., 'square', 12., '3', 's3e392', 245, 'um', 1., 0., 0., 1., 14, 12, 248, 1, 0)\n", + " (0, 782., 2940., 'square', 12., '3', 's3e393', 246, 'um', 1., 0., 0., 1., 15, 12, 249, 1, 0)\n", + " (0, 750., 2955., 'square', 12., '3', 's3e394', 247, 'um', 1., 0., 0., 1., 14, 13, 250, 1, 0)\n", + " (0, 782., 2955., 'square', 12., '3', 's3e395', 248, 'um', 1., 0., 0., 1., 15, 13, 251, 1, 0)\n", + " (0, 750., 2970., 'square', 12., '3', 's3e396', 249, 'um', 1., 0., 0., 1., 14, 14, 252, 1, 0)\n", + " (0, 782., 2970., 'square', 12., '3', 's3e397', 250, 'um', 1., 0., 0., 1., 15, 14, 253, 1, 0)\n", + " (0, 750., 2985., 'square', 12., '3', 's3e398', 251, 'um', 1., 0., 0., 1., 14, 15, 254, 1, 0)\n", + " (0, 782., 2985., 'square', 12., '3', 's3e399', 252, 'um', 1., 0., 0., 1., 15, 15, 255, 1, 0)\n", + " (0, 750., 3000., 'square', 12., '3', 's3e400', 253, 'um', 1., 0., 0., 1., 16, 0, 256, 1, 0)\n", + " (0, 782., 3000., 'square', 12., '3', 's3e401', 254, 'um', 1., 0., 0., 1., 17, 0, 257, 1, 0)\n", + " (0, 750., 3015., 'square', 12., '3', 's3e402', 255, 'um', 1., 0., 0., 1., 16, 1, 258, 1, 0)\n", + " (0, 782., 3015., 'square', 12., '3', 's3e403', 256, 'um', 1., 0., 0., 1., 17, 1, 259, 1, 0)\n", + " (0, 750., 3030., 'square', 12., '3', 's3e404', 257, 'um', 1., 0., 0., 1., 16, 2, 260, 1, 0)\n", + " (0, 782., 3030., 'square', 12., '3', 's3e405', 258, 'um', 1., 0., 0., 1., 17, 2, 261, 1, 0)\n", + " (0, 750., 3045., 'square', 12., '3', 's3e406', 259, 'um', 1., 0., 0., 1., 16, 3, 262, 1, 0)\n", + " (0, 782., 3045., 'square', 12., '3', 's3e407', 260, 'um', 1., 0., 0., 1., 17, 3, 263, 1, 0)\n", + " (0, 750., 3060., 'square', 12., '3', 's3e408', 261, 'um', 1., 0., 0., 1., 16, 4, 264, 1, 0)\n", + " (0, 782., 3060., 'square', 12., '3', 's3e409', 262, 'um', 1., 0., 0., 1., 17, 4, 265, 1, 0)\n", + " (0, 750., 3075., 'square', 12., '3', 's3e410', 263, 'um', 1., 0., 0., 1., 16, 5, 266, 1, 0)\n", + " (0, 782., 3075., 'square', 12., '3', 's3e411', 264, 'um', 1., 0., 0., 1., 17, 5, 267, 1, 0)\n", + " (0, 750., 3090., 'square', 12., '3', 's3e412', 265, 'um', 1., 0., 0., 1., 16, 6, 268, 1, 0)\n", + " (0, 782., 3090., 'square', 12., '3', 's3e413', 266, 'um', 1., 0., 0., 1., 17, 6, 269, 1, 0)\n", + " (0, 750., 3105., 'square', 12., '3', 's3e414', 267, 'um', 1., 0., 0., 1., 16, 7, 270, 1, 0)\n", + " (0, 782., 3105., 'square', 12., '3', 's3e415', 268, 'um', 1., 0., 0., 1., 17, 7, 271, 1, 0)\n", + " (0, 750., 3120., 'square', 12., '3', 's3e416', 269, 'um', 1., 0., 0., 1., 16, 8, 272, 1, 0)\n", + " (0, 782., 3120., 'square', 12., '3', 's3e417', 270, 'um', 1., 0., 0., 1., 17, 8, 273, 1, 0)\n", + " (0, 750., 3135., 'square', 12., '3', 's3e418', 271, 'um', 1., 0., 0., 1., 16, 9, 274, 1, 0)\n", + " (0, 782., 3135., 'square', 12., '3', 's3e419', 272, 'um', 1., 0., 0., 1., 17, 9, 275, 1, 0)\n", + " (0, 750., 3150., 'square', 12., '3', 's3e420', 273, 'um', 1., 0., 0., 1., 16, 10, 276, 1, 0)\n", + " (0, 782., 3150., 'square', 12., '3', 's3e421', 274, 'um', 1., 0., 0., 1., 17, 10, 277, 1, 0)\n", + " (0, 750., 3165., 'square', 12., '3', 's3e422', 275, 'um', 1., 0., 0., 1., 16, 11, 278, 1, 0)\n", + " (0, 782., 3165., 'square', 12., '3', 's3e423', 276, 'um', 1., 0., 0., 1., 17, 11, 279, 1, 0)\n", + " (0, 750., 3180., 'square', 12., '3', 's3e424', 277, 'um', 1., 0., 0., 1., 16, 12, 280, 1, 0)\n", + " (0, 782., 3180., 'square', 12., '3', 's3e425', 278, 'um', 1., 0., 0., 1., 17, 12, 281, 1, 0)\n", + " (0, 750., 3195., 'square', 12., '3', 's3e426', 279, 'um', 1., 0., 0., 1., 16, 13, 282, 1, 0)\n", + " (0, 782., 3195., 'square', 12., '3', 's3e427', 280, 'um', 1., 0., 0., 1., 17, 13, 283, 1, 0)\n", + " (0, 750., 3210., 'square', 12., '3', 's3e428', 281, 'um', 1., 0., 0., 1., 16, 14, 284, 1, 0)\n", + " (0, 782., 3210., 'square', 12., '3', 's3e429', 282, 'um', 1., 0., 0., 1., 17, 14, 285, 1, 0)\n", + " (0, 750., 3225., 'square', 12., '3', 's3e430', 283, 'um', 1., 0., 0., 1., 16, 15, 286, 1, 0)\n", + " (0, 782., 3225., 'square', 12., '3', 's3e431', 284, 'um', 1., 0., 0., 1., 17, 15, 287, 1, 0)\n", + " (0, 500., 3240., 'square', 12., '2', 's2e432', 285, 'um', 1., 0., 0., 1., 18, 0, 288, 1, 0)\n", + " (0, 532., 3240., 'square', 12., '2', 's2e433', 286, 'um', 1., 0., 0., 1., 19, 0, 289, 1, 0)\n", + " (0, 500., 3255., 'square', 12., '2', 's2e434', 287, 'um', 1., 0., 0., 1., 18, 1, 290, 1, 0)\n", + " (0, 532., 3255., 'square', 12., '2', 's2e435', 288, 'um', 1., 0., 0., 1., 19, 1, 291, 1, 0)\n", + " (0, 500., 3270., 'square', 12., '2', 's2e436', 289, 'um', 1., 0., 0., 1., 18, 2, 292, 1, 0)\n", + " (0, 532., 3270., 'square', 12., '2', 's2e437', 290, 'um', 1., 0., 0., 1., 19, 2, 293, 1, 0)\n", + " (0, 500., 3285., 'square', 12., '2', 's2e438', 291, 'um', 1., 0., 0., 1., 18, 3, 294, 1, 0)\n", + " (0, 532., 3285., 'square', 12., '2', 's2e439', 292, 'um', 1., 0., 0., 1., 19, 3, 295, 1, 0)\n", + " (0, 500., 3300., 'square', 12., '2', 's2e440', 293, 'um', 1., 0., 0., 1., 18, 4, 296, 1, 0)\n", + " (0, 532., 3300., 'square', 12., '2', 's2e441', 294, 'um', 1., 0., 0., 1., 19, 4, 297, 1, 0)\n", + " (0, 500., 3315., 'square', 12., '2', 's2e442', 295, 'um', 1., 0., 0., 1., 18, 5, 298, 1, 0)\n", + " (0, 532., 3315., 'square', 12., '2', 's2e443', 296, 'um', 1., 0., 0., 1., 19, 5, 299, 1, 0)\n", + " (0, 500., 3330., 'square', 12., '2', 's2e444', 297, 'um', 1., 0., 0., 1., 18, 6, 300, 1, 0)\n", + " (0, 532., 3330., 'square', 12., '2', 's2e445', 298, 'um', 1., 0., 0., 1., 19, 6, 301, 1, 0)\n", + " (0, 500., 3345., 'square', 12., '2', 's2e446', 299, 'um', 1., 0., 0., 1., 18, 7, 302, 1, 0)\n", + " (0, 532., 3345., 'square', 12., '2', 's2e447', 300, 'um', 1., 0., 0., 1., 19, 7, 303, 1, 0)\n", + " (0, 500., 3360., 'square', 12., '2', 's2e448', 301, 'um', 1., 0., 0., 1., 18, 8, 304, 1, 0)\n", + " (0, 532., 3360., 'square', 12., '2', 's2e449', 302, 'um', 1., 0., 0., 1., 19, 8, 305, 1, 0)\n", + " (0, 500., 3375., 'square', 12., '2', 's2e450', 303, 'um', 1., 0., 0., 1., 18, 9, 306, 1, 0)\n", + " (0, 532., 3375., 'square', 12., '2', 's2e451', 304, 'um', 1., 0., 0., 1., 19, 9, 307, 1, 0)\n", + " (0, 500., 3390., 'square', 12., '2', 's2e452', 305, 'um', 1., 0., 0., 1., 18, 10, 308, 1, 0)\n", + " (0, 532., 3390., 'square', 12., '2', 's2e453', 306, 'um', 1., 0., 0., 1., 19, 10, 309, 1, 0)\n", + " (0, 500., 3405., 'square', 12., '2', 's2e454', 307, 'um', 1., 0., 0., 1., 18, 11, 310, 1, 0)\n", + " (0, 532., 3405., 'square', 12., '2', 's2e455', 308, 'um', 1., 0., 0., 1., 19, 11, 311, 1, 0)\n", + " (0, 500., 3420., 'square', 12., '2', 's2e456', 309, 'um', 1., 0., 0., 1., 18, 12, 312, 1, 0)\n", + " (0, 532., 3420., 'square', 12., '2', 's2e457', 310, 'um', 1., 0., 0., 1., 19, 12, 313, 1, 0)\n", + " (0, 500., 3435., 'square', 12., '2', 's2e458', 311, 'um', 1., 0., 0., 1., 18, 13, 314, 1, 0)\n", + " (0, 532., 3435., 'square', 12., '2', 's2e459', 312, 'um', 1., 0., 0., 1., 19, 13, 315, 1, 0)\n", + " (0, 500., 3450., 'square', 12., '2', 's2e460', 313, 'um', 1., 0., 0., 1., 18, 14, 316, 1, 0)\n", + " (0, 532., 3450., 'square', 12., '2', 's2e461', 314, 'um', 1., 0., 0., 1., 19, 14, 317, 1, 0)\n", + " (0, 500., 3465., 'square', 12., '2', 's2e462', 315, 'um', 1., 0., 0., 1., 18, 15, 318, 1, 0)\n", + " (0, 532., 3465., 'square', 12., '2', 's2e463', 316, 'um', 1., 0., 0., 1., 19, 15, 319, 1, 0)\n", + " (0, 500., 3480., 'square', 12., '2', 's2e464', 317, 'um', 1., 0., 0., 1., 20, 0, 320, 1, 0)\n", + " (0, 532., 3480., 'square', 12., '2', 's2e465', 318, 'um', 1., 0., 0., 1., 21, 0, 321, 1, 0)\n", + " (0, 500., 3495., 'square', 12., '2', 's2e466', 319, 'um', 1., 0., 0., 1., 20, 1, 322, 1, 0)\n", + " (0, 532., 3495., 'square', 12., '2', 's2e467', 320, 'um', 1., 0., 0., 1., 21, 1, 323, 1, 0)\n", + " (0, 500., 3510., 'square', 12., '2', 's2e468', 321, 'um', 1., 0., 0., 1., 20, 2, 324, 1, 0)\n", + " (0, 532., 3510., 'square', 12., '2', 's2e469', 322, 'um', 1., 0., 0., 1., 21, 2, 325, 1, 0)\n", + " (0, 500., 3525., 'square', 12., '2', 's2e470', 323, 'um', 1., 0., 0., 1., 20, 3, 326, 1, 0)\n", + " (0, 532., 3525., 'square', 12., '2', 's2e471', 324, 'um', 1., 0., 0., 1., 21, 3, 327, 1, 0)\n", + " (0, 500., 3540., 'square', 12., '2', 's2e472', 325, 'um', 1., 0., 0., 1., 20, 4, 328, 1, 0)\n", + " (0, 532., 3540., 'square', 12., '2', 's2e473', 326, 'um', 1., 0., 0., 1., 21, 4, 329, 1, 0)\n", + " (0, 500., 3555., 'square', 12., '2', 's2e474', 327, 'um', 1., 0., 0., 1., 20, 5, 330, 1, 0)\n", + " (0, 532., 3555., 'square', 12., '2', 's2e475', 328, 'um', 1., 0., 0., 1., 21, 5, 331, 1, 0)\n", + " (0, 500., 3570., 'square', 12., '2', 's2e476', 329, 'um', 1., 0., 0., 1., 20, 6, 332, 1, 0)\n", + " (0, 532., 3570., 'square', 12., '2', 's2e477', 330, 'um', 1., 0., 0., 1., 21, 6, 333, 1, 0)\n", + " (0, 500., 3585., 'square', 12., '2', 's2e478', 331, 'um', 1., 0., 0., 1., 20, 7, 334, 1, 0)\n", + " (0, 532., 3585., 'square', 12., '2', 's2e479', 332, 'um', 1., 0., 0., 1., 21, 7, 335, 1, 0)\n", + " (0, 750., 3240., 'square', 12., '3', 's3e432', 333, 'um', 1., 0., 0., 1., 20, 8, 336, 1, 0)\n", + " (0, 782., 3240., 'square', 12., '3', 's3e433', 334, 'um', 1., 0., 0., 1., 21, 8, 337, 1, 0)\n", + " (0, 750., 3255., 'square', 12., '3', 's3e434', 335, 'um', 1., 0., 0., 1., 20, 9, 338, 1, 0)\n", + " (0, 782., 3255., 'square', 12., '3', 's3e435', 336, 'um', 1., 0., 0., 1., 21, 9, 339, 1, 0)\n", + " (0, 750., 3270., 'square', 12., '3', 's3e436', 337, 'um', 1., 0., 0., 1., 20, 10, 340, 1, 0)\n", + " (0, 782., 3270., 'square', 12., '3', 's3e437', 338, 'um', 1., 0., 0., 1., 21, 10, 341, 1, 0)\n", + " (0, 750., 3285., 'square', 12., '3', 's3e438', 339, 'um', 1., 0., 0., 1., 20, 11, 342, 1, 0)\n", + " (0, 782., 3285., 'square', 12., '3', 's3e439', 340, 'um', 1., 0., 0., 1., 21, 11, 343, 1, 0)\n", + " (0, 750., 3300., 'square', 12., '3', 's3e440', 341, 'um', 1., 0., 0., 1., 20, 12, 344, 1, 0)\n", + " (0, 782., 3300., 'square', 12., '3', 's3e441', 342, 'um', 1., 0., 0., 1., 21, 12, 345, 1, 0)\n", + " (0, 750., 3315., 'square', 12., '3', 's3e442', 343, 'um', 1., 0., 0., 1., 20, 13, 346, 1, 0)\n", + " (0, 782., 3315., 'square', 12., '3', 's3e443', 344, 'um', 1., 0., 0., 1., 21, 13, 347, 1, 0)\n", + " (0, 750., 3330., 'square', 12., '3', 's3e444', 345, 'um', 1., 0., 0., 1., 20, 14, 348, 1, 0)\n", + " (0, 782., 3330., 'square', 12., '3', 's3e445', 346, 'um', 1., 0., 0., 1., 21, 14, 349, 1, 0)\n", + " (0, 750., 3345., 'square', 12., '3', 's3e446', 347, 'um', 1., 0., 0., 1., 20, 15, 350, 1, 0)\n", + " (0, 782., 3345., 'square', 12., '3', 's3e447', 348, 'um', 1., 0., 0., 1., 21, 15, 351, 1, 0)\n", + " (0, 750., 3360., 'square', 12., '3', 's3e448', 349, 'um', 1., 0., 0., 1., 22, 0, 352, 1, 0)\n", + " (0, 782., 3360., 'square', 12., '3', 's3e449', 350, 'um', 1., 0., 0., 1., 23, 0, 353, 1, 0)\n", + " (0, 750., 3375., 'square', 12., '3', 's3e450', 351, 'um', 1., 0., 0., 1., 22, 1, 354, 1, 0)\n", + " (0, 782., 3375., 'square', 12., '3', 's3e451', 352, 'um', 1., 0., 0., 1., 23, 1, 355, 1, 0)\n", + " (0, 750., 3390., 'square', 12., '3', 's3e452', 353, 'um', 1., 0., 0., 1., 22, 2, 356, 1, 0)\n", + " (0, 782., 3390., 'square', 12., '3', 's3e453', 354, 'um', 1., 0., 0., 1., 23, 2, 357, 1, 0)\n", + " (0, 750., 3405., 'square', 12., '3', 's3e454', 355, 'um', 1., 0., 0., 1., 22, 3, 358, 1, 0)\n", + " (0, 782., 3405., 'square', 12., '3', 's3e455', 356, 'um', 1., 0., 0., 1., 23, 3, 359, 1, 0)\n", + " (0, 750., 3420., 'square', 12., '3', 's3e456', 357, 'um', 1., 0., 0., 1., 22, 4, 360, 1, 0)\n", + " (0, 782., 3420., 'square', 12., '3', 's3e457', 358, 'um', 1., 0., 0., 1., 23, 4, 361, 1, 0)\n", + " (0, 750., 3435., 'square', 12., '3', 's3e458', 359, 'um', 1., 0., 0., 1., 22, 5, 362, 1, 0)\n", + " (0, 782., 3435., 'square', 12., '3', 's3e459', 360, 'um', 1., 0., 0., 1., 23, 5, 363, 1, 0)\n", + " (0, 750., 3450., 'square', 12., '3', 's3e460', 361, 'um', 1., 0., 0., 1., 22, 6, 364, 1, 0)\n", + " (0, 782., 3450., 'square', 12., '3', 's3e461', 362, 'um', 1., 0., 0., 1., 23, 6, 365, 1, 0)\n", + " (0, 750., 3465., 'square', 12., '3', 's3e462', 363, 'um', 1., 0., 0., 1., 22, 7, 366, 1, 0)\n", + " (0, 782., 3465., 'square', 12., '3', 's3e463', 364, 'um', 1., 0., 0., 1., 23, 7, 367, 1, 0)\n", + " (0, 750., 3480., 'square', 12., '3', 's3e464', 365, 'um', 1., 0., 0., 1., 22, 8, 368, 1, 0)\n", + " (0, 782., 3480., 'square', 12., '3', 's3e465', 366, 'um', 1., 0., 0., 1., 23, 8, 369, 1, 0)\n", + " (0, 782., 3495., 'square', 12., '3', 's3e467', 367, 'um', 1., 0., 0., 1., 23, 9, 371, 1, 0)\n", + " (0, 750., 3510., 'square', 12., '3', 's3e468', 368, 'um', 1., 0., 0., 1., 22, 10, 372, 1, 0)\n", + " (0, 782., 3510., 'square', 12., '3', 's3e469', 369, 'um', 1., 0., 0., 1., 23, 10, 373, 1, 0)\n", + " (0, 750., 3525., 'square', 12., '3', 's3e470', 370, 'um', 1., 0., 0., 1., 22, 11, 374, 1, 0)\n", + " (0, 782., 3525., 'square', 12., '3', 's3e471', 371, 'um', 1., 0., 0., 1., 23, 11, 375, 1, 0)\n", + " (0, 750., 3540., 'square', 12., '3', 's3e472', 372, 'um', 1., 0., 0., 1., 22, 12, 376, 1, 0)\n", + " (0, 782., 3540., 'square', 12., '3', 's3e473', 373, 'um', 1., 0., 0., 1., 23, 12, 377, 1, 0)\n", + " (0, 750., 3555., 'square', 12., '3', 's3e474', 374, 'um', 1., 0., 0., 1., 22, 13, 378, 1, 0)\n", + " (0, 782., 3555., 'square', 12., '3', 's3e475', 375, 'um', 1., 0., 0., 1., 23, 13, 379, 1, 0)\n", + " (0, 750., 3570., 'square', 12., '3', 's3e476', 376, 'um', 1., 0., 0., 1., 22, 14, 380, 1, 0)\n", + " (0, 782., 3570., 'square', 12., '3', 's3e477', 377, 'um', 1., 0., 0., 1., 23, 14, 381, 1, 0)\n", + " (0, 750., 3585., 'square', 12., '3', 's3e478', 378, 'um', 1., 0., 0., 1., 22, 15, 382, 1, 0)\n", + " (0, 782., 3585., 'square', 12., '3', 's3e479', 379, 'um', 1., 0., 0., 1., 23, 15, 383, 1, 0)]
    location[[ 500. 3600.]\n", + " [ 532. 3600.]\n", + " [ 500. 3615.]\n", + " [ 532. 3615.]\n", + " [ 500. 3630.]\n", + " [ 532. 3630.]\n", + " [ 500. 3645.]\n", + " [ 532. 3645.]\n", + " [ 500. 3660.]\n", + " [ 532. 3660.]\n", + " [ 500. 3675.]\n", + " [ 532. 3675.]\n", + " [ 500. 3690.]\n", + " [ 532. 3690.]\n", + " [ 500. 3705.]\n", + " [ 532. 3705.]\n", + " [ 500. 3720.]\n", + " [ 532. 3720.]\n", + " [ 500. 3735.]\n", + " [ 532. 3735.]\n", + " [ 500. 3750.]\n", + " [ 532. 3750.]\n", + " [ 500. 3765.]\n", + " [ 532. 3765.]\n", + " [ 500. 3780.]\n", + " [ 532. 3780.]\n", + " [ 500. 3795.]\n", + " [ 532. 3795.]\n", + " [ 500. 3810.]\n", + " [ 532. 3810.]\n", + " [ 500. 3825.]\n", + " [ 532. 3825.]\n", + " [ 500. 3840.]\n", + " [ 532. 3840.]\n", + " [ 500. 3855.]\n", + " [ 532. 3855.]\n", + " [ 500. 3870.]\n", + " [ 532. 3870.]\n", + " [ 500. 3885.]\n", + " [ 532. 3885.]\n", + " [ 500. 3900.]\n", + " [ 532. 3900.]\n", + " [ 500. 3915.]\n", + " [ 532. 3915.]\n", + " [ 500. 3930.]\n", + " [ 532. 3930.]\n", + " [ 500. 3945.]\n", + " [ 532. 3945.]\n", + " [ 750. 3600.]\n", + " [ 782. 3600.]\n", + " [ 750. 3615.]\n", + " [ 782. 3615.]\n", + " [ 750. 3630.]\n", + " [ 782. 3630.]\n", + " [ 750. 3645.]\n", + " [ 782. 3645.]\n", + " [ 750. 3660.]\n", + " [ 782. 3660.]\n", + " [ 750. 3675.]\n", + " [ 782. 3675.]\n", + " [ 750. 3690.]\n", + " [ 782. 3690.]\n", + " [ 750. 3705.]\n", + " [ 782. 3705.]\n", + " [ 750. 3720.]\n", + " [ 782. 3720.]\n", + " [ 750. 3735.]\n", + " [ 782. 3735.]\n", + " [ 750. 3750.]\n", + " [ 782. 3750.]\n", + " [ 750. 3765.]\n", + " [ 782. 3765.]\n", + " [ 750. 3780.]\n", + " [ 782. 3780.]\n", + " [ 750. 3795.]\n", + " [ 782. 3795.]\n", + " [ 750. 3810.]\n", + " [ 782. 3810.]\n", + " [ 750. 3825.]\n", + " [ 782. 3825.]\n", + " [ 750. 3840.]\n", + " [ 782. 3840.]\n", + " [ 750. 3855.]\n", + " [ 782. 3855.]\n", + " [ 750. 3870.]\n", + " [ 782. 3870.]\n", + " [ 750. 3885.]\n", + " [ 782. 3885.]\n", + " [ 750. 3900.]\n", + " [ 782. 3900.]\n", + " [ 750. 3915.]\n", + " [ 782. 3915.]\n", + " [ 750. 3930.]\n", + " [ 782. 3930.]\n", + " [ 750. 3945.]\n", + " [ 782. 3945.]\n", + " [ 500. 3960.]\n", + " [ 532. 3960.]\n", + " [ 500. 3975.]\n", + " [ 532. 3975.]\n", + " [ 500. 3990.]\n", + " [ 532. 3990.]\n", + " [ 500. 4005.]\n", + " [ 532. 4005.]\n", + " [ 500. 4020.]\n", + " [ 532. 4020.]\n", + " [ 500. 4035.]\n", + " [ 532. 4035.]\n", + " [ 500. 4050.]\n", + " [ 532. 4050.]\n", + " [ 500. 4065.]\n", + " [ 532. 4065.]\n", + " [ 500. 4080.]\n", + " [ 532. 4080.]\n", + " [ 500. 4095.]\n", + " [ 532. 4095.]\n", + " [ 500. 4110.]\n", + " [ 532. 4110.]\n", + " [ 500. 4125.]\n", + " [ 532. 4125.]\n", + " [ 500. 4140.]\n", + " [ 532. 4140.]\n", + " [ 500. 4155.]\n", + " [ 532. 4155.]\n", + " [ 500. 4170.]\n", + " [ 532. 4170.]\n", + " [ 500. 4185.]\n", + " [ 500. 4200.]\n", + " [ 532. 4200.]\n", + " [ 500. 4215.]\n", + " [ 532. 4215.]\n", + " [ 500. 4230.]\n", + " [ 532. 4230.]\n", + " [ 500. 4245.]\n", + " [ 532. 4245.]\n", + " [ 500. 4260.]\n", + " [ 532. 4260.]\n", + " [ 500. 4275.]\n", + " [ 532. 4275.]\n", + " [ 500. 4290.]\n", + " [ 532. 4290.]\n", + " [ 500. 4305.]\n", + " [ 532. 4305.]\n", + " [ 750. 3960.]\n", + " [ 782. 3960.]\n", + " [ 750. 3975.]\n", + " [ 782. 3975.]\n", + " [ 750. 3990.]\n", + " [ 782. 3990.]\n", + " [ 750. 4005.]\n", + " [ 782. 4005.]\n", + " [ 750. 4020.]\n", + " [ 782. 4020.]\n", + " [ 750. 4035.]\n", + " [ 782. 4035.]\n", + " [ 750. 4050.]\n", + " [ 782. 4050.]\n", + " [ 750. 4065.]\n", + " [ 782. 4065.]\n", + " [ 750. 4080.]\n", + " [ 782. 4080.]\n", + " [ 750. 4095.]\n", + " [ 782. 4095.]\n", + " [ 750. 4110.]\n", + " [ 782. 4110.]\n", + " [ 750. 4125.]\n", + " [ 782. 4125.]\n", + " [ 750. 4140.]\n", + " [ 782. 4140.]\n", + " [ 750. 4155.]\n", + " [ 782. 4155.]\n", + " [ 750. 4170.]\n", + " [ 782. 4170.]\n", + " [ 750. 4185.]\n", + " [ 782. 4185.]\n", + " [ 750. 4200.]\n", + " [ 782. 4200.]\n", + " [ 750. 4215.]\n", + " [ 782. 4215.]\n", + " [ 750. 4230.]\n", + " [ 782. 4230.]\n", + " [ 750. 4245.]\n", + " [ 750. 4260.]\n", + " [ 782. 4260.]\n", + " [ 750. 4275.]\n", + " [ 782. 4275.]\n", + " [ 782. 4290.]\n", + " [ 750. 4305.]\n", + " [ 782. 4305.]\n", + " [ 500. 2880.]\n", + " [ 532. 2880.]\n", + " [ 500. 2895.]\n", + " [ 532. 2895.]\n", + " [ 500. 2910.]\n", + " [ 532. 2910.]\n", + " [ 500. 2925.]\n", + " [ 532. 2925.]\n", + " [ 500. 2940.]\n", + " [ 532. 2940.]\n", + " [ 500. 2955.]\n", + " [ 532. 2955.]\n", + " [ 500. 2970.]\n", + " [ 532. 2970.]\n", + " [ 500. 2985.]\n", + " [ 532. 2985.]\n", + " [ 500. 3000.]\n", + " [ 532. 3000.]\n", + " [ 500. 3015.]\n", + " [ 532. 3015.]\n", + " [ 500. 3030.]\n", + " [ 532. 3030.]\n", + " [ 500. 3045.]\n", + " [ 532. 3045.]\n", + " [ 500. 3060.]\n", + " [ 532. 3060.]\n", + " [ 500. 3075.]\n", + " [ 532. 3075.]\n", + " [ 500. 3090.]\n", + " [ 532. 3090.]\n", + " [ 500. 3105.]\n", + " [ 532. 3105.]\n", + " [ 500. 3120.]\n", + " [ 532. 3120.]\n", + " [ 500. 3135.]\n", + " [ 532. 3135.]\n", + " [ 500. 3150.]\n", + " [ 532. 3150.]\n", + " [ 500. 3165.]\n", + " [ 532. 3165.]\n", + " [ 500. 3180.]\n", + " [ 532. 3180.]\n", + " [ 500. 3195.]\n", + " [ 532. 3195.]\n", + " [ 500. 3210.]\n", + " [ 532. 3210.]\n", + " [ 500. 3225.]\n", + " [ 532. 3225.]\n", + " [ 750. 2880.]\n", + " [ 782. 2880.]\n", + " [ 750. 2895.]\n", + " [ 782. 2895.]\n", + " [ 750. 2910.]\n", + " [ 782. 2910.]\n", + " [ 750. 2925.]\n", + " [ 782. 2925.]\n", + " [ 750. 2940.]\n", + " [ 782. 2940.]\n", + " [ 750. 2955.]\n", + " [ 782. 2955.]\n", + " [ 750. 2970.]\n", + " [ 782. 2970.]\n", + " [ 750. 2985.]\n", + " [ 782. 2985.]\n", + " [ 750. 3000.]\n", + " [ 782. 3000.]\n", + " [ 750. 3015.]\n", + " [ 782. 3015.]\n", + " [ 750. 3030.]\n", + " [ 782. 3030.]\n", + " [ 750. 3045.]\n", + " [ 782. 3045.]\n", + " [ 750. 3060.]\n", + " [ 782. 3060.]\n", + " [ 750. 3075.]\n", + " [ 782. 3075.]\n", + " [ 750. 3090.]\n", + " [ 782. 3090.]\n", + " [ 750. 3105.]\n", + " [ 782. 3105.]\n", + " [ 750. 3120.]\n", + " [ 782. 3120.]\n", + " [ 750. 3135.]\n", + " [ 782. 3135.]\n", + " [ 750. 3150.]\n", + " [ 782. 3150.]\n", + " [ 750. 3165.]\n", + " [ 782. 3165.]\n", + " [ 750. 3180.]\n", + " [ 782. 3180.]\n", + " [ 750. 3195.]\n", + " [ 782. 3195.]\n", + " [ 750. 3210.]\n", + " [ 782. 3210.]\n", + " [ 750. 3225.]\n", + " [ 782. 3225.]\n", + " [ 500. 3240.]\n", + " [ 532. 3240.]\n", + " [ 500. 3255.]\n", + " [ 532. 3255.]\n", + " [ 500. 3270.]\n", + " [ 532. 3270.]\n", + " [ 500. 3285.]\n", + " [ 532. 3285.]\n", + " [ 500. 3300.]\n", + " [ 532. 3300.]\n", + " [ 500. 3315.]\n", + " [ 532. 3315.]\n", + " [ 500. 3330.]\n", + " [ 532. 3330.]\n", + " [ 500. 3345.]\n", + " [ 532. 3345.]\n", + " [ 500. 3360.]\n", + " [ 532. 3360.]\n", + " [ 500. 3375.]\n", + " [ 532. 3375.]\n", + " [ 500. 3390.]\n", + " [ 532. 3390.]\n", + " [ 500. 3405.]\n", + " [ 532. 3405.]\n", + " [ 500. 3420.]\n", + " [ 532. 3420.]\n", + " [ 500. 3435.]\n", + " [ 532. 3435.]\n", + " [ 500. 3450.]\n", + " [ 532. 3450.]\n", + " [ 500. 3465.]\n", + " [ 532. 3465.]\n", + " [ 500. 3480.]\n", + " [ 532. 3480.]\n", + " [ 500. 3495.]\n", + " [ 532. 3495.]\n", + " [ 500. 3510.]\n", + " [ 532. 3510.]\n", + " [ 500. 3525.]\n", + " [ 532. 3525.]\n", + " [ 500. 3540.]\n", + " [ 532. 3540.]\n", + " [ 500. 3555.]\n", + " [ 532. 3555.]\n", + " [ 500. 3570.]\n", + " [ 532. 3570.]\n", + " [ 500. 3585.]\n", + " [ 532. 3585.]\n", + " [ 750. 3240.]\n", + " [ 782. 3240.]\n", + " [ 750. 3255.]\n", + " [ 782. 3255.]\n", + " [ 750. 3270.]\n", + " [ 782. 3270.]\n", + " [ 750. 3285.]\n", + " [ 782. 3285.]\n", + " [ 750. 3300.]\n", + " [ 782. 3300.]\n", + " [ 750. 3315.]\n", + " [ 782. 3315.]\n", + " [ 750. 3330.]\n", + " [ 782. 3330.]\n", + " [ 750. 3345.]\n", + " [ 782. 3345.]\n", + " [ 750. 3360.]\n", + " [ 782. 3360.]\n", + " [ 750. 3375.]\n", + " [ 782. 3375.]\n", + " [ 750. 3390.]\n", + " [ 782. 3390.]\n", + " [ 750. 3405.]\n", + " [ 782. 3405.]\n", + " [ 750. 3420.]\n", + " [ 782. 3420.]\n", + " [ 750. 3435.]\n", + " [ 782. 3435.]\n", + " [ 750. 3450.]\n", + " [ 782. 3450.]\n", + " [ 750. 3465.]\n", + " [ 782. 3465.]\n", + " [ 750. 3480.]\n", + " [ 782. 3480.]\n", + " [ 782. 3495.]\n", + " [ 750. 3510.]\n", + " [ 782. 3510.]\n", + " [ 750. 3525.]\n", + " [ 782. 3525.]\n", + " [ 750. 3540.]\n", + " [ 782. 3540.]\n", + " [ 750. 3555.]\n", + " [ 782. 3555.]\n", + " [ 750. 3570.]\n", + " [ 782. 3570.]\n", + " [ 750. 3585.]\n", + " [ 782. 3585.]]
    group[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1\n", + " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + " 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + " 1 1 1 1 1 1 1 1 1 1]
    channel_name['AP0' 'AP1' 'AP2' 'AP3' 'AP4' 'AP5' 'AP6' 'AP7' 'AP8' 'AP9' 'AP10' 'AP11'\n", + " 'AP12' 'AP13' 'AP14' 'AP15' 'AP16' 'AP17' 'AP18' 'AP19' 'AP20' 'AP21'\n", + " 'AP22' 'AP23' 'AP24' 'AP25' 'AP26' 'AP27' 'AP28' 'AP29' 'AP30' 'AP31'\n", + " 'AP32' 'AP33' 'AP34' 'AP35' 'AP36' 'AP37' 'AP38' 'AP39' 'AP40' 'AP41'\n", + " 'AP42' 'AP43' 'AP44' 'AP45' 'AP46' 'AP47' 'AP48' 'AP49' 'AP50' 'AP51'\n", + " 'AP52' 'AP53' 'AP54' 'AP55' 'AP56' 'AP57' 'AP58' 'AP59' 'AP60' 'AP61'\n", + " 'AP62' 'AP63' 'AP64' 'AP65' 'AP66' 'AP67' 'AP68' 'AP69' 'AP70' 'AP71'\n", + " 'AP72' 'AP73' 'AP74' 'AP75' 'AP76' 'AP77' 'AP78' 'AP79' 'AP80' 'AP81'\n", + " 'AP82' 'AP83' 'AP84' 'AP85' 'AP86' 'AP87' 'AP88' 'AP89' 'AP90' 'AP91'\n", + " 'AP92' 'AP93' 'AP94' 'AP95' 'AP96' 'AP97' 'AP98' 'AP99' 'AP100' 'AP101'\n", + " 'AP102' 'AP103' 'AP104' 'AP105' 'AP106' 'AP107' 'AP108' 'AP109' 'AP110'\n", + " 'AP111' 'AP112' 'AP113' 'AP114' 'AP115' 'AP116' 'AP117' 'AP118' 'AP119'\n", + " 'AP120' 'AP121' 'AP122' 'AP123' 'AP124' 'AP125' 'AP126' 'AP128' 'AP129'\n", + " 'AP130' 'AP131' 'AP132' 'AP133' 'AP134' 'AP135' 'AP136' 'AP137' 'AP138'\n", + " 'AP139' 'AP140' 'AP141' 'AP142' 'AP143' 'AP144' 'AP145' 'AP146' 'AP147'\n", + " 'AP148' 'AP149' 'AP150' 'AP151' 'AP152' 'AP153' 'AP154' 'AP155' 'AP156'\n", + " 'AP157' 'AP158' 'AP159' 'AP160' 'AP161' 'AP162' 'AP163' 'AP164' 'AP165'\n", + " 'AP166' 'AP167' 'AP168' 'AP169' 'AP170' 'AP171' 'AP172' 'AP173' 'AP174'\n", + " 'AP175' 'AP176' 'AP177' 'AP178' 'AP179' 'AP180' 'AP181' 'AP182' 'AP184'\n", + " 'AP185' 'AP186' 'AP187' 'AP189' 'AP190' 'AP191' 'AP192' 'AP193' 'AP194'\n", + " 'AP195' 'AP196' 'AP197' 'AP198' 'AP199' 'AP200' 'AP201' 'AP202' 'AP203'\n", + " 'AP204' 'AP205' 'AP206' 'AP207' 'AP208' 'AP209' 'AP210' 'AP211' 'AP212'\n", + " 'AP213' 'AP214' 'AP215' 'AP216' 'AP217' 'AP218' 'AP219' 'AP220' 'AP221'\n", + " 'AP222' 'AP223' 'AP224' 'AP225' 'AP226' 'AP227' 'AP228' 'AP229' 'AP230'\n", + " 'AP231' 'AP232' 'AP233' 'AP234' 'AP235' 'AP236' 'AP237' 'AP238' 'AP239'\n", + " 'AP240' 'AP241' 'AP242' 'AP243' 'AP244' 'AP245' 'AP246' 'AP247' 'AP248'\n", + " 'AP249' 'AP250' 'AP251' 'AP252' 'AP253' 'AP254' 'AP255' 'AP256' 'AP257'\n", + " 'AP258' 'AP259' 'AP260' 'AP261' 'AP262' 'AP263' 'AP264' 'AP265' 'AP266'\n", + " 'AP267' 'AP268' 'AP269' 'AP270' 'AP271' 'AP272' 'AP273' 'AP274' 'AP275'\n", + " 'AP276' 'AP277' 'AP278' 'AP279' 'AP280' 'AP281' 'AP282' 'AP283' 'AP284'\n", + " 'AP285' 'AP286' 'AP287' 'AP288' 'AP289' 'AP290' 'AP291' 'AP292' 'AP293'\n", + " 'AP294' 'AP295' 'AP296' 'AP297' 'AP298' 'AP299' 'AP300' 'AP301' 'AP302'\n", + " 'AP303' 'AP304' 'AP305' 'AP306' 'AP307' 'AP308' 'AP309' 'AP310' 'AP311'\n", + " 'AP312' 'AP313' 'AP314' 'AP315' 'AP316' 'AP317' 'AP318' 'AP319' 'AP320'\n", + " 'AP321' 'AP322' 'AP323' 'AP324' 'AP325' 'AP326' 'AP327' 'AP328' 'AP329'\n", + " 'AP330' 'AP331' 'AP332' 'AP333' 'AP334' 'AP335' 'AP336' 'AP337' 'AP338'\n", + " 'AP339' 'AP340' 'AP341' 'AP342' 'AP343' 'AP344' 'AP345' 'AP346' 'AP347'\n", + " 'AP348' 'AP349' 'AP350' 'AP351' 'AP352' 'AP353' 'AP354' 'AP355' 'AP356'\n", + " 'AP357' 'AP358' 'AP359' 'AP360' 'AP361' 'AP362' 'AP363' 'AP364' 'AP365'\n", + " 'AP366' 'AP367' 'AP368' 'AP369' 'AP371' 'AP372' 'AP373' 'AP374' 'AP375'\n", + " 'AP376' 'AP377' 'AP378' 'AP379' 'AP380' 'AP381' 'AP382' 'AP383']
    inter_sample_shift[0. 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25\n", + " 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625\n", + " 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875\n", + " 0.9375 0.9375 0. 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875\n", + " 0.25 0.25 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5\n", + " 0.5625 0.5625 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125\n", + " 0.875 0.875 0.9375 0.9375 0. 0. 0.0625 0.0625 0.125 0.125\n", + " 0.1875 0.1875 0.25 0.25 0.3125 0.3125 0.375 0.375 0.4375 0.4375\n", + " 0.5 0.5 0.5625 0.5625 0.625 0.625 0.6875 0.6875 0.75 0.75\n", + " 0.8125 0.8125 0.875 0.875 0.9375 0.9375 0. 0. 0.0625 0.0625\n", + " 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125 0.3125 0.375 0.375\n", + " 0.4375 0.4375 0.5 0.5 0.5625 0.5625 0.625 0.625 0.6875 0.6875\n", + " 0.75 0.75 0.8125 0.8125 0.875 0.875 0.9375 0. 0. 0.0625\n", + " 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125 0.3125 0.375\n", + " 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625 0.625 0.625 0.6875\n", + " 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875 0.9375 0.9375 0.\n", + " 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125\n", + " 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625 0.625\n", + " 0.625 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.9375 0.9375 0.\n", + " 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125\n", + " 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625 0.625\n", + " 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875 0.9375\n", + " 0.9375 0. 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25\n", + " 0.25 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625\n", + " 0.5625 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125 0.8125 0.875\n", + " 0.875 0.9375 0.9375 0. 0. 0.0625 0.0625 0.125 0.125 0.1875\n", + " 0.1875 0.25 0.25 0.3125 0.3125 0.375 0.375 0.4375 0.4375 0.5\n", + " 0.5 0.5625 0.5625 0.625 0.625 0.6875 0.6875 0.75 0.75 0.8125\n", + " 0.8125 0.875 0.875 0.9375 0.9375 0. 0. 0.0625 0.0625 0.125\n", + " 0.125 0.1875 0.1875 0.25 0.25 0.3125 0.3125 0.375 0.375 0.4375\n", + " 0.4375 0.5 0.5 0.5625 0.5625 0.625 0.625 0.6875 0.6875 0.75\n", + " 0.75 0.8125 0.8125 0.875 0.875 0.9375 0.9375 0. 0. 0.0625\n", + " 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125 0.3125 0.375\n", + " 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.5625 0.625 0.625 0.6875\n", + " 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875 0.9375 0.9375 0.\n", + " 0. 0.0625 0.0625 0.125 0.125 0.1875 0.1875 0.25 0.25 0.3125\n", + " 0.3125 0.375 0.375 0.4375 0.4375 0.5 0.5 0.5625 0.625 0.625\n", + " 0.6875 0.6875 0.75 0.75 0.8125 0.8125 0.875 0.875 0.9375 0.9375]
    offset_to_physical_unit[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", + " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
    gain_to_physical_unit[0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945 0.76293945\n", + " 0.76293945 0.76293945]
    physical_unit['uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV' 'uV'\n", + " 'uV' 'uV']
" + ], + "text/plain": [ + "BinaryFolderRecording: 380 channels - 30000.036975 Hz - 1 segments - 136,752,912 samples \n", + " 4,558.42s (1.27 hours) - int16 dtype - 96.79 GiB" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job_kwargs = dict(n_jobs=-1, chunk_duration=\"1s\", progress_bar=True)\n", + "\n", + "if preprocessed_exists:\n", + " print(f\"Loading existing preprocessed recording from {preprocessed_folder}\")\n", + " rec_preprocessed = si.load(preprocessed_folder)\n", + "else:\n", + " print(f\"Saving preprocessed recording to {preprocessed_folder}...\")\n", + " rec_preprocessed = rec_cmr.save(folder=preprocessed_folder, format=\"binary\", **job_kwargs)\n", + "\n", + "rec_preprocessed" + ] + }, + { + "cell_type": "markdown", + "id": "cjy3lovwtm6", + "metadata": {}, + "source": [ + "## 3. Run Kilosort4\n", + "\n", + "Make sure Kilosort4 is installed: `pip install kilosort`\n", + "\n", + "Since we already applied our own preprocessing (highpass, bad channel removal, phase shift, CMR), we tell Kilosort4 to **skip its internal preprocessing** and **disable its CAR**." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8q7ns9vasmj", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Th_learned': 8,\n", + " 'Th_single_ch': 6,\n", + " 'Th_universal': 9,\n", + " 'acg_threshold': 0.2,\n", + " 'artifact_threshold': inf,\n", + " 'bad_channels': None,\n", + " 'batch_downsampling': 1,\n", + " 'batch_size': 60000,\n", + " 'binning_depth': 5,\n", + " 'ccg_threshold': 0.25,\n", + " 'chunk_duration': '1s',\n", + " 'clear_cache': False,\n", + " 'cluster_downsampling': 20,\n", + " 'cluster_init_seed': 5,\n", + " 'cluster_neighbors': 10,\n", + " 'delete_recording_dat': True,\n", + " 'dmin': None,\n", + " 'dminx': 32,\n", + " 'do_CAR': True,\n", + " 'do_correction': True,\n", + " 'drift_smoothing': [0.5, 0.5, 0.5],\n", + " 'duplicate_spike_ms': 0.25,\n", + " 'highpass_cutoff': 300,\n", + " 'invert_sign': False,\n", + " 'keep_good_only': False,\n", + " 'max_channel_distance': 32,\n", + " 'max_cluster_subset': 25000,\n", + " 'max_peels': 100,\n", + " 'max_threads_per_worker': 1,\n", + " 'min_template_size': 10,\n", + " 'mp_context': None,\n", + " 'n_jobs': 1,\n", + " 'n_pcs': 6,\n", + " 'n_templates': 6,\n", + " 'nblocks': 1,\n", + " 'nearest_chans': 10,\n", + " 'nearest_templates': 100,\n", + " 'nskip': 25,\n", + " 'nt': 61,\n", + " 'nt0min': None,\n", + " 'pool_engine': 'process',\n", + " 'position_limit': 100,\n", + " 'progress_bar': True,\n", + " 'save_extra_vars': False,\n", + " 'save_preprocessed_copy': False,\n", + " 'scale': None,\n", + " 'shift': None,\n", + " 'sig_interp': 20,\n", + " 'skip_kilosort_preprocessing': False,\n", + " 'template_sizes': 5,\n", + " 'templates_from_data': True,\n", + " 'torch_device': 'auto',\n", + " 'use_binary_file': True,\n", + " 'whitening_range': 32,\n", + " 'x_centers': None}\n" + ] + } + ], + "source": [ + "# Check default Kilosort4 parameters\n", + "pprint(si.get_default_sorter_params(\"kilosort4\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "ge9zok9icw", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading existing Kilosort4 output from /Volumes/witten/Julie/bombcell_test_datasets/from_Scott_striatum_empty_units/TowersTask_g0/kilosort4_output\n", + "Kilosort4 found 634 units\n" + ] + } + ], + "source": [ + "if kilosort_folder.exists():\n", + " print(f\"Loading existing Kilosort4 output from {kilosort_folder}\")\n", + " # register_recording=False avoids errors when the original recording path\n", + " # no longer exists (e.g. different mount point). The recording is linked\n", + " # later when creating the SortingAnalyzer.\n", + " sorting = si.read_sorter_folder(kilosort_folder, register_recording=False)\n", + "else:\n", + " print(\"Running Kilosort4...\")\n", + " sorting = si.run_sorter(\n", + " sorter_name=\"kilosort4\",\n", + " recording=rec_preprocessed,\n", + " folder=kilosort_folder,\n", + " remove_existing_folder=True,\n", + " verbose=True,\n", + " skip_kilosort_preprocessing=True, # We already preprocessed\n", + " do_CAR=False, # We already applied CMR\n", + " )\n", + "print(f\"Kilosort4 found {len(sorting.unit_ids)} units\")" + ] + }, + { + "cell_type": "markdown", + "id": "g625x5tjy87", + "metadata": {}, + "source": [ + "## 4. Create SortingAnalyzer and compute bombcell requirements\n", + "\n", + "The `SortingAnalyzer` links the sorting result back to the recording and lets us compute **extensions** (waveforms, templates, metrics, etc.).\n", + "\n", + "bombcell needs two sets of metrics:\n", + "- **Quality metrics**: amplitude_median, snr, amplitude_cutoff, num_spikes, rp_contamination, presence_ratio, drift_ptp, and optionally isolation_distance and l_ratio (distance metrics)\n", + "- **Template metrics**: peak_to_trough_duration, num_positive/negative_peaks, waveform_baseline_flatness, exp_decay, and several peak ratio metrics\n", + "\n", + "We compute these step by step below." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "75jnk6rjjr", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading existing SortingAnalyzer from /Volumes/witten/Julie/bombcell_test_datasets/from_Scott_striatum_empty_units/TowersTask_g0/sorting_analyzer.zarr\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jf5479/Dropbox/Python/spikeinterface/src/spikeinterface/core/sortinganalyzer.py:2504: UserWarning: Found no run_info file for amplitude_scalings, extension should be re-computed.\n", + " warnings.warn(f\"Found no run_info file for {self.extension_name}, extension should be re-computed.\")\n", + "/Users/jf5479/Dropbox/Python/spikeinterface/src/spikeinterface/core/sortinganalyzer.py:2586: UserWarning: Found no data for amplitude_scalings, extension should be re-computed.\n", + " warnings.warn(f\"Found no data for {self.extension_name}, extension should be re-computed.\")\n" + ] + }, + { + "data": { + "text/plain": [ + "SortingAnalyzer: 380 channels - 634 units - 1 segments - zarr - sparse - has recording\n", + "Loaded 9 extensions: amplitude_scalings, noise_levels, random_spikes, spike_amplitudes, spike_locations, template_metrics, templates, unit_locations, waveforms" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "if analyzer_folder.exists():\n", + " print(f\"Loading existing SortingAnalyzer from {analyzer_folder}\")\n", + " analyzer = si.load_sorting_analyzer(analyzer_folder)\n", + " # Re-attach recording if available (needed for computing new extensions)\n", + " if not analyzer.has_recording():\n", + " analyzer.set_temporary_recording(rec_preprocessed)\n", + "else:\n", + " print(\"Creating new SortingAnalyzer...\")\n", + " analyzer = si.create_sorting_analyzer(\n", + " sorting=sorting,\n", + " recording=rec_preprocessed,\n", + " sparse=True,\n", + " format=\"zarr\",\n", + " folder=analyzer_folder,\n", + " return_in_uV=True,\n", + " )\n", + "analyzer" + ] + }, + { + "cell_type": "markdown", + "id": "4nnsosqfyqb", + "metadata": {}, + "source": [ + "### 4a. Core extensions (waveforms and templates)\n", + "\n", + "These are prerequisites for all metrics." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ngj8m023w2e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Core extensions ready.\n" + ] + } + ], + "source": [ + "# Compute extensions if not already present\n", + "if not analyzer.has_extension(\"random_spikes\"):\n", + " print(\"Computing random_spikes...\")\n", + " analyzer.compute(\"random_spikes\", method=\"uniform\", max_spikes_per_unit=500)\n", + "\n", + "if not analyzer.has_extension(\"waveforms\"):\n", + " print(\"Computing waveforms...\")\n", + " analyzer.compute(\"waveforms\", ms_before=3.0, ms_after=3.0, **job_kwargs)\n", + "\n", + "if not analyzer.has_extension(\"templates\"):\n", + " print(\"Computing templates...\")\n", + " analyzer.compute(\"templates\", operators=[\"average\", \"median\", \"std\"])\n", + "\n", + "if not analyzer.has_extension(\"noise_levels\"):\n", + " print(\"Computing noise_levels...\")\n", + " analyzer.compute(\"noise_levels\")\n", + "\n", + "print(\"Core extensions ready.\")" + ] + }, + { + "cell_type": "markdown", + "id": "alzfdlh860d", + "metadata": {}, + "source": [ + "### 4b. Quality metric prerequisites\n", + "\n", + "These extensions are needed before computing quality metrics in section 5." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "z47bf3yx1q", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quality metric prerequisites ready.\n" + ] + } + ], + "source": [ + "# Compute extensions required by quality metrics\n", + "if not analyzer.has_extension(\"spike_amplitudes\"):\n", + " print(\"Computing spike_amplitudes...\")\n", + " analyzer.compute(\"spike_amplitudes\", **job_kwargs)\n", + "\n", + "if not analyzer.has_extension(\"unit_locations\"):\n", + " print(\"Computing unit_locations...\")\n", + " analyzer.compute(\"unit_locations\")\n", + "\n", + "if not analyzer.has_extension(\"spike_locations\"):\n", + " print(\"Computing spike_locations...\")\n", + " analyzer.compute(\"spike_locations\", **job_kwargs)\n", + "\n", + "print(\"Quality metric prerequisites ready.\")" + ] + }, + { + "cell_type": "markdown", + "id": "r3rzpvwo30o", + "metadata": {}, + "source": [ + "### 4c. Template metrics\n", + "\n", + "These feed into bombcell's noise and non-somatic classification (waveform shape features).\n", + "\n", + "**Important**: set `include_multi_channel_metrics=True` so that `exp_decay` is computed \u2014 bombcell uses it for noise detection." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "o5gx2kbw5or", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Template metrics already computed with all required metrics.\n" + ] + } + ], + "source": [ + "# Template metrics required by bombcell\n", + "required_metrics = [\"peak_to_trough_duration\", \"waveform_baseline_flatness\", \"peak_after_to_trough_ratio\"]\n", + "\n", + "# Check if template_metrics exists and has all required metrics\n", + "needs_recompute = False\n", + "if analyzer.has_extension(\"template_metrics\"):\n", + " existing_metrics = analyzer.get_extension(\"template_metrics\").get_data().columns.tolist()\n", + " missing = [m for m in required_metrics if m not in existing_metrics]\n", + " if missing:\n", + " print(f\"Template metrics missing bombcell-required metrics: {missing}\")\n", + " print(\"Deleting and recomputing template_metrics...\")\n", + " analyzer.delete_extension(\"template_metrics\")\n", + " needs_recompute = True\n", + " else:\n", + " print(\"Template metrics already computed with all required metrics.\")\n", + "else:\n", + " needs_recompute = True\n", + "\n", + "if needs_recompute:\n", + " print(\"Computing template_metrics...\")\n", + " analyzer.compute(\"template_metrics\", include_multi_channel_metrics=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "hbdl7x6laym", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computed 20 metrics for 634 units\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
exp_decaymain_peak_to_trough_ratiomain_to_next_extremum_durationnum_negative_peaksnum_positive_peakspeak_after_to_trough_ratiopeak_after_widthpeak_before_to_peak_after_ratiopeak_before_to_trough_ratiopeak_before_widthpeak_half_widthpeak_to_trough_durationrecovery_sloperepolarization_slopespreadtrough_half_widthtrough_widthvelocity_abovevelocity_belowwaveform_baseline_flatness
00.0044251.3927400.00066017171.3927400.0002700.2705240.3767700.0004180.0001070.000660-5029.9099352.019898e+04180.00.0003130.000358NaNNaN0.386022
10.0128110.3779060.000873330.1863540.0002662.0278950.3779060.0003860.0002070.000873-686.7509849.961791e+04105.00.0002500.000280NaNNaN0.061312
2NaN2.9925470.000043222.9925470.0000410.1760810.5269310.0000310.0000400.000043-189802.1936951.633915e+07105.00.0000230.000030NaN-1779.5158530.005198
30.0261040.4233230.000047120.4233230.0000300.7842620.3319960.0000310.0000270.000047-55336.0729102.274586e+07180.00.0000370.0000432154.142708NaN0.003596
40.0034761.7341290.000047430.3041820.0000325.7009621.7341290.0000390.0000330.000040528.1898175.067591e+05135.00.0000300.000035-2866.005015NaN0.109412
\n", + "
" + ], + "text/plain": [ + " exp_decay main_peak_to_trough_ratio main_to_next_extremum_duration \\\n", + "0 0.004425 1.392740 0.000660 \n", + "1 0.012811 0.377906 0.000873 \n", + "2 NaN 2.992547 0.000043 \n", + "3 0.026104 0.423323 0.000047 \n", + "4 0.003476 1.734129 0.000047 \n", + "\n", + " num_negative_peaks num_positive_peaks peak_after_to_trough_ratio \\\n", + "0 17 17 1.392740 \n", + "1 3 3 0.186354 \n", + "2 2 2 2.992547 \n", + "3 1 2 0.423323 \n", + "4 4 3 0.304182 \n", + "\n", + " peak_after_width peak_before_to_peak_after_ratio \\\n", + "0 0.000270 0.270524 \n", + "1 0.000266 2.027895 \n", + "2 0.000041 0.176081 \n", + "3 0.000030 0.784262 \n", + "4 0.000032 5.700962 \n", + "\n", + " peak_before_to_trough_ratio peak_before_width peak_half_width \\\n", + "0 0.376770 0.000418 0.000107 \n", + "1 0.377906 0.000386 0.000207 \n", + "2 0.526931 0.000031 0.000040 \n", + "3 0.331996 0.000031 0.000027 \n", + "4 1.734129 0.000039 0.000033 \n", + "\n", + " peak_to_trough_duration recovery_slope repolarization_slope spread \\\n", + "0 0.000660 -5029.909935 2.019898e+04 180.0 \n", + "1 0.000873 -686.750984 9.961791e+04 105.0 \n", + "2 0.000043 -189802.193695 1.633915e+07 105.0 \n", + "3 0.000047 -55336.072910 2.274586e+07 180.0 \n", + "4 0.000040 528.189817 5.067591e+05 135.0 \n", + "\n", + " trough_half_width trough_width velocity_above velocity_below \\\n", + "0 0.000313 0.000358 NaN NaN \n", + "1 0.000250 0.000280 NaN NaN \n", + "2 0.000023 0.000030 NaN -1779.515853 \n", + "3 0.000037 0.000043 2154.142708 NaN \n", + "4 0.000030 0.000035 -2866.005015 NaN \n", + "\n", + " waveform_baseline_flatness \n", + "0 0.386022 \n", + "1 0.061312 \n", + "2 0.005198 \n", + "3 0.003596 \n", + "4 0.109412 " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Verify all metrics are available\n", + "all_metrics = analyzer.get_metrics_extension_data()\n", + "print(f\"Computed {len(all_metrics.columns)} metrics for {len(all_metrics)} units\")\n", + "all_metrics.head()" + ] + }, + { + "cell_type": "markdown", + "id": "ai9hrl1cev", + "metadata": {}, + "source": [ + "## 5. Configure and compute quality metrics\n", + "\n", + "Choose which metrics to compute and how. Toggle options control optional metrics (distance, drift).\n", + "The RPV method defaults to **sliding RP** (IBL/Steinmetz), which sweeps a range of refractory periods automatically.\n", + "\n", + "**Note on drift metrics:**\n", + "- `drift_ptp` measures peak-to-peak drift in micrometers over the recording\n", + "- For **chronic recordings**, consider disabling or increasing the drift threshold\n", + "- For **acute recordings**, keep the drift threshold strict\n", + "\n", + "**Note on distance metrics (isolation_distance, l_ratio):**\n", + "- Require PCA features \u2014 **optional**, off by default\n", + "- Best for **stable recordings** (drift artificially worsens these metrics)\n", + "- Default thresholds: `isolation_distance >= 20`, `l_ratio <= 0.3`" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "or58cyhqe7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Toggle options:\n", + " compute_distance_metrics = False\n", + " compute_drift = True\n", + " label_non_somatic = True\n", + " split_non_somatic_good_mua = False\n", + " use_valid_periods = False\n" + ] + } + ], + "source": [ + "# Toggle options: which metrics to compute\n", + "\n", + "# Distance metrics (isolation_distance, l_ratio)\n", + "# These depend on drift: more drift = artificially lower isolation and lower l_ratio.\n", + "# Best for stable recordings (e.g., chronic implants with minimal drift).\n", + "# For acute recordings or sessions with significant drift, leave OFF.\n", + "compute_distance_metrics = False\n", + "\n", + "# Drift estimation (drift_ptp metric)\n", + "compute_drift = True\n", + "\n", + "# Non-somatic detection (axonal/dendritic waveforms)\n", + "label_non_somatic = True\n", + "\n", + "# Split non-somatic by quality: \"non_soma_good\" vs \"non_soma_mua\"\n", + "# If False, all get \"non_soma\" label\n", + "split_non_somatic_good_mua = False\n", + "\n", + "# Valid time periods: compute quality metrics only on time chunks where\n", + "# false positive (RPV) and false negative (amplitude cutoff) rates are acceptable.\n", + "# The FP/FN thresholds are derived from the bombcell RPV and amplitude_cutoff thresholds.\n", + "# Requires amplitude_scalings extension and Numba.\n", + "use_valid_periods = False\n", + "\n", + "print(\"Toggle options:\")\n", + "print(f\" compute_distance_metrics = {compute_distance_metrics}\")\n", + "print(f\" compute_drift = {compute_drift}\")\n", + "print(f\" label_non_somatic = {label_non_somatic}\")\n", + "print(f\" split_non_somatic_good_mua = {split_non_somatic_good_mua}\")\n", + "print(f\" use_valid_periods = {use_valid_periods}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "3u3edu33on3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computing: ['amplitude_median', 'snr', 'amplitude_cutoff', 'num_spikes', 'presence_ratio', 'firing_rate', 'sliding_rp_violation', 'drift']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jf5479/Dropbox/Python/spikeinterface/src/spikeinterface/metrics/quality/misc_metrics.py:1042: UserWarning: Amplitude cutoff set to NaN for units [np.int64(27), np.int64(65), np.int64(118), np.int64(133), np.int64(134), np.int64(135), np.int64(151), np.int64(152), np.int64(170), np.int64(208), np.int64(210), np.int64(213), np.int64(321), np.int64(477), np.int64(503), np.int64(550), np.int64(574), np.int64(575)]: too few spikes (< 500).\n", + " warnings.warn(\n", + "/Users/jf5479/Dropbox/Python/spikeinterface/src/spikeinterface/metrics/quality/misc_metrics.py:1339: UserWarning: Drift metrics could not be computed for units [np.int64(2), np.int64(3), np.int64(27), np.int64(35), np.int64(48), np.int64(49), np.int64(65), np.int64(76), np.int64(77), np.int64(118), np.int64(133), np.int64(134), np.int64(135), np.int64(137), np.int64(138), np.int64(144), np.int64(151), np.int64(152), np.int64(158), np.int64(170), np.int64(201), np.int64(208), np.int64(210), np.int64(213), np.int64(228), np.int64(229), np.int64(234), np.int64(236), np.int64(258), np.int64(279), np.int64(299), np.int64(321), np.int64(368), np.int64(383), np.int64(390), np.int64(416), np.int64(419), np.int64(449), np.int64(477), np.int64(488), np.int64(490), np.int64(491), np.int64(502), np.int64(503), np.int64(506), np.int64(530), np.int64(534), np.int64(550), np.int64(559), np.int64(560), np.int64(574), np.int64(575), np.int64(610), np.int64(612), np.int64(621), np.int64(629)] because they have less than 2 bins given the specified 'interval_s' and 'min_num_bins' or not enough valid intervals.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Metric computation parameters\n", + "\n", + "# RPV algorithm: \"llobet\" or \"sliding_rp\"\n", + "# - \"llobet\": Llobet & Wyngaard 2022, requires setting refractory_period_ms\n", + "# - \"sliding_rp\": IBL/Steinmetz (Roth et al.), sweeps a range of RP values automatically\n", + "rp_violation_method = \"sliding_rp\"\n", + "\n", + "# Llobet parameters (only used if rp_violation_method = \"llobet\")\n", + "# Note: OG bombcell default tauR is 2 ms; SI default is 1 ms.\n", + "# OG bombcell supports sweeping a range (tauR_valuesMin/Max/Step) \u2014 in SI, set a single value.\n", + "# If you need to test multiple RP values, use \"sliding_rp\" which sweeps automatically.\n", + "refractory_period_ms = 2.0 # tauR: spikes closer than this are violations\n", + "censored_period_ms = 0.1 # exclude duplicate spike detections\n", + "\n", + "# Sliding RP parameters (only used if rp_violation_method = \"sliding_rp\")\n", + "# Internally sweeps all RP values in [exclude_ref_period_below_ms, max_ref_period_ms].\n", + "# This is equivalent to OG bombcell's tauR_valuesMin/Max sweep.\n", + "exclude_ref_period_below_ms = 0.5 # min RP to consider (ms), like tauR_valuesMin\n", + "max_ref_period_ms = 10.0 # max RP to consider (ms), like tauR_valuesMax\n", + "\n", + "# Presence ratio\n", + "presence_bin_duration_s = 60\n", + "\n", + "# Drift\n", + "drift_interval_s = 60\n", + "drift_min_spikes = 100\n", + "\n", + "# Distance metrics\n", + "n_pcs = 5 # number of principal components for distance metrics\n", + "\n", + "# Valid time periods parameters (only used if use_valid_periods = True)\n", + "# These control how time chunks are defined and which are kept.\n", + "# fp_threshold and fn_threshold are automatically derived from bombcell thresholds\n", + "# (rpv -> fp_threshold, amplitude_cutoff -> fn_threshold) unless overridden here.\n", + "valid_periods_params = {\n", + " \"refractory_period_ms\": refractory_period_ms,\n", + " \"censored_period_ms\": censored_period_ms,\n", + " \"period_mode\": \"absolute\", # \"absolute\" or \"relative\" (by spike count)\n", + " \"period_duration_s_absolute\": 30.0, # chunk duration in seconds (absolute mode)\n", + " \"period_target_num_spikes\": 300, # target spikes per chunk (relative mode)\n", + " \"minimum_valid_period_duration\": 180, # min duration (s) for a valid period to be kept\n", + "}\n", + "\n", + "qm_params = {\n", + " \"presence_ratio\": {\"bin_duration_s\": presence_bin_duration_s},\n", + " \"rp_violation\": {\"refractory_period_ms\": refractory_period_ms, \"censored_period_ms\": censored_period_ms},\n", + " \"sliding_rp_violation\": {\n", + " \"exclude_ref_period_below_ms\": exclude_ref_period_below_ms,\n", + " \"max_ref_period_ms\": max_ref_period_ms,\n", + " },\n", + " \"drift\": {\"interval_s\": drift_interval_s, \"min_spikes_per_interval\": drift_min_spikes},\n", + "}\n", + "\n", + "# --- Quality metrics to compute ---\n", + "# These are the default metrics needed by bombcell.\n", + "# You can add any SI quality metric here \u2014 it will appear in the metrics DataFrame\n", + "# and can be used as a bombcell threshold (see section 6).\n", + "metric_names = [\n", + " \"amplitude_median\", \"snr\", \"amplitude_cutoff\", \"num_spikes\",\n", + " \"presence_ratio\", \"firing_rate\"\n", + "]\n", + "\n", + "if rp_violation_method == \"sliding_rp\":\n", + " metric_names.append(\"sliding_rp_violation\")\n", + "else: # llobet\n", + " metric_names.append(\"rp_violation\")\n", + "\n", + "if compute_drift:\n", + " metric_names.append(\"drift\")\n", + "\n", + "if compute_distance_metrics:\n", + " metric_names.append(\"mahalanobis\") # produces isolation_distance and l_ratio columns\n", + " if not analyzer.has_extension(\"principal_components\"):\n", + " print(\"Computing principal_components (required for distance metrics)...\")\n", + " analyzer.compute(\"principal_components\", n_components=n_pcs, mode=\"by_channel_local\", **job_kwargs)\n", + "\n", + "# Compute amplitude_scalings if needed (required for valid_unit_periods)\n", + "if use_valid_periods and not analyzer.has_extension(\"amplitude_scalings\"):\n", + " print(\"Computing amplitude_scalings (required for valid_unit_periods)...\")\n", + " analyzer.compute(\"amplitude_scalings\", **job_kwargs)\n", + "\n", + "# To add more metrics, just append them here. For example:\n", + "# metric_names.append(\"silhouette\") # requires principal_components\n", + "# metric_names.append(\"d_prime\") # requires principal_components\n", + "# metric_names.append(\"nearest_neighbor\") # 3requires principal_components\n", + "# Then add a corresponding threshold in section 6.\n", + "\n", + "print(f\"Computing: {metric_names}\")\n", + "analyzer.compute(\"quality_metrics\", metric_names=metric_names, \n", + " metric_params=qm_params, save=False, **job_kwargs) \n", + "#analyzer.save_as(format=\"zarr\", folder=\"/Users/jf5479/analyzer.zarr\") " + ] + }, + { + "cell_type": "markdown", + "id": "6id7mgrtjlx", + "metadata": {}, + "source": [ + "## 6. Run bombcell\n", + "\n", + "bombcell applies thresholds to classify units into **noise**, **mua**, **good**, and optionally **non-somatic**.\n", + "\n", + "### Customizing thresholds\n", + "\n", + "The thresholds dict has three sections \u2014 `\"noise\"`, `\"mua\"`, and `\"non-somatic\"` \u2014 each containing\n", + "metric entries of the form `{\"greater\": val, \"less\": val}`. Use `None` to disable one side.\n", + "\n", + "**You can add any metric** that exists in the analyzer's metrics DataFrame to any section:\n", + "- **noise/mua**: units failing any threshold in the section get that label. Custom metrics work\n", + " exactly like built-in ones.\n", + "- **non-somatic**: custom metrics are OR'd with the built-in waveform shape logic as standalone\n", + " conditions (i.e., failing the custom threshold alone is enough to label a unit as non-somatic).\n", + "\n", + "Custom metrics automatically appear in the histogram and upset plots." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "abge6ynpyd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'mua': {'amplitude_cutoff': {'greater': None, 'less': 0.2},\n", + " 'amplitude_median': {'abs': True, 'greater': 30, 'less': None},\n", + " 'drift_ptp': {'greater': None, 'less': 100},\n", + " 'isolation_distance': {'greater': 20, 'less': None},\n", + " 'l_ratio': {'greater': None, 'less': 0.3},\n", + " 'num_spikes': {'greater': 300, 'less': None},\n", + " 'presence_ratio': {'greater': 0.7, 'less': None},\n", + " 'rpv': {'greater': None, 'less': 0.1},\n", + " 'snr': {'greater': 5, 'less': None}},\n", + " 'noise': {'exp_decay': {'greater': 0.01, 'less': 0.1},\n", + " 'num_negative_peaks': {'greater': None, 'less': 1},\n", + " 'num_positive_peaks': {'greater': None, 'less': 2},\n", + " 'peak_after_to_trough_ratio': {'greater': None, 'less': 0.8},\n", + " 'peak_to_trough_duration': {'greater': 0.0001, 'less': 0.00115},\n", + " 'waveform_baseline_flatness': {'greater': None, 'less': 0.5}},\n", + " 'non-somatic': {'main_peak_to_trough_ratio': {'greater': None, 'less': 0.8},\n", + " 'peak_before_to_peak_after_ratio': {'greater': None,\n", + " 'less': 3},\n", + " 'peak_before_to_trough_ratio': {'greater': None, 'less': 3},\n", + " 'peak_before_width': {'greater': 0.00015, 'less': None},\n", + " 'trough_width': {'greater': 0.0002, 'less': None}}}\n" + ] + } + ], + "source": [ + "# Get default thresholds and adjust as needed\n", + "thresholds = sc.bombcell_get_default_thresholds()\n", + "\n", + "# --- Adjust existing thresholds ---\n", + "\n", + "# RPV threshold (applies to whichever RPV method you computed: sliding_rp or llobet)\n", + "thresholds[\"mua\"][\"rpv\"][\"less\"] = 0.1\n", + "\n", + "# Presence ratio \u2014 lower for bursty or sparse-firing neurons\n", + "thresholds[\"mua\"][\"presence_ratio\"][\"greater\"] = 0.7\n", + "\n", + "# Distance metric thresholds (applied automatically when computed, skipped otherwise)\n", + "# thresholds[\"mua\"][\"isolation_distance\"][\"greater\"] = 20 # default: 20\n", + "# thresholds[\"mua\"][\"l_ratio\"][\"less\"] = 0.3 # default: 0.3\n", + "\n", + "# Disable a threshold without removing it (set both sides to None):\n", + "# thresholds[\"mua\"][\"drift_ptp\"] = {\"greater\": None, \"less\": None}\n", + "\n", + "# --- Add custom metrics to any section ---\n", + "# Any column in the analyzer's metrics DataFrame can be used as a threshold.\n", + "# If the metric hasn't been computed, it is skipped with a warning.\n", + "\n", + "# Example: require minimum firing rate for MUA classification\n", + "# thresholds[\"mua\"][\"firing_rate\"] = {\"greater\": 0.1, \"less\": None}\n", + "\n", + "# Example: flag units with extreme half-width as noise\n", + "# thresholds[\"noise\"][\"half_width\"] = {\"greater\": 0.05e-3, \"less\": 0.6e-3}\n", + "\n", + "# Example: use absolute value (like amplitude_median does by default)\n", + "# thresholds[\"mua\"][\"my_metric\"] = {\"greater\": 5, \"less\": None, \"abs\": True}\n", + "\n", + "# Example: add another distance metric (e.g. silhouette score) as MUA threshold.\n", + "# First compute it: metric_names.append(\"silhouette\") in the quality metrics cell,\n", + "# then add the threshold here:\n", + "# thresholds[\"mua\"][\"silhouette\"] = {\"greater\": 0.4, \"less\": None}\n", + "\n", + "# Example: add a custom non-somatic detector.\n", + "# Custom metrics in \"non-somatic\" are OR'd with the built-in waveform shape logic,\n", + "# so failing this threshold alone is enough to label a unit as non-somatic:\n", + "# thresholds[\"non-somatic\"][\"velocity\"] = {\"greater\": 2.0, \"less\": None}\n", + "\n", + "pprint(thresholds)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "v2u9f0u6lr", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Labeled 634 units\n", + "bombcell_label\n", + "noise 389\n", + "mua 164\n", + "non_soma 42\n", + "good 39\n", + "Name: count, dtype: int64\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jf5479/Dropbox/Python/spikeinterface/src/spikeinterface/curation/bombcell_curation.py:280: UserWarning: Bombcell thresholds reference metrics not found in the metrics DataFrame (section 'mua'): ['isolation_distance', 'l_ratio']. These will be skipped. Compute them first if you want them included in the labeling.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "bombcell_labels = sc.bombcell_label_units(\n", + " sorting_analyzer=analyzer,\n", + " thresholds=thresholds,\n", + " label_non_somatic=label_non_somatic,\n", + " split_non_somatic_good_mua=split_non_somatic_good_mua,\n", + " use_valid_periods=use_valid_periods,\n", + " valid_periods_params=valid_periods_params if use_valid_periods else None,\n", + " **job_kwargs,\n", + ")\n", + "\n", + "print(f\"Labeled {len(bombcell_labels)} units\")\n", + "print(bombcell_labels[\"bombcell_label\"].value_counts())" + ] + }, + { + "cell_type": "markdown", + "id": "f52q6d3dguf", + "metadata": {}, + "source": [ + "## 7. Parameter tuning by recording type\n", + "\n", + "**Chronic recordings**\n", + "- Distance metrics work well (stable recordings = reliable isolation_distance/l_ratio)\n", + "- Set `compute_distance_metrics = True`\n", + "- Increase or disable drift threshold\n", + "\n", + "**Acute recordings**\n", + "- Distance metrics unreliable (drift artificially lowers isolation_distance/l_ratio)\n", + "- Keep `compute_distance_metrics = False` (default)\n", + "- Keep drift threshold strict\n", + "\n", + "**Cerebellum**\n", + "- Purkinje cells: shorter peak-to-trough duration\n", + "- Complex spikes may trigger noise detection; relax `num_positive_peaks`\n", + "\n", + "**Striatum**\n", + "- MSNs: lower spike count and presence ratio thresholds" + ] + }, + { + "cell_type": "markdown", + "id": "0exuk2lh61z", + "metadata": {}, + "source": [ + "### Visualize results" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "xxd9ekl2ck", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 0.98, 'bombcell unit labeling')" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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CGOMqXcWW2yxYDl65JFHOrspxrQaxwwYY0wrIC0y7YbBuoFboi3LNhtTC9gyYIwxrYD4DzIYKN5EQCF1E4h/wE1E2WRiG4ypNxwzYIwxrUznJKCSOBayFsi0ICiSmA0rAqZesWXAGGOMaXAcM2CMMcY0OFYGjDHGmAbHyoAxxhjT4FgZMMYYYxocKwPGGGNMg2NlwBhjjGlwrAwYY4wxDY6VgTqDcqeVljxlBTUWbmEhm3qGBWgo7HL//fd3dlOMyQ233HJLWOWyUVZapIw0i4RdeOGFnd2UmsTKQI4555xzwop7rVldbmL56aefwqp5LOdKedapppoqLEFMW+iMaVjUhWVoe/ToESq7bbHFFqHcawxV3QYNGpT84x//6LDrMCbP/PHHH2ElTlaipI92FF988UVY6ZFVNRmbunTpkrlqpfj111/DktHzzz9/WFq8d+/eodojS1SX4oQTTgjHZQyKmWyyyZIDDjggfP7zzz9X9brygJWBnILgRQAjRFmStyOVAZZxXW+99ZKTTjopOf3004MysP/++yc77rhjk33//e9/J3/605/CevWUcj3wwAOTJ598MigHlHmN2WOPPZJXX301efzxxzvsWozJK/fee2/y3nvvJbvttluHnpdznnLKKcnnn3+eLLzwwi2OYQh+hDfjBDP6Qw45JFgJv/vuu8zvoCSgPLBPFjvvvHPy1VdfJTfccENVridXsISxqR8GDhwYXi1xxx13sDR1YdiwYYVaYO+99w7t+eKLL4rbFlxwwcI888xT+OWXX4rbXn/99cIkk0xSOOCAA5odY6GFFipsv/32HdZmY/LKRhttVFhppZU6/Lzjxo0rfP311+H/t956axgTBg8enLnvKaecUphssskKL7zwQsXH33rrrQurr756GCMHDBiQuc8GG2xQWHnlldt4BfnFloEWwIS11FJLBRPV3HPPnVx88cXJ0UcfHcxQMSxpetxxx4V9Jp988mSOOeZIjjjiiDDrTYOGO2DAgLAfq57ttddeydixY5vtd8kll4Tjde/ePVlmmWWSp59+umIl76677gpt4PsxO+20UzALoplvsskm4f+swX7QQQcF02F7QVtA1/nNN98kQ4cOTTbddNOkW7duxf2wIiywwALJTTfd1OwYa621VpjRFAqMIcbUFhoX3n///bCiIW4y+hbuLZ7ZTz/9NNl4442T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K0w//fSFK664olNv35prrhnGkb322qvJ9k8++aRw9NFHF5ZeeunCtNNOW+jVq1dh4MCBhUceeaTZMb744ovC5JNPXrj77rsLecHKQI644447wkM+bNiwQi2w9957h/bQccSuu+4aBDwKRMwqq6xS6NmzZ/HvW265JXz38ssvb7Lf5ptvXphiiikKX375ZZPtt912W1A+hg8f3m7XY4xpO2eddVbo4z/99FOn3cbbb7+9MOWUU2YqA+edd16he/fuYQJz/vnnF84+++zCEkssEfbNUmDyNgGxmyBJkqOPPjrp0qVLMmzYsGSnnXZKpp122mDu3nnnnZPx48c3saT8/vvvyXHHHZfMPffcwXQ9xxxzJEcccUTyyy+/tBgzcN555yUDBgxIevTokUw33XTJUkstldxwww1N9vn888+TXXbZJendu3c4PvtfccUVFVl57rrrrtAe2hbDNWGO59ibbLJJ+P+MM86YHHTQQc1M89WEtsDYsWOL28aNG5dMMcUU4R7HzDLLLEn37t2Lfz/99NPhPe3u4O+ff/45ufvuu5tsX3PNNcN7ersxpja48sork4022ij0/86AcePAAw9MDj300MzPV1ttteSTTz4JY/Jee+2V7Lvvvslzzz0X3Br//Oc/m+2/1VZbJc8880zy4YcfJnnAykDqx/3++++Tk046Kfz/qquuSo455pgmN2zQoEHhwVhiiSWSs846Kxk4cGDYvyUf/aWXXprss88+yYILLpicffbZ4biLLbZY8sILLxT3+fLLL5PlllsuefTRR5O99947+NznmWee4I/nOy3Bg0u7skDor7POOkmvXr2S008/PbT7jDPOSC655JIm+3377bfJV1991eIrrSTBr7/+Gj779NNPkzvvvDOcp1+/fuEaBAoSCsHuu++evPPOO8nHH3+cXHTRRckdd9yRHH744cX9UK4mnXTSpFu3bk3OgSKluIMYlDeUoGeffbbF+2RMe04E2E5MDIJimWWWCcJvrrnmSq655ppW3/hHHnkkWWmllUK7UOLnm2++cM6Y0aNHhzGCCQTnIl7n6quvbrLPRx99FK6TPnnBBReE9tCX1l577dBfsRJzbcTnoJRvvPHGyTfffNPkGCja66+/fjLrrLOG6+c+8J1KJhQjRoxI3nzzzaLSntUuxiLd26WXXjp56aWXkmrHKxCrwCQoiwEDBiQz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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Unit waveforms colored by bombcell label\n", + "w = sw.plot_unit_labels(analyzer, bombcell_labels[\"bombcell_label\"], ylims=(-300, 100))\n", + "w.figure.suptitle(\"bombcell unit labeling\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "qykgglzhjc", + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "module 'spikeinterface.widgets' has no attribute 'plot_template_peak_trough'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[24]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# Template and mean raw waveform with detected peaks and troughs\u001b[39;00m\n\u001b[32m 2\u001b[39m \u001b[38;5;66;03m# Shows peak_before (green), trough (blue), and peak_after (orange) on the peak channel\u001b[39;00m\n\u001b[32m 3\u001b[39m \u001b[38;5;66;03m# Main features are highlighted with a red edge\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m4\u001b[39m _ = \u001b[43msw\u001b[49m\u001b[43m.\u001b[49m\u001b[43mplot_template_peak_trough\u001b[49m(\n\u001b[32m 5\u001b[39m analyzer,\n\u001b[32m 6\u001b[39m unit_ids=analyzer.unit_ids[:\u001b[32m8\u001b[39m], \u001b[38;5;66;03m# plot first 8 units; set to None for all\u001b[39;00m\n\u001b[32m 7\u001b[39m n_channels_around=\u001b[32m2\u001b[39m, \u001b[38;5;66;03m# show 2 channels above and below peak channel (0 = peak only)\u001b[39;00m\n\u001b[32m 8\u001b[39m unit_labels=bombcell_labels[\u001b[33m\"\u001b[39m\u001b[33mbombcell_label\u001b[39m\u001b[33m\"\u001b[39m],\n\u001b[32m 9\u001b[39m figsize=(\u001b[32m20\u001b[39m, \u001b[32m12\u001b[39m),\n\u001b[32m 10\u001b[39m )\n", + "\u001b[31mAttributeError\u001b[39m: module 'spikeinterface.widgets' has no attribute 'plot_template_peak_trough'" + ] + } + ], + "source": [ + "# Template and mean raw waveform with detected peaks and troughs\n", + "# Shows peak_before (green), trough (blue), and peak_after (orange) on the peak channel\n", + "# Main features are highlighted with a red edge\n", + "_ = sw.plot_template_peak_trough(\n", + " analyzer,\n", + " unit_ids=analyzer.unit_ids[:8], # plot first 8 units; set to None for all\n", + " n_channels_around=2, # show 2 channels above and below peak channel (0 = peak only)\n", + " unit_labels=bombcell_labels[\"bombcell_label\"],\n", + " figsize=(20, 12),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "vlb9hvwzahl", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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iIiIiIgokDHZRkRERERERERE5CZMthEREREREREREbkJk21ERERERERERERuwmRbPkyfPl2qVasmRYsWlWbNmsnWrVvFiEaPHi1BQUE2jzp16ohRbNiwQR588EGpWLGi+m4Y7dEaxgzBKEMVKlSQiIgIadmypezfv1+M+n179eqV4/du06aNz9aXvMPI8cyIMcwMcYuxytjyG3OWL1+ujlvMf+ONN8qqVavyvc8nJCTI448/LlFRUVKyZEnp27evJCYm2syza9cuueOOO9TnVK5cWd555x0x0zY4cuRIjniJx+bNm8VI2+HNN99UI35HRkaq7eAIRghv3769mqdcuXIyePBgyczMFLNtB0f7w5IlS9zwjcmTv79ZtsXHH3+sYnapUqXUA/u5UcqwBS2b4/jEcdqpUycxiun53BaXLl2SZ599VsU/jFJ63XXX+ccxgtFIKW9LlizRwsLCtLlz52p//vmn1q9fP61kyZLamTNnDLf5Ro0apdWrV087deqU5XHu3DnNKFatWqW99tpr2hdffIGReLUvv/zSZvqECRO06OhobcWKFdoff/yhdejQQatevbqWkpKiGfH79uzZU2vTpo3N752QkOCz9SXPM3o8M2IMM0PcYqwyrvzGnF9//VULCQnR3nnnHe2vv/7SRowYoRUpUkTbvXt3vvZ5nNsaNGigbd68Wfv555+1WrVqad26dbNMv3z5sla+fHnt8ccf1/bs2aMtXrxYi4iI0D766CPTbIPDhw+rmPLDDz/YxMz09HS3bwNfboeRI0dqU6ZM0QYNGqTmtZeZmanVr19fa9mypfb777+reFSmTBlt2LBhptoOgP1h3rx5NvtDIJ1LAoEnfn+zbIvHHntMmz59ujpO//77b61Xr15qXz5x4oRmxrI5YnhcXJx2xx13aB07dtSMYEk+t0VaWprWpEkTrV27dtovv/yitsm6deu0nTt3ar7GZJuLmjZtqj377LOW51lZWVrFihW18ePHa0aDC1UUzMzA/qI1Oztbi42N1SZOnGh57dKlS1p4eLgqhAc6Z8k2owRnco3R45nRY5gZ4hZjlbljziOPPKK1b9/e5rVmzZppAwYMcHmfxwUp9qPffvvNMs+3336rBQUFafHx8er5hx9+qJUqVUoV1HVDhgzRrr/+es0s20BPtuHC1Rt8sR2sIYnkKMmE5FpwcLB2+vRp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mw23BbcD9wnPYTxzPzPFLH5XKkhcOXbsmM2odbfddpssWrRIjf41fPhwlVDDiHv169e3zPPqq6+qC9P+/furGmwtWrRQyyxatKhlnoULF6oE23333aeW36VLF3n//fe573uZmeJCQXD7mHPbeCIuuovRtruRvg+/i38K99N9LAijJPh6JYiIiIiIiIiIiIwg4PtsIyIiIiIiIiIi8hdMthEREREREREREbkJk21ERERERERERERuwmQbERERERERERGRmzDZ5qLp06dLtWrV1ChbzZo1k61bt4rZbNiwQR588EGpWLGiBAUFqRF4zAhDgN9yyy1SokQJKVeunHTq1En27dsnZjNjxgy56aabJCoqSj2aN28u3377ra9Xy7TyG6OWL18uderUUfPfeOONsmrVKpvpGDsHI3RVqFBBIiIipGXLlrJ//34x4nft1auXimnWjzZt2kigfdc///xTjfaI+fEd3nvvvUIvM9C/7+jRo3P8ttgXyFj8eZ/2lLz27dTUVHn22WeldOnSUrx4cXWsnDlzxmYZGG2xffv2EhkZqcozgwcPlszMTDFiGdWVc1pCQoI8/vjjqkxTsmRJ6du3ryQmJtrMs2vXLrnjjjvUvla5cmV55513JNC3jSvnQKNuG38ViDHNleuju+++O8e+9tRTT4kR46s/0ctJ9g98B3//XTZ4KbZ7CpNtLli6dKkMGjRIDSe7Y8cOadCggbRu3VrOnj0rZpKUlKS+O04AZrZ+/XoVnDZv3izff/+9ZGRkSKtWrdT2MZNKlSrJhAkTZPv27bJt2za59957pWPHjuoCmPw7Rm3cuFG6deumTja///67KhDhsWfPHss8KCS///77MnPmTNmyZYsUK1ZMLRMFDKN9V8CFxalTpyyPxYsXi6/l97smJydLjRo11HEZGxvrlmUG+veFevXq2fy2v/zyiwe/BXmbP+/Tnpbbvv3SSy/J119/rW42oNxy8uRJeeihhyzTs7KyVKItPT1dxclPPvlE5s+fry5ajFhGdeWchosxlGFQtvvmm2/URV7//v0t069cuaLKe1WrVlVln4kTJ6qL8lmzZkmgl9/zOgcaddv4o0CNaa5eH/Xr189mX/PXpGxh4qu/+e2332y+C34fePjhh/3+d0nyQmz3KI3y1LRpU+3ZZ5+1PM/KytIqVqyojR8/3rRbD7vOl19+6evV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pIlKnMXGxspjjz0mZ8+etay7s9/SvgnIxYsXpUePHmo+7Idt27aV/fv3u7RuRIHEWRxDzG7ZsqW0bt3aEr8TEhKkUqVKMnLkSJsYhxh80003qeP91ltvlT179rj8+YhHVapUUcdZ586d1TnA3v/+9z9p1KiRWn6NGjVUTLO+cYG4MmDAAClfvryap379+vLNN9+4dE5BrMfFJc5N1hBfunfvXoAtSkTWVq9eLS1atFDNFXGsPfDAA+qmpnWZYtmyZXLHHXeoGHTLLbeoVgUor+F8jvIBzsHnzp3LUQZALEASDeWip556KteLPOtmpPg/IObg8/Xn+nKtoWyAMoIuKSlJlQ+wXhUqVJDJkyfn+Ky8yrquNO1EDEPZBnHrP//5jyQnJ6uyFNYVZZPnn39esrKy8vWZecVb+5YQeZWZAdtv9uzZanlYLsp+KAMSUeBAuQ/lI8RgxGmU/xDr9Jg4adIkFe8w7dlnn7WpoIGYhNZBiIuIxdY1iMkENPKqu+66SytevLj2wgsvaHv37tU+/fRTLTIyUps1a5aa/uSTT2q33XabtmHDBu3AgQPaxIkTtfDwcO2ff/5R00+cOKFe+/3337WDBw9q77//vhYSEqJt2bLF5jOwfFi4cKFWokQJ7euvv3Zp/dauXav997//1f7++2/tr7/+0vr27auVL19eu3Llipp+9uxZrU2bNtojjzyinTp1Srt06ZL2+eef40pT27dvn+U1GDdunFanTh1t9erVal3nzZunvsu6devU9J9++km976abbtK+++479X0vXLjgdN2Sk5O1l19+WatXr576HDzwWlZWltawYUOtRYsW2rZt27TNmzdrjRs3VtshL86WCVi3cuXKaXPnzlXrf/ToUe2LL77QihQpok2fPl1938mTJ6vt/+OPP6r3HD58WL0Pv4/u4sWL6jV8Xzh06JBaxiuvvKL2gcWLF2txcXFqHswL2FaYp2XLltpvv/2mbd++Xatbt6722GOPufQ79uzZU+1n3bt31/bs2aMeMGfOHG3VqlXq+2zatElr3ry51rZtWzUtMzPT6W9pvU9Bhw4d1PpgP925c6fWunVrrVatWlp6erpL60fesX79eu2BBx7QKlSooH7XL7/80uOfiRj1+OOPazExMVrRokW1+vXrq304UOUWx/BdS5Uqpb333ntq3ocfflhr2rSplpGRYRPj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trCM5h5mP+9cgcfIM8cotxgcBj5s0KCBbNu2zeZOKB43btzYo9tGRJQZjGdEZCaMaURkhLiD562XByRI0JdH9lFUuFkvg9Ywv/32G683ici8LdsAXQ569OghDz74oDRs2FBli4mJibFkoCEiMgrGMyIyE8Y0IvK2uNO9e3cpV66cTJ48WT0ePHiwPPbYYzJ9+nRp3769rF69Wg4ePCgLFy5U89GNfciQIfLee+9J1apVVeXb2LFjpWzZstKpUyd+wERk3sq2F198UaXMHTdunMoUg+a8W7ZsUemYXQlNgcePT5vpzei4X8bCz8vc3BXPzPxdcoav7ruv7rev77tZYprZP0Mz75+Z9w24f8aKOxcvXlQZSnVNmjSRVatWyZgxY2T06NGqQg2ZSGvXrm1ZZsSIEarCrl+/firrcbNmzdQ68+fPnyP7YPbvlCvwGPEYefv3KBeyJLh8rURERERERERERD7I8GO2EREREREREREReQtWthEREREREREREbkIK9uIiIiIiIiIiIhchJVtRERERERERERELuLzlW1z5syRSpUqqUwyjRo1kv3796d7wNatWyfVq1dXy99///2yefNmm/nIN4HMN2XKlJGAgABp1aqV/P3332L0/erZs6dKe209tW3bVrx5v06cOCGdO3dWy2N7kfY7u+s0yn69++67aT4vfL7evF+LFi2SRx55RIoVK6YmnDupl/eW88sMvOF778jkyZPloYcekkKFCkmpUqWkU6dOcurUKZtl4uPjZdCgQVK8eHEpWLCgOiciIiJslkG2sfbt20uBAgXUeoYPHy5JSUk2y+zcuVPq16+vMhBVqVJFli1blulj5cy2ZNWHH36ozt8hQ4b4xL6HhYXJK6+8otaHcxy/RwcPHsxUDLh586Z07dpVChcuLEWLFpU+ffpIdHS0zTJ//PGHijfYr5CQEJk6daphf+/NxtW/G2aJvatXr1axAPHQLPuGjI6IHziHEIfuu+++NOeZkfcP5bNq1aqp+IA4M3ToUBUzvdGuXbvk6aeflrJly6rvGTJxZsSZ3xAyXxnNLOU/s8jJcqKRhbmpPJkhzYetXr1a8/f315YsWaKdOHFC69u3r1a0aFEtIiLC7vK7d+/W/Pz8tKlTp2onT57UxowZo+XNm1c7duyYZZkPP/xQK1KkiLZhwwbt999/1zp06KBVrlxZi4uL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zbvvvmt3f/A5pffZYJuMHP937twp9evXV5lOq1SpovYxyzQft3r1as3f319bsmSJduLECa1v375a0aJFtYiICLvL7969W/Pz89OmTp2qnTx5UhszZoyWN29e7dixY5ov7P/+/fu1t99+W/vyyy+14OBgbebMmZpRZXbfX375ZW3OnDnakSNHtD///FPr2bOnVqRIEe3y5cuaL+z/jh07tG+++UZ978+cOaPNmjVLnQtbtmxx+7aT+z53b7V582btP//5j/pO4qds/fr1mtG0adNGW7p0qXb8+HHt6NGjWrt27bQKFSpo0dHRmtF899132qZNm7TTp09rp06d0kaPHq1+G7FvRoXfu0qVKml16tTRBg8e7OnNMbycKG99+OGH6nd4w4YN2u+//6516NBBq1y5shYXF2dZpm3btlrdunW1ffv2ab/88otWpUoVrUuXLpb5UVFRWunSpbWuXbuq7yvKNwEBAdqCBQtMvd/nz59XsfOnn37Srl69apkSEhIMvd/jxo3TZsyYoQ0bNkwtm1pSUpJWu3ZtrVWrVqo8h9+SEiVKaKNGjXLJfnvzvgM+c/zuWH/m1usgc8Qse9uCx9geb9uf999/X60b76dfX+TOnVv773//a1kG39nChQtbvrPz5883bFw10mdz584dm/3AVLNmTa1Hjx4OPxtPfj7jXBD/z507pxUoUECtA9vyySefZOt61+cr2xo2bKgNGjTIckCSk5O1smXLapMnT7Z7wF544QWtffv2Ns81atRI69+/v+YL+2+tYsWKhq5sy86+6ydsoUKFtM8//1zzxf2HBx54QAVE8q3P3dsYtbIttWvXrql9+fnnnzUzKFasmLZ48WLNiFDArFq1qrZ161btscceY2WbF5a3UlJS1E2/adOmWeZHRkZq+fLlUxefgIIyzqkDBw5Ylvn++++1XLlyaWFhYerx3Llz1Xf17t27lmVGjhypVatWzdT7rV8U4oIjJ3hiv63hAtDexRYurnAhHx4ebnlu3rx56mLR+jtgxn030++lOxg5ZtnblsDAQK1WrVpetz/24OZjr169HH6njRxXjfzZ4MYwXrNr1650442R4/+IESNsPgt48cUX1Q3yrPDpbqQJCQly6NAh1QxRlzt3bvV47969dl+D562XhzZt2jhc3mz7bxau2PfY2FhJTEyUoKAg8bX9R3lt27Ztqsvbo48+msNbS67iy+e8EURFRam/Rowp1pKTk1W3pJiYGNWd1IgGDRqkuhmk/r0n7ylvnT9/XsLDw22WKVKkiOquoi+Dv+hKgiEQdFge7/3bb79ZlsHvmL+/v8374Pft1q1bpt1vXYcOHVRXmmbNmsl3332Xrf319H47A8uii1Lp0qVt3uf27dtqqBQz77t1fCtRooQ0bNhQlixZosp0ZK6YlXpbsD+4brHuIugt++OoPJS6LIRtr1ixopQvX14OHDgg9913nyHjqpE/m8WLF6vjji7M9j4bdGnGEC9Gjv97XVzX49OVbf/884+6KLA+4IDH+EDtwfOZWd5s+28Wrtj3kSNHqvGijHgxltX9x49fwYIF1Q88LkQ/+eQTeeKJJ9ywxeQKvnzOe7uUlBQ1LljTpk2ldu3aYkTHjh1T8QFjXAwYMEDWr18vNWvWFKNBReHhw4fVmHrkveUt/W9Gy+CCx1qePHnURZz1MvbWYf0eZtxvnKvTp09X4+Rs2rRJXRRi3EhXVLh5ar+dkZOft7fvO0ycOFHWrl0rW7duVWMwv/baa6osR+aKWamXwf6gUhWVCt62P6nh+4nKtF69elmeq1atmqoY/vbbb2X27NlqX0aNGiWXL182XFw16mcTHx+vxtLDuG7WrD+bFStWqOVw7mDsNm+LgVk5d/Rl8PnExcVJZuXJ9CuISA2ajQsyDKCIgRx9BQZyP3r0qLqDgZZtw4YNk3vuuUcef/xxT28akaGhpcHx48fl119/FaNCgQvxAZXyX331lfTo0UN+/vlnQ1W4Xbp0SQYPHqwuRH0ptpPvQcsm/IbrkKzlypUrMm3aNNUqg8xp7Nixlv8/8MADqgUyPvM333zTo9tFBDt27FCVbEhKV6tWLctBQSt5vaW8XkGEZHULFiyQSZMmec3BM3NcxQ3UO3fuqLKdNevPBpAUARMSl3Xs2FF8nU+3bMMJ4efnJxERETbP43FwcLDd1+D5zCxvtv03i+zs+0cffaQq23788UeVfc+X9h/NgJGVBZmC3nrrLXnuuefY+sNAfPmc92avv/66bNy4URUy0T3CqNDiFfGhQYMGKi7UrVtX3YE2EnR9uHbtmspChTu8mFBh+PHHH6v/424teUd5S/+b0TL4PK0h6xgysFkvY28d1u9hxv22B11yzpw5I9nlqf12Rk5+3t6+744+c7QOunv3brbWYzbefO468x1OvQz2By2NkHXS2/ZHh99adEGcOXOmdO/e3e42WX82FSpUsIlX3rQv6cVVI342ehfSp556Kk2rr9SQLRT7k/q3JMILYmBWzh19GXw+yIKaWT5d2YYLA1wUoIWOdVcePHY0zgyet14ecAfciOPSZGX/zSKr+47U2riDsmXLFps+7r762eM1LKAZhy+f894I3QZQ0Ya7hdu3b5fKlSuLmRgxPrRs2VJ1h0ULPX1CrO/atav6Pwr45B3lLZwvKBRbL4NuHhhrRl8GfyMjI1Ulqg7nGt4bF0D6Mrt27VJjsFq/D1pqouWEWffbHnzHcaGUXZ7ab2dgWZzj1heZeB9cSLmiFa4377ujzxzfc3T/J/PErNTbgv0JDAxU3Ry9bX8APYUwPM2UKVOkX79+drfHel9wQ+zPP/+0xCtv2peM4qrRPht9zDTcEE7dhdQelJMQT6zHoEsxUPx3eV2P5uOQ1hmZLJYtW6aycvTr10+lptWzVHTr1k175513bFLT5smTR/voo4+0P//8Uxs/fnya1LRm3n9k6kCGFUxlypTR3n77bfX/v//+WzP7viPlMNIYf/XVVzbpjZG1zogyu/8ffPCB9uOPP2pnz55Vy+McwLmwaNEiD+4FufpzNwqcd3oswk8ZUn3j/6GhoZpRDBw4UGVL2rlzp01MiY2N1YwGsQJZVJGJ648//lCPkdEKMcPomI3Ue8tb+F3GOr799lv1vevYsaNWuXJlLS4uzrJM27ZtVebs3377Tfv1119VltkuXbrYZDQrXbq0ev/jx4+r7SxQoIC2YMECU+83tmfVqlXqPTC9//77KkvbkiVLDL3f+A3Ab8GECRO0ggULWn4n9LIaMsnXrl1ba926tcqst2XLFq1kyZLaqFGjXLLf3rzv3333nSqzYb0otyOrJb7r48aNc9m+m4mRY5a9bfHz81PXMd62P9u3b1fbj3PQuix048YNyzL4Tv/www/qGuTQoUNakyZNVNkPcctocdVIn41uzJgxKpso4mdqqT+bl156SW2LJ/Yn1AXx/9y5c+r7OHz4cLUtc+bMUZ8Pls0Kn69sg08++USrUKGC+lIgVe2+fftsCtk9evSwOWhr167V7rvvPrU8UsNu2rRJ85X911Map56wnNn3vWLFinb3HQHBqDKz///5z3+0KlWqaPnz51cpxxs3bqx+4Mlcn7tR7Nixw+75mDpeezN7248JKcuNpnfv3ipG4juFgkvLli1NUdEGrGzz3vJWSkqKNnbsWHXhiYtifO9OnTplswwu2HDxgIJ34cKFtV69eqW5Sfb7779rzZo1U+soV66cKtSbfb9xEVSjRg11UYH52K5169YZfr+xTntxFb8ZugsXLmhPPvmkFhAQoJUoUUJ76623tMTERNPv+/fff6/Vq1dPfScCAwO1unXravPnz9eSk5Nduu9m4o3nrrMxy962eOP+OPreWl9bDhkyxLLdeK927dppI0aMMGxcNcpnA4gP5cuX10aPHp1mPxx9NocPH/bKGOhs/MfyiJXYlnvuuSdb5fJc+CdrbeKIiIiIiIiIiIjImk+P2UZERERERERERORKrGwjIiIiIiIiIiJyEVa2ERERERERERERuQgr24iIiIiIiIiIiFyElW1EREREREREREQuwso2IiIiIiIiIiIiF2FlGxERERERERERkYuwso2IiIiIiIiIiMhFWNnmg3r27CmdOnWyPH788cdlyJAh6b6mUqVKMmvWLMvjXLlyyYYNG8TXjlVGdu7cqY5NZGRktt7XVeshMgpn4pCrzlNHdu/eLffff7/kzZvXJesj93xuruIrv2vkWxhbs2bZsmVStGjRdJd59913pV69eukuc+HCBRVbjh49msUtISJfK7M4E1uc2R5eT3peHk9vAHneN998oy4uM+Pq1atSrFgxMbvZs2eLpmk5XhBGQLWuzGzSpIk6xkWKFMnR9yai/zds2DB1Ln7//fdSsGBBjx0aezHBG9dpVCjEolIt9cWvr/yuEflqbM2MF198Udq1a5ep1+DiFzdJWWlPlH2+XG55++235Y033sjUa3z5eHkztmwjCQoKkkKFCmXqSAQHB0u+fPk8dvQSEhLc8j6o7MrozmZO8Pf3V8cYd0OJyD3Onj0rLVq0kPLly2f5vHdXbMoJuLGQlJQkRpXdY+/p3zUiszJibA0ICJBSpUq59T2JyHfKLOnBTYnixYt7ejPIBVjZZmJfffWV6hKFAgNO2FatWklMTEyGXQyuXbsmTz/9tHpd5cqVZeXKlel2t9GbyKOFXPPmzaVAgQJSt25d2bt3r81rFi1aJCEhIWr+M888IzNmzHC60KU3p128eLHapvz581u2/fXXX1cTKsZKlCghY8eOdao12ujRo6VRo0Zpnse2T5w4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M11EtWz6mfbt28vOnTtdWqp89NFHsnjxYnNc9FjdeeedZllERETWa/mdb+VoEffZZ5+Z5J0e06+++irP8o0bN860fJw/f75Zb/ny5c3ra9askdtvv90kziIjI+Xee+81SUEHfa+6+eabzTb1XLhrbaLH/29/+5tJIuq6dZ16TOC79Fw+/fTT5v7Xa1Dv9Xnz5smFCxekT58+EhYWJvXr1zfXmSO58+STT2Zdlw0aNDD3urPs14VuQ6+L559/XipXrmwSJHotekqvudmzZ5t4pNv83e9+53IvqKSkJHnkkUfMNazb6NatW1bc8eTedGfs2LEmTu3atSvfY3jw4EEZPnx4Vsxz0Pv9D3/4g7k/9f6fOnWqR/uc2zo1rus+/vvf/5ZGjRqZ9R46dEjOnj0rTzzxhDmHGtv0WP3000857n1n2mpOy+SgsVjPkyMOjBw5Unr16pWjRZnGpqKey/vvv9/E6FdffTXfa0rXv2jRIvn444+zjoXGP3ctbovyOwYAAADIwUKe2rdvb1177bXW0KFDrX379lnvvvuuVbFiReudd94xy5966imrTZs21qZNm6yEhARrypQpVrly5awff/zRLP/111/Na//973+tAwcOWDNnzrRKlSplbd261WUbun713nvvWWFhYdZ//vMfj85Mr169TPl69Ohh7d692/rkk0+sqlWrWi+++GLWe/7+979bDRs2tNasWWPKEBsba8q4YcMG68qVK9bRo0et8PBwa/r06eb/Fy9eNOXW/Rw0aJC1d+9ea+XKlVaVKlWssWPH5jg2zz33nDk2+jh79qzZ/qhRo8zndu7caf3pT3+y7rzzznz3JTk52WrdurXVr18/Uw59aPk8KUtRzqEvnMe4uDjrX//6l9m///3vf9aTTz5pRUVFWefPnzfLT5w4Yd1zzz3WI488Yo6LHquPPvpIs4XW/v37s17L73yr9evXm881adLE+vzzz83+nj59Os/y6bG+5pprTBn0nP7www/m9eXLl5ty/PTTT+bY3HfffdZNN91kXb161Szftm2b2dYXX3xhyujYjl633bp1y1r/3/72NysmJsb69NNPrT179pjlERER+ZYL3qPXu17jEyZMMPeJ/tR7onPnzube0tcGDhxoRUZGWhcuXLAuXbpkjRkzxvruu++sn3/+Oes+XLp0adY6s18Xug2NTePGjTPrW7Ro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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Metric distributions with threshold lines\n", + "_ = sw.plot_metric_histograms(analyzer, thresholds, figsize=(15, 10))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "tcb2wqlmq3k", + "metadata": {}, + "outputs": [], + "source": [ + "# Upset plot: which metric combinations caused each label\n", + "# You can also include \"non_soma\" in unit_labels_to_plot to see non-somatic metric patterns\n", + "_ = sw.plot_bombcell_labels_upset(\n", + " analyzer,\n", + " unit_labels=bombcell_labels[\"bombcell_label\"],\n", + " thresholds=thresholds,\n", + " unit_labels_to_plot=[\"noise\", \"mua\"],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4399777b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "439ae620", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0c26f20b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac313a50", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a1204d5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "spike_interface", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/src/spikeinterface/curation/bombcell_pipeline.py b/src/spikeinterface/curation/bombcell_pipeline.py index 6506704b5c..54651953ee 100644 --- a/src/spikeinterface/curation/bombcell_pipeline.py +++ b/src/spikeinterface/curation/bombcell_pipeline.py @@ -237,10 +237,6 @@ def get_default_qc_params(): sliding_rp_max_ms : float, default: 10.0 Maximum refractory period to test when sweeping. - sliding_rp_confidence : float, default: 0.9 - Confidence level for contamination estimate. Higher values - give more conservative (higher) contamination estimates. - **Drift Parameters** drift_interval_s : float, default: 60 @@ -301,7 +297,6 @@ def get_default_qc_params(): # Sliding RP method "sliding_rp_exclude_below_ms": 0.5, "sliding_rp_max_ms": 10.0, - "sliding_rp_confidence": 0.9, # Drift "drift_interval_s": 60, "drift_min_spikes": 100, @@ -581,7 +576,6 @@ def run_bombcell_qc( "sliding_rp_violation": { "exclude_ref_period_below_ms": params["sliding_rp_exclude_below_ms"], "max_ref_period_ms": params["sliding_rp_max_ms"], - "confidence_threshold": params["sliding_rp_confidence"], }, "drift": { "interval_s": params["drift_interval_s"], diff --git a/src/spikeinterface/metrics/quality/misc_metrics.py b/src/spikeinterface/metrics/quality/misc_metrics.py index 7260d34a3f..3d6911b383 100644 --- a/src/spikeinterface/metrics/quality/misc_metrics.py +++ b/src/spikeinterface/metrics/quality/misc_metrics.py @@ -553,12 +553,11 @@ def compute_sliding_rp_violations( exclude_ref_period_below_ms=0.5, max_ref_period_ms=10, contamination_values=None, - confidence_threshold=0.9, ): """ Compute sliding refractory period violations, a metric developed by IBL which computes contamination by using a sliding refractory period. - This metric computes the minimum contamination with at least ``confidence_threshold`` confidence. + This metric computes the minimum contamination with at least 90% confidence. Parameters ---------- @@ -582,17 +581,11 @@ def compute_sliding_rp_violations( Maximum refractory period to test in ms. contamination_values : 1d array or None, default: None The contamination values to test, If None, it is set to np.arange(0.5, 35, 0.5). - confidence_threshold : float, default: 0.9 - Confidence threshold (between 0 and 1) for determining the minimum contamination. - A higher value requires stronger statistical evidence. Default is 0.9 (90% confidence). Returns ------- - result : namedtuple - Named tuple with fields: - - - ``sliding_rp_violation`` : dict of floats — minimum contamination per unit. - - ``sliding_rp_estimated_tauR`` : dict of floats — estimated refractory period (s) per unit. + contamination : dict of floats + The minimum contamination at 90% confidence. References ---------- @@ -600,8 +593,6 @@ def compute_sliding_rp_violations( This code was adapted from: https://github.com/SteinmetzLab/slidingRefractory/blob/1.0.0/python/slidingRP/metrics.py """ - res = namedtuple("sliding_rp_result", ["sliding_rp_violation", "sliding_rp_estimated_tauR"]) - total_durations = compute_total_durations_per_unit(sorting_analyzer, periods=periods) sorting = sorting_analyzer.sorting sorting = sorting.select_periods(periods=periods) @@ -612,7 +603,6 @@ def compute_sliding_rp_violations( fs = sorting_analyzer.sampling_frequency contamination = {} - estimated_tauR = {} spikes, slices = sorting.to_reordered_spike_vector( ["sample_index", "segment_index", "unit_index"], return_order=False @@ -628,14 +618,13 @@ def compute_sliding_rp_violations( unit_n_spikes = len(sub_spikes) if unit_n_spikes <= min_spikes: contamination[unit_id] = np.nan - estimated_tauR[unit_id] = np.nan continue duration = total_durations[unit_id] sub_sorting = NumpySorting(sub_spikes, fs, unit_ids=[unit_id]) - min_contam, est_tauR, _, _ = slidingRP_violations( + contamination[unit_id] = slidingRP_violations( sub_sorting, duration, bin_size_ms, @@ -643,12 +632,9 @@ def compute_sliding_rp_violations( exclude_ref_period_below_ms, max_ref_period_ms, contamination_values, - confidence_threshold=confidence_threshold, ) - contamination[unit_id] = min_contam - estimated_tauR[unit_id] = est_tauR - return res(contamination, estimated_tauR) + return contamination class SlidingRPViolation(BaseMetric): @@ -661,12 +647,10 @@ class SlidingRPViolation(BaseMetric): "exclude_ref_period_below_ms": 0.5, "max_ref_period_ms": 10, "contamination_values": None, - "confidence_threshold": 0.9, } - metric_columns = {"sliding_rp_violation": float, "sliding_rp_estimated_tauR": float} + metric_columns = {"sliding_rp_violation": float} metric_descriptions = { - "sliding_rp_violation": "Minimum contamination at specified confidence using sliding refractory period method.", - "sliding_rp_estimated_tauR": "Estimated refractory period (seconds) at which the minimum contamination was found.", + "sliding_rp_violation": "Minimum contamination at 90% confidence using sliding refractory period method." } supports_periods = True @@ -1712,7 +1696,7 @@ def slidingRP_violations( exclude_ref_period_below_ms=0.5, max_ref_period_ms=10, contamination_values=None, - confidence_threshold=0.9, + return_conf_matrix=False, ): """ A metric developed by IBL which determines whether the refractory period violations @@ -1722,10 +1706,8 @@ def slidingRP_violations( Parameters ---------- - sorting : BaseSorting - A sorting object (typically single-unit). - duration : float - Total duration in seconds. + spike_samples : ndarray_like or list (for multi-segment) + The spike times in samples. bin_size_ms : float The size (in ms) of binning for the autocorrelogram. window_size_s : float, default: 1 @@ -1736,23 +1718,16 @@ def slidingRP_violations( Maximum refractory period to test in ms. contamination_values : 1d array or None, default: None The contamination values to test, if None it is set to np.arange(0.5, 35, 0.5) / 100. - confidence_threshold : float, default: 0.9 - Confidence threshold (between 0 and 1). Default is 0.9 (90% confidence). + return_conf_matrix : bool, default: False + If True, the confidence matrix (n_contaminations, n_ref_periods) is returned. Code adapted from: https://github.com/SteinmetzLab/slidingRefractory/blob/master/python/slidingRP/metrics.py#L166 Returns ------- - min_contamination : float - The minimum contamination with confidence above the specified threshold. - estimated_tauR : float - The refractory period (in seconds) at which the minimum contamination was found. - contamination_at_each_tauR : np.ndarray - 1D array of length ``n_rp_centers``. For each tauR tested, the minimum - contamination with confidence above the threshold (NaN where none passes). - rp_centers : np.ndarray - 1D array of the refractory period centers tested (in seconds). + min_cont_with_90_confidence : dict of floats + The minimum contamination with confidence > 90%. """ if contamination_values is None: contamination_values = np.arange(0.5, 35, 0.5) / 100 # vector of contamination values to test @@ -1792,26 +1767,18 @@ def slidingRP_violations( ) test_rp_centers_mask = rp_centers > exclude_ref_period_below_ms / 1000.0 # (in seconds) - # For each tauR, find the minimum contamination where confidence exceeds threshold - contamination_at_each_tauR = np.full(len(rp_centers), np.nan) - for j in range(len(rp_centers)): - passing = np.where(conf_matrix[:, j] > confidence_threshold)[0] - if len(passing) > 0: - contamination_at_each_tauR[j] = contamination_values[passing[0]] - - # Only test for refractory period durations greater than 'exclude_ref_period_below_ms' - masked_contam = contamination_at_each_tauR.copy() - masked_contam[~test_rp_centers_mask] = np.nan - - if np.any(~np.isnan(masked_contam)): - best_idx = np.nanargmin(masked_contam) - min_contamination = masked_contam[best_idx] - estimated_tauR = rp_centers[best_idx] - else: - min_contamination = np.nan - estimated_tauR = np.nan + # only test for refractory period durations greater than 'exclude_ref_period_below_ms' + inds_confidence90 = np.row_stack(np.where(conf_matrix[:, test_rp_centers_mask] > 0.9)) - return min_contamination, estimated_tauR, contamination_at_each_tauR, rp_centers + if len(inds_confidence90[0]) > 0: + minI = np.min(inds_confidence90[0][0]) + min_cont_with_90_confidence = contamination_values[minI] + else: + min_cont_with_90_confidence = np.nan + if return_conf_matrix: + return min_cont_with_90_confidence, conf_matrix + else: + return min_cont_with_90_confidence def _compute_rp_contamination_one_unit( diff --git a/src/spikeinterface/metrics/quality/quality_metrics.py b/src/spikeinterface/metrics/quality/quality_metrics.py index 399908ec03..c6b539fdc1 100644 --- a/src/spikeinterface/metrics/quality/quality_metrics.py +++ b/src/spikeinterface/metrics/quality/quality_metrics.py @@ -77,20 +77,6 @@ def _handle_backward_compatibility_on_load(self): if "peak_sign" in self.params["metric_params"]["amplitude_median"]: del self.params["metric_params"]["amplitude_median"]["peak_sign"] - # TODO: update this once `main_channel_index` PR is merged - # global peak_sign used to find appropriate channels for pca metric computation - # If not found, use a "peak_sign" set by any metric - global_peak_sign_from_params = self.params.get("peak_sign") - if global_peak_sign_from_params is None: - for metric_params in self.params["metric_params"].values(): - if "peak_sign" in metric_params: - global_peak_sign_from_params = metric_params["peak_sign"] - break - # If still not found, use <0.104.0 default, "neg" - if global_peak_sign_from_params is None: - global_peak_sign_from_params = "neg" - self.params["peak_sign"] = global_peak_sign_from_params - def _set_params( self, metric_names: list[str] | None = None, From b787a282d223a1e1a39133fce107e4591f428abe Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 4 Apr 2026 00:09:49 +0000 Subject: [PATCH 5/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- examples/how_to/full_pipeline_with_bombcell.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/how_to/full_pipeline_with_bombcell.ipynb b/examples/how_to/full_pipeline_with_bombcell.ipynb index 3f2b48c46f..aa8af0cad1 100644 --- a/examples/how_to/full_pipeline_with_bombcell.ipynb +++ b/examples/how_to/full_pipeline_with_bombcell.ipynb @@ -3882,4 +3882,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +}