OSCR

Intravital calcium imaging of meningeal macrophages reveals niche-specific dynamics and aberrant responses to brain hyperexcitability.

Code ↔ Paper

20 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 20 matches · 8 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
  1. [1] § Methods › Quantification and statistical analysis › General linear models ↔ GLM_LocoFluorescence.m, lines 47–170 · score 0.79 · GLMnet, temporal shift, frame rate, locomotion state, fluorescence, Gaussian
  2. [2] § Methods › Quantification and statistical analysis › Clustering of Ca2+ dynamics ↔ clusterCa2Signals.m, lines 43–87 · score 0.78 · peak prominence, Fourier Transform, dominant frequency, Elbow, smooth, optimal
  3. [3] § Methods › Quantification and statistical analysis › General linear models ↔ GLM_2_DiamFluorescence.m, lines 48–183 · score 0.77 · GLMnet, temporal shift, frame rate, fluorescence, Gaussian, trained
  4. [4] § Results › Characterizing macrophage Ca2+ signaling features in homeostatic brain meninges ↔ clusterCa2Signals.m, lines 43–87 · score 0.71 · Power spectrum density, frequency domain features, peak detection, PSD, Clustering, square
  5. [5] § Results › An acute aberrant pro-inflammatory brain hyperexcitability event drives diverse Ca2+ dynamics in meningeal macrophages ↔ chiSquare_residuals.m, the whole file · a weak match · score 0.70 · Chi square, persistent increase, persistent decrease, acute increase, PreCSD, post CSD
  6. [6] § Methods › Quantification and statistical analysis › Analysis of locomotion ↔ TrainLocoHMM.m, lines 1–56 · score 0.69 · Hidden Markov Model, locomotion state, cm, trained, velocity, speed
  7. [7] § Methods › Quantification and statistical analysis › Analysis of locomotion ↔ GetLocoState.m, the whole file · a weak match · score 0.69 · Hidden Markov Model, locomotion state, hmmviterbi, trained, velocity, speed
  8. [8] § Methods › Quantification and statistical analysis › Analysis of CSD-related changes in macrophage Ca2+ dynamics ↔ clusterParams_CSD.m, the whole file · a weak match · score 0.66 · duringCSD, postCSD, preCSD, event rate, phases, acute
  9. [9] § Methods › Quantification and statistical analysis › Analysis of CSD-related changes in macrophage Ca2+ dynamics ↔ classifyEventRatesCSD2.m, the whole file · a weak match · score 0.66 · duringCSD, postCSD, preCSD, event rate, phases, cell
  10. [10] § Results › An acute aberrant pro-inflammatory brain hyperexcitability event drives diverse Ca2+ dynamics in meningeal macrophages ↔ AQuA2_6_Waves_CSD.m, lines 28–79 · score 0.66 · postCSD, preCSD, CSD event, wave, event rate, acute
  11. [11] § Results › An acute aberrant pro-inflammatory brain hyperexcitability event drives diverse Ca2+ dynamics in meningeal macrophages ↔ clusterWaves_eventRate6_CSD.m, the whole file · a weak match · score 0.65 · postCSD, preCSD, CSD event, wave, event rate, acute
  12. [12] § Methods › Quantification and statistical analysis › Vascular signals ↔ GetVesselProfile.m, the whole file · a weak match · score 0.64 · vessel profile, Radon transform, polygons, pixels, ROI
  13. [13] § Results › Dural perivascular macrophage Ca2+ activity is tuned to behaviorally driven dural vasomotion ↔ plotGLM_locoDiamFluor.m, lines 7–128 · score 0.56 · fluorescence signal, deviance explained, locomotion state, GLM, model, zero
  14. [14] § Results › An acute aberrant pro-inflammatory brain hyperexcitability event drives diverse Ca2+ dynamics in meningeal macrophages ↔ AQuA2_6_Waves_CSD.m, lines 28–79 · score 0.55 · Chi square, acute response, preCSD, post CSD, NP, bar
  15. [15] § Results › CGRP receptor signaling mediates CSD-evoked persistent increase in meningeal macrophage Ca2+ activity ↔ plotRasterByCluster.m, the whole file · a weak match · score 0.54 · acute increase, preCSD, post CSD, raster, event rate, BIBN
  16. [16] § Results › Characterizing macrophage Ca2+ signaling features in homeostatic brain meninges ↔ AQuA2_5_cellNetwork_multiExpt_CSD.m, lines 487–526 · score 0.52 · concurrent events, simultaneous event, networks, distances, delay, duration
  17. [17] § Results › Characterizing macrophage Ca2+ signaling features in homeostatic brain meninges ↔ plotFFT.m, the whole file · a weak match · score 0.52 · frequency spectra, dominant frequency, magnitude, noise, signal
  18. [18] § Methods › Quantification and statistical analysis › Ca2+ signal detection pipeline ↔ AQuA2_5_cellNetwork_multiExpt_baseline.m, lines 373–420 · score 0.51 · spatial resolution, AQuA2, pixel, propagation, event, cell
  19. [19] § Methods › Quantification and statistical analysis › Statistical analysis ↔ AQuA2_6_Waves.m, lines 93–177 · score 0.51 · Mann Whitney, Chi square, sum
  20. [20] § Methods › Quantification and statistical analysis › Statistical analysis ↔ AQuA2_6_Waves_CSD.m, lines 569–650 · score 0.51 · Mann Whitney, Chi square, sum

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 · 689 lines · 27 KB · GPL-3.0 · 3 matches

  1. %% create clusters based on preCSD x duringCSD and preCSD x postCSD response
  2. clear all;
  3. experiment = input('CSD or BIBN-CSD?: ', 's'); % 's' means input as string
  4. durationCSDmin = input('Enter duration of duringCSD in minutes (1 or 2): ');
  5. if strcmp(experiment, 'CSD')
  6. load('D:\2photon\Simone\Simone_Macrophages\AQuA2_Results\fullCraniotomy\CSD\corrected_for_pinprick\0.49resolution_correct\AQuA2_data_fullCraniotomy_CSD.mat');
  7. if durationCSDmin == 1 %due to mismatch of combinedTable and eventHz_byCell, which filters out events that happen after 61min
  8. toRemove = [22,23,40,80,81,90,100,129,143,144,145,214,215,216,233,248,249,250];
  9. combinedTable_complete(toRemove, :) = [];
  10. elseif durationCSDmin == 2 %due to mismatch of combinedTable and eventHz_byCell, which filters out events that happen after 62min
  11. toRemove = [22,23,40,80,81,100,129,144,145,214,215,216,233,248,249,250];
  12. combinedTable_complete(toRemove, :) = [];
  13. end
  14. elseif strcmp(experiment, 'BIBN-CSD')
  15. if durationCSDmin == 1
  16. load('D:\2photon\Simone\Simone_Macrophages\AQuA2_Results\fullCraniotomy\BIBN\AQuA2_data_fullCraniotomy_BIBN_CSD-1min-duringCSD.mat');
  17. toRemove = 43;
  18. combinedTable_complete(toRemove, :) = [];
  19. elseif durationCSDmin == 2
  20. load('D:\2photon\Simone\Simone_Macrophages\AQuA2_Results\fullCraniotomy\BIBN\AQuA2_data_fullCraniotomy_BIBN-CSD_2min-duringCSD.mat');
  21. toRemove = 43; %same as 1min-duringCSD
  22. combinedTable_complete(toRemove, :) = [];
  23. end
  24. end
  25. %% CLUSTER BY EVENT RATE (9)
  26. %
  27. % % Extract cell types and cluster CSD events
  28. % cellTypes = combinedTable_complete{:, 13};
  29. % cells = ["cells"; "perivascular"; "non-perivascular"];
  30. %
  31. % % 9 clusters
  32. % [eventRate_directions, eventRate_directionCounts, eventRate_directionLabels, eventRate_clusterID, rates_mHz, rates_mHz_clusterID] = clusterWaves_eventRate9_CSD(eventHz_byCell, cellTypes);
  33. % eventRate_clusters = [eventRate_directions; eventRate_directionCounts];
  34. % eventRate_clusters = [eventRate_clusters, cells];
  35. %
  36. % combinedTable_clusters = addvars(combinedTable_complete, eventRate_clusterID, 'NewVariableNames', 'eventRate_clusterID');
  37. %
  38. % % Assuming rates_mHz is Nx3 (columns: preCSD, duringCSD, postCSD)
  39. % combinedTable_clusters = addvars(combinedTable_clusters, ...
  40. % rates_mHz(:,1), rates_mHz(:,2), rates_mHz(:,3), ...
  41. % 'NewVariableNames', {'eventRate_preCSD', 'eventRate_duringCSD', 'eventRate_postCSD'});
  42. %
  43. % rates_mHz_clusterID_sorted = sortrows(rates_mHz_clusterID, 4); % descending sort by column 4
  44. %
  45. % % Chi-square - comparing the distribution between perivascular vs non-perivascular for each cluster
  46. % [p_values_byCluster, stats_byCluster] = chi_square_plot(eventRate_directionCounts);
  47. %
  48. % % Run Chi-square test of independence - testing whether cluster and cell type are independent
  49. % [~, p_values_All, stats_All] = chi2gof_from_table(eventRate_directionCounts);
  50. %
  51. % % Chi-square test by ACUTE response
  52. % [p_values_Acute, stats_Acute] = chi_square_by_acuteResponse(eventRate_directionCounts, 3);
  53. %
  54. % % Chi-square test by CHRONIC response
  55. % [p_values_Chronic, stats_Chronic] = chi_square_by_chronicResponse(eventRate_directionCounts);
  56. %
  57. % % Plot heatmap of conditional probabilities (3x3)
  58. % [All_matrix, P_matrix, NP_matrix] = plotConditionalProbabilities(eventRate_directionCounts, outputDir);
  59. %
  60. % Distributions
  61. % Plot distribution Cell type x Cluster
  62. [clustersPercentage, roundedData] = plotClusterDistributionByCellType(eventRate_clusters, eventRate_directions, cells, outputDir);
  63. % Plot distribution clusters x FOV
  64. plotFOVDistributionByCluster(combinedTable_clusters, outputDir);
  65. % Plot distribution FOV x cluster
  66. plotClusterDistributionByFOV(combinedTable_clusters, outputDir);
  67. %
  68. % %create heatmap
  69. % plotClusterHeatmap_FOVnormalized(combinedTable_clusters, [1:9], sortedFileNames, outputDir); %[1,2, 5:9] BIBN by FOV
  70. % plotClusterHeatmap_zscore(combinedTable_clusters, [2,4,9], outputDir); %[1,2,3,1,4,7,3,6,9]
  71. %
  72. % % stacked bars
  73. % probs = compute_Clusterwise_probabilities(eventRate_directionCounts);
  74. % plotStackedDirectionGroups(eventRate_directionCounts, outputDir)
  75. %% CLUSTER by EVENT RATE (6)
  76. % Extract cell types and cluster CSD events
  77. cellTypes = combinedTable_complete{:, 13};
  78. cells = ["cells"; "perivascular"; "non-perivascular"];
  79. % 6 cluster
  80. [eventRate_directions, eventRate_directionCounts, eventRate_directionLabels, eventRate_clusterID, rates_mHz, rates_mHz_clusterID] = clusterWaves_eventRate6_CSD(eventHz_byCell, cellTypes);
  81. eventRate_clusters = [eventRate_directions; eventRate_directionCounts];
  82. eventRate_clusters = [eventRate_clusters, cells];
  83. combinedTable_clusters = addvars(combinedTable_complete, eventRate_clusterID, 'NewVariableNames', 'eventRate_clusterID');
  84. %
  85. % cluster6 = [];
  86. % for cell = 1:size(combinedTable_clusters,2)
  87. % if combinedTable_clusters.eventRate_clusterID(cell) == 6
  88. % cellID = [combinedTable_clusters.("Cell ID")(cell); combinedTable_clusters.("Number of Events")(cell); combinedTable_clusters.fileNameColumn(cell); combinedTable_clusters.("eventRate_clusterID")(cell)];
  89. % cluster6 = [cluster6; cellID];
  90. % end
  91. % end
  92. % Find rows where eventRate_clusterID == 6
  93. mask = combinedTable_clusters.eventRate_clusterID == 6;
  94. % Extract relevant columns into a new table
  95. cluster6 = combinedTable_clusters(mask, ...
  96. {'Cell ID','Number of Events','fileNameColumn','eventRate_clusterID'});
  97. % % Example 1: Acute Increase
  98. % AcuteIncrease = [7 7; 3 4];
  99. % plotChi2Residuals(AcuteIncrease, {'P','NP'}, {'Persistent Increase','Persistent Decrease'});
  100. %
  101. % % Example 2: Persistent Increase
  102. % PersistentIncrease = [7 11; 3 34];
  103. % plotChi2Residuals(PersistentIncrease, {'P','NP'}, {'Acute Increase','Acute No Change'});
  104. %
  105. % % Example 3: Persistent Decrease
  106. % PersistentDecrease = [7 25; 4 110];
  107. % plotChi2Residuals(PersistentDecrease, {'P','NP'}, {'Acute Increase','Acute No Change'});
  108. %
  109. % max dFF during CSD
  110. preCSD_maxDFF = table2cell(paramTables_allPhases.Max_dFF(:,2));
  111. duringCSD_maxDFF = table2cell(paramTables_allPhases.Max_dFF(:,3));
  112. postCSD_maxDFF = table2cell(paramTables_allPhases.Max_dFF(:,4));
  113. % Assuming rates_mHz is Nx3 (columns: preCSD, duringCSD, postCSD)
  114. combinedTable_clusters = addvars(combinedTable_clusters, ...
  115. rates_mHz(:,1), rates_mHz(:,2), rates_mHz(:,3), preCSD_maxDFF, duringCSD_maxDFF, postCSD_maxDFF,...
  116. 'NewVariableNames', {'eventRate_preCSD', 'eventRate_duringCSD', 'eventRate_postCSD', 'preCSD_maxDFF', 'duringCSD_maxDFF', 'postCSD_maxDFF'});
  117. preCSD_maxDFF_all = [];
  118. for x = 1:size(combinedTable_clusters,1)
  119. if ismember(combinedTable_clusters.eventRate_clusterID(x), [3 6])
  120. preCSD_maxDFF_x = combinedTable_clusters.preCSD_maxDFF(x);
  121. preCSD_maxDFF_all = [preCSD_maxDFF_all; preCSD_maxDFF_x];
  122. end
  123. end
  124. duringCSD_maxDFF_all = [];
  125. for x = 1:size(combinedTable_clusters,1)
  126. if ismember(combinedTable_clusters.eventRate_clusterID(x), [1 2 3])
  127. duringCSD_maxDFF_x = combinedTable_clusters.duringCSD_maxDFF(x);
  128. duringCSD_maxDFF_all = [duringCSD_maxDFF_all; duringCSD_maxDFF_x];
  129. end
  130. end
  131. postCSD_maxDFF_all = [];
  132. for x = 1:size(combinedTable_clusters,1)
  133. if ismember(combinedTable_clusters.eventRate_clusterID(x), [3 6])
  134. postCSD_maxDFF_x = combinedTable_clusters.postCSD_maxDFF(x);
  135. postCSD_maxDFF_all = [postCSD_maxDFF_all; postCSD_maxDFF_x];
  136. end
  137. end
  138. % % without separating by cell type
  139. % rate_cluster_acuteIncrease = []; %2
  140. % rate_cluster_chronicIncrease = []; %4
  141. % rate_cluster_chronicDecrease = []; %6
  142. %
  143. % rate_cluster_AllacuteIncrease = []; %1,2,3
  144. % rate_cluster_AllchronicIncrease = []; %1,4
  145. % rate_cluster_AllchronicDecrease = []; %3,6
  146. %
  147. % for cellCluster = 1:size(rates_mHz, 1)
  148. % clusterID = combinedTable_clusters.eventRate_clusterID(cellCluster);
  149. % currentCell_rate = rates_mHz(cellCluster, :); % row vector
  150. % cellType = cellTypes(cellCluster);
  151. %
  152. % % Individual clusters
  153. % if clusterID == 2
  154. % rate_cluster_acuteIncrease = [rate_cluster_acuteIncrease; [currentCell_rate, cellType]];
  155. % end
  156. % if clusterID == 4
  157. % rate_cluster_chronicIncrease = [rate_cluster_chronicIncrease; [currentCell_rate, cellType]];
  158. % end
  159. % if clusterID == 6
  160. % rate_cluster_chronicDecrease = [rate_cluster_chronicDecrease; [currentCell_rate, cellType]];
  161. % end
  162. %
  163. % % Combined clusters
  164. % if ismember(clusterID, [1,2,3])
  165. % rate_cluster_AllacuteIncrease = [rate_cluster_AllacuteIncrease; [currentCell_rate, cellType]];
  166. % end
  167. % if ismember(clusterID, [1, 4])
  168. % rate_cluster_AllchronicIncrease = [rate_cluster_AllchronicIncrease; [currentCell_rate, cellType]];
  169. % end
  170. % if ismember(clusterID, [3, 6])
  171. % rate_cluster_AllchronicDecrease = [rate_cluster_AllchronicDecrease; [currentCell_rate, cellType]];
  172. % end
  173. % end
  174. % === Initialize ===
  175. rate_cluster_acuteIncrease_peri = [];
  176. rate_cluster_acuteIncrease_nonperi = [];
  177. rate_cluster_chronicIncrease_peri = [];
  178. rate_cluster_chronicIncrease_nonperi = [];
  179. rate_cluster_chronicDecrease_peri = [];
  180. rate_cluster_chronicDecrease_nonperi = [];
  181. rate_cluster_AllacuteIncrease_peri = [];
  182. rate_cluster_AllacuteIncrease_nonperi = [];
  183. rate_cluster_AllchronicIncrease_peri = [];
  184. rate_cluster_AllchronicIncrease_nonperi = [];
  185. rate_cluster_AllchronicDecrease_peri = [];
  186. rate_cluster_AllchronicDecrease_nonperi = [];
  187. % === Loop through each cell ===
  188. for cellCluster = 1:size(rates_mHz, 1)
  189. clusterID = combinedTable_clusters.eventRate_clusterID(cellCluster);
  190. currentCell_rate = rates_mHz(cellCluster, :); % row vector
  191. cellType = cellTypes(cellCluster); % 0 = peri, 2 = non-peri
  192. % --- Individual clusters ---
  193. if clusterID == 2
  194. if cellType == 0
  195. rate_cluster_acuteIncrease_peri = [rate_cluster_acuteIncrease_peri; currentCell_rate];
  196. elseif cellType == 2
  197. rate_cluster_acuteIncrease_nonperi = [rate_cluster_acuteIncrease_nonperi; currentCell_rate];
  198. end
  199. elseif clusterID == 4
  200. if cellType == 0
  201. rate_cluster_chronicIncrease_peri = [rate_cluster_chronicIncrease_peri; currentCell_rate];
  202. elseif cellType == 2
  203. rate_cluster_chronicIncrease_nonperi = [rate_cluster_chronicIncrease_nonperi; currentCell_rate];
  204. end
  205. elseif clusterID == 6
  206. if cellType == 0
  207. rate_cluster_chronicDecrease_peri = [rate_cluster_chronicDecrease_peri; currentCell_rate];
  208. elseif cellType == 2
  209. rate_cluster_chronicDecrease_nonperi = [rate_cluster_chronicDecrease_nonperi; currentCell_rate];
  210. end
  211. end
  212. % --- Combined clusters ---
  213. if ismember(clusterID, [1, 2, 3]) % All acute increase
  214. if cellType == 0
  215. rate_cluster_AllacuteIncrease_peri = [rate_cluster_AllacuteIncrease_peri; currentCell_rate];
  216. elseif cellType == 2
  217. rate_cluster_AllacuteIncrease_nonperi = [rate_cluster_AllacuteIncrease_nonperi; currentCell_rate];
  218. end
  219. end
  220. if ismember(clusterID, [1, 4]) % All chronic increase
  221. if cellType == 0
  222. rate_cluster_AllchronicIncrease_peri = [rate_cluster_AllchronicIncrease_peri; currentCell_rate];
  223. elseif cellType == 2
  224. rate_cluster_AllchronicIncrease_nonperi = [rate_cluster_AllchronicIncrease_nonperi; currentCell_rate];
  225. end
  226. end
  227. if ismember(clusterID, [3, 6]) % All chronic decrease
  228. if cellType == 0
  229. rate_cluster_AllchronicDecrease_peri = [rate_cluster_AllchronicDecrease_peri; currentCell_rate];
  230. elseif cellType == 2
  231. rate_cluster_AllchronicDecrease_nonperi = [rate_cluster_AllchronicDecrease_nonperi; currentCell_rate];
  232. end
  233. end
  234. end
  235. % Initialize group labels
  236. eventRateGroup = strings(height(combinedTable_clusters), 1);
  237. % Assign group based on event rate
  238. eventRateGroup(combinedTable_clusters.eventRate_preCSD == 0) = "0";
  239. eventRateGroup(combinedTable_clusters.eventRate_preCSD > 0 & combinedTable_clusters.eventRate_preCSD <= 1) = "0-1";
  240. eventRateGroup(combinedTable_clusters.eventRate_preCSD > 1) = ">1";
  241. % Convert to categorical
  242. combinedTable_clusters.eventRateGroup = categorical(eventRateGroup, {'0', '0-1', '>1'});
  243. % Use groupcounts on the new categorical variable
  244. groupCounts = groupcounts(combinedTable_clusters.eventRateGroup);
  245. total = sum(groupCounts);
  246. groupPercents = 100 * groupCounts / total;
  247. % Plot heatmap of conditional probabilities (3x3)
  248. [All_matrix, P_matrix, NP_matrix] = plotCluster6Distribution(eventRate_directionCounts, outputDir);
  249. %% CLUSTER by EVENT COUNT (6)
  250. % cellTypes = combinedTable_complete{:, 13};
  251. % cells = ["cells"; "perivascular"; "non-perivascular"];
  252. % [eventCounts_directions, eventCounts_directionCounts, eventCounts_directionLabels, counts_clusterID, eventCounts, eventCounts_clusterID] = clusterWaves_eventCount6_CSD(events_byCell_all, cellTypes);
  253. % eventCounts_clusters = [eventCounts_directions; eventCounts_directionCounts];
  254. % eventCounts_clusters = [eventCounts_clusters, cells];
  255. %
  256. % combinedTable_clusters = addvars(combinedTable_complete, counts_clusterID, 'NewVariableNames', 'counts_clusterID');
  257. %
  258. % % Plot heatmap of conditional probabilities (3x3)
  259. % [All_matrix, P_matrix, NP_matrix] = plotCluster6Distribution(eventCounts_directionCounts, outputDir);
  260. %% CLUSTER BY dFF (9)
  261. % cellTypes = combinedTable_complete{:, 13};
  262. % cells = ["cells"; "perivascular"; "non-perivascular"];
  263. % [dFF_directions, dFF_directionCounts, dFF_directionLabels, dFF_clusterID, phaseParams_dFF] = clusterParams_CSD(paramTables_allPhases, cellTypes);
  264. % dFF_clusters = [dFF_directions; dFF_directionCounts];
  265. % dFF_clusters = [dFF_clusters, cells];
  266. %
  267. % combinedTable_clusters = addvars(combinedTable_clusters, dFF_clusterID, 'NewVariableNames', 'dFF_clusterID');
  268. %
  269. % % Convert vectors to tables
  270. % T_eventRate = table(eventRate_clusterID, 'VariableNames', {'eventRate_clusterID'});
  271. % T_dFF = table(dFF_clusterID, 'VariableNames', {'dFF_clusterID'});
  272. %
  273. % dFF_clustersTable = [T_eventRate, T_dFF, phaseParams_dFF];
  274. %
  275. %
  276. % dFFcluster_acuteIncrease = []; %2
  277. % dFFcluster_chronicIncrease = []; %4
  278. % dFFcluster_chronicDecrease = []; %6
  279. %
  280. % dFFcluster_AllchronicIncrease = []; %1,4
  281. % dFFcluster_AllchronicDecrease = []; %3,6
  282. %
  283. %
  284. % for cellCluster = 1:size(phaseParams_dFF, 1)
  285. % clusterID = dFF_clustersTable.eventRate_clusterID(cellCluster);
  286. % currentCell_dFF = phaseParams_dFF(cellCluster, :); % row vector
  287. %
  288. % % Individual clusters
  289. % if clusterID == 2
  290. % dFFcluster_acuteIncrease = [dFFcluster_acuteIncrease; currentCell_dFF];
  291. % end
  292. % if clusterID == 4
  293. % dFFcluster_chronicIncrease = [dFFcluster_chronicIncrease; currentCell_dFF];
  294. % end
  295. % if clusterID == 6
  296. % dFFcluster_chronicDecrease = [dFFcluster_chronicDecrease; currentCell_dFF];
  297. % end
  298. %
  299. % % Combined clusters
  300. % if ismember(clusterID, [1, 4])
  301. % dFFcluster_AllchronicIncrease = [dFFcluster_AllchronicIncrease; currentCell_dFF];
  302. % end
  303. % if ismember(clusterID, [3, 6])
  304. % dFFcluster_AllchronicDecrease = [dFFcluster_AllchronicDecrease; currentCell_dFF];
  305. % end
  306. % end
  307. %% Cluster 3x2 (up, none, down - acute & chronic)
  308. % cellTypes = combinedTable_complete{:, 13};
  309. % cells = ["cells"; "P"; "NP"];
  310. % [directions, acuteLabels, chronicLabels, acuteIDs, chronicIDs, acuteCounts, chronicCounts, rates_mHz] = clusterWaves_CSD_acute_chronic(eventHz_byCell, cellTypes);
  311. %
  312. % clustersAcute = [directions; acuteCounts];
  313. % clustersAcute = [clustersAcute, cells];
  314. % clustersChronic = [directions; chronicCounts];
  315. % clustersChronic = [clustersChronic, cells];
  316. %
  317. % combinedTable_clustersAcute = addvars(combinedTable_complete, acuteIDs, 'NewVariableNames', 'acuteIDs');
  318. % combinedTable_clustersChronic = addvars(combinedTable_complete, chronicIDs, 'NewVariableNames', 'chronicIDs');
  319. %
  320. % % Chi-square - comparing the distribution between perivascular vs non-perivascular for each cluster
  321. % [p_values_byCluster_acute, stats_byCluster_acute] = chi_square_plot(acuteCounts);
  322. % [p_values_byCluster_chronic, stats_byCluster_chronic] = chi_square_plot(chronicCounts);
  323. %
  324. % % Run Chi-square test of independence - testing whether cluster and cell type are independent
  325. % [~, p_values_All_acute, stats_All_acute] = chi2gof_from_table(acuteCounts);
  326. % [~, p_values_All_chronic, stats_All_chronic] = chi2gof_from_table(chronicCounts);
  327. %
  328. % % Distribution Cell type x Cluster
  329. % [clustersPercentage_acute, roundedData_acute] = plotClusterDistributionByCellType(clustersAcute, directions, cells, outputDir);
  330. % figure; bar(roundedData_acute,'stacked','DisplayName','roundedData_acute')
  331. % legend(directions); xticklabels(cells(2:3)); title('Acute response by cell type')
  332. %
  333. % [clustersPercentage_chronic, roundedData_chronic] = plotClusterDistributionByCellType(clustersChronic, directions, cells, outputDir);
  334. % figure; bar(roundedData_chronic,'stacked','DisplayName','roundedData_chronic')
  335. % legend(directions); xticklabels(cells(2:3)); title('Chronic response by cell type')
  336. %
  337. % % Heatmaps ACUTE vs CHRONIC
  338. % plotClusterHeatmap_zscore(combinedTable_clustersAcute, 1:2);
  339. % plotClusterHeatmap_zscore(combinedTable_clustersChronic, 1:2);
  340. %
  341. % % Compare baseline between chronic clusters %1,4,7x3,6,9
  342. % preHz = str2double(eventHz_byCell(:, 2));
  343. % preHz_cluster = [preHz, combinedTable_clusters.eventRate_clusterID];
  344. % compareBaselineRates(preHz, acuteIDs, chronicIDs)
  345. %% EVENT raster plot
  346. % Process startingFrames for raster plot
  347. allEmpty = all(cellfun(@isempty, startingFrames_byCell_all(:, 2:5)), 2);
  348. startingFrames_byCell_all(allEmpty, :) = []; %% Remove rows where all event phases are empty
  349. % Step 1: Flatten nested cells inside columns 2 to 5
  350. flattenedData = startingFrames_byCell_all;
  351. for i = 1:size(flattenedData, 1)
  352. for j = 2:5
  353. val = flattenedData{i, j};
  354. if iscell(val)
  355. % If it's a cell, convert to numeric vector
  356. try
  357. flattenedData{i, j} = cell2mat(val);
  358. catch
  359. flattenedData{i, j} = [];
  360. end
  361. end
  362. end
  363. end
  364. % Step 2: Convert to table
  365. startingFrames_table = cell2table(flattenedData, ...
  366. 'VariableNames', {'cellID', 'preCSD', 'duringCSD', 'postCSD', 'baseline_preCSD'});
  367. % Convert clusterID column to a table
  368. clusterID_table = table(combinedTable_clusters.eventRate_clusterID(:), 'VariableNames', {'eventRate_clusterID'});
  369. dFF_table = table(combinedTable_clusters.dFF(:), 'VariableNames', {'dFF'});
  370. % Horizontally concatenate the tables
  371. rasterTable = [startingFrames_table, clusterID_table, dFF_table];
  372. rasterTable_sorted = plotRasterByCluster(rasterTable, [2,4,6], experiment);
  373. %%
  374. load('D:\2photon\Simone\Simone_Macrophages\AQuA2_Results\fullCraniotomy\CSD\corrected_for_pinprick\0.49resolution_correct\AQuA2_data_fullCraniotomy_CSD.mat')
  375. cellLocation_indices = combinedTable{:,13};
  376. redLabel_indices = combinedTable{:,14};
  377. % By cell type
  378. perivascular_indices = cellLocation_indices == 0;
  379. nonPerivascular_indices = cellLocation_indices == 2;
  380. combinedTable_perivascular = combinedTable(perivascular_indices,:);
  381. combinedTable_nonPerivascular = combinedTable(nonPerivascular_indices,:);
  382. % dFF
  383. dFF_all = cell2mat(combinedTable.dFF); % Convert to matrix
  384. dFF_perivascular = cell2mat(combinedTable_perivascular.dFF);
  385. dFF_nonPerivascular = cell2mat(combinedTable_nonPerivascular.dFF);
  386. Fs = 1.03; % Sampling frequency
  387. %%
  388. combinedTable_sorted = sortrows(combinedTable, 'Max dFF', 'descend');
  389. dFF_all_sorted = cell2mat(combinedTable_sorted.dFF); % Convert to matrix
  390. dFF_all_sorted_preCSD = dFF_all_sorted(:, 1:1854);
  391. dFF_all_sorted_duringCSD = dFF_all_sorted(:, 1855:1917); %60sec
  392. dFF_all_sorted_postCSD = dFF_all_sorted(:, 1918:3772);
  393. %dFF_all_sorted(38,:) = [];
  394. %dFF_check = dFF_all_sorted(:, 1700:2000);
  395. combinedTable_perivascular_sorted = sortrows(combinedTable_perivascular, 'Max dFF', 'descend');
  396. dFF_perivascular_sorted = cell2mat(combinedTable_perivascular_sorted.dFF);
  397. combinedTable_nonPerivascular_sorted = sortrows(combinedTable_nonPerivascular, 'Max dFF', 'descend');
  398. dFF_nonPerivascular_sorted = cell2mat(combinedTable_nonPerivascular_sorted.dFF);
  399. sortedMatrix = sortrows(dFF_all_sorted, 1855, "descend");
  400. %% plot heatmap for quick visualization
  401. minData = min(sortedMatrix(:));
  402. maxData = max(sortedMatrix(:));
  403. % all
  404. figure;
  405. imagesc(sortedMatrix);
  406. caxis([minData, maxData]);
  407. colormap(flipud(gray));
  408. colorbar;
  409. % sorte
  410. figure;
  411. imagesc(dFF_perivascular_sorted);
  412. caxis([minData, maxData]);
  413. colormap(flipud(gray));
  414. colorbar;
  415. % perivascular
  416. figure;
  417. imagesc(dFF_perivascular);
  418. caxis([minData, maxData]);
  419. colormap(flipud(gray));
  420. colorbar;
  421. % sorte
  422. figure;
  423. imagesc(dFF_perivascular_sorted);
  424. caxis([minData, maxData]);
  425. colormap(flipud(gray));
  426. colorbar;
  427. % non-perivascular
  428. figure;
  429. imagesc(dFF_nonPerivascular);
  430. caxis([minData, maxData]);
  431. colormap(flipud(gray));
  432. colorbar;
  433. % sorted
  434. figure;
  435. imagesc(dFF_nonPerivascular_sorted(1:65,:));
  436. caxis([minData, maxData]);
  437. colormap(flipud(gray));
  438. colorbar;
  439. %% Plot selected waves
  440. plotSelectedWaves_together(combinedTable, [88, 265, 330, 451], 'my_figure.eps');
  441. %% Categorize waves based on frequency, duration and amplitude of events
  442. cellTable = categorize_waves(combinedTable);
  443. %% Plot all curves
  444. %saveFolder = 'D:\2photon\Simone\Simone_Macrophages\AQuA2_Results\fullCraniotomy\baseline\dFF_waves';
  445. plot_dFF_waves(combinedTable, saveFolder, false);
  446. %% Visualize FFT - Fast Fourier Transformation
  447. % for each cell
  448. for w = 1:2 %size(dFF_all, 1)
  449. plotFFT(dFF_all(w, :), Fs);
  450. end
  451. for w = 1:5 %size(dFF_all, 1)
  452. normalized_signal = zscore(dFF_all(w,:));
  453. plotFFT(normalized_signal, Fs);
  454. end
  455. % for all cells
  456. plotFFT_all(dFF_all, Fs); % dFF_all is your matrix of signals for all cells
  457. %% 1.Cluster based on wave shape
  458. maxClusters = 10; % Test up to 10 clusters
  459. optimalK = findOptimalClusters(dFF_all, maxClusters);
  460. [idx, count_k1, count_k2] = clusterWaves(dFF_all, optimalK);
  461. %% 2. Cluster based on SNR
  462. % Compute SNR
  463. snr_ma = computeSNR(dFF_all_sorted, 'ma', 5); % Using a window size of 5
  464. snr_fft = computeSNR(dFF_all_sorted, 'fft', 0.2); % Using 20% of frequencies as the cutoff
  465. maxClusters = 10; % Test up to 10 clusters
  466. [idx, clustered_cells, optimalK, count_k1, count_k2] = clusterSNR(snr_ma, maxClusters, dFF_all_sorted); % Use snr_ma or snr_fft
  467. %% 3. Cluster based on detrend, sgolayfilt, kmeans
  468. % https://www-science-org.ezp-prod1.hul.harvard.edu/doi/pdf/10.1126/scisignal.abe6909
  469. % 1. Apply Savitzky-Golay filtering only for visualization, not for clustering.
  470. % Optimize Sgolay params - takes very long time to optimize both params
  471. poly_orders = 1:6;
  472. frame_sizes = 5:2:927;
  473. [best_poly_order, best_frame_size, best_snr, best_filtered_signals] = optimizeSgolayParams(dFF_all, poly_orders, frame_sizes);
  474. % Check best frame size
  475. unique_vals_frame = unique(best_frame_size);
  476. counts = histc(best_frame_size, unique_vals_frame);
  477. figure; bar(unique_vals_frame, counts, 'FaceColor', 'b');
  478. % Check best poly order
  479. unique_vals_order = unique(best_poly_order);
  480. counts = histc(best_poly_order, unique_vals_order);
  481. figure; bar(unique_vals_order, counts, 'FaceColor', 'b');
  482. % 2. Cluster signals
  483. % Define your inputs
  484. maxClusters = 10; % Test up to 10 clusters
  485. poly_order = 6; % Range of polynomial orders for Savitzky-Golay filter
  486. frame_size = 7; % Frame sizes (odd numbers)
  487. % Assuming 'dFF_all' is your matrix of Ca2+ signals (cells x time points)
  488. [optimal_k, idx, features, cluster_means, count_k1, count_k2] = clusterCa2Signals(dFF_all_sorted, Fs, poly_order, frame_size, maxClusters);
  489. %% check differences between clusters
  490. darkPurple = [0.5, 0, 0.5]; % Dark purple
  491. darkGreen = [0, 0.5, 0];
  492. % SNR differences
  493. snr_1 = computeSNR(dFF_all_sorted(idx == 1,:), 'ma', 5); %'ma', 5 OR 'fft', 0.2
  494. snr_2 = computeSNR(dFF_all_sorted(idx == 2,:), 'ma', 5);
  495. % Median and IQR
  496. med1 = median(snr_1);
  497. med2 = median(snr_2);
  498. iqr1 = iqr(snr_1);
  499. iqr2 = iqr(snr_2);
  500. % Mann-Whitney U test
  501. [p, h, stats] = ranksum(snr_1, snr_2);
  502. fprintf('Mann-Whitney p = %.4f\n', p);
  503. % Plot
  504. figure;
  505. bar(1, med1, 'FaceColor', darkPurple); hold on;
  506. bar(2, med2, 'FaceColor', darkGreen);
  507. %bar([med1, med2], 'FaceColor', [0.2 0.6 0.8]); %'Color', colors
  508. % Set x-axis labels
  509. set(gca, 'XTick', [1 2], 'XTickLabel', {'Cluster 1', 'Cluster 2'});
  510. ylabel('Median SNR');
  511. % Error bars (IQR)
  512. hold on;
  513. errorbar([1, 2], [med1, med2], [iqr1, iqr2], '.k', 'LineWidth', 1.5);
  514. % Annotate p-value
  515. y_max = max([med1 + iqr1, med2 + iqr2]);
  516. text(1.5, y_max * 1.05, sprintf('Mann-Whitney p = %.4f', p),'HorizontalAlignment', 'center', 'FontSize', 12);
  517. hold off; box off;
  518. % cell location
  519. wave_location = zeros(size(idx,1), 2); % Preallocate for efficiency
  520. for cellIdx = 1:size(idx,1)
  521. wave_location(cellIdx, :) = [idx(cellIdx), combinedTable_sorted{cellIdx, "Cell location (0,perivascular;1,adjacent;2,none)"}];
  522. end
  523. tbl = chiSquaredTestForAssociation(wave_location);
  524. % Calculate the column sums
  525. colSums = sum(tbl);
  526. % Convert each value to a percentage of its respective column
  527. percentageDataColumn = (tbl ./ colSums) * 100;
  528. % Calculate the row sums
  529. rowSums = sum(tbl,2);
  530. % Convert each value to a percentage of its respective column
  531. percentageDataRow = (tbl ./ rowSums) * 100;
  532. % other features
  533. %combinedTable_NM(105,:) = [];
  534. clusterFeatures = table(idx, ...
  535. combinedTable_sorted.("Area(um2)"), ...
  536. combinedTable_sorted.Perimeter, ...
  537. combinedTable_sorted.Circularity, ...
  538. combinedTable_sorted.("Max dFF"), ...
  539. combinedTable_sorted.("dFF AUC"),...
  540. combinedTable_sorted.("Duration 10% to 10%"), ...
  541. combinedTable_sorted.("Number of Events"), ...
  542. 'VariableNames', {'Cluster', 'Area_um2', 'Perimeter', 'Circularity', 'Max_dFF', 'dFF AUC', 'Duration_10to10', 'Num_Events'});
  543. % Split data into two tables based on cluster assignment
  544. clusterFeatures_cluster1 = clusterFeatures(clusterFeatures.Cluster == 1, :);
  545. clusterFeatures_cluster2 = clusterFeatures(clusterFeatures.Cluster == 2, :);
  546. compareClusterFeatures(clusterFeatures, clusterFeatures_cluster1, clusterFeatures_cluster2);
  547. %number of events
  548. numberOfEvents_Cluster1 = clusterFeatures_cluster1(:,"Num_Events");
  549. totalEvents_Cluster1 = sum(numberOfEvents_Cluster1{:,:});
  550. %number of events in Hz
  551. numberOfEvents_Cluster1_Hz = table2cell(numberOfEvents_Cluster1);
  552. numberOfEvents_Cluster1_Hz = cell2mat(numberOfEvents_Cluster1_Hz);
  553. numberOfEvents_Cluster1_Hz = numberOfEvents_Cluster1_Hz / 900;
  554. numberOfEvents_Cluster1_Hz_new = numberOfEvents_Cluster1_Hz * 1000;
  555. %number of events
  556. numberOfEvents_Cluster2 = clusterFeatures_cluster2(:,"Num_Events");
  557. totalEvents_Cluster2 = sum(numberOfEvents_Cluster2{:,:});
  558. %number of events in Hz
  559. numberOfEvents_Cluster2_Hz = table2cell(numberOfEvents_Cluster2);
  560. numberOfEvents_Cluster2_Hz = cell2mat(numberOfEvents_Cluster2_Hz);
  561. numberOfEvents_Cluster2_Hz = numberOfEvents_Cluster2_Hz / 900;
  562. numberOfEvents_Cluster2_Hz_new = numberOfEvents_Cluster2_Hz * 1000;
  563. %%
  564. % Plot waves based on SNR (visual)
  565. figure;
  566. histogram(snr_ma);
  567. Q2 = prctile(snr_ma, 75);
  568. % Define threshold for high SNR
  569. snr_threshold = 22;
  570. % Find high SNR cells
  571. highSNRcells = snr_ma > snr_threshold;
  572. lowSNRcells = snr_ma < snr_threshold;
  573. % Get logical indices
  574. selectedCells_indices = find(highSNRcells);
  575. % Plot selected dFF traces
  576. set(0, 'DefaultFigureWindowStyle', 'docked');
  577. plot_selected_dFF_waves(combinedTable_NM, '', false, selectedCells_indices);
  578. % correlation SNR and event duration
  579. snr_duration = zeros(size(snr_ma,1), 2);
  580. for cellIdx = 1:size(snr_ma,1)
  581. snr_duration(cellIdx, :) = [snr_ma(cellIdx), combinedTable_NM{cellIdx, "Duration 10% to 10%"}];
  582. end
  583. %% Apply Savitzky-Golay filtering only for visualization, not for clustering.
  584. % Optimize Sgolay params - takes very long time to optimize both params
  585. poly_orders = 1:6;
  586. frame_sizes = 5:2:927;
  587. [best_poly_order, best_frame_size, best_snr, best_filtered_signals] = optimizeSgolayParams(dFF_all, poly_orders, frame_sizes);
  588. % Optimize only frame range
  589. poly_order = 3;
  590. frame_range = 5:2:927; % Must be odd values
  591. best_frame_sizes = optimizeFrameSize(dFF_all, poly_order, frame_range);

