OSCR

Multiple system atrophy is associated with brain somatic mutations in clonal hematopoiesis genes

Code ↔ Paper

8 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 8 matches
  1. [1] § Materials and methods › Processing of sequencing data ↔ 2.BAM-DeDuplication/2a_agent_creak.py, lines 1 to 37 · score 0.91 · single strand consensus, CReaK, AGeNT, Hybrid MS1, consensus BAMs, Hybrid MS2 · Report a mismatch
  2. [2] § Materials and methods › Processing of sequencing data ↔ 1.fastq_trim_QC_Align/1c_alignment.py, lines 1 to 29 · score 0.81 · BWA MEM, reference genome, FASTQ, collapse, v0, flag · Report a mismatch
  3. [3] § Materials and methods › Somatic mutation calling and filtering pipeline ↔ 5.Indel-filtering/5d_indel_exclude_repeats.py, lines 1 to 31 · score 0.78 · repetitive regions, RepeatMasker, Duplex consensus, indel VCFs, overlapping, hg38 · Report a mismatch
  4. [4] § Materials and methods › Target gene panel and enrichment strategy ↔ 2.BAM-DeDuplication/2a_agent_creak.py, lines 1 to 37 · score 0.71 · generating consensus sequences, low frequency somatic, somatic variants, tag, molecular, strands · Report a mismatch
  5. [5] § Materials and methods › Somatic mutation calling and filtering pipeline ↔ 2.BAM-DeDuplication/2b_add_read_groups.py, lines 48 to 61 · score 0.63 · Hybrid MS2 BAMs, Duplex BAMs, Hybrid MS1 · Report a mismatch
  6. [6] § Materials and methods › Somatic mutation calling and filtering pipeline ↔ 5.Indel-filtering/5_filter_indels_wrapper.py, lines 62 to 196 · score 0.61 · RepeatMasker, filtering parameters, indel VCFs, quality, hg38, pipeline · Report a mismatch
  7. [7] § Materials and methods › Somatic mutation calling and filtering pipeline ↔ 4.SNV-filtering/4c_filter_read_quality.py, lines 1 to 25 · score 0.58 · mapping quality, strand bias, bp, events, filtered, variants · Report a mismatch
  8. [8] § Materials and methods › Somatic mutation calling and filtering pipeline ↔ 4.SNV-filtering/4_filter_snvs_wrapper.py, lines 61 to 178 · score 0.53 · strand bias, mapping quality, SOR, pipeline, events, filtered · Report a mismatch

Paper

