#!/usr/local/bin/perl ############################################################################### # Program : AgilentArrayRecorder.cgi # Author : Bruz Marzolf # $Id: ArrayRecorder.cgi 5165 2006-10-19 19:18:56Z dcampbel $ # # Description : This CGI program that allows users to record their # Agilent arrays. # ############################################################################### ############################################################################### # 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 $DEFAULT_COST_SCHEME); use DBI; #use CGI; use CGI::Carp qw(fatalsToBrowser croak); use POSIX; use SBEAMS::Connection qw($q); 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"; #$q = new CGI; $sbeams = new SBEAMS::Connection; $sbeamsMA = new SBEAMS::Microarray; $sbeamsMA->setSBEAMS($sbeams); ############################################################################### # Global Variables ############################################################################### $TABLE_NAME = "MA_array_request"; $DEFAULT_COST_SCHEME = 1; main(); ############################################################################### # Main Program: #x # 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(); ## Print standard page header $sbeams->printUserContext(); #### Decide where to go based on form values if ($tab eq 'main') { # $sbeamsMA->printPageHeader(); print_start_screen(parameters_ref=>\%parameters); # $sbeamsMA->printPageFooter(); }elsif ($tab eq 'arrayCount') { # $sbeamsMA->printPageHeader(); print_array_request_screen(parameters_ref=>\%parameters); # $sbeamsMA->printPageFooter(); }elsif ($tab eq 'arrayInfo') { # $sbeamsMA->printPageHeader(); print_array_info_screen(parameters_ref=>\%parameters); # $sbeamsMA->printPageFooter(); }elsif ($tab eq 'finalize') { # $sbeamsMA->printPageHeader(); finalize(parameters_ref=>\%parameters); # $sbeamsMA->printPageFooter(); } } # 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(); print_start_screen_javascript(); ## Print Introductory Header print qq~

Welcome to the Microarray Data Entry Interface

\n
This tool is designed as a one-stop interface to recording information about your arrays.

$LINESEPARATOR
Step 1: Select Project
Into which project are these arrays going?
[Don\'t have a project? Click here to set one up]

~; return; } ############################################################################### # Print Start Screen Javascript ############################################################################### sub print_start_screen_javascript { my $javascript = qq~ ~; print $javascript; } ############################################################################### # Print Array Request Screen ############################################################################### sub print_array_request_screen { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $sql; my @rows; my $project = $parameters{'projectSelector'}; my $contact_id = $sbeams->getCurrent_contact_id(); print_array_request_javascript(); # Create Slide Type Optionlist $sql = qq~ SELECT slide_type_id, name+' (\$'+CONVERT(varchar(50),price)+')' FROM $TBMA_SLIDE_TYPE WHERE record_status != 'D' AND price >= 0 ORDER BY name ~; my $slide_optionlist = $sbeams->buildOptionList($sql); # Create Prep Optionlist $sql = qq~ SELECT option_key, option_value FROM $TBMA_ARRAY_REQUEST_OPTION WHERE option_type = 'hybridization_request' ORDER BY sort_order ~; my $prep_optionlist = $sbeams->buildOptionList($sql); # Create Analysis Optionlist $sql = qq~ SELECT option_key, option_value+' (\$'+CONVERT(varchar(50),price)+')' FROM $TBMA_ARRAY_REQUEST_OPTION WHERE option_type = 'scanning_request' ORDER BY sort_order ~; my $analysis_optionlist = $sbeams->buildOptionList($sql); ## Print Introductory Header print qq~

Microarray Data Entry Interface

\n

$LINESEPARATOR
Step 2: Select \# of Arrays
What are the barcodes of the slides you\'re submitting?  
How many arrays are there per slide (usually 1,2,4 or 8)?  
How many channels are there per slide?  
What type of arrays are these?
What was the requests prep?
What was the requested analysis?


