Voltage imaging of neurons distributed across entire brains of larval zebrafish.
The 1 match
- [1] § Methods › Data processing › ROI temporal trace extraction ↔ data_extraction/fish_single_layer_manual.py, lines 244–290 · score 0.72 · adaptive thresholding, trace denoising, spike extraction, filters, background, ROI
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 · 407 lines · 18 KB · CC-BY-4.0 · 1 match
- #!/usr/bin/env python
- """
- pipeline for processing voltage imaging data for zebrafish lightsheet data
- author: @Jack Zhang
- """
- import scipy.io as sio
- import cv2
- import os
- import glob
- import h5py
- import logging
- import matplotlib.pyplot as plt
- from matplotlib.pyplot import savefig
- import numpy as np
- import os
- try:
- cv2.setNumThreads(0)
- except:
- pass
- try:
- if __IPYTHON__:
- # this is used for debugging purposes only. allows to reload classes
- # when changed
- get_ipython().magic('load_ext autoreload')
- get_ipython().magic('autoreload 2')
- except NameError:
- pass
- import caiman as cm
- from caiman.motion_correction import MotionCorrect
- from caiman.paths import caiman_datadir
- from caiman.source_extraction.volpy import utils
- from caiman.source_extraction.volpy.volparams import volparams
- from caiman.source_extraction.volpy.volpy import VOLPY
- from caiman.summary_images import local_correlations_movie_offline
- from caiman.summary_images import mean_image
- from caiman.utils.utils import download_demo, download_model
- from caiman.source_extraction.volpy.mrcnn import visualize
- # %%
- # Set up the logger (optional); change this if you like.
- # You can log to a file using the filename parameter, or make the output more
- # or less verbose by setting level to logging.DEBUG, logging.INFO,
- # logging.WARNING, or logging.ERROR
- logging.basicConfig(format=
- "%(relativeCreated)12d [%(filename)s:%(funcName)20s():%(lineno)s]" \
- "[%(process)d] %(message)s",
- level=logging.INFO)
- # %%
- def volpy_process_session(trial_1_dir, trial_2_dir, layer_name):
- pass # For compatibility between running under Spyder and the CLI
- # %% Load demo movie and ROIs
- # fnames = download_demo('demo_voltage_imaging.hdf5', 'volpy') # file path to movie file (will download if not present)
- #fnames = os.path.join(trial_1_dir + layer_name + '.tif' );
- fnames = []
- fnames.extend([os.path.join(trial_1_dir + '/raw/' + layer_name + '.hdf5' )]);
- fnames.extend([os.path.join(trial_2_dir + '/raw/' + layer_name + '.hdf5' )]);
- #path_ROIs = download_demo('demo_voltage_imaging_ROIs.hdf5', 'volpy') # file path to ROIs file (will download if not present)
- file_dir = os.path.split(fnames[0])[0]
- tempDir = '/home/jack/Caiman_Workfolder/Movies/'
- #%% dataset dependent parameters
- # dataset dependent parameters
- fr = 200 # sample rate of the movie
- # motion correction parameterspath_ROIs
- pw_rigid = False # flag for pw-rigid motion correction
- gSig_filt = (4, 4) # size of filter, in general gSig (see below),
- # change this one if algorithm does not work
- max_shifts = (6, 6) # maximum allowed rigid shift
- strides = (64, 64) # start a new patch for pw-rigid motion correction every x pixels
- overlaps = (32, 32) # overlap between pathes (size of patch strides+overlaps)
- max_deviation_rigid = 5 # maximum deviation allowed for patch with respect to rigid shifts
- border_nan = 'copy'
- opts_dict = {
- 'fnames': fnames,
- 'fr': fr,
- 'pw_rigid': pw_rigid,
- 'max_shifts': max_shifts,
- 'gSig_filt': gSig_filt,
- 'strides': strides,
- 'overlaps': overlaps,
- 'max_deviation_rigid': max_deviation_rigid,
- 'border_nan': border_nan
- }
- opts = volparams(params_dict=opts_dict)
- # %% play the movie (optional)
- # playing the movie using opencv. It requires loading the movie in memory.
- # To close the movie press q
- display_images = False
- if display_images:
- m_orig = cm.load(fnames)
- ds_ratio = 0.2
- moviehandle = m_orig.resize(1, 1, ds_ratio)
- moviehandle.play(q_max=99.5, fr=40, magnification=4)
- # %% start a cluster for parallel processing
- c, dview, n_processes = cm.cluster.setup_cluster(
- backend='local', n_processes=None, single_thread=False)
- # %%% MOTION CORRECTION
- # first we create a motion correction object with the specified parameters
- mc = MotionCorrect(fnames, dview=dview, **opts.get_group('motion'))
- # Run correction
- do_motion_correction = True
- if do_motion_correction:
- mc.motion_correct(save_movie=True)
- plt.subplot(1, 2, 1); plt.imshow(mc.total_template_rig) # % plot template
- plt.subplot(1, 2, 2); plt.plot(mc.shifts_rig) # % plot rigid shifts
- plt.legend(['x shifts', 'y shifts'])
- plt.xlabel('frames')
- plt.ylabel('pixels')
- savefig(trial_1_dir +'/outline/' + layer_name + '_motion-correct.pdf', bbox_inches='tight')
- else:
- mc_list = [file for file in os.listdir(file_dir) if
- (os.path.splitext(os.path.split(fnames)[-1])[0] in file and '.mmap' in file)]
- mc.mmap_file = [os.path.join(file_dir, mc_list[0])]
- print(f'reuse previously saved motion corrected file:{mc.mmap_file}')
- # bord_px = np.ceil(np.max(np.abs(mc.shifts_rig))).astype(np.int)
- # %% compare with original movie
- if display_images:
- m_orig = cm.load(fnames)
- m_rig = cm.load(mc.mmap_file)
- ds_ratio = 0.2
- moviehandle = cm.concatenate([m_orig.resize(1, 1, ds_ratio),
- m_rig.resize(1, 1, ds_ratio)], axis=2)
- moviehandle.play(fr=40, q_max=99.5, magnification=4) # press q to exit
- # %% MEMORY MAPPING
- do_memory_mapping = True
- if do_memory_mapping:
- border_to_0 = 0 if mc.border_nan == 'copy' else mc.border_to_0
- # you can include the boundaries of the FOV if you used the 'copy' option
- # during motion correction, although be careful about the components near
- # the boundaries
- # memory map the file in order 'C'
- fname_new = cm.save_memmap_join(mc.mmap_file, base_name='memmap_' + os.path.splitext(os.path.split(fnames[0])[-1])[0],
- add_to_mov=border_to_0, dview=dview) # exclude border
- else:
- mmap_list = [file for file in os.listdir(file_dir) if
- ('memmap_' + os.path.splitext(os.path.split(fnames)[-1])[0]) in file]
- fname_new = os.path.join(file_dir, mmap_list[0])
- print(f'reuse previously saved memory mapping file:{fname_new}')
- # %% SEGMENTATION
- # create summary images
- img = mean_image(mc.mmap_file[0], window = 1000, dview=dview)
- img = (img-np.mean(img))/np.std(img)
- gaussian_blur = False # Use gaussian blur when there is too much noise in the video
- Cn = local_correlations_movie_offline(mc.mmap_file[0], fr=fr, window=fr*4,
- stride=fr*4, winSize_baseline=fr,
- remove_baseline=True, gaussian_blur=gaussian_blur,
- dview=dview).max(axis=0)
- img_corr = (Cn-np.mean(Cn))/np.std(Cn)
- summary_images = np.stack([img, img, img_corr], axis=0).astype(np.float32)
- # save summary images which are used in the VolPy GUI
- #cm.movie(summary_images).save(fnames[:-5] + '_summary_images.tif')
- fig, axs = plt.subplots(1, 2)
- axs[0].imshow(summary_images[0]); axs[1].imshow(summary_images[2])
- axs[0].set_title('mean image'); axs[1].set_title('corr image')
- #%% methods for segmentation
- methods_list = ['manual_annotation', # manual annotations need prepared annotated datasets in the same format as demo_voltage_imaging_ROIs.hdf5
- 'maskrcnn', # Mask R-CNN is a convolutional neural network trained for detecting neurons in summary images
- 'gui_annotation'] # use VolPy GUI to correct outputs of Mask R-CNN or annotate new datasets
- method = methods_list[2]
- if method == 'manual_annotation':
- with h5py.File(path_ROIs, 'r') as fl:
- ROIs = fl['mov'][()]
- elif method == 'maskrcnn':
- weights_path = download_model('mask_rcnn')
- ROIs = utils.mrcnn_inference(img=summary_images.transpose([1, 2, 0]), size_range=[3, 18],
- weights_path=weights_path, display_result=True, savedir=trial_1_dir, savename=layer_name) # size parameter decides size range of masks to be selected
- cm.movie(ROIs).save(fnames[0][:-5] + '_mrcnn_ROIs.hdf5')
- elif method == 'gui_annotation':
- # run volpy_gui.py file in the caiman/source_extraction/volpy folder
- # or run the following in the ipython: %run volpy_gui.py
- #gui_ROIs = caiman_datadir() + '/example_movies/volpy/gui_roi.hdf5'
- #gui_ROIs = '/media/jack/data/zebrafish/230820/Fish2_1/TIFF_files/layer_0_320_80_mrcnn_ROIs.hdf5'
- gui_ROIs = os.path.join(trial_1_dir + '/roi/' + layer_name + '_roi.hdf5' )
- with h5py.File(gui_ROIs, 'r') as fl:
- ROIs = fl['mov'][()]
- box = np.zeros([len(ROIs[:,0,0]),4],dtype=np.int32)
- #roi_id = list(range(len(ROIs[:,0,0])))
- roi_id = np.full((len(ROIs[:,0,0])),1,dtype=np.int32)
- for nn in range(len(ROIs[:,0,0])):
- xnzero = np.nonzero(np.sum(ROIs[nn,:,:], axis=0))
- x1 = xnzero[0][0]
- x2 = xnzero[0][-1]
- ynzero = np.nonzero(np.sum(ROIs[nn,:,:], axis=1))
- y1 = ynzero[0][0]
- y2 = ynzero[0][-1]
- box[nn] = y1, x1, y2, x2
- _, ax = plt.subplots(1,1, figsize=(16,16))
- sampleimg=summary_images.transpose([1, 2, 0])
- ROI_t = np.transpose(ROIs,(1, 2, 0))
- visualize.display_instances_no_contour(sampleimg, box, ROI_t, roi_id,
- ['BG', 'neurons'], roi_id, ax=ax, captions=None,
- title="Predictions")
- #visualize.display_instances(img=summary_images.transpose([1, 2, 0]), box, ROIs, roi_id, ['BG', 'neurons'], roi_id, ax=ax, title="Predictions")
- savefig(trial_1_dir +'/outline/' + layer_name + '_roi_outline.pdf', bbox_inches='tight')
- visualize.display_instances(sampleimg, box, ROI_t, roi_id,
- ['BG', 'neurons'], roi_id, ax=ax, captions=None,
- title="Predictions")
- #visualize.display_instances(img=summary_images.transpose([1, 2, 0]), box, ROIs, roi_id, ['BG', 'neurons'], roi_id, ax=ax, title="Predictions")
- savefig(trial_1_dir +'/outline/' + layer_name + '_roi_outline_contour.pdf', bbox_inches='tight')
- fig, axs = plt.subplots(1, 2)
- axs[0].imshow(summary_images[0]); axs[1].imshow(ROIs.sum(0))
- axs[0].set_title('mean image'); axs[1].set_title('masks')
- # %% restart cluster to clean up memory
- cm.stop_server(dview=dview)
- c, dview, n_processes = cm.cluster.setup_cluster(
- backend='local', n_processes=None, single_thread=False, maxtasksperchild=1)
- # %% parameters for trace denoising and spike extraction
- ROIs = ROIs # region of interests
- index = list(range(len(ROIs))) # index of neurons
- weights = None # if None, use ROIs for initialization; to reuse weights check reuse weights block
- template_size = 0.02 # half size of the window length for spike templates, default is 20 ms
- context_size = 35 # number of pixels surrounding the ROI to censor from the background PCA
- visualize_ROI = False # whether to visualize the region of interest inside the context region
- flip_signal = False # Important!! Flip signal or not, True for Voltron indicator, False for others
- hp_freq_pb = 1 / 3 # parameter for high-pass filter to remove photobleaching
- clip = 101 # maximum number of spikes to form spike template
- threshold_method = 'adaptive_threshold' #'adaptive_threshold' # adaptive_threshold or simple
- min_spikes= 4 # minimal spikes to be found
- pnorm = 0.5 # a variable deciding the amount of spikes chosen for adaptive threshold method
- threshold = 5 # threshold for finding spikes only used in simple threshold method, Increase the threshold to find less spikes
- do_plot = False # plot detail of spikes, template for the last iteration
- ridge_bg= 0.01 # ridge regression regularizer strength for background removement, larger value specifies stronger regularization
- sub_freq = 20 # frequency for subthreshold extraction
- weight_update = 'ridge' # ridge or NMF for weight update
- n_iter = 2 # number of iterations alternating between estimating spike times and spatial filters
- opts_dict={'fnames': fname_new,
- 'ROIs': ROIs,
- 'index': index,
- 'weights': weights,
- 'template_size': template_size,
- 'context_size': context_size,
- 'visualize_ROI': visualize_ROI,
- 'flip_signal': flip_signal,
- 'hp_freq_pb': hp_freq_pb,
- 'clip': clip,
- 'threshold_method': threshold_method,
- 'min_spikes':min_spikes,
- 'pnorm': pnorm,
- 'threshold': threshold,
- 'do_plot':do_plot,
- 'ridge_bg':ridge_bg,
- 'sub_freq': sub_freq,
- 'weight_update': weight_update,
- 'n_iter': n_iter}
- opts.change_params(params_dict=opts_dict);
- #%% TRACE DENOISING AND SPIKE DETECTION
- vpy = VOLPY(n_processes=n_processes, dview=dview, params=opts)
- vpy.fit(n_processes=n_processes, dview=dview)
- #%% visualization
- display_images = False
- if display_images:
- print(np.where(vpy.estimates['locality'])[0]) # neurons that pass locality test
- idx = np.where(vpy.estimates['locality'] > 0)[0]
- utils.view_components(vpy.estimates, img_corr, idx)
- #%% reconstructed movie
- # note the negative spatial weights is cutoff
- # if display_images:
- # mv_all = utils.reconstructed_movie(vpy.estimates.copy(), fnames=mc.mmap_file,
- # idx=idx, scope=(0,1000), flip_signal=flip_signal)
- # mv_all.play(fr=40, magnification=3)
- #%% save the traces
- #vpy.estimates['t']
- #for k, v in vpy.estimates.items():
- sio.savemat(os.path.join(trial_1_dir + '/matvars/T/T_' + layer_name + '.mat'), mdict={'T': vpy.estimates['t']})
- sio.savemat(os.path.join(trial_1_dir + '/matvars/spikes/spikes_' + layer_name + '.mat'), mdict={'spikes': vpy.estimates['spikes']})
- sio.savemat(os.path.join(trial_1_dir + '/matvars/threshold/thresh_' + layer_name + '.mat'), mdict={'thresh': vpy.estimates['thresh']})
- sio.savemat(os.path.join(trial_1_dir + '/matvars/snr/snr_' + layer_name + '.mat'), mdict={'snr': vpy.estimates['snr']})
- sio.savemat(os.path.join(trial_1_dir + '/matvars/t_sub/t_sub_' + layer_name + '.mat'), mdict={'t_sub': vpy.estimates['t_sub']})
- cm.movie(vpy.estimates['weights']).save(os.path.join(trial_1_dir + '/matvars/weights/weights_' + layer_name + '.hdf5'))
- # Extract raw traces
- # Y = cm.load(fname_new) # Load memory mapped movie
- # raw_traces = extract_raw_traces(Y, ROIs)
- # # Save raw traces to a file
- # save_name2 = f'ResultVolpy_{os.path.split(fnames)[1][:-4]}_raw_traces.npy'
- # np.save(save_name2, raw_traces)
- # print(f"Raw traces saved to {save_name2}")
- # Function to extract raw traces
- # def extract_raw_traces(Y, masks):
- # """
- # Extract raw traces from the given movie Y and masks.
- # Parameters:
- # ----------
- # Y : movie
- # The movie in which traces are to be extracted. Shape (T, d1, d2) where T is number of frames.
- # masks : array
- # ROIs masks. Shape (num_neurons, d1, d2).
- # Returns:
- # -------
- # raw_traces : array
- # Extracted raw traces. Shape (num_neurons, T).
- # """
- # T = Y.shape[0]
- # num_neurons = masks.shape[0]
- # raw_traces = np.empty((num_neurons, T))
- # for idx_neuron in range(num_neurons):
- # mask = masks[idx_neuron]
- # for t in range(T):
- # raw_traces[idx_neuron, t] = np.mean(Y[t][mask])
- # return raw_traces
- #%% save the result in .npy format
- save_result = False
- if save_result:
- #vpy.estimates['ROIs'] = ROIs
- vpy.estimates['params'] = opts
- #save_name = f'volpy_{os.path.split(fnames)[1][:-5]}_{threshold_method}'
- np.save(os.path.join(trial_1_dir + '/matvars/results_' + layer_name), vpy.estimates)
- #np.save(os.path.join(file_dir, save_name), vpy.estimates)
- #%% reuse weights
- ## set weights = reuse_weights in opts_dict dictionary
- # estimates = np.load(os.path.join(file_dir, save_name+'.npy'), allow_pickle=True).item()
- # reuse_weights = []
- # for idx in range(ROIs.shape[0]):
- # coord = estimates['context_coord'][idx]
- # w = estimates['weights'][idx][coord[0][0]:coord[1][0]+1, coord[0][1]:coord[1][1]+1]
- # #plt.figure(); plt.imshow(w);plt.colorbar(); plt.show()
- # reuse_weights.append(w)
- # %% STOP CLUSTER and clean up log files
- cm.stop_server(dview=dview)
- log_files = glob.glob('*_LOG_*')
- for log_file in log_files:
- os.remove(log_file)
- # %% Remove memmap files
- memmap_list = os.listdir(file_dir)
- for item in memmap_list:
- if item.endswith(".mmap"):
- os.remove(os.path.join(file_dir, item))
- file_dir_2 = os.path.split(fnames[1])[0]
- memmap_list = os.listdir(file_dir_2)
- for item in memmap_list:
- if item.endswith(".mmap"):
- os.remove(os.path.join(file_dir_2, item))
- # for now remove hdf5 too
- # hdf5_list = os.listdir(file_dir)
- # for item in memmap_list:
- # if item.endswith(".hdf5"):
- # os.remove(os.path.join(file_dir, item))
- # %%
- # This is to mask the differences between running this demo in Spyder
- # versus from the CLI
- if __name__ == "__main__":
- main()
fish_single_layer_manual.py, under CC-BY-4.0 · at the source
Overview
- McGovern Institute for Brain Research, MIT,Cambridge, MA USA
- Department of Media Arts and Sciences, MIT,Cambridge, MA USA
- Picower Institute for Learning and Memory, MIT,Cambridge, MA USA
- Department of Brain and Cognitive Sciences, MIT,Cambridge, MA USA
- Harvard-MIT Health Sciences and Technology,Cambridge, MA USA
- David H. Koch Institute for Integrative Cancer Research, MIT,Cambridge, MA USA
- Department of Biological Engineering, MIT,Cambridge, MA USA
- Mindspan Institute, Cambridge, MA USA
- Center for Neurobiological Engineering, Yang Tan Collective, and K. Lisa Yang Center for Bionics at MIT,Cambridge, MA USA
Abstract
Neurons interact in networks distributed throughout the brain. While much effort has focused on whole-brain calcium imaging, advances in genetically encoded voltage indicators raise the question of whether it might be possible to image neuronal voltage across entire brains. Achieving this requires a microscope with high volumetric imaging rates and signal-to-noise ratio. Here we present a remote-scanning light-sheet microscope capable of imaging genetically encoded voltage indicator-expressing neurons distributed throughout much of the brain of larval zebrafish at a volumetric rate of 200.8 Hz. We measured voltage traces from approximately one-quarter of all brain neurons. We found that neurons firing at different times during a sequence occupied different locations: visually evoked sequences mapped across the optic tectum, whereas stimulus-independent bursts were mapped across the cerebellum and medulla. Imaging voltage of neurons distributed in many brain regions may open new frontiers for understanding fundamental neural system operations.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 1 match between paragraphs and lines of code.
Zenodo 14920628
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
4 files
- data_extraction/
fish_single_layer_manual , Python, 407 lines, 1 match.py - data_extraction/
runScript_Volpy_Batch1.p , Python, 49 linesy - data_extraction/
utils.py , Python, 287 lines - data_extraction/
visualize.py , Python, 621 lines
Code availability
The codes used to control the microscope and to analyze the image datasets, as well as the custom-trained Cellpose model, are available at Zenodo at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
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:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 4 scripts, each with its path and the digest of its content;
- 1 match 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 availability
Raw light-sheet imaging data, analysis results and other raw and processed data associated with this paper, are publicly available 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 2, 28 September 2026
- Publisher: n/a → Nature Portfolio
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 11 authors, 2 keywords, 5 MeSH terms, 2 funders, 59 references.
Cite
This paper
Wang, Z., Zhang, J., Symvoulidis, P., Guo, W., Deng, D., Amsterdam, A., Zhang, L., Honda, T., Roche, S., Wilson, M. A., & Boyden, E. S. (2026). Voltage imaging of neurons distributed across entire brains of larval zebrafish. Nature methods, 23(9), 1895-1907. https://
BibTeX
@article{wang2026voltage
author = {Wang, Zeguan and Zhang, Jie and Symvoulidis, Panagiotis and Guo, Wei and Deng, Davy and Amsterdam, Adam and Zhang, Lige and Honda, Takato and Roche, Steven and Wilson, Matthew A. and Boyden, Edward S.},
title = {{Voltage imaging of neurons distributed across entire brains of larval zebrafish}},
journal = {Nature methods},
year = {2026},
month = aug,
volume = {23},
number = {9},
pages = {1895--1907},
publisher = {Nature Portfolio},
issn = {1548-7091},
doi = {10.1038/
url = {https://
pmid = {42601458},
pmcid = {PMC13541626}
}
RIS
TY - JOUR
AU - Wang, Zeguan
AU - Zhang, Jie
AU - Symvoulidis, Panagiotis
AU - Guo, Wei
AU - Deng, Davy
AU - Amsterdam, Adam
AU - Zhang, Lige
AU - Honda, Takato
AU - Roche, Steven
AU - Wilson, Matthew A.
AU - Boyden, Edward S.
TI - Voltage imaging of neurons distributed across entire brains of larval zebrafish
T2 - Nature methods
J2 - Nat Methods
PY - 2026
DA - 2026/
VL - 23
IS - 9
SP - 1895
EP - 1907
SN - 1548-7091
PB - Nature Portfolio
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Voltage imaging of neurons distributed across entire brains of larval zebrafish",
"container-title": "Nature methods",
"author": [
{
"family": "Wang",
"given": "Zeguan"
},
{
"family": "Zhang",
"given": "Jie"
},
{
"family": "Symvoulidis",
"given": "Panagiotis"
},
{
"family": "Guo",
"given": "Wei"
},
{
"family": "Deng",
"given": "Davy"
},
{
"family": "Amsterdam",
"given": "Adam"
},
{
"family": "Zhang",
"given": "Lige"
},
{
"family": "Honda",
"given": "Takato"
},
{
"family": "Roche",
"given": "Steven"
},
{
"family": "Wilson",
"given": "Matthew A."
},
{
"family": "Boyden",
"given": "Edward S."
}
],
"container-title-short":
"volume": "23",
"issue": "9",
"page": "1895-1907",
"DOI": "10.1038/
"PMID": "42601458",
"PMCID": "PMC13541626",
"ISSN": "1548-7091",
"publisher": "Nature Portfolio",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
14
]
]
}
}
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.1038/s41598-026-58107-8
- Three-dimensional voltage imaging in live larval zebrafish brains using fully genetically encoded voltage indicator.Journal: Scientific reportsIn common: optical imaging (calcium, voltage, 2-photon), zebrafish, 12 references
- [2] doi:10.1038/s41467-026-72437-1 [code]
- High-speed whole-brain imaging in Drosophila.Journal: Nature communicationsIn common: OpenCV, scikit-image, h5py, 3 other tools, systems, 6 references
- [3] doi:10.1126/sciadv.adv3770 [code]
- Evolution of a central dopamine circuit underlies adaptation of a light-evoked sensorimotor response in the blind cavefish.Journal: Science advancesIn common: CaImAn, TensorFlow, OpenCV, 5 other tools, systems, 3 references
- [4] doi:10.1038/s41467-026-76242-8 [code]
- Whole-brain, all-optical interrogation of neuronal dynamics underlying gut and vascular interoception in zebrafish.Journal: Nature communicationsIn common: OpenCV, scikit-image, h5py, 3 other tools, zebrafish, systems, 4 references
- [5] doi:10.1016/j.isci.2026.116206 [code]
- Gut distension evokes rapid neural dynamics in vagal and hindbrain populations of larval zebrafish.Journal: iScienceIn common: CaImAn, OpenCV, scikit-image, 3 other tools, optical imaging (calcium, voltage, 2-photon), zebrafish, systems, 2 references
- [6] doi:10.1016/j.isci.2026.116769 [code]
- Graph-based modeling of optical system enables adaptive optics on dynamic samples with self-calibration.Journal: iScienceIn common: scikit-image, h5py, SciPy, 2 other tools, 5 references
- [7] doi:10.1038/s41467-026-69633-4 [code]
- Visuomotor decision-making through multifeature convergence in the larval zebrafish hindbrain.Journal: Nature communicationsIn common: h5py, SciPy, Matplotlib, 1 other tool, zebrafish, 5 references
- [8] doi:10.7554/elife.100880 [code]
- An applicable and efficient retrograde monosynaptic circuit mapping tool for larval zebrafish.Journal: eLifeIn common: OpenCV, scikit-image, h5py, 3 other tools, zebrafish, systems, 2 references
- [9] doi:10.1016/j.xpro.2026.104659 [code]
- Protocol for simultaneous in vivo two-photon imaging and locomotion quantification during olfactory stimulation and pharmacology in walking Drosophila.Journal: STAR protocolsIn common: CaImAn, OpenCV, h5py, 3 other tools, optical imaging (calcium, voltage, 2-photon), histology / microscopy, 1 reference
- [10] doi:10.1111/ejn.70582 [code]
- Multifiber Array-Based Photometry System for Multiregional Functional Mapping in the Mouse Brain.Journal: The European journal of neuroscienceIn common: OpenCV, scikit-image, SciPy, 2 other tools, optical imaging (calcium, voltage, 2-photon), systems, 3 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: 1 repository of the authors' code, each at its verified commit and with its license, 4 scripts, and 1 match 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:53126e0a6bc7ed2d…
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
[.
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.
