An Open-Source Pipeline for Calcium Imaging and All-Optical Physiology in Human Stem Cell-Derived Neurons.
The 19 matches
- [1] § Experimental Section/Methods › Evoked Activity Experiments ↔ src/cali/sqlmodel/_util.py, lines 544–665 · score 0.87 · LED power, pulse duration, stimulation events, optogenetic stimulation, Detected peaks, Peak amplitudes
- [2] § Experimental Section/Methods › Peak Detection ↔ src/cali/gui/_analysis_gui.py, lines 790–849 · score 0.82 · minimum peak height, find peaks, F0 traces, calcium transients, scipy, noise
- [3] § Experimental Section/Methods › Evoked Activity Experiments ↔ src/cali/sqlmodel/_visualize_experiment.py, lines 260–338 · score 0.78 · stimulation parameters, LED power, evoked activity, pulse duration, stimulation mask, frame
- [4] § Results › Quantification of Optically Evoked Activity ↔ src/cali/plot/_single_wells_plots/correlation/_plot_evoked_correlation_synchrony.py, lines 1097–1182 · score 0.76 · Stim median, Pairwise Pearson Correlation, Global median, Stim Periods, Stim Windows, stimulated ROIs
- [5] § Experimental Section/Methods › Multi‐Dimensional Acquisition (MDA) Interface ↔ src/micromanager_gui/_widgets/_mm_console.py, lines 49–144 · score 0.75 · micromanager gui, pymmcore plus, Python, useq, MDA, widgets
- [6] § Experimental Section/Methods › Peak Detection ↔ src/cali/sqlmodel/_util.py, lines 544–665 · score 0.74 · OASIS package, prominence threshold, peak height, inter, dynamically, denoised
- [7] § Results › Modular Acquisition Platform for Calcium Imaging and Optogenetics ↔ src/micromanager_gui/_widgets/_mm_console.py, lines 49–144 · score 0.69 · micromanager gui, pymmcore plus, Python, useq, widgets
- [8] § Experimental Section/Methods › Features Extraction ↔ src/cali/analysis/_analysis_runner.py, lines 263–407 · score 0.68 · inter event interval, mask area, peak amplitude, IEI, active, trace
- [9] § Results › Quantification of Optically Evoked Activity ↔ src/cali/plot/_single_wells_plots/correlation/_plot_evoked_correlation_synchrony.py, lines 552–685 · score 0.67 · pairwise Pearson correlation, global median, stimulated neurons, synchrony, evoked, stimulus
- [10] § Experimental Section/Methods › Statistical Independence and Experimental Replicates ↔ src/cali/plot/_multi_wells_plots/_util.py, lines 391–488 · score 0.62 · biological replicate, technical replicates, hierarchical, nested, ROI, FOVs
- [11] § Experimental Section/Methods › Multi‐Dimensional Acquisition (MDA) Interface ↔ src/micromanager_gui/_widgets/_viewers/_mda_viewer/_data_wrappers.py, lines 19–68 · score 0.59 · micromanager gui, pymmcore plus, MDA, widgets
- [12] § Results › Integrated Data Exploration and Analysis via Cali ↔ src/cali/sqlmodel/_model.py, lines 751–803 · score 0.58 · custom Cellpose, custom model, Quality, Cyto3, segmentation, Cali
- [13] § Experimental Section/Methods › Multi‐Dimensional Acquisition (MDA) Interface ↔ src/micromanager_gui/_engine.py, lines 66–126 · score 0.56 · hardware autofocus devices, MDA, channel, position, GUI
- [14] § Results › Modular Acquisition Platform for Calcium Imaging and Optogenetics ↔ src/micromanager_gui/_widgets/_viewers/_mda_viewer/_data_wrappers.py, lines 19–68 · score 0.54 · micromanager gui, pymmcore plus, platform, widgets
- [15] § Experimental Section/Methods › Quantitative Evaluation of Segmentation With a Custom Trained Cellpose Model ↔ src/micromanager_gui/_realtime_cellpose_segmentation.py, lines 131–197 · score 0.53 · Cellpose model, pretrained, Cyto3, Segmentation
- [16] § Experimental Section/Methods › Quantitative Evaluation of Segmentation With a Custom Trained Cellpose Model ↔ src/cali/sqlmodel/_model.py, lines 751–803 · score 0.52 · Cellpose model, Quality, Cyto3, detections, Segmentation
- [17] § Results › Integrated Data Exploration and Analysis via Cali ↔ src/cali/analysis/_fov_metrics.py, lines 1440–1562 · score 0.52 · Pearson correlation matrices, calcium traces, metrics, row, synchrony, denoised
- [18] § Experimental Section/Methods › Data Analysis ↔ src/cali/gui/_cali_gui.py, lines 1967–2096 · score 0.51 · cali GUI, plate maps, genotypes, treatment
- [19] § Experimental Section/Methods › Compute ΔF/F0 ↔ src/cali/gui/_extraction_gui.py, lines 395–527 · score 0.51 · sliding window, fluorescence F0, baseline, timepoint, traces
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 · 666 lines · 24 KB · BSD-3-Clause · 2 matches
- """Utility functions for cali.sqlmodel database operations.
- This module provides helper functions for database operations including:
- - Creating database tables
- - Loading experiments from database
- - Checking analysis settings consistency
- """
- from __future__ import annotations
- from dataclasses import dataclass, replace
- from pathlib import Path
- from typing import TYPE_CHECKING, Any, TypeVar
- from sqlalchemy import text
- from sqlalchemy.exc import IntegrityError
- from sqlmodel import Session, create_engine, select
- from cali._constants import DEFAULT_CALI_DB_NAME
- from ._model import Experiment
- if TYPE_CHECKING:
- from sqlalchemy.engine import Engine
- from cali.logger import cali_logger
- def migrate_analysis_settings(engine: Engine) -> None:
- """Add missing columns to analysis_settings table for existing databases.
- This is safe to call multiple times — it only adds columns that don't exist.
- """
- with engine.connect() as conn:
- existing_cols = {
- row[1] for row in conn.execute(text("PRAGMA table_info(analysis_settings)"))
- }
- if not existing_cols:
- return # table doesn't exist yet
- if "enable_calcium" not in existing_cols:
- conn.execute(
- text(
- "ALTER TABLE analysis_settings "
- "ADD COLUMN enable_calcium BOOLEAN DEFAULT 1 NOT NULL"
- )
- )
- if "enable_spikes" not in existing_cols:
- conn.execute(
- text(
- "ALTER TABLE analysis_settings "
- "ADD COLUMN enable_spikes BOOLEAN DEFAULT 1 NOT NULL"
- )
- )
- conn.commit()
- def create_database_and_tables(engine: Engine) -> None:
- """Create all database tables.
- Parameters
- ----------
- engine : sqlalchemy.engine.Engine
- Database engine
- Example
- -------
- >>> from sqlmodel import create_engine
- >>> from cali.sqlmodel import create_database_and_tables
- >>> engine = create_engine("sqlite:///calcium_analysis.db")
- >>> create_database_and_tables(engine)
- """
- from sqlmodel import SQLModel
- # Import all models to register them with SQLModel metadata
- from ._model import ( # noqa: F401
- FOV,
- ROI,
- AnalysisSettings,
- CaliResult,
- Condition,
- DataAnalysis,
- DetectionSettings,
- ExtractionSettings,
- FOVAnalysis,
- Mask,
- Plate,
- Traces,
- Well,
- WellCondition,
- )
- SQLModel.metadata.create_all(engine)
- migrate_analysis_settings(engine)
- def save_experiment_to_database(
- experiment: Experiment,
- output_path: Path | str,
- *,
- database_name: str = DEFAULT_CALI_DB_NAME,
- overwrite: bool = False,
- echo: bool = False,
- ) -> None:
- """Save an experiment object tree to a SQLite database.
- This function saves the experiment and returns nothing, following SQLModel
- best practices of not returning objects to discourage keeping large object
- trees in memory. Load the experiment fresh from the database when needed
- using load_experiment_from_database().
- Parameters
- ----------
- experiment : Experiment
- Experiment object
- output_path : Path | str
- Output directory to save the database file.
- database_name : str, optional
- Name of the database file (e.g., "cali.db"). Defaults to "results.cali".
- overwrite : bool, optional
- Whether to overwrite existing database file, by default False
- echo : bool, optional
- Whether to enable SQLAlchemy engine echo for debugging, by default False
- Example
- -------
- >>> from pathlib import Path
- >>> save_experiment_to_database(exp, overwrite=True)
- >>> # Later, load fresh from DB when needed:
- >>> db_path = Path(exp.output_path) / exp.database_name
- >>> exp = load_experiment_from_database(db_path)
- """
- # Determine database path
- db_name = database_name if database_name is not None else DEFAULT_CALI_DB_NAME
- assert db_name is not None # Guaranteed by the check above
- if not db_name.endswith(".cali"):
- db_name += ".cali"
- db_path = Path(output_path) / db_name
- # Ensure parent directory exists
- db_path.parent.mkdir(parents=True, exist_ok=True)
- if overwrite and db_path.exists():
- db_path.unlink()
- engine = create_engine(
- f"sqlite:///{db_path}",
- echo=echo,
- connect_args={"timeout": 30.0, "check_same_thread": False},
- pool_pre_ping=True,
- )
- create_database_and_tables(engine)
- try:
- with Session(engine) as session:
- # Pre-resolve conditions BEFORE merge to avoid session.merge()
- # limitations with link_model many-to-many relationships.
- # Safely check if plate is loaded without triggering lazy load
- # on detached instance
- from sqlalchemy import inspect as sa_inspect
- from sqlalchemy import or_
- from cali.sqlmodel._model import Condition
- insp = sa_inspect(experiment)
- plate_loaded = "plate" in insp.dict and insp.dict["plate"] is not None
- # Store original well-to-conditions mapping BEFORE merge
- well_condition_map: dict[int, list[tuple[str, str]]] = {}
- if plate_loaded and experiment.plate is not None:
- # Collect all unique (name, condition_type) pairs from all wells
- conditions_needed: set[tuple[str, str]] = set()
- for idx, well in enumerate(experiment.plate.wells):
- # Store this well's condition keys
- well_keys = [(c.name, c.condition_type) for c in well.conditions]
- well_condition_map[idx] = well_keys
- conditions_needed.update(well_keys)
- # Batch fetch existing conditions in ONE query
- condition_lookup: dict[tuple[str, str], Condition] = {}
- if conditions_needed:
- or_clauses = [
- (Condition.name == name) & (Condition.condition_type == ctype)
- for name, ctype in conditions_needed
- ]
- existing = session.exec(
- select(Condition).where(or_(*or_clauses))
- ).all()
- condition_lookup = {(c.name, c.condition_type): c for c in existing}
- # Merge experiment into session first
- merged_exp = session.merge(experiment)
- # Now fix up conditions on the session-attached wells
- if plate_loaded and merged_exp.plate is not None:
- for idx, well in enumerate(merged_exp.plate.wells):
- # Use original well's condition keys (before merge)
- condition_keys = well_condition_map.get(idx, [])
- if not condition_keys:
- # No conditions for this well, skip it
- continue
- resolved_conditions: list[Condition] = []
- for key in condition_keys:
- existing_cond = condition_lookup.get(key)
- if existing_cond:
- # Use existing condition from DB
- resolved_conditions.append(existing_cond)
- else:
- # Condition doesn't exist - query for it
- name, ctype = key
- stmt = select(Condition).where(
- (Condition.name == name)
- & (Condition.condition_type == ctype)
- )
- cond_in_session = session.exec(stmt).first()
- if cond_in_session:
- resolved_conditions.append(cond_in_session)
- # else: condition not found, skip it
- # Assign resolved conditions (replaces whatever merge() set)
- if resolved_conditions:
- well.conditions = resolved_conditions
- session.commit()
- # Refresh to get the ID assigned by the database
- session.refresh(merged_exp)
- # Update the original experiment object with the database ID
- experiment.id = merged_exp.id
- cali_logger.info(
- f"💾 Experiment analysis updated and saved to database at {db_path}."
- )
- except IntegrityError as e:
- cali_logger.error(
- f"❌ Failed to save experiment to database. "
- f"Integrity constraint violated: {e}"
- )
- raise
- finally:
- # Dispose engine to release database connections (Windows compatibility)
- engine.dispose(close=True)
- def load_experiment_from_database(
- db_path: Path | str,
- experiment_name: str | None = None,
- echo: bool = False,
- ) -> Experiment | None:
- """Load an experiment from SQLite database with all relationships.
- This function loads a complete experiment snapshot for read-only analysis
- or display. The returned object is detached from the session (expunged) and
- can be used outside the session context.
- Parameters
- ----------
- db_path : Path | str
- Path to SQLite database file
- experiment_name : str | None, optional
- Name of specific experiment to load. If None, loads the first experiment.
- echo : bool, optional
- Whether to enable SQLAlchemy engine echo for debugging, by default False
- Returns
- -------
- Experiment | None
- Loaded experiment with all relationships, or None if not found.
- The object is detached (expunged) and can be used outside the session.
- Example
- -------
- >>> from pathlib import Path
- >>> # For read-only display/analysis:
- >>> exp = load_experiment_from_database("analysis.db", "my_experiment")
- >>> if exp:
- ... print(f"Loaded {len(exp.plate.wells)} wells")
- >>>
- >>> # For modifications, use engine + ID pattern instead:
- >>> engine = create_engine("sqlite:///analysis.db")
- >>> with Session(engine) as session:
- ... exp = session.get(Experiment, experiment_id)
- ... exp.name = "Updated Name" # Modify within session
- ... session.commit() # Save changes
- """
- from pathlib import Path
- from sqlalchemy.exc import OperationalError
- from sqlmodel import select
- # Check if database file exists
- db_path = Path(db_path) if isinstance(db_path, str) else db_path
- if not db_path.exists():
- return None
- # Convert to string for consistency
- db_path_str = str(db_path)
- engine = create_engine(
- f"sqlite:///{db_path_str}",
- echo=echo,
- connect_args={"timeout": 30.0, "check_same_thread": False},
- pool_pre_ping=True,
- )
- try:
- # Use context manager to ensure session is properly closed
- with Session(engine, expire_on_commit=False) as session:
- # Query for experiment
- if experiment_name:
- statement = select(Experiment).where(Experiment.name == experiment_name)
- else:
- statement = select(Experiment)
- try:
- experiment = session.exec(statement).first()
- except OperationalError:
- # Database exists but tables don't (corrupted or empty database)
- return None
- if not experiment:
- return None
- # Force load all relationships to prevent DetachedInstanceError
- _force_load_experiment_relationships(experiment)
- # Make the instance independent of the session
- session.expunge(experiment)
- # Session automatically closed here
- return experiment # type: ignore
- finally:
- # Dispose engine to release database connections (Windows compatibility)
- engine.dispose(close=True)
- def _force_load_experiment_relationships(experiment: Experiment) -> None:
- """Force load all experiment relationships to prevent DetachedInstanceError.
- This function eagerly loads all relationships on an experiment object while
- the session is still active, ensuring the object can be used outside the session.
- Parameters
- ----------
- experiment : Experiment
- The experiment object to load relationships for
- """
- # Force load ALL relationships deeply while session is still open
- # This prevents DetachedInstanceError when accessed later
- if experiment.plate:
- _ = len(experiment.plate.wells) # Force load wells
- for well in experiment.plate.wells:
- _ = len(well.conditions) # Force load conditions
- _ = len(well.fovs) # Force load fovs
- for fov in well.fovs:
- _ = len(fov.rois) # Force load rois
- for roi in fov.rois:
- # Force load all ROI relationships
- _ = len(roi.traces_history)
- _ = len(roi.data_analysis_history)
- _ = roi.roi_mask
- def has_fov_analysis(db_path: str | Path, fov_name: str) -> bool:
- """Check if a specific FOV has been analyzed by querying database directly.
- Directly queries the database to check if the FOV exists and has analyzed ROIs.
- Parameters
- ----------
- db_path : str | Path
- Path to the SQLite database file
- fov_name : str
- Name of the FOV to check (e.g., "B5_0000")
- Returns
- -------
- bool
- True if the FOV exists and has analyzed ROIs, False otherwise
- Example
- -------
- >>> from cali.sqlmodel import has_fov_analysis
- >>> if has_fov_analysis("analysis.db", "B5_0000"):
- ... print("B5_0000 has been analyzed")
- """
- from sqlmodel import select
- from ._model import FOV, ROI, Traces
- engine = create_engine(
- f"sqlite:///{db_path}",
- connect_args={"timeout": 30.0, "check_same_thread": False},
- pool_pre_ping=True,
- )
- try:
- with Session(engine) as session:
- # Check if this specific FOV has any ROIs with Traces entries
- # (which indicates the FOV has been analyzed)
- statement = (
- select(Traces).join(ROI).join(FOV).where(FOV.name == fov_name).limit(1)
- )
- result = session.exec(statement).first()
- return result is not None
- finally:
- engine.dispose(close=True)
- def has_experiment_analysis(db_path: str | Path) -> bool:
- """Check if experiment has any analyzed data by querying database directly.
- Directly queries the database to check if any ROIs exist with analysis data.
- Parameters
- ----------
- db_path : str | Path
- Path to the SQLite database file
- Returns
- -------
- bool
- True if any ROIs have analysis data, False otherwise
- Example
- -------
- >>> from cali.sqlmodel import has_experiment_analysis
- >>> if has_experiment_analysis("analysis.db"):
- ... print("Experiment has analysis data")
- """
- from sqlmodel import select
- from ._model import Traces
- engine = create_engine(
- f"sqlite:///{db_path}",
- connect_args={"timeout": 30.0, "check_same_thread": False},
- pool_pre_ping=True,
- )
- try:
- with Session(engine) as session:
- # Check if any Traces entries exist (indicates analysis has been run)
- statement = select(Traces).limit(1)
- result = session.exec(statement).first()
- return result is not None
- finally:
- engine.dispose(close=True)
- def _parse_well_name(well_name: str) -> tuple[int, int]:
- """Parse well name like 'B5' or 'AE19' into (row, column) indices.
- Supports both single-letter (A-Z) and multi-letter (AA, AB, ...) row names
- for plates with more than 26 rows.
- Parameters
- ----------
- well_name : str
- Well name (e.g., 'B5', 'A1', 'AE19')
- Returns
- -------
- tuple[int, int]
- (row, column) - Zero-indexed row and column
- Raises
- ------
- ValueError
- If well_name is not in the expected format
- """
- if not well_name or len(well_name) < 2:
- raise ValueError(
- f"Invalid well name: '{well_name}'. Expected format like 'B5', 'AE19'"
- )
- # Split into letter prefix and number suffix
- i = 0
- while i < len(well_name) and well_name[i].isalpha():
- i += 1
- if i == 0:
- raise ValueError(f"Invalid well name: '{well_name}'. Must start with letter(s)")
- if i == len(well_name) or not well_name[i:].isdigit():
- raise ValueError(
- f"Invalid well name: '{well_name}'. Expected format like 'B5', 'AE19' "
- f"(letter(s) followed by number)"
- )
- row_label = well_name[:i]
- row = _label_to_row_index(row_label)
- col = int(well_name[i:]) - 1
- return row, col
- def _label_to_row_index(label: str) -> int:
- """Convert well row label to zero-indexed row number.
- Supports single and multi-letter labels using base-26 alphabet.
- A=0, B=1, ..., Z=25, AA=26, AB=27, ..., AZ=51, etc.
- Parameters
- ----------
- label : str
- Row label (e.g., 'A', 'Z', 'AA', 'AE')
- Returns
- -------
- int
- Zero-indexed row number
- Examples
- --------
- >>> _label_to_row_index("A")
- 0
- >>> _label_to_row_index("Z")
- 25
- >>> _label_to_row_index("AA")
- 26
- >>> _label_to_row_index("AE")
- 30
- """
- label = label.upper()
- result = 0
- for char in label:
- result = result * 26 + (ord(char) - ord("A") + 1)
- return result - 1
- # OLD WAY TO STORE DATA --------------------------------------------------------------
- # Define a type variable for the BaseClass
- T = TypeVar("T", bound="BaseClass")
- @dataclass
- class BaseClass:
- """Base class for all classes in the package."""
- def replace(self: T, **kwargs: Any) -> T:
- """Replace the values of the dataclass with the given keyword arguments."""
- return replace(self, **kwargs)
- # fmt: off
- @dataclass
- class ROIData(BaseClass):
- """Data container for ROI (Region of Interest) analysis results.
- This dataclass stores comprehensive analysis data for a single ROI including
- raw fluorescence traces, neuropil correction, calcium dynamics (dff, denoised),
- peak detection, inferred spikes, and experimental metadata.
- Parameters
- ----------
- well_fov_position : str
- Position identifier (e.g., "B5_0000_p0" for well B5, fov0, position 0)
- raw_trace : list[float] | None
- Original raw fluorescence trace before any neuropil correction
- corrected_trace : list[float] | None
- Raw fluorescence trace after neuropil correction (if enabled),
- otherwise same as raw_trace. This is used for all
- downstream analysis.
- neuropil_trace : list[float] | None
- Fluorescence trace from the neuropil (donut-shaped region around ROI)
- neuropil_correction_factor : float | None
- Correction factor used for neuropil subtraction
- dff : list[float] | None
- ΔF/F (delta F over F) - normalized fluorescence change
- den_dff : list[float] | None
- Denoised ΔF/F trace (using OASIS algorithm) for calcium event detection
- peaks_den_dff : list[float] | None
- Indices of detected peaks in the denoised trace
- peaks_amplitudes_den_dff : list[float] | None
- Amplitude values of detected peaks in denoised trace
- peaks_prominence_den_dff : float | None
- Prominence threshold used for peak detection
- peaks_height_den_dff : float | None
- Height threshold used for peak detection
- inferred_spikes : list[float] | None
- Inferred spike probabilities from deconvolution
- inferred_spikes_threshold : float | None
- Threshold for spike detection
- den_dff_frequency : float | None
- Frequency of calcium events in Hz
- condition_1 : str | None
- First experimental condition (e.g., genotype)
- condition_2 : str | None
- Second experimental condition (e.g., treatment)
- cell_size : float | None
- ROI area in µm² or pixels
- cell_size_units : str | None
- Units for cell_size ("µm" or "pixel")
- elapsed_time_list_ms : list[float] | None
- Timestamp for each frame in milliseconds
- total_recording_time_sec : float | None
- Total recording duration in seconds
- active : bool | None
- Whether the ROI shows calcium activity (has detected peaks)
- iei : list[float] | None
- Inter-event intervals between calcium peaks (in seconds)
- evoked_experiment : bool
- Whether this is an optogenetic stimulation experiment
- stimulated : bool
- Whether this ROI overlaps with the stimulated area
- stimulations_frames_and_powers : dict[str, int] | None
- Frame numbers and LED powers for stimulation events
- led_pulse_duration : str | None
- Duration of LED pulse in stimulation experiments
- led_power_equation : str | None
- Equation to calculate LED power density (mW/cm²)
- calcium_sync_jitter_window : int | None
- Jitter window (frames) for calcium peak synchrony analysis
- spikes_sync_cross_corr_lag : int | None
- Maximum lag (frames) for spike cross-correlation synchrony
- calcium_network_threshold : float | None
- Percentile threshold (0-100) for network connectivity
- spikes_burst_threshold : float | None
- Threshold (%) for burst detection in spike trains
- spikes_burst_min_duration : int | None
- Minimum burst duration in seconds
- spikes_burst_gaussian_sigma : float | None
- Sigma for Gaussian smoothing in burst detection (seconds)
- mask_coord_and_shape : tuple[tuple[list[int], list[int]], tuple[int, int]] | None
- ROI mask stored as ((y_coords, x_coords), (height, width))
- neuropil_mask_coord_and_shape : tuple | None
- Neuropil mask: ((y_coords, x_coords), (height, width))
- """
- well_fov_position: str = ""
- raw_trace: list[float] | None = None
- corrected_trace: list[float] | None = None
- neuropil_trace: list[float] | None = None
- neuropil_correction_factor: float | None = None
- dff: list[float] | None = None
- den_dff: list[float] | None = None # denoised dff with oasis package
- peaks_den_dff: list[float] | None = None
- peaks_amplitudes_den_dff: list[float] | None = None
- peaks_prominence_den_dff: float | None = None
- peaks_height_den_dff: float | None = None
- inferred_spikes: list[float] | None = None
- inferred_spikes_threshold: float | None = None
- den_dff_frequency: float | None = None # Hz
- condition_1: str | None = None
- condition_2: str | None = None
- cell_size: float | None = None
- cell_size_units: str | None = None
- elapsed_time_list_ms: list[float] | None = None # in ms
- total_recording_time_sec: float | None = None # in seconds
- active: bool | None = None
- iei: list[float] | None = None # interevent interval
- evoked_experiment: bool = False
- stimulated: bool = False
- stimulations_frames_and_powers: dict[str, int] | None = None
- led_pulse_duration: str | None = None
- led_power_equation: str | None = None # equation for LED power
- calcium_sync_jitter_window: int | None = None # in frames
- spikes_sync_cross_corr_lag: int | None = None # in frames
- calcium_network_threshold: float | None = None # percentile (0-100)
- spikes_burst_threshold: float | None = None # in percent
- spikes_burst_min_duration: int | None = None # in seconds
- spikes_burst_gaussian_sigma: float | None = None # in seconds
- # store ROI mask as coordinates (y_coords, x_coords) and shape (height, width)
- mask_coord_and_shape: tuple[tuple[list[int], list[int]], tuple[int, int]] | None = None # noqa: E501
- # store neuropil mask as coordinates (y_coords, x_coords) and shape (height, width)
- neuropil_mask_coord_and_shape: tuple[tuple[list[int], list[int]], tuple[int, int]] | None = None # noqa: E501
- # fmt: on
_util.py at commit 336e7b5, under BSD-3-Clause · at the source
Overview
- Department of Neurology, F.M. Kirby Neurobiology Center, Harvard Medical School, Boston Children's Hospital, Boston, Massachusetts, USA
- Rosamund Stone Zander and Hansjoerg Wyss Translational Neuroscience Center, Boston, Massachusetts, USA
- Department of Systems Biology, Harvard Medical School, Boston, Massachusetts, USA
- Human Neuron Core, Boston Children's Hospital, Boston, Massachusetts, USA
Abstract
High‐throughput, single‐cell resolution profiling of neuronal activity is critical for understanding brain function and modeling neurological disorders, yet existing approaches are often limited by scalability and manual workflows. Here, we present an open‐source, scalable imaging and analysis platform that integrates optogenetic stimulation, calcium imaging, automated acquisition, single‐cell and network analyses. The platform enables robust quantification of spontaneous and evoked neuronal activity across hundreds of human stem cell‐derived neurons over multiple timepoints, supporting functional phenotyping at both cellular and network levels. We demonstrate the versatility of the platform across multiple disease‐relevant contexts, including models of CDKL5 Deficiency, SSADH Deficiency, and tuberous sclerosis complex (TSC). Additionally, we generate CRISPR‐Cas9 knock‐in hiPSC lines expressing GCaMP6s and demonstrate partial reversal through pharmacological intervention in TSC. By linking single‐cell dynamics to network‐level measures, this platform provides a generalizable framework for scalable functional phenotyping and high‐throughput screening in human neuronal models.
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 19 matches between paragraphs and lines of code.
fdrgsp/micromanager-gui
c6b565b09a3042be0c67c95388c59e2d26ad068d, 8 July 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
48 files
- src/
micromanager_gui/ , Python, 15 lines__init__.py - src/
micromanager_gui/ , Python, 66 lines__main__.py - src/
micromanager_gui/ , Python, 332 lines_core_link.py - src/
micromanager_gui/ , Python, 232 lines, 1 match_engine.py - src/
micromanager_gui/ , Python, 145 lines_main_window.py - src/
micromanager_gui/ , Python, 354 lines_menubar/ _menubar.py - src/
micromanager_gui/ , Python, 197 lines, 1 match_realtime_cellpose_segme ntation.py - src/
micromanager_gui/ , Python, 51 lines_slackbot/ _mm_slackbot.py - src/
micromanager_gui/ , Python, 217 lines_slackbot/ _slackbot.py - src/
micromanager_gui/ , Python, 107 lines_slackbot/ _slackbot_process.py - src/
micromanager_gui/ , Python, 66 lines_toolbar/ _shutters_toolbar.py - src/
micromanager_gui/ , Python, 45 lines_toolbar/ _snap_live.py - src/
micromanager_gui/ , Python, 14 lines_widgets/ _install_widget.py - src/
micromanager_gui/ , Python, 5 lines_widgets/ _mda_widget/ __init__.py - src/
micromanager_gui/ , Python, 3 lines_widgets/ _mda_widget/ _arduino/ __init__.py - src/
micromanager_gui/ , Python, 407 lines_widgets/ _mda_widget/ _arduino/ _arduino_led_dialog.py - src/
micromanager_gui/ , Python, 87 lines_widgets/ _mda_widget/ _arduino/ _arduino_led_widget.py - src/
micromanager_gui/ , Python, 464 lines_widgets/ _mda_widget/ _mda_widget.py - src/
micromanager_gui/ , Python, 229 lines_widgets/ _mda_widget/ _realtime_cellpose_segme ntation_wdg.py - src/
micromanager_gui/ , Python, 229 lines_widgets/ _mda_widget/ _save_widget.py - src/
micromanager_gui/ , Python, 144 lines, 2 matches_widgets/ _mm_console.py - src/
micromanager_gui/ , Python, 47 lines_widgets/ _snap_live_buttons.py - src/
micromanager_gui/ , Python, 98 lines_widgets/ _stage_control.py - src/
micromanager_gui/ , Python, 4 lines_widgets/ _viewers/ __init__.py - src/
micromanager_gui/ , Python, 3 lines_widgets/ _viewers/ _mda_viewer/ __init__.py - src/
micromanager_gui/ , Python, 121 lines, 2 matches_widgets/ _viewers/ _mda_viewer/ _data_wrappers.py - src/
micromanager_gui/ , Python, 50 lines_widgets/ _viewers/ _mda_viewer/ _mda_save_button.py - src/
micromanager_gui/ , Python, 81 lines_widgets/ _viewers/ _mda_viewer/ _mda_viewer.py - src/
micromanager_gui/ , Python, 3 lines_widgets/ _viewers/ _preview_viewer/ __init__.py - src/
micromanager_gui/ , Python, 70 lines_widgets/ _viewers/ _preview_viewer/ _preview_save_button.py - src/
micromanager_gui/ , Python, 183 lines_widgets/ _viewers/ _preview_viewer/ _preview_viewer.py - src/
micromanager_gui/ , Python, 6 lines_writers/ __init__.py - src/
micromanager_gui/ , Python, 129 lines_writers/ _ome_tiff.py - src/
micromanager_gui/ , Python, 119 lines_writers/ _tiff_sequence.py - src/
micromanager_gui/ , Python, 6 linesreaders/ __init__.py - src/
micromanager_gui/ , Python, 247 linesreaders/ _ome_zarr_reader.py - src/
micromanager_gui/ , Python, 267 linesreaders/ _tensorstore_zarr_reader .py - test_burst_plots.py, Python, 112 lines
- tests/
conftest.py , Python, 56 lines - tests/
test_custom_sequence.py , Python, 121 lines - tests/
test_gui.py , Python, 63 lines - tests/
test_mda_viewer.py , Python, 122 lines - tests/
test_readers_writers.py , Python, 131 lines - tests/
test_save_widget.py , Python, 103 lines - tests/
test_stage_widget.py , Python, 20 lines - wip_batch_analysis.py, Python, 110 lines
- LICENSE, License, 28 lines
- README.md, Text, 185 lines
fdrgsp/cali
336e7b59d0df7940ddc93d04b4f691b1303cfc3f, 11 June 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
181 files
- _dev/
_csv_bar_plot.py , Python, 559 lines - _dev/
_json_to_db.py , Python, 729 lines - _dev/
_to_csv.py , Python, 983 lines - _dev/
correlations.py , Python, 168 lines - _dev/
demo.ipynb , Jupyter, 77 lines - _dev/
example_load_from_json.p , Python, 21 linesy - _dev/
examples_run_analysis_fr , Jupyter, 47 linesom_database.ipynb - _dev/
examples_run_analysis_fr , Jupyter, 96 linesom_directories.ipynb - examples/
example_cali_run.py , Python, 74 lines - examples/
example_cali_run_importe , Python, 90 linesd_labels.py - examples/
example_cali_run_tiff_co , Python, 115 linesllection_imported_labels .py - examples/
example_create_experimen , Python, 74 linest.py - examples/
example_database_to_csv. , Python, 157 linespy - examples/
example_manual_run.py , Python, 115 lines - examples/
example_save_labels.py , Python, 7 lines - examples/
examples_plot_from_datab , Jupyter, 55 linesase.ipynb - examples/
tiff_collection_database , Python, 107 lines_example.py - examples/
tiff_collection_example. , Python, 73 linespy - src/
cali/ , Python, 17 lines__init__.py - src/
cali/ , Python, 202 lines__main__.py - src/
cali/ , Python, 179 lines_constants.py - src/
cali/ , Python, 14 linesanalysis/ __init__.py - src/
cali/ , Python, 407 lines, 1 matchanalysis/ _analysis_runner.py - src/
cali/ , Python, 164 linesanalysis/ _cluster_analysis.py - src/
cali/ , Python, 502 linesanalysis/ _fov_analysis.py - src/
cali/ , Python, 626 linesanalysis/ _fov_analysis_parallel.p y - src/
cali/ , Python, 1,562 lines, 1 matchanalysis/ _fov_metrics.py - src/
cali/ , Python, 290 linesanalysis/ _trace_analysis.py - src/
cali/ , Python, 5 linesdetection/ __init__.py - src/
cali/ , Python, 3 linesdetection/ _batch_cellpose/ __init__.py - src/
cali/ , Python, 269 linesdetection/ _batch_cellpose/ _batch_segmentation_mult iprocessing.py - src/
cali/ , Python, 400 linesdetection/ _detection_runner.py - src/
cali/ , Python, 5 linesextraction/ __init__.py - src/
cali/ , Python, 1 lineextraction/ _caiman.py - src/
cali/ , Python, 875 linesextraction/ _extraction_runner.py - src/
cali/ , Python, 225 linesextraction/ _neuropil.py - src/
cali/ , Python, 170 linesextraction/ _oasis_suite2p.py - src/
cali/ , Python, 128 linesextraction/ _util.py - src/
cali/ , Python, 5 linesgui/ __init__.py - src/
cali/ , Python, 1,463 lines, 1 matchgui/ _analysis_gui.py - src/
cali/ , Python, 3,194 lines, 1 matchgui/ _cali_gui.py - src/
cali/ , Python, 610 linesgui/ _detection_gui.py - src/
cali/ , Python, 646 lines, 1 matchgui/ _extraction_gui.py - src/
cali/ , Python, 60 linesgui/ _fov_table.py - src/
cali/ , Python, 702 linesgui/ _image_viewer.py - src/
cali/ , Python, 448 linesgui/ _import_labels_dialog.py - src/
cali/ , Python, 192 linesgui/ _init_dialog.py - src/
cali/ , Python, 627 linesgui/ _plate_map.py - src/
cali/ , Python, 154 linesgui/ _plate_plan_wizard.py - src/
cali/ , Python, 1,333 linesgui/ _pygraph_plot_widgets.py - src/
cali/ , Python, 178 linesgui/ _run_selection_dialog.py - src/
cali/ , Python, 568 linesgui/ _run_widget.py - src/
cali/ , Python, 1,059 linesgui/ _runs_panel.py - src/
cali/ , Python, 200 linesgui/ _save_as_widgets.py - src/
cali/ , Python, 535 linesgui/ _tiff_collection_widget. py - src/
cali/ , Python, 560 linesgui/ _util.py - src/
cali/ , Python, 6 lineslogger/ __init__.py - src/
cali/ , Python, 38 lineslogger/ _logger.py - src/
cali/ , Python, 27 linesplot/ __init__.py - src/
cali/ , Python, 1,325 linesplot/ _main_plot.py - src/
cali/ , Python, 116 linesplot/ _multi_wells_plots/ __init__.py - src/
cali/ , Python, 528 linesplot/ _multi_wells_plots/ _calcium_peaks.py - src/
cali/ , Python, 258 linesplot/ _multi_wells_plots/ _cell_properties.py - src/
cali/ , Python, 770 linesplot/ _multi_wells_plots/ _dimensionality_reductio n.py - src/
cali/ , Python, 199 linesplot/ _multi_wells_plots/ _evoked_activity.py - src/
cali/ , Python, 747 linesplot/ _multi_wells_plots/ _inferred_spikes.py - src/
cali/ , Python, 907 lines, 1 matchplot/ _multi_wells_plots/ _util.py - src/
cali/ , Python, 19 linesplot/ _single_wells_plots/ burst/ __init__.py - src/
cali/ , Python, 1,395 linesplot/ _single_wells_plots/ burst/ _plot_burst_activity.py - src/
cali/ , Python, 479 linesplot/ _single_wells_plots/ calcium_traces/ _plot_calcium_traces_dat a.py - src/
cali/ , Python, 461 linesplot/ _single_wells_plots/ calcium_traces/ _plot_neuropil_traces.py - src/
cali/ , Python, 793 linesplot/ _single_wells_plots/ cluster/ _plot_cluster_analysis.p y - src/
cali/ , Python, 446 linesplot/ _single_wells_plots/ correlation/ _plot_calcium_traces_cor relation.py - src/
cali/ , Python, 650 linesplot/ _single_wells_plots/ correlation/ _plot_connectivity.py - src/
cali/ , Python, 1,642 lines, 2 matchesplot/ _single_wells_plots/ correlation/ _plot_evoked_correlation _synchrony.py - src/
cali/ , Python, 326 linesplot/ _single_wells_plots/ correlation/ _plot_inferred_spike_syn chrony.py - src/
cali/ , Python, 607 linesplot/ _single_wells_plots/ correlation/ _plot_spike_max_lag_corr elation.py - src/
cali/ , Python, 358 linesplot/ _single_wells_plots/ correlation/ _plot_spike_max_lag_valu es.py - src/
cali/ , Python, 1,462 linesplot/ _single_wells_plots/ evoked/ _plot_evoked_experiment_ data_plots.py - src/
cali/ , Python, 277 linesplot/ _single_wells_plots/ evoked/ _stimulation_area.py - src/
cali/ , Python, 374 linesplot/ _single_wells_plots/ metrics/ _plot_calcium_amplitudes _and_frequencies_data.py - src/
cali/ , Python, 247 linesplot/ _single_wells_plots/ metrics/ _plot_calcium_peaks_iei_ data.py - src/
cali/ , Python, 213 linesplot/ _single_wells_plots/ metrics/ _plot_cell_size.py - src/
cali/ , Python, 182 linesplot/ _single_wells_plots/ metrics/ _plot_inferred_spikes_fr equency_data.py - src/
cali/ , Python, 497 linesplot/ _single_wells_plots/ raster/ _plot_calcium_peaks_rast er_plots.py - src/
cali/ , Python, 639 linesplot/ _single_wells_plots/ raster/ _plot_inferred_spike_ras ter_plots.py - src/
cali/ , Python, 653 linesplot/ _single_wells_plots/ spikes/ _plot_inferred_spikes.py - src/
cali/ , Python, 343 linesplot/ _util.py - src/
cali/ , Python, 12 linesreaders/ __init__.py - src/
cali/ , Python, 268 linesreaders/ _ome_zarr_reader.py - src/
cali/ , Python, 292 linesreaders/ _tensorstore_zarr_reader .py - src/
cali/ , Python, 527 linesreaders/ _tiff_collection_reader. py - src/
cali/ , Python, 5 linesrunner/ __init__.py - src/
cali/ , Python, 2,100 linesrunner/ _cali_runner.py - src/
cali/ , Python, 67 linessqlmodel/ __init__.py - src/
cali/ , Python, 110 linessqlmodel/ _data_to_plate.py - src/
cali/ , Python, 105 linessqlmodel/ _db_to_plate_map.py - src/
cali/ , Python, 152 linessqlmodel/ _db_to_useq_plate.py - src/
cali/ , Python, 2,055 lines, 2 matchessqlmodel/ _model.py - src/
cali/ , Python, 35 linessqlmodel/ _model_graph.py - src/
cali/ , Python, 59 linessqlmodel/ _plate_map_util.py - src/
cali/ , Python, 312 linessqlmodel/ _useq_plate_to_db.py - src/
cali/ , Python, 666 lines, 2 matchessqlmodel/ _util.py - src/
cali/ , Python, 465 lines, 1 matchsqlmodel/ _visualize_experiment.py - src/
cali/ , Python, 69 linesutil/ __init__.py - src/
cali/ , Python, 1,559 linesutil/ _database_to_csv.py - src/
cali/ , Python, 852 linesutil/ _util.py - tests/
__init__.py , Python, 1 line - tests/
conftest.py , Python, 367 lines - tests/
test_analysis_threading. , Python, 356 linespy - tests/
test_analysis_util.py , Python, 912 lines - tests/
test_auto_match.py , Python, 145 lines - tests/
test_bar_plot_condition_ , Python, 121 linesordering.py - tests/
test_basic.py , Python, 27 lines - tests/
test_calcium_burst_bar_p , Python, 426 lineslots.py - tests/
test_calcium_burst_plot. , Python, 145 linespy - tests/
test_cali_runner.py , Python, 4,810 lines - tests/
test_ccg_improvements.py , Python, 259 lines - tests/
test_cell_properties_plo , Python, 102 linests.py - tests/
test_cli.py , Python, 92 lines - tests/
test_cluster_analysis.py , Python, 184 lines - tests/
test_cluster_plots.py , Python, 1,052 lines - tests/
test_condition_colors.py , Python, 283 lines - tests/
test_conditions_dialog.p , Python, 176 linesy - tests/
test_connectivity_plot.p , Python, 1,005 linesy - tests/
test_correlation_vs_sync , Python, 480 lineshrony.py - tests/
test_cross_correlation_m , Python, 175 linesatrix.py - tests/
test_custom_model_persis , Python, 125 linestence.py - tests/
test_data/ , Python, 192 linesdata_and_db_for_tests/ rebuild_test_db.py - tests/
test_database_to_csv.py , Python, 876 lines - tests/
test_detection_gui.py , Python, 208 lines - tests/
test_dimensionality_redu , Python, 928 linesction_plots.py - tests/
test_enable_calcium_spik , Python, 629 lineses.py - tests/
test_evoked_activity_plo , Python, 227 linests.py - tests/
test_evoked_experiment_d , Python, 212 linesata_plots.py - tests/
test_export_group.py , Python, 393 lines - tests/
test_export_only_option. , Python, 469 linespy - tests/
test_extraction_util.py , Python, 309 lines - tests/
test_fov_analysis.py , Python, 910 lines - tests/
test_gui.py , Python, 1,740 lines - tests/
test_gui_database_only.p , Python, 574 linesy - tests/
test_gui_export.py , Python, 413 lines - tests/
test_gui_roi_highlight.p , Python, 189 linesy - tests/
test_image_viewer_highli , Python, 372 linesght.py - tests/
test_import_labels.py , Python, 116 lines - tests/
test_import_labels_dialo , Python, 109 linesg.py - tests/
test_inferred_spike_thre , Python, 350 linessholded_plots.py - tests/
test_inferred_spikes_bur , Python, 716 linesst_bar_plots.py - tests/
test_manual_run.py , Python, 139 lines - tests/
test_multi_well_bar_plot , Python, 240 lines.py - tests/
test_multi_well_bar_plot , Python, 551 liness_integration.py - tests/
test_multi_well_plot_uti , Python, 376 linesl.py - tests/
test_natural_sort.py , Python, 237 lines - tests/
test_neuropil.py , Python, 291 lines - tests/
test_numba_threading.py , Python, 111 lines - tests/
test_oasis_suite2p.py , Python, 94 lines - tests/
test_plate_map.py , Python, 354 lines - tests/
test_plot.py , Python, 239 lines - tests/
test_plot_display_integr , Python, 158 linesation.py - tests/
test_plot_legends.py , Python, 692 lines - tests/
test_plot_util.py , Python, 564 lines - tests/
test_plot_widgets.py , Python, 688 lines - tests/
test_readers.py , Python, 597 lines - tests/
test_results.py , Python, 1,378 lines - tests/
test_run_widget_comprehe , Python, 443 linesnsive.py - tests/
test_runner_csv_export.p , Python, 1,486 linesy - tests/
test_runner_edge_cases.p , Python, 1,124 linesy - tests/
test_runs_panel.py , Python, 2,060 lines - tests/
test_save_as_widgets.py , Python, 127 lines - tests/
test_saved_segmentation_ , Python, 109 linesselection.py - tests/
test_settings_save_load. , Python, 809 linespy - tests/
test_single_roi_correlat , Python, 207 linesion_filter.py - tests/
test_single_well_plot_in , Python, 1,702 linesteractions.py - tests/
test_spike_jitter_parame , Python, 197 linester.py - tests/
test_sqlmodel.py , Python, 2,507 lines - tests/
test_thresholded_spike_p , Python, 196 lineserformance.py - tests/
test_tiff_collection_wid , Python, 134 linesget.py - tests/
test_util.py , Python, 781 lines - tests/
test_with_cellpose.py , Python, 79 lines - LICENSE, License, 28 lines
- README.md, Text, 793 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:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 225 scripts, each with its path and the digest of its content;
- 19 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
Datasets cited
- figshare:29599163, at figshare; found in “Data Availability Statement”
Data Availability Statement
The data that support the findings of this study are openly available in FigShare 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 1, 30 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 13 authors, 6 keywords, 5 MeSH terms, 3 funders, 41 references, 3 RRIDs.
Cite
This paper
Afshar‐Saber, W., Gasparoli, F. M., Yang, Z., Teaney, N. A., Hobson, R., Lalani, L., Srinivasan, G., Whye, D., Karmakar, R., Buttermore, E. D., Winden, K. D., Chen, C., & Sahin, M. (2026). An Open-Source Pipeline for Calcium Imaging and All-Optical Physiology in Human Stem Cell-Derived Neurons. Advanced science (Weinheim, Baden-Wurttemberg, Germany), 13(26), e15887. https://
BibTeX
@article{afsharsaber2026
author = {Afshar‐Saber, Wardiya and Gasparoli, Federico M and Yang, Ziqin and Teaney, Nicole A and Hobson, Rachel and Lalani, Lahin and Srinivasan, Gayathri and Whye, Dosh and Karmakar, Ranit and Buttermore, Elizabeth D and Winden, Kellen D and Chen, Cidi and Sahin, Mustafa},
title = {{An Open-Source Pipeline for Calcium Imaging and All-Optical Physiology in Human Stem Cell-Derived Neurons}},
journal = {Advanced science (Weinheim, Baden-Wurttemberg, Germany)},
year = {2026},
month = mar,
volume = {13},
number = {26},
pages = {e15887},
publisher = {Wiley},
issn = {2198-3844},
doi = {10.1002/
url = {https://
pmid = {41801223},
pmcid = {PMC13159138}
}
RIS
TY - JOUR
AU - Afshar‐Saber, Wardiya
AU - Gasparoli, Federico M
AU - Yang, Ziqin
AU - Teaney, Nicole A
AU - Hobson, Rachel
AU - Lalani, Lahin
AU - Srinivasan, Gayathri
AU - Whye, Dosh
AU - Karmakar, Ranit
AU - Buttermore, Elizabeth D
AU - Winden, Kellen D
AU - Chen, Cidi
AU - Sahin, Mustafa
TI - An Open-Source Pipeline for Calcium Imaging and All-Optical Physiology in Human Stem Cell-Derived Neurons
T2 - Advanced science (Weinheim, Baden-Wurttemberg, Germany)
J2 - Adv Sci (Weinh)
PY - 2026
DA - 2026/
VL - 13
IS - 26
SP - e15887
SN - 2198-3844
PB - Wiley
DO - 10.1002/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1002/
"type": "article-journal",
"title": "An Open-Source Pipeline for Calcium Imaging and All-Optical Physiology in Human Stem Cell-Derived Neurons",
"container-title": "Advanced science (Weinheim, Baden-Wurttemberg, Germany)",
"author": [
{
"family": "Afshar‐Saber",
"given": "Wardiya"
},
{
"family": "Gasparoli",
"given": "Federico M"
},
{
"family": "Yang",
"given": "Ziqin"
},
{
"family": "Teaney",
"given": "Nicole A"
},
{
"family": "Hobson",
"given": "Rachel"
},
{
"family": "Lalani",
"given": "Lahin"
},
{
"family": "Srinivasan",
"given": "Gayathri"
},
{
"family": "Whye",
"given": "Dosh"
},
{
"family": "Karmakar",
"given": "Ranit"
},
{
"family": "Buttermore",
"given": "Elizabeth D"
},
{
"family": "Winden",
"given": "Kellen D"
},
{
"family": "Chen",
"given": "Cidi"
},
{
"family": "Sahin",
"given": "Mustafa"
}
],
"container-title-short":
"volume": "13",
"issue": "26",
"page": "e15887",
"DOI": "10.1002/
"PMID": "41801223",
"PMCID": "PMC13159138",
"ISSN": "2198-3844",
"publisher": "Wiley",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
9
]
]
}
}
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.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: Cellpose, tifffile, Numba, 7 other tools, 1 reference
- [2] doi:10.1038/s41467-026-71458-0 [code]
- Early differential impact of MeCP2 mutations on functional networks in Rett syndrome patient-derived human cortical organoids.Journal: Nature communicationsIn common: Cellpose, tifffile, Numba, 6 other tools, other condition
- [3] doi:10.1073/pnas.2609132123 [code]
- A human lysosomal storage disorder toolkit for decoding proteome landscapes in cortical-like and dopaminergic-like induced neurons.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: Cellpose, tifffile, scikit-image, 5 other tools, 1 reference
- [4] doi:10.1038/s41592-026-03065-2 [code]
- PinkyCaMP: an mScarlet-based calcium sensor with enhanced brightness, photostability and multiplexing capabilities.Journal: Nature methodsIn common: pandas, SciPy, Matplotlib, 1 other tool, optical imaging (calcium, voltage, 2-photon), 5 references
- [5] doi:10.1126/sciadv.aeb4205 [code]
- Learning stochastic dynamics and cell-fate landscapes from single-cell snapshots via optimal transport.Journal: Science advancesIn common: Cellpose, tifffile, scikit-image, 6 other tools
- [6] 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: tifffile, scikit-image, PyTorch, 5 other tools, optical imaging (calcium, voltage, 2-photon), 1 reference
- [7] doi:10.1038/s41598-026-57519-w [code]
- Automated segmentation of neurons and spinal cord structures in immunofluorescence images using SpineDL.Journal: Scientific reportsIn common: tifffile, Numba, scikit-image, 6 other tools, other condition
- [8] doi:10.1038/s41467-026-71418-8 [code]
- Deep visual proteomics uncovers nociceptor diversity and pain targets.Journal: Nature communicationsIn common: tifffile, Numba, scikit-image, 5 other tools, 1 reference
- [9] doi:10.1038/s42003-026-10063-9 [code]
- Conserved Kir channel mechanisms governing intrinsic excitability in human and rodent parvalbumin neurons.Journal: Communications biologyIn common: Cellpose, tifffile, scikit-image, 5 other tools
- [10] doi:10.1038/s41586-026-10323-y [code]
- Genetically encoded assembly recorder temporally resolves cellular history.Journal: NatureIn common: Cellpose, tifffile, scikit-image, 5 other tools
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: 2 repositories of the authors' code, each at its verified commit and with its license, 225 scripts, and 19 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:379885ee5e2a383d…
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.