AQuA2_6_Waves_CSD.m at commit 1b99674, under GPL-3.0 · at the source

Overview

Authors: Simone Carneiro-Nascimento1, Chao Wei1, Anna Gutterman1, Dan Levy1
  1. Department of Anesthesia, Critical Care and Pain Medicine, Beth Israel Deaconess Medical Center, Harvard Medical School Boston United States
Institutions: Beth Israel Deaconess Medical Center (United States)
Journal: eLife, volume 15, article RP109888
Dates: published online 13 May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.7554/elife.109888 · PMID 42126091 · PMCID PMC13171100 · OpenAlex W7128806177
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: histology / microscopy (modality), optical imaging (calcium, voltage, 2-photon) (modality), mouse (organism), pain (population), cellular / molecular (subfield)
Methods: Connectivity, Statistics, Machine learning, Preprocessing, Spectral & time-frequency, fMRI & imaging, Single-unit activity, calcium imaging, Smoothing, state filtering, decompositions
Keywords: meninges, macrophages, calcium imaging, cortical spreading depolarization, migraine, calcitonin gene-related peptide, CGRP, Mouse
MeSH: Brain*, Calcium*, Calcium Signaling*, Macrophages*, Meninges*, Animals, Cortical Spreading Depression, Intravital Microscopy, Mice (* major topic)
Journal subjects: Immunology and Inflammation, Neuroscience
Topic: Neuroscience of respiration and sleep (Endocrine and Autonomic Systems, Neuroscience), according to OpenAlex
Funding: National Institutes of Health (R21NS130561, R01NS115972, R01NS133625)
Citations: cited by 1 paper (Europe PMC); 76 references in the paper

