diff --git a/.ipynb_checkpoints/sorterpipeline-checkpoint.ipynb b/.ipynb_checkpoints/sorterpipeline-checkpoint.ipynb
index 4417a57..cc0f629 100644
--- a/.ipynb_checkpoints/sorterpipeline-checkpoint.ipynb
+++ b/.ipynb_checkpoints/sorterpipeline-checkpoint.ipynb
@@ -2,12 +2,20 @@
"cells": [
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"id": "1a16521b-14b7-4381-9cf3-41532d427539",
"metadata": {
"scrolled": true
},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "10:30:10 [I] klustakwik KlustaKwik2 version 0.2.6\n"
+ ]
+ }
+ ],
"source": [
"# Dependencias.\n",
"import scipy.io\n",
@@ -34,7 +42,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"id": "0d3a9305-152a-4a31-9f23-0fcc756c85ef",
"metadata": {},
"outputs": [],
@@ -91,29 +99,45 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"id": "32e68d41-2dfe-49a7-a3a3-243d33ce3d90",
"metadata": {},
"outputs": [],
"source": [
"# Configuración de archivos\n",
- "probegroup_file = 'probes/anillo_probe.json' # Archivo de configuración del probegroup\n",
+ "probegroup_file = 'probes/TM24_probe.json' # Archivo de configuración del probegroup\n",
"\n",
"# Configuración de carpetas de procesamiento\n",
"preprocess_folder = Path('preprocess/')\n",
"\n",
"# Archivos de Excel para la información de registros\n",
"# como inicio se recomienda solo poner un dia en el excel de información de archivos, este es el punto de inicio para hacer una maquina de salchichas para todos los días del animal\n",
- "excel_file_maze = r'C:\\Users\\Labcn\\OneDrive - Universidad Católica de Chile\\sorting_anillo\\input_files\\PF07\\Maze\\informacion_archivos.xlsx'\n",
- "excel_file_sleep = r'C:\\Users\\Labcn\\OneDrive - Universidad Católica de Chile\\sorting_anillo\\input_files\\PF07\\Sleep\\informacion_archivos.xlsx'"
+ "excel_file_maze = r'C:\\Users\\Labcn\\OneDrive - Universidad Católica de Chile\\Datos_Ariel\\TM24\\TM24_td3\\informacion_archivos.xlsx'\n",
+ "excel_file_sleep = r'C:\\Users\\Labcn\\OneDrive - Universidad Católica de Chile\\Datos_Ariel\\TM24\\TM24_sd3\\informacion_archivos.xlsx'"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"id": "92ff5fcb-ac0f-4eed-b5e7-874c50813815",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Leyendo [WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_td3/TM24_td3_221215_123226.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_td3/TM24_td3_221215_123827.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_td3/TM24_td3_221215_124426.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_td3/TM24_td3_221215_125026.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_td3/TM24_td3_221215_125626.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_td3/TM24_td3_221215_130226.rhd')]\n",
+ "Concatenados 6 archivos .rhd.\n",
+ "Solo un registro disponible para concatenar.\n",
+ "Procesamiento de archivos completado\n",
+ "Leyendo [WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_132915.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_133515.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_134115.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_134715.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_135315.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_135915.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_140515.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_141115.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_141715.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_142315.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_142915.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_143515.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_144114.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_144714.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_145314.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_145914.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_150514.rhd'), WindowsPath('C:/Users/Labcn/OneDrive - Universidad Católica de Chile/Datos_Ariel/TM24/TM24_sd3/TM24_sd3_221215_151114.rhd')]\n",
+ "Concatenados 18 archivos .rhd.\n",
+ "Solo un registro disponible para concatenar.\n",
+ "Procesamiento de archivos completado\n",
+ "Registros de Maze y Sueño concatenados exitosamente.\n"
+ ]
+ }
+ ],
"source": [
"# Procesar archivos\n",
"record_maze = get_recording(excel_file_maze, probegroup_file)\n",
@@ -141,12 +165,348 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 5,
+ "id": "5ae5a044-8491-45ce-b6d9-4ecbcf1ab824",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
ConcatenateSegmentRecording: 64 channels - 20.0kHz - 1 segments - 165,742,560 samples - 8,287.13s (2.30 hours) - int16 dtype - 19.76 GiB
Channel IDs
['B-000' 'B-001' 'B-002' 'B-003' 'B-004' 'B-005' 'B-006' 'B-007' 'B-008'\n",
+ " 'B-009' 'B-010' 'B-011' 'B-012' 'B-013' 'B-014' 'B-015' 'B-016' 'B-017'\n",
+ " 'B-018' 'B-019' 'B-020' 'B-021' 'B-022' 'B-023' 'B-024' 'B-025' 'B-026'\n",
+ " 'B-027' 'B-028' 'B-029' 'B-030' 'B-031' 'B-032' 'B-033' 'B-034' 'B-035'\n",
+ " 'B-036' 'B-037' 'B-038' 'B-039' 'B-040' 'B-041' 'B-042' 'B-043' 'B-044'\n",
+ " 'B-045' 'B-046' 'B-047' 'B-048' 'B-049' 'B-050' 'B-051' 'B-052' 'B-053'\n",
+ " 'B-054' 'B-055' 'B-056' 'B-057' 'B-058' 'B-059' 'B-060' 'B-061' 'B-062'\n",
+ " 'B-063']
Annotations
- is_filtered : True
- name : None
Channel Properties
gain_to_uV
[0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195] offset_to_uV
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] channel_names
['B-000' 'B-001' 'B-002' 'B-003' 'B-004' 'B-005' 'B-006' 'B-007' 'B-008'\n",
+ " 'B-009' 'B-010' 'B-011' 'B-012' 'B-013' 'B-014' 'B-015' 'B-016' 'B-017'\n",
+ " 'B-018' 'B-019' 'B-020' 'B-021' 'B-022' 'B-023' 'B-024' 'B-025' 'B-026'\n",
+ " 'B-027' 'B-028' 'B-029' 'B-030' 'B-031' 'B-032' 'B-033' 'B-034' 'B-035'\n",
+ " 'B-036' 'B-037' 'B-038' 'B-039' 'B-040' 'B-041' 'B-042' 'B-043' 'B-044'\n",
+ " 'B-045' 'B-046' 'B-047' 'B-048' 'B-049' 'B-050' 'B-051' 'B-052' 'B-053'\n",
+ " 'B-054' 'B-055' 'B-056' 'B-057' 'B-058' 'B-059' 'B-060' 'B-061' 'B-062'\n",
+ " 'B-063'] contact_vector
[( 2, 6.0000000e+01, 0.0000000e+00, 'circle', 6., '', '', 0, 'um', 1., 0., 0., 1.)\n",
+ " ( 2, 5.0000000e+01, 1.0000000e+01, 'circle', 6., '', '', 1, 'um', 1., 0., 0., 1.)\n",
+ " ( 2, 4.0000000e+01, 1.2246468e-15, 'circle', 6., '', '', 2, 'um', 1., 0., 0., 1.)\n",
+ " ( 2, 5.0000000e+01, -1.0000000e+01, 'circle', 6., '', '', 3, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 6.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 4, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 5.0000000e+01, 6.0000000e+01, 'circle', 6., '', '', 5, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 4.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 6, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 5.0000000e+01, 4.0000000e+01, 'circle', 6., '', '', 7, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 6.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 8, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 5.0000000e+01, 1.0600000e+03, 'circle', 6., '', '', 9, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 4.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 10, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 5.0000000e+01, 1.0400000e+03, 'circle', 6., '', '', 11, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 6.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 12, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 5.0000000e+01, 1.0100000e+03, 'circle', 6., '', '', 13, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 4.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 14, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 5.0000000e+01, 9.9000000e+02, 'circle', 6., '', '', 15, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, 1.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 16, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, 6.1232340e-16, 1.0600000e+03, 'circle', 6., '', '', 17, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, -1.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 18, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, -1.8369702e-15, 1.0400000e+03, 'circle', 6., '', '', 19, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, 1.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 20, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, 6.1232340e-16, 1.0100000e+03, 'circle', 6., '', '', 21, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, -1.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 22, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, -1.8369702e-15, 9.9000000e+02, 'circle', 6., '', '', 23, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, 1.0000000e+01, 0.0000000e+00, 'circle', 6., '', '', 24, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, 6.1232340e-16, 1.0000000e+01, 'circle', 6., '', '', 25, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, -1.0000000e+01, 1.2246468e-15, 'circle', 6., '', '', 26, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, -1.8369702e-15, -1.0000000e+01, 'circle', 6., '', '', 27, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, 1.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 28, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, 6.1232340e-16, 6.0000000e+01, 'circle', 6., '', '', 29, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, -1.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 30, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, -1.8369702e-15, 4.0000000e+01, 'circle', 6., '', '', 31, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0600000e+03, 0.0000000e+00, 'circle', 6., '', '', 32, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0500000e+03, 1.0000000e+01, 'circle', 6., '', '', 33, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0400000e+03, 1.2246468e-15, 'circle', 6., '', '', 34, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0500000e+03, -1.0000000e+01, 'circle', 6., '', '', 35, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0600000e+03, 5.0000000e+01, 'circle', 6., '', '', 36, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0500000e+03, 6.0000000e+01, 'circle', 6., '', '', 37, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0400000e+03, 5.0000000e+01, 'circle', 6., '', '', 38, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0500000e+03, 4.0000000e+01, 'circle', 6., '', '', 39, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0600000e+03, 1.0500000e+03, 'circle', 6., '', '', 40, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0500000e+03, 1.0600000e+03, 'circle', 6., '', '', 41, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0400000e+03, 1.0500000e+03, 'circle', 6., '', '', 42, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0500000e+03, 1.0400000e+03, 'circle', 6., '', '', 43, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0600000e+03, 1.0000000e+03, 'circle', 6., '', '', 44, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0500000e+03, 1.0100000e+03, 'circle', 6., '', '', 45, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0400000e+03, 1.0000000e+03, 'circle', 6., '', '', 46, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0500000e+03, 9.9000000e+02, 'circle', 6., '', '', 47, 'um', 1., 0., 0., 1.)\n",
+ " (13, 1.0100000e+03, 1.0500000e+03, 'circle', 6., '', '', 48, 'um', 1., 0., 0., 1.)\n",
+ " (13, 1.0000000e+03, 1.0600000e+03, 'circle', 6., '', '', 49, 'um', 1., 0., 0., 1.)\n",
+ " (13, 9.9000000e+02, 1.0500000e+03, 'circle', 6., '', '', 50, 'um', 1., 0., 0., 1.)\n",
+ " (13, 1.0000000e+03, 1.0400000e+03, 'circle', 6., '', '', 51, 'um', 1., 0., 0., 1.)\n",
+ " (12, 1.0100000e+03, 1.0000000e+03, 'circle', 6., '', '', 52, 'um', 1., 0., 0., 1.)\n",
+ " (12, 1.0000000e+03, 1.0100000e+03, 'circle', 6., '', '', 53, 'um', 1., 0., 0., 1.)\n",
+ " (12, 9.9000000e+02, 1.0000000e+03, 'circle', 6., '', '', 54, 'um', 1., 0., 0., 1.)\n",
+ " (12, 1.0000000e+03, 9.9000000e+02, 'circle', 6., '', '', 55, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 1.0100000e+03, 0.0000000e+00, 'circle', 6., '', '', 56, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 1.0000000e+03, 1.0000000e+01, 'circle', 6., '', '', 57, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 9.9000000e+02, 1.2246468e-15, 'circle', 6., '', '', 58, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 1.0000000e+03, -1.0000000e+01, 'circle', 6., '', '', 59, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 1.0100000e+03, 5.0000000e+01, 'circle', 6., '', '', 60, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 1.0000000e+03, 6.0000000e+01, 'circle', 6., '', '', 61, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 9.9000000e+02, 5.0000000e+01, 'circle', 6., '', '', 62, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 1.0000000e+03, 4.0000000e+01, 'circle', 6., '', '', 63, 'um', 1., 0., 0., 1.)] location
[[ 6.0000000e+01 0.0000000e+00]\n",
+ " [ 5.0000000e+01 1.0000000e+01]\n",
+ " [ 4.0000000e+01 1.2246468e-15]\n",
+ " [ 5.0000000e+01 -1.0000000e+01]\n",
+ " [ 6.0000000e+01 5.0000000e+01]\n",
+ " [ 5.0000000e+01 6.0000000e+01]\n",
+ " [ 4.0000000e+01 5.0000000e+01]\n",
+ " [ 5.0000000e+01 4.0000000e+01]\n",
+ " [ 6.0000000e+01 1.0500000e+03]\n",
+ " [ 5.0000000e+01 1.0600000e+03]\n",
+ " [ 4.0000000e+01 1.0500000e+03]\n",
+ " [ 5.0000000e+01 1.0400000e+03]\n",
+ " [ 6.0000000e+01 1.0000000e+03]\n",
+ " [ 5.0000000e+01 1.0100000e+03]\n",
+ " [ 4.0000000e+01 1.0000000e+03]\n",
+ " [ 5.0000000e+01 9.9000000e+02]\n",
+ " [ 1.0000000e+01 1.0500000e+03]\n",
+ " [ 6.1232340e-16 1.0600000e+03]\n",
+ " [-1.0000000e+01 1.0500000e+03]\n",
+ " [-1.8369702e-15 1.0400000e+03]\n",
+ " [ 1.0000000e+01 1.0000000e+03]\n",
+ " [ 6.1232340e-16 1.0100000e+03]\n",
+ " [-1.0000000e+01 1.0000000e+03]\n",
+ " [-1.8369702e-15 9.9000000e+02]\n",
+ " [ 1.0000000e+01 0.0000000e+00]\n",
+ " [ 6.1232340e-16 1.0000000e+01]\n",
+ " [-1.0000000e+01 1.2246468e-15]\n",
+ " [-1.8369702e-15 -1.0000000e+01]\n",
+ " [ 1.0000000e+01 5.0000000e+01]\n",
+ " [ 6.1232340e-16 6.0000000e+01]\n",
+ " [-1.0000000e+01 5.0000000e+01]\n",
+ " [-1.8369702e-15 4.0000000e+01]\n",
+ " [ 1.0600000e+03 0.0000000e+00]\n",
+ " [ 1.0500000e+03 1.0000000e+01]\n",
+ " [ 1.0400000e+03 1.2246468e-15]\n",
+ " [ 1.0500000e+03 -1.0000000e+01]\n",
+ " [ 1.0600000e+03 5.0000000e+01]\n",
+ " [ 1.0500000e+03 6.0000000e+01]\n",
+ " [ 1.0400000e+03 5.0000000e+01]\n",
+ " [ 1.0500000e+03 4.0000000e+01]\n",
+ " [ 1.0600000e+03 1.0500000e+03]\n",
+ " [ 1.0500000e+03 1.0600000e+03]\n",
+ " [ 1.0400000e+03 1.0500000e+03]\n",
+ " [ 1.0500000e+03 1.0400000e+03]\n",
+ " [ 1.0600000e+03 1.0000000e+03]\n",
+ " [ 1.0500000e+03 1.0100000e+03]\n",
+ " [ 1.0400000e+03 1.0000000e+03]\n",
+ " [ 1.0500000e+03 9.9000000e+02]\n",
+ " [ 1.0100000e+03 1.0500000e+03]\n",
+ " [ 1.0000000e+03 1.0600000e+03]\n",
+ " [ 9.9000000e+02 1.0500000e+03]\n",
+ " [ 1.0000000e+03 1.0400000e+03]\n",
+ " [ 1.0100000e+03 1.0000000e+03]\n",
+ " [ 1.0000000e+03 1.0100000e+03]\n",
+ " [ 9.9000000e+02 1.0000000e+03]\n",
+ " [ 1.0000000e+03 9.9000000e+02]\n",
+ " [ 1.0100000e+03 0.0000000e+00]\n",
+ " [ 1.0000000e+03 1.0000000e+01]\n",
+ " [ 9.9000000e+02 1.2246468e-15]\n",
+ " [ 1.0000000e+03 -1.0000000e+01]\n",
+ " [ 1.0100000e+03 5.0000000e+01]\n",
+ " [ 1.0000000e+03 6.0000000e+01]\n",
+ " [ 9.9000000e+02 5.0000000e+01]\n",
+ " [ 1.0000000e+03 4.0000000e+01]] group
[ 2 2 2 2 3 3 3 3 7 7 7 7 6 6 6 6 5 5 5 5 4 4 4 4\n",
+ " 0 0 0 0 1 1 1 1 10 10 10 10 11 11 11 11 15 15 15 15 14 14 14 14\n",
+ " 13 13 13 13 12 12 12 12 8 8 8 8 9 9 9 9]
"
+ ],
+ "text/plain": [
+ "ConcatenateSegmentRecording: 64 channels - 20.0kHz - 1 segments - 165,742,560 samples \n",
+ " 8,287.13s (2.30 hours) - int16 dtype - 19.76 GiB"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "recording"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
"id": "3fe4dda9-ffe2-4489-a77c-bc39b72c87df",
"metadata": {
"scrolled": true
},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "ConcatenateSegmentRecording: 64 channels - 20.0kHz - 1 segments - 165,742,560 samples - 8,287.13s (2.30 hours) - int16 dtype - 19.76 GiB
Channel IDs
['B-000' 'B-001' 'B-002' 'B-003' 'B-004' 'B-005' 'B-006' 'B-007' 'B-008'\n",
+ " 'B-009' 'B-010' 'B-011' 'B-012' 'B-013' 'B-014' 'B-015' 'B-016' 'B-017'\n",
+ " 'B-018' 'B-019' 'B-020' 'B-021' 'B-022' 'B-023' 'B-024' 'B-025' 'B-026'\n",
+ " 'B-027' 'B-028' 'B-029' 'B-030' 'B-031' 'B-032' 'B-033' 'B-034' 'B-035'\n",
+ " 'B-036' 'B-037' 'B-038' 'B-039' 'B-040' 'B-041' 'B-042' 'B-043' 'B-044'\n",
+ " 'B-045' 'B-046' 'B-047' 'B-048' 'B-049' 'B-050' 'B-051' 'B-052' 'B-053'\n",
+ " 'B-054' 'B-055' 'B-056' 'B-057' 'B-058' 'B-059' 'B-060' 'B-061' 'B-062'\n",
+ " 'B-063']
Annotations
- is_filtered : True
- name : None
Channel Properties
gain_to_uV
[0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195] offset_to_uV
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] channel_names
['B-000' 'B-001' 'B-002' 'B-003' 'B-004' 'B-005' 'B-006' 'B-007' 'B-008'\n",
+ " 'B-009' 'B-010' 'B-011' 'B-012' 'B-013' 'B-014' 'B-015' 'B-016' 'B-017'\n",
+ " 'B-018' 'B-019' 'B-020' 'B-021' 'B-022' 'B-023' 'B-024' 'B-025' 'B-026'\n",
+ " 'B-027' 'B-028' 'B-029' 'B-030' 'B-031' 'B-032' 'B-033' 'B-034' 'B-035'\n",
+ " 'B-036' 'B-037' 'B-038' 'B-039' 'B-040' 'B-041' 'B-042' 'B-043' 'B-044'\n",
+ " 'B-045' 'B-046' 'B-047' 'B-048' 'B-049' 'B-050' 'B-051' 'B-052' 'B-053'\n",
+ " 'B-054' 'B-055' 'B-056' 'B-057' 'B-058' 'B-059' 'B-060' 'B-061' 'B-062'\n",
+ " 'B-063'] contact_vector
[( 2, 6.0000000e+01, 0.0000000e+00, 'circle', 6., '', '', 0, 'um', 1., 0., 0., 1.)\n",
+ " ( 2, 5.0000000e+01, 1.0000000e+01, 'circle', 6., '', '', 1, 'um', 1., 0., 0., 1.)\n",
+ " ( 2, 4.0000000e+01, 1.2246468e-15, 'circle', 6., '', '', 2, 'um', 1., 0., 0., 1.)\n",
+ " ( 2, 5.0000000e+01, -1.0000000e+01, 'circle', 6., '', '', 3, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 6.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 4, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 5.0000000e+01, 6.0000000e+01, 'circle', 6., '', '', 5, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 4.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 6, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 5.0000000e+01, 4.0000000e+01, 'circle', 6., '', '', 7, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 6.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 8, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 5.0000000e+01, 1.0600000e+03, 'circle', 6., '', '', 9, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 4.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 10, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 5.0000000e+01, 1.0400000e+03, 'circle', 6., '', '', 11, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 6.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 12, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 5.0000000e+01, 1.0100000e+03, 'circle', 6., '', '', 13, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 4.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 14, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 5.0000000e+01, 9.9000000e+02, 'circle', 6., '', '', 15, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, 1.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 16, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, 6.1232340e-16, 1.0600000e+03, 'circle', 6., '', '', 17, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, -1.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 18, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, -1.8369702e-15, 1.0400000e+03, 'circle', 6., '', '', 19, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, 1.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 20, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, 6.1232340e-16, 1.0100000e+03, 'circle', 6., '', '', 21, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, -1.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 22, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, -1.8369702e-15, 9.9000000e+02, 'circle', 6., '', '', 23, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, 1.0000000e+01, 0.0000000e+00, 'circle', 6., '', '', 24, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, 6.1232340e-16, 1.0000000e+01, 'circle', 6., '', '', 25, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, -1.0000000e+01, 1.2246468e-15, 'circle', 6., '', '', 26, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, -1.8369702e-15, -1.0000000e+01, 'circle', 6., '', '', 27, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, 1.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 28, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, 6.1232340e-16, 6.0000000e+01, 'circle', 6., '', '', 29, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, -1.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 30, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, -1.8369702e-15, 4.0000000e+01, 'circle', 6., '', '', 31, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0600000e+03, 0.0000000e+00, 'circle', 6., '', '', 32, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0500000e+03, 1.0000000e+01, 'circle', 6., '', '', 33, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0400000e+03, 1.2246468e-15, 'circle', 6., '', '', 34, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0500000e+03, -1.0000000e+01, 'circle', 6., '', '', 35, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0600000e+03, 5.0000000e+01, 'circle', 6., '', '', 36, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0500000e+03, 6.0000000e+01, 'circle', 6., '', '', 37, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0400000e+03, 5.0000000e+01, 'circle', 6., '', '', 38, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0500000e+03, 4.0000000e+01, 'circle', 6., '', '', 39, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0600000e+03, 1.0500000e+03, 'circle', 6., '', '', 40, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0500000e+03, 1.0600000e+03, 'circle', 6., '', '', 41, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0400000e+03, 1.0500000e+03, 'circle', 6., '', '', 42, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0500000e+03, 1.0400000e+03, 'circle', 6., '', '', 43, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0600000e+03, 1.0000000e+03, 'circle', 6., '', '', 44, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0500000e+03, 1.0100000e+03, 'circle', 6., '', '', 45, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0400000e+03, 1.0000000e+03, 'circle', 6., '', '', 46, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0500000e+03, 9.9000000e+02, 'circle', 6., '', '', 47, 'um', 1., 0., 0., 1.)\n",
+ " (13, 1.0100000e+03, 1.0500000e+03, 'circle', 6., '', '', 48, 'um', 1., 0., 0., 1.)\n",
+ " (13, 1.0000000e+03, 1.0600000e+03, 'circle', 6., '', '', 49, 'um', 1., 0., 0., 1.)\n",
+ " (13, 9.9000000e+02, 1.0500000e+03, 'circle', 6., '', '', 50, 'um', 1., 0., 0., 1.)\n",
+ " (13, 1.0000000e+03, 1.0400000e+03, 'circle', 6., '', '', 51, 'um', 1., 0., 0., 1.)\n",
+ " (12, 1.0100000e+03, 1.0000000e+03, 'circle', 6., '', '', 52, 'um', 1., 0., 0., 1.)\n",
+ " (12, 1.0000000e+03, 1.0100000e+03, 'circle', 6., '', '', 53, 'um', 1., 0., 0., 1.)\n",
+ " (12, 9.9000000e+02, 1.0000000e+03, 'circle', 6., '', '', 54, 'um', 1., 0., 0., 1.)\n",
+ " (12, 1.0000000e+03, 9.9000000e+02, 'circle', 6., '', '', 55, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 1.0100000e+03, 0.0000000e+00, 'circle', 6., '', '', 56, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 1.0000000e+03, 1.0000000e+01, 'circle', 6., '', '', 57, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 9.9000000e+02, 1.2246468e-15, 'circle', 6., '', '', 58, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 1.0000000e+03, -1.0000000e+01, 'circle', 6., '', '', 59, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 1.0100000e+03, 5.0000000e+01, 'circle', 6., '', '', 60, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 1.0000000e+03, 6.0000000e+01, 'circle', 6., '', '', 61, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 9.9000000e+02, 5.0000000e+01, 'circle', 6., '', '', 62, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 1.0000000e+03, 4.0000000e+01, 'circle', 6., '', '', 63, 'um', 1., 0., 0., 1.)] location
[[ 6.0000000e+01 0.0000000e+00]\n",
+ " [ 5.0000000e+01 1.0000000e+01]\n",
+ " [ 4.0000000e+01 1.2246468e-15]\n",
+ " [ 5.0000000e+01 -1.0000000e+01]\n",
+ " [ 6.0000000e+01 5.0000000e+01]\n",
+ " [ 5.0000000e+01 6.0000000e+01]\n",
+ " [ 4.0000000e+01 5.0000000e+01]\n",
+ " [ 5.0000000e+01 4.0000000e+01]\n",
+ " [ 6.0000000e+01 1.0500000e+03]\n",
+ " [ 5.0000000e+01 1.0600000e+03]\n",
+ " [ 4.0000000e+01 1.0500000e+03]\n",
+ " [ 5.0000000e+01 1.0400000e+03]\n",
+ " [ 6.0000000e+01 1.0000000e+03]\n",
+ " [ 5.0000000e+01 1.0100000e+03]\n",
+ " [ 4.0000000e+01 1.0000000e+03]\n",
+ " [ 5.0000000e+01 9.9000000e+02]\n",
+ " [ 1.0000000e+01 1.0500000e+03]\n",
+ " [ 6.1232340e-16 1.0600000e+03]\n",
+ " [-1.0000000e+01 1.0500000e+03]\n",
+ " [-1.8369702e-15 1.0400000e+03]\n",
+ " [ 1.0000000e+01 1.0000000e+03]\n",
+ " [ 6.1232340e-16 1.0100000e+03]\n",
+ " [-1.0000000e+01 1.0000000e+03]\n",
+ " [-1.8369702e-15 9.9000000e+02]\n",
+ " [ 1.0000000e+01 0.0000000e+00]\n",
+ " [ 6.1232340e-16 1.0000000e+01]\n",
+ " [-1.0000000e+01 1.2246468e-15]\n",
+ " [-1.8369702e-15 -1.0000000e+01]\n",
+ " [ 1.0000000e+01 5.0000000e+01]\n",
+ " [ 6.1232340e-16 6.0000000e+01]\n",
+ " [-1.0000000e+01 5.0000000e+01]\n",
+ " [-1.8369702e-15 4.0000000e+01]\n",
+ " [ 1.0600000e+03 0.0000000e+00]\n",
+ " [ 1.0500000e+03 1.0000000e+01]\n",
+ " [ 1.0400000e+03 1.2246468e-15]\n",
+ " [ 1.0500000e+03 -1.0000000e+01]\n",
+ " [ 1.0600000e+03 5.0000000e+01]\n",
+ " [ 1.0500000e+03 6.0000000e+01]\n",
+ " [ 1.0400000e+03 5.0000000e+01]\n",
+ " [ 1.0500000e+03 4.0000000e+01]\n",
+ " [ 1.0600000e+03 1.0500000e+03]\n",
+ " [ 1.0500000e+03 1.0600000e+03]\n",
+ " [ 1.0400000e+03 1.0500000e+03]\n",
+ " [ 1.0500000e+03 1.0400000e+03]\n",
+ " [ 1.0600000e+03 1.0000000e+03]\n",
+ " [ 1.0500000e+03 1.0100000e+03]\n",
+ " [ 1.0400000e+03 1.0000000e+03]\n",
+ " [ 1.0500000e+03 9.9000000e+02]\n",
+ " [ 1.0100000e+03 1.0500000e+03]\n",
+ " [ 1.0000000e+03 1.0600000e+03]\n",
+ " [ 9.9000000e+02 1.0500000e+03]\n",
+ " [ 1.0000000e+03 1.0400000e+03]\n",
+ " [ 1.0100000e+03 1.0000000e+03]\n",
+ " [ 1.0000000e+03 1.0100000e+03]\n",
+ " [ 9.9000000e+02 1.0000000e+03]\n",
+ " [ 1.0000000e+03 9.9000000e+02]\n",
+ " [ 1.0100000e+03 0.0000000e+00]\n",
+ " [ 1.0000000e+03 1.0000000e+01]\n",
+ " [ 9.9000000e+02 1.2246468e-15]\n",
+ " [ 1.0000000e+03 -1.0000000e+01]\n",
+ " [ 1.0100000e+03 5.0000000e+01]\n",
+ " [ 1.0000000e+03 6.0000000e+01]\n",
+ " [ 9.9000000e+02 5.0000000e+01]\n",
+ " [ 1.0000000e+03 4.0000000e+01]] group
[ 2 2 2 2 3 3 3 3 7 7 7 7 6 6 6 6 5 5 5 5 4 4 4 4\n",
+ " 0 0 0 0 1 1 1 1 10 10 10 10 11 11 11 11 15 15 15 15 14 14 14 14\n",
+ " 13 13 13 13 12 12 12 12 8 8 8 8 9 9 9 9]
"
+ ],
+ "text/plain": [
+ "ConcatenateSegmentRecording: 64 channels - 20.0kHz - 1 segments - 165,742,560 samples \n",
+ " 8,287.13s (2.30 hours) - int16 dtype - 19.76 GiB"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"# plot and check spikes\n",
"mode = \"line\"\n",
@@ -246,9 +606,7 @@
{
"cell_type": "markdown",
"id": "03924393-f90e-479d-a3f5-f2f51cb305f3",
- "metadata": {
- "jp-MarkdownHeadingCollapsed": true
- },
+ "metadata": {},
"source": [
"## Estimar ruido\n",
"\n",
@@ -276,10 +634,56 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 7,
"id": "97e36ce4-3f4d-49ce-8408-6a4f6e8e8008",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "0a6d7a35561846ffa4cd8ad6ff3d0b1f",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "image/png": "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OqvT/u0/6wDtsssu6/L8t956a6f9a2pqtFNOOaXbuAMDA7WXXnqpx3O3fx/25/0hhBD+RK6gCyH8yuOPP25/vHjxYnbt2tWr/R599FGeffZZh7LJkydz/PHHExERYS/bvHkzp5xyitMr6c788ssvfPHFF/bnMTExnHTSSZx66qlMnjyZ2NhYp/v9/PPPLFiwgJqaGsB2BfCII47gtNNOY+jQofbt1q5dy9lnn93lFTJX6m9MEydOZNq0afbXP//8c/sxWr399tv2x0FBQVx++eX257feeitvvPGG/XlERAQnnHACJ510EuHh4QBomsbDDz/MSy+91Ov6PP3001RUVNifjxo1itNPP525c+cycuRITCZTr4/V0YYNGxwmI5sxYwaZmZlcdNFFDtt1dY/6HXfc0Wmm9+TkZHu94+Pje4zhP//5D83NzQwbNoz58+czceJEFEUBbFf377zzTocr+KNHj+bEE090mLshJyeHk08+mfLycnvZww8/TFNTk/355MmTOeOMM5g1axbDhg3DaDR2iuWVV17hwIED9ueZmZmcdtppnHjiiYwZM4aQkJAe69PRqlWrHJ4nJyczefLkPh+nvTfeeIP6+nqmT5/O9OnTHV5bt24dH374odP9hg0bxjHHHMNpp53G/PnzmTRpEgZD259gCxcu7HEkxrvvvktAQACzZs1i/PjxDq99+umn/Pzzz93u/9ZbbxEeHs7cuXMZNmyYw2vPPfcceXl5DmUXXXSRwy0YCQkJnHzyyRx33HH2935zczM33HCDw3Y96c/7Qwgh/IqHvyAQQgi3osNVGU3TtDPOOMP+/Pzzz9c0rfsr6BUVFVpISIjD6++995799dzcXC0zM9Ph9fZXlbq7gv7uu+86vJabm+sQv6qq2oYNG7QXXnjBoXzmzJn2fQICArQVK1Y47PP73//e4bhLlizp9e+sv1fQDyemV1991eG1V1991f5aTk6OpiiK/bULL7zQ/trOnTs1g8Fgf23atGladXW1/fXi4mItPT3d/npcXJxmNpvtr3d3Bf3EE0+0lx9//PGd6ltXV6d9+eWX2tKlS3v1+2nvlltucXq10Gw2a9HR0fZyk8mklZeXO+y7e/fuTldSH3roIa25udm+TUtLi7ZkyRKtrKzMXtbxPQ50el81NTVpVqtVGzRokMN2jz32mH2biooK7YgjjnB4/c9//rP99eHDh9vLr7rqqk51r6ys1D788ENt9erV9rJrr73Wvs+IESO0lpYWh33MZrP2/fff9+l9fOONNzrEeNRRR/V631Ydf2dGo1H77rvvunz9yiuvdNg/NzdXKykpcXrsL7/80mHfu+++2+H1ju/NqKgoh9EKHV9/6KGHHPbveBV78ODBWk5OjqZptlEnxx9/vMPrb775pn3fjqMPzjjjDId2s3PnTi08PNz++rhx47o9d/sr6P15fwghhD+RK+hCCL/z6KOP2q9eLVmyhA0bNnS7/XfffUdjY6P9+fTp0x2udKanp/OnP/3JYZ/2V8W7M3jwYIfnf/rTn3jrrbdYtWoVJSUlKIrC5MmTufHGG+3blJaWOlwdDA8P5x//+AfnnXce5513Hueffz5btmzpVzz9dbgxXXjhhURGRtqft79i/s477ziMALjuuuvsjz///HOHWbctFgtXXXWV/bw33nijw77l5eU9Xmls1T4369at469//SuffPIJ2dnZNDY2EhYWxqmnnspJJ53Uq+O1j/G9996zPzcajZx//vkAmEwmhxn/O24L8Nlnn2G1Wu3P58yZwwMPPEBAQNu8r0ajkXPPPbfblQqOP/54h/cV2EYnrF+/noMHD9rLUlNTueuuu+zPY2JieOihhxz2a5/L9r+3r7/+mieeeIIvv/yS7du3Y7FYiI6O5rzzzuOoo45yus/+/fu59957+fDDD9mwYQN1dXWYTCbmzp3r8LvpK80Fo0jOO+88jj/+ePvzM844w+H1goICh+fp6emsX7+eSy65xD5vhdFoRFEUTjvtNIdte7qf+/rrr2fixIm9PndHf/7zn+2/54CAAObPn9/l/p988onDa2VlZVx88cX2dnXvvfcSGBhof33Lli29Xuu8P+8PIYTwJzKLuxDC74wbN45LLrmEt99+G03TuPfee7v9Y7DjH54dh5cCDn84g62T0RvHHHMMp5xyin2I6H/+8x/+85//2F8fNGgQJ510ErfddhsTJkywx9O+s1FVVcVHH33U7Xl6G09/HW5MYWFhXHzxxfYh6CtWrODAgQMMHjzYobM+fPhwjjvuOKfHANi0aRObNm3q8bxz5szpqUrccccdLFmyhKqqKmpqanjwwQftrxmNRiZMmMB5553HH/7wB/tQ+t744osvHIaEz507l6SkJPvziy66iNdee83+fPHixdx888325/v27XM43uzZs3t97va6+h10fL+PHj2607Dj7t7vf/nLX1i5ciVms5mDBw9y9913218zmUxMnTqViy++mOuuu84+VPraa6/l5ZdfJjc3l+bmZp544gn7Pq2TAp555pncfvvtJCQk9Kp+7X+ngMMQ+v7quERiVFSUw/OOk7Xdeuut/POf/+zVsZ1NMnc45z6c/Tu2q958qbV//34yMzN73K4/7w8hhPAncgVdCOGX/vrXv9r/+Fu6dCnLly/vctuOV95a79N1lS+++II33niD+fPnd7p3+ODBgyxevJhp06axdu3afp+jvr7+cMN0uY4xtb8yrmka77zzDuvWrWPnzp328muvvdbl5+3KqFGj2LJlC/feey9Tp04lODjY/prVamXjxo3cd999zJ071+GKdk863lf+yy+/kJaWZv+57LLLHF5vXRPd1QYNGuS0/HDf77Nnz+a3337j1ltvZdy4cQ5XWi0WC6tXr+aWW27hwgsvtJcnJiayadMmHn30UY4++mjCwsIc4tm+fTuLFi1i2rRpneYn6Moxxxzj8LyoqKjH0TI96Tgiobv7pX/99ddOnfPhw4dz2mmnce6553LKKac4vNbTFf6+nNsd+/ekt+2qP+8PIYTwJ9JBF0L4pczMTIcO4Y8//tjltllZWQ7Ps7OzO23TfsIvZ/t0x2g0csUVV/Df//6X0tJSqqqq2LhxI/fff799G7PZzL/+9S/ANkS0fadp1KhRaJrW7c+vv/7a63j6wxUxTZ48mSOOOML+/O2333a4em4ymTotUdfx97xo0aIez9v+anRPUlNTefTRR/n111+pr6+noKCAb7/9lmOPPda+zbp167pcKquj4uJivv76a4ey2tpaCgoK7D/th5e3at+pHzJkiMNr3b13u9N+krL2Ov5Ot23b1ukLiJ7e7yNGjODvf/872dnZNDQ0kJubyxdffMHYsWPt23zyyScOV+tjYmK49957WbVqFbW1tRQXF7Ny5UrOPvts+zY5OTl8/PHHvarfscceS1pamkPZ3Xff7XBLREeapvV6gseedHxP3HDDDezatYsvvviCJUuWOLRvb9Mxn++//36P7arjkP3u9Of9IYQQ/kI66EIIv3X//fc7XKnryvHHH+8wi/Qvv/zCBx98YH9eUFDAk08+6bBPb/9Yzc3N5dlnn3UYthwVFcWkSZP43e9+57BtUVERYLva2H5I/o4dO1i0aFGnTlRLSwvLli3j6quvZs2aNb2Kp79cFVP7L0127tzJK6+8Yn9+1llndRrefNpppzl8MfD00087vUpaVlbG4sWLufjii3tdp08++YSPPvrIvta3wWBg0KBBnHDCCQ4ddGjLTU/eeeedHtc2d6b9muhnnHGGQ+d6+fLl/PWvf3U4rqZpfPbZZ5SVlfX5XFOmTHFYJ7ygoICnn37a/ryqqqrTeunt3++LFy/mq6++sg+ZDggIID09ndNOO63T0PjW39uyZct4++237bPmK4pCYmIiM2fO7HSlube/a5PJxGOPPeZQ9t1333H++ed3OoamaSxdupRjjjmGbdu29er4PWm/xj3gsMZ9dXU19957r0vO4w4d72+///77nd4mU1BQwAsvvMAtt9zS62P35/0hhBD+RO5BF0L4rcTERG677TYeeeSRbreLjY3lrrvucpgYa8GCBfztb38jJiaGdevWOQy7HTVqFFdeeWWvYqioqOD222/n9ttvJyMjg2HDhhEZGUltbW2nDuzo0aPtjxctWsTxxx9v75Tdc889/POf/2TcuHEEBQVRXFzM1q1baWhoAOjU2e+LrVu3ct5553X5+osvvkhCQoJLYrrooou44447qK2tBXBYjql9573VqFGjuOaaa+wd+dLSUqZOncrEiRPJyMjAbDaTk5PDnj17UFW106R83fnxxx/5xz/+gclkYtSoUaSmpmIymcjLy+v0JUD73HSn4/D2L774ossvcyZOnGi/Ul1UVMTXX3/NaaedxvDhw7npppt47rnn7Ns++OCDvPTSS4wbNw6DwcDmzZspKipi//79vVpyrT2j0chjjz3m8B6+++67efPNN0lLS2PDhg0OHf/ExETuuOMO+/NPP/2Uzz77jNDQUEaPHk1ycjJGo5E9e/Y4dH4DAgIYPnw4YFue8LbbbsNoNDJixAgyMjIICQmhqKiIdevWOcTX29812N5jmzdvdviC4eOPP+bzzz/niCOOICkpierqan777TeHJfVcoeO8Fk8//TQrVqwgLi6OtWvXUllZ6dLzudJJJ53EiSeeyLfffgvA7t27GT58uP3Lm4aGBvbs2WO/wt2XeRD68/4QQgh/Ih10IYRfu/POO/nXv/7V4x/nDz74IOXl5Q5rTzu7Ujtu3Di++OILgoKC+hxLbm4uubm5Tl/LzMx0mEl71qxZvPfee1xzzTX2LwcKCwspLCx0un/7Gb77qqysrNsJ35566ikSEhJcElN4eDgXXXQRL7/8skP5sGHDmDt3rtPjvPDCC5jNZt566y172ebNm9m8eXOvztkTi8XCb7/91mlYd6vf//73na78OfPrr7863EseExPDvHnzutx+wYIFDudcvHixvTP/7LPP0tzc7LCue3e/67664oorKC4u5r777rOPgti2bVunq8sZGRl88sknTidua2hoYP369V2e4+GHH+50X7TVamX79u1s377d6T7z58/n9NNP71NdnnrqKUaOHMmdd95pf1+2tLTwyy+/ON2+q6H/fTVr1izOOecchyH5rV82GI1GFi1a5DBBmrdZsmQJF1xwAUuXLgVsuen4ZUmr/rSr/rw/hBDCH0gHXQjh16Kiorjnnns6LZPWkaIoPPfcc1xyySW88sor/PTTTxQUFGCxWIiNjWXSpEmcd955/O53v+tT53z48OEsXryYn3/+mfXr11NUVER5eTktLS3ExMQwcuRITj31VG644YZOsy6ff/75HHvssbzyyit88803bN++nerqagICAkhKSmLUqFHMnDmTs846i3HjxvXr99NXrojpuuuu69RBv+aaa7qcrCwwMJA333yT6667jtdff53Vq1eTl5dnXwotIyODSZMmMXfuXM4666xe1+X6668nNTWV1atXs337dsrKyqiqqiIwMJDk5GSmTJnC7373O84888xeHa/j1fNzzjnHYYKsjhYsWMB9991nf/7FF19QUVFBbGwsRqORF198kauuuorXXnuNn376idzcXJqamoiNjSUrK4vjjjuuz1fP27v77rs5/fTTefHFF1m+fDkHDhygsbGR6Ohoxo4dy5lnnsk111xDRESEw35/+ctfOOKII1i9ejW7d++mvLyc6upqgoKCSEtLY9q0aVxzzTUOV13POeccDAYDq1evJjs7m7KyMioqKjAYDCQmJjJhwgQuuOACLrnkkn51oK+99loWLFjA22+/zbfffsvGjRspLy/HbDYTFRXFiBEjmDlzJueff759tQRX+M9//sNTTz3F4sWL2bdvHxEREUyfPp377ruP1NRUr+6gR0ZG8vXXX/PVV1/x7rvvsmbNGgoLCzGbzURGRpKZmcmUKVM48cQT+/SlSX/eH0II4U8UzRULgwohhBBCCCGEEOKwyCRx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dOCUU05h6dKlnHrqqYwfP568vDyeeuopKioq+PHHH6WxZxPZ2dmMHDkSTdNIS0tj9erVVock9uLLL7/khBNOYOLEiZx++ulERUWxZcsWDMPggQcesDo80Y6srCzGjx9Pnz59uPTSS4mPj2fZsmXNDYUPP/zQ6hBFo8zMTIYMGUJqairp6el8++23vPzyy5x//vkt1svOzmbixIn06dOHefPmUVFRwUMPPURqaio///wzISEh1uxAL9aZ3FVUVBAdHc1BBx3E8ccfT2JiIsuWLeOVV15h2rRpLFq0CM0mg5OJAGEK4RA//fSTCZgPPvhgc1l1dbU5dOhQ8+CDD7YwMtEZS5cuNWtra1uUbdy40QwNDTXPOussi6ISXXX66aebM2bMMA877DBzzJgxVocj9mLXrl1m//79zZNOOsl0u91WhyO64O677zYBc/Xq1S3Kzz33XBMwi4uLLYpM7KmmpsbMzc01TdM0ly9fbgLmyy+/3Gq9yy67zAwPDze3bdvWXPbVV1+ZgPncc8/5K1yxm87krra21ly6dGmr9955550mYH711Vf+CFU4iHRxF47x7rvv4nK5mDt3bnNZWFgYF154IcuWLSMrK8vC6MTeHHLIIa2uDgwfPpwxY8awbt06i6ISXfH999/z7rvv8thjj1kdiuikN954g/z8fO6++250XaeyshLDMKwOS3RCWVkZAP37929RnpycjK7rcrU1gISGhpKUlLTX9d577z2OP/54UlNTm8uOPPJIRowYwdtvv+3LEEU7OpO7kJAQDjnkkFblJ510EoCcw4gukwa6cIwVK1YwYsQIYmJiWpRPmjQJgJUrV1oQlegJ0zTJz8+nb9++Voci9sLtdnPVVVdx0UUXMW7cOKvDEZ309ddfExMTQ05ODiNHjiQqKoqYmBguu+wyuXcywE2fPh2ACy+8kJUrV5KVlcVbb73FM888w7x584iMjLQ2QNElOTk5FBQUcMABB7R6bdKkSaxYscKCqERP5OXlAcg5jOgyaaALx8jNzSU5OblVeVPZjh07/B2S6KF//etf5OTkcPrpp1sditiLZ599lm3btvH3v//d6lBEF2zatImGhgZOPPFEZs6cyXvvvcdf/vIXnn32WS644AKrwxMdOOaYY/j73//OV199xcSJE0lNTeXPf/4zV111FY8++qjV4Ykuys3NBWj3PKa4uJja2lp/hyV64IEHHiAmJoZjjz3W6lCEzQRZHYAQ3lJdXU1oaGir8rCwsObXhX2sX7+eK664goMPPpjzzjvP6nBEB4qKirj99tu57bbb6Nevn9XhiC6oqKigqqqKSy+9tHnU9pNPPpm6ujqee+457rrrLoYPH25xlKI9aWlpTJs2jT/96U8kJCTw6aefcs8995CUlMSVV15pdXiiC5rOUfZ2HtPW6yLw3HPPPXz99dc8/fTTxMbGWh2OsBlpoAvHCA8Pb/PX5aZumuHh4f4OSXRTXl4es2bNok+fPs1jC4jAdeuttxIfH89VV11ldSiii5qOi2eccUaL8jPPPJPnnnuOZcuWSQM9QP373/9m7ty5bNy4kZSUFED9uGIYBjfeeCNnnHEGCQkJFkcpOqupLsp5jP299dZb3HrrrVx44YVcdtllVocjbEi6uAvHSE5Obu4itrumsgEDBvg7JNENu3bt4thjj6W0tJTPP/9c8hbgNm3axIIFC5g3bx47duwgMzOTzMxMampqqK+vJzMzk+LiYqvDFO1oql97DjSWmJgIQElJid9jEp3z9NNPM3HixObGeZPZs2dTVVUl9yzbTFPX9vbOY+Lj4+XquQ189dVXnHvuucyaNYtnn33W6nCETUkDXTjGhAkT2LhxY/PItk1++umn5tdFYKupqeGEE05g48aNfPLJJ4wePdrqkMRe5OTkYBgG8+bNY8iQIc2Pn376iY0bNzJkyBDuuusuq8MU7dh///0BlcfdNY3ZIbcsBK78/Hzcbner8vr6egAaGhr8HZLogYEDB9KvXz9++eWXVq/9/PPPcg5jAz/99BMnnXQSBxxwAG+//TZBQdJRWXSPNNCFY5xyyim43W4WLFjQXFZbW8vLL7/M5MmTGTRokIXRib1xu92cfvrpLFu2jHfeeYeDDz7Y6pBEJ4wdO5b333+/1WPMmDGkpqby/vvvc+GFF1odpmjHaaedBsCLL77YovyFF14gKCioeaRwEXhGjBjBihUr2LhxY4vyN998E13XGT9+vEWRie7605/+xCeffNJiWthvvvmGjRs3cuqpp1oYmdibdevWMWvWLNLS0vjkk0/kdgTRI5ppmqbVQQjhLaeddhrvv/8+11xzDcOGDeOVV17h559/5ptvvmHatGlWhyc6cPXVV/P4449zwgknNDcadnf22WdbEJXorunTp7Nz505Wr15tdShiLy688EJeeuklTjvtNA477DC+/fZb3nnnHW6++Wbuueceq8MT7fj++++ZMWMGCQkJXHnllSQkJPDJJ5/w2WefcdFFF/H8889bHaLYzVNPPUVpaSk7duzgmWee4eSTT2bixIkAXHXVVfTp04esrCwmTpxIbGwsf/3rX6moqODBBx8kJSWF5cuXSxd3i+wtd7quM2bMGHJycrjnnnsYOHBgi/cPHTpULjqILpEGunCUmpoabrvtNl5//XVKSkoYP348f//735k5c6bVoYm9mD59Ot999127r8uhyl6kgW4f9fX13HPPPbz88svs2LGDwYMHc8UVV3D11VdbHZrYi59//pk77riDFStWUFRUxJAhQzjvvPO44YYbpHttgElLS2Pbtm1tvrZ161bS0tIAWLNmDddeey0//PADISEhzJo1i4cffrjVOBHCf/aWO4AhQ4a0+/7zzjuPhQsX+iI04VDSQBdCCCGEEEIIIQKA3IMuhBBCCCGEEEIEAGmgCyGEEEIIIYQQAUAa6EIIIYQQQgghRACQBroQQgghhBBCCBEApIEuhBBCCCGEEEIEAGmgCyGEEEIIIYQQAUAa6EIIIYQQQgghRACQBroQQgghhBBCCBEApIEuhBBCCCGEEEIEAGmgCyGEEEIIIYQQAUAa6EIIIRzh/PPPR9M0MjMzrQ7FlqZPn46maV1+35w5c9hnn31wu90+iMp/br31VqKjo8nPz7c6FCGEEL2YNNCFEEL4TGZmJpqmoWkaM2fObHOdH3/8EU3TOP/88/0bnI80NXTz8vKsDsXnvvvuOz788EPmz5+Py+VqLr/jjjua83799de3+/4bb7yxeb077rij3fW+//775vXeeeeddtdbuHBh83qapqHrOjExMQwZMoQTTzyRJ598kuLi4jbfe91116HrOvPnz9/7jgshhBA+Ig10IYQQfvHll1+yaNEin33+vffey7p16xg4cKDPtiFauu222xg8eDCnnXZam68HBQXx+uuv09DQ0Oq1hoYGXn31VYKCgva6nRdffBEATdN46aWX9rr+EUccwfz587n99tuZO3cuBx10EL/++ivz5s1j2LBhbTby4+LiuOiii3jhhRfYtm3bXrchhBBC+II00IUQQvhcWloauq5z4403YpqmT7aRnJzMqFGjCA4O9snni5bWrFnDkiVLOPvss9H1tk8n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yAirV68eN06pVKqntb/wwgt6455//nkkJiaioKAA6enpGuepHz16VD22oaEhdHZ2orq6Gr///jvs7OyQl5eHwMBArTYHBwdRW1uL5cuXa+ysT0RENGWm7kQ3IiL6f3PzOeg3++GHHwQAneegCyFEW1ubiImJEY6OjsLExEQ4OjqKmJgYrbPKhdB9DvpHH30kVq1aJWQymTAzMxNSqVR4enqK7Oxs8c8//2i10dTUJOLi4oRMJhOmpqbC1tZWyOVykZCQIH766SeDxqw6T3ysz419rKysFCtXrhT29vZixowZYvbs2cLb21ukpqaKjo4OnfcIDAwUAISZmZm4fPmy3r709/eLrVu3CldXV2Fubi4sLS3F/fffL8LDw8VXX32ls9+GGh4eFnZ2duLpp5/WqrvxHPTx3HwO+uHDhwUA4efnN+61ERERAoAoKCgQQvz3HHTVRyKRCEtLSzFv3jyxcuVKkZmZKfr7+/W2d/DgQQFAlJSUjHtvIiKi20EixE1z/4iIiIgMsG3bNqSlpaGlpeWWbqB3pyxduhTd3d1obGxUnylPREQ0lbgGnYiIiCYlKSkJdnZ2ePfdd+90V/61qqoqnDhxAu+//z6TcyIiumOYoBMREdGkWFlZIS8vD/PmzVMfWfe/6vLly0hPT0dISMid7goREf0f4xR3IiIiIiIiommAb9CJiIiIiIiIpgEm6ERERERERETTABN0IiIiIiIiommACToRERERERHRNMAEnYiIiIiIiGgaYIJORERERERENA0wQSciIiIiIiKaBpigExEREREREU0DTNCJiIiIiIiIpgEm6ERERERERETTABN0IiIiIiIiommACToRERERERHRNMAEnYiIiIiIiGgaYIJORERERERENA38B7hiTts5LdoIAAAAAElFTkSuQmCC",
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ " Figure\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array([4.047504 , 4.3366113, 4.9148264, 4.047504 , 8.384115 , 8.673223 ,\n",
+ " 7.8059006, 8.384115 , 9.251438 , 9.251438 , 9.540545 , 8.96233 ,\n",
+ " 9.251438 , 8.96233 , 8.96233 , 8.96233 , 3.7583964, 8.673223 ,\n",
+ " 9.251438 , 8.673223 , 8.384115 , 8.96233 , 8.384115 , 8.384115 ,\n",
+ " 3.1801817, 3.469289 , 3.469289 , 3.1801817, 7.8059006, 8.095008 ,\n",
+ " 8.095008 , 8.095008 , 8.96233 , 8.673223 , 8.673223 , 8.96233 ,\n",
+ " 3.469289 , 3.469289 , 3.1801817, 2.8910742, 1.7346445, 7.8059006,\n",
+ " 7.8059006, 7.516793 , 7.8059006, 7.8059006, 7.8059006, 3.469289 ,\n",
+ " 7.227686 , 7.227686 , 7.516793 , 7.227686 , 7.227686 , 8.095008 ,\n",
+ " 8.095008 , 3.469289 , 7.8059006, 8.673223 , 8.384115 , 8.673223 ,\n",
+ " 3.1801817, 7.227686 , 6.938578 , 6.938578 ], dtype=float32)"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"\n",
"# Calcular los niveles de ruido\n",
@@ -453,10 +857,59 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 8,
"id": "00e7c619-a581-47a0-a82e-b4e13ffb0333",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'batch_size': 60000,\n",
+ " 'nblocks': 1,\n",
+ " 'Th_universal': 9,\n",
+ " 'Th_learned': 8,\n",
+ " 'do_CAR': True,\n",
+ " 'invert_sign': False,\n",
+ " 'nt': 61,\n",
+ " 'shift': None,\n",
+ " 'scale': None,\n",
+ " 'artifact_threshold': None,\n",
+ " 'nskip': 25,\n",
+ " 'whitening_range': 32,\n",
+ " 'binning_depth': 5,\n",
+ " 'sig_interp': 20,\n",
+ " 'drift_smoothing': [0.5, 0.5, 0.5],\n",
+ " 'nt0min': None,\n",
+ " 'dmin': None,\n",
+ " 'dminx': 32,\n",
+ " 'min_template_size': 10,\n",
+ " 'template_sizes': 5,\n",
+ " 'nearest_chans': 10,\n",
+ " 'nearest_templates': 100,\n",
+ " 'max_channel_distance': None,\n",
+ " 'templates_from_data': True,\n",
+ " 'n_templates': 6,\n",
+ " 'n_pcs': 6,\n",
+ " 'Th_single_ch': 6,\n",
+ " 'acg_threshold': 0.2,\n",
+ " 'ccg_threshold': 0.25,\n",
+ " 'cluster_downsampling': 20,\n",
+ " 'cluster_pcs': 64,\n",
+ " 'x_centers': None,\n",
+ " 'duplicate_spike_ms': 1.5,\n",
+ " 'do_correction': True,\n",
+ " 'keep_good_only': False,\n",
+ " 'save_extra_kwargs': False,\n",
+ " 'skip_kilosort_preprocessing': False,\n",
+ " 'scaleproc': None,\n",
+ " 'torch_device': 'auto'}"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"# limpiar la memoria de torch antes de procesar el sorter.\n",
"import torch\n",
@@ -475,13 +928,13 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 9,
"id": "c510f7bd-13e2-46e7-8d12-652fceb5eb8c",
"metadata": {},
"outputs": [],
"source": [
"from pathlib import Path\n",
- "base_name = 'Rev9'\n",
+ "base_name = 'TM24_1'\n",
"\n",
"# Single sorting\n",
"sorter_folder, analyzer_folder, phy_output_folder = create_folders(base_name)\n",
@@ -492,27 +945,27 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 12,
"id": "968ba2aa-d35c-4f67-9798-5e4f07c85f43",
"metadata": {},
"outputs": [],
"source": [
"params_kilosort4 = {## MAIN_PARAMETERS \n",
- " 'batch_size': 60000,\n",
+ " 'batch_size': 30000,\n",
" 'nblocks': 0,\n",
- " 'Th_universal': 7,\n",
- " 'Th_learned': 6,\n",
+ " 'Th_universal': 9,\n",
+ " 'Th_learned': 8,\n",
" ## Preprocessing\n",
" 'artifact_threshold': 1000,\n",
" ## SPIKE DETECTION\n",
" 'min_template_size': 10,\n",
" 'template_sizes':5,\n",
- " 'n_pcs':6,\n",
- " 'templates_from_data': True,\n",
- " 'nearest_chans': 4, \n",
+ " 'nearest_chans': 4,\n",
" 'nearest_templates': 15,\n",
" 'max_channel_distance': 60,\n",
- " 'Th_single_ch': 4,\n",
+ " 'templates_from_data': True, \n",
+ " 'n_pcs':6,\n",
+ " 'Th_single_ch': 6,\n",
" ## Clustering\n",
" #'acg_threshold':0.15,\n",
" #'cluster_downsampling':10,\n",
@@ -532,10 +985,46 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 11,
"id": "a22ef0bf-4e5f-49ab-96b7-9b442dfb8e59",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\Labcn\\AppData\\Roaming\\Python\\Python312\\site-packages\\threadpoolctl.py:1214: RuntimeWarning: \n",
+ "Found Intel OpenMP ('libiomp') and LLVM OpenMP ('libomp') loaded at\n",
+ "the same time. Both libraries are known to be incompatible and this\n",
+ "can cause random crashes or deadlocks on Linux when loaded in the\n",
+ "same Python program.\n",
+ "Using threadpoolctl may cause crashes or deadlocks. For more\n",
+ "information and possible workarounds, please see\n",
+ " https://github.com/joblib/threadpoolctl/blob/master/multiple_openmp.md\n",
+ "\n",
+ " warnings.warn(msg, RuntimeWarning)\n",
+ " 4%|███▌ | 124/2763 [02:40<57:02, 1.30s/it]\n"
+ ]
+ },
+ {
+ "ename": "KeyboardInterrupt",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[11], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m sorter \u001b[38;5;241m=\u001b[39m \u001b[43mss\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_sorter\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43msorter_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mkilosort4\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43mrecording\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mrecording\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mverbose\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\u001b[0;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43mfolder\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43msorter_folder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mremove_existing_folder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m## CUIDADO, SOBREESCRIBE LOS DATOS EN CASO DE HABER UNA CARPETA, PARA DESHABILITAR PONER =FALSE\u001b[39;49;00m\n\u001b[0;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mparams_kilosort4\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 9\u001b[0m num_clusters, total_spikes\u001b[38;5;241m=\u001b[39m espigas(sorter)\n\u001b[0;32m 10\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNúmero total de clusters: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mnum_clusters\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n",
+ "File \u001b[1;32m~\\sorter\\spikeinterface\\src\\spikeinterface\\sorters\\runsorter.py:216\u001b[0m, in \u001b[0;36mrun_sorter\u001b[1;34m(sorter_name, recording, folder, remove_existing_folder, delete_output_folder, verbose, raise_error, docker_image, singularity_image, delete_container_files, with_output, output_folder, **sorter_params)\u001b[0m\n\u001b[0;32m 205\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[0;32m 206\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe python `spython` package must be installed to \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 207\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun singularity. Install with `pip install spython`\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 208\u001b[0m )\n\u001b[0;32m 210\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m run_sorter_container(\n\u001b[0;32m 211\u001b[0m container_image\u001b[38;5;241m=\u001b[39mcontainer_image,\n\u001b[0;32m 212\u001b[0m mode\u001b[38;5;241m=\u001b[39mmode,\n\u001b[0;32m 213\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcommon_kwargs,\n\u001b[0;32m 214\u001b[0m )\n\u001b[1;32m--> 216\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrun_sorter_local\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcommon_kwargs\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[1;32m~\\sorter\\spikeinterface\\src\\spikeinterface\\sorters\\runsorter.py:276\u001b[0m, in \u001b[0;36mrun_sorter_local\u001b[1;34m(sorter_name, recording, folder, remove_existing_folder, delete_output_folder, verbose, raise_error, with_output, output_folder, **sorter_params)\u001b[0m\n\u001b[0;32m 274\u001b[0m SorterClass\u001b[38;5;241m.\u001b[39mset_params_to_folder(recording, folder, sorter_params, verbose)\n\u001b[0;32m 275\u001b[0m SorterClass\u001b[38;5;241m.\u001b[39msetup_recording(recording, folder, verbose\u001b[38;5;241m=\u001b[39mverbose)\n\u001b[1;32m--> 276\u001b[0m \u001b[43mSorterClass\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_from_folder\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfolder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mraise_error\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mverbose\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 277\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m with_output:\n\u001b[0;32m 278\u001b[0m sorting \u001b[38;5;241m=\u001b[39m SorterClass\u001b[38;5;241m.\u001b[39mget_result_from_folder(folder, register_recording\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, sorting_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n",
+ "File \u001b[1;32m~\\sorter\\spikeinterface\\src\\spikeinterface\\sorters\\basesorter.py:261\u001b[0m, in \u001b[0;36mBaseSorter.run_from_folder\u001b[1;34m(cls, output_folder, raise_error, verbose)\u001b[0m\n\u001b[0;32m 258\u001b[0m t0 \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mperf_counter()\n\u001b[0;32m 260\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 261\u001b[0m \u001b[43mSorterClass\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_run_from_folder\u001b[49m\u001b[43m(\u001b[49m\u001b[43msorter_output_folder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msorter_params\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mverbose\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 262\u001b[0m t1 \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mperf_counter()\n\u001b[0;32m 263\u001b[0m run_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mfloat\u001b[39m(t1 \u001b[38;5;241m-\u001b[39m t0)\n",
+ "File \u001b[1;32m~\\sorter\\spikeinterface\\src\\spikeinterface\\sorters\\external\\kilosort4.py:261\u001b[0m, in \u001b[0;36mKilosort4Sorter._run_from_folder\u001b[1;34m(cls, sorter_output_folder, params, verbose)\u001b[0m\n\u001b[0;32m 256\u001b[0m ops, bfile, st0 \u001b[38;5;241m=\u001b[39m compute_drift_correction(\n\u001b[0;32m 257\u001b[0m ops, device, tic0\u001b[38;5;241m=\u001b[39mtic0, progress_bar\u001b[38;5;241m=\u001b[39mprogress_bar, file_object\u001b[38;5;241m=\u001b[39mfile_object\n\u001b[0;32m 258\u001b[0m )\n\u001b[0;32m 260\u001b[0m \u001b[38;5;66;03m# Sort spikes and save results\u001b[39;00m\n\u001b[1;32m--> 261\u001b[0m st, tF, _, _ \u001b[38;5;241m=\u001b[39m \u001b[43mdetect_spikes\u001b[49m\u001b[43m(\u001b[49m\u001b[43mops\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdevice\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtic0\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtic0\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprogress_bar\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mprogress_bar\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 262\u001b[0m clu, Wall \u001b[38;5;241m=\u001b[39m cluster_spikes(st, tF, ops, device, bfile, tic0\u001b[38;5;241m=\u001b[39mtic0, progress_bar\u001b[38;5;241m=\u001b[39mprogress_bar)\n\u001b[0;32m 263\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mskip_kilosort_preprocessing\u001b[39m\u001b[38;5;124m\"\u001b[39m]:\n",
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\kilosort\\run_kilosort.py:566\u001b[0m, in \u001b[0;36mdetect_spikes\u001b[1;34m(ops, device, bfile, tic0, progress_bar)\u001b[0m\n\u001b[0;32m 564\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mExtracting spikes using templates\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 565\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m-\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m40\u001b[39m)\n\u001b[1;32m--> 566\u001b[0m st0, tF, ops \u001b[38;5;241m=\u001b[39m \u001b[43mspikedetect\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mops\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdevice\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdevice\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprogress_bar\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mprogress_bar\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 567\u001b[0m tF \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mfrom_numpy(tF)\n\u001b[0;32m 568\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(st0)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m spikes extracted in \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtime\u001b[38;5;241m.\u001b[39mtime()\u001b[38;5;241m-\u001b[39mtic\u001b[38;5;250m \u001b[39m\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m .2f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124ms; \u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m+\u001b[39m \n\u001b[0;32m 569\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtotal \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtime\u001b[38;5;241m.\u001b[39mtime()\u001b[38;5;241m-\u001b[39mtic0\u001b[38;5;250m \u001b[39m\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m .2f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124ms\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\kilosort\\spikedetect.py:252\u001b[0m, in \u001b[0;36mrun\u001b[1;34m(ops, bfile, device, progress_bar)\u001b[0m\n\u001b[0;32m 248\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ibatch \u001b[38;5;129;01min\u001b[39;00m tqdm(np\u001b[38;5;241m.\u001b[39marange(bfile\u001b[38;5;241m.\u001b[39mn_batches), miniters\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m200\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m progress_bar \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m, \n\u001b[0;32m 249\u001b[0m mininterval\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m60\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m progress_bar \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m 250\u001b[0m X \u001b[38;5;241m=\u001b[39m bfile\u001b[38;5;241m.\u001b[39mpadded_batch_to_torch(ibatch, ops)\n\u001b[1;32m--> 252\u001b[0m xy, imax, amp, adist \u001b[38;5;241m=\u001b[39m \u001b[43mtemplate_match\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mops\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43miC\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43miC2\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweigh\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdevice\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdevice\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 253\u001b[0m yct \u001b[38;5;241m=\u001b[39m yweighted(yc, iC, adist, xy, device\u001b[38;5;241m=\u001b[39mdevice)\n\u001b[0;32m 254\u001b[0m nsp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(xy)\n",
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\kilosort\\spikedetect.py:165\u001b[0m, in \u001b[0;36mtemplate_match\u001b[1;34m(X, ops, iC, iC2, weigh, device)\u001b[0m\n\u001b[0;32m 163\u001b[0m Amaxs[:,\u001b[38;5;241m-\u001b[39mnt:] \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m 164\u001b[0m Amaxs \u001b[38;5;241m=\u001b[39m max_pool1d(Amaxs\u001b[38;5;241m.\u001b[39munsqueeze(\u001b[38;5;241m0\u001b[39m), (\u001b[38;5;241m2\u001b[39m\u001b[38;5;241m*\u001b[39mnt0\u001b[38;5;241m+\u001b[39m\u001b[38;5;241m1\u001b[39m), stride \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m, padding \u001b[38;5;241m=\u001b[39m nt0)\u001b[38;5;241m.\u001b[39msqueeze(\u001b[38;5;241m0\u001b[39m)\n\u001b[1;32m--> 165\u001b[0m xy \u001b[38;5;241m=\u001b[39m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlogical_and\u001b[49m\u001b[43m(\u001b[49m\u001b[43mAmaxs\u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[43mAs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mAs\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m>\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mops\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mTh_universal\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnonzero\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 166\u001b[0m imax \u001b[38;5;241m=\u001b[39m imaxs[xy[:,\u001b[38;5;241m0\u001b[39m], xy[:,\u001b[38;5;241m1\u001b[39m]]\n\u001b[0;32m 167\u001b[0m amp \u001b[38;5;241m=\u001b[39m As[xy[:,\u001b[38;5;241m0\u001b[39m], xy[:,\u001b[38;5;241m1\u001b[39m]]\n",
+ "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
+ ]
+ }
+ ],
"source": [
"sorter = ss.run_sorter(\n",
" sorter_name='kilosort4',\n",
diff --git a/__pycache__/preprocessing_functions.cpython-312.pyc b/__pycache__/preprocessing_functions.cpython-312.pyc
index 500d96a..becacb4 100644
Binary files a/__pycache__/preprocessing_functions.cpython-312.pyc and b/__pycache__/preprocessing_functions.cpython-312.pyc differ
diff --git a/preprocessing_functions.py b/preprocessing_functions.py
index 2267e8b..bc1d58b 100644
--- a/preprocessing_functions.py
+++ b/preprocessing_functions.py
@@ -25,8 +25,7 @@ def read_rhd(rhd_folder):
print("No se encontraron archivos .rhd en la carpeta.")
return None
else:
- print(f"Leyendo {rhd_files}")
- recordings = [read_intan(file, stream_name='RHD2000 amplifier channel') for file in rhd_files]
+ recordings = [read_intan(file, stream_name='RHD2000 amplifier channel') for file in rhd_files]
if len(recordings) > 1:
recording = si.concatenate_recordings(recordings)
@@ -58,22 +57,25 @@ def get_recording(excel_file, probegroup_file):
if recording is None:
continue
-
+
list_triggers, ms_before, ms_after = process_artifacts(row.artifacts, row.data_folder, fs)
recording = prep.bandpass_filter(recording, freq_min=500., freq_max=9000.)
recording = recording.set_probegroup(probegroup, group_mode='by_probe')
- recording = prep.remove_artifacts(
- recording=recording,
- list_triggers=list_triggers,
- mode="zeros"
- )
+ if len(list_triggers) > 0:
+ recording = prep.remove_artifacts(
+ recording=recording,
+ list_triggers=list_triggers,
+ mode="zeros"
+ )
recordings.append(recording)
if len(recordings) > 1:
final_recording = si.concatenate_recordings(recordings)
- print(f"Concatenados {len(recordings)} registros.")
+ print("Concatenados los siguientes registros:")
+ for i, rec in enumerate(recordings, 1):
+ print(f"Registro {i}: {rec}")
elif recordings:
final_recording = recordings[0]
print("Solo un registro disponible para concatenar.")
@@ -107,8 +109,10 @@ def process_artifacts(artifacts, base_folder, fs):
lan_file = [lan_file for lan_file in all_files if lan_file.startswith('LAN') and lan_file.endswith('500.mat')]
if not lan_file:
- raise FileNotFoundError("No se encontró ningún archivo LAN en el directorio especificado.")
-
+ print("No se encontró ningún archivo LAN en el directorio especificado.")
+ print("\033[31mSe omite la remoción de artefactos\033[0m")
+ return [], [], [] # Retornar listas vacías y continuar
+
path_lan = os.path.join(base_folder, lan_file[0])
print (path_lan)
# Leer el archivo HDF5
@@ -148,7 +152,7 @@ def process_artifacts(artifacts, base_folder, fs):
# Tiempos antes y después del artefacto
ms_before = 0 # zero before trigger
- ms_after = 500 # 500 ms after trigger
+ ms_after = 500 # 500 ms after trigger <- punto para cambiar los segmentos que componen el artefacto.
return list_triggers, ms_before, ms_after
diff --git a/probes/Probegenerator_v3.ipynb b/probes/Probegenerator_v3.ipynb
index c16ae66..124e5b6 100644
--- a/probes/Probegenerator_v3.ipynb
+++ b/probes/Probegenerator_v3.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"id": "60bb2672-04d5-49af-9aa7-339e1bae64dd",
"metadata": {},
"outputs": [],
@@ -221,63 +221,20 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"id": "81956b71-7635-4fd0-961d-3fe3d6e9adb6",
"metadata": {},
- "outputs": [
- {
- "ename": "ModuleNotFoundError",
- "evalue": "No module named 'kilosort'",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
- "Input \u001b[1;32mIn [1]\u001b[0m, in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mkilosort\u001b[39;00m\n",
- "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'kilosort'"
- ]
- }
- ],
+ "outputs": [],
"source": [
"import kilosort"
]
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"id": "9e025135-8285-46eb-927a-3d82b251564a",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Requirement already satisfied: kilosort in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (4.0.13)\n",
- "Requirement already satisfied: numpy<2.0.0,>=1.20.0 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from kilosort) (1.26.4)\n",
- "Requirement already satisfied: scipy in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from kilosort) (1.14.0)\n",
- "Requirement already satisfied: scikit-learn in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from kilosort) (1.5.0)\n",
- "Requirement already satisfied: tqdm in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from kilosort) (4.66.4)\n",
- "Requirement already satisfied: torch>=1.6 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from kilosort) (2.3.1)\n",
- "Requirement already satisfied: numba in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from kilosort) (0.60.0)\n",
- "Requirement already satisfied: faiss-cpu in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from kilosort) (1.8.0.post1)\n",
- "Requirement already satisfied: filelock in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from torch>=1.6->kilosort) (3.13.1)\n",
- "Requirement already satisfied: typing-extensions>=4.8.0 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from torch>=1.6->kilosort) (4.11.0)\n",
- "Requirement already satisfied: sympy in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from torch>=1.6->kilosort) (1.12.1)\n",
- "Requirement already satisfied: networkx in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from torch>=1.6->kilosort) (3.2.1)\n",
- "Requirement already satisfied: jinja2 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from torch>=1.6->kilosort) (3.1.4)\n",
- "Requirement already satisfied: fsspec in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from torch>=1.6->kilosort) (2024.6.1)\n",
- "Requirement already satisfied: mkl<=2021.4.0,>=2021.1.1 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from torch>=1.6->kilosort) (2021.4.0)\n",
- "Requirement already satisfied: packaging in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from faiss-cpu->kilosort) (24.1)\n",
- "Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from numba->kilosort) (0.43.0)\n",
- "Requirement already satisfied: joblib>=1.2.0 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from scikit-learn->kilosort) (1.4.2)\n",
- "Requirement already satisfied: threadpoolctl>=3.1.0 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from scikit-learn->kilosort) (3.5.0)\n",
- "Requirement already satisfied: colorama in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from tqdm->kilosort) (0.4.6)\n",
- "Requirement already satisfied: intel-openmp==2021.* in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from mkl<=2021.4.0,>=2021.1.1->torch>=1.6->kilosort) (2021.4.0)\n",
- "Requirement already satisfied: tbb==2021.* in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from mkl<=2021.4.0,>=2021.1.1->torch>=1.6->kilosort) (2021.13.0)\n",
- "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from jinja2->torch>=1.6->kilosort) (2.1.3)\n",
- "Requirement already satisfied: mpmath<1.4.0,>=1.1.0 in c:\\users\\germa\\anaconda3\\envs\\spikeinterface\\lib\\site-packages (from sympy->torch>=1.6->kilosort) (1.3.0)\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"!pip install kilosort"
]
diff --git a/probes/TM24_probe.json b/probes/TM24_probe.json
new file mode 100644
index 0000000..2c3c4fa
--- /dev/null
+++ b/probes/TM24_probe.json
@@ -0,0 +1,1574 @@
+{
+ "specification": "probeinterface",
+ "version": "0.2.24",
+ "probes": [
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 10.0,
+ 0.0
+ ],
+ [
+ 6.123233995736766e-16,
+ 10.0
+ ],
+ [
+ -10.0,
+ 1.2246467991473533e-15
+ ],
+ [
+ -1.8369701987210296e-15,
+ -10.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 24,
+ 25,
+ 26,
+ 27
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 10.0,
+ 50.0
+ ],
+ [
+ 6.123233995736766e-16,
+ 60.0
+ ],
+ [
+ -10.0,
+ 50.0
+ ],
+ [
+ -1.8369701987210296e-15,
+ 40.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 28,
+ 29,
+ 30,
+ 31
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 60.0,
+ 0.0
+ ],
+ [
+ 50.0,
+ 10.0
+ ],
+ [
+ 40.0,
+ 1.2246467991473533e-15
+ ],
+ [
+ 50.0,
+ -10.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 0,
+ 1,
+ 2,
+ 3
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 60.0,
+ 50.0
+ ],
+ [
+ 50.0,
+ 60.0
+ ],
+ [
+ 40.0,
+ 50.0
+ ],
+ [
+ 50.0,
+ 40.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 10.0,
+ 1000.0
+ ],
+ [
+ 6.123233995736766e-16,
+ 1010.0
+ ],
+ [
+ -10.0,
+ 1000.0
+ ],
+ [
+ -1.8369701987210296e-15,
+ 990.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 20,
+ 21,
+ 22,
+ 23
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 10.0,
+ 1050.0
+ ],
+ [
+ 6.123233995736766e-16,
+ 1060.0
+ ],
+ [
+ -10.0,
+ 1050.0
+ ],
+ [
+ -1.8369701987210296e-15,
+ 1040.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 16,
+ 17,
+ 18,
+ 19
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 60.0,
+ 1000.0
+ ],
+ [
+ 50.0,
+ 1010.0
+ ],
+ [
+ 40.0,
+ 1000.0
+ ],
+ [
+ 50.0,
+ 990.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 12,
+ 13,
+ 14,
+ 15
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 60.0,
+ 1050.0
+ ],
+ [
+ 50.0,
+ 1060.0
+ ],
+ [
+ 40.0,
+ 1050.0
+ ],
+ [
+ 50.0,
+ 1040.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 8,
+ 9,
+ 10,
+ 11
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 1010.0,
+ 0.0
+ ],
+ [
+ 1000.0,
+ 10.0
+ ],
+ [
+ 990.0,
+ 1.2246467991473533e-15
+ ],
+ [
+ 1000.0,
+ -10.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 56,
+ 57,
+ 58,
+ 59
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 1010.0,
+ 50.0
+ ],
+ [
+ 1000.0,
+ 60.0
+ ],
+ [
+ 990.0,
+ 50.0
+ ],
+ [
+ 1000.0,
+ 40.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 60,
+ 61,
+ 62,
+ 63
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 1060.0,
+ 0.0
+ ],
+ [
+ 1050.0,
+ 10.0
+ ],
+ [
+ 1040.0,
+ 1.2246467991473533e-15
+ ],
+ [
+ 1050.0,
+ -10.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 32,
+ 33,
+ 34,
+ 35
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 1060.0,
+ 50.0
+ ],
+ [
+ 1050.0,
+ 60.0
+ ],
+ [
+ 1040.0,
+ 50.0
+ ],
+ [
+ 1050.0,
+ 40.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 36,
+ 37,
+ 38,
+ 39
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 1010.0,
+ 1000.0
+ ],
+ [
+ 1000.0,
+ 1010.0
+ ],
+ [
+ 990.0,
+ 1000.0
+ ],
+ [
+ 1000.0,
+ 990.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 52,
+ 53,
+ 54,
+ 55
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 1010.0,
+ 1050.0
+ ],
+ [
+ 1000.0,
+ 1060.0
+ ],
+ [
+ 990.0,
+ 1050.0
+ ],
+ [
+ 1000.0,
+ 1040.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 48,
+ 49,
+ 50,
+ 51
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 1060.0,
+ 1000.0
+ ],
+ [
+ 1050.0,
+ 1010.0
+ ],
+ [
+ 1040.0,
+ 1000.0
+ ],
+ [
+ 1050.0,
+ 990.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 44,
+ 45,
+ 46,
+ 47
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "ndim": 2,
+ "si_units": "um",
+ "annotations": {},
+ "contact_annotations": {},
+ "contact_positions": [
+ [
+ 1060.0,
+ 1050.0
+ ],
+ [
+ 1050.0,
+ 1060.0
+ ],
+ [
+ 1040.0,
+ 1050.0
+ ],
+ [
+ 1050.0,
+ 1040.0
+ ]
+ ],
+ "contact_plane_axes": [
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 1.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 1.0
+ ]
+ ]
+ ],
+ "contact_shapes": [
+ "circle",
+ "circle",
+ "circle",
+ "circle"
+ ],
+ "contact_shape_params": [
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ },
+ {
+ "radius": 6
+ }
+ ],
+ "device_channel_indices": [
+ 40,
+ 41,
+ 42,
+ 43
+ ],
+ "shank_ids": [
+ "",
+ "",
+ "",
+ ""
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/probes/__pycache__/Tetrodes.cpython-312.pyc b/probes/__pycache__/Tetrodes.cpython-312.pyc
index 84ff9dc..5acadc7 100644
Binary files a/probes/__pycache__/Tetrodes.cpython-312.pyc and b/probes/__pycache__/Tetrodes.cpython-312.pyc differ
diff --git a/sorterpipeline.ipynb b/sorterpipeline.ipynb
index 4417a57..e91988f 100644
--- a/sorterpipeline.ipynb
+++ b/sorterpipeline.ipynb
@@ -2,12 +2,20 @@
"cells": [
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"id": "1a16521b-14b7-4381-9cf3-41532d427539",
"metadata": {
"scrolled": true
},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "11:39:10 [I] klustakwik KlustaKwik2 version 0.2.6\n"
+ ]
+ }
+ ],
"source": [
"# Dependencias.\n",
"import scipy.io\n",
@@ -34,7 +42,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"id": "0d3a9305-152a-4a31-9f23-0fcc756c85ef",
"metadata": {},
"outputs": [],
@@ -91,7 +99,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"id": "32e68d41-2dfe-49a7-a3a3-243d33ce3d90",
"metadata": {},
"outputs": [],
@@ -110,10 +118,47 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "id": "92ff5fcb-ac0f-4eed-b5e7-874c50813815",
+ "execution_count": 6,
+ "id": "9e700759-04d5-4a54-a8d1-e2a2609f41fa",
"metadata": {},
"outputs": [],
+ "source": [
+ "# Configuración de archivos\n",
+ "probegroup_file = 'probes/TM24_probe.json' # Archivo de configuración del probegroup\n",
+ "\n",
+ "# Configuración de carpetas de procesamiento\n",
+ "preprocess_folder = Path('preprocess/')\n",
+ "\n",
+ "# Archivos de Excel para la información de registros\n",
+ "# como inicio se recomienda solo poner un dia en el excel de información de archivos, este es el punto de inicio para hacer una maquina de salchichas para todos los días del animal\n",
+ "excel_file_maze = r'C:\\Users\\Labcn\\OneDrive - Universidad Católica de Chile\\Datos_Ariel\\TM24\\TM24_td3\\informacion_archivos.xlsx'\n",
+ "excel_file_sleep = r'C:\\Users\\Labcn\\OneDrive - Universidad Católica de Chile\\Datos_Ariel\\TM24\\TM24_sd3\\informacion_archivos.xlsx'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "92ff5fcb-ac0f-4eed-b5e7-874c50813815",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Concatenados 6 archivos .rhd.\n",
+ "No se encontró ningún archivo LAN en el directorio especificado.\n",
+ "\u001b[31mSe omite la remoción de artefactos\u001b[0m\n",
+ "Solo un registro disponible para concatenar.\n",
+ "Procesamiento de archivos completado\n",
+ "Concatenados 18 archivos .rhd.\n",
+ "No se encontró ningún archivo LAN en el directorio especificado.\n",
+ "\u001b[31mSe omite la remoción de artefactos\u001b[0m\n",
+ "Solo un registro disponible para concatenar.\n",
+ "Procesamiento de archivos completado\n",
+ "Registros de Maze y Sueño concatenados exitosamente.\n"
+ ]
+ }
+ ],
"source": [
"# Procesar archivos\n",
"record_maze = get_recording(excel_file_maze, probegroup_file)\n",
@@ -142,11 +187,184 @@
{
"cell_type": "code",
"execution_count": null,
+ "id": "5ae5a044-8491-45ce-b6d9-4ecbcf1ab824",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "recording"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
"id": "3fe4dda9-ffe2-4489-a77c-bc39b72c87df",
"metadata": {
"scrolled": true
},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ " ConcatenateSegmentRecording: 64 channels - 20.0kHz - 1 segments - 165,742,560 samples - 8,287.13s (2.30 hours) - int16 dtype - 19.76 GiB Channel IDs['B-000' 'B-001' 'B-002' 'B-003' 'B-004' 'B-005' 'B-006' 'B-007' 'B-008'\n",
+ " 'B-009' 'B-010' 'B-011' 'B-012' 'B-013' 'B-014' 'B-015' 'B-016' 'B-017'\n",
+ " 'B-018' 'B-019' 'B-020' 'B-021' 'B-022' 'B-023' 'B-024' 'B-025' 'B-026'\n",
+ " 'B-027' 'B-028' 'B-029' 'B-030' 'B-031' 'B-032' 'B-033' 'B-034' 'B-035'\n",
+ " 'B-036' 'B-037' 'B-038' 'B-039' 'B-040' 'B-041' 'B-042' 'B-043' 'B-044'\n",
+ " 'B-045' 'B-046' 'B-047' 'B-048' 'B-049' 'B-050' 'B-051' 'B-052' 'B-053'\n",
+ " 'B-054' 'B-055' 'B-056' 'B-057' 'B-058' 'B-059' 'B-060' 'B-061' 'B-062'\n",
+ " 'B-063'] Annotations- is_filtered : True
- name : None
Channel Properties gain_to_uV [0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195 0.195\n",
+ " 0.195 0.195 0.195 0.195] offset_to_uV [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] channel_names ['B-000' 'B-001' 'B-002' 'B-003' 'B-004' 'B-005' 'B-006' 'B-007' 'B-008'\n",
+ " 'B-009' 'B-010' 'B-011' 'B-012' 'B-013' 'B-014' 'B-015' 'B-016' 'B-017'\n",
+ " 'B-018' 'B-019' 'B-020' 'B-021' 'B-022' 'B-023' 'B-024' 'B-025' 'B-026'\n",
+ " 'B-027' 'B-028' 'B-029' 'B-030' 'B-031' 'B-032' 'B-033' 'B-034' 'B-035'\n",
+ " 'B-036' 'B-037' 'B-038' 'B-039' 'B-040' 'B-041' 'B-042' 'B-043' 'B-044'\n",
+ " 'B-045' 'B-046' 'B-047' 'B-048' 'B-049' 'B-050' 'B-051' 'B-052' 'B-053'\n",
+ " 'B-054' 'B-055' 'B-056' 'B-057' 'B-058' 'B-059' 'B-060' 'B-061' 'B-062'\n",
+ " 'B-063'] contact_vector [( 2, 6.0000000e+01, 0.0000000e+00, 'circle', 6., '', '', 0, 'um', 1., 0., 0., 1.)\n",
+ " ( 2, 5.0000000e+01, 1.0000000e+01, 'circle', 6., '', '', 1, 'um', 1., 0., 0., 1.)\n",
+ " ( 2, 4.0000000e+01, 1.2246468e-15, 'circle', 6., '', '', 2, 'um', 1., 0., 0., 1.)\n",
+ " ( 2, 5.0000000e+01, -1.0000000e+01, 'circle', 6., '', '', 3, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 6.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 4, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 5.0000000e+01, 6.0000000e+01, 'circle', 6., '', '', 5, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 4.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 6, 'um', 1., 0., 0., 1.)\n",
+ " ( 3, 5.0000000e+01, 4.0000000e+01, 'circle', 6., '', '', 7, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 6.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 8, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 5.0000000e+01, 1.0600000e+03, 'circle', 6., '', '', 9, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 4.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 10, 'um', 1., 0., 0., 1.)\n",
+ " ( 7, 5.0000000e+01, 1.0400000e+03, 'circle', 6., '', '', 11, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 6.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 12, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 5.0000000e+01, 1.0100000e+03, 'circle', 6., '', '', 13, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 4.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 14, 'um', 1., 0., 0., 1.)\n",
+ " ( 6, 5.0000000e+01, 9.9000000e+02, 'circle', 6., '', '', 15, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, 1.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 16, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, 6.1232340e-16, 1.0600000e+03, 'circle', 6., '', '', 17, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, -1.0000000e+01, 1.0500000e+03, 'circle', 6., '', '', 18, 'um', 1., 0., 0., 1.)\n",
+ " ( 5, -1.8369702e-15, 1.0400000e+03, 'circle', 6., '', '', 19, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, 1.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 20, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, 6.1232340e-16, 1.0100000e+03, 'circle', 6., '', '', 21, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, -1.0000000e+01, 1.0000000e+03, 'circle', 6., '', '', 22, 'um', 1., 0., 0., 1.)\n",
+ " ( 4, -1.8369702e-15, 9.9000000e+02, 'circle', 6., '', '', 23, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, 1.0000000e+01, 0.0000000e+00, 'circle', 6., '', '', 24, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, 6.1232340e-16, 1.0000000e+01, 'circle', 6., '', '', 25, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, -1.0000000e+01, 1.2246468e-15, 'circle', 6., '', '', 26, 'um', 1., 0., 0., 1.)\n",
+ " ( 0, -1.8369702e-15, -1.0000000e+01, 'circle', 6., '', '', 27, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, 1.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 28, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, 6.1232340e-16, 6.0000000e+01, 'circle', 6., '', '', 29, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, -1.0000000e+01, 5.0000000e+01, 'circle', 6., '', '', 30, 'um', 1., 0., 0., 1.)\n",
+ " ( 1, -1.8369702e-15, 4.0000000e+01, 'circle', 6., '', '', 31, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0600000e+03, 0.0000000e+00, 'circle', 6., '', '', 32, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0500000e+03, 1.0000000e+01, 'circle', 6., '', '', 33, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0400000e+03, 1.2246468e-15, 'circle', 6., '', '', 34, 'um', 1., 0., 0., 1.)\n",
+ " (10, 1.0500000e+03, -1.0000000e+01, 'circle', 6., '', '', 35, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0600000e+03, 5.0000000e+01, 'circle', 6., '', '', 36, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0500000e+03, 6.0000000e+01, 'circle', 6., '', '', 37, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0400000e+03, 5.0000000e+01, 'circle', 6., '', '', 38, 'um', 1., 0., 0., 1.)\n",
+ " (11, 1.0500000e+03, 4.0000000e+01, 'circle', 6., '', '', 39, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0600000e+03, 1.0500000e+03, 'circle', 6., '', '', 40, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0500000e+03, 1.0600000e+03, 'circle', 6., '', '', 41, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0400000e+03, 1.0500000e+03, 'circle', 6., '', '', 42, 'um', 1., 0., 0., 1.)\n",
+ " (15, 1.0500000e+03, 1.0400000e+03, 'circle', 6., '', '', 43, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0600000e+03, 1.0000000e+03, 'circle', 6., '', '', 44, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0500000e+03, 1.0100000e+03, 'circle', 6., '', '', 45, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0400000e+03, 1.0000000e+03, 'circle', 6., '', '', 46, 'um', 1., 0., 0., 1.)\n",
+ " (14, 1.0500000e+03, 9.9000000e+02, 'circle', 6., '', '', 47, 'um', 1., 0., 0., 1.)\n",
+ " (13, 1.0100000e+03, 1.0500000e+03, 'circle', 6., '', '', 48, 'um', 1., 0., 0., 1.)\n",
+ " (13, 1.0000000e+03, 1.0600000e+03, 'circle', 6., '', '', 49, 'um', 1., 0., 0., 1.)\n",
+ " (13, 9.9000000e+02, 1.0500000e+03, 'circle', 6., '', '', 50, 'um', 1., 0., 0., 1.)\n",
+ " (13, 1.0000000e+03, 1.0400000e+03, 'circle', 6., '', '', 51, 'um', 1., 0., 0., 1.)\n",
+ " (12, 1.0100000e+03, 1.0000000e+03, 'circle', 6., '', '', 52, 'um', 1., 0., 0., 1.)\n",
+ " (12, 1.0000000e+03, 1.0100000e+03, 'circle', 6., '', '', 53, 'um', 1., 0., 0., 1.)\n",
+ " (12, 9.9000000e+02, 1.0000000e+03, 'circle', 6., '', '', 54, 'um', 1., 0., 0., 1.)\n",
+ " (12, 1.0000000e+03, 9.9000000e+02, 'circle', 6., '', '', 55, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 1.0100000e+03, 0.0000000e+00, 'circle', 6., '', '', 56, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 1.0000000e+03, 1.0000000e+01, 'circle', 6., '', '', 57, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 9.9000000e+02, 1.2246468e-15, 'circle', 6., '', '', 58, 'um', 1., 0., 0., 1.)\n",
+ " ( 8, 1.0000000e+03, -1.0000000e+01, 'circle', 6., '', '', 59, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 1.0100000e+03, 5.0000000e+01, 'circle', 6., '', '', 60, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 1.0000000e+03, 6.0000000e+01, 'circle', 6., '', '', 61, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 9.9000000e+02, 5.0000000e+01, 'circle', 6., '', '', 62, 'um', 1., 0., 0., 1.)\n",
+ " ( 9, 1.0000000e+03, 4.0000000e+01, 'circle', 6., '', '', 63, 'um', 1., 0., 0., 1.)] location [[ 6.0000000e+01 0.0000000e+00]\n",
+ " [ 5.0000000e+01 1.0000000e+01]\n",
+ " [ 4.0000000e+01 1.2246468e-15]\n",
+ " [ 5.0000000e+01 -1.0000000e+01]\n",
+ " [ 6.0000000e+01 5.0000000e+01]\n",
+ " [ 5.0000000e+01 6.0000000e+01]\n",
+ " [ 4.0000000e+01 5.0000000e+01]\n",
+ " [ 5.0000000e+01 4.0000000e+01]\n",
+ " [ 6.0000000e+01 1.0500000e+03]\n",
+ " [ 5.0000000e+01 1.0600000e+03]\n",
+ " [ 4.0000000e+01 1.0500000e+03]\n",
+ " [ 5.0000000e+01 1.0400000e+03]\n",
+ " [ 6.0000000e+01 1.0000000e+03]\n",
+ " [ 5.0000000e+01 1.0100000e+03]\n",
+ " [ 4.0000000e+01 1.0000000e+03]\n",
+ " [ 5.0000000e+01 9.9000000e+02]\n",
+ " [ 1.0000000e+01 1.0500000e+03]\n",
+ " [ 6.1232340e-16 1.0600000e+03]\n",
+ " [-1.0000000e+01 1.0500000e+03]\n",
+ " [-1.8369702e-15 1.0400000e+03]\n",
+ " [ 1.0000000e+01 1.0000000e+03]\n",
+ " [ 6.1232340e-16 1.0100000e+03]\n",
+ " [-1.0000000e+01 1.0000000e+03]\n",
+ " [-1.8369702e-15 9.9000000e+02]\n",
+ " [ 1.0000000e+01 0.0000000e+00]\n",
+ " [ 6.1232340e-16 1.0000000e+01]\n",
+ " [-1.0000000e+01 1.2246468e-15]\n",
+ " [-1.8369702e-15 -1.0000000e+01]\n",
+ " [ 1.0000000e+01 5.0000000e+01]\n",
+ " [ 6.1232340e-16 6.0000000e+01]\n",
+ " [-1.0000000e+01 5.0000000e+01]\n",
+ " [-1.8369702e-15 4.0000000e+01]\n",
+ " [ 1.0600000e+03 0.0000000e+00]\n",
+ " [ 1.0500000e+03 1.0000000e+01]\n",
+ " [ 1.0400000e+03 1.2246468e-15]\n",
+ " [ 1.0500000e+03 -1.0000000e+01]\n",
+ " [ 1.0600000e+03 5.0000000e+01]\n",
+ " [ 1.0500000e+03 6.0000000e+01]\n",
+ " [ 1.0400000e+03 5.0000000e+01]\n",
+ " [ 1.0500000e+03 4.0000000e+01]\n",
+ " [ 1.0600000e+03 1.0500000e+03]\n",
+ " [ 1.0500000e+03 1.0600000e+03]\n",
+ " [ 1.0400000e+03 1.0500000e+03]\n",
+ " [ 1.0500000e+03 1.0400000e+03]\n",
+ " [ 1.0600000e+03 1.0000000e+03]\n",
+ " [ 1.0500000e+03 1.0100000e+03]\n",
+ " [ 1.0400000e+03 1.0000000e+03]\n",
+ " [ 1.0500000e+03 9.9000000e+02]\n",
+ " [ 1.0100000e+03 1.0500000e+03]\n",
+ " [ 1.0000000e+03 1.0600000e+03]\n",
+ " [ 9.9000000e+02 1.0500000e+03]\n",
+ " [ 1.0000000e+03 1.0400000e+03]\n",
+ " [ 1.0100000e+03 1.0000000e+03]\n",
+ " [ 1.0000000e+03 1.0100000e+03]\n",
+ " [ 9.9000000e+02 1.0000000e+03]\n",
+ " [ 1.0000000e+03 9.9000000e+02]\n",
+ " [ 1.0100000e+03 0.0000000e+00]\n",
+ " [ 1.0000000e+03 1.0000000e+01]\n",
+ " [ 9.9000000e+02 1.2246468e-15]\n",
+ " [ 1.0000000e+03 -1.0000000e+01]\n",
+ " [ 1.0100000e+03 5.0000000e+01]\n",
+ " [ 1.0000000e+03 6.0000000e+01]\n",
+ " [ 9.9000000e+02 5.0000000e+01]\n",
+ " [ 1.0000000e+03 4.0000000e+01]] group [ 2 2 2 2 3 3 3 3 7 7 7 7 6 6 6 6 5 5 5 5 4 4 4 4\n",
+ " 0 0 0 0 1 1 1 1 10 10 10 10 11 11 11 11 15 15 15 15 14 14 14 14\n",
+ " 13 13 13 13 12 12 12 12 8 8 8 8 9 9 9 9]
"
+ ],
+ "text/plain": [
+ "ConcatenateSegmentRecording: 64 channels - 20.0kHz - 1 segments - 165,742,560 samples \n",
+ " 8,287.13s (2.30 hours) - int16 dtype - 19.76 GiB"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"# plot and check spikes\n",
"mode = \"line\"\n",
@@ -246,9 +464,7 @@
{
"cell_type": "markdown",
"id": "03924393-f90e-479d-a3f5-f2f51cb305f3",
- "metadata": {
- "jp-MarkdownHeadingCollapsed": true
- },
+ "metadata": {},
"source": [
"## Estimar ruido\n",
"\n",
@@ -453,10 +669,59 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 9,
"id": "00e7c619-a581-47a0-a82e-b4e13ffb0333",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'batch_size': 60000,\n",
+ " 'nblocks': 1,\n",
+ " 'Th_universal': 9,\n",
+ " 'Th_learned': 8,\n",
+ " 'do_CAR': True,\n",
+ " 'invert_sign': False,\n",
+ " 'nt': 61,\n",
+ " 'shift': None,\n",
+ " 'scale': None,\n",
+ " 'artifact_threshold': None,\n",
+ " 'nskip': 25,\n",
+ " 'whitening_range': 32,\n",
+ " 'binning_depth': 5,\n",
+ " 'sig_interp': 20,\n",
+ " 'drift_smoothing': [0.5, 0.5, 0.5],\n",
+ " 'nt0min': None,\n",
+ " 'dmin': None,\n",
+ " 'dminx': 32,\n",
+ " 'min_template_size': 10,\n",
+ " 'template_sizes': 5,\n",
+ " 'nearest_chans': 10,\n",
+ " 'nearest_templates': 100,\n",
+ " 'max_channel_distance': None,\n",
+ " 'templates_from_data': True,\n",
+ " 'n_templates': 6,\n",
+ " 'n_pcs': 6,\n",
+ " 'Th_single_ch': 6,\n",
+ " 'acg_threshold': 0.2,\n",
+ " 'ccg_threshold': 0.25,\n",
+ " 'cluster_downsampling': 20,\n",
+ " 'cluster_pcs': 64,\n",
+ " 'x_centers': None,\n",
+ " 'duplicate_spike_ms': 1.5,\n",
+ " 'do_correction': True,\n",
+ " 'keep_good_only': False,\n",
+ " 'save_extra_kwargs': False,\n",
+ " 'skip_kilosort_preprocessing': False,\n",
+ " 'scaleproc': None,\n",
+ " 'torch_device': 'auto'}"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"# limpiar la memoria de torch antes de procesar el sorter.\n",
"import torch\n",
@@ -475,13 +740,13 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 10,
"id": "c510f7bd-13e2-46e7-8d12-652fceb5eb8c",
"metadata": {},
"outputs": [],
"source": [
"from pathlib import Path\n",
- "base_name = 'Rev9'\n",
+ "base_name = 'TM24_1'\n",
"\n",
"# Single sorting\n",
"sorter_folder, analyzer_folder, phy_output_folder = create_folders(base_name)\n",
@@ -492,27 +757,27 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 11,
"id": "968ba2aa-d35c-4f67-9798-5e4f07c85f43",
"metadata": {},
"outputs": [],
"source": [
"params_kilosort4 = {## MAIN_PARAMETERS \n",
- " 'batch_size': 60000,\n",
+ " 'batch_size': 30000,\n",
" 'nblocks': 0,\n",
- " 'Th_universal': 7,\n",
- " 'Th_learned': 6,\n",
+ " 'Th_universal': 9,\n",
+ " 'Th_learned': 8,\n",
" ## Preprocessing\n",
" 'artifact_threshold': 1000,\n",
" ## SPIKE DETECTION\n",
" 'min_template_size': 10,\n",
" 'template_sizes':5,\n",
- " 'n_pcs':6,\n",
- " 'templates_from_data': True,\n",
- " 'nearest_chans': 4, \n",
+ " 'nearest_chans': 4,\n",
" 'nearest_templates': 15,\n",
" 'max_channel_distance': 60,\n",
- " 'Th_single_ch': 4,\n",
+ " 'templates_from_data': True, \n",
+ " 'n_pcs':6,\n",
+ " 'Th_single_ch': 6,\n",
" ## Clustering\n",
" #'acg_threshold':0.15,\n",
" #'cluster_downsampling':10,\n",
@@ -532,10 +797,31 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 12,
"id": "a22ef0bf-4e5f-49ab-96b7-9b442dfb8e59",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\Labcn\\AppData\\Roaming\\Python\\Python312\\site-packages\\threadpoolctl.py:1214: RuntimeWarning: \n",
+ "Found Intel OpenMP ('libiomp') and LLVM OpenMP ('libomp') loaded at\n",
+ "the same time. Both libraries are known to be incompatible and this\n",
+ "can cause random crashes or deadlocks on Linux when loaded in the\n",
+ "same Python program.\n",
+ "Using threadpoolctl may cause crashes or deadlocks. For more\n",
+ "information and possible workarounds, please see\n",
+ " https://github.com/joblib/threadpoolctl/blob/master/multiple_openmp.md\n",
+ "\n",
+ " warnings.warn(msg, RuntimeWarning)\n",
+ " 20%|███████████████▉ | 1128/5525 [09:22<36:33, 2.00it/s]\n",
+ "\n",
+ "KeyboardInterrupt\n",
+ "\n"
+ ]
+ }
+ ],
"source": [
"sorter = ss.run_sorter(\n",
" sorter_name='kilosort4',\n",
diff --git a/sorterpipeline_colabtest.ipynb b/sorterpipeline_colabtest.ipynb
deleted file mode 100644
index 4417a57..0000000
--- a/sorterpipeline_colabtest.ipynb
+++ /dev/null
@@ -1,879 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "1a16521b-14b7-4381-9cf3-41532d427539",
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "# Dependencias.\n",
- "import scipy.io\n",
- "\n",
- "%matplotlib widget\n",
- "import h5py\n",
- "import os\n",
- "import pandas as pd\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "import probeinterface as pi\n",
- "import spikeinterface as si\n",
- "import spikeinterface.widgets as sw\n",
- "import spikeinterface.sorters as ss\n",
- "import spikeinterface.exporters as exp\n",
- "import seaborn as sns # <- Para graficos estadisticos\n",
- "from preprocessing_functions import read_rhd, get_recording, check_concatenation, process_artifacts, espigas, sorting_analyzer, create_folders\n",
- "\n",
- "from pathlib import Path\n",
- "from spikeinterface.extractors import read_intan\n",
- "import spikeinterface.preprocessing as prep\n",
- "from probeinterface import Probe, ProbeGroup"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "0d3a9305-152a-4a31-9f23-0fcc756c85ef",
- "metadata": {},
- "outputs": [],
- "source": [
- "# global kwargs for parallel computing\n",
- "job_kwargs = dict(\n",
- " n_jobs=-1,\n",
- " chunk_duration='1s',\n",
- " progress_bar=True,\n",
- ")\n",
- "\n",
- "si.set_global_job_kwargs(**job_kwargs)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "f4140b07-598a-453e-b6a3-b21265267b0d",
- "metadata": {},
- "source": [
- "## Lectura y Preprocesado.\n",
- "el procesado de datos se realiza de la siguiente forma: \n",
- "```mermaid\n",
- "flowchart TD\n",
- " A[\"Datos crudos (Raw)\"] --> B[\"Filtro pasa banda (500 - 9000Hz)\"]\n",
- " B --> C[\"Incorporacion de electrodos y definición de grupos\"]\n",
- " C --> D[\"Definición de canales malos\"]\n",
- " D --> E[\"Remoción de artefactos\"]\n",
- " E --> F[\"`Guardado en formato binario (carpeta **preprocess**)`\"]\n",
- " \n",
- "```\n",
- "Algunas opciones comunes de group_mode en SpikeInterface incluyen:\n",
- "\n",
- "by_probe: Agrupa los canales o unidades según el probe (sonda) al que pertenecen. Esto es útil si se están utilizando varias sondas en el experimento.\n",
- "\n",
- "by_shank: Agrupa los canales según el shank (tallo) dentro de un probe. Esto se usa cuando un probe tiene múltiples shanks.\n",
- "\n",
- "by_electrode_group: Agrupa los canales por el grupo de electrodos. Esto permite analizar o procesar datos por grupos predefinidos de electrodos.\n",
- "\n",
- "by_channel: Trata cada canal por separado, sin agruparlos. Es útil cuando se quiere analizar cada canal de manera independiente.\n",
- "\n",
- "by_unit: Agrupa los datos según unidades individuales de spikes. Esto es útil cuando se quiere analizar características a nivel de unidades de spikes individuales en lugar de a nivel de canales.\n",
- "\n",
- "all: Agrupa todos los canales o unidades en un solo grupo, tratándolos como un conjunto único. Esto puede ser útil para obtener un análisis global del conjunto de datos."
- ]
- },
- {
- "cell_type": "markdown",
- "id": "79e7d9ac-459c-4825-a684-8f24302c774f",
- "metadata": {},
- "source": [
- "### Defición de parametros.\n",
- "para el ejemplo, se almacenan todos los pasos intermedios, estos "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "32e68d41-2dfe-49a7-a3a3-243d33ce3d90",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Configuración de archivos\n",
- "probegroup_file = 'probes/anillo_probe.json' # Archivo de configuración del probegroup\n",
- "\n",
- "# Configuración de carpetas de procesamiento\n",
- "preprocess_folder = Path('preprocess/')\n",
- "\n",
- "# Archivos de Excel para la información de registros\n",
- "# como inicio se recomienda solo poner un dia en el excel de información de archivos, este es el punto de inicio para hacer una maquina de salchichas para todos los días del animal\n",
- "excel_file_maze = r'C:\\Users\\Labcn\\OneDrive - Universidad Católica de Chile\\sorting_anillo\\input_files\\PF07\\Maze\\informacion_archivos.xlsx'\n",
- "excel_file_sleep = r'C:\\Users\\Labcn\\OneDrive - Universidad Católica de Chile\\sorting_anillo\\input_files\\PF07\\Sleep\\informacion_archivos.xlsx'"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "92ff5fcb-ac0f-4eed-b5e7-874c50813815",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Procesar archivos\n",
- "record_maze = get_recording(excel_file_maze, probegroup_file)\n",
- "record_sleep = get_recording(excel_file_sleep, probegroup_file)\n",
- "recording = check_concatenation(record_maze, record_sleep)\n",
- "\n",
- "# Crear carpeta para picos para sorting manual si es necesario\n",
- "peak_folder = Path('output/manual/peaks')\n",
- "# peak_folder.mkdir(exist_ok=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "ea9b4c41-9562-4cd9-af7e-e714c0f37931",
- "metadata": {},
- "source": [
- "### Inspeccion de los resultados.\n",
- "Revise:\n",
- "Se haya realizado el procedimiento de concatenado.\n",
- "Se removieron los artefactos.\n",
- "Nombres de los canales.\n",
- "\n",
- "importante: Con el fin de mejorar la visualización, los datos no estan escalados. Para presentarlos escalados (uV) defina return_scaled=True"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "3fe4dda9-ffe2-4489-a77c-bc39b72c87df",
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "# plot and check spikes\n",
- "mode = \"line\"\n",
- "w = sw.plot_traces(recording=recording, \n",
- " mode=mode, time_range=(0, 105), color_groups=True, return_scaled=False,\n",
- " show_channel_ids=True, order_channel_by_depth=False, backend=\"ephyviewer\")\n",
- "\n",
- "recording"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "9bb98aae-9c2f-4826-b140-93c451c02e06",
- "metadata": {},
- "source": [
- "### Eliminacion de canales.\n",
- "indique los canales a eliminar, para ello utilice el nombre (\"Channel ID\") que se le da en Intan. Observe el ejemplo.\n",
- "Confirme que se haya realizado la eliminación ejecutando la celda anterior."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "8502da2c-dd2d-4e7a-9574-9d1f1f18f1bc",
- "metadata": {},
- "outputs": [],
- "source": [
- "bad_channels =[\"A-015\", \"A-016\"]\n",
- "recording=recording.remove_channels(bad_channels)\n"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "4f5a2412-8fde-4881-be0e-175d12bda873",
- "metadata": {},
- "source": [
- "### Guardar archivos preprocesados\n",
- "Guardar archivos preprocesados como binarios."
- ]
- },
- {
- "cell_type": "markdown",
- "id": "84dc9569-c570-4dcb-b715-67e97712f065",
- "metadata": {},
- "source": [
- "#### Guardar el registro completo"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "75e2ede9-d6ef-4477-9553-cba613fd6fa0",
- "metadata": {},
- "outputs": [],
- "source": [
- "recording.save(folder=preprocess_folder, overwrite=True, **job_kwargs)\n",
- " # rec_artifacts.save(folder=preprocess_artifacts, **job_kwargs) # ejercicio para guardar registro sin la eliminaciòn de artefactos."
- ]
- },
- {
- "cell_type": "markdown",
- "id": "cf93af84-d1e6-4a13-aed0-59f59f771406",
- "metadata": {},
- "source": [
- "#### Guardar un segmento del registro"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "a338f139-2612-4936-ae1c-2702fd8031b1",
- "metadata": {},
- "outputs": [],
- "source": [
- "sliced_rec=recording.time_slice(start_time=0, end_time=2000)\n",
- "sliced_rec.save(format='binary', folder=Path('preprocess/slic3d'), overwrite=True, **job_kwargs)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "42fc8a15-6918-4408-9e5f-0386978bf96b",
- "metadata": {},
- "source": [
- "#### Leer el registro guardado"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "b962549a-ae2b-4900-9b3e-202a30b952af",
- "metadata": {},
- "outputs": [],
- "source": [
- "recording = si.load_extractor(preprocess_folder)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "03924393-f90e-479d-a3f5-f2f51cb305f3",
- "metadata": {
- "jp-MarkdownHeadingCollapsed": true
- },
- "source": [
- "## Estimar ruido\n",
- "\n",
- "Estimate noise for each channel using MAD methods (median absolute deviation). You can use standard deviation with method=”std”\n",
- "Internally it samples some chunk across segment. And then, it use MAD estimator (more robust than STD)\n",
- "\n",
- "detalle para el calculo de chunks\n",
- "```python\n",
- " random_chunks = get_random_data_chunks(recording, return_scaled=return_scaled, **random_chunk_kwargs)\n",
- "```\n",
- " \n",
- "detalle del codigo para calcular el ruido:\n",
- "```python\n",
- " if method == \"mad\":\n",
- " med = np.median(random_chunks, axis=0, keepdims=True)\n",
- " # hard-coded so that core doesn't depend on scipy\n",
- " noise_levels = np.median(np.abs(random_chunks - med), axis=0) / 0.6744897501960817\n",
- "```\n",
- " \n",
- "ref, API: https://github.com/SpikeInterface/spikeinterface/blob/a9b4c34200be91a589ad145c976c5a177ce6746e/src/spikeinterface/core/recording_tools.py#L82C5-L100\n",
- "\n",
- "interesante discusión en:\n",
- "https://github.com/SpikeInterface/spikeinterface/issues/1681"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "97e36ce4-3f4d-49ce-8408-6a4f6e8e8008",
- "metadata": {},
- "outputs": [],
- "source": [
- "\n",
- "# Calcular los niveles de ruido\n",
- "noise_levels = si.get_noise_levels(recording, return_scaled=True, method=\"mad\")\n",
- "\n",
- "# Crear una figura más grande\n",
- "fig, ax1 = plt.subplots(figsize=(10, 6))\n",
- "\n",
- "# Histograma en el primer eje (ax1)\n",
- "color_hist = 'skyblue'\n",
- "ax1.hist(noise_levels, bins='auto', color=color_hist, alpha=0.7, edgecolor='black')\n",
- "ax1.set_xlabel('Noise Level (MAD)', fontsize=14)\n",
- "ax1.set_ylabel('Frequency', fontsize=14, color=color_hist)\n",
- "ax1.tick_params(axis='y', labelcolor=color_hist)\n",
- "\n",
- "# Calcular y agregar línea vertical para la media en el primer eje\n",
- "mean_noise = np.mean(noise_levels)\n",
- "ax1.axvline(mean_noise, color='blue', linestyle='dashed', linewidth=2, label=f'Mean: {mean_noise:.2f}')\n",
- "\n",
- "# Calcular y agregar línea para la desviación estándar en el primer eje\n",
- "std_noise = np.std(noise_levels)\n",
- "ax1.axvline(mean_noise + std_noise, color='green', linestyle='dashed', linewidth=1, label=f'Std: {std_noise:.2f}')\n",
- "ax1.axvline(mean_noise - std_noise, color='green', linestyle='dashed', linewidth=1)\n",
- "\n",
- "# Agregar leyenda al primer eje\n",
- "ax1.legend()\n",
- "\n",
- "# Crear el segundo eje para la densidad (ax2) que comparte el mismo eje x\n",
- "ax2 = ax1.twinx()\n",
- "color_density = 'red'\n",
- "\n",
- "# Agregar línea de densidad con seaborn en el segundo eje\n",
- "sns.kdeplot(noise_levels, color=color_density, linewidth=2, ax=ax2)\n",
- "ax2.set_ylabel('Density', fontsize=14, color=color_density)\n",
- "ax2.tick_params(axis='y', labelcolor=color_density)\n",
- "\n",
- "# Agregar título principal\n",
- "plt.title('Noise Levels Across Channels', fontsize=16, fontweight='bold')\n",
- "\n",
- "# Mejorar los ticks del eje x\n",
- "ax1.tick_params(axis='x', labelsize=12)\n",
- "ax2.tick_params(axis='y', labelsize=12)\n",
- "\n",
- "# Agregar gridlines para mayor claridad\n",
- "ax1.grid(True, linestyle='--', alpha=0.6)\n",
- "\n",
- "# Ajustar el layout para evitar que se superpongan elementos\n",
- "plt.tight_layout()\n",
- "\n",
- "# Mostrar la gráfica\n",
- "plt.show()\n",
- "noise_levels"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "07b188a3-c16f-4a62-b126-d6b77bfbdbbf",
- "metadata": {},
- "source": [
- "## Detectar peaks\n",
- "La detección de peaks suele ser el primer paso en la clasificación de señales y consiste en encontrar peaks en los registros que podrían ser spikes reales.”\n",
- "\n",
- "Different methods are available with the method argument:\n",
- "\n",
- "‘by_channel’ (default): peaks are detected separately for each channel\n",
- "‘locally_exclusive’ (requires numba): peaks on neighboring channels within a certain radius are excluded (not counted multiple times)\n",
- "‘by_channel_torch’ (requires torch): pytorch implementation (GPU-compatible) that uses max pooling for time deduplication\n",
- "‘locally_exclusive_torch’ (requires torch): pytorch implementation (GPU-compatible) that uses max pooling for space-time deduplication\n",
- "\n",
- "**si quiere cambiar el método, debes eliminar el archivo peaks.npy antes de calcular**\n",
- "\n",
- "[lista de parametros API](https://spikeinterface.readthedocs.io/en/latest/api.html#spikeinterface.sortingcomponents.peak_detection.detect_peaks) \n",
- "referencias sobre el paso de [deteccion de espigas](https://spikeinterface.readthedocs.io/en/latest/modules/sortingcomponents.html#peak-detection)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "01a54a48-ccb6-4aca-bbcc-b1b1bd5cabe6",
- "metadata": {},
- "outputs": [],
- "source": [
- "peak_folder = Path('output/manual/peaks')\n",
- "peak_folder.mkdir(parents=True, exist_ok=True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "e8167e03-9f1e-44c9-a2ae-1cb33152cac0",
- "metadata": {},
- "outputs": [],
- "source": [
- "from spikeinterface.sortingcomponents.peak_detection import detect_peaks\n",
- "if not (peak_folder / 'peaks.npy').exists():\n",
- " peaks = detect_peaks(\n",
- " recording=recording,\n",
- " method='locally_exclusive',\n",
- " peak_sign='neg',\n",
- " detect_threshold=5, # Threshold, in median absolute deviations (MAD), to use to detect peaks\n",
- " noise_levels=noise_levels,\n",
- " **job_kwargs,\n",
- " )\n",
- " np.save(peak_folder / 'peaks.npy', peaks)\n",
- "peaks = np.load(peak_folder / 'peaks.npy')\n",
- "print(\"cantidad de eventos:\", peaks.shape)\n",
- "print(\"Tipo de peaks:\", type(peaks))\n",
- "print(\"Contenido de peaks:\", peaks)\n",
- "print(\"Tipo de datos en peaks:\", peaks.dtype)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "b062afc8-bd5e-40af-9708-b60b70fe4149",
- "metadata": {},
- "outputs": [],
- "source": [
- "from spikeinterface.sortingcomponents.peak_localization import localize_peaks\n",
- "\n",
- "# método centro de masas con largo 0.9s, 0.3 antes y 0.6 despues\n",
- "\n",
- "if not (peak_folder / 'peak_locations_center_of_mass.npy').exists():\n",
- " peak_locations = localize_peaks(\n",
- " recording=rec_fil,\n",
- " peaks=peaks,\n",
- " ms_before=0.3,\n",
- " ms_after=0.6,\n",
- " method='center_of_mass',\n",
- " **job_kwargs,\n",
- " )\n",
- " np.save(peak_folder / 'peak_locations_center_of_mass.npy', peak_locations)\n",
- " print(peak_locations.shape)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "1417dac5-b908-4e31-9dcd-7f7c943f08b4",
- "metadata": {},
- "outputs": [],
- "source": [
- "# método monopolar_triangulation\n",
- "\n",
- "if not (peak_folder / 'peak_locations_monopolar_triangulation_legacy.npy').exists():\n",
- " peak_locations = localize_peaks(\n",
- " recording=rec_fil,\n",
- " peaks=peaks,\n",
- " ms_before=0.3,\n",
- " ms_after=0.6,\n",
- " method='monopolar_triangulation',\n",
- " **job_kwargs,\n",
- " )\n",
- " np.save(peak_folder / 'peak_locations_monopolar_triangulation_legacy.npy', peak_locations)\n",
- " print(peak_locations.shape)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "c99687fb-cd6a-497c-8cf7-deef7970e281",
- "metadata": {},
- "source": [
- "## Ejecutar un sorter\n",
- "ejecutar Kilosort\n",
- "\n",
- "### revisar parametros de entrada (configuracion)\n",
- "parametros especificos para kilosort (pasables por kwargs): \n",
- "https://kilosort.readthedocs.io/en/latest/parameters.html \n",
- "https://github.com/MouseLand/Kilosort/blob/main/kilosort/parameters.py"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "00e7c619-a581-47a0-a82e-b4e13ffb0333",
- "metadata": {},
- "outputs": [],
- "source": [
- "# limpiar la memoria de torch antes de procesar el sorter.\n",
- "import torch\n",
- "torch.cuda.empty_cache()\n",
- "\n",
- "ss.get_default_sorter_params('kilosort4')"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "a20fcc41-2af7-47e2-a96b-6639d6d307e4",
- "metadata": {},
- "source": [
- "## Kilosort 4"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "c510f7bd-13e2-46e7-8d12-652fceb5eb8c",
- "metadata": {},
- "outputs": [],
- "source": [
- "from pathlib import Path\n",
- "base_name = 'Rev9'\n",
- "\n",
- "# Single sorting\n",
- "sorter_folder, analyzer_folder, phy_output_folder = create_folders(base_name)\n",
- "\n",
- "# Group sorting\n",
- "group_sorter_folder, group_analyzer_folder, group_phy_output_folder = create_folders(base_name, group=True)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "968ba2aa-d35c-4f67-9798-5e4f07c85f43",
- "metadata": {},
- "outputs": [],
- "source": [
- "params_kilosort4 = {## MAIN_PARAMETERS \n",
- " 'batch_size': 60000,\n",
- " 'nblocks': 0,\n",
- " 'Th_universal': 7,\n",
- " 'Th_learned': 6,\n",
- " ## Preprocessing\n",
- " 'artifact_threshold': 1000,\n",
- " ## SPIKE DETECTION\n",
- " 'min_template_size': 10,\n",
- " 'template_sizes':5,\n",
- " 'n_pcs':6,\n",
- " 'templates_from_data': True,\n",
- " 'nearest_chans': 4, \n",
- " 'nearest_templates': 15,\n",
- " 'max_channel_distance': 60,\n",
- " 'Th_single_ch': 4,\n",
- " ## Clustering\n",
- " #'acg_threshold':0.15,\n",
- " #'cluster_downsampling':10,\n",
- " ## extras\n",
- " #'binning_depth':4,\n",
- " #'drift_smoothing':[0.3, 0.3, 0.3],\n",
- " 'skip_kilosort_preprocessing': False,} # se crea un diccionario donde se pueden pasar las variables modificadas al sorter."
- ]
- },
- {
- "cell_type": "markdown",
- "id": "40df9d7e-f433-4a3b-a33e-08abfbc2acf2",
- "metadata": {},
- "source": [
- "### Sorting en bulto"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "a22ef0bf-4e5f-49ab-96b7-9b442dfb8e59",
- "metadata": {},
- "outputs": [],
- "source": [
- "sorter = ss.run_sorter(\n",
- " sorter_name='kilosort4',\n",
- " recording = recording,\n",
- " verbose=True,\n",
- " folder = sorter_folder,\n",
- " remove_existing_folder=True, ## CUIDADO, SOBREESCRIBE LOS DATOS EN CASO DE HABER UNA CARPETA, PARA DESHABILITAR PONER =FALSE\n",
- " **params_kilosort4)\n",
- "\n",
- "num_clusters, total_spikes= espigas(sorter)\n",
- "print(f\"Número total de clusters: {num_clusters}\")\n",
- "print(f\"Número total de espigas: {total_spikes}\")\n",
- "\n",
- "analyzer=sorting_analyzer(sorter, recording, output_folder=analyzer_folder)\n",
- "\n",
- "exp.export_to_phy(sorting_analyzer=analyzer, \n",
- " remove_if_exists=True, \n",
- " copy_binary=True, \n",
- " output_folder=phy_output_folder)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "d9f26e72-5f02-405b-bc6a-e6c956704894",
- "metadata": {},
- "source": [
- "### Sorting por grupo : Automatic splitting"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "3a22a06f-c7b2-4341-888a-f155a0cb5119",
- "metadata": {},
- "outputs": [],
- "source": [
- "group_sorter = ss.run_sorter_by_property(\n",
- " sorter_name='kilosort4',\n",
- " recording = recording,\n",
- " grouping_property='group',\n",
- " verbose=True,\n",
- " folder = group_sorter_folder,\n",
- " remove_existing_folder=True, ## CUIDADO, SOBREESCRIBE LOS DATOS EN CASO DE HABER UNA CARPETA, PARA DESHABILITAR PONER =FALSE\n",
- " **params_kilosort4)\n",
- "\n",
- "num_clusters, total_spikes= espigas(group_sorter)\n",
- "print(f\"Número total de clusters: {num_clusters}\")\n",
- "print(f\"Número total de espigas: {total_spikes}\")\n",
- "\n",
- "group_analyzer=sorting_analyzer(group_sorter, recording, output_folder=group_analyzer_folder)\n",
- "\n",
- "exp.export_to_phy(sorting_analyzer=group_analyzer, \n",
- " remove_if_exists=True, \n",
- " copy_binary=True, \n",
- " output_folder=group_phy_output_folder) "
- ]
- },
- {
- "cell_type": "markdown",
- "id": "4258b7de-89dd-4bee-baee-e69824680d32",
- "metadata": {},
- "source": [
- "### Sorting por grupo : Manual splitting (en desarrollo)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "770a2908-a11d-43d5-8652-6bdcf8eeac78",
- "metadata": {},
- "source": [
- "El enfoque implementado tiene como objetivo mejorar el rendimiento del spike sorting al segmentar el proceso por grupos de canales o regiones de la grabación. Al realizar el spike sorting por partes, se reduce significativamente la demanda de memoria y el uso de GPU en cada ejecución. Esto es especialmente útil cuando se trabaja con grabaciones de gran tamaño o cuando la capacidad de la GPU es limitada.\n",
- "\n",
- "Dividiendo el registro en grupos, el sorter puede operar en fragmentos más pequeños, lo que permite manejar mejor los recursos del sistema y evitar problemas como errores de \"out of memory\" (falta de memoria). Después de realizar el spike sorting por grupos, los resultados se combinan, permitiendo un análisis y exportación global sin sacrificar la eficiencia durante el proceso de clasificación inicial.\n",
- "\n",
- "Este enfoque balancea el uso de recursos, optimizando el uso de la GPU sin comprometer la calidad del análisis final."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "0e76555d-dc7a-43f7-af64-cd1be41e235a",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Dividir la grabación por grupos\n",
- "split_recording = recording.split_by(\"group\")\n",
- "\n",
- "# Diccionario para almacenar los resultados de sorting por grupo\n",
- "sortings = {}\n",
- "\n",
- "# Ejecutar el sorter en cada grupo\n",
- "for group, sub_recording in split_recording.items():\n",
- " sorting = run_sorter(\n",
- " sorter_name='kilosort4',\n",
- " recording=sub_recording, # Usar la subgrabación del grupo\n",
- " output_folder=f\"fKS4_group{group}\"\n",
- " )\n",
- " sortings[group] = sorting # Almacenar los resultados del sorter para este grupo\n",
- "\n",
- "# Combinar los resultados de sorting de todos los grupos\n",
- "combined_sorting = si.concatenate_sortings(*sortings.values())\n",
- "\n",
- "# Información de clusters y espigas para cada grupo\n",
- "num_clusters, total_spikes = espigas(combined_sorting)\n",
- "print(f\" Número total de clusters: {num_clusters}\")\n",
- "print(f\" Número total de espigas: {total_spikes}\")\n",
- "\n",
- "# Realizar análisis global con el sorting combinado\n",
- "combined_analyzer = sorting_analyzer(combined_sorting, recording, output_folder='combined_analyzer_folder')\n",
- "\n",
- "# Exportar los resultados globales a Phy\n",
- "exp.export_to_phy(sorting=combined_analyzer, # Sorting combinado\n",
- " recording=recording, # Grabación completa\n",
- " remove_if_exists=True,\n",
- " copy_binary=True,\n",
- " output_folder='combined_phy_output_folder')\n"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "9a6c810e-a8dc-4cca-96de-abe8b43ea875",
- "metadata": {},
- "source": [
- "## inspeccion en grafico"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "2da393de-3376-4b3a-89f3-c35f19adb28b",
- "metadata": {},
- "source": [
- "### leer un analisis"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "81cbc069-2452-4ab6-8b24-6dfda650256b",
- "metadata": {},
- "outputs": [],
- "source": [
- "\n",
- "folder = 'output/AN/kilosort/analyzer_Rev9'\n",
- "analyzer = si.load_sorting_analyzer(folder)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "6b6facf1-61dd-442e-8b14-06b05ac87b94",
- "metadata": {},
- "outputs": [],
- "source": [
- "exp.export_to_phy(sorting_analyzer=analyzer, \n",
- " remove_if_exists=True, \n",
- " copy_binary=True, \n",
- " output_folder=Path('output/AN/kilosort/phy_rev9v2'))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9d6d0056-9fc6-4496-b6e1-c98c5bc9ce95",
- "metadata": {},
- "outputs": [],
- "source": [
- "import spikeinterface.widgets as sw\n",
- "\n",
- "sw.plot_spikes_on_traces(sorting_analyzer= analyzer, \n",
- " segment_index=None, \n",
- " channel_ids=None, \n",
- " unit_ids=None, \n",
- " order_channel_by_depth=False, \n",
- " time_range=None, \n",
- " unit_colors=None, \n",
- " sparsity=None, \n",
- " mode='auto', \n",
- " return_scaled=False, \n",
- " cmap='RdBu', \n",
- " show_channel_ids=False, \n",
- " color_groups=False, \n",
- " color=None, \n",
- " clim=None, \n",
- " tile_size=512, \n",
- " seconds_per_row=0.2, \n",
- " scale=1, \n",
- " spike_width_ms=4, \n",
- " spike_height_um=20, \n",
- " with_colorbar=True, \n",
- " backend=\"ipywidgets\")\n"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "7f84050f-d495-4c88-9a9c-ac8b169e4ff7",
- "metadata": {},
- "source": [
- "## Unit quality metrics"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "1e6abfd0-23d2-4d20-bdc0-18653aad0e99",
- "metadata": {},
- "outputs": [],
- "source": [
- "from spikeinterface.postprocessing import compute_principal_components\n",
- "from spikeinterface.qualitymetrics import compute_quality_metrics, get_quality_metric_list"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "d906c4b1-dc32-4894-bcc0-ed2382a08fca",
- "metadata": {},
- "outputs": [],
- "source": [
- "get_quality_metric_list()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "c15fe736-d828-486e-96bc-21b0f1e990a9",
- "metadata": {},
- "outputs": [],
- "source": [
- "metrics = compute_quality_metrics(analyzer, metric_names=[\"snr\", \"isi_violation\", \"nearest_neighbor\", \"firing_rate\", 'presence_ratio', 'amplitude_cutoff'])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "a4d0fcd5-eb7b-4a1f-999a-5ec2e4db3d9b",
- "metadata": {},
- "outputs": [],
- "source": [
- "print (metrics)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "e9b4dda3-81c6-4158-b568-d90645db1c53",
- "metadata": {},
- "outputs": [],
- "source": [
- "keep_mask = (metrics[\"amplitude_cutoff\"] < 1e-6)\n",
- "print(keep_mask)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "510e15fb-115d-46c5-be33-f3baa4c6d089",
- "metadata": {},
- "outputs": [],
- "source": [
- "keep_unit_ids = keep_mask[keep_mask].index.values\n",
- "keep_unit_ids = [unit_id for unit_id in keep_unit_ids]\n",
- "print(keep_unit_ids)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "e0c0af91-b06b-40bc-91d5-0e10cf0703f4",
- "metadata": {},
- "outputs": [],
- "source": [
- "from scipy.ndimage.filters import gaussian_filter1d\n",
- "plt.rcParams.update({'font.size': 14})\n",
- "\n",
- "def plot_metric(data, bins, x_axis_label, color, max_value=-1):\n",
- " \n",
- " h, b = np.histogram(data, bins=bins, density=True)\n",
- "\n",
- " x = b[:-1]\n",
- " y = gaussian_filter1d(h, 1)\n",
- "\n",
- " plt.plot(x, y, color=color)\n",
- " plt.xlabel(x_axis_label)\n",
- " plt.gca().get_yaxis().set_visible(False)\n",
- " [plt.gca().spines[loc].set_visible(False) for loc in ['right', 'top', 'left']]\n",
- " if max_value < np.max(y) * 1.1:\n",
- " max_value = np.max(y) * 1.1\n",
- " plt.ylim([0, max_value])\n",
- " \n",
- " return max_value"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "99de07c7-e341-41ab-9795-9c5516e9a888",
- "metadata": {},
- "outputs": [],
- "source": [
- "ss.get_default_sorter_params('spykingcircus2')\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "d1e0f0a4-2a70-4840-a467-233fc57220b8",
- "metadata": {},
- "outputs": [],
- "source": [
- "sorter_spykingcircus2 = ss.run_sorter(\n",
- " sorter_name='spykingcircus2',\n",
- " recording = rec_fil,\n",
- " verbose=True,\n",
- " folder = 'output/spykingcircus2',\n",
- " remove_existing_folder=True ## CUIDADO, SOBREESCRIBE LOS DATOS EN CASO DE HABER UNA CARPETA, PARA DESHABILITAR PONER =FALSE\n",
- " )"
- ]
- }
- ],
- "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.12.4"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
|