OSCR

AVPENet: Pain estimation from audio-visual fusion of non-speech sounds.

Code ↔ Paper

24 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 24 matches
  1. [1] § Methodology › Data preprocessing › Audio processing pipeline. ↔ avpenet/data/audio_preprocessing.py, lines 226 to 268 · score 0.91 · additive white noise, pitch shifting, 20–30 dB, 0.9–1.1, semitones, stretching · Report a mismatch
  2. [2] § Methodology › Visual Processing Pipeline ↔ avpenet/data/visual_preprocessing.py, lines 292 to 345 · score 0.87 · photometric transformations, geometric transformations, random rotation, 0.95–1.05, brightness, translation · Report a mismatch
  3. [3] § Proposed AVPENet architecture › Audio encoder architecture ↔ avpenet/models/audio_encoder.py, lines 46 to 142 · score 0.83 · residual blocks, spectrogram processing, ResNet, audio encoder, mel spectrogram, modified · Report a mismatch
  4. [4] § Proposed AVPENet architecture › Visual encoder architecture ↔ avpenet/models/visual_encoder.py, lines 1 to 15 · score 0.76 · spatial attention augmentation, RGB face image, ResNet, visual encoder, architecture · Report a mismatch
  5. [5] § Results › 0.1 Overall performance ↔ notebooks/quickstart_demo.ipynb, lines 101 to 141 · score 0.72 · ground truth pain, perfect prediction, fitted, Scatter, 0–3, 7–10 · Report a mismatch
  6. [6] § Proposed AVPENet architecture › Training protocol ↔ scripts/train.py, lines 1 to 25 · score 0.71 · 1–30, 31–100, unfreeze, epochs, protocol, Training · Report a mismatch
  7. [7] § Proposed AVPENet architecture › Pain regression head ↔ avpenet/models/regression_head.py, lines 1 to 13 · score 0.69 · regression head, fused representation, continuous pain score, transforms · Report a mismatch
  8. [8] § Proposed AVPENet architecture ↔ avpenet/models/avpenet.py, lines 25 to 39 · score 0.69 · bidirectional cross modal, Audio Visual Pain, continuous pain scores, parallel, AVPENet, Network · Report a mismatch
  9. [9] § Proposed AVPENet architecture › Cross-modal fusion module ↔ avpenet/models/fusion.py, lines 89 to 194 · score 0.67 · cross modal fusion, bidirectional cross attention, visual embeddings, module, audio · Report a mismatch
  10. [10] § Proposed AVPENet architecture › Evaluation metrics ↔ avpenet/metrics.py, lines 1 to 27 · score 0.67 · Pearson correlation coefficient, intraclass correlation coefficient, RMSE, PCC, ICC, metrics · Report a mismatch
  11. [11] § Proposed AVPENet architecture › Baseline methods and comparisons ↔ avpenet/models/avpenet.py, lines 1 to 22 · score 0.66 · ResNet, regression head, audio encoder, visual encoder, architecture, fusion · Report a mismatch
  12. [12] § Proposed AVPENet architecture › Evaluation metrics ↔ avpenet/metrics.py, lines 41 to 52 · score 0.64 · continuous pain scores, low pain, high pain, discretized, class, moderate · Report a mismatch
  13. [13] § Proposed AVPENet architecture › Loss function design ↔ avpenet/losses.py, lines 94 to 150 · score 0.62 · composite loss, predicted pain scores, ground truth · Report a mismatch
  14. [14] § Methodology › Data preprocessing › Audio processing pipeline. ↔ avpenet/data/audio_preprocessing.py, lines 83 to 111 · score 0.61 · power spectrum, spectral flatness, Audio · Report a mismatch
  15. [15] § Proposed AVPENet architecture › Experimental conditions and ablation studies ↔ avpenet/losses.py, lines 94 to 150 · score 0.61 · smoothness terms, composite loss, ordinal, components, module · Report a mismatch
  16. [16] § Results › 0.2 Age group stratification ↔ avpenet/metrics.py, lines 116 to 139 · score 0.60 · class pain categorization, confusion matrices, classification, accuracy · Report a mismatch
  17. [17] § Proposed AVPENet architecture › Cross-modal fusion module ↔ avpenet/models/fusion.py, lines 1 to 19 · score 0.59 · learnable positional encodings, fusion, module, modal, Cross · Report a mismatch
  18. [18] § Methodology › Data preprocessing › Audio processing pipeline. ↔ avpenet/data/audio_preprocessing.py, lines 40 to 78 · score 0.58 · spectral floor, noise suppression, Audio · Report a mismatch
  19. [19] § Proposed AVPENet architecture › Experimental conditions and ablation studies ↔ avpenet/models/audio_encoder.py, lines 46 to 142 · score 0.56 · ImageNet, audio encoder, modified, pretraining, architectural, module · Report a mismatch
  20. [20] § Proposed AVPENet architecture › Cross-modal fusion module ↔ avpenet/models/fusion.py, lines 89 to 194 · score 0.55 · feed forward network, concatenated, fusion, module, modal, Cross · Report a mismatch
  21. [21] § Results › 0.1 Overall performance ↔ notebooks/quickstart_demo.ipynb, lines 101 to 141 · score 0.55 · ground truth pain, perfect prediction, scatter, moderate, regression, scores · Report a mismatch
  22. [22] § Results › 0.2 Age group stratification ↔ avpenet/metrics.py, lines 116 to 139 · score 0.53 · class pain categorization, Confusion matrices, classification, accuracy, score · Report a mismatch
  23. [23] § Methodology › Pain annotation and ground truth establishment ↔ avpenet/metrics.py, lines 74 to 111 · score 0.51 · intraclass correlation coefficient, agreement, rater, ICC, scores · Report a mismatch
  24. [24] § Proposed AVPENet architecture › Training protocol ↔ scripts/train.py, lines 77 to 89 · score 0.50 · cosine annealing, schedule, optimizer, Training · 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 · 209 lines · 6.9 KB · MIT · 5 matches

  1. """
  2. Evaluation Metrics for AVPENet.
  3. Implements all metrics from the paper:
  4. - MAE (primary metric)
  5. - RMSE
  6. - PCC (Pearson correlation coefficient)
  7. - ICC (intraclass correlation coefficient)
  8. - Accuracy, F1, Kappa (3-class discretised)
  9. Reference: Section "Evaluation Metrics".
  10. """
  11. from __future__ import annotations
  12. import numpy as np
  13. import torch
  14. from scipy import stats
  15. from sklearn.metrics import (
  16. mean_absolute_error,
  17. mean_squared_error,
  18. accuracy_score,
  19. f1_score,
  20. cohen_kappa_score,
  21. confusion_matrix,
  22. )
  23. from typing import Union
  24. # ─────────────────────────── Helpers ──────────────────────────────────────────
  25. ArrayLike = Union[np.ndarray, torch.Tensor, list]
  26. def _to_numpy(x: ArrayLike) -> np.ndarray:
  27. if isinstance(x, torch.Tensor):
  28. return x.detach().cpu().numpy()
  29. return np.asarray(x, dtype=np.float32)
  30. def discretise_pain(scores: np.ndarray) -> np.ndarray:
  31. """Map continuous pain scores to 3-class labels.
  32. Classes (from the paper):
  33. 0 — Low pain : [0, 3]
  34. 1 — Moderate : (3, 6]
  35. 2 — High pain : (6, 10]
  36. """
  37. labels = np.zeros_like(scores, dtype=int)
  38. labels[(scores > 3) & (scores <= 6)] = 1
  39. labels[scores > 6] = 2
  40. return labels
  41. # ─────────────────────────── Regression Metrics ───────────────────────────────
  42. def compute_mae(pred: ArrayLike, target: ArrayLike) -> float:
  43. """Mean Absolute Error — primary metric."""
  44. return float(mean_absolute_error(_to_numpy(target), _to_numpy(pred)))
  45. def compute_rmse(pred: ArrayLike, target: ArrayLike) -> float:
  46. """Root Mean Squared Error."""
  47. return float(np.sqrt(mean_squared_error(_to_numpy(target), _to_numpy(pred))))
  48. def compute_pcc(pred: ArrayLike, target: ArrayLike) -> float:
  49. """Pearson Correlation Coefficient."""
  50. p, t = _to_numpy(pred), _to_numpy(target)
  51. r, _ = stats.pearsonr(p, t)
  52. return float(r)
  53. def compute_icc(pred: ArrayLike, target: ArrayLike) -> float:
  54. """Intraclass Correlation Coefficient (two-way random, absolute agreement).
  55. ICC(2,1) — measures absolute agreement between rater and reference.
  56. """
  57. try:
  58. import pingouin as pg
  59. import pandas as pd
  60. p, t = _to_numpy(pred), _to_numpy(target)
  61. n = len(p)
  62. data = pd.DataFrame({
  63. "targets": np.tile(np.arange(n), 2),
  64. "raters": ["pred"] * n + ["true"] * n,
  65. "scores": np.concatenate([p, t]),
  66. })
  67. icc_result = pg.intraclass_corr(
  68. data=data,
  69. targets="targets",
  70. raters="raters",
  71. ratings="scores",
  72. )
  73. # Return ICC(2,1) absolute agreement
  74. row = icc_result[icc_result["Type"] == "ICC2"]
  75. if len(row) > 0:
  76. return float(row.iloc[0]["ICC"])
  77. except Exception:
  78. pass
  79. # Fallback: simplified ICC computation
  80. p, t = _to_numpy(pred), _to_numpy(target)
  81. n = len(p)
  82. grand_mean = (p.mean() + t.mean()) / 2.0
  83. ss_total = np.sum((p - grand_mean) ** 2) + np.sum((t - grand_mean) ** 2)
  84. ss_within = np.sum((p - t) ** 2) / 2.0
  85. ms_between = (ss_total - 2 * ss_within) / (n - 1)
  86. ms_within = ss_within / n
  87. icc = (ms_between - ms_within) / (ms_between + ms_within)
  88. return float(icc)
  89. # ─────────────────────────── Classification Metrics ──────────────────────────
  90. def compute_classification_metrics(
  91. pred: ArrayLike,
  92. target: ArrayLike,
  93. ) -> dict:
  94. """Compute 3-class pain categorisation metrics.
  95. Returns:
  96. Dict with keys: accuracy, f1, kappa, confusion_matrix.
  97. """
  98. p, t = _to_numpy(pred), _to_numpy(target)
  99. pred_labels = discretise_pain(p)
  100. target_labels = discretise_pain(t)
  101. acc = float(accuracy_score(target_labels, pred_labels))
  102. f1 = float(f1_score(target_labels, pred_labels, average="macro", zero_division=0))
  103. kappa = float(cohen_kappa_score(target_labels, pred_labels))
  104. cm = confusion_matrix(target_labels, pred_labels, labels=[0, 1, 2])
  105. return {
  106. "accuracy": acc,
  107. "f1": f1,
  108. "kappa": kappa,
  109. "confusion_matrix": cm,
  110. }
  111. # ─────────────────────────── Comprehensive Evaluation ─────────────────────────
  112. def evaluate(
  113. pred: ArrayLike,
  114. target: ArrayLike,
  115. age_groups: ArrayLike = None,
  116. ) -> dict:
  117. """Compute all evaluation metrics reported in the paper.
  118. Args:
  119. pred: Predicted pain scores.
  120. target: Ground-truth pain scores.
  121. age_groups: Optional array of 'neonate'/'adult' labels
  122. for age-stratified evaluation.
  123. Returns:
  124. Nested dict with all metrics.
  125. """
  126. p, t = _to_numpy(pred), _to_numpy(target)
  127. results = {
  128. "mae": compute_mae(p, t),
  129. "rmse": compute_rmse(p, t),
  130. "pcc": compute_pcc(p, t),
  131. "icc": compute_icc(p, t),
  132. }
  133. results.update(compute_classification_metrics(p, t))
  134. # Age-stratified evaluation
  135. if age_groups is not None:
  136. groups = _to_numpy(age_groups) if not isinstance(age_groups, np.ndarray) else age_groups
  137. for group in ["neonate", "adult"]:
  138. mask = groups == group
  139. if mask.sum() > 0:
  140. sub = {
  141. "mae": compute_mae(p[mask], t[mask]),
  142. "rmse": compute_rmse(p[mask], t[mask]),
  143. "pcc": compute_pcc(p[mask], t[mask]),
  144. "n": int(mask.sum()),
  145. }
  146. sub.update(compute_classification_metrics(p[mask], t[mask]))
  147. results[group] = sub
  148. return results
  149. def print_results(results: dict, prefix: str = "") -> None:
  150. """Pretty-print evaluation results."""
  151. pad = f"[{prefix}] " if prefix else ""
  152. print(f"\n{'='*60}")
  153. print(f"{pad}Evaluation Results")
  154. print(f"{'='*60}")
  155. print(f" MAE: {results['mae']:.4f}")
  156. print(f" RMSE: {results['rmse']:.4f}")
  157. print(f" PCC: {results['pcc']:.4f}")
  158. print(f" ICC: {results['icc']:.4f}")
  159. print(f" Accuracy: {results['accuracy']*100:.1f}%")
  160. print(f" F1: {results['f1']:.4f}")
  161. print(f" Kappa: {results['kappa']:.4f}")
  162. for group in ["neonate", "adult"]:
  163. if group in results:
  164. g = results[group]
  165. print(f"\n [{group.capitalize()} (n={g['n']})]")
  166. print(f" MAE: {g['mae']:.4f}")
  167. print(f" PCC: {g['pcc']:.4f}")
  168. print(f" Accuracy: {g['accuracy']*100:.1f}%")
  169. print(f"{'='*60}\n")

