OSCR

A hybrid micro-ECoG for functionally targeted multi-site and multi-scale investigation.

Code ↔ Paper

9 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 9 matches
  1. [1] § Results › Hybrid μECoG for functionally targeted multi-area laminar recordings in the marmoset ↔ Figure_Simulation_MarmoMT_targeting.m, lines 1–36 · score 0.96 · Monte Carlo simulation, Random MT penetrations, RF distance expected, V1 MT RF, RF alignment, retinotopic alignment
  2. [2] § STAR★Methods › Quantification and statistical analysis ↔ Figure_Simulation_MarmoMT_targeting.m, lines 1–36 · score 0.92 · Monte Carlo simulation, Random MT probe, V1 MT RF, retinotopic alignment, retinotopic map, laminar probe
  3. [3] § STAR★Methods › Quantification and statistical analysis ↔ FigureECoGwithLaminarCorrelation.m, lines 89–99 · score 0.58 · 100–200 Hz, 10–20 Hz, correlation, filtered, laminar, 100 Hz
  4. [4] § Results › Hybrid μECoG for optogenetic mapping of local and inter-areal interactions ↔ FigureStats_FeedforwardOpto32ChAtlasProbe_MarmosetMT_MUA.m, lines 115–138 · score 0.55 · Bonferroni corrected, sided signrank, Feedforward, probe, modulation, MUA
  5. [5] § STAR★Methods › Quantification and statistical analysis ↔ buildRFstruct2.m, lines 1–61 · score 0.53 · band pass filtered, EcoG, 200 Hz, 20 Hz, 100 Hz, channel
  6. [6] § Results › Hybrid μECoG for optogenetic mapping of local and inter-areal interactions ↔ FigureStats_FeedforwardOpto32ChAtlasProbe_MarmosetMT_MUA.m, lines 115–138 · score 0.52 · Bonferroni corrected, sided signrank, feedforward, modulation, MUA, MT
  7. [7] § STAR★Methods › Quantification and statistical analysis ↔ Figure_catECoG_bar_sweep_trajectory_area17.m, lines 423–470 · score 0.52 · peak envelope, trajectory, amplitude, SNR, linearly, thresholded
  8. [8] § Results › Hybrid μECoGs enable multi-scale investigation of cortical activity ↔ FigureECoGwithLaminarCorrelation.m, lines 89–99 · score 0.52 · 100–200 Hz, 10–20 Hz, correlating, laminar, 100 Hz
  9. [9] § STAR★Methods › Quantification and statistical analysis ↔ buildRFstruct2.m, lines 1–61 · score 0.51 · band pass filtered, delay, PSTH, smoothed, 60 Hz, 90 Hz

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 · 763 lines · 17 KB · CC-BY-4.0 · 2 matches

  1. % % This script analyzes retinotopic alignment between laminar probes in V1 and MT
  2. % using µECoG maps from Marmoset001Block37.
  3. %
  4. % The first part visualizes the retinotopic maps (µECoG and laminar RFs) to
  5. % confirm spatial correspondence between the recording modalities.
  6. %
  7. % The main analysis simulates random MT probe insertions across the MT µECoG
  8. % retinotopic map and compares the resulting RF distances to the actual
  9. % V1–MT laminar probe RF distance. This Monte-Carlo simulation estimates
  10. % how well the experimentally chosen MT penetration aligns with the V1 site
  11. % relative to chance targeting.
  12. %
  13. % Output:
  14. % - Distribution of RF distances expected from random MT penetrations
  15. % - Actual V1–MT RF distance
  16. % - Percentile of the real penetration relative to random targeting
  17. % - Bootstrap confidence interval for the V1–MT RF distance
  18. %
  19. % Used in manuscript revision to demonstrate that µECoG-guided probe
  20. % placement improves cross-area RF alignment compared to random insertion.
  21. % P. Jendritza March 2026
  22. % data from Marmoset001Block37
  23. load marmo_RFmapData_V1
  24. disp('Loaded marmo_RFmapData_V1')
  25. load marmo_RFmapData_MT
  26. disp('Loaded marmo_RFmapData_MT')
  27. load marmo_RFprobe_V1
  28. disp('Loaded marmo_RFprobe_V1')
  29. load marmo_RFprobe_MT
  30. disp('Loaded marmo_RFprobe_MT')
  31. %% extract maps
  32. % ECoG (smoothed)
  33. V1_x_ecog = marmo_RFmapData_V1.retmap_x.smoothHighReswholeRFs;
  34. V1_y_ecog = marmo_RFmapData_V1.retmap_y.smoothHighReswholeRFs;
  35. MT_x_ecog = marmo_RFmapData_MT.retmap_x.smoothHighReswholeRFs;
  36. MT_y_ecog = marmo_RFmapData_MT.retmap_y.smoothHighReswholeRFs;
  37. % Laminar (unsmoothed)
  38. V1_x_probe = marmo_RFprobe_V1.retmap_x.wholeRFs;
  39. V1_y_probe = marmo_RFprobe_V1.retmap_y.wholeRFs;
  40. MT_x_probe = marmo_RFprobe_MT.retmap_x.wholeRFs;
  41. MT_y_probe = marmo_RFprobe_MT.retmap_y.wholeRFs;
  42. % compute color limits
  43. V1_x_lim = [min([V1_x_ecog(:); V1_x_probe(:)]) max([V1_x_ecog(:); V1_x_probe(:)])];
  44. V1_y_lim = [min([V1_y_ecog(:); V1_y_probe(:)]) max([V1_y_ecog(:); V1_y_probe(:)])];
  45. MT_x_lim = [min([MT_x_ecog(:); MT_x_probe(:)]) max([MT_x_ecog(:); MT_x_probe(:)])];
  46. MT_y_lim = [min([MT_y_ecog(:); MT_y_probe(:)]) max([MT_y_ecog(:); MT_y_probe(:)])];
  47. %% plot
  48. figure('Position',[100 100 900 800])
  49. newColormap = turbo(30);
  50. % --- V1 ECoG X
  51. subplot(4,2,1)
  52. imagesc(V1_x_ecog)
  53. title('V1 ECoG X')
  54. clim(V1_x_lim)
  55. colormap(newColormap)
  56. colorbar
  57. axis equal
  58. axis off
  59. % --- V1 ECoG Y
  60. subplot(4,2,2)
  61. imagesc(V1_y_ecog)
  62. title('V1 ECoG Y')
  63. clim(V1_y_lim)
  64. colormap(newColormap)
  65. colorbar
  66. axis equal
  67. axis off
  68. % --- V1 probe X
  69. subplot(4,2,3)
  70. imagesc(V1_x_probe)
  71. title('V1 probe X')
  72. clim(V1_x_lim)
  73. colormap(newColormap)
  74. colorbar
  75. axis equal
  76. axis off
  77. % --- V1 probe Y
  78. subplot(4,2,4)
  79. imagesc(V1_y_probe)
  80. title('V1 probe Y')
  81. clim(V1_y_lim)
  82. colormap(newColormap)
  83. colorbar
  84. axis equal
  85. axis off
  86. % --- MT ECoG X
  87. subplot(4,2,5)
  88. imagesc(MT_x_ecog)
  89. title('MT ECoG X')
  90. clim(MT_x_lim)
  91. colormap(newColormap)
  92. colorbar
  93. axis equal
  94. axis off
  95. % --- MT ECoG Y
  96. subplot(4,2,6)
  97. imagesc(MT_y_ecog)
  98. title('MT ECoG Y')
  99. clim(MT_y_lim)
  100. colormap(newColormap)
  101. colorbar
  102. axis equal
  103. axis off
  104. % --- MT probe X
  105. subplot(4,2,7)
  106. imagesc(MT_x_probe)
  107. title('MT probe X')
  108. clim(MT_x_lim)
  109. colormap(newColormap)
  110. colorbar
  111. axis equal
  112. axis off
  113. % --- MT probe Y
  114. subplot(4,2,8)
  115. imagesc(MT_y_probe)
  116. title('MT probe Y')
  117. clim(MT_y_lim)
  118. colormap(newColormap)
  119. colorbar
  120. axis equal
  121. axis off
  122. sgtitle('Marmoset retinotopic maps (pixel RF space)')
  123. set(gcf,'color','w')
  124. %%
  125. % Purpose: plot MT laminar RFs with correct probe geometry
  126. % Purpose: plot MT laminar RFs with correct probe geometry
  127. RFstruct = marmo_RFprobe_MT.RFstruct;
  128. snrThresh = 0;
  129. exampleCh = 14;
  130. chXp = marmo_RFprobe_MT.chXp;
  131. chYp = marmo_RFprobe_MT.chYp;
  132. nCh = length(chXp);
  133. % logical channel masks
  134. isValidCh = ~isnan(chXp);
  135. % compute SNR
  136. vSNR = nan(1,nCh);
  137. for iCh = find(isValidCh)
  138. thisRF = RFstruct.DataAllmAll{1,iCh};
  139. thisBound = RFstruct.LabelMatrixAll{1,iCh};
  140. vIn = thisRF(thisBound==1);
  141. vOut = thisRF(thisBound==0);
  142. vSNR(iCh) = mean(vIn(:)) / mean(vOut(:));
  143. end
  144. isHighSNRCh = vSNR > snrThresh;
  145. % compute RF centers
  146. cx = nan(1,nCh);
  147. cy = nan(1,nCh);
  148. for iCh = find(isValidCh)
  149. RF = flipud(RFstruct.DataAllmAll{1,iCh});
  150. mask = flipud(RFstruct.LabelMatrixAll{1,iCh});
  151. RFmask = RF;
  152. RFmask(mask==0) = 0;
  153. [yy,xx] = ndgrid(1:size(RFmask,1),1:size(RFmask,2));
  154. cx(iCh) = sum(xx(:).*RFmask(:)) / sum(RFmask(:));
  155. cy(iCh) = sum(yy(:).*RFmask(:)) / sum(RFmask(:));
  156. end
  157. % median RF center from GOOD channels
  158. isGoodValidCh = isValidCh & isHighSNRCh;
  159. cx_med = median(cx(isGoodValidCh));
  160. cy_med = median(cy(isGoodValidCh));
  161. % best SNR RF
  162. validIdx = find(isValidCh);
  163. [~,bestRelIdx] = max(vSNR(validIdx));
  164. bestCh = validIdx(bestRelIdx);
  165. cx_best = cx(bestCh);
  166. cy_best = cy(bestCh);
  167. % store QC results in struct (no saving)
  168. marmo_RFprobe_MT.isValidCh = isValidCh;
  169. marmo_RFprobe_MT.isHighSNRCh = isHighSNRCh;
  170. marmo_RFprobe_MT.SNR = vSNR;
  171. marmo_RFprobe_MT.cx = cx;
  172. marmo_RFprobe_MT.cy = cy;
  173. marmo_RFprobe_MT.cx_med = cx_med;
  174. marmo_RFprobe_MT.cy_med = cy_med;
  175. marmo_RFprobe_MT.bestCh = bestCh;
  176. marmo_RFprobe_MT.cx_best = cx_best;
  177. marmo_RFprobe_MT.cy_best = cy_best;
  178. marmo_RFprobe_MT.exampleCh = exampleCh;
  179. % plot RFs using probe depth order
  180. validCh = find(isValidCh);
  181. depth = marmo_RFprobe_MT.chYp(validCh);
  182. [~,order] = sort(depth); % superficial → deep
  183. plotCh = validCh(order);
  184. nPlot = length(plotCh);
  185. nCols = ceil(sqrt(nPlot));
  186. nRows = ceil(nPlot/nCols);
  187. figure('Position',[100 100 900 700])
  188. for i = 1:nPlot
  189. iCh = plotCh(i);
  190. subplot(nRows,nCols,i)
  191. RF = flipud(RFstruct.DataAllmAll{1,iCh});
  192. imagesc(RF)
  193. axis equal
  194. axis off
  195. colormap jet
  196. hold on
  197. % individual RF center
  198. plot(cx(iCh),cy(iCh),'k+','LineWidth',1.5,'MarkerSize',8)
  199. % median RF center
  200. plot(cx_med,cy_med,'b+','LineWidth',2,'MarkerSize',10)
  201. % best SNR RF center
  202. plot(cx_best,cy_best,'m+','LineWidth',2,'MarkerSize',10)
  203. % SNR text
  204. text(4,12,sprintf('%.2f',vSNR(iCh)),'Color','k','FontSize',9,'FontWeight','bold')
  205. % mark bad RF
  206. if ~isHighSNRCh(iCh)
  207. text(4,4,'X','Color','r','FontSize',14,'FontWeight','bold')
  208. end
  209. % mark example RF
  210. if iCh == exampleCh
  211. rectangle('Position',[1 1 size(RF,2)-1 size(RF,1)-1],...
  212. 'EdgeColor','r','LineWidth',2)
  213. text(4,size(RF,1)-4,'example','Color','r','FontWeight','bold')
  214. end
  215. set(gca,'YDir','normal')
  216. end
  217. sgtitle('MT laminar probe RFs (probe geometry)')
  218. set(gcf,'color','w')
  219. %% Purpose: plot V1 laminar RFs with correct probe geometry
  220. % Purpose: plot V1 laminar RFs with correct probe geometry
  221. RFstruct = marmo_RFprobe_V1.RFstruct;
  222. snrThresh = 0.0;
  223. exampleCh = 11;
  224. chXp = marmo_RFprobe_V1.chXp;
  225. chYp = marmo_RFprobe_V1.chYp;
  226. nCh = length(chXp);
  227. % logical channel masks
  228. isValidCh = ~isnan(chXp);
  229. % compute SNR
  230. vSNR = nan(1,nCh);
  231. for iCh = find(isValidCh)
  232. thisRF = RFstruct.DataAllmAll{1,iCh};
  233. thisBound = RFstruct.LabelMatrixAll{1,iCh};
  234. vIn = thisRF(thisBound==1);
  235. vOut = thisRF(thisBound==0);
  236. vSNR(iCh) = mean(vIn(:)) / mean(vOut(:));
  237. end
  238. isHighSNRCh = vSNR > snrThresh;
  239. % compute RF centers
  240. cx = nan(1,nCh);
  241. cy = nan(1,nCh);
  242. for iCh = find(isValidCh)
  243. RF = flipud(RFstruct.DataAllmAll{1,iCh});
  244. mask = flipud(RFstruct.LabelMatrixAll{1,iCh});
  245. RFmask = RF;
  246. RFmask(mask==0) = 0;
  247. [yy,xx] = ndgrid(1:size(RFmask,1),1:size(RFmask,2));
  248. cx(iCh) = sum(xx(:).*RFmask(:)) / sum(RFmask(:));
  249. cy(iCh) = sum(yy(:).*RFmask(:)) / sum(RFmask(:));
  250. end
  251. % median RF center from GOOD channels
  252. isGoodValidCh = isValidCh & isHighSNRCh;
  253. cx_med = median(cx(isGoodValidCh));
  254. cy_med = median(cy(isGoodValidCh));
  255. % best SNR RF
  256. validIdx = find(isValidCh);
  257. [~,bestRelIdx] = max(vSNR(validIdx));
  258. bestCh = validIdx(bestRelIdx);
  259. cx_best = cx(bestCh);
  260. cy_best = cy(bestCh);
  261. % store QC results into struct
  262. marmo_RFprobe_V1.isValidCh = isValidCh;
  263. marmo_RFprobe_V1.isHighSNRCh = isHighSNRCh;
  264. marmo_RFprobe_V1.SNR = vSNR;
  265. marmo_RFprobe_V1.cx = cx;
  266. marmo_RFprobe_V1.cy = cy;
  267. marmo_RFprobe_V1.cx_med = cx_med;
  268. marmo_RFprobe_V1.cy_med = cy_med;
  269. marmo_RFprobe_V1.bestCh = bestCh;
  270. marmo_RFprobe_V1.cx_best = cx_best;
  271. marmo_RFprobe_V1.cy_best = cy_best;
  272. marmo_RFprobe_V1.exampleCh = exampleCh;
  273. % plot RFs using depth order
  274. validCh = find(isValidCh);
  275. depth = marmo_RFprobe_V1.chYp(validCh);
  276. [~,order] = sort(depth); % superficial → deep
  277. plotCh = validCh(order);
  278. nPlot = length(plotCh);
  279. nCols = ceil(sqrt(nPlot));
  280. nRows = ceil(nPlot/nCols);
  281. figure('Position',[100 100 900 700])
  282. for i = 1:nPlot
  283. iCh = plotCh(i);
  284. subplot(nRows,nCols,i)
  285. RF = flipud(RFstruct.DataAllmAll{1,iCh});
  286. imagesc(RF)
  287. axis equal
  288. axis off
  289. colormap jet
  290. hold on
  291. % individual RF center
  292. plot(cx(iCh),cy(iCh),'k+','LineWidth',1.5,'MarkerSize',8)
  293. % median RF center
  294. plot(cx_med,cy_med,'b+','LineWidth',2,'MarkerSize',10)
  295. % best SNR RF center
  296. plot(cx_best,cy_best,'m+','LineWidth',2,'MarkerSize',10)
  297. % SNR text
  298. text(4,12,sprintf('%.2f',vSNR(iCh)),'Color','k','FontSize',9,'FontWeight','bold')
  299. % mark bad RF
  300. if ~isHighSNRCh(iCh)
  301. text(4,4,'X','Color','r','FontSize',14,'FontWeight','bold')
  302. end
  303. % mark example RF
  304. if iCh == exampleCh
  305. rectangle('Position',[1 1 size(RF,2)-1 size(RF,1)-1],...
  306. 'EdgeColor','r','LineWidth',2)
  307. text(4,size(RF,1)-4,'example','Color','r','FontWeight','bold')
  308. end
  309. set(gca,'YDir','normal')
  310. end
  311. sgtitle('V1 laminar probe RFs (probe geometry)')
  312. set(gcf,'color','w')
  313. %%
  314. % Purpose: plot MT ECoG retinotopic maps using NON-smoothed pixel RF maps
  315. MT_x_ecog_raw = marmo_RFmapData_MT.retmap_x.wholeRFs;
  316. MT_y_ecog_raw = marmo_RFmapData_MT.retmap_y.wholeRFs;
  317. MT_x_lim = [min(MT_x_ecog_raw(:)) max(MT_x_ecog_raw(:))];
  318. MT_y_lim = [min(MT_y_ecog_raw(:)) max(MT_y_ecog_raw(:))];
  319. figure('Position',[100 100 700 500])
  320. newColormap = turbo(30);
  321. subplot(1,2,1)
  322. imagesc(MT_x_ecog_raw)
  323. title('MT ECoG X (raw)')
  324. clim(MT_x_lim)
  325. colormap(newColormap)
  326. colorbar
  327. axis equal
  328. axis off
  329. subplot(1,2,2)
  330. imagesc(MT_y_ecog_raw)
  331. title('MT ECoG Y (raw)')
  332. clim(MT_y_lim)
  333. colormap(newColormap)
  334. colorbar
  335. axis equal
  336. axis off
  337. sgtitle('MT ECoG retinotopic maps (non-smoothed)')
  338. set(gcf,'color','w')
  339. %%
  340. median(marmo_RFprobe_MT.retmap_x.wholeRFs(marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh))
  341. median(marmo_RFprobe_MT.retmap_y.wholeRFs(marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh))
  342. %%
  343. % Purpose: plot smoothed MT ECoG maps and find pixel closest to probe RF median
  344. MT_x_ecog_smooth = marmo_RFmapData_MT.retmap_x.smoothHighReswholeRFs;
  345. MT_y_ecog_smooth = marmo_RFmapData_MT.retmap_y.smoothHighReswholeRFs;
  346. % probe RF medians
  347. medX = median(marmo_RFprobe_MT.retmap_x.wholeRFs( ...
  348. marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh));
  349. medY = median(marmo_RFprobe_MT.retmap_y.wholeRFs( ...
  350. marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh));
  351. % find closest pixels
  352. [~,ix] = min(abs(MT_x_ecog_smooth(:) - medX));
  353. [~,iy] = min(abs(MT_y_ecog_smooth(:) - medY));
  354. [rowX,colX] = ind2sub(size(MT_x_ecog_smooth),ix);
  355. [rowY,colY] = ind2sub(size(MT_y_ecog_smooth),iy);
  356. figure('Position',[100 100 700 500])
  357. newColormap = turbo(30);
  358. subplot(1,2,1)
  359. imagesc(MT_x_ecog_smooth)
  360. hold on
  361. plot(colX,rowX,'k+','LineWidth',2,'MarkerSize',12)
  362. title('MT ECoG X (smoothed)')
  363. colormap(newColormap)
  364. colorbar
  365. axis equal
  366. axis off
  367. subplot(1,2,2)
  368. imagesc(MT_y_ecog_smooth)
  369. hold on
  370. plot(colY,rowY,'k+','LineWidth',2,'MarkerSize',12)
  371. title('MT ECoG Y (smoothed)')
  372. colormap(newColormap)
  373. colorbar
  374. axis equal
  375. axis off
  376. sgtitle('Closest ECoG pixels to laminar RF median')
  377. set(gcf,'color','w')
  378. %% Purpose: plot RAW MT ECoG maps and find pixel closest to probe RF median
  379. MT_x_ecog_raw = marmo_RFmapData_MT.retmap_x.wholeRFs;
  380. MT_y_ecog_raw = marmo_RFmapData_MT.retmap_y.wholeRFs;
  381. % probe RF medians
  382. medX = median(marmo_RFprobe_MT.retmap_x.wholeRFs( ...
  383. marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh));
  384. medY = median(marmo_RFprobe_MT.retmap_y.wholeRFs( ...
  385. marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh));
  386. % find closest pixels
  387. [~,ix] = min(abs(MT_x_ecog_raw(:) - medX));
  388. [~,iy] = min(abs(MT_y_ecog_raw(:) - medY));
  389. [rowX,colX] = ind2sub(size(MT_x_ecog_raw),ix);
  390. [rowY,colY] = ind2sub(size(MT_y_ecog_raw),iy);
  391. figure('Position',[100 100 700 500])
  392. newColormap = turbo(30);
  393. subplot(1,2,1)
  394. imagesc(MT_x_ecog_raw)
  395. hold on
  396. plot(colX,rowX,'k+','LineWidth',2,'MarkerSize',12)
  397. title('MT ECoG X (raw)')
  398. colormap(newColormap)
  399. colorbar
  400. axis equal
  401. axis off
  402. subplot(1,2,2)
  403. imagesc(MT_y_ecog_raw)
  404. hold on
  405. plot(colY,rowY,'k+','LineWidth',2,'MarkerSize',12)
  406. title('MT ECoG Y (raw)')
  407. colormap(newColormap)
  408. colorbar
  409. axis equal
  410. axis off
  411. sgtitle('Closest RAW ECoG pixels to laminar RF median')
  412. set(gcf,'color','w')
  413. %%
  414. % distance between V1 and MT laminar median RF locations (good + valid channels)
  415. d = hypot( ...
  416. median(marmo_RFprobe_V1.retmap_x.wholeRFs(marmo_RFprobe_V1.isHighSNRCh & marmo_RFprobe_V1.isValidCh)) - ...
  417. median(marmo_RFprobe_MT.retmap_x.wholeRFs(marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh)), ...
  418. median(marmo_RFprobe_V1.retmap_y.wholeRFs(marmo_RFprobe_V1.isHighSNRCh & marmo_RFprobe_V1.isValidCh)) - ...
  419. median(marmo_RFprobe_MT.retmap_y.wholeRFs(marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh)) );
  420. %%
  421. % Purpose: simulate random MT locations and compare to actual V1–MT laminar RF distance
  422. rng(0)
  423. % V1 laminar median RF
  424. xV1 = median(marmo_RFprobe_V1.retmap_x.wholeRFs( ...
  425. marmo_RFprobe_V1.isHighSNRCh & marmo_RFprobe_V1.isValidCh));
  426. yV1 = median(marmo_RFprobe_V1.retmap_y.wholeRFs( ...
  427. marmo_RFprobe_V1.isHighSNRCh & marmo_RFprobe_V1.isValidCh));
  428. % MT laminar median RF
  429. xMT = median(marmo_RFprobe_MT.retmap_x.wholeRFs( ...
  430. marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh));
  431. yMT = median(marmo_RFprobe_MT.retmap_y.wholeRFs( ...
  432. marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh));
  433. % actual distance
  434. d_actual = hypot(xV1-xMT , yV1-yMT);
  435. % MT ECoG map
  436. X = marmo_RFmapData_MT.retmap_x.smoothHighReswholeRFs;
  437. Y = marmo_RFmapData_MT.retmap_y.smoothHighReswholeRFs;
  438. valid = ~isnan(X) & ~isnan(Y);
  439. xvals = X(valid);
  440. yvals = Y(valid);
  441. nIter = 10000;
  442. d_rand = zeros(nIter,1);
  443. for i = 1:nIter
  444. idx = randi(length(xvals));
  445. xr = xvals(idx);
  446. yr = yvals(idx);
  447. d_rand(i) = hypot(xV1-xr , yV1-yr);
  448. end
  449. %% Purpose: plot distribution and report RF distances (deg)
  450. pxPerDeg = marmo_RFprobe_MT.pxPerDeg;
  451. d_actual_deg = d_actual/pxPerDeg;
  452. d_rand_deg = d_rand/pxPerDeg;
  453. figure('Color','w','Position',[100 100 600 450])
  454. clf
  455. h = histogram(d_rand_deg,40,'Normalization','probability');
  456. h.FaceColor = [0.6 0.6 0.6];
  457. h.EdgeColor = 'k';
  458. hold on
  459. hLine = xline(d_actual_deg,'r','LineWidth',3);
  460. xlabel('RF distance (°)','FontSize',12)
  461. ylabel('Probability','FontSize',12)
  462. set(gca,'TickDir','out','FontSize',12,'Box','off')
  463. legend([h hLine],{'Random simulated MT penetrations','Actual penetration'},...
  464. 'Box','off','Location','northeast')
  465. set(gcf,'color','w')
  466. % console output
  467. fprintf('Actual V1–MT RF distance: %.2f deg\n', d_actual_deg)
  468. fprintf('Random MT penetration distance: %.2f ± %.2f deg (mean ± SD)\n', ...
  469. mean(d_rand_deg), std(d_rand_deg))
  470. percentile = mean(d_rand > d_actual) * 100;
  471. fprintf('Actual penetration is better aligned than %.1f%% of random penetrations\n', percentile)
  472. xlim([0 16.5])
  473. % major ticks (labeled)
  474. xticks(0:2:16)
  475. % minor ticks (unlabeled)
  476. ax = gca;
  477. ax.XAxis.MinorTickValues = 1:2:15;
  478. ax.XMinorTick = 'on';
  479. % lock it for PDF export
  480. ax.XTickMode = 'manual';
  481. ax.XMinorTick = 'on';
  482. %%
  483. % Purpose: bootstrap CI for V1–MT RF distance
  484. xV1 = marmo_RFprobe_V1.retmap_x.wholeRFs(marmo_RFprobe_V1.isHighSNRCh & marmo_RFprobe_V1.isValidCh);
  485. yV1 = marmo_RFprobe_V1.retmap_y.wholeRFs(marmo_RFprobe_V1.isHighSNRCh & marmo_RFprobe_V1.isValidCh);
  486. xMT = marmo_RFprobe_MT.retmap_x.wholeRFs(marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh);
  487. yMT = marmo_RFprobe_MT.retmap_y.wholeRFs(marmo_RFprobe_MT.isHighSNRCh & marmo_RFprobe_MT.isValidCh);
  488. rng(0)
  489. nBoot = 10000;
  490. d_boot = zeros(nBoot,1);
  491. for i = 1:nBoot
  492. idxV1 = randi(length(xV1),length(xV1),1);
  493. idxMT = randi(length(xMT),length(xMT),1);
  494. xm1 = median(xV1(idxV1));
  495. ym1 = median(yV1(idxV1));
  496. xm2 = median(xMT(idxMT));
  497. ym2 = median(yMT(idxMT));
  498. d_boot(i) = hypot(xm1-xm2 , ym1-ym2);
  499. end
  500. pxPerDeg = marmo_RFprobe_MT.pxPerDeg;
  501. d_boot_deg = d_boot/pxPerDeg;
  502. d_obs = hypot(median(xV1)-median(xMT) , median(yV1)-median(yMT)) / pxPerDeg;
  503. d_ci = prctile(d_boot_deg,[2.5 97.5]);
  504. fprintf('V1–MT RF distance: %.2f deg (95%% CI %.2f–%.2f)\n', d_obs, d_ci(1), d_ci(2))

