#!/usr/local/bin/perl ############################################################################### # Program : ProcessProject.cgi # Author : Eric Deutsch # $Id$ # # Description : This CGI program that allows users to submit a processing # job to process a set of experiments in a project. # ############################################################################### ############################################################################### # Get the script set up with everything it will need ############################################################################### use strict; use lib qw (../../lib/perl); use vars qw ($q $sbeams $sbeamsMA $dbh $current_contact_id $current_username $current_work_group_id $current_work_group_name $current_project_id $current_project_name $TABLE_NAME $PROGRAM_FILE_NAME $CATEGORY $DB_TABLE_NAME $PK_COLUMN_NAME @MENU_OPTIONS); use DBI; use CGI; use CGI::Carp qw(fatalsToBrowser croak); use POSIX; use SBEAMS::Connection; use SBEAMS::Connection::Settings; use SBEAMS::Connection::Tables; use SBEAMS::Microarray; use SBEAMS::Microarray::Settings; use SBEAMS::Microarray::Tables; use lib "/net/arrays/Pipeline/tools/lib"; require "QuantitationFile.pl"; $q = new CGI; $sbeams = new SBEAMS::Connection; $sbeamsMA = new SBEAMS::Microarray; $sbeamsMA->setSBEAMS($sbeams); my $JNLP_DIRECTORY = "$PHYSICAL_BASE_DIR/tmp/Microarray/dataLoader"; my $JAR_DIRECTORY = "$SERVER_BASE_DIR$HTML_BASE_DIR/usr/java"; ############################################################################### # global Variables ############################################################################### main(); ############################################################################### # Main Program: # # Call $sbeams->InterfaceEntry with pointer to the subroutine to execute if # the authentication succeeds. ############################################################################### sub main { #### Do the SBEAMS authentication and exit if a username is not returned exit unless ($current_username = $sbeams->Authenticate()); #### Read in the default input parameters my %parameters; my $n_params_found = $sbeams->parse_input_parameters(q=>$q,parameters_ref=>\%parameters); #$sbeams->printDebuggingInfo($q); #### Process generic "state" parameters before we start $sbeams->processStandardParameters(parameters_ref=>\%parameters); #### Print the header, do what the program does, and print footer $sbeamsMA->printPageHeader(); handle_request(parameters_ref=>\%parameters); $sbeamsMA->printPageFooter(); } # end main ############################################################################### # handleRequest # # Test for specific form variables and process the request # based on what the user wants to do. ############################################################################### sub handle_request { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; my $tab = $parameters{'tab'} || "main"; $parameters{'project_id'} = $sbeams->getCurrent_project_id(); $parameters{'username'} = $sbeams->getCurrent_username(); ## Establish user settings. Is this necessary anymore? establish_settings(); ## Print standard page header $sbeams->printUserContext(); #### Decide where to go based on form values if ($tab eq 'main') { print_start_screen(parameters_ref=>\%parameters); }elsif($tab eq 'preprocess') { print_preprocess_screen(parameters_ref=>\%parameters); }elsif($tab eq 'mergereps') { print_mergereps_screen(parameters_ref=>\%parameters); }elsif($tab eq 'mergeconds') { print_mergeconds_screen(parameters_ref=>\%parameters); }elsif($tab eq 'file_output') { print_file_output_screen(parameters_ref=>\%parameters); }elsif($tab eq 'finalize') { print_final_screen(parameters_ref=>\%parameters); }elsif($tab eq 'process') { send_to_pipeline(parameters_ref=>\%parameters); } } # end processRequests ############################################################################### # Print Start Screen ############################################################################### sub print_start_screen { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $sql; my @rows; my $current_project = $parameters{'project_selector'} || $sbeams->getCurrent_project_id(); my $selectedFiles = $parameters{'selectedFiles'} || ""; ## Processing to remove duplicates and sort the selectedFiles my @unsorted = split /,/,$selectedFiles; my (@temp, @unique); my %seen = (); foreach my $item (@unsorted) { push(@temp, $item) unless $seen{$item}++; } @unique = sort @temp; shift @unique unless $unique[0] =~ /\w/; $selectedFiles = join (",",@unique); print_start_screen_javascript(); ## Print Introductory Header print qq~

Data Processing Pipeline

