Deep learning-assisted mapping of dendritic spines using sequential 2D two-photon calcium imaging.
The 21 matches · 1 of them tie a paragraph to a whole file, not to given lines: a weak match, whose lines are not tinted
- [1] § STAR★Methods › Method details › ROI design and optimization ↔ src/ROIpy/core/structures.py, lines 289–402 · score 0.94 · longitudinal axis, bin factor, fill fraction, frame flyback, start position, dwell
- [2] § STAR★Methods › Method details › DeepD3 training and inference ↔ src/spyne/core/spines/analysis/segmentation/post_processing.py, lines 68–113 · score 0.92 · peak local max, cv2.distanceTransform, binary masks, post processed, dendritic mask, spine masks
- [3] § STAR★Methods › Method details › ROI design and optimization ↔ src/ROIpy/core/makeroi/make_roi.py, lines 12–149 · score 0.90 · Coplanar nodes, neuronal morphologies, dendritic ROIs, scan period, farthest, frame rate
- [4] § STAR★Methods › Method details › Calcium event classifier training and inference ↔ calcium_event_classifier/core/train_loop.py, lines 21–89 · score 0.88 · torch nn, PyTorch, validation loss, loss function, F1 score, recall
- [5] § STAR★Methods › Method details › DeepD3 training and inference ↔ src/spyne/core/spines/analysis/segmentation/pipeline.py, lines 176–254 · score 0.85 · cv2.distanceTransform, dendrites probability maps, binary masks, post processed, algorithm, inference
- [6] § STAR★Methods › Method details › Calcium event classifier training and inference ↔ calcium_event_classifier/core/classifier_dff.py, lines 63–145 · score 0.84 · fully connected layer, residual blocks, PyTorch, dropout, flattened, leaky
- [7] § Results › ROIpy produces rectangular ROIs aligned with dendritic trajectories ↔ src/ROIpy/core/makeroi/make_roi.py, lines 12–149 · score 0.80 · Short rectangles, apical dendrites, neuronal morphology, coverage, frame rate, elongating
- [8] § STAR★Methods › Method details › ROI design and optimization ↔ src/ROIpy/core/structures.py, lines 289–402 · score 0.80 · numerical aperture, starting position, um ratio, Nyquist, laser, wavelength
- [9] § STAR★Methods › Method details › Calcium imaging and analysis ↔ src/spyne/core/spines/analysis/timeseries/timeseries.py, lines 28–87 · score 0.78 · dilated spine, area outside, spine masks, disk, neuropil, dilation
- [10] § Results › Custom deep learning classifier automatically identifies active spines ↔ calcium_event_classifier/core/classifier_dff.py, lines 5–60 · score 0.77 · leaky ReLU, residual block, Skip connections, convolutional layer, batch normalization, activation
- [11] § Results › Custom deep learning classifier automatically identifies active spines ↔ calcium_event_classifier/core/train_loop.py, lines 201–266 · score 0.68 · precision recall, validation loss, F1 score, calcium event, curve, trained
- [12] § Results › ROIpy produces rectangular ROIs aligned with dendritic trajectories ↔ src/ROIpy/core/components.py, lines 36–175 · score 0.67 · ScanImage, child, encodes, density, volume, compartment
- [13] § STAR★Methods › Method details › Calcium imaging and analysis ↔ src/spyne/core/spines/analysis/timeseries/pipeline.py, lines 9–70 · score 0.67 · background signal, contamination, dilated, disk, neuropil, dilation
- [14] § Results › Mapping dendritic spines from discrete 2D ROIs ↔ src/spyne/core/spines/analysis/timeseries/timeseries.py, lines 91–190 · score 0.65 · modified Okada filter, spine masks, rolling, background, fraction, baseline
- [15] § Results › Mapping dendritic spines from discrete 2D ROIs ↔ src/spyne/core/spines/analysis/__init__.py, the whole file · a weak match · score 0.62 · modified Okada filter, dendritic spines, calcium event, centroid, transformation, inference
- [16] § STAR★Methods › Method details › ROI design and optimization ↔ src/spyne/core/imaging/visualization.py, lines 17–131 · score 0.61 · scan duration, frame period, frame rate, loop, allocated, dimension
- [17] § STAR★Methods › Method details › Gated PMTs artifact correction ↔ src/spyne/core/imaging/load.py, lines 391–443 · score 0.59 · Gating artifact correction, stripe, PMTs, channel, scanning, frame
- [18] § STAR★Methods › Method details › CSBDeep model training for CARE ↔ calcium_event_classifier/core/train_loop.py, lines 21–89 · score 0.58 · validation loss, loss function, epochs, optimizer, trained, model
- [19] § STAR★Methods › Method details › CSBDeep model training for CARE ↔ src/spyne/core/spines/analysis/backends/csbdeep_backend.py, lines 51–74 · score 0.58 · CSBDeep, quality, restoration
- [20] § STAR★Methods › Method details › Logistic regression classifier ↔ calcium_event_classifier/core/inference.py, lines 7–40 · score 0.54 · neural network, calcium event, Hyperparameters, weight, classifier, train
- [21] § STAR★Methods › Method details › Patch-clamp electrophysiology ↔ src/spyne/core/electrophysiology/analysis/pyabf_passive_props.py, lines 139–257 · score 0.53 · access resistance, isolated, pulses, electrode, slices, min
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 315 lines · 10 KB · no license · 3 matches
- """ Created on Tue Jul 8 14:46:08 2025
- @author: dcupolillo """
- import torch
- from torch.optim.lr_scheduler import ReduceLROnPlateau
- from torch.utils.data import DataLoader
- import torch.nn as nn
- import copy
- import time
- from tqdm import tqdm
- from sklearn.metrics import (
- f1_score, precision_recall_curve, average_precision_score)
- import numpy as np
- def compute_l1_regularization(model) -> float:
- return sum(p.abs().sum() for p in model.parameters())
- def train(
- train_loader: DataLoader,
- valid_loader: DataLoader,
- model: nn.Module,
- criterion: torch.nn.modules.loss,
- device: str,
- epochs: int,
- learning_rate: float,
- lr_drop_factor: float,
- lr_drop_patience: int,
- lambda1: float,
- lambda2: float,
- patience: int,
- ) -> tuple:
- """
- Train a model with early stopping and optional latent feature extraction.
- Parameters
- ----------
- train_loader : DataLoader
- DataLoader for training data.
- valid_loader : DataLoader
- DataLoader for validation data.
- model : nn.Module
- PyTorch model to train.
- criterion: torch.nn.modules.loss,
- Loss function.
- device : str
- Device identifier ("cpu" or "cuda").
- epochs : int
- Maximum number of training epochs.
- learning_rate : float
- Initial learning rate for the optimizer.
- lambda1 : float
- L1 regularization weight.
- lambda2 : float
- L2 regularization weight (weight decay).
- patience : int
- Number of epochs with no improvement before early stopping.
- Returns
- -------
- model : nn.Module
- Best-performing model on the validation set.
- train_loss : list of float
- Training loss per epoch.
- validation_loss : list of float
- Validation loss per epoch.
- train_f1 : list of float
- F1 score on the training set per epoch.
- validation_f1 : list of float
- F1 score on the validation set per epoch.
- validation_precision : list of float
- Precision on the validation set per epoch.
- validation_recall : list of float
- Recall on the validation set per epoch.
- best_thresholds : list of float
- Optimal classification threshold per epoch.
- validation_auc_pr : list of float
- AUC-PR score per epoch.
- valid_epoch_features : list of torch.Tensor or None
- Latent features from validation set per epoch (if available).
- valid_epoch_labels : list of torch.Tensor or None
- Corresponding labels for validation features (if available).
- train_epoch_features : list of torch.Tensor or None
- Latent features from training set per epoch (if available).
- train_epoch_labels : list of torch.Tensor or None
- Corresponding labels for training features (if available).
- """
- model.to(device)
- optimizer = torch.optim.Adam(
- model.parameters(),
- lr=learning_rate,
- weight_decay=lambda2,
- amsgrad=True
- )
- scheduler = ReduceLROnPlateau(
- optimizer,
- mode='min',
- factor=lr_drop_factor,
- patience=lr_drop_patience,
- verbose=True
- )
- train_loss, validation_loss = [], []
- train_f1, validation_f1 = [], []
- validation_precision, validation_recall, best_thresholds = [], [], []
- validation_auc_pr = []
- valid_epoch_features = []
- valid_epoch_labels = []
- train_epoch_features = []
- train_epoch_labels = []
- best_loss = float('inf')
- best_model = copy.deepcopy(model)
- wait = 0
- print("======================================")
- print(" #### Training ####")
- print("======================================\n")
- start_time = time.time()
- for epoch in range(epochs):
- # Training
- model.train()
- running_loss = 0.0
- total_train_samples = 0
- all_preds = []
- all_targets = []
- all_train_feats = []
- # Looping through all the traces
- for data, target in tqdm(
- train_loader, desc=f"Training Epoch {epoch+1}/{epochs}"):
- if data.ndim == 2:
- data = data.unsqueeze(1).float() # (B, T) → (B, 1, T)
- elif data.ndim == 3:
- data = data.float() # already [B, C, T]
- # Change dtype before sending to device
- # data = data.float().unsqueeze(1).to(device)
- target = target.float().view(-1, 1)
- data, target = data.to(device), target.to(device)
- optimizer.zero_grad()
- # Forward pass
- features, logits = model(data, return_features=True)
- loss = criterion(logits, target)
- probs = torch.sigmoid(logits)
- l1_norm = compute_l1_regularization(model)
- loss += lambda1 * l1_norm
- # ...smoothing loss removed...
- running_loss += loss.item() * data.size(0)
- total_train_samples += data.size(0)
- loss.backward() # Backpropagate
- optimizer.step() # Update weights
- all_preds.extend(probs.detach().cpu().numpy().flatten())
- all_targets.extend(target.detach().cpu().numpy().flatten())
- all_train_feats.append(features.detach().cpu())
- # Compute average loss and prec./recall for training across batches
- avg_train_loss = running_loss / total_train_samples
- train_loss.append(avg_train_loss)
- precision, recall, thresholds = precision_recall_curve(
- all_targets, all_preds)
- precision_ = precision[1:]
- recall_ = recall[1:]
- f1_scores = 2 * (precision_ * recall_) / (precision_ + recall_ + 1e-8)
- if len(thresholds) > 0:
- best_idx = np.argmax(f1_scores)
- best_threshold = thresholds[best_idx]
- else:
- # degenerate case: all_preds identical; fall back to 0.5
- best_idx = 0
- best_threshold = 0.5
- binarized_preds = (
- np.array(all_preds) >= best_threshold).astype(int)
- train_f1.append(
- f1_score(all_targets, binarized_preds, zero_division=0))
- train_epoch_features.append(torch.cat(all_train_feats))
- train_epoch_labels.append(torch.tensor(all_targets))
- # Validation
- model.eval()
- running_loss = 0.0
- total_valid_samples = 0
- all_preds = []
- all_targets = []
- all_valid_feats = []
- with torch.no_grad(): # Disable gradient calculation for validation
- for data, target in valid_loader:
- if data.ndim == 2: # [B, T]
- data = data.unsqueeze(1) # → [B, 1, T]
- elif data.ndim == 3:
- data = data # already [B, C, T]
- target = target.float()
- target = target.view(-1, 1)
- data, target = data.to(device), target.to(device)
- features, logits = model(data, return_features=True)
- loss = criterion(logits, target)
- probs = torch.sigmoid(logits)
- running_loss += loss.item() * data.size(0)
- total_valid_samples += data.size(0)
- all_preds.extend(probs.detach().cpu().numpy().flatten())
- all_targets.extend(target.detach().cpu().numpy().flatten())
- all_valid_feats.append(features.cpu())
- # Compute average loss and prec./recall for validation
- avg_valid_loss = running_loss / total_valid_samples
- validation_loss.append(avg_valid_loss)
- precision, recall, thresholds = precision_recall_curve(
- all_targets, all_preds)
- precision_ = precision[1:]
- recall_ = recall[1:]
- f1_scores = 2 * (precision_ * recall_) / (precision_ + recall_ + 1e-8)
- if len(thresholds) > 0:
- best_idx = np.argmax(f1_scores)
- best_threshold = thresholds[best_idx]
- val_f1 = f1_scores[best_idx]
- else:
- best_idx = 0
- best_threshold = 0.5
- # compute F1 at this fixed threshold for logging
- bin_preds = (np.array(all_preds) >= best_threshold).astype(int)
- val_f1 = f1_score(all_targets, bin_preds, zero_division=0)
- val_auc_pr = average_precision_score(all_targets, all_preds)
- validation_f1.append(val_f1)
- validation_precision.append(precision[best_idx])
- validation_recall.append(recall[best_idx])
- best_thresholds.append(best_threshold)
- validation_auc_pr.append(val_auc_pr)
- valid_epoch_features.append(torch.cat(all_valid_feats))
- valid_epoch_labels.append(torch.tensor(all_targets))
- # Eventually, reduces learning rate
- scheduler.step(avg_valid_loss)
- # Early Stopping Check based on accuracy
- if avg_valid_loss < best_loss: # check if new best loss
- best_loss = avg_valid_loss
- best_model = copy.deepcopy(model)
- wait = 0
- else:
- # if loss is not improving, increase the wait until patience
- wait += 1
- if wait > patience:
- print(f"Early stopping at epoch: {epoch+1}")
- break
- print(
- f"Epoch {epoch+1}: "
- f"🔵 Train loss: {avg_train_loss:.2f} | "
- f"🟢 Val loss: {avg_valid_loss:.2f} | "
- f"🎯 Val F1: {validation_f1[-1]:.3f} @ thr={best_threshold:.2f} | "
- f"🔻 Prec: {validation_precision[-1]:.3f}, "
- f"Rec: {validation_recall[-1]:.3f} | "
- f"🏆 Best loss: {best_loss:.2f}"
- )
- end_time = time.time()
- training_time = (
- time.strftime("%H:%M:%S", time.gmtime(end_time - start_time)))
- print(f"\n🕒 Time for training: {training_time}")
- print("======================================\n")
- return (
- best_model,
- train_loss,
- validation_loss,
- train_f1,
- validation_f1,
- validation_precision,
- validation_recall,
- best_thresholds,
- validation_auc_pr,
- valid_epoch_features,
- valid_epoch_labels,
- train_epoch_features,
- train_epoch_labels
- )
train_loop.py at commit 8d12d2a, no license · at the source
Overview
- Istituto Italiano di Tecnologia, Synaptic Plasticity of Inhibitory Networks, 16163 Genova, Italy
- The Open University, School of Life, Health and Chemical Sciences, Milton Keynes MK7 6AA, UK
Abstract
Neurons transform complex spatiotemporal synaptic inputs into structured action potential sequences. Excitatory inputs initiate or interact with dendritic spikes or plateau potentials, adding computational layers that diversify input-output transformations. Because synapse location strategically shapes the dendritic events, mapping synaptic organization is critical for understanding neuronal function. Spine calcium imaging offers a direct readout of active contact location but requires access to spines distributed across intricate three-dimensional dendrites. We present a software pipeline for targeted dendritic imaging and analysis using sequential two-dimensional scanning on standard two-photon microscopes. It includes a ScanImage-compatible pre-acquisition tool, ROIpy, which generates dendrite-aligned region-of-interests (ROIs) for depth-specific dendritic imaging, and a post-acquisition suite, Spyne, which includes deep learning modules for spine detection and binary classification of calcium activity (active vs. non-active spines). This method accommodates diverse experimental designs, including two-photon imaging with patch-clamp or all-optical setups, supporting whole-arbor or branch-specific imaging.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 21 matches between paragraphs and lines of code.
dcupolillo/ROIpy
7f920ed31f0ec41ae27fd935c5519dd7ba9a0143, 13 July 2026Availability: 1 check, the latest on 26 September 2026: the link answers
- 26 September 2026: the link answers
21 files
- assets/
palette.py , Python, 98 lines - getting_started.py, Python, 47 lines
- src/
ROIpy/ , Python, 379 linesGUIv2/ canvas.py - src/
ROIpy/ , Python, 132 linesGUIv2/ load_frame.py - src/
ROIpy/ , Python, 117 linesGUIv2/ main.py - src/
ROIpy/ , Python, 212 linesGUIv2/ plot_structures_controll er.py - src/
ROIpy/ , Python, 96 linesGUIv2/ save_files.py - src/
ROIpy/ , Python, 140 linesGUIv2/ scan_parameters.py - src/
ROIpy/ , Python, 54 lines__init__.py - src/
ROIpy/ , Python, 48 linesanalysis/ savejson.py - src/
ROIpy/ , Python, 522 linesanalysis/ stats.py - src/
ROIpy/ , Python, 1 linecore/ __init__.py - src/
ROIpy/ , Python, 635 linescore/ bundles.py - src/
ROIpy/ , Python, 624 lines, 1 matchcore/ components.py - src/
ROIpy/ , Python, 1,863 lines, 2 matchescore/ makeroi/ make_roi.py - src/
ROIpy/ , Python, 357 linescore/ makeroi/ roi_file.py - src/
ROIpy/ , Python, 616 lines, 2 matchescore/ structures.py - src/
ROIpy/ , Python, 428 linescore/ utils/ utils.py - src/
ROIpy/ , Python, 1,599 linesplot/ plot.py - LICENSE, License, 21 lines
- README.md, Text, 159 lines
Zenodo 21334250
Availability: 1 check, the latest on 26 September 2026: the link answers (HTTP 200)
- 26 September 2026: the link answers (HTTP 200)
21 files
- assets/
palette.py , Python, 98 lines - getting_started.py, Python, 47 lines
- src/
ROIpy/ , Python, 379 linesGUIv2/ canvas.py - src/
ROIpy/ , Python, 132 linesGUIv2/ load_frame.py - src/
ROIpy/ , Python, 117 linesGUIv2/ main.py - src/
ROIpy/ , Python, 212 linesGUIv2/ plot_structures_controll er.py - src/
ROIpy/ , Python, 96 linesGUIv2/ save_files.py - src/
ROIpy/ , Python, 140 linesGUIv2/ scan_parameters.py - src/
ROIpy/ , Python, 54 lines__init__.py - src/
ROIpy/ , Python, 48 linesanalysis/ savejson.py - src/
ROIpy/ , Python, 522 linesanalysis/ stats.py - src/
ROIpy/ , Python, 1 linecore/ __init__.py - src/
ROIpy/ , Python, 635 linescore/ bundles.py - src/
ROIpy/ , Python, 624 linescore/ components.py - src/
ROIpy/ , Python, 1,863 linescore/ makeroi/ make_roi.py - src/
ROIpy/ , Python, 357 linescore/ makeroi/ roi_file.py - src/
ROIpy/ , Python, 616 linescore/ structures.py - src/
ROIpy/ , Python, 428 linescore/ utils/ utils.py - src/
ROIpy/ , Python, 1,599 linesplot/ plot.py - LICENSE, License, 21 lines
- README.md, Text, 157 lines
dcupolillo/spyne
9c7ad551825afd866afda24f6094acb9218efd1d, 13 July 2026Availability: 1 check, the latest on 26 September 2026: the link answers
- 26 September 2026: the link answers
55 files
- getting_started.py, Python, 61 lines
- src/
spyne/ , Python, 1 lineGUI/ __init__.py - src/
spyne/ , Python, 166 linesGUI/ dataset_roi.py - src/
spyne/ , Python, 479 linesGUI/ display.py - src/
spyne/ , Python, 138 linesGUI/ load.py - src/
spyne/ , Python, 221 linesGUI/ main.py - src/
spyne/ , Python, 67 linesGUI/ utils.py - src/
spyne/ , Python, 37 lines__init__.py - src/
spyne/ , Python, 2 linescore/ __init__.py - src/
spyne/ , Python, 1 linecore/ electrophysiology/ __init__.py - src/
spyne/ , Python, 11 linescore/ electrophysiology/ analysis/ __init__.py - src/
spyne/ , Python, 463 lines, 1 matchcore/ electrophysiology/ analysis/ pyabf_passive_props.py - src/
spyne/ , Python, 682 linescore/ electrophysiology/ analysis/ synaptic_events.py - src/
spyne/ , Python, 192 linescore/ electrophysiology/ config.py - src/
spyne/ , Python, 802 linescore/ electrophysiology/ ephydataset.py - src/
spyne/ , Python, 41 linescore/ electrophysiology/ io.py - src/
spyne/ , Python, 244 linescore/ electrophysiology/ load.py - src/
spyne/ , Python, 1 linecore/ imaging/ __init__.py - src/
spyne/ , Python, 152 linescore/ imaging/ config.py - src/
spyne/ , Python, 383 linescore/ imaging/ dataloader.py - src/
spyne/ , Python, 1,096 linescore/ imaging/ imagingdataset.py - src/
spyne/ , Python, 443 lines, 1 matchcore/ imaging/ load.py - src/
spyne/ , Python, 37 linescore/ imaging/ preprocessing/ __init__.py - src/
spyne/ , Python, 216 linescore/ imaging/ preprocessing/ artifacts.py - src/
spyne/ , Python, 190 linescore/ imaging/ preprocessing/ denoise.py - src/
spyne/ , Python, 71 linescore/ imaging/ preprocessing/ filters.py - src/
spyne/ , Python, 346 lines, 1 matchcore/ imaging/ visualization.py - src/
spyne/ , Python, 1 linecore/ spines/ __init__.py - src/
spyne/ , Python, 44 lines, 1 matchcore/ spines/ analysis/ __init__.py - src/
spyne/ , Python, 30 linescore/ spines/ analysis/ backends/ __init__.py - src/
spyne/ , Python, 287 linescore/ spines/ analysis/ backends/ base_backend.py - src/
spyne/ , Python, 336 lines, 1 matchcore/ spines/ analysis/ backends/ csbdeep_backend.py - src/
spyne/ , Python, 399 linescore/ spines/ analysis/ backends/ deepd3_backend.py - src/
spyne/ , Python, 536 linescore/ spines/ analysis/ backends/ nnUnet_backend.py - src/
spyne/ , Python, 13 linescore/ spines/ analysis/ denoise/ __init__.py - src/
spyne/ , Python, 210 linescore/ spines/ analysis/ denoise/ pipeline.py - src/
spyne/ , Python, 225 linescore/ spines/ analysis/ padding.py - src/
spyne/ , Python, 1 linecore/ spines/ analysis/ segmentation/ __init__.py - src/
spyne/ , Python, 530 lines, 1 matchcore/ spines/ analysis/ segmentation/ pipeline.py - src/
spyne/ , Python, 322 lines, 1 matchcore/ spines/ analysis/ segmentation/ post_processing.py - src/
spyne/ , Python, 350 linescore/ spines/ analysis/ segmentation/ post_processing_utils.py - src/
spyne/ , Python, 318 linescore/ spines/ analysis/ spatial_distances.py - src/
spyne/ , Python, 1 linecore/ spines/ analysis/ timeseries/ __init__.py - src/
spyne/ , Python, 219 linescore/ spines/ analysis/ timeseries/ event_detection.py - src/
spyne/ , Python, 79 linescore/ spines/ analysis/ timeseries/ filters.py - src/
spyne/ , Python, 203 lines, 1 matchcore/ spines/ analysis/ timeseries/ pipeline.py - src/
spyne/ , Python, 297 lines, 2 matchescore/ spines/ analysis/ timeseries/ timeseries.py - src/
spyne/ , Python, 417 linescore/ spines/ config.py - src/
spyne/ , Python, 661 linescore/ spines/ dataframe.py - src/
spyne/ , Python, 379 linescore/ spines/ dataloader.py - src/
spyne/ , Python, 744 linescore/ spines/ pipeline.py - src/
spyne/ , Python, 1,648 linescore/ spines/ spinedataset.py - src/
spyne/ , Python, 18 linesplot/ __init__.py - src/
spyne/ , Python, 1,222 linesplot/ plot.py - README.md, Text, 139 lines
Zenodo 21334656
Availability: 1 check, the latest on 26 September 2026: the link answers (HTTP 200)
- 26 September 2026: the link answers (HTTP 200)
55 files
- getting_started.py, Python, 61 lines
- src/
spyne/ , Python, 1 lineGUI/ __init__.py - src/
spyne/ , Python, 166 linesGUI/ dataset_roi.py - src/
spyne/ , Python, 479 linesGUI/ display.py - src/
spyne/ , Python, 138 linesGUI/ load.py - src/
spyne/ , Python, 221 linesGUI/ main.py - src/
spyne/ , Python, 67 linesGUI/ utils.py - src/
spyne/ , Python, 37 lines__init__.py - src/
spyne/ , Python, 2 linescore/ __init__.py - src/
spyne/ , Python, 1 linecore/ electrophysiology/ __init__.py - src/
spyne/ , Python, 11 linescore/ electrophysiology/ analysis/ __init__.py - src/
spyne/ , Python, 463 linescore/ electrophysiology/ analysis/ pyabf_passive_props.py - src/
spyne/ , Python, 682 linescore/ electrophysiology/ analysis/ synaptic_events.py - src/
spyne/ , Python, 192 linescore/ electrophysiology/ config.py - src/
spyne/ , Python, 802 linescore/ electrophysiology/ ephydataset.py - src/
spyne/ , Python, 41 linescore/ electrophysiology/ io.py - src/
spyne/ , Python, 244 linescore/ electrophysiology/ load.py - src/
spyne/ , Python, 1 linecore/ imaging/ __init__.py - src/
spyne/ , Python, 152 linescore/ imaging/ config.py - src/
spyne/ , Python, 383 linescore/ imaging/ dataloader.py - src/
spyne/ , Python, 1,096 linescore/ imaging/ imagingdataset.py - src/
spyne/ , Python, 443 linescore/ imaging/ load.py - src/
spyne/ , Python, 37 linescore/ imaging/ preprocessing/ __init__.py - src/
spyne/ , Python, 216 linescore/ imaging/ preprocessing/ artifacts.py - src/
spyne/ , Python, 190 linescore/ imaging/ preprocessing/ denoise.py - src/
spyne/ , Python, 71 linescore/ imaging/ preprocessing/ filters.py - src/
spyne/ , Python, 346 linescore/ imaging/ visualization.py - src/
spyne/ , Python, 1 linecore/ spines/ __init__.py - src/
spyne/ , Python, 44 linescore/ spines/ analysis/ __init__.py - src/
spyne/ , Python, 30 linescore/ spines/ analysis/ backends/ __init__.py - src/
spyne/ , Python, 287 linescore/ spines/ analysis/ backends/ base_backend.py - src/
spyne/ , Python, 336 linescore/ spines/ analysis/ backends/ csbdeep_backend.py - src/
spyne/ , Python, 399 linescore/ spines/ analysis/ backends/ deepd3_backend.py - src/
spyne/ , Python, 536 linescore/ spines/ analysis/ backends/ nnUnet_backend.py - src/
spyne/ , Python, 13 linescore/ spines/ analysis/ denoise/ __init__.py - src/
spyne/ , Python, 210 linescore/ spines/ analysis/ denoise/ pipeline.py - src/
spyne/ , Python, 225 linescore/ spines/ analysis/ padding.py - src/
spyne/ , Python, 1 linecore/ spines/ analysis/ segmentation/ __init__.py - src/
spyne/ , Python, 530 linescore/ spines/ analysis/ segmentation/ pipeline.py - src/
spyne/ , Python, 322 linescore/ spines/ analysis/ segmentation/ post_processing.py - src/
spyne/ , Python, 350 linescore/ spines/ analysis/ segmentation/ post_processing_utils.py - src/
spyne/ , Python, 318 linescore/ spines/ analysis/ spatial_distances.py - src/
spyne/ , Python, 1 linecore/ spines/ analysis/ timeseries/ __init__.py - src/
spyne/ , Python, 219 linescore/ spines/ analysis/ timeseries/ event_detection.py - src/
spyne/ , Python, 79 linescore/ spines/ analysis/ timeseries/ filters.py - src/
spyne/ , Python, 203 linescore/ spines/ analysis/ timeseries/ pipeline.py - src/
spyne/ , Python, 297 linescore/ spines/ analysis/ timeseries/ timeseries.py - src/
spyne/ , Python, 417 linescore/ spines/ config.py - src/
spyne/ , Python, 661 linescore/ spines/ dataframe.py - src/
spyne/ , Python, 379 linescore/ spines/ dataloader.py - src/
spyne/ , Python, 744 linescore/ spines/ pipeline.py - src/
spyne/ , Python, 1,648 linescore/ spines/ spinedataset.py - src/
spyne/ , Python, 18 linesplot/ __init__.py - src/
spyne/ , Python, 1,222 linesplot/ plot.py - README.md, Text, 139 lines
dcupolillo/calcium_event_classifier
8d12d2a910a7c70501b59b8183a39a54b785a131, 13 July 2026Availability: 1 check, the latest on 26 September 2026: the link answers
- 26 September 2026: the link answers
15 files
- calcium_event_classifier
/ , Python, 36 lines__init__.py - calcium_event_classifier
/ , Python, 507 linesbuild_dataset/ GUI.py - calcium_event_classifier
/ , Python, 495 linesbuild_dataset/ manage_h5_files.py - calcium_event_classifier
/ , Python, 418 linesbuild_dataset/ manual_annotation_gui.py - calcium_event_classifier
/ , Python, 1 linecore/ __init__.py - calcium_event_classifier
/ , Python, 145 lines, 2 matchescore/ classifier_dff.py - calcium_event_classifier
/ , Python, 143 linescore/ dffdataset.py - calcium_event_classifier
/ , Python, 99 lines, 1 matchcore/ inference.py - calcium_event_classifier
/ , Python, 479 linescore/ plot.py - calcium_event_classifier
/ , Python, 315 lines, 3 matchescore/ train_loop.py - calcium_event_classifier
/ , Python, 292 linescore/ utils.py - examples/
manual_annotations.ipynb , Jupyter, 242 lines - examples/
test_classifier_dff.ipyn , Jupyter, 319 linesb - examples/
train_model_dff.ipynb , Jupyter, 306 lines - README.md, Text, 7 lines
Zenodo 21334890
Availability: 1 check, the latest on 26 September 2026: the link answers (HTTP 200)
- 26 September 2026: the link answers (HTTP 200)
15 files
- calcium_event_classifier
/ , Python, 36 lines__init__.py - calcium_event_classifier
/ , Python, 507 linesbuild_dataset/ GUI.py - calcium_event_classifier
/ , Python, 495 linesbuild_dataset/ manage_h5_files.py - calcium_event_classifier
/ , Python, 418 linesbuild_dataset/ manual_annotation_gui.py - calcium_event_classifier
/ , Python, 1 linecore/ __init__.py - calcium_event_classifier
/ , Python, 145 linescore/ classifier_dff.py - calcium_event_classifier
/ , Python, 143 linescore/ dffdataset.py - calcium_event_classifier
/ , Python, 99 linescore/ inference.py - calcium_event_classifier
/ , Python, 479 linescore/ plot.py - calcium_event_classifier
/ , Python, 315 linescore/ train_loop.py - calcium_event_classifier
/ , Python, 292 linescore/ utils.py - examples/
manual_annotations.ipynb , Jupyter, 242 lines - examples/
test_classifier_dff.ipyn , Jupyter, 319 linesb - examples/
train_model_dff.ipynb , Jupyter, 306 lines - README.md, Text, 7 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 6 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 174 scripts, each with its path and the digest of its content;
- 21 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data and code availability
• Data: The following data have been deposited at IIT-Dataverse and are publicly available as of the date of publication at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 3, 28 September 2026
- Authors: added Dario Cupolillo (0000-0002-1517-3815); removed Dario Cupolillo
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 7 keywords, 1 funder, 63 references, 15 RRIDs.
Cite
This paper
Cupolillo, D., Regio, V., Galleano, V., & Barberis, A. (2026). Deep learning-assisted mapping of dendritic spines using sequential 2D two-photon calcium imaging. iScience, 29(8), 117010. https://
BibTeX
@article{cupolillo2026de
author = {Cupolillo, Dario and Regio, Vincenzo and Galleano, Valentina and Barberis, Andrea},
title = {{Deep learning-assisted mapping of dendritic spines using sequential 2D two-photon calcium imaging}},
journal = {iScience},
year = {2026},
month = aug,
volume = {29},
number = {8},
pages = {117010},
publisher = {Elsevier},
issn = {2589-0042},
doi = {10.1016/
url = {https://
pmid = {42577014},
pmcid = {PMC13453581}
}
RIS
TY - JOUR
AU - Cupolillo, Dario
AU - Regio, Vincenzo
AU - Galleano, Valentina
AU - Barberis, Andrea
TI - Deep learning-assisted mapping of dendritic spines using sequential 2D two-photon calcium imaging
T2 - iScience
J2 - iScience
PY - 2026
DA - 2026/
VL - 29
IS - 8
SP - 117010
SN - 2589-0042
PB - Elsevier
DO - 10.1016/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1016/
"type": "article-journal",
"title": "Deep learning-assisted mapping of dendritic spines using sequential 2D two-photon calcium imaging",
"container-title": "iScience",
"author": [
{
"family": "Cupolillo",
"given": "Dario"
},
{
"family": "Regio",
"given": "Vincenzo"
},
{
"family": "Galleano",
"given": "Valentina"
},
{
"family": "Barberis",
"given": "Andrea"
}
],
"container-title-short":
"volume": "29",
"issue": "8",
"page": "117010",
"DOI": "10.1016/
"PMID": "42577014",
"PMCID": "PMC13453581",
"ISSN": "2589-0042",
"publisher": "Elsevier",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
1
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1016/j.celrep.2026.117793 [code]
- Clustered inputs engage dendritic nonlinearities and calcium signaling to support efficient place-field formation in CA1 pyramidal neurons.Journal: Cell reportsIn common: seaborn, scikit-learn, pandas, 3 other tools, cellular / molecular, 11 references
- [2] doi:10.1126/sciadv.aec3961 [code]
- Linking functional and structural dendritic spine remodeling during fear learning and extinction in vivo.Journal: Science advancesIn common: pandas, SciPy, Matplotlib, 1 other tool, histology / microscopy, 9 references
- [3] doi:10.1126/sciadv.adz4123 [code]
- Highly attenuated dendritic propagation of isolated synaptic potentials in vivo.Journal: Science advancesIn common: cellular / molecular, 11 references
- [4] doi:10.1371/journal.pcbi.1014571 [code]
- SynAPSeg: A novel dataset and image analysis framework for deep learning-based synapse detection and quantification.Journal: PLoS computational biologyIn common: tifffile, TensorFlow, OpenCV, 8 other tools, 2 references
- [5] doi:10.1073/pnas.2533168123 [code]
- Dendritic morphology and synaptic nonlinearities enhance functional complexity in human cortical neurons.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: PyTorch, scikit-learn, pandas, 3 other tools, cellular / molecular, 7 references
- [6] doi:10.7554/elife.111876 [code]
- Distinct sensorimotor encoding in tuft dendrites and somata associated with action, correction, and learning.Journal: eLifeIn common: tifffile, PyTorch, seaborn, 5 other tools, 5 references
- [7] doi:10.7554/elife.89629 [code]
- Active dendrites enable robust spiking computations despite timing jitter.Journal: eLifeIn common: seaborn, pandas, Matplotlib, 1 other tool, 8 references
- [8] doi:10.1016/j.bpj.2026.06.005 [code]
- Curvature-based machine-learning method for automated segmentation of dendritic spines.Journal: Biophysical journalIn common: TensorFlow, scikit-image, scikit-learn, 4 other tools, histology / microscopy, 3 references
- [9] doi:10.7554/elife.108352 [code]
- Analysis of dendritic input currents during place field dynamics.Journal: eLifeIn common: pandas, Matplotlib, NumPy, 7 references
- [10] doi:10.7554/elife.100880 [code]
- An applicable and efficient retrograde monosynaptic circuit mapping tool for larval zebrafish.Journal: eLifeIn common: tifffile, OpenCV, scikit-image, 6 other tools, 2 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 6 repositories of the authors' code, each at its verified commit and with its license, 174 scripts, and 21 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:1f284cc3a4228df8…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
