4ac9486a77f0ed4e87de2e946f29e203b354398b markd Thu Jun 13 13:56:46 2024 -0700 added chainToBigChain command diff --git src/hg/pslToChain/pslToChain.c src/hg/pslToChain/pslToChain.c index 2989102..375756a 100644 --- src/hg/pslToChain/pslToChain.c +++ src/hg/pslToChain/pslToChain.c @@ -1,95 +1,102 @@ /* pslToChain - Convert psl records to chain records */ /* Copyright (C) 2008 The Regents of the University of California * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "options.h" #include "psl.h" #include "chain.h" void usage() /* Explain usage and exit. */ { errAbort( "pslToChain - Convert psl records to chain records \n" "usage:\n" " pslToChain pslIn chainOut\n" "Options:\n" + " -fixStrand reverse-complement negative target strand PSLs\n" " -ignore ignore psl records with negative target strand rather than exiting\n" ); } +boolean fixStrand; boolean ignoreError; static struct optionSpec options[] = { + {"fixStrand", OPTION_BOOLEAN}, {"ignore", OPTION_BOOLEAN}, {NULL, 0}, }; void pslToChain(char *pslIn, char *chainOut) /* pslToChain - Extract multiple psl records. */ { struct lineFile *lf = pslFileOpen(pslIn); int chainId = 1; int ii; FILE *f = mustOpen(chainOut, "w"); struct psl *psl; struct chain chain; while ((psl = pslNext(lf) ) != NULL) { if (psl->strand[1] == '-') { - if (ignoreError) + if (fixStrand) + pslRc(psl); + else if (ignoreError) continue; + else errAbort("PSL record on line %d has '-' for target strand which is not allowed.", lf->lineIx); } chain.score = pslScore(psl); chain.id = chainId++; chain.tName = psl->tName; chain.tSize = psl->tSize; chain.tStart = psl->tStart; chain.tEnd = psl->tEnd; chain.qName = psl->qName; chain.qSize = psl->qSize; chain.qStrand = psl->strand[0]; if (psl->strand[0] == '-') { chain.qEnd = psl->qSize - psl->qStart; chain.qStart = psl->qSize - psl->qEnd; } else { chain.qStart = psl->qStart; chain.qEnd = psl->qEnd; } chainWriteHead(&chain,f); for(ii=0; ii < psl->blockCount; ii++) { fprintf(f, "%d", psl->blockSizes[ii]); if (ii < psl->blockCount - 1) fprintf(f, "\t%d\t%d", psl->tStarts[ii+1]-(psl->tStarts[ii] + psl->blockSizes[ii]), psl->qStarts[ii+1]-(psl->qStarts[ii] + psl->blockSizes[ii])); fprintf(f,"\n"); } pslFree(&psl); } } int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, options); if (argc != 3) usage(); +fixStrand = optionExists("fixStrand"); ignoreError = optionExists("ignore"); pslToChain(argv[1], argv[2]); return 0; }