Abstract

The meninges, which envelop and protect the brain, host a dense network of resident macrophages with diverse roles in regulating homeostasis and neuroinflammation. Despite their importance, we have a limited understanding of their behavior in vivo. Many dynamic cellular functions of macrophages involve intracellular Ca2+ signaling. However, virtually nothing is known about the spatiotemporal Ca2+ dynamics of meningeal macrophages in vivo. We developed a chronic intravital two-photon imaging approach and related computational analysis tools to interrogate meningeal macrophage Ca2+ dynamics, at subcellular resolution, in a novel Pf4-Cre:Ai162 conditional GCaMP6s reporter mouse model. Using imaging in awake mice, we characterized Ca2+ activity in meningeal macrophages at steady state and in response to cortical spreading depolarization (CSD), an aberrant pro-inflammatory brain hyperexcitability event implicated in migraine, traumatic brain injury, and stroke. In homeostatic meninges, macrophages in the dural perivascular niche exhibited several Ca2+ dynamic features, including event duration and signal frequency spectrum, distinct from those localized to the interstitial, non-perivascular niche. Simultaneous tracking of macrophage Ca2+ dynamics and local vasomotion revealed a subset of dural perivascular macrophages whose activity was coupled to locomotion-driven diameter fluctuations of their associated vessels. Most perivascular and non-perivascular meningeal macrophages displayed propagating intracellular Ca2+ activity and synchronized intercellular Ca2+ elevations, potentially driven by extrinsic factors. In response to CSD, the majority of perivascular and non-perivascular meningeal macrophages showed a persistent decrease in Ca2+ activity, while a smaller subset displayed Ca2+ elevations. Mechanistically, calcitonin gene-related peptide receptor signaling mediated the increase but not the decrease in CSD-mediated Ca2+ signaling. Collectively, our results highlight a previously unknown diversity of Ca2+ dynamics in meningeal macrophages at steady state and in response to an aberrant brain hyperexcitability event linked to neuroinflammation.

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

