OSCR

Discrete and differentiated encoding of distinct components of spatial experience occurs within the proximodistal subfields of the dorsoventral axis of the hippocampus.

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 › Data processing and statistical analysis › IEG expression ↔ stardist/bioimageio_utils.py, lines 127–159 · score 0.71 · slide image, cell detection, Fiji, segmented, StarDist, imported

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 · 494 lines · 20 KB · BSD-3-Clause · 1 match

  1. from pathlib import Path
  2. try:
  3. from importlib.metadata import requires
  4. except ImportError:
  5. from importlib_metadata import requires
  6. from zipfile import ZipFile
  7. import numpy as np
  8. import tempfile
  9. from packaging.version import Version
  10. from csbdeep.utils import axes_check_and_normalize, normalize, _raise
  11. DEEPIMAGEJ_MACRO = \
  12. """
  13. //*******************************************************************
  14. // Date: July-2021
  15. // Credits: StarDist, DeepImageJ
  16. // URL:
  17. // https://github.com/stardist/stardist
  18. // https://deepimagej.github.io/deepimagej
  19. // This macro was adapted from
  20. // https://github.com/deepimagej/imagej-macros/blob/648caa867f6ccb459649d4d3799efa1e2e0c5204/StarDist2D_Post-processing.ijm
  21. // Please cite the respective contributions when using this code.
  22. //*******************************************************************
  23. // Macro to run StarDist postprocessing on 2D images.
  24. // StarDist and deepImageJ plugins need to be installed.
  25. // The macro assumes that the image to process is a stack in which
  26. // the first channel corresponds to the object probability map
  27. // and the remaining channels are the radial distances from each
  28. // pixel to the object boundary.
  29. //*******************************************************************
  30. // Get the name of the image to call it
  31. getDimensions(width, height, channels, slices, frames);
  32. name=getTitle();
  33. probThresh={probThresh};
  34. nmsThresh={nmsThresh};
  35. // Isolate the detection probability scores
  36. run("Make Substack...", "channels=1");
  37. rename("scores");
  38. // Isolate the oriented distances
  39. run("Fire");
  40. selectWindow(name);
  41. run("Delete Slice", "delete=channel");
  42. selectWindow(name);
  43. run("Properties...", "channels=" + maxOf(channels, slices) - 1 + " slices=1 frames=1 pixel_width=1.0000 pixel_height=1.0000 voxel_depth=1.0000");
  44. rename("distances");
  45. run("royal");
  46. // Run StarDist plugin
  47. run("Command From Macro", "command=[de.csbdresden.stardist.StarDist2DNMS], args=['prob':'scores', 'dist':'distances', 'probThresh':'" + probThresh + "', 'nmsThresh':'" + nmsThresh + "', 'outputType':'Both', 'excludeBoundary':'2', 'roiPosition':'Stack', 'verbose':'false'], process=[false]");
  48. """
  49. def _import(error=True):
  50. try:
  51. from importlib_metadata import metadata
  52. from bioimageio.core.build_spec import build_model # type: ignore
  53. import xarray as xr
  54. import bioimageio.core # type: ignore
  55. except ImportError:
  56. if error:
  57. raise RuntimeError(
  58. "Required libraries are missing for bioimage.io model export.\n"
  59. "Please install StarDist as follows: pip install 'stardist[bioimageio]'\n"
  60. "(You do not need to uninstall StarDist first.)"
  61. )
  62. else:
  63. return None
  64. return metadata, build_model, bioimageio.core, xr
  65. def _create_stardist_dependencies(outdir):
  66. from ruamel.yaml import YAML
  67. from packaging.requirements import Requirement
  68. from tensorflow import __version__ as tf_version
  69. from . import __version__ as stardist_version
  70. # dependencies that start with the name "bioimageio" will be added as conda dependencies
  71. reqs_conda = []
  72. for req_str in requires("stardist"):
  73. req = Requirement(req_str)
  74. if (
  75. req.marker is not None
  76. # only include requirements that are for the "bioimageio" extra
  77. and req.marker.evaluate({'extra': 'bioimageio'})
  78. and not req.marker.evaluate({'extra': ''})
  79. # and package name starts with "bioimageio"
  80. and req.name.startswith('bioimageio')
  81. ):
  82. # https://packaging.pypa.io/en/stable/requirements.html
  83. reqs_conda.append(f"{req.name}{req.specifier}")
  84. # only stardist and tensorflow as pip dependencies
  85. v_tf = Version(tf_version)
  86. reqs_pip = (f"stardist>={stardist_version}", f"tensorflow>={v_tf.major}.{v_tf.minor},<{v_tf.major+1}")
  87. # conda environment
  88. env = dict(
  89. name = 'stardist',
  90. channels = ['defaults', 'conda-forge'],
  91. dependencies = [
  92. ('python>=3.7,<3.8' if v_tf.major == 1 else 'python>=3.7'),
  93. *reqs_conda,
  94. 'pip', {'pip': reqs_pip},
  95. ],
  96. )
  97. yaml = YAML(typ='safe')
  98. path = outdir / "environment.yaml"
  99. with open(path, "w") as f:
  100. yaml.dump(env, f)
  101. return f"conda:{path}"
  102. def _create_stardist_doc(outdir):
  103. doc_path = outdir / "README.md"
  104. text = (
  105. "# StarDist Model\n"
  106. "This is a model for object detection with star-convex shapes.\n"
  107. "Please see the [StarDist repository](https://github.com/stardist/stardist) for details."
  108. )
  109. with open(doc_path, "w") as f:
  110. f.write(text)
  111. return doc_path
  112. def _get_stardist_metadata(outdir, model, generate_default_deps):
  113. metadata, *_ = _import()
  114. package_data = metadata("stardist")
  115. doi_2d = "https://doi.org/10.1007/978-3-030-00934-2_30"
  116. doi_3d = "https://doi.org/10.1109/WACV45572.2020.9093435"
  117. authors = {
  118. 'Martin Weigert': dict(name='Martin Weigert', github_user='maweigert'),
  119. 'Uwe Schmidt': dict(name='Uwe Schmidt', github_user='uschmidt83'),
  120. }
  121. data = dict(
  122. description=package_data["Summary"],
  123. authors=list(authors.get(name.strip(),dict(name=name.strip())) for name in package_data["Author"].split(",")),
  124. git_repo=package_data["Home-Page"],
  125. license=package_data["License"],
  126. cite=[{"text": "Cell Detection with Star-Convex Polygons", "doi": doi_2d},
  127. {"text": "Star-convex Polyhedra for 3D Object Detection and Segmentation in Microscopy", "doi": doi_3d}],
  128. tags=[
  129. 'fluorescence-light-microscopy', 'whole-slide-imaging', 'other', # modality
  130. f'{model.config.n_dim}d', # dims
  131. 'cells', 'nuclei', # content
  132. 'tensorflow', # framework
  133. 'fiji', # software
  134. 'unet', # network
  135. 'instance-segmentation', 'object-detection', # task
  136. 'stardist',
  137. ],
  138. covers=["https://raw.githubusercontent.com/stardist/stardist/main/images/stardist_logo.jpg"],
  139. documentation=_create_stardist_doc(outdir),
  140. )
  141. if generate_default_deps: # only if requested, as not required for bioimage.io
  142. data['dependencies'] = _create_stardist_dependencies(outdir)
  143. return data
  144. def _predict_tf(model_path, test_input):
  145. import tensorflow as tf
  146. from csbdeep.utils.tf import IS_TF_1
  147. # need to unzip the model assets
  148. model_assets = model_path.parent / "tf_model"
  149. with ZipFile(model_path, "r") as f:
  150. f.extractall(model_assets)
  151. if IS_TF_1:
  152. # make a new graph, i.e. don't use the global default graph
  153. with tf.Graph().as_default():
  154. with tf.Session() as sess:
  155. tf_model = tf.saved_model.load_v2(str(model_assets))
  156. x = tf.convert_to_tensor(test_input, dtype=tf.float32)
  157. model = tf_model.signatures["serving_default"]
  158. y = model(x)
  159. sess.run(tf.global_variables_initializer())
  160. output = sess.run(y["output"])
  161. else:
  162. tf_model = tf.saved_model.load(str(model_assets))
  163. x = tf.convert_to_tensor(test_input, dtype=tf.float32)
  164. model = tf_model.signatures["serving_default"]
  165. y = model(x)
  166. output = y["output"].numpy()
  167. return output
  168. def _get_weights_and_model_metadata(outdir, model, test_input, test_input_axes, test_input_norm_axes, mode, min_percentile, max_percentile):
  169. # get the path to the exported model assets (saved in outdir)
  170. if mode == "keras_hdf5":
  171. raise NotImplementedError("Export to keras format is not supported yet")
  172. elif mode == "tensorflow_saved_model_bundle":
  173. assets_uri = outdir / "TF_SavedModel.zip"
  174. model_csbdeep = model.export_TF(assets_uri, single_output=True, upsample_grid=True)
  175. else:
  176. raise ValueError(f"Unsupported mode: {mode}")
  177. # to force "inputs.data_type: float32" in the spec (bonus: disables normalization warning in model._predict_setup)
  178. test_input = test_input.astype(np.float32)
  179. # convert test_input to axes_net semantics and shape, also resize if necessary (to adhere to axes_net_div_by)
  180. test_input, axes_img, axes_net, axes_net_div_by, *_ = model._predict_setup(
  181. img=test_input,
  182. axes=test_input_axes,
  183. normalizer=None,
  184. n_tiles=None,
  185. show_tile_progress=False,
  186. predict_kwargs={},
  187. )
  188. # normalization axes string and numeric indices
  189. axes_norm = set(axes_net).intersection(set(axes_check_and_normalize(test_input_norm_axes, disallowed='S')))
  190. axes_norm = "".join(a for a in axes_net if a in axes_norm) # preserve order of axes_net
  191. axes_norm_num = tuple(axes_net.index(a) for a in axes_norm)
  192. # normalize input image
  193. test_input_norm = normalize(test_input, pmin=min_percentile, pmax=max_percentile, axis=axes_norm_num)
  194. net_axes_in = axes_net.lower()
  195. net_axes_out = axes_check_and_normalize(model._axes_out).lower()
  196. ndim_tensor = len(net_axes_out) + 1
  197. input_min_shape = list(axes_net_div_by)
  198. input_min_shape[axes_net.index('C')] = model.config.n_channel_in
  199. input_step = list(axes_net_div_by)
  200. input_step[axes_net.index('C')] = 0
  201. # add the batch axis to shape and step
  202. input_min_shape = [1] + input_min_shape
  203. input_step = [0] + input_step
  204. # the axes strings in bioimageio convention
  205. input_axes = "b" + net_axes_in.lower()
  206. output_axes = "b" + net_axes_out.lower()
  207. if mode == "keras_hdf5":
  208. output_names = ("prob", "dist") + (("class_prob",) if model._is_multiclass() else ())
  209. output_n_channels = (1, model.config.n_rays,) + ((1,) if model._is_multiclass() else ())
  210. # the output shape is computed from the input shape using
  211. # output_shape[i] = output_scale[i] * input_shape[i] + 2 * output_offset[i]
  212. output_scale = [1]+list(1/g for g in model.config.grid) + [0]
  213. output_offset = [0]*(ndim_tensor)
  214. elif mode == "tensorflow_saved_model_bundle":
  215. if model._is_multiclass():
  216. raise NotImplementedError("Tensorflow SavedModel not supported for multiclass models yet")
  217. # regarding input/output names: https://github.com/CSBDeep/CSBDeep/blob/b0d2f5f344ebe65a9b4c3007f4567fe74268c813/csbdeep/utils/tf.py#L193-L194
  218. input_names = ["input"]
  219. output_names = ["output"]
  220. output_n_channels = (1 + model.config.n_rays,)
  221. # the output shape is computed from the input shape using
  222. # output_shape[i] = output_scale[i] * input_shape[i] + 2 * output_offset[i]
  223. # same shape as input except for the channel dimension
  224. output_scale = [1]*(ndim_tensor)
  225. output_scale[output_axes.index("c")] = 0
  226. # no offset, except for the input axes, where it is output channel / 2
  227. output_offset = [0.0]*(ndim_tensor)
  228. output_offset[output_axes.index("c")] = output_n_channels[0] / 2.0
  229. assert all(s in (0, 1) for s in output_scale), "halo computation assumption violated"
  230. halo = model._axes_tile_overlap(output_axes.replace('b', 's'))
  231. halo = [int(np.ceil(v/8)*8) for v in halo] # optional: round up to be divisible by 8
  232. # the output shape needs to be valid after cropping the halo, so we add the halo to the input min shape
  233. input_min_shape = [ms + 2 * ha for ms, ha in zip(input_min_shape, halo)]
  234. # make sure the input min shape is still divisible by the min axis divisor
  235. input_min_shape = input_min_shape[:1] + [ms + (-ms % div_by) for ms, div_by in zip(input_min_shape[1:], axes_net_div_by)]
  236. assert all(ms % div_by == 0 for ms, div_by in zip(input_min_shape[1:], axes_net_div_by))
  237. metadata, *_ = _import()
  238. package_data = metadata("stardist")
  239. is_2D = model.config.n_dim == 2
  240. weights_file = outdir / "stardist_weights.h5"
  241. model.keras_model.save_weights(str(weights_file))
  242. config = dict(
  243. stardist=dict(
  244. python_version=package_data["Version"],
  245. thresholds=dict(model.thresholds._asdict()),
  246. weights=weights_file.name,
  247. config=vars(model.config),
  248. )
  249. )
  250. if is_2D:
  251. macro_file = outdir / "stardist_postprocessing.ijm"
  252. with open(str(macro_file), 'w', encoding='utf-8') as f:
  253. f.write(DEEPIMAGEJ_MACRO.format(probThresh=model.thresholds.prob, nmsThresh=model.thresholds.nms))
  254. config['stardist'].update(postprocessing_macro=macro_file.name)
  255. n_inputs = len(input_names)
  256. assert n_inputs == 1
  257. input_config = dict(
  258. input_names=input_names,
  259. input_min_shape=[input_min_shape],
  260. input_step=[input_step],
  261. input_axes=[input_axes],
  262. input_data_range=[["-inf", "inf"]],
  263. preprocessing=[[dict(
  264. name="scale_range",
  265. kwargs=dict(
  266. mode="per_sample",
  267. axes=axes_norm.lower(),
  268. min_percentile=min_percentile,
  269. max_percentile=max_percentile,
  270. ))]]
  271. )
  272. n_outputs = len(output_names)
  273. output_config = dict(
  274. output_names=output_names,
  275. output_data_range=[["-inf", "inf"]] * n_outputs,
  276. output_axes=[output_axes] * n_outputs,
  277. output_reference=[input_names[0]] * n_outputs,
  278. output_scale=[output_scale] * n_outputs,
  279. output_offset=[output_offset] * n_outputs,
  280. halo=[halo] * n_outputs
  281. )
  282. in_path = outdir / "test_input.npy"
  283. np.save(in_path, test_input[np.newaxis])
  284. if mode == "tensorflow_saved_model_bundle":
  285. test_outputs = _predict_tf(assets_uri, test_input_norm[np.newaxis])
  286. else:
  287. test_outputs = model.predict(test_input_norm)
  288. # out_paths = []
  289. # for i, out in enumerate(test_outputs):
  290. # p = outdir / f"test_output{i}.npy"
  291. # np.save(p, out)
  292. # out_paths.append(p)
  293. assert n_outputs == 1
  294. out_paths = [outdir / "test_output.npy"]
  295. np.save(out_paths[0], test_outputs)
  296. from tensorflow import __version__ as tf_version
  297. data = dict(weight_uri=assets_uri, test_inputs=[in_path], test_outputs=out_paths,
  298. config=config, tensorflow_version=tf_version)
  299. data.update(input_config)
  300. data.update(output_config)
  301. _files = [str(weights_file)]
  302. if is_2D:
  303. _files.append(str(macro_file))
  304. data.update(attachments=dict(files=_files))
  305. return data
  306. def export_bioimageio(
  307. model,
  308. outpath,
  309. test_input,
  310. test_input_axes=None,
  311. test_input_norm_axes='ZYX',
  312. name=None,
  313. mode="tensorflow_saved_model_bundle",
  314. min_percentile=1.0,
  315. max_percentile=99.8,
  316. overwrite_spec_kwargs=None,
  317. generate_default_deps=False,
  318. ):
  319. """Export stardist model into bioimage.io format, https://github.com/bioimage-io/spec-bioimage-io.
  320. Parameters
  321. ----------
  322. model: StarDist2D, StarDist3D
  323. the model to convert
  324. outpath: str, Path
  325. where to save the model
  326. test_input: np.ndarray
  327. input image for generating test data
  328. test_input_axes: str or None
  329. the axes of the test input, for example 'YX' for a 2d image or 'ZYX' for a 3d volume
  330. using None assumes that axes of test_input are the same as those of model
  331. test_input_norm_axes: str
  332. the axes of the test input which will be jointly normalized, for example 'ZYX' for all spatial dimensions ('Z' ignored for 2D input)
  333. use 'ZYXC' to also jointly normalize channels (e.g. for RGB input images)
  334. name: str
  335. the name of this model (default: None)
  336. if None, uses the (folder) name of the model (i.e. `model.name`)
  337. mode: str
  338. the export type for this model (default: "tensorflow_saved_model_bundle")
  339. min_percentile: float
  340. min percentile to be used for image normalization (default: 1.0)
  341. max_percentile: float
  342. max percentile to be used for image normalization (default: 99.8)
  343. overwrite_spec_kwargs: dict or None
  344. spec keywords that should be overloaded (default: None)
  345. generate_default_deps: bool
  346. not required for bioimage.io, i.e. StarDist models don't need a dependencies field in rdf.yaml (default: False)
  347. if True, generate an environment.yaml file recording the python, bioimageio.core, stardist and tensorflow requirements
  348. from which a conda environment can be recreated to run this export
  349. """
  350. _, build_model, *_ = _import()
  351. from .models import StarDist2D, StarDist3D
  352. isinstance(model, (StarDist2D, StarDist3D)) or _raise(ValueError("not a valid model"))
  353. 0 <= min_percentile < max_percentile <= 100 or _raise(ValueError("invalid percentile values"))
  354. if name is None:
  355. name = model.name
  356. name = str(name)
  357. outpath = Path(outpath)
  358. if outpath.suffix == "":
  359. outdir = outpath
  360. zip_path = outdir / f"{name}.zip"
  361. elif outpath.suffix == ".zip":
  362. outdir = outpath.parent
  363. zip_path = outpath
  364. else:
  365. raise ValueError(f"outpath has to be a folder or zip file, got {outpath}")
  366. outdir.mkdir(exist_ok=True, parents=True)
  367. with tempfile.TemporaryDirectory() as _tmp_dir:
  368. tmp_dir = Path(_tmp_dir)
  369. kwargs = _get_stardist_metadata(tmp_dir, model, generate_default_deps)
  370. model_kwargs = _get_weights_and_model_metadata(tmp_dir, model, test_input, test_input_axes, test_input_norm_axes, mode,
  371. min_percentile=min_percentile, max_percentile=max_percentile)
  372. kwargs.update(model_kwargs)
  373. if overwrite_spec_kwargs is not None:
  374. kwargs.update(overwrite_spec_kwargs)
  375. build_model(name=name, output_path=zip_path, add_deepimagej_config=(model.config.n_dim==2), root=tmp_dir, **kwargs)
  376. print(f"\nbioimage.io model with name '{name}' exported to '{zip_path}'")
  377. def import_bioimageio(source, outpath):
  378. """Import stardist model from bioimage.io format, https://github.com/bioimage-io/spec-bioimage-io.
  379. Load a model in bioimage.io format from the given `source` (e.g. path to zip file, URL)
  380. and convert it to a regular stardist model, which will be saved in the folder `outpath`.
  381. Parameters
  382. ----------
  383. source: str, Path
  384. bioimage.io resource (e.g. path, URL)
  385. outpath: str, Path
  386. folder to save the stardist model (must not exist previously)
  387. Returns
  388. -------
  389. StarDist2D or StarDist3D
  390. stardist model loaded from `outpath`
  391. """
  392. import shutil, uuid
  393. from csbdeep.utils import save_json
  394. from .models import StarDist2D, StarDist3D
  395. *_, bioimageio_core, _ = _import()
  396. outpath = Path(outpath)
  397. not outpath.exists() or _raise(FileExistsError(f"'{outpath}' already exists"))
  398. with tempfile.TemporaryDirectory() as _tmp_dir:
  399. tmp_dir = Path(_tmp_dir)
  400. # download the full model content to a temporary folder
  401. zip_path = tmp_dir / f"{str(uuid.uuid4())}.zip"
  402. bioimageio_core.export_resource_package(source, output_path=zip_path)
  403. with ZipFile(zip_path, "r") as zip_ref:
  404. zip_ref.extractall(tmp_dir)
  405. zip_path.unlink()
  406. rdf_path = tmp_dir / "rdf.yaml"
  407. biomodel = bioimageio_core.load_resource_description(rdf_path)
  408. # read the stardist specific content
  409. 'stardist' in biomodel.config or _raise(RuntimeError("bioimage.io model not compatible"))
  410. config = biomodel.config['stardist']['config']
  411. thresholds = biomodel.config['stardist']['thresholds']
  412. weights = biomodel.config['stardist']['weights']
  413. # make sure that the keras weights are in the attachments
  414. weights_file = None
  415. for f in biomodel.attachments.files:
  416. if f.name == weights and f.exists():
  417. weights_file = f
  418. break
  419. weights_file is not None or _raise(FileNotFoundError(f"couldn't find weights file '{weights}'"))
  420. # save the config and threshold to json, and weights to hdf5 to enable loading as stardist model
  421. # copy bioimageio files to separate sub-folder
  422. outpath.mkdir(parents=True)
  423. save_json(config, str(outpath / 'config.json'))
  424. save_json(thresholds, str(outpath / 'thresholds.json'))
  425. shutil.copy(str(weights_file), str(outpath / "weights_bioimageio.h5"))
  426. shutil.copytree(str(tmp_dir), str(outpath / "bioimageio"))
  427. model_class = (StarDist2D if config['n_dim'] == 2 else StarDist3D)
  428. model = model_class(None, outpath.name, basedir=str(outpath.parent))
  429. return model

