OSCR

A Dispersive Image Scanning Microscope for Multi-color High-resolution Imaging.

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] § Materials and Methods › Image Processing ↔ get_psfs/simlulate_psfs.py, lines 50–90 · score 0.64 · simulate PSFs, PSF images, polynomial, fitting, wavelengths, efficiency

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 · 183 lines · 6 KB · MIT · 1 match

  1. import os
  2. import numpy as np
  3. import pandas as pd
  4. from scipy.io import loadmat
  5. from utils import CROP_SIZE
  6. def get_optimal_red_shift(max_emission_wl, poly3_coeffs, selected_indices):
  7. max_em_selected = max_emission_wl[selected_indices]
  8. max_x_selected = np.polyval(poly3_coeffs, max_em_selected)
  9. min_edge_dist = CROP_SIZE[1] - np.min(max_x_selected)
  10. max_edge_dist = CROP_SIZE[1] - np.max(max_x_selected)
  11. red_shift = np.round(np.mean([min_edge_dist, max_edge_dist]))
  12. return red_shift
  13. def read_spectrum(file_path):
  14. """Read a spectrum file into a NumPy array using pandas to handle complex formatting."""
  15. try:
  16. df = pd.read_csv(file_path, header=None, comment="%", delimiter="\t")
  17. return df.values
  18. except Exception as e:
  19. raise ValueError(f"Error reading spectrum file {file_path}: {e}")
  20. def camera_QE_curve_vals():
  21. # Define camera efficiency curve
  22. camera_eff_vals = np.array(
  23. [
  24. [400, 0.7],
  25. [450, 0.85],
  26. [500, 0.88],
  27. [600, 0.9],
  28. [650, 0.92],
  29. [700, 0.9],
  30. [750, 0.85],
  31. [800, 0.75],
  32. [850, 0.6],
  33. [900, 0.43],
  34. ]
  35. )
  36. return camera_eff_vals
  37. # Simulate PSFs for all spectral files
  38. # crop_size = (9, 19)
  39. def simulate_psf(
  40. spectrum,
  41. poly3_coeffs,
  42. poly1_coeffs,
  43. filter_data,
  44. camera_eff_curve,
  45. crop_size=(9, 19),
  46. red_shift=4,
  47. sigma=1.25,
  48. ):
  49. def gaussian_2d(x, y, x0, y0, sigma):
  50. """Generate a 2D Gaussian distribution."""
  51. return np.exp(-((x - x0) ** 2 + (y - y0) ** 2) / (2 * sigma**2))
  52. """Simulate PSFs based on spectral data, polynomial fits, and camera efficiency."""
  53. psf_image = np.zeros(crop_size)
  54. x = np.arange(crop_size[1])
  55. y = np.arange(crop_size[0])
  56. xv, yv = np.meshgrid(x, y)
  57. for wl, intensity in spectrum:
  58. # Evaluate polynomial fits
  59. x_shift = np.polyval(poly3_coeffs, wl)
  60. y_shift = np.polyval(poly1_coeffs, x_shift)
  61. # Interpolate filter transmission and camera efficiency
  62. filter_transmission = np.interp(wl, filter_data[:, 0], filter_data[:, 1])
  63. camera_efficiency = np.interp(
  64. wl, camera_eff_curve[:, 0], camera_eff_curve[:, 1]
  65. )
  66. if (
  67. filter_transmission > 0 and camera_efficiency > 0
  68. ): # Process only valid wavelengths
  69. x0 = -(red_shift - 4) + x_shift
  70. y0 = y_shift - 1
  71. gaussian = gaussian_2d(xv, yv, x0, y0, sigma)
  72. psf_image += gaussian * intensity * filter_transmission * camera_efficiency
  73. return psf_image
  74. def simulate_selected_psfs(
  75. spectral_data_all,
  76. selected_indices,
  77. base_folder,
  78. filter_file,
  79. mat_file_processed,
  80. crop_size=(9, 19),
  81. red_shift=4,
  82. sigma=1.25,
  83. ):
  84. filter_data, poly3_coeffs, poly1_coeffs = get_filter_and_dispersion_curve(
  85. base_folder, filter_file, mat_file_processed
  86. )
  87. camera_eff_vals = camera_QE_curve_vals()
  88. psfs = []
  89. for i in selected_indices:
  90. psf_image = simulate_psf(
  91. spectral_data_all[i],
  92. poly3_coeffs,
  93. poly1_coeffs,
  94. filter_data,
  95. camera_eff_vals,
  96. crop_size,
  97. red_shift=red_shift,
  98. sigma=sigma,
  99. )
  100. psfs.append(psf_image)
  101. psfs = np.asarray(psfs)
  102. return psfs.transpose(1, 2, 0)
  103. def get_fluorophores_data(base_folder, wl_lim=(400, 900)):
  104. def load_spectrum_files(base_folder, pattern):
  105. """Load spectrum files matching a given pattern."""
  106. spectrum_files = []
  107. for root, _, files in os.walk(base_folder):
  108. for file in files:
  109. if file.endswith(pattern):
  110. spectrum_files.append(os.path.join(root, file))
  111. return spectrum_files
  112. em_files = load_spectrum_files(base_folder, "Em.txt")
  113. max_emission_wl = []
  114. fluorophore_names = []
  115. spectral_data_all = []
  116. for file_path in em_files:
  117. spectral_data = read_spectrum(file_path)
  118. # Filter spectral data to within wavelength limits
  119. spectral_data = spectral_data[
  120. (spectral_data[:, 0] >= wl_lim[0]) & (spectral_data[:, 0] <= wl_lim[1])
  121. ]
  122. max_emission_wl.append(
  123. spectral_data[
  124. np.where(spectral_data[:, 1] == max(spectral_data[:, 1]))[0], 0
  125. ]
  126. )
  127. fluorophore_name = os.path.splitext(os.path.basename(file_path))[0].replace(
  128. " - Em", ""
  129. )
  130. fluorophore_name = fluorophore_name.replace("FocalCheck ", "FC ")
  131. fluorophore_name = fluorophore_name.replace(" Ring", "")
  132. fluorophore_name = fluorophore_name.replace("Double", "")
  133. fluorophore_names.append(fluorophore_name)
  134. spectral_data_all.append(spectral_data)
  135. max_emission_wl = np.concatenate(max_emission_wl)
  136. ind_sorted = np.argsort(
  137. max_emission_wl,
  138. )
  139. # fluorophore_names=np.array(fluorophore_names)[ind_sorted]
  140. fluorophore_names[:] = [fluorophore_names[ind] for ind in ind_sorted[::-1]]
  141. spectral_data_all = [spectral_data_all[ind] for ind in ind_sorted[::-1]]
  142. max_emission_wl = max_emission_wl[ind_sorted[::-1]]
  143. return fluorophore_names, max_emission_wl, spectral_data_all
  144. def get_filter_and_dispersion_curve(base_folder, filter_file, mat_file_processed):
  145. filter_file_path = os.path.join(base_folder, filter_file)
  146. mat_file_processed_path = os.path.join(base_folder, mat_file_processed)
  147. # MATLAB file containing polynomial coefficients for the wavelength
  148. # dependent dispersion in X (poly3 coefficients - 'coeffs_PixToWl')
  149. # and linear shift in Y (poly1 coefficients - 'coeffs_Y').
  150. # Load data
  151. filter_data = read_spectrum(filter_file_path)
  152. processed_data = loadmat(mat_file_processed_path)
  153. # Extract polynomial coefficients for dispersion fits
  154. poly3_coeffs = processed_data["coeffs_PixToWl"].flatten()
  155. poly1_coeffs = processed_data["coeffs_Y"].flatten()
  156. return filter_data, poly3_coeffs, poly1_coeffs

