e6775d01a591715928bcdce52c694744cc498caa
braney
  Thu Oct 17 15:21:35 2013 -0700
implement maf output in table browser
diff --git src/hg/hgTables/hal.c src/hg/hgTables/hal.c
index ebe3304..d586529 100644
--- src/hg/hgTables/hal.c
+++ src/hg/hgTables/hal.c
@@ -1,61 +1,78 @@
 #include "common.h"
 #include "cart.h"
 #include "jksql.h"
 #include "grp.h"
 #include "hubConnect.h"
 #include "hdb.h"
+#include "maf.h"
 #include "hgTables.h"
+#include "trackHub.h"
+#include "halBlockViz.h"
 
 extern struct trackDb *curTrack;	/* Currently selected track. */
 extern char *database;
 extern struct hash *fullTableToTdbHash;        /* All tracks and subtracks keyed by tdb->table field. */
 
 boolean isHalTable(char *table)
 /* Return TRUE if table corresponds to a HAL file. */
 {
 if (isHubTrack(table))
     {
     struct trackDb *tdb = hashFindVal(fullTableToTdbHash, table);
-    printf("HERE tdb type is %s\n", tdb->type);
     return startsWithWord("halSnake", tdb->type);
     }
 else
     return trackIsType(database, table, curTrack, "halSnake", ctLookupName);
 }
 
-static char *samAlignmentAutoSqlString =
-"table samAlignment\n"
-"\"The fields of a SAM short read alignment, the text version of BAM.\"\n"
-    "(\n"
-    "string qName;	\"Query template name - name of a read\"\n"
-    "ushort flag;	\"Flags.  0x10 set for reverse complement.  See SAM docs for others.\"\n"
-    "string rName;	\"Reference sequence name (often a chromosome)\"\n"
-    "uint pos;		\"1 based position\"\n"
-    "ubyte mapQ;		\"Mapping quality 0-255, 255 is best\"\n"
-    "string cigar;	\"CIGAR encoded alignment string.\"\n"
-    "string rNext;	\"Ref sequence for next (mate) read. '=' if same as rName, '*' if no mate\"\n"
-    "int pNext;		\"Position (1-based) of next (mate) sequence. May be -1 or 0 if no mate\"\n"
-    "int tLen;	        \"Size of DNA template for mated pairs.  -size for one of mate pairs\"\n"
-    "string seq;		\"Query template sequence\"\n"
-    "string qual;	\"ASCII of Phred-scaled base QUALity+33.  Just '*' if no quality scores\"\n"
-    "string tagTypeVals; \"Tab-delimited list of tag:type:value optional extra fields\"\n"
-    ")\n";
-
-struct asObject *halAsObj()
-// Return asObject describing fields of SAM/BAM
+struct trackDb *findTrackDb(struct trackDb *trackDb, char *table)
+// find a child of a composite that corresponds to this table
 {
-return asParseText(samAlignmentAutoSqlString);
+if (sameString(trackDb->table, table))
+    return trackDb;
+
+struct trackDb *subTrack = trackDb->subtracks;
+struct trackDb *childTrackDb;
+for(; subTrack; subTrack = subTrack->next)
+    {
+    if ((childTrackDb = findTrackDb(subTrack, table)) != NULL)
+	return childTrackDb;
+    }
+return NULL;
 }
 
+void doHalMaf(struct trackDb *parentTrack, char *table, struct sqlConnection *conn)
+/* Output regions as MAF.  maf tables look bed-like enough for
+ * cookedBedsOnRegions to handle intersections. */
+{
+struct region *region = NULL, *regionList = getRegions();
+struct trackDb *tdb;
+
+if ((tdb = findTrackDb(parentTrack, table)) == NULL)
+    errAbort("cannot find track named %s under %s\n", table, parentTrack->table);
+char *fileName = trackDbSetting(tdb, "bigDataUrl");
+char *otherSpecies = trackDbSetting(tdb, "otherSpecies");
+int handle = halOpenLOD(fileName);
 
-struct slName *halGetFields(char *table)
-/* Get fields of bam as simple name list. */
+struct hal_species_t *speciesList = halGetSpecies(handle);
+
+for(; speciesList; speciesList = speciesList->next)
     {
-struct asObject *as = halAsObj();
-return asColNames(as);
+    if  (sameString(speciesList->name, otherSpecies))
+	break;
     }
+if (speciesList == NULL)
+    errAbort("cannot find species %s in hal file %s\n",
+	otherSpecies, fileName);
+
+speciesList->next = NULL;
 
-void halTabOut(char *db, char *table, struct sqlConnection *conn, char *fields, FILE *f)
-/* Print out selected fields from HAL.  If fields is NULL, then print out all fields. */
+textOpen();
+
+for (region = regionList; region != NULL; region = region->next)
     {
+    halGetMAF(stdout, handle, speciesList,
+		trackHubSkipHubName(database), region->chrom,
+		region->start, region->end, FALSE);
+    }
 }