function job_results = runFirst(a_script_cluster)
% runFirst - Method to be called at beginning of script_array_for_cluster jobs.
%
% Usage:
% job_results = runFirst(a_script_cluster)
%
% Parameters:
% a_script_cluster: A script_array_for_cluster object.
%
% Returns:
% job_results: A cell array of results collected from each item of the vector jobs.
%
% Description:
% This method initiates the script_array_for_cluster jobs. It submits an SGE
% vector job for running each runJob and finally runLast. There is no way of
% collecting outputs from individual runJob calls.
%
% Example:
% >> runFirst(script_array_for_cluster(10, 'this one does nothing for 10 times'));
%
% See also: script_array_for_cluster
%
% $Id$
%
% Author: Cengiz Gunay <cgunay@emory.edu>, 2006/02/01
% 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.
eol_str = sprintf('\n');
% Save this object into a file
save([get(a_script_cluster, 'id') '.mat' ], 'a_script_cluster');
% Submit a SGE job for the array jobs
load_obj = ['load ''' get(a_script_cluster, 'id') '.mat''; '];
array_job_command = ...
['qsub -t 1:' num2str(get(a_script_cluster, 'num_runs')) ' ' ...
a_script_cluster.sge_wrapper_script ' "' load_obj ...
'runJob(a_script_cluster, %d)"' ];
[s, w] = system(array_job_command);
if s == 0
% Success, look for SGE job number
%[array_job_number] = sscanf(w, 'Your job %f');
array_job_number = regexp(w, '(\d+)', 'match');
array_job_number = array_job_number{1};
disp(['Submitted job ' num2str(array_job_number) ': ' eol_str array_job_command ...
eol_str w]);
% Check if mail notification is requested
a_props = get(a_script_cluster, 'props');
if isfield(a_props, 'notifyByMail')
sge_opts = ['-m ea -M ' a_props.notifyByMail];
else
sge_opts = '';
end
% Then submit the last job as dependent on the array job
last_job_command = ...
['qsub -hold_jid ' num2str(array_job_number) ' ' sge_opts ' ' ...
a_script_cluster.sge_wrapper_script ' "' load_obj ...
'runLast(a_script_cluster)"' ];
[s, w] = system(last_job_command);
if s == 0
% Success, look for SGE job number
[last_job_number] = sscanf(w, 'Your job %d');
disp(['Submitted last job ' num2str(last_job_number) ': ' eol_str last_job_command]);
else
error(['Could not submit last job!' eol_str last_job_command eol_str ...
'Error: ' w ]);
end
else
error([ 'Could not submit array job!' sprintf('\n') array_job_command eol_str ...
'Error: ' w ]);
end