OSCR

Impaired midfrontal‑motor theta phase synchronization characterizes maladaptive motivational behavior in people with obsessive‑compulsive disorder.

Code ↔ Paper

12 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 12 matches · 1 of them tie a paragraph to a whole file, not to given lines: a weak match, whose lines are not tinted
  1. [1] § Materials and methods › Time–frequency decomposition ↔ code/ISPS/TF_singletrial_grouplevel.m, lines 310–330 · score 0.79 · 400–650 ms, 424–800 ms, theta band, 424 ms, 4–8 Hz, 400 ms
  2. [2] § Materials and methods › Statistical analyses ↔ code/ISPS/TF_singletrial_grouplevel.m, lines 310–330 · score 0.78 · 400–650 ms, 424–800 ms, theta band, 424 ms, bilateral, 400 ms
  3. [3] § Materials and methods › Individual regulatory orientation ↔ code/Regulatory orientation/relation.m, lines 338–474 · score 0.71 · partial Spearman, residual, BIS, covariates, BAI, BDI
  4. [4] § Results › Heterogeneous regulatory orientations of midfrontal‑motor coupling and their clinical relevance in OCD ↔ code/Regulatory orientation/Φreg plot.m, lines 239–253 · score 0.63 · white triangles, regulatory orientation, ISPS motor, instrumental action, contours, axis
  5. [5] § Results › Compared with healthy controls, people with OCD showed heightened Pavlovian bias and reduced learning rates ↔ code/computational_modelling/plot/M5_hcvsocd/DrawCombined_AllInOne2.m, lines 397–470 · score 0.58 · instrumental learning bias, feedback sensitivity, Go bias, Pavlovian bias, HDI, post
  6. [6] § Materials and methods › Time–frequency decomposition ↔ code/EEGprocessing/TF (group-level).m, lines 754–813 · score 0.58 · Post hoc, electrodes contributed, clusters, congruent, theta
  7. [7] § Results › Midfrontal theta in OCD supports conflict detection and modulation of motivational biases ↔ code/ISPS/TF_singletrial_grouplevel.m, lines 20–40 · score 0.55 · 400–650 ms, 4–8 Hz, band, 400 ms, electroencephalography, windows
  8. [8] § Results › Heterogeneous regulatory orientations of midfrontal‑motor coupling and their clinical relevance in OCD ↔ code/Regulatory orientation/Φreg plot.m, lines 91–114 · score 0.53 · regulatory orientation, lPFC, instrumental action, Pavlovian bias, beta, motor
  9. [9] § Materials and methods › EEG preprocessing ↔ code/EEGprocessing/eegpreprocess.m, lines 179–203 · score 0.52 · EEGLAB, PCA, runica, epoched, cue
  10. [10] § Materials and methods › EEG preprocessing ↔ code/ISPS/ISPS (subject-level).m, the whole file · a weak match · score 0.52 · EEGLAB, phase synchrony, spline, Laplacian, preprocessing, baseline
  11. [11] § Results › Compared with healthy controls, people with OCD showed heightened Pavlovian bias and reduced learning rates ↔ code/computational_modelling/modelrun/models4stan.R, lines 810–870 · score 0.51 · feedback sensitivity, Go bias, Pavlovian bias, M3a, M1, likelihood
  12. [12] § Materials and methods › Computational models ↔ code/computational_modelling/modelrun/models4stan.R, lines 810–870 · score 0.51 · feedback sensitivity, Go bias, M3a, M1, cue, Pavlovian

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 · 718 lines · 27 KB · MIT · 3 matches

  1. %%%%%%%%%%%%%%%%%%%%% Vectorize all trials at once %%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %% =========================================================================
  4. % Trial-level midfrontal theta POWER + Inter-channel Phase Coherence (ICPC)
  5. % Adapted from Swart et al. (2017, DCCN, Nijmegen)
  6. % For OCD dataset (EEGLAB → FieldTrip) [vectorized version: ICPC computed for all trials at once]
  7. % =========================================================================
  8. clear; clc; close all;
  9. dbstop if error
  10. %% ====== Paths and dependencies ======
  11. data_dir = 'H:\MT_all(afterqujizhi)\cueoriandbu\error\HC';
  12. fileList = dir(fullfile(data_dir, '*.set'));
  13. nSub = numel(fileList);
  14. addpath('D:\MATLAB\toolbox\eeglab_current\eeglab2022.0_old');
  15. addpath('D:\MATLAB\toolbox\fieldtrip-20211209\fieldtrip-20211209');
  16. ft_defaults;
  17. %% ====== Analysis parameters ======
  18. freqRange = [4 8]; % theta band
  19. timeWin = [0.40 0.65]; % time window of interest (keep 0.40–0.65 s as requested)
  20. % ---- Electrode group definitions ----
  21. seedChans = {'E6','E129'}; % Midfrontal (FCz, Cz)
  22. pfcChans = {'E23','E24','E26','E27','E2','E3','E123','E124'}; % bilateral PFC
  23. lMotorCh = {'E36','E42','E41','E47'}; % left motor area
  24. rMotorCh = {'E93','E98','E103','E104'}; % right motor area
  25. % ---- Group weights (unchanged) ----
  26. seedweights = [2.9194, 3.4082]; % Midfrontal weights
  27. tweights_pfc = [0.7948 2.4114 1.2002 4.2642 3.9349 0.3577 1.0100 -1.0324];
  28. tweights_motor_L = [-1.0139 0.6538 0.8044 0.2330];
  29. tweights_motor_R = [1.2122 1.0770 0.5535 2.1191];
  30. % Normalize weights (seed & t-weights) for vectorized use
  31. sw = seedweights ./ sum(seedweights);
  32. tw_pfc = tweights_pfc ./ sum(tweights_pfc);
  33. tw_L = tweights_motor_L ./ sum(tweights_motor_L);
  34. tw_R = tweights_motor_R ./ sum(tweights_motor_R);
  35. %% ====== Initialize output matrices ======
  36. trial2use = cell(nSub,1);
  37. MFpower = cell(nSub,1);
  38. ICPC_pfc = cell(nSub,1);
  39. ICPC_motor_L = cell(nSub,1);
  40. ICPC_motor_R = cell(nSub,1);
  41. %% ====== Main loop ======
  42. for s = 1:nSub
  43. fprintf('\n=== Processing %s (%d/%d) ===\n', fileList(s).name, s, nSub);
  44. % --- Step 1: load and convert ---
  45. EEG = pop_loadset('filename', fileList(s).name, 'filepath', data_dir);
  46. ft_data = eeglab2fieldtrip(EEG, 'preprocessing');
  47. % --- Step 2: Laplacian (CSD) ---
  48. cfg = [];
  49. cfg.method = 'spline';
  50. cfg.elec = ft_data.elec;
  51. scd = ft_scalpcurrentdensity(cfg, ft_data);
  52. nTrial = numel(scd.trial);
  53. trial2use{s} = ones(1,nTrial); % Update here if trial exclusion is needed
  54. %% ===============================================================
  55. % ① Midfrontal θ Power (trial-wise) —— keep original implementation
  56. % ===============================================================
  57. cfg = [];
  58. cfg.channel = seedChans;
  59. cfg.bpfilter = 'yes';
  60. cfg.bpfreq = freqRange;
  61. filtered = ft_preprocessing(cfg, scd);
  62. % Hilbert amplitude → square to get power
  63. cfg = [];
  64. cfg.hilbert = 'abs';
  65. hilbertData = ft_preprocessing(cfg, filtered);
  66. for tr = 1:nTrial
  67. hilbertData.trial{tr} = hilbertData.trial{tr}.^2;
  68. end
  69. % Concatenate + weighted average + zscore
  70. allP = [hilbertData.trial{:}]; % chan × (time*trial)
  71. weights4power = repmat(seedweights',1,size(allP,2));
  72. st_power = zscore(mean(weights4power .* allP,1));
  73. nTime = size(hilbertData.trial{1},2);
  74. st_power = reshape(st_power,[nTime,nTrial]);
  75. % Extract mean within the time window
  76. iTime = dsearchn(hilbertData.time{1}',timeWin(1)) : ...
  77. dsearchn(hilbertData.time{1}',timeWin(2));
  78. MFpower{s} = squeeze(mean(st_power(iTime,:),1)); % 1×nTrial
  79. %% ===============================================================
  80. % ② Midfrontal–Lateral PFC ICPC (trial-wise) —— vectorized implementation
  81. % ===============================================================
  82. cfg = [];
  83. cfg.channel = [seedChans pfcChans];
  84. cfg.bpfilter = 'yes'; cfg.bpfreq = freqRange;
  85. filtered = ft_preprocessing(cfg, scd);
  86. cfg = []; cfg.hilbert = 'angle';
  87. hilbertdata = ft_preprocessing(cfg, filtered);
  88. % Assemble as [nChan × nTime × nTrial]
  89. nChan = numel(hilbertdata.label);
  90. nTime = size(hilbertdata.trial{1},2);
  91. nTrial = numel(hilbertdata.trial);
  92. ang = reshape([hilbertdata.trial{:}], nChan, nTime, nTrial);
  93. % Time-window indices (same as θ power)
  94. iTime = dsearchn(hilbertdata.time{1}',timeWin(1)) : ...
  95. dsearchn(hilbertdata.time{1}',timeWin(2));
  96. % Compute all targets (PFC) and all trials at once:
  97. % diff1/2: [nTarget × |iTime| × nTrial]
  98. diff1_all = ang(1, iTime, :) - ang(3:end, iTime, :);
  99. diff2_all = ang(2, iTime, :) - ang(3:end, iTime, :);
  100. % PLV (mean across time) → [nTarget × 1 × nTrial]
  101. plv1 = abs(mean(exp(1i*diff1_all), 2));
  102. plv2 = abs(mean(exp(1i*diff2_all), 2));
  103. % Weighted combination of the two seeds → [nTarget × nTrial]
  104. plv_pfc = squeeze(sw(1).*plv1 + sw(2).*plv2); % after squeeze: [nTarget × nTrial]
  105. % Linear combination with t-weights (signed) across targets → [1 × nTrial]
  106. ICPC_pfc_vals = (tw_pfc * plv_pfc); % 1×nTrial
  107. ICPC_pfc{s} = ICPC_pfc_vals;
  108. %% ===============================================================
  109. % ③ Midfrontal–Motor ICPC (Left / Right) —— vectorized implementation
  110. % ===============================================================
  111. cfg = [];
  112. cfg.channel = [seedChans lMotorCh rMotorCh];
  113. cfg.bpfilter = 'yes'; cfg.bpfreq = freqRange;
  114. filtered = ft_preprocessing(cfg, scd);
  115. cfg = []; cfg.hilbert = 'angle';
  116. hilbertdata = ft_preprocessing(cfg, filtered);
  117. % Assemble as [nChan × nTime × nTrial]
  118. nChan = numel(hilbertdata.label);
  119. nTime = size(hilbertdata.trial{1},2);
  120. nTrial = numel(hilbertdata.trial);
  121. ang = reshape([hilbertdata.trial{:}], nChan, nTime, nTrial);
  122. % Time-window indices
  123. iTime = dsearchn(hilbertdata.time{1}',timeWin(1)) : ...
  124. dsearchn(hilbertdata.time{1}',timeWin(2));
  125. % ---- Left motor (target indices 3:6) ----
  126. diff1_L = ang(1, iTime, :) - ang(3:6, iTime, :); % [4 × |iTime| × nTrial]
  127. diff2_L = ang(2, iTime, :) - ang(3:6, iTime, :);
  128. plv1_L = abs(mean(exp(1i*diff1_L), 2)); % [4 × 1 × nTrial]
  129. plv2_L = abs(mean(exp(1i*diff2_L), 2));
  130. plv_L = squeeze(sw(1).*plv1_L + sw(2).*plv2_L); % [4 × nTrial]
  131. Lvals = (tw_L * plv_L); % [1 × nTrial]
  132. ICPC_motor_L{s} = Lvals;
  133. % ---- Right motor (target indices 7:10) ----
  134. diff1_R = ang(1, iTime, :) - ang(7:10, iTime, :); % [4 × |iTime| × nTrial]
  135. diff2_R = ang(2, iTime, :) - ang(7:10, iTime, :);
  136. plv1_R = abs(mean(exp(1i*diff1_R), 2));
  137. plv2_R = abs(mean(exp(1i*diff2_R), 2));
  138. plv_R = squeeze(sw(1).*plv1_R + sw(2).*plv2_R); % [4 × nTrial]
  139. Rvals = (tw_R * plv_R); % [1 × nTrial]
  140. ICPC_motor_R{s} = Rvals;
  141. end
  142. %% ====== Save results ======
  143. save(fullfile(data_dir,'TrialLevel_MFpower_ICPC.mat'), ...
  144. 'MFpower','ICPC_pfc','ICPC_motor_L','ICPC_motor_R','trial2use');
  145. fprintf('Saved trial-level θ-power and ICPC results (ICPC was computed with vectorization).\n');
  146. %% Export the full CSV data
  147. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  148. %% ================== Configuration ==================
  149. data_dir = 'H:\MT_all(afterqujizhi)\cueoriandbu\error\HC';
  150. mat_file = fullfile(data_dir, 'TrialLevel_MFpower_ICPC.mat');
  151. out_csv = fullfile(data_dir, 'TrialLevel_MFpower_ICPC.csv');
  152. %% ================== Load data ==================
  153. S = load(mat_file, 'MFpower','ICPC_pfc','ICPC_motor_L','ICPC_motor_R','trial2use');
  154. MFpower = S.MFpower;
  155. ICPC_pfc = S.ICPC_pfc;
  156. ICPC_motor_L = S.ICPC_motor_L;
  157. ICPC_motor_R = S.ICPC_motor_R;
  158. trial2use = S.trial2use;
  159. % File order consistent with the original computation (.set order in the folder)
  160. fileList = dir(fullfile(data_dir, '*.set'));
  161. nSub = numel(fileList);
  162. % Basic consistency check (optional)
  163. if nSub ~= numel(MFpower)
  164. warning('fileList count (%d) does not match MFpower subject count (%d). The smaller one will be used.', nSub, numel(MFpower));
  165. end
  166. nSub_use = min([nSub, numel(MFpower), numel(ICPC_pfc), numel(ICPC_motor_L), numel(ICPC_motor_R), numel(trial2use)]);
  167. %% ================== Count total rows and preallocate ==================
  168. rowsPerSub = zeros(nSub_use,1);
  169. for s = 1:nSub_use
  170. if ~isempty(MFpower{s})
  171. rowsPerSub(s) = numel(MFpower{s});
  172. else
  173. rowsPerSub(s) = 0;
  174. end
  175. end
  176. N = sum(rowsPerSub);
  177. sub_col = strings(N,1);
  178. trial_col = zeros(N,1);
  179. MFpower_col = nan(N,1);
  180. ICPCpfc_col = nan(N,1);
  181. l_ICPCmotor_col = nan(N,1);
  182. r_ICPCmotor_col = nan(N,1);
  183. trial2use_col = nan(N,1);
  184. %% ================== Expand to long table ==================
  185. ptr = 1;
  186. for s = 1:nSub_use
  187. % Get the four measures and trial2use for this subject (all are 1×nTrial)
  188. mp = MFpower{s};
  189. pf = ICPC_pfc{s};
  190. lmo = ICPC_motor_L{s};
  191. rmo = ICPC_motor_R{s};
  192. tuse = trial2use{s};
  193. if isempty(mp)
  194. continue; % Skip empty subject
  195. end
  196. nTrial = numel(mp);
  197. % sub: first four characters of each filename (without extension)
  198. fname = fileList(s).name; % e.g. 'OCD01.set' or 'x130.set'
  199. base = erase(string(fname), '.set'); % remove extension
  200. if strlength(base) >= 4
  201. subID = extractBetween(base, 1, 4);
  202. else
  203. subID = base; % use original if length is < 4
  204. end
  205. % Write index range
  206. idx = ptr:(ptr + nTrial - 1);
  207. sub_col(idx) = repmat(subID, nTrial, 1);
  208. trial_col(idx) = (1:nTrial).'; % trial index starts from 1
  209. MFpower_col(idx) = mp(:);
  210. ICPCpfc_col(idx) = pf(:);
  211. l_ICPCmotor_col(idx) = lmo(:);
  212. r_ICPCmotor_col(idx) = rmo(:);
  213. % trial2use may be 1×nTrial or empty; set to 0 if empty
  214. if ~isempty(tuse)
  215. trial2use_col(idx) = tuse(:);
  216. else
  217. trial2use_col(idx) = 0;
  218. end
  219. ptr = ptr + nTrial;
  220. end
  221. %% ================== Build table and write CSV ==================
  222. T = table( ...
  223. sub_col, trial_col, ...
  224. MFpower_col, ICPCpfc_col, l_ICPCmotor_col, r_ICPCmotor_col, trial2use_col, ...
  225. 'VariableNames', {'sub','trial','MFpower','ICPCpfc','l_ICPCmotor','r_ICPCmotor','trial2use'} ...
  226. );
  227. writetable(T, out_csv);
  228. fprintf('CSV written: %s\nTotal rows = %d (sub×trial long table)\n', out_csv, height(T));
  229. %% OCD
  230. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  231. %%%%%%%%%%%%%%%%%%%%% Vectorize all trials at once %%%%%%%%%%%%%%%%%%%%%%%%%%%
  232. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  233. %% =========================================================================
  234. % Trial-level midfrontal theta POWER + Inter-channel Phase Coherence (ICPC)
  235. % Adapted from Swart et al. (2017, DCCN, Nijmegen)
  236. % For OCD dataset (EEGLAB → FieldTrip) [vectorized version: ICPC computed for all trials at once]
  237. % =========================================================================
  238. clear; clc; close all;
  239. dbstop if error
  240. %% ====== Paths and dependencies ======
  241. data_dir = 'H:\MT_all(afterqujizhi)\cueoriandbu\error\OCD';
  242. fileList = dir(fullfile(data_dir, '*.set'));
  243. nSub = numel(fileList);
  244. addpath('D:\MATLAB\toolbox\eeglab_current\eeglab2022.0_old');
  245. addpath('D:\MATLAB\toolbox\fieldtrip-20211209\fieldtrip-20211209');
  246. ft_defaults;
  247. %% ====== Analysis parameters ======
  248. freqRange = [4 8]; % theta band
  249. timeWin = [0.424 0.8]; % time window of interest (keep 0.40–0.65 s as requested)
  250. % ---- Electrode group definitions ----
  251. seedChans = {'E6','E129'}; % Midfrontal (FCz, Cz)
  252. pfcChans = {'E23','E24','E26','E27','E2','E3','E123','E124'}; % bilateral PFC
  253. lMotorCh = {'E36','E42','E41','E47'}; % left motor area
  254. rMotorCh = {'E93','E98','E103','E104'}; % right motor area
  255. % ---- Group weights (unchanged) ----
  256. seedweights = [3.4548, 4.4553]; % Midfrontal weights
  257. tweights_pfc = [0.4255 2.1589 -0.2652 1.4101 0.8377 2.5389 1.6312 2.8189];
  258. tweights_motor_L = [-1.1191 0.0210 1.1295 0.1666];
  259. tweights_motor_R = [1.4087 0.7652 0.1929 0.0753];
  260. % Normalize weights (seed & t-weights) for vectorized use
  261. sw = seedweights ./ sum(seedweights);
  262. tw_pfc = tweights_pfc ./ sum(tweights_pfc);
  263. tw_L = tweights_motor_L ./ sum(tweights_motor_L);
  264. tw_R = tweights_motor_R ./ sum(tweights_motor_R);
  265. %% ====== Initialize output matrices ======
  266. trial2use = cell(nSub,1);
  267. MFpower = cell(nSub,1);
  268. ICPC_pfc = cell(nSub,1);
  269. ICPC_motor_L = cell(nSub,1);
  270. ICPC_motor_R = cell(nSub,1);
  271. %% ====== Main loop ======
  272. for s = 1:nSub
  273. fprintf('\n=== Processing %s (%d/%d) ===\n', fileList(s).name, s, nSub);
  274. % --- Step 1: load and convert ---
  275. EEG = pop_loadset('filename', fileList(s).name, 'filepath', data_dir);
  276. ft_data = eeglab2fieldtrip(EEG, 'preprocessing');
  277. % --- Step 2: Laplacian (CSD) ---
  278. cfg = [];
  279. cfg.method = 'spline';
  280. cfg.elec = ft_data.elec;
  281. scd = ft_scalpcurrentdensity(cfg, ft_data);
  282. nTrial = numel(scd.trial);
  283. trial2use{s} = ones(1,nTrial); % Update here if trial exclusion is needed
  284. %% ===============================================================
  285. % ① Midfrontal θ Power (trial-wise) —— keep original implementation
  286. % ===============================================================
  287. cfg = [];
  288. cfg.channel = seedChans;
  289. cfg.bpfilter = 'yes';
  290. cfg.bpfreq = freqRange;
  291. filtered = ft_preprocessing(cfg, scd);
  292. % Hilbert amplitude → square to get power
  293. cfg = [];
  294. cfg.hilbert = 'abs';
  295. hilbertData = ft_preprocessing(cfg, filtered);
  296. for tr = 1:nTrial
  297. hilbertData.trial{tr} = hilbertData.trial{tr}.^2;
  298. end
  299. % Concatenate + weighted average + zscore
  300. allP = [hilbertData.trial{:}]; % chan × (time*trial)
  301. weights4power = repmat(seedweights',1,size(allP,2));
  302. st_power = zscore(mean(weights4power .* allP,1));
  303. nTime = size(hilbertData.trial{1},2);
  304. st_power = reshape(st_power,[nTime,nTrial]);
  305. % Extract mean within the time window
  306. iTime = dsearchn(hilbertData.time{1}',timeWin(1)) : ...
  307. dsearchn(hilbertData.time{1}',timeWin(2));
  308. MFpower{s} = squeeze(mean(st_power(iTime,:),1)); % 1×nTrial
  309. %% ===============================================================
  310. % ② Midfrontal–Lateral PFC ICPC (trial-wise) —— vectorized implementation
  311. % ===============================================================
  312. cfg = [];
  313. cfg.channel = [seedChans pfcChans];
  314. cfg.bpfilter = 'yes'; cfg.bpfreq = freqRange;
  315. filtered = ft_preprocessing(cfg, scd);
  316. cfg = []; cfg.hilbert = 'angle';
  317. hilbertdata = ft_preprocessing(cfg, filtered);
  318. % Assemble as [nChan × nTime × nTrial]
  319. nChan = numel(hilbertdata.label);
  320. nTime = size(hilbertdata.trial{1},2);
  321. nTrial = numel(hilbertdata.trial);
  322. ang = reshape([hilbertdata.trial{:}], nChan, nTime, nTrial);
  323. % Time-window indices (same as θ power)
  324. iTime = dsearchn(hilbertdata.time{1}',timeWin(1)) : ...
  325. dsearchn(hilbertdata.time{1}',timeWin(2));
  326. % Compute all targets (PFC) and all trials at once:
  327. % diff1/2: [nTarget × |iTime| × nTrial]
  328. diff1_all = ang(1, iTime, :) - ang(3:end, iTime, :);
  329. diff2_all = ang(2, iTime, :) - ang(3:end, iTime, :);
  330. % PLV (mean across time) → [nTarget × 1 × nTrial]
  331. plv1 = abs(mean(exp(1i*diff1_all), 2));
  332. plv2 = abs(mean(exp(1i*diff2_all), 2));
  333. % Weighted combination of the two seeds → [nTarget × nTrial]
  334. plv_pfc = squeeze(sw(1).*plv1 + sw(2).*plv2); % after squeeze: [nTarget × nTrial]
  335. % Linear combination with t-weights (signed) across targets → [1 × nTrial]
  336. ICPC_pfc_vals = (tw_pfc * plv_pfc); % 1×nTrial
  337. ICPC_pfc{s} = ICPC_pfc_vals;
  338. %% ===============================================================
  339. % ③ Midfrontal–Motor ICPC (Left / Right) —— vectorized implementation
  340. % ===============================================================
  341. cfg = [];
  342. cfg.channel = [seedChans lMotorCh rMotorCh];
  343. cfg.bpfilter = 'yes'; cfg.bpfreq = freqRange;
  344. filtered = ft_preprocessing(cfg, scd);
  345. cfg = []; cfg.hilbert = 'angle';
  346. hilbertdata = ft_preprocessing(cfg, filtered);
  347. % Assemble as [nChan × nTime × nTrial]
  348. nChan = numel(hilbertdata.label);
  349. nTime = size(hilbertdata.trial{1},2);
  350. nTrial = numel(hilbertdata.trial);
  351. ang = reshape([hilbertdata.trial{:}], nChan, nTime, nTrial);
  352. % Time-window indices
  353. iTime = dsearchn(hilbertdata.time{1}',timeWin(1)) : ...
  354. dsearchn(hilbertdata.time{1}',timeWin(2));
  355. % ---- Left motor (target indices 3:6) ----
  356. diff1_L = ang(1, iTime, :) - ang(3:6, iTime, :); % [4 × |iTime| × nTrial]
  357. diff2_L = ang(2, iTime, :) - ang(3:6, iTime, :);
  358. plv1_L = abs(mean(exp(1i*diff1_L), 2)); % [4 × 1 × nTrial]
  359. plv2_L = abs(mean(exp(1i*diff2_L), 2));
  360. plv_L = squeeze(sw(1).*plv1_L + sw(2).*plv2_L); % [4 × nTrial]
  361. Lvals = (tw_L * plv_L); % [1 × nTrial]
  362. ICPC_motor_L{s} = Lvals;
  363. % ---- Right motor (target indices 7:10) ----
  364. diff1_R = ang(1, iTime, :) - ang(7:10, iTime, :); % [4 × |iTime| × nTrial]
  365. diff2_R = ang(2, iTime, :) - ang(7:10, iTime, :);
  366. plv1_R = abs(mean(exp(1i*diff1_R), 2));
  367. plv2_R = abs(mean(exp(1i*diff2_R), 2));
  368. plv_R = squeeze(sw(1).*plv1_R + sw(2).*plv2_R); % [4 × nTrial]
  369. Rvals = (tw_R * plv_R); % [1 × nTrial]
  370. ICPC_motor_R{s} = Rvals;
  371. end
  372. %% ====== Save results ======
  373. save(fullfile(data_dir,'TrialLevel_MFpower_ICPC.mat'), ...
  374. 'MFpower','ICPC_pfc','ICPC_motor_L','ICPC_motor_R','trial2use');
  375. fprintf('Saved trial-level θ-power and ICPC results (ICPC was computed with vectorization).\n');
  376. clc; clear;
  377. %% Export the full CSV data
  378. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  379. %% ================== Configuration ==================
  380. data_dir = 'H:\MT_all(afterqujizhi)\cueoriandbu\error\OCD';
  381. mat_file = fullfile(data_dir, 'TrialLevel_MFpower_ICPC.mat');
  382. out_csv = fullfile(data_dir, 'TrialLevel_MFpower_ICPC.csv');
  383. %% ================== Load data ==================
  384. S = load(mat_file, 'MFpower','ICPC_pfc','ICPC_motor_L','ICPC_motor_R','trial2use');
  385. MFpower = S.MFpower;
  386. ICPC_pfc = S.ICPC_pfc;
  387. ICPC_motor_L = S.ICPC_motor_L;
  388. ICPC_motor_R = S.ICPC_motor_R;
  389. trial2use = S.trial2use;
  390. % File order consistent with the original computation (.set order in the folder)
  391. fileList = dir(fullfile(data_dir, '*.set'));
  392. nSub = numel(fileList);
  393. % Basic consistency check (optional)
  394. if nSub ~= numel(MFpower)
  395. warning('fileList count (%d) does not match MFpower subject count (%d). The smaller one will be used.', nSub, numel(MFpower));
  396. end
  397. nSub_use = min([nSub, numel(MFpower), numel(ICPC_pfc), numel(ICPC_motor_L), numel(ICPC_motor_R), numel(trial2use)]);
  398. %% ================== Count total rows and preallocate ==================
  399. rowsPerSub = zeros(nSub_use,1);
  400. for s = 1:nSub_use
  401. if ~isempty(MFpower{s})
  402. rowsPerSub(s) = numel(MFpower{s});
  403. else
  404. rowsPerSub(s) = 0;
  405. end
  406. end
  407. N = sum(rowsPerSub);
  408. sub_col = strings(N,1);
  409. trial_col = zeros(N,1);
  410. MFpower_col = nan(N,1);
  411. ICPCpfc_col = nan(N,1);
  412. l_ICPCmotor_col = nan(N,1);
  413. r_ICPCmotor_col = nan(N,1);
  414. trial2use_col = nan(N,1);
  415. %% ================== Expand to long table ==================
  416. ptr = 1;
  417. for s = 1:nSub_use
  418. % Get the four measures and trial2use for this subject (all are 1×nTrial)
  419. mp = MFpower{s};
  420. pf = ICPC_pfc{s};
  421. lmo = ICPC_motor_L{s};
  422. rmo = ICPC_motor_R{s};
  423. tuse = trial2use{s};
  424. if isempty(mp)
  425. continue; % Skip empty subject
  426. end
  427. nTrial = numel(mp);
  428. % sub: first four characters of each filename (without extension)
  429. fname = fileList(s).name; % e.g. 'OCD01.set' or 'x130.set'
  430. base = erase(string(fname), '.set'); % remove extension
  431. if strlength(base) >= 5
  432. subID = extractBetween(base, 1, 5);
  433. else
  434. subID = base; % use original if length is < 4
  435. end
  436. % Write index range
  437. idx = ptr:(ptr + nTrial - 1);
  438. sub_col(idx) = repmat(subID, nTrial, 1);
  439. trial_col(idx) = (1:nTrial).'; % trial index starts from 1
  440. MFpower_col(idx) = mp(:);
  441. ICPCpfc_col(idx) = pf(:);
  442. l_ICPCmotor_col(idx) = lmo(:);
  443. r_ICPCmotor_col(idx) = rmo(:);
  444. % trial2use may be 1×nTrial or empty; set to 0 if empty
  445. if ~isempty(tuse)
  446. trial2use_col(idx) = tuse(:);
  447. else
  448. trial2use_col(idx) = 0;
  449. end
  450. ptr = ptr + nTrial;
  451. end
  452. %% ================== Build table and write CSV ==================
  453. T = table( ...
  454. sub_col, trial_col, ...
  455. MFpower_col, ICPCpfc_col, l_ICPCmotor_col, r_ICPCmotor_col, trial2use_col, ...
  456. 'VariableNames', {'sub','trial','MFpower','ICPCpfc','l_ICPCmotor','r_ICPCmotor','trial2use'} ...
  457. );
  458. writetable(T, out_csv);
  459. fprintf('CSV written: %s\nTotal rows = %d (sub×trial long table)\n', out_csv, height(T));
  460. clc; clear;
  461. %% Generate CSV and MAT data for model fitting
  462. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  463. %% ================== Configuration ==================
  464. xlsx_file = 'H:\MT_all(afterqujizhi)\PIT_model.xlsx';
  465. in_sheet = 'model';
  466. out_csv = 'H:\MT_all(afterqujizhi)\TrialLevel_MFpower_ICPC.csv';
  467. out_mat = 'H:\MT_all(afterqujizhi)\TrialLevel_MFpower_ICPC.mat';
  468. TARGET_N = 73; % Target output is 73×1 cell
  469. %% ================== Load and basic check ==================
  470. T = readtable(xlsx_file, 'Sheet', in_sheet);
  471. % Required columns (case-insensitive)
  472. needCols = {'sub','group','trial','stimulus','MFpower','ICPCpfc', ...
  473. 'l_ICPCmotor','r_ICPCmotor','IVleft','IVright','trial2use'};
  474. % Helper function for case-insensitive column access
  475. getVar = @(tbl,name) tbl.(tbl.Properties.VariableNames{ ...
  476. find(strcmpi(tbl.Properties.VariableNames,name),1)});
  477. % Verify that all columns exist
  478. for k = 1:numel(needCols)
  479. if ~any(strcmpi(T.Properties.VariableNames, needCols{k}))
  480. error('Column "%s" was not found (sheet %s).', needCols{k}, in_sheet);
  481. end
  482. end
  483. %% ===== Helper: safely convert any column to double; unparseable values (empty/non-numeric) -> NaN =====
  484. numify = @(v) ( ...
  485. (isnumeric(v) .* double(v)) + ...
  486. (~isnumeric(v) .* str2double(string(v))) );
  487. % Note: for strings/categorical/cells, use string(...) then str2double(...);
  488. % blanks/unparseable values become NaN
  489. %% ===== Clean the four measure columns: empty/missing -> NaN (used for both CSV and MAT) =====
  490. MFpower_all = numify(getVar(T,'MFpower'));
  491. ICPCpfc_all = numify(getVar(T,'ICPCpfc'));
  492. lICPC_all = numify(getVar(T,'l_ICPCmotor'));
  493. rICPC_all = numify(getVar(T,'r_ICPCmotor'));
  494. %% ================== 1) Export CSV (in the specified column order) ==================
  495. Tout = table();
  496. for k = 1:numel(needCols)
  497. Tout.(needCols{k}) = getVar(T, needCols{k});
  498. end
  499. % Overwrite the original four columns with cleaned versions so empty values are written as NaN in CSV
  500. Tout.MFpower = MFpower_all;
  501. Tout.ICPCpfc = ICPCpfc_all;
  502. Tout.l_ICPCmotor = lICPC_all;
  503. Tout.r_ICPCmotor = rICPC_all;
  504. writetable(Tout, out_csv);
  505. fprintf('CSV exported: %s (%d rows × %d columns)\n', out_csv, height(Tout), width(Tout));
  506. %% ================== 2) Build 73×1 cell structure and save MAT ==================
  507. % —— Get and convert the other columns ——
  508. sub_raw = getVar(T, 'sub');
  509. group_raw = getVar(T, 'group');
  510. trial_all = numify(getVar(T, 'trial'));
  511. stim_all = numify(getVar(T, 'stimulus'));
  512. IVleft_all = numify(getVar(T, 'IVleft'));
  513. IVright_all = numify(getVar(T, 'IVright'));
  514. trial2use_all = numify(getVar(T, 'trial2use'));
  515. % —— Convert sub to string for grouping; also generate a numeric sub label for each row ——
  516. sub_str = string(sub_raw);
  517. sub_num_all = nan(height(T),1);
  518. tryDigits = regexp(sub_str, '(\d+)', 'match', 'once'); % extract digits, e.g. 'HC30'->'30'
  519. hasDigits = ~cellfun(@isempty, tryDigits);
  520. sub_num_all(hasDigits) = str2double(string(tryDigits(hasDigits)));
  521. % For rows where digits cannot be extracted, try direct numeric conversion
  522. isnanMask = isnan(sub_num_all);
  523. sub_num_all(isnanMask) = str2double(sub_str(isnanMask));
  524. % —— Map group to numeric: HC->0, OCD->1; otherwise try numeric conversion ——
  525. group_str = upper(strtrim(string(group_raw)));
  526. group_num_all = nan(height(T),1);
  527. group_num_all(group_str=="HC") = 0;
  528. group_num_all(group_str=="OCD") = 1;
  529. mask_nan = isnan(group_num_all);
  530. group_num_all(mask_nan) = str2double(group_str(mask_nan));
  531. % —— Group by sub_str (stable order) ——
  532. [subs_unique, ~, G] = unique(sub_str, 'stable'); % G: group index for each row
  533. nSub_actual = numel(subs_unique);
  534. % Preallocate cell: first by actual subject count, then align to 73
  535. fields = {'sub','group','trial','stimulus','MFpower','ICPCpfc', ...
  536. 'l_ICPCmotor','r_ICPCmotor','IVleft','IVright','trial2use'};
  537. S = struct();
  538. for f = 1:numel(fields)
  539. S.(fields{f}) = cell(nSub_actual,1);
  540. end
  541. % —— Fill each cell by subject (1×trial row) ——
  542. for i = 1:nSub_actual
  543. idx = (G == i);
  544. % Sort by trial to keep consistent order
  545. [trial_i, order] = sort(trial_all(idx));
  546. pick = find(idx);
  547. pick = pick(order);
  548. % sub: use the numeric sub label; if all NaN, fall back to group index i
  549. sub_num_i = sub_num_all(pick);
  550. if all(isnan(sub_num_i))
  551. sub_num_i = repmat(double(i), numel(pick), 1);
  552. end
  553. % group: numeric value (HC=0/OCD=1/otherwise try numeric conversion/still NaN -> NaN)
  554. group_num_i = group_num_all(pick);
  555. % Write into structure (convert to 1×N row); all fields are double row vectors
  556. S.sub{i} = sub_num_i(:).';
  557. S.group{i} = group_num_i(:).';
  558. S.trial{i} = trial_i(:).';
  559. S.stimulus{i} = stim_all(pick).';
  560. S.MFpower{i} = MFpower_all(pick).';
  561. S.ICPCpfc{i} = ICPCpfc_all(pick).';
  562. S.l_ICPCmotor{i} = lICPC_all(pick).';
  563. S.r_ICPCmotor{i} = rICPC_all(pick).';
  564. S.IVleft{i} = IVleft_all(pick).';
  565. S.IVright{i} = IVright_all(pick).';
  566. S.trial2use{i} = trial2use_all(pick).';
  567. end
  568. % —— Align to 73×1 cell: pad with empty cells if fewer, keep all if more ——
  569. if nSub_actual < TARGET_N
  570. padN = TARGET_N - nSub_actual;
  571. for f = 1:numel(fields)
  572. S.(fields{f}) = [S.(fields{f}); repmat({[]}, padN, 1)];
  573. end
  574. fprintf('Actual subject count %d < %d, padded with empty cells to %d×1.\n', nSub_actual, TARGET_N, TARGET_N);
  575. elseif nSub_actual > TARGET_N
  576. fprintf('Actual subject count %d > %d, saving the actual subject count without truncation.\n', nSub_actual, TARGET_N);
  577. end
  578. % —— Save MAT ——
  579. save(out_mat, '-struct', 'S');
  580. fprintf('MAT saved: %s\nFields: %s\nSize: %d×1 cell (if >73, actual subject count is kept)\n', ...
  581. out_mat, strjoin(fields, ', '), max(TARGET_N, nSub_actual));

TF_singletrial_grouplevel.m at commit 3eae95c, under MIT · at the source

Overview

Authors: Yu Pang1, Dongsheng Zhou2, Ziwen Peng1, Wanting Liu1, Ruojie Huang3, Carol A Seger1,4, Qi Chen3
ORCID iDs: Yu Pang, Qi Chen
  1. School of Psychology, South China Normal University, Guangzhou, China
  2. Department of Psychiatry, Zhejiang Key Laboratory of Drug Addiction & Brain Health, Affiliated Kangning Hospital of Ningbo University (Ningbo Kangning Hospital), Ningbo, China
  3. School of Psychology, Key Laboratory of Brain Cognition and Emotional Health of Guangdong Higher Education Institutes, and Shenzhen Key Laboratory of Affective and Social Cognitive Science, Shenzhen University, Shenzhen, China
  4. Department of Psychology, Colorado State University, Fort Collins, Colorado, United States of America
Journal: PLoS biology, volume 24, issue 9, article e3003979
Dates: received 25 March 2026; accepted 17 August 2026; published online 1 September 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1371/journal.pbio.3003979 · PMID 42678993 · PMCID PMC13568527 · OpenAlex W7204938623
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: EEG (modality), human (organism), other condition (population), systems (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Spectral & time-frequency, Preprocessing, Connectivity, Physiology & signal measures
MeSH: Frontal Lobe*, Motivation*, Obsessive-Compulsive Disorder*, Theta Rhythm*, Adult, Case-Control Studies, Electroencephalography, Female, Humans, Male, Reward, Young Adult (* major topic)
Topic: Transcranial Magnetic Stimulation Studies (Neurology, Neuroscience), according to OpenAlex
Funding: National Natural Science Foundation of China (32571283); National Science and Technology Innovation 2030 Major Program (2021ZD0203800)
Citations: not cited yet (Europe PMC); 152 references in the paper

Abstract

Obsessive‑compulsive disorder (OCD) is characterized by an insight‑action dissociation, in which people with OCD recognize that their behavior is irrational but still struggle to inhibit habitual responses. This dissociation may be related to abnormally strong motivational biases, reflected in excessive tendencies to approach reward and avoid punishment. We employed a motivational Go/NoGo learning task, combined with computational modeling and electroencephalography (EEG), to investigate how 36 people with OCD and 37 healthy controls (HC) regulate maladaptive biases during motivated action. People with OCD showed stronger Pavlovian bias and lower learning rates. Similar to HC, people with OCD also showed increased midfrontal theta power related to conflict detection and to the generation of a control demand to increase the weighting of instrumental action values during choice, suggesting that they were able to detect the mismatch between their behavior and task goals. However, in OCD, conflict‑related theta enhancement overlapped with the response window, indicating that control signals emerged or arrived too late to effectively influence choice. Midfrontal‑motor theta phase synchrony provided the strongest model evidence for the modulation of maladaptive biases in OCD, yet this pathway showed no significant conflict‑related enhancement and failed to effectively modulate motivational biases under conflict. Taken together, these findings suggest a neural mechanism underlying the insight‑action dissociation in OCD and identify midfrontal‑motor theta phase synchrony as a potential treatment target.

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

Zenodo 21964069

License: MIT
State: the link answers, verified on 26 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: “Data Availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Statistics and Machine Learning Toolbox (15 files), Stan (10 files), FieldTrip (7 files), EEGLAB (4 files), tidyverse (4 files), boundedline (3 files), ggplot2 (3 files), car (2 files), data.table (2 files), emmeans (2 files), lme4 (2 files), lmerTest (2 files), psych (2 files), afex (1 file), BayesFactor (1 file)
Availability: 1 check, the latest on 26 September 2026: the link answers (HTTP 200)
  • 26 September 2026: the link answers (HTTP 200)
62 files

yupang11/motivational-biases-in-ocd

License: MIT
State: the link answers, verified on 26 September 2026
Evidence: files inventoried
Commit: 3eae95c040fba849171a37264ea861c440dfe66d, 16 August 2026
Languages: MATLAB (24), R (22), SPSS (5)
Size: 288 files, 51 scripts
Software Heritage: not archived
Found in: the Zenodo archive record
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Statistics and Machine Learning Toolbox (8 files), Stan (8 files), FieldTrip (7 files), EEGLAB (4 files), boundedline (3 files), ggplot2 (3 files), tidyverse (3 files), car (2 files), data.table (2 files), emmeans (2 files), lme4 (2 files), lmerTest (2 files), psych (2 files), afex (1 file), BayesFactor (1 file)
Availability: 1 check, the latest on 26 September 2026: the link answers
  • 26 September 2026: the link answers
53 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:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 111 scripts, each with its path and the digest of its content;
  • 12 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

The individual numerical data underlying the main figures are provided in the Supporting information files (S1–S6 Data). All analysis code and raw data are publicly available on Zenodo (https://doi.org/10.5281/zenodo.21964069).

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

Recorded: type, language, journal, volume, issue, pages, dates, 7 authors, 12 MeSH terms, 2 funders, 148 references.

Cite

This paper

Pang, Y., Zhou, D., Peng, Z., Liu, W., Huang, R., Seger, C. A., & Chen, Q. (2026). Impaired midfrontal‑motor theta phase synchronization characterizes maladaptive motivational behavior in people with obsessive‑compulsive disorder. PLoS biology, 24(9), e3003979. https://doi.org/10.1371/journal.pbio.3003979

BibTeX

@article{pang2026impaired,
author = {Pang, Yu and Zhou, Dongsheng and Peng, Ziwen and Liu, Wanting and Huang, Ruojie and Seger, Carol A and Chen, Qi},
title = {{Impaired midfrontal‑motor theta phase synchronization characterizes maladaptive motivational behavior in people with obsessive‑compulsive disorder}},
journal = {PLoS biology},
year = {2026},
month = sep,
volume = {24},
number = {9},
pages = {e3003979},
publisher = {PLOS},
issn = {1544-9173},
doi = {10.1371/journal.pbio.3003979},
url = {https://doi.org/10.1371/journal.pbio.3003979},
pmid = {42678993},
pmcid = {PMC13568527}
}

RIS

TY - JOUR
AU - Pang, Yu
AU - Zhou, Dongsheng
AU - Peng, Ziwen
AU - Liu, Wanting
AU - Huang, Ruojie
AU - Seger, Carol A
AU - Chen, Qi
TI - Impaired midfrontal‑motor theta phase synchronization characterizes maladaptive motivational behavior in people with obsessive‑compulsive disorder
T2 - PLoS biology
J2 - PLoS Biol
PY - 2026
DA - 2026/09/01
VL - 24
IS - 9
SP - e3003979
SN - 1544-9173
PB - PLOS
DO - 10.1371/journal.pbio.3003979
UR - https://doi.org/10.1371/journal.pbio.3003979
LA - en
ER -

CSL-JSON

{
"id": "10.1371/journal.pbio.3003979",
"type": "article-journal",
"title": "Impaired midfrontal‑motor theta phase synchronization characterizes maladaptive motivational behavior in people with obsessive‑compulsive disorder",
"container-title": "PLoS biology",
"author": [
{
"family": "Pang",
"given": "Yu"
},
{
"family": "Zhou",
"given": "Dongsheng"
},
{
"family": "Peng",
"given": "Ziwen"
},
{
"family": "Liu",
"given": "Wanting"
},
{
"family": "Huang",
"given": "Ruojie"
},
{
"family": "Seger",
"given": "Carol A"
},
{
"family": "Chen",
"given": "Qi"
}
],
"container-title-short": "PLoS Biol",
"volume": "24",
"issue": "9",
"page": "e3003979",
"DOI": "10.1371/journal.pbio.3003979",
"PMID": "42678993",
"PMCID": "PMC13568527",
"ISSN": "1544-9173",
"publisher": "PLOS",
"URL": "https://doi.org/10.1371/journal.pbio.3003979",
"language": "en",
"issued": {
"date-parts": [
[
2026,
9,
1
]
]
}
}

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.pbio.3003767 [code]
Ultrasound neuromodulation reveals distinct roles of the dorsal anterior cingulate cortex and anterior insula in learning.
Journal: PLoS biology
In common: afex, boundedline, psych, 7 other tools, 7 references
[2] doi:10.1016/j.neuroimage.2026.122115 [code]
Midfrontal theta power relates to response speeding following frustrative nonreward.
Journal: NeuroImage
In common: psych, car, EEGLAB, 6 other tools, EEG, 4 references
[3] doi:10.1371/journal.pone.0353990 [code]
Positive mood enhances accessibility of unrelated concepts in the first language but not in the foreign language.
Journal: PloS one
In common: afex, psych, car, 6 other tools, EEG, 3 references
[4] doi:10.1038/s41598-026-53424-4 [code]
Cognitive control networks causally support implicit emotion regulation: evidence from dlPFC stimulation and directed functional connectivity.
Journal: Scientific reports
In common: BayesFactor, car, FieldTrip, 4 other tools, EEG, 5 references
[5] doi:10.1038/s41467-026-75799-8 [code]
Behaviourally driven closed-loop beta-tACS enhances beta activity and motor behaviour.
Journal: Nature communications
In common: afex, car, EEGLAB, 7 other tools, systems, 1 reference
[6] doi:10.1016/j.celrep.2026.117646 [code]
Medial entorhinal-hippocampal desynchronization parallels the emergence of memory impairment in a mouse model of Alzheimer's disease pathology.
Journal: Cell reports
In common: boundedline, car, EEGLAB, 7 other tools, systems
[7] doi:10.1038/s41467-026-74565-0 [code]
The functional neurobiology of dispositions towards negative emotions.
Journal: Nature communications
In common: BayesFactor, afex, boundedline, 6 other tools
[8] doi:10.1162/imag.a.105 [code]
Right posterior theta reflects human parahippocampal phase resetting by salient cues during goal-directed navigation
Journal: n/a
In common: psych, car, EEGLAB, 5 other tools, EEG, 3 references
[9] doi:10.1126/sciadv.aec9291 [code]
Computational mechanisms of perception in autism revealed using games inspired by rodent operant tasks.
Journal: Science advances
In common: afex, Stan, psych, 6 other tools
[10] doi:10.1523/eneuro.0076-26.2026 [code]
Exogenously Driven Neural Reactivation of Spatially Matching Visual Working-Memory Contents.
Journal: eNeuro
In common: BayesFactor, car, FieldTrip, 6 other tools, EEG, 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.