levylabheadache/movieprocessing

License: GPL-3.0
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: d40d58fa17e4c81ce7cb3779ef141d7edada653e, 30 March 2023
Languages: MATLAB (106)
Size: 112 files, 106 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: license file
Not found: README, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
107 files

levylabheadache/locomotion

License: GPL-3.0
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 96fdaa6bc2364f55cfabc67cc4a168d89ec5fcbc, 29 January 2024
Languages: MATLAB (17)
Size: 19 files, 17 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: license file
Not found: README, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
18 files

levylabheadache/Aqua2Processing

License: GPL-3.0
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 1b9967459c36796c74cc25ee7b93169afadaadfe, 6 May 2026
Languages: MATLAB (125)
Size: 127 files, 125 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
127 files

levylabheadache/vasculature

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: e619456255a0eff1026cb340a5a4e21ff8f86dc8, 30 March 2023
Languages: MATLAB (25)
Size: 25 files, 25 scripts
Software Heritage: not archived
Found in: “Data 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
  • 28 September 2026: the link answers
25 files, not copied: shown from their source

OSCR keeps no copy of these files: this repository has no license that allows it. The reader above shows each one from its source, fetched by your browser at commit e619456, when its fingerprint is the one OSCR verified. How this works.

levylabheadache/GeneralLinearModel_Macrophages