bioimageio_utils.py at commit e80c6de, under BSD-3-Clause · at the source

Overview

Authors: Muxin Lin1,2, Thu-Huong Hoang2, Denise Manahan-Vaughan1,2
  1. Department of Neurophysiology, Medical Faculty, Ruhr University Bochum, Bochum, Germany
  2. International Graduate School of Neuroscience, Ruhr University Bochum, Bochum, Germany
Institutions: Ruhr University Bochum (Germany)
Journal: Frontiers in behavioral neuroscience, volume 20, article 1895371
Dates: received 30 May 2026; accepted 6 July 2026; published online 7 August 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.3389/fnbeh.2026.1895371 · PMID 42630415 · PMCID PMC13493596 · OpenAlex W7196949817
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: histology / microscopy (modality), rat (organism)
Methods: Statistics, Spectral & time-frequency, fMRI & imaging
Keywords: dorsoventral, fluorescence in situ hybridization, hippocampus, immediate early gene, rat, spatial learning
Topic: Memory and Neural Mechanisms (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Citations: not cited yet (Europe PMC); 183 references in the paper

Abstract

A multitude of studies have confirmed the essential role of the hippocampus in the acquisition and updating of associative experience. In rodents, spatial memories are dependent on hippocampal information processing and encoding. The role of the dorsal hippocampal pole is well documented, but information about the roles of the intermediate and ventral hippocampus in spatial learning are few and often contradictory. Here, we used fluorescence in situ hybridization (FISH) to identify nuclear expression of the immediate early (IEG) gene, Homer1a, that was triggered by specific spatial learning events in hippocampal neurons of adult male rats. We compared IEG expression in the cornu ammonis (CA) and dentate gyrus (DG) along the proximodistal and dorsoventral hippocampal axis, triggered by novel learning about spatial constellations of large (macroscale), or partially concealed (microscale) objects within a familiar environment. We observed that the dorsal hippocampus predominates with regard to the neuronal encoding of both forms of spatial content information, whereby the distal CA1 (dCA1) and proximal CA3 (pCA3) preferentially encode microscale spatial location. The infrapyramidal blade of the DG, as well as pCA3, encode macroscale information. The intermediate CA shows increased IEG expression in dCA1 triggered by novel microscale information, but the DG of neither the intermediate, nor ventral, hippocampus encode macroscale information. The ventral hippocampus exhibits IEG expression patterns that are unique in comparison to the other two structures: here, both CA1 (proximal and distal) and pCA3 encode macroscale information. Taken together, these findings suggest that the intermediate and ventral hippocampus support spatial memory encoding, but may do so in support of differentiated and distinct aspects of associative learning.

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.

stardist/stardist

License: BSD-3-Clause
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: e80c6de700693bc228ed3c9ba1dc19c3785667ee, 14 February 2026
Languages: Python (40), C/C++ (38), C++ (26), C (15), Jupyter (14)
Size: 201 files, 133 scripts
Software Heritage: archived
Found in: the text
Holds: README, license file, environment (pyproject.toml, setup.cfg, setup.py, docker/Dockerfile), tests, continuous integration, 14 notebooks
Not found: CITATION.cff, documentation
Tools: NumPy (19 files), Matplotlib (14 files), tifffile (14 files), scikit-image (7 files), imageio (2 files), Numba (1 file), SciPy (1 file), TensorFlow (1 file), xarray (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
59 files

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;
  • 57 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

The raw data supporting the conclusions of this article will be made available by the authors, upon reasonable request.

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, 27 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 3 authors, 6 keywords, 181 references.

Cite

This paper

Lin, M., Hoang, T.-H., & Manahan-Vaughan, D. (2026). Discrete and differentiated encoding of distinct components of spatial experience occurs within the proximodistal subfields of the dorsoventral axis of the hippocampus. Frontiers in behavioral neuroscience, 20, 1895371. https://doi.org/10.3389/fnbeh.2026.1895371

BibTeX

@article{lin2026discrete,
author = {Lin, Muxin and Hoang, Thu-Huong and Manahan-Vaughan, Denise},
title = {{Discrete and differentiated encoding of distinct components of spatial experience occurs within the proximodistal subfields of the dorsoventral axis of the hippocampus}},
journal = {Frontiers in behavioral neuroscience},
year = {2026},
month = aug,
volume = {20},
pages = {1895371},
publisher = {Frontiers Media SA},
issn = {1662-5153},
doi = {10.3389/fnbeh.2026.1895371},
url = {https://doi.org/10.3389/fnbeh.2026.1895371},
pmid = {42630415},
pmcid = {PMC13493596}
}

RIS

TY - JOUR
AU - Lin, Muxin
AU - Hoang, Thu-Huong
AU - Manahan-Vaughan, Denise
TI - Discrete and differentiated encoding of distinct components of spatial experience occurs within the proximodistal subfields of the dorsoventral axis of the hippocampus
T2 - Frontiers in behavioral neuroscience
J2 - Front Behav Neurosci
PY - 2026
DA - 2026/08/07
VL - 20
SP - 1895371
SN - 1662-5153
PB - Frontiers Media SA
DO - 10.3389/fnbeh.2026.1895371
UR - https://doi.org/10.3389/fnbeh.2026.1895371
LA - en
ER -

CSL-JSON

{
"id": "10.3389/fnbeh.2026.1895371",
"type": "article-journal",
"title": "Discrete and differentiated encoding of distinct components of spatial experience occurs within the proximodistal subfields of the dorsoventral axis of the hippocampus",
"container-title": "Frontiers in behavioral neuroscience",
"author": [
{
"family": "Lin",
"given": "Muxin"
},
{
"family": "Hoang",
"given": "Thu-Huong"
},
{
"family": "Manahan-Vaughan",
"given": "Denise"
}
],
"container-title-short": "Front Behav Neurosci",
"volume": "20",
"page": "1895371",
"DOI": "10.3389/fnbeh.2026.1895371",
"PMID": "42630415",
"PMCID": "PMC13493596",
"ISSN": "1662-5153",
"publisher": "Frontiers Media SA",
"URL": "https://doi.org/10.3389/fnbeh.2026.1895371",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
7
]
]
}
}

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.1013488 [code]
Evaluating place cell detection methods in Rats and Humans: Implications for cross-species spatial coding.
Journal: PLoS computational biology
In common: SciPy, Matplotlib, NumPy, rat, 8 references
[2] doi:10.1016/j.isci.2026.116213 [code]
Opioid receptor distribution in the claustrum-dorsal endopiriform complex.
Journal: iScience
In common: xarray, imageio, tifffile, 6 other tools, 1 reference
[3] doi:10.1016/j.isci.2026.115689 [code]
Unperturbed dye-based imaging of spontaneous synchronized calcium activity in iPSC-derived neuronal cultures.
Journal: iScience
In common: xarray, imageio, tifffile, 6 other tools
[4] doi:10.1523/jneurosci.2001-25.2026 [code]
Dynamics of Dentate Gyrus Place Cells and Dentate Spikes during Spatial and Nonspatial Changes in Environments.
Journal: The Journal of neuroscience : the official journal of the Society for Neuroscience
In common: Numba, SciPy, Matplotlib, 1 other tool, rat, 5 references
[5] doi:10.3389/fcogn.2026.1767179 [code]
Adult lifespan effects on functional specialization along the hippocampal long axis.
Journal: Frontiers in cognition
In common: Matplotlib, NumPy, 7 references
[6] doi:10.1038/s41593-026-02388-9 [code]
Hippocampal CA3 connectomics reveals a gradient of mossy fiber inputs and selective feedforward inhibition onto pyramidal cells.
Journal: Nature neuroscience
In common: imageio, SciPy, Matplotlib, 1 other tool, histology / microscopy, 4 references
[7] doi:10.7554/elife.109717 [code]
Retrosplenial cortex enables context-dependent goal-directed sensorimotor transformation.
Journal: eLife
In common: imageio, tifffile, Numba, 4 other tools, 1 reference
[8] doi: [code]
Real-time closed-loop feedback system for mouse mesoscale cortical signal and movement control
Journal: eLife
In common: imageio, tifffile, Numba, 5 other tools
[9] 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 biology
In common: imageio, tifffile, Numba, 5 other tools
[10] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: imageio, tifffile, Numba, 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.

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.