simlulate_psfs.py at commit 5fc5435, under MIT · at the source

Overview

Authors: Lanna Bram1, Ofir Tal-Friedman1, Neta Fibeesh2, Jasline Deek3, Yohai Bar-Sinai4,5,6, Eli Flaxer7, Yael Roichman1,3, Yuval Ebenstein3,8, Jonathan Jeffet1
  1. School of Physics and Astronomy, Faculty of Exact Sciences, Tel Aviv University, Tel Aviv 6997801, Israel
  2. School of Neurobiology, Biochemistry and Biophysics, George S. Wise Faculty of Life Sciences, Tel Aviv University, Tel Aviv 6997801, Israel
  3. School of Chemistry, Faculty of Exact Sciences, Tel Aviv University, Tel Aviv 6997801, Israel
  4. Racah Institute of Physics, The Hebrew University of Jerusalem, Jerusalem 9190401, Israel
  5. The Rachel and Selim Benin School of Computer Science and Engineering, The Hebrew University of Jerusalem, Jerusalem 9190401, Israel
  6. Center for Physics and Chemistry of Living Systems, Tel Aviv University, Tel Aviv 6997801, Israel
  7. AFEKATel-Aviv Academic College of Engineering, 69107 Tel-Aviv, Israel
  8. Department of Biomedical Engineering, Tel Aviv University, Tel Aviv 6997801, Israel
