function track = new_track(obj, particle, t0)
    % new_track(obj, particle, t0)
    %
    % Input:
    %   particle    particle structure for initialisation
    %   t0          time index to initialise particle at
    %
	% initialise a new track structure with the following fields
	%
	%	re_pred		3 x 1 x n_t			predicted object space position
	%   re_pos		3 x 1 x n_t			measured object space position
	%   re_vel      3 x 1 x n_t			object space velocity
	%	re_acc		3 x 1 x n_t			object space acceleration
	%   re_length	3 x 1 x n_t			measured object space length (for rods)
	%   re_radius   1 x 1 x n_t			measured object space radius (for spheres)
	%   
	%   im_pred		2 x n_c x n_t	predicted image space position
	%   im_pos		2 x n_c x n_t	measured image space position
	%	im_res		1 x n_c x n_t	image space residual 
	%   im_length	2 x n_c x n_t	image space orientation/length
	%   im_radius   1 x n_c x n_t	image space radius
	%   im_intens   1 x n_c x n_t	image space brightness   
	%
    %   t           1 x n_t         time axis
	%   id          1 x 1			ID of track object 
	%   ext			1 x n_t			extrapolation flag
	%   oob			1 x n_t			out of bounds flag
    %   life        1 x 1           number of lives left for this object
	%	f_cutoff	1 x 1			cutoff frequency of filtered tracks		
    %
    % optionally, initialise the track at index t0 with the properties of
    % the particle structure provided
    %
    
	n_t		= obj.n_t;
	n_c     = obj.n_cameras;
	obj.n_added=obj.n_added + 1;

	track	= ...
 	 struct('re_pred', nan(3, 1, n_t), ...
			're_pos', nan(3, 1, n_t), ...
			're_vel', nan(3, 1, n_t), ...
			're_acc', nan(3, 1, n_t), ...
			're_length', nan(3, 1, n_t), 're_radius', nan(1, 1, n_t), ...
			'im_pred', nan(2, n_c, n_t), 'im_pos', nan(2, n_c, n_t), 'im_res', nan(1, n_c, n_t), ...
			'im_length', nan(2, n_c, n_t), ...
			'im_radius', nan(1, n_c, n_t), ...
			'im_intens', nan(1, n_c, n_t), ...
            't', obj.t_axis, ...
			'f_cutoff', nan, ...
			'ext', true(1, n_t), 'oob', false(1, n_t), ...
			'id', obj.n_added, 'life', obj.opts.n_lives_default);
    
    %% optional: initialise with particle information at time t0
    if nargin < 3
        return;
    end
    track = ShadowTrack.assign_particle_to_track(track, particle, t0);
end