3368a233739bf613cbc1e8884bbb45af424f223e
angie
  Mon Jun 1 10:55:13 2015 -0700
Add support for ctgPos table type (like bed w/swizzled columns and 'contig' for name)
and possibly other swizzled-bed types if we still have any of those.
refs #15432

diff --git src/hg/das/das.c src/hg/das/das.c
index ca18337..a6eae59 100644
--- src/hg/das/das.c
+++ src/hg/das/das.c
@@ -803,73 +803,79 @@
 }
 
 static void dasOutPslSegment(struct sqlResult *sr, int rowOffset, struct tableDef *td, struct trackTable *tt)
 /* output psls resulting from query */
 {
 char **row;
 while ((row = sqlNextRow(sr)) != NULL)
     {
     struct psl *psl = pslLoad(row+rowOffset);
     dasOutPsl(psl, td, tt);
     pslFree(&psl);
     }
 }
 
 static void dasOutBed(char *chrom, int start, int end, 
-	char *name, char *strand, char *score, 
+	char *name, char *score,  char *strand,
 	struct tableDef *td, struct trackTable *tt)
 /* Write out a generic one. */
 {
 printf("<FEATURE id=\"%s.%s.%d\" label=\"%s\">\n", name, chrom, start, name);
 dasPrintType(td, tt);
 if (td->method != NULL)
     printf(" <METHOD id=\"id\">%s</METHOD>\n", td->method);
 else
     printf(" <METHOD></METHOD>\n");
 printf(" <START>%d</START>\n", start+1);
 printf(" <END>%d</END>\n", end);
 printf(" <SCORE>%s</SCORE>\n", score);
 printf(" <ORIENTATION>%c</ORIENTATION>\n", dasStrand(strand[0]));
 printf(" <PHASE>-</PHASE>\n");
 printf(" <GROUP id=\"%s.%s.%d\">\n", name, chrom, start);
 printf("  <LINK href=\"http://genome.ucsc.edu/cgi-bin/hgTracks?position=%s:%d-%d&amp;db=%s\">Link to UCSC Browser</LINK>\n", 
     chrom, start, end, database);
 printf(" </GROUP>\n");
 printf("</FEATURE>\n");
 }
 
-static void dasOutBedSegment(struct sqlResult *sr, int rowOffset, char *table, struct tableDef *td, struct trackTable *tt)
+static void dasOutBedSegment(struct sqlResult *sr, char *table, struct tableDef *td,
+                             struct trackTable *tt)
 /* output BEDs and BED like tables resulting from query */
 {
 char **row;
+int chromIx = sqlFieldColumn(sr, "chrom");
+int chromStartIx = sqlFieldColumn(sr, "chromStart");
+int chromEndIx = sqlFieldColumn(sr, "chromEnd");
+int nameIx = sqlFieldColumn(sr, "name");
 int scoreIx = sqlFieldColumn(sr, "score");
 int strandIx = sqlFieldColumn(sr, "strand");
-int nameIx = sqlFieldColumn(sr, "name");
 
+if (nameIx == -1)
+    nameIx = sqlFieldColumn(sr, "contig");
 if (scoreIx == -1)
     scoreIx = sqlFieldColumn(sr, "gcPpt");
 if (scoreIx == -1)
     scoreIx = sqlFieldColumn(sr, "dataValue");  // bedGraph
 while ((row = sqlNextRow(sr)) != NULL)
     {
-    char *strand = (strandIx >= 0 ? row[strandIx] : "0");
-    char *score = (scoreIx >= 0 ? row[scoreIx] : "-");
+    char *chrom = (chromIx >= 0) ? row[chromIx] : "-";
+    char *chromStart = (chromStartIx >= 0) ? row[chromStartIx] : "0";
+    char *chromEnd = (chromEndIx >= 0) ? row[chromEndIx] : "0";
     char *name = (nameIx >= 0 ? row[nameIx] : td->name);
-    dasOutBed(row[0+rowOffset], 
-              sqlUnsigned(row[1+rowOffset]), 
-              sqlUnsigned(row[2+rowOffset]), 
-              name, strand, score, td, tt);
+    char *score = (scoreIx >= 0 ? row[scoreIx] : "-");
+    char *strand = (strandIx >= 0 ? row[strandIx] : "0");
+    dasOutBed(chrom, sqlUnsigned(chromStart), sqlUnsigned(chromEnd), name, score, strand, td, tt);
     }
 }
 
 static void writeSegmentFeaturesTable(struct segment *segment,
                                       struct tableDef *td,
                                       struct hash *trackHash,
                                       struct sqlConnection *conn)
 /* write segments features for a table */
 {
 int rowOffset;
 boolean hasBin;
 char table[HDB_MAX_TABLE_STRING];
 
 verbose(2, "track %s\n", td->name);
 hFindSplitTable(database, segment->seq, td->name, table, &hasBin);
@@ -882,31 +888,31 @@
     safecpy(table, sizeof(table), "all_est");
 struct trackTable *tt = hashFindVal(trackHash, td->name);
 struct sqlResult *sr = hRangeQuery(conn, table, segment->seq, segment->start, segment->end, NULL, &rowOffset);
 // FIXME: should use trackDb to determine type, as field names are
 // not always unique.
 if (sameString(td->startField, "tStart") && (sqlFieldColumn(sr, "qStart") >= 0))
     {
     dasOutPslSegment(sr, rowOffset, td, tt);
     }
 else if (sameString(td->startField, "txStart"))
     {
     dasOutGpSegment(sr, rowOffset, td, tt);
     }
 else if (sameString(td->startField, "chromStart"))
     {
-    dasOutBedSegment(sr, rowOffset, table, td, tt);
+    dasOutBedSegment(sr, table, td, tt);
     }
 sqlFreeResult(&sr);
 }
 
 static void writeSegmentFeatures(struct segment *segment,
                                  struct filters *filters,
                                  struct tableDef *tdList,
                                  struct hash *trackHash,
                                  struct sqlConnection *conn)
 /* write features for a segment */
 {
 /* Print segment header. */
 printf(
 "<SEGMENT id=\"%s\" start=\"%d\" stop=\"%d\" version=\"%s\" label=\"%s\">\n",
        segment->seqName, segment->start+1, segment->end, version, segment->seqName);