metrics.py at commit 70b7093, under MIT · at the source

Overview

  1. Information Systems Department, College of Computer Science and Information Technology, King Faisal University, Al Ahsa, Saudi Arabia
  2. Computer Science Department, Military Academy of Fondouk Jedid, Nabeul, Tunisia
  3. Military Research Center, Aouina, Tunisia
Institutions: King Faisal University (Saudi Arabia); Military Academy, Tunisia (Tunisia)
Journal: PLOS digital health, volume 5, issue 3, article e0001301
Dates: received 26 December 2025; accepted 26 February 2026; published online 27 March 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1371/journal.pdig.0001301 · PMID 41894538 · PMCID PMC13029810 · OpenAlex W7141730472
Open access: gold, a free copy (OpenAlex)
Status: code verified (how the code is found and verified)
Categories: human (organism), pain (population), cognitive (subfield)
Methods: Connectivity, Spectral & time-frequency, Machine learning, Statistics
Journal subjects: Medicine and Health Sciences, Clinical Medicine, Signs and Symptoms, Pain, Biology and Life Sciences, Anatomy, Head, Face, Psychology, Behavior, Nonverbal Communication, Facial Expressions, Social Sciences, Neuroscience, Cognitive Science, Cognition, Memory, Face Recognition, Learning and Memory, Cognitive Psychology, Perception, People and Places, Population Groupings, Professions, Medical Personnel, Nurses, Health Care, Health Care Providers, Sensory Perception, Vision, Engineering and Technology, Signal Processing, Audio Signal Processing, Age Groups
Topic: Pediatric Pain Management Techniques (Pediatrics, Perinatology and Child Health, Medicine), according to OpenAlex
Funding: Nvidia; King Faisal University
Citations: not cited yet (Europe PMC); 66 references in the paper

