OSCR

The molecular basis of force selectivity by PIEZO2.

A correction to this paper has been published: the notice, 42722736, from Europe PMC.

Code ↔ Paper

7 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 7 matches
  1. [1] § Methods › MINFLUX data analysis for 3D tracking in live cells ↔ MINFLUX_Tracking_Analysis_Mulhall_2025.m, lines 203–239 · score 0.82 · weighted linear model, ensemble MSD curve, Macroscopic diffusion coefficients, fitting, tracking, 50 ms
  2. [2] § Methods › MINFLUX data analysis for 3D structural imaging in fixed cells ↔ MINFLUX_Cluster_Analysis_Mulhall_2025.m, lines 68–149 · score 0.72 · photon frequency, emission frequency, offset, iteration, raw, median
  3. [3] § Cytoskeletal modulation of PIEZO2 gating ↔ MINFLUX_Tracking_Analysis_Mulhall_2025.m, lines 1–14 · score 0.70 · PIEZO proteins, MINFLUX localizations, MINFLUX tracking, Single molecule, diffusion
  4. [4] § Methods › MINFLUX data analysis for 3D tracking in live cells ↔ MINFLUX_Cluster_Analysis_Mulhall_2025.m, lines 30–65 · score 0.69 · trace ID, emission frequency, refractive, imported, isolate, EFO
  5. [5] § FLNB tethering shapes PIEZO2 function ↔ MINFLUX_Tracking_Analysis_Mulhall_2025.m, lines 31–61 · score 0.66 · MSD fits, MINFLUX tracking, 350 ms, 5 ms, Macroscopic, Mulhall
  6. [6] § Methods › MINFLUX data analysis for 3D tracking in live cells ↔ MINFLUX_Tracking_Analysis_Mulhall_2025.m, lines 31–61 · score 0.64 · maximum EFO, MINFLUX tracking, cut, gap, trajectories, MSD
  7. [7] § Methods › 3D MINFLUX imaging ↔ MINFLUX_Tracking_Analysis_Mulhall_2025.m, lines 1–14 · score 0.55 · Abberior Instruments, MINFLUX tracking, Imspector, localization

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 · 520 lines · 19 KB · GPL-3.0 · 5 matches

  1. % Code to analyze single-molecule diffusion of PIEZO proteins from Abberior Instruments 3D MINFLUX localizations
  2. % Data is acquired using a 3D tracking targeting sequence
  3. % Written by Eric Mulhall
  4. % Instructions:
  5. % First, export valid final localizations from the MINFLUX Imspector interface as .mat files
  6. % Import the .mat files into the current path
  7. % Place all .mat tracking files into a single folder
  8. % Set folder_path to that folder below
  9. % Run the code
  10. close all
  11. clear
  12. clc
  13. %% Load data
  14. % paste folder path
  15. folder_path = '______';
  16. % load data and combine traces
  17. mat_files = dir(fullfile(folder_path, '**', '*.mat'));
  18. [x_all, y_all, z_all, time_all, tid_all, itr_efo_all, itr_fbg_all] = loadData(mat_files);
  19. % create a traces array:
  20. % Z data is scaled by 0.7 for refractive index correction
  21. traces_all = [x_all, y_all, z_all*0.7, tid_all, itr_efo_all, itr_fbg_all, time_all];
  22. %% Filter the data and set parameters for analysis
  23. % set the individual and ensemble microscopic MSD fit time window for microscopic diffusion (per trajectory):
  24. minFitDelay_micro = 0.005; % Minimum delay (s) to include in individual fits (default = 5 ms)
  25. maxFitDelay_micro = 0.05; % Maximum delay (s) to include in individual fits (default = 50 ms)
  26. % set the ensemble macroscopic MSD fit time window for microscopic diffusion (per trajectory):
  27. minFitDelay_macro = 0.05; % Minimum delay (s) to include in individual fits (default = 50 ms)
  28. maxFitDelay_macro = 0.35; % Maximum delay (s) to include in individual fits (default = 350 ms)
  29. % Set filtering parameters
  30. % minimum # of localizations per trace
  31. loc_per_trace_threshold = 200;
  32. % maximum EFO value for each localization
  33. efo_cutoff = 150000;
  34. % maximum amount of time (s) between localizations
  35. % the filtering function cuts the trace off it exceeds this gap value
  36. time_gap_threshold = 0.018;
  37. % minimum r^2 value for individual MSD fits
  38. min_r2 = 0.8;
  39. % set the total track time (s) for overlay
  40. track_overlay_time = 1.0;
  41. % add a stdev per trace filter for huge mislocalizations
  42. stdev_trace_threshold = 0.4e-06;
  43. % filter the data
  44. traces_filt = filterData(traces_all, loc_per_trace_threshold, efo_cutoff, time_gap_threshold, stdev_trace_threshold);
  45. % convert XYZ values to nanometers
  46. traces_filt_nano = [traces_filt(:,1:3)*1e6, traces_filt(:,4:7)];
  47. %% Calculate weighted MSD for each trace
  48. [micro_MSD_per_traj, micro_tau_per_traj, micro_weights_per_traj, micro_diffusion_coeff, initial_times, micro_r2_individual] = ...
  49. calculateMSD_weighted(traces_filt_nano, minFitDelay_micro, maxFitDelay_micro);
  50. [macro_MSD_per_traj, macro_tau_per_traj, macro_weights_per_traj, macro_diffusion_coeff, initial_times, macro_r2_individual] = ...
  51. calculateMSD_weighted(traces_filt_nano, minFitDelay_macro, maxFitDelay_macro);
  52. %% Plot the individual microscopic R^2 values for each trajectory (goodness of MSD fit)
  53. % Create a boxplot for the individual R^2 values
  54. figure;
  55. boxplot(micro_r2_individual, 'Notch', 'on', 'Labels', {'R^2'});
  56. title('Boxplot of Individual microscopic R^2 Values');
  57. ylabel('R^2');
  58. % Compute the median and standard deviation (ignoring NaNs)
  59. median_r2 = median(micro_r2_individual, 'omitnan');
  60. % Add a text annotation displaying the median and standard deviation
  61. x_pos = 1.2;
  62. y_pos = median_r2;
  63. text(x_pos, y_pos, sprintf('Median = %.3f', median_r2), ...
  64. 'HorizontalAlignment', 'left', 'VerticalAlignment', 'middle', 'FontSize', 12);
  65. %% Filter each trajectory for minimum r^2 value
  66. % microscopic coefficient
  67. % create an array of the diffusion coeff w/ r^2 for each trajectory
  68. micro_diff_r2 = [micro_diffusion_coeff micro_r2_individual];
  69. % filter out rows where r^2 is less than min_r2
  70. validIdx = micro_r2_individual >= min_r2;
  71. micro_diff_coeff_r2_filtered = micro_diff_r2(validIdx, 1);
  72. % remove any diffusion coefficient >10 (not physically possible)
  73. micro_diff_coeff_r2_filtered(micro_diff_coeff_r2_filtered(:) > 10, :)= [];
  74. % macroscopic coefficient
  75. % create an array of the diffusion coeff w/ r^2 for each trajectory
  76. macro_diff_r2 = [macro_diffusion_coeff macro_r2_individual];
  77. % filter out rows where r^2 is less than min_r2
  78. validIdx = macro_r2_individual >= min_r2;
  79. macro_diff_coeff_r2_filtered = macro_diff_r2(validIdx, 1);
  80. % remove any diffusion coefficient >10 (not physically possible)
  81. macro_diff_coeff_r2_filtered(macro_diff_coeff_r2_filtered(:) > 10, :)= [];
  82. %% Microscopic ensemble Analysis: Combine trajectories by binning delays and performing a weighted average
  83. all_tau = [];
  84. all_msd = [];
  85. all_weights = [];
  86. nTraj = numel(micro_tau_per_traj);
  87. for i = 1:nTraj
  88. all_tau = [all_tau; micro_tau_per_traj{i}];
  89. all_msd = [all_msd; micro_MSD_per_traj{i}];
  90. all_weights = [all_weights; micro_weights_per_traj{i}];
  91. end
  92. % define bins for delay (tau) values.
  93. bin_edges = linspace(min(all_tau), max(all_tau), 100);
  94. bin_centers = (bin_edges(1:end-1) + bin_edges(2:end)) / 2;
  95. ensemble_msd = NaN(length(bin_centers), 1);
  96. ensemble_weight = NaN(length(bin_centers), 1);
  97. ensemble_sem = NaN(length(bin_centers), 1); % to store SEM for each bin
  98. for i = 1:length(bin_centers)
  99. in_bin = all_tau >= bin_edges(i) & all_tau < bin_edges(i+1);
  100. if any(in_bin)
  101. weights = all_weights(in_bin);
  102. msd_values = all_msd(in_bin);
  103. % weighted average: sum(MSD * weight) / sum(weight)
  104. weighted_mean = sum(msd_values .* weights) / sum(weights);
  105. ensemble_msd(i) = weighted_mean;
  106. ensemble_weight(i) = sum(weights);
  107. % compute effective sample size
  108. n_eff = (sum(weights))^2 / sum(weights.^2);
  109. % compute weighted variance
  110. weighted_variance = sum(weights .* (msd_values - weighted_mean).^2) / sum(weights);
  111. % SEM = sqrt(weighted variance / effective sample size)
  112. ensemble_sem(i) = sqrt(weighted_variance / n_eff);
  113. end
  114. end
  115. % remove bins with no data
  116. validBins = ~isnan(ensemble_msd);
  117. ensemble_tau = bin_centers(validBins);
  118. ensemble_msd = ensemble_msd(validBins);
  119. ensemble_weight = ensemble_weight(validBins);
  120. ensemble_sem = ensemble_sem(validBins);
  121. %% Filter ensemble data to delays between minFitDelay and maxFitDelay
  122. filter_idx = (ensemble_tau >= minFitDelay_micro) & (ensemble_tau <= maxFitDelay_micro);
  123. ensemble_tau_filt = ensemble_tau(filter_idx);
  124. ensemble_msd_filt = ensemble_msd(filter_idx);
  125. ensemble_weight_filt = ensemble_weight(filter_idx);
  126. ensemble_sem_filt = ensemble_sem(filter_idx);
  127. %% Fit and Plot the filtered ensemble microscopic MSD curve with SEM error bars
  128. figure;
  129. errorbar(ensemble_tau_filt, ensemble_msd_filt, ensemble_sem_filt, 'ko', 'MarkerFaceColor', 'k');
  130. title(sprintf('Ensemble Microscopic Diffusion Coefficient', minFitDelay_micro, maxFitDelay_micro));
  131. % xlim([0 0.05]);
  132. ylim([0 0.008]);
  133. % Weighted Linear Fit on the Filtered Ensemble MSD
  134. ft = fittype('poly1');
  135. % ensure weights are strictly positive
  136. w_fit = max(ensemble_weight_filt, eps);
  137. [fitobj, gof] = fit(ensemble_tau_filt', ensemble_msd_filt, ft, 'Weights', w_fit);
  138. D_ensemble = fitobj.p1 / 6;
  139. fprintf('Ensemble microscopic diffusion coefficient: D = %g \n', minFitDelay_micro, maxFitDelay_micro, D_ensemble);
  140. hold on;
  141. plot(fitobj, 'r-');
  142. % add R^2 value on the plot
  143. x_text = min(ensemble_tau_filt) + 0.05*(max(ensemble_tau_filt)-min(ensemble_tau_filt));
  144. y_text = max(ensemble_msd_filt) - 0.1*(max(ensemble_msd_filt)-min(ensemble_msd_filt));
  145. text(x_text, y_text, sprintf('R^2 = %.3f', gof.rsquare), 'FontSize', 12, 'Color', 'b');
  146. legend('MSD data with SEM', 'Weighted linear fit');
  147. hold off;
  148. xlabel('Delay (s)');
  149. ylabel('MSD (\mum^2)');
  150. %% Fit and Plot the filtered ensemble macroscopic MSD curve with SEM error bars
  151. % filter the ensemble data for delays between 0.1 and 1 seconds.
  152. mac_idx = (ensemble_tau >= minFitDelay_macro) & (ensemble_tau <= maxFitDelay_macro);
  153. mac_tau = ensemble_tau(mac_idx);
  154. mac_msd = ensemble_msd(mac_idx);
  155. mac_weight = ensemble_weight(mac_idx);
  156. mac_sem = ensemble_sem(mac_idx); % SEM calculated previously
  157. % fit the data with a weighted linear model (poly1).
  158. ft = fittype('poly1');
  159. % ensure weights are strictly positive.
  160. w_fit_mac = max(mac_weight, eps);
  161. [fitobj_mac, gof_mac] = fit(mac_tau', mac_msd, ft, 'Weights', w_fit_mac);
  162. % calculate the macroscopic diffusion coefficient.
  163. % (assuming MSD = 6 * D * tau for 3D diffusion)
  164. D_mac = fitobj_mac.p1 / 6;
  165. fprintf('Ensemble macroscopic diffusion coefficient: D = %g \n', D_mac);
  166. % plot the data with SEM error bars and the weighted linear fit.
  167. figure;
  168. errorbar(mac_tau, mac_msd, mac_sem, 'ko', 'MarkerFaceColor', 'k');
  169. hold on;
  170. plot(fitobj_mac, 'r-');
  171. xlabel('Delay (s)');
  172. ylabel('MSD (\mum^2)');
  173. title('Ensemble Macroscopic Diffusion Coefficient');
  174. % add R^2 value text on the plot (adjust position as needed)
  175. x_text = min(mac_tau) + 0.05*(max(mac_tau)-min(mac_tau));
  176. y_text = max(mac_msd) - 0.1*(max(mac_msd)-min(mac_msd));
  177. text(x_text, y_text, sprintf('R^2 = %.3f', gof_mac.rsquare), 'FontSize', 12, 'Color', 'b');
  178. legend('MSD data with SEM', 'Weighted linear fit');
  179. hold off;
  180. xlim([minFitDelay_macro maxFitDelay_macro]);
  181. ylim([0 0.07]);
  182. %% Overlay all filtered tracks
  183. % get unique trace IDs
  184. uniqueIDs = unique(traces_filt_nano(:,4));
  185. % extract the valid trace IDs corresponding to tracks passing the R^2 filter:
  186. validIDs = uniqueIDs(validIdx);
  187. validDiff = micro_diffusion_coeff(validIdx);
  188. % get unique trace IDs from the filtered data
  189. allIDs = unique(traces_filt_nano(:,4));
  190. % apply the R^2 filter
  191. validIdx_all = micro_r2_individual >= min_r2;
  192. validIDs_all = allIDs(validIdx_all);
  193. nValid = numel(validIDs_all);
  194. % create a new figure for the overlay plot
  195. figure;
  196. hold on;
  197. xlabel('X (µm)');
  198. ylabel('Y (µm)');
  199. zlabel('Z (µm)');
  200. %title('Overlay of Normalized Tracks');
  201. grid on;
  202. axis equal;
  203. fontname("arial");
  204. % initialize cell array to hold each isolated 100 ms track for later analysis
  205. all_tracks = {};
  206. % loop over each valid, filtered track
  207. for k = 1:nValid
  208. currID = validIDs_all(k);
  209. % extract all data rows corresponding to the current track (columns: 1-3: XYZ, 7: time)
  210. track_rows = traces_filt_nano(:,4) == currID;
  211. trackData = traces_filt_nano(track_rows, :);
  212. trackXYZ = trackData(:, 1:3);
  213. trackTime = trackData(:, 7);
  214. % calculate time offset relative to the initial time (first measurement)
  215. initial_time = trackTime(1);
  216. time_offset = trackTime - initial_time;
  217. % only consider tracks that have at least x seconds of tracking time
  218. if max(time_offset) < track_overlay_time
  219. continue; % skip this track if it doesn't span x seconds
  220. end
  221. % select data for the first x seconds
  222. idx_time = time_offset <= track_overlay_time;
  223. trackXYZ = trackXYZ(idx_time, :);
  224. % Store the isolated track into the cell array
  225. all_tracks{end+1} = trackXYZ;
  226. % % normalize the track by subtracting its initial position (first row)
  227. % initial_pos_track = trackXYZ(1,:);
  228. % trackXYZ_norm = trackXYZ - initial_pos_track;
  229. % alternatively, normalize by subtracting its center of mass:
  230. center_of_mass_track = mean(trackXYZ, 1);
  231. trackXYZ_norm = trackXYZ - center_of_mass_track;
  232. % plot the normalized track using a unique color from the colormap
  233. plot3(trackXYZ_norm(:,1), trackXYZ_norm(:,2), trackXYZ_norm(:,3), '-', 'LineWidth', 0.01, 'Color', [0 0 0 .3]);
  234. end
  235. % set the axis limits(in µm)
  236. xlim([-0.5 0.5]);
  237. ylim([-0.5 0.5]);
  238. zlim([-0.5 0.5]);
  239. xticks([-0.5 -0.4 -0.3 -0.2 -0.1 0 0.1 0.2 0.3 0.4 0.5])
  240. %% Plot individual MSDs and overlay ensemble mean with SEM error bars
  241. figure;
  242. hold on
  243. % Plot each individual MSD trace in light gray
  244. nTraj = numel(micro_tau_per_traj);
  245. for i = 1:nTraj
  246. tau_vals = micro_tau_per_traj{i};
  247. msd_vals = micro_MSD_per_traj{i};
  248. if ~isempty(msd_vals)
  249. plot(tau_vals, msd_vals, 'Color', [0.7 0.7 0.7]); % light gray line
  250. end
  251. end
  252. errorbar(ensemble_tau_filt, ensemble_msd_filt, ensemble_sem_filt, 'ko', 'MarkerFaceColor', 'k');
  253. errorbar(mac_tau, mac_msd, mac_sem, 'ko', 'MarkerFaceColor', 'k');
  254. %plot(fitobj, 'r-');
  255. %plot(fitobj_mac, 'r-');
  256. plot(linspace(minFitDelay_micro, maxFitDelay_micro), feval(fitobj, linspace(minFitDelay_micro, maxFitDelay_micro)), 'r-','Color','blue','LineWidth',2);
  257. plot(linspace(minFitDelay_macro, maxFitDelay_macro), feval(fitobj_mac, linspace(minFitDelay_macro, maxFitDelay_macro)), 'r-','Color','red','LineWidth',2);
  258. xlim([0 maxFitDelay_macro]);
  259. ylim([0 0.06]);
  260. xlabel('Delay (s)');
  261. ylabel('Mean Squared Displacement (\mum^2)');
  262. %% Save work
  263. % % Extract the folder name as prefix
  264. % [~, prefix] = fileparts(folder_path);
  265. % save_filename = fullfile(pwd, [prefix '_analyzed.mat']);
  266. % save(save_filename);
  267. %
  268. % disp('Processing completed!')
  269. %% Functions
  270. % -------loadData---------
  271. function [x_all, y_all, z_all, time_all, tid_all, itr_efo_all, itr_fbg_all] = loadData(mat_files)
  272. x_all = [];
  273. y_all = [];
  274. z_all = [];
  275. time_all = [];
  276. tid_all = [];
  277. itr_efo_all = [];
  278. itr_fbg_all = [];
  279. for i = 1:length(mat_files)
  280. file_path = fullfile(mat_files(i).folder, mat_files(i).name);
  281. load(file_path);
  282. x_all = [x_all; itr.loc(:,5,1)];
  283. y_all = [y_all; itr.loc(:,5,2)];
  284. z_all = [z_all; itr.loc(:,5,3)];
  285. time_all = [time_all; tim'];
  286. tid_all = [tid_all; double(tid)'];
  287. itr_efo_all = [itr_efo_all; itr.efo(:,5)];
  288. itr_fbg_all = [itr_fbg_all; itr.fbg(:,5)];
  289. end
  290. end
  291. % ---------filterData---------
  292. function traces_filt = filterData(traces, loc_per_trace_threshold, efo_cutoff, time_gap_threshold, stdev_trace_threshold)
  293. traces_filt = traces;
  294. traces_filt(traces_filt(:,5) > efo_cutoff, :)= [];
  295. [uv_tid, ~, id_tid] = unique(traces(:,4));
  296. n_tid = histcounts(id_tid,"BinWidth",1);
  297. traces_filt = traces_filt(ismember(traces_filt(:,4), uv_tid(n_tid > loc_per_trace_threshold)),:);
  298. % Filter traces by average standard deviation (x, y, and z).
  299. [uv_tid, ~, id_tid] = unique(traces_filt(:,4));
  300. stdev_x = accumarray(id_tid, traces_filt(:,1), [], @std);
  301. stdev_y = accumarray(id_tid, traces_filt(:,2), [], @std);
  302. stdev_z = accumarray(id_tid, traces_filt(:,3), [], @std);
  303. avg_stdev = (stdev_x + stdev_y + stdev_z) / 3;
  304. traces_filt = traces_filt(ismember(traces_filt(:,4), uv_tid(avg_stdev < stdev_trace_threshold)), :);
  305. uniqueIDs = unique(traces_filt(:,4));
  306. truncated_data = [];
  307. for i = 1:length(uniqueIDs)
  308. idx = traces_filt(:,4) == uniqueIDs(i);
  309. trackData = traces_filt(idx, :);
  310. % Sort track data by time (column 7)
  311. [sortedTimes, sortIdx] = sort(trackData(:,7));
  312. trackData = trackData(sortIdx, :);
  313. dt = diff(sortedTimes);
  314. gapIdx = find(dt > time_gap_threshold, 1, 'first');
  315. if isempty(gapIdx)
  316. % If no gap exceeds the threshold, keep the entire track
  317. truncated_data = [truncated_data; trackData];
  318. else
  319. % Truncate the track: keep data from row 1 up to the gap
  320. truncated_data = [truncated_data; trackData(1:gapIdx, :)];
  321. end
  322. end
  323. traces_filt = truncated_data;
  324. end
  325. % ---------calculateMSD_weighted---------
  326. function [MSD_per_traj, tau_per_traj, weights_per_traj, diffusion_coeff, initial_times, r2_individual] = calculateMSD_weighted(traces, minFitDelay, maxFitDelay)
  327. x = traces(:,1);
  328. y = traces(:,2);
  329. z = traces(:,3);
  330. id = traces(:,4);
  331. time = traces(:,7);
  332. unique_ids = unique(id);
  333. nTracks = numel(unique_ids);
  334. MSD_per_traj = cell(nTracks, 1);
  335. tau_per_traj = cell(nTracks, 1);
  336. weights_per_traj = cell(nTracks, 1);
  337. diffusion_coeff = zeros(nTracks, 1);
  338. initial_times = zeros(nTracks, 1);
  339. r2_individual = zeros(nTracks, 1);
  340. for i = 1:nTracks
  341. idx = id == unique_ids(i);
  342. x_traj = x(idx);
  343. y_traj = y(idx);
  344. z_traj = z(idx);
  345. time_traj = time(idx);
  346. % sort the trajectory by time
  347. [time_traj, sortIdx] = sort(time_traj);
  348. x_traj = x_traj(sortIdx);
  349. y_traj = y_traj(sortIdx);
  350. z_traj = z_traj(sortIdx);
  351. % store the initial time
  352. initial_times(i) = time_traj(1);
  353. % filter the trajectory to include only points within the first 0.5 seconds
  354. t_end = time_traj(1) + 0.5; % 0.5 second after the first measurement
  355. valid_idx = time_traj <= t_end;
  356. time_traj = time_traj(valid_idx);
  357. x_traj = x_traj(valid_idx);
  358. y_traj = y_traj(valid_idx);
  359. z_traj = z_traj(valid_idx);
  360. % if the filtered trajectory has too few points, then skip it
  361. N = length(x_traj);
  362. if N < 2
  363. MSD_per_traj{i} = [];
  364. tau_per_traj{i} = [];
  365. weights_per_traj{i} = [];
  366. diffusion_coeff(i) = NaN;
  367. r2_individual(i) = NaN;
  368. continue;
  369. end
  370. msd = zeros(N-1, 1);
  371. tau_vals = zeros(N-1, 1);
  372. weights = zeros(N-1, 1);
  373. for tau = 1:(N-1)
  374. delta_sq = (x_traj(1+tau:end) - x_traj(1:end-tau)).^2 + ...
  375. (y_traj(1+tau:end) - y_traj(1:end-tau)).^2 + ...
  376. (z_traj(1+tau:end) - z_traj(1:end-tau)).^2;
  377. msd(tau) = mean(delta_sq);
  378. tau_vals(tau) = mean(time_traj(1+tau:end) - time_traj(1:end-tau));
  379. weights(tau) = numel(delta_sq);
  380. end
  381. valid_msd_idx = msd <= 10;
  382. msd = msd(valid_msd_idx);
  383. tau_vals = tau_vals(valid_msd_idx);
  384. weights = weights(valid_msd_idx);
  385. MSD_per_traj{i} = msd;
  386. tau_per_traj{i} = tau_vals;
  387. weights_per_traj{i} = weights;
  388. % restrict the individual linear fit to delays within [minFitDelay, maxFitDelay]
  389. fitIdx = (tau_vals >= minFitDelay) & (tau_vals <= maxFitDelay);
  390. if sum(fitIdx) < 2
  391. diffusion_coeff(i) = NaN; % Not enough data for a reliable fit.
  392. r2_individual(i) = NaN;
  393. else
  394. coeffs = polyfit(tau_vals(fitIdx), msd(fitIdx), 1);
  395. diffusion_coeff(i) = coeffs(1) / 6;
  396. % compute fitted values and R^2
  397. fitted_vals = polyval(coeffs, tau_vals(fitIdx));
  398. SS_res = sum((msd(fitIdx) - fitted_vals).^2);
  399. SS_tot = sum((msd(fitIdx) - mean(msd(fitIdx))).^2);
  400. if SS_tot == 0
  401. r2_individual(i) = 1;
  402. else
  403. r2_individual(i) = 1 - SS_res/SS_tot;
  404. end
  405. end
  406. end
  407. end

MINFLUX_Tracking_Analysis_Mulhall_2025.m at commit ab0bbde, under GPL-3.0 · at the source

Overview

Authors: Eric M. Mulhall1, Oleg Yarishkin1, Rose Z. Hill1,2,3, Anna K. Koster1, Ardem Patapoutian1
  1. Howard Hughes Medical Institute, Department of Neuroscience, Dorris Neuroscience Center, Scripps Research,La Jolla, CA USA
  2. Vollum Institute, Oregon Health & Science University,Portland, OR USA
  3. Present Address: Department of Chemical Physiology and Biochemistry, Oregon Health & Science University,Portland, OR USA
Institutions: Howard Hughes Medical Institute (United States); Oregon Health & Science University (United States)
Journal: Nature, volume 653, issue 8113, pages 297-305
Dates: received 22 May 2025; accepted 23 January 2026; published online 4 March 2026; in print 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41586-026-10182-7 · PMID 41781615 · PMCID PMC13149025 · OpenAlex W7133534867
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: histology / microscopy (modality), human (organism), mouse (organism), cellular / molecular (subfield)
Methods: Connectivity, Statistics, fMRI & imaging, Smoothing, state filtering, decompositions
Keywords: Single-molecule biophysics, Ion channels, Super-resolution microscopy, Ion channels in the nervous system
MeSH: Ion Channel Gating*, Ion Channels*, Mechanotransduction, Cellular*, Actin Cytoskeleton, Animals, Female, Filamins, HEK293 Cells, Humans, Mice, Single Molecule Imaging (* major topic)
Topic: Chemical and Physical Studies (Biophysics, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Funding: NIGMS NIH HHS (K99 GM155547); NINDS NIH HHS (R35 NS105067)
Citations: cited by 14 papers (Europe PMC); 62 references in the paper
Notices: A correction to this paper has been published (42722736, from Europe PMC)

Abstract

PIEZOs are mechanically gated ion channels that transduce force into electrochemical signals1. PIEZO1 responds to diverse stimuli including membrane stretch2 and shear stress3, whereas PIEZO2 is generally tuned to detect cellular indentation4,5. The functional specialization of PIEZO2 is proposed to underlie its distinct physiological roles, including mediating the sense of touch6,7. How PIEZO2 achieves this selectivity despite its close structural similarity to PIEZO1 is unclear. Here we combine single-molecule MINFLUX fluorescence nanoscopy with electrophysiology to link the conformational states of PIEZO2 to channel gating in intact cells. We find that PIEZO2 is intrinsically more rigid than PIEZO1, and that disparate mechanical stimuli paradoxically evoke opposite conformational and gating responses in each channel. These unique gating properties arise in part from a connection to the actin cytoskeleton, and we identify filamin-B (FLNB) as a molecular tether that is required for this interaction. This complex alters how force is transmitted to PIEZO2 and confers heightened sensitivity to and selectivity for cellular indentation. PIEZO2 and FLNB are co-expressed in somatosensory neurons and colocalize within tens of nanometres at the end organs of cutaneous mechanosensory afferents. These findings help to explain why PIEZO2 is a specialized mechanosensor and provide a molecular blueprint for understanding how cells decode diverse mechanical stimuli across tissues and organ systems.

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

PatapoutianLab/MINFLUX_Localization_and_Tracking_Analysis

License: GPL-3.0
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: ab0bbde6c01c01480d23e4ef55915a284ec0d21f, 30 September 2025
Languages: MATLAB (8)
Size: 12 files, 8 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
10 files

Zenodo 17625937

License: GPL-3.0
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: “Code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
  • 30 September 2026: the link answers (HTTP 200)
10 files
At the source:

Code availability

Custom MATLAB code for analysis of MINFLUX structural and tracking data are available at GitHub (https://github.com/PatapoutianLab/MINFLUX_Localization_and_Tracking_Analysis) and Zenodo62 (https://doi.org/10.5281/zenodo.17625937).

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

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

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

Data

Datasets cited

Data availability

Published protein structures were obtained from the RSCB Protein Data Bank (6B3R (https://doi.org/10.2210/pdb6B3R/pdb) (PIEZO1) and 6KG7 (https://doi.org/10.2210/pdb6KG7/pdb) (PIEZO2)). Protein sequences were obtained from UniprotKB. AlphaFold III models were generated with the Google DeepMind AlphaFold Server. Raw data are available at Zenodo61 (https://doi.org/10.5281/zenodo.17644763). All reagents that are not commercially available are available from the corresponding authors on reasonable request. Source data are provided with this paper.

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

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 30 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 5 authors, 4 keywords, 11 MeSH terms, 2 funders, 62 references, 1 integrity notice.

Cite

This paper

Mulhall, E. M., Yarishkin, O., Hill, R. Z., Koster, A. K., & Patapoutian, A. (2026). The molecular basis of force selectivity by PIEZO2. Nature, 653(8113), 297-305. https://doi.org/10.1038/s41586-026-10182-7

BibTeX

@article{mulhall2026molecular,
author = {Mulhall, Eric M. and Yarishkin, Oleg and Hill, Rose Z. and Koster, Anna K. and Patapoutian, Ardem},
title = {{The molecular basis of force selectivity by PIEZO2}},
journal = {Nature},
year = {2026},
month = mar,
volume = {653},
number = {8113},
pages = {297--305},
publisher = {Nature Portfolio},
issn = {0028-0836},
doi = {10.1038/s41586-026-10182-7},
url = {https://doi.org/10.1038/s41586-026-10182-7},
pmid = {41781615},
pmcid = {PMC13149025}
}

RIS

TY - JOUR
AU - Mulhall, Eric M.
AU - Yarishkin, Oleg
AU - Hill, Rose Z.
AU - Koster, Anna K.
AU - Patapoutian, Ardem
TI - The molecular basis of force selectivity by PIEZO2
T2 - Nature
J2 - Nature
PY - 2026
DA - 2026/03/04
VL - 653
IS - 8113
SP - 297
EP - 305
SN - 0028-0836
PB - Nature Portfolio
DO - 10.1038/s41586-026-10182-7
UR - https://doi.org/10.1038/s41586-026-10182-7
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41586-026-10182-7",
"type": "article-journal",
"title": "The molecular basis of force selectivity by PIEZO2",
"container-title": "Nature",
"author": [
{
"family": "Mulhall",
"given": "Eric M."
},
{
"family": "Yarishkin",
"given": "Oleg"
},
{
"family": "Hill",
"given": "Rose Z."
},
{
"family": "Koster",
"given": "Anna K."
},
{
"family": "Patapoutian",
"given": "Ardem"
}
],
"container-title-short": "Nature",
"volume": "653",
"issue": "8113",
"page": "297-305",
"DOI": "10.1038/s41586-026-10182-7",
"PMID": "41781615",
"PMCID": "PMC13149025",
"ISSN": "0028-0836",
"publisher": "Nature Portfolio",
"URL": "https://doi.org/10.1038/s41586-026-10182-7",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
4
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s41467-026-76927-0 [code]
State-dependent binding of the wedge domain controls inactivation of the mechanosensitive ion channel PIEZO1.
Journal: Nature communications
In common: Statistics and Machine Learning Toolbox, cellular / molecular, 12 references
[2] doi:10.1016/j.isci.2026.115209
Ether phospholipids modulate somatosensory responses by tuning multiple receptor functions in &lt;i&gt;Drosophila&lt;/i&gt;.
Journal: iScience
In common: cellular / molecular, 5 references
[3] doi:10.1016/j.isci.2026.116054 [code]
Global transcriptional changes across multiple isogenic &lt;i&gt;C9orf72&lt;/i&gt; patient iPSC-derived neurons.
Journal: iScience
In common: cellular / molecular, 3 references
[4] doi:10.1038/s41467-026-71614-6 [code]
Interferometric ultra-high resolution 3D imaging through brain sections.
Journal: Nature communications
In common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, histology / microscopy, mouse, cellular / molecular
[5] 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: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, histology / microscopy, mouse
[6] 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: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, histology / microscopy, mouse
[7] doi:10.1117/1.nph.13.2.025011 [code]
Measurement of the absolute value of the optical birefringence of myelin in primate brain tissue.
Journal: Neurophotonics
In common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, histology / microscopy, cellular / molecular
[8] doi:10.1002/glia.70141 [code]
Conservation of Neuron-Astrocyte Correlated Activity in Developing Sensory Pathways.
Journal: Glia
In common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, mouse, cellular / molecular
[9] doi:10.1038/s41467-026-76522-3 [code]
Transcriptomic analysis of spinal V1 interneurons informs their multifunctional role in motor output.
Journal: Nature communications
In common: mouse, cellular / molecular, 2 references
[10] doi:10.1113/jp289290 [code]
Robust activity-dependent mitochondrial calcium dynamics at the AIS is dispensable for action potential generation.
Journal: The Journal of physiology
In common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, mouse, cellular / molecular

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.