OSCR

Perception and neural representation of intermittent odor stimuli in mice.

Code ↔ Paper

5 matches 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 5 matches
  1. [1] § Methods › Behavioral training ↔ Odor_pulses_data_guideline.ipynb, lines 32–108 · score 0.77 · Lick port location, Lick Training phase, water drops, Poisson distributions, day, Block
  2. [2] § Methods › Behavioral task ↔ Odor_pulses_data_guideline.ipynb, lines 32–108 · score 0.70 · Wait Period, lick port, water drop, Poisson distributed, Go, Odor Pulses
  3. [3] § Methods › Behavioral apparatus ↔ Behavioral_data_compiler_v2.ipynb, lines 373–425 · score 0.68 · methyl butyrate, clean air, Catch trials, psychometric, behavior, pulse
  4. [4] § Results › Odor pulse counting task ↔ Behavioral_data_compiler_v2.ipynb, lines 373–425 · score 0.63 · methyl butyrate, clean air, Catch trials, behavioral, pulses
  5. [5] § Results › Olfactory cortical responses largely reflect sensory information ↔ NComms_Submission/ephys_compiler.ipynb, lines 762–792 · score 0.53 · 9–12, firing rate, 5–8, 1–4, neurons, pulses

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

Jupyter notebook · 287 lines · 11 KB · MIT · 2 matches

  1. # %%
  2. import pickle
  3. import pandas as pd
  4. import numpy as np
  5. import matplotlib as mpl
  6. from matplotlib import rcParams
  7. import matplotlib.pyplot as plt
  8. import h5py
  9. import os
  10. import tqdm
  11. import scipy
  12. from scipy import signal
  13. from scipy.signal import resample
  14. from tqdm import tnrange
  15. import seaborn as sns
  16. from scipy.stats import norm,entropy,linregress
  17. from scipy.optimize import minimize, curve_fit
  18. from scipy.io import savemat
  19. import multiprocess as mp
  20. from multiprocess import Pool
  21. import sys
  22. import warnings
  23. warnings.filterwarnings('ignore')
  24. sns.set_context('poster', font_scale=1.1)
  25. cmap = plt.rcParams['axes.prop_cycle'].by_key()['color']
  26. modulename = 'multiprocess'
  27. mpl.rcParams['svg.fonttype'] = 'none'
  28. sns.set_context('poster', font_scale=1.1)
  29. path = os.getcwd() + '/Session/'
  30. # %% [markdown]
  31. # Loading a session_animalname_date_sessionnum.pickle file gives a single-element list containing a dictionary
  32. # ============================================================================================================
  33. #
  34. # Information about trial outcomes
  35. # ---------------------------------------------------------------------------------------------------------------------------------------
  36. #
  37. # **num_trials**: number of trials recorded
  38. #
  39. # **high_trials**: boolean saying if the trial had a high number of pulses (above boundary) or not
  40. #
  41. # **low_trials**: the opposite of high_trials
  42. #
  43. # **high_choice**: boolean saying if animal chose the 'high side' or not
  44. #
  45. # **low_choice**: boolean saying if animal chose the 'low side' or not
  46. #
  47. # **correct_trials**: boolean saying if the animal got the trial correctly or not. (high_choice==True & high_trials==True and the opposite)
  48. #
  49. # **failure_trials**: Opposite of correct trials.
  50. #
  51. # **idle_trials**: if True, animal didn't make any binary choice in that trial
  52. #
  53. # **performance**: Correct trials/Total trials in the session
  54. #
  55. #
  56. # **Information about session parameters**
  57. # ---------------------------------------------------------------------------------------------------------------------------------------
  58. #
  59. # **type**: Whether high and low trials were delivered in blocks (usually true for training phase) or randomly (once animals learnt the task).
  60. #
  61. # **lick training**: When True, odors are not delivered. This is only used at the beggining of the training when animals are learning lick port location.
  62. #
  63. # **free_drop**: if True, water drop will delivered to the correct side independently of animal action. Only used at the beggining of training.
  64. #
  65. # **high_count**: lambda of the poisson distribution used for generating the trials with high number of pulses.
  66. #
  67. # **low_count**: lambda of the poisson distribution used for generating the trials with low number of pulses
  68. #
  69. # **pulse_time_ms**: duration of the individual odor pulses in ms
  70. #
  71. # **refract_time**: duration (in ms) of the waiting period before the sampling period of a trial
  72. #
  73. # **delay_time**: duration of the sampling period (period in which odor pulses are delivered)
  74. #
  75. # **go_time**: duration of the period in which the animal has to lick (in ms)
  76. #
  77. #
  78. # **Information about odor and sniffing**
  79. # ---------------------------------------------------------------------------------------------------------------------------------------
  80. #
  81. # **trial_odor**: array with len equal to delay_time containing the time course of the commands to solenoid valves for odor delivery. 0 = no odor, 100 = odor on. When two or more consecutive pulses overlaps, that is displayed as 100 multiples
  82. #
  83. # **trial_pre_breath**: an array containing the sniffing during the refractory period.
  84. #
  85. # **trial_breath**: an array containing the sniffing during delay_time(sampling period)+go_time.
  86. #
  87. #
  88. # **Other accesory information**
  89. # ---------------------------------------------------------------------------------------------------------------------------------------
  90. #
  91. # **animal**: ID of the animal
  92. #
  93. # **year**: year of the session
  94. #
  95. # **month**: month of the session
  96. #
  97. # **day**: day date of the session
  98. #
  99. # **session_id**: number identifying the she specific session for when multiple sessions are conducted on a day
  100. # %%
  101. session_fname = path + 'session_' + 'Banner_20220305_3.pickle' #remember to change the path to where your file is
  102. if os.path.isfile(session_fname):
  103. with open(session_fname,'rb') as handle:
  104. session_list = pickle.load(handle)
  105. session = session_list[0]
  106. # %%
  107. #Plotting correct and error trials on a session.
  108. plt.plot(session_list[0]['correct_trials'].cumsum())
  109. plt.plot(session_list[0]['failure_trials'].cumsum())
  110. # %%
  111. # Plotting breathing an odor in a single trial.
  112. fig, ax1 = plt.subplots()
  113. # Plot the first variable on the left y-axis
  114. ax1.plot(session_list[0]['trial_breath'][2], '-k', linewidth=1)
  115. ax1.set_ylabel('Sniffing', color='k')
  116. # Create a second y-axis sharing the same x-axis
  117. ax2 = ax1.twinx()
  118. # Plot the second variable on the right y-axis
  119. ax2.plot(session_list[0]['trial_odor'][2], 'r-')
  120. ax2.set_ylabel('Odor commands', color='r')
  121. plt.show()
  122. # plt.plot(session_list[0]['trial_breath'][2])
  123. # plt.plot(session_list[0]['trial_odor'][2])
  124. # plt.show()
  125. # %% [markdown]
  126. # Loading a cell_animalname_date_sessionnum.pickle file gives a list, with the length=recorded units. For each element of the list there is a dictionary
  127. # ============================================================================================================
  128. #
  129. # Information about the specific neuron
  130. # ---------------------------------------------------------------------------------------------------------------------------------------
  131. #
  132. # **cell_id**: id of the neuron/unit
  133. #
  134. # **ks_id**: id of the neuron based on kilosort
  135. #
  136. # **sample_rate**: sampling rate used for the acquisition of neural recordings.
  137. #
  138. # **spike_times**: timing of the spikes during the recording window. Events can happen in a window which goes from 0 (500 ms after sampling window started) to 135000 (the end of the sampling window). Remember that sampling rate is 30000 Hz
  139. #
  140. # **firing_rate**: not sure how this firing rate calculation was done, so I don't use it.
  141. #
  142. #
  143. #
  144. # **Information about session parameters**
  145. # ---------------------------------------------------------------------------------------------------------------------------------------
  146. #
  147. # **num_trials**: number of trials recorded in the session.
  148. #
  149. # **delay_time**: duration of the sampling period (period in which odor pulses are delivered)
  150. #
  151. # **cut_delay_time**: duration of the part of delay time that was discarded of the analysis (the initial 0.5 s of the sampling periods; spikes were not taken into account due to artifacts)
  152. #
  153. # **full_delay_time**: duration of the part of sampling period for which spikes are actually considered (4.5 s)
  154. #
  155. #
  156. # **Other accesory information**
  157. # ---------------------------------------------------------------------------------------------------------------------------------------
  158. #
  159. # **year**: year of the session
  160. #
  161. # **month**: month of the session
  162. #
  163. # **day**: day date of the session
  164. #
  165. # **session**: number identifying the she specific session for when multiple sessions are conducted on a day
  166. # %%
  167. new_path = os.getcwd() + '/HW_Data/pack_data_new/' #remember to change the path to where your file is
  168. cell_fname = new_path + 'cell_' + 'Bengal_20190430_0.pickle'
  169. if os.path.isfile(cell_fname):
  170. print('pepe')
  171. with open(cell_fname,'rb') as handle:
  172. cell_list = pickle.load(handle)
  173. cell = cell_list[0]
  174. # %%
  175. def convert_to_numpy_arrays(data):
  176. if isinstance(data, np.ndarray):
  177. return data
  178. elif isinstance(data, list):
  179. return np.array([convert_to_numpy_arrays(item) for item in data])
  180. else:
  181. return np.array([data])
  182. # %%
  183. # Generating raster plot of a single neuron across all trials on a session
  184. icell = 8
  185. cell = cell_list[icell]
  186. num_trials = cell['num_trials']
  187. #non_idle_trial_ids = np.argwhere(non_idle_trials).squeeze()
  188. sp_times = np.array(cell['spike_times'])[:num_trials]#[non_idle_trials]
  189. spike_times = convert_to_numpy_arrays(sp_times)
  190. max_counts = 0
  191. for i in range(len(spike_times)):
  192. max_counts = max(max_counts,len(spike_times[i]))
  193. #print(max_counts)
  194. spike_table =np.zeros((len(spike_times),max_counts))
  195. #rank_ind = np.argsort(trial_cum_odor)
  196. for i in range(len(spike_times)):
  197. spike_time = spike_times[i]
  198. spike_table[i,:len(spike_time)] = spike_time/30000 + 0.5
  199. sns.set_style('white')
  200. fig = plt.figure(figsize=(15,7.5))
  201. plt.eventplot(spike_table,color='black')
  202. plt.xlim(0.5,5)
  203. plt.ylim(0,242)
  204. plt.xlabel('Time during odor period(s)')
  205. plt.ylabel('Trial')
  206. plt.show()
  207. # %% [markdown]
  208. # Now, going to the codes and kernels data coming from the DUNL analysis of the ephys and behavior
  209. # ================================================================================================
  210. # %%
  211. codepath = os.getcwd() + '/Bahareh/'
  212. dat = np.load(codepath+'Bengal_20190508_0_data_all.npy', allow_pickle=True)
  213. data = dat.tolist() #Maybe this conversion to list is not necessary but I remember having some issues without it.
  214. print(data.keys())
  215. # %% [markdown]
  216. # Loading the data_all.npy file provides a single dictionary with a set of parameters that are repeated for each recorded neuron, indicated by the _0, 1, 2, etc., at the end of the variable.
  217. #
  218. # According to Bahareh, these variables represent:
  219. #
  220. # y_{#neuron}: spike counts from neuron #
  221. #
  222. # Hx_{#neuron}: you can skipa_{#neuron}: baseline
  223. #
  224. # rate_hat_{#neuron}: estimated rate for neuron
  225. #
  226. # x_est_{#neuron}: This is the code estimate from the trial. This is at the 50 ms binned resolution from each trial.
  227. #
  228. # kernel_est_{# neuron}: length of kernel which is 20 samples, with 50 ms res, this is 1 s
  229. #
  230. # x: this is the odor onset in the 50 ms bin resolution
  231. #
  232. # high_choice: a flag for whether the trial was high or low odor count.
  233. #
  234. # 'norm_phase_hist_{#neuron}': This a phase histogram weighted by the code amplitudes
  235. #
  236. # You can also get some of this information from the other files, the ones called _kernels.npy, codes_stacked_trial.npy, phase_weighted_by_codes.npy, but I found easier just to load the data_all, since it has it all.
  237. # %%
  238. # %%
  239. test = data['norm_phase_hist_0'] #This contains a vector of length 36, so the phase variations on code amplitude seem to be binned in 36 bins
  240. #This is the set of transformations that Hao used to do with the norm_phase_hist data coming from Bahareh's analysis.
  241. #Not completely sure if this is fully correct, but it's the way he was using
  242. print(test)
  243. X_upsampled = resample(test,360,axis=0)
  244. print(X_upsampled)
  245. X_rolled = np.roll(X_upsampled,50,axis=0)
  246. print(X_rolled)
  247. X_resampled = resample(X_rolled,14,axis=0)
  248. print(X_resampled)
  249. X_norm = X_resampled/X_resampled.max(axis=0).reshape(-1,1)
  250. print(X_norm)
  251. # X_norm_nan_removed = X_norm[~np.isnan(X_norm).any(axis=1)]
  252. # Xnorm.append(X_norm_nan_removed)
  253. # %%

