The molecular basis of force selectivity by PIEZO2.
A correction to this paper has been published: the notice, 42722736, from Europe PMC.
The 7 matches
- [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] § 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] § 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] § 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] § 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] § 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] § 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
- % Code to analyze single-molecule diffusion of PIEZO proteins from Abberior Instruments 3D MINFLUX localizations
- % Data is acquired using a 3D tracking targeting sequence
- % Written by Eric Mulhall
- % Instructions:
- % First, export valid final localizations from the MINFLUX Imspector interface as .mat files
- % Import the .mat files into the current path
- % Place all .mat tracking files into a single folder
- % Set folder_path to that folder below
- % Run the code
- close all
- clear
- clc
- %% Load data
- % paste folder path
- folder_path = '______';
- % load data and combine traces
- mat_files = dir(fullfile(folder_path, '**', '*.mat'));
- [x_all, y_all, z_all, time_all, tid_all, itr_efo_all, itr_fbg_all] = loadData(mat_files);
- % create a traces array:
- % Z data is scaled by 0.7 for refractive index correction
- traces_all = [x_all, y_all, z_all*0.7, tid_all, itr_efo_all, itr_fbg_all, time_all];
- %% Filter the data and set parameters for analysis
- % set the individual and ensemble microscopic MSD fit time window for microscopic diffusion (per trajectory):
- minFitDelay_micro = 0.005; % Minimum delay (s) to include in individual fits (default = 5 ms)
- maxFitDelay_micro = 0.05; % Maximum delay (s) to include in individual fits (default = 50 ms)
- % set the ensemble macroscopic MSD fit time window for microscopic diffusion (per trajectory):
- minFitDelay_macro = 0.05; % Minimum delay (s) to include in individual fits (default = 50 ms)
- maxFitDelay_macro = 0.35; % Maximum delay (s) to include in individual fits (default = 350 ms)
- % Set filtering parameters
- % minimum # of localizations per trace
- loc_per_trace_threshold = 200;
- % maximum EFO value for each localization
- efo_cutoff = 150000;
- % maximum amount of time (s) between localizations
- % the filtering function cuts the trace off it exceeds this gap value
- time_gap_threshold = 0.018;
- % minimum r^2 value for individual MSD fits
- min_r2 = 0.8;
- % set the total track time (s) for overlay
- track_overlay_time = 1.0;
- % add a stdev per trace filter for huge mislocalizations
- stdev_trace_threshold = 0.4e-06;
- % filter the data
- traces_filt = filterData(traces_all, loc_per_trace_threshold, efo_cutoff, time_gap_threshold, stdev_trace_threshold);
- % convert XYZ values to nanometers
- traces_filt_nano = [traces_filt(:,1:3)*1e6, traces_filt(:,4:7)];
- %% Calculate weighted MSD for each trace
- [micro_MSD_per_traj, micro_tau_per_traj, micro_weights_per_traj, micro_diffusion_coeff, initial_times, micro_r2_individual] = ...
- calculateMSD_weighted(traces_filt_nano, minFitDelay_micro, maxFitDelay_micro);
- [macro_MSD_per_traj, macro_tau_per_traj, macro_weights_per_traj, macro_diffusion_coeff, initial_times, macro_r2_individual] = ...
- calculateMSD_weighted(traces_filt_nano, minFitDelay_macro, maxFitDelay_macro);
- %% Plot the individual microscopic R^2 values for each trajectory (goodness of MSD fit)
- % Create a boxplot for the individual R^2 values
- figure;
- boxplot(micro_r2_individual, 'Notch', 'on', 'Labels', {'R^2'});
- title('Boxplot of Individual microscopic R^2 Values');
- ylabel('R^2');
- % Compute the median and standard deviation (ignoring NaNs)
- median_r2 = median(micro_r2_individual, 'omitnan');
- % Add a text annotation displaying the median and standard deviation
- x_pos = 1.2;
- y_pos = median_r2;
- text(x_pos, y_pos, sprintf('Median = %.3f', median_r2), ...
- 'HorizontalAlignment', 'left', 'VerticalAlignment', 'middle', 'FontSize', 12);
- %% Filter each trajectory for minimum r^2 value
- % microscopic coefficient
- % create an array of the diffusion coeff w/ r^2 for each trajectory
- micro_diff_r2 = [micro_diffusion_coeff micro_r2_individual];
- % filter out rows where r^2 is less than min_r2
- validIdx = micro_r2_individual >= min_r2;
- micro_diff_coeff_r2_filtered = micro_diff_r2(validIdx, 1);
- % remove any diffusion coefficient >10 (not physically possible)
- micro_diff_coeff_r2_filtered(micro_diff_coeff_r2_filtered(:) > 10, :)= [];
- % macroscopic coefficient
- % create an array of the diffusion coeff w/ r^2 for each trajectory
- macro_diff_r2 = [macro_diffusion_coeff macro_r2_individual];
- % filter out rows where r^2 is less than min_r2
- validIdx = macro_r2_individual >= min_r2;
- macro_diff_coeff_r2_filtered = macro_diff_r2(validIdx, 1);
- % remove any diffusion coefficient >10 (not physically possible)
- macro_diff_coeff_r2_filtered(macro_diff_coeff_r2_filtered(:) > 10, :)= [];
- %% Microscopic ensemble Analysis: Combine trajectories by binning delays and performing a weighted average
- all_tau = [];
- all_msd = [];
- all_weights = [];
- nTraj = numel(micro_tau_per_traj);
- for i = 1:nTraj
- all_tau = [all_tau; micro_tau_per_traj{i}];
- all_msd = [all_msd; micro_MSD_per_traj{i}];
- all_weights = [all_weights; micro_weights_per_traj{i}];
- end
- % define bins for delay (tau) values.
- bin_edges = linspace(min(all_tau), max(all_tau), 100);
- bin_centers = (bin_edges(1:end-1) + bin_edges(2:end)) / 2;
- ensemble_msd = NaN(length(bin_centers), 1);
- ensemble_weight = NaN(length(bin_centers), 1);
- ensemble_sem = NaN(length(bin_centers), 1); % to store SEM for each bin
- for i = 1:length(bin_centers)
- in_bin = all_tau >= bin_edges(i) & all_tau < bin_edges(i+1);
- if any(in_bin)
- weights = all_weights(in_bin);
- msd_values = all_msd(in_bin);
- % weighted average: sum(MSD * weight) / sum(weight)
- weighted_mean = sum(msd_values .* weights) / sum(weights);
- ensemble_msd(i) = weighted_mean;
- ensemble_weight(i) = sum(weights);
- % compute effective sample size
- n_eff = (sum(weights))^2 / sum(weights.^2);
- % compute weighted variance
- weighted_variance = sum(weights .* (msd_values - weighted_mean).^2) / sum(weights);
- % SEM = sqrt(weighted variance / effective sample size)
- ensemble_sem(i) = sqrt(weighted_variance / n_eff);
- end
- end
- % remove bins with no data
- validBins = ~isnan(ensemble_msd);
- ensemble_tau = bin_centers(validBins);
- ensemble_msd = ensemble_msd(validBins);
- ensemble_weight = ensemble_weight(validBins);
- ensemble_sem = ensemble_sem(validBins);
- %% Filter ensemble data to delays between minFitDelay and maxFitDelay
- filter_idx = (ensemble_tau >= minFitDelay_micro) & (ensemble_tau <= maxFitDelay_micro);
- ensemble_tau_filt = ensemble_tau(filter_idx);
- ensemble_msd_filt = ensemble_msd(filter_idx);
- ensemble_weight_filt = ensemble_weight(filter_idx);
- ensemble_sem_filt = ensemble_sem(filter_idx);
- %% Fit and Plot the filtered ensemble microscopic MSD curve with SEM error bars
- figure;
- errorbar(ensemble_tau_filt, ensemble_msd_filt, ensemble_sem_filt, 'ko', 'MarkerFaceColor', 'k');
- title(sprintf('Ensemble Microscopic Diffusion Coefficient', minFitDelay_micro, maxFitDelay_micro));
- % xlim([0 0.05]);
- ylim([0 0.008]);
- % Weighted Linear Fit on the Filtered Ensemble MSD
- ft = fittype('poly1');
- % ensure weights are strictly positive
- w_fit = max(ensemble_weight_filt, eps);
- [fitobj, gof] = fit(ensemble_tau_filt', ensemble_msd_filt, ft, 'Weights', w_fit);
- D_ensemble = fitobj.p1 / 6;
- fprintf('Ensemble microscopic diffusion coefficient: D = %g \n', minFitDelay_micro, maxFitDelay_micro, D_ensemble);
- hold on;
- plot(fitobj, 'r-');
- % add R^2 value on the plot
- x_text = min(ensemble_tau_filt) + 0.05*(max(ensemble_tau_filt)-min(ensemble_tau_filt));
- y_text = max(ensemble_msd_filt) - 0.1*(max(ensemble_msd_filt)-min(ensemble_msd_filt));
- text(x_text, y_text, sprintf('R^2 = %.3f', gof.rsquare), 'FontSize', 12, 'Color', 'b');
- legend('MSD data with SEM', 'Weighted linear fit');
- hold off;
- xlabel('Delay (s)');
- ylabel('MSD (\mum^2)');
- %% Fit and Plot the filtered ensemble macroscopic MSD curve with SEM error bars
- % filter the ensemble data for delays between 0.1 and 1 seconds.
- mac_idx = (ensemble_tau >= minFitDelay_macro) & (ensemble_tau <= maxFitDelay_macro);
- mac_tau = ensemble_tau(mac_idx);
- mac_msd = ensemble_msd(mac_idx);
- mac_weight = ensemble_weight(mac_idx);
- mac_sem = ensemble_sem(mac_idx); % SEM calculated previously
- % fit the data with a weighted linear model (poly1).
- ft = fittype('poly1');
- % ensure weights are strictly positive.
- w_fit_mac = max(mac_weight, eps);
- [fitobj_mac, gof_mac] = fit(mac_tau', mac_msd, ft, 'Weights', w_fit_mac);
- % calculate the macroscopic diffusion coefficient.
- % (assuming MSD = 6 * D * tau for 3D diffusion)
- D_mac = fitobj_mac.p1 / 6;
- fprintf('Ensemble macroscopic diffusion coefficient: D = %g \n', D_mac);
- % plot the data with SEM error bars and the weighted linear fit.
- figure;
- errorbar(mac_tau, mac_msd, mac_sem, 'ko', 'MarkerFaceColor', 'k');
- hold on;
- plot(fitobj_mac, 'r-');
- xlabel('Delay (s)');
- ylabel('MSD (\mum^2)');
- title('Ensemble Macroscopic Diffusion Coefficient');
- % add R^2 value text on the plot (adjust position as needed)
- x_text = min(mac_tau) + 0.05*(max(mac_tau)-min(mac_tau));
- y_text = max(mac_msd) - 0.1*(max(mac_msd)-min(mac_msd));
- text(x_text, y_text, sprintf('R^2 = %.3f', gof_mac.rsquare), 'FontSize', 12, 'Color', 'b');
- legend('MSD data with SEM', 'Weighted linear fit');
- hold off;
- xlim([minFitDelay_macro maxFitDelay_macro]);
- ylim([0 0.07]);
- %% Overlay all filtered tracks
- % get unique trace IDs
- uniqueIDs = unique(traces_filt_nano(:,4));
- % extract the valid trace IDs corresponding to tracks passing the R^2 filter:
- validIDs = uniqueIDs(validIdx);
- validDiff = micro_diffusion_coeff(validIdx);
- % get unique trace IDs from the filtered data
- allIDs = unique(traces_filt_nano(:,4));
- % apply the R^2 filter
- validIdx_all = micro_r2_individual >= min_r2;
- validIDs_all = allIDs(validIdx_all);
- nValid = numel(validIDs_all);
- % create a new figure for the overlay plot
- figure;
- hold on;
- xlabel('X (µm)');
- ylabel('Y (µm)');
- zlabel('Z (µm)');
- %title('Overlay of Normalized Tracks');
- grid on;
- axis equal;
- fontname("arial");
- % initialize cell array to hold each isolated 100 ms track for later analysis
- all_tracks = {};
- % loop over each valid, filtered track
- for k = 1:nValid
- currID = validIDs_all(k);
- % extract all data rows corresponding to the current track (columns: 1-3: XYZ, 7: time)
- track_rows = traces_filt_nano(:,4) == currID;
- trackData = traces_filt_nano(track_rows, :);
- trackXYZ = trackData(:, 1:3);
- trackTime = trackData(:, 7);
- % calculate time offset relative to the initial time (first measurement)
- initial_time = trackTime(1);
- time_offset = trackTime - initial_time;
- % only consider tracks that have at least x seconds of tracking time
- if max(time_offset) < track_overlay_time
- continue; % skip this track if it doesn't span x seconds
- end
- % select data for the first x seconds
- idx_time = time_offset <= track_overlay_time;
- trackXYZ = trackXYZ(idx_time, :);
- % Store the isolated track into the cell array
- all_tracks{end+1} = trackXYZ;
- % % normalize the track by subtracting its initial position (first row)
- % initial_pos_track = trackXYZ(1,:);
- % trackXYZ_norm = trackXYZ - initial_pos_track;
- % alternatively, normalize by subtracting its center of mass:
- center_of_mass_track = mean(trackXYZ, 1);
- trackXYZ_norm = trackXYZ - center_of_mass_track;
- % plot the normalized track using a unique color from the colormap
- plot3(trackXYZ_norm(:,1), trackXYZ_norm(:,2), trackXYZ_norm(:,3), '-', 'LineWidth', 0.01, 'Color', [0 0 0 .3]);
- end
- % set the axis limits(in µm)
- xlim([-0.5 0.5]);
- ylim([-0.5 0.5]);
- zlim([-0.5 0.5]);
- xticks([-0.5 -0.4 -0.3 -0.2 -0.1 0 0.1 0.2 0.3 0.4 0.5])
- %% Plot individual MSDs and overlay ensemble mean with SEM error bars
- figure;
- hold on
- % Plot each individual MSD trace in light gray
- nTraj = numel(micro_tau_per_traj);
- for i = 1:nTraj
- tau_vals = micro_tau_per_traj{i};
- msd_vals = micro_MSD_per_traj{i};
- if ~isempty(msd_vals)
- plot(tau_vals, msd_vals, 'Color', [0.7 0.7 0.7]); % light gray line
- end
- end
- errorbar(ensemble_tau_filt, ensemble_msd_filt, ensemble_sem_filt, 'ko', 'MarkerFaceColor', 'k');
- errorbar(mac_tau, mac_msd, mac_sem, 'ko', 'MarkerFaceColor', 'k');
- %plot(fitobj, 'r-');
- %plot(fitobj_mac, 'r-');
- plot(linspace(minFitDelay_micro, maxFitDelay_micro), feval(fitobj, linspace(minFitDelay_micro, maxFitDelay_micro)), 'r-','Color','blue','LineWidth',2);
- plot(linspace(minFitDelay_macro, maxFitDelay_macro), feval(fitobj_mac, linspace(minFitDelay_macro, maxFitDelay_macro)), 'r-','Color','red','LineWidth',2);
- xlim([0 maxFitDelay_macro]);
- ylim([0 0.06]);
- xlabel('Delay (s)');
- ylabel('Mean Squared Displacement (\mum^2)');
- %% Save work
- % % Extract the folder name as prefix
- % [~, prefix] = fileparts(folder_path);
- % save_filename = fullfile(pwd, [prefix '_analyzed.mat']);
- % save(save_filename);
- %
- % disp('Processing completed!')
- %% Functions
- % -------loadData---------
- function [x_all, y_all, z_all, time_all, tid_all, itr_efo_all, itr_fbg_all] = loadData(mat_files)
- x_all = [];
- y_all = [];
- z_all = [];
- time_all = [];
- tid_all = [];
- itr_efo_all = [];
- itr_fbg_all = [];
- for i = 1:length(mat_files)
- file_path = fullfile(mat_files(i).folder, mat_files(i).name);
- load(file_path);
- x_all = [x_all; itr.loc(:,5,1)];
- y_all = [y_all; itr.loc(:,5,2)];
- z_all = [z_all; itr.loc(:,5,3)];
- time_all = [time_all; tim'];
- tid_all = [tid_all; double(tid)'];
- itr_efo_all = [itr_efo_all; itr.efo(:,5)];
- itr_fbg_all = [itr_fbg_all; itr.fbg(:,5)];
- end
- end
- % ---------filterData---------
- function traces_filt = filterData(traces, loc_per_trace_threshold, efo_cutoff, time_gap_threshold, stdev_trace_threshold)
- traces_filt = traces;
- traces_filt(traces_filt(:,5) > efo_cutoff, :)= [];
- [uv_tid, ~, id_tid] = unique(traces(:,4));
- n_tid = histcounts(id_tid,"BinWidth",1);
- traces_filt = traces_filt(ismember(traces_filt(:,4), uv_tid(n_tid > loc_per_trace_threshold)),:);
- % Filter traces by average standard deviation (x, y, and z).
- [uv_tid, ~, id_tid] = unique(traces_filt(:,4));
- stdev_x = accumarray(id_tid, traces_filt(:,1), [], @std);
- stdev_y = accumarray(id_tid, traces_filt(:,2), [], @std);
- stdev_z = accumarray(id_tid, traces_filt(:,3), [], @std);
- avg_stdev = (stdev_x + stdev_y + stdev_z) / 3;
- traces_filt = traces_filt(ismember(traces_filt(:,4), uv_tid(avg_stdev < stdev_trace_threshold)), :);
- uniqueIDs = unique(traces_filt(:,4));
- truncated_data = [];
- for i = 1:length(uniqueIDs)
- idx = traces_filt(:,4) == uniqueIDs(i);
- trackData = traces_filt(idx, :);
- % Sort track data by time (column 7)
- [sortedTimes, sortIdx] = sort(trackData(:,7));
- trackData = trackData(sortIdx, :);
- dt = diff(sortedTimes);
- gapIdx = find(dt > time_gap_threshold, 1, 'first');
- if isempty(gapIdx)
- % If no gap exceeds the threshold, keep the entire track
- truncated_data = [truncated_data; trackData];
- else
- % Truncate the track: keep data from row 1 up to the gap
- truncated_data = [truncated_data; trackData(1:gapIdx, :)];
- end
- end
- traces_filt = truncated_data;
- end
- % ---------calculateMSD_weighted---------
- function [MSD_per_traj, tau_per_traj, weights_per_traj, diffusion_coeff, initial_times, r2_individual] = calculateMSD_weighted(traces, minFitDelay, maxFitDelay)
- x = traces(:,1);
- y = traces(:,2);
- z = traces(:,3);
- id = traces(:,4);
- time = traces(:,7);
- unique_ids = unique(id);
- nTracks = numel(unique_ids);
- MSD_per_traj = cell(nTracks, 1);
- tau_per_traj = cell(nTracks, 1);
- weights_per_traj = cell(nTracks, 1);
- diffusion_coeff = zeros(nTracks, 1);
- initial_times = zeros(nTracks, 1);
- r2_individual = zeros(nTracks, 1);
- for i = 1:nTracks
- idx = id == unique_ids(i);
- x_traj = x(idx);
- y_traj = y(idx);
- z_traj = z(idx);
- time_traj = time(idx);
- % sort the trajectory by time
- [time_traj, sortIdx] = sort(time_traj);
- x_traj = x_traj(sortIdx);
- y_traj = y_traj(sortIdx);
- z_traj = z_traj(sortIdx);
- % store the initial time
- initial_times(i) = time_traj(1);
- % filter the trajectory to include only points within the first 0.5 seconds
- t_end = time_traj(1) + 0.5; % 0.5 second after the first measurement
- valid_idx = time_traj <= t_end;
- time_traj = time_traj(valid_idx);
- x_traj = x_traj(valid_idx);
- y_traj = y_traj(valid_idx);
- z_traj = z_traj(valid_idx);
- % if the filtered trajectory has too few points, then skip it
- N = length(x_traj);
- if N < 2
- MSD_per_traj{i} = [];
- tau_per_traj{i} = [];
- weights_per_traj{i} = [];
- diffusion_coeff(i) = NaN;
- r2_individual(i) = NaN;
- continue;
- end
- msd = zeros(N-1, 1);
- tau_vals = zeros(N-1, 1);
- weights = zeros(N-1, 1);
- for tau = 1:(N-1)
- delta_sq = (x_traj(1+tau:end) - x_traj(1:end-tau)).^2 + ...
- (y_traj(1+tau:end) - y_traj(1:end-tau)).^2 + ...
- (z_traj(1+tau:end) - z_traj(1:end-tau)).^2;
- msd(tau) = mean(delta_sq);
- tau_vals(tau) = mean(time_traj(1+tau:end) - time_traj(1:end-tau));
- weights(tau) = numel(delta_sq);
- end
- valid_msd_idx = msd <= 10;
- msd = msd(valid_msd_idx);
- tau_vals = tau_vals(valid_msd_idx);
- weights = weights(valid_msd_idx);
- MSD_per_traj{i} = msd;
- tau_per_traj{i} = tau_vals;
- weights_per_traj{i} = weights;
- % restrict the individual linear fit to delays within [minFitDelay, maxFitDelay]
- fitIdx = (tau_vals >= minFitDelay) & (tau_vals <= maxFitDelay);
- if sum(fitIdx) < 2
- diffusion_coeff(i) = NaN; % Not enough data for a reliable fit.
- r2_individual(i) = NaN;
- else
- coeffs = polyfit(tau_vals(fitIdx), msd(fitIdx), 1);
- diffusion_coeff(i) = coeffs(1) / 6;
- % compute fitted values and R^2
- fitted_vals = polyval(coeffs, tau_vals(fitIdx));
- SS_res = sum((msd(fitIdx) - fitted_vals).^2);
- SS_tot = sum((msd(fitIdx) - mean(msd(fitIdx))).^2);
- if SS_tot == 0
- r2_individual(i) = 1;
- else
- r2_individual(i) = 1 - SS_res/SS_tot;
- end
- end
- end
- end
MINFLUX_Tracking_Analysis_Mulhall_2025.m at commit ab0bbde, under GPL-3.0 · at the source
Overview
- Howard Hughes Medical Institute, Department of Neuroscience, Dorris Neuroscience Center, Scripps Research,La Jolla, CA USA
- Vollum Institute, Oregon Health & Science University,Portland, OR USA
- Present Address: Department of Chemical Physiology and Biochemistry, Oregon Health & Science University,Portland, OR USA
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
ab0bbde6c01c01480d23e4ef55915a284ec0d21f, 30 September 2025Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
10 files
- Dependencies/
GMM.m , MATLAB, 82 lines - Dependencies/
cluster_data.m , MATLAB, 160 lines - Dependencies/
cluster_data_MINFLUX.m , MATLAB, 112 lines - Dependencies/
dbscan2_MINFLUX.m , MATLAB, 152 lines - Dependencies/
gmm_eval.m , MATLAB, 20 lines - Dependencies/
plot_clusters.m , MATLAB, 126 lines - MINFLUX_Cluster_Analysis
_Mulhall_2025.m , MATLAB, 651 lines, 2 matches - MINFLUX_Tracking_Analysi
s_Mulhall_2025.m , MATLAB, 520 lines, 5 matches - LICENSE, License, 674 lines
- README.md, Text, 116 lines
Zenodo 17625937
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
10 files
- Dependencies/
GMM.m , MATLAB, 82 lines - Dependencies/
cluster_data.m , MATLAB, 160 lines - Dependencies/
cluster_data_MINFLUX.m , MATLAB, 112 lines - Dependencies/
dbscan2_MINFLUX.m , MATLAB, 152 lines - Dependencies/
gmm_eval.m , MATLAB, 20 lines - Dependencies/
plot_clusters.m , MATLAB, 126 lines - MINFLUX_Cluster_Analysis
_Mulhall_2025.m , MATLAB, 651 lines - MINFLUX_Tracking_Analysi
s_Mulhall_2025.m , MATLAB, 520 lines - LICENSE, License, 674 lines
- README.md, Text, 116 lines
Code availability
Custom MATLAB code for analysis of MINFLUX structural and tracking data are available at GitHub (https://
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
- uniprot.org/
uniprot/ , at UniProt; found in the text, “Expression constructs”e2jf22 - uniprot.org/
uniprot/ , at UniProt; found in the text, “Expression constructs”q8cd54 - zenodo:17644763, at Zenodo; found in “Data availability”
Data availability
Published protein structures were obtained from the RSCB Protein Data Bank (6B3R (https://
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://
BibTeX
@article{mulhall2026mole
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/
url = {https://
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/
VL - 653
IS - 8113
SP - 297
EP - 305
SN - 0028-0836
PB - Nature Portfolio
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"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":
"volume": "653",
"issue": "8113",
"page": "297-305",
"DOI": "10.1038/
"PMID": "41781615",
"PMCID": "PMC13149025",
"ISSN": "0028-0836",
"publisher": "Nature Portfolio",
"URL": "https://
"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 communicationsIn 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: iScienceIn 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: iScienceIn 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 communicationsIn 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: iScienceIn 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 methodsIn 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: NeurophotonicsIn 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: GliaIn 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 communicationsIn 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 physiologyIn 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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 2 repositories of the authors' code, each at its verified commit and with its license, 16 scripts, and 7 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:1c766ed227f24378…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
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.
