d3752edc12da1bf08427946150f564dbdd5d2254
angie
Thu Oct 24 13:55:51 2019 -0700
bigDbSnp track handler code - initial commit. refs #23283
* dnautil: Added trimRefAltLeft to get left-justified trimming (a la VCF not HGVS).
* bigBedClick: do hReplaceGbdb up front in parseDetailsTablUrls instead of waiting until endpoint.
* trackDbCustom.c: consolidating type-handling for wig/bigWig vs. bigBed-based big*.
diff --git src/hg/hgc/bigBedClick.c src/hg/hgc/bigBedClick.c
index 9a4986cb..091bfb3 100644
--- src/hg/hgc/bigBedClick.c
+++ src/hg/hgc/bigBedClick.c
@@ -193,36 +193,34 @@
" return false;\n"
"}\n"
);
}
}
static void detailsTabPrintSpecial(char *name, char *val, struct slPair *extraFields)
/* some extra fields require special printing code, they all start with '_' */
{
if (sameWord(name, "_mismatchCounts"))
extFieldMismatchCounts(val);
else if (sameWord(name, "_crisprOfftargets"))
extFieldCrisprOfftargets(val, extraFields);
}
-static void seekAndPrintTable(char *url, off_t offset, struct slPair *extraFields)
+static void seekAndPrintTable(char *detailsUrl, off_t offset, struct slPair *extraFields)
/* seek to 0 at url, get headers, then seek to offset, read tab-sep fields and output
* (extraFields are needed for some special field handlers) */
{
-char *detailsUrl = hReplaceGbdb(replaceChars(url, "$db", database));
-
// open the URL
struct lineFile *lf = lineFileUdcMayOpen(detailsUrl, TRUE);
if (lf==NULL)
{
printf("Error: Could not open the URL referenced in detailsTabUrls, %s", detailsUrl);
return;
}
// get the headers
char *headLine = NULL;
int lineSize = 0;
lineFileNext(lf, &headLine, &lineSize);
char *headers[1024];
int headerCount = chopTabs(headLine, headers);
@@ -258,54 +256,62 @@
{
char *name = headers[i];
char *val = fields[i];
if (startsWith("_", name))
detailsTabPrintSpecial(name, val, extraFields);
else
{
printf("
%s | \n", name);
printf("%s |
\n", val);
}
}
printf("\n");
lineFileClose(&lf);
-freez(&detailsUrl);
}
-static void printAllExternalExtraFields(struct trackDb *tdb, struct slPair *extraFields)
-/* handle the "detailsTabUrls" trackDb setting:
- * For each field, print a separate html table with all field names and values
- * from the external tab-sep file */
-
+struct slPair *parseDetailsTablUrls(struct trackDb *tdb)
+/* Parse detailsTabUrls setting string into an slPair list of {offset column name, fileOrUrl} */
{
char *detailsUrlsStr = trackDbSetting(tdb, "detailsTabUrls");
if (!detailsUrlsStr)
- return;
+ return NULL;
struct slPair *detailsUrls = slPairListFromString(detailsUrlsStr, TRUE);
if (!detailsUrls)
{
printf("Problem when parsing trackDb setting detailsTabUrls
\n");
printf("Expected: a space-separated key=val list, like 'fieldName1=URL1 fieldName2=URL2'
\n");
printf("But got: '%s'
", detailsUrlsStr);
- return;
+ return NULL;
}
-
struct slPair *pair;
for (pair = detailsUrls; pair != NULL; pair = pair->next)
+ pair->val = hReplaceGbdb(replaceChars(pair->val, "$db", database));
+
+return detailsUrls;
+}
+
+static void printAllExternalExtraFields(struct trackDb *tdb, struct slPair *extraFields)
+/* handle the "detailsTabUrls" trackDb setting:
+ * For each field, print a separate html table with all field names and values
+ * from the external tab-sep file */
+
+{
+struct slPair *detailsUrls = parseDetailsTablUrls(tdb), *pair;
+for (pair = detailsUrls; pair != NULL; pair = pair->next)
{
char *fieldName = pair->name;
char *detailsUrl = pair->val;
// get extra bigBed field (=the offset) and seek to it
void *p = slPairFindVal(extraFields, fieldName);
if (p==NULL)
{
printf("Error when parsing trackDb detailsTabUrls statement:
\n");
printf("Cannot find extra bigBed field with name %s\n", fieldName);
return;
}
char *offsetStr = (char*)p;
if (offsetStr==NULL || sameWord(offsetStr, "0"))