Figure_Simulation_MarmoMT_targeting.m, under CC-BY-4.0 · at the source

Overview

Authors: Patrick Jendritza1,2,3,4,5, Rickard Liljemalm6, Thomas Stieglitz7, Pascal Fries1,2,7, Christopher Murphy Lewis1,8
  1. Ernst Strüngmann Institute (ESI) for Neuroscience in Cooperation with Max Planck Society, Deutschordenstraße 46, 60528 Frankfurt, Germany
  2. International Max Planck Research School for Neural Circuits, Max-von-Laue-Straße 4, 60438 Frankfurt, Germany
  3. Else Kröner Fresenius Center for Optogenetic Therapies, University Medical Center Göttingen, Göttingen, Germany
  4. Institute for Auditory Neuroscience, University Medical Center Göttingen, Göttingen, Germany
  5. Visual Circuits & Interfaces group, German Primate Center, Göttingen, Germany
  6. Laboratory for Biomedical Microtechnology, Department of Microsystems Engineering (IMTEK), BrainLinks-BrainTools Center and the Bernstein Center Freiburg, Albert-Ludwigs-Universität Freiburg, 79110 Freiburg, Germany
  7. Max Planck Institute for Biological Cybernetics, Max-Planck-Ring 8, 72076 Tübingen, Germany
  8. Brain Research Institute, University of Zurich, Winterthurerstrasse 190, 8057 Zurich, Switzerland
