Human tactile FA1 neurons (Hay and Pruszynski 2020)

 Download zip file 
Help downloading and running models
Accession:266798
"... we show that synaptic integration across the complex signals from the first-order neuronal population could underlie human ability to accurately (< 3°) and rapidly process the orientation of edges moving across the fingertip. We first derive spiking models of human first-order tactile neurons that fit and predict responses to moving edges with high accuracy. We then use the model neurons in simulating the peripheral neuronal population that innervates a fingertip. We train classifiers performing synaptic integration across the neuronal population activity, and show that synaptic integration across first-order neurons can process edge orientations with high acuity and speed. ... our models suggest that integration of fast-decaying (AMPA-like) synaptic inputs within short timescales is critical for discriminating fine orientations, whereas integration of slow-decaying (NMDA-like) synaptic inputs supports discrimination of coarser orientations and maintains robustness over longer timescales"
Reference:
1 . Hay E, Pruszynski JA (2020) Orientation processing by synaptic integration across first-order tactile neurons. PLoS Comput Biol 16:e1008303 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell; Axon; Realistic Network;
Brain Region(s)/Organism: Human;
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s): AMPA; NMDA;
Gene(s):
Transmitter(s):
Simulation Environment: MATLAB;
Model Concept(s): Sensory coding; Synaptic Integration; Receptive field;
Implementer(s):
Search NeuronDB for information about:  AMPA; NMDA;
% Author: Etay Hay
% Orientation processing by synaptic integration across first-order tactile neurons (Hay and Pruszynski 2020)

warning off
close all;
clear all;
rng(1234);

savefig = 'y';
filetype = '-dtiff';
ploscb_pwidth = 19.05;
ploscb_pheight = 22.23;

% Data of spikes in time and space 
% 1 - time (s)
% 2 - position translation (mm)
% 3 - position rotation (mm)
% 4 - instantaneous speed (mm/s)
% 5 - instantaneous contact force

cellnames = {...
	'ap001FAI_Nerve____VideoCLW_DIR0__Drumpilot3-193.b00',...
	'sx0302FAI_Nerve____VideoCLW_DIR0__Drumpilot3-212.b00',...
	'ra0410FAI_Nerve____VideoCLW_DIR0__Drumpilot3-250.b00',...
	'ra0411FAI_Nerve____VideoCLW_DIR0__Drumpilot3-256.b00_c',...
	'lk0602FAI_Nerve____VideoCLW_DIR0__Drumpilot3-260.b00',...
	'fb1001FAI_Nerve____VideoCLW_DIR0__Drumpilot3-299.b00',...
	'pd1101FAI_Nerve____VideoCCLWDIR0__Drumpilot3-313.b00',... % opposite direction
	'pd1102FAI_Nerve____VideoCLW_DIR0__Drumpilot3-315.b00',...
	'pd1103FAI_Nerve____VideoCCLWDIR0__Drumpilot3-317.b00',... % opposite direction
	'sc1203FAI_Nerve____VideoCCLWDIR0__Drumpilot3-324.b00',... % opposite direction
	'JO1601FAI_Nerve____VideoCCLWDIR0__Drumpilot3-343.b00',... % opposite direction
	'SH1701FAI_Nerve____VideoCCLWDIR90_Drumpilot3-357.b00',... % opposite direction
	'SH1703FAI_Nerve____VideoCCLWDIR90_Drumpilot3-358.b00',... % opposite direction
	'ha28FAI_Nerve____VideoCCLWDIR0__Drumpilot3-444.b00',... % opposite direction , noisy response and between stims
	'ha28FAI_Nerve____VideoCLW_DIR0__Drumpilot3-445.b00',...
	'jk29FAI_Nerve____VideoCLW_DIR0__Drumpilot3-453.b00',...
	'jk29FAI_Nerve____VideoCLW_DIR0__Drumpilot3-456.b00',...
	'ms29FAI_Nerve____VideoCLW_DIR90_Drumpilot3-469.b00',...
	'is3201FAI_Nerve____VideoCLW_DIR0__Drumpilot3-423.b00',... % receptive field larger than dot spacing
};
	
drum_speed = .03; % (mm/ms)
dx = drum_speed; % RF resolution x-axis (mm)
dy = 0.4; % RF resolution y-axis (mm)

ff1 = figure();
set(gcf,'paperunits','centimeters');
pwidth = ploscb_pwidth;
pheight = ploscb_pwidth*0.25;
set(gcf,'papersize',[pwidth pheight]);
set(gcf,'paperposition',[0, 0, pwidth, pheight]);

cellnum = 1;
data = load(['../../Data/Tactile/',cellnames{cellnum},'.txt']);
dot_xy = get_dotxy(cellnum);
sim_param = struct('dx',dx,'dy',dy,'data',data,'drum_speed',drum_speed,'dot_xy',dot_xy,'cellnum',cellnum,'patch_length_x',12,'patch_length_y',12);
model_type = '1';
Nboot = 100;

