OSCR

Transcranial direct current stimulation enhances delayed retention after 5 days of lower-limb motor skill learning.

Code ↔ Paper

The paper beside its authors' code: matches between them have not been computed for this paper yet.

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 · 346 lines · 16 KB · MIT

  1. # coding: utf-8
  2. #############################################################################################
  3. # The following code was based in the example available at
  4. # https://github.com/clade/PyDAQmx/blob/master/PyDAQmx/example/MultiChannelAnalogInput.py
  5. #############################################################################################
  6. __author__ = 'Joaquim Leitão'
  7. import PyDAQmx
  8. import numpy
  9. # Constants definition
  10. DAQMX_MIN_ACTUATION_V = 0.0
  11. DAQMX_MAX_ACTUATION_V = 5.0
  12. DAQMX_MIN_READER_V = -10.0
  13. DAQMX_MAX_READER_V = 10.0
  14. VAL_VOLTS = PyDAQmx.DAQmx_Val_Volts
  15. GROUP_BY_CHANNEL = PyDAQmx.DAQmx_Val_GroupByChannel
  16. GROUP_BY_SCAN_NUMBER = PyDAQmx.DAQmx_Val_GroupByScanNumber
  17. VAL_RISING = PyDAQmx.DAQmx_Val_Rising
  18. VAL_CONT_SAMPS = PyDAQmx.DAQmx_Val_ContSamps
  19. VAL_FINITE_SAMPS = PyDAQmx.DAQmx_Val_FiniteSamps
  20. VAL_RSE = PyDAQmx.DAQmx_Val_RSE
  21. VAL_ACQUIRED_INTO_BUFFER = PyDAQmx.DAQmx_Val_Acquired_Into_Buffer
  22. class Actuator():
  23. """
  24. Actuator class, responsible for actuating in a given channel of the NI-USB Data Acquisition Hardware
  25. """
  26. def __init__(self, physical_channels=["ao0"]):
  27. """
  28. Class Constructor
  29. :param physical_channels: A list of physical channels used to acquire the data
  30. """
  31. # Check for argument's type
  32. if not isinstance(physical_channels, list) and not isinstance(physical_channels, str):
  33. raise TypeError("Wrong type for argument channels_samples: Expected <class 'dict'> or <class 'str'> "
  34. "and found " + str(type(physical_channels)))
  35. # Get the set of physical channels from which we are going to extract the data and do the same for the names of
  36. # the channels
  37. self.physical_channels = self.__parse(physical_channels)
  38. if self.physical_channels is None:
  39. raise TypeError("Non-output channels specified to be used in the Actuator class. Only output channels are "
  40. "allowed")
  41. # Create tasks, one for each physical channel
  42. tasks = []
  43. for i in range(len(self.physical_channels)):
  44. channel = self.physical_channels[i]
  45. task = PyDAQmx.Task()
  46. tasks.append(task)
  47. # Create Voltage Channel to read from the given physical channel
  48. task.CreateAOVoltageChan("Dev1/" + str(channel), "", DAQMX_MIN_ACTUATION_V, DAQMX_MAX_ACTUATION_V,
  49. VAL_VOLTS, None) # Create Voltage Channel
  50. # Save all the tasks
  51. self.tasks = dict([(self.physical_channels[i], tasks[i]) for i in range(len(tasks))])
  52. @staticmethod
  53. def __parse(data):
  54. """
  55. Private Method that parses a list or a string containing either a set of physical_channels or a set of channel's
  56. names into a list
  57. :param data: The mentioned list or string
  58. :return: The parsed data in the list format, or None if wrong or invalid data is provided
  59. """
  60. if isinstance(data, str):
  61. current_data = [data]
  62. else:
  63. current_data = data
  64. # Remove duplicates
  65. current_data = list(set(current_data))
  66. # Check if all the channels are output channels
  67. for current_channel in current_data:
  68. if "ao" not in current_channel:
  69. return None
  70. return current_data
  71. def execute_all_tasks(self, num_samps_channel, message, auto_start=1, timeout=0):
  72. """
  73. Executes all the tasks created. Ideally this should be use to send the same message to a set of actuators
  74. :param num_samps_channel: The number of samples, per channel, to write
  75. :param message: The message to send to the actuator
  76. :param auto_start: Specifies whether or not this function automatically starts the task if you do not start it.
  77. :param timeout:The amount of time, in seconds, to wait for this function to write all the samples
  78. (-1 for inifinite)
  79. :return: A boolean value: True is all the tasks started without major problems; False otherwise
  80. """
  81. for name in self.physical_channels:
  82. result = self.execute_task(name, num_samps_channel, message, auto_start, timeout)
  83. if not result:
  84. return False
  85. return True
  86. def execute_task(self, name, num_samps_channel, message, auto_start=1, timeout=0):
  87. """
  88. Executes a given task, starting its actuation (That is, sends a given message to a given actuator)
  89. :param name: The name of the task to execute
  90. :param num_samps_channel: The number of samples, per channel, to write
  91. :param message: The message to send to the actuator
  92. :param auto_start: Specifies whether or not this function automatically starts the task if you do not start it.
  93. :param timeout: The amount of time, in seconds, to wait for this function to write all the samples
  94. (-1 for inifinite)
  95. :return: A boolean value, indicating the success or failure of the execution
  96. """
  97. # TODO: CHANGE "name" TO BE A LIST: FUNCTION SHOULD ALSO CHANGE NAME
  98. if not (isinstance(message, int) or isinstance(message, float)):
  99. raise TypeError("Wrong message type for the task to be executed in channel " + str(name) + ". Message should "
  100. "be an interger or float between 0 and 5")
  101. message = float(message)
  102. # Message has to be a numpy array, so lets convert it to the desired data type
  103. message = numpy.array(message)
  104. # Check for the limits of the message
  105. message[message > DAQMX_MAX_ACTUATION_V] = DAQMX_MAX_ACTUATION_V
  106. message[message < DAQMX_MIN_ACTUATION_V] = DAQMX_MIN_ACTUATION_V
  107. if name in self.tasks.keys():
  108. # Get the task
  109. task = self.tasks[name]
  110. # Start the task
  111. task.StartTask()
  112. # Write to buffer
  113. task.WriteAnalogF64(num_samps_channel, auto_start, timeout, GROUP_BY_CHANNEL, message, None,
  114. None)
  115. task.StopTask()
  116. return True
  117. return False
  118. class Reader():
  119. """
  120. Reader class, responsible for collecting data from the NI-USB Data Acquisition Hardware
  121. """
  122. def __init__(self, channels_samples={"ai0": 1}):
  123. """
  124. Class Constructor
  125. :param channels_samples: A dictionary with a mapping between the physical channels used to acquire the data and
  126. the number of samples to collect from each one of them
  127. """
  128. # Check for argument's type
  129. if not isinstance(channels_samples, dict):
  130. raise TypeError("Wrong type for argument channels_samples: Expected <class 'dict'> and found " +
  131. str(type(channels_samples)))
  132. # Get the set of physical channels from which we are going to extract the data and do the same for the names of
  133. # the channels
  134. self.physical_channels = self.__parse(channels_samples)
  135. self.n_samples = []
  136. tasks = []
  137. for channel in self.physical_channels:
  138. current_samples = channels_samples[channel]
  139. # current_samples should be an integer higher than 0. If it is not, assume the default value: 1
  140. if current_samples <= 0:
  141. current_samples = 1
  142. # Store the number of samples to read from that channel
  143. self.n_samples.append(current_samples)
  144. # Create the tasks, one to read in each channel
  145. task = PyDAQmx.Task()
  146. # Create Voltage Channel to read from the given physical channel
  147. task.CreateAIVoltageChan("Dev1/" + str(channel), "", VAL_RSE, DAQMX_MIN_READER_V, DAQMX_MAX_READER_V, VAL_VOLTS,
  148. None)
  149. # Set the source of the sample clock - Acquire infinite number of samples and enabling to read the maximum
  150. # number of samples per second: 10000.0
  151. task.CfgSampClkTiming("", 1000.0, VAL_RISING, VAL_CONT_SAMPS, current_samples)
  152. # Add the task to the list of tasks
  153. tasks.append(task)
  154. # Save all the tasks
  155. self.tasks = dict([(self.physical_channels[i], tasks[i]) for i in range(len(tasks))])
  156. @staticmethod
  157. def __parse(channels_samples):
  158. """
  159. Private Method that parses a dictionary with a mapping between the physical channels used to acquire the data and
  160. the number of samples to collect from each one of them, returning a list with the keys of the dictionary (the physical
  161. channels to be used), or raises an exception if anything went wrong
  162. :param channels_samples: The mentioned dictionary
  163. :return: A list with the physical channels to be used
  164. """
  165. # Get keys and values of the dictionary
  166. keys = list(channels_samples.keys())
  167. values = list(channels_samples.values())
  168. # Check if all the channels are output channels
  169. for current_channel in keys:
  170. if "ai" not in current_channel:
  171. raise TypeError("Non-input channels specified to be used in the Reader class. Only input channels are "
  172. "allowed")
  173. for current_samples in values:
  174. if not isinstance(current_samples, int):
  175. raise TypeError("Invalid argument for the 'channels_samples' parameter. Expected dictionary with keys of type "
  176. "<class 'str'> and values type <class 'int'>")
  177. return keys
  178. def start_tasks(self):
  179. for current in self.tasks.keys():
  180. task = self.tasks[current]
  181. task.StartTask()
  182. def change_collected_samples(self, channel, number_samples):
  183. """
  184. Changes the number of samples collected in the specified physical channel
  185. :param channel: The desired physical channel
  186. :param number_samples: The new number of samples to collect
  187. """
  188. if not isinstance(number_samples, int):
  189. raise TypeError("Wrong type for parameter 'number_samples'. Expected <class 'int'> and found "
  190. + str(type(number_samples)))
  191. elif number_samples <= 0:
  192. # Invalid number of samples -- Simply return false
  193. return False
  194. elif channel in self.physical_channels:
  195. # Create a new task for the given channel that is going to
  196. task = PyDAQmx.Task()
  197. task.CreateAIVoltageChan("Dev1/" + str(channel), "", VAL_RSE, DAQMX_MIN_READER_V, DAQMX_MAX_READER_V,
  198. VAL_VOLTS, None)
  199. # Set the source of the sample clock - Acquire infinite number of samples and enabling to read the maximum
  200. # number of samples per second: 10000.0
  201. task.CfgSampClkTiming("", 10000.0, VAL_RISING, VAL_CONT_SAMPS, number_samples)
  202. self.tasks[channel] = task
  203. index = self.physical_channels.index(channel)
  204. self.n_samples[index] = number_samples
  205. return True
  206. else:
  207. raise TypeError("Attempt to change number of collected samples from a physical channel not already added")
  208. def add_tasks(self, channel_samples):
  209. """
  210. Adds a task to the set of tasks
  211. :param channel_samples: A dictionary with a mapping between the physical channels used to acquire the data and
  212. the number of samples to collect from each one of them
  213. """
  214. # Check for argument's type
  215. if not isinstance(channel_samples, dict):
  216. raise TypeError("Wrong type for argument channels_samples: Expected <class 'dict'> and found " +
  217. str(type(channel_samples)))
  218. # Get the list of channels
  219. physical_channels = self.__parse(channel_samples)
  220. if physical_channels is None:
  221. raise TypeError("Non-input channels specified to be used in the Reader class. Only input channels are "
  222. "allowed")
  223. for channel in physical_channels:
  224. current_samples = channel_samples[channel]
  225. # Update the list of physical channels
  226. self.physical_channels.append(channel)
  227. # Store the number of samples to collect for each of the given channels
  228. self.n_samples.append(current_samples)
  229. # Create a task and the voltage channel and store it
  230. task = PyDAQmx.Task()
  231. task.CreateAIVoltageChan("Dev1/" + str(channel), "", VAL_RSE, DAQMX_MIN_READER_V, DAQMX_MAX_READER_V,
  232. VAL_VOLTS, None)
  233. # Set the source of the sample clock - Acquire infinite number of samples and enabling to read the maximum
  234. # number of samples per second: 10000.0
  235. task.CfgSampClkTiming("", 10000.0, VAL_RISING, VAL_CONT_SAMPS, current_samples)
  236. self.tasks[channel] = task
  237. def remove_task(self, physical_channel):
  238. """
  239. Removes a given Task from the set of active Tasks
  240. :param physical_channel: The task to remove
  241. :return: True in case of success, otherwise returns False
  242. """
  243. # Check if the given physical channel is in the list of physical channels
  244. if physical_channel in self.physical_channels:
  245. # Get the index of the given physical channel in the list of physical channels
  246. index = self.physical_channels.index(physical_channel)
  247. # Remove the element from the list of physical channels
  248. self.physical_channels.remove(physical_channel)
  249. # Remove the number of samples associated with the given channel
  250. self.n_samples.remove(self.n_samples[index])
  251. # Remove the task
  252. del self.tasks[physical_channel]
  253. return True
  254. def read_all(self, timeout=0.01, num_samples=None):
  255. """
  256. Reads data from all the active physical channels
  257. :param timeout: The amount of time, in seconds, to wait for the function to read the sample(s)
  258. (-1 for infinite)
  259. :param num_samples: A list with the number of samples to acquire for each channel
  260. :return: Returns a dictionary with the data read from all the active physical channels
  261. """
  262. if num_samples is None:
  263. return dict([(name, self.read(name, timeout)) for name in self.physical_channels])
  264. elif not isinstance(num_samples, dict):
  265. raise TypeError("Wrong type for argument num_samples: Expected <class 'dict'> and found " +
  266. str(type(num_samples)))
  267. contents = {}
  268. for name in self.physical_channels:
  269. current_number_samples = num_samples[name]
  270. contents[name] = self.read(name, timeout, current_number_samples)
  271. return contents
  272. def read(self, name=None, timeout=0.01, num_samples=None):
  273. """
  274. Reads data from a given physical channel
  275. :param name: The name of the channel from which we are going to read the data
  276. :param timeout: The amount of time, in seconds, to wait for the function to read the sample(s)
  277. (-1 for infinite)
  278. :param num_samples: The number of samples to acquire
  279. :return: Returns an array with the data read
  280. """
  281. if name is None:
  282. name = self.physical_channels[0]
  283. if num_samples is None:
  284. index = self.physical_channels.index(name)
  285. num_samps_channel = self.n_samples[index]
  286. else:
  287. num_samps_channel = num_samples
  288. # Get task handle
  289. task = self.tasks[name]
  290. # Prepare the data to be read
  291. data = numpy.zeros((num_samps_channel,), dtype=numpy.float64)
  292. read = PyDAQmx.int32()
  293. # Start the task
  294. task.StartTask()
  295. # Read the data and return it!
  296. task.ReadAnalogF64(num_samps_channel, timeout, GROUP_BY_CHANNEL, data, num_samps_channel,
  297. PyDAQmx.byref(read), None)
  298. # Stop the task
  299. task.StopTask()
  300. # Return in a list instead of numpy.array
  301. return data.tolist()