Journal: Cell reports methods, volume 6, issue 8, article 101481
Dates: received 5 November 2025; accepted 11 May 2026; published online 11 June 2026; in print August 2026
Type: Research article · Language: English
License: CC BY-NC
Identifiers: DOI 10.1016/j.crmeth.2026.101481 · PMID 42276070 · PMCID PMC13494546 · OpenAlex W4405762810
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: extracellular electrophysiology (units, LFP) (modality), intracranial EEG (iEEG / ECoG / SEEG) (modality), rat (organism), other (organism), systems (subfield)
Methods: Spectral & time-frequency, Connectivity, Preprocessing, fMRI & imaging, Single-unit activity, calcium imaging
Keywords: neuroscience, electrocorticography, topography, sensory coding, ECoG, LFP, brain, multimodal, optogenetics, primate
MeSH: Brain*, Brain Mapping*, Electrocorticography*, Animals, Callithrix, Cats, Neurons, Optogenetics, Rats (* major topic)
Topic: Neuroscience and Neural Engineering (Cellular and Molecular Neuroscience, Neuroscience), according to OpenAlex
Funding: Deutsche Forschungsgemeinschaft (DFG) (SPP 1665 FR2557/1-1, FOR 1847 FR2557/2-1, FR2557/5-1-CORNET, FR2557/6-1-NeuroTMR, FR2557/7-1-DualStreams); EU (HEALTH-F2-2008-200728-BrainSynch, FP7-604102-HBP, FP7-600730-Magnetrodes); NIH (1U54MH091657-WU-Minn-Consortium-HCP); LOEWE; NeFF; University of Zurich (K-41220-04)
Citations: not cited yet (Europe PMC); 110 references in the paper

