function new_filename = dsNameFromVaried(data, old_filename, prefix, fnName)
% dsNameFromVaried - makes a filename based on the parameters in data.varied.
%
% Usage:
%   new_filename = dsNameFromVaried(data, file_type, old_filename)
%
% Inputs:
%   - data: DynaSim data structure (also accepted: data file name)
%   - result_file: previous result_file, uses this for the path.
%
% Inputs (optional):
%   - prefix: filename prefix for type of file
%   - fnName: string name of function
%
% Outputs:
%   - new_filename: where to save result, based on file_type and data.varied

if nargin < 3
  prefix = [];
end

if nargin < 4
  fnName = [];
end

[pathstr, ~, ext] = fileparts2(old_filename);

% build up filename starting with prefix
fileName = prefix;

if isempty(fileName)
  removeLeadingUnderscoresBool = true;
else
  removeLeadingUnderscoresBool = false;
end

%check for simID# from batch sims
token = regexp(old_filename, '(sim\d+)', 'tokens');
if ~isempty(token)
  fileName = [fileName '_' token{1}{1}];
end

%check for plot# from batch sims
token = regexp(old_filename, '_(plot\d+)_', 'tokens');
if ~isempty(token)
  fileName = [fileName '_' token{1}{1}];
end

%check for analysis# from batch sims
token = regexp(old_filename, '_(analysis\d+)_', 'tokens');
if ~isempty(token)
  fileName = [fileName '_' token{1}{1}];
end

% add fnName
if ~isempty(fnName)
  fileName = [fileName '_' fnName];
end

for param = data.varied(:)'
  fileName = [fileName '__' param{1} '_' sprintf('%g',data.(param{1}))];
end

if removeLeadingUnderscoresBool
  removeInds = regexp(fileName, '^(_+)', 'tokenExtents');
  
  if ~isempty(removeInds)
    % found leading underscores
    removeInds = removeInds{1};
    
    % remove leading underscores
    fileName(removeInds(1):removeInds(2)) = [];
  end
end

new_filename = fullfile(pathstr, [fileName ext]);

end