~; return; } ############################################################################### # Print Array Request Javascript ############################################################################### sub print_array_request_javascript { my $javascript = qq~ ~; print $javascript; } ############################################################################### # Print Array Info Screen ############################################################################### sub print_array_info_screen { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $sql; my @rows; my $slide_barcodes = $parameters{'slideBarcodes'}; my $arrays_per_slide = $parameters{'arraysPerSlide'}; my $array_channels = $parameters{'arrayChannels'}; my $successful = 1; my $status_report = ""; # make sure arrays per slide is not zero if( $arrays_per_slide == 0 ) { print "Number of arrays per slide must be greater than 0.

\n"; print "
\n"; return; } # Parse out barcodes my @barcodes; my @barcode_ranges = split /,/, $slide_barcodes; foreach my $barcode_range (@barcode_ranges) { my @barcode_range_ends = split /\-/, $barcode_range; # Handle single barcodes vs. ranges if( $#barcode_range_ends+1 == 1 ) { # Make sure barcode is proper length if( length($barcode_range_ends[0]) == 12 ) { push @barcodes, $barcode_range_ends[0]; } } elsif( $#barcode_range_ends+1 == 2 ) { $barcode_range_ends[0] =~ /(\d{7})(\d{5})/; my $barcode_start_design = $1; my $barcode_start_serial = $2; $barcode_range_ends[1] =~ /(\d{7})(\d{5})/; my $barcode_end_design = $1; my $barcode_end_serial = $2; # Make sure barcodes designs are found and the right length if( $barcode_start_design ne "" && $barcode_start_design == $barcode_end_design ) { foreach my $serial ($barcode_start_serial..$barcode_end_serial) { push @barcodes, $barcode_start_design . $serial; } } } } # Ensure that these barcodes have not yet been entered in SBEAMS my $barcode_list = ""; for my $n (0..$#barcodes) { if( $barcode_list ne "" ) { $barcode_list .= ","; } $barcode_list = $barcode_list . "\'" . $barcodes[$n] . "\'"; } $sql = qq~ SELECT barcode FROM $TBMA_SLIDE WHERE barcode IN ($barcode_list) AND record_status != 'D' ~; @rows = $sbeams->selectOneColumn($sql); if( scalar(@rows) > 0 ) { print "One or more of these barcodes have already been used.

\n"; print "
\n"; return; } # calculate total number of arrays my $array_count = ($#barcodes+1) * $arrays_per_slide; # Determine the organism $sql = qq~ SELECT O.organism_name FROM $TB_ORGANISM O LEFT JOIN $TBMA_SLIDE_TYPE S ON (S.organism_id = O.organism_id) WHERE S.slide_type_id = $parameters{'arrayType'} AND S.record_status != 'D' ~; @rows = $sbeams->selectOneColumn($sql); my $organism = $rows[0]; $organism =~ tr /A-Z/a-z/; ############################### ## SPECIAL ORGANISM HANDLING ## ############################### if ($organism eq "halobacterium") { $organism = "halo"; } ## Create Array Layout Optionlist $sql = qq~ SELECT layout_id FROM $TBMA_ARRAY_LAYOUT WHERE slide_type_id = $parameters{'arrayType'} AND record_status != 'D' ~; my @rows=$sbeams->selectOneColumn($sql); # TODO: proper handling of cases where there isn't exactly 1 array layout my $array_layout_id = $rows[0]; ## Hash of printing batches $sql = qq~ SELECT printing_batch_id FROM $TBMA_PRINTING_BATCH WHERE slide_type_id = $parameters{'arrayType'} AND record_status != 'D' ~; my @rows=$sbeams->selectOneColumn($sql); # TODO: proper handling of cases where there isn't exactly 1 print batch my $printing_batch_id = $rows[0]; ## Create Labeling Optionlist $sql = qq~ SELECT labeling_method_id,name FROM $TBMA_LABELING_METHOD ORDER BY sort_order,name ~; my $optionlist=$sbeams->buildOptionList($sql); ## Create Labeling Protocol Optionlist $sql = qq~ SELECT P.protocol_id, P.name FROM $TB_PROTOCOL P LEFT JOIN $TB_PROTOCOL_TYPE PT ON (PT.protocol_type_id = P.protocol_type_id) WHERE PT.name IN ('extract_labeling', 'Genicon Labeling') AND P.record_status != 'D' ~; my $labeling_optionlist=$sbeams->buildOptionList($sql); ## Create Hybridization Protocol Optionlist $sql = qq~ SELECT P.protocol_id, P.name FROM $TB_PROTOCOL P LEFT JOIN protocol_type PT ON (PT.protocol_type_id = P.protocol_type_id) WHERE PT.name = 'hybridization' AND P.record_status != 'D' ~; my $hybridization_optionlist = $sbeams->buildOptionList($sql); ## Create Scanning Protocol Optionlist $sql = qq~ SELECT P.protocol_id, P.name FROM $TB_PROTOCOL P LEFT JOIN protocol_type PT ON (PT.protocol_type_id = P.protocol_type_id) WHERE PT.name = 'array_scanning' AND P.record_status != 'D' ~; my $scanning_optionlist = $sbeams->buildOptionList($sql); ## Create Quantitation Protocol Optionlist $sql = qq~ SELECT P.protocol_id, P.name FROM $TB_PROTOCOL P LEFT JOIN protocol_type PT ON (PT.protocol_type_id = P.protocol_type_id) WHERE PT.name = 'image_analysis' AND P.record_status != 'D' ~; my $spotfinding_optionlist = $sbeams->buildOptionList($sql); ## Print Introductory Header print qq~