Odor_pulses_data_guideline.ipynb at commit 5653ebc, under MIT · at the source

Overview

Authors: Luis E Boero1,2, Hao Wu1,2,3, Joseph D Zak4, Paul Masset5,6, Farhad Pashakhanloo1,2, Siddharth Jayakumar1,2, Bahareh Tolooshams7,8, Demba Ba2,9,10, Venkatesh N Murthy1,2,10
  1. Department of Molecular & Cellular Biology, Harvard University, Cambridge, MA USA
  2. Center for Brain Science, Harvard University, Cambridge, MA USA
  3. Department of Chemistry & Chemical Biology, Harvard University, Cambridge, MA USA
  4. Department of Biological Sciences, University of Illinois, Chicago, IL USA
  5. Department of Psychology, McGill University, Montreal, QC Canada
  6. Mila - Quebec Artificial Intelligence Institute, Montreal, Canada
  7. Alberta Machine Intelligence Institute (Amii), Edmonton, AB Canada
  8. Neuroscience and Mental Health Institute (NMHI), University of Alberta, Edmonton, AB Canada
  9. John A. Paulson School of Engineering and Applied Sciences, Harvard University, Cambridge, MA USA
  10. Kempner Institute for the Study of Natural & Artificial Intelligence, Harvard University, Cambridge, MA USA
