OSCR

Reliability and signal comparison of OPM-MEG, fMRI & iEEG in a repeated movie viewing paradigm.

Code ↔ Paper

6 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 6 matches
  1. [1] § Methods › OPM › Amplitude of the analytic signal ↔ code/withinViewing_betweenSubs_OPM.m, lines 29–76 · score 0.91 · 12–28 Hz, 28–46 Hz, 55–70 Hz, 8–12 Hz, 0.5–116 Hz, 0.5–4 Hz
  2. [2] § Methods › OPM › Amplitude of the analytic signal ↔ code/MNE_betweenSubs_OPM.m, lines 29–76 · score 0.91 · 12–28 Hz, 28–46 Hz, 55–70 Hz, 8–12 Hz, 0.5–116 Hz, 0.5–4 Hz
  3. [3] § Results › Within-subject comparisons ↔ code/MNE_betweenSubs_OPM.m, lines 29–76 · score 0.85 · 12–28 Hz, 28–46 Hz, 55–70 Hz, 8–12 Hz, 0.5–116 Hz, 0.5–4 Hz
  4. [4] § Results › Within-subject comparisons ↔ code/MNE_withinSubs_OPM.m, lines 28–54 · score 0.85 · 12–28 Hz, 28–46 Hz, 55–70 Hz, 8–12 Hz, 0.5–116 Hz, 0.5–4 Hz
  5. [5] § Methods › Analyses › Signal-to-noise (SNR) comparisons ↔ code/SNR_OPM.m, lines 172–218 · score 0.54 · surrogate SNR, cluster sums, tails, OPM
  6. [6] § Methods › Analyses › Signal-to-noise (SNR) comparisons ↔ code/SNR_OPM-fMRI.m, lines 158–213 · score 0.53 · surrogate SNR, cluster sums, tails, OPM

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

