fbdc691703e4bc2d98fcdb2014fe6fa19771c104
braney
  Fri Feb 10 17:05:10 2017 -0800
make building a custom track with blat results an option on the hgBlat
page.   Add some features to bigPsl click support to get the same kind
of UI that hgBlat provides.

diff --git src/lib/psl.c src/lib/psl.c
index 3be0a3f..8f295be 100644
--- src/lib/psl.c
+++ src/lib/psl.c
@@ -2045,15 +2045,75 @@
 pslCp->tBaseInsert = psl->tBaseInsert;
 int iBlk;
 for (iBlk = 0; iBlk < psl->blockCount; iBlk++)
     {
     pslCp->blockSizes[iBlk] = psl->blockSizes[iBlk];
     pslCp->qStarts[iBlk] = psl->qStarts[iBlk];
     pslCp->tStarts[iBlk] = psl->tStarts[iBlk];
     if (psl->qSequence != NULL)
         pslCp->qSequence[iBlk] = cloneString(psl->qSequence[iBlk]);
     if (psl->tSequence != NULL)
         pslCp->tSequence[iBlk] = cloneString(psl->tSequence[iBlk]);
     pslCp->blockCount++;
     }
 return pslCp;
 }
+
+int cmpChrom(char *a, char *b)
+/* Compare two chromosomes. */
+{
+return cmpStringsWithEmbeddedNumbers(a, b);
+}
+
+
+int pslCmpTargetScore(const void *va, const void *vb)
+/* Compare to sort based on target then score. */
+{
+const struct psl *a = *((struct psl **)va);
+const struct psl *b = *((struct psl **)vb);
+int diff = cmpChrom(a->tName, b->tName);
+if (diff == 0)
+    diff = pslScore(b) - pslScore(a);
+return diff;
+}
+
+int pslCmpTargetStart(const void *va, const void *vb)
+/* Compare to sort based on target start. */
+{
+const struct psl *a = *((struct psl **)va);
+const struct psl *b = *((struct psl **)vb);
+int diff = cmpChrom(a->tName, b->tName);
+if (diff == 0)
+    diff = a->tStart - b->tStart;
+return diff;
+}
+
+char *pslSortList[] = {"query,score", "query,start", "chrom,score", "chrom,start", "score"};
+
+void pslSortListByVar(struct psl **pslList, char *sort)
+/* Sort a list of psls using the method definied in the sort string. */
+{
+if (sameString(sort, "query,start"))
+    {
+    slSort(pslList, pslCmpQuery);
+    }
+else if (sameString(sort, "query,score"))
+    {
+    slSort(pslList, pslCmpQueryScore);
+    }
+else if (sameString(sort, "score"))
+    {
+    slSort(pslList, pslCmpScore);
+    }
+else if (sameString(sort, "chrom,start"))
+    {
+    slSort(pslList, pslCmpTargetStart);
+    }
+else if (sameString(sort, "chrom,score"))
+    {
+    slSort(pslList, pslCmpTargetScore);
+    }
+else
+    {
+    slSort(pslList, pslCmpQueryScore);
+    }
+}