Abstract

Pain assessment in non-verbal patients, including neonates and unconscious adults, remains a critical challenge in clinical practice. Current pain scales rely heavily on observer interpretation and may lack objectivity, introducing significant inter-rater variability. We propose a novel multimodal deep learning framework that estimates continuous pain intensity by fusing non-speech audio cues with facial expressions. Our approach addresses the critical need for objective pain assessment in vulnerable populations unable to self-report. We developed a cross-modal attention-based fusion network combining spectrogram-derived audio embeddings with facial action unit features. The model was trained and validated on 3,247 audio-visual recordings from 428 subjects, including 215 neonates and 213 adults, across three distinct pain intensity levels. We employed a ResNet-based audio encoder for mel-spectrogram processing and a facial landmark convolutional neural network for expression analysis, integrated through a transformer-based fusion module that learns complementary relationships between modalities. Our model achieved a mean absolute error of 0.89 on a 0–10 pain scale, significantly outperforming audio-only approaches (mean absolute error 1.47, 39% improvement) and visual-only baselines (mean absolute error 1.23, 28% improvement). Cross-age group validation demonstrated robust generalization with mean absolute errors of 0.94 for neonates and 0.91 for adults. The model maintained a Pearson correlation coefficient of 0.89 with ground truth annotations and achieved 81.4% accuracy for three-class pain categorization. Audio-visual fusion significantly enhances pain estimation accuracy across diverse age groups and clinical scenarios. This approach offers substantial potential for objective, automated pain monitoring in clinical settings, particularly for vulnerable populations unable to self-report pain.

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

