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); + } +}