| 
					
				 | 
			
			
				@@ -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, 
			 |