- Rather than calling PWD & CD to import/export file data, it is much more efficient (and easier to debug) to simply provide the file import/export function with an absolute or relative filename. So the function RNXYLODataStruct should be improved by accepting an filename/filepath. Avoid CD in code.
- EVAL should be avoided. And it is easy to avoid: all of those EVAL calls can (and should) be easily replaced by dynamic fieldnames: https://www.mathworks.com/help/matlab/matlab_prog/generate-field-names-from-variables.html Curiously the code uses dynamic fieldnames near the start: A.(['A' num2str(n)]) = []; but then the author seems to sadly have forgotten them.
- Even better would be to replace pseudo-indices in fieldnames with real indices. In other words, replace that structure with lots of dynamic fieldnames with a cell array, a structure array, or similar. Converting numeric to text like this ['A' num2str(n)] every time you want to access your data is complex and slow, due to hiding pseudo-indices, and should be avoided. Using actual indexing is simpler and more efficient.
- It is strongly recommended to LOAD into an output variable. This makes code more efficient, easier to debug, avoids the risk of overwriting data without any warning, and also avoids the risk that your code inadvertently uses data from prior loop iteration without any warning.
- Superfluous square brackets do nothing, get rid of them: bar([1],[srPreMean],...
MATLAB reads my old tsv file instead of the new one after I have updated it.
1 view (last 30 days)
Show older comments
The following code is my script. It seems that it does not read the bold part and gives me a A file that is empty in a step-by-step analysis of the script and when I run the text through it gives me a figure that has used the right path but wrong data from the old and not-updated tsv file.
function [A,ampDCList,alme,trigem] = Fig_RN_Xylo
oldDir = pwd;
cd('L:\GBW-0046_Myles_Mc_Laughlin\OEData\Trigem\Analysis\Figs Paper 2 - RN-LC\');
S = RNXYLODataStruct
cd(oldDir);
ampDCList = [3];
nAmps = length(ampDCList);
for n = 1:nAmps
A.(['A' num2str(n)]) = [];
end
getSpikeWaveforms = 0;
i=1;
for n = 1:length(S)
disp(['S(' num2str(n) ').isSpikedSorted: ', num2str(S(n).isSpikedSorted)]);
if S(n).isSpikedSorted == 1
disp(['Length of fileListXylo for S(' num2str(n) '): ', num2str(length(S(n).fileListXylo))]);
for m = 1:length(S(n).fileListXylo)
dataFolder = [S(n).dataPath S(n).fileListXylo{m}];
nChans = S(n).nChans;
dataFolder = unixCheckPath(dataFolder);
phyFolder = [dataFolder filesep 'continuous_filt' filesep 'continuous_filt.GUI'];
% get the cluster Info FileName
clusterInfoFileName = [phyFolder filesep 'cluster_info.tsv'];
if exist(clusterInfoFileName)
phySpikeFile = [dataFolder '\' S(n).fileListDC{m} '.physpks'];
if exist(phySpikeFile)
disp(['Loading ' phySpikeFile])
load(phySpikeFile,'-mat')
else
I = getPhySpikeTimes(dataFolder,getSpikeWaveforms,nChans);
disp(['Saving ' phySpikeFile])
save(phySpikeFile,"I")
end
if ~isempty(I)
I = analysePhySpikeTimes(I,0);
I = analysePhySpikeEntropy(I);
for h = 1:length(I)
I(h).ratName = S(n).ratName;
I(h).ratNumber = str2num(I(h).ratName(6:7));
end
if ~isnan(I(1).ampDC)
indAmp = find(I(1).ampDC(1) == ampDCList);
if ~isempty(indAmp)
eval(['A.A' num2str(indAmp) '= [A.A' num2str(indAmp) ' I];'])
end
end
end
else
FilesNotFound{i} = clusterInfoFileName;
i=i+1;
end
end
end
end
% stats
a=[];
j=0;
for n = 1 %1:nAmps
eval(['B = A.A' num2str(n) ';'])
pre = [B.spikeRatePreMean];
dur = [B.spikeRateDurMean];
post = [B.spikeRatePostMean];
dur = dur*0.8;
for m = 1:length(B)
B(m).xylo = 1;
B(m).spikeRateDurMean = dur(m);
end
eval(['A.A' num2str(n) '=B;'])
[a,j] = makeLongData(a,j,pre,dur,post,B);
%[h,p] = ttest(pre,dur);
x = [pre' dur' post'];
% [p,tbl,stats] = friedman(x,1);
% STATS(n).p = p;
% STATS(n).tbl = tbl;
% STATS(n).stats = stats;
% if STATS(n).p<0.05 % do post-hoc
[STATS(n).pPreDur,STATS(n).hPreDur,STATS(n).statsPreDur] = signrank(pre,dur);
[STATS(n).pPrePost,STATS(n).hPrePost,STATS(n).statsPrePost] = signrank(pre,post);
[STATS(n).pPostDur,STATS(n).hPostDur,STATS(n).statsPostDur] = signrank(post,dur);
STATS(n).pPreDur_Corrected = STATS(n).pPreDur*3;
STATS(n).pPrePost_Corrected = STATS(n).pPrePost*3;
STATS(n).pPostDur_Corrected = STATS(n).pPostDur*3;
% end
end
SPK = [a{:,3}]';
Xylo = [a{:,4}]';
Condition = a(:,2);
Rat = [a{:,1}]';
Neuron = [a{:,5}]';
trigem = table(SPK,Xylo,Condition,Rat,Neuron);
alme = fitlme(trigem,'SPK~Condition+(1|Neuron) +(1|Rat)')
diary('almeLCXyloDetails.txt')
alme
diary off
anova(alme)
R = residuals(alme);
figure
hist(R,100);
% figure
f1 = figure('position',[1677 585 786 291]);
set(gcf,'color','w');
fSize = 12;
fSizeSmall = 10;
lWidth = 1.2;
mSize = 8;
%set(f1,'position',[681 559 966 420]/2)
nCols = 2;
[map,num,typ,scheme] = brewermap(3,'Accent');
minSR = -5;
maxSR = 20;
f2 = figure;
for n =1
eval(['B = A.A' num2str(n) ';'])
%spikeRateOverTime = [];
spikeRateOverTime = zeros(length(B),length(B(1).spikeRateOverTime));
smoothline = ones(1,length(spikeRateOverTime));
thrd = round(length(smoothline)/3);
smoothline(thrd+1:2*thrd+2) = linspace(1,0.85,thrd+2);
for m = 1:length(B)
spikeRateOverTime(m,1:length(B(m).spikeRateOverTime)) = B(m).spikeRateOverTime.*smoothline;
end
srOverTimeBins = B(m).spikeRateOverTimeBins;
srOverTime = mean(spikeRateOverTime);
srOverTimeSTD = std(spikeRateOverTime);
srOverTimeCI = 0.95*(srOverTimeSTD/sqrt(length(length(B))));
figure(f1)
subplot(1,2,1)
p = patch([srOverTimeBins fliplr(srOverTimeBins)],[srOverTime+srOverTimeCI fliplr(srOverTime-srOverTimeCI)],[0.7 0.7 0.7],'facealpha',0.5,'linestyle','none');
hold on
p1 = plot(srOverTimeBins,srOverTime,'color',map(1,:))
text(5,10,'pre','FontName','Arial','fontsize',fSizeSmall)
text(65,10,'dur','FontName','Arial','fontsize',fSizeSmall)
text(125,10,'post','FontName','Arial','fontsize',fSizeSmall)
title({'Xylocaine Blocker',['DC 3 mA']})
xlabel('Time (s)')
ylabel('Spike Rate (spk/s)')
xlim([0 180])
ylim([minSR maxSR])
timeOn = round(B(1).dcOn/B(1).fs)
timeOff = round(B(1).dcOff/B(1).fs)
plot([timeOn timeOn],[minSR maxSR-6],'k--','color',[0.5 0.5 0.5])
plot([timeOff timeOff],[minSR maxSR-6],'k--','color',[0.5 0.5 0.5])
l = legend([p p1],'+/- 95% CI','Mean Spike Rate')
set(l,'FontName','Arial','fontsize',fSizeSmall)
legend boxoff
set(gca, 'Ticklength', [0 0])
set(gca,'linewidth',lWidth)
end
minSR = 0;
maxSR = 20;
for n = 1%1:nAmps
eval(['B = A.A' num2str(n) ';'])
pre = [B.spikeRatePreMean];
dur = [B.spikeRateDurMean];
post = [B.spikeRatePostMean];
srPreMean = mean(pre);
srDurMean = mean(dur);
srPostMean = mean(post);
srPreSTD = std(pre);
srDurSTD = std(dur);
srPostSTD = std(post);
srPreCI = 0.95*(srPreSTD/sqrt(length(pre)));
srDurCI = 0.95*(srDurSTD/sqrt(length(dur)));
srPostCI = 0.95*(srPostSTD/sqrt(length(post)));
figure(f1)
subplot(1,2,2)
dist = unifrnd(-.3,0.3,size(pre));
plot(1+dist,pre,'.','MarkerSize',mSize,'color',[0.5 0.5 0.5])
hold on
plot(2+dist,dur,'.','MarkerSize',mSize,'color',[0.5 0.5 0.5])
plot(3+dist,post,'.','MarkerSize',mSize,'color',[0.5 0.5 0.5])
if n==1
fa = 0.5;
elseif n==2
fa = 0.8;
end
bar([1],[srPreMean],'FaceColor',map(1,:),'FaceAlpha',fa,'linewidth',lWidth)
bar([2],[srDurMean],'FaceColor',map(1,:),'FaceAlpha',fa,'linewidth',lWidth)
bar([3],[srPostMean],'FaceColor',map(1,:),'FaceAlpha',fa,'linewidth',lWidth)
hold on
er = errorbar([1 2 3],[srPreMean srDurMean srPostMean],[srPreCI srDurCI srPostCI],'color',[0 0 0],'LineWidth',lWidth,'LineStyle','none');
title(['DC 3 mA'])
set(gca,'xtick',[1 2 3])
set(gca,'xticklabel',{'pre','dur','post'},'FontName','Arial','fontsize',fSizeSmall)
ylabel('Spike Rate (spk/s)','FontName','Arial','fontsize',fSizeSmall)
ylim([minSR maxSR])
if STATS(n).pPreDur_Corrected<=0.05
sigline([1,2],[],12)
end
if STATS(n).pPrePost_Corrected<=0.05
sigline([1,3],[],14)
end
if STATS(n).pPostDur_Corrected<=0.05
sigline([2,3],[],16)
end
box off
set(gca, 'Ticklength', [0 0])
set(gca,'linewidth',lWidth)
% text(2,srDurMean+2*srDurCI,'*','FontWeight','bold','FontSize',14,'Color',[1 0 0])
end
%------------------------ Locals ------------------------------------------
function [a,j] = makeLongData(a,j,pre,dur,post,B)
for o = 1:length(dur)
rn = B(o).ratNumber;
j = j+1;
a{j,1} = rn;
a{j,2} = 'dur';
a{j,3} = dur(o)+1;
a{j,4} = B(o).xylo;
a{j,5} = B(o).cluster_id+rn*1000;
end
for o = 1:length(pre)
rn = B(o).ratNumber;
j = j+1;
a{j,1} = rn;
a{j,2} = 'pre';
a{j,3} = pre(o)+1;
a{j,4} = B(o).xylo;
a{j,5} = B(o).cluster_id+rn*1000;
end
for o = 1:length(post)
rn = B(o).ratNumber;
j = j+1;
a{j,1} = rn;
a{j,2} = 'post';
a{j,3} = post(o)+1;
a{j,4} = B(o).xylo;
a{j,5} = B(o).cluster_id+rn*1000;
end
5 Comments
Answers (1)
Sulaymon Eshkabilov
on 25 Dec 2023
It seems from a quick glance that the directory of your updated file .tsv is not specified.
See Also
Categories
Find more on Audio and Video Data in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!