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",
- " \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",
- " | 244 | \n",
- "283 | \n",
- "maria | \n",
- "ef-rp5 | \n",
- "2025-07-30 11:04:01 | \n",
- "MatchPort | \n",
- "0.0 |
\n",
- "
\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",
- " | 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output | \n",
- "load |
\n",
- "
\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",
- " | 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "0 | \n",
- "66.885 | \n",
- "0.00124333 | \n",
- "0.00132 | \n",
- "-0.200965 | \n",
- "71043.0 | \n",
- "-20526.5 | \n",
- "90.0 | \n",
- "nan | \n",
- "nan | \n",
- "1.0 | \n",
- "1.0 | \n",
- "0.00351934 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "1 | \n",
- "17.355 | \n",
- "0.00084 | \n",
- "0.00031 | \n",
- "-0.294477 | \n",
- "148725.0 | \n",
- "-23378.3 | \n",
- "90.0 | \n",
- "nan | \n",
- "nan | \n",
- "2.0 | \n",
- "1.0 | \n",
- "0.0279673 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "2 | \n",
- "24.18 | \n",
- "0.000833333 | \n",
- "0.00024 | \n",
- "-0.288959 | \n",
- "217422.0 | \n",
- "-33734.3 | \n",
- "60.0 | \n",
- "nan | \n",
- "nan | \n",
- "1.0 | \n",
- "1.0 | \n",
- "0.0261229 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "3 | \n",
- "46.215 | \n",
- "0.000593333 | \n",
- "0.00199 | \n",
- "-1.52775 | \n",
- "39087.7 | \n",
- "-89019.6 | \n",
- "120.0 | \n",
- "37.7815 | \n",
- "nan | \n",
- "1.0 | \n",
- "1.0 | \n",
- "0.00955719 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "4 | \n",
- "139.815 | \n",
- "6.66667e-05 | \n",
- "0.00185 | \n",
- "-0.958033 | \n",
- "3970350.0 | \n",
- "-6376.61 | \n",
- "90.0 | \n",
- "nan | \n",
- "nan | \n",
- "0.0 | \n",
- "0.0 | \n",
- "0.00820124 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "5 | \n",
- "142.935 | \n",
- "6.66667e-05 | \n",
- "0.00172333 | \n",
- "-0.906766 | \n",
- "4436500.0 | \n",
- "17671.6 | \n",
- "90.0 | \n",
- "nan | \n",
- "nan | \n",
- "0.0 | \n",
- "0.0 | \n",
- "0.00851597 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "6 | \n",
- "13.65 | \n",
- "0.000716667 | \n",
- "0.000276667 | \n",
- "-0.324688 | \n",
- "141258.0 | \n",
- "-21274.0 | \n",
- "120.0 | \n",
- "nan | \n",
- "nan | \n",
- "1.0 | \n",
- "1.0 | \n",
- "0.0343427 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "7 | \n",
- "143.617 | \n",
- "6.66667e-05 | \n",
- "0.00212 | \n",
- "-1.08202 | \n",
- "3859520.0 | \n",
- "-5099.36 | \n",
- "180.0 | \n",
- "nan | \n",
- "nan | \n",
- "0.0 | \n",
- "0.0 | \n",
- "0.00729127 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "8 | \n",
- "19.695 | \n",
- "0.000713333 | \n",
- "0.000226667 | \n",
- "-0.31022 | \n",
- "201312.0 | \n",
- "-27677.7 | \n",
- "120.0 | \n",
- "1549.71 | \n",
- "nan | \n",
- "1.0 | \n",
- "1.0 | \n",
- "0.0243837 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "9 | \n",
- "143.52 | \n",
- "0.000456667 | \n",
- "0.00184333 | \n",
- "-1.08056 | \n",
- "3744020.0 | \n",
- "-20808.7 | \n",
- "180.0 | \n",
- "nan | \n",
- "nan | \n",
- "0.0 | \n",
- "0.0 | \n",
- "0.00759205 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "10 | \n",
- "64.935 | \n",
- "0.000716667 | \n",
- "0.000273333 | \n",
- "-0.357144 | \n",
- "444400.0 | \n",
- "-84944.4 | \n",
- "135.0 | \n",
- "nan | \n",
- "425.983 | \n",
- "1.0 | \n",
- "1.0 | \n",
- "0.0250961 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "11 | \n",
- "39.0 | \n",
- "0.000856667 | \n",
- "0.000206667 | \n",
- "-0.1969 | \n",
- "650944.0 | \n",
- "-58544.7 | \n",
- "105.0 | \n",
- "778.502 | \n",
- "nan | \n",
- "0.0 | \n",
- "1.0 | \n",
- "0.0379851 |
\n",
- "
\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",
- " | 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "0 | \n",
- "2475.0 | \n",
- "0.709615 | \n",
- "2.36306 | \n",
- "1.0 | \n",
- "57.887 | \n",
- "305 | \n",
- "0.000239296 | \n",
- "66.885 | \n",
- "0.376171 | \n",
- "0.335637 | \n",
- "69.2784 | \n",
- "1.47635 | \n",
- "2.75364 | \n",
- "0.560811 | \n",
- "0.0191329 | \n",
- "0.107392 | \n",
- "nan | \n",
- "nan | \n",
- "nan | \n",
- "1.0 | \n",
- "176.0 | \n",
- "nan | \n",
- "0.342222 | \n",
- "0.0218182 | \n",
- "0.0 | \n",
- "4.8 | \n",
- "1.10102 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "1 | \n",
- "4327.0 | \n",
- "1.24061 | \n",
- "2.60117 | \n",
- "1.0 | \n",
- "0.310476 | \n",
- "5 | \n",
- "6.15437e-05 | \n",
- "17.355 | \n",
- "1.57438 | \n",
- "0.959756 | \n",
- "81.059 | \n",
- "0.584779 | \n",
- "3.40289 | \n",
- "0.439865 | \n",
- "0.0186137 | \n",
- "0.0471289 | \n",
- "nan | \n",
- "nan | \n",
- "nan | \n",
- "0.0979387 | \n",
- "1.0 | \n",
- "0.29 | \n",
- "0.145135 | \n",
- "0.00716432 | \n",
- "0.000693321 | \n",
- "3.24 | \n",
- "1.01791 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "2 | \n",
- "15959.0 | \n",
- "4.57565 | \n",
- "3.89289 | \n",
- "1.0 | \n",
- "0.136943 | \n",
- "30 | \n",
- "1.62154e-05 | \n",
- "24.18 | \n",
- "1.14163 | \n",
- "0.862701 | \n",
- "81.4794 | \n",
- "0.539705 | \n",
- "3.97962 | \n",
- "0.634459 | \n",
- "0.00931983 | \n",
- "0.10593 | \n",
- "1.04115 | \n",
- "0.169072 | \n",
- "0.249679 | \n",
- "0.108605 | \n",
- "15.0 | \n",
- "0.125 | \n",
- "0.0994423 | \n",
- "0.00137853 | \n",
- "0.000187982 | \n",
- "12.0 | \n",
- "1.01223 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "3 | \n",
- "862.0 | \n",
- "0.247147 | \n",
- "1.49701 | \n",
- "1.0 | \n",
- "0.0 | \n",
- "0 | \n",
- "0.00293723 | \n",
- "46.215 | \n",
- "0.595457 | \n",
- "0.379135 | \n",
- "134.86 | \n",
- "0.0476171 | \n",
- "4.4107 | \n",
- "0.896259 | \n",
- "0.00141665 | \n",
- "0.183495 | \n",
- "nan | \n",
- "nan | \n",
- "nan | \n",
- "0.0 | \n",
- "0.0 | \n",
- "nan | \n",
- "0.136891 | \n",
- "0.00116009 | \n",
- "0.0 | \n",
- "0.8 | \n",
- "1.18848 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "4 | \n",
- "4056.0 | \n",
- "1.16291 | \n",
- "5.60779 | \n",
- "0.982759 | \n",
- "16.2541 | \n",
- "230 | \n",
- "0.00243291 | \n",
- "139.815 | \n",
- "nan | \n",
- "nan | \n",
- "81.4075 | \n",
- "0.545734 | \n",
- "3.69457 | \n",
- "0.682432 | \n",
- "0.0124091 | \n",
- "0.101762 | \n",
- "nan | \n",
- "nan | \n",
- "nan | \n",
- "1.0 | \n",
- "139.0 | \n",
- "nan | \n",
- "0.0756903 | \n",
- "0.000246548 | \n",
- "0.0 | \n",
- "5.0 | \n",
- "1.69756 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "5 | \n",
- "1381.0 | \n",
- "0.395951 | \n",
- "6.10787 | \n",
- "0.965517 | \n",
- "15.24 | \n",
- "25 | \n",
- "0.00751238 | \n",
- "142.935 | \n",
- "0.36919 | \n",
- "0.214937 | \n",
- "82.3151 | \n",
- "0.489003 | \n",
- "3.72967 | \n",
- "0.564189 | \n",
- "0.017731 | \n",
- "0.0991084 | \n",
- "nan | \n",
- "nan | \n",
- "nan | \n",
- "1.0 | \n",
- "7.0 | \n",
- "nan | \n",
- "0.0796524 | \n",
- "0.000724113 | \n",
- "0.0 | \n",
- "1.8 | \n",
- "1.77574 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "6 | \n",
- "2783.0 | \n",
- "0.797922 | \n",
- "2.30377 | \n",
- "1.0 | \n",
- "0.300217 | \n",
- "2 | \n",
- "0.000672 | \n",
- "13.65 | \n",
- "2.05677 | \n",
- "1.39111 | \n",
- "102.842 | \n",
- "0.581225 | \n",
- "3.36796 | \n",
- "0.386905 | \n",
- "0.00965897 | \n",
- "0.0383607 | \n",
- "nan | \n",
- "nan | \n",
- "nan | \n",
- "0.0 | \n",
- "0.0 | \n",
- "nan | \n",
- "0.115343 | \n",
- "0.00395257 | \n",
- "0.0 | \n",
- "1.6 | \n",
- "1.20404 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "7 | \n",
- "2142.0 | \n",
- "0.614139 | \n",
- "5.09826 | \n",
- "0.965517 | \n",
- "19.2578 | \n",
- "76 | \n",
- "0.017865 | \n",
- "143.617 | \n",
- "nan | \n",
- "nan | \n",
- "137.652 | \n",
- "0.887399 | \n",
- "5.2173 | \n",
- "0.877329 | \n",
- "0.00246468 | \n",
- "0.23809 | \n",
- "nan | \n",
- "nan | \n",
- "nan | \n",
- "1.0 | \n",
- "27.0 | \n",
- "nan | \n",
- "0.0728291 | \n",
- "0.000933707 | \n",
- "0.000466853 | \n",
- "2.64 | \n",
- "1.29442 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "8 | \n",
- "13089.0 | \n",
- "3.75279 | \n",
- "3.39593 | \n",
- "1.0 | \n",
- "0.15608 | \n",
- "23 | \n",
- "3.20644e-05 | \n",
- "19.695 | \n",
- "1.19809 | \n",
- "0.802193 | \n",
- "114.087 | \n",
- "0.286421 | \n",
- "3.70446 | \n",
- "0.392857 | \n",
- "0.012518 | \n",
- "0.0435045 | \n",
- "1.76076 | \n",
- "0.300438 | \n",
- "0.406777 | \n",
- "0.0962433 | \n",
- "9.0 | \n",
- "0.12 | \n",
- "0.0961876 | \n",
- "0.0006112 | \n",
- "0.0001528 | \n",
- "5.0 | \n",
- "1.04354 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "9 | \n",
- "2687.0 | \n",
- "0.770398 | \n",
- "5.84771 | \n",
- "0.965517 | \n",
- "11.7549 | \n",
- "73 | \n",
- "0.0099644 | \n",
- "143.52 | \n",
- "nan | \n",
- "nan | \n",
- "122.363 | \n",
- "2.10133 | \n",
- "4.78617 | \n",
- "0.81677 | \n",
- "0.00221059 | \n",
- "0.17551 | \n",
- "nan | \n",
- "nan | \n",
- "nan | \n",
- "1.0 | \n",
- "33.0 | \n",
- "nan | \n",
- "0.0934127 | \n",
- "0.00111649 | \n",
- "0.000372162 | \n",
- "3.2 | \n",
- "1.33561 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "10 | \n",
- "7066.0 | \n",
- "2.02591 | \n",
- "7.58189 | \n",
- "1.0 | \n",
- "0.465708 | \n",
- "20 | \n",
- "0.000264674 | \n",
- "64.935 | \n",
- "0.6794 | \n",
- "0.274888 | \n",
- "108.66 | \n",
- "3.94478 | \n",
- "2.25575 | \n",
- "0.330745 | \n",
- "0.00874073 | \n",
- "0.0196217 | \n",
- "2.13789 | \n",
- "0.268315 | \n",
- "0.263723 | \n",
- "0.696901 | \n",
- "13.0 | \n",
- "nan | \n",
- "0.184404 | \n",
- "0.00792528 | \n",
- "0.000566091 | \n",
- "3.4 | \n",
- "1.27954 |
| 244 | \n",
- "283 | \n",
- "1 | \n",
- "3 | \n",
- "11 | \n",
- "1182.0 | \n",
- "0.338895 | \n",
- "9.73923 | \n",
- "1.0 | \n",
- "0.0 | \n",
- "0 | \n",
- "0.00306104 | \n",
- "39.0 | \n",
- "0.535395 | \n",
- "0.245662 | \n",
- "298.064 | \n",
- "1.79671e-07 | \n",
- "10.6291 | \n",
- "0.91226 | \n",
- "0.000714869 | \n",
- "0.205392 | \n",
- "nan | \n",
- "nan | \n",
- "nan | \n",
- "0.0 | \n",
- "0.0 | \n",
- "nan | \n",
- "0.112521 | \n",
- "0.0 | \n",
- "0.0 | \n",
- "1.4 | \n",
- "0.968612 |
\n",
- "
\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, ?it/s]"
- ]
- },
- {
- "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",
- " Ephys recording from a probe insertion for a given session.\n",
- " \n",
- "
\n",
- " | | | | | | | | |
\n",
- "
\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",
- " \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",
- " \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, ?it/s]"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "/mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01\n",
- "/mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01\n",
- "inside openephys class\n",
- "/mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1\n",
- "recording1\n",
- "/mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01/Record Node 101\n",
- "if\n",
- "/mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01/Record Node 101\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': None}\n",
- "line 118\n",
- "['ProbeA']\n",
- "23107806184\n",
- "line145\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1', '@high_cut': '6000.0', '@low_cut': '300.0', '@Channels': ''}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1', '@Channels': ''}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "EphysRecording: 100%|██████████| 1/1 [01:16<00:00, 76.76s/it]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "line 169\n",
- "ProbeA\n",
- "ProbeA\n",
- "line 184, ap only\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Clustering: 100%|██████████| 1/1 [00:00<00:00, 133.79it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "['/mnt/lab/data01/OpenEphys']\n",
- "244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output\n",
- "/mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "CuratedClustering: 0%| | 0/1 [00:00, ?it/s]"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "line 1037: /mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output\n",
- "kilosort4\n",
- "/mnt/lab/data01/OpenEphys/244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output/sorting_analyzer\n",
- "\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",
- " | 244 | \n",
- "283 | \n",
- "1 | \n",
- "23107806184 |
\n",
- "
\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",
- " | 244 | \n",
- "225 | \n",
- "1 | \n",
- "23107806184 |
\n",
- "
\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",
- " | 244 | \n",
- "225 | \n",
- "1 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Open Ephys | \n",
- "30000.0 | \n",
- "2025-07-03 14:09:16 | \n",
- "48.9805 |
\n",
- "
\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",
- " | 244 | \n",
- "283 | \n",
- "1 | \n",
- "244_283_1_2025-07-30_11-04-01/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA |
\n",
- "
\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",
- " | 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "2025-08-29 10:35:37 | \n",
- " |
\n",
- "
\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",
- " | kilosort2 | \n",
- "kilosort2 clustering method |
| kilosort2.5 | \n",
- "kilosort2.5 clustering method |
| kilosort3 | \n",
- "kilosort3 clustering method |
| kilosort4 | \n",
- "kilosort4 clustering method |
\n",
- "
\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",
- " | 0 | \n",
- "kilosort4 | \n",
- "Default params kilosort4 | \n",
- "b611e082-bdaa-6ef6-1c13-acba4904a1f5 | \n",
- "=BLOB= |
| 1 | \n",
- "kilosort4 | \n",
- "kilosort4 params acg:0.1, ccg:0.15, xcenters:4 | \n",
- "d59a35a8-6ec7-e2bf-81b4-c1f80402a8b9 | \n",
- "=BLOB= |
| 2 | \n",
- "kilosort4 | \n",
- "kilosort4 params acg:0.1, ccg:0.15, xcenters:None | \n",
- "0ad61454-47dc-2fde-90f5-ff1f574cee61 | \n",
- "=BLOB= |
| 3 | \n",
- "kilosort4 | \n",
- "si kilosort4 params acg:0.1, ccg:0.15, xcenters:None | \n",
- "6d0118fc-8f39-8b16-130b-39ae79013ef3 | \n",
- "=BLOB= |
\n",
- "
\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",
- " | 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "244_225_1_2025-07-03_13-43-54/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output | \n",
- "load |
\n",
- "
\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",
- " | 0 | \n",
- "kilosort4 | \n",
- "Default params kilosort4 | \n",
- "b611e082-bdaa-6ef6-1c13-acba4904a1f5 | \n",
- "=BLOB= |
| 1 | \n",
- "kilosort4 | \n",
- "kilosort4 params acg:0.1, ccg:0.15, xcenters:4 | \n",
- "d59a35a8-6ec7-e2bf-81b4-c1f80402a8b9 | \n",
- "=BLOB= |
| 2 | \n",
- "kilosort4 | \n",
- "kilosort4 params acg:0.1, ccg:0.15, xcenters:None | \n",
- "0ad61454-47dc-2fde-90f5-ff1f574cee61 | \n",
- "=BLOB= |
| 3 | \n",
- "kilosort4 | \n",
- "si kilosort4 params acg:0.1, ccg:0.15, xcenters:None | \n",
- "6d0118fc-8f39-8b16-130b-39ae79013ef3 | \n",
- "=BLOB= |
\n",
- "
\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",
- " | 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "244_225_1_2025-07-03_13-43-54/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output | \n",
- "load |
\n",
- "
\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",
- " | 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "2025-08-29 10:35:37 | \n",
- " |
\n",
- "
\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",
- " | 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 |
\n",
- "
\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, ?it/s]"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "line 1037: /mnt/lab/data01/OpenEphys/244_186_1_2025-05-16_10-15-07/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output\n",
- "kilosort4\n",
- "/mnt/lab/data01/OpenEphys/244_186_1_2025-05-16_10-15-07/Record Node 101/experiment1/recording1/continuous/Neuropix-PXI-100.ProbeA/kilosort4/sorter_output/sorting_analyzer\n",
- "\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",
- " | 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "0 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "0 | \n",
- "mua | \n",
- "470 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "1 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "4 | \n",
- "mua | \n",
- "302 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "2 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "10 | \n",
- "mua | \n",
- "396 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "3 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "16 | \n",
- "mua | \n",
- "779 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "4 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "16 | \n",
- "mua | \n",
- "274 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "5 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "22 | \n",
- "mua | \n",
- "747 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "6 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "20 | \n",
- "good | \n",
- "716 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "7 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "20 | \n",
- "good | \n",
- "475 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "8 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "24 | \n",
- "good | \n",
- "277 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "9 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "26 | \n",
- "mua | \n",
- "772 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "10 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "26 | \n",
- "good | \n",
- "563 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "225 | \n",
- "1 | \n",
- "3 | \n",
- "11 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "32 | \n",
- "mua | \n",
- "563 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
\n",
- "
\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",
- " | 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "0 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "2 | \n",
- "mua | \n",
- "23 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "1 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "6 | \n",
- "good | \n",
- "1101 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "2 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "10 | \n",
- "good | \n",
- "2531 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "3 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "14 | \n",
- "good | \n",
- "5420 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "4 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "12 | \n",
- "mua | \n",
- "1296 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "5 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "14 | \n",
- "good | \n",
- "2980 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "6 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "16 | \n",
- "mua | \n",
- "1866 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "7 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "20 | \n",
- "good | \n",
- "4098 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "8 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "27 | \n",
- "mua | \n",
- "1666 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "9 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "26 | \n",
- "good | \n",
- "270 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "10 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "26 | \n",
- "good | \n",
- "654 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "11 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "26 | \n",
- "mua | \n",
- "3618 | \n",
- "=BLOB= | \n",
- "=BLOB= | \n",
- "=BLOB= |
\n",
- "
\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",
- " | 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "0 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "1 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "2 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "3 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "4 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "5 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "6 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "7 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "8 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "9 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "10 | \n",
- "=BLOB= | \n",
- "=BLOB= |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "0 | \n",
- "264 | \n",
- "7c36bff0-7661-5320-7844-9cb708b5b41c | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "11 | \n",
- "=BLOB= | \n",
- "=BLOB= |
\n",
- "
\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, ?it/s]"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "/mnt/lab/data01/OpenEphys/244_225_1_2025-07-03_13-43-54\n",
- "/mnt/lab/data01/OpenEphys/244_225_1_2025-07-03_13-43-54\n",
- "inside openephys class\n",
- "/mnt/lab/data01/OpenEphys/244_225_1_2025-07-03_13-43-54/Record Node 101/experiment1/recording1\n",
- "recording1\n",
- "/mnt/lab/data01/OpenEphys/244_225_1_2025-07-03_13-43-54/Record Node 101\n",
- "if\n",
- "/mnt/lab/data01/OpenEphys/244_225_1_2025-07-03_13-43-54/Record Node 101\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': None}\n",
- "line 118\n",
- "['ProbeA']\n",
- "23107806184\n",
- "line145\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1', '@high_cut': '6000.0', '@low_cut': '300.0', '@Channels': ''}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1', '@Channels': ''}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "line 169\n",
- "ProbeA\n",
- "ProbeA\n",
- "line 184, ap only\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n",
- "line1420\n",
- "384\n",
- "384\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "WaveformSet: 0%| | 0/1 [01:22, ?it/s]\n"
- ]
- },
- {
- "ename": "KeyboardInterrupt",
- "evalue": "",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[0;32mIn[47], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m## this doesn't populate because of size \u001b[39;00m\n\u001b[0;32m----> 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, ?it/s]"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "/mnt/lab/data01/OpenEphys/244_163_1_2025-04-16_11-32-00\n",
- "inside openephys class\n",
- "/mnt/lab/data01/OpenEphys/244_163_1_2025-04-16_11-32-00/Record Node 101/experiment1/recording1\n",
- "recording1\n",
- "/mnt/lab/data01/OpenEphys/244_163_1_2025-04-16_11-32-00/Record Node 101\n",
- "if\n",
- "/mnt/lab/data01/OpenEphys/244_163_1_2025-04-16_11-32-00/Record Node 101\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': None}\n",
- "line 118\n",
- "['ProbeA']\n",
- "23107806184\n",
- "line145\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1', '@high_cut': '6000.0', '@low_cut': '300.0', '@Channels': ''}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1', '@Channels': ''}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n",
- "{'@name': 'ProbeA', '@description': 'description', '@sample_rate': '30000.0', '@channel_count': '384', '@device_name': 'Neuropixels 2.0 - Multishank', 'PARAMETERS': {'@enable_stream': '1'}}\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "LFP: 0%| | 0/1 [00:00, ?it/s]"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "line 169\n",
- "ProbeA\n",
- "ProbeA\n",
- "line 184, ap only\n",
- "\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, ?it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Should I reload everytime??\n"
- ]
- },
- {
- "ename": "FileNotFoundError",
- "evalue": "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",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mFileNotFoundError\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[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",
- " | neuropixels 1.0 - 3A |
| neuropixels 1.0 - 3B |
| neuropixels 2.0 - MS |
| Neuropixels 2.0 - Multishank |
| neuropixels 2.0 - SS |
| neuropixels UHD |
\n",
- "
\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",
- " | neuropixels 1.0 - 3A |
| neuropixels 1.0 - 3B |
| neuropixels 2.0 - MS |
| Neuropixels 2.0 - Multishank |
| neuropixels 2.0 - SS |
| neuropixels UHD |
\n",
- "
\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",
- " | 19108323581 | \n",
- "neuropixels 1.0 - 3B | \n",
- "fake probe |
| 19108323583 | \n",
- "neuropixels 2.0 - MS | \n",
- "fake probe |
| 19108323584 | \n",
- "Neuropixels 2.0 - Multishank | \n",
- "fake probe |
\n",
- "
\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",
- " | Neuropixels 2.0 - Multishank | \n",
- "0 | \n",
- "0 | \n",
- "0 | \n",
- "0 | \n",
- "27.0 | \n",
- "0.0 |
| Neuropixels 2.0 - Multishank | \n",
- "1 | \n",
- "0 | \n",
- "1 | \n",
- "0 | \n",
- "59.0 | \n",
- "0.0 |
| Neuropixels 2.0 - Multishank | \n",
- "2 | \n",
- "0 | \n",
- "0 | \n",
- "1 | \n",
- "27.0 | \n",
- "15.0 |
| Neuropixels 2.0 - Multishank | \n",
- "3 | \n",
- "0 | \n",
- "1 | \n",
- "1 | \n",
- "59.0 | \n",
- "15.0 |
| Neuropixels 2.0 - Multishank | \n",
- "4 | \n",
- "0 | \n",
- "0 | \n",
- "2 | \n",
- "27.0 | \n",
- "30.0 |
| Neuropixels 2.0 - Multishank | \n",
- "5 | \n",
- "0 | \n",
- "1 | \n",
- "2 | \n",
- "59.0 | \n",
- "30.0 |
| Neuropixels 2.0 - Multishank | \n",
- "6 | \n",
- "0 | \n",
- "0 | \n",
- "3 | \n",
- "27.0 | \n",
- "45.0 |
| Neuropixels 2.0 - Multishank | \n",
- "7 | \n",
- "0 | \n",
- "1 | \n",
- "3 | \n",
- "59.0 | \n",
- "45.0 |
| Neuropixels 2.0 - Multishank | \n",
- "8 | \n",
- "0 | \n",
- "0 | \n",
- "4 | \n",
- "27.0 | \n",
- "60.0 |
| Neuropixels 2.0 - Multishank | \n",
- "9 | \n",
- "0 | \n",
- "1 | \n",
- "4 | \n",
- "59.0 | \n",
- "60.0 |
| Neuropixels 2.0 - Multishank | \n",
- "10 | \n",
- "0 | \n",
- "0 | \n",
- "5 | \n",
- "27.0 | \n",
- "75.0 |
| Neuropixels 2.0 - Multishank | \n",
- "11 | \n",
- "0 | \n",
- "1 | \n",
- "5 | \n",
- "59.0 | \n",
- "75.0 |
\n",
- "
\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",
- " \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",
- " | 101 | \n",
- "22 | \n",
- "2 | \n",
- "19108323581 |
\n",
- "
\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",
- " | 101 | \n",
- "22 | \n",
- "2 | \n",
- "19108323581 |
| 244 | \n",
- "163 | \n",
- "1 | \n",
- "19108323584 |
\n",
- "
\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",
- " | 244 | \n",
- "163 | \n",
- "1 | \n",
- "19108323583 |
\n",
- "
\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",
- " | 0 | \n",
- "kilosort2 | \n",
- "Spike sorting using Kilosort2 | \n",
- "de78cee1-526f-319e-b6d5-8a2ba04963d8 | \n",
- "=BLOB= |
\n",
- "
\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
-}