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/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 1d36eb8..88ea935 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -6158,59 +6158,41 @@
     {
     tg = trackFromTrackDb(tdb);
     if (ct->dbTrack)
         tg->loadItems = wigLoadItems;
     else
         tg->loadItems = ctWigLoadItems;
     tg->customPt = ct;
     tg->nextItemButtonable = FALSE;
     }
 else if (sameString(type, "bigWig"))
     {
     tg = trackFromTrackDb(tdb);
     tg->bbiFile = ct->bbiFile;
     tg->nextItemButtonable = FALSE;
     }
-else if (sameString(type, "bigBed")|| sameString(type, "bigGenePred") ||
-        sameString(type, "bigNarrowPeak") || sameString(type, "bigPsl") ||
-        sameString(type, "bigMaf")|| sameString(type, "bigChain") ||
-        sameString(type, "bigLolly") || 
-        sameString(type, "bigBarChart") || sameString(type, "bigInteract"))
+else if (startsWith("big", type))
     {
     struct bbiFile *bbi = ct->bbiFile;
 
     /* Find field counts, and from that revise the tdb->type to be more complete. */
     char extra = (bbi->fieldCount > bbi->definedFieldCount ? '+' : '.');
     char typeBuf[64];
-    if (sameString(type, "bigGenePred"))
-	safef(typeBuf, sizeof(typeBuf), "bigGenePred");
-    else if (sameString(type, "bigNarrowPeak"))
-	safef(typeBuf, sizeof(typeBuf), "bigNarrowPeak");
-    else if (sameString(type, "bigChain"))
-	safef(typeBuf, sizeof(typeBuf), "bigChain");
-    else if (sameString(type, "bigMaf"))
-	safef(typeBuf, sizeof(typeBuf), "bigMaf");
-    else if (sameString(type, "bigPsl"))
-	safef(typeBuf, sizeof(typeBuf), "bigPsl");
-    else if (sameString(type, "bigBarChart"))
-	safef(typeBuf, sizeof(typeBuf), "bigBarChart");
-    else if (sameString(type, "bigLolly"))
-	safef(typeBuf, sizeof(typeBuf), "bigLolly");
-    else if (sameString(type, "bigInteract"))
-	safef(typeBuf, sizeof(typeBuf), "bigInteract");
-    else
+    if (startsWithWord("bigBed", type))
 	safef(typeBuf, sizeof(typeBuf), "bigBed %d %c", bbi->definedFieldCount, extra);
+    else
+	safecpy(typeBuf, sizeof(typeBuf), type);
     tdb->type = cloneString(typeBuf);
 
     /* Finish wrapping track around tdb. */
     tg = trackFromTrackDb(tdb);
     tg->bbiFile = bbi;
     tg->nextItemButtonable = TRUE;
     }
 else if (sameString(type, "bedGraph"))
     {
     tg = trackFromTrackDb(tdb);
     tg->canPack = FALSE;
     tg->customPt = ct;
     ct->wigFile = ctFileName;
     tg->mapItemName = ctMapItemName;
     tg->nextItemButtonable = FALSE;
@@ -7238,37 +7220,32 @@
 lmCleanup(&lm);
 }
 
 
 struct paraFetchData
     {
     struct paraFetchData *next;
     struct track *track;
     boolean done;
     };
 
 static boolean isTrackForParallelLoad(struct track *track)
 /* Is this a track that should be loaded in parallel ? */
 {
 char *bdu = trackDbSetting(track->tdb, "bigDataUrl");
-return (startsWithWord("bigWig"  , track->tdb->type)
+return (startsWith("big", track->tdb->type)
      || startsWithWord("mathWig"  , track->tdb->type)
-     || startsWithWord("bigBed"  , track->tdb->type)
-     || startsWithWord("bigPsl"  , track->tdb->type)
-     || startsWithWord("bigNarrowPeak"  , track->tdb->type)
-     || startsWithWord("bigGenePred"  , track->tdb->type)
-     || startsWithWord("bigChain"  , track->tdb->type)
      || startsWithWord("bam"     , track->tdb->type)
      || startsWithWord("halSnake", track->tdb->type)
      || startsWithWord("bigLolly", track->tdb->type)
      || startsWithWord("vcfTabix", track->tdb->type))
      // XX code-review: shouldn't we error abort if the URL is not valid?
      && (bdu && isValidBigDataUrl(bdu, FALSE))
      && !(containsStringNoCase(bdu, "dl.dropboxusercontent.com"))
      && (track->subtracks == NULL);
 }
 
 static void findLeavesForParallelLoad(struct track *trackList, struct paraFetchData **ppfdList)
 /* Find leaves of track tree that are remote network resources for parallel-fetch loading */
 {
 struct track *track;
 if (!trackList)