Loaded from Europe PMC by your browser; OSCR does not store it: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 356 lines · 11 KB · no license · 2 matches

  1. #!/usr/bin/env python3
  2. """
  3. Step 2a: CReaK Molecular Consensus Calling
  4. Generates and submits SGE jobs to run AGeNT CReaK consensus calling at one or
  5. more stringency levels. Groups reads by MBC and generates consensus sequences
  6. for accurate low-frequency somatic variant detection.
  7. Stringency levels:
  8. MS1 — HYBRID mode, min single strand consensus 1 (maximum sensitivity)
  9. MS2 — HYBRID mode, min single strand consensus 2 (balanced)
  10. DUPLEX — DUPLEX mode (maximum specificity, both strands in agreement required)
  11. Input:
  12. - Directory containing sample subdirectories, each with a sorted BAM
  13. ending in *_sorted.bam (MBC tags must be present from steps 1a-1c)
  14. Output:
  15. - Consensus BAMs in per-stringency subdirectories:
  16. {output_bam_dir}/MS1/{sample}_hybrid_MS1.bam
  17. {output_bam_dir}/MS2/{sample}_hybrid_MS2.bam
  18. {output_bam_dir}/DUPLEX/{sample}_duplex.bam
  19. Requirements:
  20. - AGeNT (v3.1.2 or later)
  21. - Java 17+
  22. - SGE cluster with qsub
  23. - config_2a_agent_creak.yaml
  24. """
  25. import os
  26. import copy
  27. import subprocess
  28. import time
  29. import yaml
  30. import argparse
  31. from pathlib import Path
  32. def load_config(config_path):
  33. """Load configuration from YAML file."""
  34. with open(config_path, 'r') as f:
  35. return yaml.safe_load(f)
  36. def find_sorted_bam(sample_dir, bam_suffix):
  37. """
  38. Find sorted BAM file in a sample directory.
  39. Returns:
  40. Path to BAM file or None if not found.
  41. """
  42. bam_candidates = [f for f in os.listdir(sample_dir) if f.endswith(bam_suffix)]
  43. if len(bam_candidates) == 0:
  44. print(f"Warning: No BAM file found in {sample_dir}")
  45. return None
  46. elif len(bam_candidates) > 1:
  47. print(f"Warning: Multiple BAM files found in {sample_dir}")
  48. print(f" Candidates: {bam_candidates}")
  49. print(f" Using first match: {bam_candidates[0]}")
  50. return os.path.join(sample_dir, bam_candidates[0])
  51. def verify_dependencies(config):
  52. """
  53. Verify required tools exist.
  54. Raises:
  55. FileNotFoundError: If dependencies are missing.
  56. """
  57. agent_path = config['tools']['agent_path']
  58. java_home = config['tools']['java_home']
  59. if not os.path.exists(agent_path):
  60. raise FileNotFoundError(f"AGeNT tool not found: {agent_path}")
  61. if not os.path.exists(java_home):
  62. raise FileNotFoundError(f"Java installation not found: {java_home}")
  63. print(f"✓ AGeNT found: {agent_path}")
  64. print(f"✓ Java found: {java_home}")
  65. def get_output_suffix(consensus_mode, min_stringency):
  66. """Return output BAM suffix based on consensus parameters."""
  67. if consensus_mode.upper() == "DUPLEX":
  68. return "_duplex"
  69. elif consensus_mode.upper() == "HYBRID":
  70. return f"_hybrid_MS{min_stringency}"
  71. else:
  72. return "_consensus"
  73. def create_qsub_script(sample_name, config, input_bam, output_dir, script_dir, stringency_label):
  74. """
  75. Create SGE job script for AGeNT CReaK consensus calling.
  76. Returns:
  77. Path to created job script, or None if output already exists.
  78. """
  79. output_suffix = get_output_suffix(
  80. config['creak']['consensus_mode'],
  81. config['creak']['min_stringency']
  82. )
  83. output_bam = os.path.join(output_dir, f"{sample_name}{output_suffix}.bam")
  84. if os.path.exists(output_bam) and os.path.getsize(output_bam) > 0:
  85. print(f" ⚠ Output already exists: {os.path.basename(output_bam)} (skipping)")
  86. return None
  87. java_home = config['tools']['java_home']
  88. java_env = f"""export JAVA_HOME={java_home}
  89. export PATH={java_home}/bin:$PATH"""
  90. creak_params = config['creak']
  91. creak_cmd = f"""{config['tools']['agent_path']} creak \\
  92. -MD {creak_params['max_distance']} \\
  93. -MS {creak_params['min_stringency']} \\
  94. -c={creak_params['consensus_mode']} \\
  95. -s={creak_params['sample_size']} \\
  96. -mm={creak_params['max_mismatches']} \\
  97. -mr={creak_params['max_read_length']} \\
  98. -mq={creak_params['min_mapping_quality']}"""
  99. if creak_params.get('memory_efficient', True):
  100. creak_cmd += " \\\n --memory-efficient-mode"
  101. if creak_params.get('force_overwrite', True):
  102. creak_cmd += " \\\n -F"
  103. if creak_params.get('filter_mode', True):
  104. creak_cmd += " \\\n -f"
  105. if creak_params.get('retain_singletons', True):
  106. creak_cmd += " \\\n -r"
  107. creak_cmd += f" \\\n -o={output_bam} \\\n {input_bam}"
  108. job_script_template = """#!/bin/bash
  109. #$ -N creak_{sample}_{stringency}
  110. #$ -l h_vmem={memory}
  111. #$ -pe smp {cores}
  112. #$ -l h_rt={wall_time}
  113. #$ -cwd
  114. #$ -o {log_dir}/{sample}_creak_{stringency}.stdout
  115. #$ -e {log_dir}/{sample}_creak_{stringency}.stderr
  116. # Set Java environment (required for AGeNT)
  117. {java_env}
  118. # Verify Java version
  119. java -version
  120. INPUT_BAM={input_bam}
  121. OUTPUT_BAM={output_bam}
  122. echo "Starting AGeNT CReaK for {sample} ({stringency})..."
  123. echo " Input BAM: $(basename $INPUT_BAM)"
  124. echo " Output BAM: $(basename $OUTPUT_BAM)"
  125. echo " Consensus mode: {consensus_mode}"
  126. echo " Minimum stringency: MS{min_stringency}"
  127. # Run AGeNT CReaK
  128. {creak_cmd}
  129. # Verify output
  130. if [ -f "$OUTPUT_BAM" ]; then
  131. SIZE=$(stat -f%z "$OUTPUT_BAM" 2>/dev/null || stat -c%s "$OUTPUT_BAM" 2>/dev/null)
  132. echo "✓ CReaK completed successfully"
  133. echo " Output BAM: $(basename $OUTPUT_BAM)"
  134. echo " File size: $SIZE bytes"
  135. else
  136. echo "✗ ERROR: Output BAM not created"
  137. exit 1
  138. fi
  139. """
  140. job_script = job_script_template.format(
  141. sample=sample_name,
  142. stringency=stringency_label,
  143. memory=config['sge']['memory'],
  144. cores=config['sge']['cores'],
  145. wall_time=config['sge']['wall_time'],
  146. log_dir=output_dir,
  147. java_env=java_env,
  148. input_bam=input_bam,
  149. output_bam=output_bam,
  150. consensus_mode=creak_params['consensus_mode'],
  151. min_stringency=creak_params['min_stringency'],
  152. creak_cmd=creak_cmd
  153. )
  154. job_script_path = os.path.join(script_dir, f"{sample_name}_creak_{stringency_label}.sh")
  155. with open(job_script_path, "w") as f:
  156. f.write(job_script)
  157. return job_script_path
  158. def submit_jobs_in_batches(job_scripts, batch_size, pause_time):
  159. """Submit jobs to SGE in batches."""
  160. for i in range(0, len(job_scripts), batch_size):
  161. batch = job_scripts[i:i + batch_size]
  162. print(f"\n=== Submitting batch {i // batch_size + 1} ({len(batch)} jobs) ===")
  163. for job_script in batch:
  164. result = subprocess.run(
  165. ["qsub", job_script],
  166. capture_output=True,
  167. text=True
  168. )
  169. if result.returncode == 0:
  170. print(f" ✓ Submitted: {os.path.basename(job_script)}")
  171. print(f" {result.stdout.strip()}")
  172. else:
  173. print(f" ✗ Failed: {os.path.basename(job_script)}")
  174. print(f" Error: {result.stderr.strip()}")
  175. if i + batch_size < len(job_scripts):
  176. print(f" Pausing {pause_time}s before next batch...")
  177. time.sleep(pause_time)
  178. def run_stringency(stringency, config, dry_run):
  179. """
  180. Run CReaK pipeline for a single stringency level.
  181. Returns:
  182. List of job scripts generated.
  183. """
  184. cfg = copy.deepcopy(config)
  185. stringency_map = {
  186. 'MS1': {'mode': 'HYBRID', 'min_stringency': 1, 'suffix': 'MS1'},
  187. 'MS2': {'mode': 'HYBRID', 'min_stringency': 2, 'suffix': 'MS2'},
  188. 'DUPLEX': {'mode': 'DUPLEX', 'min_stringency': 2, 'suffix': 'DUPLEX'}
  189. }
  190. stringency_params = stringency_map[stringency]
  191. cfg['creak']['consensus_mode'] = stringency_params['mode']
  192. cfg['creak']['min_stringency'] = stringency_params['min_stringency']
  193. base_output_dir = cfg['paths']['output_bam_dir']
  194. output_dir = os.path.join(base_output_dir, stringency_params['suffix'])
  195. script_dir = cfg['paths']['job_scripts_dir']
  196. os.makedirs(output_dir, exist_ok=True)
  197. os.makedirs(script_dir, exist_ok=True)
  198. print(f"\n{'='*60}")
  199. print(f"Stringency: {stringency}")
  200. print(f"Consensus Mode: {cfg['creak']['consensus_mode']}")
  201. print(f"Min Stringency: MS{cfg['creak']['min_stringency']}")
  202. print(f"Output Directory: {output_dir}")
  203. print(f"{'='*60}\n")
  204. input_dir = cfg['paths']['input_bam_dir']
  205. job_scripts = []
  206. print(f"Scanning for samples in: {input_dir}\n")
  207. for sample in sorted(os.listdir(input_dir)):
  208. sample_dir = os.path.join(input_dir, sample)
  209. if not os.path.isdir(sample_dir):
  210. continue
  211. print(f"Processing sample: {sample}")
  212. input_bam = find_sorted_bam(sample_dir, cfg['bam']['input_suffix'])
  213. if input_bam is None:
  214. print(f" ⚠ Skipping {sample} - BAM file not found\n")
  215. continue
  216. print(f" Input BAM: {os.path.basename(input_bam)}")
  217. job_script_path = create_qsub_script(
  218. sample_name=sample,
  219. config=cfg,
  220. input_bam=input_bam,
  221. output_dir=output_dir,
  222. script_dir=script_dir,
  223. stringency_label=stringency
  224. )
  225. if job_script_path is not None:
  226. job_scripts.append(job_script_path)
  227. print(f" ✓ Job script created: {os.path.basename(job_script_path)}\n")
  228. else:
  229. print()
  230. return job_scripts
  231. def main():
  232. """Main execution function."""
  233. parser = argparse.ArgumentParser(
  234. description='Generate and submit AGeNT CReaK jobs for molecular consensus calling',
  235. epilog='Example: python 2a_agent_creak.py --config config_2a_agent_creak.yaml --stringency MS1 MS2 DUPLEX'
  236. )
  237. parser.add_argument(
  238. '--config',
  239. default='config/04_agent_creak_config.yaml',
  240. help='Path to configuration file (default: config/04_agent_creak_config.yaml)'
  241. )
  242. parser.add_argument(
  243. '--stringency',
  244. choices=['MS1', 'MS2', 'DUPLEX'],
  245. nargs='+',
  246. required=True,
  247. help='One or more stringency levels to run: MS1 MS2 DUPLEX'
  248. )
  249. parser.add_argument(
  250. '--dry-run',
  251. action='store_true',
  252. help='Generate job scripts but do not submit them'
  253. )
  254. args = parser.parse_args()
  255. config = load_config(args.config)
  256. print("Checking dependencies...")
  257. verify_dependencies(config)
  258. all_job_scripts = []
  259. for stringency in args.stringency:
  260. job_scripts = run_stringency(stringency, config, args.dry_run)
  261. all_job_scripts.extend(job_scripts)
  262. print(f"\n{'='*60}")
  263. print(f"Generated {len(all_job_scripts)} job scripts total")
  264. print(f"Stringencies processed: {', '.join(args.stringency)}")
  265. print(f"{'='*60}\n")
  266. if len(all_job_scripts) == 0:
  267. print("No jobs to submit. Exiting.")
  268. return
  269. if args.dry_run:
  270. print("DRY RUN: Jobs not submitted.")
  271. print("Job scripts saved to:", config['paths']['job_scripts_dir'])
  272. else:
  273. submit_jobs_in_batches(
  274. all_job_scripts,
  275. batch_size=config['submission']['batch_size'],
  276. pause_time=config['submission']['pause_between_batches']
  277. )
  278. print("\n✓ All batches submitted successfully")
  279. if __name__ == "__main__":
  280. main()

