diff --git a/build_pipeline.py b/build_pipeline.py index e193e7f6..41a4dcd5 100755 --- a/build_pipeline.py +++ b/build_pipeline.py @@ -7,8 +7,7 @@ import element_interface dj.config['database.host'] = 'database.eflab.org:3306' -dj.config['database.username'] = 'maria' -dj.config['database.password'] = 'Spike@Thr200' + experiment_dir = '/mnt/lab/data01/OpenEphys' db_prefix = 'lab_npx_' diff --git a/element_array_ephys/ephys.py b/element_array_ephys/ephys.py index f8217a07..699a6621 100644 --- a/element_array_ephys/ephys.py +++ b/element_array_ephys/ephys.py @@ -413,10 +413,12 @@ def make(self, key): for channel_idx, channel_info in channel2electrode_map.items() ] elif acq_software == "Open Ephys": - #print(session_dir) + print("Hey Im Here!!") + print(session_dir) dataset = openephys.OpenEphys(session_dir) - #print(dataset.probes.items()) + print(dataset.probes.items()) for serial_number, probe_data in dataset.probes.items(): + print(f"Serial Number is {str(serial_number)} while inserted probeserial is: {inserted_probe_serial_number}") if str(serial_number) == inserted_probe_serial_number: break else: diff --git a/populate_ephys.py b/populate_ephys.py new file mode 100755 index 00000000..e9b27754 --- /dev/null +++ b/populate_ephys.py @@ -0,0 +1,103 @@ +## Imports +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from pathlib import Path +import os +# import numcodecs +import datajoint as dj + +## Database specifics +experiment_dir = '/mnt/lab/data01/OpenEphys' +db_prefix = 'lab_npx_' + +dj.config['database.host'] = 'database.eflab.org:3306' +dj.config["enable_python_native_blobs"] = True +dj.config['custom'] = {'database_prefix': db_prefix,'ephys_root_data_dir': experiment_dir} + + +from build_pipeline import Subject, Session, Recording, probe, ephys, ephys_report + +def get_key(): + while True: + # Get user inputs + animal_id = input("Enter animal_id: ").strip() + session = input("Enter session: ").strip() + insertion_number = input("Enter insertion number: ").strip() + + # Print and confirm + print("\nYou entered:") + print(f" animal_id : {animal_id}") + print(f" session : {session}") + print(f" insertion number : {insertion_number}") + confirm = input("Are these the correct inputs? (yes/no): ").strip().lower() + + + # safety check to confirm the inputs + if confirm == "yes": + break + else: + print("Let's try again...\n") + + # Pick Probe + print("\nNow let's choose a probe:") + print(probe.Probe()) + probes = probe.Probe.fetch(format="frame") + print(probes) + probe_idx = input("pick the index of your choice") + print(probe.iloc(3)) + + key = {'animal_id' : int(animal_id), 'session': int(session), 'insertion_number' : int(insertion_number)} + print(f'processing key: {key}') + return key , probe_idx + + +def populate_ephys(key,probe_idx): + ''' + A function that correctly checks and populates the Ephys schema with all its subsequent tables. + ''' + + +# TODO choose a different probe when they exist + ephys.ProbeInsertion.insert1( + dict( + key, + probe=(probe.Probe()).fetch('probe')[probe_idx], + ), skip_duplicates=True + ) + + ephys.EphysRecording().populate(key, display_progress=True) + + + + key['paramset_idx']=3 + file_path = (ephys.EphysRecording.EphysFile() & key).fetch('file_path') + ks_path = file_path[0]+'/kilosort4/sorter_output' + ephys.ClusteringTask.insert1( + dict( + key, + task_mode="load", # load or trigger + clustering_output_dir=ks_path, + ), skip_duplicates=True + ) + + ephys.Clustering.populate(key, display_progress=True) + ephys.CuratedClustering.populate(key, display_progress=True) + ephys.QualityMetrics.populate(key, display_progress=True) + + + + +def main(): + key = get_key() + print(f"Populating the Ephys schema for key:\n {key} ... ") + populate_ephys(key) + + +if __name__ == "__main__": + main() + + + + + diff --git a/test_npx_pipe (1).ipynb b/test_npx_pipe (1).ipynb deleted file mode 100755 index ea6a2741..00000000 --- a/test_npx_pipe (1).ipynb +++ /dev/null @@ -1,6078 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Please enter DataJoint username: eflab\n", - "Please enter DataJoint password: ········\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2025-09-16 11:31:22,488][INFO]: Connecting eflab@database.eflab.org:3306\n", - "[2025-09-16 11:31:22,520][INFO]: Connected eflab@database.eflab.org:3306\n" - ] - } - ], - "source": [ - "import datajoint as dj\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "\n", - "dj.config['database.host'] = 'database.eflab.org:3306'\n", - "dj.config['database.username'] = 'eflab'\n", - "\n", - "experiment_dir = '/mnt/lab/data01/OpenEphys'\n", - "db_prefix = 'lab_npx_'\n", - "dj.config[\"enable_python_native_blobs\"] = True\n", - "dj.config['custom'] = {'database_prefix': db_prefix,'ephys_root_data_dir': experiment_dir}\n", - "\n", - "dj.conn()\n", - "\n", - "# schemata = {'experiment_db' : 'lab_experiments',\n", - "# 'stimulus_db' : 'lab_stimuli',\n", - "# 'behavior_db' : 'lab_behavior',\n", - "# 'recording_db' : 'lab_recordings',\n", - "# 'mice_db' : 'lab_mice' }\n", - "\n", - "# # # create a virtual module for every database schema that you are going to use\n", - "# for schema, value in schemata.items():\n", - "# globals()[schema] = dj.create_virtual_module(schema, value, create_tables=True, create_schema=True)\n", - "\n", - "from build_pipeline import Subject, Session, Recording, probe, ephys, ephys_report\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "rec = dj.create_virtual_module('lab_recordings.py', 'lab_recordings')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "ephys.EphysRecording.populate(key, display_progress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Ephys recording from a probe insertion for a given session.\n", - "
\n", - " \n", - " \n", - " \n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

electrode_config_hash

\n", - " \n", - "
\n", - "

acq_software

\n", - " \n", - "
\n", - "

sampling_rate

\n", - " (Hz)\n", - "
\n", - "

recording_datetime

\n", - " datetime of the recording from this probe\n", - "
\n", - "

recording_duration

\n", - " (seconds) duration of the recording from this probe\n", - "
\n", - " \n", - "

Total: 0

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num electrode_conf acq_software sampling_rate recording_date recording_dura\n", - "+-----------+ +---------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+\n", - "\n", - " (Total: 0)" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Session info\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

user_name

\n", - " user performing the experiment\n", - "
\n", - "

setup

\n", - " computer id\n", - "
\n", - "

session_tmst

\n", - " session timestamp\n", - "
\n", - "

experiment_type

\n", - " \n", - "
\n", - "

logger_tmst

\n", - " logger precise timestamp\n", - "
244283mariaef-rp52025-07-30 11:04:01MatchPort0.0
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session user_name setup session_tmst experiment_typ logger_tmst \n", - "+-----------+ +---------+ +-----------+ +--------+ +------------+ +------------+ +------------+\n", - "244 283 maria ef-rp5 2025-07-30 11: MatchPort 0.0 \n", - " (Total: 1)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "key = {'animal_id' : 244,\n", - " 'session' : 283,\n", - " 'insertion_number' : 1}\n", - "\n", - "Subject() & key" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Manual table for defining a clustering task ready to be run\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

clustering_output_dir

\n", - " clustering output directory relative to the clustering root data directory\n", - "
\n", - "

task_mode

\n", - " 'load': load computed analysis results, 'trigger': trigger computation\n", - "
24428313244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_outputload
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx clustering_out task_mode \n", - "+-----------+ +---------+ +------------+ +------------+ +------------+ +-----------+\n", - "244 283 1 3 244_283_1_2025 load \n", - " (Total: 1)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.ClusteringTask & key" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'244_225_1_2025-07-03_13-43-54/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.Probe'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "string = \"244_225_1_2025-07-03_13-43-54/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output\"\n", - "i = string.index('A/k')\n", - "string[:i]" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " .Table{\n", - " border-collapse:collapse;\n", - " }\n", - " .Table th{\n", - " background: #A0A0A0; color: #ffffff; padding:4px; border:#f0e0e0 1px solid;\n", - " font-weight: normal; font-family: monospace; font-size: 100%;\n", - " }\n", - " .Table td{\n", - " padding:4px; border:#f0e0e0 1px solid; font-size:100%;\n", - " }\n", - " .Table tr:nth-child(odd){\n", - " background: #ffffff;\n", - " color: #000000;\n", - " }\n", - " .Table tr:nth-child(even){\n", - " background: #f3f1ff;\n", - " color: #000000;\n", - " }\n", - " /* Tooltip container */\n", - " .djtooltip {\n", - " }\n", - " /* Tooltip text */\n", - " .djtooltip .djtooltiptext {\n", - " visibility: hidden;\n", - " width: 120px;\n", - " background-color: black;\n", - " color: #fff;\n", - " text-align: center;\n", - " padding: 5px 0;\n", - " border-radius: 6px;\n", - " /* Position the tooltip text - see examples below! */\n", - " position: absolute;\n", - " z-index: 1;\n", - " }\n", - " #primary {\n", - " font-weight: bold;\n", - " color: black;\n", - " }\n", - " #nonprimary {\n", - " font-weight: normal;\n", - " color: white;\n", - " }\n", - "\n", - " /* Show the tooltip text when you mouse over the tooltip container */\n", - " .djtooltip:hover .djtooltiptext {\n", - " visibility: visible;\n", - " }\n", - " \n", - " \n", - " Waveform metrics for a particular unit\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", - "\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", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

unit

\n", - " \n", - "
\n", - "

amplitude_median

\n", - " (uV) absolute difference between waveform peak and trough\n", - "
\n", - "

peak_to_valley

\n", - " (ms) time between waveform peak and trough\n", - "
\n", - "

half_width

\n", - " (ms) spike width at half max amplitude\n", - "
\n", - "

peak_trough_ratio

\n", - " absolute amplitude of peak divided by absolute amplitude of trough relative to 0\n", - "
\n", - "

repolarization_slope

\n", - " the repolarization slope was defined by fitting a regression line to the first 30us from trough to peak\n", - "
\n", - "

recovery_slope

\n", - " the recovery slope was defined by fitting a regression line to the first 30us from peak to tail\n", - "
\n", - "

spread

\n", - " (um) the range with amplitude above 12-percent of the maximum amplitude along the probe\n", - "
\n", - "

velocity_above

\n", - " (s/m) inverse velocity of waveform propagation from the soma toward the top of the probe\n", - "
\n", - "

velocity_below

\n", - " (s/m) inverse velocity of waveform propagation from the soma toward the bottom of the probe\n", - "
\n", - "

num_positive_peaks

\n", - " \n", - "
\n", - "

num_negative_peaks

\n", - " \n", - "
\n", - "

exp_decay

\n", - " \n", - "
24428313066.8850.001243330.00132-0.20096571043.0-20526.590.0nannan1.01.00.00351934
24428313117.3550.000840.00031-0.294477148725.0-23378.390.0nannan2.01.00.0279673
24428313224.180.0008333330.00024-0.288959217422.0-33734.360.0nannan1.01.00.0261229
24428313346.2150.0005933330.00199-1.5277539087.7-89019.6120.037.7815nan1.01.00.00955719
244283134139.8156.66667e-050.00185-0.9580333970350.0-6376.6190.0nannan0.00.00.00820124
244283135142.9356.66667e-050.00172333-0.9067664436500.017671.690.0nannan0.00.00.00851597
24428313613.650.0007166670.000276667-0.324688141258.0-21274.0120.0nannan1.01.00.0343427
244283137143.6176.66667e-050.00212-1.082023859520.0-5099.36180.0nannan0.00.00.00729127
24428313819.6950.0007133330.000226667-0.31022201312.0-27677.7120.01549.71nan1.01.00.0243837
244283139143.520.0004566670.00184333-1.080563744020.0-20808.7180.0nannan0.00.00.00759205
244283131064.9350.0007166670.000273333-0.357144444400.0-84944.4135.0nan425.9831.01.00.0250961
244283131139.00.0008566670.000206667-0.1969650944.0-58544.7105.0778.502nan0.01.00.0379851
\n", - "