%A
noise_level = 5;
load(['models/N4angles1_',int2str(noise_level),'.mat']);
model_inds = [50,104,123,218];
model_colors = {'k','r',0.6*[0,1,0],[20,100,160]/255,0.6*[0,0,1],[180,120,0]/255,'m','c',[0.5,0.5,0.2]};
subplot('position',[0.05 0.1 0.15 0.15*pwidth/pheight])
plot_skin_patch(models2,model_inds,sim_param.patch_length_x,model_colors);
annotation('textbox',[0.03 0.85 0.25 0.05],'edgecolor','none','string','Population with simple RF','fontname','arial','fontsize',8);

%B-D
noise_level = 5;
colors = {'k','r'};
colors2 = {0.8*[1,1,1],0.8*[1,0,0],0.8*[0,0,1]};
for subplot_i = 1:3
	if subplot_i == 1
		nc_type = 1;
		tw = 0;
		subplot('position',[0.33 0.18 0.15 0.6])
		annotation('textbox',[0.32 0.85 0.25 0.05],'edgecolor','none','string','AMPA, t_{win} > 100 ms','fontname','arial','fontsize',8);
	elseif subplot_i == 2
		nc_type = 2;
		tw = 0;
		subplot('position',[0.58 0.18 0.15 0.6])
		annotation('textbox',[0.57 0.85 0.25 0.05],'edgecolor','none','string','NMDA, t_{win} > 100 ms','fontname','arial','fontsize',8);
	else
		nc_type = 1;
		tw = 5;
		subplot('position',[0.83 0.18 0.15 0.6])
		annotation('textbox',[0.82 0.85 0.25 0.05],'edgecolor','none','string','AMPA, t_{win} = 5 ms','fontname','arial','fontsize',8);
	end
	hold on
	mperf = [];
	ntypes = {'N1','N4'};
	senss2 = [20,10,3,1];
	for ntype_i = 1:length(ntypes)
		load(['models/',ntypes{ntype_i},'acc1_1_nc',int2str(nc_type),'_nz',int2str(noise_level),'_tw',int2str(tw),'_ga.mat']);
		for k2 = 1:length(senss2)
			k3 = find(senss==senss2(k2));
			x = performance(:,k3);
			if noise_level == 0
				ci = mean(x)*[1,1];
				mperf(ntype_i,k2) = mean(x);
			else
				[ci,bs] = bootci(Nboot,@mean,x);
				mperf(ntype_i,k2) = mean(bs);
			end
			lb(k2) = ci(1);
			ub(k2) = ci(2);
		end
		bounds = [lb,fliplr(ub)];
		fill([senss2,fliplr(senss2)],bounds,colors{ntype_i},'edgecolor','none')
		alpha(0.3)
	end
	for ntype_i = 1:length(ntypes)
		plot(senss2,mperf(ntype_i,:),'o','color',colors{ntype_i},'markerfacecolor',colors{ntype_i},'markersize',2)
		plot(senss2,mperf(ntype_i,:),'color',colors{ntype_i},'linewidth',1)
	end
	xlim([-1,23])
	ylim([0.4,1.05])
	xl = xlim;
	yl = ylim;
	for ntype_i = 1:length(ntypes)
		if strcmp(ntypes(ntype_i),'N1')
			RF_type = 'Complex RF';
		else
			RF_type = 'Simple RF';
		end			
		text(xl(1)+0.4*(xl(2)-xl(1)),yl(1)+(0.6-0.1*(ntype_i-1))*(yl(2)-yl(1)),RF_type,'fontname','arial','fontsize',8)
		plot(xl(1)+0.35*(xl(2)-xl(1)),yl(1)+(0.6-0.1*(ntype_i-1))*(yl(2)-yl(1)),'o','color',colors{ntype_i},'markerfacecolor',colors{ntype_i},'markersize',2)
	end
	plot(xl,0.5*[1,1],'--','color',0.5*[1,1,1])
	text(xl(1)+0.6*(xl(2)-xl(1)),0.47,'Chance','color',0.5*[1,1,1],'fontname','arial','fontsize',8)
	hold off
	set(gca,'box','off')
	set(gca,'tickdir','out')
	set(gca,'fontname','arial','fontsize',8);
	set(gca,'xtick',senss(end:-1:1));
	set(gca,'ytick',[0.4:0.2:1]);
	xlabel('Orientation (\circ)','fontname','arial','fontsize',8);
	ylabel('Test Performance','fontname','arial','fontsize',8);
end

annotation('textbox',[0 0.95 0.05 0.05],'edgecolor','none','string','A','fontname','arial','fontsize',12,'fontweight','bold');
annotation('textbox',[0.25 0.95 0.05 0.05],'edgecolor','none','string','B','fontname','arial','fontsize',12,'fontweight','bold');
annotation('textbox',[0.5 0.95 0.05 0.05],'edgecolor','none','string','C','fontname','arial','fontsize',12,'fontweight','bold');
annotation('textbox',[0.75 0.95 0.05 0.05],'edgecolor','none','string','D','fontname','arial','fontsize',12,'fontweight','bold');

if strcmp(savefig,'y')
	print(ff1,filetype,'-r300','figures_tactile/7');
end