MATLAB · 213 lines · 8 KB · no license · 2 matches

  1. clear;
  2. clc;
  3. % -------------------------------------------------------------------------------------------------------------------
  4. % TAKE CARE OF FILENAMES/PATHS & TOOLBOXES
  5. % -------------------------------------------------------------------------------------------------------------------
  6. mydir = pwd;
  7. idcs = strfind(mydir, filesep);
  8. bsbr_opm_path = fullfile(mydir(1:idcs(end-1)), 'OPM_reliability', 'derivatives', ...
  9. 'bsbr', 'OPM');
  10. save_path = fullfile(mydir(1:idcs(end-1)), 'OPM_reliability', 'derivatives', ...
  11. 'bsbr', 'OPM', 'GA_bsbr');
  12. fig_save_path = fullfile(mydir(1:idcs(end-1)), 'OPM_reliability', 'derivatives', ...
  13. 'bsbr', 'OPM', 'bsbr_figs');
  14. nii_path = fullfile(mydir(1:idcs(end-1)), 'OPM_reliability', 'derivatives', ...
  15. 'bsbr', 'OPM', 'bsbr_nifti');
  16. if ~exist(save_path, 'dir'); mkdir(save_path); end
  17. if ~exist(fig_save_path, 'dir'); mkdir(fig_save_path); end
  18. if ~exist(nii_path, 'dir'); mkdir(nii_path); end
  19. % add fieltrip to path
  20. toolpth_ = fullfile(mydir(1:idcs(end-1)), 'OPM_reliability', 'toolboxes');
  21. addpath(fullfile(toolpth_, 'fieldtrip'));
  22. addpath(genpath(fullfile(toolpth_, 'fieldtrip', 'external', 'spm12')));
  23. ft_defaults;
  24. %% -------------------------------------------------------------------------------------------------------------------
  25. % START WITH OPM
  26. % -------------------------------------------------------------------------------------------------------------------
  27. % Load raw correlations
  28. load(fullfile(bsbr_opm_path, 'real/bsbr_OPM_1_OLD.mat'));
  29. load(fullfile(bsbr_opm_path, 'real/bsbr_OPM_2_OLD.mat'));
  30. % Get gen vars
  31. num_sub = size(bsbr_opm_1, 2);
  32. num_vox = size(bsbr_opm_1, 1);
  33. frequencies = {'delta', 'theta', 'alpha', 'beta', 'gamma1', 'gamma2', 'hf', 'broad'};
  34. num_freq = size(frequencies, 2);
  35. num_surr = 100;
  36. delta_band = [.5 4]; % added
  37. theta_band = [4 8];
  38. alpha_band = [8 12];
  39. beta_band = [12 28];
  40. gamma1_band = [28 46];
  41. gamma2_band = [55 70];
  42. hf_band = [64 116];
  43. broad_band = [.5 116];
  44. freq_Hz = {delta_band, theta_band,alpha_band, beta_band,...
  45. gamma1_band, gamma2_band, hf_band, broad_band};
  46. % Compute raw avg correlations
  47. bsbr_opm = nan([num_vox, num_sub, num_freq]);
  48. for freq = 1:num_freq
  49. for sub = 1:num_sub
  50. temp_real = nanmean([(squeeze(nanmean(bsbr_opm_1(:, sub, :, freq), 3))), (squeeze(nanmean(bsbr_opm_2(:, sub, :, freq), 3)))],2);
  51. bsbr_opm(:, sub, freq) = temp_real;
  52. end
  53. end
  54. bsbr_opm_avg = squeeze(nanmean(bsbr_opm, 2));
  55. % Compute z avg correlations
  56. load(fullfile(bsbr_opm_path, 'real/bsbr_z_OPM_1_OLD.mat'));
  57. load(fullfile(bsbr_opm_path, 'real/bsbr_z_OPM_2_OLD.mat'));
  58. bsbr_z_opm = nan([num_vox, num_sub, num_freq]);
  59. for freq = 1:num_freq
  60. for sub = 1:num_sub
  61. temp_real = nanmean([(squeeze(nanmean(bsbr_z_opm_1(:, sub, :, freq), 3))), (squeeze(nanmean(bsbr_z_opm_2(:, sub, :, freq), 3)))],2);
  62. bsbr_z_opm(:, sub, freq) = temp_real;
  63. end
  64. end
  65. bsbr_z_opm_avg = squeeze(nanmean(bsbr_z_opm, 2));
  66. %% initialize
  67. num_dist = 10000;
  68. surr_dist_temp = nan([num_vox, num_dist]); % Preallocate for storing results
  69. bsbr_rand_surr = nan([num_vox, num_sub]);
  70. surr_dist = nan([num_vox, num_dist, num_freq]);% Preallocate the temporary matrix
  71. %% Compute surrogate distriution
  72. bsbr_z_surr_opm = nan([num_vox, num_surr, num_sub, num_freq]);
  73. for freq = 1:num_freq
  74. freq_name = frequencies{freq};
  75. for sub = 1:num_sub
  76. load(fullfile(bsbr_opm_path, 'surr', sprintf('sub_%03d_surr_bsbr_1_z_%s_OLD.mat', sub, freq_name)));
  77. load(fullfile(bsbr_opm_path, 'surr', sprintf('sub_%03d_surr_bsbr_2_z_%s_OLD.mat', sub, freq_name)));
  78. bsbr_z_surr_opm(:, :, sub, freq) = nanmean(cat(3, squeeze(nanmean(sub_surr_1_z(:, :, :), 3)), squeeze(nanmean(sub_surr_2_z(:, :, :), 3))), 3);
  79. end
  80. end
  81. fprintf('Surrogate dataset for %s done\n', freq_name)
  82. for freq = 1:num_freq
  83. freq_name = frequencies{freq};
  84. parfor i = 1:num_dist % Parallelized loop over num_dist
  85. bsbr_rand_surr_local = nan([num_vox, num_sub]); % Declare local variable to avoid broadcast issues
  86. bsbr_rand_surr_avg_local = nan(num_vox, 1); % Local version for storing the average
  87. for vox = 1:num_vox
  88. for sub = 1:num_sub
  89. surr_idx = randi([1,100]);
  90. bsbr_rand_surr_local(vox, sub) = squeeze(bsbr_z_surr_opm(vox, surr_idx, sub, freq));
  91. end
  92. bsbr_rand_surr_avg_local(vox) = nanmean(bsbr_rand_surr_local(vox, :), 2); % Compute average for each voxel
  93. end
  94. surr_dist_temp(:, i) = bsbr_rand_surr_avg_local; % Store the result for this iteration
  95. fprintf('Permutation %d done\n', i)
  96. end
  97. % Add the data to the big df and clear vars
  98. surr_dist(:, :, freq) = surr_dist_temp;
  99. fprintf('%s added to dataframe\n', freq_name)
  100. end
  101. % SAVE IT
  102. outfilename = fullfile(save_path, 'bsbr_surr_dist_OPM_OLD.mat');
  103. save(outfilename, 'surr_dist');
  104. fprintf('Permutation for bsbr saved\n')
  105. %% Compute z-scores & p vals
  106. % load(fullfile(save_path, 'bsbr_surr_dist_OPM_OLD.mat'));
  107. GAp_bsbr_opm = nan([num_vox, num_freq]);
  108. GAz_bsbr_opm = nan([num_vox, num_freq]);
  109. for vox = 1:num_vox
  110. for freq = 1:num_freq
  111. rd_avg = squeeze(bsbr_z_opm_avg(vox, freq));
  112. gt_count = sum(surr_dist(vox, :, freq) > rd_avg);
  113. p_val = gt_count/num_dist;
  114. z_score = (rd_avg - nanmean(surr_dist(vox, :, freq)))./nanstd(surr_dist(vox, :, freq));
  115. GAp_bsbr_opm(vox, freq) = p_val;
  116. GAz_bsbr_opm(vox, freq) = z_score;
  117. end
  118. end
  119. %% Compute FDR correction on p-vals
  120. fdr_z_scores = nan(size(GAz_bsbr_opm));
  121. fdr_p_vals = false(size(GAp_bsbr_opm)); % Logical array to store FDR mask
  122. % Loop over each frequency and apply FDR correction individually
  123. for freq = 1:num_freq
  124. % Extract p-values for the current frequency
  125. p_vals = GAp_bsbr_opm(:, freq);
  126. % Perform FDR correction on p-values for this frequency
  127. [~, crit_p, ~, adj_p] = fdr_bh(p_vals, 0.05);
  128. % Mask the p-values based on the FDR threshold
  129. fdr_p_vals(:, freq) = p_vals <= crit_p;
  130. % Store the corrected z-scores for the significant values
  131. fdr_z_scores(fdr_p_vals(:, freq), freq) = GAz_bsbr_opm(fdr_p_vals(:, freq), freq);
  132. end
  133. %% SAVE THE STATS
  134. bsbr_opm_stats = struct();
  135. bsbr_opm_stats.raw_atanh = bsbr_z_opm;
  136. bsbr_opm_stats.raw_atanh_avg = bsbr_z_opm_avg;
  137. bsbr_opm_stats.raw_corrs = bsbr_opm;
  138. bsbr_opm_stats.raw_corrs_avg = bsbr_opm_avg;
  139. bsbr_opm_stats.z_scores = GAz_bsbr_opm;
  140. bsbr_opm_stats.p_vals = GAp_bsbr_opm;
  141. bsbr_opm_stats.z_scores_fdr = fdr_z_scores;
  142. bsbr_opm_stats.crit_p = crit_p;
  143. % mask the actual correlation values based on those that survive FDR
  144. bsbr_opm_stats.corrs_fdr = nan(size(bsbr_opm_stats.raw_corrs_avg));
  145. bsbr_opm_stats.corrs_fdr(~isnan(bsbr_opm_stats.z_scores_fdr)) = bsbr_opm_stats.raw_corrs_avg(~isnan(bsbr_opm_stats.z_scores_fdr));
  146. outfilename = fullfile(save_path, 'bsbr_OPM_stats_OLD.mat');
  147. save(outfilename, "bsbr_opm_stats");
  148. %% -------------------------------------------------------------------------------------------------------------------
  149. % PLOT
  150. % -------------------------------------------------------------------------------------------------------------------
  151. % first load tempalte
  152. load(fullfile(toolpth_, '/fieldtrip/template/headmodel/livs_template_grid.mat'));
  153. load(fullfile(toolpth_, '/fieldtrip/template/headmodel/standard_mri.mat'));
  154. base_file_names = {'z_OLD.nii', 'r_OLD.nii'};
  155. data_sets = {bsbr_opm_stats.z_scores_fdr, bsbr_opm_stats.corrs_fdr};
  156. % Plot it
  157. for freq = 1:num_freq
  158. freq_name = frequencies{freq};
  159. % Loop over different data sets for plotting
  160. for data = 1:length(data_sets)
  161. temp_data = data_sets{data};
  162. template_grid.data = nan(size(template_grid.inside));
  163. template_grid.data(template_grid.inside) = temp_data(:, freq);
  164. % Interpolate for .nii
  165. cfg = [];
  166. cfg.parameter = 'data';
  167. interp = ft_sourceinterpolate(cfg, template_grid, mri);
  168. % Write to disk with frequency band in the filename
  169. cfg = [];
  170. cfg.parameter = 'data';
  171. cfg.filetype = 'nifti';
  172. cfg.filename = fullfile(nii_path, [freq_name, '_' base_file_names{data}]);
  173. ft_volumewrite(cfg, interp);
  174. end
  175. end