Journal: ACS photonics, volume 13, issue 14, pages 3796-3807
Dates: received 26 November 2025; accepted 3 June 2026; published online 23 June 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1021/acsphotonics.5c02836 · PMID 42491450 · PMCID PMC13377594 · OpenAlex W7165663492
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: histology / microscopy (modality)
Methods: Spectral & time-frequency, Evoked potentials, fMRI & imaging
Keywords: image scanning microscopy (ISM), confocal spinning disk (CSD), multi-color imaging, high-resolution imaging, fluorescence microscopy, spectral imaging
Topic: Digital Holography and Microscopy (Atomic and Molecular Physics, and Optics, Physics and Astronomy), according to OpenAlex
Funding: European Research Council (101158251)
Citations: not cited yet (Europe PMC); 52 references in the paper

Abstract

Fluorescence confocal microscopy is a fundamental and widely used tool for biological, medical, and chemical research. It enables color-coded visualization of sample components, enhancing our understanding of life’s building blocks and their interactions. The recent realization of image scanning microscopy (ISM) using confocal spinning disks (CSD) enhanced the spatial resolution of fluorescence microscopy to twice the diffraction limit with minimal sample perturbation and fast acquisition rates. However, capturing multicolor images using ISM is still time-consuming and introduces temporal artifacts as different colors are not acquired simultaneously. Here, we present a dispersive multicolor CSD-ISM system designed for concurrent enhanced-resolution and simultaneous multicolor acquisition. By integrating a custom linear Amici prism into the CSD-ISM optical detection path, we achieve multicolor, enhanced-resolution images at a fraction of the acquisition time and with a flexible color palette selection. A digital signal processor (DSP) is employed together with accompanying software as a cost-effective alternative to Field-Programmable Gate Arrays (FPGAs) used in previous studies. We provide an accompanying GPU-compatible, python-based image processing pipeline to decompose spectral signatures into multicolor channel-based images, while preserving the spatial resolution. Characterization using three color fluorescent beads demonstrated 1.74-fold resolution improvement and accurate color classification with a single simultaneous multicolor acquisition instead of the three acquisitions required in standard CSD-ISM. Application to neuron cells expressing a Parkinson’s disease-associated mutation, showcased improved resolution and contrast of four distinctly labeled cellular components. This multicolor CSD-ISM system provides a valuable tool for biological imaging, enabling the simultaneous acquisition of enhanced-resolution spatial information and multicolor data.

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 1 match between paragraphs and lines of code.

ebensteinLab/SPECIALS

License: MIT
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 5fc543504fc72e372cd1cbc4b1deb63475e1f9e5, 24 May 2025
Languages: Python (13), Jupyter (1)
Size: 80 files, 14 scripts
Software Heritage: not archived
Found in: the text, “Image Analysis”
Holds: README, license file, environment (requirements.txt), 1 notebook
Not found: CITATION.cff, tests, continuous integration, documentation
Tools: NumPy (13 files), CuPy (5 files), SciPy (4 files), tifffile (4 files), Matplotlib (1 file), pandas (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
16 files

ebensteinLab

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: the link answers
Software Heritage: not checked
Found in: “Data Availability Statement”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)

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:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 14 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 Statement

Data underlying the results presented in this paper are not publicly available at this time but may be obtained from the authors upon reasonable request. The entire analysis pipeline, together with example data sets, can be found in https://github.com/ebensteinLab.

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: — → American Chemical Society

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 9 authors, 6 keywords, 1 funder, 41 references.

Cite

This paper

Bram, L., Tal-Friedman, O., Fibeesh, N., Deek, J., Bar-Sinai, Y., Flaxer, E., Roichman, Y., Ebenstein, Y., & Jeffet, J. (2026). A Dispersive Image Scanning Microscope for Multi-color High-resolution Imaging. ACS photonics, 13(14), 3796-3807. https://doi.org/10.1021/acsphotonics.5c02836

BibTeX