Microarray Data Entry Interface

\n

$LINESEPARATOR
Step 3: Array Information

$status_report
~; if($array_channels == 2) { print qq~ ~; } print qq~ ~; if($array_channels == 2) { print qq~ ~; } print qq~ ~; my $m = 0; foreach my $barcode (@barcodes) { $barcode =~ /\A\d{2}(\d{5}).*/; my $design_id = $1; foreach my $array (1..$arrays_per_slide) { # if there's only one array per slide, don't tack the array number onto the end # of the barcode if($arrays_per_slide == 1) { $array = ""; } print qq~ ~; if($array_channels == 2) { print qq~ ~; } print qq~ ~; $m++ } } print qq~
Slide Barcode Array \# on Slide Sample \#1 Name Sample \#1 Label Dye Lot \#Sample \#2 Name Sample \#2 Label Dye Lot \#Labeling Protocol Date Labeled (YYYY-MM-DD) Hybridization Protocol Date Hybridized(YYYY-MM-DD) Scanning Protocol Scan Date(YYYY-MM-DD) Scan Data Flag Image Location Quantitation Protocol Quantitation Date(YYYY-MM-DD) Quantitation Data Flag Quantitation File Location
$barcode $array


~; print_array_info_javascript($array_count); return; } ############################################################################### # Print Array Info Javascript ############################################################################### sub print_array_info_javascript { my $array_requests = shift @_; my $javascript = qq~ ~; print $javascript; } ############################################################################### # finalize # NOTE: the 'array_name' field within microarray.dbo.array is named # the same as the 'slide_number' field in microarray.dbo.slide. # Also, the page is hinged upon the standardized naming of print # batches. We can intuit the print batch based upon slide number # and organism (from slide type). However, if the naming convention is # different, this won't work!! ############################################################################### sub finalize { my %args = @_; my $parameters_ref = $args{'parameters_ref'}; my %parameters = %{$parameters_ref}; ## Standard Variables my $sql; my @rows; my $contact_id = $sbeams->getCurrent_contact_id(); ## Other Variables my $project = $parameters{'project'}; my $cost_scheme_id = $DEFAULT_COST_SCHEME unless ( $parameters{'cost_scheme_id'} >= 1 ); my $successful = 1; my $error_messages =""; my $slide_type_id = $parameters{'slideType'}; my $analysis_type = $parameters{'analysisType'}; my $array_layout_id = $parameters{'arrayLayout'}; my $printing_batch_id = $parameters{'printingBatch'}; my %array_info; ## Determine Number of arrays my $array_count = $parameters{'arrayCount'}; ## Number of channels my $array_channels = $parameters{'arrayChannels'}; ## Print Introductory Header print qq~

Welcome to the Microarray Data Entry Interface

\n
This tool is designed as a one-stop interface to recording information about your arrays.

$LINESEPARATOR
~; ###################################################################################### # Verify that we won't have any problems INSERTing the records. # # Intuit print batch and array layout. SKETCHY! Is there a cleaner way to do this? # ###################################################################################### # Determine the organism $sql = qq~ SELECT O.organism_name FROM $TB_ORGANISM O LEFT JOIN $TBMA_SLIDE_TYPE S ON (S.organism_id = O.organism_id) WHERE S.slide_type_id = $slide_type_id AND S.record_status != 'D' ~; @rows = $sbeams->selectOneColumn($sql); my $organism = $rows[0]; $organism =~ tr /A-Z/a-z/; ############################### ## SPECIAL ORGANISM HANDLING ## ############################### if ($organism eq "halobacterium") { $organism = "halo"; } ## Verify that all the prerequisite records are created. for (my $m=0;$m<$array_count;$m++) { my $file = $parameters{'quantfile_'.$m}; my $array = $parameters{'barcode_'.$m} . $parameters{'array_'.$m}; $array_info{$array,'quantitation_file'} = $file; ## Verify that Array Locations are correct if (-e $file) { print "File $file: Location VERIFIED
\n"; }else { $error_messages.= "$file is not valid
\n"; $successful = 0; } ## Verify that record from 'array' table exists and isn't taken $sql = qq~ SELECT COUNT(*) FROM $TBMA_ARRAY WHERE array_name = '$array' ~; @rows = $sbeams->selectOneColumn($sql); unless (scalar(@rows) == 1) { $successful = 0; $error_messages .= qq~ Array \#$array already has a record in SBEAMS. Contact Array Core.
~; } } ## Determine whether Agilent slide model exists my $slide_model_id; $sql = qq~ SELECT slide_model_id FROM $TBMA_SLIDE_MODEL WHERE vendor_name = 'Agilent' AND model_name = 'Agilent' AND record_status != 'D' ~; @rows = $sbeams->selectOneColumn($sql); # pick the first Agilent model if there is one if( scalar(@rows) > 0 ) { $slide_model_id = $rows[0]; } # or log an error else { print "Agilent slide model record not found. Contact Array Core.
"; return; } ## Determine whether or not agilent slide lot exists my $slide_lot_id; $sql = qq~ SELECT slide_lot_id FROM $TBMA_SLIDE_LOT WHERE slide_model_id = $slide_model_id AND record_status != 'D' ~; @rows = $sbeams->selectOneColumn($sql); # pick the first Agilent model if there is one if( scalar(@rows) > 0 ) { $slide_lot_id = $rows[0]; } # or log an error else { $successful = 0; $error_messages .= qq~ Agilent slide lot record not found. Contact Array Core.
~; } # Agilent arrays are referred to by their barcodes, so # for slide_number, the next available number from # 3000001-3999999 is used as an arbitrary unique identifier $sql = qq~ SELECT MAX(slide_number) FROM $TBMA_SLIDE WHERE slide_number > 3000001 AND slide_number < 4000000 AND record_status != 'D' ~; @rows = $sbeams->selectOneColumn($sql); # set current slide number as one above highest in Agilent slide number range my $slide_number = $rows[0] + 1; if( $slide_number < 3000001 || $slide_number >= 4000000 ) { $slide_number = 3000001; } ## If there are any errors, report them now or continue with adding records to SBEAMS unless ($successful == 1) { print $error_messages; print "
Due to the listed errors, this transaction failed. Please go back and make the corrections."; print "
\n"; return; } ######################################################### ## At this point, we should be clear to INSERT records ## ######################################################### # Determine price of all the arrays (NOTE: NO LABELING/HYBRIDIZATION COSTS ARE INCLUDED) $sql = "SELECT price FROM $TBMA_ARRAY_REQUEST_OPTION WHERE option_key = '$analysis_type' AND option_type LIKE 'scanning%' "; @rows = $sbeams->selectOneColumn($sql); my $scan_cost = $rows[0]; $sql = " SELECT price FROM $TBMA_SLIDE_TYPE WHERE slide_type_id = '$slide_type_id' "; @rows = $sbeams->selectOneColumn($sql); my $array_cost = $rows[0]; my $price = $scan_cost + ($array_count * $array_cost); ## Start the transaction # print "
\n BEGIN TRANSACTION
\n"; $sbeams->executeSQL("BEGIN TRANSACTION"); ## Insert Array Request Records my %rowdata; my $rowdata_ref; $rowdata{'contact_id'} = $contact_id; $rowdata{'project_id'} = $project; $rowdata{'cost_scheme_id'} = $cost_scheme_id; $rowdata{'slide_type_id'} = $slide_type_id; $rowdata{'n_slides'} = $array_count; $rowdata{'n_samples_per_slide'} = $array_channels; $rowdata{'hybridization_request'} = $parameters{'prepType'}; $rowdata{'scanning_request'}= $analysis_type; $rowdata{'request_status'} = "Submitted"; $rowdata{'price'} = $price; $rowdata_ref= \%rowdata; my $array_request_id; $array_request_id = $sbeams->updateOrInsertRow(table_name=>$TBMA_ARRAY_REQUEST, rowdata_ref=>$rowdata_ref, insert=>1, return_PK=>1, add_audit_parameters=>1 ); undef %rowdata; ## INSERT array_request_slide record for each array for (my $m=0;$m<$array_count;$m++) { my $barcode = $parameters{'barcode_'.$m}; my $array = $barcode . $parameters{'array_'.$m}; ## Format array_id so that it's a five digit number (e.g. '2886' --> '02886') # BUGFIX - this actually never ran until the array ids got > 9999, whereupon # it caused an infinite loop. Will comment out, since it was a no-op # while ($array =~ /\d{5}/){ # $array = "0".$array; # } $rowdata{'array_request_id'} = $array_request_id; $rowdata{'slide_index'}= $m; $rowdata_ref = \%rowdata; my $array_request_slide_id; $array_request_slide_id = $sbeams->updateOrInsertRow(table_name=>$TBMA_ARRAY_REQUEST_SLIDE, rowdata_ref=>$rowdata_ref, insert=>1, return_PK=>1, add_audit_parameters=>1); $array_info{$array,'array_request_id'} = $array_request_id; $array_info{$array,'array_request_slide_id'} = $array_request_slide_id; undef %rowdata; ## INSERT array_request_sample, labeling record, and hybridization my ($sample0_name, $sample1_name); if( length($parameters{'sample0name_'.$m}) > 48 ) { $sample0_name = substr( $parameters{'sample0name_'.$m}, 0, 46).".."; } if( $array_channels == 2 && length($parameters{'sample1name_'.$m}) > 48 ) { $sample1_name = substr( $parameters{'sample1name_'.$m}, 0, 46).".."; } for (my $sample_index=0;$sample_index<$array_channels;$sample_index++) { ## INSERT array_request_sample record $rowdata{'array_request_slide_id'} = $array_request_slide_id; $rowdata{'sample_index'} = $sample_index; my $full_name = $parameters{'sample'.$sample_index.'name_'.$m}; $rowdata{'full_name'} = $full_name; $rowdata{'name'} = substr($full_name, 0, 46).".."; $rowdata{'labeling_method_id'} = $parameters{'sample'.$sample_index.'labmeth_'.$m}; $rowdata_ref = \%rowdata; my $array_request_sample_id; $array_request_sample_id = $sbeams->updateOrInsertRow (table_name=>$TBMA_ARRAY_REQUEST_SAMPLE, rowdata_ref=>$rowdata_ref, insert=>1, return_PK=>1, add_audit_parameters=>1); $array_info{$array,'array_request_sample_'.$sample_index.'_id'} = $array_request_sample_id; undef %rowdata; ## INSERT Labeling Record $rowdata{'array_request_sample_id'} = $array_request_sample_id; $rowdata{'protocol_id'} = $parameters{'labprot_'.$m}; $rowdata{'date_labeled'} = $parameters{'labdate_'.$m}; $rowdata{'dilution_factor'} = "-1"; $rowdata{'volume'} = "-1"; $rowdata{'absorbance_lambda'} = "-1"; $rowdata{'absorbance_260'} = "-1"; $rowdata{'dye_lot_number'} = $parameters{'sample'.$sample_index.'dye_'.$m}; $rowdata_ref = \%rowdata; my $labeling_id; $labeling_id = $sbeams->updateOrInsertRow (table_name=>$TBMA_LABELING, rowdata_ref=>$rowdata_ref, insert=>1, add_audit_parameters=>1); $array_info{$array,'labeling_id'} = $labeling_id; undef %rowdata; } ## INSERT Slide Record $rowdata{'slide_lot_id'} = $slide_lot_id; $rowdata{'slide_number'} = $slide_number; $rowdata{'barcode'} = $barcode; $rowdata{'comment'} = 'Created by AgilentArrayRecorder.cgi.'; $rowdata_ref = \%rowdata; my $slide_id; $slide_id = $sbeams->updateOrInsertRow(table_name=>$TBMA_SLIDE, rowdata_ref=>$rowdata_ref, insert=>1, return_PK=>1, add_audit_parameters=>1); $array_info{$array,'slide_id'} = $slide_id; undef %rowdata; # increment slide number for next array $slide_number++; ## INSERT Array Record $rowdata{'project_id'} = $project; $rowdata{'layout_id'} = $array_layout_id; $rowdata{'printing_batch_id'} = $printing_batch_id; $rowdata{'slide_id'} = $slide_id; $rowdata{'array_name'} = $array; $rowdata{'array_request_slide_id'} = $array_request_slide_id; $rowdata_ref = \%rowdata; my $array_id; $array_id = $sbeams->updateOrInsertRow(table_name=>$TBMA_ARRAY, rowdata_ref=>$rowdata_ref, insert=>1, return_PK=>1, add_audit_parameters=>1); ## Format array_id so that it's a five digit number (e.g. '2886' --> '02886') while ($array_id =~ /\A\d{5}\Z/){ $array_id = "0".$array_id; } $array_info{$array,'array_id'} = $array_id; undef %rowdata; ## INSERT Hybridization Record $rowdata{'name'} = $sample0_name.'_vs_'.$sample1_name; $rowdata{'array_id'} = $array_id; $rowdata{'protocol_id'} = $parameters{'hybprot_'.$m}; $rowdata{'date_hybridized'} = $parameters{'hybdate_'.$m}; $rowdata{'comment'} = 'Created by AgilentArrayRecorder.cgi.'; $rowdata_ref = \%rowdata; my $hybridization_id; $hybridization_id = $sbeams->updateOrInsertRow (table_name=>$TBMA_HYBRIDIZATION, rowdata_ref=>$rowdata_ref, insert=>1, return_PK=>1, add_audit_parameters=>1); $array_info{$array,'hybridization_id'} = $hybridization_id; undef %rowdata; ## INSERT array_scan record $rowdata{'array_id'} = $array_id; $rowdata{'protocol_id'} = $parameters{'scanprot_'.$m}; $rowdata{'data_flag'} = $parameters{'scanflag_'.$m}; $rowdata{'date_scanned'} = $parameters{'scandate_'.$m}; $rowdata{'resolution'} = '10.00'; $rowdata{'stage_location'} = $parameters{'scanfile_'.$m}; $rowdata{'comment'} = 'Created by AgilentArrayRecorder.cgi.'; $rowdata_ref = \%rowdata; my $array_scan_id; $array_scan_id = $sbeams->updateOrInsertRow (table_name=>$TBMA_ARRAY_SCAN, rowdata_ref=>$rowdata_ref, insert=>1, return_PK=>1, add_audit_parameters=>1); $array_info{$array,'array_scan_id'} = $array_scan_id; undef %rowdata; ## INSERT array_quantitation_record $rowdata{'array_scan_id'} = $array_scan_id; $rowdata{'protocol_id'} = $parameters{'quantprot_'.$m}; $rowdata{'stage_location'} = $parameters{'quantfile_'.$m}; $rowdata{'data_flag'} = $parameters{'quantflag_'.$m}; $rowdata{'date_quantitated'} = $parameters{'quantdate_'.$m}; $rowdata{'comment'} = 'Created by AgilentArrayRecorder.cgi.'; $rowdata_ref = \%rowdata; my $array_quantitation_id; $array_quantitation_id = $sbeams->updateOrInsertRow (table_name=>$TBMA_ARRAY_QUANTITATION, rowdata_ref=>$rowdata_ref, insert=>1, return_PK=>1, add_audit_parameters=>1); $array_info{$array,'array_quantitation_id'} = $array_quantitation_id; undef %rowdata; } ## End transaction # print "
\n COMMIT TRANSACTION
\n"; $sbeams->executeSQL("COMMIT TRANSACTION"); ## Print Successful Handling Screen print qq~ Array Records Inserted Successfully!
To see the array request record:
$SERVER_BASE_DIR$CGI_BASE_DIR/Microarray/SubmitArrayRequest.cgi?TABLE_NAME=MA_ARRAY_REQUEST&array_request_id=$array_request_id