MNE_betweenSubs_OPM.m, no license · at the source

Overview

  1. Department of Psychology, New York University, New York, NY, United States
Institutions: New York University (United States)
Journal: Imaging neuroscience (Cambridge, Mass.), volume 4, article IMAG.a.1218
Dates: received 14 July 2025; accepted 20 March 2026; published online 8 May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1162/imag.a.1218 · PMID 42125202 · PMCID PMC13159027 · OpenAlex W7148998135
Open access: diamond, a free copy (OpenAlex)
Status: code verified
Categories: fMRI (modality), MEG (modality), intracranial EEG (iEEG / ECoG / SEEG) (modality), human (organism)
Methods: Spectral & time-frequency, Preprocessing, Connectivity, Statistics, Machine learning, fMRI & imaging
Keywords: OPM, MEG, fMRI, iEEG, reliability, intersubject correlation, cross-modal correlation
Topic: Atomic and Subatomic Physics Research (Atomic and Molecular Physics, and Optics, Physics and Astronomy), according to OpenAlex
Citations: not cited yet (Europe PMC); 78 references in the paper

Abstract

Optically pumped magnetometers (OPMs) offer a promising advancement in noninvasive neuroimaging via magnetoencephalography (MEG), but establishing their reliability and comparability to existing methods remains an ongoing endeavor. Here, we evaluated OPM recordings by assessing their test-retest reliability and comparing them to functional magnetic resonance imaging (fMRI) and intracranial electroencephalography (iEEG) recordings. Data were collected from three independent participant groups during repeated viewings of a movie segment. In 7 canonical frequency bands (δ: 0.5–4 Hz, θ: 4–8 Hz, α: 8–12 Hz, β: 12–28 Hz, γ1: 28–46 Hz, γ2: 55–70 Hz, and HF: 64–116 Hz), as well as a broadband (BB: 0.5–116 Hz) signal, we quantified the signal consistency (1) within individuals, (2) across subjects, and (3) across modalities. OPM exhibited widespread reliability, particularly in lower frequency bands; spatial patterns resembled those of fMRI and iEEG in visual and auditory regions. Cross-modal analyses revealed robust correspondence between OPM and both fMRI and iEEG, including inverse correlations at low frequencies and positive correlations at higher frequencies in the OPM-fMRI comparison, consistent with known relationships between oscillatory power and BOLD responses. Comparisons of signal-to-noise (SNR) estimates further revealed that in some regions, the SNR of cross-modal alignment exceeded within-modality reliability, suggesting that bridging between modalities can sometimes enhance SNR by attenuating reliably shared noise. Our findings demonstrate that OPM consistently captures stimulus-driven neural dynamics that converge with established modalities.

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