\n

If this is not the interface you are looking for, perhaps you would like to use the [previous two-color pipeline]


Step 1: Determine Files to Process

$LINESEPARATOR
Instructions:
Select Files that you would like to send through the pipeline
~; ## SQL to get projects that a user can see AND contains arrays my $work_group_name = $sbeams->getCurrent_work_group_name(); $sql = qq~ SELECT P.project_id,P.project_tag,P.name,UL.username, MIN(CASE WHEN UWG.contact_id IS NULL THEN NULL ELSE GPP.privilege_id END) AS "best_group_privilege_id", MIN(CASE WHEN P.PI_contact_id = $current_contact_id THEN 10 ELSE UPP.privilege_id END) AS "best_user_privilege_id", COUNT(AR.array_request_id) AS 'array_requests' FROM $TB_PROJECT P INNER JOIN $TB_USER_LOGIN UL ON ( P.PI_contact_id = UL.contact_id ) LEFT JOIN $TB_USER_PROJECT_PERMISSION UPP ON ( P.project_id = UPP.project_id AND UPP.contact_id='$current_contact_id' ) LEFT JOIN $TB_GROUP_PROJECT_PERMISSION GPP ON ( P.project_id = GPP.project_id ) LEFT JOIN $TB_PRIVILEGE PRIV ON ( GPP.privilege_id = PRIV.privilege_id ) LEFT JOIN $TB_USER_WORK_GROUP UWG ON ( GPP.work_group_id = UWG.work_group_id AND UWG.contact_id='$current_contact_id' ) LEFT JOIN $TB_WORK_GROUP WG ON ( UWG.work_group_id = WG.work_group_id ) LEFT JOIN $TBMA_ARRAY_REQUEST AR ON ( AR.project_id = P.project_id ) WHERE 1=1 AND P.record_status != 'D' AND UL.record_status != 'D' AND ( UPP.record_status != 'D' OR UPP.record_status IS NULL ) AND ( GPP.record_status != 'D' OR GPP.record_status IS NULL ) AND ( PRIV.record_status != 'D' OR PRIV.record_status IS NULL ) AND ( UWG.record_status != 'D' OR UWG.record_status IS NULL ) AND ( WG.record_status != 'D' OR WG.record_status IS NULL ) ~; unless ($work_group_name eq "Admin" || $work_group_name eq "Microarray_admin") { $sql .= qq~ AND ( UPP.privilege_id<=40 OR GPP.privilege_id<=40 OR P.PI_contact_id = '$current_contact_id' ) AND ( WG.work_group_name IS NOT NULL OR UPP.privilege_id IS NOT NULL OR P.PI_contact_id = '$current_contact_id' ) ~; } $sql .= qq~ GROUP BY P.project_id,P.project_tag,P.name,UL.username ORDER BY UL.username,P.project_tag ~; my @rows = $sbeams->selectSeveralColumns($sql); my @project_names = (); foreach my $element (@rows) { if($element->[6] > 0 || $element->[5] == 10 || $element->[4] == 10){ push(@project_names,"$element->[2] ($element->[0])"); } } ## Start SELECT print qq~
~; ## Print arrays affiliated with the project if ($current_project > 0) { $sql = qq~ SELECT A.array_id,A.array_name, ARSM1.full_name AS 'Sample1Name',D1.dye_name AS 'sample1_dye', ARSM2.full_name AS 'Sample2Name',D2.dye_name AS 'sample2_dye', AQ.stage_location FROM $TBMA_ARRAY_REQUEST AR LEFT JOIN $TBMA_ARRAY_REQUEST_SLIDE ARSL ON ( AR.array_request_id = ARSL.array_request_id ) LEFT JOIN $TBMA_ARRAY_REQUEST_SAMPLE ARSM1 ON ( ARSL.array_request_slide_id = ARSM1.array_request_slide_id AND ARSM1.sample_index=0) LEFT JOIN $TBMA_LABELING_METHOD LM1 ON ( ARSM1.labeling_method_id = LM1.labeling_method_id ) LEFT JOIN $TBMA_DYE D1 ON ( LM1.dye_id = D1.dye_id ) LEFT JOIN $TBMA_ARRAY_REQUEST_SAMPLE ARSM2 ON ( ARSL.array_request_slide_id = ARSM2.array_request_slide_id AND ARSM2.sample_index=1) LEFT JOIN $TBMA_LABELING_METHOD LM2 ON ( ARSM2.labeling_method_id = LM2.labeling_method_id ) LEFT JOIN $TBMA_DYE D2 ON ( LM2.dye_id = D2.dye_id ) LEFT JOIN $TBMA_ARRAY A ON ( A.array_request_slide_id = ARSL.array_request_slide_id ) LEFT JOIN $TBMA_ARRAY_SCAN ASCAN ON ( A.array_id = ASCAN.array_id ) LEFT JOIN $TBMA_ARRAY_QUANTITATION AQ ON ( ASCAN.array_scan_id = AQ.array_scan_id ) WHERE AR.project_id=$current_project AND AQ.array_quantitation_id IS NOT NULL AND AR.record_status != 'D' AND A.record_status != 'D' AND ASCAN.record_status != 'D' --AND AQ.record_status != 'D' AND AQ.data_flag != 'BAD' ORDER BY A.array_id ~; }else { print qq~