daqmxlib.py at commit fda7e1f, under MIT · at the source

Overview

  1. Movement & Neuroscience, Department of Nutrition, Exercise and Sports University of Copenhagen Copenhagen Denmark
  2. Danish Research Centre for Magnetic Resonance, Department of Radiology and Nuclear Medicine Copenhagen University Hospital – Amager and Hvidovre Copenhagen Denmark
  3. Department of Neuroscience University of Copenhagen Copenhagen Denmark
Institutions: University of Copenhagen (Denmark); Amager Hospital (Denmark); Copenhagen University Hospital (Denmark)
Journal: The Journal of physiology, volume 604, issue 17, pages 7375-7399
Dates: received 20 February 2026; accepted 24 June 2026; published online 25 July 2026; in print 1 September 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1113/jp291217 · PMID 42501065 · PMCID PMC13532859 · OpenAlex W7171093061
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: other (modality), human (organism)
Methods: Spectral & time-frequency, Machine learning, Preprocessing, Evoked potentials, Statistics, fMRI & imaging, Physiology & signal measures
Keywords: Bayesian analysis, motor skill learning, tDCS, transcranial electric stimulation
MeSH: Learning*, Lower Extremity*, Motor Cortex*, Motor Skills*, Transcranial Direct Current Stimulation*, Adult, Evoked Potentials, Motor, Female, Humans, Male, Young Adult (* major topic)
Journal subjects: Neuroscience
Topic: Transcranial Magnetic Stimulation Studies (Neurology, Neuroscience), according to OpenAlex
Funding: Team Danmark; Novo Nordisk Fonden (NNF.22SA0078293); Lundbeck Foundation (R336–2020–1035, R436‐2023–1137)
Citations: not cited yet (Europe PMC); 103 references in the paper

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repository