2a_agent_creak.py at commit e9779fd, no license · at the source

Overview

Authors: Ben Thompson1, Dominic Horner1, Caoimhe Morley1, Emil Gustavsson2,3, Zane Jaunmuktane1,4, Christos Proukakis1
  1. Department of Clinical and Movement Neurosciences, UCL Queen Square Institute of Neurology, London, UK
  2. UK Dementia Research Institute, University of Cambridge, Cambridge, UK
  3. Department of Clinical Neurosciences, School of Clinical Medicine, University of Cambridge, Cambridge, UK
  4. Queen Square Brain Bank for Neurological disorders, UCL Queen Square Institute of Neurology, London, UK
Institutions: UCL Queen Square Institute of Neurology (United Kingdom); UK Dementia Research Institute (United Kingdom); University of Cambridge (United Kingdom)
Dates: published online 23 March 2026
Type: Preprint
License: CC BY-ND
Identifiers: DOI 10.64898/2026.03.17.26346081 · OpenAlex W7140105429
Open access: green, a free copy (OpenAlex)
Status: code verified (how the code is found and verified)
Categories: genetics / omics (modality), cellular / molecular (subfield)
Methods: Statistics, Connectivity
Keywords: Multiple system atrophy, somatic mutations, duplex sequencing, clonal haematopoiesis
Topic: Parkinson's Disease Mechanisms and Treatments (Clinical Neurology, Medicine), according to OpenAlex
Funding: Mission MSA; MSA Trust
Citations: not cited yet (Europe PMC); 49 references in the paper