Abstract

Brain function relies on coordinated activity across spatial and temporal scales. Single neurons integrate local and long-range connectivity and reflect activity across brain-wide networks. Understanding integrated brain function requires tools capable of recording from anatomically connected populations in distributed brain areas to bridge local and global dynamics. Here, we present high-density, micro-electrocorticography arrays that facilitate multi-scale studies of brain activity. The hybrid arrays integrate the desirable features of silicone elastomers and polyimide films: silicone provides optical transparency and permits repeated penetration with intracortical arrays, while polyimide enables fine photolithographic feature definition. This combination facilitates high-throughput functional mapping to identify targets and insertion of intracortical arrays for dense local sampling. We demonstrate functional mapping in rats, cats, and marmosets, showing how functional maps guide multi-area laminar recordings. Finally, we demonstrate local and feedforward optogenetic stimulation to investigate cortico-cortical interactions. These capabilities establish the hybrid μECoG as a compelling tool for systems neuroscience.

Reproduced under the paper's license (CC BY-NC), from the paper cited above.

Repositories

Its files are read in the Code ↔ Paper reader above, with 9 matches between paragraphs and lines of code.

dataverse.harvard.edu/dataverse/hybridecog

License: none: the authors keep all their rights
State: unreachable at the last attempt, verified on 29 September 2026
Evidence: found in the paper
Software Heritage: not checked
Found in: “Data and code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 5 checks, the latest on 29 September 2026: unreachable at the last attempt (HTTP 202)
  • 29 September 2026: unreachable at the last attempt (HTTP 202)
  • 28 September 2026: unreachable at the last attempt (HTTP 202)
  • 28 September 2026: unreachable at the last attempt (HTTP 202)
  • 27 September 2026: unreachable at the last attempt (HTTP 202)
  • 27 September 2026: unreachable at the last attempt (HTTP 202)

