4898794edd81be5285ea6e544acbedeaeb31bf78 max Tue Nov 23 08:10:57 2021 -0800 Fixing pointers to README file for license in all source code files. refs #27614 diff --git src/hg/mouseStuff/lavToPsl/lavToPsl.c src/hg/mouseStuff/lavToPsl/lavToPsl.c index c11505c..0724785 100644 --- src/hg/mouseStuff/lavToPsl/lavToPsl.c +++ src/hg/mouseStuff/lavToPsl/lavToPsl.c @@ -1,249 +1,249 @@ /* lavToPsl - Convert blastz lav to psl format. */ /* Copyright (C) 2014 The Regents of the University of California - * See README in this or parent directory for licensing information. */ + * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "lav.h" #include "hash.h" #include "options.h" #include "psl.h" #include "bed.h" /* strand to us for target */ char* targetStrand = "+"; boolean bed = FALSE; char* lavScoreFile = NULL; void usage() /* Explain usage and exit. */ { errAbort( "lavToPsl - Convert blastz lav to psl format\n" "usage:\n" " lavToPsl in.lav out.psl\n" "options:\n" " -target-strand=c set the target strand to c (default is no strand)\n" " -bed output bed instead of psl\n" " -scoreFile=filename output lav scores to side file, such that\n" " each psl line in out.psl is matched by a score line.\n" ); } void outputBlocks(struct block *blockList, FILE *f, boolean isRc, char *qName, int qSize, char *tName, int tSize, boolean psl) /* Output block list to file. */ { int qNumInsert = 0, qBaseInsert = 0, tNumInsert = 0, tBaseInsert = 0; int matchOne, match = 0, mismatch = 0, bases; double scale; struct block *lastBlock = NULL; int blockCount = 0; int qTotalStart = BIGNUM, qTotalEnd = 0, tTotalStart = BIGNUM, tTotalEnd = 0; struct block *block; if (blockList == NULL) return; /* Count up overall statistics. */ for (block = blockList; block != NULL; block = block->next) { ++blockCount; scale = 0.01 * block->percentId; bases = block->qEnd - block->qStart; matchOne = round(scale*bases); match += matchOne; mismatch += bases - matchOne; if (lastBlock != NULL) { if (block->qStart != lastBlock->qEnd) { qNumInsert += 1; qBaseInsert += block->qStart - lastBlock->qEnd; } if (block->tStart != lastBlock->tEnd) { tNumInsert += 1; tBaseInsert += block->tStart - lastBlock->tEnd; } qTotalEnd = block->qEnd; tTotalEnd = block->tEnd; } else { qTotalStart = block->qStart; qTotalEnd = block->qEnd; tTotalStart = block->tStart; tTotalEnd = block->tEnd; } lastBlock = block; } int i; struct psl *pslRecord; AllocVar(pslRecord); pslRecord->match = match; pslRecord->misMatch = mismatch; pslRecord->repMatch = 0; pslRecord->nCount = 0; pslRecord->qNumInsert = qNumInsert; pslRecord->qBaseInsert = qBaseInsert; pslRecord->tNumInsert = tNumInsert; pslRecord->tBaseInsert = tBaseInsert; pslRecord->strand[0] = isRc ? '-' : '+'; pslRecord->strand[1] = targetStrand[0]; pslRecord->strand[2] = 0; pslRecord->qName = cloneString(qName); pslRecord->qSize = qSize; pslRecord->qStart = isRc ? (qSize - qTotalEnd) : qTotalStart; pslRecord->qEnd = isRc ? (qSize - qTotalStart) : qTotalEnd; pslRecord->tName = cloneString(tName); pslRecord->tSize = tSize; pslRecord->tStart = tTotalStart; pslRecord->tEnd = tTotalEnd; pslRecord->blockCount = blockCount; AllocArray(pslRecord->blockSizes, blockCount); AllocArray(pslRecord->qStarts, blockCount); AllocArray(pslRecord->tStarts, blockCount); for (block = blockList, i = 0; block != NULL; i++, block = block->next) pslRecord->blockSizes[i] = block->tEnd - block->tStart; for (block = blockList, i = 0; block != NULL; i++, block = block->next) pslRecord->qStarts[i] = block->qStart; for (block = blockList, i = 0; block != NULL; i++, block = block->next) pslRecord->tStarts[i] = block->tStart; if (psl) { pslTabOut(pslRecord, f); } else /* Output bed line. */ { struct bed *bed = bedFromPsl(pslRecord); bedTabOutN(bed, 12, f); bedFree(&bed); } pslFree(&pslRecord); } struct block *parseA(struct lineFile *lf, FILE* ff) /* Parse an alignment stanza into a block list. */ { struct block *block = NULL, *blockList = NULL; char *line, *words[6]; int score = 0; int wordCount,lavScore; while (lineFileNext(lf, &line, NULL)) { if (line[0] == '#') continue; if (line[0] == '}') break; wordCount = chopLine(line, words); if (wordCount == 0) continue; if (words[0][0] == 's') { lineFileExpectWords(lf, 2, wordCount) ; score = lineFileNeedNum(lf, words, 1) - 1 ; } if (words[0][0] == 'l') { AllocVar(block); lineFileExpectWords(lf, 6, wordCount); block->score = score; block->tStart = lineFileNeedNum(lf, words, 1) - 1; block->tEnd = lineFileNeedNum(lf, words, 3); block->qStart = lineFileNeedNum(lf, words, 2) - 1; block->qEnd = lineFileNeedNum(lf, words, 4); if (block->qEnd - block->qStart != block->tEnd - block->tStart) errAbort("Block size mismatch line %d of %s", lf->lineIx, lf->fileName); block->percentId = lineFileNeedNum(lf, words, 5); if ((block->qEnd == block->qStart) && (block->tEnd == block->tStart)) { verbose(2, "# length zero block at line %d: t %d-%d q %d-%d\n", lf->lineIx, block->tEnd,block->tStart,block->qEnd,block->qStart); freeMem(block); // ignore zero length records } else slAddHead(&blockList, block); } if ((ff!=NULL) && (words[0][0] == 's')) { lavScore = lineFileNeedNum(lf, words, 1); fprintf(ff,"%d\n", lavScore); } } slReverse(&blockList); blockList = removeFrayedEnds(blockList); return blockList; } void parseIntoPsl(char *lavFile, FILE *f, FILE* ff) /* Parse a blastz lav file and put it into something .psl like. */ { struct lineFile *lf = lineFileOpen(lavFile, TRUE); char *line; struct block *blockList = NULL; boolean isRc = FALSE; char *tName = NULL, *qName = NULL; char *matrix = NULL, *command = NULL; int qSize = 0, tSize = 0; /* Check header. */ if (!lineFileNext(lf, &line, NULL)) errAbort("%s is empty", lf->fileName); if (!startsWith("#:lav", line)) errAbort("%s is not a lav file\n", lf->fileName); while (lineFileNext(lf, &line, NULL)) { if (startsWith("s {", line)) { parseS(lf, &tSize, &qSize); } else if (startsWith("h {", line)) { parseH(lf, &tName, &qName, &isRc); } else if (startsWith("d {", line)) { parseD(lf, &matrix, &command, f); } else if (startsWith("a {", line)) { blockList = parseA(lf,ff); bed = optionExists("bed"); outputBlocks(blockList, f, isRc, qName, qSize, tName, tSize, !bed); slFreeList(&blockList); } } lineFileClose(&lf); } void lavToPsl(char *lavIn, char *pslOut) /* lavToPsl - Convert blastz lav to psl format. */ { FILE *f = mustOpen(pslOut, "w"); FILE *ff = NULL; if (lavScoreFile!=NULL) ff = mustOpen(lavScoreFile, "w"); parseIntoPsl(lavIn, f, ff); carefulClose(&f); if (lavScoreFile!=NULL) carefulClose(&ff); } int main(int argc, char *argv[]) /* Process command line. */ { optionHash(&argc, argv); if (argc != 3) usage(); targetStrand = optionVal("target-strand", ""); lavScoreFile = optionVal("scoreFile",lavScoreFile); lavToPsl(argv[1], argv[2]); return 0; }