Project_id is not valid. Please contact mjohnson regarding this problem

~; } my @project_arrays = $sbeams->selectSeveralColumns($sql); ## Start SELECT and blank print qq~
~; ## File Status of each file that has been selected print qq~
File Status:
~; ## SQL to Track down stage_location information from selected arrays if ($selectedFiles) { $sql = qq~ SELECT A.array_id,A.array_name, ARSM1.full_name AS 'Sample1Name',D1.dye_name AS 'sample1_dye', ARSM2.full_name AS 'Sample2Name',D2.dye_name AS 'sample2_dye', AQ.stage_location FROM $TBMA_ARRAY_REQUEST AR LEFT JOIN $TBMA_ARRAY_REQUEST_SLIDE ARSL ON ( AR.array_request_id = ARSL.array_request_id ) LEFT JOIN $TBMA_ARRAY_REQUEST_SAMPLE ARSM1 ON ( ARSL.array_request_slide_id = ARSM1.array_request_slide_id AND ARSM1.sample_index=0) LEFT JOIN $TBMA_LABELING_METHOD LM1 ON ( ARSM1.labeling_method_id = LM1.labeling_method_id ) LEFT JOIN $TBMA_DYE D1 ON ( LM1.dye_id = D1.dye_id ) LEFT JOIN $TBMA_ARRAY_REQUEST_SAMPLE ARSM2 ON ( ARSL.array_request_slide_id = ARSM2.array_request_slide_id AND ARSM2.sample_index=1) LEFT JOIN $TBMA_LABELING_METHOD LM2 ON ( ARSM2.labeling_method_id = LM2.labeling_method_id ) LEFT JOIN $TBMA_DYE D2 ON ( LM2.dye_id = D2.dye_id ) LEFT JOIN $TBMA_ARRAY A ON ( A.array_request_slide_id = ARSL.array_request_slide_id ) LEFT JOIN $TBMA_ARRAY_SCAN ASCAN ON ( A.array_id = ASCAN.array_id ) LEFT JOIN $TBMA_ARRAY_QUANTITATION AQ ON ( ASCAN.array_scan_id = AQ.array_scan_id ) WHERE A.array_id IN ($selectedFiles) AND AQ.array_quantitation_id IS NOT NULL AND AR.record_status != 'D' AND A.record_status != 'D' AND ASCAN.record_status != 'D' AND AQ.record_status != 'D' AND AQ.data_flag != 'BAD' ORDER BY A.array_id ~; my @selected_arrays = $sbeams->selectSeveralColumns($sql); foreach my $result_id (@selected_arrays){ my $id = $result_id->[0]; my $name = "$result_id->[2]($result_id->[3]) vs. $result_id->[4]($result_id->[5])"; my $quant_file = $result_id->[6]; #### If the data file is okay if ( -e $quant_file ) { print "$quant_file Verified -- Array \#$id
\n"; } else { print "ERROR: $quant_file -- Array \#$id". "  Notify Array Core
\n"; } } print qq~
~; return; } } ############################################################################### # Print Start Screen Javascript ############################################################################### sub print_start_screen_javascript { my $javascript = qq~ ~; print $javascript; } ############################################################################### # Print Preprocess ############################################################################### sub print_preprocess_screen { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $sql; my @rows; my $current_project = $parameters{'project_selector'} || $sbeams->getCurrent_project_id(); my $selectedFiles = $parameters{'selectedFiles'} || ""; ## Processing to remove duplicates and sort the selectedFiles my @unsorted = split /,/,$selectedFiles; my (@temp, @unique); my %seen = (); foreach my $item (@unsorted) { push(@temp, $item) unless $seen{$item}++; } @unique = sort @temp; shift @unique unless $unique[0] =~ /\w/; $selectedFiles = join (",",@unique); print_preprocess_javascript(); ## Print Introductory Header print qq~

