Real-time vectorcardiography simulator system.
The 3 matches
- [1] § Results › Technical validation ↔ Supporting_Jupyter_Info/DTW_ECG_Reproducibility_V1.ipynb, lines 75 to 192 · score 0.90 · accumulated cost matrix, normalized DTW distance, optimal warping, raw signals, 1500 ms, map · Report a mismatch
- [2] § Results › Technical validation ↔ Supporting_Jupyter_Info/DTW_ECG_Reproducibility_V1.ipynb, lines 75 to 192 · score 0.74 · Accumulated cost matrix, optimal warping, Normalized DTW, clarity, alignment, metrics · Report a mismatch
- [3] § Materials and methods › Hardware design and implementation › Technical validation. ↔ Supporting_Jupyter_Info/DTW_ECG_Reproducibility_V1.ipynb, lines 31 to 73 · score 0.65 · Norwegian endurance athlete, physical signal, ECG database, v1, Physionet, waveforms · 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
Jupyter notebook · 341 lines · 13 KB · MIT · 3 matches
- # %% [markdown]
- # # Supporting DTW_ECG Reproducibility
- # #### DTW analysis and figures, No additional analyses are introduced.
- # #### This program compares a synthetically generated signal and a real ECG signal for academic demonstration only. Not for clinical use.
- # ## Load simulated data
- # %%
- import numpy as np
- import matplotlib.pyplot as plt
- from scipy.signal import resample
- # 1. Load the data acquired from the graphic program (shape must be (n_samples, 3) LI, LII, LIII)
- sym_raw_data = np.load('mimic_ath16.npy')
- # 2. Resample data if is necessary. The shape of the array must be the same of the reference data array
- #single_wave_data = sym_raw_data[915:1220]
- #sym_data = resample(sym_raw_data, 360, axis=0)
- sym_data = sym_raw_data #Comment this line if a resaple was necessary
- # 3. test loaded data
- plt.figure(figsize=(7,2))
- plt.plot(sym_data[:, 0], linewidth=2)
- plt.grid(True, linestyle='--', alpha=0.7)
- plt.show()
- # 4. Check the shape to confirm
- print(f"Data shape: {sym_data.shape}")
- print(f"Data type: {sym_data.dtype}")
- print("This plot must show a single ECG wave")
- # %% [markdown]
- # ## Load reference data
- #
- # ##### ECG wave from Physionet (ath_016 snap from 850 to 2000 record) need (ath_016.hea, ath_016.dat files)
- # ##### SSingstad BJ. PhysioNet. 2022 [cited 2025 Mar 17]. Norwegian Endurance Athlete ECG Database v1.0.0. Available from: https://www.physionet.org/content/norwegian-athlete-ecg/1.0.0/
- # %%
- import wfdb
- from scipy.signal import butter, filtfilt
- # 1. Read the record
- # Note: 'record_name' should not include the extension (.hea or .dat) in the same jupyter nottebook folder
- record = wfdb.rdrecord('ath_016', sampfrom=850, sampto=2000, channels=[0, 1, 2])
- # 2. Extract the physical signal (the mV values)
- raw_data = record.p_signal
- ecg_data_b = raw_data[280:640] #sellect a single ECG wave
- # 3. remove the zero offsets if exist
- ### The ECG isoelectric line provides a zero-level reference that improves waveform comparison.
- ecg_data_b[:, 0] = ecg_data_b[:, 0]+0.02
- ecg_data_b[:, 1] = ecg_data_b[:, 1]+0.42
- ecg_data_b[:, 2] = ecg_data_b[:, 2]+0.33
- # 4. Filter the data
- sampling_rate = 500 #sampling_rate = 500.0 # Assume a sample rate of 1Hz, modify as needed
- num_samples = 300
- cutoff_frequency = 60 # Adjust as needed for desired cutoff frequency
- order = 4
- scale_factor = sampling_rate
- b, a = butter(order, cutoff_frequency, btype='low', fs=sampling_rate)
- filt_ref_data = filtfilt(b, a, ecg_data_b[:], axis=0) # Apply for denoising and improve the shape of the P signal
- # 5. test loaded data
- plt.figure(figsize=(7,2))
- plt.plot(filt_ref_data[:, 0], linewidth=2)
- plt.grid(True, linestyle='--', alpha=0.7)
- plt.show()
- # 6. Check the shape to confirm
- print(f"Data shape: {filt_ref_data.shape}")
- print(f"Data type: {filt_ref_data.dtype}")
- print("The reference data and the simulated data must match in dimensionality.")
- # %%
- import matplotlib.pyplot as plt
- import numpy as np
- from scipy import signal
- from scipy.spatial.distance import cdist
- # 1. Data Selection
- # Assuming lead index 1 (Lead II) for both
- s1 = filt_ref_data[:, 0] # Reference (Database)
- s2 = sym_data[:, 0] # User Generated
- # 2. Calculate Local Distance Matrix (Euclidean)
- # Compares every point in s1 with every point in s2
- cost_matrix = cdist(s1.reshape(-1, 1), s2.reshape(-1, 1), metric='euclidean')
- # 3. Compute Accumulated Cost Matrix
- # This is the core DTW logic to find the path of least resistance
- acc_cost_matrix = np.zeros(cost_matrix.shape)
- acc_cost_matrix[0, 0] = cost_matrix[0, 0]
- # Initialize first row and column
- for i in range(1, cost_matrix.shape[0]):
- acc_cost_matrix[i, 0] = cost_matrix[i, 0] + acc_cost_matrix[i-1, 0]
- for j in range(1, cost_matrix.shape[1]):
- acc_cost_matrix[0, j] = cost_matrix[0, j] + acc_cost_matrix[0, j-1]
- # Fill the matrix using the recursive rule
- for i in range(1, cost_matrix.shape[0]):
- for j in range(1, cost_matrix.shape[1]):
- acc_cost_matrix[i, j] = cost_matrix[i, j] + np.min([
- acc_cost_matrix[i-1, j], # Insertion
- acc_cost_matrix[i, j-1], # Deletion
- acc_cost_matrix[i-1, j-1] # Match
- ])
- # 4. Backtracking: Find the Optimal Warping Path
- path = []
- i, j = acc_cost_matrix.shape[0] - 1, acc_cost_matrix.shape[1] - 1
- path.append((i, j))
- while i > 0 or j > 0:
- options = []
- if i > 0: options.append((acc_cost_matrix[i-1, j], (i-1, j)))
- if j > 0: options.append((acc_cost_matrix[i, j-1], (i, j-1)))
- if i > 0 and j > 0: options.append((acc_cost_matrix[i-1, j-1], (i-1, j-1)))
- # Choose the neighbor with the lowest accumulated cost
- min_val, (i, j) = min(options, key=lambda x: x[0])
- path.append((i, j))
- path = np.array(path[::-1]) # Reverse to start from (0,0)
- # 5. Statistical Similarity Metrics
- # Calculate Cross-Correlation to find natural shift
- correlation = signal.correlate(s1 - np.mean(s1), s2 - np.mean(s2), mode='full')
- lags = signal.correlation_lags(len(s1), len(s2), mode='full')
- found_lag = lags[np.argmax(correlation)]
- # Calculate Similarity Percentage (Pearson Correlation) at Lag 0
- similarity_pct = np.corrcoef(s1, s2)[0, 1] * 100
- # Calculate DTW Metrics
- dtw_distance = acc_cost_matrix[-1, -1]
- norm_dtw = dtw_distance / (len(s1) + len(s2))
- # --- Visualization ---
- # --- Global font Settings ---
- plt.rcParams.update({
- 'font.size': 18, # Base font size
- 'axes.titlesize': 18, # Subplot titles
- 'axes.labelsize': 18, # X and Y labels
- 'xtick.labelsize': 14, # X-axis tick numbers
- 'ytick.labelsize': 14, # Y-axis tick numbers
- 'legend.fontsize': 14, # Legend text
- 'figure.titlesize': 24 # Main figure title
- })
- %config InlineBackend.figure_format = 'retina'
- plt.figure(figsize=(17, 5))
- # Plot A: Raw Signals
- plt.subplot(1, 3, 1)
- plt.plot(s1, label='Database (Ref)', color='blue', linewidth=1.5)
- plt.plot(s2, label='User (Query)', color='black', linewidth=1.5, alpha=0.8)
- plt.title("a. Raw Signals (Natural State)")
- plt.xlabel("Samples")
- plt.ylabel("Amplitude (mV)")
- plt.legend()
- plt.grid(alpha=0.2)
- # Plot B: Alignment
- plt.subplot(1, 3, 2)
- for (map_x, map_y) in path[::15]: # Sample every 15 for visual clarity
- plt.plot([map_x, map_y], [s1[map_x], s2[map_y] + 1.5], color='gray', alpha=0.3)
- plt.plot(s1, label='Database', color='blue')
- plt.plot(s2 + 1.5, label='User (+1.5)', color='black')
- plt.title("b. Dynamic Time Warping Alignment")
- plt.xlabel("Samples")
- plt.legend(loc='lower right')
- # Plot C: Cost Matrix & Summary
- plt.subplot(1, 3, 3)
- plt.imshow(acc_cost_matrix.T, origin='lower', cmap='viridis', aspect='auto')
- plt.plot(path[:, 0], path[:, 1], 'w-', linewidth=2, label='Optimal Path')
- plt.title(f"c. Accumulated Cost\nSimilarity: {similarity_pct:.2f}% | Norm DTW: {norm_dtw:.4f}")
- plt.colorbar(label='Cost Value')
- plt.xlabel('Database Index')
- plt.ylabel('User Index')
- plt.tight_layout()
- #plt.savefig('ecg_similarity.svg', dpi=300, bbox_inches='tight') #This save an image of the plot
- plt.show()
- print(f"Summary Report:")
- print(f"----------------")
- print(f"Pearson Similarity: {similarity_pct:.2f}%")
- print(f"Natural Lag: {found_lag} samples")
- print(f"Normalized DTW: {norm_dtw:.4f}")
- # %% [markdown]
- # ## Original Vs Warped Alignment and Similarity
- # %% [markdown]
- # ##### This ensures the correlation measures morphology (the shape of the wave) rather than just timing, since the ECG signals often have slight phase shifts in the timing of the P, QRS, and T waves.
- # ##### (V. Tuzcu and S. Nas, 'Dynamic time warping as a novel tool in pattern recognition of ECG changes in heart rhythm disturbances,' 2005 IEEE International Conference on Systems, Man and Cybernetics, Waikoloa, HI, USA, 2005, pp. 182-186 Vol. 1, doi: 10.1109/ICSMC.2005.1571142.
- # %%
- %config InlineBackend.figure_format = 'retina'
- from fastdtw import fastdtw
- from scipy.stats import pearsonr
- from matplotlib.ticker import MultipleLocator, FuncFormatter
- threshold = 0.9 # Similarity threshold, a warped correlation > 0.85 is typically considered a "high fidelity"
- plt.rcParams.update({
- 'font.size': 14, # Base font size
- 'axes.titlesize': 14, # Subplot titles
- 'axes.labelsize': 10, # X and Y labels
- 'xtick.labelsize': 8, # X-axis tick numbers
- 'ytick.labelsize': 8, # Y-axis tick numbers
- 'legend.fontsize': 8, # Legend text
- 'figure.titlesize': 12 # Main figure title
- })
- fig, axs = plt.subplots(3, 2, figsize=(10, 7), sharex=True, sharey=True)
- summary_data = []
- leads = ['Lead I', 'Lead II', 'Lead III']
- colors = ['teal', 'darkorange', 'crimson']
- for i in range(3):
- # 1. Plot - Side-by-Side Comparison
- # --- Column 0: Synthetic Data (symu_data) ---
- axs[i, 0].plot(sym_data[:, i], label='Synthetic Data', color=colors[i], linewidth=1)
- axs[i, 0].plot(filt_ref_data[:, i], label='Real Data', color='black', linewidth=1)
- axs[i, 0].set_ylabel(f'{leads[i]}\n(mV)')
- axs[i, 0].grid(True, linestyle='--', alpha=0.6)
- axs[i, 0].legend(loc='lower right')
- # 2. Prepare data
- ref = filt_ref_data[:, i]
- query = sym_data[:, i]
- # 3. Compute DTW Alignment
- distance, path = fastdtw(ref, query, dist=lambda x, y: np.abs(x - y))
- # 4. "Warp" the signals using the path to align them in time
- ref_aligned = np.array([ref[p[0]] for p in path])
- query_aligned = np.array([query[p[1]] for p in path])
- # 5. Calculate Warped Correlation
- #Pearson correlation is inherently invariant to amplitude scaling.
- correlation, _ = pearsonr(ref_aligned, query_aligned)
- is_correlated = "Yes" if correlation >= threshold else "No"
- summary_data.append([leads[i], distance, correlation, is_correlated])
- # 6. Plotting
- # We plot against a generic index because the path changes the 'time' scale
- axs[i, 1].plot(ref_aligned, label=f'Real {leads[i]} (Aligned)', color='black', alpha=0.5)
- axs[i, 1].plot(query_aligned, label=f'Sym {leads[i]} (Aligned)', color=colors[i], linestyle='--')
- axs[i, 1].set_title(f"{leads[i]}: Warped Correlation = {correlation:.3f} ({is_correlated})")
- axs[i, 0].xaxis.set_major_locator(MultipleLocator(100)) # Major ticks every 100 points
- axs[i, 0].xaxis.set_minor_locator(MultipleLocator(20)) # Minor ticks every 20 points
- axs[i, 0].yaxis.set_major_locator(MultipleLocator(0.6)) # Major ticks every 5 units
- axs[i, 0].yaxis.set_minor_locator(MultipleLocator(0.15)) # Minor ticks every 1 unit
- axs[i, 0].grid(which='major', color='black', linestyle='--')
- axs[i, 0].grid(which='minor', color='#CCCCCC', linestyle=':')
- axs[i, 0].grid(True, which='both')
- axs[i, 1].legend(loc='lower right')
- #axs[i, 1].grid(True, alpha=0.3)
- # Set titles for the columns
- axs[0, 0].set_title('Original Signals')
- #axs[0, 1].set_title('Real Filtered Signal', fontweight='bold')
- # Set shared X-axis label
- axs[2, 0].set_xlabel('Samples')
- axs[2, 1].set_xlabel('Elastic time shifting, to compare P, QRS and T waves')
- plt.style.use('seaborn-v0_8-whitegrid')
- plt.savefig('ecg_plot_three_leads.svg', dpi=300, bbox_inches='tight')
- plt.tight_layout()
- plt.show()
- # 7. --- Print Final Analysis ---
- print(f"{'Lead':<10} | {'DTW Dist':<12} | {'Warped Corr':<12} | {'Status'}")
- print("-" * 55)
- correlated_count = 0
- for row in summary_data:
- print(f"{row[0]:<10} | {row[1]:<12.2f} | {row[2]:<12.4f} | {row[3]}")
- if row[3] == "Yes":
- correlated_count += 1
- print(f"\nResult: {correlated_count} out of 3 leads are highly correlated.")
- # %% [markdown]
- # ## Dynamic Time Warping Alignment of LI, LII, LII
- # #### Visualisation of the three leads using fastdtw 'Python' library
- # %%
- fig, axs = plt.subplots(1, 3, figsize=(15, 4.5), sharex=True, sharey=True)
- summary_data = []
- leads = ['Lead I', 'Lead II', 'Lead III']
- colors = ['teal', 'darkorange', 'crimson']
- for i in range(3):
- # 2. Prepare data
- ref = filt_ref_data[:, i]
- query = sym_data[:, i]
- # 3. Compute DTW Alignment
- distance, path = fastdtw(ref, query, dist=lambda x, y: np.abs(x - y))
- # 4. "Warp" the signals using the path to align them in time
- ref_aligned = np.array([ref[p[0]] for p in path])
- query_aligned = np.array([query[p[1]] for p in path])
- # Assuming you already ran: distance, path = fastdtw(ref_lead, made_lead)
- # Extract the path indices
- path_x = [p[0] for p in path]
- path_y = [p[1] for p in path]
- # 1. Plot the Warping Path
- axs[i].plot(path_x, path_y, color='blue', linewidth=2, label='Warping Path')
- # 2. Plot a Reference Diagonal (Perfect match line)
- axs[i].plot([0, 320], [0, 320], color='red', linestyle='--', alpha=0.5, label='Ideal Diagonal')
- # Labeling for your paper
- axs[i].set_title(f"{leads[i]}")
- axs[i].legend(loc='lower right')
- #axs[i].set_title("DTW Warping Path: Natural vs. Synthetic ECG")
- axs[i].set_xlabel("Reference Signal Index (PhysioNet)")
- axs[i].grid(True, alpha=0.3)
- axs[i].legend()
- axs[0].set_ylabel("Synthetic Signal Index")
- plt.show()
DTW_ECG_Reproducibility_V1.ipynb at commit 369ddbe, under MIT · at the source
Overview
- Department of Electronic Engineering, Faculty of Engineering, Pontificia Universidad Javeriana, Bogota, Colombia
- School of Medicine and Health Sciences, biomedical engineering. Universidad del Rosario, Bogota, Colombia
- School of Medicine and Health Sciences, Neurovitae research Center, Universidad del Rosario, Bogota, Colombia
Abstract
Vectorcardiography provides a spatial orientation and magnitude of the electrical activity of the heart, but its complexity and lack of interactive resources have limited its application in medical and bioengineering education. To bridge this pedagogical gap, we developed a low-cost, real-time vectorcardiography simulator integrating a physical wet-lab interface and digital signal processing. The hardware setup consists of a conductive medium and electrodes, enabling users to manually simulate a cardiac vector and observe the resultant electrophysiological signal consequences in real time. The system was validated through three complementary methods: theoretical conformity analysis, emulation of real ECG data from database, and user-driven waveform generation tests. A pilot study with medical students and instructors provided empirical evidence of the educational value of the device, indicating that the active, hands-on nature of the system might foster deeper cognitive engagement and facilitates the integration of complex electrophysiological concepts. By providing open-source software and cost-effective hardware, this simulator offers a scalable solution to enhance cardiac electrophysiology education and promote the broader adoption of VCG in clinical practice.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 3 matches between paragraphs and lines of code.
Zenodo 18486986
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
5 files
- firmware/
Vecto_pico.py , Python, 40 lines - firmware/
demo_signal_pico.py , Python, 77 lines - software/
vecto_graph.py , Python, 798 lines - LICENSE, License, 21 lines
- README.md, Text, 165 lines
hbprojects/vectorial-plot-rpi-pico
369ddbe2412ce6beae17c29c457368a174ea957b, 23 March 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
6 files
- Supporting_Jupyter_Info/
DTW_ECG_Reproducibility_ , Jupyter, 341 lines, 3 matchesV1.ipynb - firmware/
Vecto_pico.py , Python, 40 lines - firmware/
demo_signal_pico.py , Python, 77 lines - software/
vecto_graph.py , Python, 798 lines - LICENSE, License, 21 lines
- README.md, Text, 179 lines
Zenodo 18445797
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
5 files
- firmware/
Vecto_pico.py , Python, 40 lines - firmware/
demo_signal_pico.py , Python, 77 lines - software/
vecto_graph.py , Python, 798 lines - LICENSE, License, 21 lines
- README.md, Text, 165 lines
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:
- 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 10 scripts, each with its path and the digest of its content;
- 3 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
- physionet.org/
content/ , at PhysioNet; found in the referencesnorwegian-athlete-ecg
Data Availability
All relevant data are within the manuscript and its Supporting Information files.
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, 3 authors, 7 MeSH terms, 2 funders, 34 references.
Cite
This paper
Rodriguez, W. R., Bernal, H. A., & Amador-Munoz, D. P. (2026). Real-time vectorcardiography simulator system. PloS one, 21(3), e0345612. https://
BibTeX
@article{rodriguez2026re
author = {Rodriguez, William R and Bernal, Hernan A and Amador-Munoz, Diana Patricia},
title = {{Real-time vectorcardiography simulator system}},
journal = {PloS one},
year = {2026},
month = mar,
volume = {21},
number = {3},
pages = {e0345612},
publisher = {PLOS},
issn = {1932-6203},
doi = {10.1371/
url = {https://
pmid = {41915705},
pmcid = {PMC13037978}
}
RIS
TY - JOUR
AU - Rodriguez, William R
AU - Bernal, Hernan A
AU - Amador-Munoz, Diana Patricia
TI - Real-time vectorcardiography simulator system
T2 - PloS one
J2 - PLoS One
PY - 2026
DA - 2026/
VL - 21
IS - 3
SP - e0345612
SN - 1932-6203
PB - PLOS
DO - 10.1371/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1371/
"type": "article-journal",
"title": "Real-time vectorcardiography simulator system",
"container-title": "PloS one",
"author": [
{
"family": "Rodriguez",
"given": "William R"
},
{
"family": "Bernal",
"given": "Hernan A"
},
{
"family": "Amador-Munoz",
"given": "Diana Patricia"
}
],
"container-title-short":
"volume": "21",
"issue": "3",
"page": "e0345612",
"DOI": "10.1371/
"PMID": "41915705",
"PMCID": "PMC13037978",
"ISSN": "1932-6203",
"publisher": "PLOS",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
31
]
]
}
}
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.7554/elife.100605 [code]
- Age-related changes in ‘cortical’ 1/
f dynamics are linked to cardiac activity Journal: n/aIn common: WFDB Python, SciPy, Matplotlib, 1 other tool, other, 1 reference - [2] doi:10.1007/s41666-025-00209-5 [code]
- A Hybrid Bidirectional Deep Learning Model Using HRV for Prediction of ICU Mortality Risk in TBI Patients.Journal: Journal of healthcare informatics researchIn common: WFDB Python, SciPy, Matplotlib, 1 other tool, other, 1 reference
- [3] doi:10.1038/s41746-025-02237-2 [code]
- SLEEPYLAND: trust begins with fair evaluation of automatic sleep staging models.Journal: NPJ digital medicineIn common: WFDB Python, SciPy, Matplotlib, 1 other tool, methods / tools, 1 reference
- [4] doi:10.1038/s41467-026-75134-1 [code]
- Body surface potential mapping of the cortico-muscular axis using smart textile electrode arrays.Journal: Nature communicationsIn common: WFDB Python, SciPy, Matplotlib, 1 other tool, other
- [5] doi:10.1186/s40001-025-03540-0 [code]
- The association between white blood cell-to-hemoglobin ratio and mortality risk in critical traumatic brain injury: insights from MIMIC-IV retrospective analysis.Journal: European journal of medical researchIn common: WFDB Python, SciPy, Matplotlib, 1 other tool, other
- [6] doi:10.1097/js9.0000000000003143 [code]
- Multimodal deep learning to predict postoperative major adverse cardiac and cerebrovascular events after noncardiac surgery.Journal: International journal of surgery (London, England)In common: WFDB Python, SciPy, Matplotlib, 1 other tool, other
- [7] doi:10.1038/s41598-025-11175-8 [code]
- Impact of mannitol on mortality in patients with non-traumatic intracerebral haemorrhage and acute kidney injury: a retrospective study.Journal: Scientific reportsIn common: WFDB Python, SciPy, Matplotlib, 1 other tool, other
- [8] doi:10.3389/fneur.2023.1271391 [code]
- Association between lactate/
albumin ratio and 28-day all-cause mortality in ischemic stroke patients without reperfusion therapy: a retrospective analysis of the MIMIC-IV database. Journal: Frontiers in neurologyIn common: WFDB Python, SciPy, Matplotlib, 1 other tool, other - [9] doi:10.1038/s41598-025-18479-9 [code]
- Epileptic seizure detection from electroencephalogram signals based on 1D CNN-LSTM deep learning model using discrete wavelet transform.Journal: Scientific reportsIn common: WFDB Python, SciPy, Matplotlib, 1 other tool, methods / tools
- [10] doi:10.1038/s42003-026-10957-8 [code]
- Brain defence by the extracellular matrix protein Cochlin.Journal: Communications biologyIn common: WFDB Python, SciPy, Matplotlib, 1 other tool
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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 3 repositories of the authors' code, each at its verified commit and with its license, 10 scripts, and 3 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:bbab4c5d6d23c8a3…
Add the badge to the code's README
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 -->
[](https://openscicode.org/badge/doi/10.1371/journal.pone.0345612)
<!-- oscr-badge:end -->reStructuredText
.. oscr-badge:start
.. image:: https://openscicode.org/badge/doi/10.1371/journal.pone.0345612.svg
:target: https://openscicode.org/badge/doi/10.1371/journal.pone.0345612
:alt: OSCR
.. oscr-badge:endHTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1371/journal.pone.0345612"><img src="https://openscicode.org/badge/doi/10.1371/journal.pone.0345612.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.