Journal: Nature communications, volume 17, issue 1, article 5575
Dates: received 17 March 2025; accepted 15 April 2026; published online 29 April 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41467-026-72445-1 · PMID 42056108 · PMCID PMC13304163 · OpenAlex W4407448503
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: mouse (organism)
Methods: Machine learning, Statistics, fMRI & imaging, Single-unit activity, calcium imaging
Keywords: Neuroscience, Olfactory system
MeSH: Odorants*, Olfactory Perception*, Olfactory Receptor Neurons*, Piriform Cortex*, Smell*, Animals, Behavior, Animal, Cues, Male, Mice, Mice, Inbred C57BL, Neurons, Respiration (* major topic)
Topic: Olfactory and Sensory Function Studies (Sensory Systems, Neuroscience), according to OpenAlex
Funding: Harvard University; Ministry of Defence; Pew Charitable Trusts; U. S. Department of Defense; NIDCD NIH HHS (R00 DC017754); RCUK | Engineering and Physical Sciences Research Council (EPSRC) (W911NF-16-1-0368)
Citations: cited by 3 papers (Europe PMC); 88 references in the paper

Abstract

Odor cues in nature are sparse and fluctuating due to turbulent transport. To investigate how animals perceive these intermittent cues, we developed a behavioral task in which mice made binary decisions based on the total number of discrete odor pulses presented stochastically over several seconds. Mice quickly learned this task, placing higher perceptual weight to stimuli arriving during inhalation than exhalation, a phase dependency that strongly correlated with the magnitude of responses in olfactory sensory neurons. Neurons in the anterior piriform cortex responded to odor pulses with varying degrees of dependence on respiration phase. Single cortical neurons responded stochastically and transiently to odor pulses, leading to a representation that carries signatures of sensory evidence, but not its accumulation. Our study reveals that mice can integrate intermittent odor signals across dozens of breaths and that respiratory modulation imposes limits on sensory information acquisition that cortical circuits cannot overcome to improve behavior.

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 5 matches between paragraphs and lines of code.