License: GPL-3.0
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 1bb746e859b3bde8eeef4e85a29494eadee14667, 6 May 2026
Languages: MATLAB (9)
Size: 11 files, 9 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
11 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:

  • 5 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 282 scripts, each with its path and the digest of its content;
  • 20 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

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

Data

No dataset and no data link were found in the paper.

Data availability

All data needed to evaluate the conclusions in the paper are present in the manuscript. The code used for analyzing the data in this study was deposited in the Levy Lab GitHub account. Code for movie processing is available at GitHub (https://github.com/levylabheadache/MovieProcessing/tree/SCN) (copy archived at Levy Lab_Headache, 2026a). Code for locomotion analysis is available GitHub (https://github.com/levylabheadache/Locomotion/tree/SCN) (copy archived at Levy Lab_Headache, 2026b). Code for post Aqua2-processing is available at GitHub (https://github.com/levylabheadache/Aqua2Processing) (copy archived at Levy Lab_Headache, 2026c). Code for vascular segmentation is available at GitHub (https://github.com/levylabheadache/Vasculature/tree/SCN) (copy archived at Levy Lab_Headache, 2026d). Code for GLM is available at GitHub (https://github.com/levylabheadache/GeneralLinearModel_Macrophages) (copy archived at Levy Lab_Headache, 2026e).

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, 4 authors, 8 keywords, 9 MeSH terms, 1 funder, 71 references.

Cite

This paper

Carneiro-Nascimento, S., Wei, C., Gutterman, A., & Levy, D. (2026). Intravital calcium imaging of meningeal macrophages reveals niche-specific dynamics and aberrant responses to brain hyperexcitability. eLife, 15, RP109888. https://doi.org/10.7554/elife.109888

BibTeX

@article{carneironascimento2026intravital,
author = {Carneiro-Nascimento, Simone and Wei, Chao and Gutterman, Anna and Levy, Dan},
title = {{Intravital calcium imaging of meningeal macrophages reveals niche-specific dynamics and aberrant responses to brain hyperexcitability}},
journal = {eLife},
year = {2026},
month = may,
volume = {15},
pages = {RP109888},
publisher = {eLife Sciences Publications, Ltd},
issn = {2050-084X},
doi = {10.7554/elife.109888},
url = {https://doi.org/10.7554/elife.109888},
pmid = {42126091},
pmcid = {PMC13171100}
}

RIS

TY - JOUR
AU - Carneiro-Nascimento, Simone
AU - Wei, Chao
AU - Gutterman, Anna
AU - Levy, Dan
TI - Intravital calcium imaging of meningeal macrophages reveals niche-specific dynamics and aberrant responses to brain hyperexcitability
T2 - eLife
J2 - Elife
PY - 2026
DA - 2026/05/13
VL - 15
SP - RP109888
SN - 2050-084X
PB - eLife Sciences Publications, Ltd
DO - 10.7554/elife.109888
UR - https://doi.org/10.7554/elife.109888
LA - en
ER -

CSL-JSON

{
"id": "10.7554/elife.109888",
"type": "article-journal",
"title": "Intravital calcium imaging of meningeal macrophages reveals niche-specific dynamics and aberrant responses to brain hyperexcitability",
"container-title": "eLife",
"author": [
{
"family": "Carneiro-Nascimento",
"given": "Simone"
},
{
"family": "Wei",
"given": "Chao"
},
{
"family": "Gutterman",
"given": "Anna"
},
{
"family": "Levy",
"given": "Dan"
}
],
"container-title-short": "Elife",
"volume": "15",
"page": "RP109888",
"DOI": "10.7554/elife.109888",
"PMID": "42126091",
"PMCID": "PMC13171100",
"ISSN": "2050-084X",
"publisher": "eLife Sciences Publications, Ltd",
"URL": "https://doi.org/10.7554/elife.109888",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
13
]
]
}
}

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.1016/j.celrep.2026.117411
Enhancing the specificity of microglia genetic targeting using a CSF1R inhibitor.
Journal: Cell reports
In common: mouse, cellular / molecular, 5 references
[2] doi:10.1016/j.crmeth.2026.101472 [code]
Rapid neuronal labeling and functional imaging in the developing mouse brain with AAV-PHP.eB.
Journal: Cell reports methods
In common: Optimization Toolbox, Signal Processing Toolbox, Image Processing Toolbox, 1 other tool, optical imaging (calcium, voltage, 2-photon), histology / microscopy, mouse
[3] doi:10.1038/s41592-026-03066-1 [code]
A multimodal adaptive optical microscope for in vivo imaging from molecules to organisms.
Journal: Nature methods
In common: Optimization Toolbox, Signal Processing Toolbox, Image Processing Toolbox, 1 other tool, optical imaging (calcium, voltage, 2-photon), histology / microscopy, mouse
[4] doi:10.1093/brain/awag080 [code]
Early glymphatic failure in AppNL-F knock-in mice is linked to parenchymal border macrophages loss.
Journal: Brain : a journal of neurology
In common: mouse, cellular / molecular, 4 references
[5] doi:10.1186/s12974-026-03794-3
Single-cell omics and flow cytometry identify distinct immune states of dural and brain-infiltrating IL-17-producing γδ T cells after experimental stroke.
Journal: Journal of neuroinflammation
In common: mouse, cellular / molecular, 4 references
[6] doi:10.3390/biomedicines14081670 [code]
Limited Detectability of Network Functional Alterations in a Tauopathy Model Using Mouse Primary Cortical Cultures.
Journal: Biomedicines
In common: Optimization Toolbox, Signal Processing Toolbox, Image Processing Toolbox, 1 other tool, optical imaging (calcium, voltage, 2-photon), mouse
[7] 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: Signal Processing Toolbox, Image Processing Toolbox, Statistics and Machine Learning Toolbox, optical imaging (calcium, voltage, 2-photon), mouse, 1 reference
[8] doi:10.1016/j.isci.2026.117187 [code]
Functional and structural characterization of dendritic spine pathology in a mouse model of tauopathy.
Journal: iScience
In common: Optimization Toolbox, Signal Processing Toolbox, Image Processing Toolbox, 1 other tool, histology / microscopy, mouse
[9] doi:10.1038/s41593-026-02358-1 [code]
Cerebral venous blood flow regulates intracerebral pressure and brain clearance via meningeal lymphatic vessels.
Journal: Nature neuroscience
In common: mouse, 4 references
[10] doi:10.1002/hbm.70602 [code]
Neuroimaging Correlates of Post-Stroke Pain After Ischemic Stroke: Secondary Analysis of the INSPiRE-TMS Trial.
Journal: Human brain mapping
In common: Optimization Toolbox, Signal Processing Toolbox, Image Processing Toolbox, 1 other tool, pain

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.