Data Processing Pipeline

\n
Step 2: Background Subtraction and Normalization

$LINESEPARATOR
Instructions:
In this step, the spot intensity data is merged with spot location information.
Background subtraction and normalization follows. More information can be found at [URL]

~; print qq~
Scale median value to 


~; } ############################################################################### # Print Preprocess Javascript ############################################################################### sub print_preprocess_javascript { my $javascript = qq~ ~; print $javascript; } ############################################################################### # Print mergereps screen ############################################################################### sub print_mergereps_screen { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $sql; my @rows; my $current_project = $parameters{'project_selector'} || $sbeams->getCurrent_project_id(); my $selected_files = $parameters{'selectedFiles'}; my $pp_recipe = $parameters{'ppRecipe'}; print_mergereps_javascript(); ## Print Introductory Header print qq~

Data Processing Pipeline

\n
Step 3: Replicate Merging and Statisical Significance
$LINESEPARATOR
Instructions:
Merge Replicates:  Help
 Minimum <num> replicate measurements:     Help
 Use general list of bad genes
 Select local file of bad genes:
      Help
*must specify full path of bad gene file
 Filter Outliers  Help

VERA/SAM: Help
 Use VERA and SAM  Help
 Cease Optimization when changes per step are less than:  
 Generate file showing how parameters converge
 Generate debug file
 Use your own error model  
~; } ############################################################################### # Print Mergereps Javascript ############################################################################### sub print_mergereps_javascript { my $javascript = qq~ ~; print $javascript; } ############################################################################### # Print mergeconds screen ############################################################################### sub print_mergeconds_screen { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $sql; my $current_project = $parameters{'project_selector'} || $sbeams->getCurrent_project_id(); my $selected_files = $parameters{'selectedFiles'}; my $pp_recipe = $parameters{'ppRecipe'}; my $merge_recipe = $parameters{'mergeRecipe'}; my $vs_recipe = $parameters{'vsRecipe'}; print_mergeconds_javascript(); ## Get Conditions associated with the arrays $sql = qq~ SELECT ARSM1.full_name,ARSM2.full_name FROM $TBMA_ARRAY_REQUEST AR LEFT JOIN $TBMA_ARRAY_REQUEST_SLIDE ARSL ON ( AR.array_request_id = ARSL.array_request_id ) LEFT JOIN $TBMA_ARRAY_REQUEST_SAMPLE ARSM1 ON ( ARSL.array_request_slide_id = ARSM1.array_request_slide_id AND ARSM1.sample_index=0) LEFT JOIN $TBMA_ARRAY_REQUEST_SAMPLE ARSM2 ON ( ARSL.array_request_slide_id = ARSM2.array_request_slide_id AND ARSM2.sample_index=1) LEFT JOIN $TBMA_ARRAY A ON ( A.array_request_slide_id = ARSL.array_request_slide_id ) WHERE A.array_id IN ($selected_files) AND AR.record_status != 'D' AND A.record_status != 'D' ORDER BY A.array_id ~; my @selected_arrays = $sbeams->selectSeveralColumns($sql); my %conditions; foreach my $result_id (@selected_arrays){ my $id = $result_id->[0]; my $name = "$result_id->[0]_vs_$result_id->[1]"; my $reverse_name = "$result_id->[1]_vs_$result_id->[0]"; unless ($conditions{$name} || $conditions{$reverse_name}){ $conditions{$name} = 1; } } ## Print HTML print qq~

Data Processing Pipeline

\n
Step 4: Ordering Conditions for Matrix Output

