|
@@ -57,9 +57,21 @@ function blast_nucleotide_form($form, &$form_state) {
|
|
|
// Upload a file as an alternative to enter a query sequence
|
|
|
$form['#attributes']['enctype'] = 'multipart/form-data';
|
|
|
$form['query']['UPLOAD'] = array(
|
|
|
- '#prefix' => 'Or upload your query files: ',
|
|
|
- '#type' => 'file',
|
|
|
- '#description' => t('The file should be a plain-text FASTA file and not a .doc, .docx, etc. It cannot be greater than 10 Mb in size.'),
|
|
|
+ '#title' => 'Or upload your own query FASTA: ',
|
|
|
+ '#type' => 'managed_file',
|
|
|
+ '#description' => t('The file should be a plain-text FASTA
|
|
|
+(.fasta, .fna, .fa) file. In other words, it cannot have formatting as is the
|
|
|
+case with MS Word (.doc, .docx) or Rich Text Format (.rtf). It cannot be greater
|
|
|
+than %max_size in size. <strong>Don\'t forget to press the Upload button before
|
|
|
+attempting to submit your BLAST.</strong>',
|
|
|
+ array(
|
|
|
+ '%max_size' => round(file_upload_max_size() / 1024 / 1024,1) . 'MB'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ '#upload_validators' => array(
|
|
|
+ 'file_validate_extensions' => array('fasta fna fa'),
|
|
|
+ 'file_validate_size' => array(file_upload_max_size()),
|
|
|
+ ),
|
|
|
);
|
|
|
|
|
|
|
|
@@ -82,12 +94,24 @@ function blast_nucleotide_form($form, &$form_state) {
|
|
|
'#default_value' => 0,
|
|
|
);
|
|
|
|
|
|
- // Upload a file as an alternative to enter a query sequence
|
|
|
+ // Upload a file as an alternative to selecting an existing BLAST database
|
|
|
$form['#attributes']['enctype'] = 'multipart/form-data';
|
|
|
$form['DB']['DBUPLOAD'] = array(
|
|
|
- '#prefix' => 'Or upload your own dataset: ',
|
|
|
- '#type' => 'file',
|
|
|
- '#description' => t('The file should be a plain-text FASTA file and not a .doc, .docx, etc. It cannot be greater than 10 Mb in size.'),
|
|
|
+ '#title' => 'Or upload your own dataset: ',
|
|
|
+ '#type' => 'managed_file',
|
|
|
+ '#description' => t('The file should be a plain-text FASTA
|
|
|
+(.fasta, .fna, .fa) file. In other words, it cannot have formatting as is the
|
|
|
+case with MS Word (.doc, .docx) or Rich Text Format (.rtf). It cannot be greater
|
|
|
+than %max_size in size. <strong>Don\'t forget to press the Upload button before
|
|
|
+attempting to submit your BLAST.</strong>',
|
|
|
+ array(
|
|
|
+ '%max_size' => round(file_upload_max_size() / 1024 / 1024,1) . 'MB'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ '#upload_validators' => array(
|
|
|
+ 'file_validate_extensions' => array('fasta fna fa'),
|
|
|
+ 'file_validate_size' => array(file_upload_max_size()),
|
|
|
+ ),
|
|
|
);
|
|
|
|
|
|
// ALGORITHM PARAMETERS
|
|
@@ -223,47 +247,53 @@ function blast_nucleotide_form($form, &$form_state) {
|
|
|
*/
|
|
|
function blast_nucleotide_form_validate($form, &$form_state) {
|
|
|
|
|
|
- // Validate FASTA seq in textfield
|
|
|
- $fastaSeq = $form_state['input']['FASTA'];
|
|
|
- if (isset($fastaSeq)) {
|
|
|
- if (_validateFasta($fastaSeq)){
|
|
|
- form_set_error('nBLAST', t('Error: Failed to read the Blast query: Wrong format provided for FASTA nucleotide sequence'));
|
|
|
+ // Validate Query
|
|
|
+ //----------------
|
|
|
+ // @todo: We are currently not validating uploaded files are valid FASTA.
|
|
|
+ // First check to see if we have an upload & if so then validate it.
|
|
|
+ $file = file_load($form_state['values']['UPLOAD']);
|
|
|
+ // If the $file is populated then this is a newly uploaded, temporary file.
|
|
|
+ if (is_object($file)) {
|
|
|
+ $form_state['qFlag'] = 'upQuery';
|
|
|
+ $form_state['upQuery_path'] = drupal_realpath($file->uri);
|
|
|
+ }
|
|
|
+ // Otherwise there was no file uploaded.
|
|
|
+ // Check if there was a query sequence entered in the texfield.
|
|
|
+ elseif (!empty($form_state['input']['FASTA'])) {
|
|
|
+ // Check to ensure that the query sequence entered is valid FASTA.
|
|
|
+ if (_validateFasta($form_state['input']['FASTA'])){
|
|
|
+ form_set_error('nBLAST', t('You need to provide a valid FASTA sequence
|
|
|
+for the query.'));
|
|
|
}
|
|
|
else {
|
|
|
$form_state['qFlag'] = 'seqQuery';
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- // Validate query upload
|
|
|
- $upQuery = file_save_upload('UPLOAD', array('file_validate_extensions' => array('txt fasta fa fna')), FILE_EXISTS_RENAME);
|
|
|
- if ($upQuery) {
|
|
|
- $upQuery_uri = $upQuery->uri;
|
|
|
- $form_state['upQuery_path'] = drupal_realpath($upQuery_uri);
|
|
|
- $upQuery_content = file_get_contents($form_state['upQuery_path']);
|
|
|
- if (_validateFasta($upQuery_content)){
|
|
|
- form_set_error('nBLAST', t('Error: Failed to upload the Blast query: Wrong format provided for FASTA nucleotide sequence'));
|
|
|
- }
|
|
|
- else {
|
|
|
- $form_state['qFlag'] = 'upQuery';
|
|
|
- }
|
|
|
+ // Otherwise they didn't enter a query!!
|
|
|
+ else {
|
|
|
+ form_set_error('nBLAST', t('You must either enter a FASTA sequence in the
|
|
|
+text field or upload one of your own.'));
|
|
|
}
|
|
|
|
|
|
- // Validate blast database upload
|
|
|
- $upDB = file_save_upload('DBUPLOAD', array('file_validate_extensions' => array('txt fasta fa fna')), FILE_EXISTS_RENAME);
|
|
|
- if ($upDB) {
|
|
|
- $upDB_uri = $upDB->uri;
|
|
|
- $form_state['upDB_path'] = drupal_realpath($upDB_uri);
|
|
|
- $upDB_content = file_get_contents($form_state['upDB_path']);
|
|
|
- if (_validateFasta($upDB_content)){
|
|
|
- form_set_error('DB', t('Error: Failed to upload the Blast subject sequence file: Wrong format provided for FASTA nucleotide sequence'));
|
|
|
- }
|
|
|
- else {
|
|
|
- $form_state['dbFlag'] = 'upQuery';
|
|
|
- }
|
|
|
+ // Validate Database
|
|
|
+ //-------------------
|
|
|
+ // @todo: We are currently not validating uploaded files are valid FASTA.
|
|
|
+ // First check to see if we have an upload & if so then validate it.
|
|
|
+ $file = file_load($form_state['values']['DBUPLOAD']);
|
|
|
+ // If the $file is populated then this is a newly uploaded, temporary file.
|
|
|
+ if (is_object($file)) {
|
|
|
+ $form_state['dbFlag'] = 'upDB';
|
|
|
+ $form_state['upDB_path'] = drupal_realpath($file->uri);
|
|
|
}
|
|
|
- else {
|
|
|
+ // Otherwise there was no file uploaded
|
|
|
+ // Check if there was a database choosen from the list instead
|
|
|
+ elseif (!empty($form_state['values']['SELECT_DB'])) {
|
|
|
$form_state['dbFlag'] = 'blastdb';
|
|
|
}
|
|
|
+ // Otherwise they didn't select a database!!
|
|
|
+ else {
|
|
|
+ form_set_error('DB', t('You must either choose a database from the list or upload one of your own.'));
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -274,6 +304,8 @@ function blast_nucleotide_form_validate($form, &$form_state) {
|
|
|
*/
|
|
|
function blast_nucleotide_form_submit($form, &$form_state) {
|
|
|
|
|
|
+ $error = FALSE;
|
|
|
+
|
|
|
$eVal = $form_state['values']['eVal'];
|
|
|
|
|
|
$trgtKey = $form_state['values']['maxTarget'];
|
|
@@ -358,17 +390,28 @@ function blast_nucleotide_form_submit($form, &$form_state) {
|
|
|
}
|
|
|
|
|
|
// If the BLAST database was uploaded then use it to run the BLAST
|
|
|
- if ( $form_state['dbFlag'] == 'upQuery') {
|
|
|
+ if ( $form_state['dbFlag'] == 'upDB') {
|
|
|
|
|
|
// Since we only support using the -db flag (not -subject) we need to create a
|
|
|
// blast database for the FASTA uploaded.
|
|
|
// NOTE: We can't support subject because we need to generate the ASN.1+ format
|
|
|
// to provide multiple download type options from the same BLAST
|
|
|
$blastdb_with_path = $form_state['upDB_path'];
|
|
|
- system("makeblastdb -in $blastdb_with_path -dbtype nucl -parse_seqids");
|
|
|
-
|
|
|
- //$blast_subj_cmd = "blastn -query $query -subject $subjectSeq -out sites/default/files/$subSeqOut.blastn.html -evalue $eVal -word_size $wordSize -gapopen $gapOpen -gapextend $gapExtend -penalty $penalty -reward $reward -num_alignments 100 -html";
|
|
|
- //system($blast_subj_cmd);
|
|
|
+ $result = NULL;
|
|
|
+ exec("makeblastdb -in $blastdb_with_path -dbtype nucl -parse_seqids 2>&1", $result);
|
|
|
+
|
|
|
+ // Check that the BLAST database was made correctly.
|
|
|
+ $result = implode('<br />', $result);
|
|
|
+ if (preg_match('/Error/', $result)) {
|
|
|
+ drupal_set_message('Unable to generate a BLAST database from your uploaded
|
|
|
+FASTA sequence. Please check that your file is a valid FASTA file and that if
|
|
|
+your sequence headers include pipes (i.e.: | ) they adhere to '
|
|
|
+. l('NCBI standards.', 'http://www.ncbi.nlm.nih.gov/books/NBK21097/table/A632/?report=objectonly', array('attributes' => array('target' => '_blank'))),
|
|
|
+ 'error'
|
|
|
+ );
|
|
|
+
|
|
|
+ $error = TRUE;
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
// Otherwise, we are using one of the website provided BLAST databases so form the
|
|
@@ -406,8 +449,10 @@ function blast_nucleotide_form_submit($form, &$form_state) {
|
|
|
// Redirect to the BLAST results page
|
|
|
drupal_goto("blast/report/$job_id");
|
|
|
}
|
|
|
- else {
|
|
|
- $dbfile_uploaded_msg = ($form_state['dbFlag'] == 'upQuery') ? 'The BLAST database was submitted via user upload.' : 'Existing BLAST Database was chosen';
|
|
|
+ // We check if $error is set to TRUE because if so then the error has already
|
|
|
+ // been reported.
|
|
|
+ elseif (!$error) {
|
|
|
+ $dbfile_uploaded_msg = ($form_state['dbFlag'] == 'upDB') ? 'The BLAST database was submitted via user upload.' : 'Existing BLAST Database was chosen';
|
|
|
tripal_report_error(
|
|
|
'blast_ui',
|
|
|
TRIPAL_ERROR,
|