Abstract

The abstract is not reproduced here: the paper's license (CC BY-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, with 8 matches between paragraphs and lines of code.

b-thompson-99/XT-HS2-Small-Somatic

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: e9779fd98ca1408b615e800c1aba940c70973ff5, 23 March 2026
Languages: Python (17)
Size: 35 files, 17 scripts
Software Heritage: not archived
Found in: “Data and code availability”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: BEDTools (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
18 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;
  • 17 scripts, each with its path and the digest of its content;
  • 8 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

No dataset and no data link were found in the paper.

Code and data availability statement

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

Read it in the paper: doi.org/10.64898/2026.03.17.26346081.

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, journal, dates, 6 authors, 4 keywords, 2 funders, 49 references.

Cite

This paper

Thompson, B., Horner, D., Morley, C., Gustavsson, E., Jaunmuktane, Z., & Proukakis, C. (2026). Multiple system atrophy is associated with brain somatic mutations in clonal hematopoiesis genes. medRxiv (preprint). https://doi.org/10.64898/2026.03.17.26346081

BibTeX

@article{thompson2026multiple,
author = {Thompson, Ben and Horner, Dominic and Morley, Caoimhe and Gustavsson, Emil and Jaunmuktane, Zane and Proukakis, Christos},
title = {{Multiple system atrophy is associated with brain somatic mutations in clonal hematopoiesis genes}},
journal = {medRxiv (preprint)},
year = {2026},
month = mar,
publisher = {medRxiv},
doi = {10.64898/2026.03.17.26346081},
url = {https://doi.org/10.64898/2026.03.17.26346081}
}

RIS

TY - JOUR
AU - Thompson, Ben
AU - Horner, Dominic
AU - Morley, Caoimhe
AU - Gustavsson, Emil
AU - Jaunmuktane, Zane
AU - Proukakis, Christos
TI - Multiple system atrophy is associated with brain somatic mutations in clonal hematopoiesis genes
T2 - medRxiv (preprint)
J2 - medRxiv
PY - 2026
DA - 2026/03/23
PB - medRxiv
DO - 10.64898/2026.03.17.26346081
UR - https://doi.org/10.64898/2026.03.17.26346081
ER -

CSL-JSON

{
"id": "10.64898/2026.03.17.26346081",
"type": "article",
"title": "Multiple system atrophy is associated with brain somatic mutations in clonal hematopoiesis genes",
"container-title": "medRxiv (preprint)",
"author": [
{
"family": "Thompson",
"given": "Ben"
},
{
"family": "Horner",
"given": "Dominic"
},
{
"family": "Morley",
"given": "Caoimhe"
},
{
"family": "Gustavsson",
"given": "Emil"
},
{
"family": "Jaunmuktane",
"given": "Zane"
},
{
"family": "Proukakis",
"given": "Christos"
}
],
"container-title-short": "medRxiv",
"DOI": "10.64898/2026.03.17.26346081",
"publisher": "medRxiv",
"URL": "https://doi.org/10.64898/2026.03.17.26346081",
"issued": {
"date-parts": [
[
2026,
3,
23
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s42003-024-06940-w [code]
Single-cell somatic copy number variants in brain using different amplification methods and reference genomes.
Journal: Communications biology
In common: BEDTools, genetics / omics, cellular / molecular, 2 references, author Christos Proukakis
[2] doi:10.1038/s42003-025-08805-2 [code]
Single cell long read whole genome sequencing reveals somatic transposon activity in human brain.
Journal: Communications biology
In common: genetics / omics, cellular / molecular, 3 references, author Christos Proukakis
[3] doi:10.1038/s41587-023-02024-y [code]
Detection of mosaic and population-level structural variants with Sniffles2.
Journal: Nature biotechnology
In common: genetics / omics, 3 references, author Christos Proukakis
[4] doi:10.1038/s41467-022-34732-5 [code]
Genome-wide association study of REM sleep behavior disorder identifies polygenic risk and brain expression effects.
Journal: Nature communications
In common: BEDTools, genetics / omics, 1 reference, author Emil Gustavsson
[5] doi:10.1126/sciadv.adk1296 [code]
The annotation of &lt;i&gt;GBA1&lt;/i&gt; has been concealed by its protein-coding pseudogene &lt;i&gt;GBAP1&lt;/i&gt;.
Journal: Science advances
In common: genetics / omics, cellular / molecular, 1 reference, author Emil Gustavsson
[6] doi:10.1093/nar/gkaf1450 [code]
Accurate detection of somatic single-nucleotide variants from bulk RNA-seq data using RNA-MosaicHunter.
Journal: Nucleic acids research
In common: genetics / omics, 4 references
[7] doi:10.1126/sciadv.adp8504 [code]
Astrocytic RNA editing regulates the host immune response to alpha-synuclein.
Journal: Science advances
In common: cellular / molecular, 1 reference, author Emil Gustavsson
[8] doi:10.1038/s41591-023-02397-2 [code]
Clonal hematopoiesis is associated with protection from Alzheimer's disease.
Journal: Nature medicine
In common: cellular / molecular, 3 references
[9] doi:10.1038/s41588-025-02217-y [code]
Detecting and quantifying clonal selection in somatic stem cells.
Journal: Nature genetics
In common: genetics / omics, cellular / molecular, 3 references
[10] doi:10.1126/science.adu1351 [code]
Diverse somatic genomic alterations in single neurons in chronic traumatic encephalopathy.
Journal: Science (New York, N.Y.)
In common: genetics / omics, 3 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.

Add the badge to the code's README

OSCR: the badge of this paper

If you are an author or a maintainer of this paper's code, you can add this badge. It says what OSCR knows of the paper (its code, its validated tracing map) and links the code to this page. Paste one of these snippets under the README's title. Keep the two marks around it, so that the badge can be replaced in place and is never added twice. OSCR changes nothing in your repository.

Markdown
<!-- oscr-badge:start -->
[![OSCR](https://openscicode.org/badge/doi/10.64898/2026.03.17.26346081.svg)](https://openscicode.org/badge/doi/10.64898/2026.03.17.26346081)
<!-- oscr-badge:end -->
reStructuredText
.. oscr-badge:start

.. image:: https://openscicode.org/badge/doi/10.64898/2026.03.17.26346081.svg
   :target: https://openscicode.org/badge/doi/10.64898/2026.03.17.26346081
   :alt: OSCR

.. oscr-badge:end
HTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.64898/2026.03.17.26346081"><img src="https://openscicode.org/badge/doi/10.64898/2026.03.17.26346081.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->

On GitHub, open the README, choose Edit (the pencil), paste the snippet under the title, then "Commit changes".

If you choose to, you can have the badge kept up to date for you, with oscr badge --write from the command line or with the GitHub Action in your repository's workflows. Every other form and option (a card, AsciiDoc, LaTeX, shields.io) is on the badge 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: code errors and mismatches between the code and the paper about this paper and its code, from readers and its authors, beside the paper and its tracing map.

Report a mismatch between the code and the paper · Report a code error (signed in)

Reproductions: reports from readers who ran the authors' code and did not get the paper's result, what they ran, with which environment, commit and data.

Report a reproduction failure (signed in)

Versions of its code: the releases of its code tied to a version of this paper (the preprint, the accepted manuscript, the version of record…), each with the tracing map versioned with it.

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