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);