Browse Source

Added more support for exporting GFF

Stephen Ficklin 10 years ago
parent
commit
00fc6f2f87
1 changed files with 105 additions and 10 deletions
  1. 105 10
      tripal_feature/includes/tripal_feature.gff_exporter.inc

+ 105 - 10
tripal_feature/includes/tripal_feature.gff_exporter.inc

@@ -21,6 +21,8 @@ function tripal_feature_gff3_exporter($source, $filters) {
   ";
 
   $args = array();
+  
+  // Filter by organism
   if (array_key_exists('genus', $filters) or array_key_exists('species', $filters)) {
     $from .= "INNER JOIN {organism} O on F.organism_id = O.organism_id ";
     if (array_key_exists('genus', $filters)) { 
@@ -32,11 +34,30 @@ function tripal_feature_gff3_exporter($source, $filters) {
       $args[':species'] = $filters['species'];
     }
   }
-  
+  // Filter by types
   if (array_key_exists('types', $filters)) {
     $where .= "AND CVT.name IN (:types) ";
     $args[':types'] = $filters['types'];
   }
+  // Filter by exact feature_id
+  if (array_key_exists('feature_id', $filters)) {
+    $where .= "AND F.feature_id = :feature_id ";
+    $args[':feature_id'] = $filters['feature_id'];
+  }
+  // Filter by analysis
+  if (array_key_exists('analysis_id', $filters) or 
+      array_key_exists('analysis_name', $filters)) {
+    $from .= "INNER JOIN {analysisfeature} AF on AF.feature_id = F.feature_id ";
+    if (array_key_exists('analysis_id', $filters)) {
+      $where .= "AND AF.analysis_id = :analysis_id ";
+      $args[':analysis_id'] = $filters['analysis_id'];
+    }
+    if (array_key_exists('analysis_name', $filters)) {
+      $from .= "INNER JOIN {analysis} A on AF.analysis_id = A.analysis_id ";
+      $where .= "AND A.name = :analysis_name ";
+      $args[':analysis_name'] = $filters['analysis_name'];
+    }
+  }
 
   $sql = "$select $from $where $order";
   
@@ -49,9 +70,9 @@ function tripal_feature_gff3_exporter($source, $filters) {
     ORDER BY CVT.name
   ";
   
-  // The SQL statement for Dbxrefs
+  // The SQL statement for Dbxrefs associated with this feature
   $dbxref_sql = "
-    SELECT DB.name, DBX.accession
+    SELECT DB.name as dbname, DBX.accession
     FROM {dbxref} DBX
       INNER JOIN {db} DB on DB.db_id = DBX.db_id
     WHERE DBX.dbxref_id = :dbxref_id
@@ -63,7 +84,7 @@ function tripal_feature_gff3_exporter($source, $filters) {
     WHERE FDBX.feature_id = :feature_id
   ";
   
-  // The SQL statement for CVTerms
+  // The SQL statement for CVTerms assigned to this feature.
   $cvterm_sql = "
     SELECT CV.name as db_name, DBX.accession
     FROM {feature_cvterm} FCVT
@@ -72,14 +93,50 @@ function tripal_feature_gff3_exporter($source, $filters) {
       INNER JOIN {dbxref} DBX on CVT.dbxref_id = DBX.dbxref_id
     WHERE FCVT.feature_id = :feature_id
   ";
+  
+  // The SQL for finding the parents of this feature.
+  $parent_sql = "
+    SELECT F.name, F.uniquename, F.feature_id
+    FROM {feature_relationship} FR
+      INNER JOIN {cvterm} CVT on CVT.cvterm_id = FR.type_id
+      INNER JOIN {feature} F on FR.object_id = F.feature_id
+    WHERE CVT.name = 'part_of' AND FR.subject_id = :feature_id
+  ";
+  
+  // The SQL for aliases of this feature.
+  $alias_sql = "
+    SELECT S.name
+    FROM {feature_synonym} FS
+      INNER JOIN {synonym} S on FS.synonym_id = S.synonym_id
+    WHERE FS.feature_id = :feature_id
+  ";
+  
+  // Get the score
+  $score_sql = "
+    SELECT rawscore as score
+      FROM {analysisfeature} AF
+    WHERE feature_id = :feature_id
+    ORDER BY AF.analysis_id
+    OFFSET 0 LIMIT 1
+  ";
+  
   $results = chado_query($sql, $args);
   while ($line = $results->fetchObject()) {
+    
+    // Get the score for this feature
+    $score = chado_query($score_sql, array(':feature_id' => $line->feature_id))->fetchField();
     print $line->landmark_uname . "\t";
     print $source . "\t";
     print $line->type . "\t";
-    print $line->fmin . "\t";
+    print ($line->fmin + 1). "\t";
     print $line->fmax . "\t";
-    print "." . "\t";
+
+    if ($score) {
+      print $score . "\t";
+    }
+    else {
+      print "." . "\t";
+    }
     if ($line->strand) {
       print $line->strand . "\t";
     } 
@@ -94,6 +151,28 @@ function tripal_feature_gff3_exporter($source, $filters) {
     }
     print "ID=" . $line->uniquename . ";Name=" . $line->name . ";";
     
+    // Look for a parent of this feature
+    $args = array(':feature_id' => $line->feature_id);
+    $parents = chado_query($parent_sql, $args);
+    $attr = '';
+    while ($parent = $parents->fetchObject()) {
+      $attr .= $parent->uniquename . ",";
+    }
+    if ($attr) {
+      print "Parent=" . substr($attr, 0, -1) . ";";
+    }
+    
+    // Add in any aliases
+    $args = array(':feature_id' => $line->feature_id);
+    $aliases = chado_query($alias_sql, $args);
+    $attr = '';
+    while ($alias = $aliases->fetchObject()) {
+      $attr .= $alias->name . ",";
+    }
+    if ($attr) {
+      print "Alias=" . substr($attr, 0, -1) . ";";
+    }
+    
     $props = chado_query($props_sql, array(':feature_id' => $line->feature_id));
     $prop_name = '';
     while ($prop = $props->fetchobject()) {
@@ -126,16 +205,17 @@ function tripal_feature_gff3_exporter($source, $filters) {
     $dbxrefs = chado_query($dbxref_sql, $args);
     $xrefs = '';
     while ($dbxref = $dbxrefs->fetchObject()) {
-      $xrefs .= $dbxref->name . ":" . $dbxref->accession . ",";
+      if ($dbxref->dbname = 'GFF_source') {
+        continue;
+      }
+      $xrefs .= $dbxref->dbname . ":" . $dbxref->accession . ",";
     }
     if ($xrefs) {
       print "Dbxref=" . substr($xrefs, 0, -1) . ";";
     }
     
     // Add in any CVTerm records
-    $args = array(
-      ':feature_id' => $line->feature_id,
-    );
+    $args = array(':feature_id' => $line->feature_id);
     $cvterms = chado_query($cvterm_sql, $args);
     $xrefs = '';
     while ($cvterm = $cvterms->fetchObject()) {
@@ -146,5 +226,20 @@ function tripal_feature_gff3_exporter($source, $filters) {
     }
     
     print "\n";
+    
+    // Look for children of this feature and recursively add them.
+    $children_sql = "
+      SELECT FR.subject_id
+      FROM {feature_relationship} FR
+        INNER JOIN {cvterm} CVT on CVT.cvterm_id = FR.type_id
+      WHERE CVT.name = 'part_of' AND FR.object_id = :feature_id
+    ";
+    $children = chado_query($children_sql, array(':feature_id' => $line->feature_id));
+    while ($child = $children->fetchObject()) {
+      $child_filters = array(
+        'feature_id' => $child->subject_id,
+      );
+      tripal_feature_gff3_exporter($source, $child_filters);
+    }
   }
 }