Zenodo 20089744

License: CC-BY-4.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Size: 1 file
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 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)
24 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;
  • 24 scripts, each with its path and the digest of its content;
  • 9 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 and code availability

• The datasets supporting the current study are available from the corresponding authors on request. • The code supporting the current study is available on Harvard Dataverse (https://dataverse.harvard.edu/dataverse/hybridECoG/) and has been archived at https://doi.org/10.5281/zenodo.20089744. • Any additional information required to re-analyze the data reported in this paper is available from the lead contact upon request.

Reproduced under the paper's license (CC BY-NC), 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, 5 authors, 10 keywords, 9 MeSH terms, 6 funders, 108 references.

Cite

This paper

Jendritza, P., Liljemalm, R., Stieglitz, T., Fries, P., & Lewis, C. M. (2026). A hybrid micro-ECoG for functionally targeted multi-site and multi-scale investigation. Cell reports methods, 6(8), 101481. https://doi.org/10.1016/j.crmeth.2026.101481

BibTeX

@article{jendritza2026hybrid,
author = {Jendritza, Patrick and Liljemalm, Rickard and Stieglitz, Thomas and Fries, Pascal and Lewis, Christopher Murphy},
title = {{A hybrid micro-ECoG for functionally targeted multi-site and multi-scale investigation}},
journal = {Cell reports methods},
year = {2026},
month = jun,
volume = {6},
number = {8},
pages = {101481},
publisher = {Elsevier},
issn = {2667-2375},
doi = {10.1016/j.crmeth.2026.101481},
url = {https://doi.org/10.1016/j.crmeth.2026.101481},
pmid = {42276070},
pmcid = {PMC13494546}
}

RIS

TY - JOUR
AU - Jendritza, Patrick
AU - Liljemalm, Rickard
AU - Stieglitz, Thomas
AU - Fries, Pascal
AU - Lewis, Christopher Murphy
TI - A hybrid micro-ECoG for functionally targeted multi-site and multi-scale investigation
T2 - Cell reports methods
J2 - Cell Rep Methods
PY - 2026
DA - 2026/06/11
VL - 6
IS - 8
SP - 101481
SN - 2667-2375
PB - Elsevier
DO - 10.1016/j.crmeth.2026.101481
UR - https://doi.org/10.1016/j.crmeth.2026.101481
LA - en
ER -

CSL-JSON

{
"id": "10.1016/j.crmeth.2026.101481",
"type": "article-journal",
"title": "A hybrid micro-ECoG for functionally targeted multi-site and multi-scale investigation",
"container-title": "Cell reports methods",
"author": [
{
"family": "Jendritza",
"given": "Patrick"
},
{
"family": "Liljemalm",
"given": "Rickard"
},
{
"family": "Stieglitz",
"given": "Thomas"
},
{
"family": "Fries",
"given": "Pascal"
},
{
"family": "Lewis",
"given": "Christopher Murphy"
}
],
"container-title-short": "Cell Rep Methods",
"volume": "6",
"issue": "8",
"page": "101481",
"DOI": "10.1016/j.crmeth.2026.101481",
"PMID": "42276070",
"PMCID": "PMC13494546",
"ISSN": "2667-2375",
"publisher": "Elsevier",
"URL": "https://doi.org/10.1016/j.crmeth.2026.101481",
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
11
]
]
}
}

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.21203/rs.3.rs-10218667/v1 [code]
Combining ultra-flexible electrodes with two-photon imaging to illuminate brain-wide neural dynamics
Journal: Research Square (preprint)
In common: Statistics and Machine Learning Toolbox, systems, 6 references, author Christopher M. Lewis
[2] doi:10.1038/s41467-026-72444-2 [code]
Broadband synergy versus oscillatory redundancy in the visual cortex.
Journal: Nature communications
In common: Statistics and Machine Learning Toolbox, intracranial EEG (iEEG / ECoG / SEEG), extracellular electrophysiology (units, LFP), systems, 6 references
[3] doi:10.1038/s41467-026-71725-0 [code]
Interactions across hemispheres in prefrontal cortex reflect global cognitive processing.
Journal: Nature communications
In common: Image Processing Toolbox, Signal Processing Toolbox, Statistics and Machine Learning Toolbox, 6 references
[4] doi:10.1111/ejn.70582 [code]
Multifiber Array-Based Photometry System for Multiregional Functional Mapping in the Mouse Brain.
Journal: The European journal of neuroscience
In common: systems, 8 references
[5] doi:10.1016/j.isci.2026.116728 [code]
Awake cortex stabilizes traveling waves for global and reliable information routing.
Journal: iScience
In common: shadedErrorBar, Image Processing Toolbox, Signal Processing Toolbox, 1 other tool, 4 references
[6] doi:10.1093/nsr/nwag420 [code]
Constructing mesoscale functionomics by neural dynamics subspace clustering.
Journal: National science review
In common: Statistics and Machine Learning Toolbox, systems, 6 references
[7] doi:10.1038/s41467-026-73622-y [code]
Contextual gating of whisker-evoked responses by frontal cortex supports flexible decision making.
Journal: Nature communications
In common: Image Processing Toolbox, Signal Processing Toolbox, Statistics and Machine Learning Toolbox, 4 references
[8] doi:10.7554/elife.109717 [code]
Retrosplenial cortex enables context-dependent goal-directed sensorimotor transformation.
Journal: eLife
In common: Statistics and Machine Learning Toolbox, systems, 5 references
[9] doi:10.1038/s41593-026-02350-9 [code]
Probing inter-areal computations with a two-photon holographic mesoscope.
Journal: Nature neuroscience
In common: Image Processing Toolbox, Statistics and Machine Learning Toolbox, systems, 4 references
[10] doi:10.1038/s41592-026-03154-2 [code]
Simultaneous single-cell calcium imaging of neuronal population activity and brain-wide BOLD fMRI.
Journal: Nature methods
In common: Image Processing Toolbox, Signal Processing Toolbox, Statistics and Machine Learning Toolbox, 3 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

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.