54406b80d5d435970989acff7b22dd6146c6b411 braney Sat Jan 22 15:24:59 2022 -0800 adding chrom alias support to big files diff --git src/hg/hgc/wiggleClick.c src/hg/hgc/wiggleClick.c index 1a39081..9230376 100644 --- src/hg/hgc/wiggleClick.c +++ src/hg/hgc/wiggleClick.c @@ -1,326 +1,327 @@ /* Handle details pages for wiggle tracks. */ /* Copyright (C) 2014 The Regents of the University of California * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "wiggle.h" #include "cart.h" #include "hgc.h" #include "hCommon.h" #include "hgColors.h" #include "obscure.h" #include "hmmstats.h" #include "customTrack.h" #include "bigWig.h" #include "hdb.h" +#include "chromAlias.h" void genericWiggleClick(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start) /* Display details for Wiggle data tracks. * conn may be NULL for custom tracks when from file */ { char *chrom = cartString(cart, "c"); char table[HDB_MAX_TABLE_STRING]; unsigned span = 0; struct wiggleDataStream *wds = wiggleDataStreamNew(); unsigned long long valuesMatched = 0; struct histoResult *histoGramResult; float *valuesArray = NULL; size_t valueCount = 0; struct customTrack *ct = NULL; boolean isCustom = FALSE; int operations = wigFetchStats; /* default operation */ if (startsWith("ct_", tdb->table)) { ct = lookupCt(tdb->table); if (!ct) { warn("
wiggleClick: can not find custom wiggle track '%s'
", tdb->table); return; } if (! ct->wiggle) { warn("wiggleClick: called to do stats on a custom track that isn't wiggle data ?
"); return; } if (ct->dbTrack) { safef(table,ArraySize(table), "%s", ct->dbTableName); span = minSpan(conn, table, chrom, winStart, winEnd, cart, tdb); } else { safef(table,ArraySize(table), "%s", ct->wigFile); span = 0; /* cause all spans to be examined */ } isCustom = TRUE; } else { if (!hFindSplitTable(database, seqName, tdb->table, table, sizeof table, NULL)) errAbort("track %s not found", tdb->table); /*span = spanInUse(conn, table, chrom, winStart, winEnd, cart);*/ span = minSpan(conn, table, chrom, winStart, winEnd, cart, tdb); } /* if for some reason we don't have a chrom and win positions, this * should be run in a loop that does one chrom at a time. In the * case of hgc, there seems to be a chrom and a position. */ wds->setSpanConstraint(wds, span); wds->setChromConstraint(wds, chrom); wds->setPositionConstraint(wds, winStart, winEnd); /* If our window is less than some number of points, we can do * the histogram too. */ #define MAX_WINDOW_ALLOW_STATS 100000001 #define MAX_WINDOW_ALLOW_STRING "100,000,000" if ((winEnd - winStart) < MAX_WINDOW_ALLOW_STATS) operations |= wigFetchAscii; /* We want to also fetch the actual data values so we can run a * histogram function on them. You can't fetch the data in the * form of the data array since the span information is then lost. * We have to do the ascii data list format, and prepare that to * send to the histogram function. */ if (isCustom) { if (ct->dbTrack) valuesMatched = wds->getData(wds, CUSTOM_TRASH, table, operations); else valuesMatched = wds->getData(wds, (char *)NULL, table, operations); } else valuesMatched = wds->getData(wds, database, table, operations); statsPreamble(wds, chrom, winStart, winEnd, span, valuesMatched, NULL); /* output statistics table * (+sort, +html output, +with header, +close table) */ wds->statsOut(wds, database, "stdout", TRUE, TRUE, TRUE, FALSE); if ((winEnd - winStart) < MAX_WINDOW_ALLOW_STATS) { char *words[16]; int wordCount = 0; char *dupe = cloneString(tdb->type); double minY, maxY, tDbMinY, tDbMaxY; float hMin, hMax, hRange; wordCount = chopLine(dupe, words); wigFetchMinMaxY(tdb, &minY, &maxY, &tDbMinY, &tDbMaxY, wordCount, words); hMin = min(minY,tDbMinY); hMax = max(maxY,tDbMaxY); hRange = hMax - hMin; /* convert the ascii data listings to one giant float array */ valuesArray = wds->asciiToDataArray(wds, valuesMatched, &valueCount); /* let's see if we really want to use the range from the track type * line, or the actual range in this data. If there is a good * actual range in the data, use that instead */ if (hRange > 0.0) { if (wds->stats->dataRange != 0) hRange = 0.0; } if (valuesMatched < 25) { struct wigAsciiData *asciiData = NULL; unsigned long long valuesDone = 0; double worstCaseResolution = 0.0; struct dyString *tableData = dyStringNew(256); for (asciiData = wds->ascii; asciiData && (valuesDone < valuesMatched); asciiData = asciiData->next) { if (asciiData->count) { double resolution = asciiData->dataRange / (MAX_WIG_VALUE+1); if (resolution > worstCaseResolution) worstCaseResolution = resolution; struct asciiDatum *data = asciiData->data; unsigned i = 0; for (;(i < asciiData->count)&&(valuesDone < valuesMatched); ++i) { dyStringPrintf(tableData, "%llu data values in this window view | |||
---|---|---|---|
chromosome | chromStart | chromEnd | dataValue |
compressed data has resolution of + or - %.3f |
(viewing windows of fewer than %s bases will also" " display a histogram)
\n", MAX_WINDOW_ALLOW_STRING); } wiggleDataStreamFree(&wds); } void bbiIntervalStatsReport(struct bbiInterval *bbList, char *table, char *chrom, bits32 start, bits32 end) /* Write out little statistical report in HTML */ { /* Loop through list and calculate some stats. */ bits64 iCount = 0; bits64 iTotalSize = 0; bits32 biggestSize = 0, smallestSize = BIGNUM; struct bbiInterval *bb; double sum = 0.0, sumSquares = 0.0; double minVal = bbList->val, maxVal = bbList->val; for (bb = bbList; bb != NULL; bb = bb->next) { iCount += 1; bits32 size = bb->end - bb->start; iTotalSize += size; if (biggestSize < size) biggestSize = size; if (smallestSize > size) smallestSize = size; double val = bb->val; sum += val; sumSquares += val * val; if (minVal > val) minVal = val; if (maxVal < val) maxVal = val; } char num1Buf[64], num2Buf[64]; /* big enough for 2^64 (and then some) */ sprintLongWithCommas(num1Buf, iCount); sprintLongWithCommas(num2Buf, iTotalSize); bits32 winSize = end-start; printf("Statistics on: %s items covering %s bases (%4.2f%% coverage)Zoom in to a view less than %s bases to see data summary.
",num1Buf); } else { printf("No data overlapping current position.
"); } lmCleanup(&lm); bbiFileClose(&bbi); } void genericBigWigClick(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start) /* Display details for BigWig built in tracks. */ { char *fileName = trackDbSetting(tdb, "bigDataUrl"); if (fileName == NULL) { char query[256]; sqlSafef(query, sizeof(query), "select fileName from %s", tdb->table); fileName = sqlQuickString(conn, query); if (fileName == NULL) errAbort("Missing fileName in %s table", tdb->table); } bigWigClick(tdb, hReplaceGbdb(fileName)); // tiny memory leak } void bigWigCustomClick(struct trackDb *tdb) /* Display details for BigWig custom tracks. */ { bigWigClick(tdb, trackDbSetting(tdb, "bigDataUrl")); }