struct qaSeq *qacReadNext(FILE *f, boolean isSwapped) /* Read in next record in .qac file. */ { bits32 cSize, origSize; struct qaSeq *qa; signed char *buf; char *s; s = readString(f); if (s == NULL) return NULL; AllocVar(qa); qa->name = s; mustReadOne(f, origSize); if (isSwapped) origSize = byteSwap32(origSize); mustReadOne(f, cSize); if (isSwapped) cSize = byteSwap32(cSize); qa->size = origSize; qa->qa = needLargeMem(origSize); buf = needLargeMem(cSize); mustRead(f, buf, cSize); rleUncompress(buf, cSize, qa->qa, origSize); freeMem(buf); return qa; }
void chimpSuperQuals(char *agpFile, char *qacInName, char *qacOutName) /* chimpSuperQuals - Map chimp quality scores from contig to supercontig.. */ { struct hash *qacHash = qacReadToHash(qacInName); struct scaffold *scaffold, *scaffoldList = readScaffoldsFromAgp(agpFile); FILE *f = mustOpen(qacOutName, "w"); struct qaSeq qa; struct agpFrag *frag; struct qac *qac; int bufSize = 0; UBYTE *buf = NULL; int qaMaxSize = 0; int fragSize; int count = 0; qacWriteHead(f); ZeroVar(&qa); for (scaffold = scaffoldList; scaffold != NULL; scaffold = scaffold->next) { /* Set up qa to hold uncompressed quals for whole scaffold. */ qa.name = scaffold->list->chrom; qa.size = scaffold->size; if (qaMaxSize < qa.size) { freez(&qa.qa); qa.qa = needHugeZeroedMem(qa.size); qaMaxSize = qa.size; } /* Uncompress contig quality scores and copy into scaffold's quality buffer. */ for (frag = scaffold->list; frag != NULL; frag = frag->next) { qac = hashMustFindVal(qacHash, frag->frag); if (bufSize < qac->uncSize) { freez(&buf); bufSize = qac->uncSize; buf = needMem(bufSize); } rleUncompress(qac->data, qac->compSize, buf, qac->uncSize); fragSize = frag->fragEnd - frag->fragStart; memcpy(qa.qa + frag->chromStart, buf + frag->fragStart, fragSize); } /* Compress and write it out. */ qacWriteNext(f, &qa); ++count; } carefulClose(&f); }
int RleCompressor::uncompress (const char *inPtr, int inSize, int minY, const char *&outPtr) { // // Special case - empty input buffer // if (inSize == 0) { outPtr = _outBuffer; return 0; } // // Decode the run-length encoded data // int outSize; if (0 == (outSize = rleUncompress (inSize, _maxScanLineSize, (const signed char *) inPtr, _tmpBuffer))) { throw Iex::InputExc ("Data decoding (rle) failed."); } // // Predictor. // { unsigned char *t = (unsigned char *) _tmpBuffer + 1; unsigned char *stop = (unsigned char *) _tmpBuffer + outSize; while (t < stop) { int d = int (t[-1]) + int (t[0]) - 128; t[0] = d; ++t; } } // // Reorder the pixel data. // { const char *t1 = _tmpBuffer; const char *t2 = _tmpBuffer + (outSize + 1) / 2; char *s = _outBuffer; char *stop = s + outSize; while (true) { if (s < stop) *(s++) = *(t1++); else break; if (s < stop) *(s++) = *(t2++); else break; } } outPtr = _outBuffer; return outSize; }
void axtHiQualDiffs(char *axtFile, struct hash *qacHash, FILE *f) /* Write out high quality diffs in axtFile to f. */ { char *qName = cloneString(""); UBYTE *qQuals = NULL; UBYTE *quals = NULL; struct qac *qac = NULL; struct axt *axt = NULL; struct lineFile *lf = lineFileOpen(axtFile, TRUE); int qStart, qDir, qPos, qWinStart, qWinEnd, tPos; int qWinSize = optionInt("winSize", 11); int qQualMin = optionInt("diffQualMin", 30); int qWinQualMin = optionInt("winQualMin", 25); int qWinMaxDiff = optionInt("winMaxDiff", 2); boolean qIndelOk = optionExists("indelOk"); boolean qIgnore98 = optionExists("ignore98"); boolean chimpPos = optionExists("chimpPos"); int qHalfWinSize = qWinSize/2; while ((axt = axtRead(lf)) != NULL) { char *qSym = axt->qSym, *tSym = axt->tSym; int symIx, symCount = axt->symCount; char qc,tc; toUpperN(qSym, symCount); toUpperN(tSym, symCount); if (!sameString(axt->qName, qName)) { freez(&qName); qName = cloneString(axt->qName); qac = hashMustFindVal(qacHash, qName); freez(&qQuals); qQuals = needHugeMem(qac->uncSize); rleUncompress(qac->data, qac->compSize, qQuals, qac->uncSize); } if (axt->qStrand == '+') { qStart = axt->qStart; qDir = 1; } else { qStart = qac->uncSize - axt->qStart - 1; qDir = -1; } qPos = qStart; tPos = axt->tStart; for (symIx = 0; symIx < symCount; ++symIx) { qc = qSym[symIx]; tc = tSym[symIx]; if (qc == '-') tPos += 1; else if (tc == '-') qPos += qDir; else { if (qc != tc) { qWinStart = qPos - qHalfWinSize; qWinEnd = qWinStart + qWinSize; if (qWinStart >= 0 && qWinEnd < qac->uncSize) { if (qQuals[qPos] >= qQualMin) { int i; boolean ok = TRUE; for (i = qWinStart; i<qWinEnd; ++i) if (qQuals[i] < qWinQualMin) { ok = FALSE; break; } if (ok) { int diffCount = 0; int symWinStart = symIx - qHalfWinSize; int symWinEnd = symWinStart + qWinSize; for (i=symWinStart; i < symWinEnd; ++i) { qc = qSym[i]; tc = tSym[i]; if (qc == '-' || tc == '-') { ok = FALSE; break; } if (qc != tc) ++diffCount; } if (ok && diffCount <= qWinMaxDiff && (!qIgnore98 || qQuals[qPos] != 98) ) { if (chimpPos) fprintf(f, "%s\t%d\t%d\t%c\t%c\t%s\t%d\t%d\n", axt->tName, tPos, tPos+1, tSym[symIx], qSym[symIx], axt->qName, qPos, qPos+1); else fprintf(f, "%s\t%d\t%d\t%c\t%c\n", axt->tName, tPos, tPos+1, tSym[symIx], qSym[symIx]); } } } } } qPos += qDir; tPos += 1; } } axtFree(&axt); } lineFileClose(&lf); }
void qacAgpLift(char *agpFile, char *qacInName, char *qacOutName) /* qacAgpLift - Use AGP to combine per-scaffold qac into per-chrom qac. */ { struct hash *qacHash = qacReadToHash(qacInName); struct chrom *chrom, *chromList = readChromScaffoldsFromAgp(agpFile); FILE *f = mustOpen(qacOutName, "w"); struct qaSeq qa; struct agpFrag *frag; struct qac *qac; int bufSize = 0; UBYTE *buf = NULL; int qaMaxSize = 0; int fragSize; int count = 0; qacWriteHead(f); ZeroVar(&qa); for (chrom = chromList; chrom != NULL; chrom = chrom->next) { /* Set up qa to hold uncompressed quals for whole chrom. */ qa.name = chrom->list->chrom; verbose(1, " %s size=%d\n", chrom->list->chrom, chrom->size); qa.size = chrom->size; if (qaMaxSize < qa.size) { qa.qa = needHugeZeroedMem(qa.size); qaMaxSize = qa.size; } else { zeroBytes(qa.qa, qa.size); } /* Uncompress contig quality scores and copy into chrom's quality buffer. */ for (frag = chrom->list; frag != NULL; frag = frag->next) { struct hashEl *hel; fragSize = frag->fragEnd - frag->fragStart; if ((hel = hashLookup(qacHash, frag->frag)) != NULL) { qac = (struct qac *) hel->val; if (bufSize < qac->uncSize) { freez(&buf); bufSize = qac->uncSize; buf = needMem(bufSize); } rleUncompress(qac->data, qac->compSize, buf, qac->uncSize); if (frag->strand[0] == '-') reverseBytes((char*)buf, qac->uncSize); memcpy(qa.qa + frag->chromStart, buf + frag->fragStart, fragSize); } else { /* agp frag not found in qac hash -- missing data */ if (mScore < 0) errAbort("missing data: no quality scores for %s", frag->frag); /* fill in missing data with specified score */ memset(qa.qa + frag->chromStart, mScore, fragSize); } } /* Compress and write it out. */ qacWriteNext(f, &qa); ++count; } carefulClose(&f); }