leboero/odor_pulses_task_analysis

License: MIT
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 5653ebc491961e6ca196b39c18b086ffedf932ac, 17 March 2026
Languages: Jupyter (32), Python (6)
Size: 53 files, 38 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file, 32 notebooks
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Matplotlib (17 files), NumPy (17 files), SciPy (17 files), seaborn (17 files), h5py (15 files), pandas (14 files), scikit-learn (7 files), Pingouin (5 files), statsmodels (4 files), PyTorch (2 files)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
18 files

Code availability

Code for the analysis of the data is provided at: https://github.com/leboero/Odor_Pulses_Task_Analysis/tree/main/NComms_Submission.

Reproduced under the paper's license (CC BY), from the paper cited above.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 17 scripts, each with its path and the digest of its content;
  • 5 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

Data Availability Statement

The data generated in this study have been deposited in Figshare under accession code 10.6084/m9.figshare.31792705. Additionally, source data are provided with this paper in the Source Data File. Source data are provided with this paper.

Code for the analysis of the data is provided at: https://github.com/leboero/Odor_Pulses_Task_Analysis/tree/main/NComms_Submission.

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, 9 authors, 2 keywords, 13 MeSH terms, 6 funders, 80 references.

Cite

This paper

Boero, L. E., Wu, H., Zak, J. D., Masset, P., Pashakhanloo, F., Jayakumar, S., Tolooshams, B., Ba, D., & Murthy, V. N. (2026). Perception and neural representation of intermittent odor stimuli in mice. Nature communications, 17(1), 5575. https://doi.org/10.1038/s41467-026-72445-1