$LINESEPARATOR
Conditions:

~; } ############################################################################### # Print Mergeconds Javascript ############################################################################### sub print_mergeconds_javascript { my $javascript = qq~ ~; print $javascript; } ############################################################################### # Print_file_output screen ############################################################################### sub print_file_output_screen { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $sql; my @rows; my $current_project = $parameters{'project_selector'} || $sbeams->getCurrent_project_id(); my $user = $sbeams->getCurrent_username(); my $selected_files = $parameters{'selectedFiles'}; my $pp_recipe = $parameters{'ppRecipe'}; my $merge_recipe = $parameters{'mergeRecipe'}; my $vs_recipe = $parameters{'vsRecipe'}; my $mergeConds = $parameters{'mergeConds'}; my $current_user_id = $sbeams->getCurrent_contact_id(); # Get email address $sql = qq~ SELECT email from $TB_CONTACT where contact_id = '$current_user_id' ~; my ($email) = $sbeams->selectOneColumn($sql); unless ($email =~ /\w+\@\w+\.\w+/) { $email = "$user\@systemsbiology.org"; } print_file_output_javascript(); ## Print Introductory Header print qq~

Data Processing Pipeline

\n
Step 4: File Output Selection and Database Loading

$LINESEPARATOR
Instructions:
Select which files you want kept in your project directory.
The data processing parameters are always kept on file.
Should you decide that you need a file that hasn\'t been saved, contact mjohnson to rerun your processing.


Email Notify Process Completion
Select project output directory:
Keep? File Type File Description File Suffix
Dapple File Files from spotfinding on AnalyzerDG are changed to another format so they can be sent through the pipeline. These files don\'t contain any information that is not in the AnalyzerDG files .dapple or .dapplefmt
Rep File Files after background subtraction and normalization .rep
Rep Image Scatter plot images of intensities (e.g. Cy3 vs. Cy5) .rep.jpg
File Table Used to identify the direction (e.g. Cy3 vs. Cy5 OR Cy5 vs. Cy3) of each file prior to merging replicates .ft
Merge File Data table of merged replicates for each reporter .opt.merge or .all.merge
Model File Error Model parameters created by VERA .model
Sig File Table of merged replicates and statistical analysis of differential expression .sig
Clone File Table of merged replicates and statistical analysis of differential expression. Additional biological and identification information is added. .clone

Would you like to create Experiment XML files for these data?
Yes, I want to create these files No, I have no idea what this is about. ~; # Would you like these data loaded into SBEAMS? This will overwrite any condition data you\'ve loaded.
# Yes, load these data into SBEAMS # No, do not load these # # ~; } ############################################################################### # Print File Output Javascript ############################################################################### sub print_file_output_javascript { my $javascript = qq~ ~; print $javascript; } ############################################################################### # Print Finalize screen ############################################################################### sub print_final_screen { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $sql; my @rows; my $day = (localtime)[3]; my $month = (localtime)[4] + 1; my $year = (localtime)[5] + 1900; print_final_screen_javascript(); ## Print Introductory Header print qq~

Data Processing Pipeline

\n
Step 5: Pipeline Finalization

$LINESEPARATOR
Instructions:
Add a project title, comments, and verify the plan file.

Title of this processing event (timestamp is default):
Add any comments you wish to have filed with this particular data processing.


