function obj = ...
cip_trace_profile(varargin)
% cip_trace_profile - Creates and collects test results of a cip_trace.
%
% Usage 1:
% obj =
% cip_trace_profile(a_cip_trace, a_spikes, a_spont_spike_shape,
% results, id, props)
% Parameters:
% a_cip_trace: A cip_trace object.
% a_spikes: A spikes object.
% a_spont_spike_shape: A spike_shape object for spont spikes.
% a_pulse_spike_shape: A spike_shape object for pulse spikes.
% results: A structure containing test results.
% id: Identification string.
% props: A structure with any optional properties.
%
% Usage 2:
% obj = cip_trace_profile(data_src, dt, dy, pulse_time_start, pulse_time_width,
% id, props)
%
% Parameters:
% data_src: The trace column OR the filename.
% dt: Time resolution [s]
% dy: y-axis resolution [ISI (V, A, etc.)]
% pulse_time_start, pulse_time_width:
% Start and width of the pulse [dt]
% id: Identification string.
% props: See trace object.
%
% Description:
% The first usage is fully customizable to be used from subclass constructors.
% The second usage generates the spikes and spont_spike_shape objects, and
% collects some generic test results from them.
%
% Returns a structure object with the following fields:
% trace, spikes, spont_spike_shape, results, id, props.
%
% General methods of cip_trace_profile objects:
% cip_trace_profile - Construct a new cip_trace_profile object.
% plot - Graph the cip_trace_profile.
% display - Returns and displays the identification string.
% get - Gets attributes of this object and parents.
% subsref - Allows usage of . operator.
%
% Additional methods:
% See methods('cip_trace_profile')
%
% See also: cip_trace, spikes, spike_shape
%
% $Id$
%
% Author: Cengiz Gunay <cgunay@emory.edu>, 2004/08/25
% Copyright (c) 2007 Cengiz Gunay <cengique@users.sf.net>.
% This work is licensed under the Academic Free License ("AFL")
% v. 3.0. To view a copy of this license, please look at the COPYING
% file distributed with this software or visit
% http://opensource.org/licenses/afl-3.0.php.
if nargin == 0 % Called with no params, creates empty object
obj.trace = trace;
obj.spikes = spikes;
obj.spont_spike_shape = spike_shape;
obj.pulse_spike_shape = spike_shape;
obj.props = struct([]);
obj = class(obj, 'cip_trace_profile', results_profile);
elseif isa(varargin{1}, 'cip_trace_profile') % copy constructor?
obj = varargin{1};
elseif isnumeric(varargin{2})
% Create all data structures and collect results
if nargin < 7
props = struct([]);
else
props = varargin{7};
end
% Create cip_trace
obj.trace = cip_trace(varargin{1:6}, props);
% Get spikes
obj.spikes = spikes(obj.trace);
% Get spont spike_shape
% Prefix spike shape measures from different periods
obj.spont_spike_shape = ...
spike_shape(withinPeriod(obj.trace, periodIniSpont(obj.trace)), ...
withinPeriod(obj.spikes, periodIniSpont(obj.trace)));
spont_sh_results = prefixStruct(getResults(obj.spont_spike_shape), 'Spont');
obj.pulse_spike_shape = ...
spike_shape(withinPeriod(obj.trace, periodPulse(obj.trace)), ...
withinPeriod(obj.spikes, periodPulse(obj.trace)));
pulse_sh_results = prefixStruct(getResults(obj.pulse_spike_shape), 'Pulse');
% Misc measures
misc_results.PulseSpontAmpRatio = ...
pulse_sh_results.PulseAmplitude / spont_sh_results.SpontAmplitude;
obj.props = props;
% Create the object
% Calculate trace & spikes tests
% Calculate all shape tests (using spike_shape.getResults)
% (Gets a NaN filled structure if no spikes found.)
% And merge them together
obj = class(obj, 'cip_trace_profile', ...
results_profile(mergeStructs(getResults(obj.trace, obj.spikes), ...
spont_sh_results, pulse_sh_results, ...
misc_results), ...
varargin{6}));
else
% Create object with custom data (used from subclasses)
if nargin < 7
props = struct([]);
else
props = varargin{7};
end
[ obj.trace, obj.spikes, obj.spont_spike_shape obj.pulse_spike_shape ] = ...
deal(varargin{1:4});
obj.props = props;
% Create the object
obj = class(obj, 'cip_trace_profile', results_profile(varargin{5:6}));
end