Coordinated hand movement sensation revealed through an implanted magnetic prosthetic kinesthetic interface.
The 8 matches
- [1] § MATERIALS AND METHODS › Minimum pulse duration experiment ↔ TimeVibrations/PerceptionTimeAnalysis.m, lines 1–8 · score 0.71 · minimum perceptible pulse, adaptive sequence, staircase, duration, vibrations
- [2] § RESULTS › The character of perceived kinesthetic sensation ↔ TimeVibrations/PerceptionTimeAnalysis.m, lines 1–8 · score 0.66 · minimum perceptible pulse, adaptive sequence, duration threshold, staircase, vibration
- [3] § MATERIALS AND METHODS › Data analysis of the kinematics data from MKk-P1, TMRk-P2, and TMRk-P5 ↔ HandRenderings/mainSimulator.m, lines 90–130 · score 0.63 · joint angles, ab, imported, DIP, PIP, MCP
- [4] § MATERIALS AND METHODS › Data analysis of the kinematics data from MKk-P1, TMRk-P2, and TMRk-P5 ↔ HandRenderings/mjhaptix150/apicpp/haptix.h, lines 226–305 · score 0.56 · relative positions, distance, angular, kinematic, vectors, frame
- [5] § MATERIALS AND METHODS › Exploring the kinesthetic perception when MKk-P1 was naïve to magnetically induced stimulation ↔ KinestheticHandEvents/HandSensationSearchSpaceComplete.m, lines 1–9 · score 0.53 · search space, S2A, hotspots, event, Gaussian, kinesthetic
- [6] § MATERIALS AND METHODS › Minimum pulse duration experiment ↔ TimeVibrations/PerceptionTimeAnalysis.m, lines 44–91 · score 0.52 · pulse duration threshold, sequence, stimulation, median, vibration
- [7] § MATERIALS AND METHODS › Exploring the kinesthetic perception when MKk-P1 was naïve to magnetically induced stimulation ↔ KinestheticHandEvents/HandSensationSearchSpaceComplete.m, lines 30–35 · score 0.52 · square wave, search space, sensation, kinesthetic
- [8] § MATERIALS AND METHODS › Statistical analysis ↔ Likert/LikertCombined.m, lines 1–11 · score 0.51 · Wilcoxon signed rank, nonparametric, median
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 · 213 lines · 7.8 KB · no license · 3 matches
- %% FINAL SCRIPT ANALYSIS – Time Thresholds
- % Computes minimum perceptible pulse duration thresholds per site from
- % staircase/adaptive sequences; visualizes sequences and summarizes samples.
- %
- % This code generates Fig. 5A,b and fig. S5
- clc; clear; close all;
- warning off % Not ideal — prefer fixing root causes or using warning('once',...)
- %% ---------------- Figure / Graph Settings ----------------
- % External viz toolbox (daboxplot)
- addpath(genpath("frank-pk-DataViz-3.2.3.0"));
- % Color palettes per site (proximal / distal) as HEX
- FCUhex = ["#AF3C60", "#DF483A"];
- FPLhex = ["#F3C23A", "#277778"];
- EDhex = ["#265F79", "#82B4BC"];
- % Convert HEX -> RGB triplets for plotting robustness
- FCUcolor = [hex2rgb(FCUhex(1)); hex2rgb(FCUhex(2))];
- FPLcolor = [hex2rgb(FPLhex(1)); hex2rgb(FPLhex(2))];
- EDcolor = [hex2rgb(EDhex(1)); hex2rgb(EDhex(2)) ];
- % Row order: FCU-P, FPL-P, ED-P, FCU-D, FPL-D, ED-D
- Colors = [FCUcolor(1,:); FPLcolor(1,:); EDcolor(1,:); ...
- FCUcolor(2,:); FPLcolor(2,:); EDcolor(2,:)];
- % greys and accents
- grey = [0.3 0.3 0.3];
- forestgreen = [0 0.6 0.5];
- skyblue = [0.35 0.7 0.9];
- vermilion = [0.8 0.4 0.0]; %#ok<NASGU>
- SiteNames = ["FCU-P"; "FPL-P"; "ED-P"; "FCU-D"; "FPL-D"; "ED-D"];
- numSites = numel(SiteNames);
- % Plot axis defaults for sequence panels (tweak as needed)
- xlimSeq = [0 60];
- ylimSeq = [0 550];
- %% ---------------------- Load Data Path -------------------
- addpath(genpath("StimulationData"));
- %% -------------------- Threshold Analysis -----------------
- NumMin = 3; % number of final minima used
- samplesPer = 2*NumMin; % minima and their preceding samples
- thArray = NaN(numSites,1); % one threshold per site
- samplArray = NaN(samplesPer, numSites); % 6×6: rows=samples, cols=sites
- % Tiled layout: 6 sequence panels + 1 legend row
- figure('Units','normalized','Position',[0.1 0.2 0.7 0.6], 'Color', 'w');
- t1 = tiledlayout(7,3);
- title(t1, "Pulse Duration Adaptive Sequences");
- t1.Title.FontName = 'times';
- t1.Title.FontSize = 18;
- t1.Title.FontWeight= 'bold';
- for i = 1:numSites
- fileName = "StimulationTimingsSite" + num2str(i) + ".mat";
- S = load(fileName); % expects variable 'StimulationTimings'
- data = S.StimulationTimings(:).'; % ensure row vector
- [th, samplIdx] = ComputeThreshold(data, NumMin);
- thArray(i) = th;
- samplArray(:,i)= data(samplIdx).'; % store the 2*NumMin sample values
- % Sequence panel
- graph_sequence(data, th, samplIdx, Colors(i,:), SiteNames(i), xlimSeq, ylimSeq);
- % Hide y-axis for columns 2 and 3 (keep column 1)
- if mod(i,3) ~= 1
- ax = gca; ax.YAxis.Visible = 'off';
- end
- end
- % Legend row
- nexttile([1 3]);
- plot(nan, 'LineStyle','-','Color', grey, 'LineWidth',0.5, 'Marker','o', ...
- 'MarkerFaceColor', grey, 'MarkerEdgeColor', grey, 'DisplayName',"Sequence");
- hold on
- scatter(nan, nan, 500, 'filled', 'Marker','square', ...
- 'MarkerEdgeColor', grey, 'MarkerFaceColor', grey, 'DisplayName',"Samples");
- yline(nan, 'Color', [0.6 0.6 0.6], 'LineStyle','--', 'LineWidth',1, 'DisplayName',"Threshold");
- hold off
- axis off
- legend('Orientation','horizontal','Location','north', ...
- 'FontSize',14,'FontName','times');
- fprintf('Mean of the duration thresholds: %.2f ms\n', mean(thArray,'omitnan'));
- fprintf('Median of the duration thresholds: %.2f ms\n', median(thArray,'omitnan'));
- %% -------------------- Summary Boxplots --------------------
- % Group index: 6 groups (sites), 6 samples per group
- group_inx = reshape(repmat(1:numSites, samplesPer, 1), [], 1);
- dataVec = samplArray(:);
- % Colors for the 6 groups (numeric RGB, matching earlier order)
- ColorsBox = [ ...
- 0.6862745098039216 0.23529411764705882 0.3764705882352941; % FCU-P
- 0.9529411764705882 0.7607843137254902 0.22745098039215686; % FPL-P
- 0.14901960784313725 0.37254901960784315 0.4745098039215686; % ED-P
- 0.8745098039215686 0.2823529411764706 0.22745098039215686; % FCU-D
- 0.15294117647058825 0.4666666666666667 0.47058823529411764; % FPL-D
- 0.5098039215686274 0.7058823529411765 0.7372549019607844]; % ED-D
- figure('Units','normalized','Position',[0.2 0.2 0.25 0.5], 'Color','w');
- % Right y-axis: cycles at baseHz (default 90 Hz)
- % baseHz = 90; % adjust if needed
- % yyaxis right
- % ylabel('# cycles','FontSize',12)
- % ax = gca; ax.FontName = 'times';
- % % Show 0..5 cycles mapped into ms (1 cycle = 1000/baseHz ms)
- % msTicks = (0:5) * (1000/baseHz);
- % ylim([0 62]); yticks(msTicks); yticklabels(string(0:5));
- % Left y-axis: durations
- % yyaxis left
- daboxplot(dataVec, 'groups', group_inx, 'colors', ColorsBox, ...
- 'whiskers', 0, 'scatter', 1, 'jitter', 0, ...
- 'scattersize', 13, 'scatteralpha', 0.5, 'mean', 1, 'boxwidth', 1.5);
- ylabel('Duration (ms)','FontSize',12)
- ylim([0 62]); yticks(0:10:60);
- ax = gca; ax.FontName = 'times';
- title('Samples around last minima (per site)');
- %% ----------------------- Helper functions ------------------------
- function [th, samplIdx] = ComputeThreshold(data, NumMin)
- % Compute threshold from the last NumMin local minima and their preceding samples.
- % RETURNS:
- % th = median of the 2*NumMin samples (ms)
- % samplIdx = 1×(2*NumMin) indices used to compute threshold
- if nargin < 2, NumMin = 3; end
- data = data(:).'; % row vector
- % Local minima indices
- mins = find(islocalmin(data));
- % Guard: need at least NumMin minima
- if numel(mins) < NumMin
- % Fallback: use last 2*NumMin points if not enough minima
- lastN = min(2*NumMin, numel(data));
- samplIdx = numel(data)-lastN+1 : numel(data);
- th = median(data(samplIdx));
- return;
- end
- % Take the last NumMin minima
- mins = mins(end-NumMin+1:end);
- % Preceding samples (guard against index 1)
- prev = max(mins - 1, 1);
- % Combine and sort unique indices
- samplIdx = sort(unique([prev, mins]));
- % If we somehow got fewer than 2*NumMin (e.g., duplicate at index 1), pad forwards
- while numel(samplIdx) < 2*NumMin && samplIdx(end) < numel(data)
- samplIdx(end+1) = samplIdx(end) + 1; %#ok<AGROW>
- end
- th = median(data(samplIdx));
- end
- function graph_sequence(data, th, samplIdx, color, titlestr, xlimSeq, ylimSeq)
- % Plot a single sequence panel in the tiled layout.
- t = nexttile([3,1]);
- plot(data, 'LineStyle','-', 'Color',color, 'LineWidth',0.5, ...
- 'Marker','o', 'MarkerSize',3, ...
- 'MarkerFaceColor', color, 'MarkerEdgeColor', color, ...
- 'DisplayName',"Sequence"); hold on
- scatter(samplIdx, data(samplIdx), 60, 'filled', ...
- 'Marker','square', 'MarkerEdgeColor', color, ...
- 'MarkerFaceColor', color, 'MarkerFaceAlpha', 0.5, ...
- 'DisplayName',"Samples");
- yline(th, 'Color', color, 'Linestyle','--', 'LineWidth',1, ...
- 'DisplayName',"Threshold");
- hold off
- xlabel('Stimulus number','FontSize',12)
- ylabel('Duration (ms)','FontSize',12)
- title(titlestr)
- % Safe label positions (handle short sequences gracefully)
- tailN = min(30, numel(data));
- tailMax = max(data(max(1, end-tailN+1):end));
- text(numel(data), tailMax + 0.22*range(ylimSeq), ...
- "Median = " + num2str(th,'%.1f'), ...
- "HorizontalAlignment","right","FontSize",8,"Color",[0.6 0.6 0.6]);
- text(numel(data), tailMax + 0.08*range(ylimSeq), ...
- "Deviation = " + num2str(max(data(samplIdx)) - min(data(samplIdx)),'%.1f'), ...
- "HorizontalAlignment","right","FontSize",8,"Color",[0.6 0.6 0.6]);
- ylim(ylimSeq); xlim(xlimSeq);
- % t.YGrid = 'on';
- ax = gca; ax.FontName = 'times';
- end
- function rgb = hex2rgb(hex)
- % Convert "#RRGGBB" (or "RRGGBB") to [r g b] in 0..1
- hex = char(hex);
- if hex(1) == '#', hex = hex(2:end); end
- if numel(hex) ~= 6, error('hex2rgb: bad hex color "%s"', hex); end
- r = hex(1:2); g = hex(3:4); b = hex(5:6);
- rgb = [hexpair2num(r), hexpair2num(g), hexpair2num(b)] / 255;
- end
- function out = hexpair2num(p)
- out = hex2dec(p);
- end
PerceptionTimeAnalysis.m at commit 2c16efa, no license · at the source
Overview
- The BioRobotics Institute Scuola Superiore Sant’Anna, Pisa 56127, Italy
- Department of Excellence in Robotics and AI, Scuola Superiore Sant’Anna, Pisa 56127, Italy
- Technical University of Munich, Germany; TUM School of Computation, Information and Technology, Department of Computer Engineering, Chair of Intelligent Bio-Robotic Systems; Munich Institute of Robotics and Machine Intelligence (MIRMI), Garching 85748, Germany
- Laboratory for Bionic Integration, Department of Biomedical Engineering, Cleveland Clinic Research, 9500 Euclid Avenue, ND20, Cleveland, OH 44195, USA
- Department of Psychiatry, Icahn School of Medicine at Mount Sinai, New York, NY 10029,USA
- Orthopaedics and Traumatology Unit, University Hospital of Pisa, Pisa 56124, Italy
- Epilepsy Center, Neurological Institute, Cleveland Clinic, 9500 Euclid Avenue, Desk S-51, Cleveland, OH 44195, USA
Abstract
Muscle contractions to control prosthetic hands do not feel like those to control natural hands because amputation decouples movement sense (kinesthesia) from movement execution. The myokinetic kinesthetic interface (MKkI) uses remote vibration of permanent magnets implanted in amputated forearm muscles to restore kinesthesia. A participant reported coordinated finger movements of hand closing and opening, constrained within physiological bounds, with stereotypical conformations and dynamics. Aggregated unstructured explorations and systematic psychophysics exposed unreported perceptual sensitivity at vibration frequencies that trigger kinesthetic sensations. Complex coordinated grip sensations elicited from single forearm muscles reveal that kinesthetic brain representations are likely rooted in perception of synergistic movement production. By leveraging the natural synergistic features of kinesthesia, the MKkI will help link perception and action to functionally elevate emerging intuitive bidirectional human-machine interfaces.
Reproduced under the paper's license (CC BY-NC), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 8 matches between paragraphs and lines of code.
Zenodo 17260640
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
76 files
- HandRenderings/
mainSimulator.m , MATLAB, 192 lines - HandRenderings/
mjhaptix150/ , C++, 102 linesapicpp/ grasp.cpp - HandRenderings/
mjhaptix150/ , C/C++, 622 linesapicpp/ haptix.h - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ hx_close.m - HandRenderings/
mjhaptix150/ , MATLAB, 8 linesapimex/ hx_connect.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ hx_read_sensors.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ hx_robot_info.m - HandRenderings/
mjhaptix150/ , MATLAB, 19 linesapimex/ hx_update.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_close.m - HandRenderings/
mjhaptix150/ , MATLAB, 11 linesapimex/ mj_connect.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_connected.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_equality.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_actuator.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_applied.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_body.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_contact.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_control.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_dynamics.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_force.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_geom.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_mocap.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_onebody.m - HandRenderings/
mjhaptix150/ , MATLAB, 8 linesapimex/ mj_get_rgba.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_sensor.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_site.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_state.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_tendon.m - HandRenderings/
mjhaptix150/ , MATLAB, 8 linesapimex/ mj_id2name.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_info.m - HandRenderings/
mjhaptix150/ , MATLAB, 10 linesapimex/ mj_message.m - HandRenderings/
mjhaptix150/ , MATLAB, 8 linesapimex/ mj_name2id.m - HandRenderings/
mjhaptix150/ , MATLAB, 11 linesapimex/ mj_reset.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_applied.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_control.m - HandRenderings/
mjhaptix150/ , MATLAB, 9 linesapimex/ mj_set_geomsize.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_mocap.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_onebody.m - HandRenderings/
mjhaptix150/ , MATLAB, 9 linesapimex/ mj_set_rgba.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_state.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_step.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_update.m - HandRenderings/
mjhaptix150/ , C++, 1,397 linesapimex/ mjhx.cpp - HandRenderings/
mjhaptix150/ , MATLAB, 241 linesapimex/ playlog.m - HandRenderings/
mjhaptix150/ , MATLAB, 42 linesapimex/ readlog.m - KinestheticHandEvents/
HandEventsByWaveform.m , MATLAB, 85 lines - KinestheticHandEvents/
HandSensationSearchSpace , MATLAB, 243 linesComplete.m - KinestheticHandEvents/
HandSensationSearchSpace , MATLAB, 244 linesNaive.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 438 lines/ dabarplot/ dabarplot.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 97 lines/ dabarplot/ dabarplot_demo.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 450 lines/ daboxplot/ daboxplot.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 121 lines/ daboxplot/ daboxplot_demo.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 505 lines/ daviolinplot/ daviolinplot.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 99 lines/ daviolinplot/ daviolinplot_demo.m - Likert/
LikertCombined.m , MATLAB, 152 lines - Likert/
LikertSeparate.m , MATLAB, 145 lines - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 438 lines/ dabarplot/ dabarplot.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 97 lines/ dabarplot/ dabarplot_demo.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 450 lines/ daboxplot/ daboxplot.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 121 lines/ daboxplot/ daboxplot_demo.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 505 lines/ daviolinplot/ daviolinplot.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 99 lines/ daviolinplot/ daviolinplot_demo.m - TimeVibrations/
PerceptionTimeAnalysis.m , MATLAB, 213 lines - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 438 lines/ dabarplot/ dabarplot.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 97 lines/ dabarplot/ dabarplot_demo.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 451 lines/ daboxplot/ daboxplot.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 121 lines/ daboxplot/ daboxplot_demo.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 505 lines/ daviolinplot/ daviolinplot.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 99 lines/ daviolinplot/ daviolinplot_demo.m - VividnessVibrations/
Vividness_DataAnalysis.m , MATLAB, 315 lines - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 438 lines/ dabarplot/ dabarplot.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 97 lines/ dabarplot/ dabarplot_demo.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 450 lines/ daboxplot/ daboxplot.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 121 lines/ daboxplot/ daboxplot_demo.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 505 lines/ daviolinplot/ daviolinplot.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 99 lines/ daviolinplot/ daviolinplot_demo.m - README.md, Text, 131 lines
apeparrot/myokinetic-kinesthetic-interface
2c16efad4731f06211f7e1d606dad7c1da4e9c74, 3 October 2025Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
76 files
- HandRenderings/
mainSimulator.m , MATLAB, 192 lines, 1 match - HandRenderings/
mjhaptix150/ , C++, 102 linesapicpp/ grasp.cpp - HandRenderings/
mjhaptix150/ , C/C++, 622 lines, 1 matchapicpp/ haptix.h - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ hx_close.m - HandRenderings/
mjhaptix150/ , MATLAB, 8 linesapimex/ hx_connect.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ hx_read_sensors.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ hx_robot_info.m - HandRenderings/
mjhaptix150/ , MATLAB, 19 linesapimex/ hx_update.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_close.m - HandRenderings/
mjhaptix150/ , MATLAB, 11 linesapimex/ mj_connect.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_connected.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_equality.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_actuator.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_applied.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_body.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_contact.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_control.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_dynamics.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_force.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_geom.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_mocap.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_onebody.m - HandRenderings/
mjhaptix150/ , MATLAB, 8 linesapimex/ mj_get_rgba.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_sensor.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_site.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_state.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_get_tendon.m - HandRenderings/
mjhaptix150/ , MATLAB, 8 linesapimex/ mj_id2name.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_info.m - HandRenderings/
mjhaptix150/ , MATLAB, 10 linesapimex/ mj_message.m - HandRenderings/
mjhaptix150/ , MATLAB, 8 linesapimex/ mj_name2id.m - HandRenderings/
mjhaptix150/ , MATLAB, 11 linesapimex/ mj_reset.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_applied.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_control.m - HandRenderings/
mjhaptix150/ , MATLAB, 9 linesapimex/ mj_set_geomsize.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_mocap.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_onebody.m - HandRenderings/
mjhaptix150/ , MATLAB, 9 linesapimex/ mj_set_rgba.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_set_state.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_step.m - HandRenderings/
mjhaptix150/ , MATLAB, 7 linesapimex/ mj_update.m - HandRenderings/
mjhaptix150/ , C++, 1,397 linesapimex/ mjhx.cpp - HandRenderings/
mjhaptix150/ , MATLAB, 241 linesapimex/ playlog.m - HandRenderings/
mjhaptix150/ , MATLAB, 42 linesapimex/ readlog.m - KinestheticHandEvents/
HandEventsByWaveform.m , MATLAB, 85 lines - KinestheticHandEvents/
HandSensationSearchSpace , MATLAB, 243 lines, 2 matchesComplete.m - KinestheticHandEvents/
HandSensationSearchSpace , MATLAB, 244 linesNaive.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 438 lines/ dabarplot/ dabarplot.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 97 lines/ dabarplot/ dabarplot_demo.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 450 lines/ daboxplot/ daboxplot.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 121 lines/ daboxplot/ daboxplot_demo.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 505 lines/ daviolinplot/ daviolinplot.m - KinestheticHandEvents/
frank-pk-DataViz-3.2.3.0 , MATLAB, 99 lines/ daviolinplot/ daviolinplot_demo.m - Likert/
LikertCombined.m , MATLAB, 152 lines, 1 match - Likert/
LikertSeparate.m , MATLAB, 145 lines - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 438 lines/ dabarplot/ dabarplot.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 97 lines/ dabarplot/ dabarplot_demo.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 450 lines/ daboxplot/ daboxplot.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 121 lines/ daboxplot/ daboxplot_demo.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 505 lines/ daviolinplot/ daviolinplot.m - Likert/
frank-pk-DataViz-3.2.3.0 , MATLAB, 99 lines/ daviolinplot/ daviolinplot_demo.m - TimeVibrations/
PerceptionTimeAnalysis.m , MATLAB, 213 lines, 3 matches - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 438 lines/ dabarplot/ dabarplot.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 97 lines/ dabarplot/ dabarplot_demo.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 451 lines/ daboxplot/ daboxplot.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 121 lines/ daboxplot/ daboxplot_demo.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 505 lines/ daviolinplot/ daviolinplot.m - TimeVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 99 lines/ daviolinplot/ daviolinplot_demo.m - VividnessVibrations/
Vividness_DataAnalysis.m , MATLAB, 315 lines - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 438 lines/ dabarplot/ dabarplot.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 97 lines/ dabarplot/ dabarplot_demo.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 450 lines/ daboxplot/ daboxplot.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 121 lines/ daboxplot/ daboxplot_demo.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 505 lines/ daviolinplot/ daviolinplot.m - VividnessVibrations/
frank-pk-DataViz-3.2.3.0 , MATLAB, 99 lines/ daviolinplot/ daviolinplot_demo.m - README.md, Text, 131 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 150 scripts, each with its path and the digest of its content;
- 8 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, code, and materials availability
All data and code needed to evaluate and reproduce the results in the paper are present in the paper and/
Reproduced under the paper's license (CC BY-NC), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 2, 28 September 2026
- Authors: added Ülgen Kilic (0000-0002-4096-8417); removed Ülgen Kilic
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 14 authors, 6 MeSH terms, 1 funder, 47 references.
Cite
This paper
Masiero, F., Gentile, M., Gherardini, M., La Frazia, E., Moore, C. H., Kilic, Ü., Ianniciello, V., Reho, R., Mori, T., Paggetti, F., Andreani, L., Whitton, S. A., Marasco, P. D., & Cipriani, C. (2026). Coordinated hand movement sensation revealed through an implanted magnetic prosthetic kinesthetic interface. Science advances, 12(26), eadx5046. https://
BibTeX
@article{masiero2026coor
author = {Masiero, Federico and Gentile, Mattia and Gherardini, Marta and La Frazia, Eliana and Moore, Charles H and Kilic, Ülgen and Ianniciello, Valerio and Reho, Roberta and Mori, Tommaso and Paggetti, Flavia and Andreani, Lorenzo and Whitton, Simon A and Marasco, Paul D and Cipriani, Christian},
title = {{Coordinated hand movement sensation revealed through an implanted magnetic prosthetic kinesthetic interface}},
journal = {Science advances},
year = {2026},
month = jun,
volume = {12},
number = {26},
pages = {eadx5046},
publisher = {American Association for the Advancement of Science},
issn = {2375-2548},
doi = {10.1126/
url = {https://
pmid = {42341125},
pmcid = {PMC13292950}
}
RIS
TY - JOUR
AU - Masiero, Federico
AU - Gentile, Mattia
AU - Gherardini, Marta
AU - La Frazia, Eliana
AU - Moore, Charles H
AU - Kilic, Ülgen
AU - Ianniciello, Valerio
AU - Reho, Roberta
AU - Mori, Tommaso
AU - Paggetti, Flavia
AU - Andreani, Lorenzo
AU - Whitton, Simon A
AU - Marasco, Paul D
AU - Cipriani, Christian
TI - Coordinated hand movement sensation revealed through an implanted magnetic prosthetic kinesthetic interface
T2 - Science advances
J2 - Sci Adv
PY - 2026
DA - 2026/
VL - 12
IS - 26
SP - eadx5046
SN - 2375-2548
PB - American Association for the Advancement of Science
DO - 10.1126/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1126/
"type": "article-journal",
"title": "Coordinated hand movement sensation revealed through an implanted magnetic prosthetic kinesthetic interface",
"container-title": "Science advances",
"author": [
{
"family": "Masiero",
"given": "Federico"
},
{
"family": "Gentile",
"given": "Mattia"
},
{
"family": "Gherardini",
"given": "Marta"
},
{
"family": "La Frazia",
"given": "Eliana"
},
{
"family": "Moore",
"given": "Charles H"
},
{
"family": "Kilic",
"given": "Ülgen"
},
{
"family": "Ianniciello",
"given": "Valerio"
},
{
"family": "Reho",
"given": "Roberta"
},
{
"family": "Mori",
"given": "Tommaso"
},
{
"family": "Paggetti",
"given": "Flavia"
},
{
"family": "Andreani",
"given": "Lorenzo"
},
{
"family": "Whitton",
"given": "Simon A"
},
{
"family": "Marasco",
"given": "Paul D"
},
{
"family": "Cipriani",
"given": "Christian"
}
],
"container-title-short":
"volume": "12",
"issue": "26",
"page": "eadx5046",
"DOI": "10.1126/
"PMID": "42341125",
"PMCID": "PMC13292950",
"ISSN": "2375-2548",
"publisher": "American Association for the Advancement of Science",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
24
]
]
}
}
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-71961-4 [code]
- Spatiotemporal asymmetries on brain energy landscape uncover system entrapment related to depression severity.Journal: Nature communicationsIn common: author Ülgen Kilic
- [2] doi:10.1111/ejn.70597
- Superficial Ventral Premotor Pathways to Primary Motor Cortex Shape the Temporal Coordination of Precision Graspinnog.Journal: The European journal of neuroscienceIn common: 3 references
- [3] doi:10.1038/s41593-026-02345-6 [code]
- Human hippocampal ripples tune cortical responses based on predicted uncertainty.Journal: Nature neuroscienceIn common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, cognitive
- [4] doi:10.1093/cercor/bhag040 [code]
- BOLD response delays represent local cortical processing.Journal: Cerebral cortex (New York, N.Y. : 1991)In common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, cognitive
- [5] doi:10.1126/sciadv.aeb5352 [code]
- Indirect pathway neurons in the tail of the striatum regulate inhibitory control over sensory driven behavior.Journal: Science advancesIn common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, cognitive
- [6] doi:10.1038/s41467-026-75945-2 [code]
- Neural dynamics for working memory and evidence integration during olfactory navigation in Drosophila.Journal: Nature communicationsIn common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, cognitive
- [7] doi:10.1016/j.isci.2026.116240 [code]
- Physical activity enhances theta-periodicity of visual attentional allocation.Journal: iScienceIn common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, cognitive
- [8] doi:10.1038/s41598-026-54678-8 [code]
- Neural correlates of appetitive extinction learning: an fMRI study with actively participating pigeons.Journal: Scientific reportsIn common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox, cognitive
- [9] doi:10.1126/sciadv.aea1037 [code]
- Distinct cortical spatial representations learned along disparate visual pathways.Journal: Science advancesIn common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox
- [10] doi:10.1038/s41467-026-76306-9 [code]
- Non-invasive characterization of perivascular subarachnoid spaces.Journal: Nature communicationsIn common: Curve Fitting Toolbox, Statistics and Machine Learning Toolbox
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, 150 scripts, and 8 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:2c41c8f49a0d8938…
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.