Your comments will be appended to processing plan, which is written below for manual editing.
Editing this file is not recommended unless you are familiar with how to manipulate it.
~; } ############################################################################### # Print Final Screen Javascript ############################################################################### sub print_final_screen_javascript { my $javascript = qq~ ~; print $javascript; } ############################################################################### # Send To Pipeline ############################################################################### sub send_to_pipeline { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $prog_name = "PipelineSetup.cgi"; my $command_file_content = $parameters{'planFileText'}; my $project = $parameters{'workingDir'}; my $pipeline_comments = $parameters{'projectComments'}; my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time); my $timestr = strftime("%Y%m%d.%H%M%S",$sec,$min,$hour,$mday,$mon,$year); my $proc_subdir = $parameters{'proc_name'} || $timestr; ## try to eliminate bug-causing namings $proc_subdir =~ s/\s/_/g; $proc_subdir =~ s/\'/_/g; $proc_subdir =~ s/\"/_/g; $proc_subdir =~ s/\./_/g; ## Data Loader JNLP Details if ($parameters{'loader'} eq 'Yes'){ # Determine Project Title my @title = $sbeams->selectOneColumn("SELECT name FROM $TB_PROJECT WHERE project_id = $project"); my $project_title = $title[0]; $project_title =~ s/\s+/_/g; # Command Line Arguments my @a = ("-p", $project, "-m", "sbeamsIndirect://db/sbeams/cgi/Microarray/ViewFile.cgi?". "action=read". "&FILE_NAME=matrix_output". "&project_id=$project". "&SUBDIR=$proc_subdir", "-r", "sbeamsIndirect://db/sbeams/tmp/Microarray/dataLoader/translator.tsv"); my $arguments = ""; foreach my $argument (@a) { $arguments .= qq~ $argument~; } # Create JNLP File my $jnlp_file_path = $JNLP_DIRECTORY."/$proc_subdir".".jnlp"; my $jnlp_file_url = $jnlp_file_path; $jnlp_file_url =~ s/$PHYSICAL_BASE_DIR/$SERVER_BASE_DIR$HTML_BASE_DIR/; open (INFILE, ">$jnlp_file_path"); print INFILE qq~ MetaDataEditor (prototype) ISB $arguments ~; close INFILE; chmod (0666,"$jnlp_file_path"); # Adjust Email Notification Process my $jnlp_command = "jnlp_file = $jnlp_file_url\n"; $command_file_content =~ s/(EXECUTE\s=\semail_notify)/$jnlp_command$1/; } ## Directories my $queue_dir = "/net/arrays/Pipeline/queue"; my $output_dir = "/net/arrays/Pipeline/output"; my $arraybot_working_dir = "project_id/$project/$proc_subdir"; ## Plan/Control File my $plan_filename = "job$timestr.testPlan"; my $control_filename = "job$timestr.control"; my $log_filename = "job$timestr.log"; #### Verify that the plan file does not already exist if ( -e $plan_filename ) { print qq~ Wow, the job filename '$plan_filename' already exists!
Please go back and click PROCESS again. If this happens twice in a row, something is very wrong. Contact edeutsch.
\n ~; return; } ## Write Project Comments # print "
Writing project comments to working directory:$output_dir/$arraybot_working_dir
"; # my $coms_path = "$output_dir/$arraybot_working_dir/$timestr".".comments"; # open (COMMENTSFILE,">$coms_path") || # croak ("Unable to write comments $coms_path"); # print COMMENTSFILE $pipeline_comments; # close (COMMENTSFILE); # chmod (0666,"$coms_path"); #### Write the plan file print "
Writing processing plan file '$plan_filename'
\n"; open(PLANFILE,">$queue_dir/$plan_filename") || croak("Unable to write to file '$queue_dir/$plan_filename'"); print PLANFILE $command_file_content; close(PLANFILE); chmod (0777,"$queue_dir/$plan_filename"); #### Write the control file print "
Writing job control file '$control_filename'
\n"; open(CONTROLFILE,">$queue_dir/$control_filename") || croak("Unable to write to file '$queue_dir/$control_filename'"); print CONTROLFILE "submitted_by=$current_username\n"; print CONTROLFILE "working_dir=$arraybot_working_dir\n"; print CONTROLFILE "status=SUBMITTED\n"; close(CONTROLFILE); chmod (0777,"$queue_dir/$control_filename"); print "Done!

\n"; print qq~ The plan and job control files have been successfully written to the queue. Your job will be processed in the order received. You can see the log file of your job by clicking on the link below:

Well, theres no link yet, but paste this into a unix window:

cd $arraybot_working_dir
if ( -e $log_filename ) tail -f $log_filename



~; } ########################################################################### # establish_settings ########################################################################### sub establish_settings{ $current_username = $sbeams->getCurrent_username; $current_contact_id = $sbeams->getCurrent_contact_id; $current_work_group_id = $sbeams->getCurrent_work_group_id; $current_work_group_name = $sbeams->getCurrent_work_group_name; $current_project_id = $sbeams->getCurrent_project_id; $current_project_name = $sbeams->getCurrent_project_name; $dbh = $sbeams->getDBHandle(); return; }