...

\n", - "

Total: 574

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx *unit amplitude_medi peak_to_valley half_width peak_trough_ra repolarization recovery_slope spread velocity_above velocity_below num_positive_p num_negative_p exp_decay \n", - "+-----------+ +---------+ +------------+ +------------+ +------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+ +--------+ +------------+ +------------+ +------------+ +------------+ +------------+\n", - "244 283 1 3 0 66.885 0.00124333 0.00132 -0.200965 71043.0 -20526.5 90.0 nan nan 1.0 1.0 0.00351934 \n", - "244 283 1 3 1 17.355 0.00084 0.00031 -0.294477 148725.0 -23378.3 90.0 nan nan 2.0 1.0 0.0279673 \n", - "244 283 1 3 2 24.18 0.000833333 0.00024 -0.288959 217422.0 -33734.3 60.0 nan nan 1.0 1.0 0.0261229 \n", - "244 283 1 3 3 46.215 0.000593333 0.00199 -1.52775 39087.7 -89019.6 120.0 37.7815 nan 1.0 1.0 0.00955719 \n", - "244 283 1 3 4 139.815 6.66667e-05 0.00185 -0.958033 3970350.0 -6376.61 90.0 nan nan 0.0 0.0 0.00820124 \n", - "244 283 1 3 5 142.935 6.66667e-05 0.00172333 -0.906766 4436500.0 17671.6 90.0 nan nan 0.0 0.0 0.00851597 \n", - "244 283 1 3 6 13.65 0.000716667 0.000276667 -0.324688 141258.0 -21274.0 120.0 nan nan 1.0 1.0 0.0343427 \n", - "244 283 1 3 7 143.617 6.66667e-05 0.00212 -1.08202 3859520.0 -5099.36 180.0 nan nan 0.0 0.0 0.00729127 \n", - "244 283 1 3 8 19.695 0.000713333 0.000226667 -0.31022 201312.0 -27677.7 120.0 1549.71 nan 1.0 1.0 0.0243837 \n", - "244 283 1 3 9 143.52 0.000456667 0.00184333 -1.08056 3744020.0 -20808.7 180.0 nan nan 0.0 0.0 0.00759205 \n", - "244 283 1 3 10 64.935 0.000716667 0.000273333 -0.357144 444400.0 -84944.4 135.0 nan 425.983 1.0 1.0 0.0250961 \n", - "244 283 1 3 11 39.0 0.000856667 0.000206667 -0.1969 650944.0 -58544.7 105.0 778.502 nan 0.0 1.0 0.0379851 \n", - " ...\n", - " (Total: 574)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.QualityMetrics." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Cluster metrics for a particular unit\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", - "\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", - "\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", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

unit

\n", - " \n", - "
\n", - "

num_spikes

\n", - " Number of spikes\n", - "
\n", - "

firing_rate

\n", - " (Hz) firing rate for a unit\n", - "
\n", - "

snr

\n", - " signal-to-noise ratio for a unit\n", - "
\n", - "

presence_ratio

\n", - " fraction of time in which spikes are present\n", - "
\n", - "

isi_violations_ratio

\n", - " rate of ISI violation as a fraction of overall rate\n", - "
\n", - "

isi_violations_count

\n", - " total number of ISI violations\n", - "
\n", - "

amplitude_cutoff

\n", - " estimate of miss rate based on amplitude histogram\n", - "
\n", - "

amplitude_median

\n", - " \n", - "
\n", - "

amplitude_cv_median

\n", - " \n", - "
\n", - "

amplitude_cv_range

\n", - " \n", - "
\n", - "

isolation_distance

\n", - " distance to nearest cluster in Mahalanobis space\n", - "
\n", - "

l_ratio

\n", - " \n", - "
\n", - "

d_prime

\n", - " Classification accuracy based on LDA\n", - "
\n", - "

nn_hit_rate

\n", - " Fraction of neighbors for target cluster that are also in target cluster\n", - "
\n", - "

nn_miss_rate

\n", - " Fraction of neighbors outside target cluster that are in target cluster\n", - "
\n", - "

silhouette

\n", - " Standard metric for cluster overlap\n", - "
\n", - "

drift_ptp

\n", - " Maximum change in spike depth throughout recording\n", - "
\n", - "

drift_mad

\n", - " Cumulative change in spike depth throughout recording\n", - "
\n", - "

drift_std

\n", - " \n", - "
\n", - "

rp_contamination

\n", - " \n", - "
\n", - "

rp_violations

\n", - " \n", - "
\n", - "

sliding_rp_violation

\n", - " \n", - "
\n", - "

sync_spike_2

\n", - " \n", - "
\n", - "

sync_spike_4

\n", - " \n", - "
\n", - "

sync_spike_8

\n", - " \n", - "
\n", - "

firing_range

\n", - " \n", - "
\n", - "

sd_ratio

\n", - " \n", - "
2442831302475.00.7096152.363061.057.8873050.00023929666.8850.3761710.33563769.27841.476352.753640.5608110.01913290.107392nannannan1.0176.0nan0.3422220.02181820.04.81.10102
2442831314327.01.240612.601171.00.31047656.15437e-0517.3551.574380.95975681.0590.5847793.402890.4398650.01861370.0471289nannannan0.09793871.00.290.1451350.007164320.0006933213.241.01791
24428313215959.04.575653.892891.00.136943301.62154e-0524.181.141630.86270181.47940.5397053.979620.6344590.009319830.105931.041150.1690720.2496790.10860515.00.1250.09944230.001378530.00018798212.01.01223
244283133862.00.2471471.497011.00.000.0029372346.2150.5954570.379135134.860.04761714.41070.8962590.001416650.183495nannannan0.00.0nan0.1368910.001160090.00.81.18848
2442831344056.01.162915.607790.98275916.25412300.00243291139.815nannan81.40750.5457343.694570.6824320.01240910.101762nannannan1.0139.0nan0.07569030.0002465480.05.01.69756
2442831351381.00.3959516.107870.96551715.24250.00751238142.9350.369190.21493782.31510.4890033.729670.5641890.0177310.0991084nannannan1.07.0nan0.07965240.0007241130.01.81.77574
2442831362783.00.7979222.303771.00.30021720.00067213.652.056771.39111102.8420.5812253.367960.3869050.009658970.0383607nannannan0.00.0nan0.1153430.003952570.01.61.20404
2442831372142.00.6141395.098260.96551719.2578760.017865143.617nannan137.6520.8873995.21730.8773290.002464680.23809nannannan1.027.0nan0.07282910.0009337070.0004668532.641.29442
24428313813089.03.752793.395931.00.15608233.20644e-0519.6951.198090.802193114.0870.2864213.704460.3928570.0125180.04350451.760760.3004380.4067770.09624339.00.120.09618760.00061120.00015285.01.04354
2442831392687.00.7703985.847710.96551711.7549730.0099644143.52nannan122.3632.101334.786170.816770.002210590.17551nannannan1.033.0nan0.09341270.001116490.0003721623.21.33561
24428313107066.02.025917.581891.00.465708200.00026467464.9350.67940.274888108.663.944782.255750.3307450.008740730.01962172.137890.2683150.2637230.69690113.0nan0.1844040.007925280.0005660913.41.27954
24428313111182.00.3388959.739231.00.000.0030610439.00.5353950.245662298.0641.79671e-0710.62910.912260.0007148690.205392nannannan0.00.0nan0.1125210.00.01.40.968612
\n", - "

...

\n", - "