@article{bram2026dispersive,
author = {Bram, Lanna and Tal-Friedman, Ofir and Fibeesh, Neta and Deek, Jasline and Bar-Sinai, Yohai and Flaxer, Eli and Roichman, Yael and Ebenstein, Yuval and Jeffet, Jonathan},
title = {{A Dispersive Image Scanning Microscope for Multi-color High-resolution Imaging}},
journal = {ACS photonics},
year = {2026},
month = jun,
volume = {13},
number = {14},
pages = {3796--3807},
publisher = {American Chemical Society},
issn = {2330-4022},
doi = {10.1021/acsphotonics.5c02836},
url = {https://doi.org/10.1021/acsphotonics.5c02836},
pmid = {42491450},
pmcid = {PMC13377594}
}

RIS

TY - JOUR
AU - Bram, Lanna
AU - Tal-Friedman, Ofir
AU - Fibeesh, Neta
AU - Deek, Jasline
AU - Bar-Sinai, Yohai
AU - Flaxer, Eli
AU - Roichman, Yael
AU - Ebenstein, Yuval
AU - Jeffet, Jonathan
TI - A Dispersive Image Scanning Microscope for Multi-color High-resolution Imaging
T2 - ACS photonics
J2 - ACS Photonics
PY - 2026
DA - 2026/06/23
VL - 13
IS - 14
SP - 3796
EP - 3807
SN - 2330-4022
PB - American Chemical Society
DO - 10.1021/acsphotonics.5c02836
UR - https://doi.org/10.1021/acsphotonics.5c02836
LA - en
ER -

CSL-JSON

{
"id": "10.1021/acsphotonics.5c02836",
"type": "article-journal",
"title": "A Dispersive Image Scanning Microscope for Multi-color High-resolution Imaging",
"container-title": "ACS photonics",
"author": [
{
"family": "Bram",
"given": "Lanna"
},
{
"family": "Tal-Friedman",
"given": "Ofir"
},
{
"family": "Fibeesh",
"given": "Neta"
},
{
"family": "Deek",
"given": "Jasline"
},
{
"family": "Bar-Sinai",
"given": "Yohai"
},
{
"family": "Flaxer",
"given": "Eli"
},
{
"family": "Roichman",
"given": "Yael"
},
{
"family": "Ebenstein",
"given": "Yuval"
},
{
"family": "Jeffet",
"given": "Jonathan"
}
],
"container-title-short": "ACS Photonics",
"volume": "13",
"issue": "14",
"page": "3796-3807",
"DOI": "10.1021/acsphotonics.5c02836",
"PMID": "42491450",
"PMCID": "PMC13377594",
"ISSN": "2330-4022",
"publisher": "American Chemical Society",
"URL": "https://doi.org/10.1021/acsphotonics.5c02836",
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
23
]
]
}
}

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.crmeth.2026.101476 [code]
Unsupervised deep learning enables blur-free resolution enhancement in two-photon microscopy.
Journal: Cell reports methods
In common: tifffile, pandas, SciPy, 2 other tools, histology / microscopy, 1 reference
[2] doi:10.1038/s41593-026-02267-3 [code]
Spatial proteomic analysis in human Alzheimer's disease brains enables identification of microenvironment-dependent microglial cell states.
Journal: Nature neuroscience
In common: CuPy, tifffile, pandas, 3 other tools
[3] doi:10.1038/s41467-026-75352-7 [code]
Mechanosensory encoding of surface mechanics optimizes locomotion.
Journal: Nature communications
In common: tifffile, pandas, SciPy, 2 other tools, 1 reference
[4] doi:10.1016/j.isci.2026.117010 [code]
Deep learning-assisted mapping of dendritic spines using sequential 2D two-photon calcium imaging.
Journal: iScience
In common: tifffile, pandas, SciPy, 2 other tools, histology / microscopy, 1 reference
[5] doi:10.1038/s41598-026-57519-w [code]
Automated segmentation of neurons and spinal cord structures in immunofluorescence images using SpineDL.
Journal: Scientific reports
In common: tifffile, pandas, SciPy, 2 other tools, histology / microscopy, 1 reference
[6] doi:10.1016/j.bpr.2026.100280 [code]
Morphometric analysis reveals that the chick cranial neural tube expands as an active shell.
Journal: Biophysical reports
In common: tifffile, pandas, SciPy, 2 other tools, 1 reference
[7] doi:10.1371/journal.pcbi.1013441 [code]
Large vision model framework for automated C. elegans analysis: From static morphometry to dynamic neural activity.
Journal: PLoS computational biology
In common: tifffile, pandas, SciPy, 2 other tools, 1 reference
[8] 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: tifffile, pandas, SciPy, 2 other tools, 1 reference
[9] doi:10.64898/2026.03.30.715222 [code]
Synthetic lumen rounding directs neural progenitor division mode
Journal: bioRxiv (preprint)
In common: tifffile, pandas, SciPy, 2 other tools, 1 reference
[10] doi:10.1126/sciadv.aef9926 [code]
aDISCO: A clearing method to enable 3D microscopy of large archival paraffin-embedded human tissue blocks.
Journal: Science advances
In common: tifffile, SciPy, Matplotlib, 1 other tool, histology / microscopy, 1 reference

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.