BibTeX

@article{boero2026perception,
author = {Boero, Luis E and Wu, Hao and Zak, Joseph D and Masset, Paul and Pashakhanloo, Farhad and Jayakumar, Siddharth and Tolooshams, Bahareh and Ba, Demba and Murthy, Venkatesh N},
title = {{Perception and neural representation of intermittent odor stimuli in mice}},
journal = {Nature communications},
year = {2026},
month = apr,
volume = {17},
number = {1},
pages = {5575},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/s41467-026-72445-1},
url = {https://doi.org/10.1038/s41467-026-72445-1},
pmid = {42056108},
pmcid = {PMC13304163}
}

RIS

TY - JOUR
AU - Boero, Luis E
AU - Wu, Hao
AU - Zak, Joseph D
AU - Masset, Paul
AU - Pashakhanloo, Farhad
AU - Jayakumar, Siddharth
AU - Tolooshams, Bahareh
AU - Ba, Demba
AU - Murthy, Venkatesh N
TI - Perception and neural representation of intermittent odor stimuli in mice
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/04/29
VL - 17
IS - 1
SP - 5575
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/s41467-026-72445-1
UR - https://doi.org/10.1038/s41467-026-72445-1
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41467-026-72445-1",
"type": "article-journal",
"title": "Perception and neural representation of intermittent odor stimuli in mice",
"container-title": "Nature communications",
"author": [
{
"family": "Boero",
"given": "Luis E"
},
{
"family": "Wu",
"given": "Hao"
},
{
"family": "Zak",
"given": "Joseph D"
},
{
"family": "Masset",
"given": "Paul"
},
{
"family": "Pashakhanloo",
"given": "Farhad"
},
{
"family": "Jayakumar",
"given": "Siddharth"
},
{
"family": "Tolooshams",
"given": "Bahareh"
},
{
"family": "Ba",
"given": "Demba"
},
{
"family": "Murthy",
"given": "Venkatesh N"
}
],
"container-title-short": "Nat Commun",
"volume": "17",
"issue": "1",
"page": "5575",
"DOI": "10.1038/s41467-026-72445-1",
"PMID": "42056108",
"PMCID": "PMC13304163",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41467-026-72445-1",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
29
]
]
}
}

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.1126/sciadv.aed3610 [code]
Dexterous single sniffs for ethological active olfaction.
Journal: Science advances
In common: Pingouin, seaborn, pandas, 3 other tools, mouse, 6 references
[2] doi:10.1126/sciadv.aee1002 [code]
Theta oscillations are an organizational unit of odor processing in the olfactory bulb.
Journal: Science advances
In common: 8 references
[3] doi:10.1038/s41467-026-70356-9
A topographical organization in the primary olfactory cortex.
Journal: Nature communications
In common: mouse, 8 references
[4] doi:10.1038/s41593-026-02314-z [code]
Low-dimensional population dynamics in the brainstem gate REM sleep.
Journal: Nature neuroscience
In common: Pingouin, h5py, statsmodels, 6 other tools, mouse, 1 reference
[5] doi:10.1016/j.isci.2026.116825 [code]
Social hierarchy shapes behavioral and transcriptional responses to chronic stress and ketamine in male mice.
Journal: iScience
In common: Pingouin, h5py, statsmodels, 7 other tools, mouse
[6] doi:10.1038/s41593-026-02232-0 [code]
Entorhinal cortex represents task-relevant remote locations independently of CA1.
Journal: Nature neuroscience
In common: Pingouin, h5py, statsmodels, 7 other tools, mouse
[7] doi:10.1016/j.isci.2026.117375 [code]
Motor priming is associated with widespread recruitment into neural ensembles and more rapid ensemble transitions.
Journal: iScience
In common: Pingouin, h5py, statsmodels, 7 other tools
[8] doi:10.1038/s41562-026-02414-7 [code]
Optimized feature gains explain and predict successes and failures of human selective listening.
Journal: Nature human behaviour
In common: Pingouin, h5py, statsmodels, 7 other tools
[9] doi:10.7554/elife.92882 [code]
Fear conditioning biases olfactory sensory neuron frequencies across generations.
Journal: eLife
In common: statsmodels, seaborn, pandas, 3 other tools, mouse, 3 references
[10] doi:10.1016/j.isci.2026.115897 [code]
Experience and behavior modulate piriform cortex odor representation in freely moving mice.
Journal: iScience
In common: NumPy, mouse, 6 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.