From 13d334124682181f0b37e31f13fcf66485658d6e Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Tue, 14 May 2024 16:28:21 +0100 Subject: [PATCH 01/83] Reorganise to ephys and behav at swc pages. --- docs/source/behav_at_swc/HPC-module-SLEAP.md | 612 ++++++++++++++++++ .../{data_analysis => behav_at_swc}/index.md | 0 .../HPC-module-SLEAP.md | 0 docs/source/ephys_at_swc/index.md | 9 + docs/source/index.md | 22 +- 5 files changed, 635 insertions(+), 8 deletions(-) create mode 100644 docs/source/behav_at_swc/HPC-module-SLEAP.md rename docs/source/{data_analysis => behav_at_swc}/index.md (100%) rename docs/source/{data_analysis => ephys_at_swc}/HPC-module-SLEAP.md (100%) create mode 100644 docs/source/ephys_at_swc/index.md diff --git a/docs/source/behav_at_swc/HPC-module-SLEAP.md b/docs/source/behav_at_swc/HPC-module-SLEAP.md new file mode 100644 index 0000000..8090456 --- /dev/null +++ b/docs/source/behav_at_swc/HPC-module-SLEAP.md @@ -0,0 +1,612 @@ +# Use the SLEAP module on the SWC HPC cluster + +```{include} ../_static/swc-wiki-warning.md +``` + +```{include} ../_static/code-blocks-note.md +``` + +## Abbreviations +| Acronym | Meaning | +| --------------------------------------------------------------- | -------------------------------------------- | +| [SLEAP](https://sleap.ai/) | Social LEAP Estimates Animal Poses | +| [SWC](https://www.sainsburywellcome.org/web/) | Sainsbury Wellcome Centre | +| [HPC](https://en.wikipedia.org/wiki/High-performance_computing) | High Performance Computing | +| [GUI](https://en.wikipedia.org/wiki/Graphical_user_interface) | Graphical User Interface | +| [SLURM](https://slurm.schedmd.com/) | Simple Linux Utility for Resource Management | + +## Prerequisites + +### Access to the HPC cluster +Verify that you can access HPC gateway node (typing your `` both times when prompted): +```{code-block} console +$ ssh @ssh.swc.ucl.ac.uk +$ ssh hpc-gw1 +``` +To learn more about accessing the HPC via SSH, see the [relevant how-to guide](ssh-cluster-target). + +### Access to the SLEAP module +Once you are on the HPC gateway node, SLEAP should be listed among the available modules when you run `module avail`: + +```{code-block} console +$ module avail +... +SLEAP/2023-03-13 +SLEAP/2023-08-01 +... +``` +- `SLEAP/2023-03-13` corresponds to `SLEAP v.1.2.9` +- `SLEAP/2023-08-01` corresponds to `SLEAP v.1.3.1` + +We recommend always using the latest version, which is the one loaded by default +when you run `module load SLEAP`. If you want to load a specific version, +you can do so by typing the full module name, +including the date e.g. `module load SLEAP/2023-03-13`. + +If a module has been successfully loaded, it will be listed when you run `module list`, +along with other modules it may depend on: + +```{code-block} console +$ module list +Currently Loaded Modulefiles: + 1) cuda/11.8 2) SLEAP/2023-08-01 +``` + +If you have troubles with loading the SLEAP module, +see this guide's [Troubleshooting section](#problems-with-the-sleap-module). + + +### Install SLEAP on your local PC/laptop +While you can delegate the GPU-intensive work to the HPC cluster, +you will need to use the SLEAP GUI for some steps, such as labelling frames. +Thus, you also need to install SLEAP on your local PC/laptop. + +We recommend following the official [SLEAP installation guide](https://sleap.ai/installation.html). If you already have `conda` installed, you may skip the `mamba` installation steps and opt for installing the `libmamba-solver` for `conda`: + +```{code-block} console +$ conda install -n base conda-libmamba-solver +$ conda config --set solver libmamba +``` +This will get you the much faster dependency resolution that `mamba` provides, without having to install `mamba` itself. +From `conda` version 23.10 onwards (released in November 2023), `libmamba-solver` [is anyway the default](https://conda.org/blog/2023-11-06-conda-23-10-0-release/). + +After that, you can follow the [rest of the SLEAP installation guide](https://sleap.ai/installation.html#conda-package), substituting `conda` for `mamba` in the relevant commands. + +::::{tab-set} + +:::{tab-item} Windows and Linux +```{code-block} console +$ conda create -y -n sleap -c conda-forge -c nvidia -c sleap -c anaconda sleap=1.3.1 +``` +::: + +:::{tab-item} MacOS X and Apple Silicon +```{code-block} console +$ conda create -y -n sleap -c conda-forge -c anaconda -c sleap sleap=1.3.1 +``` +::: + +:::: + +You may exchange `sleap=1.3.1` for other versions. To be on the safe side, ensure that your local installation version matches (or is at least close to) the one installed in the cluster module. + +### Mount the SWC filesystem on your local PC/laptop +The rest of this guide assumes that you have mounted the SWC filesystem on your local PC/laptop. +If you have not done so, please follow the relevant instructions on the +[SWC internal wiki](https://wiki.ucl.ac.uk/display/SSC/SWC+Storage+Platform+Overview). + +We will also assume that the data you are working with are stored in a `ceph` +directory to which you have access to. In the rest of this guide, we will use the path +`/ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data` which contains a SLEAP project +for test purposes. You should replace this with the path to your own data. + +:::{dropdown} Data storage location matters +:color: warning +:icon: alert-fill + +The cluster has fast access to data stored on the `ceph` filesystem, so if your +data is stored elsewhere, make sure to transfer it to `ceph` before running the job. +You can use tools such as [`rsync`](https://linux.die.net/man/1/rsync) +to copy data from your local machine to `ceph` via an ssh connection. For example: + +```{code-block} console +$ rsync -avz @ssh.swc.ucl.ac.uk:/ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data +``` +::: + +## Model training +This will consist of two parts - [preparing a training job](#prepare-the-training-job) +(on your local SLEAP installation) and [running a training job](#run-the-training-job) +(on the HPC cluster's SLEAP module). Some evaluation metrics for the trained models +can be [viewed via the SLEAP GUI](#evaluate-the-trained-models) on your local SLEAP installation. + +### Prepare the training job +Follow the SLEAP instructions for [Creating a Project](https://sleap.ai/tutorials/new-project.html) +and [Initial Labelling](https://sleap.ai/tutorials/initial-labeling.html). +Ensure that the project file (e.g. `labels.v001.slp`) is saved in the mounted SWC filesystem +(as opposed to your local filesystem). + +Next, follow the instructions in [Remote Training](https://sleap.ai/guides/remote.html#remote-training), +i.e. *Predict* -> *Run Training…* -> *Export Training Job Package…*. +- For selecting the right configuration parameters, see [Configuring Models](https://sleap.ai/guides/choosing-models.html#) and [Troubleshooting Workflows](https://sleap.ai/guides/troubleshooting-workflows.html) +- Set the *Predict On* parameter to *nothing*. Remote training and inference (prediction) are easiest to run separately on the HPC Cluster. Also unselect *Visualize Predictions During Training* in training settings, if it's enabled by default. +- If you are working with camera view from above or below (as opposed to a side view), set the *Rotation Min Angle* and *Rotation Max Angle* to -180 and 180 respectively in the *Augmentation* section. +- Make sure to save the exported training job package (e.g. `labels.v001.slp.training_job.zip`) in the mounted SWC filesystem, for example, in the same directory as the project file. +- Unzip the training job package. This will create a folder with the same name (minus the `.zip` extension). This folder contains everything needed to run the training job on the HPC cluster. + +### Run the training job +Login to the HPC cluster as described above. +```{code-block} console +$ ssh @ssh.swc.ucl.ac.uk +$ ssh hpc-gw1 +``` +Navigate to the training job folder (replace with your own path) and list its contents: +```{code-block} console +:emphasize-lines: 12 +$ cd /ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data +$ cd labels.v001.slp.training_job +$ ls -1 +centered_instance.json +centroid.json +inference-script.sh +jobs.yaml +labels.v001.pkg.slp +labels.v001.slp.predictions.slp +train_slurm.sh +swc-hpc-pose-estimation +train-script.sh +``` +There should be a `train-script.sh` file created by SLEAP, which already contains the +commands to run the training. You can see the contents of the file by running `cat train-script.sh`: +```{code-block} bash +:caption: labels.v001.slp.training_job/train-script.sh +:name: train-script-sh +:linenos: +#!/bin/bash +sleap-train centroid.json labels.v001.pkg.slp +sleap-train centered_instance.json labels.v001.pkg.slp +``` +The precise commands will depend on the model configuration you chose in SLEAP. +Here we see two separate training calls, one for the 'centroid' and another for +the 'centered_instance' model. That's because in this example we have chosen +the ['Top-Down'](https://sleap.ai/tutorials/initial-training.html#training-options) +configuration, which consists of two neural networks - the first for isolating +the animal instances (by finding their centroids) and the second for predicting +all the body parts per instance. + +![Top-Down model configuration](https://sleap.ai/_images/topdown_approach.jpg) + +:::{dropdown} More on 'Top-Down' vs 'Bottom-Up' models +:color: info +:icon: info + +Although the 'Top-Down' configuration was designed with multiple animals in mind, +it can also be used for single-animal videos. It makes sense to use it for videos +where the animal occupies a relatively small portion of the frame - see +[Troubleshooting Workflows](https://sleap.ai/guides/troubleshooting-workflows.html) for more info. +::: + +Next you need to create a SLURM batch script, which will schedule the training job +on the HPC cluster. Create a new file called `train_slurm.sh` +(you can do this in the terminal with `nano`/`vim` or in a text editor of +your choice on your local PC/laptop). Here we create the script in the same folder +as the training job, but you can save it anywhere you want, or even keep track of it with `git`. + +```{code-block} console +$ nano train_slurm.sh +``` + +An example is provided below, followed by explanations. +```{code-block} bash +:caption: train_slurm.sh +:name: train-slurm-sh +:linenos: +#!/bin/bash + +#SBATCH -J slp_train # job name +#SBATCH -p gpu # partition (queue) +#SBATCH -N 1 # number of nodes +#SBATCH --mem 32G # memory pool for all cores +#SBATCH -n 8 # number of cores +#SBATCH -t 0-06:00 # time (D-HH:MM) +#SBATCH --gres gpu:1 # request 1 GPU (of any kind) +#SBATCH -o slurm.%x.%N.%j.out # STDOUT +#SBATCH -e slurm.%x.%N.%j.err # STDERR +#SBATCH --mail-type=ALL +#SBATCH --mail-user=user@domain.com + +# Load the SLEAP module +module load SLEAP + +# Define directories for SLEAP project and exported training job +SLP_DIR=/ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data +SLP_JOB_NAME=labels.v001.slp.training_job +SLP_JOB_DIR=$SLP_DIR/$SLP_JOB_NAME + +# Go to the job directory +cd $SLP_JOB_DIR + +# Run the training script generated by SLEAP +./train-script.sh +``` + +In `nano`, you can save the file by pressing `Ctrl+O` and exit by pressing `Ctrl+X`. + +:::{dropdown} Explanation of the batch script +:color: info +:icon: info +- The `#SBATCH` lines are SLURM directives. They specify the resources needed +for the job, such as the number of nodes, CPUs, memory, etc. +A primer on the most useful SLURM arguments is provided in this [how-to guide](slurm-arguments-target). +For more information see the [SLURM documentation](https://slurm.schedmd.com/sbatch.html). + +- The `#` lines are comments. They are not executed by SLURM, but they are useful +for explaining the script to your future self and others. + +- The `module load SLEAP` line loads the latest SLEAP module and any other modules +it may depend on. + +- The `cd` line changes the working directory to the training job folder. +This is necessary because the `train-script.sh` file contains relative paths +to the model configuration and the project file. + +- The `./train-script.sh` line runs the training job (executes the contained commands). +::: + +:::{warning} +Before submitting the job, ensure that you have permissions to execute +both the batch script and the training script generated by SLEAP. +You can make these files executable by running in the terminal: + +```{code-block} console +$ chmod +x train-script.sh +$ chmod +x train_slurm.sh +``` + +If the scripts are not in your working directory, you will need to specify their full paths: + +```{code-block} console +$ chmod +x /path/to/train-script.sh +$ chmod +x /path/to/train_slurm.sh +``` +::: + +Now you can submit the batch script via running the following command +(in the same directory as the script): +```{code-block} console +$ sbatch train_slurm.sh +Submitted batch job 3445652 +``` + +You may monitor the progress of the job in various ways: + +::::{tab-set} + +:::{tab-item} squeue + +View the status of the queued/running jobs with [`squeue`](https://slurm.schedmd.com/squeue.html): + +```{code-block} console +$ squeue --me +JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) +3445652 gpu slp_train sirmpila R 23:11 1 gpu-sr670-20 +``` +::: + +:::{tab-item} sacct + +View status of running/completed jobs with [`sacct`](https://slurm.schedmd.com/sacct.html): + +```{code-block} console +$ sacct +JobID JobName Partition Account AllocCPUS State ExitCode +------------ ---------- ---------- ---------- ---------- ---------- -------- +3445652 slp_train gpu swc-ac 2 COMPLETED 0:0 +3445652.bat+ batch swc-ac 2 COMPLETED 0:0 +``` +Run `sacct` with some more helpful arguments. +For example, you can view jobs from the last 24 hours, displaying the time +elapsed and the peak memory usage in KB (MaxRSS): + +```{code-block} console +$ sacct \ + --starttime $(date -d '24 hours ago' +%Y-%m-%dT%H:%M:%S) \ + --endtime $(date +%Y-%m-%dT%H:%M:%S) \ + --format=JobID,JobName,Partition,State,Start,Elapsed,MaxRSS + +JobID JobName Partition State Start Elapsed MaxRSS +------------ ---------- ---------- ---------- ------------------- ---------- ---------- +4043595 slp_infer gpu FAILED 2023-10-10T18:14:31 00:00:35 +4043595.bat+ batch FAILED 2023-10-10T18:14:31 00:00:35 271104K +4043603 slp_infer gpu FAILED 2023-10-10T18:27:32 00:01:37 +4043603.bat+ batch FAILED 2023-10-10T18:27:32 00:01:37 423476K +4043611 slp_infer gpu PENDING Unknown 00:00:00 +``` +::: + +:::{tab-item} view the logs + +View the contents of standard output and error +(the node name and job ID will differ in each case): +```{code-block} console +$ cat slurm.gpu-sr670-20.3445652.out +$ cat slurm.gpu-sr670-20.3445652.err +``` +::: + +:::: + +```{dropdown} Out-of-memory (OOM) errors +:color: warning +:icon: alert-fill + +If you encounter out-of-memory errors, keep in mind that there two main sources of memory usage: +- CPU memory (RAM), specified via the `--mem` argument in the SLURM batch script. This is the memory used by the Python process running the training job and is shared among all the CPU cores. +- GPU memory, this is the memory used by the GPU card(s) and depends on the GPU card type you requested via the `--gres gpu:1` argument in the SLURM batch script. To increase it, you can request a specific GPU card type with more GPU memory (e.g. `--gres gpu:a4500:1`). The SWC wiki provides a [list of all GPU card types and their specifications](https://wiki.ucl.ac.uk/display/SSC/CPU+and+GPU+Platform+architecture). +- If requesting more memory doesn't help, you can try reducing the size of your SLEAP models. You may tweak the model backbone architecture, or play with *Input scaling*, *Max stride* and *Batch size*. See SLEAP's [documentation](https://sleap.ai/) and [discussion forum](https://github.com/talmolab/sleap/discussions) for more details. +``` + +### Evaluate the trained models +Upon successful completion of the training job, a `models` folder will have +been created in the training job directory. It contains one subfolder per +training run (by default prefixed with the date and time of the run). + +```{code-block} console +$ cd /ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data +$ cd labels.v001.slp.training_job +$ cd models +$ ls -1 +230509_141357.centered_instance +230509_141357.centroid +``` + +Each subfolder holds the trained model files (e.g. `best_model.h5`), +their configurations (`training_config.json`) and some evaluation metrics. + +```{code-block} console +$ cd 230509_141357.centered_instance +$ ls -1 +best_model.h5 +initial_config.json +labels_gt.train.slp +labels_gt.val.slp +labels_pr.train.slp +labels_pr.val.slp +metrics.train.npz +metrics.val.npz +training_config.json +training_log.csv +``` +The SLEAP GUI on your local machine can be used to quickly evaluate the trained models. + +- Select *Predict* -> *Evaluation Metrics for Trained Models...* +- Click on *Add Trained Models(s)* and select the folder containing the model(s) you want to evaluate. +- You can view the basic metrics on the shown table or you can also view a more detailed report (including plots) by clicking *View Metrics*. + +For more detailed evaluation metrics, you can refer to [SLEAP's model evaluation notebook](https://sleap.ai/notebooks/Model_evaluation.html). + +## Model inference +By inference, we mean using a trained model to predict the labels on new frames/videos. +SLEAP provides the [`sleap-track`](https://sleap.ai/guides/cli.html?#inference-and-tracking) command line utility for running inference +on a single video or a folder of videos. + +Below is an example SLURM batch script that contains a `sleap-track` call. +```{code-block} bash +:caption: infer_slurm.sh +:name: infer-slurm-sh +:linenos: +#!/bin/bash + +#SBATCH -J slp_infer # job name +#SBATCH -p gpu # partition +#SBATCH -N 1 # number of nodes +#SBATCH --mem 64G # memory pool for all cores +#SBATCH -n 16 # number of cores +#SBATCH -t 0-02:00 # time (D-HH:MM) +#SBATCH --gres gpu:rtx5000:1 # request 1 GPU (of a specific kind) +#SBATCH -o slurm.%x.%N.%j.out # write STDOUT +#SBATCH -e slurm.%x.%N.%j.err # write STDERR +#SBATCH --mail-type=ALL +#SBATCH --mail-user=user@domain.com + +# Load the SLEAP module +module load SLEAP + +# Define directories for SLEAP project and exported training job +SLP_DIR=/ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data +VIDEO_DIR=$SLP_DIR/videos +SLP_JOB_NAME=labels.v001.slp.training_job +SLP_JOB_DIR=$SLP_DIR/$SLP_JOB_NAME + +# Go to the job directory +cd $SLP_JOB_DIR +# Make a directory to store the predictions +mkdir -p predictions + +# Run the inference command +sleap-track $VIDEO_DIR/M708149_EPM_20200317_165049331-converted.mp4 \ + -m $SLP_JOB_DIR/models/231010_164307.centroid/training_config.json \ + -m $SLP_JOB_DIR/models/231010_164307.centered_instance/training_config.json \ + --gpu auto \ + --tracking.tracker simple \ + --tracking.similarity centroid \ + --tracking.post_connect_single_breaks 1 \ + -o predictions/labels.v001.slp.predictions.slp \ + --verbosity json \ + --no-empty-frames +``` +The script is very similar to the training script, with the following differences: +- The time limit `-t` is set lower, since inference is normally faster than training. This will however depend on the size of the video and the number of models used. +- The requested number of cores `n` and memory `--mem` are higher. This will depend on the requirements of the specific job you are running. It's best practice to try with a scaled-down version of your data first, to get an idea of the resources needed. +- The requested GPU is of a specific kind (RTX 5000). This will again depend on the requirements of your job, as the different GPU kinds vary in GPU memory size and compute capabilities (see [the SWC wiki](https://wiki.ucl.ac.uk/display/SSC/CPU+and+GPU+Platform+architecture)). +- The `./train-script.sh` line is replaced by the `sleap-track` command. +- The `\` character is used to split the long `sleap-track` command into multiple lines for readability. It is not necessary if the command is written on a single line. + +::: {dropdown} Explanation of the sleap-track arguments +:color: info +:icon: info + + Some important command line arguments are explained below. + You can view a full list of the available arguments by running `sleap-track --help`. +- The first argument is the path to the video file to be processed. +- The `-m` option is used to specify the path to the model configuration file(s) to be used for inference. In this example we use the two models that were trained above. +- The `--gpu` option is used to specify the GPU to be used for inference. The `auto` value will automatically select the GPU with the highest percentage of available memory (of the GPUs that are available on the machine/node) +- The options starting with `--tracking` specify parameters used for tracking the detected instances (animals) across frames. See SLEAP's guide on [tracking methods](https://sleap.ai/guides/proofreading.html#tracking-method-details) for more info. +- The `-o` option is used to specify the path to the output file containing the predictions. +- The above script will predict all the frames in the video. You may select specific frames via the `--frames` option. For example: `--frames 1-50` or `--frames 1,3,5,7,9`. +::: + +You can submit and monitor the inference job in the same way as the training job. +```{code-block} console +$ sbatch infer_slurm.sh +$ squeue --me +``` +Upon completion, a `labels.v001.slp.predictions.slp` file will have been created in the job directory. + +You can use the SLEAP GUI on your local machine to load and view the predictions: +*File* -> *Open Project...* -> select the `labels.v001.slp.predictions.slp` file. + +## The training-inference cycle +Now that you have some predictions, you can keep improving your models by repeating +the training-inference cycle. The basic steps are: +- Manually correct some of the predictions: see [Prediction-assisted labeling](https://sleap.ai/tutorials/assisted-labeling.html) +- Merge corrected labels into the initial training set: see [Merging guide](https://sleap.ai/guides/merging.html) +- Save the merged training set as `labels.v002.slp` +- Export a new training job `labels.v002.slp.training_job` (you may reuse the training configurations from `v001`) +- Repeat the training-inference cycle until satisfied + +## Troubleshooting + +### Problems with the SLEAP module + +In this section, we will describe how to test that the SLEAP module is loaded +correctly for you and that it can use the available GPUs. + +Login to the HPC cluster as described [above](#access-to-the-hpc-cluster). + +Start an interactive job on a GPU node. This step is necessary, because we need +to test the module's access to the GPU. +```{code-block} console +$ srun -p fast --gres=gpu:1 --pty bash -i +``` +:::{dropdown} Explain the above command +:color: info +:icon: info + +* `-p fast` requests a node from the 'fast' partition. This refers to the queue of nodes with a 3-hour time limit. They are meant for short jobs, such as testing. +* `--gres=gpu:1` requests 1 GPU of any kind +* `--pty` is short for 'pseudo-terminal'. +* The `-i` stands for 'interactive' + +Taken together, the above command will start an interactive bash terminal session +on a node of the 'fast' partition, equipped with 1 GPU. +::: + +First, let's verify that you are indeed on a node equipped with a functional +GPU, by typing `nvidia-smi`: +```{code-block} console +$ nvidia-smi +Wed Sep 27 10:34:35 2023 ++-----------------------------------------------------------------------------+ +| NVIDIA-SMI 525.125.06 Driver Version: 525.125.06 CUDA Version: 12.0 | +|-------------------------------+----------------------+----------------------+ +| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | +| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | +| | | MIG M. | +|===============================+======================+======================| +| 0 NVIDIA GeForce ... Off | 00000000:41:00.0 Off | N/A | +| 0% 42C P8 22W / 240W | 1MiB / 8192MiB | 0% Default | +| | | N/A | ++-------------------------------+----------------------+----------------------+ + ++-----------------------------------------------------------------------------+ +| Processes: | +| GPU GI CI PID Type Process name GPU Memory | +| ID ID Usage | +|=============================================================================| +| No running processes found | ++-----------------------------------------------------------------------------+ +``` +Your output should look similar to the above. You will be able to see the GPU +name, temperature, memory usage, etc. If you see an error message instead, +(even though you are on a GPU node) please contact the SWC Scientific Computing team. + +Next, load the SLEAP module. +```{code-block} console +$ module load SLEAP +Loading SLEAP/2023-08-01 + Loading requirement: cuda/11.8 +``` + +To verify that the module was loaded successfully: +```{code-block} console +$ module list +Currently Loaded Modulefiles: + 1) SLEAP/2023-08-01 +``` +You can essentially think of the module as a centrally installed conda environment. +When it is loaded, you should be using a particular Python executable. +You can verify this by running: + +```{code-block} console +$ which python +/ceph/apps/ubuntu-20/packages/SLEAP/2023-08-01/bin/python +``` + +Finally we will verify that the `sleap` python package can be imported and can +'see' the GPU. We will mostly just follow the +[relevant SLEAP instructions](https://sleap.ai/installation.html#testing-that-things-are-working). +First, start a Python interpreter: +```{code-block} console +$ python +``` +Next, run the following Python commands: + +::: {warning} +The `import sleap` command may take some time to run (more than a minute). +This is normal. Subsequent imports should be faster. +::: + +```{code-block} pycon +>>> import sleap + +>>> sleap.versions() +SLEAP: 1.3.1 +TensorFlow: 2.8.4 +Numpy: 1.21.6 +Python: 3.7.12 +OS: Linux-5.4.0-109-generic-x86_64-with-debian-bullseye-sid + +>>> sleap.system_summary() +GPUs: 1/1 available + Device: /physical_device:GPU:0 + Available: True + Initialized: False + Memory growth: None + +>>> import tensorflow as tf + +>>> print(tf.config.list_physical_devices('GPU')) +[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')] + +>>> tf.constant("Hello world!") + +``` + +If all is as expected, you can exit the Python interpreter, and then exit the GPU node +```{code-block} pycon +>>> exit() +``` +```{code-block} console +$ exit() +``` +If you encounter troubles with using the SLEAP module, contact +Niko Sirmpilatze of the SWC [Neuroinformatics Unit](https://neuroinformatics.dev/). + +To completely exit the HPC cluster, you will need to logout of the SSH session twice: +```bash +$ logout +$ logout +``` +See [Set up SSH for the SWC HPC cluster](../programming/SSH-SWC-cluster.md) +for more information. diff --git a/docs/source/data_analysis/index.md b/docs/source/behav_at_swc/index.md similarity index 100% rename from docs/source/data_analysis/index.md rename to docs/source/behav_at_swc/index.md diff --git a/docs/source/data_analysis/HPC-module-SLEAP.md b/docs/source/ephys_at_swc/HPC-module-SLEAP.md similarity index 100% rename from docs/source/data_analysis/HPC-module-SLEAP.md rename to docs/source/ephys_at_swc/HPC-module-SLEAP.md diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md new file mode 100644 index 0000000..ddaf886 --- /dev/null +++ b/docs/source/ephys_at_swc/index.md @@ -0,0 +1,9 @@ +# Data Analysis + + + +```{toctree} +:maxdepth: 1 + +HPC-module-SLEAP +``` diff --git a/docs/source/index.md b/docs/source/index.md index 109a66f..81ea0d9 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -5,17 +5,22 @@ On this website you can find long-form how-to guides as well as collections of s The website is maintained by members of the [Neuroinformatics Unit](https://neuroinformatics.dev). The information is primarily aimed at researchers at the [Sainsbury Wellcome Centre (SWC)](https://www.sainsburywellcome.org/web/) and [Gatsby Computational Neuroscience Unit (GCNU)](https://www.ucl.ac.uk/gatsby/gatsby-computational-neuroscience-unit), though most of it should be useful to neuroscientists in general. -## Main sections -The guides are organised into three main sections: - -::::{grid} 1 2 2 3 +::::{grid} 1 2 2 4 :gutter: 3 -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Data Analysis -:link: data_analysis/index + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Electrophysiology at the SWC +:link: ephys_at_swc/index +:link-type: doc + +Resources for preprocessing and analysis of extracellular electrophysiology data. +::: + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Behaviour at the SWC +:link: behav_at_swc/index :link-type: doc -Guides related to tools and approaches for analysing neuroscientific data. +Guides related to tools and approaches for analysing behavioural data. ::: :::{grid-item-card} {fas}`code;sd-text-primary` Programming @@ -39,7 +44,8 @@ How to effectively share your code and data. :maxdepth: 2 :hidden: -data_analysis/index +ephys_at_swc/index +behav_at_swc/index programming/index open_science/index ``` From db0a9663560c3e8f7cabe9c78fee695abb53c060 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Tue, 14 May 2024 20:03:51 +0100 Subject: [PATCH 02/83] Adding content rough draft. --- docs/source/conf.py | 4 + docs/source/ephys_at_swc/HPC-module-SLEAP.md | 610 ------------------ .../ephys_at_swc/community_and_roadmap.md | 73 +++ .../auto_examples_ephys_jupyter.zip | Bin 0 -> 4573 bytes .../auto_examples_ephys_python.zip | Bin 0 -> 3749 bytes .../thumb/sphx_glr_sara_mederos_thumb.png | Bin 0 -> 26794 bytes .../auto_examples_ephys/index.rst | 98 +++ .../auto_examples_ephys/sara_mederos.ipynb | 43 ++ .../auto_examples_ephys/sara_mederos.py | 110 ++++ .../auto_examples_ephys/sara_mederos.rst | 155 +++++ .../sara_mederos_codeobj.pickle | Bin 0 -> 1136 bytes .../sg_execution_times.rst | 37 ++ .../ephys_at_swc/examples_from_the_swc.md | 3 + docs/source/ephys_at_swc/getting_started.md | 77 +++ docs/source/ephys_at_swc/index.md | 9 - docs/source/ephys_at_swc/index_ephys.md | 39 ++ docs/source/index.md | 6 +- 17 files changed, 642 insertions(+), 622 deletions(-) delete mode 100644 docs/source/ephys_at_swc/HPC-module-SLEAP.md create mode 100644 docs/source/ephys_at_swc/community_and_roadmap.md create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst create mode 100644 docs/source/ephys_at_swc/examples_from_the_swc.md create mode 100644 docs/source/ephys_at_swc/getting_started.md delete mode 100644 docs/source/ephys_at_swc/index.md create mode 100644 docs/source/ephys_at_swc/index_ephys.md diff --git a/docs/source/conf.py b/docs/source/conf.py index 0609f0c..4345965 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -148,3 +148,7 @@ # Configure the code block copy button # don't copy line numbers, prompts, or console outputs copybutton_exclude = ".linenos, .gp, .go" + +html_sidebars = { + "index_ephys": [] +} \ No newline at end of file diff --git a/docs/source/ephys_at_swc/HPC-module-SLEAP.md b/docs/source/ephys_at_swc/HPC-module-SLEAP.md deleted file mode 100644 index 72a537f..0000000 --- a/docs/source/ephys_at_swc/HPC-module-SLEAP.md +++ /dev/null @@ -1,610 +0,0 @@ -# Use the SLEAP module on the SWC HPC cluster - -```{include} ../_static/swc-wiki-warning.md -``` - -```{include} ../_static/code-blocks-note.md -``` - -## Abbreviations -| Acronym | Meaning | -| --------------------------------------------------------------- | -------------------------------------------- | -| [SLEAP](https://sleap.ai/) | Social LEAP Estimates Animal Poses | -| [SWC](https://www.sainsburywellcome.org/web/) | Sainsbury Wellcome Centre | -| [HPC](https://en.wikipedia.org/wiki/High-performance_computing) | High Performance Computing | -| [IT](https://en.wikipedia.org/wiki/Information_technology) | Information Technology | -| [GUI](https://en.wikipedia.org/wiki/Graphical_user_interface) | Graphical User Interface | -| [SLURM](https://slurm.schedmd.com/) | Simple Linux Utility for Resource Management | - -## Prerequisites - -::: {dropdown} Note on managed Linux desktops -:color: info -:icon: info - -The SWC's IT team offers managed desktop computers equipped with a Linux image. These machines are already part of SWC's trusted domain and have direct access to SLURM, the HPC modules, and the SWC filesystem. - -If you have access to one of these desktops, -you can skip the pre-requisite steps. -You may simply open a terminal, type `module load SLEAP`, -and start using SLEAP directly, as you would on any local -Linux machine. All SLEAP commands should work as expected, -including `sleap-label` for launching the GUI. - -That said, you may still want to offload GPU-intensive tasks to an HPC node (e.g. because the desktop's GPU is not powerful enough or because you need to run many jobs in parallel). In that case, you may -still want to read the sections on [model training](sleap-training) -and [inference](sleap-inference). -::: - -(access-to-the-hpc-cluster)= -### Access to the HPC cluster -Verify that you can access HPC gateway node (typing your `` both times when prompted): -```{code-block} console -$ ssh @ssh.swc.ucl.ac.uk -$ ssh hpc-gw1 -``` -To learn more about accessing the HPC via SSH, see the [relevant how-to guide](ssh-cluster-target). - -### Access to the SLEAP module -Once you are on the HPC gateway node, SLEAP should be listed among the available modules when you run `module avail`: - -```{code-block} console -$ module avail -... -SLEAP/2023-03-13 -SLEAP/2023-08-01 -SLEAP/2024-08-14 -... -``` -- `SLEAP/2023-03-13` corresponds to `SLEAP v.1.2.9` -- `SLEAP/2023-08-01` corresponds to `SLEAP v.1.3.1` -- `SLEAP/2024-08-14` corresponds to `SLEAP v.1.3.3` - -We recommend always using the latest version, which is the one loaded by default -when you run `module load SLEAP`. If you want to load a specific version, -you can do so by typing the full module name, -including the date e.g. `module load SLEAP/2023-08-01`. - -If a module has been successfully loaded, it will be listed when you run `module list`, -along with other modules it may depend on: - -```{code-block} console -$ module list -Currently Loaded Modulefiles: - 1) cuda/11.8 2) SLEAP/2023-08-01 -``` - -If you have troubles with loading the SLEAP module, -see this guide's [Troubleshooting section](#problems-with-the-sleap-module). - - -### Install SLEAP on your local PC/laptop -While you can delegate the GPU-intensive work to the HPC cluster, -you will need to use the SLEAP GUI for some steps, such as labelling frames. -Thus, you also need to install SLEAP on your local PC/laptop. - -We recommend following the official [SLEAP installation guide](https://sleap.ai/installation.html). -To minimise the risk of issues due to incompatibilities between versions, ensure the version of your local installation of SLEAP matches the one you plan to load in the cluster. - -### Mount the SWC filesystem on your local PC/laptop -The rest of this guide assumes that you have mounted the SWC filesystem on your local PC/laptop. -If you have not done so, please follow the relevant instructions on the -[SWC internal wiki](https://wiki.ucl.ac.uk/display/SSC/SWC+Storage+Platform+Overview). - -We will also assume that the data you are working with are stored in a `ceph` -directory to which you have access to. In the rest of this guide, we will use the path -`/ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data` which contains a SLEAP project -for test purposes. You should replace this with the path to your own data. - -:::{dropdown} Data storage location matters -:color: warning -:icon: alert-fill - -The cluster has fast access to data stored on the `ceph` filesystem, so if your -data is stored elsewhere, make sure to transfer it to `ceph` before running the job. -You can use tools such as [`rsync`](https://linux.die.net/man/1/rsync) -to copy data from your local machine to `ceph` via an ssh connection. For example: - -```{code-block} console -$ rsync -avz @ssh.swc.ucl.ac.uk:/ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data -``` -::: - -(sleap-training)= -## Model training -This will consist of two parts: [preparing a training job](prepare-the-training-job) -(on your local SLEAP installation) and [running a training job](run-the-training-job) -(on the HPC cluster's SLEAP module). Some evaluation metrics for the trained models -can be [viewed via the SLEAP GUI](model-evaluation) on your local SLEAP installation. - -(prepare-the-training-job)= -### Prepare the training job -Follow the SLEAP instructions for [Creating a Project](https://sleap.ai/tutorials/new-project.html) -and [Initial Labelling](https://sleap.ai/tutorials/initial-labeling.html). -Ensure that the project file (e.g. `labels.v001.slp`) is saved in the mounted SWC filesystem -(as opposed to your local filesystem). - -Next, follow the instructions in [Remote Training](https://sleap.ai/guides/remote.html#remote-training), -i.e. *Predict* -> *Run Training…* -> *Export Training Job Package…*. -- For selecting the right configuration parameters, see [Configuring Models](https://sleap.ai/guides/choosing-models.html#) and [Troubleshooting Workflows](https://sleap.ai/guides/troubleshooting-workflows.html) -- Set the *Predict On* parameter to *nothing*. Remote training and inference (prediction) are easiest to run separately on the HPC Cluster. Also unselect *Visualize Predictions During Training* in training settings, if it's enabled by default. -- If you are working with camera view from above or below (as opposed to a side view), set the *Rotation Min Angle* and *Rotation Max Angle* to -180 and 180 respectively in the *Augmentation* section. -- Make sure to save the exported training job package (e.g. `labels.v001.slp.training_job.zip`) in the mounted SWC filesystem, for example, in the same directory as the project file. -- Unzip the training job package. This will create a folder with the same name (minus the `.zip` extension). This folder contains everything needed to run the training job on the HPC cluster. - -(run-the-training-job)= -### Run the training job -Login to the HPC cluster as described above. -```{code-block} console -$ ssh @ssh.swc.ucl.ac.uk -$ ssh hpc-gw1 -``` -Navigate to the training job folder (replace with your own path) and list its contents: -```{code-block} console -:emphasize-lines: 12 -$ cd /ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data -$ cd labels.v001.slp.training_job -$ ls -1 -centered_instance.json -centroid.json -inference-script.sh -jobs.yaml -labels.v001.pkg.slp -labels.v001.slp.predictions.slp -train_slurm.sh -swc-hpc-pose-estimation -train-script.sh -``` -There should be a `train-script.sh` file created by SLEAP, which already contains the -commands to run the training. You can see the contents of the file by running `cat train-script.sh`: -```{code-block} bash -:caption: labels.v001.slp.training_job/train-script.sh -:name: train-script-sh -:linenos: -#!/bin/bash -sleap-train centroid.json labels.v001.pkg.slp -sleap-train centered_instance.json labels.v001.pkg.slp -``` -The precise commands will depend on the model configuration you chose in SLEAP. -Here we see two separate training calls, one for the 'centroid' and another for -the 'centered_instance' model. That's because in this example we have chosen -the ['Top-Down'](https://sleap.ai/tutorials/initial-training.html#training-options) -configuration, which consists of two neural networks - the first for isolating -the animal instances (by finding their centroids) and the second for predicting -all the body parts per instance. - -![Top-Down model configuration](https://sleap.ai/_images/topdown_approach.jpg) - -:::{dropdown} More on 'Top-Down' vs 'Bottom-Up' models -:color: info -:icon: info - -Although the 'Top-Down' configuration was designed with multiple animals in mind, -it can also be used for single-animal videos. It makes sense to use it for videos -where the animal occupies a relatively small portion of the frame - see -[Troubleshooting Workflows](https://sleap.ai/guides/troubleshooting-workflows.html) for more info. -::: - -Next you need to create a SLURM batch script, which will schedule the training job -on the HPC cluster. Create a new file called `train_slurm.sh` -(you can do this in the terminal with `nano`/`vim` or in a text editor of -your choice on your local PC/laptop). Here we create the script in the same folder -as the training job, but you can save it anywhere you want, or even keep track of it with `git`. - -```{code-block} console -$ nano train_slurm.sh -``` - -An example is provided below, followed by explanations. -```{code-block} bash -:caption: train_slurm.sh -:name: train-slurm-sh -:linenos: -#!/bin/bash - -#SBATCH -J slp_train # job name -#SBATCH -p gpu # partition (queue) -#SBATCH -N 1 # number of nodes -#SBATCH --mem 32G # memory pool for all cores -#SBATCH -n 8 # number of cores -#SBATCH -t 0-06:00 # time (D-HH:MM) -#SBATCH --gres gpu:1 # request 1 GPU (of any kind) -#SBATCH -o slurm.%x.%N.%j.out # STDOUT -#SBATCH -e slurm.%x.%N.%j.err # STDERR -#SBATCH --mail-type=ALL -#SBATCH --mail-user=user@domain.com - -# Load the SLEAP module -module load SLEAP - -# Define directories for SLEAP project and exported training job -SLP_DIR=/ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data -SLP_JOB_NAME=labels.v001.slp.training_job -SLP_JOB_DIR=$SLP_DIR/$SLP_JOB_NAME - -# Go to the job directory -cd $SLP_JOB_DIR - -# Run the training script generated by SLEAP -./train-script.sh -``` - -In `nano`, you can save the file by pressing `Ctrl+O` and exit by pressing `Ctrl+X`. - -:::{dropdown} Explanation of the batch script -:color: info -:icon: info -- The `#SBATCH` lines are SLURM directives. They specify the resources needed -for the job, such as the number of nodes, CPUs, memory, etc. -A primer on the most useful SLURM arguments is provided in this [how-to guide](slurm-arguments-target). -For more information see the [SLURM documentation](https://slurm.schedmd.com/sbatch.html). - -- The `#` lines are comments. They are not executed by SLURM, but they are useful -for explaining the script to your future self and others. - -- The `module load SLEAP` line loads the latest SLEAP module and any other modules -it may depend on. - -- The `cd` line changes the working directory to the training job folder. -This is necessary because the `train-script.sh` file contains relative paths -to the model configuration and the project file. - -- The `./train-script.sh` line runs the training job (executes the contained commands). -::: - -:::{warning} -Before submitting the job, ensure that you have permissions to execute -both the batch script and the training script generated by SLEAP. -You can make these files executable by running in the terminal: - -```{code-block} console -$ chmod +x train-script.sh -$ chmod +x train_slurm.sh -``` - -If the scripts are not in your working directory, you will need to specify their full paths: - -```{code-block} console -$ chmod +x /path/to/train-script.sh -$ chmod +x /path/to/train_slurm.sh -``` -::: - -Now you can submit the batch script via running the following command -(in the same directory as the script): -```{code-block} console -$ sbatch train_slurm.sh -Submitted batch job 3445652 -``` - -You may monitor the progress of the job in various ways: - -::::{tab-set} - -:::{tab-item} squeue - -View the status of the queued/running jobs with [`squeue`](https://slurm.schedmd.com/squeue.html): - -```{code-block} console -$ squeue --me -JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) -3445652 gpu slp_train sirmpila R 23:11 1 gpu-sr670-20 -``` -::: - -:::{tab-item} sacct - -View status of running/completed jobs with [`sacct`](https://slurm.schedmd.com/sacct.html): - -```{code-block} console -$ sacct -JobID JobName Partition Account AllocCPUS State ExitCode ------------- ---------- ---------- ---------- ---------- ---------- -------- -3445652 slp_train gpu swc-ac 2 COMPLETED 0:0 -3445652.bat+ batch swc-ac 2 COMPLETED 0:0 -``` -Run `sacct` with some more helpful arguments. -For example, you can view jobs from the last 24 hours, displaying the time -elapsed and the peak memory usage in KB (MaxRSS): - -```{code-block} console -$ sacct \ - --starttime $(date -d '24 hours ago' +%Y-%m-%dT%H:%M:%S) \ - --endtime $(date +%Y-%m-%dT%H:%M:%S) \ - --format=JobID,JobName,Partition,State,Start,Elapsed,MaxRSS - -JobID JobName Partition State Start Elapsed MaxRSS ------------- ---------- ---------- ---------- ------------------- ---------- ---------- -4043595 slp_infer gpu FAILED 2023-10-10T18:14:31 00:00:35 -4043595.bat+ batch FAILED 2023-10-10T18:14:31 00:00:35 271104K -4043603 slp_infer gpu FAILED 2023-10-10T18:27:32 00:01:37 -4043603.bat+ batch FAILED 2023-10-10T18:27:32 00:01:37 423476K -4043611 slp_infer gpu PENDING Unknown 00:00:00 -``` -::: - -:::{tab-item} view the logs - -View the contents of standard output and error -(the node name and job ID will differ in each case): -```{code-block} console -$ cat slurm.gpu-sr670-20.3445652.out -$ cat slurm.gpu-sr670-20.3445652.err -``` -::: - -:::: - -```{dropdown} Out-of-memory (OOM) errors -:color: warning -:icon: alert-fill - -If you encounter out-of-memory errors, keep in mind that there two main sources of memory usage: -- CPU memory (RAM), specified via the `--mem` argument in the SLURM batch script. This is the memory used by the Python process running the training job and is shared among all the CPU cores. -- GPU memory, this is the memory used by the GPU card(s) and depends on the GPU card type you requested via the `--gres gpu:1` argument in the SLURM batch script. To increase it, you can request a specific GPU card type with more GPU memory (e.g. `--gres gpu:a4500:1`). The SWC wiki provides a [list of all GPU card types and their specifications](https://wiki.ucl.ac.uk/display/SSC/CPU+and+GPU+Platform+architecture). -- If requesting more memory doesn't help, you can try reducing the size of your SLEAP models. You may tweak the model backbone architecture, or play with *Input scaling*, *Max stride* and *Batch size*. See SLEAP's [documentation](https://sleap.ai/) and [discussion forum](https://github.com/talmolab/sleap/discussions) for more details. -``` - -(model-evaluation)= -## Model evaluation -Upon successful completion of the training job, a `models` folder will have -been created in the training job directory. It contains one subfolder per -training run (by default prefixed with the date and time of the run). - -```{code-block} console -$ cd /ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data -$ cd labels.v001.slp.training_job -$ cd models -$ ls -1 -230509_141357.centered_instance -230509_141357.centroid -``` - -Each subfolder holds the trained model files (e.g. `best_model.h5`), -their configurations (`training_config.json`) and some evaluation metrics. - -```{code-block} console -$ cd 230509_141357.centered_instance -$ ls -1 -best_model.h5 -initial_config.json -labels_gt.train.slp -labels_gt.val.slp -labels_pr.train.slp -labels_pr.val.slp -metrics.train.npz -metrics.val.npz -training_config.json -training_log.csv -``` -The SLEAP GUI on your local machine can be used to quickly evaluate the trained models. - -- Select *Predict* -> *Evaluation Metrics for Trained Models...* -- Click on *Add Trained Models(s)* and select the folder containing the model(s) you want to evaluate. -- You can view the basic metrics on the shown table or you can also view a more detailed report (including plots) by clicking *View Metrics*. - -For more detailed evaluation metrics, you can refer to [SLEAP's model evaluation notebook](https://sleap.ai/notebooks/Model_evaluation.html). - -(sleap-inference)= -## Model inference -By inference, we mean using a trained model to predict the labels on new frames/videos. -SLEAP provides the [`sleap-track`](https://sleap.ai/guides/cli.html?#inference-and-tracking) command line utility for running inference -on a single video or a folder of videos. - -Below is an example SLURM batch script that contains a `sleap-track` call. -```{code-block} bash -:caption: infer_slurm.sh -:name: infer-slurm-sh -:linenos: -#!/bin/bash - -#SBATCH -J slp_infer # job name -#SBATCH -p gpu # partition -#SBATCH -N 1 # number of nodes -#SBATCH --mem 64G # memory pool for all cores -#SBATCH -n 16 # number of cores -#SBATCH -t 0-02:00 # time (D-HH:MM) -#SBATCH --gres gpu:rtx5000:1 # request 1 GPU (of a specific kind) -#SBATCH -o slurm.%x.%N.%j.out # write STDOUT -#SBATCH -e slurm.%x.%N.%j.err # write STDERR -#SBATCH --mail-type=ALL -#SBATCH --mail-user=user@domain.com - -# Load the SLEAP module -module load SLEAP - -# Define directories for SLEAP project and exported training job -SLP_DIR=/ceph/scratch/neuroinformatics-dropoff/SLEAP_HPC_test_data -VIDEO_DIR=$SLP_DIR/videos -SLP_JOB_NAME=labels.v001.slp.training_job -SLP_JOB_DIR=$SLP_DIR/$SLP_JOB_NAME - -# Go to the job directory -cd $SLP_JOB_DIR -# Make a directory to store the predictions -mkdir -p predictions - -# Run the inference command -sleap-track $VIDEO_DIR/M708149_EPM_20200317_165049331-converted.mp4 \ - -m $SLP_JOB_DIR/models/231010_164307.centroid/training_config.json \ - -m $SLP_JOB_DIR/models/231010_164307.centered_instance/training_config.json \ - --gpu auto \ - --tracking.tracker simple \ - --tracking.similarity centroid \ - --tracking.post_connect_single_breaks 1 \ - -o predictions/labels.v001.slp.predictions.slp \ - --verbosity json \ - --no-empty-frames -``` -The script is very similar to the training script, with the following differences: -- The time limit `-t` is set lower, since inference is normally faster than training. This will however depend on the size of the video and the number of models used. -- The requested number of cores `n` and memory `--mem` are higher. This will depend on the requirements of the specific job you are running. It's best practice to try with a scaled-down version of your data first, to get an idea of the resources needed. -- The requested GPU is of a specific kind (RTX 5000). This will again depend on the requirements of your job, as the different GPU kinds vary in GPU memory size and compute capabilities (see [the SWC wiki](https://wiki.ucl.ac.uk/display/SSC/CPU+and+GPU+Platform+architecture)). -- The `./train-script.sh` line is replaced by the `sleap-track` command. -- The `\` character is used to split the long `sleap-track` command into multiple lines for readability. It is not necessary if the command is written on a single line. - -::: {dropdown} Explanation of the sleap-track arguments -:color: info -:icon: info - - Some important command line arguments are explained below. - You can view a full list of the available arguments by running `sleap-track --help`. -- The first argument is the path to the video file to be processed. -- The `-m` option is used to specify the path to the model configuration file(s) to be used for inference. In this example we use the two models that were trained above. -- The `--gpu` option is used to specify the GPU to be used for inference. The `auto` value will automatically select the GPU with the highest percentage of available memory (of the GPUs that are available on the machine/node) -- The options starting with `--tracking` specify parameters used for tracking the detected instances (animals) across frames. See SLEAP's guide on [tracking methods](https://sleap.ai/guides/proofreading.html#tracking-method-details) for more info. -- The `-o` option is used to specify the path to the output file containing the predictions. -- The above script will predict all the frames in the video. You may select specific frames via the `--frames` option. For example: `--frames 1-50` or `--frames 1,3,5,7,9`. -::: - -You can submit and monitor the inference job in the same way as the training job. -```{code-block} console -$ sbatch infer_slurm.sh -$ squeue --me -``` -Upon completion, a `labels.v001.slp.predictions.slp` file will have been created in the job directory. - -You can use the SLEAP GUI on your local machine to load and view the predictions: -*File* -> *Open Project...* -> select the `labels.v001.slp.predictions.slp` file. - -## The training-inference cycle -Now that you have some predictions, you can keep improving your models by repeating -the training-inference cycle. The basic steps are: -- Manually correct some of the predictions: see [Prediction-assisted labeling](https://sleap.ai/tutorials/assisted-labeling.html) -- Merge corrected labels into the initial training set: see [Merging guide](https://sleap.ai/guides/merging.html) -- Save the merged training set as `labels.v002.slp` -- Export a new training job `labels.v002.slp.training_job` (you may reuse the training configurations from `v001`) -- Repeat the training-inference cycle until satisfied - -## Troubleshooting - -### Problems with the SLEAP module - -In this section, we will describe how to test that the SLEAP module is loaded -correctly for you and that it can use the available GPUs. - -Login to the HPC cluster as described [above](access-to-the-hpc-cluster). - -Start an interactive job on a GPU node. This step is necessary, because we need -to test the module's access to the GPU. -```{code-block} console -$ srun -p fast --gres=gpu:1 --pty bash -i -``` -:::{dropdown} Explain the above command -:color: info -:icon: info - -* `-p fast` requests a node from the 'fast' partition. This refers to the queue of nodes with a 3-hour time limit. They are meant for short jobs, such as testing. -* `--gres=gpu:1` requests 1 GPU of any kind -* `--pty` is short for 'pseudo-terminal'. -* The `-i` stands for 'interactive' - -Taken together, the above command will start an interactive bash terminal session -on a node of the 'fast' partition, equipped with 1 GPU. -::: - -First, let's verify that you are indeed on a node equipped with a functional -GPU, by typing `nvidia-smi`: -```{code-block} console -$ nvidia-smi -Wed Sep 27 10:34:35 2023 -+-----------------------------------------------------------------------------+ -| NVIDIA-SMI 525.125.06 Driver Version: 525.125.06 CUDA Version: 12.0 | -|-------------------------------+----------------------+----------------------+ -| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | -| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | -| | | MIG M. | -|===============================+======================+======================| -| 0 NVIDIA GeForce ... Off | 00000000:41:00.0 Off | N/A | -| 0% 42C P8 22W / 240W | 1MiB / 8192MiB | 0% Default | -| | | N/A | -+-------------------------------+----------------------+----------------------+ - -+-----------------------------------------------------------------------------+ -| Processes: | -| GPU GI CI PID Type Process name GPU Memory | -| ID ID Usage | -|=============================================================================| -| No running processes found | -+-----------------------------------------------------------------------------+ -``` -Your output should look similar to the above. You will be able to see the GPU -name, temperature, memory usage, etc. If you see an error message instead, -(even though you are on a GPU node) please contact the SWC Scientific Computing team. - -Next, load the SLEAP module. -```{code-block} console -$ module load SLEAP -Loading SLEAP/2024-08-14 - Loading requirement: cuda/11.8 -``` - -To verify that the module was loaded successfully: -```{code-block} console -$ module list -Currently Loaded Modulefiles: - 1) SLEAP/2024-08-14 -``` -You can essentially think of the module as a centrally installed conda environment. -When it is loaded, you should be using a particular Python executable. -You can verify this by running: - -```{code-block} console -$ which python -/ceph/apps/ubuntu-20/packages/SLEAP/2024-08-14/bin/python -``` - -Finally we will verify that the `sleap` python package can be imported and can -'see' the GPU. We will mostly just follow the -[relevant SLEAP instructions](https://sleap.ai/installation.html#testing-that-things-are-working). -First, start a Python interpreter: -```{code-block} console -$ python -``` -Next, run the following Python commands: - -::: {warning} -The `import sleap` command may take some time to run (more than a minute). -This is normal. Subsequent imports should be faster. -::: - -```{code-block} pycon ->>> import sleap - ->>> sleap.versions() -SLEAP: 1.3.3 -TensorFlow: 2.8.4 -Numpy: 1.21.6 -Python: 3.7.12 -OS: Linux-5.4.0-109-generic-x86_64-with-debian-bullseye-sid - ->>> sleap.system_summary() -GPUs: 1/1 available - Device: /physical_device:GPU:0 - Available: True - Initialized: False - Memory growth: None - ->>> import tensorflow as tf - ->>> print(tf.config.list_physical_devices('GPU')) -[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')] - ->>> tf.constant("Hello world!") - -``` - -If all is as expected, you can exit the Python interpreter, and then exit the GPU node -```{code-block} pycon ->>> exit() -``` -```{code-block} console -$ exit() -``` -If you encounter troubles with using the SLEAP module, contact -Niko Sirmpilatze of the SWC [Neuroinformatics Unit](https://neuroinformatics.dev/). - -To completely exit the HPC cluster, you will need to type `exit` or -`logout` until you are back to the terminal prompt of your local machine. -See [Set up SSH for the SWC HPC cluster](../programming/SSH-SWC-cluster.md) -for more information. diff --git a/docs/source/ephys_at_swc/community_and_roadmap.md b/docs/source/ephys_at_swc/community_and_roadmap.md new file mode 100644 index 0000000..381c28f --- /dev/null +++ b/docs/source/ephys_at_swc/community_and_roadmap.md @@ -0,0 +1,73 @@ +# Community and Roadmap + +## Community + +The best place to get information and advice on extracellular ephys at the SWC is +in the `#forum-extracellular-ephys` channel on the SWC slack. + +Outside the SWC, you can ask any questions or issues about +[spikeinterface](https://github.com/SpikeInterface) +by raising an issue on their +[github repo](https://github.com/SpikeInterface/spikeinterface/issues). +They are very friendly and +happy to answer any questions! + +Finally, the +[Neuropixels](https://neuropixelsgroup.slack.com/join/shared_invite/zt-2c8u0k21u-CC4wSkb8~U_Fkrf3HHf_kw#/shared-invite/email) +Slack is a great resource, with an active community asking and answering questions on both +extracellular ephys acquisition and analysis. + + +## Roadmap + +The ultimate goal of the NIU is to create tools to centralise and automate +electrophysiology preprocessing and analysis at the SWC. We would ultimately +like to move away from researchers having to code their own bespoke pipelines, +and can instantly use centralised pipelines for their data. + +Unfortunately, this takes a lot of time. In the first instance, we are +reccomending people use +[spikeinterface]() +to build their pipelines, with examples, advice and support +from the NIU and SWC community. [spikeinterface]() is the most widely used, +open source and community tooling in systems neuroscience for building extracellular +ephys pipelines. Please see the [Getting Started](#getting_started.md) page for +advice on building your own spikeinterface pipeline. We are working closely with +the [spikeinterface team]() to implement the tools required for researchers at the SWC. + +Next, we are working to build tools to centralise preprocessing and analysis +and abstract away as much as possibly the individual script-building. +In the first instance, this requires that all data in the SWC is +organised in the same way, othewise this goal is impossible. To this end, +we are working on [NeuroBlueprint]() and [**datashuttle**](). It would +be very useful for you to organise your data in this way to make use of +our tooling at the SWC. + +Finally, we are working on the tool [spikewrap]() as a centralised +tool for ephys preprocessing and analysis. This will require only +setting a set of configs before running this on your data. Allowing you to +skip the pipeline-building step and get straight into preprocessing and analysis using community tools. + +A rough timeline for this roadmap is below. We are very keen to make sure we are +heading in the right direction, so please don't hestitate to get in contact +with any feedback on this roadmap and your priorities. + +## Timeline + +Q3 2024 + +Working directly with SpikeInterface to support their initiatives in: +- Improving the documentation +- Upgrades to their interface and stabilising the API + +Q4 2024 + +Handle cross-session alignment in spikeinterface (a widely requested +feature from researchers at the SWC). + +Q2 2025 + +Beta version of [spikewrap](), abstracting away building of ephys pipelines. + + + diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip new file mode 100644 index 0000000000000000000000000000000000000000..2f8ad35b7d6d1c325672ea87d118212545509d57 GIT binary patch literal 4573 zcmai2TW;LQ71d;td<-xj31$HW`eRx^i``O7nb<&Ml6eF%oLGWwAP7u@Q%&CPE{H7B zRYj>AgZao;KC*$VBx}e5vXSf{=dy}qzl2DzMONLq&vPHeyH}t7{EIXG`R6~TfBpA= zzW(oDesy-n|9*`%D~(J`%E?qVR`pgde*FA1A)<_m!bUH|dwvt5UF3&$BX!%Fuo;!o z+~?J!j>eu0`z1MU_1#rG6-tY@wYsO5+L2kxj1ryb zx6n=e+3O}of2@{d#GmBiT-2bcOld{7HkDSHpn@`Is(QV(sw%3L%4CsfLs?~VrB_xg zO;rlpEU@5sQ%IeQ;l+@&qOl+q*B5pz^?jmWQv;4_LxmNrVr{AgSuwh;NsI4U)Ojr4 z3?ifU6IrY%;g?WXjmhhC8j(QF@7QYv@s;N*KPHQaX0=|K^bODVsFoVFcuxvO#u;CvY zSttk1$QhMES|&9(;$VZ_1r^m}oam^F=?DMNMe_+PWK~W(IG_z>jZ>9QGjMf?yl#qO z0K_g%IzbGtswiX)D{x>b3rpQzCml3Z==?A+Jc%$>)-c@1PIcId>!Nb(jYNA~ zF!K6c5zf%Y8JW5CQ9e+Mwv*IxAghe+4gyShS^*`*AW7+gv>S{4)ziEXv>|34yLv4x zrFN~B;IcsYYG5Q?ssfoZ21d#fJ~o8pAkBGm!lam^PdgemI`vC|yq0cVs6{984zJw~ zqrUe|@41eWJ(;$dF&4vfx-wN$BL}?qOX+wI0^)khPe3`S-AP?L&RJt5!{;PX{HXF3 zx!&ciXs1fDWE26=L9*SCEW}zR#53{k_Pg7jNH=A@WtB8k=3g#fDZ50>1-oLDXf9VK zi6$9hI*H?WaygyOu4a>~>DBDwa(XeHrI)|GxcTa0`h4PRf_RO55SP=-32jiXpqqA= zNtEdGM0)`LKM|H$7@Alr!x=M!z$)uZ=2bo>M7Nx!xWp}BZxnzok0=C!gd3a#K0 z)>bg_{pNeIR8-^w8Uok_j2wPd!k=UXbF?9UM4F_|Xy5F}InIDdIJsO{d+P+{}M7olb-9 zcfMbu-scLH9tF+F70P{EL&RbWo7$F_;g6=mr!PErtWoDaAlhw5N#qkff*f0;rKBAP zm0O&D?>+nkn;qKG`TOpz`;Zq~P3`>1@HWMFA-R*00h+*z^~g0EFZRqymO)$(^Pxlr7w``MoN$Hrz26oBgA|!Qyihr(+O6kY zUdH>BEF(2iuV_A+T|a+57PA{5@qo&ZYYe&&W--c7v1!w}3o_tzil#(~<&el4@ffrK z8alPnWsb8Lqg5D(09!v7ahd3wV(?88-K(Nvf?3c0bbx|vp0t`m8jMz{Dv@EkI)|FS ztO_`CKH6;o6OlxnLeY6FZCY1WZAP8XGHK>*jSq7AgulF*Vkso~x7;v^OLk|S@Iu<6 z6vh4s<0 zwC&7x6zDKK^rO#i?grD|wR)gT?YDDu3v?LK)F^CHhXMM~5RBzqzJW7uY%VGka(2=l zGYrdJno>R%uW#SAL>&Tr7aSlgsBf*KJy(3rkg4uhGi z_c}No?8UB1Gy8Cq!$%%Gx&)onVHeE?C1c}A2cih~g5i8rqJwl_7#!#(n~Oskz4YS^ z-0?N!J4oQWADNR*skbYh$Zd)V&XWW?cHKId5zXSuX?%IzIghRK7DamDXJ?4HZf~Rg z3J+x!i=Te}*-v+`KKa=fXHS2KX}{3mzkmIWpN>Dv+`an6FL~z^{QeGq|BeqhXJ`Kd D=>`Hn literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip new file mode 100644 index 0000000000000000000000000000000000000000..f5b73ad1762f8ae308f8d9969e296f3a95adb883 GIT binary patch literal 3749 zcmaJ^+iu%N5OsQc5TN!YA23i*ga%|vvf{Q5z=tMH(IBlYIC&|8f?1Ixabe!PyOgEJ zqEAJCpuf?VeqYa$OX^~!GHi>xvvWB!b9Oj;^XX@gPweOKzsA3&fBgB+*I%BT*x#?P zriBt=#xbix`{iaZ81#ErvvYq;GN-qtyye%qVYLtu_j|$dPrujiy@ek7rO`v)PsM^2 z{Ve9ERN`=*7_j?F+ zp_tPRWyQ)W&SbFY9!sQ?UqkK?^K1Yeh={`Qr8uz$udAq0QB^Q%!S%KwJnDf`SjXQ%&3zL z-Do=+ho3a9^ zXdyX`2_B-TQ;yNSO5CHQ9RVWBeM?@KAfSmfE@%tM^Cnldr}p5kA|EBw0O#SLP3g8| zz4}DAY<#QIidolhs+??f!4A5RysS!%EK^=v7KWd;PEYFqo3^z1fFQ?vLF_cLx91nE zH0KTu95lQ4K7oAG$;e4jPf4d^nKAWD##5=*dU%^x)1Ag21p zi107xv}s)+_t2vjK9sZBc!Rpf2e6_`@Nw9lm$Am__YJ-uQL-cJoxX3MYK0U8B;)mO z?mR97JlU%^Fa0W)cNKek@~{utEpZ+|cu0?~l^^~`fyKc>g$f1@ zd|0Zz)WL(G>(<^a#+_btMTtt$4ZiSlz5%BLd4P4?d%rO;--X)Nti2$i$zpO;p)=N% z_m&o2@OH<3j)2gh-fR{P2I+AdQnKnWHRt7(jm&hj&@W*>oo3_hrNq=#LW;W*JhZoYbk(lEj^!6c3J?Qtm-I(8a83+PeWAm$&~ojyXhlK= zHLE)-U5igH##nM~{nB2KY)QI}j2aU)4Y{F&y4l62mm-betf@);V1{ZYOsi{qU>7Lo zt*;p4Acvflh#1{ybi($)35TBuEbbMI{>$df+%6f2PW znWKENm(VHhswZ%ZDKVzh&qt%BG)Xo0!8@b3*5vDU=p5~PFe9Gp8ZUO$U3vDZ)sv4tw_yyMAx>=FumQPd@%m hS-))J&%eLhZwGIfvp1iAVV57_C&2$3yojEh{0CVB;E4bL literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5fed589d17fe6ee62d6a9788519dba471fbd65 GIT binary patch literal 26794 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 literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst new file mode 100644 index 0000000..67463eb --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst @@ -0,0 +1,98 @@ +:orphan: + +:orphan: + +Python Pipelines +================ + +Multiple probes (Cambridge Neurotech) +------------------------------------- + +Dammy Onih (Akrami lab) is running a multi-session paradigm with two +`Cambridge Neurotech `__ +probes. In this multi-session task, mice learn a statistical learning paradigm to a +reward-associated auditory stimulus, recording from the hippocampus. +The pipeline uses SpikeInterface for preprocessing, +sorting, and analysis and can be found `here `__. + +The IBL analysis pipeline +------------------------- + +Nate Miska (Mrsic-Flogel lab) is a member of the +`International Brain Laboratory +(IBL) <(https://www.internationalbrainlab.com/>`_ +running the +`IBL's standardised behavioural task `_ +with acute Neuropixels 1.0 recordings. Details of the +`analysis pipeline code `__ +on the IBL data management system can be found +`here `_. + +Integrated analysis with Neuropixels 2.0 +---------------------------------------- + +Steve Lenzi (Margrie Lab) has an integrated pipeline for automated behavioural, +electrophysiological, and anatomical analysis. Steve works with a +multi-session escape paradigm, recording stimulus-responsive neurons in the posterior +striatum. He is using NeuroPixels 2.0 and SpikeGLX with a SpikeInterface-based +pipeline; the code can be found `here `__. + +Python Scripts +-------------- + + + +.. raw:: html + +
+ +.. thumbnail-parent-div-open + +.. raw:: html + +
+ +.. only:: html + + .. image:: /ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png + :alt: + + :ref:`sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py` + +.. raw:: html + +
NP2.0 in SpikeInterface
+
+ + +.. thumbnail-parent-div-close + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos + + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-gallery + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download all examples in Python source code: auto_examples_ephys_python.zip ` + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download all examples in Jupyter notebooks: auto_examples_ephys_jupyter.zip ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb new file mode 100644 index 0000000..bceb73b --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# NP2.0 in SpikeInterface\n\nSara Mederos (Hofer Lab) performs chronic electrophysiological\nrecordings from subcortical and cortical areas using 4-shank\nNeuropixels 2.0 probes (Open Ephys). Recordings are conducted\nin freely moving mice during behavioral paradigms that assess\nthe cognitive control of innate behaviors. A pipeline\nused for pre-processing, sorting, and quality metrics\ncan be found below.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import probeinterface.plotting\nfrom spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys_event, read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe, plot_probe_group\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport spikeinterface as si # TODO\nimport numpy as np\n\n\ndata_path = Path(\n r\"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = True\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run time shift (multiplex correction) and filter\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\n\n# Perform median average filter by shank\nchannel_group = filtered_recording.get_property(\"group\")\nsplit_channel_ids = [\n filtered_recording.get_channel_ids()[channel_group == idx]\n for idx in np.unique(channel_group)\n]\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\", groups=split_channel_ids\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n filtered_recording,\n order_channel_by_depth=True,\n time_range=(3499, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is set up means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py new file mode 100644 index 0000000..b2beaca --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py @@ -0,0 +1,110 @@ +""" +NP2.0 in SpikeInterface +======================= + +Sara Mederos (Hofer Lab) performs chronic electrophysiological +recordings from subcortical and cortical areas using 4-shank +Neuropixels 2.0 probes (Open Ephys). Recordings are conducted +in freely moving mice during behavioral paradigms that assess +the cognitive control of innate behaviors. A pipeline +used for pre-processing, sorting, and quality metrics +can be found below. +""" + +import probeinterface.plotting +from spikeinterface import extract_waveforms +from spikeinterface.extractors import read_openephys_event, read_openephys +from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference +from spikeinterface.sorters import run_sorter +from pathlib import Path +from probeinterface.plotting import plot_probe, plot_probe_group +import matplotlib.pyplot as plt +from spikeinterface import curation +from spikeinterface.widgets import plot_timeseries +import spikeinterface as si # TODO +import numpy as np + + +data_path = Path( + r"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1" +) +output_path = Path( + r"/ceph/.../derivatives/100323/" +) + +show_probe = False +show_preprocessing = True + +# This reads OpenEphys 'Binary' format. It determines the +# probe using probeinterface.read_openephys, which reads `settings.xml` +# and requires the NP_PROBE field is filled. +raw_recording = read_openephys(data_path) + +if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + +# Run time shift (multiplex correction) and filter +shifted_recording = phase_shift(raw_recording) +filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) + +# Perform median average filter by shank +channel_group = filtered_recording.get_property("group") +split_channel_ids = [ + filtered_recording.get_channel_ids()[channel_group == idx] + for idx in np.unique(channel_group) +] +preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median", groups=split_channel_ids +) + +if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + filtered_recording, + order_channel_by_depth=True, + time_range=(3499, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + +# Run the sorting +sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, +) + +# Curate the sorting output and extract waveforms. Calculate +# quality metrics from the waveforms. +sorting = sorting.remove_empty_units() + +sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + +# The way spikeinterface is set up means that quality metrics are +# calculated on the spikeinterface-preprocessed, NOT the kilosort +# preprocessed (i.e. drift-correct data). +# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. +waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, +) + +quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) +quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst new file mode 100644 index 0000000..ce7d82a --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst @@ -0,0 +1,155 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "ephys_at_swc\example_pipelines\auto_examples_ephys\sara_mederos.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py: + + +NP2.0 in SpikeInterface +======================= + +Sara Mederos (Hofer Lab) performs chronic electrophysiological +recordings from subcortical and cortical areas using 4-shank +Neuropixels 2.0 probes (Open Ephys). Recordings are conducted +in freely moving mice during behavioral paradigms that assess +the cognitive control of innate behaviors. A pipeline +used for pre-processing, sorting, and quality metrics +can be found below. + +.. GENERATED FROM PYTHON SOURCE LINES 13-111 + +.. code-block:: Python + + + import probeinterface.plotting + from spikeinterface import extract_waveforms + from spikeinterface.extractors import read_openephys_event, read_openephys + from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference + from spikeinterface.sorters import run_sorter + from pathlib import Path + from probeinterface.plotting import plot_probe, plot_probe_group + import matplotlib.pyplot as plt + from spikeinterface import curation + from spikeinterface.widgets import plot_timeseries + import spikeinterface as si # TODO + import numpy as np + + + data_path = Path( + r"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1" + ) + output_path = Path( + r"/ceph/.../derivatives/100323/" + ) + + show_probe = False + show_preprocessing = True + + # This reads OpenEphys 'Binary' format. It determines the + # probe using probeinterface.read_openephys, which reads `settings.xml` + # and requires the NP_PROBE field is filled. + raw_recording = read_openephys(data_path) + + if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + + # Run time shift (multiplex correction) and filter + shifted_recording = phase_shift(raw_recording) + filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) + + # Perform median average filter by shank + channel_group = filtered_recording.get_property("group") + split_channel_ids = [ + filtered_recording.get_channel_ids()[channel_group == idx] + for idx in np.unique(channel_group) + ] + preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median", groups=split_channel_ids + ) + + if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + filtered_recording, + order_channel_by_depth=True, + time_range=(3499, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + + # Run the sorting + sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, + ) + + # Curate the sorting output and extract waveforms. Calculate + # quality metrics from the waveforms. + sorting = sorting.remove_empty_units() + + sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + + # The way spikeinterface is set up means that quality metrics are + # calculated on the spikeinterface-preprocessed, NOT the kilosort + # preprocessed (i.e. drift-correct data). + # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. + waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, + ) + + quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) + quality_metrics.to_csv(output_path / "postprocessing") + + +.. _sphx_glr_download_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: sara_mederos.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: sara_mederos.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle new file mode 100644 index 0000000000000000000000000000000000000000..eae8338e81f5ba361626ed59cb45989711f6f619 GIT binary patch literal 1136 zcma)*yKfXR5Qix)uiKCigg7B31q~uXTG7zZ(4+^^Bg^NVi!J<$AGutCl=h_UF#j*( zy~TUk9D=Rv-*~@y-|zi`$&>DDD`unw7KG70wbf_WfP>~ru#kSH%dhEeJNZHbPv6py zeAZM!>ZNvHnI=lSA6R@M#XPmg8;N*sTu6M{9tuyGq~51>Tj3e*tQ1Uyw2rhrgS+4; z3uH-eVPTx|8$bMDmx&*>C*F$hAanq?pbQeP_;Y@|=1(*2(u?{gQYpepL2!ckni*wd z0Mg5(*Nd0g-yWc^i-*2O=DYk8^AXWHu+A{>Ug+!0eO&Fe0|j{~P08*J5l zNN~EP<$yYCnfN+eL*La;1yos1J>b@fMJNq@AR_9YQ*u>!hgOCfcX(M~lkSF;GetuV S0@uB^t9-)R>{R=`jP-A)4ZA=9 literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst new file mode 100644 index 0000000..a8e9428 --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst @@ -0,0 +1,37 @@ + +:orphan: + +.. _sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sg_execution_times: + + +Computation times +================= +**00:00.000** total execution time for 1 file **from ephys_at_swc\example_pipelines\auto_examples_ephys**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py` (``sara_mederos.py``) + - 00:00.000 + - 0.0 diff --git a/docs/source/ephys_at_swc/examples_from_the_swc.md b/docs/source/ephys_at_swc/examples_from_the_swc.md new file mode 100644 index 0000000..057beca --- /dev/null +++ b/docs/source/ephys_at_swc/examples_from_the_swc.md @@ -0,0 +1,3 @@ +# Examples + +should be a sphinx gallery \ No newline at end of file diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md new file mode 100644 index 0000000..11b0496 --- /dev/null +++ b/docs/source/ephys_at_swc/getting_started.md @@ -0,0 +1,77 @@ +# Getting Started + +Getting started with extracellular electrophysiolgoy is intimidating! There are +many different acquisition setups, packages, preprocessing, postprocessing and +analysis steps to consider. + +A first step in getting started can be to ask for advice for your setup. Every setup +and experiment is different, and it is usually most efficient to be pointed +in the right direction from the outset rahter than waste time exploring avenues +that end up fruitless. See the [Community](#community_and_roadmap.md) sections for +details on where to get help. + +Another step in getting started with electrophysiology analysis is +to read some general introduction guides, see the resources step. + +After this, diving right into the preprocessing and analysis on a +dataset you have collected is useful to see what issues might come up. +We have a selection of examples in use at the SWC from rsearchers +that you can try and out contact if you have questions (both spikeinterface +and otherwise). + +Spikeinterface also has a lot of examples. + +See the resources section below for a full list of resources! + +INTRO +https://www.sciencedirect.com/science/article/pii/S0959438817303161 +https://iopscience.iop.org/article/10.1088/2516-1091/ac6b96/meta + +past-present-future spike sorting https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4674014/ +more detailed spike sorting https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf + +Pynapple + +Spikeforest https://spikeforest.flatironinstitute.org/ + +http://portal.brain-map.org/circuits-behavior/ophysephys-calibration-data + +NP course https://www.ucl.ac.uk/neuropixels/courses + +https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8153483/ + +# Resources + +## Acquisition systems + +### NeuroPixels + +### Cambridge NeuroTech + +## Preprocessing and Analysis + +Neuropixels day +Steve's spike sorting video + slides +https://groups.google.com/g/neuralensemble + +IBL white paper + +NP utilities https://djoshea.github.io/neuropixel-utils/ +Elephant + +https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1008615 + + +### SpikeInterface + +Documentation +Examples +Tutorials +Slack + + +## Manual Curation and Phy + +Phy Website +Steve's Guide + diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md deleted file mode 100644 index ddaf886..0000000 --- a/docs/source/ephys_at_swc/index.md +++ /dev/null @@ -1,9 +0,0 @@ -# Data Analysis - - - -```{toctree} -:maxdepth: 1 - -HPC-module-SLEAP -``` diff --git a/docs/source/ephys_at_swc/index_ephys.md b/docs/source/ephys_at_swc/index_ephys.md new file mode 100644 index 0000000..56c08ef --- /dev/null +++ b/docs/source/ephys_at_swc/index_ephys.md @@ -0,0 +1,39 @@ +# Extracellular Electrophysiology at the SWC + +This page aims to act as a hub for researchers using extracellular electrophysiology in the SWC. It contains +guides for preprocessing and analysis, as well as examples currently in use by researchers in the building. + +Please make sure to join the #extracellular-electrophysiology channel on the SWC Slack for discussions. +If you've like to contribute a guide or pipeline, please don't hesitate to get in contact! [See community and roadmap]. + +This page is maintained by the [Neuroinformatics Unit](neuroinformatics.dev), in particular by Joe Ziminski. +Please feel free to get in contact through Slack or by email anytime (j.ziminski@ucl.ac.uk). + +::::{grid} 1 2 2 3 +:gutter: 3 + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Getting Started +:link: getting_started +:link-type: doc +::: + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Example Pipelines +:link: examples_from_the_swc +:link-type: doc +::: + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Community & Roadmap +:link: community_and_roadmap +:link-type: doc +::: + +:::: + +```{toctree} +:maxdepth: 1 +:hidden: + +getting_started +examples_from_the_swc +community_and_roadmap +``` diff --git a/docs/source/index.md b/docs/source/index.md index 81ea0d9..7c3d3a6 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -5,12 +5,12 @@ On this website you can find long-form how-to guides as well as collections of s The website is maintained by members of the [Neuroinformatics Unit](https://neuroinformatics.dev). The information is primarily aimed at researchers at the [Sainsbury Wellcome Centre (SWC)](https://www.sainsburywellcome.org/web/) and [Gatsby Computational Neuroscience Unit (GCNU)](https://www.ucl.ac.uk/gatsby/gatsby-computational-neuroscience-unit), though most of it should be useful to neuroscientists in general. -::::{grid} 1 2 2 4 +::::{grid} 1 2 2 2 :gutter: 3 :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Electrophysiology at the SWC -:link: ephys_at_swc/index +:link: ephys_at_swc/index_ephys :link-type: doc Resources for preprocessing and analysis of extracellular electrophysiology data. @@ -44,7 +44,7 @@ How to effectively share your code and data. :maxdepth: 2 :hidden: -ephys_at_swc/index +ephys_at_swc/index_ephys behav_at_swc/index programming/index open_science/index From c03e8b3845cca454850407d4a7b7e20e5025c952 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 15 May 2024 10:50:02 +0100 Subject: [PATCH 03/83] Continue to tidy up, small renaming of sections. --- docs/source/behav_at_swc/index.md | 5 +- docs/source/conf.py | 4 - docs/source/ephys_at_swc/community.md | 22 ++++++ .../ephys_at_swc/community_and_roadmap.md | 73 ------------------ docs/source/ephys_at_swc/getting_started.md | 74 +++++++++---------- docs/source/ephys_at_swc/index.md | 55 ++++++++++++++ docs/source/ephys_at_swc/index_ephys.md | 39 ---------- docs/source/ephys_at_swc/roadmap.md | 56 ++++++++++++++ docs/source/index.md | 9 ++- 9 files changed, 179 insertions(+), 158 deletions(-) create mode 100644 docs/source/ephys_at_swc/community.md delete mode 100644 docs/source/ephys_at_swc/community_and_roadmap.md create mode 100644 docs/source/ephys_at_swc/index.md delete mode 100644 docs/source/ephys_at_swc/index_ephys.md create mode 100644 docs/source/ephys_at_swc/roadmap.md diff --git a/docs/source/behav_at_swc/index.md b/docs/source/behav_at_swc/index.md index ce094e5..46e4c5f 100644 --- a/docs/source/behav_at_swc/index.md +++ b/docs/source/behav_at_swc/index.md @@ -1,6 +1,7 @@ -# Data Analysis +# Behaviour at the SWC -Guides related to the analysis of neuroscientific data, spanning a wide range of data types such as electrophysiology, behaviour, calcium imaging, histology, etc. The focus may be on the use of specific software tools, or on more general analysis tasks and concepts. +Guides related to the analysis of neuroscientific data, spanning a wide range of data types such as electrophysiology, behaviour, calcium imaging, histology, etc. +The focus may be on the use of specific software tools, or on more general analysis tasks and concepts. ```{toctree} :maxdepth: 1 diff --git a/docs/source/conf.py b/docs/source/conf.py index 4345965..0609f0c 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -148,7 +148,3 @@ # Configure the code block copy button # don't copy line numbers, prompts, or console outputs copybutton_exclude = ".linenos, .gp, .go" - -html_sidebars = { - "index_ephys": [] -} \ No newline at end of file diff --git a/docs/source/ephys_at_swc/community.md b/docs/source/ephys_at_swc/community.md new file mode 100644 index 0000000..357c740 --- /dev/null +++ b/docs/source/ephys_at_swc/community.md @@ -0,0 +1,22 @@ +# Community + +This site is maintained by the +[NeuroInformatics Unit](https://neuroinformatics.dev/). +Please don't hesitate to contact us +(in particular Joe Ziminski) on Slack with any questions or feedback +on electrophysiology analysis at the SWC. + +For information and advice on extracellular electrophysiology from the SWC community, the +best place to go is the `#forum-extracellular-ephys` channel on the SWC Slack. + +Outside the SWC, you can address any questions or issues about +[SpikeInterface](https://github.com/SpikeInterface) +by raising an issue on their +[GitHub repository](https://github.com/SpikeInterface/spikeinterface/issues). +They are very friendly and +happy to answer any questions! + +In addition, the +[Neuropixels](https://neuropixelsgroup.slack.com/join/shared_invite/zt-2c8u0k21u-CC4wSkb8~U_Fkrf3HHf_kw#/shared-invite/email) +Slack is a great resource, with an active community discussing both +extracellular electrophysiology acquisition and analysis. diff --git a/docs/source/ephys_at_swc/community_and_roadmap.md b/docs/source/ephys_at_swc/community_and_roadmap.md deleted file mode 100644 index 381c28f..0000000 --- a/docs/source/ephys_at_swc/community_and_roadmap.md +++ /dev/null @@ -1,73 +0,0 @@ -# Community and Roadmap - -## Community - -The best place to get information and advice on extracellular ephys at the SWC is -in the `#forum-extracellular-ephys` channel on the SWC slack. - -Outside the SWC, you can ask any questions or issues about -[spikeinterface](https://github.com/SpikeInterface) -by raising an issue on their -[github repo](https://github.com/SpikeInterface/spikeinterface/issues). -They are very friendly and -happy to answer any questions! - -Finally, the -[Neuropixels](https://neuropixelsgroup.slack.com/join/shared_invite/zt-2c8u0k21u-CC4wSkb8~U_Fkrf3HHf_kw#/shared-invite/email) -Slack is a great resource, with an active community asking and answering questions on both -extracellular ephys acquisition and analysis. - - -## Roadmap - -The ultimate goal of the NIU is to create tools to centralise and automate -electrophysiology preprocessing and analysis at the SWC. We would ultimately -like to move away from researchers having to code their own bespoke pipelines, -and can instantly use centralised pipelines for their data. - -Unfortunately, this takes a lot of time. In the first instance, we are -reccomending people use -[spikeinterface]() -to build their pipelines, with examples, advice and support -from the NIU and SWC community. [spikeinterface]() is the most widely used, -open source and community tooling in systems neuroscience for building extracellular -ephys pipelines. Please see the [Getting Started](#getting_started.md) page for -advice on building your own spikeinterface pipeline. We are working closely with -the [spikeinterface team]() to implement the tools required for researchers at the SWC. - -Next, we are working to build tools to centralise preprocessing and analysis -and abstract away as much as possibly the individual script-building. -In the first instance, this requires that all data in the SWC is -organised in the same way, othewise this goal is impossible. To this end, -we are working on [NeuroBlueprint]() and [**datashuttle**](). It would -be very useful for you to organise your data in this way to make use of -our tooling at the SWC. - -Finally, we are working on the tool [spikewrap]() as a centralised -tool for ephys preprocessing and analysis. This will require only -setting a set of configs before running this on your data. Allowing you to -skip the pipeline-building step and get straight into preprocessing and analysis using community tools. - -A rough timeline for this roadmap is below. We are very keen to make sure we are -heading in the right direction, so please don't hestitate to get in contact -with any feedback on this roadmap and your priorities. - -## Timeline - -Q3 2024 - -Working directly with SpikeInterface to support their initiatives in: -- Improving the documentation -- Upgrades to their interface and stabilising the API - -Q4 2024 - -Handle cross-session alignment in spikeinterface (a widely requested -feature from researchers at the SWC). - -Q2 2025 - -Beta version of [spikewrap](), abstracting away building of ephys pipelines. - - - diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index 11b0496..0ed2e4b 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -8,70 +8,70 @@ A first step in getting started can be to ask for advice for your setup. Every s and experiment is different, and it is usually most efficient to be pointed in the right direction from the outset rahter than waste time exploring avenues that end up fruitless. See the [Community](#community_and_roadmap.md) sections for -details on where to get help. +details on where to get help. Another step in getting started with electrophysiology analysis is to read some general introduction guides, see the resources step. +Worth taking an afternoon to read these papers, give general overview. After this, diving right into the preprocessing and analysis on a dataset you have collected is useful to see what issues might come up. We have a selection of examples in use at the SWC from rsearchers that you can try and out contact if you have questions (both spikeinterface -and otherwise). +and otherwise). or read more technical documentation depending on prefernce. Spikeinterface also has a lot of examples. See the resources section below for a full list of resources! -INTRO +# Resources + +## General Introduction + https://www.sciencedirect.com/science/article/pii/S0959438817303161 https://iopscience.iop.org/article/10.1088/2516-1091/ac6b96/meta - past-present-future spike sorting https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4674014/ -more detailed spike sorting https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf - -Pynapple - -Spikeforest https://spikeforest.flatironinstitute.org/ +? https://www.sciencedirect.com/science/article/pii/S0959438818301375 -http://portal.brain-map.org/circuits-behavior/ophysephys-calibration-data +## Technical Introduction -NP course https://www.ucl.ac.uk/neuropixels/courses +Neuropixels Day https://www.ucl.ac.uk/neuropixels/courses +https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5244825/ -https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8153483/ +### Preprocessing -# Resources - -## Acquisition systems - -### NeuroPixels - -### Cambridge NeuroTech +(Bill Karsh Stuff) https://billkarsh.github.io/SpikeGLX/Sgl_help/UserManual.html +IBL white paper & the IBL repo https://figshare.com/articles/online_resource/Spike_sorting_pipeline_for_the_International_Brain_Laboratory/19705522 +Filters https://www.cell.com/neuron/pdf/S0896-6273(19)30174-6.pdf -## Preprocessing and Analysis +### Spike Sorting -Neuropixels day -Steve's spike sorting video + slides -https://groups.google.com/g/neuralensemble - -IBL white paper - -NP utilities https://djoshea.github.io/neuropixel-utils/ -Elephant +video https://www.youtube.com/watch?v=vSydfDvsewY +more detailed spike sorting https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf -https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1008615 +### Quality Metrics and Manual Curation +Phy website (docs: https://phy.readthedocs.io/en/latest/) (github: https://github.com/cortex-lab/phy?tab=readme-ov-file) +Steve's Guide https://phy.readthedocs.io/en/latest/sorting_user_guide/ +Bombcell https://github.com/Julie-Fabre/bombcell +Really nice paper https://www.jneurosci.org/content/31/24/8699 +Spikeinterface page https://spikeinterface.readthedocs.io/en/latest/modules/qualitymetrics.html -### SpikeInterface +## SpikeInterface -Documentation -Examples -Tutorials -Slack +Github https://github.com/SpikeInterface/spikeinterface +Documentation https://spikeinterface.readthedocs.io/en/latest/index.html +Tutorials https://github.com/SpikeInterface/spiketutorials +Probeinterace https://probeinterface.readthedocs.io/en/main/ +## Other Community Tools -## Manual Curation and Phy +Connell pipeline https://github.com/AllenInstitute/ecephys_spike_sorting +Pynapple https://github.com/pynapple-org/pynapple +Spikeforest https://spikeforest.flatironinstitute.org/ +Elephant https://neuralensemble.org/elephant/ +Neural Ensemble https://groups.google.com/g/neuralensemble +IBL pipeline https://github.com/int-brain-lab/ibl-neuropixel +NeuroPixels Utils https://djoshea.github.io/neuropixel-utils/ -Phy Website -Steve's Guide diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md new file mode 100644 index 0000000..69f3fe6 --- /dev/null +++ b/docs/source/ephys_at_swc/index.md @@ -0,0 +1,55 @@ +# Electrophysiology at the SWC + +This page acts as an information hub for researchers using +extracellular electrophysiology in the SWC. It contains +[guides](getting_started.md) +for preprocessing and analysis, as well as +[example scripts](examples_from_the_swc.md) +in use by researchers in the building. + +We encourage all types of contributions. If you've like to contribute a guide or pipeline, +please don't hesitate to get in contact! See the +[Community](community.md) +page for more details. + +This page is maintained by the +[Neuroinformatics Unit](neuroinformatics.dev). The +[Roadmap](roadmap.md) +lays out our plans for developing community +analysis tools at the SWC. + + +::::{grid} 1 2 2 2 +:gutter: 3 + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Getting Started +:link: getting_started +:link-type: doc +::: + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Example Pipelines +:link: examples_from_the_swc +:link-type: doc +::: + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Community +:link: community +:link-type: doc +::: + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Roadmap +:link: roadmap +:link-type: doc +::: + +:::: + +```{toctree} +:maxdepth: 1 +:hidden: + +getting_started +examples_from_the_swc +community +roadmap +``` diff --git a/docs/source/ephys_at_swc/index_ephys.md b/docs/source/ephys_at_swc/index_ephys.md deleted file mode 100644 index 56c08ef..0000000 --- a/docs/source/ephys_at_swc/index_ephys.md +++ /dev/null @@ -1,39 +0,0 @@ -# Extracellular Electrophysiology at the SWC - -This page aims to act as a hub for researchers using extracellular electrophysiology in the SWC. It contains -guides for preprocessing and analysis, as well as examples currently in use by researchers in the building. - -Please make sure to join the #extracellular-electrophysiology channel on the SWC Slack for discussions. -If you've like to contribute a guide or pipeline, please don't hesitate to get in contact! [See community and roadmap]. - -This page is maintained by the [Neuroinformatics Unit](neuroinformatics.dev), in particular by Joe Ziminski. -Please feel free to get in contact through Slack or by email anytime (j.ziminski@ucl.ac.uk). - -::::{grid} 1 2 2 3 -:gutter: 3 - -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Getting Started -:link: getting_started -:link-type: doc -::: - -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Example Pipelines -:link: examples_from_the_swc -:link-type: doc -::: - -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Community & Roadmap -:link: community_and_roadmap -:link-type: doc -::: - -:::: - -```{toctree} -:maxdepth: 1 -:hidden: - -getting_started -examples_from_the_swc -community_and_roadmap -``` diff --git a/docs/source/ephys_at_swc/roadmap.md b/docs/source/ephys_at_swc/roadmap.md new file mode 100644 index 0000000..51d0243 --- /dev/null +++ b/docs/source/ephys_at_swc/roadmap.md @@ -0,0 +1,56 @@ +# Roadmap + +The ultimate goal of the NIU is to create tools to centralise and automate +electrophysiology preprocessing and analysis at the SWC. We would ultimately +like to move away from researchers having to code their own bespoke pipelines, +and can instantly use centralised pipelines for their data. +Unfortunately, this will take a lot of time due to the required infrastructure building. + +In the short-term, we are focusing on helping researchers use existing community +tools to build their electrophysiology pipelines, in particular with +[SpikeInterface](https://github.com/SpikeInterface) +We will provide support, advice, and examples from across the +SWC community. We are working closely with +the SpikeInterface team to implement the tools required for researchers at the SWC. + +Concurrently, we are working to build tools to centralise preprocessing and analysis +and abstract away as much as possibly the individual script-building. +In the first instance, this requires that all data in the SWC is +organised in the same way. To this end, +we have released +[NeuroBlueprint](https://neuroblueprint.neuroinformatics.dev/) +and +[**datashuttle**](https://datashuttle.neuroinformatics.dev/). + +To abstract away the details of pipeline development in SpikeInterface are building +[spikewrap](https://github.com/neuroinformatics-unit/spikewrap) +as a centralised tool for ephys preprocessing and analysis. This will require only +setting a set of configs before running this on your data. Allowing you to +skip the pipeline-building step and get straight into preprocessing and analysis using community tools. + +## Timeline + +A rough timeline for this roadmap is below. We are very keen to make sure we are +heading in the right direction, so please don't hestitate to get in contact +with any feedback on this roadmap and your priorities. + +### Q3 2024 + +Working directly with SpikeInterface to support their initiatives in: +- Improving the documentation +- Upgrading their interface and stabilising the API +- Adding new features (those requested by SWC researchers) + +### Q4 2024 + +- Handle cross-session alignment in SpikeInterface (a widely requested +feature from researchers at the SWC). + +### Q2 2025 + +- Beta version of +[spikewrap](https://github.com/neuroinformatics-unit/spikewrap), +abstracting away building of ephys pipelines. + + + diff --git a/docs/source/index.md b/docs/source/index.md index 7c3d3a6..ced5612 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -2,13 +2,16 @@ On this website you can find long-form how-to guides as well as collections of small tips and tricks related to data analysis and software development in neuroscience. -The website is maintained by members of the [Neuroinformatics Unit](https://neuroinformatics.dev). The information is primarily aimed at researchers at the [Sainsbury Wellcome Centre (SWC)](https://www.sainsburywellcome.org/web/) and [Gatsby Computational Neuroscience Unit (GCNU)](https://www.ucl.ac.uk/gatsby/gatsby-computational-neuroscience-unit), though most of it should be useful to neuroscientists in general. +The website is maintained by members of the [Neuroinformatics Unit](https://neuroinformatics.dev). +The information is primarily aimed at researchers at the [Sainsbury Wellcome Centre (SWC)](https://www.sainsburywellcome.org/web/) +and +[Gatsby Computational Neuroscience Unit (GCNU)](https://www.ucl.ac.uk/gatsby/gatsby-computational-neuroscience-unit), +though most of it should be useful to neuroscientists in general. ::::{grid} 1 2 2 2 :gutter: 3 - :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Electrophysiology at the SWC :link: ephys_at_swc/index_ephys :link-type: doc @@ -44,7 +47,7 @@ How to effectively share your code and data. :maxdepth: 2 :hidden: -ephys_at_swc/index_ephys +ephys_at_swc/index behav_at_swc/index programming/index open_science/index From e730904f50ae755af1ed97827bf08f3d8936348d Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 15 May 2024 11:04:53 +0100 Subject: [PATCH 04/83] Tidy up roadmap. --- docs/source/ephys_at_swc/roadmap.md | 59 +++++++++++++---------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/docs/source/ephys_at_swc/roadmap.md b/docs/source/ephys_at_swc/roadmap.md index 51d0243..b7bede1 100644 --- a/docs/source/ephys_at_swc/roadmap.md +++ b/docs/source/ephys_at_swc/roadmap.md @@ -1,38 +1,35 @@ # Roadmap -The ultimate goal of the NIU is to create tools to centralise and automate -electrophysiology preprocessing and analysis at the SWC. We would ultimately -like to move away from researchers having to code their own bespoke pipelines, -and can instantly use centralised pipelines for their data. -Unfortunately, this will take a lot of time due to the required infrastructure building. - -In the short-term, we are focusing on helping researchers use existing community -tools to build their electrophysiology pipelines, in particular with +The ultimate goal of the NIU is to centralise and automate +electrophysiology preprocessing and analysis at the SWC. We aim to move away +from researchers having to create their own customized pipelines. + +In the short-term, we are focusing on assisting researchers use existing community +tools to build their electrophysiology pipelines, encouraging the use of [SpikeInterface](https://github.com/SpikeInterface) -We will provide support, advice, and examples from across the +We will provide support, advice, and examples from across the SWC community. We are working closely with -the SpikeInterface team to implement the tools required for researchers at the SWC. - -Concurrently, we are working to build tools to centralise preprocessing and analysis -and abstract away as much as possibly the individual script-building. -In the first instance, this requires that all data in the SWC is -organised in the same way. To this end, -we have released -[NeuroBlueprint](https://neuroblueprint.neuroinformatics.dev/) -and -[**datashuttle**](https://datashuttle.neuroinformatics.dev/). - -To abstract away the details of pipeline development in SpikeInterface are building -[spikewrap](https://github.com/neuroinformatics-unit/spikewrap) -as a centralised tool for ephys preprocessing and analysis. This will require only -setting a set of configs before running this on your data. Allowing you to -skip the pipeline-building step and get straight into preprocessing and analysis using community tools. +the SpikeInterface team to implement the tools +required for researchers at the SWC. + +Concurrently, we are developing centralise tools to facilitate +automated analysis and minimize the need for custom scripts. +Initially, this involves standardizing data organization across the SWC. +To this end, we have released +[NeuroBlueprint](https://neuroblueprint.neuroinformatics.dev/) +and +[datashuttle](https://datashuttle.neuroinformatics.dev/) to promote +project folder standardisation. +We are now building +[spikewrap](https://github.com/neuroinformatics-unit/spikewrap) +as a centralised tool for ephys preprocessing and analysis with SpikeInterface. +This aims to require only setting a configuration file specifying the type of analysis you'd like to run. ## Timeline A rough timeline for this roadmap is below. We are very keen to make sure we are -heading in the right direction, so please don't hestitate to get in contact -with any feedback on this roadmap and your priorities. +heading in the right direction, so please get in contact +with any feedback on this roadmap and your priorities. ### Q3 2024 @@ -48,9 +45,5 @@ feature from researchers at the SWC). ### Q2 2025 -- Beta version of -[spikewrap](https://github.com/neuroinformatics-unit/spikewrap), -abstracting away building of ephys pipelines. - - - +- Beta version of +[spikewrap](https://github.com/neuroinformatics-unit/spikewrap). From cc13b67799e083693a10672f7e5c89f6c2cc3f5f Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 15 May 2024 12:18:54 +0100 Subject: [PATCH 05/83] Tidy up getting started. --- docs/source/ephys_at_swc/getting_started.md | 152 +++++++++++++------- docs/source/ephys_at_swc/index.md | 19 ++- docs/source/index.md | 10 +- 3 files changed, 118 insertions(+), 63 deletions(-) diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index 0ed2e4b..0eeebf2 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -1,77 +1,133 @@ -# Getting Started +# Getting Started -Getting started with extracellular electrophysiolgoy is intimidating! There are -many different acquisition setups, packages, preprocessing, postprocessing and -analysis steps to consider. +Getting started with extracellular electrophysiology can be intimidating! +With numerous acquisition setups, software packages, preprocessing, postprocessing, +and analysis steps to consider, it's understandable to feel daunted. -A first step in getting started can be to ask for advice for your setup. Every setup -and experiment is different, and it is usually most efficient to be pointed -in the right direction from the outset rahter than waste time exploring avenues -that end up fruitless. See the [Community](#community_and_roadmap.md) sections for -details on where to get help. +A good first step in getting started is to ask for advice. Every setup +and experiment is different, and it's often most effective to +seek guidance early on. See the [Community](community) +sections for details on where to get help. -Another step in getting started with electrophysiology analysis is -to read some general introduction guides, see the resources step. -Worth taking an afternoon to read these papers, give general overview. +Before diving into the analysis, it can be useful to get an understanding +for the history and landscape of extracellular electrophysiology. +See the resources section for [general introductions](general-introduction)) +as well as more technical reading for deeper background. -After this, diving right into the preprocessing and analysis on a -dataset you have collected is useful to see what issues might come up. -We have a selection of examples in use at the SWC from rsearchers -that you can try and out contact if you have questions (both spikeinterface -and otherwise). or read more technical documentation depending on prefernce. - -Spikeinterface also has a lot of examples. - -See the resources section below for a full list of resources! +To get started with pipeline building, the +[SpikeInterface](spikeinterface) resources are a good starting point. +We also have +[Examples](examples_from_the_swc) +from researchers at the +SWC who'd be happy to answer any questions you might have. # Resources +This section is by no means exhaustive, representing only a +small collection of resources that researchers at the SWC have found +useful in getting started. + ## General Introduction -https://www.sciencedirect.com/science/article/pii/S0959438817303161 -https://iopscience.iop.org/article/10.1088/2516-1091/ac6b96/meta -past-present-future spike sorting https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4674014/ -? https://www.sciencedirect.com/science/article/pii/S0959438818301375 +Below are a selection of papers that give a general background +and overview of the extracellular electrophysiology landscape: + +[Challenges and opportunities for large-scale electrophysiology with Neuropixels probes](https://www.sciencedirect.com/science/article/pii/S0959438817303161) + +[Spike sorting: new trends and challenges of the era of high-density probes](https://iopscience.iop.org/article/10.1088/2516-1091/ac6b96/meta) + +[Past, present and future of spike sorting techniques](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4674014/) + +[Continuing progress of spike sorting in the era of big data](https://www.sciencedirect.com/science/article/pii/S0959438818301375) ## Technical Introduction -Neuropixels Day https://www.ucl.ac.uk/neuropixels/courses -https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5244825/ +Below are more technical resources on the different stages of +extracellular electrophysiology analysis. + +A particularly useful resource is the +[NeuroPixels](https://www.ucl.ac.uk/neuropixels/courses) course, with their videos published online +(e.g. [2023](https://www.ucl.ac.uk/neuropixels/training/2023-neuropixels-course)). +While these are particularly useful for NeuroPixels users, they are +useful resources for any researcher +approaching electrophysiology preprocessing and analysis. ### Preprocessing -(Bill Karsh Stuff) https://billkarsh.github.io/SpikeGLX/Sgl_help/UserManual.html -IBL white paper & the IBL repo https://figshare.com/articles/online_resource/Spike_sorting_pipeline_for_the_International_Brain_Laboratory/19705522 -Filters https://www.cell.com/neuron/pdf/S0896-6273(19)30174-6.pdf +The [IBL white paper](https://figshare.com/articles/online_resource/Spike_sorting_pipeline_for_the_International_Brain_Laboratory/19705522) +contains a clearly written overview of preprocessing steps. Similarly, Bill Karsh's +[guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on the +SpikeGLX website also gives a useful overview. + +[This paper](https://www.cell.com/neuron/pdf/S0896-6273(19)30174-6.pdf) provides a more +technical treatment of digital filtering, a key step in preprocessing and analysis. ### Spike Sorting -video https://www.youtube.com/watch?v=vSydfDvsewY -more detailed spike sorting https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf +[This video](https://www.youtube.com/watch?v=vSydfDvsewY) with Christophe Pouzat, provides +an excellent overview of the spike-sorting problem. + +[This chapter](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) provides a more +technical overview of spike sorting. It is also recommended to check out the +papers of existing spike sorting algorithms. A list of the main +spike sorters can be found [here](https://spikeinterface.readthedocs.io/en/latest/modules/sorters.html#supported-spike-sorters). + ### Quality Metrics and Manual Curation -Phy website (docs: https://phy.readthedocs.io/en/latest/) (github: https://github.com/cortex-lab/phy?tab=readme-ov-file) -Steve's Guide https://phy.readthedocs.io/en/latest/sorting_user_guide/ -Bombcell https://github.com/Julie-Fabre/bombcell -Really nice paper https://www.jneurosci.org/content/31/24/8699 -Spikeinterface page https://spikeinterface.readthedocs.io/en/latest/modules/qualitymetrics.html +Assessing the quality of spike-sorting is a key to producing high-quality data. + +These two papers provide a nice introduction to quality metrics of spike sorting: + +[Quality Metrics to Accompany Spike Sorting of Extracellular Signals](https://www.jneurosci.org/content/31/24/8699) + +[Improving data quality in neuronal population recordings](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5244825/) + +[Phy](https://github.com/cortex-lab/phy) +is the most popular tool for performing manual curation of spike sorting results. +A great guide by [Steve Lenzi](https://phy.readthedocs.io/en/latest/sorting_user_guide/) takes you +through the key steps for manual curation. + +More recently, advances in the automation of curation has been made using the +[Bombcell package](https://github.com/Julie-Fabre/bombcell). + +SpikeInterface also maintain a set of quality metrics, +[explained in detail](https://spikeinterface.readthedocs.io/en/latest/modules/qualitymetrics.html) +in their documentation. ## SpikeInterface -Github https://github.com/SpikeInterface/spikeinterface -Documentation https://spikeinterface.readthedocs.io/en/latest/index.html -Tutorials https://github.com/SpikeInterface/spiketutorials -Probeinterace https://probeinterface.readthedocs.io/en/main/ +Visit the SpikeInterface +[GitHub](https://github.com/SpikeInterface/spikeinterface) +and +[Documentation](https://spikeinterface.readthedocs.io/en/latest/index.html) +to get started. Note their documentation currently points to the developer +version, select your installed version from the list at the bottom-left +of the page. ## Other Community Tools -Connell pipeline https://github.com/AllenInstitute/ecephys_spike_sorting -Pynapple https://github.com/pynapple-org/pynapple -Spikeforest https://spikeforest.flatironinstitute.org/ -Elephant https://neuralensemble.org/elephant/ -Neural Ensemble https://groups.google.com/g/neuralensemble -IBL pipeline https://github.com/int-brain-lab/ibl-neuropixel -NeuroPixels Utils https://djoshea.github.io/neuropixel-utils/ +### Analysis + +SpikeInterface +is mainly focused on preprocessing, spike sorting and quality metrics. +The [Pynapple](https://github.com/pynapple-org/pynapple) +and +[Elephant]( https://neuralensemble.org/elephant/) +both provide nice toolboxes for analysing data post-sorting. + +The [SpikeForest](https://spikeforest.flatironinstitute.org/) +project is an excellent resource for assessing the performance of +different spike-sorting algorithms across probe types and brain regions. + +### Pipelines + +While the community has gradually coalesced around SpikeInterface, +other robust pipelines predating SpikeInterface provide a great technical resource: + +[The Allen Spike sorting pipeline](https://github.com/AllenInstitute/ecephys_spike_sorting) +[The IBL sorting pipeline](https://github.com/int-brain-lab/ibl-neuropixel) +[NeuroPixels Utils](https://djoshea.github.io/neuropixel-utils/) package +(MATLAB) and related [NeuroPyxels](https://github.com/m-beau/NeuroPyxels). diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index 69f3fe6..f668a07 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -1,24 +1,23 @@ # Electrophysiology at the SWC -This page acts as an information hub for researchers using +This page acts as an information hub for researchers using extracellular electrophysiology in the SWC. It contains [guides](getting_started.md) -for preprocessing and analysis, as well as -[example scripts](examples_from_the_swc.md) +for preprocessing and analysis, as well as +[example scripts](examples_from_the_swc.md) in use by researchers in the building. -We encourage all types of contributions. If you've like to contribute a guide or pipeline, -please don't hesitate to get in contact! See the -[Community](community.md) +We encourage all types of contributions. If you've like to contribute a guide or pipeline, +please don't hesitate to get in contact! See the +[Community](community.md) page for more details. -This page is maintained by the -[Neuroinformatics Unit](neuroinformatics.dev). The +This page is maintained by the +[Neuroinformatics Unit](https://neuroinformatics.dev). The [Roadmap](roadmap.md) -lays out our plans for developing community +lays out our plans for developing community analysis tools at the SWC. - ::::{grid} 1 2 2 2 :gutter: 3 diff --git a/docs/source/index.md b/docs/source/index.md index ced5612..42ddc90 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -2,10 +2,10 @@ On this website you can find long-form how-to guides as well as collections of small tips and tricks related to data analysis and software development in neuroscience. -The website is maintained by members of the [Neuroinformatics Unit](https://neuroinformatics.dev). -The information is primarily aimed at researchers at the [Sainsbury Wellcome Centre (SWC)](https://www.sainsburywellcome.org/web/) -and -[Gatsby Computational Neuroscience Unit (GCNU)](https://www.ucl.ac.uk/gatsby/gatsby-computational-neuroscience-unit), +The website is maintained by members of the [Neuroinformatics Unit](https://neuroinformatics.dev). +The information is primarily aimed at researchers at the [Sainsbury Wellcome Centre (SWC)](https://www.sainsburywellcome.org/web/) +and +[Gatsby Computational Neuroscience Unit (GCNU)](https://www.ucl.ac.uk/gatsby/gatsby-computational-neuroscience-unit), though most of it should be useful to neuroscientists in general. @@ -13,7 +13,7 @@ though most of it should be useful to neuroscientists in general. :gutter: 3 :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Electrophysiology at the SWC -:link: ephys_at_swc/index_ephys +:link: ephys_at_swc/index :link-type: doc Resources for preprocessing and analysis of extracellular electrophysiology data. From e8af5a935b1e255513f1f57d38ad1e46879862de Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 15 May 2024 13:21:42 +0100 Subject: [PATCH 06/83] Fix linting. --- docs/source/behav_at_swc/index.md | 2 +- docs/source/ephys_at_swc/community.md | 10 +++++----- docs/source/ephys_at_swc/examples_from_the_swc.md | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/behav_at_swc/index.md b/docs/source/behav_at_swc/index.md index 46e4c5f..a78bfbf 100644 --- a/docs/source/behav_at_swc/index.md +++ b/docs/source/behav_at_swc/index.md @@ -1,6 +1,6 @@ # Behaviour at the SWC -Guides related to the analysis of neuroscientific data, spanning a wide range of data types such as electrophysiology, behaviour, calcium imaging, histology, etc. +Guides related to the analysis of neuroscientific data, spanning a wide range of data types such as electrophysiology, behaviour, calcium imaging, histology, etc. The focus may be on the use of specific software tools, or on more general analysis tasks and concepts. ```{toctree} diff --git a/docs/source/ephys_at_swc/community.md b/docs/source/ephys_at_swc/community.md index 357c740..fddeb47 100644 --- a/docs/source/ephys_at_swc/community.md +++ b/docs/source/ephys_at_swc/community.md @@ -1,22 +1,22 @@ # Community -This site is maintained by the +This site is maintained by the [NeuroInformatics Unit](https://neuroinformatics.dev/). -Please don't hesitate to contact us +Please don't hesitate to contact us (in particular Joe Ziminski) on Slack with any questions or feedback on electrophysiology analysis at the SWC. -For information and advice on extracellular electrophysiology from the SWC community, the +For information and advice on extracellular electrophysiology from the SWC community, the best place to go is the `#forum-extracellular-ephys` channel on the SWC Slack. Outside the SWC, you can address any questions or issues about [SpikeInterface](https://github.com/SpikeInterface) -by raising an issue on their +by raising an issue on their [GitHub repository](https://github.com/SpikeInterface/spikeinterface/issues). They are very friendly and happy to answer any questions! -In addition, the +In addition, the [Neuropixels](https://neuropixelsgroup.slack.com/join/shared_invite/zt-2c8u0k21u-CC4wSkb8~U_Fkrf3HHf_kw#/shared-invite/email) Slack is a great resource, with an active community discussing both extracellular electrophysiology acquisition and analysis. diff --git a/docs/source/ephys_at_swc/examples_from_the_swc.md b/docs/source/ephys_at_swc/examples_from_the_swc.md index 057beca..97adf7a 100644 --- a/docs/source/ephys_at_swc/examples_from_the_swc.md +++ b/docs/source/ephys_at_swc/examples_from_the_swc.md @@ -1,3 +1,3 @@ # Examples -should be a sphinx gallery \ No newline at end of file +should be a sphinx gallery From ed05f82934dfab2346fbe60bf1ea185c9e86b106 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 15 May 2024 20:42:57 +0100 Subject: [PATCH 07/83] Add examples and sphinx gallery foundation. --- docs/requirements.txt | 3 + docs/source/conf.py | 15 ++++ docs/source/ephys_at_swc/examples/README.rst | 9 ++ .../source/ephys_at_swc/examples/example_1.py | 28 ++++++ .../ephys_at_swc/examples_from_the_swc.md | 28 +++++- .../ephys_at_swc/gallery/example_1.ipynb | 68 +++++++++++++++ docs/source/ephys_at_swc/gallery/example_1.py | 28 ++++++ .../source/ephys_at_swc/gallery/example_1.rst | 80 ++++++++++++++++++ .../images/thumb/sphx_glr_example_1_thumb.png | Bin 0 -> 26794 bytes docs/source/ephys_at_swc/gallery/index.rst | 56 ++++++++++++ .../gallery/sg_execution_times.rst | 37 ++++++++ docs/source/ephys_at_swc/other_pipelines.md | 1 + docs/source/sg_execution_times.rst | 37 ++++++++ 13 files changed, 388 insertions(+), 2 deletions(-) create mode 100644 docs/source/ephys_at_swc/examples/README.rst create mode 100644 docs/source/ephys_at_swc/examples/example_1.py create mode 100644 docs/source/ephys_at_swc/gallery/example_1.ipynb create mode 100644 docs/source/ephys_at_swc/gallery/example_1.py create mode 100644 docs/source/ephys_at_swc/gallery/example_1.rst create mode 100644 docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_example_1_thumb.png create mode 100644 docs/source/ephys_at_swc/gallery/index.rst create mode 100644 docs/source/ephys_at_swc/gallery/sg_execution_times.rst create mode 100644 docs/source/ephys_at_swc/other_pipelines.md create mode 100644 docs/source/sg_execution_times.rst diff --git a/docs/requirements.txt b/docs/requirements.txt index 18b6962..ece3406 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,3 +6,6 @@ pydata-sphinx-theme sphinx sphinx-copybutton sphinx-design + +sphinx-gallery +matplotlib \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index 0609f0c..9aa65fe 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -42,6 +42,7 @@ "myst_parser", "numpydoc", "nbsphinx", + "sphinx_gallery.gen_gallery", ] # Configure the myst parser to enable cool markdown features @@ -74,6 +75,12 @@ # to ensure that include files (partial pages) aren't built, exclude them # https://github.com/sphinx-doc/sphinx/issues/1965#issuecomment-124732907 "**/includes/**", + # exclude .py and .ipynb files in auto_examples generated by sphinx-gallery + # this is to prevent sphinx from complaining about duplicate source files + "gallery/*.ipynb", + "gallery/*.py", + "getting_started/*.ipynb", + "getting_started/*.py", ] # Ignore certain URLs from being checked @@ -148,3 +155,11 @@ # Configure the code block copy button # don't copy line numbers, prompts, or console outputs copybutton_exclude = ".linenos, .gp, .go" + +# Configure sphinx-gallery +sphinx_gallery_conf = { + 'examples_dirs': ["ephys_at_swc/examples"], # path to your example scripts + 'gallery_dirs': ["ephys_at_swc/gallery"], # path to where to save gallery generated output + 'download_all_examples': False, + 'filename_pattern': r'two_moons\.py', +} diff --git a/docs/source/ephys_at_swc/examples/README.rst b/docs/source/ephys_at_swc/examples/README.rst new file mode 100644 index 0000000..391549c --- /dev/null +++ b/docs/source/ephys_at_swc/examples/README.rst @@ -0,0 +1,9 @@ +Examples +======== + +Below is a gallery of examples. + +`Link text `_ + + + diff --git a/docs/source/ephys_at_swc/examples/example_1.py b/docs/source/ephys_at_swc/examples/example_1.py new file mode 100644 index 0000000..ac54b91 --- /dev/null +++ b/docs/source/ephys_at_swc/examples/example_1.py @@ -0,0 +1,28 @@ +""" +The Two Moons task +========================= +Use UNLE to fit Two Moons +""" + +# %% +# This is a section header +# ------------------------ +# This is the first section! +# The `#%%` signifies to Sphinx-Gallery that this text should be rendered as +# reST and if using one of the above IDE/plugin's, also signifies the start of a +# 'code block'. + +# This line won't be rendered as reST because there's a space after the last block. +myvariable = 2 +print("my variable is {}".format(myvariable)) +# This is the end of the 'code block' (if using an above IDE). All code within +# this block can be easily executed all at once. + +# %% +# This is another section header +# ------------------------------ +# +# In the built documentation, it will be rendered as reST after the code above! +# This is also another code block. + +print('my variable plus 2 is {}'.format(myvariable + 2)) \ No newline at end of file diff --git a/docs/source/ephys_at_swc/examples_from_the_swc.md b/docs/source/ephys_at_swc/examples_from_the_swc.md index 97adf7a..96d1285 100644 --- a/docs/source/ephys_at_swc/examples_from_the_swc.md +++ b/docs/source/ephys_at_swc/examples_from_the_swc.md @@ -1,3 +1,27 @@ -# Examples +# Examples from the SWC -should be a sphinx gallery +On this page we have collected some of the many preprocessing +and analysis scripts used at the SWC. + +::::{grid} 1 2 2 2 +:gutter: 3 + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` SpikeInterface Pipelines +:link: gallery/index +:link-type: doc +::: + +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Other Pipelines +:link: other_pipelines +:link-type: doc +::: + +:::: + +```{toctree} +:maxdepth: 1 +:hidden: + +gallery/index +other_pipelines +``` \ No newline at end of file diff --git a/docs/source/ephys_at_swc/gallery/example_1.ipynb b/docs/source/ephys_at_swc/gallery/example_1.ipynb new file mode 100644 index 0000000..d45722c --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/example_1.ipynb @@ -0,0 +1,68 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# The Two Moons task\nUse UNLE to fit Two Moons\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## This is a section header\nThis is the first section!\nThe `#%%` signifies to Sphinx-Gallery that this text should be rendered as\nreST and if using one of the above IDE/plugin's, also signifies the start of a\n'code block'.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# This line won't be rendered as reST because there's a space after the last block.\nmyvariable = 2\nprint(\"my variable is {}\".format(myvariable))\n# This is the end of the 'code block' (if using an above IDE). All code within\n# this block can be easily executed all at once." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## This is another section header\n\nIn the built documentation, it will be rendered as reST after the code above!\nThis is also another code block.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print('my variable plus 2 is {}'.format(myvariable + 2))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/source/ephys_at_swc/gallery/example_1.py b/docs/source/ephys_at_swc/gallery/example_1.py new file mode 100644 index 0000000..ac54b91 --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/example_1.py @@ -0,0 +1,28 @@ +""" +The Two Moons task +========================= +Use UNLE to fit Two Moons +""" + +# %% +# This is a section header +# ------------------------ +# This is the first section! +# The `#%%` signifies to Sphinx-Gallery that this text should be rendered as +# reST and if using one of the above IDE/plugin's, also signifies the start of a +# 'code block'. + +# This line won't be rendered as reST because there's a space after the last block. +myvariable = 2 +print("my variable is {}".format(myvariable)) +# This is the end of the 'code block' (if using an above IDE). All code within +# this block can be easily executed all at once. + +# %% +# This is another section header +# ------------------------------ +# +# In the built documentation, it will be rendered as reST after the code above! +# This is also another code block. + +print('my variable plus 2 is {}'.format(myvariable + 2)) \ No newline at end of file diff --git a/docs/source/ephys_at_swc/gallery/example_1.rst b/docs/source/ephys_at_swc/gallery/example_1.rst new file mode 100644 index 0000000..cb4e4e3 --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/example_1.rst @@ -0,0 +1,80 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "ephys_at_swc\gallery\example_1.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_ephys_at_swc_gallery_example_1.py: + + +The Two Moons task +========================= +Use UNLE to fit Two Moons + +.. GENERATED FROM PYTHON SOURCE LINES 8-14 + +This is a section header +------------------------ +This is the first section! +The `#%%` signifies to Sphinx-Gallery that this text should be rendered as +reST and if using one of the above IDE/plugin's, also signifies the start of a +'code block'. + +.. GENERATED FROM PYTHON SOURCE LINES 14-21 + +.. code-block:: Python + + + # This line won't be rendered as reST because there's a space after the last block. + myvariable = 2 + print("my variable is {}".format(myvariable)) + # This is the end of the 'code block' (if using an above IDE). All code within + # this block can be easily executed all at once. + + +.. GENERATED FROM PYTHON SOURCE LINES 22-27 + +This is another section header +------------------------------ + +In the built documentation, it will be rendered as reST after the code above! +This is also another code block. + +.. GENERATED FROM PYTHON SOURCE LINES 27-28 + +.. code-block:: Python + + + print('my variable plus 2 is {}'.format(myvariable + 2)) + +.. _sphx_glr_download_ephys_at_swc_gallery_example_1.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: example_1.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: example_1.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_example_1_thumb.png b/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_example_1_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5fed589d17fe6ee62d6a9788519dba471fbd65 GIT binary patch literal 26794 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 literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/gallery/index.rst b/docs/source/ephys_at_swc/gallery/index.rst new file mode 100644 index 0000000..d2261d7 --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/index.rst @@ -0,0 +1,56 @@ +:orphan: + +Examples +======== + +Below is a gallery of examples. + +`Link text `_ + + + + + + +.. raw:: html + +
+ +.. thumbnail-parent-div-open + +.. raw:: html + +
+ +.. only:: html + + .. image:: /ephys_at_swc/gallery/images/thumb/sphx_glr_example_1_thumb.png + :alt: + + :ref:`sphx_glr_ephys_at_swc_gallery_example_1.py` + +.. raw:: html + +
The Two Moons task
+
+ + +.. thumbnail-parent-div-close + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /ephys_at_swc/gallery/example_1 + + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/gallery/sg_execution_times.rst b/docs/source/ephys_at_swc/gallery/sg_execution_times.rst new file mode 100644 index 0000000..8e79fed --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/sg_execution_times.rst @@ -0,0 +1,37 @@ + +:orphan: + +.. _sphx_glr_ephys_at_swc_gallery_sg_execution_times: + + +Computation times +================= +**00:00.000** total execution time for 1 file **from ephys_at_swc\gallery**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_ephys_at_swc_gallery_example_1.py` (``example_1.py``) + - 00:00.000 + - 0.0 diff --git a/docs/source/ephys_at_swc/other_pipelines.md b/docs/source/ephys_at_swc/other_pipelines.md new file mode 100644 index 0000000..c54f54a --- /dev/null +++ b/docs/source/ephys_at_swc/other_pipelines.md @@ -0,0 +1 @@ +# Other Pipelines \ No newline at end of file diff --git a/docs/source/sg_execution_times.rst b/docs/source/sg_execution_times.rst new file mode 100644 index 0000000..3c0561b --- /dev/null +++ b/docs/source/sg_execution_times.rst @@ -0,0 +1,37 @@ + +:orphan: + +.. _sphx_glr_sg_execution_times: + + +Computation times +================= +**00:00.000** total execution time for 1 file **from all galleries**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_ephys_at_swc_examples_example_1.py` (``ephys_at_swc\examples\example_1.py``) + - 00:00.000 + - 0.0 From 05cf311fad2a6783486412a7a0d90fe0a61e72f8 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 17:58:02 +0100 Subject: [PATCH 08/83] Working on sphinx-gallerys. --- docs/requirements.txt | 3 ++- docs/source/ephys_at_swc/examples_from_the_swc.md | 6 +++--- docs/source/ephys_at_swc/gallery/example_1.ipynb | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index ece3406..eeb0313 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,6 @@ +jupyter linkify-it-py +matplotlib myst-parser nbsphinx numpydoc @@ -8,4 +10,3 @@ sphinx-copybutton sphinx-design sphinx-gallery -matplotlib \ No newline at end of file diff --git a/docs/source/ephys_at_swc/examples_from_the_swc.md b/docs/source/ephys_at_swc/examples_from_the_swc.md index 96d1285..911583a 100644 --- a/docs/source/ephys_at_swc/examples_from_the_swc.md +++ b/docs/source/ephys_at_swc/examples_from_the_swc.md @@ -1,7 +1,7 @@ # Examples from the SWC On this page we have collected some of the many preprocessing -and analysis scripts used at the SWC. +and analysis scripts used at the SWC. ::::{grid} 1 2 2 2 :gutter: 3 @@ -12,7 +12,7 @@ and analysis scripts used at the SWC. ::: :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Other Pipelines -:link: other_pipelines +:link: /ephys_at_swc/gallery/example_1 :link-type: doc ::: @@ -24,4 +24,4 @@ and analysis scripts used at the SWC. gallery/index other_pipelines -``` \ No newline at end of file +``` diff --git a/docs/source/ephys_at_swc/gallery/example_1.ipynb b/docs/source/ephys_at_swc/gallery/example_1.ipynb index d45722c..e56a92f 100644 --- a/docs/source/ephys_at_swc/gallery/example_1.ipynb +++ b/docs/source/ephys_at_swc/gallery/example_1.ipynb @@ -60,9 +60,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.10.14" } }, "nbformat": 4, "nbformat_minor": 0 -} \ No newline at end of file +} From add5646e1218326abbbc12d08e6d3f6f2f75d299 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 17:59:10 +0100 Subject: [PATCH 09/83] Remove / move roadmap. --- docs/source/ephys_at_swc/index.md | 11 ++++--- docs/source/ephys_at_swc/roadmap.md | 49 ----------------------------- 2 files changed, 6 insertions(+), 54 deletions(-) delete mode 100644 docs/source/ephys_at_swc/roadmap.md diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index f668a07..7fdb193 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -12,11 +12,12 @@ please don't hesitate to get in contact! See the [Community](community.md) page for more details. -This page is maintained by the -[Neuroinformatics Unit](https://neuroinformatics.dev). The -[Roadmap](roadmap.md) -lays out our plans for developing community -analysis tools at the SWC. +This page is maintained by the [Neuroinformatics Unit](https://neuroinformatics.dev). +We are focused on building community tools to automate +and centralise electrophysiology analysis. If you'd +like to read more about our plans, please visit our +[Roadmap](). + ::::{grid} 1 2 2 2 :gutter: 3 diff --git a/docs/source/ephys_at_swc/roadmap.md b/docs/source/ephys_at_swc/roadmap.md deleted file mode 100644 index b7bede1..0000000 --- a/docs/source/ephys_at_swc/roadmap.md +++ /dev/null @@ -1,49 +0,0 @@ -# Roadmap - -The ultimate goal of the NIU is to centralise and automate -electrophysiology preprocessing and analysis at the SWC. We aim to move away -from researchers having to create their own customized pipelines. - -In the short-term, we are focusing on assisting researchers use existing community -tools to build their electrophysiology pipelines, encouraging the use of -[SpikeInterface](https://github.com/SpikeInterface) -We will provide support, advice, and examples from across the -SWC community. We are working closely with -the SpikeInterface team to implement the tools -required for researchers at the SWC. - -Concurrently, we are developing centralise tools to facilitate -automated analysis and minimize the need for custom scripts. -Initially, this involves standardizing data organization across the SWC. -To this end, we have released -[NeuroBlueprint](https://neuroblueprint.neuroinformatics.dev/) -and -[datashuttle](https://datashuttle.neuroinformatics.dev/) to promote -project folder standardisation. -We are now building -[spikewrap](https://github.com/neuroinformatics-unit/spikewrap) -as a centralised tool for ephys preprocessing and analysis with SpikeInterface. -This aims to require only setting a configuration file specifying the type of analysis you'd like to run. - -## Timeline - -A rough timeline for this roadmap is below. We are very keen to make sure we are -heading in the right direction, so please get in contact -with any feedback on this roadmap and your priorities. - -### Q3 2024 - -Working directly with SpikeInterface to support their initiatives in: -- Improving the documentation -- Upgrading their interface and stabilising the API -- Adding new features (those requested by SWC researchers) - -### Q4 2024 - -- Handle cross-session alignment in SpikeInterface (a widely requested -feature from researchers at the SWC). - -### Q2 2025 - -- Beta version of -[spikewrap](https://github.com/neuroinformatics-unit/spikewrap). From 738a7546d067788b20901af8106262427f7ba31d Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 20:29:43 +0100 Subject: [PATCH 10/83] fix linting. --- docs/source/ephys_at_swc/examples/README.rst | 3 --- docs/source/ephys_at_swc/examples/example_1.py | 2 +- docs/source/ephys_at_swc/gallery/example_1.py | 2 +- docs/source/ephys_at_swc/other_pipelines.md | 2 +- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/source/ephys_at_swc/examples/README.rst b/docs/source/ephys_at_swc/examples/README.rst index 391549c..ebea857 100644 --- a/docs/source/ephys_at_swc/examples/README.rst +++ b/docs/source/ephys_at_swc/examples/README.rst @@ -4,6 +4,3 @@ Examples Below is a gallery of examples. `Link text `_ - - - diff --git a/docs/source/ephys_at_swc/examples/example_1.py b/docs/source/ephys_at_swc/examples/example_1.py index ac54b91..b6db2c5 100644 --- a/docs/source/ephys_at_swc/examples/example_1.py +++ b/docs/source/ephys_at_swc/examples/example_1.py @@ -25,4 +25,4 @@ # In the built documentation, it will be rendered as reST after the code above! # This is also another code block. -print('my variable plus 2 is {}'.format(myvariable + 2)) \ No newline at end of file +print('my variable plus 2 is {}'.format(myvariable + 2)) diff --git a/docs/source/ephys_at_swc/gallery/example_1.py b/docs/source/ephys_at_swc/gallery/example_1.py index ac54b91..b6db2c5 100644 --- a/docs/source/ephys_at_swc/gallery/example_1.py +++ b/docs/source/ephys_at_swc/gallery/example_1.py @@ -25,4 +25,4 @@ # In the built documentation, it will be rendered as reST after the code above! # This is also another code block. -print('my variable plus 2 is {}'.format(myvariable + 2)) \ No newline at end of file +print('my variable plus 2 is {}'.format(myvariable + 2)) diff --git a/docs/source/ephys_at_swc/other_pipelines.md b/docs/source/ephys_at_swc/other_pipelines.md index c54f54a..db3f2b2 100644 --- a/docs/source/ephys_at_swc/other_pipelines.md +++ b/docs/source/ephys_at_swc/other_pipelines.md @@ -1 +1 @@ -# Other Pipelines \ No newline at end of file +# Other Pipelines From b24b7ee8d72760d8f3580094784a8c8797eac093 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 20:33:16 +0100 Subject: [PATCH 11/83] Add pandoc dependency. --- docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index eeb0313..d6f47ae 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -4,6 +4,7 @@ matplotlib myst-parser nbsphinx numpydoc +pandoc pydata-sphinx-theme sphinx sphinx-copybutton From 4dd133fc3283e1ee644f83135235240db67d426d Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 21:06:01 +0100 Subject: [PATCH 12/83] Try updating github actions for building docs with sphinx. --- .github/workflows/docs_build_and_deploy.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs_build_and_deploy.yml b/.github/workflows/docs_build_and_deploy.yml index 2dcd468..c0b1a18 100644 --- a/.github/workflows/docs_build_and_deploy.yml +++ b/.github/workflows/docs_build_and_deploy.yml @@ -27,7 +27,9 @@ jobs: needs: linting runs-on: ubuntu-latest steps: - - uses: neuroinformatics-unit/actions/build_sphinx_docs@v2 + - uses: neuroinformatics-unit/actions/build_sphinx_docs@main + with: + python-version: 3.11 deploy_sphinx_docs: name: Deploy Sphinx Docs @@ -37,6 +39,6 @@ jobs: if: github.event_name == 'push' && github.ref_name == 'main' runs-on: ubuntu-latest steps: - - uses: neuroinformatics-unit/actions/deploy_sphinx_docs@v2 + - uses: neuroinformatics-unit/actions/deploy_sphinx_docs@main with: secret_input: ${{ secrets.GITHUB_TOKEN }} From 428078cca3c3ace89249cf77ac4d4eeab0701b43 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 21:19:53 +0100 Subject: [PATCH 13/83] try uninstall jupyter. --- docs/requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index d6f47ae..70b82c3 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,3 @@ -jupyter linkify-it-py matplotlib myst-parser From 3e45da11e1cedd96a499c71a53b5487dcbbfb894 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 21:32:10 +0100 Subject: [PATCH 14/83] try ipython dependency. --- docs/requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 70b82c3..d782297 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,12 +1,11 @@ +ipython linkify-it-py matplotlib myst-parser nbsphinx numpydoc -pandoc pydata-sphinx-theme sphinx sphinx-copybutton sphinx-design - sphinx-gallery From fece33a07e2277f144151fe21442de62e0b2f310 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 21:35:01 +0100 Subject: [PATCH 15/83] add ipykernel --- docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index d782297..4c50deb 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,4 @@ +ipykernel ipython linkify-it-py matplotlib From 2c83212feedb950027813854f3fc7da57494e205 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 21:57:28 +0100 Subject: [PATCH 16/83] copy all movement deps. --- docs/requirements.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 4c50deb..f5c2086 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,12 +1,15 @@ -ipykernel -ipython linkify-it-py matplotlib myst-parser nbsphinx numpydoc pydata-sphinx-theme -sphinx + +setuptools-scm +sphinx<7.2 +sphinx-autodoc-typehints sphinx-copybutton sphinx-design sphinx-gallery +sphinx-sitemap +tables From 329ae9de42167c91f2a6e1878b6dde8e9b2fbdcd Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 22:09:22 +0100 Subject: [PATCH 17/83] Fix links and example build error. --- docs/source/conf.py | 2 -- docs/source/ephys_at_swc/community.md | 2 +- docs/source/ephys_at_swc/gallery/index.rst | 4 +--- docs/source/ephys_at_swc/getting_started.md | 6 +++--- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 9aa65fe..dc297bf 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -160,6 +160,4 @@ sphinx_gallery_conf = { 'examples_dirs': ["ephys_at_swc/examples"], # path to your example scripts 'gallery_dirs': ["ephys_at_swc/gallery"], # path to where to save gallery generated output - 'download_all_examples': False, - 'filename_pattern': r'two_moons\.py', } diff --git a/docs/source/ephys_at_swc/community.md b/docs/source/ephys_at_swc/community.md index fddeb47..e080822 100644 --- a/docs/source/ephys_at_swc/community.md +++ b/docs/source/ephys_at_swc/community.md @@ -17,6 +17,6 @@ They are very friendly and happy to answer any questions! In addition, the -[Neuropixels](https://neuropixelsgroup.slack.com/join/shared_invite/zt-2c8u0k21u-CC4wSkb8~U_Fkrf3HHf_kw#/shared-invite/email) +[Neuropixels](https://neuropixelsgroup.slack.com/) Slack is a great resource, with an active community discussing both extracellular electrophysiology acquisition and analysis. diff --git a/docs/source/ephys_at_swc/gallery/index.rst b/docs/source/ephys_at_swc/gallery/index.rst index d2261d7..782bb88 100644 --- a/docs/source/ephys_at_swc/gallery/index.rst +++ b/docs/source/ephys_at_swc/gallery/index.rst @@ -4,9 +4,7 @@ Examples ======== Below is a gallery of examples. - -`Link text `_ - +(note, rst links are possible here). diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index 0eeebf2..6da1cb0 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -32,13 +32,13 @@ useful in getting started. Below are a selection of papers that give a general background and overview of the extracellular electrophysiology landscape: -[Challenges and opportunities for large-scale electrophysiology with Neuropixels probes](https://www.sciencedirect.com/science/article/pii/S0959438817303161) +[Challenges and opportunities for large-scale electrophysiology with Neuropixels probes](https://pubmed.ncbi.nlm.nih.gov/29444488/) [Spike sorting: new trends and challenges of the era of high-density probes](https://iopscience.iop.org/article/10.1088/2516-1091/ac6b96/meta) [Past, present and future of spike sorting techniques](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4674014/) -[Continuing progress of spike sorting in the era of big data](https://www.sciencedirect.com/science/article/pii/S0959438818301375) +[Continuing progress of spike sorting in the era of big data](https://pubmed.ncbi.nlm.nih.gov/30856552/) ## Technical Introduction @@ -59,7 +59,7 @@ contains a clearly written overview of preprocessing steps. Similarly, Bill Kars [guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on the SpikeGLX website also gives a useful overview. -[This paper](https://www.cell.com/neuron/pdf/S0896-6273(19)30174-6.pdf) provides a more +[This paper](https://pubmed.ncbi.nlm.nih.gov/30998899/) provides a more technical treatment of digital filtering, a key step in preprocessing and analysis. ### Spike Sorting From 308617b4be835044630ce9855589a9a97d02cf4f Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 22:14:34 +0100 Subject: [PATCH 18/83] fix broken link. --- docs/source/ephys_at_swc/examples/README.rst | 2 +- docs/source/ephys_at_swc/index.md | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/source/ephys_at_swc/examples/README.rst b/docs/source/ephys_at_swc/examples/README.rst index ebea857..1788565 100644 --- a/docs/source/ephys_at_swc/examples/README.rst +++ b/docs/source/ephys_at_swc/examples/README.rst @@ -3,4 +3,4 @@ Examples Below is a gallery of examples. -`Link text `_ +rst links can be used here. diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index 7fdb193..168d5c3 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -51,5 +51,4 @@ like to read more about our plans, please visit our getting_started examples_from_the_swc community -roadmap ``` From efadb92b05da8c98c0fefdcd144471c8a17824fe Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 22:19:22 +0100 Subject: [PATCH 19/83] Remove sphinx autodoc as uneeded, probably isn't related to build error. --- docs/requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index f5c2086..03d323c 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -7,7 +7,6 @@ pydata-sphinx-theme setuptools-scm sphinx<7.2 -sphinx-autodoc-typehints sphinx-copybutton sphinx-design sphinx-gallery From cf653c9707cbfaf05751752387a0fa3761d3c6ea Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 22:21:50 +0100 Subject: [PATCH 20/83] Remove tables. --- docs/requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 03d323c..20af2e0 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -11,4 +11,3 @@ sphinx-copybutton sphinx-design sphinx-gallery sphinx-sitemap -tables From b75918cdb1f53b762442ad321229b2f0c52de7e1 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 22:25:13 +0100 Subject: [PATCH 21/83] Remove sitemap. --- docs/requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 20af2e0..ba9231b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -10,4 +10,3 @@ sphinx<7.2 sphinx-copybutton sphinx-design sphinx-gallery -sphinx-sitemap From 4fb486cdfc4adcb75e96f2358820490b80d087f6 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 22:27:16 +0100 Subject: [PATCH 22/83] unpin sphinx. --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index ba9231b..5713d00 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,7 +6,7 @@ numpydoc pydata-sphinx-theme setuptools-scm -sphinx<7.2 +sphinx sphinx-copybutton sphinx-design sphinx-gallery From 9efc4c96f475b62ba3cb1b4434a059786814f59d Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 22:30:44 +0100 Subject: [PATCH 23/83] try up to 7.3 --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 5713d00..5fab5bd 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,7 +6,7 @@ numpydoc pydata-sphinx-theme setuptools-scm -sphinx +sphinx<7.3 sphinx-copybutton sphinx-design sphinx-gallery From 10f28ed4575dc124d53853aa55f22963d2f187e1 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 16 May 2024 22:32:44 +0100 Subject: [PATCH 24/83] Okay, pin to sphinx less than 7.2 --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 5fab5bd..ba9231b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,7 +6,7 @@ numpydoc pydata-sphinx-theme setuptools-scm -sphinx<7.3 +sphinx<7.2 sphinx-copybutton sphinx-design sphinx-gallery From 6c867b43d2380f582816a57d0959959869d8f9ab Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Thu, 16 May 2024 22:37:02 +0100 Subject: [PATCH 25/83] Update docs/source/behav_at_swc/index.md Co-authored-by: Adam Tyson --- docs/source/behav_at_swc/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/behav_at_swc/index.md b/docs/source/behav_at_swc/index.md index a78bfbf..1e52ee9 100644 --- a/docs/source/behav_at_swc/index.md +++ b/docs/source/behav_at_swc/index.md @@ -1,4 +1,4 @@ -# Behaviour at the SWC +# Behaviour Guides related to the analysis of neuroscientific data, spanning a wide range of data types such as electrophysiology, behaviour, calcium imaging, histology, etc. The focus may be on the use of specific software tools, or on more general analysis tasks and concepts. From f445f333335d7cb87e9beb69d88cb82ffa8bbbfa Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Thu, 16 May 2024 22:37:09 +0100 Subject: [PATCH 26/83] Update docs/source/index.md Co-authored-by: Adam Tyson --- docs/source/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index 42ddc90..d02675d 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -19,7 +19,7 @@ though most of it should be useful to neuroscientists in general. Resources for preprocessing and analysis of extracellular electrophysiology data. ::: -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Behaviour at the SWC +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Behaviour :link: behav_at_swc/index :link-type: doc From cfd55c6667b3cb85535c4e1f942303f9c0368095 Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Thu, 16 May 2024 22:37:29 +0100 Subject: [PATCH 27/83] Update docs/source/index.md Co-authored-by: Adam Tyson --- docs/source/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index d02675d..ee44a07 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -12,7 +12,7 @@ though most of it should be useful to neuroscientists in general. ::::{grid} 1 2 2 2 :gutter: 3 -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Electrophysiology at the SWC +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Electrophysiology :link: ephys_at_swc/index :link-type: doc From cdf0fa1ad602736ac9d329c93cd13844d40c54e7 Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Thu, 16 May 2024 22:37:36 +0100 Subject: [PATCH 28/83] Update docs/source/ephys_at_swc/index.md Co-authored-by: Adam Tyson --- docs/source/ephys_at_swc/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index 168d5c3..a196fc0 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -1,4 +1,4 @@ -# Electrophysiology at the SWC +# Electrophysiology This page acts as an information hub for researchers using extracellular electrophysiology in the SWC. It contains From c743816c1d920ed220b32f5457cb16b4f14dfc1c Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Thu, 16 May 2024 22:37:55 +0100 Subject: [PATCH 29/83] Update docs/source/behav_at_swc/index.md Co-authored-by: Adam Tyson --- docs/source/behav_at_swc/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/behav_at_swc/index.md b/docs/source/behav_at_swc/index.md index 1e52ee9..47ce43e 100644 --- a/docs/source/behav_at_swc/index.md +++ b/docs/source/behav_at_swc/index.md @@ -1,6 +1,6 @@ # Behaviour -Guides related to the analysis of neuroscientific data, spanning a wide range of data types such as electrophysiology, behaviour, calcium imaging, histology, etc. +Guides related to the analysis of behavioural data. The focus may be on the use of specific software tools, or on more general analysis tasks and concepts. ```{toctree} From fa0e999af31a83dd9be542bd65fe4d1c5defe839 Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Thu, 16 May 2024 22:38:19 +0100 Subject: [PATCH 30/83] Update docs/source/ephys_at_swc/getting_started.md Co-authored-by: Adam Tyson --- docs/source/ephys_at_swc/getting_started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index 6da1cb0..1be8fdd 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -11,7 +11,7 @@ sections for details on where to get help. Before diving into the analysis, it can be useful to get an understanding for the history and landscape of extracellular electrophysiology. -See the resources section for [general introductions](general-introduction)) +See the resources section for [general introductions](general-introduction) as well as more technical reading for deeper background. To get started with pipeline building, the From ae99bcec93bf563e6c047a9e32bcb7d50e606e9c Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Thu, 16 May 2024 22:38:30 +0100 Subject: [PATCH 31/83] Update docs/source/ephys_at_swc/getting_started.md Co-authored-by: Adam Tyson --- docs/source/ephys_at_swc/getting_started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index 1be8fdd..d132425 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -85,7 +85,7 @@ These two papers provide a nice introduction to quality metrics of spike sorting [Phy](https://github.com/cortex-lab/phy) is the most popular tool for performing manual curation of spike sorting results. -A great guide by [Steve Lenzi](https://phy.readthedocs.io/en/latest/sorting_user_guide/) takes you +A great [guide by Steve Lenzi](https://phy.readthedocs.io/en/latest/sorting_user_guide/) takes you through the key steps for manual curation. More recently, advances in the automation of curation has been made using the From b73185485cd46ddf7fd899b66a95a933853c61f2 Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Thu, 16 May 2024 22:38:38 +0100 Subject: [PATCH 32/83] Update docs/source/ephys_at_swc/getting_started.md Co-authored-by: Adam Tyson --- docs/source/ephys_at_swc/getting_started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index d132425..d5f6c3a 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -111,7 +111,7 @@ of the page. SpikeInterface is mainly focused on preprocessing, spike sorting and quality metrics. -The [Pynapple](https://github.com/pynapple-org/pynapple) +[Pynapple](https://github.com/pynapple-org/pynapple) and [Elephant]( https://neuralensemble.org/elephant/) both provide nice toolboxes for analysing data post-sorting. From a088b61ba5c686a09df4f9bd9096c2aa35e71aae Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Thu, 16 May 2024 22:38:50 +0100 Subject: [PATCH 33/83] Update docs/source/ephys_at_swc/index.md Co-authored-by: Adam Tyson --- docs/source/ephys_at_swc/index.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index a196fc0..44fe3c0 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -37,11 +37,6 @@ like to read more about our plans, please visit our :link-type: doc ::: -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Roadmap -:link: roadmap -:link-type: doc -::: - :::: ```{toctree} From c2ae610f4a1f8049b57a0e36e4c1650951518913 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 17 May 2024 01:28:42 +0100 Subject: [PATCH 34/83] Flesh out examples, first draft. --- docs/requirements.txt | 2 +- docs/source/ephys_at_swc/examples/README.rst | 28 +++- .../source/ephys_at_swc/examples/example_1.py | 28 ---- .../ephys_at_swc/examples/matlab_examples.rst | 18 +++ .../ephys_at_swc/examples/python_examples.rst | 19 +++ .../ephys_at_swc/examples/sara_mederos.py | 98 ++++++++++++ .../ephys_at_swc/examples_from_the_swc.md | 27 ---- .../ephys_at_swc/gallery/example_1.ipynb | 68 --------- docs/source/ephys_at_swc/gallery/example_1.py | 28 ---- .../source/ephys_at_swc/gallery/example_1.rst | 80 ---------- .../gallery/examplesdfsdfsdf_1.ipynb | 43 ++++++ .../gallery/examplesdfsdfsdf_1.py | 94 ++++++++++++ .../gallery/examplesdfsdfsdf_1.rst | 139 +++++++++++++++++ .../gallery/examplesdfsdfsdf_1_codeobj.pickle | Bin 0 -> 1086 bytes .../ephys_at_swc/gallery/gallery_jupyter.zip | Bin 0 -> 8011 bytes .../ephys_at_swc/gallery/gallery_python.zip | Bin 0 -> 6118 bytes ... => sphx_glr_examplesdfsdfsdf_1_thumb.png} | Bin .../thumb/sphx_glr_sara_mederos_thumb.png | Bin 0 -> 26794 bytes docs/source/ephys_at_swc/gallery/index.rst | 49 ++++-- .../ephys_at_swc/gallery/sara_mederos.ipynb | 50 ++++++ .../ephys_at_swc/gallery/sara_mederos.py | 98 ++++++++++++ .../ephys_at_swc/gallery/sara_mederos.rst | 144 ++++++++++++++++++ .../gallery/sara_mederos_codeobj.pickle | Bin 0 -> 1086 bytes .../gallery/sg_execution_times.rst | 2 +- docs/source/ephys_at_swc/index.md | 4 +- docs/source/ephys_at_swc/other_pipelines.md | 1 - 26 files changed, 771 insertions(+), 249 deletions(-) delete mode 100644 docs/source/ephys_at_swc/examples/example_1.py create mode 100644 docs/source/ephys_at_swc/examples/matlab_examples.rst create mode 100644 docs/source/ephys_at_swc/examples/python_examples.rst create mode 100644 docs/source/ephys_at_swc/examples/sara_mederos.py delete mode 100644 docs/source/ephys_at_swc/examples_from_the_swc.md delete mode 100644 docs/source/ephys_at_swc/gallery/example_1.ipynb delete mode 100644 docs/source/ephys_at_swc/gallery/example_1.py delete mode 100644 docs/source/ephys_at_swc/gallery/example_1.rst create mode 100644 docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.ipynb create mode 100644 docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.py create mode 100644 docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.rst create mode 100644 docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1_codeobj.pickle create mode 100644 docs/source/ephys_at_swc/gallery/gallery_jupyter.zip create mode 100644 docs/source/ephys_at_swc/gallery/gallery_python.zip rename docs/source/ephys_at_swc/gallery/images/thumb/{sphx_glr_example_1_thumb.png => sphx_glr_examplesdfsdfsdf_1_thumb.png} (100%) create mode 100644 docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_sara_mederos_thumb.png create mode 100644 docs/source/ephys_at_swc/gallery/sara_mederos.ipynb create mode 100644 docs/source/ephys_at_swc/gallery/sara_mederos.py create mode 100644 docs/source/ephys_at_swc/gallery/sara_mederos.rst create mode 100644 docs/source/ephys_at_swc/gallery/sara_mederos_codeobj.pickle delete mode 100644 docs/source/ephys_at_swc/other_pipelines.md diff --git a/docs/requirements.txt b/docs/requirements.txt index ba9231b..5713d00 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,7 +6,7 @@ numpydoc pydata-sphinx-theme setuptools-scm -sphinx<7.2 +sphinx sphinx-copybutton sphinx-design sphinx-gallery diff --git a/docs/source/ephys_at_swc/examples/README.rst b/docs/source/ephys_at_swc/examples/README.rst index 1788565..a34d646 100644 --- a/docs/source/ephys_at_swc/examples/README.rst +++ b/docs/source/ephys_at_swc/examples/README.rst @@ -1,6 +1,26 @@ -Examples -======== +Example Pipelines +================== -Below is a gallery of examples. +This page holds example pipelines for researchers +at the SWC. It details their setup, experimental +paradigms along with the pipelines they +use for preprocessing / analysis. Take a look +through and feel free to get in contact with +anyone through Slack. -rst links can be used here. +Below are a set of SpikeInterface scripts +for preprocessing and sorting of data +from a range of experimental setups. Also +see the list of repositories with code for +mutlimodal analysis including +electrophysiology +in +:ref:`Python ` +and +:ref:`Matlab `. + + +SpikeInterface Preprocessing and Sorting +---------------------------------------- + +TODO: Dammy, Ivana diff --git a/docs/source/ephys_at_swc/examples/example_1.py b/docs/source/ephys_at_swc/examples/example_1.py deleted file mode 100644 index b6db2c5..0000000 --- a/docs/source/ephys_at_swc/examples/example_1.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -The Two Moons task -========================= -Use UNLE to fit Two Moons -""" - -# %% -# This is a section header -# ------------------------ -# This is the first section! -# The `#%%` signifies to Sphinx-Gallery that this text should be rendered as -# reST and if using one of the above IDE/plugin's, also signifies the start of a -# 'code block'. - -# This line won't be rendered as reST because there's a space after the last block. -myvariable = 2 -print("my variable is {}".format(myvariable)) -# This is the end of the 'code block' (if using an above IDE). All code within -# this block can be easily executed all at once. - -# %% -# This is another section header -# ------------------------------ -# -# In the built documentation, it will be rendered as reST after the code above! -# This is also another code block. - -print('my variable plus 2 is {}'.format(myvariable + 2)) diff --git a/docs/source/ephys_at_swc/examples/matlab_examples.rst b/docs/source/ephys_at_swc/examples/matlab_examples.rst new file mode 100644 index 0000000..cbacf17 --- /dev/null +++ b/docs/source/ephys_at_swc/examples/matlab_examples.rst @@ -0,0 +1,18 @@ +.. _matlab_examples: + +Matlab Examples +=============== + +Mateo Velez-Fort investigates the integration of visual +and vestibular information during motion with the +Margrie lab's 'Rollercoaster' setup. They use +SpikeGLX and Neuropixels to record from the +visual cortex and (others?). The MATLAB +pipeline (used in papers such as XXX, XXX) is available +here. + + +Michael Lohse + + +Andrei Khilkevich (check) diff --git a/docs/source/ephys_at_swc/examples/python_examples.rst b/docs/source/ephys_at_swc/examples/python_examples.rst new file mode 100644 index 0000000..cee1015 --- /dev/null +++ b/docs/source/ephys_at_swc/examples/python_examples.rst @@ -0,0 +1,19 @@ +.. _python_examples: + +Python Repo Examples +=============== + +(TODO: mention where they do / do not use spikeinterface) + +Steve Lenzi (Margrie Lab) is an early adopter of spikewrap (dev version) +and has integrated it into a repository for automated behavioural, +electrophysiological and anatomical analysis. Steve works with an +escape paradigm recording stimulus-responsive neurons in the posterior +striatum (check) across multiple sessions. He is using NeuroPixels +and SpikeGLX and is repository is [here]. + +Dammy Onih + +Nate Miska + +Chaofei Bao diff --git a/docs/source/ephys_at_swc/examples/sara_mederos.py b/docs/source/ephys_at_swc/examples/sara_mederos.py new file mode 100644 index 0000000..be4eb8a --- /dev/null +++ b/docs/source/ephys_at_swc/examples/sara_mederos.py @@ -0,0 +1,98 @@ +""" +Sara's Single Session Open Ephys +========================= + +Sara Mederos (Hofer Lab)'s pipeline to ... +""" + +# %% +# Sara Mederos investigates ... setup ... details... + +import probeinterface.plotting +from spikeinterface import extract_waveforms +from spikeinterface.extractors import read_openephys_event, read_openephys +from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference +from spikeinterface.sorters import run_sorter +from pathlib import Path +from probeinterface.plotting import plot_probe, plot_probe_group +import matplotlib.pyplot as plt +from spikeinterface import curation +from spikeinterface.widgets import plot_timeseries +import spikeinterface as si # TODO + +data_path = Path( + r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" +) +output_path = Path( + r"/ceph/.../test_data/derivatives/100323/" +) + +show_probe = False +show_preprocessing = False + +# This reads OpenEphys 'Binary' format. It determines the +# probe using probeinterface.read_openephys, which reads `settings.xml` +# and requires the NP_PROBE field is filled. +raw_recording = read_openephys(data_path) + +if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + +# Run the preprocessing steps +shifted_recording = phase_shift(raw_recording) +filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) +preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median" +) + +if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + preprocessed_recording, + order_channel_by_depth=False, + time_range=(3500, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + +# Run the sorting +sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, +) + +# Curate the sorting output and extract waveforms. Calculate +# quality metrics from the waveforms. +sorting = sorting.remove_empty_units() + +sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + +# The way spikeinterface is setup means that quality metrics are +# calculated on the spikeinterface-preprocessed, NOT the kilosort +# preprocessed (i.e. drift-correct data). +# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. +waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, +) + +quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) +quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/examples_from_the_swc.md b/docs/source/ephys_at_swc/examples_from_the_swc.md deleted file mode 100644 index 911583a..0000000 --- a/docs/source/ephys_at_swc/examples_from_the_swc.md +++ /dev/null @@ -1,27 +0,0 @@ -# Examples from the SWC - -On this page we have collected some of the many preprocessing -and analysis scripts used at the SWC. - -::::{grid} 1 2 2 2 -:gutter: 3 - -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` SpikeInterface Pipelines -:link: gallery/index -:link-type: doc -::: - -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Other Pipelines -:link: /ephys_at_swc/gallery/example_1 -:link-type: doc -::: - -:::: - -```{toctree} -:maxdepth: 1 -:hidden: - -gallery/index -other_pipelines -``` diff --git a/docs/source/ephys_at_swc/gallery/example_1.ipynb b/docs/source/ephys_at_swc/gallery/example_1.ipynb deleted file mode 100644 index e56a92f..0000000 --- a/docs/source/ephys_at_swc/gallery/example_1.ipynb +++ /dev/null @@ -1,68 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# The Two Moons task\nUse UNLE to fit Two Moons\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## This is a section header\nThis is the first section!\nThe `#%%` signifies to Sphinx-Gallery that this text should be rendered as\nreST and if using one of the above IDE/plugin's, also signifies the start of a\n'code block'.\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# This line won't be rendered as reST because there's a space after the last block.\nmyvariable = 2\nprint(\"my variable is {}\".format(myvariable))\n# This is the end of the 'code block' (if using an above IDE). All code within\n# this block can be easily executed all at once." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## This is another section header\n\nIn the built documentation, it will be rendered as reST after the code above!\nThis is also another code block.\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "print('my variable plus 2 is {}'.format(myvariable + 2))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.14" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/docs/source/ephys_at_swc/gallery/example_1.py b/docs/source/ephys_at_swc/gallery/example_1.py deleted file mode 100644 index b6db2c5..0000000 --- a/docs/source/ephys_at_swc/gallery/example_1.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -The Two Moons task -========================= -Use UNLE to fit Two Moons -""" - -# %% -# This is a section header -# ------------------------ -# This is the first section! -# The `#%%` signifies to Sphinx-Gallery that this text should be rendered as -# reST and if using one of the above IDE/plugin's, also signifies the start of a -# 'code block'. - -# This line won't be rendered as reST because there's a space after the last block. -myvariable = 2 -print("my variable is {}".format(myvariable)) -# This is the end of the 'code block' (if using an above IDE). All code within -# this block can be easily executed all at once. - -# %% -# This is another section header -# ------------------------------ -# -# In the built documentation, it will be rendered as reST after the code above! -# This is also another code block. - -print('my variable plus 2 is {}'.format(myvariable + 2)) diff --git a/docs/source/ephys_at_swc/gallery/example_1.rst b/docs/source/ephys_at_swc/gallery/example_1.rst deleted file mode 100644 index cb4e4e3..0000000 --- a/docs/source/ephys_at_swc/gallery/example_1.rst +++ /dev/null @@ -1,80 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "ephys_at_swc\gallery\example_1.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code. - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_ephys_at_swc_gallery_example_1.py: - - -The Two Moons task -========================= -Use UNLE to fit Two Moons - -.. GENERATED FROM PYTHON SOURCE LINES 8-14 - -This is a section header ------------------------- -This is the first section! -The `#%%` signifies to Sphinx-Gallery that this text should be rendered as -reST and if using one of the above IDE/plugin's, also signifies the start of a -'code block'. - -.. GENERATED FROM PYTHON SOURCE LINES 14-21 - -.. code-block:: Python - - - # This line won't be rendered as reST because there's a space after the last block. - myvariable = 2 - print("my variable is {}".format(myvariable)) - # This is the end of the 'code block' (if using an above IDE). All code within - # this block can be easily executed all at once. - - -.. GENERATED FROM PYTHON SOURCE LINES 22-27 - -This is another section header ------------------------------- - -In the built documentation, it will be rendered as reST after the code above! -This is also another code block. - -.. GENERATED FROM PYTHON SOURCE LINES 27-28 - -.. code-block:: Python - - - print('my variable plus 2 is {}'.format(myvariable + 2)) - -.. _sphx_glr_download_ephys_at_swc_gallery_example_1.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: example_1.ipynb ` - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: example_1.py ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.ipynb b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.ipynb new file mode 100644 index 0000000..6ece63c --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Test Script\nUse UNLE to fit Two Moons\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import probeinterface.plotting\nfrom spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys_event, read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe, plot_probe_group\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport spikeinterface as si # TODO\n\ndata_path = Path(\n r\"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../test_data/derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = False\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run the preprocessing steps\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\"\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n preprocessed_recording,\n order_channel_by_depth=False,\n time_range=(3500, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is setup means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.py b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.py new file mode 100644 index 0000000..98a966c --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.py @@ -0,0 +1,94 @@ +""" +Test Script +========================= +Use UNLE to fit Two Moons +""" + +import probeinterface.plotting +from spikeinterface import extract_waveforms +from spikeinterface.extractors import read_openephys_event, read_openephys +from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference +from spikeinterface.sorters import run_sorter +from pathlib import Path +from probeinterface.plotting import plot_probe, plot_probe_group +import matplotlib.pyplot as plt +from spikeinterface import curation +from spikeinterface.widgets import plot_timeseries +import spikeinterface as si # TODO + +data_path = Path( + r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" +) +output_path = Path( + r"/ceph/.../test_data/derivatives/100323/" +) + +show_probe = False +show_preprocessing = False + +# This reads OpenEphys 'Binary' format. It determines the +# probe using probeinterface.read_openephys, which reads `settings.xml` +# and requires the NP_PROBE field is filled. +raw_recording = read_openephys(data_path) + +if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + +# Run the preprocessing steps +shifted_recording = phase_shift(raw_recording) +filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) +preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median" +) + +if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + preprocessed_recording, + order_channel_by_depth=False, + time_range=(3500, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + +# Run the sorting +sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, +) + +# Curate the sorting output and extract waveforms. Calculate +# quality metrics from the waveforms. +sorting = sorting.remove_empty_units() + +sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + +# The way spikeinterface is setup means that quality metrics are +# calculated on the spikeinterface-preprocessed, NOT the kilosort +# preprocessed (i.e. drift-correct data). +# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. +waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, +) + +quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) +quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.rst b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.rst new file mode 100644 index 0000000..c2a662c --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.rst @@ -0,0 +1,139 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "ephys_at_swc\gallery\examplesdfsdfsdf_1.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_ephys_at_swc_gallery_examplesdfsdfsdf_1.py: + + +Test Script +========================= +Use UNLE to fit Two Moons + +.. GENERATED FROM PYTHON SOURCE LINES 6-95 + +.. code-block:: Python + + + import probeinterface.plotting + from spikeinterface import extract_waveforms + from spikeinterface.extractors import read_openephys_event, read_openephys + from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference + from spikeinterface.sorters import run_sorter + from pathlib import Path + from probeinterface.plotting import plot_probe, plot_probe_group + import matplotlib.pyplot as plt + from spikeinterface import curation + from spikeinterface.widgets import plot_timeseries + import spikeinterface as si # TODO + + data_path = Path( + r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" + ) + output_path = Path( + r"/ceph/.../test_data/derivatives/100323/" + ) + + show_probe = False + show_preprocessing = False + + # This reads OpenEphys 'Binary' format. It determines the + # probe using probeinterface.read_openephys, which reads `settings.xml` + # and requires the NP_PROBE field is filled. + raw_recording = read_openephys(data_path) + + if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + + # Run the preprocessing steps + shifted_recording = phase_shift(raw_recording) + filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) + preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median" + ) + + if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + preprocessed_recording, + order_channel_by_depth=False, + time_range=(3500, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + + # Run the sorting + sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, + ) + + # Curate the sorting output and extract waveforms. Calculate + # quality metrics from the waveforms. + sorting = sorting.remove_empty_units() + + sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + + # The way spikeinterface is setup means that quality metrics are + # calculated on the spikeinterface-preprocessed, NOT the kilosort + # preprocessed (i.e. drift-correct data). + # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. + waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, + ) + + quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) + quality_metrics.to_csv(output_path / "postprocessing") + + +.. _sphx_glr_download_ephys_at_swc_gallery_examplesdfsdfsdf_1.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: examplesdfsdfsdf_1.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: examplesdfsdfsdf_1.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1_codeobj.pickle b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1_codeobj.pickle new file mode 100644 index 0000000000000000000000000000000000000000..e3dcf9e13a29a96835cd75a762063c8bc9b90bb9 GIT binary patch literal 1086 zcma)*y>ApT5XC7D5^h665aNWC6f}qkX&WRO8VXW_=#k~~&c+u0!uIBJ1rqH^?r{EJ z#(R6dPXt@pZ@j;G9zFkhc>iwnp#NgUjFiBFFxsbBeRd5vXg&!R((iQjHNAq`*H^hcfnB> zjPn_JQIKQTY2tC78w1+Z5cOgQwLIN(UKP&y(16V7Ewsj|wYvi)q@He5v#ZyIc4nms zBnSl_oPafJuW-QMOf)wTdVg;V@z}~xV{m3=Xrq3I|DP)wazD&iZRdG~W)7;W2wbwx z(VXhqfiky%!OKx0{gu{cpC7DZ$I15H>lH2!;eD}OSx!A*+C>|R>n#yc{|xSj!W;KP u#aK_F;5M~vtgmi70~|&eUcko!dWvyYMiU1uzGuzWxc$oiSiD}5yZR5M0;oj* literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/gallery/gallery_jupyter.zip b/docs/source/ephys_at_swc/gallery/gallery_jupyter.zip new file mode 100644 index 0000000000000000000000000000000000000000..bfd75a5ed08c695f1b07298a12a434b4379675db GIT binary patch literal 8011 zcmeHMOOGSB5uP}Y!v;=(z=xayqW7>GK+}>|JK1;<i=_VpviqEzI$iC(Zj;0t54 zM6YH!vFl2J6ct=wXXUMm`kq_}%QJ2{s9)cORa4eFr5&xXM$l9}W^aYD>?+l=vQzcB z5$yBVpT1lO?Rl1xBsjSd*o{G52OKYWC zOx0YM1v8br?x@V|5i6^CYLi=jBj%+p;D!U-v12Q>@f)?^SyEO)iE6nviMSEU_SyF8 zVOfgsKshh2T5=;2vy^j4nQ@g>+?Zr8b6C@7X;~ETt`>8lg-XR?!3Itc8yeOs zX_p*(#qBbeGk@eIzIw`G&v{PrWYT!I&$`daLYH+lRnC(Iw?xAMakZvTj2mzx@|X) zjfSIvSXI!Zz|D`Q(NvvIRU5MZ{b3pQ-@pSm!uW%oq^UB?^0xIl^!^=XNLbqppg?O< zeJM>7goa%pHeXU~vL_!&#r66LqX6eNW}jG=34}@^l`zaMA^35dJ*;kmawn6vqq@&- zmoi$x5_(p`5^+iP}&WgC-7Vk6bx)Qa2z zUu=5VSWzL`n&cGOmcAQl+uKqB0^8)>*|3w^y*;6QHiz>PT+L)W9Qtp3HTmUmIE2(r zwH?X3HNr*tz7|xaTpgKAqeWiMcs`B#48;t|SZXX5B9mN&NbDTH;TCrRxINQW0_Zba zql9sFjSD%fXKbomTJZI7a#KDccNK_D=#?_5=xtx5J1$&iR|lM-M4{K=gZph9v@DDv z;Dk<6=&D3cYG`v?r>>gYmIuFas>9|t**rmLle3F zK$)3CJOv61d7oFfk4|Cdp~krUaKKWXZ(5!EKp7FrzjM$ux|VrK4C5gFL1$4ZsB^BR zT_>{OaKMILuF}oR9G;x?HVfZ?O(U;RbQ*J$RHc!tp7&YG^_HhYz>m&{FdODlE`Cg{ zK{V;;jcN~R3XE&WEcES|ea!O|>e{B7eN}S=+L~eZ&@x5Ep%H*myW4<_ZoLL)xlgec zMR_91hCD_v1%Dfm17Sb;3S&V8kxT1;b6F+Yawlx@37y$>P56_=b+o68LWo{rY zTmam@H+{KK-PFFTw=N~TkJ|*fF8~p87Ny>eS<^#tSeRr+L!X#Db)vDt=V*-G0$;hS zO;8=1h?r0fXwSYk=}pD8*-Dp6@ax3Lg+hKSu?Pu>_*|A57B$agZNhr{HK~iq^K+jQ zE*26W(+FD`yG6G~_kx*OBs;vl;B|!H4lTB2lA4>n6yEdT4nDxV-i+nw79ARChWO}O zXw+3xiIfnE8|4NrFZN8@-jj7QI$ z!(dJ0v`Ed`aS$gwBXkuOX!a;c?C{auqssto|F!(~i@%Qk{P=G_JvpI&KLfNiTyumY zIzVY0sC}PA1yoDl0BhSfM>v3M1AQ};?)qW51ATr8vZyj$L4hZRU7=Iuf?W}&LPXK% z%bMAjS_$#6&srr}@AoBUANDDqonl`lE0JReCNK;X@M}}gthBlK4ZyHJ>0SH5YxDoH zWlKki5HMCQ(8>&{<+=iW@?|teA^o3qY(cxXE4l}@2m0n+_(i(HUEJc|Kk_*?LVp)VB`P* literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/gallery/gallery_python.zip b/docs/source/ephys_at_swc/gallery/gallery_python.zip new file mode 100644 index 0000000000000000000000000000000000000000..f91cbe8d4ee54f1390309532249a8de25aa9fa8e GIT binary patch literal 6118 zcmeHL&2HO95O&iapv<9{6umBJ1fc+#l@IET z);visJr~F&Ptk|yp@%+3XZRygvK;hUK(zJ4-PzgMZ@-!SsL``eKfAL>SNi4q*ME)v z{QJ@Ey*+w;jcqU&xz50*llq?zL%r~Q-#Z8E*jZwvc3ynb<-M}NUY$ID!kl6g>Dc*| zVlR{`tVcdPnQLVn(?*R!77olrBoOLMIVX#$H!&(_R?CZ3Cu@el+!>KLekCqpqD*eL z8HbIPGPWIOK%`u0C_v8^mcu0!uFuw6x4O~>Fw6w3#mHK3dL}GzJChT1G8RRug|&Pl zGh9laB`VKV!3|8nK#{;!zZL<2PJCs->!#XT3pdN;xSeo>w@t@(%vwXjkXN|&+3Gu= z8dd5R_FOpXLif0*^o2_H!bw$Zvk9+cIt91Hx|-L?94r_Kww-okLvcUxIDtBqyGo zsjC`f4EAS{S!kQOTxq*JT;fdHifophA_t!k2id(xvJhr*j}ecB3)xf0Qb1DVvH;86 z3~*$%m8`7Dw~;REp1nao$WiQiTS`;AW+x*)dU^Wj38p7x zDZ}`Xz8R#UXT%k9mtZ8u#~Vo!EH?^)kQ27T;$gL8b-*~P>m@{b)PM!O+GG& zx{&;#5r+J-EC>XIpo^+?pe@3UsR!v=oSmc$)@JW{b!KkZZ{%%o&1auY5HgP25g!c( z?VXs%-wg(Xp0|o?!|`VR*Hpe91J$3VM8y6yQ)7|&eTGE}Q%#xJ&monfs2H~bx`Rax zIBu1#^Bcn$FR&_!;sUpAdw8MMnRI9u_*G5tYvhrF7)-)sK_A!s)l*SMZX|cTHtL{j z`<(r1%WDh9kXK-Mf>9QbQNSr^H;bz@TDPPU!i^}V5C=!cv;*|sTQ@S`N`tjC5lG(n z+?251U-7e@O{R8>Nsh$=(H7cY4Xt6R)|71{CDm#=s+vzqlVt_3G4U^Crl|XyS4;jXko~tdXXtpbp={KxemIM_u0wmdA00zyU|0}fCVyykfjC-)&Uk(OfM|+ zc#8Exw6p+h=A5<ExgzL&(gA-V%2t z<29L7bFv%Qs&>|_Z?UbC^#-ybzZ}-%w)vPz=vem-aZc1nn7u?Ee5&H#9oBTo|&Qu!vMx?T|O=Eq-%RIh+T(Q2PEpKTX zqY4R|#-@$70969;4clOeaL?Q53Z3GKz1&RBO}xC(Qgq+F{r>gu|Kz{@fr6V}U!mx> z!Uzlu(_Gm`Zl7V(JYzojuvI?=b5f?>Fm_V^q_nY5Gk zJ88d@_Vlc}llD7lk59-eX-%SfC+#c2vy=8aY2W>ob0_WD|5)08a_i3C&A+JAFYR=F tct`JBe_tOxTe;Zwd_V)~`tYvACx(ruh0(Lmzo5=r`1dP*j=rJ0e*rgC8GHZ$ literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_example_1_thumb.png b/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_examplesdfsdfsdf_1_thumb.png similarity index 100% rename from docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_example_1_thumb.png rename to docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_examplesdfsdfsdf_1_thumb.png diff --git a/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_sara_mederos_thumb.png b/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_sara_mederos_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5fed589d17fe6ee62d6a9788519dba471fbd65 GIT binary patch literal 26794 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 literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/gallery/index.rst b/docs/source/ephys_at_swc/gallery/index.rst index 782bb88..2daa208 100644 --- a/docs/source/ephys_at_swc/gallery/index.rst +++ b/docs/source/ephys_at_swc/gallery/index.rst @@ -1,13 +1,32 @@ :orphan: -Examples -======== +Example Pipelines +================== -Below is a gallery of examples. -(note, rst links are possible here). +This page holds example pipelines for researchers +at the SWC. It details their setup, experimental +paradigms along with the pipelines they +use for preprocessing / analysis. Take a look +through and feel free to get in contact with +anyone through Slack. +Below are a set of SpikeInterface scripts +for preprocessing and sorting of data +from a range of experimental setups. Also +see the list of repositories with code for +mutlimodal analysis including +electrophysiology +in +:ref:`Python ` +and +:ref:`Matlab `. +SpikeInterface Preprocessing and Sorting +---------------------------------------- + +TODO: Dammy, Ivana + .. raw:: html @@ -18,18 +37,18 @@ Below is a gallery of examples. .. raw:: html -
+
.. only:: html - .. image:: /ephys_at_swc/gallery/images/thumb/sphx_glr_example_1_thumb.png + .. image:: /ephys_at_swc/gallery/images/thumb/sphx_glr_sara_mederos_thumb.png :alt: - :ref:`sphx_glr_ephys_at_swc_gallery_example_1.py` + :ref:`sphx_glr_ephys_at_swc_gallery_sara_mederos.py` .. raw:: html -
The Two Moons task
+
Sara's Single Session Open Ephys
@@ -43,8 +62,20 @@ Below is a gallery of examples. .. toctree:: :hidden: - /ephys_at_swc/gallery/example_1 + /ephys_at_swc/gallery/sara_mederos + + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-gallery + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download all examples in Python source code: gallery_python.zip ` + + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download all examples in Jupyter notebooks: gallery_jupyter.zip ` .. only:: html diff --git a/docs/source/ephys_at_swc/gallery/sara_mederos.ipynb b/docs/source/ephys_at_swc/gallery/sara_mederos.ipynb new file mode 100644 index 0000000..361cfa8 --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/sara_mederos.ipynb @@ -0,0 +1,50 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Sara's Single Session Open Ephys\n\nSara Mederos (Hofer Lab)'s pipeline to ...\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sara Mederos investigates ... setup ... details...\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import probeinterface.plotting\nfrom spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys_event, read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe, plot_probe_group\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport spikeinterface as si # TODO\n\ndata_path = Path(\n r\"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../test_data/derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = False\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run the preprocessing steps\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\"\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n preprocessed_recording,\n order_channel_by_depth=False,\n time_range=(3500, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is setup means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/ephys_at_swc/gallery/sara_mederos.py b/docs/source/ephys_at_swc/gallery/sara_mederos.py new file mode 100644 index 0000000..be4eb8a --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/sara_mederos.py @@ -0,0 +1,98 @@ +""" +Sara's Single Session Open Ephys +========================= + +Sara Mederos (Hofer Lab)'s pipeline to ... +""" + +# %% +# Sara Mederos investigates ... setup ... details... + +import probeinterface.plotting +from spikeinterface import extract_waveforms +from spikeinterface.extractors import read_openephys_event, read_openephys +from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference +from spikeinterface.sorters import run_sorter +from pathlib import Path +from probeinterface.plotting import plot_probe, plot_probe_group +import matplotlib.pyplot as plt +from spikeinterface import curation +from spikeinterface.widgets import plot_timeseries +import spikeinterface as si # TODO + +data_path = Path( + r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" +) +output_path = Path( + r"/ceph/.../test_data/derivatives/100323/" +) + +show_probe = False +show_preprocessing = False + +# This reads OpenEphys 'Binary' format. It determines the +# probe using probeinterface.read_openephys, which reads `settings.xml` +# and requires the NP_PROBE field is filled. +raw_recording = read_openephys(data_path) + +if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + +# Run the preprocessing steps +shifted_recording = phase_shift(raw_recording) +filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) +preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median" +) + +if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + preprocessed_recording, + order_channel_by_depth=False, + time_range=(3500, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + +# Run the sorting +sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, +) + +# Curate the sorting output and extract waveforms. Calculate +# quality metrics from the waveforms. +sorting = sorting.remove_empty_units() + +sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + +# The way spikeinterface is setup means that quality metrics are +# calculated on the spikeinterface-preprocessed, NOT the kilosort +# preprocessed (i.e. drift-correct data). +# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. +waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, +) + +quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) +quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/gallery/sara_mederos.rst b/docs/source/ephys_at_swc/gallery/sara_mederos.rst new file mode 100644 index 0000000..672c70b --- /dev/null +++ b/docs/source/ephys_at_swc/gallery/sara_mederos.rst @@ -0,0 +1,144 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "ephys_at_swc\gallery\sara_mederos.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_ephys_at_swc_gallery_sara_mederos.py: + + +Sara's Single Session Open Ephys +========================= + +Sara Mederos (Hofer Lab)'s pipeline to ... + +.. GENERATED FROM PYTHON SOURCE LINES 9-10 + +Sara Mederos investigates ... setup ... details... + +.. GENERATED FROM PYTHON SOURCE LINES 10-99 + +.. code-block:: Python + + + import probeinterface.plotting + from spikeinterface import extract_waveforms + from spikeinterface.extractors import read_openephys_event, read_openephys + from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference + from spikeinterface.sorters import run_sorter + from pathlib import Path + from probeinterface.plotting import plot_probe, plot_probe_group + import matplotlib.pyplot as plt + from spikeinterface import curation + from spikeinterface.widgets import plot_timeseries + import spikeinterface as si # TODO + + data_path = Path( + r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" + ) + output_path = Path( + r"/ceph/.../test_data/derivatives/100323/" + ) + + show_probe = False + show_preprocessing = False + + # This reads OpenEphys 'Binary' format. It determines the + # probe using probeinterface.read_openephys, which reads `settings.xml` + # and requires the NP_PROBE field is filled. + raw_recording = read_openephys(data_path) + + if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + + # Run the preprocessing steps + shifted_recording = phase_shift(raw_recording) + filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) + preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median" + ) + + if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + preprocessed_recording, + order_channel_by_depth=False, + time_range=(3500, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + + # Run the sorting + sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, + ) + + # Curate the sorting output and extract waveforms. Calculate + # quality metrics from the waveforms. + sorting = sorting.remove_empty_units() + + sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + + # The way spikeinterface is setup means that quality metrics are + # calculated on the spikeinterface-preprocessed, NOT the kilosort + # preprocessed (i.e. drift-correct data). + # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. + waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, + ) + + quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) + quality_metrics.to_csv(output_path / "postprocessing") + + +.. _sphx_glr_download_ephys_at_swc_gallery_sara_mederos.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: sara_mederos.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: sara_mederos.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/gallery/sara_mederos_codeobj.pickle b/docs/source/ephys_at_swc/gallery/sara_mederos_codeobj.pickle new file mode 100644 index 0000000000000000000000000000000000000000..72228722d16976453a12abe07bfbbe70afbb3a09 GIT binary patch literal 1086 zcma)*v5pfl5QZrNcVv${4k02W($K(3XeES1Lqh>Ih#pyvclK;yuZ``!Bn1*}BzKti zWxUxqx0@i{R^ESRz8TMqf8YQ6ZgQ{tLcz3@z`W3ni=p^pE3i;~63oXx@#p}>I^yWU`F2L{AH8?|C7 zs%!8rl{e4jT{%(yY^fA}t-xEsT*!L%&9M7 Date: Fri, 17 May 2024 01:28:42 +0100 Subject: [PATCH 35/83] Flesh out examples, first draft. --- .../gallery/examplesdfsdfsdf_1.ipynb | 43 ------ .../gallery/examplesdfsdfsdf_1.py | 94 ------------ .../gallery/examplesdfsdfsdf_1.rst | 139 ----------------- .../gallery/examplesdfsdfsdf_1_codeobj.pickle | Bin 1086 -> 0 bytes .../ephys_at_swc/gallery/gallery_jupyter.zip | Bin 8011 -> 0 bytes .../ephys_at_swc/gallery/gallery_python.zip | Bin 6118 -> 0 bytes .../sphx_glr_examplesdfsdfsdf_1_thumb.png | Bin 26794 -> 0 bytes .../thumb/sphx_glr_sara_mederos_thumb.png | Bin 26794 -> 0 bytes docs/source/ephys_at_swc/gallery/index.rst | 85 ----------- .../ephys_at_swc/gallery/sara_mederos.ipynb | 50 ------ .../ephys_at_swc/gallery/sara_mederos.py | 98 ------------ .../ephys_at_swc/gallery/sara_mederos.rst | 144 ------------------ .../gallery/sara_mederos_codeobj.pickle | Bin 1086 -> 0 bytes .../gallery/sg_execution_times.rst | 37 ----- 14 files changed, 690 deletions(-) delete mode 100644 docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.ipynb delete mode 100644 docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.py delete mode 100644 docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.rst delete mode 100644 docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1_codeobj.pickle delete mode 100644 docs/source/ephys_at_swc/gallery/gallery_jupyter.zip delete mode 100644 docs/source/ephys_at_swc/gallery/gallery_python.zip delete mode 100644 docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_examplesdfsdfsdf_1_thumb.png delete mode 100644 docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_sara_mederos_thumb.png delete mode 100644 docs/source/ephys_at_swc/gallery/index.rst delete mode 100644 docs/source/ephys_at_swc/gallery/sara_mederos.ipynb delete mode 100644 docs/source/ephys_at_swc/gallery/sara_mederos.py delete mode 100644 docs/source/ephys_at_swc/gallery/sara_mederos.rst delete mode 100644 docs/source/ephys_at_swc/gallery/sara_mederos_codeobj.pickle delete mode 100644 docs/source/ephys_at_swc/gallery/sg_execution_times.rst diff --git a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.ipynb b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.ipynb deleted file mode 100644 index 6ece63c..0000000 --- a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.ipynb +++ /dev/null @@ -1,43 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Test Script\nUse UNLE to fit Two Moons\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import probeinterface.plotting\nfrom spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys_event, read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe, plot_probe_group\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport spikeinterface as si # TODO\n\ndata_path = Path(\n r\"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../test_data/derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = False\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run the preprocessing steps\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\"\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n preprocessed_recording,\n order_channel_by_depth=False,\n time_range=(3500, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is setup means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.14" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.py b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.py deleted file mode 100644 index 98a966c..0000000 --- a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -Test Script -========================= -Use UNLE to fit Two Moons -""" - -import probeinterface.plotting -from spikeinterface import extract_waveforms -from spikeinterface.extractors import read_openephys_event, read_openephys -from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference -from spikeinterface.sorters import run_sorter -from pathlib import Path -from probeinterface.plotting import plot_probe, plot_probe_group -import matplotlib.pyplot as plt -from spikeinterface import curation -from spikeinterface.widgets import plot_timeseries -import spikeinterface as si # TODO - -data_path = Path( - r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" -) -output_path = Path( - r"/ceph/.../test_data/derivatives/100323/" -) - -show_probe = False -show_preprocessing = False - -# This reads OpenEphys 'Binary' format. It determines the -# probe using probeinterface.read_openephys, which reads `settings.xml` -# and requires the NP_PROBE field is filled. -raw_recording = read_openephys(data_path) - -if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - -# Run the preprocessing steps -shifted_recording = phase_shift(raw_recording) -filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) -preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median" -) - -if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - preprocessed_recording, - order_channel_by_depth=False, - time_range=(3500, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - -# Run the sorting -sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, -) - -# Curate the sorting output and extract waveforms. Calculate -# quality metrics from the waveforms. -sorting = sorting.remove_empty_units() - -sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - -# The way spikeinterface is setup means that quality metrics are -# calculated on the spikeinterface-preprocessed, NOT the kilosort -# preprocessed (i.e. drift-correct data). -# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. -waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, -) - -quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) -quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.rst b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.rst deleted file mode 100644 index c2a662c..0000000 --- a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1.rst +++ /dev/null @@ -1,139 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "ephys_at_swc\gallery\examplesdfsdfsdf_1.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code. - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_ephys_at_swc_gallery_examplesdfsdfsdf_1.py: - - -Test Script -========================= -Use UNLE to fit Two Moons - -.. GENERATED FROM PYTHON SOURCE LINES 6-95 - -.. code-block:: Python - - - import probeinterface.plotting - from spikeinterface import extract_waveforms - from spikeinterface.extractors import read_openephys_event, read_openephys - from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference - from spikeinterface.sorters import run_sorter - from pathlib import Path - from probeinterface.plotting import plot_probe, plot_probe_group - import matplotlib.pyplot as plt - from spikeinterface import curation - from spikeinterface.widgets import plot_timeseries - import spikeinterface as si # TODO - - data_path = Path( - r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" - ) - output_path = Path( - r"/ceph/.../test_data/derivatives/100323/" - ) - - show_probe = False - show_preprocessing = False - - # This reads OpenEphys 'Binary' format. It determines the - # probe using probeinterface.read_openephys, which reads `settings.xml` - # and requires the NP_PROBE field is filled. - raw_recording = read_openephys(data_path) - - if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - - # Run the preprocessing steps - shifted_recording = phase_shift(raw_recording) - filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) - preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median" - ) - - if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - preprocessed_recording, - order_channel_by_depth=False, - time_range=(3500, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - - # Run the sorting - sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, - ) - - # Curate the sorting output and extract waveforms. Calculate - # quality metrics from the waveforms. - sorting = sorting.remove_empty_units() - - sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - - # The way spikeinterface is setup means that quality metrics are - # calculated on the spikeinterface-preprocessed, NOT the kilosort - # preprocessed (i.e. drift-correct data). - # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. - waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, - ) - - quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) - quality_metrics.to_csv(output_path / "postprocessing") - - -.. _sphx_glr_download_ephys_at_swc_gallery_examplesdfsdfsdf_1.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: examplesdfsdfsdf_1.ipynb ` - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: examplesdfsdfsdf_1.py ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1_codeobj.pickle b/docs/source/ephys_at_swc/gallery/examplesdfsdfsdf_1_codeobj.pickle deleted file mode 100644 index e3dcf9e13a29a96835cd75a762063c8bc9b90bb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1086 zcma)*y>ApT5XC7D5^h665aNWC6f}qkX&WRO8VXW_=#k~~&c+u0!uIBJ1rqH^?r{EJ z#(R6dPXt@pZ@j;G9zFkhc>iwnp#NgUjFiBFFxsbBeRd5vXg&!R((iQjHNAq`*H^hcfnB> zjPn_JQIKQTY2tC78w1+Z5cOgQwLIN(UKP&y(16V7Ewsj|wYvi)q@He5v#ZyIc4nms zBnSl_oPafJuW-QMOf)wTdVg;V@z}~xV{m3=Xrq3I|DP)wazD&iZRdG~W)7;W2wbwx z(VXhqfiky%!OKx0{gu{cpC7DZ$I15H>lH2!;eD}OSx!A*+C>|R>n#yc{|xSj!W;KP u#aK_F;5M~vtgmi70~|&eUcko!dWvyYMiU1uzGuzWxc$oiSiD}5yZR5M0;oj* diff --git a/docs/source/ephys_at_swc/gallery/gallery_jupyter.zip b/docs/source/ephys_at_swc/gallery/gallery_jupyter.zip deleted file mode 100644 index bfd75a5ed08c695f1b07298a12a434b4379675db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8011 zcmeHMOOGSB5uP}Y!v;=(z=xayqW7>GK+}>|JK1;<i=_VpviqEzI$iC(Zj;0t54 zM6YH!vFl2J6ct=wXXUMm`kq_}%QJ2{s9)cORa4eFr5&xXM$l9}W^aYD>?+l=vQzcB z5$yBVpT1lO?Rl1xBsjSd*o{G52OKYWC zOx0YM1v8br?x@V|5i6^CYLi=jBj%+p;D!U-v12Q>@f)?^SyEO)iE6nviMSEU_SyF8 zVOfgsKshh2T5=;2vy^j4nQ@g>+?Zr8b6C@7X;~ETt`>8lg-XR?!3Itc8yeOs zX_p*(#qBbeGk@eIzIw`G&v{PrWYT!I&$`daLYH+lRnC(Iw?xAMakZvTj2mzx@|X) zjfSIvSXI!Zz|D`Q(NvvIRU5MZ{b3pQ-@pSm!uW%oq^UB?^0xIl^!^=XNLbqppg?O< zeJM>7goa%pHeXU~vL_!&#r66LqX6eNW}jG=34}@^l`zaMA^35dJ*;kmawn6vqq@&- zmoi$x5_(p`5^+iP}&WgC-7Vk6bx)Qa2z zUu=5VSWzL`n&cGOmcAQl+uKqB0^8)>*|3w^y*;6QHiz>PT+L)W9Qtp3HTmUmIE2(r zwH?X3HNr*tz7|xaTpgKAqeWiMcs`B#48;t|SZXX5B9mN&NbDTH;TCrRxINQW0_Zba zql9sFjSD%fXKbomTJZI7a#KDccNK_D=#?_5=xtx5J1$&iR|lM-M4{K=gZph9v@DDv z;Dk<6=&D3cYG`v?r>>gYmIuFas>9|t**rmLle3F zK$)3CJOv61d7oFfk4|Cdp~krUaKKWXZ(5!EKp7FrzjM$ux|VrK4C5gFL1$4ZsB^BR zT_>{OaKMILuF}oR9G;x?HVfZ?O(U;RbQ*J$RHc!tp7&YG^_HhYz>m&{FdODlE`Cg{ zK{V;;jcN~R3XE&WEcES|ea!O|>e{B7eN}S=+L~eZ&@x5Ep%H*myW4<_ZoLL)xlgec zMR_91hCD_v1%Dfm17Sb;3S&V8kxT1;b6F+Yawlx@37y$>P56_=b+o68LWo{rY zTmam@H+{KK-PFFTw=N~TkJ|*fF8~p87Ny>eS<^#tSeRr+L!X#Db)vDt=V*-G0$;hS zO;8=1h?r0fXwSYk=}pD8*-Dp6@ax3Lg+hKSu?Pu>_*|A57B$agZNhr{HK~iq^K+jQ zE*26W(+FD`yG6G~_kx*OBs;vl;B|!H4lTB2lA4>n6yEdT4nDxV-i+nw79ARChWO}O zXw+3xiIfnE8|4NrFZN8@-jj7QI$ z!(dJ0v`Ed`aS$gwBXkuOX!a;c?C{auqssto|F!(~i@%Qk{P=G_JvpI&KLfNiTyumY zIzVY0sC}PA1yoDl0BhSfM>v3M1AQ};?)qW51ATr8vZyj$L4hZRU7=Iuf?W}&LPXK% z%bMAjS_$#6&srr}@AoBUANDDqonl`lE0JReCNK;X@M}}gthBlK4ZyHJ>0SH5YxDoH zWlKki5HMCQ(8>&{<+=iW@?|teA^o3qY(cxXE4l}@2m0n+_(i(HUEJc|Kk_*?LVp)VB`P* diff --git a/docs/source/ephys_at_swc/gallery/gallery_python.zip b/docs/source/ephys_at_swc/gallery/gallery_python.zip deleted file mode 100644 index f91cbe8d4ee54f1390309532249a8de25aa9fa8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6118 zcmeHL&2HO95O&iapv<9{6umBJ1fc+#l@IET z);visJr~F&Ptk|yp@%+3XZRygvK;hUK(zJ4-PzgMZ@-!SsL``eKfAL>SNi4q*ME)v z{QJ@Ey*+w;jcqU&xz50*llq?zL%r~Q-#Z8E*jZwvc3ynb<-M}NUY$ID!kl6g>Dc*| zVlR{`tVcdPnQLVn(?*R!77olrBoOLMIVX#$H!&(_R?CZ3Cu@el+!>KLekCqpqD*eL z8HbIPGPWIOK%`u0C_v8^mcu0!uFuw6x4O~>Fw6w3#mHK3dL}GzJChT1G8RRug|&Pl zGh9laB`VKV!3|8nK#{;!zZL<2PJCs->!#XT3pdN;xSeo>w@t@(%vwXjkXN|&+3Gu= z8dd5R_FOpXLif0*^o2_H!bw$Zvk9+cIt91Hx|-L?94r_Kww-okLvcUxIDtBqyGo zsjC`f4EAS{S!kQOTxq*JT;fdHifophA_t!k2id(xvJhr*j}ecB3)xf0Qb1DVvH;86 z3~*$%m8`7Dw~;REp1nao$WiQiTS`;AW+x*)dU^Wj38p7x zDZ}`Xz8R#UXT%k9mtZ8u#~Vo!EH?^)kQ27T;$gL8b-*~P>m@{b)PM!O+GG& zx{&;#5r+J-EC>XIpo^+?pe@3UsR!v=oSmc$)@JW{b!KkZZ{%%o&1auY5HgP25g!c( z?VXs%-wg(Xp0|o?!|`VR*Hpe91J$3VM8y6yQ)7|&eTGE}Q%#xJ&monfs2H~bx`Rax zIBu1#^Bcn$FR&_!;sUpAdw8MMnRI9u_*G5tYvhrF7)-)sK_A!s)l*SMZX|cTHtL{j z`<(r1%WDh9kXK-Mf>9QbQNSr^H;bz@TDPPU!i^}V5C=!cv;*|sTQ@S`N`tjC5lG(n z+?251U-7e@O{R8>Nsh$=(H7cY4Xt6R)|71{CDm#=s+vzqlVt_3G4U^Crl|XyS4;jXko~tdXXtpbp={KxemIM_u0wmdA00zyU|0}fCVyykfjC-)&Uk(OfM|+ zc#8Exw6p+h=A5<ExgzL&(gA-V%2t z<29L7bFv%Qs&>|_Z?UbC^#-ybzZ}-%w)vPz=vem-aZc1nn7u?Ee5&H#9oBTo|&Qu!vMx?T|O=Eq-%RIh+T(Q2PEpKTX zqY4R|#-@$70969;4clOeaL?Q53Z3GKz1&RBO}xC(Qgq+F{r>gu|Kz{@fr6V}U!mx> z!Uzlu(_Gm`Zl7V(JYzojuvI?=b5f?>Fm_V^q_nY5Gk zJ88d@_Vlc}llD7lk59-eX-%SfC+#c2vy=8aY2W>ob0_WD|5)08a_i3C&A+JAFYR=F tct`JBe_tOxTe;Zwd_V)~`tYvACx(ruh0(Lmzo5=r`1dP*j=rJ0e*rgC8GHZ$ diff --git a/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_examplesdfsdfsdf_1_thumb.png b/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_examplesdfsdfsdf_1_thumb.png deleted file mode 100644 index 8a5fed589d17fe6ee62d6a9788519dba471fbd65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26794 zcmd3N^;cV6&~zU%f(#fBBGMqQ6{mHpumQ z^~%~w0VJvEnR)nlooKF`yb|H}xA|C<^cUE&K&!B{#ar*%RrUI{fOnuSCL$03!--#| zXbLuXBIIR=G00EgrNBb5!{Wg0L?-(}Cu?Haf+0F7%3dlH!I7q$mL$Yecj9<`jSzfT z^D5Zgt0)_Z#Ecth&8aB^q#^tt+jp*g;+l3Kuta%Af{32Sylxr^V1hg&jmnR}mkXfv zAbI2;{|#XPvE=`E0PeA)C<&;HFH;EcKm_ss4Tt~~BwnThPbCg5(+AS2SjXlQXBFG6FYU#Fiz_d=HGDi{5xv>!;RVHaotlES;Y{+4GrXjSnu(wiwX$)Rm{msq2XKT(PDE-xEgi z_(VivIE9l($F=w;5%X502cyd9S;o)?@*@IUt%-#RKi)is3GxWf#e9B1a0p}-K^GkH zE#RcLH-hEomo}wtS-`xST`geg^-vL1i@Xk;hL(*ihFVL8OfGro z7;=ZwLXX%~LDV&-I)%f^Zc@iBUPr)DOdL&SY8Fe4jRr0M^?OY#0}B$nzJ&L1In9Al zQOK9T4G@xxBY?1&=&}M<$uJ+xfTKBW>PRAN(VR;B>we1G_F=pv`)g>`Z^uYRx_jEF zLgunT}hWZL=J)o}-tSc-H43?kvu z2VGc#wT9ESOGB&rE@vy9Zz3|&#)3Ae*}ua?Sht~cbom|GLpPlTSm&X z8g90~9$!qLFeLh!xc`P0$(R$Ja&h&6EezoO__ACMkpyr*-p^zc6Sxuga|EOJ~>i$53|i zk3uPR?4WZH-H$~ya%J$=ipQkS-owRa4tw(P{%YPDc|taynH>AT=I|^o0}49wU~C{J zauK2=H85m@3Fzliq*hcd5LX*{uUE#$CpBIVU20AE#`cp-cs73fa2V=^W|F4HJO04v zh?+`+`1w}s-C)?|2Q&Bi)%tp}=My{T_L}AL?X!5%*(mp1+HX=ICa0VpGHL53#n?|w zrsVN!1h2aM0663#mGa+wr{K=E&1QL;2u+|ml4!Vcv|H~i8eectf>jNDUkq^angTdW z)#m!O%sOuC%7f^!Qht!qCw#tfe81zkyyL#c-mQq;u_=hU8Y&X0P3ZX%SuC=j%cBp_ zr)IOhDL^juo$ys}!om$%Q`tjo6J*I-hLpYq;KY(EwP$7&><+R6Cs-uf#l&-#?&}Uc z2}fsB6#K32O!O58@ksbMFteP}G2(2lnU(Xx0EQ{|6Fyl`z1ErflfT{pGkLUjTO->; z)k=c&e_nqG{-=f;xxac&YcIobydWM*>-WCPDRj}<`M?J$>U-1W=e@wPjOqn`WB6h3 zK~jXSxO+anw%MV<(bYq5#QL@?&$9}E9mOt!yYPhfLyOPk<($)-DALZ(Z<${Ys2e!I zEf@cqbht`&4b(^c=S@?tyU^-%7nsg>47yyUusdaMN|9?WoX_ry|GMNc@rE*&1ZWvhRi z_S3m-n`bk(@O+$m8Kp&CbTqx#!3Ro^Y+#WD0wD>iyApzndvKsR&ejCNHW0D$L?Y{& z-+!(ex(HR2t+z8ezJ13p%e#_pEzeK4BMasjYdnwJ?s{s>RYi;(GFI&ez1i>3C&Ca}f(#daZAeX;DyOc))i?10TL3cyU9coSu% z)362xbDc4*fSbB%;E}Qhj(t3Y;h0y44|>PJ{Wnh8tcJHxpgfb*cWZ`3JyR%I1eX@D zhJN6ES7k-g^nBRA6+Lz{hr;f=v9U%{mDsRr?D`_~Bl#>!q2hGpQrdVLN8GXyT@?Oz z+7-##Pu6db%j-<<)!r^-I*w+`UXXo=8fYr1;~kdxDdbuG7#=k3gnwVoy*Pse*8?CP{EM4h zidh=Lh5n)*Bd=X5LAxl_{94L7yp5$zMl^#3{EGwW`CdAsJZjClo-A{sUr5=r94uSOqPi$Bx2XqwJ0Xj>oqW`wvg3e07J z)B$YP_^e2>9eu-`H$Ilmv=_G3H|}OW)AT=Y3o&4{OAN>c@maT9IRH=16i5c13XIbq z?_;?AkC)0lxBghxk!|c14fTiYk`u>n>GBPA8g4GyLuofED1?CZ_ogTPNTn=*7Rz>` ztYLiEcuec^&_!PYFq(!2r=O|z#Ft@!biey30#@bucj&Ux#$iwD(4dukXbV1&1KhNt zqjE7f0?G2qOI$YC4rS^$^olhr+rM>-n6e_o=%}lSws$wIa?!a=?|&NpC0eU;zsWc{ zKWScWoG(_FP6kwvxFXl0Buq*6*?NA&t1N%CNhYQxAHE>%%=x@2fFKMkfr^ZzsGxgw zHOYm3bg4i(w(q;Sv}7U`6Pvh6Lm7Ptpx?d8)x>^1RQ1|vuG zD|M?Wx8nh#9<4K3^p^ z+tzr;24w)=wRU5Hn4~bhvixzHRwBbhqo*XVUm->z)SC1la7x*{$-z(_ak+M#+ZP-g zeJQP$k`X`41*d?oW^%4JZH z`2Ld2K6XjjT~MILbr{_xL>OfMd9;zSl*--#DwbWDM4Mp%J~N_%)nv|~hmH9@ z)4zT59opehPLJ^KJ6=VVO6Ho)jzT3gR98(NX*61GGVm56{>rj2M18)d^HhPG&iNrA zw3~jo&)!0v{GJE>iXI;ylLdla?z?dM+T(hzjWMg#Y7nngVIY8XR3%u9|L|1IzJP2% ztaEj&!l5_dWLvR#((N&`TQ%Z_aD4=0dIY1oPwr0rTMp@~krDj&qrOo>N7s>&+3e2# zj!pO%Q}P>}{K5VvO(@IX)|C%9o-~d!1M>GPa$u9}~ znp>y9i{nXjS1MjmdxDO!=)mKBA}-}mBp?edtY>D#G4~`p;ncc6ZCuu^9162{V`}LD z1V6Z{i6Rj#_U_ZbKJm)mqBY>vgDo5E5hb5`g#UiRW{W{;Yv3BoGE+jQunVS36Np2enN*G1C~E`p6Rz z{j*O=Hr16UEyfQtZjl0gr^mQuLw~P`!;^`G!)B$eL?HKwuJHg*Av%bEfp+&rI#S6h3Du-ZF@PZN*czynUs7CxrIzi<4CKW$DVUDZp4t@iHd(8;)$gN|7tcwXZ*}bVfvjelr52^Z_wbOI56$NP(NgU%iVHE zF4%~Q^N)t*gCUrPDQc6o=jm9zod2D$s=kAl9(4KKJVtQbESUEoxkjYn)gw9Hf$ zxkomp*C}$oszKqQn1bcxZ?n$jcvSPa-%+!QHfnAo#hP0@4Eu7#;_sn^YAFm}a5$kj zR>ve*17@Gze8vcL$w+E@`m5(=Qy*Q~>OI;1*l|C1v1PMWOw3eL9{)(8=9b%IM}6!U zMcHwGU&b-gd%E#WWQ1W&us{G=3v*Gczbd>nU~XA+RYmPvAK8xKIjItpke-|6DHLM? zV^m(Trt~H3n8Djvl-rxNw5%%KO97+CBR|c6-1xk!_MSCj{y-=Tl)@CO+~o2vmxWhz zY)tX$O0oEU#QKS|IP#9wssiTL8{ zJD#*5d^it313T$)w|h}CIq*lseFB}(#~)6PjENhpg?^8Xm3F>+oFgAQ0$j`746Z8! z4T=vRkY=AQ@V*?NvGxTdbw)Lbpeb#Hwn$jEkRl=kfxy_mFdnIZZ|v?Bk47e(MA6iu z=n4|Yw5OvgD)#Z`yIX8TL)kRf#j_X&X!Xre9^FbrGeT&ua~Ez z;L~rWd6P4b4BJHLCtjp5IQbK@Yn5nt(u(A%E*th>PWT9zmg#$i405 z1u)h5>|%j;2S6YL!d+3OTS>AcGo{_X_PRbtC^cZ~OZKy980j48DF6mKe0`ShOy)%)$Gpx&xYS;yMa=?0Luop+4>{HHg<+3oxDAZ>#%N{Z}PF z*y2V1MAwfF%&zQdI+R~N;zar?o(NK19$nQ&-1jXxMS(~iDLANz^Z7LflHO0Vw(S<{ z-&6fR1v zwYJ=7+&AQJkPZmGr9o>Y;3Dk51T1!Wny3eOhpSrVHP)r8j)n->0clR9O!IoX`MucX z^Zwiy9^o(E6WZ-Mwy{?YbRia8Hzm{^kdB^~ULyM{?&zV&+;rnvab{}4=iyZAU08O5 z@MV3_6vpe|{fU%r_^adQ-fn4Eqe6TqJ&VNr&47I)qv~~M_?mkg8<^CFz(S?YiNc&J zF8sSlt6VZ89ZVI=m8J2(?|e_Ih#V2_^euv=$5qy@pDZ&CU`?d!{!Xjfsm*EywtUo{ z7M`bz>Lm*;&#qzeUCS&pM&I|_VXXi>@ekIJ%6OP-srY6;NEm+rQ*Vm2SP=dpg`9v=8of0 zhOkW8VtL8ieYY31ECO7=oqO;@Z;1Kzm!dv@X`5}nJ?l8#I_`)#C(=D2%+*Mp=89va z5suRsE0+)2#jpPQZ^r2U4e8Tn0Artnx(_PB{~E_^f3atL)FN~J89#@h6>YEJ)SkOU zkVI-6t3OWeJfD)pik~F|nR+pV9ikPTcqm+4>0E|mxI>`U=jt6gulFW~I2NBxSomP5IND~h{YMxG>1blL@4eF^{6 zk#UK;tX9dPQL#jH$V)FC!y~DdwEKH`o^W&`SzLFoKY%L61$Od-y6mNtoA!97 zb$UD;2B^}_laB+luIKy^Uxf-;n)u=5i3a`beLsWhyI-)zg6gb&zCf*CjB)ffyJji% zQ#_YU?1e#Jdx!n7Hh(Ev_|i!PMx4H_`%&raZn?l8`iT!XKN5a0UHxpS!xGFhTNf+u zxpL3g?fDyTpaY9;=4WvgLgnhu2&s^lz|K2HyQC6^rpuT~EyYofcy)zpZBfmg;sx&O zRGn#3W%*3Vl+k#uA^Ks&Nc5APO_6`soi1jM35BHy;tl(LIhwN&a^a`% zJuR6vsJ;uQlY9qsuOj!Xa9BQ;(SH{l%NmW8PkWZ6_$5iF;!BonGJlTSxyBnademO^ z=BG6}B=bz`T7Vp#E}gK#fA=$pv=-a?p8toJvm3oLf8KYg@E~;oi^ZJM)2> z@1e%vtsSw=PX_(a0OjVZhHr*B{g*Z;W~=k%vO2VPhKypEAzx81pO<(tom_IjrLqcK z@zif`H$2E)oZV2FE-3#8Buc{2P?839y z#~{t0*VWy@2eH+)q@uti{*C6u-6YLDb<8RHk){z#wL@!tX{(Ia1#tU zO(0i6^t)Ueq*UJ0(u~F1x&}Xc`0a@7^&Z~y#d7ER`@Xo6>+bhoC<@-^DTsWJz$8O@ zE6q6A|0WUD9M91pzApN8$^s8ZUZ_$??^mFi= z)P@l=?Y7Lm!mt}6Km%zR(K8vzVwM*Cph$R+Xh-GcA2iO3omIER78s5{b=pAhf9(?R z=jTLCaD?TmqKr8OI!4VC|q!DCP=dfL9nazg#oyW^g{NeK5d*yo|ECkDoA zntQ_k_T^y$F%++7ZZFRcq6{D9EFXT)`{k$vq&&@tPha9Z|9HA1$islU8DzR5%*4N_ z8DoCrp?%1ld;gLWA)zb^F16gFV+?4T=W$cQrr1dXp6_NT3tcXsDig~m+Mf7k+r5{4 zaX`hIACv4>RGTPbo0)OUixoJ^mShV!I=(iQq{0#r8*6Kg8efTj75)X$kJM+F@I}UK zUT6J1kRe_tI*P!@&+7A20@t?a1+@I_mNWPu$Azzu(L~LJHNe5}vc>A0`ZhB2cvGWA zAP_fmED`+(u^vqY)Gl~k>@lkPE7s{N6Gk9+#3TqD@!RmIUBVFrL?mpY%{jeTz>Ul# z^|pRz2~Co5>*5Vwzu~?e8!^P_RU&lWU@N*MZCSemvk~1wkWh+dwBQK1rWMVqOV=%v zyWG(np@yt5?UDMjtFamAdo2)+Vqc~!LSR~pYD@3!kZumq_zz#BBQJsnet2!E?A{p`ONN@Od?Dfmf(G#Pe1^hkYDJ<6WdPOs0PO-=ay0Yv^)oC(`N1#}Xo#K?6jVUH7&Y zt>ZCkQuHIG`z{jqel&L+J&lkI(N??MwcMzEWwuRE z#tsWN%OvjLGsAyYLoMu0+RDt)d<{d{D_#C6oX)J(P(ujhKG$ds$ObrB+81&6HEUZK z6)Ny?G2BiOc@i>AX>0zY@kpJT=631_c&}0lHb_-=K+_#y@r3`Ov!QI~A~_f2I%EKS zJ7emxmhe7MD5eWcXU=kDb2?}pJ=Z2ixgDeUC)Cr0Dgk+Xip@@Z?fW>sIrSfsd3iKl zA^E2N1so#Rx-^RoLChMgcI*of<7Fc`lfSl9eUto$^I#>M(!@{8#<(NM6gWSTnNcQu z#F(n@U$X%u^XVuNW%;9#eG{+J3*S0eDbzOK*JU^!PFZiL;WG-ghu)JglFs-`?gx{0 zg^83973w0~@wfomO4tTCaGoAw5ySDvK+M&*B-%3F6upN6405V@Led1c)Ncz<5n^(< zPiF~QP0i%xt-8+Ans2bE6p^{j(LYwh4VMN%1BUMdM~=lxfRktQVj7Tbz4GRfJ5l**g7#AP{Ll zg26O4>0syPBWE01LOh{Vto8R|+hzwxjMgaa+4w4znI|@APC}4r- z_j-3kt^W!$v8L)O)(h**BQ`G7xTp5~*cIxL$Cbd!4BDqq1iG#K=~9AS9TqsXP_zV8f-mKeyL`)N8UjxE6ah@%CHBRjiYY zIAN$UE$g3x=1lf{!xt1ZRgVcz_({~_;ON4pN2KG(x>7`@%V6tAaX}iC*iEyNuh{Z< zP4>B7WT23ha(YzwOadZ+-><%ECjXix zzBw)Eg|m*luIPw7+s=KKGbMdlsp~TSU^^P?aC>~6uI9b%gV=r|dD=H2?R4lgxOouS z4y$=lE(0JSD=3f=cism*huq^ph>fl#eruAl&Qgel9&OAcjRk)uVWD_8t)s7{ATQEaE!nr^~>g=%(4pS8+Bu z5=G_(yS2XmS6Y<<>th8PL}|H=vh_+`rF++VgzfHwF?)POOi$iLaTu-X)KFZf9*u?T z?)}Bqv}%JriAp(#fdiklAyZx}iL7=i?Yhzm53*70oyBuUiOR%j>5$SfU;Qg4%7qnxL^X zxI~FR3wjB?`nEIEh!feQ?EB5fxl_Xbb9SubMyRuRRP*Q$EOTP&drs zY?gCRJmNK?Yq1V9fe#~p=K6_U2~;O55mu0P&seC38CLy+tv~Wp-x`q#x&>ZM7-Q3m zW4eD3)V})uA3+zGj}#kgL19Tb|B00v_HN*#OGe|6oD8pH=^tCuMly2~^7SO4!t)?g zy6@oxDL?L3C~3=371z7zURp$Z`m{P~37?4aXWtd&fX+CBi)^dH8Pk?Ah@fkZ()!`) z1X0mZu{ka}gkauYDfc*`#Qvobr##rtiB{U4PY809iCvoe)JrGm!V8g_?{9}sjEN0= zJ7$GABFPts7amvF?Wxg3FuLN{L~fQO2Ji_C{H?Zr zfx1Mn>%xiT^c%1j?7^kj&;Ai(5oLtxTKUAKq*cME;>S!-zWFU`$Q5Qp+Y6LFt-d-* zI|Yi&1D5sozyVt6Io*3Y(QbMUH6Zt&!WxBbM#)2%rL4sK&J$q7R-gKw`9Ij&^fvO1 zmLCl&t)>E;}-txS})rj3hexI>&3B9Lw&HJr;em;dp7)6hFSx)BpE zDm*>V;wiw)K?Qc**$GE$ELU6tzKjmkL)s zu`UM#;VDh!tL`#Wf4#+=lYGrdZfsUx$JbO|r4oTwXfXkrg4`=3V%Izv8Kj(cTDGhf z58eQ=^xq<-^r*F|u>!{;_Em2^J)jAy{&s94JOl#v*YHux@HFrJNuq_KMj{cd4B!GI zyQy%L+U#GslYhy*L&uRMJLVUA4D-9ylSREQjKgNu|8-2>jqtiW+McHya%Ket_zkuj zm3$1|$Ks(pmrP4EkMi}jCyvG+`NH5bpZ;|q0Y&){coHggK%;uf=ygA9Gjg@-z<06? z?Ix4=xt4ntSo@+9oy6cjU5elzD4ubWSy9ggSr6AII%4s~kygw*$EfUf zCY$#?+H2MPU7Dk3nKJ$X=vT#P&+45%*v>a)aJH8>pmXiNa08~ z#uSsyGl@a`R z?7#3vi8E>bKryMKl1od9W2}*q@jjedoHB;K~H? z;h{>mbHAOQ?yR})5R|r$vm|$Ig$ZnnL#t*8KK5}E+@@Kv8^(9yG?EfT5PU1;lin{4 zLSUjS%c8>N;~$k2tlzG=zm*BM6jW_WNrM*T)#Gz|3{UBi_BFO`gWIeuu7`n7qJ7!+ zoB49j8dB$kFYl%CkKkQAyfMq60G`QsWATY0(n^Qq0MqRiwat%l{@qJH_O!Wp|2ASV zp~0AbnKEINW-+Zod_NkA)8QUU3OqKkv6{WUv7umiWmN6w4y`-SB|;BV;-wz#^2nX) z8^1f-0CkHspK8Awr2)AoVa;dY`-(cwmj-#a^qWnY@txS1{hgb=G>2m7{0c%!)H zbs=y!>P=MRpDu#0WZhGe0hmuS$N;@)mS|*4E~72mu{YNq`RZI2l38VG; z&9cBZbIPwX$TSBPKN?k&W?cZIRHxaR)9Ch}tUXnw4yeb9w9Y0HH=?rzg6qU0_kXX& zikwQyBcGjclOqS5tHEx2(=0Eyz4ua<7wa614t|PXbnX@1^gG5j4}b>F?#wG?KKQUL z>D3%@JC#ak1x48sS1KpB=kC_yJ!7{-np@4coMInIt48ux_LJd7=zo%8N)@-)@Mqn? zCB{TDMLie03HEs~sahW1-369Q7k;$b8PLlKc|e60hl^hIV7!27_os@JOqQ{&^m@It zOU+BY&Kd1I<4B8XNEOGQ1fxpfLKZXxc`gJZVp(4YLUrlS#O3!F;mrX!*VfOSO6<2k839IE#ij3B6`Z33p3V1pDGW)z||*)hzf4| z#5U$te~Ik~F3J|qKe`0sb25<>Dt`sQv!b)&q;?!Q=CJ{$~>URp+ihe!Y>>%EQdotYO8c58TuoTLmkppGqebiz(tbA&68SL)Ym2PBh`wyUU1P7^o-V&xxQ%&I z1`AGU3bH%$YNuf^IXQ&0!Tdb$I7(3)vaau0-GLq!gUc*E{8a*|5H8aRMZy`Da}U;Q zk0R&2Y^ra(MQ4s*7$;THElm5vNno7%&0ev8lfW&rjt8_-k;O9IROA2H67|DhXL*}G z{w0f8xhpks8E$F1j1p#xIWiXZjBfJ5^IaMxafGqW`53v4sVk*MQwPMFnyS<{K}hw@ zd!wvxfN`sRTTVb-x;RGfyoA$6%2mq}{0gGHfQRm0M9P^IUVT{HFSh1`bO^0`(macn znI;iM@Bp<>s_2kCwF=JY z&PSrL)N>3YjsOL_gI3lipNJ2XrOul1Wkw+f?&ac$$3qPNi@V_?<6r^H*bU;p$q=>> z1HvZjJge#_N_vj=kpT^tx;Xz>wFlov3AYhs1rZwWA82QuRk~@988N#nN1&YOzQHa3 zdf&p06k#ycU~rClDyg|%s8er0F|}lCP@)Z{v-VzuK5T>5<=`+i$=M^zg~GidW{KUn8}&u^k7nksXyJs5{jRl`tHwI4aOs5*?ya1z}BK`rSbW4Osuwk zzP!7-44zPQ)BpsgLeCxhiNT!Za_>?f*CXJ;7qQ8#<^K=Qzj13VkbE1||LKI?N#Dgz zIi7fmv}!*%-MEm8-?F^f%-T%3{*>l+mq_<~HYo0Jb>M|QdT}F~I?YSYm@dv}bQ}pW zFz@r0I@tf#7ANC?Q{`j!@F@?F3h&0m;LY#5vfPc>xE`I4U`@X&vyP-}ERVw+47+d* z8XbB2sGh5Hd+{W*%UR)T5f#vG^F8`sWtR@~8)B#C?QQLfjP@T}EoZ+c4rjM1ZjGme zhKp}sp}+!o1JpBW<=)Fa2TtF_-3=QXVIC2VH8rTfxH&^ZfK)EC-4LZ7vc)gt$j;&B zE7W-upbGnrXAHR~IRB-K{$r25*hy70%I93yIb>rw9p~$V7vkmchY;zmv47Gi0=ZcH zG-@I9F(-ru^j;GAl76&@L6#uC9|fE$kv7K>zz5BI7}0z>OgtK##ulGp-w47^V_Q0# zHuCjpJ4->8o$~7oo7i0@Y29LCCw36}NAQbYir!Nzr3tMo>~3U^4m{^j8Rl_h?YAiE zyhGp#8%ummkQ_Q>=-qTpeH?NTNV6{LaTjc#b_*38J~BuhbgN0&^W0t-1FuH~#hhC1 zMn{OGvG&h*`xt>KB~YjZM>i)`Nsmwxb)F$$rXEa__@Kz+APMRe*11R#?(&0!_hWIB<((OfR`TY$wQ>BK1O&x$6u zr8b-zG`lss-&MNJ83H{XmrzrxLCXP3zx616s_fK!t~=CSlew@PbyMR61D!a| zsLmv7%{S${Gp_IQYMXWX0v;SV?H^Pci3At^G0=Y~46@dK00jSvyO&zMzs`y%Yr2nYu6#9Y z*YTghKFZCC2=D}K1OtgE7My;a;3 zsO4r0%Bicd7q4#W5 zm+Xvgm|hj6LwVVX7t5zeMTOVcpsaPSw)$>PxMkvdb`kyB?G;aGW z#kZjiTUtq)U|p}b)@9@V#PZn`{gD1Td0g|}}0wF!xU=e0hy zHyG}uiLnRu=sn7Bh;pjoG`}Fdv!-#0vnYegTi{ni^fepVyOqj1R+r>Tla9W>4-K)UAhR`x5(nWp0izSdW$kHF1DHoWrOr2;ljn~@&VXv z!;to}?n^_JyK~TjZwrA8#KSX8dc!BRrSBlPOK7p;OZB1NX&jQUu>3+zhyr%DF>>dQ*Vj_VXb;zX( zIo_JSRUrlqS!=a;rg_c(E}I>bRiUcdPKf);b;qbq#k^^jYshOCbOAWZUqIUnQ9fUKBEK$&)hXv1&qdgv{1eugEQ%@G{a2OG^*wXuG3b~$Zv(2H3pToh28)cr zYev{el;D$^5k5A9V}#~b=H}vTS^YGz0)O@*21Z`O0#~2 zm-{BE`O_B3P}xZhi&+@oFrY>(h+qjmQno+gN&jLJZ+iW2Lp5>J!M6k+iEQybApKr0+#up4UogAeoM;JMHEB#{VVG0Br(~t z;o<{@RWdi)*lYX)(Ellg;`^QWQ~uKqQPcgOc8HPgMHiIdN%#N6MK-MwOPxW=U$AsA z6hD+|C?>Sb{SdlDXTqSEA{YPm#r(u&eVOc1!~;E`A@Ii?TO5jMV6eX7U#3^=(KbJw z)X$50!WpsTP5Ivi;dG`1(Q1Mn-iO$?#VW{dUm|NOB$ja@QE>~Ph#-mNJ6c1`0#bL8 zb^;qmJmr$E@2Yme^?T-@OSlKhpe$oGY@`wSL5|#*;yAw8FZzoULOkIY8Pjn%67i)} z{l}6W>Jt9?%jS@lTQ|d>jTNm#PJF*w6sHB{j<*k-*5Fdj_2a$#24~eH=jC%yHg2!H z2%3x{t~SIdKK>vjhfqvt_1%^QjO=(dj%>Ar?0bGs(A!D$zPa)z8Xsv49exN|7Z+O6 zQRUPUKl+X}fXYb+dctaPfkRo?R%^7-e7>~5?UUu~$KcRYt<>l?;Xf7hVW&f)4q zKa7KyF0KN+?^GbTpU)om1euxNw5TZ^rg5oVeTlQIZ`^tJb~Uv$0s|b;q%9c&;>51e z`c$)xs>`*eJ`x%qvrd4^9+drc4!I@NZrA_@HNnBsw{F1nVkF8z@ec`yiSEx14LDqy z(CcM#uu}3QSi0JRtqHAV&yzQlJ+KM6c}f*i3M;DrmHQUjI^~nLX$wx^x;4UaN$FVt z&Pmm5(XnW;jlm;3k}hAJAQFW@KVom}CA#H78GhaYQ}k-~GuPz3;-Eyv;kR5brwy=B zfR_?_yPB`{N!wjgu_j5w7@JOz2OZGu;OL@xz{Q;*pimlR!y=pCB{#+t5AL z32+inpvA+yi-KRXMGWNP^XPZAp}vroYP!sQG4E;+EVla%vHfn| z#|EaX2j^1(GZJzEND26^KBVP~l=+=c^IXE0_g9ivk#n7S?_xastD0^LpRc#-hdV_0 z{hMS2L%wspFLfHM`AppRfmS04pWmTbkzSqy*eo0l65!CmA7^`)_Abq90Nw2}UpR@b zjs1LC*2a%m*M;*QVbo&1a^QSx7#|CBpliq@NG4%{O(l;%KbSXgE&km>;pUK}O#LY7 z=hKdHY$ZPGW{US;_!1p?0+d#mw!Ifo*>HlFQT4NYKK3Xx=%8w}&z^)%lHyL5sH{iV zQlF5F9w7Upp0rr!ed-P?%I&>cfx#jb4Y6>zdKeJ+1*oh}oS%=)jNbSgBl(?h{7G(h z3mkpT=d=<%WB8h)flTzOV9O;(hB8mL9kMwruOktKJSwJobi9HGFIkOasl_Se(vrzI z%21W_{aWwfkgZ?Y-lndle*~}utqX+WJJEhlYJk+i+X|(+ms~(05=ByP)FJUvJ{*@t zA0UuB_vEcydLk(s6&v~4(`h))Cc`&Un_zxPiYeT<0))7e6|JO%vqVKb!nHdzRPQar^O`$jL}9z zcyBLNT;7G_UWPng87D7{$!@~X$jtVVDcw-^!O--QX8KHDsde0RJpzB=Dl8CGTWVX; z@z}4;-=5e^MKO4ZMW5ZX8QNt)v*|Dr=8Jk=B(Ie^;aW$=do+aqxqxHb|3JavGWra5 zNAiX(4t5fh7us?>RPI#)^Zbo>R|As>Q{=BSGd7fKNt-!1Ld6HSL-vHePI$O@TM*k}5G zq^A`yH&o-#vlckF*uR?APTJx>E?Zt)SPk|+!z72N4GVeicTyS;X^jnzEuc?(yP3P> zlN08Op$ef~naLYyYId-keedgm&K9%#VT>(izue;kL43eqt%)>!v%o88*#7LwDY|8_^$tgu9%gq<`i_mHPkDUVII;Qtw_RB+^7)5mC zCO)~}!GYsE*TkmRB3s_G>oXw8BYs`AY5sg;!geCmo1pHIex)aefr2!DvA#Du%ja7g zDT(m(jrA81Ja0NuFR4?npk#SW=Tgxj>f>|w4$m(>3*rxA$Nt%CR|a@Y`UTlmzk=`{ zlJa_LK&$aMpOzv$X4@i{)S2$*P^*VjVyi`d>`~!zR2>ac!W2?GYJ3BA%brp-`1T-|#o!YMKf7{>+eEb0 z!+5L{^jYlE?$bB4;fJkXuVVT8R&evJ-b|1^3j?y}_DNB@Qmhb~hIpqim9aAH5+>c)Y#7rpKts zZ(aG`MU5}{u>`^kuxaA4s219GVYtPiXZkO2mN)&g2(3*85 zekL#c#|vwqsPkYpbh%Qbr(NbNcExY?J_YDh8Z^w7#{*G;43yA?l`OC2K^dy!{v6SH zps#MZGnK;JmJV?nmvaY@bw2t4~(UEcWEs7l%MB_4?CHKX#Q!hWaXl6K6-TZ5uZ=I^?gOjBz|5}r&69B4}z_Tzld}wGy z?b%1(T+-Xdvq{HW@~S}iyt|ILpxD5FIltHoy%AD(m<*-9OrjE#=`&No~h z&a5kP)IFE8-cJKe!KPQ3n0;~FRcZ(VX?#sEJ~^5!nlJ&J+T5a$c0~u#e_WY-)+gKH z{YZ+(zrN=FbSpBh_D&uHpO)o?oyPXOrEcIeidyH1wR_`PpE?ueekOtlSq zD?*Um=U0_Q!WP0HmHr;0IDH($;EznIm)1y;*Uw?!R{{+X&=}A!?<5WRid`iRdZFm& zs+(j3E{U~_ZlOKp%p!IEGLh?yA26aZ^Jr+5KW(&=>FBfk$ha?qWhR^MGpKL!pMKr$ z7H_L>>D%j8#_jS#U#seThtMgb!S$HNFps~D>K6`Rg~$(tc6ZusJL_?`wc1}j9}iJbfaut)2sEk--+ z=k|Oi_(_-E>o54eBAm;1UF`l>4h<9QdG{*Q0M!SAvrL_28w3V~MH0;eJIaZKp0v29 z&8L=>zYp8bg30W+;VutS>>Hof2%kjM&0lXT{-?6DY-;oS+IEp5#jUsnEAH+Nh2lYq z6{p2DxVr_~QrtbbyA>}E#e;i+;BI$*|C#3lJTLPmbIoM!wXeO`ah$Pjy|bz4_Md;~ z1pC@Ph0t7v#4(dWv8uN^bN0A5tHRbFqD*Fu_d=(_{>f6i@-qE|xqU7m}YZ4OB1(@)vk7l|OabbzUsXrP!g8cW9xZUgV;}&7FRAIGETMG4Qrc z@Rcqr_DE;dhCVJEZw@J!9ZD-9!<^q9?2uEH5}_nyZc=qL*#3$=-TZa@m4Q!GdR6EU zY4dEtdO*_8qNu$V?|#l`$KVS~E7m$SZ(prQt+X8QNkep)GiGJi&2G26{L^daEZycT z0URxTOx4*qHtXF&(amaJTQ(5U6R32nkJcNKyGF-aYJi~Z%rhUGfjt8)G*Wh_n4ye| zZ5=c1H%zCvqvVahp$pm$Mk{QSf!7M&wdCw*V-Q<*DX?w&RYHw_PTRtKRD@@Cq(zii zt?u$wxSHhJF;K4=a%UZOB&L8KibDYJ`ufhIDyMtYH6BaRStSfkIWkwNG4l&t(SxYJ zQLQF`xN_vv{wyCaZ3~tpf^SRmTuiH&-0V_x6!%xw6rX|$3ILYPtUHWr;FSzYX&~@n6+zWdPH@-*=_8Us~~T#}hK z@N*_gzQ2b^ zx|WPHq$4pL3fGtHr0?`l)0fV5ivu;yzAajO`U^J&U;4RYQ!5P{U%oY7%`9|Wu8HJR z(-Gzn&XqZwD{+HyJ~^i-OJi@j#631hjddE()`yHmt57~FEo>vS_;W7Y*7Lb0Gi9*k zn6ht=38plebV1|SSqhBbd_+mA=y(3l&F!asQT$W6(CKy$(Z6pXFhQ1N`5w<2w)15j z9odK{jC;(c*JjE&C%`l3cN!Le0fv>-!1OqU$tH*A(E5nr5y;}!?O8NyN;W%q`bp56 zU+>u<+@g=_-?kcDzZ^l_9i(>K7B!WJfCp&eEp4?|?8Okn+GS zT>@*2p4(bjyL&ZTzw2()&PmDGE;^QvR2&Le553=b5P>jB87lho$Vtn?l+lg~B_KxR z%i|BP(Tzs6D+sv*OVrpQ)s;aY6pdCX&P7H}O~-L`b=Z(tWHAO; z0SjPieNi@v_gnd&TD;`@&{MWwPoa7#qokn6N#O3+-VD&~dsROYw)rA29lkd|5CR?R z(!8zwUPV>1syn!rUoQL%UwMJqj8@iI;X5^}PCrMF*a9p@%>$|C_N5b0vDn?GY5L>x`NI|S=4kN8UhC-(u8?-#qWPk>GvY!hTsQ3>$elCyZ1wiFoM=6^zt53mj_xLUqaDdBI*2;&ndxKcbao6CnTY5RGuXUdiv!~|-l`MzV}lS+#5;zJ-IVr*U%&TC*u|K0^ zf}G~(aVqCOX;9?~8S=Gm%SmpysOc;p#n2FFL+_-qi6T)j0v^vhY97Ye|3{p8cC3X>-o}cd&TX9WRcHtwxh2 ze~ZRP9M;=crn5a~#rp#|M{`;hwOYO^_%dziUVV)v8hoIco9tODo1YCDXl76J4dkHs zJH|uIgFy6&y2vc=8okc|G~xbf@a2A>Qf0xX(+!2Zk80(AxF-L5UPvX<_+d%5TpcgA zqP!(O(--EWZ=7YKE7&jl`82e-2$#Mk=OIx_xb!V}a)k5)RX6E|4p?EoHZNl`{meSf zElFi(<2+}sSK$)C+7E*{(ZZzzZS(WOzBm*IT!+MBAvn<76h#vfH7~=|ALqjKjTES@TEU0!YgbU~Rgb@O-&BENqDu=QN24{s@~={eReNU6E4=aQBoJ zzI1Eo9rrzlHmvAQ_pT8W)21an2KAa{)?y|A9Zk|x!u5+hSi>x1juF3}FZ0^t#hMmC zTk?1Rl`0FN@ZeBs%}*q{pq``Yw4`h#`F;oqqW#>abcnmkW{@bmgRNqTdHaKWnv?Tp zi<)ShZ8BM%r9)_kR^mH7aE)~=mmKIomZ5(N1(F&ceUC9UU;u$?qz?Ai4JImr~!Cdmrn(% zu2>#`Z36A`a6A`pZ(gfeo5zzY_B*8_>1=Lqr=v;|31BZsE;nqdPa^0o;xzjW-b08E z47SBlhPGEj5|*c#eE35?#=v_aeN<$j4l4(6aT zV&CYNpDouTGUyjCi1~8B)6iSIvL3A4GX(q={PrkFOw>mrUyHOm+EBK(61DJlxa}Y= zvpU3;AD4pDx3XhMir#gllFyHPVBc%u< zIh0{{Q4)H6;%620zIBt{BW8Mru zG0#P>RK_T=)G^~KMfa>G_|GE;A7Ur_*1uo1drGF38p_<^QW3E@9}!zoGx1zVLFb-K zHy13$*N*>Fr3O2qj}Vp>9|2}$wy{d$r|=3x*aCzS9Hh&~kS6BdE*riDGG1ni$r0zd ze<-U=Y|AifYm)6-Eo)bqks@)j6Y`?jS8~tbvd~zfuO)y#p99oYEMYrOrVxuTKXkq% zdQ(gA)Yawm!!m77y7@&vM%W&6u2*-YH5aIZ)MSx_SwZiSXxb0S_J@S_V~BL@<_2(% zkVMalhm5@ruCOY%ErBRG&ASCDhgov5@S83%31k&=CA#qzFb$Y8gbK&gCJP?ur+n6j zScb?LO@*dr>ImjWXMO>#pm{~#CnB(8MdF)1=^*bI3CS#>z+%>Byr~@v=zrpf04!XI zpK=_lh{0lECh@VP*o-AD@r)(1tWldjgD#k zK}+*BMMMV%5!m_}!(R44G`0JHo9DMNDUT~4yOG|iC?^WL^W<wRcpCpbZ&tw1EYJ#W=mWT|tW?TCwVq%jHJ zZ5KS~_XlicZ_m(Ff<)Eoc0DP3&ouUna3KCA;!{(JC%^V#j@Ed2+jk$ox}cAWLT!99 zV{S6`Sf5E!pbkhSHnkJeY92(9pB&KAeQ|F$V7FrHKUySb>|r7t@3da`;o2QjYJ2-E zl0eP3xq|9^GmNV)WVzfw{1vw%PvvYEccJ>Gs@sPY-40sv7BDqlLtb5#lERvjv2ldvj|V@y1W4oI5q?6foBgkH zDYz9~77WRA3H2zcWY}o{$s6S{99wPto*QrJpn(T6L<$P;6w-mrj^)^~3HEc<$@Ar# zu1BGaCecg=ii9d_l>Il^PFOmd`>1Qb~ z3pRU>UF}qc89%|)49*uDH*dNz!cq)(u{KS#VmiE! z#z$qe#Kt&K+kHG1Um>#0Piq}wKO=`$y!#L z5HC`{Dt5pvJN{Q(&OJYw_BM@;#1qD%k!V==&6QG%_nQBu7E_mv2C|uqtcIY9)u)?u z5sMY0Mfw`Z@GsxhOV(Q6|9WU)zdO;8+(8lH8ZB*5YiQ-W8*FdZMDP=0dd^~WiJm*= zt~Pt=;N_Vj$9W{M!4vHQ`Or;(Pp*_=$=ODDBkM23%0^kMV@2tJ)=W7|KG%?Vh5QM~ zBj=eVy1zJvbxCgG*l|2zr?j|uzMwrE+R?2008;tk7UB*)p8qn#u z=9A~A=hKKPEt8%IZ3FM0FhuPIo5z8pGu~ccK>W+co^5~{Mp86<2`P0( zkvNV<88MPGlZyLr@fBNZEM3R{2{76PN$I^S*wI1vKvJB^%mra3@5vK!Vs5)Qz zKxPI(x%&x-3=2WCh;6hn0N5$<-9|5mWU`)a+#XO$g{YP!XE_8PCpi{~AdTh5f5M_O z<*Dk791XVh6f68NJVB?GLtFtlxQp?<{#8(I>vpkiIj+uXRt@t;heRS#P;ovb%XpWa zdJ30Pu{=JH(2$iHQWjNI824mVzTe)$?T-J1fKX*KY)`TS+`t;+iqol z;mIsxo+5kX)byt1*akU;m|zZjd(20OcPS>rCAaW{cUnf6CRwPR2=+ewrIo2y7W-VF zFS7;ROoKQKJNuVuOz-*04Uk0oNVFL3Gs&2L8Gh=7oE5ir@4{k%K!#b1l0~(2u0FP# zRfF1t6rL-;Vpogd0$)qGX)Z3?W*d+_errbl^3cWsSyyFJ2TWMw9<}NIV~* ziQ$ZD{ys+0Bst9nhuif+JFy#Wo^0?g5Y3&j?IsouNsM;Z`kKNO1HtFxceUu1Kd~|^xTRhcc#Vb;5k~SsfFAZZxddhLo0G} z3XQ~ZBoc-(SrF)~O4ph4UCZZ*ti_wXrY-J2jmOlhiis*74U^XGDF#o|;_$zr)y@`6 zw8?qBzn>RP5rBm6&UEAVOJscQxOX$9`!*+qW8l9X zl5jG0%>Q@h5l6c*)llUKpMT03e3@C%=U3Jh3r`HSr_QCkk)ozTX`djmh^}FCtR8ZG zR+$m09T<-8{%9MBmt0E=zEEQ%PkR|m(%sfdJkBxhXuIFF-ULoL!_6H$65z-;kZK!_ z1a9-*N96h_x>)h%1)TQ=r(d)K=^~jl86(6e6q79lPbq~DD9ExIoj{%4*L6b|9@16X zgV|}qEQj`+s8Tw1M}1<0ERG>reUIxh_04_#vknTAnY0br@_k|l!!<*`sA<3Lsk}U! z@UkCvjE;sa=?oLjDp?*_9iegDH>;F$iE8D6Z{!H^dd(}?mLaV<>&K5c>C$U%^qoD!jRaumQ)@)(XA$Dkz zT(^4T&z~#)WDnRDwi%qp4jcf1$$LhSF%#wxlY8}q2Bw6@OQdw8t9G^Y4RJ+9nT-Y6 z%O1u2;bw>3cGDkqMzqvv&h@`@i&zkP*uSDfu@mtLPZfv!NzXCNJ2|zh{CQRV-Lr3M z;Wdz@&=+h5z76>Bb5e|ZO-N`7ZT+cNYk$-(xkE(rpgMI)(I^#%)(-tkDB*fTcPXhp zWvU_bZ*%x?;7BvzwN;Zn+nzX3P)`);;cv~*ed&MKE?5$&W8?2sBO-h#U z`lPO986`baZ#KaN@%x(30G!*1gOlu~1wG&M#uUBg056Bpl^@=B7zSsPAADrwOX|h? z%==Mq`?o=+f0Y>lA=aeN0Z!%Q&y!LnBGVHP0*irT+o@UU`+OPh<7o+Ou`%iv#h|kW z>rLj=$8^D8fw7SK=;7J-+X&I~J{6!$SfdwNi{UOzQ2vT2(#g=~yxi>SjQ?|_q{{q5 z`(FbAoJULXX$^7Sl_^O-myl|I3$tfb>NGU(2xK?Z=KSN7f(@{Lx>MY=MO;G7F>K!z z-Dcl#iD@YGCE^3Y!`V6p4%P_b5{`a{7g`dB{IWl$iz2o|JuJUm%mzTSZ+2dV>L zQEWu8EL9JzW@1$jlXLDdjKH{?Wk)I-;(;o8Q~5Pi!XcEv5Ii zLotVmMB92J%aVoMyogWLL7dnwcfP$mi?8L{hk_~P7fPHD^@5_@hHP|J4WZt}On=i9 zQ%CstnpM(7#dutJlU61^2=elpvTXWQxmp2+<3lTr_E$E4ROWJGg9^c%@OMmNBHc<{ zU%|z;JF8#oEw%{2c-Eoc7O|@&k5f)`zriTO=`BbF2evcx?_>0iIKAimc}4GL zC#NJXniI{}M4=wMb|iedDvu{l?4W@C2L*l}13n4ks6cvT6Er}i ztbj9P%Qkq}1%O40*57v0tMK*wI{r_$dkv)k{N=2RD>8_LDw5s?hpI>D|x;Z$>2{`J`HFhlE-+GF!3m0x2SB_RP1;euJ+`AzN7xNlP#=50gBf~U_7@K{1mI2 z%l-*CsG7lZe?0Vc%nxxy7ubgq_LWae`ohJ+c_|(vIpgQvEO`-UXFKqDq-cE2M|)>m zzL*-%68p9`aaS7UeRc*GKG#jPo!trmsL6+%57dvN1a;4YFHWv`UX~7PJMQ~!&v`9c zGe<(GfF#s6E!3dzZ|fvA`9y;)nQSTiLg$wuS5BF4t$Uh#)CWugKj!wJ13Z+|pW#7e z^IqR_I?SjjS)ji8b#ONdmf}3o-ZU98-y1XE%b4fkvuLpn{y-rujITk4K-N1!D&I^F z2X}VEH>}(xtMXATDh5|O(Fs|QK{`!DR^1N#C|^e$_Z0Zdfx`AJE6KSJY7yNoHOZ#p z+*+C0Y`^QJwY_hiW#DU7{6@s;)ZvIdz*H~r&gZx~PI>-;B+u*Jh?*!*bw2wDO8D&< zis|h{r$JM8TD5)7v*=M{=h%6>m8Skx;#@my@P{oN zedyIcBCmG;^A9>O{?BgRP`{gm>^`q)nAc!Rc55tlI8Sw_CQ9AfAR%hYen|OCA`+(a zgl=SidR`qiAW#GpGdr~@r(DyH_FVyW_>VS+bq!R?fz%R7suiHW@xz{ z8CIvW51-`xL?0(B#qw+|BTTtYii*ml&&Ra*-%ZV$i@9Kl?{#I1i$fnj1<|;AOjut6 zg}a$irou3fbij@gEUR6u`zQr;Mlk=ATDe`mlpPbqRV{iLog(BP2|V{2AFmSLeT!x% z;Z{TE*7G zKtgA&5zq=-5h;Mal$0cS zR=;iPz&p#?@PR*1kXBO`ZKU*9etEeQ~p5yf^s1rwyc+V@2!>n4x#3^on?vQ1R;{;!(WHM2(v8>E>0~5u=l*uyjU@q z0%VeEVryW-eGNHWQ07XoAFmroP^W$4C<;n=9t*ihNb9PdNY7cj^j(A(`FcgoePUj9> zdPOl%N)P2ev>9A5M;(aUkGf68?n!gQC(&)6yz+2s6er7&7QHkT=k@ zAv#aC?b@|MG z^jL1#?NMpCTavL<2H;9ASBLzgA1s8Zeo+NTZ~!b4z#CdL$as|leV<&2rR+s9rnq%f zpiRyOAiutW1s4O*G_ZdG@}d0w_6%fHH1??TDDZjgPM!K2(Q9K{mezFk-yxGhT1sp` z5+&=+J{6R)wQnqC2r(nus{Sv0+nn~AgGglM%nf9-B#N2}e><&ezl8`obK*`0VG>(y zY~Yt=VPZb%07yc|V|lcEi7*>)|V$PmwLm zbN=#(XnC+0j572(e}1m50%Ul<`{n9eN1T9T826Ck_}2{I*~|#(O)p0^#{8It5^pFF zb&?q-ai=CnK|F1gD3hD_k3kJHU7j{SUn^007#_v0QO<9CFrq5_?qTZMRT<7-YHpJ) zT8+_pVKgI(^@+=(wal$=_oA4hN}w+#fJt(Z3=3aOpeXlQEDx_v`w1?9h+wX`m+ivb z+)ZTY>t}c9n-fNE`Jm+73>4iCCV59~xd%SAO!1LyGDEF>;QIW|_rDAl-l`WA1Vg57 z^xneX7r@l_5@Qrcs`J8^7UDb$-WeK4m+XtJ3&KZ7S6+^$NZ>!&X`PU!KTz#P_GAY} zUxpQ}?a#t%EUg?CV!M87FVE7`zVtM28Ws)SA`7AtOq~2ECaAz`qv_?F~C3qSUCUM{7shv@F07{vSkdl;zdrs${-|{2xkbS>yl! diff --git a/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_sara_mederos_thumb.png b/docs/source/ephys_at_swc/gallery/images/thumb/sphx_glr_sara_mederos_thumb.png deleted file mode 100644 index 8a5fed589d17fe6ee62d6a9788519dba471fbd65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26794 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 diff --git a/docs/source/ephys_at_swc/gallery/index.rst b/docs/source/ephys_at_swc/gallery/index.rst deleted file mode 100644 index 2daa208..0000000 --- a/docs/source/ephys_at_swc/gallery/index.rst +++ /dev/null @@ -1,85 +0,0 @@ -:orphan: - -Example Pipelines -================== - -This page holds example pipelines for researchers -at the SWC. It details their setup, experimental -paradigms along with the pipelines they -use for preprocessing / analysis. Take a look -through and feel free to get in contact with -anyone through Slack. - -Below are a set of SpikeInterface scripts -for preprocessing and sorting of data -from a range of experimental setups. Also -see the list of repositories with code for -mutlimodal analysis including -electrophysiology -in -:ref:`Python ` -and -:ref:`Matlab `. - - -SpikeInterface Preprocessing and Sorting ----------------------------------------- - -TODO: Dammy, Ivana - - - -.. raw:: html - -
- -.. thumbnail-parent-div-open - -.. raw:: html - -
- -.. only:: html - - .. image:: /ephys_at_swc/gallery/images/thumb/sphx_glr_sara_mederos_thumb.png - :alt: - - :ref:`sphx_glr_ephys_at_swc_gallery_sara_mederos.py` - -.. raw:: html - -
Sara's Single Session Open Ephys
-
- - -.. thumbnail-parent-div-close - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /ephys_at_swc/gallery/sara_mederos - - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-gallery - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download all examples in Python source code: gallery_python.zip ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download all examples in Jupyter notebooks: gallery_jupyter.zip ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/gallery/sara_mederos.ipynb b/docs/source/ephys_at_swc/gallery/sara_mederos.ipynb deleted file mode 100644 index 361cfa8..0000000 --- a/docs/source/ephys_at_swc/gallery/sara_mederos.ipynb +++ /dev/null @@ -1,50 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Sara's Single Session Open Ephys\n\nSara Mederos (Hofer Lab)'s pipeline to ...\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sara Mederos investigates ... setup ... details...\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import probeinterface.plotting\nfrom spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys_event, read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe, plot_probe_group\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport spikeinterface as si # TODO\n\ndata_path = Path(\n r\"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../test_data/derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = False\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run the preprocessing steps\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\"\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n preprocessed_recording,\n order_channel_by_depth=False,\n time_range=(3500, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is setup means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.14" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/docs/source/ephys_at_swc/gallery/sara_mederos.py b/docs/source/ephys_at_swc/gallery/sara_mederos.py deleted file mode 100644 index be4eb8a..0000000 --- a/docs/source/ephys_at_swc/gallery/sara_mederos.py +++ /dev/null @@ -1,98 +0,0 @@ -""" -Sara's Single Session Open Ephys -========================= - -Sara Mederos (Hofer Lab)'s pipeline to ... -""" - -# %% -# Sara Mederos investigates ... setup ... details... - -import probeinterface.plotting -from spikeinterface import extract_waveforms -from spikeinterface.extractors import read_openephys_event, read_openephys -from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference -from spikeinterface.sorters import run_sorter -from pathlib import Path -from probeinterface.plotting import plot_probe, plot_probe_group -import matplotlib.pyplot as plt -from spikeinterface import curation -from spikeinterface.widgets import plot_timeseries -import spikeinterface as si # TODO - -data_path = Path( - r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" -) -output_path = Path( - r"/ceph/.../test_data/derivatives/100323/" -) - -show_probe = False -show_preprocessing = False - -# This reads OpenEphys 'Binary' format. It determines the -# probe using probeinterface.read_openephys, which reads `settings.xml` -# and requires the NP_PROBE field is filled. -raw_recording = read_openephys(data_path) - -if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - -# Run the preprocessing steps -shifted_recording = phase_shift(raw_recording) -filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) -preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median" -) - -if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - preprocessed_recording, - order_channel_by_depth=False, - time_range=(3500, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - -# Run the sorting -sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, -) - -# Curate the sorting output and extract waveforms. Calculate -# quality metrics from the waveforms. -sorting = sorting.remove_empty_units() - -sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - -# The way spikeinterface is setup means that quality metrics are -# calculated on the spikeinterface-preprocessed, NOT the kilosort -# preprocessed (i.e. drift-correct data). -# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. -waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, -) - -quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) -quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/gallery/sara_mederos.rst b/docs/source/ephys_at_swc/gallery/sara_mederos.rst deleted file mode 100644 index 672c70b..0000000 --- a/docs/source/ephys_at_swc/gallery/sara_mederos.rst +++ /dev/null @@ -1,144 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "ephys_at_swc\gallery\sara_mederos.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code. - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_ephys_at_swc_gallery_sara_mederos.py: - - -Sara's Single Session Open Ephys -========================= - -Sara Mederos (Hofer Lab)'s pipeline to ... - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Sara Mederos investigates ... setup ... details... - -.. GENERATED FROM PYTHON SOURCE LINES 10-99 - -.. code-block:: Python - - - import probeinterface.plotting - from spikeinterface import extract_waveforms - from spikeinterface.extractors import read_openephys_event, read_openephys - from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference - from spikeinterface.sorters import run_sorter - from pathlib import Path - from probeinterface.plotting import plot_probe, plot_probe_group - import matplotlib.pyplot as plt - from spikeinterface import curation - from spikeinterface.widgets import plot_timeseries - import spikeinterface as si # TODO - - data_path = Path( - r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" - ) - output_path = Path( - r"/ceph/.../test_data/derivatives/100323/" - ) - - show_probe = False - show_preprocessing = False - - # This reads OpenEphys 'Binary' format. It determines the - # probe using probeinterface.read_openephys, which reads `settings.xml` - # and requires the NP_PROBE field is filled. - raw_recording = read_openephys(data_path) - - if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - - # Run the preprocessing steps - shifted_recording = phase_shift(raw_recording) - filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) - preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median" - ) - - if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - preprocessed_recording, - order_channel_by_depth=False, - time_range=(3500, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - - # Run the sorting - sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, - ) - - # Curate the sorting output and extract waveforms. Calculate - # quality metrics from the waveforms. - sorting = sorting.remove_empty_units() - - sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - - # The way spikeinterface is setup means that quality metrics are - # calculated on the spikeinterface-preprocessed, NOT the kilosort - # preprocessed (i.e. drift-correct data). - # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. - waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, - ) - - quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) - quality_metrics.to_csv(output_path / "postprocessing") - - -.. _sphx_glr_download_ephys_at_swc_gallery_sara_mederos.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: sara_mederos.ipynb ` - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: sara_mederos.py ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/gallery/sara_mederos_codeobj.pickle b/docs/source/ephys_at_swc/gallery/sara_mederos_codeobj.pickle deleted file mode 100644 index 72228722d16976453a12abe07bfbbe70afbb3a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1086 zcma)*v5pfl5QZrNcVv${4k02W($K(3XeES1Lqh>Ih#pyvclK;yuZ``!Bn1*}BzKti zWxUxqx0@i{R^ESRz8TMqf8YQ6ZgQ{tLcz3@z`W3ni=p^pE3i;~63oXx@#p}>I^yWU`F2L{AH8?|C7 zs%!8rl{e4jT{%(yY^fA}t-xEsT*!L%&9M7 - - - - - - - - - .. list-table:: - :header-rows: 1 - :class: table table-striped sg-datatable - - * - Example - - Time - - Mem (MB) - * - :ref:`sphx_glr_ephys_at_swc_gallery_examplesdfsdfsdf_1.py` (``examplesdfsdfsdf_1.py``) - - 00:00.000 - - 0.0 From e3b95592aa404671bd3aa41398c300ed6482be75 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 17 May 2024 20:20:32 +0100 Subject: [PATCH 36/83] Delete old gallery, fix all warnings. --- docs/source/conf.py | 4 +- .../auto_examples_ephys_jupyter.zip | Bin 4573 -> 0 bytes .../auto_examples_ephys_python.zip | Bin 3749 -> 0 bytes .../thumb/sphx_glr_sara_mederos_thumb.png | Bin 26794 -> 0 bytes .../auto_examples_ephys/index.rst | 98 ----------- .../auto_examples_ephys/sara_mederos.ipynb | 43 ----- .../auto_examples_ephys/sara_mederos.py | 110 ------------- .../auto_examples_ephys/sara_mederos.rst | 155 ------------------ .../sara_mederos_codeobj.pickle | Bin 1136 -> 0 bytes .../sg_execution_times.rst | 37 ----- docs/source/ephys_at_swc/examples/README.rst | 1 + .../ephys_at_swc/examples/matlab_examples.rst | 2 + .../ephys_at_swc/examples/python_examples.rst | 5 +- docs/source/ephys_at_swc/getting_started.md | 6 +- docs/source/ephys_at_swc/index.md | 6 +- 15 files changed, 13 insertions(+), 454 deletions(-) delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst diff --git a/docs/source/conf.py b/docs/source/conf.py index dc297bf..6c303c2 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -77,8 +77,8 @@ "**/includes/**", # exclude .py and .ipynb files in auto_examples generated by sphinx-gallery # this is to prevent sphinx from complaining about duplicate source files - "gallery/*.ipynb", - "gallery/*.py", + "ephys_at_swc/gallery/*.ipynb", + "ephys_at_swc/gallery/*.py", "getting_started/*.ipynb", "getting_started/*.py", ] diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip deleted file mode 100644 index 2f8ad35b7d6d1c325672ea87d118212545509d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4573 zcmai2TW;LQ71d;td<-xj31$HW`eRx^i``O7nb<&Ml6eF%oLGWwAP7u@Q%&CPE{H7B zRYj>AgZao;KC*$VBx}e5vXSf{=dy}qzl2DzMONLq&vPHeyH}t7{EIXG`R6~TfBpA= zzW(oDesy-n|9*`%D~(J`%E?qVR`pgde*FA1A)<_m!bUH|dwvt5UF3&$BX!%Fuo;!o z+~?J!j>eu0`z1MU_1#rG6-tY@wYsO5+L2kxj1ryb zx6n=e+3O}of2@{d#GmBiT-2bcOld{7HkDSHpn@`Is(QV(sw%3L%4CsfLs?~VrB_xg zO;rlpEU@5sQ%IeQ;l+@&qOl+q*B5pz^?jmWQv;4_LxmNrVr{AgSuwh;NsI4U)Ojr4 z3?ifU6IrY%;g?WXjmhhC8j(QF@7QYv@s;N*KPHQaX0=|K^bODVsFoVFcuxvO#u;CvY zSttk1$QhMES|&9(;$VZ_1r^m}oam^F=?DMNMe_+PWK~W(IG_z>jZ>9QGjMf?yl#qO z0K_g%IzbGtswiX)D{x>b3rpQzCml3Z==?A+Jc%$>)-c@1PIcId>!Nb(jYNA~ zF!K6c5zf%Y8JW5CQ9e+Mwv*IxAghe+4gyShS^*`*AW7+gv>S{4)ziEXv>|34yLv4x zrFN~B;IcsYYG5Q?ssfoZ21d#fJ~o8pAkBGm!lam^PdgemI`vC|yq0cVs6{984zJw~ zqrUe|@41eWJ(;$dF&4vfx-wN$BL}?qOX+wI0^)khPe3`S-AP?L&RJt5!{;PX{HXF3 zx!&ciXs1fDWE26=L9*SCEW}zR#53{k_Pg7jNH=A@WtB8k=3g#fDZ50>1-oLDXf9VK zi6$9hI*H?WaygyOu4a>~>DBDwa(XeHrI)|GxcTa0`h4PRf_RO55SP=-32jiXpqqA= zNtEdGM0)`LKM|H$7@Alr!x=M!z$)uZ=2bo>M7Nx!xWp}BZxnzok0=C!gd3a#K0 z)>bg_{pNeIR8-^w8Uok_j2wPd!k=UXbF?9UM4F_|Xy5F}InIDdIJsO{d+P+{}M7olb-9 zcfMbu-scLH9tF+F70P{EL&RbWo7$F_;g6=mr!PErtWoDaAlhw5N#qkff*f0;rKBAP zm0O&D?>+nkn;qKG`TOpz`;Zq~P3`>1@HWMFA-R*00h+*z^~g0EFZRqymO)$(^Pxlr7w``MoN$Hrz26oBgA|!Qyihr(+O6kY zUdH>BEF(2iuV_A+T|a+57PA{5@qo&ZYYe&&W--c7v1!w}3o_tzil#(~<&el4@ffrK z8alPnWsb8Lqg5D(09!v7ahd3wV(?88-K(Nvf?3c0bbx|vp0t`m8jMz{Dv@EkI)|FS ztO_`CKH6;o6OlxnLeY6FZCY1WZAP8XGHK>*jSq7AgulF*Vkso~x7;v^OLk|S@Iu<6 z6vh4s<0 zwC&7x6zDKK^rO#i?grD|wR)gT?YDDu3v?LK)F^CHhXMM~5RBzqzJW7uY%VGka(2=l zGYrdJno>R%uW#SAL>&Tr7aSlgsBf*KJy(3rkg4uhGi z_c}No?8UB1Gy8Cq!$%%Gx&)onVHeE?C1c}A2cih~g5i8rqJwl_7#!#(n~Oskz4YS^ z-0?N!J4oQWADNR*skbYh$Zd)V&XWW?cHKId5zXSuX?%IzIghRK7DamDXJ?4HZf~Rg z3J+x!i=Te}*-v+`KKa=fXHS2KX}{3mzkmIWpN>Dv+`an6FL~z^{QeGq|BeqhXJ`Kd D=>`Hn diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip deleted file mode 100644 index f5b73ad1762f8ae308f8d9969e296f3a95adb883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3749 zcmaJ^+iu%N5OsQc5TN!YA23i*ga%|vvf{Q5z=tMH(IBlYIC&|8f?1Ixabe!PyOgEJ zqEAJCpuf?VeqYa$OX^~!GHi>xvvWB!b9Oj;^XX@gPweOKzsA3&fBgB+*I%BT*x#?P zriBt=#xbix`{iaZ81#ErvvYq;GN-qtyye%qVYLtu_j|$dPrujiy@ek7rO`v)PsM^2 z{Ve9ERN`=*7_j?F+ zp_tPRWyQ)W&SbFY9!sQ?UqkK?^K1Yeh={`Qr8uz$udAq0QB^Q%!S%KwJnDf`SjXQ%&3zL z-Do=+ho3a9^ zXdyX`2_B-TQ;yNSO5CHQ9RVWBeM?@KAfSmfE@%tM^Cnldr}p5kA|EBw0O#SLP3g8| zz4}DAY<#QIidolhs+??f!4A5RysS!%EK^=v7KWd;PEYFqo3^z1fFQ?vLF_cLx91nE zH0KTu95lQ4K7oAG$;e4jPf4d^nKAWD##5=*dU%^x)1Ag21p zi107xv}s)+_t2vjK9sZBc!Rpf2e6_`@Nw9lm$Am__YJ-uQL-cJoxX3MYK0U8B;)mO z?mR97JlU%^Fa0W)cNKek@~{utEpZ+|cu0?~l^^~`fyKc>g$f1@ zd|0Zz)WL(G>(<^a#+_btMTtt$4ZiSlz5%BLd4P4?d%rO;--X)Nti2$i$zpO;p)=N% z_m&o2@OH<3j)2gh-fR{P2I+AdQnKnWHRt7(jm&hj&@W*>oo3_hrNq=#LW;W*JhZoYbk(lEj^!6c3J?Qtm-I(8a83+PeWAm$&~ojyXhlK= zHLE)-U5igH##nM~{nB2KY)QI}j2aU)4Y{F&y4l62mm-betf@);V1{ZYOsi{qU>7Lo zt*;p4Acvflh#1{ybi($)35TBuEbbMI{>$df+%6f2PW znWKENm(VHhswZ%ZDKVzh&qt%BG)Xo0!8@b3*5vDU=p5~PFe9Gp8ZUO$U3vDZ)sv4tw_yyMAx>=FumQPd@%m hS-))J&%eLhZwGIfvp1iAVV57_C&2$3yojEh{0CVB;E4bL diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png deleted file mode 100644 index 8a5fed589d17fe6ee62d6a9788519dba471fbd65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26794 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 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst deleted file mode 100644 index 67463eb..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst +++ /dev/null @@ -1,98 +0,0 @@ -:orphan: - -:orphan: - -Python Pipelines -================ - -Multiple probes (Cambridge Neurotech) -------------------------------------- - -Dammy Onih (Akrami lab) is running a multi-session paradigm with two -`Cambridge Neurotech `__ -probes. In this multi-session task, mice learn a statistical learning paradigm to a -reward-associated auditory stimulus, recording from the hippocampus. -The pipeline uses SpikeInterface for preprocessing, -sorting, and analysis and can be found `here `__. - -The IBL analysis pipeline -------------------------- - -Nate Miska (Mrsic-Flogel lab) is a member of the -`International Brain Laboratory -(IBL) <(https://www.internationalbrainlab.com/>`_ -running the -`IBL's standardised behavioural task `_ -with acute Neuropixels 1.0 recordings. Details of the -`analysis pipeline code `__ -on the IBL data management system can be found -`here `_. - -Integrated analysis with Neuropixels 2.0 ----------------------------------------- - -Steve Lenzi (Margrie Lab) has an integrated pipeline for automated behavioural, -electrophysiological, and anatomical analysis. Steve works with a -multi-session escape paradigm, recording stimulus-responsive neurons in the posterior -striatum. He is using NeuroPixels 2.0 and SpikeGLX with a SpikeInterface-based -pipeline; the code can be found `here `__. - -Python Scripts --------------- - - - -.. raw:: html - -
- -.. thumbnail-parent-div-open - -.. raw:: html - -
- -.. only:: html - - .. image:: /ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png - :alt: - - :ref:`sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py` - -.. raw:: html - -
NP2.0 in SpikeInterface
-
- - -.. thumbnail-parent-div-close - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos - - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-gallery - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download all examples in Python source code: auto_examples_ephys_python.zip ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download all examples in Jupyter notebooks: auto_examples_ephys_jupyter.zip ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb deleted file mode 100644 index bceb73b..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb +++ /dev/null @@ -1,43 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# NP2.0 in SpikeInterface\n\nSara Mederos (Hofer Lab) performs chronic electrophysiological\nrecordings from subcortical and cortical areas using 4-shank\nNeuropixels 2.0 probes (Open Ephys). Recordings are conducted\nin freely moving mice during behavioral paradigms that assess\nthe cognitive control of innate behaviors. A pipeline\nused for pre-processing, sorting, and quality metrics\ncan be found below.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import probeinterface.plotting\nfrom spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys_event, read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe, plot_probe_group\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport spikeinterface as si # TODO\nimport numpy as np\n\n\ndata_path = Path(\n r\"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = True\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run time shift (multiplex correction) and filter\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\n\n# Perform median average filter by shank\nchannel_group = filtered_recording.get_property(\"group\")\nsplit_channel_ids = [\n filtered_recording.get_channel_ids()[channel_group == idx]\n for idx in np.unique(channel_group)\n]\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\", groups=split_channel_ids\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n filtered_recording,\n order_channel_by_depth=True,\n time_range=(3499, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is set up means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.14" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py deleted file mode 100644 index b2beaca..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py +++ /dev/null @@ -1,110 +0,0 @@ -""" -NP2.0 in SpikeInterface -======================= - -Sara Mederos (Hofer Lab) performs chronic electrophysiological -recordings from subcortical and cortical areas using 4-shank -Neuropixels 2.0 probes (Open Ephys). Recordings are conducted -in freely moving mice during behavioral paradigms that assess -the cognitive control of innate behaviors. A pipeline -used for pre-processing, sorting, and quality metrics -can be found below. -""" - -import probeinterface.plotting -from spikeinterface import extract_waveforms -from spikeinterface.extractors import read_openephys_event, read_openephys -from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference -from spikeinterface.sorters import run_sorter -from pathlib import Path -from probeinterface.plotting import plot_probe, plot_probe_group -import matplotlib.pyplot as plt -from spikeinterface import curation -from spikeinterface.widgets import plot_timeseries -import spikeinterface as si # TODO -import numpy as np - - -data_path = Path( - r"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1" -) -output_path = Path( - r"/ceph/.../derivatives/100323/" -) - -show_probe = False -show_preprocessing = True - -# This reads OpenEphys 'Binary' format. It determines the -# probe using probeinterface.read_openephys, which reads `settings.xml` -# and requires the NP_PROBE field is filled. -raw_recording = read_openephys(data_path) - -if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - -# Run time shift (multiplex correction) and filter -shifted_recording = phase_shift(raw_recording) -filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) - -# Perform median average filter by shank -channel_group = filtered_recording.get_property("group") -split_channel_ids = [ - filtered_recording.get_channel_ids()[channel_group == idx] - for idx in np.unique(channel_group) -] -preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median", groups=split_channel_ids -) - -if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - filtered_recording, - order_channel_by_depth=True, - time_range=(3499, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - -# Run the sorting -sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, -) - -# Curate the sorting output and extract waveforms. Calculate -# quality metrics from the waveforms. -sorting = sorting.remove_empty_units() - -sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - -# The way spikeinterface is set up means that quality metrics are -# calculated on the spikeinterface-preprocessed, NOT the kilosort -# preprocessed (i.e. drift-correct data). -# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. -waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, -) - -quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) -quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst deleted file mode 100644 index ce7d82a..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst +++ /dev/null @@ -1,155 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "ephys_at_swc\example_pipelines\auto_examples_ephys\sara_mederos.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code. - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py: - - -NP2.0 in SpikeInterface -======================= - -Sara Mederos (Hofer Lab) performs chronic electrophysiological -recordings from subcortical and cortical areas using 4-shank -Neuropixels 2.0 probes (Open Ephys). Recordings are conducted -in freely moving mice during behavioral paradigms that assess -the cognitive control of innate behaviors. A pipeline -used for pre-processing, sorting, and quality metrics -can be found below. - -.. GENERATED FROM PYTHON SOURCE LINES 13-111 - -.. code-block:: Python - - - import probeinterface.plotting - from spikeinterface import extract_waveforms - from spikeinterface.extractors import read_openephys_event, read_openephys - from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference - from spikeinterface.sorters import run_sorter - from pathlib import Path - from probeinterface.plotting import plot_probe, plot_probe_group - import matplotlib.pyplot as plt - from spikeinterface import curation - from spikeinterface.widgets import plot_timeseries - import spikeinterface as si # TODO - import numpy as np - - - data_path = Path( - r"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1" - ) - output_path = Path( - r"/ceph/.../derivatives/100323/" - ) - - show_probe = False - show_preprocessing = True - - # This reads OpenEphys 'Binary' format. It determines the - # probe using probeinterface.read_openephys, which reads `settings.xml` - # and requires the NP_PROBE field is filled. - raw_recording = read_openephys(data_path) - - if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - - # Run time shift (multiplex correction) and filter - shifted_recording = phase_shift(raw_recording) - filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) - - # Perform median average filter by shank - channel_group = filtered_recording.get_property("group") - split_channel_ids = [ - filtered_recording.get_channel_ids()[channel_group == idx] - for idx in np.unique(channel_group) - ] - preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median", groups=split_channel_ids - ) - - if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - filtered_recording, - order_channel_by_depth=True, - time_range=(3499, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - - # Run the sorting - sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, - ) - - # Curate the sorting output and extract waveforms. Calculate - # quality metrics from the waveforms. - sorting = sorting.remove_empty_units() - - sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - - # The way spikeinterface is set up means that quality metrics are - # calculated on the spikeinterface-preprocessed, NOT the kilosort - # preprocessed (i.e. drift-correct data). - # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. - waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, - ) - - quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) - quality_metrics.to_csv(output_path / "postprocessing") - - -.. _sphx_glr_download_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: sara_mederos.ipynb ` - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: sara_mederos.py ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle deleted file mode 100644 index eae8338e81f5ba361626ed59cb45989711f6f619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1136 zcma)*yKfXR5Qix)uiKCigg7B31q~uXTG7zZ(4+^^Bg^NVi!J<$AGutCl=h_UF#j*( zy~TUk9D=Rv-*~@y-|zi`$&>DDD`unw7KG70wbf_WfP>~ru#kSH%dhEeJNZHbPv6py zeAZM!>ZNvHnI=lSA6R@M#XPmg8;N*sTu6M{9tuyGq~51>Tj3e*tQ1Uyw2rhrgS+4; z3uH-eVPTx|8$bMDmx&*>C*F$hAanq?pbQeP_;Y@|=1(*2(u?{gQYpepL2!ckni*wd z0Mg5(*Nd0g-yWc^i-*2O=DYk8^AXWHu+A{>Ug+!0eO&Fe0|j{~P08*J5l zNN~EP<$yYCnfN+eL*La;1yos1J>b@fMJNq@AR_9YQ*u>!hgOCfcX(M~lkSF;GetuV S0@uB^t9-)R>{R=`jP-A)4ZA=9 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst deleted file mode 100644 index a8e9428..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst +++ /dev/null @@ -1,37 +0,0 @@ - -:orphan: - -.. _sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sg_execution_times: - - -Computation times -================= -**00:00.000** total execution time for 1 file **from ephys_at_swc\example_pipelines\auto_examples_ephys**: - -.. container:: - - .. raw:: html - - - - - - - - .. list-table:: - :header-rows: 1 - :class: table table-striped sg-datatable - - * - Example - - Time - - Mem (MB) - * - :ref:`sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py` (``sara_mederos.py``) - - 00:00.000 - - 0.0 diff --git a/docs/source/ephys_at_swc/examples/README.rst b/docs/source/ephys_at_swc/examples/README.rst index a34d646..88d881d 100644 --- a/docs/source/ephys_at_swc/examples/README.rst +++ b/docs/source/ephys_at_swc/examples/README.rst @@ -1,3 +1,4 @@ +:orphan: Example Pipelines ================== diff --git a/docs/source/ephys_at_swc/examples/matlab_examples.rst b/docs/source/ephys_at_swc/examples/matlab_examples.rst index cbacf17..58781a3 100644 --- a/docs/source/ephys_at_swc/examples/matlab_examples.rst +++ b/docs/source/ephys_at_swc/examples/matlab_examples.rst @@ -1,5 +1,7 @@ .. _matlab_examples: +:orphan: + Matlab Examples =============== diff --git a/docs/source/ephys_at_swc/examples/python_examples.rst b/docs/source/ephys_at_swc/examples/python_examples.rst index cee1015..6798bf5 100644 --- a/docs/source/ephys_at_swc/examples/python_examples.rst +++ b/docs/source/ephys_at_swc/examples/python_examples.rst @@ -1,10 +1,11 @@ .. _python_examples: +:orphan: + Python Repo Examples -=============== +==================== (TODO: mention where they do / do not use spikeinterface) - Steve Lenzi (Margrie Lab) is an early adopter of spikewrap (dev version) and has integrated it into a repository for automated behavioural, electrophysiological and anatomical analysis. Steve works with an diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index d5f6c3a..6afd36e 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -11,13 +11,13 @@ sections for details on where to get help. Before diving into the analysis, it can be useful to get an understanding for the history and landscape of extracellular electrophysiology. -See the resources section for [general introductions](general-introduction) +See the resources section for [general introductions](#general-introduction) as well as more technical reading for deeper background. To get started with pipeline building, the -[SpikeInterface](spikeinterface) resources are a good starting point. +[SpikeInterface](#spikeinterface) resources are a good starting point. We also have -[Examples](examples_from_the_swc) +[Examples](gallery/index) from researchers at the SWC who'd be happy to answer any questions you might have. diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index 84d466c..aa8de26 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -4,7 +4,7 @@ This page acts as an information hub for researchers using extracellular electrophysiology in the SWC. It contains [guides](getting_started.md) for preprocessing and analysis, as well as -[example scripts](examples_from_the_swc.md) +[example scripts](gallery/index) in use by researchers in the building. We encourage all types of contributions. If you've like to contribute a guide or pipeline, @@ -14,9 +14,7 @@ page for more details. This page is maintained by the [Neuroinformatics Unit](https://neuroinformatics.dev). We are focused on building community tools to automate -and centralise electrophysiology analysis. If you'd -like to read more about our plans, please visit our -[Roadmap](). +and centralise electrophysiology analysis. ::::{grid} 1 2 2 2 From bcb5ab9910c10fc158ac2f24e89e30847a22e330 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 17 May 2024 20:22:28 +0100 Subject: [PATCH 37/83] Fix requirements, repin sphinx. --- docs/requirements.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 5713d00..7a8360b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -5,8 +5,7 @@ nbsphinx numpydoc pydata-sphinx-theme -setuptools-scm -sphinx +sphinx<7.2 sphinx-copybutton sphinx-design -sphinx-gallery +sphinx-gallery \ No newline at end of file From 760b33b9099e375c810120fcc1635367d358fd25 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 17 May 2024 20:40:13 +0100 Subject: [PATCH 38/83] Try again with unpinned sphinx. --- docs/requirements.txt | 2 +- docs/source/sg_execution_times.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 7a8360b..7c5cfd2 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -5,7 +5,7 @@ nbsphinx numpydoc pydata-sphinx-theme -sphinx<7.2 +sphinx sphinx-copybutton sphinx-design sphinx-gallery \ No newline at end of file diff --git a/docs/source/sg_execution_times.rst b/docs/source/sg_execution_times.rst index 3c0561b..06892c4 100644 --- a/docs/source/sg_execution_times.rst +++ b/docs/source/sg_execution_times.rst @@ -32,6 +32,6 @@ Computation times * - Example - Time - Mem (MB) - * - :ref:`sphx_glr_ephys_at_swc_examples_example_1.py` (``ephys_at_swc\examples\example_1.py``) + * - :ref:`sphx_glr_ephys_at_swc_gallery_sara_mederos.py` (``ephys_at_swc/examples/sara_mederos.py``) - 00:00.000 - 0.0 From 070cc9a10ae774f17b21ae7c06be4e613b1bd65d Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 17 May 2024 20:45:53 +0100 Subject: [PATCH 39/83] Fix linting. --- docs/requirements.txt | 2 +- docs/source/ephys_at_swc/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 7c5cfd2..8208154 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -8,4 +8,4 @@ pydata-sphinx-theme sphinx sphinx-copybutton sphinx-design -sphinx-gallery \ No newline at end of file +sphinx-gallery diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index aa8de26..47dbdc1 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -14,7 +14,7 @@ page for more details. This page is maintained by the [Neuroinformatics Unit](https://neuroinformatics.dev). We are focused on building community tools to automate -and centralise electrophysiology analysis. +and centralise electrophysiology analysis. ::::{grid} 1 2 2 2 From 5dfc54739c941f92493011c02b8a96120b53df4d Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 17 May 2024 21:10:16 +0100 Subject: [PATCH 40/83] Remove part about community moving to SI. --- docs/source/ephys_at_swc/getting_started.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index 6afd36e..29a687f 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -122,9 +122,6 @@ different spike-sorting algorithms across probe types and brain regions. ### Pipelines -While the community has gradually coalesced around SpikeInterface, -other robust pipelines predating SpikeInterface provide a great technical resource: - [The Allen Spike sorting pipeline](https://github.com/AllenInstitute/ecephys_spike_sorting) [The IBL sorting pipeline](https://github.com/int-brain-lab/ibl-neuropixel) From 48b7727603e2d1f894d3a629c4b74e90c25aab21 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 20 May 2024 14:29:45 +0100 Subject: [PATCH 41/83] Reorder resources / getting started, rename gallery output page and add to gitignore. --- .gitignore | 2 + docs/source/conf.py | 8 +- .../{examples => examples_ephys}/README.rst | 0 .../matlab_examples.rst | 0 .../python_examples.rst | 0 .../sara_mederos.py | 0 docs/source/ephys_at_swc/getting_started.md | 108 ----------------- docs/source/ephys_at_swc/index.md | 10 +- docs/source/ephys_at_swc/resources.md | 114 ++++++++++++++++++ 9 files changed, 125 insertions(+), 117 deletions(-) rename docs/source/ephys_at_swc/{examples => examples_ephys}/README.rst (100%) rename docs/source/ephys_at_swc/{examples => examples_ephys}/matlab_examples.rst (100%) rename docs/source/ephys_at_swc/{examples => examples_ephys}/python_examples.rst (100%) rename docs/source/ephys_at_swc/{examples => examples_ephys}/sara_mederos.py (100%) create mode 100644 docs/source/ephys_at_swc/resources.md diff --git a/.gitignore b/.gitignore index aedc8d7..0038f7f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +docs/source/ephys_at_the_swc/auto_examples_ephys + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/docs/source/conf.py b/docs/source/conf.py index 6c303c2..6bbeea6 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -77,8 +77,8 @@ "**/includes/**", # exclude .py and .ipynb files in auto_examples generated by sphinx-gallery # this is to prevent sphinx from complaining about duplicate source files - "ephys_at_swc/gallery/*.ipynb", - "ephys_at_swc/gallery/*.py", + "ephys_at_swc/auto_examples_ephys/*.ipynb", + "ephys_at_swc/auto_examples_ephys/*.py", "getting_started/*.ipynb", "getting_started/*.py", ] @@ -158,6 +158,6 @@ # Configure sphinx-gallery sphinx_gallery_conf = { - 'examples_dirs': ["ephys_at_swc/examples"], # path to your example scripts - 'gallery_dirs': ["ephys_at_swc/gallery"], # path to where to save gallery generated output + 'examples_dirs': ["ephys_at_swc/examples_ephys"], # path to your example scripts + 'gallery_dirs': ["ephys_at_swc/auto_examples_ephys"], # path to where to save gallery generated output } diff --git a/docs/source/ephys_at_swc/examples/README.rst b/docs/source/ephys_at_swc/examples_ephys/README.rst similarity index 100% rename from docs/source/ephys_at_swc/examples/README.rst rename to docs/source/ephys_at_swc/examples_ephys/README.rst diff --git a/docs/source/ephys_at_swc/examples/matlab_examples.rst b/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst similarity index 100% rename from docs/source/ephys_at_swc/examples/matlab_examples.rst rename to docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst diff --git a/docs/source/ephys_at_swc/examples/python_examples.rst b/docs/source/ephys_at_swc/examples_ephys/python_examples.rst similarity index 100% rename from docs/source/ephys_at_swc/examples/python_examples.rst rename to docs/source/ephys_at_swc/examples_ephys/python_examples.rst diff --git a/docs/source/ephys_at_swc/examples/sara_mederos.py b/docs/source/ephys_at_swc/examples_ephys/sara_mederos.py similarity index 100% rename from docs/source/ephys_at_swc/examples/sara_mederos.py rename to docs/source/ephys_at_swc/examples_ephys/sara_mederos.py diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index 29a687f..baedd5c 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -20,111 +20,3 @@ We also have [Examples](gallery/index) from researchers at the SWC who'd be happy to answer any questions you might have. - -# Resources - -This section is by no means exhaustive, representing only a -small collection of resources that researchers at the SWC have found -useful in getting started. - -## General Introduction - -Below are a selection of papers that give a general background -and overview of the extracellular electrophysiology landscape: - -[Challenges and opportunities for large-scale electrophysiology with Neuropixels probes](https://pubmed.ncbi.nlm.nih.gov/29444488/) - -[Spike sorting: new trends and challenges of the era of high-density probes](https://iopscience.iop.org/article/10.1088/2516-1091/ac6b96/meta) - -[Past, present and future of spike sorting techniques](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4674014/) - -[Continuing progress of spike sorting in the era of big data](https://pubmed.ncbi.nlm.nih.gov/30856552/) - -## Technical Introduction - -Below are more technical resources on the different stages of -extracellular electrophysiology analysis. - -A particularly useful resource is the -[NeuroPixels](https://www.ucl.ac.uk/neuropixels/courses) course, with their videos published online -(e.g. [2023](https://www.ucl.ac.uk/neuropixels/training/2023-neuropixels-course)). -While these are particularly useful for NeuroPixels users, they are -useful resources for any researcher -approaching electrophysiology preprocessing and analysis. - -### Preprocessing - -The [IBL white paper](https://figshare.com/articles/online_resource/Spike_sorting_pipeline_for_the_International_Brain_Laboratory/19705522) -contains a clearly written overview of preprocessing steps. Similarly, Bill Karsh's -[guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on the -SpikeGLX website also gives a useful overview. - -[This paper](https://pubmed.ncbi.nlm.nih.gov/30998899/) provides a more -technical treatment of digital filtering, a key step in preprocessing and analysis. - -### Spike Sorting - -[This video](https://www.youtube.com/watch?v=vSydfDvsewY) with Christophe Pouzat, provides -an excellent overview of the spike-sorting problem. - -[This chapter](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) provides a more -technical overview of spike sorting. It is also recommended to check out the -papers of existing spike sorting algorithms. A list of the main -spike sorters can be found [here](https://spikeinterface.readthedocs.io/en/latest/modules/sorters.html#supported-spike-sorters). - - -### Quality Metrics and Manual Curation - -Assessing the quality of spike-sorting is a key to producing high-quality data. - -These two papers provide a nice introduction to quality metrics of spike sorting: - -[Quality Metrics to Accompany Spike Sorting of Extracellular Signals](https://www.jneurosci.org/content/31/24/8699) - -[Improving data quality in neuronal population recordings](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5244825/) - -[Phy](https://github.com/cortex-lab/phy) -is the most popular tool for performing manual curation of spike sorting results. -A great [guide by Steve Lenzi](https://phy.readthedocs.io/en/latest/sorting_user_guide/) takes you -through the key steps for manual curation. - -More recently, advances in the automation of curation has been made using the -[Bombcell package](https://github.com/Julie-Fabre/bombcell). - -SpikeInterface also maintain a set of quality metrics, -[explained in detail](https://spikeinterface.readthedocs.io/en/latest/modules/qualitymetrics.html) -in their documentation. - -## SpikeInterface - -Visit the SpikeInterface -[GitHub](https://github.com/SpikeInterface/spikeinterface) -and -[Documentation](https://spikeinterface.readthedocs.io/en/latest/index.html) -to get started. Note their documentation currently points to the developer -version, select your installed version from the list at the bottom-left -of the page. - -## Other Community Tools - -### Analysis - -SpikeInterface -is mainly focused on preprocessing, spike sorting and quality metrics. -[Pynapple](https://github.com/pynapple-org/pynapple) -and -[Elephant]( https://neuralensemble.org/elephant/) -both provide nice toolboxes for analysing data post-sorting. - -The [SpikeForest](https://spikeforest.flatironinstitute.org/) -project is an excellent resource for assessing the performance of -different spike-sorting algorithms across probe types and brain regions. - -### Pipelines - -[The Allen Spike sorting pipeline](https://github.com/AllenInstitute/ecephys_spike_sorting) - -[The IBL sorting pipeline](https://github.com/int-brain-lab/ibl-neuropixel) - -[NeuroPixels Utils](https://djoshea.github.io/neuropixel-utils/) package -(MATLAB) and related [NeuroPyxels](https://github.com/m-beau/NeuroPyxels). diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index 47dbdc1..b584122 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -2,7 +2,7 @@ This page acts as an information hub for researchers using extracellular electrophysiology in the SWC. It contains -[guides](getting_started.md) +[resources](resources.md) for preprocessing and analysis, as well as [example scripts](gallery/index) in use by researchers in the building. @@ -20,8 +20,8 @@ and centralise electrophysiology analysis. ::::{grid} 1 2 2 2 :gutter: 3 -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Getting Started -:link: getting_started +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Resources +:link: resources :link-type: doc ::: @@ -41,7 +41,7 @@ and centralise electrophysiology analysis. :maxdepth: 1 :hidden: -getting_started -gallery/index +resources +auto_examples_ephys/index community ``` diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md new file mode 100644 index 0000000..ce4506a --- /dev/null +++ b/docs/source/ephys_at_swc/resources.md @@ -0,0 +1,114 @@ +# Resources + +This section is by no means exhaustive, representing only a +small collection of resources that researchers at the SWC have found +useful in getting started. + +## General Introduction + +Below are a selection of papers that give a general background +and overview of the extracellular electrophysiology landscape: + +[Challenges and opportunities for large-scale electrophysiology with Neuropixels probes](https://pubmed.ncbi.nlm.nih.gov/29444488/) + +[Spike sorting: new trends and challenges of the era of high-density probes](https://iopscience.iop.org/article/10.1088/2516-1091/ac6b96/meta) + +[Past, present and future of spike sorting techniques](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4674014/) + +[Continuing progress of spike sorting in the era of big data](https://pubmed.ncbi.nlm.nih.gov/30856552/) + +## Technical Introduction + +Below are more technical resources on the different stages of +extracellular electrophysiology analysis. + +A particularly useful resource is the +[NeuroPixels](https://www.ucl.ac.uk/neuropixels/courses) course, with their videos published online +(e.g. [2023](https://www.ucl.ac.uk/neuropixels/training/2023-neuropixels-course)). +While these are particularly useful for NeuroPixels users, they are +useful resources for any researcher +approaching electrophysiology preprocessing and analysis. + +### Preprocessing + +The [IBL white paper](https://figshare.com/articles/online_resource/Spike_sorting_pipeline_for_the_International_Brain_Laboratory/19705522) +contains a clearly written overview of preprocessing steps. Similarly, Bill Karsh's +[guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on the +SpikeGLX website also gives a useful overview. + +[This paper](https://pubmed.ncbi.nlm.nih.gov/30998899/) provides a more +technical treatment of digital filtering, a key step in preprocessing and analysis. + +### Spike Sorting + +[This video](https://www.youtube.com/watch?v=vSydfDvsewY) with Christophe Pouzat, provides +an excellent overview of the spike-sorting problem. + +[This chapter](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) provides a more +technical overview of spike sorting. It is also recommended to check out the +papers of existing spike sorting algorithms. A list of the main +spike sorters can be found [here](https://spikeinterface.readthedocs.io/en/latest/modules/sorters.html#supported-spike-sorters). + + +### Quality Metrics and Manual Curation + +Assessing the quality of spike-sorting is a key to producing high-quality data. + +These two papers provide a nice introduction to quality metrics of spike sorting: + +[Quality Metrics to Accompany Spike Sorting of Extracellular Signals](https://www.jneurosci.org/content/31/24/8699) + +[Improving data quality in neuronal population recordings](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5244825/) + +[Phy](https://github.com/cortex-lab/phy) +is the most popular tool for performing manual curation of spike sorting results. +A great [guide by Steve Lenzi](https://phy.readthedocs.io/en/latest/sorting_user_guide/) takes you +through the key steps for manual curation. + +More recently, advances in the automation of curation has been made using the +[Bombcell package](https://github.com/Julie-Fabre/bombcell). + +SpikeInterface also maintain a set of quality metrics, +[explained in detail](https://spikeinterface.readthedocs.io/en/latest/modules/qualitymetrics.html) +in their documentation. + +## SpikeInterface + +Visit the SpikeInterface +[GitHub](https://github.com/SpikeInterface/spikeinterface) +and +[Documentation](https://spikeinterface.readthedocs.io/en/latest/index.html) +to get started. Note their documentation currently points to the developer +version, select your installed version from the list at the bottom-left +of the page. + +## Other Community Tools + +### Analysis + +SpikeInterface +is mainly focused on preprocessing, spike sorting and quality metrics. +[Pynapple](https://github.com/pynapple-org/pynapple) +and +[Elephant]( https://neuralensemble.org/elephant/) +both provide nice toolboxes for analysing data post-sorting. + +The [SpikeForest](https://spikeforest.flatironinstitute.org/) +project is an excellent resource for assessing the performance of +different spike-sorting algorithms across probe types and brain regions. + +### Pipelines + +[The Allen Spike sorting pipeline](https://github.com/AllenInstitute/ecephys_spike_sorting) + +[The IBL sorting pipeline](https://github.com/int-brain-lab/ibl-neuropixel) + +[NeuroPixels Utils](https://djoshea.github.io/neuropixel-utils/) package +(MATLAB) and related [NeuroPyxels](https://github.com/m-beau/NeuroPyxels). + +```{toctree} +:maxdepth: 1 +:hidden: + +getting_started +``` From e7daf128568071ac050a750ee9cbf44b888c0197 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 20 May 2024 14:42:52 +0100 Subject: [PATCH 42/83] Further reorganise getting started page. --- docs/source/ephys_at_swc/index.md | 8 +++++++- docs/source/ephys_at_swc/resources.md | 7 ------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index b584122..abea9a7 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -20,6 +20,11 @@ and centralise electrophysiology analysis. ::::{grid} 1 2 2 2 :gutter: 3 +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Getting Started +:link: getting_started +:link-type: doc +::: + :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Resources :link: resources :link-type: doc @@ -38,9 +43,10 @@ and centralise electrophysiology analysis. :::: ```{toctree} -:maxdepth: 1 +:maxdepth: 2 :hidden: +getting_started resources auto_examples_ephys/index community diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md index ce4506a..4880f59 100644 --- a/docs/source/ephys_at_swc/resources.md +++ b/docs/source/ephys_at_swc/resources.md @@ -105,10 +105,3 @@ different spike-sorting algorithms across probe types and brain regions. [NeuroPixels Utils](https://djoshea.github.io/neuropixel-utils/) package (MATLAB) and related [NeuroPyxels](https://github.com/m-beau/NeuroPyxels). - -```{toctree} -:maxdepth: 1 -:hidden: - -getting_started -``` From ec38d0bf0004cfcf6cae0e045afd3d1dff9ddd78 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 20 May 2024 15:11:38 +0100 Subject: [PATCH 43/83] Tidy up getting started, fix external links. --- docs/source/ephys_at_swc/getting_started.md | 2 ++ docs/source/ephys_at_swc/resources.md | 39 +++++++++++---------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index baedd5c..e2c8fbf 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -14,6 +14,8 @@ for the history and landscape of extracellular electrophysiology. See the resources section for [general introductions](#general-introduction) as well as more technical reading for deeper background. +INTRODUCE SPIKEINTERFACE + To get started with pipeline building, the [SpikeInterface](#spikeinterface) resources are a good starting point. We also have diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md index 4880f59..1b8bad4 100644 --- a/docs/source/ephys_at_swc/resources.md +++ b/docs/source/ephys_at_swc/resources.md @@ -9,13 +9,13 @@ useful in getting started. Below are a selection of papers that give a general background and overview of the extracellular electrophysiology landscape: -[Challenges and opportunities for large-scale electrophysiology with Neuropixels probes](https://pubmed.ncbi.nlm.nih.gov/29444488/) +[Steinmetz NA et al. (2018). Challenges and opportunities for large-scale electrophysiology with Neuropixels probes. *Current Opinion in Neurobiology*.](https://pubmed.ncbi.nlm.nih.gov/29444488/) -[Spike sorting: new trends and challenges of the era of high-density probes](https://iopscience.iop.org/article/10.1088/2516-1091/ac6b96/meta) +[Buccino AP et al. (2022). Spike sorting: new trends and challenges of the era of high-density probes. *Progress in Biomedical Engineering*.](https://iopscience.iop.org/article/10.1088/2516-1091/ac6b96/meta) -[Past, present and future of spike sorting techniques](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4674014/) +[Rey HG et al. (2015). Past, present and future of spike sorting techniques. *Brain Research Bulletin*.](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4674014/) -[Continuing progress of spike sorting in the era of big data](https://pubmed.ncbi.nlm.nih.gov/30856552/) +[Carlson D et al. (2019). Continuing progress of spike sorting in the era of big data. *Current Opinion in Neurobiology*](https://pubmed.ncbi.nlm.nih.gov/30856552/) ## Technical Introduction @@ -23,31 +23,34 @@ Below are more technical resources on the different stages of extracellular electrophysiology analysis. A particularly useful resource is the -[NeuroPixels](https://www.ucl.ac.uk/neuropixels/courses) course, with their videos published online +[Neuropixels](https://www.ucl.ac.uk/neuropixels/courses) course, with their videos published online (e.g. [2023](https://www.ucl.ac.uk/neuropixels/training/2023-neuropixels-course)). -While these are particularly useful for NeuroPixels users, they are +While these are particularly useful for Neuropixels users, they are useful resources for any researcher approaching electrophysiology preprocessing and analysis. ### Preprocessing The [IBL white paper](https://figshare.com/articles/online_resource/Spike_sorting_pipeline_for_the_International_Brain_Laboratory/19705522) -contains a clearly written overview of preprocessing steps. Similarly, Bill Karsh's -[guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on the +contains a clearly written overview of preprocessing steps. Similarly, +[Bill Karsh's guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on the SpikeGLX website also gives a useful overview. -[This paper](https://pubmed.ncbi.nlm.nih.gov/30998899/) provides a more -technical treatment of digital filtering, a key step in preprocessing and analysis. +[de Cheveigné & Nelken (2019)](https://pubmed.ncbi.nlm.nih.gov/30998899/) +provide a more technical treatment of digital filtering, a key step in preprocessing and analysis. ### Spike Sorting -[This video](https://www.youtube.com/watch?v=vSydfDvsewY) with Christophe Pouzat, provides -an excellent overview of the spike-sorting problem. +[This video on Spike Sorting with Christophe Pouzat](https://www.youtube.com/watch?v=vSydfDvsewY), +provides an excellent overview of the spike-sorting problem. -[This chapter](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) provides a more -technical overview of spike sorting. It is also recommended to check out the +[This chapter](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) provides a +more detailed introduction to spike sorting and associated quality metrics. + +It is also recommended to check out the papers of existing spike sorting algorithms. A list of the main -spike sorters can be found [here](https://spikeinterface.readthedocs.io/en/latest/modules/sorters.html#supported-spike-sorters). +spike sorters can be found +[on the SpikeInterface website](https://spikeinterface.readthedocs.io/en/latest/modules/sorters.html#supported-spike-sorters). ### Quality Metrics and Manual Curation @@ -56,9 +59,9 @@ Assessing the quality of spike-sorting is a key to producing high-quality data. These two papers provide a nice introduction to quality metrics of spike sorting: -[Quality Metrics to Accompany Spike Sorting of Extracellular Signals](https://www.jneurosci.org/content/31/24/8699) +[Hill et al. (2011). Quality Metrics to Accompany Spike Sorting of Extracellular Signals. *Journal of Neuroscience*.](https://www.jneurosci.org/content/31/24/8699) -[Improving data quality in neuronal population recordings](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5244825/) +[Harris et al. (2016). Improving data quality in neuronal population recordings. *Nature Neuroscience*.](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5244825/) [Phy](https://github.com/cortex-lab/phy) is the most popular tool for performing manual curation of spike sorting results. @@ -103,5 +106,5 @@ different spike-sorting algorithms across probe types and brain regions. [The IBL sorting pipeline](https://github.com/int-brain-lab/ibl-neuropixel) -[NeuroPixels Utils](https://djoshea.github.io/neuropixel-utils/) package +[Neuropixels Utils](https://djoshea.github.io/neuropixel-utils/) package (MATLAB) and related [NeuroPyxels](https://github.com/m-beau/NeuroPyxels). From 79054952cc9204540352042b20836a36754d8b28 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 20 May 2024 15:31:41 +0100 Subject: [PATCH 44/83] Small tidy ups, try and remove auto_examples folder. --- .gitignore | 2 +- docs/source/ephys_at_swc/community.md | 9 ++++----- docs/source/ephys_at_swc/index.md | 14 +++++++------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 0038f7f..2b30822 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -docs/source/ephys_at_the_swc/auto_examples_ephys +docs/source/ephys_at_swc/auto_examples_ephys/ # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/docs/source/ephys_at_swc/community.md b/docs/source/ephys_at_swc/community.md index e080822..d1eff6a 100644 --- a/docs/source/ephys_at_swc/community.md +++ b/docs/source/ephys_at_swc/community.md @@ -3,13 +3,12 @@ This site is maintained by the [NeuroInformatics Unit](https://neuroinformatics.dev/). Please don't hesitate to contact us -(in particular Joe Ziminski) on Slack with any questions or feedback -on electrophysiology analysis at the SWC. +(in particular Joe Ziminski) on Slack with any questions or feedback. -For information and advice on extracellular electrophysiology from the SWC community, the +For information and advice on electrophysiology from the SWC community, the best place to go is the `#forum-extracellular-ephys` channel on the SWC Slack. -Outside the SWC, you can address any questions or issues about +Outside the SWC, you can address any questions or issues for [SpikeInterface](https://github.com/SpikeInterface) by raising an issue on their [GitHub repository](https://github.com/SpikeInterface/spikeinterface/issues). @@ -18,5 +17,5 @@ happy to answer any questions! In addition, the [Neuropixels](https://neuropixelsgroup.slack.com/) -Slack is a great resource, with an active community discussing both +Slack is a great resource, with an active community discussing extracellular electrophysiology acquisition and analysis. diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index abea9a7..e3ee5c5 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -1,14 +1,14 @@ # Electrophysiology -This page acts as an information hub for researchers using +This page acts as an information source for researchers using extracellular electrophysiology in the SWC. It contains -[resources](resources.md) -for preprocessing and analysis, as well as -[example scripts](gallery/index) -in use by researchers in the building. +[Resources](resources.md) providing background on +the technique, as well as +[Example Pipelines](auto_examples_ephys/index) +used researchers in the building. -We encourage all types of contributions. If you've like to contribute a guide or pipeline, -please don't hesitate to get in contact! See the +We encourage all types of contributions. If you've like to contribute a +guide or pipeline, please don't hesitate to get in contact! See the [Community](community.md) page for more details. From a69b1d9a1e6971cf8cc6de3779952f9483ab57be Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 20 May 2024 15:41:37 +0100 Subject: [PATCH 45/83] Tidy up resources. --- docs/source/ephys_at_swc/resources.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md index 1b8bad4..93096d1 100644 --- a/docs/source/ephys_at_swc/resources.md +++ b/docs/source/ephys_at_swc/resources.md @@ -1,12 +1,16 @@ # Resources -This section is by no means exhaustive, representing only a -small collection of resources that researchers at the SWC have found -useful in getting started. +This section provides articles and videos providing +background and technical detail on extracellular +electrophysiology data preprocessing and analysis. + +This section is by no means exhaustive, please +feel free to [get in contact](community.md) to suggest +additions to this page. ## General Introduction -Below are a selection of papers that give a general background +Below are a selection of papers that give a history and overview of the extracellular electrophysiology landscape: [Steinmetz NA et al. (2018). Challenges and opportunities for large-scale electrophysiology with Neuropixels probes. *Current Opinion in Neurobiology*.](https://pubmed.ncbi.nlm.nih.gov/29444488/) @@ -57,7 +61,8 @@ spike sorters can be found Assessing the quality of spike-sorting is a key to producing high-quality data. -These two papers provide a nice introduction to quality metrics of spike sorting: +These two papers provide a nice introduction to quality metrics for assessing +spike sorting outputs: [Hill et al. (2011). Quality Metrics to Accompany Spike Sorting of Extracellular Signals. *Journal of Neuroscience*.](https://www.jneurosci.org/content/31/24/8699) @@ -68,7 +73,7 @@ is the most popular tool for performing manual curation of spike sorting results A great [guide by Steve Lenzi](https://phy.readthedocs.io/en/latest/sorting_user_guide/) takes you through the key steps for manual curation. -More recently, advances in the automation of curation has been made using the +More recently, advances in the automating curation has been made in the [Bombcell package](https://github.com/Julie-Fabre/bombcell). SpikeInterface also maintain a set of quality metrics, From d11705ecd16a659eb47d72585aee6c7279f479c9 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 23 May 2024 13:43:01 +0100 Subject: [PATCH 46/83] add velez-fort. --- .../examples_ephys/matlab_examples.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst b/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst index 58781a3..c8e925b 100644 --- a/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst +++ b/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst @@ -6,12 +6,14 @@ Matlab Examples =============== Mateo Velez-Fort investigates the integration of visual -and vestibular information during motion with the -Margrie lab's 'Rollercoaster' setup. They use -SpikeGLX and Neuropixels to record from the -visual cortex and (others?). The MATLAB -pipeline (used in papers such as XXX, XXX) is available -here. +and vestibular information in the visual cortex with the +Margrie lab's 'Translocator' setup. They use +SpikeGLX and Neuropixels 2.0 for actute recordings from the +primary visual cortex and other cortical areas. The MATLAB +pipeline is available +[here](https://github.com/SainsburyWellcomeCentre/rc2_analysis). + +TODO: consider whether to include papers or not. Michael Lohse From 8ec92c5b31d33ab7896bb69401645ad5d7a5b1b5 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 23 May 2024 13:46:44 +0100 Subject: [PATCH 47/83] Add Adrei first draft. --- docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst b/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst index c8e925b..43f478e 100644 --- a/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst +++ b/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst @@ -19,4 +19,8 @@ TODO: consider whether to include papers or not. Michael Lohse -Andrei Khilkevich (check) +Andrei Khilkevich (Mrsic-Flogel lab) performs +acute recordings in a visual-change detection decision making task. +They use NP1.0 probe with SpikeGLX in a head-fixed preparation with +2 probes (often, but sometimes not) recording different regions across +the whole brain. Their pipeline is available [here1], [here2], [here3]. From 83d9169cdc56290675a5af548dee9403543e0978 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Thu, 23 May 2024 13:49:29 +0100 Subject: [PATCH 48/83] Add note on papers. --- docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst b/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst index 43f478e..afa9a8e 100644 --- a/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst +++ b/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst @@ -13,7 +13,7 @@ primary visual cortex and other cortical areas. The MATLAB pipeline is available [here](https://github.com/SainsburyWellcomeCentre/rc2_analysis). -TODO: consider whether to include papers or not. +TODO: consider whether to include papers or not. (Tyson 2022, velez-fort 2024 in prep). Michael Lohse @@ -24,3 +24,4 @@ acute recordings in a visual-change detection decision making task. They use NP1.0 probe with SpikeGLX in a head-fixed preparation with 2 probes (often, but sometimes not) recording different regions across the whole brain. Their pipeline is available [here1], [here2], [here3]. +TODO: ADD links. \ No newline at end of file From d8fad3633028d2d05d0efcef97ed239b2273159c Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 5 Jul 2024 12:45:00 +0100 Subject: [PATCH 49/83] Small rewrites for community, getting started, resources. --- docs/source/ephys_at_swc/community.md | 2 +- docs/source/ephys_at_swc/getting_started.md | 23 +++++++------- docs/source/ephys_at_swc/resources.md | 34 ++++++++++----------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/docs/source/ephys_at_swc/community.md b/docs/source/ephys_at_swc/community.md index d1eff6a..ecedbf7 100644 --- a/docs/source/ephys_at_swc/community.md +++ b/docs/source/ephys_at_swc/community.md @@ -8,7 +8,7 @@ Please don't hesitate to contact us For information and advice on electrophysiology from the SWC community, the best place to go is the `#forum-extracellular-ephys` channel on the SWC Slack. -Outside the SWC, you can address any questions or issues for +Outside the SWC, you can address any questions or issues about [SpikeInterface](https://github.com/SpikeInterface) by raising an issue on their [GitHub repository](https://github.com/SpikeInterface/spikeinterface/issues). diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index e2c8fbf..ab37760 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -1,10 +1,11 @@ # Getting Started -Getting started with extracellular electrophysiology can be intimidating! -With numerous acquisition setups, software packages, preprocessing, postprocessing, -and analysis steps to consider, it's understandable to feel daunted. +With the numerous acquisition setups, software packages, preprocessing, postprocessing, +and analysis steps to consider, how to get started with extracellular electrophysiology +is not always clear. -A good first step in getting started is to ask for advice. Every setup +A good first step is to ask for advice around your particular +experimental setup and research question. Every setup and experiment is different, and it's often most effective to seek guidance early on. See the [Community](community) sections for details on where to get help. @@ -14,11 +15,11 @@ for the history and landscape of extracellular electrophysiology. See the resources section for [general introductions](#general-introduction) as well as more technical reading for deeper background. -INTRODUCE SPIKEINTERFACE - -To get started with pipeline building, the -[SpikeInterface](#spikeinterface) resources are a good starting point. -We also have +For preprocessing and spike sorting, we recommend +[SpikeInterace](https://github.com/SpikeInterface/spikeinterface), +an open source community toolkit for extracellular electrophysiology. To get +started with pipeline building, the +[SpikeInterface](https://spikeinterface.readthedocs.io/en/stable/) +documentation is a good starting point. We also have [Examples](gallery/index) -from researchers at the -SWC who'd be happy to answer any questions you might have. +from researchers at the SWC who'd be happy to answer any questions you might have. diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md index 93096d1..6629ab5 100644 --- a/docs/source/ephys_at_swc/resources.md +++ b/docs/source/ephys_at_swc/resources.md @@ -1,6 +1,6 @@ # Resources -This section provides articles and videos providing +This section includes articles and videos providing background and technical detail on extracellular electrophysiology data preprocessing and analysis. @@ -23,25 +23,25 @@ and overview of the extracellular electrophysiology landscape: ## Technical Introduction -Below are more technical resources on the different stages of +This section includes more technical resources on the different stages of extracellular electrophysiology analysis. A particularly useful resource is the [Neuropixels](https://www.ucl.ac.uk/neuropixels/courses) course, with their videos published online (e.g. [2023](https://www.ucl.ac.uk/neuropixels/training/2023-neuropixels-course)). -While these are particularly useful for Neuropixels users, they are -useful resources for any researcher +While these are targeted towards for Neuropixels users, they are +valuable resources for any researcher approaching electrophysiology preprocessing and analysis. ### Preprocessing The [IBL white paper](https://figshare.com/articles/online_resource/Spike_sorting_pipeline_for_the_International_Brain_Laboratory/19705522) -contains a clearly written overview of preprocessing steps. Similarly, -[Bill Karsh's guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on the -SpikeGLX website also gives a useful overview. +contains a clearly written overview of common preprocessing steps. Similarly, +[Bill Karsh's guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on +SpikeGLX preprocessing tools gives a useful overview. [de Cheveigné & Nelken (2019)](https://pubmed.ncbi.nlm.nih.gov/30998899/) -provide a more technical treatment of digital filtering, a key step in preprocessing and analysis. +provide a technical treatment of digital filtering, a key step in preprocessing and analysis. ### Spike Sorting @@ -85,10 +85,8 @@ in their documentation. Visit the SpikeInterface [GitHub](https://github.com/SpikeInterface/spikeinterface) and -[Documentation](https://spikeinterface.readthedocs.io/en/latest/index.html) -to get started. Note their documentation currently points to the developer -version, select your installed version from the list at the bottom-left -of the page. +[Documentation](https://spikeinterface.readthedocs.io/en/stable/) +to get started. ## Other Community Tools @@ -96,10 +94,10 @@ of the page. SpikeInterface is mainly focused on preprocessing, spike sorting and quality metrics. -[Pynapple](https://github.com/pynapple-org/pynapple) -and -[Elephant]( https://neuralensemble.org/elephant/) -both provide nice toolboxes for analysing data post-sorting. +[Pynapple](https://github.com/pynapple-org/pynapple), +[Elephant]( https://neuralensemble.org/elephant/), +and [Nemos](https://github.com/flatironinstitute/nemos) +all provide nice toolboxes for analysing data post-sorting. The [SpikeForest](https://spikeforest.flatironinstitute.org/) project is an excellent resource for assessing the performance of @@ -111,5 +109,5 @@ different spike-sorting algorithms across probe types and brain regions. [The IBL sorting pipeline](https://github.com/int-brain-lab/ibl-neuropixel) -[Neuropixels Utils](https://djoshea.github.io/neuropixel-utils/) package -(MATLAB) and related [NeuroPyxels](https://github.com/m-beau/NeuroPyxels). +For working with NeuroPixels, [Neuropixels Utils](https://djoshea.github.io/neuropixel-utils/) package +(MATLAB) and [NeuroPyxels](https://github.com/m-beau/NeuroPyxels) (Python). From 24c022f982d5589c2c71fa8d93dc842a0c9e1470 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 5 Jul 2024 13:04:41 +0100 Subject: [PATCH 50/83] Restructure sphinx examples. --- docs/source/conf.py | 4 +- .../auto_examples_ephys_jupyter.zip | Bin 0 -> 4138 bytes .../auto_examples_ephys_python.zip | Bin 0 -> 3216 bytes .../thumb/sphx_glr_sara_mederos_thumb.png | Bin 0 -> 26794 bytes .../auto_examples_ephys/index.rst | 85 +++++++++++ .../auto_examples_ephys/sara_mederos.ipynb | 50 ++++++ .../auto_examples_ephys}/sara_mederos.py | 0 .../auto_examples_ephys/sara_mederos.rst | 144 ++++++++++++++++++ .../sara_mederos_codeobj.pickle | Bin 0 -> 1086 bytes .../sg_execution_times.rst | 37 +++++ .../examples/README.rst} | 6 + .../examples/notes-on-structure.md | 5 + .../examples/sara_mederos.py | 98 ++++++++++++ .../README.rst => example_pipelines/index.md} | 17 ++- .../matlab_examples.rst | 0 docs/source/ephys_at_swc/index.md | 4 +- 16 files changed, 441 insertions(+), 9 deletions(-) create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb rename docs/source/ephys_at_swc/{examples_ephys => example_pipelines/auto_examples_ephys}/sara_mederos.py (100%) create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst rename docs/source/ephys_at_swc/{examples_ephys/python_examples.rst => example_pipelines/examples/README.rst} (84%) create mode 100644 docs/source/ephys_at_swc/example_pipelines/examples/notes-on-structure.md create mode 100644 docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py rename docs/source/ephys_at_swc/{examples_ephys/README.rst => example_pipelines/index.md} (78%) rename docs/source/ephys_at_swc/{examples_ephys => example_pipelines}/matlab_examples.rst (100%) diff --git a/docs/source/conf.py b/docs/source/conf.py index 6bbeea6..f3719c3 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -158,6 +158,6 @@ # Configure sphinx-gallery sphinx_gallery_conf = { - 'examples_dirs': ["ephys_at_swc/examples_ephys"], # path to your example scripts - 'gallery_dirs': ["ephys_at_swc/auto_examples_ephys"], # path to where to save gallery generated output + 'examples_dirs': ["ephys_at_swc/example_pipelines/examples"], # path to your example scripts + 'gallery_dirs': ["ephys_at_swc/example_pipelines/auto_examples_ephys"], # path to where to save gallery generated output } diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip new file mode 100644 index 0000000000000000000000000000000000000000..3a928cccf6884ce2dcd1ce911b767c884f2b7453 GIT binary patch literal 4138 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 literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5fed589d17fe6ee62d6a9788519dba471fbd65 GIT binary patch literal 26794 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 literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst new file mode 100644 index 0000000..2e34c22 --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst @@ -0,0 +1,85 @@ +:orphan: + +.. _python_examples: + +:orphan: + +Python Repo Examples +==================== + +(TODO: mention where they do / do not use spikeinterface) +Steve Lenzi (Margrie Lab) is an early adopter of spikewrap (dev version) +and has integrated it into a repository for automated behavioural, +electrophysiological and anatomical analysis. Steve works with an +escape paradigm recording stimulus-responsive neurons in the posterior +striatum (check) across multiple sessions. He is using NeuroPixels +and SpikeGLX and is repository is [here]. + +Dammy Onih + +Nate Miska + +Chaofei Bao + + +SpikeInterface Preprocessing and Sorting +---------------------------------------- + +TODO: Dammy, Ivana + + + +.. raw:: html + +
+ +.. thumbnail-parent-div-open + +.. raw:: html + +
+ +.. only:: html + + .. image:: /ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png + :alt: + + :ref:`sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py` + +.. raw:: html + +
Sara's Single Session Open Ephys
+
+ + +.. thumbnail-parent-div-close + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos + + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-gallery + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download all examples in Python source code: auto_examples_ephys_python.zip ` + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download all examples in Jupyter notebooks: auto_examples_ephys_jupyter.zip ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb new file mode 100644 index 0000000..6c7e7d2 --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb @@ -0,0 +1,50 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Sara's Single Session Open Ephys\n\nSara Mederos (Hofer Lab)'s pipeline to ...\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sara Mederos investigates ... setup ... details...\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import probeinterface.plotting\nfrom spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys_event, read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe, plot_probe_group\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport spikeinterface as si # TODO\n\ndata_path = Path(\n r\"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../test_data/derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = False\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run the preprocessing steps\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\"\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n preprocessed_recording,\n order_channel_by_depth=False,\n time_range=(3500, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is setup means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/source/ephys_at_swc/examples_ephys/sara_mederos.py b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py similarity index 100% rename from docs/source/ephys_at_swc/examples_ephys/sara_mederos.py rename to docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst new file mode 100644 index 0000000..1657458 --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst @@ -0,0 +1,144 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "ephys_at_swc\example_pipelines\auto_examples_ephys\sara_mederos.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py: + + +Sara's Single Session Open Ephys +========================= + +Sara Mederos (Hofer Lab)'s pipeline to ... + +.. GENERATED FROM PYTHON SOURCE LINES 9-10 + +Sara Mederos investigates ... setup ... details... + +.. GENERATED FROM PYTHON SOURCE LINES 10-99 + +.. code-block:: Python + + + import probeinterface.plotting + from spikeinterface import extract_waveforms + from spikeinterface.extractors import read_openephys_event, read_openephys + from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference + from spikeinterface.sorters import run_sorter + from pathlib import Path + from probeinterface.plotting import plot_probe, plot_probe_group + import matplotlib.pyplot as plt + from spikeinterface import curation + from spikeinterface.widgets import plot_timeseries + import spikeinterface as si # TODO + + data_path = Path( + r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" + ) + output_path = Path( + r"/ceph/.../test_data/derivatives/100323/" + ) + + show_probe = False + show_preprocessing = False + + # This reads OpenEphys 'Binary' format. It determines the + # probe using probeinterface.read_openephys, which reads `settings.xml` + # and requires the NP_PROBE field is filled. + raw_recording = read_openephys(data_path) + + if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + + # Run the preprocessing steps + shifted_recording = phase_shift(raw_recording) + filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) + preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median" + ) + + if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + preprocessed_recording, + order_channel_by_depth=False, + time_range=(3500, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + + # Run the sorting + sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, + ) + + # Curate the sorting output and extract waveforms. Calculate + # quality metrics from the waveforms. + sorting = sorting.remove_empty_units() + + sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + + # The way spikeinterface is setup means that quality metrics are + # calculated on the spikeinterface-preprocessed, NOT the kilosort + # preprocessed (i.e. drift-correct data). + # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. + waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, + ) + + quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) + quality_metrics.to_csv(output_path / "postprocessing") + + +.. _sphx_glr_download_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: sara_mederos.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: sara_mederos.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle new file mode 100644 index 0000000000000000000000000000000000000000..1b20254fdd30f46c5aa267b96ef87e0d46049d84 GIT binary patch literal 1086 zcma)*L2uMB5QRA`ZP}ETBE$-*J#ax(ND&g^-a|QqxL20fnba1JZEUC8Js@#i$v4dZ zWt`o0((HoBDS0#b=FN=#^YQNwlSkbX3Z|t5=7m-+hT^lWz(RE`n2*2W<=6N&6oyj= z#BovkcoTo1G*Pqx%pOL?{IIVV8X{$OT&o;S`lqPf#FNHHoy;ebp9l~8r6k+Zz=QIy2uOuoFA|F z(}XAsM1)=;0iLpP;arZ+UT zSKS`gscjW;cvA+0A8LDMv(D~jbCpd^yP@JeocE0mHRQ~?=-}R>J)f>D&h66{)Run$ DV11}L literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst new file mode 100644 index 0000000..a8e9428 --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst @@ -0,0 +1,37 @@ + +:orphan: + +.. _sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sg_execution_times: + + +Computation times +================= +**00:00.000** total execution time for 1 file **from ephys_at_swc\example_pipelines\auto_examples_ephys**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py` (``sara_mederos.py``) + - 00:00.000 + - 0.0 diff --git a/docs/source/ephys_at_swc/examples_ephys/python_examples.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst similarity index 84% rename from docs/source/ephys_at_swc/examples_ephys/python_examples.rst rename to docs/source/ephys_at_swc/example_pipelines/examples/README.rst index 6798bf5..5320714 100644 --- a/docs/source/ephys_at_swc/examples_ephys/python_examples.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -18,3 +18,9 @@ Dammy Onih Nate Miska Chaofei Bao + + +SpikeInterface Preprocessing and Sorting +---------------------------------------- + +TODO: Dammy, Ivana diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/notes-on-structure.md b/docs/source/ephys_at_swc/example_pipelines/examples/notes-on-structure.md new file mode 100644 index 0000000..d1d353e --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/examples/notes-on-structure.md @@ -0,0 +1,5 @@ +Here, the 'Python Examples' page is rendered as a sphinx gallery. The +first section is python examples that link to outside repos. The second +section is the sphinx gallery entries. The 'README.rst' is the +'Python Examples' page, it must be called 'README.rst' for sphinx-related +reasons. diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py new file mode 100644 index 0000000..be4eb8a --- /dev/null +++ b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py @@ -0,0 +1,98 @@ +""" +Sara's Single Session Open Ephys +========================= + +Sara Mederos (Hofer Lab)'s pipeline to ... +""" + +# %% +# Sara Mederos investigates ... setup ... details... + +import probeinterface.plotting +from spikeinterface import extract_waveforms +from spikeinterface.extractors import read_openephys_event, read_openephys +from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference +from spikeinterface.sorters import run_sorter +from pathlib import Path +from probeinterface.plotting import plot_probe, plot_probe_group +import matplotlib.pyplot as plt +from spikeinterface import curation +from spikeinterface.widgets import plot_timeseries +import spikeinterface as si # TODO + +data_path = Path( + r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" +) +output_path = Path( + r"/ceph/.../test_data/derivatives/100323/" +) + +show_probe = False +show_preprocessing = False + +# This reads OpenEphys 'Binary' format. It determines the +# probe using probeinterface.read_openephys, which reads `settings.xml` +# and requires the NP_PROBE field is filled. +raw_recording = read_openephys(data_path) + +if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + +# Run the preprocessing steps +shifted_recording = phase_shift(raw_recording) +filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) +preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median" +) + +if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + preprocessed_recording, + order_channel_by_depth=False, + time_range=(3500, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + +# Run the sorting +sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, +) + +# Curate the sorting output and extract waveforms. Calculate +# quality metrics from the waveforms. +sorting = sorting.remove_empty_units() + +sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + +# The way spikeinterface is setup means that quality metrics are +# calculated on the spikeinterface-preprocessed, NOT the kilosort +# preprocessed (i.e. drift-correct data). +# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. +waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, +) + +quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) +quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/examples_ephys/README.rst b/docs/source/ephys_at_swc/example_pipelines/index.md similarity index 78% rename from docs/source/ephys_at_swc/examples_ephys/README.rst rename to docs/source/ephys_at_swc/example_pipelines/index.md index 88d881d..ff58072 100644 --- a/docs/source/ephys_at_swc/examples_ephys/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/index.md @@ -1,6 +1,4 @@ -:orphan: -Example Pipelines -================== +# Example Pipelines This page holds example pipelines for researchers at the SWC. It details their setup, experimental @@ -21,7 +19,16 @@ and :ref:`Matlab `. -SpikeInterface Preprocessing and Sorting ----------------------------------------- +## SpikeInterface Preprocessing and Sorting TODO: Dammy, Ivana + + +```{toctree} +:maxdepth: 2 +:hidden: + +auto_examples_ephys/index +matlab_examples.rst + +``` diff --git a/docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst similarity index 100% rename from docs/source/ephys_at_swc/examples_ephys/matlab_examples.rst rename to docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index e3ee5c5..a0574e4 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -31,7 +31,7 @@ and centralise electrophysiology analysis. ::: :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Example Pipelines -:link: gallery/index +:link: example_pipelines/index :link-type: doc ::: @@ -48,6 +48,6 @@ and centralise electrophysiology analysis. getting_started resources -auto_examples_ephys/index +example_pipelines/index community ``` From f7e2e5ec5e93d0136e1e5892658e8f6d8544d981 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 5 Jul 2024 17:37:00 +0100 Subject: [PATCH 51/83] Start to update example entries. --- .../auto_examples_ephys/index.rst | 27 +++++++++++++---- .../sara_mederos_codeobj.pickle | Bin 1086 -> 1086 bytes .../example_pipelines/examples/README.rst | 27 +++++++++++++---- .../ephys_at_swc/example_pipelines/index.md | 22 +++++++++----- .../example_pipelines/matlab_examples.rst | 28 +++++++++++++----- 5 files changed, 76 insertions(+), 28 deletions(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst index 2e34c22..2fcc6ca 100644 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst +++ b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst @@ -7,25 +7,40 @@ Python Repo Examples ==================== +DETAILS +-------- + (TODO: mention where they do / do not use spikeinterface) -Steve Lenzi (Margrie Lab) is an early adopter of spikewrap (dev version) +Steve Lenzi (Margrie Lab) is an early adopter of spikewrap (dev version) [REMOVE ALL SPIKEWRAP] and has integrated it into a repository for automated behavioural, electrophysiological and anatomical analysis. Steve works with an escape paradigm recording stimulus-responsive neurons in the posterior striatum (check) across multiple sessions. He is using NeuroPixels -and SpikeGLX and is repository is [here]. +and SpikeGLX and is repository is [here](). -Dammy Onih +Mutli-probe Cambridge Neurotech [TODO] +-------------------------------------- -Nate Miska +Dammy Onih is running a multi-session paradigm with two +Cambridge Neurotech probes LINK. In this task, a mice learns +a statistic learning paradigm with auditory stimulus (MORE DETAIL?) +and recordings for the hippocampus are understanding to XXX signatures +of learning. The pipeline uses SpikeInterface for preprocessing, +sorting and analysis and can be found [here](). -Chaofei Bao +[Some behaviour] with the IBL pipeline +-------------------------------------- +Nate Miska (Mrsic-Flogel lab) is a member of the +[International Brain Laboratory (IBL)](https://www.internationalbrainlab.com/) +running the IBL task XXX with acute recordings. Neuropixels 1.0 +IBLRIG. See the analysis pipeline [XXX]() and details on the +IBL data management system can be found [here](). SpikeInterface Preprocessing and Sorting ---------------------------------------- -TODO: Dammy, Ivana +TODO: Ivana, Nicole, diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle index 1b20254fdd30f46c5aa267b96ef87e0d46049d84..0eb13d18717364a6d48f262a27bcac7eff1e9f46 100644 GIT binary patch delta 206 zcmdnTv5#YdULaplYGO)!enDzpYC%S2@s!vpwNo^DSn?8cQ>XNxOZKqk=BJeA0A(bL z3o^4)GxJJPi_#L4Q}t3SN{SMbOY)0~C)OBDj%W6r+{Wa=C^304vpb{g;M1& delta 208 zcmdnTv5#Ydo&k43Mq+Vld~rr*TFI2yDYa8HdRX!jb5p1Epvd&F<>sf9=A=%UY``Qx zu|eO9uP8M!B|g6(H7~Uwqp}#HHG{neT|9%cN3yseGdndiuOzi7EipM&FSVkiC^5Mt zzo>Xh26u+g@4lLeV0*-SHd eIx~1Dt`3~+$7sjsFu9k}gWDA>)>)cZss{ig97<^b diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst index 5320714..343c7f4 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -5,22 +5,37 @@ Python Repo Examples ==================== +DETAILS +-------- + (TODO: mention where they do / do not use spikeinterface) -Steve Lenzi (Margrie Lab) is an early adopter of spikewrap (dev version) +Steve Lenzi (Margrie Lab) is an early adopter of spikewrap (dev version) [REMOVE ALL SPIKEWRAP] and has integrated it into a repository for automated behavioural, electrophysiological and anatomical analysis. Steve works with an escape paradigm recording stimulus-responsive neurons in the posterior striatum (check) across multiple sessions. He is using NeuroPixels -and SpikeGLX and is repository is [here]. +and SpikeGLX and is repository is [here](). -Dammy Onih +Mutli-probe Cambridge Neurotech [TODO] +-------------------------------------- -Nate Miska +Dammy Onih is running a multi-session paradigm with two +Cambridge Neurotech probes LINK. In this task, a mice learns +a statistic learning paradigm with auditory stimulus (MORE DETAIL?) +and recordings for the hippocampus are understanding to XXX signatures +of learning. The pipeline uses SpikeInterface for preprocessing, +sorting and analysis and can be found [here](). -Chaofei Bao +[Some behaviour] with the IBL pipeline +-------------------------------------- +Nate Miska (Mrsic-Flogel lab) is a member of the +[International Brain Laboratory (IBL)](https://www.internationalbrainlab.com/) +running the IBL task XXX with acute recordings. Neuropixels 1.0 +IBLRIG. See the analysis pipeline [XXX]() and details on the +IBL data management system can be found [here](). SpikeInterface Preprocessing and Sorting ---------------------------------------- -TODO: Dammy, Ivana +TODO: Ivana, Nicole, diff --git a/docs/source/ephys_at_swc/example_pipelines/index.md b/docs/source/ephys_at_swc/example_pipelines/index.md index ff58072..f244857 100644 --- a/docs/source/ephys_at_swc/example_pipelines/index.md +++ b/docs/source/ephys_at_swc/example_pipelines/index.md @@ -12,16 +12,22 @@ for preprocessing and sorting of data from a range of experimental setups. Also see the list of repositories with code for mutlimodal analysis including -electrophysiology -in -:ref:`Python ` -and -:ref:`Matlab `. +electrophysiology. +::::{grid} 1 2 2 2 +:gutter: 3 -## SpikeInterface Preprocessing and Sorting +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Python Examples +:link: auto_examples_ephys/index +:link-type: doc +::: -TODO: Dammy, Ivana +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` MATLAB Examples +:link: matlab_examples +:link-type: doc +::: + +:::: ```{toctree} @@ -29,6 +35,6 @@ TODO: Dammy, Ivana :hidden: auto_examples_ephys/index -matlab_examples.rst +matlab_examples ``` diff --git a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst index afa9a8e..15e1cfe 100644 --- a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst +++ b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst @@ -5,23 +5,35 @@ Matlab Examples =============== -Mateo Velez-Fort investigates the integration of visual +TODO: alphabetical order? + +This page contains preprocessing, sorting and pipelines from across the SWC, +accessible in the linked GitHub repositories + +TODO: consider whether to include papers or not. (Tyson 2022, velez-fort 2024 in prep). + +Neuropixels 2.0 from the visual cortex in a 'Translocating' mouse : TODO: BETTER TITLE +----------------------------------------------------------------- + +Mateo Velez-Fort (Margie Lab) investigates the integration of visual and vestibular information in the visual cortex with the Margrie lab's 'Translocator' setup. They use SpikeGLX and Neuropixels 2.0 for actute recordings from the -primary visual cortex and other cortical areas. The MATLAB -pipeline is available +primary visual cortex and other cortical areas. The pipeline is available [here](https://github.com/SainsburyWellcomeCentre/rc2_analysis). -TODO: consider whether to include papers or not. (Tyson 2022, velez-fort 2024 in prep). - - -Michael Lohse +Neuropixels 1.0 multi-probe recrodings from across the brain : TODO: BETTER TITLE +------------------------------------------------------------- Andrei Khilkevich (Mrsic-Flogel lab) performs acute recordings in a visual-change detection decision making task. They use NP1.0 probe with SpikeGLX in a head-fixed preparation with 2 probes (often, but sometimes not) recording different regions across the whole brain. Their pipeline is available [here1], [here2], [here3]. -TODO: ADD links. \ No newline at end of file +TODO: ADD links. + +Michael Lohse +-------------- + +TODO \ No newline at end of file From ccb2e142f2e7a90081a057bbd0b7300fc8be18c4 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Tue, 20 Aug 2024 19:31:32 +0100 Subject: [PATCH 52/83] Tidy up the blurbs --- .../auto_examples_ephys_jupyter.zip | Bin 4138 -> 4138 bytes .../auto_examples_ephys_python.zip | Bin 3216 -> 3216 bytes .../sara_mederos.codeobj.json | 110 ++++++++++++++++++ .../auto_examples_ephys/sara_mederos.ipynb | 2 +- .../auto_examples_ephys/sara_mederos.rst | 4 + .../auto_examples_ephys/sara_mederos.zip | Bin 0 -> 7332 bytes .../example_pipelines/examples/README.rst | 51 ++++---- .../example_pipelines/matlab_examples.rst | 32 +++-- 8 files changed, 155 insertions(+), 44 deletions(-) create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json create mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.zip diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip index 3a928cccf6884ce2dcd1ce911b767c884f2b7453..8a0156240309b1856794e52c7055d23c26bc24b8 100644 GIT binary patch delta 59 zcmZ3buu4HXz?+#xgaHH+=Lkod>q$Rb!q30}!a|e(^NVgY$mC}`31id E0IdNK6#xJL delta 59 zcmZ3buu4HXz?+#xgaHJc(w{~wH0)De!q30}!a|e(^NVgY$mC}`31id E0L{Y@N&o-= diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip index 65d4eeefcb4b56569b8d629a142f55234ed2d100..9ee5ca9aafedf12588d9341803ea2de791013196 100644 GIT binary patch delta 32 jcmbOrIYE*yz?+#xgaHIJ<_Je_` + .. container:: sphx-glr-download sphx-glr-download-zip + + :download:`Download zipped: sara_mederos.zip ` + .. only:: html diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.zip new file mode 100644 index 0000000000000000000000000000000000000000..82d4a5443aa242c46ac056f5882faacb2dd020bd GIT binary patch literal 7332 zcmcIpOK&5`5#BhD17RX@;+u15%)(d-kcQ;a%G!%C2RjbpY_bw|_Y!!FadW0gHZ;>S z?(UID7<=&l$T7dc$NZf9j#TwyUL0z*T8Dxpvb(z8RbAik^4ZUS@!{1U+9O3?aR7ETkr-ELMyQ&E%RUEG)A^YcOU!TFW9Q zs^nMAE^%krPD`5T_=aAybs=-Ga)3H?WQA1zpky?S3vdoY-^A>i34KbstHZoX$w1Qt z{VO(}UAd)-#cIpfz-2{6T2iIrHP67BQ<4;UUWiySa4HiC8)mG)39O}IC1She$V;lX z8DDvkm+;Z=413N~q9DuK+wB|WeOmYU1axv^h7Q`w}$V2k#;?EbD9x2r{M&rqnpwW}@h`>t*(*%My zg(R9nhUpmTrt{fs@pv(PJbS!2o6pW>i+KL&+4+;R*=N%iEGcA4o);-2^VxjLb|om1 zL*VC7J}2W*QR%V*Pu)=zR3EtNZd zok<-va4dv+O&Xs(wE;Am;=wkf5HiMkZUP4}&P~Qn%!ztghsYAiQ1us;KzD#I+8$P# zm5^zsFj?Bsw^g!}jtaog7H;oAudF8rOi#%goEJlAmW$cUf1 ztYfIkjBB8q1g2{QE(nm7pix4&z<-Afov=ELP4znyaR*<+Voz-bSQ0`Y)tHPE&{VJt zl}=fyw@XuBJyH}DODZ;OIa!=zF!1k5k4nOYB%#YD6jFNmN>;2#U~<+A$)TTs z=V=+V4mFxkJ;4>v3fy0K=C?Wu8$gv&$@M(O$Ym~qL5&Fk~1xN0$m2LeB{*}fGV~g14p@cp=5b+&0?09U~wh5 zR<<29l>UaQNq2a2$L7va6GsQvV%;^`rRhw2W%Sq|j397PnTaN6RA4Wrn)L0U(wGMc zW^GLg%w)z#opI)@E&r4}zj$SceDrOP_eIQ7GT|W$Nh)F7ID-xhwFlP%Tz@Cfmmh*w zjBK?o)zj&8!}YdWh0tN9FHz)Ie!iM^uia@`W!ZH8+4(1U)!-dt2DI_04gk3QVA^tN z+Sb15v927vk8Ld)?a238<^RM^}b}V35`x(rNxc#_QO7yL^1nd`}^0<+pw&PN+x*5 zF*Lj)VNt?uNF@@H=pczZ!jTAXK9oYpH};L!=Ko_$N5?y%9klE%bxh!TY5AJ%SW@B0 z9VbO4G}B^vZFtn;pLaxU$ms5#dVGFfk92)=uPiCIlAifc`IkNhh zgF|h8*$>0W|5nt7zK8jyJ&%FD$59((w0YdpJMfOEEfP)l=y5(kZPvs?E!wCpalFW$F~yC1z-?pp=Sn1*ao?QWPIQg1yD6ujc>$mmJCUIPi`j7j@ca)eA*?t z6}xpwk72hi)xbE{B^btTT^fVk!21;3(o)!Y$eKQ!ux_e_B&|V73%yw>Q3Ky<_QO$f zvX9_5%guGV;Q>1G01m?2MsW6MgW&Av4uUgn6l?MR2o6uXS@kvq*LIe3TMf(F2o76A z<5quT)ueBQ;B1?DHw1^~y(5A{7VXgAg5Z$!Cq!_Os1XG;iG%6O)pA?67J{?s;$q>F z^jHFRVaQ+}wlSP#-NJBg;RuGayGM(@jo~b5gW)0sadiR0fQ%?Eaxku5@8CFB6FvL| z{<{y3i$sslFpi6Y0}mcR1)S*ZY~BG~cF+&5n1lyos$>ZwF+cqWDTk+bbRP?v8w7W` z2M-8RKT?9xKZ7S_6+AD3b3tjgTad$_vl|Pilm`y=*_exU(GiT$CFfEWGR8*R-UFGQ zEg(?Trx6Hy*DzHB#(@(HZ-$o#yKuw8GoPJi!Vv}d9asZda(MXX;i?9@>F%sAqn3WS zu}TW~;!0|efL}{7Ip~yfzrk+~RGa}KGbGNAwp$xBf<-u=h4b2ZXqB}n5G%NeVU`Cm zpBNkJ6?~FhAn)0D^!oDI&))m+!SSyI@vB07{rCg^RoyQL+lPl93E&ZY{rJNYzG3Vf YHV+6cpZ)Szxc?sfyoUcD{2o9359Lp0+yDRo literal 0 HcmV?d00001 diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst index 343c7f4..2eb5381 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -2,40 +2,39 @@ :orphan: -Python Repo Examples -==================== +Python Analysis Repo Examples +============================= -DETAILS --------- - -(TODO: mention where they do / do not use spikeinterface) -Steve Lenzi (Margrie Lab) is an early adopter of spikewrap (dev version) [REMOVE ALL SPIKEWRAP] -and has integrated it into a repository for automated behavioural, -electrophysiological and anatomical analysis. Steve works with an -escape paradigm recording stimulus-responsive neurons in the posterior -striatum (check) across multiple sessions. He is using NeuroPixels -and SpikeGLX and is repository is [here](). - -Mutli-probe Cambridge Neurotech [TODO] +Multi-probe Cambridge Neurotech -------------------------------------- -Dammy Onih is running a multi-session paradigm with two -Cambridge Neurotech probes LINK. In this task, a mice learns -a statistic learning paradigm with auditory stimulus (MORE DETAIL?) -and recordings for the hippocampus are understanding to XXX signatures -of learning. The pipeline uses SpikeInterface for preprocessing, -sorting and analysis and can be found [here](). +Dammy Onih (Akrami lab) is running a multi-session paradigm with two +[Cambridge Neurotech](https://www.cambridgeneurotech.com/neural-probes) +probes. In this multi-session task, a mice learns a statistic learning paradigm to a +reward-associated auditory stimulus, recording from the hippocampus. +The pipeline uses SpikeInterface for preprocessing, +sorting and analysis and can be found [here](https://github.com/AOONIH/ephys/tree/master). -[Some behaviour] with the IBL pipeline +The IBL Analysis Pipeline -------------------------------------- Nate Miska (Mrsic-Flogel lab) is a member of the [International Brain Laboratory (IBL)](https://www.internationalbrainlab.com/) -running the IBL task XXX with acute recordings. Neuropixels 1.0 -IBLRIG. See the analysis pipeline [XXX]() and details on the +running the [IBL's standardised behavioural task](https://elifesciences.org/articles/63711) +with acute Neuropixels 1.0 recordings. +See the analysis pipeline [XXX]() and details on the IBL data management system can be found [here](). -SpikeInterface Preprocessing and Sorting ----------------------------------------- +Automated analysis with Neuropixels 2.0 +--------------------------------------- + +Steve Lenzi (Margrie Lab) has an integrated pipeline for automated behavioural, +electrophysiological and anatomical analysis. Steve works with an +mutli-session escape paradigm recording stimulus-responsive neurons in the posterior +striatum. He is using NeuroPixels 2.0 and SpikeGLX, the pipeline +code can be found [here](https://github.com/stephenlenzi/npix_lse). + +Preprocessing and Sorting Examples +---------------------------------- + -TODO: Ivana, Nicole, diff --git a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst index 15e1cfe..b172150 100644 --- a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst +++ b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst @@ -5,12 +5,19 @@ Matlab Examples =============== -TODO: alphabetical order? +This page contains MATLAB preprocessing, sorting and pipelines from across +the SWC, accessible in the linked GitHub repositories. -This page contains preprocessing, sorting and pipelines from across the SWC, -accessible in the linked GitHub repositories -TODO: consider whether to include papers or not. (Tyson 2022, velez-fort 2024 in prep). +Neuropixels 1.0 multi-probe recrodings from across the brain : TODO: BETTER TITLE +------------------------------------------------------------- + +Andrei Khilkevich (Mrsic-Flogel lab) performs +acute recordings in a visual change-detection decision making task. +A head-fixed preparation recording from 2 implanted probes (NP 1.0) +simultaneously to record different regions across the whole brain. +Their pipeline is available [here1], [here2], [here3]. + Neuropixels 2.0 from the visual cortex in a 'Translocating' mouse : TODO: BETTER TITLE ----------------------------------------------------------------- @@ -18,21 +25,12 @@ Neuropixels 2.0 from the visual cortex in a 'Translocating' mouse : TODO: BETTER Mateo Velez-Fort (Margie Lab) investigates the integration of visual and vestibular information in the visual cortex with the Margrie lab's 'Translocator' setup. They use -SpikeGLX and Neuropixels 2.0 for actute recordings from the -primary visual cortex and other cortical areas. The pipeline is available -[here](https://github.com/SainsburyWellcomeCentre/rc2_analysis). +Neuropixels 2.0 (SpikeGLX) for acute recordings from the +primary visual cortex and other cortical areas as the head-fixed +mouse is physically displaced along a track. +The pipeline is available [here](https://github.com/SainsburyWellcomeCentre/rc2_analysis). -Neuropixels 1.0 multi-probe recrodings from across the brain : TODO: BETTER TITLE -------------------------------------------------------------- - -Andrei Khilkevich (Mrsic-Flogel lab) performs -acute recordings in a visual-change detection decision making task. -They use NP1.0 probe with SpikeGLX in a head-fixed preparation with -2 probes (often, but sometimes not) recording different regions across -the whole brain. Their pipeline is available [here1], [here2], [here3]. -TODO: ADD links. - Michael Lohse -------------- From b121a9fbe7371427b723621f3b50812bf5fa8add Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 21 Aug 2024 13:53:29 +0100 Subject: [PATCH 53/83] Add per-shank CAR to sara example. --- .../examples/sara_mederos.py | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py index be4eb8a..8380cd1 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py +++ b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py @@ -19,16 +19,18 @@ from spikeinterface import curation from spikeinterface.widgets import plot_timeseries import spikeinterface as si # TODO +import numpy as np + data_path = Path( - r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" + r"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1" ) output_path = Path( - r"/ceph/.../test_data/derivatives/100323/" + r"/ceph/.../derivatives/100323/" ) show_probe = False -show_preprocessing = False +show_preprocessing = True # This reads OpenEphys 'Binary' format. It determines the # probe using probeinterface.read_openephys, which reads `settings.xml` @@ -40,20 +42,27 @@ plot_probe(probe) plt.show() -# Run the preprocessing steps +# Run time shift (multiplex correction) and filter shifted_recording = phase_shift(raw_recording) filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) + +# Perform median average filter by shank +channel_group = filtered_recording.get_property("group") +split_channel_ids = [ + filtered_recording.get_channel_ids()[channel_group == idx] + for idx in np.unique(channel_group) +] preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median" + filtered_recording, reference="global", operator="median", groups=split_channel_ids ) if show_preprocessing: recs_grouped_by_shank = preprocessed_recording.split_by("group") for rec in recs_grouped_by_shank: plot_timeseries( - preprocessed_recording, - order_channel_by_depth=False, - time_range=(3500, 3500), + filtered_recording, + order_channel_by_depth=True, + time_range=(3499, 3500), return_scaled=True, show_channel_ids=True, mode="map", @@ -76,7 +85,7 @@ sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) -# The way spikeinterface is setup means that quality metrics are +# The way spikeinterface is set up means that quality metrics are # calculated on the spikeinterface-preprocessed, NOT the kilosort # preprocessed (i.e. drift-correct data). # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. From f5fa95359c9871a07fdfdbc217359342108c3867 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 16 Sep 2024 10:17:09 +0100 Subject: [PATCH 54/83] update gitignore. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2b30822..efffe97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -docs/source/ephys_at_swc/auto_examples_ephys/ +docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/ # Byte-compiled / optimized / DLL files __pycache__/ From 7e90bb13aef594a697928e20ea8391bf49d100b9 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 16 Sep 2024 10:21:54 +0100 Subject: [PATCH 55/83] removed auto_examples_ephys from git tracking. --- .../auto_examples_ephys_jupyter.zip | Bin 4138 -> 0 bytes .../auto_examples_ephys_python.zip | Bin 3216 -> 0 bytes .../thumb/sphx_glr_sara_mederos_thumb.png | Bin 26794 -> 0 bytes .../auto_examples_ephys/index.rst | 100 ------------ .../sara_mederos.codeobj.json | 110 ------------- .../auto_examples_ephys/sara_mederos.ipynb | 50 ------ .../auto_examples_ephys/sara_mederos.py | 98 ------------ .../auto_examples_ephys/sara_mederos.rst | 148 ------------------ .../auto_examples_ephys/sara_mederos.zip | Bin 7332 -> 0 bytes .../sara_mederos_codeobj.pickle | Bin 1086 -> 0 bytes .../sg_execution_times.rst | 37 ----- 11 files changed, 543 deletions(-) delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.zip delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle delete mode 100644 docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sg_execution_times.rst diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip deleted file mode 100644 index 8a0156240309b1856794e52c7055d23c26bc24b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4138 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 diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst deleted file mode 100644 index 2fcc6ca..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/index.rst +++ /dev/null @@ -1,100 +0,0 @@ -:orphan: - -.. _python_examples: - -:orphan: - -Python Repo Examples -==================== - -DETAILS --------- - -(TODO: mention where they do / do not use spikeinterface) -Steve Lenzi (Margrie Lab) is an early adopter of spikewrap (dev version) [REMOVE ALL SPIKEWRAP] -and has integrated it into a repository for automated behavioural, -electrophysiological and anatomical analysis. Steve works with an -escape paradigm recording stimulus-responsive neurons in the posterior -striatum (check) across multiple sessions. He is using NeuroPixels -and SpikeGLX and is repository is [here](). - -Mutli-probe Cambridge Neurotech [TODO] --------------------------------------- - -Dammy Onih is running a multi-session paradigm with two -Cambridge Neurotech probes LINK. In this task, a mice learns -a statistic learning paradigm with auditory stimulus (MORE DETAIL?) -and recordings for the hippocampus are understanding to XXX signatures -of learning. The pipeline uses SpikeInterface for preprocessing, -sorting and analysis and can be found [here](). - -[Some behaviour] with the IBL pipeline --------------------------------------- - -Nate Miska (Mrsic-Flogel lab) is a member of the -[International Brain Laboratory (IBL)](https://www.internationalbrainlab.com/) -running the IBL task XXX with acute recordings. Neuropixels 1.0 -IBLRIG. See the analysis pipeline [XXX]() and details on the -IBL data management system can be found [here](). - -SpikeInterface Preprocessing and Sorting ----------------------------------------- - -TODO: Ivana, Nicole, - - - -.. raw:: html - -
- -.. thumbnail-parent-div-open - -.. raw:: html - -
- -.. only:: html - - .. image:: /ephys_at_swc/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png - :alt: - - :ref:`sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py` - -.. raw:: html - -
Sara's Single Session Open Ephys
-
- - -.. thumbnail-parent-div-close - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos - - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-gallery - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download all examples in Python source code: auto_examples_ephys_python.zip ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download all examples in Jupyter notebooks: auto_examples_ephys_jupyter.zip ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json deleted file mode 100644 index 8c39874..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "Path": [ - { - "is_class": false, - "is_explicit": false, - "module": "pathlib", - "module_short": "pathlib", - "name": "Path" - } - ], - "bandpass_filter": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.preprocessing", - "module_short": "spikeinterface.preprocessing", - "name": "bandpass_filter" - } - ], - "common_reference": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.preprocessing", - "module_short": "spikeinterface.preprocessing", - "name": "common_reference" - } - ], - "curation.remove_excess_spikes": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.curation", - "module_short": "spikeinterface.curation", - "name": "remove_excess_spikes" - } - ], - "extract_waveforms": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface", - "module_short": "spikeinterface", - "name": "extract_waveforms" - } - ], - "phase_shift": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.preprocessing", - "module_short": "spikeinterface.preprocessing", - "name": "phase_shift" - } - ], - "plot_probe": [ - { - "is_class": false, - "is_explicit": false, - "module": "probeinterface.plotting", - "module_short": "probeinterface.plotting", - "name": "plot_probe" - } - ], - "plot_timeseries": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.widgets", - "module_short": "spikeinterface.widgets", - "name": "plot_timeseries" - } - ], - "plt.show": [ - { - "is_class": false, - "is_explicit": false, - "module": "matplotlib.pyplot", - "module_short": "matplotlib.pyplot", - "name": "show" - } - ], - "read_openephys": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.extractors", - "module_short": "spikeinterface.extractors", - "name": "read_openephys" - } - ], - "run_sorter": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.sorters", - "module_short": "spikeinterface.sorters", - "name": "run_sorter" - } - ], - "si.qualitymetrics.compute_quality_metrics": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.qualitymetrics", - "module_short": "spikeinterface.qualitymetrics", - "name": "compute_quality_metrics" - } - ] -} \ No newline at end of file diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb deleted file mode 100644 index 23cd8a0..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.ipynb +++ /dev/null @@ -1,50 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Sara's Single Session Open Ephys\n\nSara Mederos (Hofer Lab)'s pipeline to ...\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sara Mederos investigates ... setup ... details...\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import probeinterface.plotting\nfrom spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys_event, read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe, plot_probe_group\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport spikeinterface as si # TODO\n\ndata_path = Path(\n r\"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../test_data/derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = False\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run the preprocessing steps\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\"\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n preprocessed_recording,\n order_channel_by_depth=False,\n time_range=(3500, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is setup means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py deleted file mode 100644 index be4eb8a..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.py +++ /dev/null @@ -1,98 +0,0 @@ -""" -Sara's Single Session Open Ephys -========================= - -Sara Mederos (Hofer Lab)'s pipeline to ... -""" - -# %% -# Sara Mederos investigates ... setup ... details... - -import probeinterface.plotting -from spikeinterface import extract_waveforms -from spikeinterface.extractors import read_openephys_event, read_openephys -from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference -from spikeinterface.sorters import run_sorter -from pathlib import Path -from probeinterface.plotting import plot_probe, plot_probe_group -import matplotlib.pyplot as plt -from spikeinterface import curation -from spikeinterface.widgets import plot_timeseries -import spikeinterface as si # TODO - -data_path = Path( - r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" -) -output_path = Path( - r"/ceph/.../test_data/derivatives/100323/" -) - -show_probe = False -show_preprocessing = False - -# This reads OpenEphys 'Binary' format. It determines the -# probe using probeinterface.read_openephys, which reads `settings.xml` -# and requires the NP_PROBE field is filled. -raw_recording = read_openephys(data_path) - -if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - -# Run the preprocessing steps -shifted_recording = phase_shift(raw_recording) -filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) -preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median" -) - -if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - preprocessed_recording, - order_channel_by_depth=False, - time_range=(3500, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - -# Run the sorting -sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, -) - -# Curate the sorting output and extract waveforms. Calculate -# quality metrics from the waveforms. -sorting = sorting.remove_empty_units() - -sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - -# The way spikeinterface is setup means that quality metrics are -# calculated on the spikeinterface-preprocessed, NOT the kilosort -# preprocessed (i.e. drift-correct data). -# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. -waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, -) - -quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) -quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst deleted file mode 100644 index 35e36d5..0000000 --- a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.rst +++ /dev/null @@ -1,148 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "ephys_at_swc\example_pipelines\auto_examples_ephys\sara_mederos.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code. - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py: - - -Sara's Single Session Open Ephys -========================= - -Sara Mederos (Hofer Lab)'s pipeline to ... - -.. GENERATED FROM PYTHON SOURCE LINES 9-10 - -Sara Mederos investigates ... setup ... details... - -.. GENERATED FROM PYTHON SOURCE LINES 10-99 - -.. code-block:: Python - - - import probeinterface.plotting - from spikeinterface import extract_waveforms - from spikeinterface.extractors import read_openephys_event, read_openephys - from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference - from spikeinterface.sorters import run_sorter - from pathlib import Path - from probeinterface.plotting import plot_probe, plot_probe_group - import matplotlib.pyplot as plt - from spikeinterface import curation - from spikeinterface.widgets import plot_timeseries - import spikeinterface as si # TODO - - data_path = Path( - r"/ceph/.../test_data/100323/2023-10-03_18-57-09/Record Node 101/experiment1" - ) - output_path = Path( - r"/ceph/.../test_data/derivatives/100323/" - ) - - show_probe = False - show_preprocessing = False - - # This reads OpenEphys 'Binary' format. It determines the - # probe using probeinterface.read_openephys, which reads `settings.xml` - # and requires the NP_PROBE field is filled. - raw_recording = read_openephys(data_path) - - if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - - # Run the preprocessing steps - shifted_recording = phase_shift(raw_recording) - filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) - preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median" - ) - - if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - preprocessed_recording, - order_channel_by_depth=False, - time_range=(3500, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - - # Run the sorting - sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, - ) - - # Curate the sorting output and extract waveforms. Calculate - # quality metrics from the waveforms. - sorting = sorting.remove_empty_units() - - sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - - # The way spikeinterface is setup means that quality metrics are - # calculated on the spikeinterface-preprocessed, NOT the kilosort - # preprocessed (i.e. drift-correct data). - # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. - waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, - ) - - quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) - quality_metrics.to_csv(output_path / "postprocessing") - - -.. _sphx_glr_download_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: sara_mederos.ipynb ` - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: sara_mederos.py ` - - .. container:: sphx-glr-download sphx-glr-download-zip - - :download:`Download zipped: sara_mederos.zip ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.zip b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos.zip deleted file mode 100644 index 82d4a5443aa242c46ac056f5882faacb2dd020bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7332 zcmcIpOK&5`5#BhD17RX@;+u15%)(d-kcQ;a%G!%C2RjbpY_bw|_Y!!FadW0gHZ;>S z?(UID7<=&l$T7dc$NZf9j#TwyUL0z*T8Dxpvb(z8RbAik^4ZUS@!{1U+9O3?aR7ETkr-ELMyQ&E%RUEG)A^YcOU!TFW9Q zs^nMAE^%krPD`5T_=aAybs=-Ga)3H?WQA1zpky?S3vdoY-^A>i34KbstHZoX$w1Qt z{VO(}UAd)-#cIpfz-2{6T2iIrHP67BQ<4;UUWiySa4HiC8)mG)39O}IC1She$V;lX z8DDvkm+;Z=413N~q9DuK+wB|WeOmYU1axv^h7Q`w}$V2k#;?EbD9x2r{M&rqnpwW}@h`>t*(*%My zg(R9nhUpmTrt{fs@pv(PJbS!2o6pW>i+KL&+4+;R*=N%iEGcA4o);-2^VxjLb|om1 zL*VC7J}2W*QR%V*Pu)=zR3EtNZd zok<-va4dv+O&Xs(wE;Am;=wkf5HiMkZUP4}&P~Qn%!ztghsYAiQ1us;KzD#I+8$P# zm5^zsFj?Bsw^g!}jtaog7H;oAudF8rOi#%goEJlAmW$cUf1 ztYfIkjBB8q1g2{QE(nm7pix4&z<-Afov=ELP4znyaR*<+Voz-bSQ0`Y)tHPE&{VJt zl}=fyw@XuBJyH}DODZ;OIa!=zF!1k5k4nOYB%#YD6jFNmN>;2#U~<+A$)TTs z=V=+V4mFxkJ;4>v3fy0K=C?Wu8$gv&$@M(O$Ym~qL5&Fk~1xN0$m2LeB{*}fGV~g14p@cp=5b+&0?09U~wh5 zR<<29l>UaQNq2a2$L7va6GsQvV%;^`rRhw2W%Sq|j397PnTaN6RA4Wrn)L0U(wGMc zW^GLg%w)z#opI)@E&r4}zj$SceDrOP_eIQ7GT|W$Nh)F7ID-xhwFlP%Tz@Cfmmh*w zjBK?o)zj&8!}YdWh0tN9FHz)Ie!iM^uia@`W!ZH8+4(1U)!-dt2DI_04gk3QVA^tN z+Sb15v927vk8Ld)?a238<^RM^}b}V35`x(rNxc#_QO7yL^1nd`}^0<+pw&PN+x*5 zF*Lj)VNt?uNF@@H=pczZ!jTAXK9oYpH};L!=Ko_$N5?y%9klE%bxh!TY5AJ%SW@B0 z9VbO4G}B^vZFtn;pLaxU$ms5#dVGFfk92)=uPiCIlAifc`IkNhh zgF|h8*$>0W|5nt7zK8jyJ&%FD$59((w0YdpJMfOEEfP)l=y5(kZPvs?E!wCpalFW$F~yC1z-?pp=Sn1*ao?QWPIQg1yD6ujc>$mmJCUIPi`j7j@ca)eA*?t z6}xpwk72hi)xbE{B^btTT^fVk!21;3(o)!Y$eKQ!ux_e_B&|V73%yw>Q3Ky<_QO$f zvX9_5%guGV;Q>1G01m?2MsW6MgW&Av4uUgn6l?MR2o6uXS@kvq*LIe3TMf(F2o76A z<5quT)ueBQ;B1?DHw1^~y(5A{7VXgAg5Z$!Cq!_Os1XG;iG%6O)pA?67J{?s;$q>F z^jHFRVaQ+}wlSP#-NJBg;RuGayGM(@jo~b5gW)0sadiR0fQ%?Eaxku5@8CFB6FvL| z{<{y3i$sslFpi6Y0}mcR1)S*ZY~BG~cF+&5n1lyos$>ZwF+cqWDTk+bbRP?v8w7W` z2M-8RKT?9xKZ7S_6+AD3b3tjgTad$_vl|Pilm`y=*_exU(GiT$CFfEWGR8*R-UFGQ zEg(?Trx6Hy*DzHB#(@(HZ-$o#yKuw8GoPJi!Vv}d9asZda(MXX;i?9@>F%sAqn3WS zu}TW~;!0|efL}{7Ip~yfzrk+~RGa}KGbGNAwp$xBf<-u=h4b2ZXqB}n5G%NeVU`Cm zpBNkJ6?~FhAn)0D^!oDI&))m+!SSyI@vB07{rCg^RoyQL+lPl93E&ZY{rJNYzG3Vf YHV+6cpZ)Szxc?sfyoUcD{2o9359Lp0+yDRo diff --git a/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle b/docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/sara_mederos_codeobj.pickle deleted file mode 100644 index 0eb13d18717364a6d48f262a27bcac7eff1e9f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1086 zcma)*J#Q2-5QZrZ60#v75+WdR4Gly>DlyFw`+wg}?)6`+n2{1#5JvkHt1qqr2hAtJLi&@gzNOdk%mHnP zv7o{7g-_qpFN{t!Rgm_Q@qsc;Co%KfTk!*g4&YkKpoZJvC=14+%;~C#cy3%s{3IR= zPne|Mr)8{g4YyVbCPG?vG#*t^gI4AUML!@G(n14Z5Mf!cy%y(y5x^C z>^v8dAQX6T0*31#b1#ATr#p9;i{=`FM-BdruZbtF)5PONz!ig=u>+h{b;kk>?Q8PeOtIw);XGAY3)Fn8^9-$^-1q+oZ^#% z+1$FFE39$38}EzCV`h{xnmB0jH_&XH#D3;3{y!A*#qj>goZdidoEkkJNFn=d+i>>z uvCyu(sDE};im*@+oM662=e7$#hA - - - - - - - - - .. list-table:: - :header-rows: 1 - :class: table table-striped sg-datatable - - * - Example - - Time - - Mem (MB) - * - :ref:`sphx_glr_ephys_at_swc_example_pipelines_auto_examples_ephys_sara_mederos.py` (``sara_mederos.py``) - - 00:00.000 - - 0.0 From aa22edffad2b9d5a3470ecc506fcc94e0c053241 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 16 Sep 2024 10:45:16 +0100 Subject: [PATCH 56/83] Update getting started. --- docs/source/ephys_at_swc/getting_started.md | 28 ++++++++++----------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index ab37760..613fa24 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -1,25 +1,23 @@ # Getting Started -With the numerous acquisition setups, software packages, preprocessing, postprocessing, -and analysis steps to consider, how to get started with extracellular electrophysiology -is not always clear. +With numerous acquisition, preprocessing and analysis +steps to consider, getting started with extracellular electrophysiology +is not easy! -A good first step is to ask for advice around your particular -experimental setup and research question. Every setup -and experiment is different, and it's often most effective to -seek guidance early on. See the [Community](community) -sections for details on where to get help. +To get started, the [Resources](resources) section has links to articles +for a general introduction to extracellular electrophysiology (as well as +more technical reading for deeper background). -Before diving into the analysis, it can be useful to get an understanding -for the history and landscape of extracellular electrophysiology. -See the resources section for [general introductions](#general-introduction) -as well as more technical reading for deeper background. +It is useful to get for advice on around your particular +experimental setup and research question early on. See the +[Community](community) sections for details on where to get help. -For preprocessing and spike sorting, we recommend +We recommend [SpikeInterace](https://github.com/SpikeInterface/spikeinterface), -an open source community toolkit for extracellular electrophysiology. To get +an open source community toolkit for extracellular electrophysiology, +for preprocessing and spike sorting. To get started with pipeline building, the -[SpikeInterface](https://spikeinterface.readthedocs.io/en/stable/) +[SpikeInterface](https://spikeinterface.readthedocs.io/en/stable/) documentation is a good starting point. We also have [Examples](gallery/index) from researchers at the SWC who'd be happy to answer any questions you might have. From 4013d11efeed17da44c85638ab113fa59da43b9c Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 16 Sep 2024 13:09:49 +0100 Subject: [PATCH 57/83] Typos and grammer fixes, just resources to do. --- docs/source/conf.py | 4 +- docs/source/ephys_at_swc/community.md | 2 +- .../example_pipelines/examples/README.rst | 45 ++++++++++--------- ...ructure.md => notes-on-docs-structure.txt} | 2 +- .../examples/sara_mederos.py | 17 ++++--- .../ephys_at_swc/example_pipelines/index.md | 25 +++++------ .../example_pipelines/matlab_examples.rst | 29 +++++------- docs/source/ephys_at_swc/getting_started.md | 17 +++---- docs/source/ephys_at_swc/index.md | 21 +++++---- docs/source/ephys_at_swc/resources.md | 12 ++--- 10 files changed, 82 insertions(+), 92 deletions(-) rename docs/source/ephys_at_swc/example_pipelines/examples/{notes-on-structure.md => notes-on-docs-structure.txt} (96%) diff --git a/docs/source/conf.py b/docs/source/conf.py index f3719c3..8f88281 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -77,8 +77,8 @@ "**/includes/**", # exclude .py and .ipynb files in auto_examples generated by sphinx-gallery # this is to prevent sphinx from complaining about duplicate source files - "ephys_at_swc/auto_examples_ephys/*.ipynb", - "ephys_at_swc/auto_examples_ephys/*.py", + "ephys_at_swc/example_pipelines/auto_examples_ephys/*.ipynb", + "ephys_at_swc/example_pipelines/auto_examples_ephys/*.py", "getting_started/*.ipynb", "getting_started/*.py", ] diff --git a/docs/source/ephys_at_swc/community.md b/docs/source/ephys_at_swc/community.md index ecedbf7..9064ea4 100644 --- a/docs/source/ephys_at_swc/community.md +++ b/docs/source/ephys_at_swc/community.md @@ -17,5 +17,5 @@ happy to answer any questions! In addition, the [Neuropixels](https://neuropixelsgroup.slack.com/) -Slack is a great resource, with an active community discussing +Slack channel is a great resource, with an active community discussing extracellular electrophysiology acquisition and analysis. diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst index 2eb5381..6169a6e 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -2,39 +2,40 @@ :orphan: -Python Analysis Repo Examples -============================= +Python Pipelines +================ -Multi-probe Cambridge Neurotech --------------------------------------- +Multiple probes (Cambridge Neurotech) +------------------------------------- Dammy Onih (Akrami lab) is running a multi-session paradigm with two -[Cambridge Neurotech](https://www.cambridgeneurotech.com/neural-probes) +`Cambridge Neurotech `__ probes. In this multi-session task, a mice learns a statistic learning paradigm to a reward-associated auditory stimulus, recording from the hippocampus. The pipeline uses SpikeInterface for preprocessing, -sorting and analysis and can be found [here](https://github.com/AOONIH/ephys/tree/master). +sorting and analysis and can be found `here `__. -The IBL Analysis Pipeline --------------------------------------- +The IBL analysis pipeline +------------------------- Nate Miska (Mrsic-Flogel lab) is a member of the -[International Brain Laboratory (IBL)](https://www.internationalbrainlab.com/) -running the [IBL's standardised behavioural task](https://elifesciences.org/articles/63711) -with acute Neuropixels 1.0 recordings. -See the analysis pipeline [XXX]() and details on the -IBL data management system can be found [here](). - -Automated analysis with Neuropixels 2.0 ---------------------------------------- +`International Brain Laboratory +(IBL) <(https://www.internationalbrainlab.com/>`_ +running the +`IBL's standardised behavioural task `_ +with acute Neuropixels 1.0 recordings. See the +`analysis pipeline code `__ +details on the IBL data management system can be found +`here `_. + +Integrated analysis with Neuropixels 2.0 +---------------------------------------- Steve Lenzi (Margrie Lab) has an integrated pipeline for automated behavioural, electrophysiological and anatomical analysis. Steve works with an mutli-session escape paradigm recording stimulus-responsive neurons in the posterior -striatum. He is using NeuroPixels 2.0 and SpikeGLX, the pipeline -code can be found [here](https://github.com/stephenlenzi/npix_lse). - -Preprocessing and Sorting Examples ----------------------------------- - +striatum. He is using NeuroPixels 2.0 and SpikeGLX with a spikeinterface-based +pipeline, the code can be found `here `__. +Python Scripts +-------------- diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/notes-on-structure.md b/docs/source/ephys_at_swc/example_pipelines/examples/notes-on-docs-structure.txt similarity index 96% rename from docs/source/ephys_at_swc/example_pipelines/examples/notes-on-structure.md rename to docs/source/ephys_at_swc/example_pipelines/examples/notes-on-docs-structure.txt index d1d353e..0ad495e 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/notes-on-structure.md +++ b/docs/source/ephys_at_swc/example_pipelines/examples/notes-on-docs-structure.txt @@ -1,5 +1,5 @@ Here, the 'Python Examples' page is rendered as a sphinx gallery. The first section is python examples that link to outside repos. The second section is the sphinx gallery entries. The 'README.rst' is the -'Python Examples' page, it must be called 'README.rst' for sphinx-related +'Python Examples' page, it must be called 'README.rst' for sphinx-related reasons. diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py index 8380cd1..b2beaca 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py +++ b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py @@ -1,13 +1,16 @@ """ -Sara's Single Session Open Ephys -========================= - -Sara Mederos (Hofer Lab)'s pipeline to ... +NP2.0 in SpikeInterface +======================= + +Sara Mederos (Hofer Lab) performs chronic electrophysiological +recordings from subcortical and cortical areas using 4-shank +Neuropixels 2.0 probes (Open Ephys). Recordings are conducted +in freely moving mice during behavioral paradigms that assess +the cognitive control of innate behaviors. A pipeline +used for pre-processing, sorting, and quality metrics +can be found below. """ -# %% -# Sara Mederos investigates ... setup ... details... - import probeinterface.plotting from spikeinterface import extract_waveforms from spikeinterface.extractors import read_openephys_event, read_openephys diff --git a/docs/source/ephys_at_swc/example_pipelines/index.md b/docs/source/ephys_at_swc/example_pipelines/index.md index f244857..acc62a1 100644 --- a/docs/source/ephys_at_swc/example_pipelines/index.md +++ b/docs/source/ephys_at_swc/example_pipelines/index.md @@ -1,18 +1,13 @@ -# Example Pipelines - -This page holds example pipelines for researchers -at the SWC. It details their setup, experimental -paradigms along with the pipelines they -use for preprocessing / analysis. Take a look -through and feel free to get in contact with -anyone through Slack. - -Below are a set of SpikeInterface scripts -for preprocessing and sorting of data -from a range of experimental setups. Also -see the list of repositories with code for -mutlimodal analysis including -electrophysiology. +# Examples + +This page shares extracellular electrophysiology pipelines in use by researchers across the SWC. + +These examples aim to demonstrate the possibilities for ephys +pipeline building rather than serve as drop-in tools for +data processing. However, please feel free to get in +contact with any listed researchers to ask questions +or for advice! + ::::{grid} 1 2 2 2 :gutter: 3 diff --git a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst index b172150..c4b973d 100644 --- a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst +++ b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst @@ -2,25 +2,21 @@ :orphan: -Matlab Examples -=============== +Matlab Pipelines +================= -This page contains MATLAB preprocessing, sorting and pipelines from across -the SWC, accessible in the linked GitHub repositories. - - -Neuropixels 1.0 multi-probe recrodings from across the brain : TODO: BETTER TITLE -------------------------------------------------------------- +Multi-probe Neuropixels 1.0 +--------------------------- Andrei Khilkevich (Mrsic-Flogel lab) performs acute recordings in a visual change-detection decision making task. A head-fixed preparation recording from 2 implanted probes (NP 1.0) simultaneously to record different regions across the whole brain. -Their pipeline is available [here1], [here2], [here3]. - +Their pipeline is available +`here `__. -Neuropixels 2.0 from the visual cortex in a 'Translocating' mouse : TODO: BETTER TITLE ------------------------------------------------------------------ +Automated pipeline for multimodal integration +--------------------------------------------- Mateo Velez-Fort (Margie Lab) investigates the integration of visual and vestibular information in the visual cortex with the @@ -28,10 +24,5 @@ Margrie lab's 'Translocator' setup. They use Neuropixels 2.0 (SpikeGLX) for acute recordings from the primary visual cortex and other cortical areas as the head-fixed mouse is physically displaced along a track. -The pipeline is available [here](https://github.com/SainsburyWellcomeCentre/rc2_analysis). - - -Michael Lohse --------------- - -TODO \ No newline at end of file +The pipeline is available +`here <(https://github.com/SainsburyWellcomeCentre/rc2_analysis>`__. diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md index 613fa24..03f5768 100644 --- a/docs/source/ephys_at_swc/getting_started.md +++ b/docs/source/ephys_at_swc/getting_started.md @@ -6,18 +6,19 @@ is not easy! To get started, the [Resources](resources) section has links to articles for a general introduction to extracellular electrophysiology (as well as -more technical reading for deeper background). +more technical readings for a deeper background). -It is useful to get for advice on around your particular +It is useful to get advice on your particular experimental setup and research question early on. See the [Community](community) sections for details on where to get help. We recommend -[SpikeInterace](https://github.com/SpikeInterface/spikeinterface), +[SpikeInterface](https://github.com/SpikeInterface/spikeinterface), an open source community toolkit for extracellular electrophysiology, -for preprocessing and spike sorting. To get -started with pipeline building, the +for preprocessing and spike sorting. To begin +building your pipeline, the [SpikeInterface](https://spikeinterface.readthedocs.io/en/stable/) -documentation is a good starting point. We also have -[Examples](gallery/index) -from researchers at the SWC who'd be happy to answer any questions you might have. +documentation is a good starting point. See the +[Example Pipelines](example_pipelines/index) +page for researchers at the SWC who would be happy +to answer any questions you might have. diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index a0574e4..0bb653a 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -1,20 +1,19 @@ # Electrophysiology -This page acts as an information source for researchers using -extracellular electrophysiology in the SWC. It contains -[Resources](resources.md) providing background on -the technique, as well as -[Example Pipelines](auto_examples_ephys/index) -used researchers in the building. - -We encourage all types of contributions. If you've like to contribute a -guide or pipeline, please don't hesitate to get in contact! See the -[Community](community.md) +This page serves as an information source for researchers using +extracellular electrophysiology at the SWC. It contains +useful [resources](resources.md) for learning, as well as +[example pipelines](example_pipelines/index) +used by researchers in the building. + +We encourage all types of contributions. If you'd like to contribute a +guide or pipeline, please don't hesitate to get in touch! See the +[community](community.md) page for more details. This page is maintained by the [Neuroinformatics Unit](https://neuroinformatics.dev). We are focused on building community tools to automate -and centralise electrophysiology analysis. +and standardise electrophysiology analysis. ::::{grid} 1 2 2 2 diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md index 6629ab5..8abe30c 100644 --- a/docs/source/ephys_at_swc/resources.md +++ b/docs/source/ephys_at_swc/resources.md @@ -29,7 +29,7 @@ extracellular electrophysiology analysis. A particularly useful resource is the [Neuropixels](https://www.ucl.ac.uk/neuropixels/courses) course, with their videos published online (e.g. [2023](https://www.ucl.ac.uk/neuropixels/training/2023-neuropixels-course)). -While these are targeted towards for Neuropixels users, they are +While these are targeted towards Neuropixels users, they are valuable resources for any researcher approaching electrophysiology preprocessing and analysis. @@ -37,7 +37,7 @@ approaching electrophysiology preprocessing and analysis. The [IBL white paper](https://figshare.com/articles/online_resource/Spike_sorting_pipeline_for_the_International_Brain_Laboratory/19705522) contains a clearly written overview of common preprocessing steps. Similarly, -[Bill Karsh's guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on +[Bill Karsh's guide](https://billkarsh.github.io/SpikeGLX/help/catgt_tshift/catgt_tshift/) on SpikeGLX preprocessing tools gives a useful overview. [de Cheveigné & Nelken (2019)](https://pubmed.ncbi.nlm.nih.gov/30998899/) @@ -76,7 +76,7 @@ through the key steps for manual curation. More recently, advances in the automating curation has been made in the [Bombcell package](https://github.com/Julie-Fabre/bombcell). -SpikeInterface also maintain a set of quality metrics, +SpikeInterface also maintains a set of quality metrics, [explained in detail](https://spikeinterface.readthedocs.io/en/latest/modules/qualitymetrics.html) in their documentation. @@ -94,10 +94,10 @@ to get started. SpikeInterface is mainly focused on preprocessing, spike sorting and quality metrics. -[Pynapple](https://github.com/pynapple-org/pynapple), +[Pynapple](https://github.com/pynapple-org/pynapple), [Elephant]( https://neuralensemble.org/elephant/), and [Nemos](https://github.com/flatironinstitute/nemos) -all provide nice toolboxes for analysing data post-sorting. +all provide useful toolboxes for analysing data post-sorting. The [SpikeForest](https://spikeforest.flatironinstitute.org/) project is an excellent resource for assessing the performance of @@ -105,7 +105,7 @@ different spike-sorting algorithms across probe types and brain regions. ### Pipelines -[The Allen Spike sorting pipeline](https://github.com/AllenInstitute/ecephys_spike_sorting) +[The Allen spike-sorting pipeline](https://github.com/AllenInstitute/ecephys_spike_sorting) [The IBL sorting pipeline](https://github.com/int-brain-lab/ibl-neuropixel) From 735a172200cc3bd1f05d62b9472bbac72abe4ea7 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 16 Sep 2024 16:58:50 +0100 Subject: [PATCH 58/83] Final typo fixes. --- .../example_pipelines/examples/README.rst | 16 ++++++++-------- .../ephys_at_swc/example_pipelines/index.md | 8 ++++---- .../example_pipelines/matlab_examples.rst | 7 ++++--- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst index 6169a6e..156c3af 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -10,10 +10,10 @@ Multiple probes (Cambridge Neurotech) Dammy Onih (Akrami lab) is running a multi-session paradigm with two `Cambridge Neurotech `__ -probes. In this multi-session task, a mice learns a statistic learning paradigm to a +probes. In this multi-session task, mice learn a statistical learning paradigm to a reward-associated auditory stimulus, recording from the hippocampus. The pipeline uses SpikeInterface for preprocessing, -sorting and analysis and can be found `here `__. +sorting, and analysis and can be found `here `__. The IBL analysis pipeline ------------------------- @@ -23,19 +23,19 @@ Nate Miska (Mrsic-Flogel lab) is a member of the (IBL) <(https://www.internationalbrainlab.com/>`_ running the `IBL's standardised behavioural task `_ -with acute Neuropixels 1.0 recordings. See the +with acute Neuropixels 1.0 recordings. Details of the `analysis pipeline code `__ -details on the IBL data management system can be found +on the IBL data management system can be found `here `_. Integrated analysis with Neuropixels 2.0 ---------------------------------------- Steve Lenzi (Margrie Lab) has an integrated pipeline for automated behavioural, -electrophysiological and anatomical analysis. Steve works with an -mutli-session escape paradigm recording stimulus-responsive neurons in the posterior -striatum. He is using NeuroPixels 2.0 and SpikeGLX with a spikeinterface-based -pipeline, the code can be found `here `__. +electrophysiological, and anatomical analysis. Steve works with a +multi-session escape paradigm, recording stimulus-responsive neurons in the posterior +striatum. He is using NeuroPixels 2.0 and SpikeGLX with a SpikeInterface-based +pipeline; the code can be found `here `__. Python Scripts -------------- diff --git a/docs/source/ephys_at_swc/example_pipelines/index.md b/docs/source/ephys_at_swc/example_pipelines/index.md index acc62a1..1541e73 100644 --- a/docs/source/ephys_at_swc/example_pipelines/index.md +++ b/docs/source/ephys_at_swc/example_pipelines/index.md @@ -1,12 +1,12 @@ # Examples -This page shares extracellular electrophysiology pipelines in use by researchers across the SWC. +This page shares extracellular electrophysiology pipelines used by researchers across the SWC. These examples aim to demonstrate the possibilities for ephys pipeline building rather than serve as drop-in tools for -data processing. However, please feel free to get in -contact with any listed researchers to ask questions -or for advice! +data processing. However, please feel free to +contact any listed researchers to ask questions +or seek advice! ::::{grid} 1 2 2 2 diff --git a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst index c4b973d..9742879 100644 --- a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst +++ b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst @@ -9,9 +9,10 @@ Multi-probe Neuropixels 1.0 --------------------------- Andrei Khilkevich (Mrsic-Flogel lab) performs -acute recordings in a visual change-detection decision making task. -A head-fixed preparation recording from 2 implanted probes (NP 1.0) -simultaneously to record different regions across the whole brain. +acute recordings in a visual change-detection decision +-making task. +Two implanted probes (NP 1.0) in a head-fixed preparation are used to +simultaneously record different regions across the whole brain. Their pipeline is available `here `__. From e7aa6615aadbe10671df33e9bf1bc65f6e659f24 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 16 Sep 2024 17:28:41 +0100 Subject: [PATCH 59/83] Fix warnings. --- .../example_pipelines/examples/README.rst | 2 - docs/source/sg_execution_times.rst | 37 ------------------- 2 files changed, 39 deletions(-) delete mode 100644 docs/source/sg_execution_times.rst diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst index 156c3af..b5f6ba5 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -1,5 +1,3 @@ -.. _python_examples: - :orphan: Python Pipelines diff --git a/docs/source/sg_execution_times.rst b/docs/source/sg_execution_times.rst deleted file mode 100644 index 06892c4..0000000 --- a/docs/source/sg_execution_times.rst +++ /dev/null @@ -1,37 +0,0 @@ - -:orphan: - -.. _sphx_glr_sg_execution_times: - - -Computation times -================= -**00:00.000** total execution time for 1 file **from all galleries**: - -.. container:: - - .. raw:: html - - - - - - - - .. list-table:: - :header-rows: 1 - :class: table table-striped sg-datatable - - * - Example - - Time - - Mem (MB) - * - :ref:`sphx_glr_ephys_at_swc_gallery_sara_mederos.py` (``ephys_at_swc/examples/sara_mederos.py``) - - 00:00.000 - - 0.0 From 8840bb412435fb2e39e534a92198a66aa0849d39 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 16 Sep 2024 17:31:58 +0100 Subject: [PATCH 60/83] Small tidy ups. --- .gitignore | 1 + docs/source/conf.py | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index efffe97..d1267e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/ +sg_execution_times.rst # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/docs/source/conf.py b/docs/source/conf.py index 8f88281..e81ff7f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -79,8 +79,6 @@ # this is to prevent sphinx from complaining about duplicate source files "ephys_at_swc/example_pipelines/auto_examples_ephys/*.ipynb", "ephys_at_swc/example_pipelines/auto_examples_ephys/*.py", - "getting_started/*.ipynb", - "getting_started/*.py", ] # Ignore certain URLs from being checked From 150226373e452d7a698b8f357b386400ee40e639 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 16 Sep 2024 17:50:11 +0100 Subject: [PATCH 61/83] Check links. --- docs/source/ephys_at_swc/example_pipelines/examples/README.rst | 2 +- docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst index b5f6ba5..c4431fc 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -18,7 +18,7 @@ The IBL analysis pipeline Nate Miska (Mrsic-Flogel lab) is a member of the `International Brain Laboratory -(IBL) <(https://www.internationalbrainlab.com/>`_ +(IBL) `_ running the `IBL's standardised behavioural task `_ with acute Neuropixels 1.0 recordings. Details of the diff --git a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst index 9742879..c5116e7 100644 --- a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst +++ b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst @@ -26,4 +26,4 @@ Neuropixels 2.0 (SpikeGLX) for acute recordings from the primary visual cortex and other cortical areas as the head-fixed mouse is physically displaced along a track. The pipeline is available -`here <(https://github.com/SainsburyWellcomeCentre/rc2_analysis>`__. +`here `__. From 4521390cb33c8d0d35c8a50a6949170a625cebec Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 16 Sep 2024 18:09:39 +0100 Subject: [PATCH 62/83] Ignore private repo link. --- docs/source/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/conf.py b/docs/source/conf.py index e81ff7f..6022863 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -96,6 +96,7 @@ linkcheck_anchors_ignore_for_url = [ "https://gin.g-node.org/G-Node/Info/wiki", "https://gin.g-node.org/G-Node/info/wiki", # ignore both spellings + "https://github.com/stephenlenzi/npix_lse", # ignore private repository ] linkcheck_retries = 2 From f6cb491f85e65ae8d6b9c73c83c2961f5a69a959 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 25 Sep 2024 18:25:42 +0100 Subject: [PATCH 63/83] Remove all non-ephys related changes. --- docs/source/behav_at_swc/index.md | 10 --- .../HPC-module-SLEAP.md | 84 +++++++++---------- docs/source/data_analysis/index.md | 9 ++ docs/source/index.md | 17 ++-- 4 files changed, 58 insertions(+), 62 deletions(-) delete mode 100644 docs/source/behav_at_swc/index.md rename docs/source/{behav_at_swc => data_analysis}/HPC-module-SLEAP.md (92%) create mode 100644 docs/source/data_analysis/index.md diff --git a/docs/source/behav_at_swc/index.md b/docs/source/behav_at_swc/index.md deleted file mode 100644 index 47ce43e..0000000 --- a/docs/source/behav_at_swc/index.md +++ /dev/null @@ -1,10 +0,0 @@ -# Behaviour - -Guides related to the analysis of behavioural data. -The focus may be on the use of specific software tools, or on more general analysis tasks and concepts. - -```{toctree} -:maxdepth: 1 - -HPC-module-SLEAP -``` diff --git a/docs/source/behav_at_swc/HPC-module-SLEAP.md b/docs/source/data_analysis/HPC-module-SLEAP.md similarity index 92% rename from docs/source/behav_at_swc/HPC-module-SLEAP.md rename to docs/source/data_analysis/HPC-module-SLEAP.md index 8090456..72a537f 100644 --- a/docs/source/behav_at_swc/HPC-module-SLEAP.md +++ b/docs/source/data_analysis/HPC-module-SLEAP.md @@ -12,11 +12,31 @@ | [SLEAP](https://sleap.ai/) | Social LEAP Estimates Animal Poses | | [SWC](https://www.sainsburywellcome.org/web/) | Sainsbury Wellcome Centre | | [HPC](https://en.wikipedia.org/wiki/High-performance_computing) | High Performance Computing | +| [IT](https://en.wikipedia.org/wiki/Information_technology) | Information Technology | | [GUI](https://en.wikipedia.org/wiki/Graphical_user_interface) | Graphical User Interface | | [SLURM](https://slurm.schedmd.com/) | Simple Linux Utility for Resource Management | ## Prerequisites +::: {dropdown} Note on managed Linux desktops +:color: info +:icon: info + +The SWC's IT team offers managed desktop computers equipped with a Linux image. These machines are already part of SWC's trusted domain and have direct access to SLURM, the HPC modules, and the SWC filesystem. + +If you have access to one of these desktops, +you can skip the pre-requisite steps. +You may simply open a terminal, type `module load SLEAP`, +and start using SLEAP directly, as you would on any local +Linux machine. All SLEAP commands should work as expected, +including `sleap-label` for launching the GUI. + +That said, you may still want to offload GPU-intensive tasks to an HPC node (e.g. because the desktop's GPU is not powerful enough or because you need to run many jobs in parallel). In that case, you may +still want to read the sections on [model training](sleap-training) +and [inference](sleap-inference). +::: + +(access-to-the-hpc-cluster)= ### Access to the HPC cluster Verify that you can access HPC gateway node (typing your `` both times when prompted): ```{code-block} console @@ -33,15 +53,17 @@ $ module avail ... SLEAP/2023-03-13 SLEAP/2023-08-01 +SLEAP/2024-08-14 ... ``` - `SLEAP/2023-03-13` corresponds to `SLEAP v.1.2.9` - `SLEAP/2023-08-01` corresponds to `SLEAP v.1.3.1` +- `SLEAP/2024-08-14` corresponds to `SLEAP v.1.3.3` We recommend always using the latest version, which is the one loaded by default when you run `module load SLEAP`. If you want to load a specific version, you can do so by typing the full module name, -including the date e.g. `module load SLEAP/2023-03-13`. +including the date e.g. `module load SLEAP/2023-08-01`. If a module has been successfully loaded, it will be listed when you run `module list`, along with other modules it may depend on: @@ -61,34 +83,8 @@ While you can delegate the GPU-intensive work to the HPC cluster, you will need to use the SLEAP GUI for some steps, such as labelling frames. Thus, you also need to install SLEAP on your local PC/laptop. -We recommend following the official [SLEAP installation guide](https://sleap.ai/installation.html). If you already have `conda` installed, you may skip the `mamba` installation steps and opt for installing the `libmamba-solver` for `conda`: - -```{code-block} console -$ conda install -n base conda-libmamba-solver -$ conda config --set solver libmamba -``` -This will get you the much faster dependency resolution that `mamba` provides, without having to install `mamba` itself. -From `conda` version 23.10 onwards (released in November 2023), `libmamba-solver` [is anyway the default](https://conda.org/blog/2023-11-06-conda-23-10-0-release/). - -After that, you can follow the [rest of the SLEAP installation guide](https://sleap.ai/installation.html#conda-package), substituting `conda` for `mamba` in the relevant commands. - -::::{tab-set} - -:::{tab-item} Windows and Linux -```{code-block} console -$ conda create -y -n sleap -c conda-forge -c nvidia -c sleap -c anaconda sleap=1.3.1 -``` -::: - -:::{tab-item} MacOS X and Apple Silicon -```{code-block} console -$ conda create -y -n sleap -c conda-forge -c anaconda -c sleap sleap=1.3.1 -``` -::: - -:::: - -You may exchange `sleap=1.3.1` for other versions. To be on the safe side, ensure that your local installation version matches (or is at least close to) the one installed in the cluster module. +We recommend following the official [SLEAP installation guide](https://sleap.ai/installation.html). +To minimise the risk of issues due to incompatibilities between versions, ensure the version of your local installation of SLEAP matches the one you plan to load in the cluster. ### Mount the SWC filesystem on your local PC/laptop The rest of this guide assumes that you have mounted the SWC filesystem on your local PC/laptop. @@ -114,12 +110,14 @@ $ rsync -avz @ssh.swc.ucl.ac.uk:/ceph/scratch/neuroinf ``` ::: +(sleap-training)= ## Model training -This will consist of two parts - [preparing a training job](#prepare-the-training-job) -(on your local SLEAP installation) and [running a training job](#run-the-training-job) +This will consist of two parts: [preparing a training job](prepare-the-training-job) +(on your local SLEAP installation) and [running a training job](run-the-training-job) (on the HPC cluster's SLEAP module). Some evaluation metrics for the trained models -can be [viewed via the SLEAP GUI](#evaluate-the-trained-models) on your local SLEAP installation. +can be [viewed via the SLEAP GUI](model-evaluation) on your local SLEAP installation. +(prepare-the-training-job)= ### Prepare the training job Follow the SLEAP instructions for [Creating a Project](https://sleap.ai/tutorials/new-project.html) and [Initial Labelling](https://sleap.ai/tutorials/initial-labeling.html). @@ -134,6 +132,7 @@ i.e. *Predict* -> *Run Training…* -> *Export Training Job Package…*. - Make sure to save the exported training job package (e.g. `labels.v001.slp.training_job.zip`) in the mounted SWC filesystem, for example, in the same directory as the project file. - Unzip the training job package. This will create a folder with the same name (minus the `.zip` extension). This folder contains everything needed to run the training job on the HPC cluster. +(run-the-training-job)= ### Run the training job Login to the HPC cluster as described above. ```{code-block} console @@ -346,7 +345,8 @@ If you encounter out-of-memory errors, keep in mind that there two main sources - If requesting more memory doesn't help, you can try reducing the size of your SLEAP models. You may tweak the model backbone architecture, or play with *Input scaling*, *Max stride* and *Batch size*. See SLEAP's [documentation](https://sleap.ai/) and [discussion forum](https://github.com/talmolab/sleap/discussions) for more details. ``` -### Evaluate the trained models +(model-evaluation)= +## Model evaluation Upon successful completion of the training job, a `models` folder will have been created in the training job directory. It contains one subfolder per training run (by default prefixed with the date and time of the run). @@ -385,6 +385,7 @@ The SLEAP GUI on your local machine can be used to quickly evaluate the trained For more detailed evaluation metrics, you can refer to [SLEAP's model evaluation notebook](https://sleap.ai/notebooks/Model_evaluation.html). +(sleap-inference)= ## Model inference By inference, we mean using a trained model to predict the labels on new frames/videos. SLEAP provides the [`sleap-track`](https://sleap.ai/guides/cli.html?#inference-and-tracking) command line utility for running inference @@ -482,7 +483,7 @@ the training-inference cycle. The basic steps are: In this section, we will describe how to test that the SLEAP module is loaded correctly for you and that it can use the available GPUs. -Login to the HPC cluster as described [above](#access-to-the-hpc-cluster). +Login to the HPC cluster as described [above](access-to-the-hpc-cluster). Start an interactive job on a GPU node. This step is necessary, because we need to test the module's access to the GPU. @@ -534,7 +535,7 @@ name, temperature, memory usage, etc. If you see an error message instead, Next, load the SLEAP module. ```{code-block} console $ module load SLEAP -Loading SLEAP/2023-08-01 +Loading SLEAP/2024-08-14 Loading requirement: cuda/11.8 ``` @@ -542,7 +543,7 @@ To verify that the module was loaded successfully: ```{code-block} console $ module list Currently Loaded Modulefiles: - 1) SLEAP/2023-08-01 + 1) SLEAP/2024-08-14 ``` You can essentially think of the module as a centrally installed conda environment. When it is loaded, you should be using a particular Python executable. @@ -550,7 +551,7 @@ You can verify this by running: ```{code-block} console $ which python -/ceph/apps/ubuntu-20/packages/SLEAP/2023-08-01/bin/python +/ceph/apps/ubuntu-20/packages/SLEAP/2024-08-14/bin/python ``` Finally we will verify that the `sleap` python package can be imported and can @@ -571,7 +572,7 @@ This is normal. Subsequent imports should be faster. >>> import sleap >>> sleap.versions() -SLEAP: 1.3.1 +SLEAP: 1.3.3 TensorFlow: 2.8.4 Numpy: 1.21.6 Python: 3.7.12 @@ -603,10 +604,7 @@ $ exit() If you encounter troubles with using the SLEAP module, contact Niko Sirmpilatze of the SWC [Neuroinformatics Unit](https://neuroinformatics.dev/). -To completely exit the HPC cluster, you will need to logout of the SSH session twice: -```bash -$ logout -$ logout -``` +To completely exit the HPC cluster, you will need to type `exit` or +`logout` until you are back to the terminal prompt of your local machine. See [Set up SSH for the SWC HPC cluster](../programming/SSH-SWC-cluster.md) for more information. diff --git a/docs/source/data_analysis/index.md b/docs/source/data_analysis/index.md new file mode 100644 index 0000000..ce094e5 --- /dev/null +++ b/docs/source/data_analysis/index.md @@ -0,0 +1,9 @@ +# Data Analysis + +Guides related to the analysis of neuroscientific data, spanning a wide range of data types such as electrophysiology, behaviour, calcium imaging, histology, etc. The focus may be on the use of specific software tools, or on more general analysis tasks and concepts. + +```{toctree} +:maxdepth: 1 + +HPC-module-SLEAP +``` diff --git a/docs/source/index.md b/docs/source/index.md index ee44a07..9ade591 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -2,13 +2,12 @@ On this website you can find long-form how-to guides as well as collections of small tips and tricks related to data analysis and software development in neuroscience. -The website is maintained by members of the [Neuroinformatics Unit](https://neuroinformatics.dev). -The information is primarily aimed at researchers at the [Sainsbury Wellcome Centre (SWC)](https://www.sainsburywellcome.org/web/) -and -[Gatsby Computational Neuroscience Unit (GCNU)](https://www.ucl.ac.uk/gatsby/gatsby-computational-neuroscience-unit), -though most of it should be useful to neuroscientists in general. +The website is maintained by members of the [Neuroinformatics Unit](https://neuroinformatics.dev). The information is primarily aimed at researchers at the [Sainsbury Wellcome Centre (SWC)](https://www.sainsburywellcome.org/web/) and [Gatsby Computational Neuroscience Unit (GCNU)](https://www.ucl.ac.uk/gatsby/gatsby-computational-neuroscience-unit), though most of it should be useful to neuroscientists in general. +## Main sections +The guides are organised into four main sections: + ::::{grid} 1 2 2 2 :gutter: 3 @@ -19,11 +18,11 @@ though most of it should be useful to neuroscientists in general. Resources for preprocessing and analysis of extracellular electrophysiology data. ::: -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Behaviour -:link: behav_at_swc/index +:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Data Analysis +:link: data_analysis/index :link-type: doc -Guides related to tools and approaches for analysing behavioural data. +Guides related to tools and approaches for analysing neuroscientific data. ::: :::{grid-item-card} {fas}`code;sd-text-primary` Programming @@ -48,7 +47,7 @@ How to effectively share your code and data. :hidden: ephys_at_swc/index -behav_at_swc/index +data_analysis/index programming/index open_science/index ``` From 571283838835f8a71087125215d27fe373f96356 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 25 Sep 2024 18:32:28 +0100 Subject: [PATCH 64/83] Fix regressions in CI. --- .github/workflows/docs_build_and_deploy.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docs_build_and_deploy.yml b/.github/workflows/docs_build_and_deploy.yml index c0b1a18..5e04d15 100644 --- a/.github/workflows/docs_build_and_deploy.yml +++ b/.github/workflows/docs_build_and_deploy.yml @@ -27,9 +27,9 @@ jobs: needs: linting runs-on: ubuntu-latest steps: - - uses: neuroinformatics-unit/actions/build_sphinx_docs@main + - uses: neuroinformatics-unit/actions/build_sphinx_docs@v2 with: - python-version: 3.11 + python-version: 3.12 deploy_sphinx_docs: name: Deploy Sphinx Docs @@ -39,6 +39,6 @@ jobs: if: github.event_name == 'push' && github.ref_name == 'main' runs-on: ubuntu-latest steps: - - uses: neuroinformatics-unit/actions/deploy_sphinx_docs@main + - uses: neuroinformatics-unit/actions/deploy_sphinx_docs@v2 with: secret_input: ${{ secrets.GITHUB_TOKEN }} From c02994cc25c7e503b9815b242ba831c7ba185cf0 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 25 Sep 2024 18:50:31 +0100 Subject: [PATCH 65/83] Add zulip chat to Community page. --- docs/source/ephys_at_swc/community.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/community.md b/docs/source/ephys_at_swc/community.md index 9064ea4..a061678 100644 --- a/docs/source/ephys_at_swc/community.md +++ b/docs/source/ephys_at_swc/community.md @@ -3,7 +3,9 @@ This site is maintained by the [NeuroInformatics Unit](https://neuroinformatics.dev/). Please don't hesitate to contact us -(in particular Joe Ziminski) on Slack with any questions or feedback. +(in particular Joe Ziminski) on Slack or +[Zulip chat](https://neuroinformatics.zulipchat.com/) +with any questions or feedback. For information and advice on electrophysiology from the SWC community, the best place to go is the `#forum-extracellular-ephys` channel on the SWC Slack. From 0737c2b77de39647e06e4293827326f88e9d913d Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:52:09 +0100 Subject: [PATCH 66/83] Link and explain Open Ephys Co-authored-by: Adam Tyson --- docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst index c5116e7..cc81ef8 100644 --- a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst +++ b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst @@ -22,7 +22,7 @@ Automated pipeline for multimodal integration Mateo Velez-Fort (Margie Lab) investigates the integration of visual and vestibular information in the visual cortex with the Margrie lab's 'Translocator' setup. They use -Neuropixels 2.0 (SpikeGLX) for acute recordings from the +Neuropixels 2.0 (acquired using [SpikeGLX](https://github.com/billkarsh/SpikeGLX)) for acute recordings from the primary visual cortex and other cortical areas as the head-fixed mouse is physically displaced along a track. The pipeline is available From 8dee69c57def61c0191cb9fff254579f69735208 Mon Sep 17 00:00:00 2001 From: Joe Ziminski <55797454+JoeZiminski@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:53:00 +0100 Subject: [PATCH 67/83] Link and explain Co-authored-by: Adam Tyson --- .../ephys_at_swc/example_pipelines/examples/sara_mederos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py index b2beaca..93d5b9a 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py +++ b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py @@ -4,7 +4,7 @@ Sara Mederos (Hofer Lab) performs chronic electrophysiological recordings from subcortical and cortical areas using 4-shank -Neuropixels 2.0 probes (Open Ephys). Recordings are conducted +Neuropixels 2.0 probes (acquired using [Open Ephys](https://open-ephys.org/)). Recordings are conducted in freely moving mice during behavioral paradigms that assess the cognitive control of innate behaviors. A pipeline used for pre-processing, sorting, and quality metrics From 3aaf974d514efbd861ddbd8d99d585e2912abcbb Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 25 Sep 2024 19:06:14 +0100 Subject: [PATCH 68/83] Small fixes. --- .../examples/sara_mederos.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py index 93d5b9a..7efbd41 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py +++ b/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py @@ -2,26 +2,28 @@ NP2.0 in SpikeInterface ======================= -Sara Mederos (Hofer Lab) performs chronic electrophysiological +Sara Mederos +`(Hofer Lab) `__ +performs chronic electrophysiological recordings from subcortical and cortical areas using 4-shank -Neuropixels 2.0 probes (acquired using [Open Ephys](https://open-ephys.org/)). Recordings are conducted -in freely moving mice during behavioral paradigms that assess -the cognitive control of innate behaviors. A pipeline -used for pre-processing, sorting, and quality metrics +Neuropixels 2.0 probes (acquired using +`Open Ephys `__). +Recordings are conducted in freely moving mice during behavioral +paradigms that assess the cognitive control of innate behaviors. +A pipeline used for pre-processing, sorting, and quality metrics can be found below. """ -import probeinterface.plotting from spikeinterface import extract_waveforms -from spikeinterface.extractors import read_openephys_event, read_openephys +from spikeinterface.extractors import read_openephys from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference from spikeinterface.sorters import run_sorter +from spikeinterface.qualitymetrics import compute_quality_metrics from pathlib import Path -from probeinterface.plotting import plot_probe, plot_probe_group +from probeinterface.plotting import plot_probe import matplotlib.pyplot as plt from spikeinterface import curation from spikeinterface.widgets import plot_timeseries -import spikeinterface as si # TODO import numpy as np @@ -63,7 +65,7 @@ recs_grouped_by_shank = preprocessed_recording.split_by("group") for rec in recs_grouped_by_shank: plot_timeseries( - filtered_recording, + preprocessed_recording, order_channel_by_depth=True, time_range=(3499, 3500), return_scaled=True, @@ -106,5 +108,5 @@ radius_um=75, ) -quality_metrics = si.qualitymetrics.compute_quality_metrics(waveforms) +quality_metrics = compute_quality_metrics(waveforms) quality_metrics.to_csv(output_path / "postprocessing") From 2c875a5aa5cee8e869b126c308b59a1c702d6a34 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Wed, 25 Sep 2024 19:08:12 +0100 Subject: [PATCH 69/83] Add links for labs. --- .../ephys_at_swc/example_pipelines/examples/README.rst | 10 +++++++--- .../ephys_at_swc/example_pipelines/matlab_examples.rst | 10 ++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst index c4431fc..2c1735c 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -6,7 +6,9 @@ Python Pipelines Multiple probes (Cambridge Neurotech) ------------------------------------- -Dammy Onih (Akrami lab) is running a multi-session paradigm with two +Dammy Onih +(`Akrami lab `__) +is running a multi-session paradigm with two `Cambridge Neurotech `__ probes. In this multi-session task, mice learn a statistical learning paradigm to a reward-associated auditory stimulus, recording from the hippocampus. @@ -16,7 +18,8 @@ sorting, and analysis and can be found `here `__) +is a member of the `International Brain Laboratory (IBL) `_ running the @@ -29,7 +32,8 @@ on the IBL data management system can be found Integrated analysis with Neuropixels 2.0 ---------------------------------------- -Steve Lenzi (Margrie Lab) has an integrated pipeline for automated behavioural, +Steve Lenzi (`Margie Lab `__) +has an integrated pipeline for automated behavioural, electrophysiological, and anatomical analysis. Steve works with a multi-session escape paradigm, recording stimulus-responsive neurons in the posterior striatum. He is using NeuroPixels 2.0 and SpikeGLX with a SpikeInterface-based diff --git a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst index cc81ef8..667dbca 100644 --- a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst +++ b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst @@ -8,9 +8,9 @@ Matlab Pipelines Multi-probe Neuropixels 1.0 --------------------------- -Andrei Khilkevich (Mrsic-Flogel lab) performs -acute recordings in a visual change-detection decision --making task. +Andrei Khilkevich +(`Mrsic-Flogel lab `__) +performs acute recordings in a visual change-detection decision-making task. Two implanted probes (NP 1.0) in a head-fixed preparation are used to simultaneously record different regions across the whole brain. Their pipeline is available @@ -19,7 +19,9 @@ Their pipeline is available Automated pipeline for multimodal integration --------------------------------------------- -Mateo Velez-Fort (Margie Lab) investigates the integration of visual +Mateo Velez-Fort +(`Margie Lab `__) +investigates the integration of visual and vestibular information in the visual cortex with the Margrie lab's 'Translocator' setup. They use Neuropixels 2.0 (acquired using [SpikeGLX](https://github.com/billkarsh/SpikeGLX)) for acute recordings from the From 8dbabd55c1a8dcb0fc970afb08d995527916a087 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 31 Jan 2025 15:51:28 +0000 Subject: [PATCH 70/83] Remove broken links. --- .../ephys_at_swc/example_pipelines/examples/README.rst | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst index 2c1735c..89333c7 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -29,15 +29,5 @@ with acute Neuropixels 1.0 recordings. Details of the on the IBL data management system can be found `here `_. -Integrated analysis with Neuropixels 2.0 ----------------------------------------- - -Steve Lenzi (`Margie Lab `__) -has an integrated pipeline for automated behavioural, -electrophysiological, and anatomical analysis. Steve works with a -multi-session escape paradigm, recording stimulus-responsive neurons in the posterior -striatum. He is using NeuroPixels 2.0 and SpikeGLX with a SpikeInterface-based -pipeline; the code can be found `here `__. - Python Scripts -------------- From 55cb3940311168d8b38b0252fbae78ddda6206cb Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 31 Jan 2025 15:54:32 +0000 Subject: [PATCH 71/83] Fix linting. --- docs/source/ephys_at_swc/community.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/community.md b/docs/source/ephys_at_swc/community.md index a061678..b736a50 100644 --- a/docs/source/ephys_at_swc/community.md +++ b/docs/source/ephys_at_swc/community.md @@ -3,7 +3,7 @@ This site is maintained by the [NeuroInformatics Unit](https://neuroinformatics.dev/). Please don't hesitate to contact us -(in particular Joe Ziminski) on Slack or +(in particular Joe Ziminski) on Slack or [Zulip chat](https://neuroinformatics.zulipchat.com/) with any questions or feedback. From cbf93309c9bb0ce1e6da24ee83f2d794cd4de825 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 31 Jan 2025 15:58:29 +0000 Subject: [PATCH 72/83] Update to standalone scripts. --- .../source/ephys_at_swc/example_pipelines/examples/README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst index 89333c7..6181b00 100644 --- a/docs/source/ephys_at_swc/example_pipelines/examples/README.rst +++ b/docs/source/ephys_at_swc/example_pipelines/examples/README.rst @@ -29,5 +29,5 @@ with acute Neuropixels 1.0 recordings. Details of the on the IBL data management system can be found `here `_. -Python Scripts --------------- +Standalone Scripts +------------------ From c91916669f83a18d5cf1581196e9cee14594e7df Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 31 Jan 2025 16:32:07 +0000 Subject: [PATCH 73/83] Add full reference. --- docs/source/ephys_at_swc/resources.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md index 8abe30c..fa525ea 100644 --- a/docs/source/ephys_at_swc/resources.md +++ b/docs/source/ephys_at_swc/resources.md @@ -48,7 +48,11 @@ provide a technical treatment of digital filtering, a key step in preprocessing [This video on Spike Sorting with Christophe Pouzat](https://www.youtube.com/watch?v=vSydfDvsewY), provides an excellent overview of the spike-sorting problem. -[This chapter](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) provides a + +Spike Sorting. +D. N. Hill, D. Kleinfeld and S. B. Mehta. In Observed Brain Dynamics by P. P. Mitra and H. Bokil, 2007, Oxford Press, 9:257-270. + +[Hill et al., Spike Sorting. In Observed Brain Dynamics by P. P. Mitra and H. Bokil, 2007, Oxford Press, 9:257-270.](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) more detailed introduction to spike sorting and associated quality metrics. It is also recommended to check out the From a6ff39ce583233d594b5abdec87cf57948f2c407 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 31 Jan 2025 16:35:16 +0000 Subject: [PATCH 74/83] Fix new reference. --- docs/source/ephys_at_swc/resources.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md index fa525ea..8e35087 100644 --- a/docs/source/ephys_at_swc/resources.md +++ b/docs/source/ephys_at_swc/resources.md @@ -48,12 +48,9 @@ provide a technical treatment of digital filtering, a key step in preprocessing [This video on Spike Sorting with Christophe Pouzat](https://www.youtube.com/watch?v=vSydfDvsewY), provides an excellent overview of the spike-sorting problem. - -Spike Sorting. -D. N. Hill, D. Kleinfeld and S. B. Mehta. In Observed Brain Dynamics by P. P. Mitra and H. Bokil, 2007, Oxford Press, 9:257-270. +This article provides a more detailed introduction to spike sorting and associated quality metrics: [Hill et al., Spike Sorting. In Observed Brain Dynamics by P. P. Mitra and H. Bokil, 2007, Oxford Press, 9:257-270.](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) -more detailed introduction to spike sorting and associated quality metrics. It is also recommended to check out the papers of existing spike sorting algorithms. A list of the main From 33097c7c4977e65b976110219c3ecae3a0b7a117 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Fri, 31 Jan 2025 16:39:37 +0000 Subject: [PATCH 75/83] Fix formatting. --- docs/source/ephys_at_swc/resources.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md index 8e35087..dc357d8 100644 --- a/docs/source/ephys_at_swc/resources.md +++ b/docs/source/ephys_at_swc/resources.md @@ -50,7 +50,7 @@ provides an excellent overview of the spike-sorting problem. This article provides a more detailed introduction to spike sorting and associated quality metrics: -[Hill et al., Spike Sorting. In Observed Brain Dynamics by P. P. Mitra and H. Bokil, 2007, Oxford Press, 9:257-270.](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) +[Hill DN et al, (2007). Spike Sorting. In *Observed Brain Dynamics by P. P. Mitra and H. Bokil*.](https://neurophysics.ucsd.edu/publications/obd_ch3_2.pdf) It is also recommended to check out the papers of existing spike sorting algorithms. A list of the main @@ -65,9 +65,9 @@ Assessing the quality of spike-sorting is a key to producing high-quality data. These two papers provide a nice introduction to quality metrics for assessing spike sorting outputs: -[Hill et al. (2011). Quality Metrics to Accompany Spike Sorting of Extracellular Signals. *Journal of Neuroscience*.](https://www.jneurosci.org/content/31/24/8699) +[Hill DN et al. (2011). Quality Metrics to Accompany Spike Sorting of Extracellular Signals. *Journal of Neuroscience*.](https://www.jneurosci.org/content/31/24/8699) -[Harris et al. (2016). Improving data quality in neuronal population recordings. *Nature Neuroscience*.](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5244825/) +[Harris KD et al. (2016). Improving data quality in neuronal population recordings. *Nature Neuroscience*.](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5244825/) [Phy](https://github.com/cortex-lab/phy) is the most popular tool for performing manual curation of spike sorting results. From 6c3d0893a1ab292a27772782decdd5dd933da728 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 3 Feb 2025 14:02:22 +0000 Subject: [PATCH 76/83] Fix md link. --- .../source/ephys_at_swc/example_pipelines/matlab_examples.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst index 667dbca..1781f6f 100644 --- a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst +++ b/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst @@ -24,8 +24,8 @@ Mateo Velez-Fort investigates the integration of visual and vestibular information in the visual cortex with the Margrie lab's 'Translocator' setup. They use -Neuropixels 2.0 (acquired using [SpikeGLX](https://github.com/billkarsh/SpikeGLX)) for acute recordings from the -primary visual cortex and other cortical areas as the head-fixed +Neuropixels 2.0 (acquired using `SpikeGLX `__ +for acute recordings from the primary visual cortex and other cortical areas as the head-fixed mouse is physically displaced along a track. The pipeline is available `here `__. From 7570725384ed1192377e5a27ecf5b8213a0b43bb Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 3 Feb 2025 14:11:59 +0000 Subject: [PATCH 77/83] Remove 'getting started' page. --- .../ephys_at_swc/example_pipelines/index.md | 1 - docs/source/ephys_at_swc/getting_started.md | 24 ------------------- docs/source/ephys_at_swc/index.md | 8 +------ docs/source/ephys_at_swc/resources.md | 8 +++++++ 4 files changed, 9 insertions(+), 32 deletions(-) delete mode 100644 docs/source/ephys_at_swc/getting_started.md diff --git a/docs/source/ephys_at_swc/example_pipelines/index.md b/docs/source/ephys_at_swc/example_pipelines/index.md index 1541e73..6c11472 100644 --- a/docs/source/ephys_at_swc/example_pipelines/index.md +++ b/docs/source/ephys_at_swc/example_pipelines/index.md @@ -8,7 +8,6 @@ data processing. However, please feel free to contact any listed researchers to ask questions or seek advice! - ::::{grid} 1 2 2 2 :gutter: 3 diff --git a/docs/source/ephys_at_swc/getting_started.md b/docs/source/ephys_at_swc/getting_started.md deleted file mode 100644 index 03f5768..0000000 --- a/docs/source/ephys_at_swc/getting_started.md +++ /dev/null @@ -1,24 +0,0 @@ -# Getting Started - -With numerous acquisition, preprocessing and analysis -steps to consider, getting started with extracellular electrophysiology -is not easy! - -To get started, the [Resources](resources) section has links to articles -for a general introduction to extracellular electrophysiology (as well as -more technical readings for a deeper background). - -It is useful to get advice on your particular -experimental setup and research question early on. See the -[Community](community) sections for details on where to get help. - -We recommend -[SpikeInterface](https://github.com/SpikeInterface/spikeinterface), -an open source community toolkit for extracellular electrophysiology, -for preprocessing and spike sorting. To begin -building your pipeline, the -[SpikeInterface](https://spikeinterface.readthedocs.io/en/stable/) -documentation is a good starting point. See the -[Example Pipelines](example_pipelines/index) -page for researchers at the SWC who would be happy -to answer any questions you might have. diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index 0bb653a..3860d45 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -16,14 +16,9 @@ We are focused on building community tools to automate and standardise electrophysiology analysis. -::::{grid} 1 2 2 2 +::::{grid} 1 3 3 3 :gutter: 3 -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Getting Started -:link: getting_started -:link-type: doc -::: - :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Resources :link: resources :link-type: doc @@ -45,7 +40,6 @@ and standardise electrophysiology analysis. :maxdepth: 2 :hidden: -getting_started resources example_pipelines/index community diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/ephys_at_swc/resources.md index dc357d8..4488848 100644 --- a/docs/source/ephys_at_swc/resources.md +++ b/docs/source/ephys_at_swc/resources.md @@ -8,6 +8,14 @@ This section is by no means exhaustive, please feel free to [get in contact](community.md) to suggest additions to this page. +For pipeline building, we recommend +[SpikeInterface](https://github.com/SpikeInterface/spikeinterface), +an open source community toolkit for extracellular electrophysiology, +for preprocessing and spike sorting. To begin +building your pipeline, the +[SpikeInterface](https://spikeinterface.readthedocs.io/en/stable/) +documentation is a good starting point. + ## General Introduction Below are a selection of papers that give a history From b519b536d468517c9e713f6a6330a3db803268fa Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 3 Feb 2025 14:22:12 +0000 Subject: [PATCH 78/83] Move ephys page to data analysis. --- docs/source/data_analysis/index.md | 1 + docs/source/ephys_at_swc/index.md | 2 +- docs/source/index.md | 8 -------- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/docs/source/data_analysis/index.md b/docs/source/data_analysis/index.md index ce094e5..e9003f7 100644 --- a/docs/source/data_analysis/index.md +++ b/docs/source/data_analysis/index.md @@ -5,5 +5,6 @@ Guides related to the analysis of neuroscientific data, spanning a wide range of ```{toctree} :maxdepth: 1 +../ephys_at_swc/index HPC-module-SLEAP ``` diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/ephys_at_swc/index.md index 3860d45..158e796 100644 --- a/docs/source/ephys_at_swc/index.md +++ b/docs/source/ephys_at_swc/index.md @@ -16,7 +16,7 @@ We are focused on building community tools to automate and standardise electrophysiology analysis. -::::{grid} 1 3 3 3 +::::{grid} 1 3 3 3 :gutter: 3 :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Resources diff --git a/docs/source/index.md b/docs/source/index.md index 9ade591..4e572fa 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -11,13 +11,6 @@ The guides are organised into four main sections: ::::{grid} 1 2 2 2 :gutter: 3 -:::{grid-item-card} {fas}`chart-simple;sd-text-primary` Electrophysiology -:link: ephys_at_swc/index -:link-type: doc - -Resources for preprocessing and analysis of extracellular electrophysiology data. -::: - :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Data Analysis :link: data_analysis/index :link-type: doc @@ -46,7 +39,6 @@ How to effectively share your code and data. :maxdepth: 2 :hidden: -ephys_at_swc/index data_analysis/index programming/index open_science/index From 4765b0c4d8dba3e1819caecfd0c783058671c190 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 3 Feb 2025 17:22:33 +0000 Subject: [PATCH 79/83] Rename to 'electrophysiology' --- docs/source/conf.py | 8 +- docs/source/data_analysis/index.md | 2 +- .../community.md | 0 .../auto_examples_ephys_jupyter.zip | Bin 0 -> 4622 bytes .../auto_examples_ephys_python.zip | Bin 0 -> 3802 bytes .../thumb/sphx_glr_sara_mederos_thumb.png | Bin 0 -> 28056 bytes .../auto_examples_ephys/index.rst | 92 ++++++++++ .../sara_mederos.codeobj.json | 119 +++++++++++++ .../auto_examples_ephys/sara_mederos.ipynb | 43 +++++ .../auto_examples_ephys}/sara_mederos.py | 0 .../auto_examples_ephys/sara_mederos.rst | 161 ++++++++++++++++++ .../auto_examples_ephys/sara_mederos.zip | Bin 0 -> 8402 bytes .../example_pipelines/examples/README.rst | 0 .../examples/notes-on-docs-structure.txt | 0 .../examples/sara_mederos.py | 112 ++++++++++++ .../example_pipelines/index.md | 0 .../example_pipelines/matlab_examples.rst | 0 .../index.md | 0 .../resources.md | 0 19 files changed, 532 insertions(+), 5 deletions(-) rename docs/source/{ephys_at_swc => electrophysiology}/community.md (100%) create mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip create mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip create mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png create mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/index.rst create mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json create mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.ipynb rename docs/source/{ephys_at_swc/example_pipelines/examples => electrophysiology/example_pipelines/auto_examples_ephys}/sara_mederos.py (100%) create mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.rst create mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.zip rename docs/source/{ephys_at_swc => electrophysiology}/example_pipelines/examples/README.rst (100%) rename docs/source/{ephys_at_swc => electrophysiology}/example_pipelines/examples/notes-on-docs-structure.txt (100%) create mode 100644 docs/source/electrophysiology/example_pipelines/examples/sara_mederos.py rename docs/source/{ephys_at_swc => electrophysiology}/example_pipelines/index.md (100%) rename docs/source/{ephys_at_swc => electrophysiology}/example_pipelines/matlab_examples.rst (100%) rename docs/source/{ephys_at_swc => electrophysiology}/index.md (100%) rename docs/source/{ephys_at_swc => electrophysiology}/resources.md (100%) diff --git a/docs/source/conf.py b/docs/source/conf.py index 6022863..2fd829b 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -77,8 +77,8 @@ "**/includes/**", # exclude .py and .ipynb files in auto_examples generated by sphinx-gallery # this is to prevent sphinx from complaining about duplicate source files - "ephys_at_swc/example_pipelines/auto_examples_ephys/*.ipynb", - "ephys_at_swc/example_pipelines/auto_examples_ephys/*.py", + "electrophysiology/example_pipelines/auto_examples_ephys/*.ipynb", + "electrophysiology/example_pipelines/auto_examples_ephys/*.py", ] # Ignore certain URLs from being checked @@ -157,6 +157,6 @@ # Configure sphinx-gallery sphinx_gallery_conf = { - 'examples_dirs': ["ephys_at_swc/example_pipelines/examples"], # path to your example scripts - 'gallery_dirs': ["ephys_at_swc/example_pipelines/auto_examples_ephys"], # path to where to save gallery generated output + 'examples_dirs': ["electrophysiology/example_pipelines/examples"], # path to your example scripts + 'gallery_dirs': ["electrophysiology/example_pipelines/auto_examples_ephys"], # path to where to save gallery generated output } diff --git a/docs/source/data_analysis/index.md b/docs/source/data_analysis/index.md index e9003f7..e7f9ab7 100644 --- a/docs/source/data_analysis/index.md +++ b/docs/source/data_analysis/index.md @@ -5,6 +5,6 @@ Guides related to the analysis of neuroscientific data, spanning a wide range of ```{toctree} :maxdepth: 1 -../ephys_at_swc/index +../electrophysiology/index HPC-module-SLEAP ``` diff --git a/docs/source/ephys_at_swc/community.md b/docs/source/electrophysiology/community.md similarity index 100% rename from docs/source/ephys_at_swc/community.md rename to docs/source/electrophysiology/community.md diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip new file mode 100644 index 0000000000000000000000000000000000000000..fc0718628c2c102bf01e01bedde55000e95d4a8b GIT binary patch literal 4622 zcmai2%Z}r?6|Ko@F~BSm%szyAF)F~8?Q&OUx&Z^pG$zQPlj=fGuhMF0XzAJ}N}|*x zRkktcMRxg>{6LU>z9@f?b0yO6N~#|vk(c+ya}O_d|N7^@`0|Q>{`2Y8U;pvje~#HmN_Zy5^X=GMWL8i8eYPNd*(-)r$5#>~tHhL-E^P3ReAU|{yncFsm$*7X%p{Un7 z8uVhAugJ+lI*I9@KJABX-I|=&c!iy=R6i4U_czH{C@p?y)B}C59hrs9Db=a|0lta9 z^uDF~ef+0-K}P&p&aXejE9V;fax_}6*NK%%+j(oYYdD?P6(zM#E0 z`xisfiq=9@JRjPX)DNk?qZS&~hDs|qzQ)vZvLcrG$5t6CdU*u(rXel9W83?fYK#qu z$GSkSv+E?)Z}MxlMI0H8f&ji`hAq^%`oU0G<#1Lx9Z_pv&um4gg0R%3G&uo#oK# z05RQ`_9OuR{9w*$)ewm9&)Em0Gxgm}4UvY<9L# zC5mf+-L5KR%Mgl!G?&^XcX%J^z?W8M{m^A`zteuBgCj771XAW_K{Or*oyA7FRjKAd z_#Urbc~>sGL?%sHI|fyd@id!!GrawJIDRqe3tij+Ji~R zk`3nk`c&Ihz3vkTAOFbc-;Eu@X(ry8wxi-_;@wJF!HBeiIjf^A@zu9VOSAoonE*SG zi0_>!2)L=h5goTM#dka98S-Rjk0Cw~>y^q^-pr4dx?Q))rYe7AMNBD%ItJ~D>+U|g zfBWX!@5Dk;2`U6vtFoj5q+;Y65ceF8D32}0yG=qqv6Tz4Psz)Ezk08+@K8|#MD&S^ zv5>cQkHxrKu^V;?t7I{D{cWoSg9mm{l_IX%(y6AT4Id=%lVNz>1=yDl7PFgkn|?z#|dZb^7##2 zoSBO%y}2FC_w46Wz%%@F+3=vxe=i~g+9@)-Er#0#HEuOyiaC*FJDHJsNwawR{Kbob znBD@7CsKx7Yj7%|BctMyny#e7MgvlpWGc`sZ;NcOCwqT^h~PF3k@HGM)8rc+K)3IB zm}7Q_q|Z+pJ*cu~f$2{D|I8KlP;Ds07GZBvIo#=+U&CGJQWn(Wlcmjkzw0E5! zpsJG=%?g|{qHREKQv1&Mq-z!Ew>duGtPi#jHOQPHaHI@va41zO2IB6`yG|$|fK?ny zh*%|*h{Ay8hyD-{d@OOd{|s)C2$!6ta;tWpfQLrMx1`ar2crg^?`ZPk_IX#@IEkey zxpCj^06==yj(V&f`nErGJYGVQ1EXF>ATZ}}2>QDKc>NrRmCfed1=H-ttHy}LL1*>@ za^v?l18;Van4$c=_>)y{alf%g_0o`h$gEmw6u744t^(18uId7Vd>?A*o`=*K62!u)y~0d!-M{|qXJ1}D{pF_nq=Wzd`8R$#|BiG2`j@}rna}X& N_xSxUeDS%u`Y+fi70Uns literal 0 HcmV?d00001 diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip new file mode 100644 index 0000000000000000000000000000000000000000..1c9fc1d0a1309bd056df159565de5ad2c3e033c9 GIT binary patch literal 3802 zcmai1&2HpG5DvcwONI+vIJIUEIMR$~l5BuQ7ztJ&(86xC>}Q$!r&+95kK~N!r*1} zonDX;KgjvH_@Z#Gv7b+;tJNyDQq^|en$3#JGSd~s+AOClnopNTw~d_^ym3;>`Ij%# zGz=Qp)~2!|D~zsHCa9#$8Ql~ct8}TCDwAax7|OKCRlT%gVRR*IJI8|KmqOOL*gY7M zR4dbF zEZ?)TWv!gL?bHH{Qs@Qr*3!{dgM|-YiAFV4s+tf1Oan>8Mia!BK^F{;g=LudhGBZ$ z%2GLaM$V|rhCwE4XvD@AZ|79%71VYl34`v)D*ilxjW*-{8?J?>M&wGHy!kI4^@F zKc}5c739|DP`G>tiioCkC%ql?WUY}->H4Hlyi)m++%_AXQKu@hWE6o8-g4bm z&4#Vj4cC4c@LOXOrts zC$mS>zEs3hos+njT})|>s)yCuU7#DChkpLXRQS;y zrDN{BuT$hJxth&}C%H~OnayV2_nZF6K@-ds+8wem`0~p7@lh zo4Bpj>z1MedDw^Su8AH&c-$&|Dc|*L437DBnv9mEp38DH7U2S|TS|jDBUKeDYu{hr=@+^Lh)J~H_@`pzofw_R(x#2JY8?$|Wzr;FXZP`K%lzVc zh9zIxkNNbYZiX5H>P>X5$d4mpJGI2(u`Dw<>u@SOIG&FBNt5TX-G+UjyoJ~h20cot zY7j9h(%HUC4jv?8IFz@dYaY*1%d?e@yxjO6`uWgabbg>Y9Svkw;9L=HgLWosKS~~r zc>)6}#|MV>!RA7veRKK`lwochN|f@kc>3%`Cp4s=RqRWMNW~P3+@P^feA^d%5b=2Y z0B(^Oz6_Si741Am@0lKcb4(9Cm^N)$PA?u^KkSMcXRlNxPrBO-fS`AVPtVhR-*(50 z=gR={&_z%350rB__5AF7iiVX<=REOJa_JRgMdDyHy9K%SnN86vJ3=HVdoO-(wOf1+ z*n?VWNWMy~TGq*^rsYt3m^TZZCnNrLXzj4tKc#Jze0n{U!_kBaa)=kMS7?&!1h=E*zn^70$_N$~# literal 0 HcmV?d00001 diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..3b362cf91299659eeec19a203a6d16971bc138fd GIT binary patch literal 28056 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 +is running a multi-session paradigm with two +`Cambridge Neurotech `__ +probes. In this multi-session task, mice learn a statistical learning paradigm to a +reward-associated auditory stimulus, recording from the hippocampus. +The pipeline uses SpikeInterface for preprocessing, +sorting, and analysis and can be found `here `__. + +The IBL analysis pipeline +------------------------- + +Nate Miska (`Mrsic-Flogel lab `__) +is a member of the +`International Brain Laboratory +(IBL) `_ +running the +`IBL's standardised behavioural task `_ +with acute Neuropixels 1.0 recordings. Details of the +`analysis pipeline code `__ +on the IBL data management system can be found +`here `_. + +Standalone Scripts +------------------ + + + +.. raw:: html + +
+ +.. thumbnail-parent-div-open + +.. raw:: html + +
+ +.. only:: html + + .. image:: /electrophysiology/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png + :alt: + + :ref:`sphx_glr_electrophysiology_example_pipelines_auto_examples_ephys_sara_mederos.py` + +.. raw:: html + +
NP2.0 in SpikeInterface
+
+ + +.. thumbnail-parent-div-close + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos + + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-gallery + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download all examples in Python source code: auto_examples_ephys_python.zip ` + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download all examples in Jupyter notebooks: auto_examples_ephys_jupyter.zip ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json new file mode 100644 index 0000000..91ca448 --- /dev/null +++ b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json @@ -0,0 +1,119 @@ +{ + "Path": [ + { + "is_class": false, + "is_explicit": false, + "module": "pathlib", + "module_short": "pathlib", + "name": "Path" + } + ], + "bandpass_filter": [ + { + "is_class": false, + "is_explicit": false, + "module": "spikeinterface.preprocessing", + "module_short": "spikeinterface.preprocessing", + "name": "bandpass_filter" + } + ], + "common_reference": [ + { + "is_class": false, + "is_explicit": false, + "module": "spikeinterface.preprocessing", + "module_short": "spikeinterface.preprocessing", + "name": "common_reference" + } + ], + "compute_quality_metrics": [ + { + "is_class": false, + "is_explicit": false, + "module": "spikeinterface.qualitymetrics", + "module_short": "spikeinterface.qualitymetrics", + "name": "compute_quality_metrics" + } + ], + "curation.remove_excess_spikes": [ + { + "is_class": false, + "is_explicit": false, + "module": "spikeinterface.curation", + "module_short": "spikeinterface.curation", + "name": "remove_excess_spikes" + } + ], + "extract_waveforms": [ + { + "is_class": false, + "is_explicit": false, + "module": "spikeinterface", + "module_short": "spikeinterface", + "name": "extract_waveforms" + } + ], + "np.unique": [ + { + "is_class": false, + "is_explicit": false, + "module": "numpy", + "module_short": "numpy", + "name": "unique" + } + ], + "phase_shift": [ + { + "is_class": false, + "is_explicit": false, + "module": "spikeinterface.preprocessing", + "module_short": "spikeinterface.preprocessing", + "name": "phase_shift" + } + ], + "plot_probe": [ + { + "is_class": false, + "is_explicit": false, + "module": "probeinterface.plotting", + "module_short": "probeinterface.plotting", + "name": "plot_probe" + } + ], + "plot_timeseries": [ + { + "is_class": false, + "is_explicit": false, + "module": "spikeinterface.widgets", + "module_short": "spikeinterface.widgets", + "name": "plot_timeseries" + } + ], + "plt.show": [ + { + "is_class": false, + "is_explicit": false, + "module": "matplotlib.pyplot", + "module_short": "matplotlib.pyplot", + "name": "show" + } + ], + "read_openephys": [ + { + "is_class": false, + "is_explicit": false, + "module": "spikeinterface.extractors", + "module_short": "spikeinterface.extractors", + "name": "read_openephys" + } + ], + "run_sorter": [ + { + "is_class": false, + "is_explicit": false, + "module": "spikeinterface.sorters", + "module_short": "spikeinterface.sorters", + "name": "run_sorter" + } + ] +} diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.ipynb b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.ipynb new file mode 100644 index 0000000..b132a58 --- /dev/null +++ b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# NP2.0 in SpikeInterface\n\nSara Mederos\n[(Hofer Lab)](https://www.sainsburywellcome.org/web/groups/hofer-lab)_\nperforms chronic electrophysiological\nrecordings from subcortical and cortical areas using 4-shank\nNeuropixels 2.0 probes (acquired using\n[Open Ephys](https://open-ephys.org/)_).\nRecordings are conducted in freely moving mice during behavioral\nparadigms that assess the cognitive control of innate behaviors.\nA pipeline used for pre-processing, sorting, and quality metrics\ncan be found below.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom spikeinterface.qualitymetrics import compute_quality_metrics\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport numpy as np\n\n\ndata_path = Path(\n r\"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = True\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run time shift (multiplex correction) and filter\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\n\n# Perform median average filter by shank\nchannel_group = filtered_recording.get_property(\"group\")\nsplit_channel_ids = [\n filtered_recording.get_channel_ids()[channel_group == idx]\n for idx in np.unique(channel_group)\n]\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\", groups=split_channel_ids\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n preprocessed_recording,\n order_channel_by_depth=True,\n time_range=(3499, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is set up means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.py similarity index 100% rename from docs/source/ephys_at_swc/example_pipelines/examples/sara_mederos.py rename to docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.py diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.rst b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.rst new file mode 100644 index 0000000..b9bacc6 --- /dev/null +++ b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.rst @@ -0,0 +1,161 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "electrophysiology\example_pipelines\auto_examples_ephys\sara_mederos.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_electrophysiology_example_pipelines_auto_examples_ephys_sara_mederos.py: + + +NP2.0 in SpikeInterface +======================= + +Sara Mederos +`(Hofer Lab) `__ +performs chronic electrophysiological +recordings from subcortical and cortical areas using 4-shank +Neuropixels 2.0 probes (acquired using +`Open Ephys `__). +Recordings are conducted in freely moving mice during behavioral +paradigms that assess the cognitive control of innate behaviors. +A pipeline used for pre-processing, sorting, and quality metrics +can be found below. + +.. GENERATED FROM PYTHON SOURCE LINES 16-113 + +.. code-block:: Python + + + from spikeinterface import extract_waveforms + from spikeinterface.extractors import read_openephys + from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference + from spikeinterface.sorters import run_sorter + from spikeinterface.qualitymetrics import compute_quality_metrics + from pathlib import Path + from probeinterface.plotting import plot_probe + import matplotlib.pyplot as plt + from spikeinterface import curation + from spikeinterface.widgets import plot_timeseries + import numpy as np + + + data_path = Path( + r"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1" + ) + output_path = Path( + r"/ceph/.../derivatives/100323/" + ) + + show_probe = False + show_preprocessing = True + + # This reads OpenEphys 'Binary' format. It determines the + # probe using probeinterface.read_openephys, which reads `settings.xml` + # and requires the NP_PROBE field is filled. + raw_recording = read_openephys(data_path) + + if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + + # Run time shift (multiplex correction) and filter + shifted_recording = phase_shift(raw_recording) + filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) + + # Perform median average filter by shank + channel_group = filtered_recording.get_property("group") + split_channel_ids = [ + filtered_recording.get_channel_ids()[channel_group == idx] + for idx in np.unique(channel_group) + ] + preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median", groups=split_channel_ids + ) + + if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + preprocessed_recording, + order_channel_by_depth=True, + time_range=(3499, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + + # Run the sorting + sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, + ) + + # Curate the sorting output and extract waveforms. Calculate + # quality metrics from the waveforms. + sorting = sorting.remove_empty_units() + + sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + + # The way spikeinterface is set up means that quality metrics are + # calculated on the spikeinterface-preprocessed, NOT the kilosort + # preprocessed (i.e. drift-correct data). + # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. + waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, + ) + + quality_metrics = compute_quality_metrics(waveforms) + quality_metrics.to_csv(output_path / "postprocessing") + + +.. _sphx_glr_download_electrophysiology_example_pipelines_auto_examples_ephys_sara_mederos.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: sara_mederos.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: sara_mederos.py ` + + .. container:: sphx-glr-download sphx-glr-download-zip + + :download:`Download zipped: sara_mederos.zip ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.zip b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.zip new file mode 100644 index 0000000000000000000000000000000000000000..9e279e83fda274065bd8feeda3e4c22d26ede1d5 GIT binary patch literal 8402 zcmb_i&5j$n5uR**4g!=Q!RE4;5beWifSH!YV`pO{N{}@+$ij&|@cOiFqfNCaiI^6< zO?J;nSopA~PP_C)sBYO+{=tSZ*Wo{OhH{>i6D^!e|* zC*S`1pP&8f+n*mD(a$e1X1M0@TFiycOqg$jAQ%pwUEB{ROe*$GE-%H`st|g?6EPf2 z`#;0MaPSTIu)kS8!@--;U$TYJ?5})w%znQrirhRNkFT$9t|WN@q$YOr#mJ`*c`B{NMn<#6d-E@6AI;sxWz2t(hA*;2_uUR7-2jFe>y@KwAJH3tJ7{={;b zi&QEB3m_Vvgl*y!_9fs2fhWw6o9GL<>21kVSwJ&UXqlMdAmIuev9QGKOr+U0*j7O@ z99TzFh)5qIOs;eAV`5Wio)qylzY^8<^-_n9EYrp>#O};v@@VDI{#CG`F~Bd(SKNr$ ztmL9NVKdm0!(Z`2rU>2>IBdPnRICMJODGEE9_2%Fg=pzgs@M+olRIZQUwK6!DlZEW zyIJIxb7dtl=fx_OGf#YhN5{O1x!RFoo@NE@i>IXLxS|;joRinQpi!_x;?g&S2+Px= zS6j~~DK#%-rh19OYdK$vqTY>4Xd&0a2rUJ|!AVx-I^U8sl~e8y2XkKVm~3NHMmCLx z1BQm+Lp3@c4zjXEvk=EzCSuMys^2*S#) zq*1*=@Fuo#!5Wu5wtHo@#=AH^M^N(k2c^)rxw!2#F<;k?Jo>#VBwf2N}sm z>oP55o{9}sV(3XBcw8B1Qx?k8M2Sso$QT|ZEG+&|yR<(r9wy>!>H4^-%L>gBI7hJxtk#`@$x!8_^ ziZFl_lcUPUe!WDDP1!5!-vdlqw4>u!{>e$6GCAM8cI#2%@kFPL%EMC0x1|_$=pi4p zO%dI3;clsPsl2b(31ZBZ(`m3wvl&l=6NcK20+Z=!VBLoyd$3RUjIL6<9gMA9bU}$o zG1kA(a<)Z%hv(s}e(ggmV%Byw#Vj3r;6y&@W$1*};oVd`XFSc&r(f)e^}Hov41I{u z_2xq9xyXyvluFAECCQ03S4%M+oj-W==!Bg=L=^5&X;G9KClOj1G4EqjrLx~*1XCZ) z8nqQ$!tni;sOX0-ns9pHSEO1H$$00Xyo*B6rd2c0LPpiuA?5orK?BN7MF14S~=_jfl z${S=wRHewZBdqRPLiU8G36w2xD%{)cj%=q%{aCZ0?IOI$klo?-*l*<6zUx0N=QsjZrJBfS4lf9r?j*H-H1ClPkI4m$8vc zH4T(l`rJdmxyt6#fUrYp{HT43%k}h&hdv#4I#hV>K<_%Ly^C1eSrrypoS3WKOx^X= zaB$Iqq5uBPf5!j#<xd%HB5i^&iNL@CM$J9Yus^L@ru+vb^!B6DpGA|8>v?m}E&4HjxaHO^ZPHaR{Qd=7*0LukJOrcgak=G7LFNoqeOH-Z$oMXYl zA``2Gmkt_xL{(|9tDv)j#RrjJ1n9Hmb>+lYCtG-th%>)%r_boP8OGwO&^WRX{klH_Uf1&HZAkcusPWnH;%SOxFBGytzd$lR^J9hpb! zHO|LYlijqb&|?poAJVIh%wb#w&7(Fpj~qCs!9(c0O7V6`wleaumD~%ap=iGa4LWZ- zoJ!KI_}q#k(w!U0Q8QD`_PXw*OLP-H?@}JZ=Uu9vj=f9JkI%a_6+Xwd@Em*6Od%r4 zF8VYGy_LxgLPzNKA#}SwY9M;ezJHUP>;o9xa&vXRAEQSeq$8c$DBUh?P`Z8YpmY~; z_t?jybgIs~;I?XVx+uNvEa$cwdbd$JdAf1y-B7ySwL7A8vhR*4-JXO#nekHSFiI!V z|07C|RE;B1B=*`-m&-TDrHyeHrH3N03qE@Tv5nJhD7J9A8#sW|?d-v+Hn2Q_AC_ zdTlJ#BI^hyWVV)CXF8_3+Ma_<&la}~q)#IdbGYiqTV;h6=iUr253}e1aE-SqgmOdy zy)kbP*&6q`{z{?%-FS1lE2EaaKY`__ +performs chronic electrophysiological +recordings from subcortical and cortical areas using 4-shank +Neuropixels 2.0 probes (acquired using +`Open Ephys `__). +Recordings are conducted in freely moving mice during behavioral +paradigms that assess the cognitive control of innate behaviors. +A pipeline used for pre-processing, sorting, and quality metrics +can be found below. +""" + +from spikeinterface import extract_waveforms +from spikeinterface.extractors import read_openephys +from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference +from spikeinterface.sorters import run_sorter +from spikeinterface.qualitymetrics import compute_quality_metrics +from pathlib import Path +from probeinterface.plotting import plot_probe +import matplotlib.pyplot as plt +from spikeinterface import curation +from spikeinterface.widgets import plot_timeseries +import numpy as np + + +data_path = Path( + r"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1" +) +output_path = Path( + r"/ceph/.../derivatives/100323/" +) + +show_probe = False +show_preprocessing = True + +# This reads OpenEphys 'Binary' format. It determines the +# probe using probeinterface.read_openephys, which reads `settings.xml` +# and requires the NP_PROBE field is filled. +raw_recording = read_openephys(data_path) + +if show_probe: + probe = raw_recording.get_probe() + plot_probe(probe) + plt.show() + +# Run time shift (multiplex correction) and filter +shifted_recording = phase_shift(raw_recording) +filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) + +# Perform median average filter by shank +channel_group = filtered_recording.get_property("group") +split_channel_ids = [ + filtered_recording.get_channel_ids()[channel_group == idx] + for idx in np.unique(channel_group) +] +preprocessed_recording = common_reference( + filtered_recording, reference="global", operator="median", groups=split_channel_ids +) + +if show_preprocessing: + recs_grouped_by_shank = preprocessed_recording.split_by("group") + for rec in recs_grouped_by_shank: + plot_timeseries( + preprocessed_recording, + order_channel_by_depth=True, + time_range=(3499, 3500), + return_scaled=True, + show_channel_ids=True, + mode="map", + ) + plt.show() + +# Run the sorting +sorting = run_sorter( + "kilosort3", + preprocessed_recording, + singularity_image=True, + output_folder=(output_path / "sorting").as_posix(), + car=False, + freq_min=150, +) + +# Curate the sorting output and extract waveforms. Calculate +# quality metrics from the waveforms. +sorting = sorting.remove_empty_units() + +sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) + +# The way spikeinterface is set up means that quality metrics are +# calculated on the spikeinterface-preprocessed, NOT the kilosort +# preprocessed (i.e. drift-correct data). +# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. +waveforms = extract_waveforms( + preprocessed_recording, + sorting, + folder=(output_path / "postprocessing").as_posix(), + ms_before=2, + ms_after=2, + max_spikes_per_unit=500, + return_scaled=True, + sparse=True, + peak_sign="neg", + method="radius", + radius_um=75, +) + +quality_metrics = compute_quality_metrics(waveforms) +quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/ephys_at_swc/example_pipelines/index.md b/docs/source/electrophysiology/example_pipelines/index.md similarity index 100% rename from docs/source/ephys_at_swc/example_pipelines/index.md rename to docs/source/electrophysiology/example_pipelines/index.md diff --git a/docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst b/docs/source/electrophysiology/example_pipelines/matlab_examples.rst similarity index 100% rename from docs/source/ephys_at_swc/example_pipelines/matlab_examples.rst rename to docs/source/electrophysiology/example_pipelines/matlab_examples.rst diff --git a/docs/source/ephys_at_swc/index.md b/docs/source/electrophysiology/index.md similarity index 100% rename from docs/source/ephys_at_swc/index.md rename to docs/source/electrophysiology/index.md diff --git a/docs/source/ephys_at_swc/resources.md b/docs/source/electrophysiology/resources.md similarity index 100% rename from docs/source/ephys_at_swc/resources.md rename to docs/source/electrophysiology/resources.md From 5026e98004d8cca83c28706adadd878f7f84a362 Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 3 Feb 2025 17:25:05 +0000 Subject: [PATCH 80/83] Delete auto_examples_ephys and add to gitignore. --- .gitignore | 1 + .../auto_examples_ephys_jupyter.zip | Bin 4622 -> 0 bytes .../auto_examples_ephys_python.zip | Bin 3802 -> 0 bytes .../thumb/sphx_glr_sara_mederos_thumb.png | Bin 28056 -> 0 bytes .../auto_examples_ephys/index.rst | 92 ---------- .../sara_mederos.codeobj.json | 119 ------------- .../auto_examples_ephys/sara_mederos.ipynb | 43 ----- .../auto_examples_ephys/sara_mederos.py | 112 ------------ .../auto_examples_ephys/sara_mederos.rst | 161 ------------------ .../auto_examples_ephys/sara_mederos.zip | Bin 8402 -> 0 bytes 10 files changed, 1 insertion(+), 527 deletions(-) delete mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip delete mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip delete mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png delete mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/index.rst delete mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json delete mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.ipynb delete mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.py delete mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.rst delete mode 100644 docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.zip diff --git a/.gitignore b/.gitignore index d1267e0..7b684fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/ sg_execution_times.rst +auto_examples_ephys # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_jupyter.zip deleted file mode 100644 index fc0718628c2c102bf01e01bedde55000e95d4a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4622 zcmai2%Z}r?6|Ko@F~BSm%szyAF)F~8?Q&OUx&Z^pG$zQPlj=fGuhMF0XzAJ}N}|*x zRkktcMRxg>{6LU>z9@f?b0yO6N~#|vk(c+ya}O_d|N7^@`0|Q>{`2Y8U;pvje~#HmN_Zy5^X=GMWL8i8eYPNd*(-)r$5#>~tHhL-E^P3ReAU|{yncFsm$*7X%p{Un7 z8uVhAugJ+lI*I9@KJABX-I|=&c!iy=R6i4U_czH{C@p?y)B}C59hrs9Db=a|0lta9 z^uDF~ef+0-K}P&p&aXejE9V;fax_}6*NK%%+j(oYYdD?P6(zM#E0 z`xisfiq=9@JRjPX)DNk?qZS&~hDs|qzQ)vZvLcrG$5t6CdU*u(rXel9W83?fYK#qu z$GSkSv+E?)Z}MxlMI0H8f&ji`hAq^%`oU0G<#1Lx9Z_pv&um4gg0R%3G&uo#oK# z05RQ`_9OuR{9w*$)ewm9&)Em0Gxgm}4UvY<9L# zC5mf+-L5KR%Mgl!G?&^XcX%J^z?W8M{m^A`zteuBgCj771XAW_K{Or*oyA7FRjKAd z_#Urbc~>sGL?%sHI|fyd@id!!GrawJIDRqe3tij+Ji~R zk`3nk`c&Ihz3vkTAOFbc-;Eu@X(ry8wxi-_;@wJF!HBeiIjf^A@zu9VOSAoonE*SG zi0_>!2)L=h5goTM#dka98S-Rjk0Cw~>y^q^-pr4dx?Q))rYe7AMNBD%ItJ~D>+U|g zfBWX!@5Dk;2`U6vtFoj5q+;Y65ceF8D32}0yG=qqv6Tz4Psz)Ezk08+@K8|#MD&S^ zv5>cQkHxrKu^V;?t7I{D{cWoSg9mm{l_IX%(y6AT4Id=%lVNz>1=yDl7PFgkn|?z#|dZb^7##2 zoSBO%y}2FC_w46Wz%%@F+3=vxe=i~g+9@)-Er#0#HEuOyiaC*FJDHJsNwawR{Kbob znBD@7CsKx7Yj7%|BctMyny#e7MgvlpWGc`sZ;NcOCwqT^h~PF3k@HGM)8rc+K)3IB zm}7Q_q|Z+pJ*cu~f$2{D|I8KlP;Ds07GZBvIo#=+U&CGJQWn(Wlcmjkzw0E5! zpsJG=%?g|{qHREKQv1&Mq-z!Ew>duGtPi#jHOQPHaHI@va41zO2IB6`yG|$|fK?ny zh*%|*h{Ay8hyD-{d@OOd{|s)C2$!6ta;tWpfQLrMx1`ar2crg^?`ZPk_IX#@IEkey zxpCj^06==yj(V&f`nErGJYGVQ1EXF>ATZ}}2>QDKc>NrRmCfed1=H-ttHy}LL1*>@ za^v?l18;Van4$c=_>)y{alf%g_0o`h$gEmw6u744t^(18uId7Vd>?A*o`=*K62!u)y~0d!-M{|qXJ1}D{pF_nq=Wzd`8R$#|BiG2`j@}rna}X& N_xSxUeDS%u`Y+fi70Uns diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/auto_examples_ephys_python.zip deleted file mode 100644 index 1c9fc1d0a1309bd056df159565de5ad2c3e033c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3802 zcmai1&2HpG5DvcwONI+vIJIUEIMR$~l5BuQ7ztJ&(86xC>}Q$!r&+95kK~N!r*1} zonDX;KgjvH_@Z#Gv7b+;tJNyDQq^|en$3#JGSd~s+AOClnopNTw~d_^ym3;>`Ij%# zGz=Qp)~2!|D~zsHCa9#$8Ql~ct8}TCDwAax7|OKCRlT%gVRR*IJI8|KmqOOL*gY7M zR4dbF zEZ?)TWv!gL?bHH{Qs@Qr*3!{dgM|-YiAFV4s+tf1Oan>8Mia!BK^F{;g=LudhGBZ$ z%2GLaM$V|rhCwE4XvD@AZ|79%71VYl34`v)D*ilxjW*-{8?J?>M&wGHy!kI4^@F zKc}5c739|DP`G>tiioCkC%ql?WUY}->H4Hlyi)m++%_AXQKu@hWE6o8-g4bm z&4#Vj4cC4c@LOXOrts zC$mS>zEs3hos+njT})|>s)yCuU7#DChkpLXRQS;y zrDN{BuT$hJxth&}C%H~OnayV2_nZF6K@-ds+8wem`0~p7@lh zo4Bpj>z1MedDw^Su8AH&c-$&|Dc|*L437DBnv9mEp38DH7U2S|TS|jDBUKeDYu{hr=@+^Lh)J~H_@`pzofw_R(x#2JY8?$|Wzr;FXZP`K%lzVc zh9zIxkNNbYZiX5H>P>X5$d4mpJGI2(u`Dw<>u@SOIG&FBNt5TX-G+UjyoJ~h20cot zY7j9h(%HUC4jv?8IFz@dYaY*1%d?e@yxjO6`uWgabbg>Y9Svkw;9L=HgLWosKS~~r zc>)6}#|MV>!RA7veRKK`lwochN|f@kc>3%`Cp4s=RqRWMNW~P3+@P^feA^d%5b=2Y z0B(^Oz6_Si741Am@0lKcb4(9Cm^N)$PA?u^KkSMcXRlNxPrBO-fS`AVPtVhR-*(50 z=gR={&_z%350rB__5AF7iiVX<=REOJa_JRgMdDyHy9K%SnN86vJ3=HVdoO-(wOf1+ z*n?VWNWMy~TGq*^rsYt3m^TZZCnNrLXzj4tKc#Jze0n{U!_kBaa)=kMS7?&!1h=E*zn^70$_N$~# diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png deleted file mode 100644 index 3b362cf91299659eeec19a203a6d16971bc138fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28056 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 -is running a multi-session paradigm with two -`Cambridge Neurotech `__ -probes. In this multi-session task, mice learn a statistical learning paradigm to a -reward-associated auditory stimulus, recording from the hippocampus. -The pipeline uses SpikeInterface for preprocessing, -sorting, and analysis and can be found `here `__. - -The IBL analysis pipeline -------------------------- - -Nate Miska (`Mrsic-Flogel lab `__) -is a member of the -`International Brain Laboratory -(IBL) `_ -running the -`IBL's standardised behavioural task `_ -with acute Neuropixels 1.0 recordings. Details of the -`analysis pipeline code `__ -on the IBL data management system can be found -`here `_. - -Standalone Scripts ------------------- - - - -.. raw:: html - -
- -.. thumbnail-parent-div-open - -.. raw:: html - -
- -.. only:: html - - .. image:: /electrophysiology/example_pipelines/auto_examples_ephys/images/thumb/sphx_glr_sara_mederos_thumb.png - :alt: - - :ref:`sphx_glr_electrophysiology_example_pipelines_auto_examples_ephys_sara_mederos.py` - -.. raw:: html - -
NP2.0 in SpikeInterface
-
- - -.. thumbnail-parent-div-close - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos - - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-gallery - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download all examples in Python source code: auto_examples_ephys_python.zip ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download all examples in Jupyter notebooks: auto_examples_ephys_jupyter.zip ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json deleted file mode 100644 index 91ca448..0000000 --- a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.codeobj.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "Path": [ - { - "is_class": false, - "is_explicit": false, - "module": "pathlib", - "module_short": "pathlib", - "name": "Path" - } - ], - "bandpass_filter": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.preprocessing", - "module_short": "spikeinterface.preprocessing", - "name": "bandpass_filter" - } - ], - "common_reference": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.preprocessing", - "module_short": "spikeinterface.preprocessing", - "name": "common_reference" - } - ], - "compute_quality_metrics": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.qualitymetrics", - "module_short": "spikeinterface.qualitymetrics", - "name": "compute_quality_metrics" - } - ], - "curation.remove_excess_spikes": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.curation", - "module_short": "spikeinterface.curation", - "name": "remove_excess_spikes" - } - ], - "extract_waveforms": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface", - "module_short": "spikeinterface", - "name": "extract_waveforms" - } - ], - "np.unique": [ - { - "is_class": false, - "is_explicit": false, - "module": "numpy", - "module_short": "numpy", - "name": "unique" - } - ], - "phase_shift": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.preprocessing", - "module_short": "spikeinterface.preprocessing", - "name": "phase_shift" - } - ], - "plot_probe": [ - { - "is_class": false, - "is_explicit": false, - "module": "probeinterface.plotting", - "module_short": "probeinterface.plotting", - "name": "plot_probe" - } - ], - "plot_timeseries": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.widgets", - "module_short": "spikeinterface.widgets", - "name": "plot_timeseries" - } - ], - "plt.show": [ - { - "is_class": false, - "is_explicit": false, - "module": "matplotlib.pyplot", - "module_short": "matplotlib.pyplot", - "name": "show" - } - ], - "read_openephys": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.extractors", - "module_short": "spikeinterface.extractors", - "name": "read_openephys" - } - ], - "run_sorter": [ - { - "is_class": false, - "is_explicit": false, - "module": "spikeinterface.sorters", - "module_short": "spikeinterface.sorters", - "name": "run_sorter" - } - ] -} diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.ipynb b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.ipynb deleted file mode 100644 index b132a58..0000000 --- a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.ipynb +++ /dev/null @@ -1,43 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# NP2.0 in SpikeInterface\n\nSara Mederos\n[(Hofer Lab)](https://www.sainsburywellcome.org/web/groups/hofer-lab)_\nperforms chronic electrophysiological\nrecordings from subcortical and cortical areas using 4-shank\nNeuropixels 2.0 probes (acquired using\n[Open Ephys](https://open-ephys.org/)_).\nRecordings are conducted in freely moving mice during behavioral\nparadigms that assess the cognitive control of innate behaviors.\nA pipeline used for pre-processing, sorting, and quality metrics\ncan be found below.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from spikeinterface import extract_waveforms\nfrom spikeinterface.extractors import read_openephys\nfrom spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference\nfrom spikeinterface.sorters import run_sorter\nfrom spikeinterface.qualitymetrics import compute_quality_metrics\nfrom pathlib import Path\nfrom probeinterface.plotting import plot_probe\nimport matplotlib.pyplot as plt\nfrom spikeinterface import curation\nfrom spikeinterface.widgets import plot_timeseries\nimport numpy as np\n\n\ndata_path = Path(\n r\"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1\"\n)\noutput_path = Path(\n r\"/ceph/.../derivatives/100323/\"\n)\n\nshow_probe = False\nshow_preprocessing = True\n\n# This reads OpenEphys 'Binary' format. It determines the\n# probe using probeinterface.read_openephys, which reads `settings.xml`\n# and requires the NP_PROBE field is filled.\nraw_recording = read_openephys(data_path)\n\nif show_probe:\n probe = raw_recording.get_probe()\n plot_probe(probe)\n plt.show()\n\n# Run time shift (multiplex correction) and filter\nshifted_recording = phase_shift(raw_recording)\nfiltered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000)\n\n# Perform median average filter by shank\nchannel_group = filtered_recording.get_property(\"group\")\nsplit_channel_ids = [\n filtered_recording.get_channel_ids()[channel_group == idx]\n for idx in np.unique(channel_group)\n]\npreprocessed_recording = common_reference(\n filtered_recording, reference=\"global\", operator=\"median\", groups=split_channel_ids\n)\n\nif show_preprocessing:\n recs_grouped_by_shank = preprocessed_recording.split_by(\"group\")\n for rec in recs_grouped_by_shank:\n plot_timeseries(\n preprocessed_recording,\n order_channel_by_depth=True,\n time_range=(3499, 3500),\n return_scaled=True,\n show_channel_ids=True,\n mode=\"map\",\n )\n plt.show()\n\n# Run the sorting\nsorting = run_sorter(\n \"kilosort3\",\n preprocessed_recording,\n singularity_image=True,\n output_folder=(output_path / \"sorting\").as_posix(),\n car=False,\n freq_min=150,\n)\n\n# Curate the sorting output and extract waveforms. Calculate\n# quality metrics from the waveforms.\nsorting = sorting.remove_empty_units()\n\nsorting = curation.remove_excess_spikes(sorting, preprocessed_recording)\n\n# The way spikeinterface is set up means that quality metrics are\n# calculated on the spikeinterface-preprocessed, NOT the kilosort\n# preprocessed (i.e. drift-correct data).\n# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details.\nwaveforms = extract_waveforms(\n preprocessed_recording,\n sorting,\n folder=(output_path / \"postprocessing\").as_posix(),\n ms_before=2,\n ms_after=2,\n max_spikes_per_unit=500,\n return_scaled=True,\n sparse=True,\n peak_sign=\"neg\",\n method=\"radius\",\n radius_um=75,\n)\n\nquality_metrics = compute_quality_metrics(waveforms)\nquality_metrics.to_csv(output_path / \"postprocessing\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.11.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.py b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.py deleted file mode 100644 index 7efbd41..0000000 --- a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.py +++ /dev/null @@ -1,112 +0,0 @@ -""" -NP2.0 in SpikeInterface -======================= - -Sara Mederos -`(Hofer Lab) `__ -performs chronic electrophysiological -recordings from subcortical and cortical areas using 4-shank -Neuropixels 2.0 probes (acquired using -`Open Ephys `__). -Recordings are conducted in freely moving mice during behavioral -paradigms that assess the cognitive control of innate behaviors. -A pipeline used for pre-processing, sorting, and quality metrics -can be found below. -""" - -from spikeinterface import extract_waveforms -from spikeinterface.extractors import read_openephys -from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference -from spikeinterface.sorters import run_sorter -from spikeinterface.qualitymetrics import compute_quality_metrics -from pathlib import Path -from probeinterface.plotting import plot_probe -import matplotlib.pyplot as plt -from spikeinterface import curation -from spikeinterface.widgets import plot_timeseries -import numpy as np - - -data_path = Path( - r"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1" -) -output_path = Path( - r"/ceph/.../derivatives/100323/" -) - -show_probe = False -show_preprocessing = True - -# This reads OpenEphys 'Binary' format. It determines the -# probe using probeinterface.read_openephys, which reads `settings.xml` -# and requires the NP_PROBE field is filled. -raw_recording = read_openephys(data_path) - -if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - -# Run time shift (multiplex correction) and filter -shifted_recording = phase_shift(raw_recording) -filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) - -# Perform median average filter by shank -channel_group = filtered_recording.get_property("group") -split_channel_ids = [ - filtered_recording.get_channel_ids()[channel_group == idx] - for idx in np.unique(channel_group) -] -preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median", groups=split_channel_ids -) - -if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - preprocessed_recording, - order_channel_by_depth=True, - time_range=(3499, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - -# Run the sorting -sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, -) - -# Curate the sorting output and extract waveforms. Calculate -# quality metrics from the waveforms. -sorting = sorting.remove_empty_units() - -sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - -# The way spikeinterface is set up means that quality metrics are -# calculated on the spikeinterface-preprocessed, NOT the kilosort -# preprocessed (i.e. drift-correct data). -# see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. -waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, -) - -quality_metrics = compute_quality_metrics(waveforms) -quality_metrics.to_csv(output_path / "postprocessing") diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.rst b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.rst deleted file mode 100644 index b9bacc6..0000000 --- a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.rst +++ /dev/null @@ -1,161 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "electrophysiology\example_pipelines\auto_examples_ephys\sara_mederos.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code. - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_electrophysiology_example_pipelines_auto_examples_ephys_sara_mederos.py: - - -NP2.0 in SpikeInterface -======================= - -Sara Mederos -`(Hofer Lab) `__ -performs chronic electrophysiological -recordings from subcortical and cortical areas using 4-shank -Neuropixels 2.0 probes (acquired using -`Open Ephys `__). -Recordings are conducted in freely moving mice during behavioral -paradigms that assess the cognitive control of innate behaviors. -A pipeline used for pre-processing, sorting, and quality metrics -can be found below. - -.. GENERATED FROM PYTHON SOURCE LINES 16-113 - -.. code-block:: Python - - - from spikeinterface import extract_waveforms - from spikeinterface.extractors import read_openephys - from spikeinterface.preprocessing import phase_shift, bandpass_filter, common_reference - from spikeinterface.sorters import run_sorter - from spikeinterface.qualitymetrics import compute_quality_metrics - from pathlib import Path - from probeinterface.plotting import plot_probe - import matplotlib.pyplot as plt - from spikeinterface import curation - from spikeinterface.widgets import plot_timeseries - import numpy as np - - - data_path = Path( - r"/ceph/.../100323/2023-10-03_18-57-09/Record Node 101/experiment1" - ) - output_path = Path( - r"/ceph/.../derivatives/100323/" - ) - - show_probe = False - show_preprocessing = True - - # This reads OpenEphys 'Binary' format. It determines the - # probe using probeinterface.read_openephys, which reads `settings.xml` - # and requires the NP_PROBE field is filled. - raw_recording = read_openephys(data_path) - - if show_probe: - probe = raw_recording.get_probe() - plot_probe(probe) - plt.show() - - # Run time shift (multiplex correction) and filter - shifted_recording = phase_shift(raw_recording) - filtered_recording = bandpass_filter(shifted_recording, freq_min=300, freq_max=6000) - - # Perform median average filter by shank - channel_group = filtered_recording.get_property("group") - split_channel_ids = [ - filtered_recording.get_channel_ids()[channel_group == idx] - for idx in np.unique(channel_group) - ] - preprocessed_recording = common_reference( - filtered_recording, reference="global", operator="median", groups=split_channel_ids - ) - - if show_preprocessing: - recs_grouped_by_shank = preprocessed_recording.split_by("group") - for rec in recs_grouped_by_shank: - plot_timeseries( - preprocessed_recording, - order_channel_by_depth=True, - time_range=(3499, 3500), - return_scaled=True, - show_channel_ids=True, - mode="map", - ) - plt.show() - - # Run the sorting - sorting = run_sorter( - "kilosort3", - preprocessed_recording, - singularity_image=True, - output_folder=(output_path / "sorting").as_posix(), - car=False, - freq_min=150, - ) - - # Curate the sorting output and extract waveforms. Calculate - # quality metrics from the waveforms. - sorting = sorting.remove_empty_units() - - sorting = curation.remove_excess_spikes(sorting, preprocessed_recording) - - # The way spikeinterface is set up means that quality metrics are - # calculated on the spikeinterface-preprocessed, NOT the kilosort - # preprocessed (i.e. drift-correct data). - # see https://github.com/SpikeInterface/spikeinterface/pull/1954 for details. - waveforms = extract_waveforms( - preprocessed_recording, - sorting, - folder=(output_path / "postprocessing").as_posix(), - ms_before=2, - ms_after=2, - max_spikes_per_unit=500, - return_scaled=True, - sparse=True, - peak_sign="neg", - method="radius", - radius_um=75, - ) - - quality_metrics = compute_quality_metrics(waveforms) - quality_metrics.to_csv(output_path / "postprocessing") - - -.. _sphx_glr_download_electrophysiology_example_pipelines_auto_examples_ephys_sara_mederos.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: sara_mederos.ipynb ` - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: sara_mederos.py ` - - .. container:: sphx-glr-download sphx-glr-download-zip - - :download:`Download zipped: sara_mederos.zip ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.zip b/docs/source/electrophysiology/example_pipelines/auto_examples_ephys/sara_mederos.zip deleted file mode 100644 index 9e279e83fda274065bd8feeda3e4c22d26ede1d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8402 zcmb_i&5j$n5uR**4g!=Q!RE4;5beWifSH!YV`pO{N{}@+$ij&|@cOiFqfNCaiI^6< zO?J;nSopA~PP_C)sBYO+{=tSZ*Wo{OhH{>i6D^!e|* zC*S`1pP&8f+n*mD(a$e1X1M0@TFiycOqg$jAQ%pwUEB{ROe*$GE-%H`st|g?6EPf2 z`#;0MaPSTIu)kS8!@--;U$TYJ?5})w%znQrirhRNkFT$9t|WN@q$YOr#mJ`*c`B{NMn<#6d-E@6AI;sxWz2t(hA*;2_uUR7-2jFe>y@KwAJH3tJ7{={;b zi&QEB3m_Vvgl*y!_9fs2fhWw6o9GL<>21kVSwJ&UXqlMdAmIuev9QGKOr+U0*j7O@ z99TzFh)5qIOs;eAV`5Wio)qylzY^8<^-_n9EYrp>#O};v@@VDI{#CG`F~Bd(SKNr$ ztmL9NVKdm0!(Z`2rU>2>IBdPnRICMJODGEE9_2%Fg=pzgs@M+olRIZQUwK6!DlZEW zyIJIxb7dtl=fx_OGf#YhN5{O1x!RFoo@NE@i>IXLxS|;joRinQpi!_x;?g&S2+Px= zS6j~~DK#%-rh19OYdK$vqTY>4Xd&0a2rUJ|!AVx-I^U8sl~e8y2XkKVm~3NHMmCLx z1BQm+Lp3@c4zjXEvk=EzCSuMys^2*S#) zq*1*=@Fuo#!5Wu5wtHo@#=AH^M^N(k2c^)rxw!2#F<;k?Jo>#VBwf2N}sm z>oP55o{9}sV(3XBcw8B1Qx?k8M2Sso$QT|ZEG+&|yR<(r9wy>!>H4^-%L>gBI7hJxtk#`@$x!8_^ ziZFl_lcUPUe!WDDP1!5!-vdlqw4>u!{>e$6GCAM8cI#2%@kFPL%EMC0x1|_$=pi4p zO%dI3;clsPsl2b(31ZBZ(`m3wvl&l=6NcK20+Z=!VBLoyd$3RUjIL6<9gMA9bU}$o zG1kA(a<)Z%hv(s}e(ggmV%Byw#Vj3r;6y&@W$1*};oVd`XFSc&r(f)e^}Hov41I{u z_2xq9xyXyvluFAECCQ03S4%M+oj-W==!Bg=L=^5&X;G9KClOj1G4EqjrLx~*1XCZ) z8nqQ$!tni;sOX0-ns9pHSEO1H$$00Xyo*B6rd2c0LPpiuA?5orK?BN7MF14S~=_jfl z${S=wRHewZBdqRPLiU8G36w2xD%{)cj%=q%{aCZ0?IOI$klo?-*l*<6zUx0N=QsjZrJBfS4lf9r?j*H-H1ClPkI4m$8vc zH4T(l`rJdmxyt6#fUrYp{HT43%k}h&hdv#4I#hV>K<_%Ly^C1eSrrypoS3WKOx^X= zaB$Iqq5uBPf5!j#<xd%HB5i^&iNL@CM$J9Yus^L@ru+vb^!B6DpGA|8>v?m}E&4HjxaHO^ZPHaR{Qd=7*0LukJOrcgak=G7LFNoqeOH-Z$oMXYl zA``2Gmkt_xL{(|9tDv)j#RrjJ1n9Hmb>+lYCtG-th%>)%r_boP8OGwO&^WRX{klH_Uf1&HZAkcusPWnH;%SOxFBGytzd$lR^J9hpb! zHO|LYlijqb&|?poAJVIh%wb#w&7(Fpj~qCs!9(c0O7V6`wleaumD~%ap=iGa4LWZ- zoJ!KI_}q#k(w!U0Q8QD`_PXw*OLP-H?@}JZ=Uu9vj=f9JkI%a_6+Xwd@Em*6Od%r4 zF8VYGy_LxgLPzNKA#}SwY9M;ezJHUP>;o9xa&vXRAEQSeq$8c$DBUh?P`Z8YpmY~; z_t?jybgIs~;I?XVx+uNvEa$cwdbd$JdAf1y-B7ySwL7A8vhR*4-JXO#nekHSFiI!V z|07C|RE;B1B=*`-m&-TDrHyeHrH3N03qE@Tv5nJhD7J9A8#sW|?d-v+Hn2Q_AC_ zdTlJ#BI^hyWVV)CXF8_3+Ma_<&la}~q)#IdbGYiqTV;h6=iUr253}e1aE-SqgmOdy zy)kbP*&6q`{z{?%-FS1lE2EaaKY Date: Mon, 3 Feb 2025 17:25:37 +0000 Subject: [PATCH 81/83] Remove out of date gitignore entry. --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7b684fd..d1eaea0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -docs/source/ephys_at_swc/example_pipelines/auto_examples_ephys/ sg_execution_times.rst auto_examples_ephys From d23cdd8be86ed5c7cf4c4b2e97601c884686b3fb Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 3 Feb 2025 17:27:20 +0000 Subject: [PATCH 82/83] Small fixes. --- docs/source/conf.py | 1 - docs/source/index.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 2fd829b..73e48e2 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -96,7 +96,6 @@ linkcheck_anchors_ignore_for_url = [ "https://gin.g-node.org/G-Node/Info/wiki", "https://gin.g-node.org/G-Node/info/wiki", # ignore both spellings - "https://github.com/stephenlenzi/npix_lse", # ignore private repository ] linkcheck_retries = 2 diff --git a/docs/source/index.md b/docs/source/index.md index 4e572fa..51b66c9 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -6,7 +6,7 @@ The website is maintained by members of the [Neuroinformatics Unit](https://neur ## Main sections -The guides are organised into four main sections: +The guides are organised into three main sections: ::::{grid} 1 2 2 2 :gutter: 3 From 015c5aa1147e5958c152e32329a8c676c5fc026e Mon Sep 17 00:00:00 2001 From: JoeZiminski Date: Mon, 3 Feb 2025 17:27:55 +0000 Subject: [PATCH 83/83] Revert grid on main inde.x --- docs/source/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index 51b66c9..109a66f 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -8,7 +8,7 @@ The website is maintained by members of the [Neuroinformatics Unit](https://neur ## Main sections The guides are organised into three main sections: -::::{grid} 1 2 2 2 +::::{grid} 1 2 2 3 :gutter: 3 :::{grid-item-card} {fas}`chart-simple;sd-text-primary` Data Analysis