6da76acba7f617920cc7eaa161b7d987362be78f
markd
  Wed Feb 14 11:29:46 2018 -0800
hide patent GenBank mRNA sequences by default based on accession prefix

diff --git src/hg/hgTracks/pslTrack.c src/hg/hgTracks/pslTrack.c
index 91c11c6..43892cf 100644
--- src/hg/hgTracks/pslTrack.c
+++ src/hg/hgTracks/pslTrack.c
@@ -221,31 +221,51 @@
        {
        newList = slCat(newList, oldList);
        }
    }
 *pLfList = newList;
 tg->limitedVisSet = FALSE;	/* Need to recalculate this after filtering. */
 
 /* Free up hashes, etc. */
 for (fil = mud->filterList; fil != NULL; fil = fil->next)
     {
     hashFree(&fil->hash);
     }
 hFreeConn(&conn);
 }
 
+static boolean shouldFilterGenbankPatentSequences(struct track *tg)
+/* is this a genbank track with patent sequence filtering enabled */
+{
+char name[256];
+safef(name, sizeof(name), "%s.%s", tg->tdb->track, SHOW_PATENT_SEQUENCES_SUFFIX);
+return (sameString(tg->tdb->track, "mrna")|| sameString(tg->tdb->track, "intronEst"))
+        && !cartUsualBoolean(cart, name, FALSE);
+}
 
+static void filterGenbankPatentSequences(struct track *tg, struct linkedFeatures **pLfList)
+/* remove genbank patent sequences  */
+{
+struct linkedFeatures *lf, *newLf = NULL;
+while ((lf = slPopHead(pLfList)) != NULL)
+    {
+    if (!isGenbenkPatentAccession(lf->name))
+        slAddHead(&newLf, lf);
+    }
+slReverse(&newLf);
+*pLfList = newLf;
+}
 
 struct simpleFeature *sfFromPslX(struct psl *psl,int grayIx, int sizeMul)
 {
         struct simpleFeature *sf = NULL, *sfList = NULL;
         unsigned *starts = psl->tStarts;
         unsigned *qStarts = psl->qStarts;
         unsigned *sizes = psl->blockSizes;
         int i, blockCount = psl->blockCount;
         boolean rcTarget = (psl->strand[1] == '-');
 
         for (i=0; i<blockCount; ++i)
                 {
                 AllocVar(sf);
                 sf->start = sf->end = starts[i];
                 sf->end += sizes[i]*sizeMul;
@@ -466,30 +486,32 @@
 	{
     	if (isSelected(lf->name))
 	    slAddHead(&lfList, lf);
 	}
 
     else
 #endif /* GBROWSE */
     	slAddHead(&lfList, lf);
     // Don't free psl - may be used by baseColor code (and freeing is slow)
     }
 slReverse(&lfList);
 if (tg->visibility != tvDense)
     slSort(&lfList, linkedFeaturesCmpStart);
 if (tg->extraUiData)
     filterMrna(tg, &lfList);
+if (shouldFilterGenbankPatentSequences(tg))
+    filterGenbankPatentSequences(tg, &lfList);
 tg->items = lfList;
 sqlFreeResult(&sr);
 }
 
 static void lfFromPslsInRange(struct track *tg, int start, int end,
 	char *chromName, boolean isXeno, boolean nameGetsPos, int sizeMul)
 /* Return linked features from range of table. */
 {
 struct sqlConnection *conn = hAllocConn(database);
 connectedLfFromPslsInRange(conn, tg, start, end, chromName,
 	isXeno, nameGetsPos, sizeMul);
 hFreeConn(&conn);
 }
 
 static void loadXenoPslWithPos(struct track *tg)