Total: 574

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx *unit num_spikes firing_rate snr presence_ratio isi_violations isi_violations amplitude_cuto amplitude_medi amplitude_cv_m amplitude_cv_r isolation_dist l_ratio d_prime nn_hit_rate nn_miss_rate silhouette drift_ptp drift_mad drift_std rp_contaminati rp_violations sliding_rp_vio sync_spike_2 sync_spike_4 sync_spike_8 firing_range sd_ratio \n", - "+-----------+ +---------+ +------------+ +------------+ +------+ +------------+ +------------+ +---------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+ +---------+ +------------+ +------------+ +------------+ +-----------+ +-----------+ +-----------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+ +----------+\n", - "244 283 1 3 0 2475.0 0.709615 2.36306 1.0 57.887 305 0.000239296 66.885 0.376171 0.335637 69.2784 1.47635 2.75364 0.560811 0.0191329 0.107392 nan nan nan 1.0 176.0 nan 0.342222 0.0218182 0.0 4.8 1.10102 \n", - "244 283 1 3 1 4327.0 1.24061 2.60117 1.0 0.310476 5 6.15437e-05 17.355 1.57438 0.959756 81.059 0.584779 3.40289 0.439865 0.0186137 0.0471289 nan nan nan 0.0979387 1.0 0.29 0.145135 0.00716432 0.000693321 3.24 1.01791 \n", - "244 283 1 3 2 15959.0 4.57565 3.89289 1.0 0.136943 30 1.62154e-05 24.18 1.14163 0.862701 81.4794 0.539705 3.97962 0.634459 0.00931983 0.10593 1.04115 0.169072 0.249679 0.108605 15.0 0.125 0.0994423 0.00137853 0.000187982 12.0 1.01223 \n", - "244 283 1 3 3 862.0 0.247147 1.49701 1.0 0.0 0 0.00293723 46.215 0.595457 0.379135 134.86 0.0476171 4.4107 0.896259 0.00141665 0.183495 nan nan nan 0.0 0.0 nan 0.136891 0.00116009 0.0 0.8 1.18848 \n", - "244 283 1 3 4 4056.0 1.16291 5.60779 0.982759 16.2541 230 0.00243291 139.815 nan nan 81.4075 0.545734 3.69457 0.682432 0.0124091 0.101762 nan nan nan 1.0 139.0 nan 0.0756903 0.000246548 0.0 5.0 1.69756 \n", - "244 283 1 3 5 1381.0 0.395951 6.10787 0.965517 15.24 25 0.00751238 142.935 0.36919 0.214937 82.3151 0.489003 3.72967 0.564189 0.017731 0.0991084 nan nan nan 1.0 7.0 nan 0.0796524 0.000724113 0.0 1.8 1.77574 \n", - "244 283 1 3 6 2783.0 0.797922 2.30377 1.0 0.300217 2 0.000672 13.65 2.05677 1.39111 102.842 0.581225 3.36796 0.386905 0.00965897 0.0383607 nan nan nan 0.0 0.0 nan 0.115343 0.00395257 0.0 1.6 1.20404 \n", - "244 283 1 3 7 2142.0 0.614139 5.09826 0.965517 19.2578 76 0.017865 143.617 nan nan 137.652 0.887399 5.2173 0.877329 0.00246468 0.23809 nan nan nan 1.0 27.0 nan 0.0728291 0.000933707 0.000466853 2.64 1.29442 \n", - "244 283 1 3 8 13089.0 3.75279 3.39593 1.0 0.15608 23 3.20644e-05 19.695 1.19809 0.802193 114.087 0.286421 3.70446 0.392857 0.012518 0.0435045 1.76076 0.300438 0.406777 0.0962433 9.0 0.12 0.0961876 0.0006112 0.0001528 5.0 1.04354 \n", - "244 283 1 3 9 2687.0 0.770398 5.84771 0.965517 11.7549 73 0.0099644 143.52 nan nan 122.363 2.10133 4.78617 0.81677 0.00221059 0.17551 nan nan nan 1.0 33.0 nan 0.0934127 0.00111649 0.000372162 3.2 1.33561 \n", - "244 283 1 3 10 7066.0 2.02591 7.58189 1.0 0.465708 20 0.000264674 64.935 0.6794 0.274888 108.66 3.94478 2.25575 0.330745 0.00874073 0.0196217 2.13789 0.268315 0.263723 0.696901 13.0 nan 0.184404 0.00792528 0.000566091 3.4 1.27954 \n", - "244 283 1 3 11 1182.0 0.338895 9.73923 1.0 0.0 0 0.00306104 39.0 0.535395 0.245662 298.064 1.79671e-07 10.6291 0.91226 0.000714869 0.205392 nan nan nan 0.0 0.0 nan 0.112521 0.0 0.0 1.4 0.968612 \n", - " ...\n", - " (Total: 574)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.QualityMetrics.Cluster()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "QualityMetrics: 0%| | 0/1 [00:00\n", - "Checking /mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/sorting_analyzer/extensions/quality_metrics/metrics.csv\n", - "Loaded quality_metrics metrics: (574, 28)\n", - "Collumns ['Unnamed: 0', 'num_spikes', 'firing_rate', 'presence_ratio', 'snr', 'isi_violations_ratio', 'isi_violations_count', 'rp_contamination', 'rp_violations', 'sliding_rp_violation', 'amplitude_cutoff', 'amplitude_median', 'amplitude_cv_median', 'amplitude_cv_range', 'sync_spike_2', 'sync_spike_4', 'sync_spike_8', 'firing_range', 'drift_ptp', 'drift_std', 'drift_mad', 'sd_ratio', 'isolation_distance', 'l_ratio', 'd_prime', 'silhouette', 'nn_hit_rate', 'nn_miss_rate']\n", - "Checking /mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/sorting_analyzer/extensions/template_metrics/metrics.csv\n", - "Loaded template_metrics metrics: (574, 12)\n", - "Collumns ['Unnamed: 0', 'peak_to_valley', 'peak_trough_ratio', 'half_width', 'repolarization_slope', 'recovery_slope', 'num_positive_peaks', 'num_negative_peaks', 'velocity_above', 'velocity_below', 'exp_decay', 'spread']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "QualityMetrics: 100%|██████████| 1/1 [00:00<00:00, 2.26it/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Final metrics list length: 574\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "ephys.QualityMetrics().populate(key, display_progress=True)\n", - "# ephys.QualityMetrics().drop()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# keys = [{'animal_id' : 244,\n", - "# 'session' : 228,\n", - "# 'insertion_number' : 1,},\n", - "# {'animal_id' : 244,\n", - "# 'session' : 229,\n", - "# 'insertion_number' : 1,},\n", - "# {'animal_id' : 244,\n", - "# 'session' : 230,\n", - "# 'insertion_number' : 1,},\n", - "# {'animal_id' : 244,\n", - "# 'session' : 231,\n", - "# 'insertion_number' : 1,},\n", - "# {'animal_id' : 244,\n", - "# 'session' : 233,\n", - "# 'insertion_number' : 1,},\n", - "# ]\n", - "\n", - "keys = [key]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Ephys recording from a probe insertion for a given session.\n", - "
\n", - " \n", - " \n", - " \n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

electrode_config_hash

\n", - " \n", - "
\n", - "

acq_software

\n", - " \n", - "
\n", - "

sampling_rate

\n", - " (Hz)\n", - "
\n", - "

recording_datetime

\n", - " datetime of the recording from this probe\n", - "
\n", - "

recording_duration

\n", - " (seconds) duration of the recording from this probe\n", - "
\n", - " \n", - "

Total: 0

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num electrode_conf acq_software sampling_rate recording_date recording_dura\n", - "+-----------+ +---------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+\n", - "\n", - " (Total: 0)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.EphysRecording() & key\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Clustering Procedure\n", - "
\n", - " \n", - " \n", - " \n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

clustering_time

\n", - " time of generation of this set of clustering results\n", - "
\n", - "

package_version

\n", - " \n", - "
\n", - " \n", - "

Total: 0

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx clustering_tim package_versio\n", - "+-----------+ +---------+ +------------+ +------------+ +------------+ +------------+\n", - "\n", - " (Total: 0)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.Clustering() & key" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Properties of a given unit from a round of clustering (and curation)\n", - "
\n", - " \n", - " \n", - " \n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

unit

\n", - " \n", - "
\n", - "

electrode_config_hash

\n", - " \n", - "
\n", - "

probe_type

\n", - " e.g. neuropixels_1.0\n", - "
\n", - "

electrode

\n", - " electrode index, starts at 0\n", - "
\n", - "

cluster_quality_label

\n", - " cluster quality type - e.g. 'good', 'MUA', 'noise', etc.\n", - "
\n", - "

spike_count

\n", - " how many spikes in this recording for this unit\n", - "
\n", - "

spike_times

\n", - " (s) spike times of this unit, relative to the start of the EphysRecording\n", - "
\n", - "

spike_sites

\n", - " array of electrode associated with each spike\n", - "
\n", - "

spike_depths

\n", - " (um) array of depths associated with each spike, relative to the (0, 0) of the probe\n", - "
\n", - " \n", - "

Total: 0

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx *unit electrode_conf probe_type electrode cluster_qualit spike_count spike_time spike_site spike_dept\n", - "+-----------+ +---------+ +------------+ +------------+ +------+ +------------+ +------------+ +-----------+ +------------+ +------------+ +--------+ +--------+ +--------+\n", - "\n", - " (Total: 0)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.CuratedClustering.Unit()& key" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2025-09-15 11:52:05,478][INFO]: `lab_npx_ephys`.`_quality_metrics` (1 tuples)\n", - "[2025-09-15 11:52:05,484][INFO]: `lab_npx_ephys`.`_quality_metrics__waveform` (124 tuples)\n", - "[2025-09-15 11:52:05,492][INFO]: `lab_npx_ephys`.`_quality_metrics__cluster` (124 tuples)\n", - "[2025-09-15 11:52:05,497][INFO]: `lab_npx_ephys_report`.`quality_metric_set` (0 tuples)\n", - "[2025-09-15 11:52:05,503][INFO]: `lab_npx_ephys_report`.`__quality_metric_report` (0 tuples)\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Proceed? [yes, No]: yes\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2025-09-15 11:52:07,888][INFO]: Dropped table `lab_npx_ephys_report`.`__quality_metric_report`\n", - "[2025-09-15 11:52:07,922][INFO]: Dropped table `lab_npx_ephys_report`.`quality_metric_set`\n", - "[2025-09-15 11:52:07,953][INFO]: Dropped table `lab_npx_ephys`.`_quality_metrics__cluster`\n", - "[2025-09-15 11:52:07,985][INFO]: Dropped table `lab_npx_ephys`.`_quality_metrics__waveform`\n", - "[2025-09-15 11:52:08,015][INFO]: Dropped table `lab_npx_ephys`.`_quality_metrics`\n", - "[2025-09-15 11:52:08,022][INFO]: Tables dropped. Restart kernel.\n" - ] - } - ], - "source": [ - "ephys.QualityMetrics.drop()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "EphysRecording: 0%| | 0/1 [00:00\n", - "574\n", - "9236529\n", - "HERE\n", - "574 574\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/mnt/lab/users/stamatis/My_Code/Python/Pipeline/element_array_ephys/element_array_ephys/readers/kilosort.py:182: RuntimeWarning: invalid value encountered in divide\n", - " self._data[\"spike_depths\"] = np.sum(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "line 1167\n", - "9236529\n", - "[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17\n", - " 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35\n", - " 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53\n", - " 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71\n", - " 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89\n", - " 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107\n", - " 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125\n", - " 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143\n", - " 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161\n", - " 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179\n", - " 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197\n", - " 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215\n", - " 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233\n", - " 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251\n", - " 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269\n", - " 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287\n", - " 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305\n", - " 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323\n", - " 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341\n", - " 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359\n", - " 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377\n", - " 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395\n", - " 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413\n", - " 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431\n", - " 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449\n", - " 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467\n", - " 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485\n", - " 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503\n", - " 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521\n", - " 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539\n", - " 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557\n", - " 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573]\n", - "['mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'good'\n", - " 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'good'\n", - " 'good' 'good' 'good' 'good' 'mua' 'good' 'good' 'good' 'good' 'good'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'good' 'good'\n", - " 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'good' 'good' 'good' 'mua' 'good'\n", - " 'good' 'good' 'mua' 'mua' 'mua' 'good' 'good' 'good' 'mua' 'mua' 'good'\n", - " 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'good' 'good' 'mua' 'mua' 'good' 'mua' 'good' 'good' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'good' 'mua' 'mua'\n", - " 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'good' 'mua' 'good'\n", - " 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua'\n", - " 'mua' 'good' 'good' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'good'\n", - " 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'good' 'good' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good'\n", - " 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'good' 'mua' 'good'\n", - " 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'good' 'mua' 'good' 'good' 'mua' 'good' 'mua' 'good' 'mua' 'good' 'mua'\n", - " 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'good'\n", - " 'mua' 'good' 'mua' 'good' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'good' 'mua' 'good' 'good' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua'\n", - " 'good' 'mua' 'good' 'mua' 'good' 'mua' 'good' 'mua' 'good' 'good' 'good'\n", - " 'mua' 'good' 'mua' 'mua' 'good' 'good' 'mua' 'mua' 'good' 'good' 'mua'\n", - " 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'mua'\n", - " 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good'\n", - " 'mua' 'good' 'good' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'good' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'good'\n", - " 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'good'\n", - " 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'good' 'good' 'mua' 'good' 'mua' 'good' 'good' 'mua' 'mua' 'good' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'good' 'good' 'good' 'good' 'good' 'good' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'good' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good'\n", - " 'mua' 'good' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'good'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'good'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua'\n", - " 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'good' 'good'\n", - " 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'good'\n", - " 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "CuratedClustering: 100%|██████████| 1/1 [04:10<00:00, 250.06s/it]\n" - ] - } - ], - "source": [ - "# Checked and works\n", - "for key in keys:\n", - " ephys.ProbeInsertion.insert1(\n", - " dict(\n", - " key,\n", - " probe=(probe.Probe() & 'probe_type=\"Neuropixels 2.0 - Multishank\"').fetch('probe')[0],\n", - " ), skip_duplicates=True\n", - " ) # probe, subject, session_datetime needs to follow the restrictions of foreign keys.\n", - " #ephys.ProbeInsertion()\n", - " ephys.EphysRecording().populate(key, display_progress=True)\n", - "\n", - " key['paramset_idx']=3\n", - " file_path = (ephys.EphysRecording.EphysFile() & key).fetch('file_path')\n", - " ks_path = file_path[0]+'/kilosort4/sorter_output'\n", - " ephys.ClusteringTask.insert1(\n", - " dict(\n", - " key,\n", - " task_mode=\"load\", # load or trigger\n", - " clustering_output_dir=ks_path,\n", - " )\n", - " )\n", - "\n", - " ephys.Clustering.populate(key, display_progress=True)\n", - " (ephys.CuratedClustering).populate(key, display_progress=True)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Probe insertion implanted into an animal for a given session.\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

probe

\n", - " unique identifier for this model of probe (e.g. serial number)\n", - "
244283123107806184
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num probe \n", - "+-----------+ +---------+ +------------+ +------------+\n", - "244 283 1 23107806184 \n", - " (Total: 1)" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.ProbeInsertion() & key" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Probe insertion implanted into an animal for a given session.\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

probe

\n", - " unique identifier for this model of probe (e.g. serial number)\n", - "
244225123107806184
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num probe \n", - "+-----------+ +---------+ +------------+ +------------+\n", - "244 225 1 23107806184 \n", - " (Total: 1)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.ProbeInsertion() & key" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'23107806184'" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "probe1=(probe.Probe() & 'probe_type=\"Neuropixels 2.0 - Multishank\"').fetch('probe')[0]\n", - "probe1" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'`paramset_idx` is not in the table heading'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[27], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mephys\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mProbeInsertion\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minsert1\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mdict\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mprobe\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mprobe\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mProbe\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m&\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mprobe_type=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mNeuropixels 2.0 - Multishank\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfetch\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mprobe\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m)\u001b[49m \u001b[38;5;66;03m# probe, subject, session_datetime needs to follow the restrictions of foreign keys.\u001b[39;00m\n\u001b[1;32m 7\u001b[0m ephys\u001b[38;5;241m.\u001b[39mProbeInsertion()\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:337\u001b[0m, in \u001b[0;36mTable.insert1\u001b[0;34m(self, row, **kwargs)\u001b[0m\n\u001b[1;32m 330\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minsert1\u001b[39m(\u001b[38;5;28mself\u001b[39m, row, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 331\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 332\u001b[0m \u001b[38;5;124;03m Insert one data record into the table. For ``kwargs``, see ``insert()``.\u001b[39;00m\n\u001b[1;32m 333\u001b[0m \n\u001b[1;32m 334\u001b[0m \u001b[38;5;124;03m :param row: a numpy record, a dict-like object, or an ordered sequence to be inserted\u001b[39;00m\n\u001b[1;32m 335\u001b[0m \u001b[38;5;124;03m as one row.\u001b[39;00m\n\u001b[1;32m 336\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 337\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minsert\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrow\u001b[49m\u001b[43m,\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:419\u001b[0m, in \u001b[0;36mTable.insert\u001b[0;34m(self, rows, replace, skip_duplicates, ignore_extra_fields, allow_direct_insert)\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 418\u001b[0m field_list \u001b[38;5;241m=\u001b[39m [] \u001b[38;5;66;03m# collects the field list from first row (passed by reference)\u001b[39;00m\n\u001b[0;32m--> 419\u001b[0m rows \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 420\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__make_row_to_insert\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrow\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfield_list\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mignore_extra_fields\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 421\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrow\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrows\u001b[49m\n\u001b[1;32m 422\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 423\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m rows:\n\u001b[1;32m 424\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:420\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 418\u001b[0m field_list \u001b[38;5;241m=\u001b[39m [] \u001b[38;5;66;03m# collects the field list from first row (passed by reference)\u001b[39;00m\n\u001b[1;32m 419\u001b[0m rows \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(\n\u001b[0;32m--> 420\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__make_row_to_insert\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrow\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfield_list\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mignore_extra_fields\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 421\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m row \u001b[38;5;129;01min\u001b[39;00m rows\n\u001b[1;32m 422\u001b[0m )\n\u001b[1;32m 423\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m rows:\n\u001b[1;32m 424\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:871\u001b[0m, in \u001b[0;36mTable.__make_row_to_insert\u001b[0;34m(self, row, field_list, ignore_extra_fields)\u001b[0m\n\u001b[1;32m 865\u001b[0m attributes \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 866\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__make_placeholder(name, row[name], ignore_extra_fields)\n\u001b[1;32m 867\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mheading\n\u001b[1;32m 868\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m row\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mfields\n\u001b[1;32m 869\u001b[0m ]\n\u001b[1;32m 870\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(row, collections\u001b[38;5;241m.\u001b[39mabc\u001b[38;5;241m.\u001b[39mMapping): \u001b[38;5;66;03m# dict-based\u001b[39;00m\n\u001b[0;32m--> 871\u001b[0m \u001b[43mcheck_fields\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrow\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 872\u001b[0m attributes \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 873\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__make_placeholder(name, row[name], ignore_extra_fields)\n\u001b[1;32m 874\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mheading\n\u001b[1;32m 875\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m row\n\u001b[1;32m 876\u001b[0m ]\n\u001b[1;32m 877\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m: \u001b[38;5;66;03m# positional\u001b[39;00m\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:857\u001b[0m, in \u001b[0;36mTable.__make_row_to_insert..check_fields\u001b[0;34m(fields)\u001b[0m\n\u001b[1;32m 855\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m field \u001b[38;5;129;01min\u001b[39;00m fields:\n\u001b[1;32m 856\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m field \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mheading:\n\u001b[0;32m--> 857\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(\n\u001b[1;32m 858\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m`\u001b[39m\u001b[38;5;132;01m{0:s}\u001b[39;00m\u001b[38;5;124m` is not in the table heading\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(field)\n\u001b[1;32m 859\u001b[0m )\n\u001b[1;32m 860\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mset\u001b[39m(field_list) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mset\u001b[39m(fields)\u001b[38;5;241m.\u001b[39mintersection(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mheading\u001b[38;5;241m.\u001b[39mnames):\n\u001b[1;32m 861\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m DataJointError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAttempt to insert rows with different fields.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mKeyError\u001b[0m: '`paramset_idx` is not in the table heading'" - ] - } - ], - "source": [ - "ephys.ProbeInsertion.insert1(\n", - " dict(\n", - " key,\n", - " probe=(probe.Probe() & 'probe_type=\"Neuropixels 2.0 - Multishank\"').fetch('probe')[0],\n", - " )\n", - ") # probe, subject, session_datetime needs to follow the restrictions of foreign keys.\n", - "ephys.ProbeInsertion()" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Ephys recording from a probe insertion for a given session.\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

electrode_config_hash

\n", - " \n", - "
\n", - "

acq_software

\n", - " \n", - "
\n", - "

sampling_rate

\n", - " (Hz)\n", - "
\n", - "

recording_datetime

\n", - " datetime of the recording from this probe\n", - "
\n", - "

recording_duration

\n", - " (seconds) duration of the recording from this probe\n", - "
24422517c36bff0-7661-5320-7844-9cb708b5b41cOpen Ephys30000.02025-07-03 14:09:1648.9805
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num electrode_conf acq_software sampling_rate recording_date recording_dura\n", - "+-----------+ +---------+ +------------+ +------------+ +------------+ +------------+ +------------+ +------------+\n", - "244 225 1 7c36bff0-7661- Open Ephys 30000.0 2025-07-03 14: 48.9805 \n", - " (Total: 1)" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "ephys.EphysRecording().populate(key, display_progress=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Paths of files of a given EphysRecording round.\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

file_path

\n", - " filepath relative to root data directory\n", - "
2442831244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *file_path \n", - "+-----------+ +---------+ +------------+ +------------+\n", - "244 283 1 244_283_1_2025\n", - " (Total: 1)" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.EphysRecording.EphysFile() & key\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2025-09-10 14:25:12,601][INFO]: `lab_npx_ephys`.`_quality_metrics` (1 tuples)\n", - "[2025-09-10 14:25:12,608][INFO]: `lab_npx_ephys`.`_quality_metrics__waveform` (124 tuples)\n", - "[2025-09-10 14:25:12,615][INFO]: `lab_npx_ephys`.`_quality_metrics__cluster` (124 tuples)\n", - "[2025-09-10 14:25:12,629][INFO]: `lab_npx_ephys_report`.`quality_metric_set` (0 tuples)\n", - "[2025-09-10 14:25:12,635][INFO]: `lab_npx_ephys_report`.`__quality_metric_report` (0 tuples)\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Proceed? [yes, No]: yes\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2025-09-10 14:25:23,863][INFO]: Dropped table `lab_npx_ephys_report`.`__quality_metric_report`\n", - "[2025-09-10 14:25:23,900][INFO]: Dropped table `lab_npx_ephys_report`.`quality_metric_set`\n", - "[2025-09-10 14:25:23,929][INFO]: Dropped table `lab_npx_ephys`.`_quality_metrics__cluster`\n", - "[2025-09-10 14:25:23,963][INFO]: Dropped table `lab_npx_ephys`.`_quality_metrics__waveform`\n", - "[2025-09-10 14:25:23,997][INFO]: Dropped table `lab_npx_ephys`.`_quality_metrics`\n", - "[2025-09-10 14:25:24,003][INFO]: Tables dropped. Restart kernel.\n" - ] - } - ], - "source": [ - "ephys.QualityMetrics().drop()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2025-09-10 14:24:42,906][WARNING]: MySQL server has gone away. Reconnecting to the server.\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Clustering Procedure\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

clustering_time

\n", - " time of generation of this set of clustering results\n", - "
\n", - "

package_version

\n", - " \n", - "
244225132025-08-29 10:35:37
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx clustering_tim package_versio\n", - "+-----------+ +---------+ +------------+ +------------+ +------------+ +------------+\n", - "244 225 1 3 2025-08-29 10: \n", - " (Total: 1)" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(ephys.Clustering() & key)#.delete()" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Method for clustering\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

clustering_method

\n", - " \n", - "
\n", - "

clustering_method_desc

\n", - " \n", - "
kilosort2kilosort2 clustering method
kilosort2.5kilosort2.5 clustering method
kilosort3kilosort3 clustering method
kilosort4kilosort4 clustering method
\n", - " \n", - "

Total: 4

\n", - " " - ], - "text/plain": [ - "*clustering_me clustering_met\n", - "+------------+ +------------+\n", - "kilosort2 kilosort2 clus\n", - "kilosort2.5 kilosort2.5 cl\n", - "kilosort3 kilosort3 clus\n", - "kilosort4 kilosort4 clus\n", - " (Total: 4)" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.ClusteringMethod()" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Parameter set to be used in a clustering procedure\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

clustering_method

\n", - " \n", - "
\n", - "

paramset_desc

\n", - " \n", - "
\n", - "

param_set_hash

\n", - " \n", - "
\n", - "

params

\n", - " dictionary of all applicable parameters\n", - "
0kilosort4Default params kilosort4b611e082-bdaa-6ef6-1c13-acba4904a1f5=BLOB=
1kilosort4kilosort4 params acg:0.1, ccg:0.15, xcenters:4d59a35a8-6ec7-e2bf-81b4-c1f80402a8b9=BLOB=
2kilosort4kilosort4 params acg:0.1, ccg:0.15, xcenters:None0ad61454-47dc-2fde-90f5-ff1f574cee61=BLOB=
3kilosort4si kilosort4 params acg:0.1, ccg:0.15, xcenters:None6d0118fc-8f39-8b16-130b-39ae79013ef3=BLOB=
\n", - " \n", - "

Total: 4

\n", - " " - ], - "text/plain": [ - "*paramset_idx clustering_met paramset_desc param_set_hash params \n", - "+------------+ +------------+ +------------+ +------------+ +--------+\n", - "0 kilosort4 Default params b611e082-bdaa- =BLOB= \n", - "1 kilosort4 kilosort4 para d59a35a8-6ec7- =BLOB= \n", - "2 kilosort4 kilosort4 para 0ad61454-47dc- =BLOB= \n", - "3 kilosort4 si kilosort4 p 6d0118fc-8f39- =BLOB= \n", - " (Total: 4)" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.ClusteringParamSet()" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Manual table for defining a clustering task ready to be run\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

clustering_output_dir

\n", - " clustering output directory relative to the clustering root data directory\n", - "
\n", - "

task_mode

\n", - " 'load': load computed analysis results, 'trigger': trigger computation\n", - "
24422513244_225_1_2025-07-03_13-43-54/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_outputload
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx clustering_out task_mode \n", - "+-----------+ +---------+ +------------+ +------------+ +------------+ +-----------+\n", - "244 225 1 3 244_225_1_2025 load \n", - " (Total: 1)" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.ClusteringTask() & key" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# # insert clustering task manually\n", - "# import numpy as np\n", - "# params_ks = {\n", - "# 'data_dtype': 'int16',\n", - "# 'n_chan_bin': 384,\n", - "# 'fs': 30000.0,\n", - "# 'batch_size': 100000,\n", - "# 'nblocks': 1,\n", - "# 'Th_universal': 9.0,\n", - "# 'Th_learned': 8.0,\n", - "# 'tmin': 0.0,\n", - "# 'tmax': np.inf,\n", - "# 'nt': 61,\n", - "# 'shift': None,\n", - "# 'scale': None,\n", - "# 'artifact_threshold': np.inf,\n", - "# 'nskip': 25,\n", - "# 'whitening_range': 32,\n", - "# 'highpass_cutoff': 300.0,\n", - "# 'binning_depth': 5.0,\n", - "# 'sig_interp': 20.0,\n", - "# 'drift_smoothing': [0.5, 0.5, 0.5],\n", - "# 'nt0min': 20,\n", - "# 'dmin': None,\n", - "# 'dminx': 32.0,\n", - "# 'min_template_size': 10.0,\n", - "# 'template_sizes': 5,\n", - "# 'nearest_chans': 10,\n", - "# 'nearest_templates': 100,\n", - "# 'max_channel_distance': 32.0,\n", - "# 'max_peels': 100,\n", - "# 'templates_from_data': True,\n", - "# 'n_templates': 6,\n", - "# 'n_pcs': 6,\n", - "# 'Th_single_ch': 6.0,\n", - "# 'acg_threshold': 0.1,\n", - "# 'ccg_threshold': 0.15,\n", - "# 'cluster_downsampling': 20,\n", - "# 'x_centers': None,\n", - "# 'duplicate_spike_ms': 0.15,\n", - "# 'position_limit': 100.0,\n", - "# 'save_preprocessed_copy': False,\n", - "# 'clear_cache': False,\n", - "# 'do_CAR': True,\n", - "# 'invert_sign': False,\n", - "# 'verbose_log': False,\n", - "# 'NTbuff': 100122,\n", - "# 'Nchan': 384,\n", - "# 'duplicate_spike_bins': 4,\n", - "# 'torch_device': 'cuda'\n", - "# }" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Parameter set to be used in a clustering procedure\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

clustering_method

\n", - " \n", - "
\n", - "

paramset_desc

\n", - " \n", - "
\n", - "

param_set_hash

\n", - " \n", - "
\n", - "

params

\n", - " dictionary of all applicable parameters\n", - "
0kilosort4Default params kilosort4b611e082-bdaa-6ef6-1c13-acba4904a1f5=BLOB=
1kilosort4kilosort4 params acg:0.1, ccg:0.15, xcenters:4d59a35a8-6ec7-e2bf-81b4-c1f80402a8b9=BLOB=
2kilosort4kilosort4 params acg:0.1, ccg:0.15, xcenters:None0ad61454-47dc-2fde-90f5-ff1f574cee61=BLOB=
3kilosort4si kilosort4 params acg:0.1, ccg:0.15, xcenters:None6d0118fc-8f39-8b16-130b-39ae79013ef3=BLOB=
\n", - " \n", - "

Total: 4

\n", - " " - ], - "text/plain": [ - "*paramset_idx clustering_met paramset_desc param_set_hash params \n", - "+------------+ +------------+ +------------+ +------------+ +--------+\n", - "0 kilosort4 Default params b611e082-bdaa- =BLOB= \n", - "1 kilosort4 kilosort4 para d59a35a8-6ec7- =BLOB= \n", - "2 kilosort4 kilosort4 para 0ad61454-47dc- =BLOB= \n", - "3 kilosort4 si kilosort4 p 6d0118fc-8f39- =BLOB= \n", - " (Total: 4)" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# insert clustering task manually\n", - "# params_ks = {\n", - "# \"fs\": 30000,\n", - "# \"fshigh\": 150,\n", - "# \"minfr_goodchannels\": 0.1,\n", - "# \"Th\": [10, 4],\n", - "# \"lam\": 10,\n", - "# \"AUCsplit\": 0.9,\n", - "# \"minFR\": 0.02,\n", - "# \"momentum\": [20, 400],\n", - "# \"sigmaMask\": 30,\n", - "# \"ThPr\": 8,\n", - "# \"spkTh\": -6,\n", - "# \"reorder\": 1,\n", - "# \"nskip\": 25,\n", - "# \"GPU\": 1,\n", - "# \"Nfilt\": 1024,\n", - "# \"nfilt_factor\": 4,\n", - "# \"ntbuff\": 64,\n", - "# \"whiteningRange\": 32,\n", - "# \"nSkipCov\": 25,\n", - "# \"scaleproc\": 200,\n", - "# \"nPCs\": 3,\n", - "# \"useRAM\": 0,\n", - "# }\n", - "ephys.ClusteringParamSet.insert_new_params(\n", - " clustering_method=\"kilosort4\",\n", - " paramset_idx=3,\n", - " params=params_ks,\n", - " paramset_desc=\"si kilosort4 params acg:0.1, ccg:0.15, xcenters:None\",\n", - ")\n", - "ephys.ClusteringParamSet()" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'244_225_1_2025-07-03_13-43-54/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_oputput'" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "file_path = (ephys.EphysRecording.EphysFile() & key).fetch('file_path')\n", - "ks_path = file_path[0]+'/kilosort4/sorter_oputput'\n", - "ks_path" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [], - "source": [ - "file_path = (ephys.EphysRecording.EphysFile() & key).fetch('file_path')\n", - "ks_path = file_path[0]+'/kilosort4/sorter_output'\n", - "\n", - "ephys.ClusteringTask.insert1(\n", - " dict(\n", - " key,\n", - " paramset_idx=3,\n", - " task_mode=\"load\", # load or trigger\n", - " clustering_output_dir=ks_path,\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Manual table for defining a clustering task ready to be run\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

clustering_output_dir

\n", - " clustering output directory relative to the clustering root data directory\n", - "
\n", - "

task_mode

\n", - " 'load': load computed analysis results, 'trigger': trigger computation\n", - "
24422513244_225_1_2025-07-03_13-43-54/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_outputload
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx clustering_out task_mode \n", - "+-----------+ +---------+ +------------+ +------------+ +------------+ +-----------+\n", - "244 225 1 3 244_225_1_2025 load \n", - " (Total: 1)" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(ephys.ClusteringTask() & key)#.delete()" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "ephys.Clustering.populate(key, display_progress=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Clustering Procedure\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

clustering_time

\n", - " time of generation of this set of clustering results\n", - "
\n", - "

package_version

\n", - " \n", - "
244225132025-08-29 10:35:37
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx clustering_tim package_versio\n", - "+-----------+ +---------+ +------------+ +------------+ +------------+ +------------+\n", - "244 225 1 3 2025-08-29 10: \n", - " (Total: 1)" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.Clustering() & key" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Clustering results of the spike sorting step.\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
24422513
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx \n", - "+-----------+ +---------+ +------------+ +------------+\n", - "244 225 1 3 \n", - " (Total: 1)" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.CuratedClustering() & key" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'animal_id': 244, 'session': 186, 'insertion_number': 1, 'paramset_idx': 3}" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "key['paramset_idx']=3\n", - "key" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "CuratedClustering: 0%| | 0/1 [00:00\n", - "685\n", - "12691145\n", - "HERE\n", - "685 685\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/mnt/lab/users/maria/github/element-array-ephys/element_array_ephys/readers/kilosort.py:182: RuntimeWarning: invalid value encountered in divide\n", - " self._data[\"spike_depths\"] = np.sum(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "line 1167\n", - "12691145\n", - "[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17\n", - " 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35\n", - " 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53\n", - " 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71\n", - " 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89\n", - " 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107\n", - " 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125\n", - " 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143\n", - " 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161\n", - " 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179\n", - " 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197\n", - " 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215\n", - " 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233\n", - " 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251\n", - " 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269\n", - " 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287\n", - " 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305\n", - " 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323\n", - " 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341\n", - " 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359\n", - " 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377\n", - " 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395\n", - " 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413\n", - " 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431\n", - " 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449\n", - " 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467\n", - " 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485\n", - " 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503\n", - " 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521\n", - " 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539\n", - " 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557\n", - " 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575\n", - " 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593\n", - " 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611\n", - " 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629\n", - " 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647\n", - " 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665\n", - " 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683\n", - " 684]\n", - "['mua' 'good' 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'good' 'good' 'mua'\n", - " 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua'\n", - " 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'good' 'good' 'good' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'mua'\n", - " 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'good' 'mua'\n", - " 'good' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'good' 'good' 'mua' 'good' 'good' 'mua' 'good' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'mua'\n", - " 'mua' 'mua' 'good' 'good' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'mua' 'good' 'good'\n", - " 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'mua'\n", - " 'good' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'good' 'good' 'mua' 'good' 'mua'\n", - " 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'mua'\n", - " 'good' 'good' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'good' 'mua'\n", - " 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua'\n", - " 'good' 'mua' 'mua' 'good' 'good' 'good' 'mua' 'good' 'mua' 'mua' 'mua'\n", - " 'good' 'good' 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'good' 'mua'\n", - " 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'good' 'mua' 'good'\n", - " 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'mua' 'good'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good'\n", - " 'mua' 'good' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'mua'\n", - " 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'good'\n", - " 'mua' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'good' 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'good' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'good' 'mua' 'good' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'good' 'mua' 'mua' 'mua' 'mua' 'good' 'good' 'good' 'mua' 'good' 'mua'\n", - " 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'good' 'mua' 'mua' 'good' 'good' 'good' 'good' 'mua' 'mua' 'good'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua'\n", - " 'mua' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'mua' 'mua'\n", - " 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua'\n", - " 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua'\n", - " 'good' 'good' 'mua' 'mua' 'mua' 'good' 'mua' 'good' 'mua' 'good' 'mua'\n", - " 'good' 'mua' 'mua' 'mua' 'mua' 'mua' 'good' 'mua' 'mua' 'mua' 'mua' 'mua'\n", - " 'mua' 'good' 'good']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "CuratedClustering: 100%|██████████| 1/1 [01:26<00:00, 86.12s/it]\n" - ] - }, - { - "data": { - "text/plain": [ - "{'success_count': 1, 'error_list': []}" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(ephys.CuratedClustering).populate(key, display_progress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Properties of a given unit from a round of clustering (and curation)\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", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

unit

\n", - " \n", - "
\n", - "

electrode_config_hash

\n", - " \n", - "
\n", - "

probe_type

\n", - " e.g. neuropixels_1.0\n", - "
\n", - "

electrode

\n", - " electrode index, starts at 0\n", - "
\n", - "

cluster_quality_label

\n", - " cluster quality type - e.g. 'good', 'MUA', 'noise', etc.\n", - "
\n", - "

spike_count

\n", - " how many spikes in this recording for this unit\n", - "
\n", - "

spike_times

\n", - " (s) spike times of this unit, relative to the start of the EphysRecording\n", - "
\n", - "

spike_sites

\n", - " array of electrode associated with each spike\n", - "
\n", - "

spike_depths

\n", - " (um) array of depths associated with each spike, relative to the (0, 0) of the probe\n", - "
2442251307c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank0mua470=BLOB==BLOB==BLOB=
2442251317c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank4mua302=BLOB==BLOB==BLOB=
2442251327c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank10mua396=BLOB==BLOB==BLOB=
2442251337c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank16mua779=BLOB==BLOB==BLOB=
2442251347c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank16mua274=BLOB==BLOB==BLOB=
2442251357c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank22mua747=BLOB==BLOB==BLOB=
2442251367c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank20good716=BLOB==BLOB==BLOB=
2442251377c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank20good475=BLOB==BLOB==BLOB=
2442251387c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank24good277=BLOB==BLOB==BLOB=
2442251397c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank26mua772=BLOB==BLOB==BLOB=
24422513107c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank26good563=BLOB==BLOB==BLOB=
24422513117c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank32mua563=BLOB==BLOB==BLOB=
\n", - "

...

\n", - "

Total: 124

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx *unit electrode_conf probe_type electrode cluster_qualit spike_count spike_time spike_site spike_dept\n", - "+-----------+ +---------+ +------------+ +------------+ +------+ +------------+ +------------+ +-----------+ +------------+ +------------+ +--------+ +--------+ +--------+\n", - "244 225 1 3 0 7c36bff0-7661- Neuropixels 2. 0 mua 470 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 1 7c36bff0-7661- Neuropixels 2. 4 mua 302 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 2 7c36bff0-7661- Neuropixels 2. 10 mua 396 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 3 7c36bff0-7661- Neuropixels 2. 16 mua 779 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 4 7c36bff0-7661- Neuropixels 2. 16 mua 274 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 5 7c36bff0-7661- Neuropixels 2. 22 mua 747 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 6 7c36bff0-7661- Neuropixels 2. 20 good 716 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 7 7c36bff0-7661- Neuropixels 2. 20 good 475 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 8 7c36bff0-7661- Neuropixels 2. 24 good 277 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 9 7c36bff0-7661- Neuropixels 2. 26 mua 772 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 10 7c36bff0-7661- Neuropixels 2. 26 good 563 =BLOB= =BLOB= =BLOB= \n", - "244 225 1 3 11 7c36bff0-7661- Neuropixels 2. 32 mua 563 =BLOB= =BLOB= =BLOB= \n", - " ...\n", - " (Total: 124)" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.CuratedClustering.Unit & key #& 'cluster_quality_label = \"good\"'" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Properties of a given unit from a round of clustering (and curation)\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", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

unit

\n", - " \n", - "
\n", - "

electrode_config_hash

\n", - " \n", - "
\n", - "

probe_type

\n", - " e.g. neuropixels_1.0\n", - "
\n", - "

electrode

\n", - " electrode index, starts at 0\n", - "
\n", - "

cluster_quality_label

\n", - " cluster quality type - e.g. 'good', 'MUA', 'noise', etc.\n", - "
\n", - "

spike_count

\n", - " how many spikes in this recording for this unit\n", - "
\n", - "

spike_times

\n", - " (s) spike times of this unit, relative to the start of the EphysRecording\n", - "
\n", - "

spike_sites

\n", - " array of electrode associated with each spike\n", - "
\n", - "

spike_depths

\n", - " (um) array of depths associated with each spike, relative to the (0, 0) of the probe\n", - "
2441631007c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank2mua23=BLOB==BLOB==BLOB=
2441631017c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank6good1101=BLOB==BLOB==BLOB=
2441631027c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank10good2531=BLOB==BLOB==BLOB=
2441631037c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank14good5420=BLOB==BLOB==BLOB=
2441631047c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank12mua1296=BLOB==BLOB==BLOB=
2441631057c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank14good2980=BLOB==BLOB==BLOB=
2441631067c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank16mua1866=BLOB==BLOB==BLOB=
2441631077c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank20good4098=BLOB==BLOB==BLOB=
2441631087c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank27mua1666=BLOB==BLOB==BLOB=
2441631097c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank26good270=BLOB==BLOB==BLOB=
24416310107c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank26good654=BLOB==BLOB==BLOB=
24416310117c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank26mua3618=BLOB==BLOB==BLOB=
\n", - "

...

\n", - "

Total: 265

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx *unit electrode_conf probe_type electrode cluster_qualit spike_count spike_time spike_site spike_dept\n", - "+-----------+ +---------+ +------------+ +------------+ +------+ +------------+ +------------+ +-----------+ +------------+ +------------+ +--------+ +--------+ +--------+\n", - "244 163 1 0 0 7c36bff0-7661- Neuropixels 2. 2 mua 23 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 1 7c36bff0-7661- Neuropixels 2. 6 good 1101 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 2 7c36bff0-7661- Neuropixels 2. 10 good 2531 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 3 7c36bff0-7661- Neuropixels 2. 14 good 5420 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 4 7c36bff0-7661- Neuropixels 2. 12 mua 1296 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 5 7c36bff0-7661- Neuropixels 2. 14 good 2980 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 6 7c36bff0-7661- Neuropixels 2. 16 mua 1866 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 7 7c36bff0-7661- Neuropixels 2. 20 good 4098 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 8 7c36bff0-7661- Neuropixels 2. 27 mua 1666 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 9 7c36bff0-7661- Neuropixels 2. 26 good 270 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 10 7c36bff0-7661- Neuropixels 2. 26 good 654 =BLOB= =BLOB= =BLOB= \n", - "244 163 1 0 11 7c36bff0-7661- Neuropixels 2. 26 mua 3618 =BLOB= =BLOB= =BLOB= \n", - " ...\n", - " (Total: 265)" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.CuratedClustering.Unit & \"animal_id=244\" & \"session=163\" #& \"unit>263\" #& 'cluster_quality_label = \"good\"'" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2025-05-30 14:24:11,075][INFO]: Deleting 621 rows from `lab_npx_ephys`.`_curated_clustering__unit`\n", - "[2025-05-30 14:24:11,081][INFO]: Deleting 1 rows from `lab_npx_ephys`.`_curated_clustering`\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Commit deletes? [yes, No]: yes\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[2025-05-30 14:24:14,695][INFO]: Deletes committed.\n" - ] - }, - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# (ephys.CuratedClustering & key).delete()" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Spike waveforms and their mean across spikes for the given unit\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", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

unit

\n", - " \n", - "
\n", - "

electrode_config_hash

\n", - " \n", - "
\n", - "

probe_type

\n", - " e.g. neuropixels_1.0\n", - "
\n", - "

electrode

\n", - " electrode index, starts at 0\n", - "
\n", - "

waveform_mean

\n", - " (uV) mean waveform across spikes of the given unit\n", - "
\n", - "

waveforms

\n", - " (uV) (spike x sample) waveforms of a sampling of spikes at the given electrode for the given unit\n", - "
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank0=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank1=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank2=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank3=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank4=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank5=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank6=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank7=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank8=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank9=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank10=BLOB==BLOB=
244163102647c36bff0-7661-5320-7844-9cb708b5b41cNeuropixels 2.0 - Multishank11=BLOB==BLOB=
\n", - "

...

\n", - "

Total: 384

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num *paramset_idx *unit *electrode_con *probe_type *electrode waveform_m waveforms \n", - "+-----------+ +---------+ +------------+ +------------+ +------+ +------------+ +------------+ +-----------+ +--------+ +--------+\n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 0 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 1 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 2 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 3 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 4 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 5 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 6 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 7 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 8 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 9 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 10 =BLOB= =BLOB= \n", - "244 163 1 0 264 7c36bff0-7661- Neuropixels 2. 11 =BLOB= =BLOB= \n", - " ...\n", - " (Total: 384)" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.WaveformSet.Waveform() & \"session=163\" & \"unit>263\"" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WaveformSet: 0%| | 0/1 [00:00 2\u001b[0m \u001b[43mephys\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mWaveformSet\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpopulate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdisplay_progress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/autopopulate.py:241\u001b[0m, in \u001b[0;36mAutoPopulate.populate\u001b[0;34m(self, suppress_errors, return_exception_objects, reserve_jobs, order, limit, max_calls, display_progress, processes, make_kwargs, *restrictions)\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m processes \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 238\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key \u001b[38;5;129;01min\u001b[39;00m (\n\u001b[1;32m 239\u001b[0m tqdm(keys, desc\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m) \u001b[38;5;28;01mif\u001b[39;00m display_progress \u001b[38;5;28;01melse\u001b[39;00m keys\n\u001b[1;32m 240\u001b[0m ):\n\u001b[0;32m--> 241\u001b[0m error \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_populate1\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mjobs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpopulate_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 242\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m error \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 243\u001b[0m error_list\u001b[38;5;241m.\u001b[39mappend(error)\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/autopopulate.py:292\u001b[0m, in \u001b[0;36mAutoPopulate._populate1\u001b[0;34m(self, key, jobs, suppress_errors, return_exception_objects, make_kwargs)\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m_allow_insert \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 291\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 292\u001b[0m \u001b[43mmake\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mdict\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mmake_kwargs\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 293\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m, \u001b[38;5;167;01mSystemExit\u001b[39;00m, \u001b[38;5;167;01mException\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m error:\n\u001b[1;32m 294\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m/mnt/lab/users/stamatis/My_Code/Python/Pipeline/element_array_ephys/element_array_ephys/ephys.py:1464\u001b[0m, in \u001b[0;36mWaveformSet.make\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1462\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mPeakWaveform\u001b[38;5;241m.\u001b[39minsert1(unit_peak_waveform, ignore_extra_fields\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 1463\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m unit_electrode_waveforms:\n\u001b[0;32m-> 1464\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mWaveform\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minsert\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit_electrode_waveforms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mignore_extra_fields\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:419\u001b[0m, in \u001b[0;36mTable.insert\u001b[0;34m(self, rows, replace, skip_duplicates, ignore_extra_fields, allow_direct_insert)\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 418\u001b[0m field_list \u001b[38;5;241m=\u001b[39m [] \u001b[38;5;66;03m# collects the field list from first row (passed by reference)\u001b[39;00m\n\u001b[0;32m--> 419\u001b[0m rows \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 420\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__make_row_to_insert\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrow\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfield_list\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mignore_extra_fields\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 421\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrow\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrows\u001b[49m\n\u001b[1;32m 422\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 423\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m rows:\n\u001b[1;32m 424\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:420\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 418\u001b[0m field_list \u001b[38;5;241m=\u001b[39m [] \u001b[38;5;66;03m# collects the field list from first row (passed by reference)\u001b[39;00m\n\u001b[1;32m 419\u001b[0m rows \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(\n\u001b[0;32m--> 420\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__make_row_to_insert\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrow\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfield_list\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mignore_extra_fields\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 421\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m row \u001b[38;5;129;01min\u001b[39;00m rows\n\u001b[1;32m 422\u001b[0m )\n\u001b[1;32m 423\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m rows:\n\u001b[1;32m 424\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:872\u001b[0m, in \u001b[0;36mTable.__make_row_to_insert\u001b[0;34m(self, row, field_list, ignore_extra_fields)\u001b[0m\n\u001b[1;32m 870\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(row, collections\u001b[38;5;241m.\u001b[39mabc\u001b[38;5;241m.\u001b[39mMapping): \u001b[38;5;66;03m# dict-based\u001b[39;00m\n\u001b[1;32m 871\u001b[0m check_fields(row)\n\u001b[0;32m--> 872\u001b[0m attributes \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 873\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__make_placeholder(name, row[name], ignore_extra_fields)\n\u001b[1;32m 874\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mheading\n\u001b[1;32m 875\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m row\n\u001b[1;32m 876\u001b[0m ]\n\u001b[1;32m 877\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m: \u001b[38;5;66;03m# positional\u001b[39;00m\n\u001b[1;32m 878\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:873\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 870\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(row, collections\u001b[38;5;241m.\u001b[39mabc\u001b[38;5;241m.\u001b[39mMapping): \u001b[38;5;66;03m# dict-based\u001b[39;00m\n\u001b[1;32m 871\u001b[0m check_fields(row)\n\u001b[1;32m 872\u001b[0m attributes \u001b[38;5;241m=\u001b[39m [\n\u001b[0;32m--> 873\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__make_placeholder\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrow\u001b[49m\u001b[43m[\u001b[49m\u001b[43mname\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mignore_extra_fields\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 874\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mheading\n\u001b[1;32m 875\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m row\n\u001b[1;32m 876\u001b[0m ]\n\u001b[1;32m 877\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m: \u001b[38;5;66;03m# positional\u001b[39;00m\n\u001b[1;32m 878\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/table.py:809\u001b[0m, in \u001b[0;36mTable.__make_placeholder\u001b[0;34m(self, name, value, ignore_extra_fields)\u001b[0m\n\u001b[1;32m 807\u001b[0m value \u001b[38;5;241m=\u001b[39m value\u001b[38;5;241m.\u001b[39mbytes\n\u001b[1;32m 808\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m attr\u001b[38;5;241m.\u001b[39mis_blob:\n\u001b[0;32m--> 809\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[43mblob\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpack\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 810\u001b[0m value \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 811\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexternal[attr\u001b[38;5;241m.\u001b[39mstore]\u001b[38;5;241m.\u001b[39mput(value)\u001b[38;5;241m.\u001b[39mbytes\n\u001b[1;32m 812\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr\u001b[38;5;241m.\u001b[39mis_external\n\u001b[1;32m 813\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m value\n\u001b[1;32m 814\u001b[0m )\n\u001b[1;32m 815\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m attr\u001b[38;5;241m.\u001b[39mis_attachment:\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/blob.py:594\u001b[0m, in \u001b[0;36mpack\u001b[0;34m(obj, compress)\u001b[0m\n\u001b[1;32m 590\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(obj, \u001b[38;5;28mbytes\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m obj\u001b[38;5;241m.\u001b[39mstartswith(\n\u001b[1;32m 591\u001b[0m (\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mZL123\u001b[39m\u001b[38;5;130;01m\\0\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmYm\u001b[39m\u001b[38;5;130;01m\\0\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdj0\u001b[39m\u001b[38;5;130;01m\\0\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 592\u001b[0m )\n\u001b[1;32m 593\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m obj\n\u001b[0;32m--> 594\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mBlob\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpack\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcompress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcompress\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/blob.py:581\u001b[0m, in \u001b[0;36mBlob.pack\u001b[0;34m(self, obj, compress)\u001b[0m\n\u001b[1;32m 579\u001b[0m blob \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprotocol \u001b[38;5;241m+\u001b[39m blob\n\u001b[1;32m 580\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m compress \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(blob) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1000\u001b[39m:\n\u001b[0;32m--> 581\u001b[0m compressed \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mZL123\u001b[39m\u001b[38;5;130;01m\\0\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m len_u64(blob) \u001b[38;5;241m+\u001b[39m \u001b[43mzlib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompress\u001b[49m\u001b[43m(\u001b[49m\u001b[43mblob\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 582\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(compressed) \u001b[38;5;241m<\u001b[39m \u001b[38;5;28mlen\u001b[39m(blob):\n\u001b[1;32m 583\u001b[0m blob \u001b[38;5;241m=\u001b[39m compressed\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "## this doesn't populate because of size \n", - "ephys.WaveformSet.populate(key, display_progress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "LFP: 0%| | 0/1 [00:00\n", - "{}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "ename": "KeyError", - "evalue": "'channels_indices'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mephys\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mLFP\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpopulate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdisplay_progress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/datajoint/autopopulate.py:257\u001b[0m, in \u001b[0;36mAutoPopulate.populate\u001b[0;34m(self, keys, suppress_errors, return_exception_objects, reserve_jobs, order, limit, max_calls, display_progress, processes, make_kwargs, *restrictions)\u001b[0m\n\u001b[1;32m 251\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m processes \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 252\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key \u001b[38;5;129;01min\u001b[39;00m (\n\u001b[1;32m 253\u001b[0m tqdm(keys, desc\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m)\n\u001b[1;32m 254\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m display_progress\n\u001b[1;32m 255\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m keys\n\u001b[1;32m 256\u001b[0m ):\n\u001b[0;32m--> 257\u001b[0m status \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_populate1\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mjobs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpopulate_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m status \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m 259\u001b[0m success_list\u001b[38;5;241m.\u001b[39mappend(\u001b[38;5;241m1\u001b[39m)\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/datajoint/autopopulate.py:335\u001b[0m, in \u001b[0;36mAutoPopulate._populate1\u001b[0;34m(self, key, jobs, suppress_errors, return_exception_objects, make_kwargs)\u001b[0m\n\u001b[1;32m 333\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 334\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_generator:\n\u001b[0;32m--> 335\u001b[0m \u001b[43mmake\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mdict\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mmake_kwargs\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 336\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 337\u001b[0m \u001b[38;5;66;03m# tripartite make - transaction is delayed until the final stage\u001b[39;00m\n\u001b[1;32m 338\u001b[0m gen \u001b[38;5;241m=\u001b[39m make(\u001b[38;5;28mdict\u001b[39m(key), \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m(make_kwargs \u001b[38;5;129;01mor\u001b[39;00m {}))\n", - "File \u001b[0;32m/mnt/lab/users/maria/github/element-array-ephys/element_array_ephys/ephys.py:611\u001b[0m, in \u001b[0;36mLFP.make\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 608\u001b[0m \u001b[38;5;28mprint\u001b[39m(oe_probe)\n\u001b[1;32m 609\u001b[0m \u001b[38;5;28mprint\u001b[39m(oe_probe\u001b[38;5;241m.\u001b[39mlfp_meta)\n\u001b[1;32m 610\u001b[0m lfp_channel_ind \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mr_[\n\u001b[0;32m--> 611\u001b[0m \u001b[38;5;28mlen\u001b[39m(\u001b[43moe_probe\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlfp_meta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mchannels_indices\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m)\n\u001b[1;32m 612\u001b[0m \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m : \u001b[38;5;241m0\u001b[39m : \u001b[38;5;241m-\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_skip_channel_counts\n\u001b[1;32m 613\u001b[0m ]\n\u001b[1;32m 615\u001b[0m lfp \u001b[38;5;241m=\u001b[39m oe_probe\u001b[38;5;241m.\u001b[39mlfp_timeseries[:, lfp_channel_ind] \u001b[38;5;66;03m# (sample x channel)\u001b[39;00m\n\u001b[1;32m 616\u001b[0m lfp \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 617\u001b[0m lfp \u001b[38;5;241m*\u001b[39m np\u001b[38;5;241m.\u001b[39marray(oe_probe\u001b[38;5;241m.\u001b[39mlfp_meta[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mchannels_gains\u001b[39m\u001b[38;5;124m\"\u001b[39m])[lfp_channel_ind]\n\u001b[1;32m 618\u001b[0m )\u001b[38;5;241m.\u001b[39mT \u001b[38;5;66;03m# (channel x sample)\u001b[39;00m\n", - "\u001b[0;31mKeyError\u001b[0m: 'channels_indices'" - ] - } - ], - "source": [ - "## ephys.LFP.populate(key, display_progress=True) ## not supported for the new OpenEphys as LFP data is not saved separately.." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "units, unit_spiketimes = (\n", - " ephys.CuratedClustering.Unit\n", - " & key\n", - " & 'unit IN (\"6\",\"7\",\"9\",\"14\",\"15\",\"17\",\"19\")'\n", - ").fetch(\"unit\", \"spike_times\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "x = np.hstack(unit_spiketimes)\n", - "y = np.hstack([np.full_like(s, u) for u, s in zip(units, unit_spiketimes)])\n", - "plt.plot(x, y, \"|\")\n", - "plt.xlabel(\"Time (s)\")\n", - "plt.ylabel(\"Unit\");" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "unit_key = (ephys.CuratedClustering.Unit & key & \"unit = '6'\").fetch1(\"KEY\")\n", - "unit_data = (\n", - " ephys.CuratedClustering.Unit * ephys.WaveformSet.PeakWaveform & unit_key\n", - ").fetch1()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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ryyzrFy5Ejt37sSHH3442pcyIpj5SZGSkhIYjUa0traGvb+1tRUVFRVRP6eiokLT7Sk19HyvIpnNZixevBgHDhwYjkukJMT6vbLb7cjKyhqlqyItTjnlFP5ujaA77rgDr7/+OtauXYuJEyfGve14ed5i8JMiFosFJ554It577z3lfT6fD++9915YxiDU0qVLw24PAO+8807M21Nq6PleRfJ6vdixYwcqKyuH6zJJJ/5ejX3btm3j79YIkGUZd9xxB1599VW8//77qK2tTfg54+b3a7QrrseTP/3pT7LVapXXrFkj7969W77tttvkgoICuaWlRZZlWb7++uvlH/zgB8rtP/roI9lkMsmPPfaYvGfPHvmhhx6SzWazvGPHjtH6K2QMrd+r//qv/5Lffvtt+eDBg/LmzZvla6+9VrbZbPKuXbtG66+QMXp6euStW7fKW7dulQHIjz/+uLx161b56NGjsizL8g9+8AP5+uuvV25/6NAhOTs7W7733nvlPXv2yKtXr5aNRqP81ltvjdZfIaNo/X498cQT8muvvSbv379f3rFjh/ztb39bNhgM8rvvvjtaf4WMcfvtt8v5+fnyBx98IDc3Nytv/f39ym3G6/MWg58Ue+qpp+RJkybJFotFPuWUU+RNmzYpHzvrrLPkG2+8Mez2f/7zn+UZM2bIFotFnjt3rvzGG2+M8BVnLi3fq7vuuku5bXl5uXzxxRfLW7ZsGYWrzjyiFTryTXx/brzxRvmss84a8jmLFi2SLRaLPGXKFPm5554b8evOVFq/X48++qg8depU2WazyUVFRfLZZ58tv//++6Nz8Rkm2vcJQNjvy3h93pJkWZZHOttERERENFpY80NEREQZhcEPERERZRQGP0RERJRRGPwQERFRRmHwQ0RERBmFwQ8RERFlFAY/RERElFEY/BAREVFGYfBDRGnja1/7Gq688spR+/rXX389fvKTnwzb/e/evRsTJ05EX1/fsH0NIkqME56JaERIkhT34w899BC+853vQJZlFBQUjMxFhdi+fTvOPfdcHD16FLm5ucP2db70pS9h4cKF+OEPfzhsX4OI4mPwQ0QjoqWlRfn/l156CQ8++CD27t2rvC83N3dYg45Evv71r8NkMuGZZ54Z1q/zxhtv4NZbb0VdXR1MJtOwfi0iio7HXkQ0IioqKpS3/Px8SJIU9r7c3Nwhx15nn3027rzzTtx1110oLCxEeXk5nn32WfT19eGmm25CXl4epk2bhn/+859hX2vnzp246KKLkJubi/Lyclx//fU4duxYzGvzer14+eWXcdlll4W9f/LkyXjkkUdwww03IDc3FzU1Nfj73/+O9vZ2XHHFFcjNzcWCBQvw2WefKZ9z9OhRXHbZZSgsLEROTg7mzp2LN998U/n4+eefj87OTqxbty7Jf1Ei0ovBDxGltd/97ncoKSnBJ598gjvvvBO33347vvzlL+O0007Dli1bsGLFClx//fXo7+8HAHR1deHcc8/F4sWL8dlnn+Gtt95Ca2srrrnmmphf4/PPP0d3dzdOOumkIR974okncPrpp2Pr1q245JJLcP311+OGG27AV7/6VWzZsgVTp07FDTfcAJFEX7lyJZxOJ9avX48dO3bg0UcfDctoWSwWLFq0CBs2bEjxvxQRqcXgh4jS2sKFC/HAAw9g+vTpuO+++2Cz2VBSUoJbb70V06dPx4MPPoiOjg58/vnnAIBf/OIXWLx4MX7yk59g1qxZWLx4MX77299i7dq12LdvX9SvcfToURiNRpSVlQ352MUXX4xvfOMbytdyOBw4+eST8eUvfxkzZszA97//fezZswetra0AgLq6Opx++umYP38+pkyZgksvvRTLli0Lu8+qqiocPXo0xf9SRKQWgx8iSmsLFixQ/t9oNKK4uBjz589X3ldeXg4AaGtrA+AvXF67dq1SQ5Sbm4tZs2YBAA4ePBj1awwMDMBqtUYtyg79+uJrxfv63/rWt/DII4/g9NNPx0MPPaQEZaGysrKUTBURjTwGP0SU1sxmc9ifJUkKe58IWHw+HwCgt7cXl112GbZt2xb2tn///iEZGKGkpAT9/f1wuVxxv774WvG+/te//nUcOnQI119/PXbs2IGTTjoJTz31VNh9dnZ2orS0VN0/ABGlHIMfIhpXTjjhBOzatQuTJ0/GtGnTwt5ycnKifs6iRYsA+OfwpEJ1dTW++c1v4pVXXsE999yDZ599NuzjO3fuxOLFi1PytYhIOwY/RDSurFy5Ep2dnbjuuuvw6aef4uDBg3j77bdx0003wev1Rv2c0tJSnHDCCfjwww+T/vp33XUX3n77bRw+fBhbtmzB2rVrMXv2bOXjR44cQWNjI5YvX5701yIifRj8ENG4UlVVhY8++gherxcrVqzA/Pnzcdddd6GgoAAGQ+yHvK9//et44YUXkv76Xq8XK1euxOzZs3HhhRdixowZ+OUvf6l8/I9//CNWrFiBmpqapL8WEenDIYdERPAXPc+cORMvvfQSli5dOixfw+VyYfr06XjxxRdx+umnD8vXIKLEmPkhIoK/A+v3v/993GGIyaqrq8P999/PwIdolDHzQ0RERBmFmR8iIiLKKAx+iIiIKKMw+CEiIqKMwuCHiIiIMgqDHyIiIsooDH6IiIgoozD4ISIioozC4IeIiIgyCoMfIiIiyij/PzM/oiMtBp7nAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "sampling_rate = (ephys.EphysRecording & key).fetch1(\n", - " \"sampling_rate\"\n", - ") / 1000 # in kHz\n", - "plt.plot(\n", - " np.r_[: unit_data[\"peak_electrode_waveform\"].size] * 1 / sampling_rate,\n", - " unit_data[\"peak_electrode_waveform\"],\n", - ")\n", - "plt.xlabel(\"Time (ms)\")\n", - "plt.ylabel(r\"Voltage ($\\mu$V)\");" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'key' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mkey\u001b[49m\n", - "\u001b[0;31mNameError\u001b[0m: name 'key' is not defined" - ] - } - ], - "source": [ - "key" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "QualityMetrics: 0%| | 0/1 [00:00 1\u001b[0m \u001b[43mephys\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mQualityMetrics\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpopulate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdisplay_progress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/autopopulate.py:241\u001b[0m, in \u001b[0;36mAutoPopulate.populate\u001b[0;34m(self, suppress_errors, return_exception_objects, reserve_jobs, order, limit, max_calls, display_progress, processes, make_kwargs, *restrictions)\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m processes \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 238\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key \u001b[38;5;129;01min\u001b[39;00m (\n\u001b[1;32m 239\u001b[0m tqdm(keys, desc\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m) \u001b[38;5;28;01mif\u001b[39;00m display_progress \u001b[38;5;28;01melse\u001b[39;00m keys\n\u001b[1;32m 240\u001b[0m ):\n\u001b[0;32m--> 241\u001b[0m error \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_populate1\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mjobs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpopulate_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 242\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m error \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 243\u001b[0m error_list\u001b[38;5;241m.\u001b[39mappend(error)\n", - "File \u001b[0;32m/opt/tljh/user/lib/python3.10/site-packages/datajoint/autopopulate.py:292\u001b[0m, in \u001b[0;36mAutoPopulate._populate1\u001b[0;34m(self, key, jobs, suppress_errors, return_exception_objects, make_kwargs)\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m_allow_insert \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 291\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 292\u001b[0m \u001b[43mmake\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mdict\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mmake_kwargs\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 293\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m, \u001b[38;5;167;01mSystemExit\u001b[39;00m, \u001b[38;5;167;01mException\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m error:\n\u001b[1;32m 294\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m/mnt/lab/users/stamatis/My_Code/Python/Pipeline/element_array_ephys/element_array_ephys/ephys.py:1608\u001b[0m, in \u001b[0;36mQualityMetrics.make\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1606\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m 1607\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1608\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mQC metrics file not found in: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00moutput_dir\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1610\u001b[0m metrics_df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(metric_fp)\n\u001b[1;32m 1612\u001b[0m \u001b[38;5;66;03m# Conform the dataframe to match the table definition\u001b[39;00m\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: QC metrics file not found in: /mnt/lab/data01/OpenEphys/244_225_1_2025-07-03_13-43-54/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output" - ] - } - ], - "source": [ - "ephys.QualityMetrics().populate(key, display_progress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Type of probe, with specific electrodes geometry defined\n", - "
\n", - " \n", - " \n", - " \n", - "
\n", - "

probe_type

\n", - " e.g. neuropixels_1.0\n", - "
neuropixels 1.0 - 3A
neuropixels 1.0 - 3B
neuropixels 2.0 - MS
Neuropixels 2.0 - Multishank
neuropixels 2.0 - SS
neuropixels UHD
\n", - " \n", - "

Total: 6

\n", - " " - ], - "text/plain": [ - "*probe_type \n", - "+------------+\n", - "neuropixels 1.\n", - "neuropixels 1.\n", - "neuropixels 2.\n", - "Neuropixels 2.\n", - "neuropixels 2.\n", - "neuropixels UH\n", - " (Total: 6)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# probe.ProbeType.insert1(\n", - "# dict(probe_type=\"Neuropixels 2.0 - Multishank\")\n", - "# ) # this info could be achieve from neuropixels meta file.\n", - "probe.ProbeType()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Type of probe, with specific electrodes geometry defined\n", - "
\n", - " \n", - " \n", - " \n", - "
\n", - "

probe_type

\n", - " e.g. neuropixels_1.0\n", - "
neuropixels 1.0 - 3A
neuropixels 1.0 - 3B
neuropixels 2.0 - MS
Neuropixels 2.0 - Multishank
neuropixels 2.0 - SS
neuropixels UHD
\n", - " \n", - "

Total: 6

\n", - " " - ], - "text/plain": [ - "*probe_type \n", - "+------------+\n", - "neuropixels 1.\n", - "neuropixels 1.\n", - "neuropixels 2.\n", - "Neuropixels 2.\n", - "neuropixels 2.\n", - "neuropixels UH\n", - " (Total: 6)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "probe.ProbeType()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Represent a physical probe with unique identification\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

probe

\n", - " unique identifier for this model of probe (e.g. serial number)\n", - "
\n", - "

probe_type

\n", - " e.g. neuropixels_1.0\n", - "
\n", - "

probe_comment

\n", - " \n", - "
19108323581neuropixels 1.0 - 3Bfake probe
19108323583neuropixels 2.0 - MSfake probe
19108323584Neuropixels 2.0 - Multishankfake probe
\n", - " \n", - "

Total: 3

\n", - " " - ], - "text/plain": [ - "*probe probe_type probe_comment \n", - "+------------+ +------------+ +------------+\n", - "19108323581 neuropixels 1. fake probe \n", - "19108323583 neuropixels 2. fake probe \n", - "19108323584 Neuropixels 2. fake probe \n", - " (Total: 3)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "probe.Probe.insert1(\n", - " dict(probe=\"19108323584\", probe_type=\"Neuropixels 2.0 - Multishank\", probe_comment=\"fake probe\")\n", - ") # this info could be achieve from neuropixels meta file.\n", - "probe.Probe()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "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", - "

probe_type

\n", - " e.g. neuropixels_1.0\n", - "
\n", - "

electrode

\n", - " electrode index, starts at 0\n", - "
\n", - "

shank

\n", - " shank index, starts at 0, advance left to right\n", - "
\n", - "

shank_col

\n", - " column index, starts at 0, advance left to right\n", - "
\n", - "

shank_row

\n", - " row index, starts at 0.\n", - "
\n", - "

x_coord

\n", - " (um) x coordinate of the electrode within the probe.\n", - "
\n", - "

y_coord

\n", - " (um) y coordinate of the electrode within the probe.\n", - "
Neuropixels 2.0 - Multishank000027.00.0
Neuropixels 2.0 - Multishank101059.00.0
Neuropixels 2.0 - Multishank200127.015.0
Neuropixels 2.0 - Multishank301159.015.0
Neuropixels 2.0 - Multishank400227.030.0
Neuropixels 2.0 - Multishank501259.030.0
Neuropixels 2.0 - Multishank600327.045.0
Neuropixels 2.0 - Multishank701359.045.0
Neuropixels 2.0 - Multishank800427.060.0
Neuropixels 2.0 - Multishank901459.060.0
Neuropixels 2.0 - Multishank1000527.075.0
Neuropixels 2.0 - Multishank1101559.075.0
\n", - "

...

\n", - "

Total: 5120

\n", - " " - ], - "text/plain": [ - "*probe_type *electrode shank shank_col shank_row x_coord y_coord \n", - "+------------+ +-----------+ +-------+ +-----------+ +-----------+ +---------+ +---------+\n", - "Neuropixels 2. 0 0 0 0 27.0 0.0 \n", - "Neuropixels 2. 1 0 1 0 59.0 0.0 \n", - "Neuropixels 2. 2 0 0 1 27.0 15.0 \n", - "Neuropixels 2. 3 0 1 1 59.0 15.0 \n", - "Neuropixels 2. 4 0 0 2 27.0 30.0 \n", - "Neuropixels 2. 5 0 1 2 59.0 30.0 \n", - "Neuropixels 2. 6 0 0 3 27.0 45.0 \n", - "Neuropixels 2. 7 0 1 3 59.0 45.0 \n", - "Neuropixels 2. 8 0 0 4 27.0 60.0 \n", - "Neuropixels 2. 9 0 1 4 59.0 60.0 \n", - "Neuropixels 2. 10 0 0 5 27.0 75.0 \n", - "Neuropixels 2. 11 0 1 5 59.0 75.0 \n", - " ...\n", - " (Total: 5120)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "probe.ProbeType.Electrode() & 'probe_type = \"Neuropixels 2.0 - Multishank\"'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " The electrode configuration setting on a given probe\n", - "
\n", - " \n", - " \n", - " \n", - "
\n", - "

electrode_config_hash

\n", - " \n", - "
\n", - "

probe_type

\n", - " e.g. neuropixels_1.0\n", - "
\n", - "

electrode_config_name

\n", - " user friendly name\n", - "
\n", - " \n", - "

Total: 0

\n", - " " - ], - "text/plain": [ - "*electrode_con probe_type electrode_conf\n", - "+------------+ +------------+ +------------+\n", - "\n", - " (Total: 0)" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "probe.ElectrodeConfig()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Probe insertion implanted into an animal for a given session.\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

probe

\n", - " unique identifier for this model of probe (e.g. serial number)\n", - "
10122219108323581
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num probe \n", - "+-----------+ +---------+ +------------+ +------------+\n", - "101 22 2 19108323581 \n", - " (Total: 1)" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.ProbeInsertion()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Probe insertion implanted into an animal for a given session.\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

probe

\n", - " unique identifier for this model of probe (e.g. serial number)\n", - "
10122219108323581
244163119108323584
\n", - " \n", - "

Total: 2

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num probe \n", - "+-----------+ +---------+ +------------+ +------------+\n", - "101 22 2 19108323581 \n", - "244 163 1 19108323584 \n", - " (Total: 2)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.ProbeInsertion.insert1(\n", - " dict(\n", - " key,\n", - " probe='19108323584',\n", - " )\n", - ") # probe, subject, session_datetime needs to follow the restrictions of foreign keys.\n", - "ephys.ProbeInsertion()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Probe insertion implanted into an animal for a given session.\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "
\n", - "

animal_id

\n", - " animal id\n", - "
\n", - "

session

\n", - " session number\n", - "
\n", - "

insertion_number

\n", - " \n", - "
\n", - "

probe

\n", - " unique identifier for this model of probe (e.g. serial number)\n", - "
244163119108323583
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*animal_id *session *insertion_num probe \n", - "+-----------+ +---------+ +------------+ +------------+\n", - "244 163 1 19108323583 \n", - " (Total: 1)" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ephys.ProbeInsertion() & key" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " Parameter set to be used in a clustering procedure\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

paramset_idx

\n", - " \n", - "
\n", - "

clustering_method

\n", - " \n", - "
\n", - "

paramset_desc

\n", - " \n", - "
\n", - "

param_set_hash

\n", - " \n", - "
\n", - "

params

\n", - " dictionary of all applicable parameters\n", - "
0kilosort2Spike sorting using Kilosort2de78cee1-526f-319e-b6d5-8a2ba04963d8=BLOB=
\n", - " \n", - "

Total: 1

\n", - " " - ], - "text/plain": [ - "*paramset_idx clustering_met paramset_desc param_set_hash params \n", - "+------------+ +------------+ +------------+ +------------+ +--------+\n", - "0 kilosort2 Spike sorting de78cee1-526f- =BLOB= \n", - " (Total: 1)" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# # insert clustering task manually\n", - "# params_ks = {\n", - "# \"fs\": 30000,\n", - "# \"fshigh\": 150,\n", - "# \"minfr_goodchannels\": 0.1,\n", - "# \"Th\": [10, 4],\n", - "# \"lam\": 10,\n", - "# \"AUCsplit\": 0.9,\n", - "# \"minFR\": 0.02,\n", - "# \"momentum\": [20, 400],\n", - "# \"sigmaMask\": 30,\n", - "# \"ThPr\": 8,\n", - "# \"spkTh\": -6,\n", - "# \"reorder\": 1,\n", - "# \"nskip\": 25,\n", - "# \"GPU\": 1,\n", - "# \"Nfilt\": 1024,\n", - "# \"nfilt_factor\": 4,\n", - "# \"ntbuff\": 64,\n", - "# \"whiteningRange\": 32,\n", - "# \"nSkipCov\": 25,\n", - "# \"scaleproc\": 200,\n", - "# \"nPCs\": 3,\n", - "# \"useRAM\": 0,\n", - "# }\n", - "# ephys.ClusteringParamSet.insert_new_params(\n", - "# clustering_method=\"kilosort2\",\n", - "# paramset_idx=0,\n", - "# params=params_ks,\n", - "# paramset_desc=\"Spike sorting using Kilosort2\",\n", - "# )\n", - "Ephys.ClusteringParamSet()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.10.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}