To visit this project\'s homepage:
$SERVER_BASE_DIR$CGI_BASE_DIR/Microarray/ProjectHome.cgi?set_current_project_id=$project
~; ## Fire off an email alerting the admins that a request has been added. alert_admins($array_request_id); alert_developers($array_request_id,\%array_info); } ############################################################################### # alert_admins ############################################################################### sub alert_admins{ my $PK = shift @_; my $mailprog = "/usr/lib/sendmail"; my $recipient_name = "Microarray_admin Contact"; my $recipient = "bmarzolf\@systemsbiology.org"; my $cc_name = "SBEAMS"; my $cc = "edeutsch\@systemsbiology.org"; my $current_username = $sbeams->getCurrent_username(); #### But if we're running as a dev version then just mail to administrator if ($DBVERSION =~ /Dev/) { $recipient_name = $cc_name; $recipient = $cc; } open (MAIL, "|$mailprog $recipient,$cc") || croak "Can't open $mailprog!\n"; print MAIL "From: SBEAMS \n"; print MAIL "To: $recipient_name <$recipient>\n"; print MAIL "Cc: $cc_name <$cc>\n"; print MAIL "Reply-to: $current_username <${current_username}\@systemsbiology.org>\n"; print MAIL "Subject: Microarray request submission\n\n"; print MAIL "A microarray request was just entered into SBEAMS by ${current_username}. This was sent by ArrayRecorder.cgi\n\n"; print MAIL "To see the request view this link:\n\n"; print MAIL "$SERVER_BASE_DIR$CGI_BASE_DIR/Microarray/SubmitArrayRequest.cgi?TABLE_NAME=MA_ARRAY_REQUEST&array_request_id=$PK\n\n"; close (MAIL); print "