OSF urjvb

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Languages: MATLAB (20)
Size: 20 files, 20 scripts
Software Heritage: not checked
Found in: “Data and Code Availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 28 September 2026: the link answers (HTTP 200)
  • 28 September 2026: the link answers (HTTP 200)
20 files
At the source: osf.io/urjvb

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;
  • 20 scripts, each with its path and the digest of its content;
  • 6 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data and Code Availability

Data and analysis code underlying the conclusions of the manuscript are available at the Open Science Framework (OSF): https://osf.io/urjvb. The raw OPM data from Rier et al. (2023) are available on Zenodo: https://doi.org/10.5281/zenodo.7525341

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, 28 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 2 authors, 7 keywords, 77 references.

Cite

This paper

Christiano, O. R., & Michelmann, S. (2026). Reliability and signal comparison of OPM-MEG, fMRI &amp; iEEG in a repeated movie viewing paradigm. Imaging neuroscience (Cambridge, Mass.), 4, IMAG.a.1218. https://doi.org/10.1162/imag.a.1218

BibTeX

@article{christiano2026reliability,
author = {Christiano, Olivia R. and Michelmann, Sebastian},
title = {{Reliability and signal comparison of OPM-MEG, fMRI \&amp; iEEG in a repeated movie viewing paradigm}},
journal = {Imaging neuroscience (Cambridge, Mass.)},
year = {2026},
month = may,
volume = {4},
pages = {IMAG.a.1218},
publisher = {MIT Press},
issn = {2837-6056},
doi = {10.1162/imag.a.1218},
url = {https://doi.org/10.1162/imag.a.1218},
pmid = {42125202},
pmcid = {PMC13159027}
}

RIS

TY - JOUR
AU - Christiano, Olivia R.
AU - Michelmann, Sebastian
TI - Reliability and signal comparison of OPM-MEG, fMRI &amp; iEEG in a repeated movie viewing paradigm
T2 - Imaging neuroscience (Cambridge, Mass.)
J2 - Imaging Neurosci (Camb)
PY - 2026
DA - 2026/05/08
VL - 4
SP - IMAG.a.1218
SN - 2837-6056
PB - MIT Press
DO - 10.1162/imag.a.1218
UR - https://doi.org/10.1162/imag.a.1218
LA - en
ER -

CSL-JSON

{
"id": "10.1162/imag.a.1218",
"type": "article-journal",
"title": "Reliability and signal comparison of OPM-MEG, fMRI &amp; iEEG in a repeated movie viewing paradigm",
"container-title": "Imaging neuroscience (Cambridge, Mass.)",
"author": [
{
"family": "Christiano",
"given": "Olivia R."
},
{
"family": "Michelmann",
"given": "Sebastian"
}
],
"container-title-short": "Imaging Neurosci (Camb)",
"volume": "4",
"page": "IMAG.a.1218",
"DOI": "10.1162/imag.a.1218",
"PMID": "42125202",
"PMCID": "PMC13159027",
"ISSN": "2837-6056",
"publisher": "MIT Press",
"URL": "https://doi.org/10.1162/imag.a.1218",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
8
]
]
}
}

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/s41598-025-08037-8 [code]
OPM-MEG reveals dynamics of beta bursts underlying attentional processes in sensory cortex
Journal: n/a
In common: MEG, 12 references
[2] doi:10.1038/s41467-026-75345-6 [code]
Hippocampal ripples initiate cortical dimensionality expansion for memory retrieval.
Journal: Nature communications
In common: FieldTrip, Image Processing Toolbox, Statistics and Machine Learning Toolbox, 5 references, author Sebastian Michelmann
[3] doi:10.1007/s10548-025-01150-x
Movement Related Beta-Band Modulation with OPM-MEG: A Pilot Study
Journal: n/a
In common: MEG, 7 references
[4] doi:10.1016/j.neuroimage.2026.121930
Quantifying cerebellar signal detectability in MEG and EEG in epilepsy using anatomically informed source modeling.
Journal: NeuroImage
In common: MEG, 7 references
[5] doi:10.1038/s41467-026-75359-0 [code]
Neural mechanisms of time-forward predictions for naturalistic auditory tone sequences.
Journal: Nature communications
In common: fdr_bh (Benjamini-Hochberg FDR), FieldTrip, Statistics and Machine Learning Toolbox, 5 references
[6] doi:10.1038/s41467-026-71604-8 [code]
Respiration as a dynamic modulator of sensory sampling.
Journal: Nature communications
In common: fdr_bh (Benjamini-Hochberg FDR), FieldTrip, Statistics and Machine Learning Toolbox, MEG, 3 references
[7] doi:10.1002/advs.77857 [code]
Brain Network Dynamics of Local and Global Predictive Processing in Aging.
Journal: Advanced science (Weinheim, Baden-Wurttemberg, Germany)
In common: FieldTrip, Image Processing Toolbox, Statistics and Machine Learning Toolbox, 4 references
[8] doi:10.1162/imag.a.1353 [code]
Model-based cardiac field artefact correction for OP-MEG.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: FieldTrip, Statistics and Machine Learning Toolbox, MEG, 4 references
[9] doi:10.1162/imag.a.1321 [code]
Phase similarity between similar objects indicates representational merging across retrieval training but not sleep.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: 2 references, author Sebastian Michelmann
[10] doi:10.1002/hbm.70621 [code]
Optimising 7T-fMRI for Imaging Regions of Magnetic Susceptibility.
Journal: Human brain mapping
In common: fdr_bh (Benjamini-Hochberg FDR), FieldTrip, Image Processing Toolbox, 1 other tool, fMRI, 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.