function a_pt_profile = getProfile(a_db, props)

% getProfile - Create a profile object from a params_tests_db by collecting
%			 statistics.
%
% Usage:
% a_pt_profile = getProfile(a_db, props)
%
%   Parameters:
%	a_db: A params_tests_db object.
%	props: A structure with any optional properties.
%
% Description:
%   Calculates the following results items:
%	idx: Name-index pairs for accessing results arrays.
%	t_hists: Cell array of histograms of each test.
%	p_t3ds: Cell array of invariant relations of each parameter with all tests.
%	pt_hists: Cell array of separate test value histograms 
%		for uniques value of each parameter.
%	p_stats: Cell array of test stats for each param.
%	p_coefs: Cell array of correlation coefficients 
%		for each parameter with all tests.
%	pt_coefs_hists: Cell matrix of histograms of coefficients from 
%		correlations of each parameter with each test.
%	pp_coefs: Cell 3D matrix of mean coefficients from 
%		correlations of each parameter with correlation 
%		coefficients of each parameter with each test.		
%
%   Returns a params_tests_profile object.
%
% See also: params_tests_profile, results_profile, params_tests_db, params_tests_fileset, 
%		tests_db, tests_3D_db, histogram_db, stats_db, corrcoefs_db
%
% $Id$
%
% Author: Cengiz Gunay <cgunay@emory.edu>, 2004/10/13

% 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.

% TODO: 
% - param and test bounds
% - plotting funcs in a subclass?
% - Feed test-reduced database?

if ~ exist('props', 'var')
  props = struct([]);
end

num_params = a_db.num_params;
num_tests = dbsize(a_db, 2) - num_params - 1; % Except the file indices

% Setup lookup tables
col_names = fieldnames(get(a_db, 'col_idx'));

% Create the param and test number structure  
results.idx.NaN = NaN;
for param_num=1:num_params
  results.idx = setfield(results.idx, col_names{param_num}, param_num);
end
for test_num=1:num_tests
  results.idx = setfield(results.idx, col_names{num_params + test_num}, test_num);
end

very_start_time = cputime;

% Create the test_hists
start_time = cputime;
disp('Calculating test histograms.');
results.t_hists = testsHists(a_db);
disp(sprintf('Elapsed time took %.2f seconds.', cputime - start_time));

% Create the p_t3ds
start_time = cputime;
disp('Calculating invariant relations of tests to each parameter.');
results.p_t3ds = invarParams(a_db);
disp(sprintf('Elapsed time took %.2f seconds.', cputime - start_time));

% Create the pt_hists and p_stats
start_time = cputime;
disp('Calculating histograms and mean/std stats of tests for each value of the invariant parameter.');
[results.pt_hists, results.p_stats] = paramsTestsHistsStats(a_db, results.p_t3ds);
disp(sprintf('Elapsed time took %.2f seconds.', cputime - start_time));

% Create the p_coefs
start_time = cputime;
disp('Calculating invariant correlation coefficients of all tests with each parameter.');
results.p_coefs = paramsCoefs(a_db, results.p_t3ds);
disp(sprintf('Elapsed time took %.2f seconds.', cputime - start_time));

% Create the pt_coefs_hists
start_time = cputime;
disp(['Calculating histograms of coefficients from correlations ' ... 
      'of each parameter with each test.']);
results.pt_coefs_hists = paramsTestsCoefsHists(a_db, results.p_coefs);
disp(sprintf('Elapsed time took %.2f seconds.', cputime - start_time));

% Create the pp_coefs
start_time = cputime;
disp(['Calculating mean coefficients from correlations of each parameter '...
      'with correlation coefficients of each parameter with each test.']);
results.pp_coefs = paramsParamsCoefs(a_db, results.p_t3ds, results.p_coefs);
disp(sprintf('Elapsed time took %.2f seconds.', cputime - start_time));

disp(sprintf('Total time took %.2f seconds.', cputime - very_start_time));

% Create the object
a_pt_profile = params_tests_profile(results, a_db, props);