An email was just sent to the Microarray_admin Group informing them of your request.
\n"; } ############################################################################### # alert_developers ############################################################################### sub alert_developers{ my $PK = shift @_; my $parameters_ref = shift @_; my %parameters = %{$parameters_ref}; my $mailprog = "/usr/lib/sendmail"; my $recipient_name = "Microarray_admin Developer Contact"; my $recipient = "bmarzolf\@systemsbiology.org"; my $current_username = $sbeams->getCurrent_username(); open (MAIL, "|$mailprog $recipient") || croak "Can't open $mailprog!\n"; print MAIL "From: SBEAMS \n"; print MAIL "To: $recipient_name <$recipient>\n"; print MAIL "Reply-to: $current_username <${current_username}\@systemsbiology.org>\n"; print MAIL "Subject: Microarray request submission\n\n"; print MAIL "A microarray request was just entered into SBEAMS by ${current_username}. This was sent by ArrayRecorder.cgi\n\n"; print MAIL "To see the request view this link:\n\n"; print MAIL "$SERVER_BASE_DIR$CGI_BASE_DIR/Microarray/SubmitArrayRequest.cgi?TABLE_NAME=MA_ARRAY_REQUEST&array_request_id=$PK\n\n"; print MAIL "Here is a listing of the data that was inserted:\n"; print MAIL "KEY(array,data type) \t VALUE\n"; foreach my $key (keys %parameters) { print MAIL "$key - $parameters{$key}\n"; } close (MAIL); print "

An email was just sent to the Microarray_admin Group informing them of your request.
\n"; }