Its files are read in the Code ↔ Paper reader above.

MovementAndNeuroscience/TrackIt-LiteV2

License: MIT
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: fda7e1ff0fd1425a45b624f40e7c4b11b489f136, 24 July 2025
Languages: Python (71), JavaScript (18)
Size: 579 files, 89 scripts
Software Heritage: not archived
Found in: the text, “Sequential visuomotor dynamic ankle flexion task”
Holds: README, license file, documentation
Not found: CITATION.cff, environment file, tests, continuous integration
Tools: NumPy (32 files), Pillow (7 files), Matplotlib (4 files)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
91 files

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:

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

Code and data availability statement

The paper has a code and data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1113/jp291217.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 2, 28 September 2026

  • Publisher: n/a → Wiley

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 6 authors, 4 keywords, 11 MeSH terms, 3 funders, 93 references.

Cite

This paper

Kvistad, A. L., Jespersen, L., Bjørndal, J. R., Christiansen, L., Karabanov, A. N., & Lundbye‐Jensen, J. (2026). Transcranial direct current stimulation enhances delayed retention after 5 days of lower-limb motor skill learning. The Journal of physiology, 604(17), 7375-7399. https://doi.org/10.1113/jp291217

BibTeX

@article{kvistad2026transcranial,
author = {Kvistad, August Lomholt and Jespersen, Lasse and Bjørndal, Jonas Rud and Christiansen, Lasse and Karabanov, Anke Ninija and Lundbye‐Jensen, Jesper},
title = {{Transcranial direct current stimulation enhances delayed retention after 5 days of lower-limb motor skill learning}},
journal = {The Journal of physiology},
year = {2026},
month = jul,
volume = {604},
number = {17},
pages = {7375--7399},
publisher = {Wiley},
issn = {0022-3751},
doi = {10.1113/jp291217},
url = {https://doi.org/10.1113/jp291217},
pmid = {42501065},
pmcid = {PMC13532859}
}

RIS

TY - JOUR
AU - Kvistad, August Lomholt
AU - Jespersen, Lasse
AU - Bjørndal, Jonas Rud
AU - Christiansen, Lasse
AU - Karabanov, Anke Ninija
AU - Lundbye‐Jensen, Jesper
TI - Transcranial direct current stimulation enhances delayed retention after 5 days of lower-limb motor skill learning
T2 - The Journal of physiology
J2 - J Physiol
PY - 2026
DA - 2026/07/25
VL - 604
IS - 17
SP - 7375
EP - 7399
SN - 0022-3751
PB - Wiley
DO - 10.1113/jp291217
UR - https://doi.org/10.1113/jp291217
LA - en
ER -

CSL-JSON

{
"id": "10.1113/jp291217",
"type": "article-journal",
"title": "Transcranial direct current stimulation enhances delayed retention after 5 days of lower-limb motor skill learning",
"container-title": "The Journal of physiology",
"author": [
{
"family": "Kvistad",
"given": "August Lomholt"
},
{
"family": "Jespersen",
"given": "Lasse"
},
{
"family": "Bjørndal",
"given": "Jonas Rud"
},
{
"family": "Christiansen",
"given": "Lasse"
},
{
"family": "Karabanov",
"given": "Anke Ninija"
},
{
"family": "Lundbye‐Jensen",
"given": "Jesper"
}
],
"container-title-short": "J Physiol",
"volume": "604",
"issue": "17",
"page": "7375-7399",
"DOI": "10.1113/jp291217",
"PMID": "42501065",
"PMCID": "PMC13532859",
"ISSN": "0022-3751",
"publisher": "Wiley",
"URL": "https://doi.org/10.1113/jp291217",
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
25
]
]
}
}

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.3390/bioengineering13050502 [code]
Effects of Transcranial Direct Current Stimulation over the Left Sensorimotor Cortex on Bimanual Force Control: A Computational and Experimental Investigation.
Journal: Bioengineering (Basel, Switzerland)
In common: Matplotlib, NumPy, other, 3 references
[2] doi:10.7554/elife.111876 [code]
Distinct sensorimotor encoding in tuft dendrites and somata associated with action, correction, and learning.
Journal: eLife
In common: Pillow, Matplotlib, NumPy, 2 references
[3] doi:10.1038/s41598-026-45549-3
Effects of single-session anodal transcranial direct current stimulation (tDCS) on cognitive and motor performance in athletes and healthy adults: a systematic review and meta-analysis.
Journal: Scientific reports
In common: other, 3 references
[4] doi:10.1038/s41467-026-74869-1 [code]
Complementary roles of cell-type-specific plasticity in shaping neocortical dynamics for learning action timing.
Journal: Nature communications
In common: 3 references
[5] doi:10.1038/s43856-026-01595-6 [code]
Non-vectorial integration of intersectional short-pulse stimulation enables enhanced deep brain modulation and effective seizure control.
Journal: Communications medicine
In common: 3 references
[6] doi:10.1016/j.celrep.2026.117419 [code]
Conserved role of primary motor cortex in the control of prehension in mice and macaques.
Journal: Cell reports
In common: Matplotlib, NumPy, 2 references
[7] doi:10.1038/s41593-026-02362-5 [code]
Replay of procedural memory is independent of the hippocampus.
Journal: Nature neuroscience
In common: Pillow, Matplotlib, NumPy, 1 reference
[8] doi:10.1016/j.isci.2026.116705 [code]
Spatiotemporal characteristics of visual cortical responses to transpalpebral electrical stimulation.
Journal: iScience
In common: Pillow, Matplotlib, NumPy, 1 reference
[9] doi:10.1016/j.isci.2026.116498 [code]
The Tower Foraging Park: A paradigm for studying cognitive and motor processes underlying behavioral flexibility in freely moving mice.
Journal: iScience
In common: Pillow, Matplotlib, NumPy, 1 reference
[10] doi:10.3390/bioengineering13070773 [code]
From API to Action: A Multi-Model Comparison of OpenAI, Anthropic, Google, and Meta LLMs for Clinical Trial Data Extraction.
Journal: Bioengineering (Basel, Switzerland)
In common: Matplotlib, NumPy, other, 1 reference

Contribute

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

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

Request its removal

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

Discussion, reproductions, activity

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

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

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