OSCR

Voltage imaging of neurons distributed across entire brains of larval zebrafish.

Code ↔ Paper

1 match between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 1 match
  1. [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

  1. #!/usr/bin/env python
  2. """
  3. pipeline for processing voltage imaging data for zebrafish lightsheet data
  4. author: @Jack Zhang
  5. """
  6. import scipy.io as sio
  7. import cv2
  8. import os
  9. import glob
  10. import h5py
  11. import logging
  12. import matplotlib.pyplot as plt
  13. from matplotlib.pyplot import savefig
  14. import numpy as np
  15. import os
  16. try:
  17. cv2.setNumThreads(0)
  18. except:
  19. pass
  20. try:
  21. if __IPYTHON__:
  22. # this is used for debugging purposes only. allows to reload classes
  23. # when changed
  24. get_ipython().magic('load_ext autoreload')
  25. get_ipython().magic('autoreload 2')
  26. except NameError:
  27. pass
  28. import caiman as cm
  29. from caiman.motion_correction import MotionCorrect
  30. from caiman.paths import caiman_datadir
  31. from caiman.source_extraction.volpy import utils
  32. from caiman.source_extraction.volpy.volparams import volparams
  33. from caiman.source_extraction.volpy.volpy import VOLPY
  34. from caiman.summary_images import local_correlations_movie_offline
  35. from caiman.summary_images import mean_image
  36. from caiman.utils.utils import download_demo, download_model
  37. from caiman.source_extraction.volpy.mrcnn import visualize
  38. # %%
  39. # Set up the logger (optional); change this if you like.
  40. # You can log to a file using the filename parameter, or make the output more
  41. # or less verbose by setting level to logging.DEBUG, logging.INFO,
  42. # logging.WARNING, or logging.ERROR
  43. logging.basicConfig(format=
  44. "%(relativeCreated)12d [%(filename)s:%(funcName)20s():%(lineno)s]" \
  45. "[%(process)d] %(message)s",
  46. level=logging.INFO)
  47. # %%
  48. def volpy_process_session(trial_1_dir, trial_2_dir, layer_name):
  49. pass # For compatibility between running under Spyder and the CLI
  50. # %% Load demo movie and ROIs
  51. # fnames = download_demo('demo_voltage_imaging.hdf5', 'volpy') # file path to movie file (will download if not present)
  52. #fnames = os.path.join(trial_1_dir + layer_name + '.tif' );
  53. fnames = []
  54. fnames.extend([os.path.join(trial_1_dir + '/raw/' + layer_name + '.hdf5' )]);
  55. fnames.extend([os.path.join(trial_2_dir + '/raw/' + layer_name + '.hdf5' )]);
  56. #path_ROIs = download_demo('demo_voltage_imaging_ROIs.hdf5', 'volpy') # file path to ROIs file (will download if not present)
  57. file_dir = os.path.split(fnames[0])[0]
  58. tempDir = '/home/jack/Caiman_Workfolder/Movies/'
  59. #%% dataset dependent parameters
  60. # dataset dependent parameters
  61. fr = 200 # sample rate of the movie
  62. # motion correction parameterspath_ROIs
  63. pw_rigid = False # flag for pw-rigid motion correction
  64. gSig_filt = (4, 4) # size of filter, in general gSig (see below),
  65. # change this one if algorithm does not work
  66. max_shifts = (6, 6) # maximum allowed rigid shift
  67. strides = (64, 64) # start a new patch for pw-rigid motion correction every x pixels
  68. overlaps = (32, 32) # overlap between pathes (size of patch strides+overlaps)
  69. max_deviation_rigid = 5 # maximum deviation allowed for patch with respect to rigid shifts
  70. border_nan = 'copy'
  71. opts_dict = {
  72. 'fnames': fnames,
  73. 'fr': fr,
  74. 'pw_rigid': pw_rigid,
  75. 'max_shifts': max_shifts,
  76. 'gSig_filt': gSig_filt,
  77. 'strides': strides,
  78. 'overlaps': overlaps,
  79. 'max_deviation_rigid': max_deviation_rigid,
  80. 'border_nan': border_nan
  81. }
  82. opts = volparams(params_dict=opts_dict)
  83. # %% play the movie (optional)
  84. # playing the movie using opencv. It requires loading the movie in memory.
  85. # To close the movie press q
  86. display_images = False
  87. if display_images:
  88. m_orig = cm.load(fnames)
  89. ds_ratio = 0.2
  90. moviehandle = m_orig.resize(1, 1, ds_ratio)
  91. moviehandle.play(q_max=99.5, fr=40, magnification=4)
  92. # %% start a cluster for parallel processing
  93. c, dview, n_processes = cm.cluster.setup_cluster(
  94. backend='local', n_processes=None, single_thread=False)
  95. # %%% MOTION CORRECTION
  96. # first we create a motion correction object with the specified parameters
  97. mc = MotionCorrect(fnames, dview=dview, **opts.get_group('motion'))
  98. # Run correction
  99. do_motion_correction = True
  100. if do_motion_correction:
  101. mc.motion_correct(save_movie=True)
  102. plt.subplot(1, 2, 1); plt.imshow(mc.total_template_rig) # % plot template
  103. plt.subplot(1, 2, 2); plt.plot(mc.shifts_rig) # % plot rigid shifts
  104. plt.legend(['x shifts', 'y shifts'])
  105. plt.xlabel('frames')
  106. plt.ylabel('pixels')
  107. savefig(trial_1_dir +'/outline/' + layer_name + '_motion-correct.pdf', bbox_inches='tight')
  108. else:
  109. mc_list = [file for file in os.listdir(file_dir) if
  110. (os.path.splitext(os.path.split(fnames)[-1])[0] in file and '.mmap' in file)]
  111. mc.mmap_file = [os.path.join(file_dir, mc_list[0])]
  112. print(f'reuse previously saved motion corrected file:{mc.mmap_file}')
  113. # bord_px = np.ceil(np.max(np.abs(mc.shifts_rig))).astype(np.int)
  114. # %% compare with original movie
  115. if display_images:
  116. m_orig = cm.load(fnames)
  117. m_rig = cm.load(mc.mmap_file)
  118. ds_ratio = 0.2
  119. moviehandle = cm.concatenate([m_orig.resize(1, 1, ds_ratio),
  120. m_rig.resize(1, 1, ds_ratio)], axis=2)
  121. moviehandle.play(fr=40, q_max=99.5, magnification=4) # press q to exit
  122. # %% MEMORY MAPPING
  123. do_memory_mapping = True
  124. if do_memory_mapping:
  125. border_to_0 = 0 if mc.border_nan == 'copy' else mc.border_to_0
  126. # you can include the boundaries of the FOV if you used the 'copy' option
  127. # during motion correction, although be careful about the components near
  128. # the boundaries
  129. # memory map the file in order 'C'
  130. fname_new = cm.save_memmap_join(mc.mmap_file, base_name='memmap_' + os.path.splitext(os.path.split(fnames[0])[-1])[0],
  131. add_to_mov=border_to_0, dview=dview) # exclude border
  132. else:
  133. mmap_list = [file for file in os.listdir(file_dir) if
  134. ('memmap_' + os.path.splitext(os.path.split(fnames)[-1])[0]) in file]
  135. fname_new = os.path.join(file_dir, mmap_list[0])
  136. print(f'reuse previously saved memory mapping file:{fname_new}')
  137. # %% SEGMENTATION
  138. # create summary images
  139. img = mean_image(mc.mmap_file[0], window = 1000, dview=dview)
  140. img = (img-np.mean(img))/np.std(img)
  141. gaussian_blur = False # Use gaussian blur when there is too much noise in the video
  142. Cn = local_correlations_movie_offline(mc.mmap_file[0], fr=fr, window=fr*4,
  143. stride=fr*4, winSize_baseline=fr,
  144. remove_baseline=True, gaussian_blur=gaussian_blur,
  145. dview=dview).max(axis=0)
  146. img_corr = (Cn-np.mean(Cn))/np.std(Cn)
  147. summary_images = np.stack([img, img, img_corr], axis=0).astype(np.float32)
  148. # save summary images which are used in the VolPy GUI
  149. #cm.movie(summary_images).save(fnames[:-5] + '_summary_images.tif')
  150. fig, axs = plt.subplots(1, 2)
  151. axs[0].imshow(summary_images[0]); axs[1].imshow(summary_images[2])
  152. axs[0].set_title('mean image'); axs[1].set_title('corr image')
  153. #%% methods for segmentation
  154. methods_list = ['manual_annotation', # manual annotations need prepared annotated datasets in the same format as demo_voltage_imaging_ROIs.hdf5
  155. 'maskrcnn', # Mask R-CNN is a convolutional neural network trained for detecting neurons in summary images
  156. 'gui_annotation'] # use VolPy GUI to correct outputs of Mask R-CNN or annotate new datasets
  157. method = methods_list[2]
  158. if method == 'manual_annotation':
  159. with h5py.File(path_ROIs, 'r') as fl:
  160. ROIs = fl['mov'][()]
  161. elif method == 'maskrcnn':
  162. weights_path = download_model('mask_rcnn')
  163. ROIs = utils.mrcnn_inference(img=summary_images.transpose([1, 2, 0]), size_range=[3, 18],
  164. weights_path=weights_path, display_result=True, savedir=trial_1_dir, savename=layer_name) # size parameter decides size range of masks to be selected
  165. cm.movie(ROIs).save(fnames[0][:-5] + '_mrcnn_ROIs.hdf5')
  166. elif method == 'gui_annotation':
  167. # run volpy_gui.py file in the caiman/source_extraction/volpy folder
  168. # or run the following in the ipython: %run volpy_gui.py
  169. #gui_ROIs = caiman_datadir() + '/example_movies/volpy/gui_roi.hdf5'
  170. #gui_ROIs = '/media/jack/data/zebrafish/230820/Fish2_1/TIFF_files/layer_0_320_80_mrcnn_ROIs.hdf5'
  171. gui_ROIs = os.path.join(trial_1_dir + '/roi/' + layer_name + '_roi.hdf5' )
  172. with h5py.File(gui_ROIs, 'r') as fl:
  173. ROIs = fl['mov'][()]
  174. box = np.zeros([len(ROIs[:,0,0]),4],dtype=np.int32)
  175. #roi_id = list(range(len(ROIs[:,0,0])))
  176. roi_id = np.full((len(ROIs[:,0,0])),1,dtype=np.int32)
  177. for nn in range(len(ROIs[:,0,0])):
  178. xnzero = np.nonzero(np.sum(ROIs[nn,:,:], axis=0))
  179. x1 = xnzero[0][0]
  180. x2 = xnzero[0][-1]
  181. ynzero = np.nonzero(np.sum(ROIs[nn,:,:], axis=1))
  182. y1 = ynzero[0][0]
  183. y2 = ynzero[0][-1]
  184. box[nn] = y1, x1, y2, x2
  185. _, ax = plt.subplots(1,1, figsize=(16,16))
  186. sampleimg=summary_images.transpose([1, 2, 0])
  187. ROI_t = np.transpose(ROIs,(1, 2, 0))
  188. visualize.display_instances_no_contour(sampleimg, box, ROI_t, roi_id,
  189. ['BG', 'neurons'], roi_id, ax=ax, captions=None,
  190. title="Predictions")
  191. #visualize.display_instances(img=summary_images.transpose([1, 2, 0]), box, ROIs, roi_id, ['BG', 'neurons'], roi_id, ax=ax, title="Predictions")
  192. savefig(trial_1_dir +'/outline/' + layer_name + '_roi_outline.pdf', bbox_inches='tight')
  193. visualize.display_instances(sampleimg, box, ROI_t, roi_id,
  194. ['BG', 'neurons'], roi_id, ax=ax, captions=None,
  195. title="Predictions")
  196. #visualize.display_instances(img=summary_images.transpose([1, 2, 0]), box, ROIs, roi_id, ['BG', 'neurons'], roi_id, ax=ax, title="Predictions")
  197. savefig(trial_1_dir +'/outline/' + layer_name + '_roi_outline_contour.pdf', bbox_inches='tight')
  198. fig, axs = plt.subplots(1, 2)
  199. axs[0].imshow(summary_images[0]); axs[1].imshow(ROIs.sum(0))
  200. axs[0].set_title('mean image'); axs[1].set_title('masks')
  201. # %% restart cluster to clean up memory
  202. cm.stop_server(dview=dview)
  203. c, dview, n_processes = cm.cluster.setup_cluster(
  204. backend='local', n_processes=None, single_thread=False, maxtasksperchild=1)
  205. # %% parameters for trace denoising and spike extraction
  206. ROIs = ROIs # region of interests
  207. index = list(range(len(ROIs))) # index of neurons
  208. weights = None # if None, use ROIs for initialization; to reuse weights check reuse weights block
  209. template_size = 0.02 # half size of the window length for spike templates, default is 20 ms
  210. context_size = 35 # number of pixels surrounding the ROI to censor from the background PCA
  211. visualize_ROI = False # whether to visualize the region of interest inside the context region
  212. flip_signal = False # Important!! Flip signal or not, True for Voltron indicator, False for others
  213. hp_freq_pb = 1 / 3 # parameter for high-pass filter to remove photobleaching
  214. clip = 101 # maximum number of spikes to form spike template
  215. threshold_method = 'adaptive_threshold' #'adaptive_threshold' # adaptive_threshold or simple
  216. min_spikes= 4 # minimal spikes to be found
  217. pnorm = 0.5 # a variable deciding the amount of spikes chosen for adaptive threshold method
  218. threshold = 5 # threshold for finding spikes only used in simple threshold method, Increase the threshold to find less spikes
  219. do_plot = False # plot detail of spikes, template for the last iteration
  220. ridge_bg= 0.01 # ridge regression regularizer strength for background removement, larger value specifies stronger regularization
  221. sub_freq = 20 # frequency for subthreshold extraction
  222. weight_update = 'ridge' # ridge or NMF for weight update
  223. n_iter = 2 # number of iterations alternating between estimating spike times and spatial filters
  224. opts_dict={'fnames': fname_new,
  225. 'ROIs': ROIs,
  226. 'index': index,
  227. 'weights': weights,
  228. 'template_size': template_size,
  229. 'context_size': context_size,
  230. 'visualize_ROI': visualize_ROI,
  231. 'flip_signal': flip_signal,
  232. 'hp_freq_pb': hp_freq_pb,
  233. 'clip': clip,
  234. 'threshold_method': threshold_method,
  235. 'min_spikes':min_spikes,
  236. 'pnorm': pnorm,
  237. 'threshold': threshold,
  238. 'do_plot':do_plot,
  239. 'ridge_bg':ridge_bg,
  240. 'sub_freq': sub_freq,
  241. 'weight_update': weight_update,
  242. 'n_iter': n_iter}
  243. opts.change_params(params_dict=opts_dict);
  244. #%% TRACE DENOISING AND SPIKE DETECTION
  245. vpy = VOLPY(n_processes=n_processes, dview=dview, params=opts)
  246. vpy.fit(n_processes=n_processes, dview=dview)
  247. #%% visualization
  248. display_images = False
  249. if display_images:
  250. print(np.where(vpy.estimates['locality'])[0]) # neurons that pass locality test
  251. idx = np.where(vpy.estimates['locality'] > 0)[0]
  252. utils.view_components(vpy.estimates, img_corr, idx)
  253. #%% reconstructed movie
  254. # note the negative spatial weights is cutoff
  255. # if display_images:
  256. # mv_all = utils.reconstructed_movie(vpy.estimates.copy(), fnames=mc.mmap_file,
  257. # idx=idx, scope=(0,1000), flip_signal=flip_signal)
  258. # mv_all.play(fr=40, magnification=3)
  259. #%% save the traces
  260. #vpy.estimates['t']
  261. #for k, v in vpy.estimates.items():
  262. sio.savemat(os.path.join(trial_1_dir + '/matvars/T/T_' + layer_name + '.mat'), mdict={'T': vpy.estimates['t']})
  263. sio.savemat(os.path.join(trial_1_dir + '/matvars/spikes/spikes_' + layer_name + '.mat'), mdict={'spikes': vpy.estimates['spikes']})
  264. sio.savemat(os.path.join(trial_1_dir + '/matvars/threshold/thresh_' + layer_name + '.mat'), mdict={'thresh': vpy.estimates['thresh']})
  265. sio.savemat(os.path.join(trial_1_dir + '/matvars/snr/snr_' + layer_name + '.mat'), mdict={'snr': vpy.estimates['snr']})
  266. sio.savemat(os.path.join(trial_1_dir + '/matvars/t_sub/t_sub_' + layer_name + '.mat'), mdict={'t_sub': vpy.estimates['t_sub']})
  267. cm.movie(vpy.estimates['weights']).save(os.path.join(trial_1_dir + '/matvars/weights/weights_' + layer_name + '.hdf5'))
  268. # Extract raw traces
  269. # Y = cm.load(fname_new) # Load memory mapped movie
  270. # raw_traces = extract_raw_traces(Y, ROIs)
  271. # # Save raw traces to a file
  272. # save_name2 = f'ResultVolpy_{os.path.split(fnames)[1][:-4]}_raw_traces.npy'
  273. # np.save(save_name2, raw_traces)
  274. # print(f"Raw traces saved to {save_name2}")
  275. # Function to extract raw traces
  276. # def extract_raw_traces(Y, masks):
  277. # """
  278. # Extract raw traces from the given movie Y and masks.
  279. # Parameters:
  280. # ----------
  281. # Y : movie
  282. # The movie in which traces are to be extracted. Shape (T, d1, d2) where T is number of frames.
  283. # masks : array
  284. # ROIs masks. Shape (num_neurons, d1, d2).
  285. # Returns:
  286. # -------
  287. # raw_traces : array
  288. # Extracted raw traces. Shape (num_neurons, T).
  289. # """
  290. # T = Y.shape[0]
  291. # num_neurons = masks.shape[0]
  292. # raw_traces = np.empty((num_neurons, T))
  293. # for idx_neuron in range(num_neurons):
  294. # mask = masks[idx_neuron]
  295. # for t in range(T):
  296. # raw_traces[idx_neuron, t] = np.mean(Y[t][mask])
  297. # return raw_traces
  298. #%% save the result in .npy format
  299. save_result = False
  300. if save_result:
  301. #vpy.estimates['ROIs'] = ROIs
  302. vpy.estimates['params'] = opts
  303. #save_name = f'volpy_{os.path.split(fnames)[1][:-5]}_{threshold_method}'
  304. np.save(os.path.join(trial_1_dir + '/matvars/results_' + layer_name), vpy.estimates)
  305. #np.save(os.path.join(file_dir, save_name), vpy.estimates)
  306. #%% reuse weights
  307. ## set weights = reuse_weights in opts_dict dictionary
  308. # estimates = np.load(os.path.join(file_dir, save_name+'.npy'), allow_pickle=True).item()
  309. # reuse_weights = []
  310. # for idx in range(ROIs.shape[0]):
  311. # coord = estimates['context_coord'][idx]
  312. # w = estimates['weights'][idx][coord[0][0]:coord[1][0]+1, coord[0][1]:coord[1][1]+1]
  313. # #plt.figure(); plt.imshow(w);plt.colorbar(); plt.show()
  314. # reuse_weights.append(w)
  315. # %% STOP CLUSTER and clean up log files
  316. cm.stop_server(dview=dview)
  317. log_files = glob.glob('*_LOG_*')
  318. for log_file in log_files:
  319. os.remove(log_file)
  320. # %% Remove memmap files
  321. memmap_list = os.listdir(file_dir)
  322. for item in memmap_list:
  323. if item.endswith(".mmap"):
  324. os.remove(os.path.join(file_dir, item))
  325. file_dir_2 = os.path.split(fnames[1])[0]
  326. memmap_list = os.listdir(file_dir_2)
  327. for item in memmap_list:
  328. if item.endswith(".mmap"):
  329. os.remove(os.path.join(file_dir_2, item))
  330. # for now remove hdf5 too
  331. # hdf5_list = os.listdir(file_dir)
  332. # for item in memmap_list:
  333. # if item.endswith(".hdf5"):
  334. # os.remove(os.path.join(file_dir, item))
  335. # %%
  336. # This is to mask the differences between running this demo in Spyder
  337. # versus from the CLI
  338. if __name__ == "__main__":
  339. main()

fish_single_layer_manual.py, under CC-BY-4.0 · at the source

Overview

Authors: Zeguan Wang1,2, Jie Zhang3,4, Panagiotis Symvoulidis1,4, Wei Guo3,4, Davy Deng1,5, Adam Amsterdam1,6, Lige Zhang1,2, Takato Honda3,4, Steven Roche4, Matthew A. Wilson3,4, Edward S. Boyden1,2,4,6,7,8,9
  1. McGovern Institute for Brain Research, MIT,Cambridge, MA USA
  2. Department of Media Arts and Sciences, MIT,Cambridge, MA USA
  3. Picower Institute for Learning and Memory, MIT,Cambridge, MA USA
  4. Department of Brain and Cognitive Sciences, MIT,Cambridge, MA USA
  5. Harvard-MIT Health Sciences and Technology,Cambridge, MA USA
  6. David H. Koch Institute for Integrative Cancer Research, MIT,Cambridge, MA USA
  7. Department of Biological Engineering, MIT,Cambridge, MA USA
  8. Mindspan Institute, Cambridge, MA USA
  9. Center for Neurobiological Engineering, Yang Tan Collective, and K. Lisa Yang Center for Bionics at MIT,Cambridge, MA USA
Journal: Nature methods, volume 23, issue 9, pages 1895-1907
Dates: received 16 December 2023; accepted 29 June 2026; published online 14 August 2026; in print 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41592-026-03179-7 · PMID 42601458 · PMCID PMC13541626 · OpenAlex W7203498224
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: histology / microscopy (modality), optical imaging (calcium, voltage, 2-photon) (modality), zebrafish (organism), systems (subfield)
Methods: Spectral & time-frequency, Connectivity, Smoothing, state filtering, decompositions, Statistics, fMRI & imaging, Single-unit activity, calcium imaging, Physiology & signal measures
Keywords: Optogenetics, Light-sheet microscopy
MeSH: Brain*, Neurons*, Zebrafish*, Animals, Larva (* major topic)
Topic: Retinal Development and Disorders (Molecular Biology, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Citations: cited by 2 papers (Europe PMC); 60 references in the paper

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

License: CC-BY-4.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: “Code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Matplotlib (3 files), NumPy (3 files), CaImAn (2 files), h5py (1 file), OpenCV (1 file), scikit-image (1 file), SciPy (1 file), TensorFlow (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)
4 files
At the source:

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://doi.org/10.5281/zenodo.14920628 (ref. 60) under the Creative Commons Attribution 4.0 International License.

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://doi.org/10.6019/S-BSST2153 ref. 59. Source data are provided with this paper.

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://doi.org/10.1038/s41592-026-03179-7

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/s41592-026-03179-7},
url = {https://doi.org/10.1038/s41592-026-03179-7},
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/08/14
VL - 23
IS - 9
SP - 1895
EP - 1907
SN - 1548-7091
PB - Nature Portfolio
DO - 10.1038/s41592-026-03179-7
UR - https://doi.org/10.1038/s41592-026-03179-7
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41592-026-03179-7",
"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": "Nat Methods",
"volume": "23",
"issue": "9",
"page": "1895-1907",
"DOI": "10.1038/s41592-026-03179-7",
"PMID": "42601458",
"PMCID": "PMC13541626",
"ISSN": "1548-7091",
"publisher": "Nature Portfolio",
"URL": "https://doi.org/10.1038/s41592-026-03179-7",
"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 reports
In 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 communications
In 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 advances
In 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 communications
In 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: iScience
In 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: iScience
In 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 communications
In 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: eLife
In 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 protocols
In 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 neuroscience
In 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.

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.