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("\n", name, chrom, start, name);
dasPrintType(td, tt);
if (td->method != NULL)
printf(" %s\n", td->method);
else
printf(" \n");
printf(" %d\n", start+1);
printf(" %d\n", end);
printf(" %s\n", score);
printf(" %c\n", dasStrand(strand[0]));
printf(" -\n");
printf(" \n", name, chrom, start);
printf(" Link to UCSC Browser\n",
chrom, start, end, database);
printf(" \n");
printf("\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(
"\n",
segment->seqName, segment->start+1, segment->end, version, segment->seqName);