oussama123-ai/AVPENet

License: MIT
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 70b709306609e1c24e0e9c361fd3fbd391a8852a, 16 March 2026
Languages: Python (22), Jupyter (1)
Size: 31 files, 23 scripts
Software Heritage: not archived
Found in: “Data Availability”
Holds: README, license file, environment (requirements.txt, setup.py), tests, documentation, 1 notebook
Not found: CITATION.cff, continuous integration
Tools: PyTorch (16 files), NumPy (11 files), pandas (3 files), OpenCV (2 files), Matplotlib (1 file), Pillow (1 file), Pingouin (1 file), scikit-learn (1 file), SciPy (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
25 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;
  • 23 scripts, each with its path and the digest of its content;
  • 24 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.

Data Availability

All data and code underlying the findings of this study are publicly available without restriction at: https://github.com/oussama123-ai/AVPENet.

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, 2 authors, 2 funders, 25 references.

Cite

This paper

Naouali, S., & El Othmani, O. (2026). AVPENet: Pain estimation from audio-visual fusion of non-speech sounds. PLOS digital health, 5(3), e0001301. https://doi.org/10.1371/journal.pdig.0001301

BibTeX

@article{naouali2026avpenet,
author = {Naouali, Sami and El Othmani, Oussama},
title = {{AVPENet: Pain estimation from audio-visual fusion of non-speech sounds}},
journal = {PLOS digital health},
year = {2026},
month = mar,
volume = {5},
number = {3},
pages = {e0001301},
publisher = {PLOS},
issn = {2767-3170},
doi = {10.1371/journal.pdig.0001301},
url = {https://doi.org/10.1371/journal.pdig.0001301},
pmid = {41894538},
pmcid = {PMC13029810}
}

RIS

TY - JOUR
AU - Naouali, Sami
AU - El Othmani, Oussama
TI - AVPENet: Pain estimation from audio-visual fusion of non-speech sounds
T2 - PLOS digital health
J2 - PLOS Digit Health
PY - 2026
DA - 2026/03/27
VL - 5
IS - 3
SP - e0001301
SN - 2767-3170
PB - PLOS
DO - 10.1371/journal.pdig.0001301
UR - https://doi.org/10.1371/journal.pdig.0001301
LA - en
ER -

CSL-JSON

{
"id": "10.1371/journal.pdig.0001301",
"type": "article-journal",
"title": "AVPENet: Pain estimation from audio-visual fusion of non-speech sounds",
"container-title": "PLOS digital health",
"author": [
{
"family": "Naouali",
"given": "Sami"
},
{
"family": "El Othmani",
"given": "Oussama"
}
],
"container-title-short": "PLOS Digit Health",
"volume": "5",
"issue": "3",
"page": "e0001301",
"DOI": "10.1371/journal.pdig.0001301",
"PMID": "41894538",
"PMCID": "PMC13029810",
"ISSN": "2767-3170",
"publisher": "PLOS",
"URL": "https://doi.org/10.1371/journal.pdig.0001301",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
27
]
]
}
}

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.pdig.0001442 [code]
PANDIA: Personalized neuro-symbolic multimodal fusion for interpretable neonatal pain assessment.
Journal: PLOS digital health
In common: OpenCV, Pillow, PyTorch, 3 other tools, pain, author Sami Naouali
[2] doi:10.7554/elife.107933 [code]
Modality-agnostic decoding of vision and language from fMRI.
Journal: eLife
In common: OpenCV, Pillow, PyTorch, 5 other tools, cognitive, 1 reference
[3] doi:10.1371/journal.pone.0344600 [code]
Robust disease prognosis via diagnostic knowledge preservation: A sequential learning approach.
Journal: PloS one
In common: OpenCV, Pillow, PyTorch, 5 other tools, 1 reference
[4] doi:10.1016/j.patter.2026.101538 [code]
A multi-modal foundation model for brain disease diagnosis and medical imaging.
Journal: Patterns (New York, N.Y.)
In common: OpenCV, Pillow, PyTorch, 5 other tools, 1 reference
[5] doi:10.1111/bpa.70029 [code]
Pediatric brain tumor classification using digital pathology and deep learning: Evaluation of SOTA methods on a multi-center Swedish cohort.
Journal: Brain pathology (Zurich, Switzerland)
In common: OpenCV, Pillow, PyTorch, 5 other tools, 1 reference
[6] doi:10.7554/elife.91685 [code]
Factorized visual representations in the primate visual system and deep neural networks.
Journal: eLife
In common: OpenCV, Pillow, PyTorch, 5 other tools, 1 reference
[7] doi:10.1117/1.nph.12.2.025012 [code]
Brain-wide 3D neuron detection and mapping with deep learning.
Journal: Neurophotonics
In common: OpenCV, Pillow, PyTorch, 5 other tools, 1 reference
[8] doi:10.7554/elife.79305 [code]
Open-source tools for behavioral video analysis: Setup, methods, and best practices.
Journal: eLife
In common: OpenCV, Pillow, PyTorch, 5 other tools, 1 reference
[9] doi:10.7554/elife.98117 [code]
Human EEG and artificial neural networks reveal disentangled representations and processing timelines of object real-world size and depth in natural images.
Journal: eLife
In common: Pingouin, Pillow, PyTorch, 4 other tools, 1 reference
[10] doi:10.3389/fneur.2023.1107957 [code]
The value of convolutional neural networks-based deep learning model in differential diagnosis of space-occupying brain diseases.
Journal: Frontiers in neurology
In common: OpenCV, Pillow, PyTorch, 4 other tools, 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.

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.1371/journal.pdig.0001301.svg)](https://openscicode.org/badge/doi/10.1371/journal.pdig.0001301)
<!-- oscr-badge:end -->
reStructuredText
.. oscr-badge:start

.. image:: https://openscicode.org/badge/doi/10.1371/journal.pdig.0001301.svg
   :target: https://openscicode.org/badge/doi/10.1371/journal.pdig.0001301
   :alt: OSCR

.. oscr-badge:end
HTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1371/journal.pdig.0001301"><img src="https://openscicode.org/badge/doi/10.1371/journal.pdig.0001301.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.