function curves = getcurves(fname, nvals)
% This functions opens the CSV formated file created by the TI 370B curve
% tracer designated by string in FNAME. The input variable NVALS is a
% vector parameters applied to the third terminal of a 3 terminal device
% for stepping out the family of curves as in a BJT (base currents) or
% FET (gate-source voltages). The fist element of NVALS should be the
% lowest value used in the sequence of steps. If a 2 terminal device is used,
% the NVALS variable should be omitted.
%
% curves = getcurves(fname, nvals)
%
% The output will be a cell array where each row represents corresponds to
% the NVAL value. Column 1 is the x-axis vectors, Column 2 is the y-axis vectors,
% and Column 3 is the NVALS values for each curve. If NVALS was omitted,
% then CURVES will only have 1 row and 2 columns (x-axis vector and y-axis vector).
%
% This function needs the function PEAKFIND to run.
%
% To convert these cell array values into a uniformly sample matrix array,
% see help on the mfile INTERPCURVES.
%
% Written by Kevin Donohue 5/2005 donohue@engr.uky.edu
% Read in CSV file
m = csvread(fname);
% Compute gradient of x-axis to identify places where it does not change
% must element places where sweep voltage was not changing
h = gradient(m(:,1));
% Find non-zero gradient samples
kimp = find(abs(h) > eps); % All values just above 0.
% Trim the sample to eliminating places where sweep had stopped
trm = m(kimp,1:2);
% Identify places where x-axis change directions from positive to negative
% (forward sweep end points)
[tf, m1] = peakfind(trm(:,1), [1:length(trm(:,1))]);
% (reverse sweep end points)
[tb, m1] = peakfind(-trm(:,1), [1:length(trm(:,1))]);
% Determine where the fist peak (fist turnaround) occured beyond the first point
[stp, pt] = min([tf(2), tb(2)]); % In the forward or reverse sweep direction
if pt == 1 % If turnaround first happened in forward direction
stv = tf(2:end-1);
edv = tb(2:end-1);
else % % If turnaround first happened in reverse direction
stv = tb(2:end-1);
edv = tf(2:end-1);
end
% If step values are provided extract a curve associated with each
% step value
if nargin == 2
len = length(nvals);
else % Otherwise assume just one must be extracted
len = 1;
end
% Loop to exatract a single curve for each step
for k=1:len
curves{k,1} = trm(stv(k):edv(k),1);
curves{k,2} = trm(stv(k):edv(k),2);
% If step values given create a 3rd column to store these values
if nargin == 2
curves{k,3} = nvals(k);
end
end