X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=makecontigscommand.h;h=67e86bc4ad124a55da7271ca7685cbea3f3946a5;hp=1ea38358c7ec4c56e2d1adb926f7767301daef9d;hb=fefd5ee1517abd3bc38b469cb2dffc85a1571c7e;hpb=aca78ed4a47dff8672ea8fd93cef0dfbaf0f7495 diff --git a/makecontigscommand.h b/makecontigscommand.h index 1ea3835..67e86bc 100644 --- a/makecontigscommand.h +++ b/makecontigscommand.h @@ -18,6 +18,7 @@ #include "blastalign.hpp" #include "noalign.hpp" #include "trimoligos.h" +#include "oligos.h" struct fastqRead { vector scores; @@ -62,18 +63,12 @@ public: void help() { m->mothurOut(getHelpString()); } private: - bool abort, allFiles, trimOverlap, createFileGroup, createOligosGroup, makeCount, noneOk; - string outputDir, ffastqfile, rfastqfile, align, oligosfile, rfastafile, ffastafile, rqualfile, fqualfile, findexfile, rindexfile, file, format; + bool abort, allFiles, trimOverlap, createFileGroup, createOligosGroup, makeCount, noneOk, reorient; + string outputDir, ffastqfile, rfastqfile, align, oligosfile, rfastafile, ffastafile, rqualfile, fqualfile, findexfile, rindexfile, file, format, inputDir; float match, misMatch, gapOpen, gapExtend; - int processors, longestBase, insert, tdiffs, bdiffs, pdiffs, ldiffs, sdiffs, deltaq; + int processors, longestBase, insert, tdiffs, bdiffs, pdiffs, ldiffs, sdiffs, deltaq, numBarcodes, numFPrimers, numLinkers, numSpacers, numRPrimers; vector outputNames; - - map barcodes; - map primers; - vector linker; - vector spacer; - vector primerNameVector; - vector barcodeNameVector; + Oligos* oligos; vector convertTable; map groupCounts; @@ -89,8 +84,7 @@ private: //bool checkReads(fastqRead&, fastqRead&, string, string); int createProcesses(vector< vector >, string, string, string, vector >, int); int driver(vector, string, string, string, vector >, int, string); - bool getOligos(vector >&, string); - string reverseOligo(string); + bool getOligos(vector >&, string, map&); vector getReads(bool ignoref, bool ignorer, fastqRead forward, fastqRead reverse, map& uniques, bool); vector mergeReads(vector frReads, vector friReads, map& pairUniques); }; @@ -105,22 +99,19 @@ struct contigsData { string outputFasta; string outputScrapFasta; string outputMisMatches; - string align, group; + string align, group, oligosfile; vector files; vector > fastaFileNames; MothurOut* m; float match, misMatch, gapOpen, gapExtend; int count, insert, threadID, pdiffs, bdiffs, tdiffs, deltaq; - bool allFiles, createOligosGroup, createFileGroup, done, trimOverlap; + bool allFiles, createOligosGroup, createFileGroup, done, trimOverlap, reorient; map groupCounts; map groupMap; - vector primerNameVector; - vector barcodeNameVector; - map barcodes; - map primers; + contigsData(){} - contigsData(string g, vector f, string of, string osf, string om, string al, MothurOut* mout, float ma, float misMa, float gapO, float gapE, int thr, int delt, map br, map pr, vector > ffn, vectorbnv, vector pnv, int pdf, int bdf, int tdf, bool cg, bool cfg, bool all, bool to, int tid) { + contigsData(string g, vector f, string of, string osf, string om, string al, MothurOut* mout, float ma, float misMa, float gapO, float gapE, int thr, int delt, vector > ffn, string olig, bool ro, int pdf, int bdf, int tdf, bool cg, bool cfg, bool all, bool to, int tid) { files = f; outputFasta = of; outputMisMatches = om; @@ -135,10 +126,7 @@ struct contigsData { count = 0; outputScrapFasta = osf; fastaFileNames = ffn; - barcodes = br; - primers = pr; - barcodeNameVector = bnv; - primerNameVector = pnv; + oligosfile = olig; pdiffs = pdf; bdiffs = bdf; tdiffs = tdf; @@ -148,6 +136,7 @@ struct contigsData { createFileGroup = cfg; threadID = tid; deltaq = delt; + reorient = ro; done=false; } }; @@ -204,7 +193,17 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ outMisMatch << "Name\tLength\tOverlap_Length\tOverlap_Start\tOverlap_End\tMisMatches\tNum_Ns\n"; - TrimOligos trimOligos(pDataArray->pdiffs, pDataArray->bdiffs, 0, 0, pDataArray->primers, pDataArray->barcodes); + Oligos oligos; + if (pDataArray->oligosfile != "") { oligos.read(pDataArray->oligosfile); } + int numFPrimers = oligos.getPairedPrimers().size(); + int numBarcodes = oligos.getPairedBarcodes().size(); + + + TrimOligos trimOligos(pDataArray->pdiffs, pDataArray->bdiffs, 0, 0, oligos.getPairedPrimers(), oligos.getPairedBarcodes()); + TrimOligos* rtrimOligos = NULL; + if (pDataArray->reorient) { + rtrimOligos = new TrimOligos(pDataArray->pdiffs, pDataArray->bdiffs, 0, 0, oligos.getReorientedPairedPrimers(), oligos.getReorientedPairedBarcodes()); numBarcodes = oligos.getReorientedPairedBarcodes().size(); + } while ((!inFFasta.eof()) && (!inRFasta.eof())) { @@ -236,8 +235,15 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ int barcodeIndex = 0; int primerIndex = 0; + Sequence savedFSeq(fSeq.getName(), fSeq.getAligned()); Sequence savedRSeq(rSeq.getName(), rSeq.getAligned()); + Sequence savedFindex(findexBarcode.getName(), findexBarcode.getAligned()); Sequence savedRIndex(rindexBarcode.getName(), rindexBarcode.getAligned()); + QualityScores* savedFQual = NULL; QualityScores* savedRQual = NULL; + if (thisfqualfile != "") { + savedFQual = new QualityScores(fQual->getName(), fQual->getQualityScores()); + savedRQual = new QualityScores(rQual->getName(), rQual->getQualityScores()); + } - if(pDataArray->barcodes.size() != 0){ + if(numBarcodes != 0){ if (thisfqualfile != "") { if ((thisfindexfile != "") || (thisrindexfile != "")) { success = trimOligos.stripBarcode(findexBarcode, rindexBarcode, *fQual, *rQual, barcodeIndex); @@ -251,7 +257,7 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ else{ currentSeqsDiffs += success; } } - if(pDataArray->primers.size() != 0){ + if(numFPrimers != 0){ if (thisfqualfile != "") { success = trimOligos.stripForward(fSeq, rSeq, *fQual, *rQual, primerIndex); }else { @@ -263,6 +269,57 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ if (currentSeqsDiffs > pDataArray->tdiffs) { trashCode += 't'; } + if (pDataArray->reorient && (trashCode != "")) { //if you failed and want to check the reverse + int thisSuccess = 0; + string thisTrashCode = ""; + int thisCurrentSeqsDiffs = 0; + + int thisBarcodeIndex = 0; + int thisPrimerIndex = 0; + + if(numBarcodes != 0){ + if (thisfqualfile != "") { + if ((thisfindexfile != "") || (thisrindexfile != "")) { + thisSuccess = rtrimOligos->stripBarcode(savedFindex, savedRIndex, *savedFQual, *savedRQual, thisBarcodeIndex); + }else { + thisSuccess = rtrimOligos->stripBarcode(savedFSeq, savedRSeq, *savedFQual, *savedRQual, thisBarcodeIndex); + } + }else { + thisSuccess = rtrimOligos->stripBarcode(savedFSeq, savedRSeq, thisBarcodeIndex); + } + if(thisSuccess > pDataArray->bdiffs) { thisTrashCode += 'b'; } + else{ thisCurrentSeqsDiffs += thisSuccess; } + } + + if(numFPrimers != 0){ + if (thisfqualfile != "") { + thisSuccess = rtrimOligos->stripForward(savedFSeq, savedRSeq, *savedFQual, *savedRQual, thisPrimerIndex); + }else { + thisSuccess = rtrimOligos->stripForward(savedFSeq, savedRSeq, thisPrimerIndex); + } + if(thisSuccess > pDataArray->pdiffs) { thisTrashCode += 'f'; } + else{ thisCurrentSeqsDiffs += thisSuccess; } + } + + if (thisCurrentSeqsDiffs > pDataArray->tdiffs) { thisTrashCode += 't'; } + + if (thisTrashCode == "") { + trashCode = thisTrashCode; + success = thisSuccess; + currentSeqsDiffs = thisCurrentSeqsDiffs; + barcodeIndex = thisBarcodeIndex; + primerIndex = thisPrimerIndex; + savedFSeq.reverseComplement(); + savedRSeq.reverseComplement(); + fSeq.setAligned(savedFSeq.getAligned()); + rSeq.setAligned(savedRSeq.getAligned()); + if(thisfqualfile != ""){ + savedFQual->flipQScores(); savedRQual->flipQScores(); + fQual->setScores(savedFQual->getScores()); rQual->setScores(savedRQual->getScores()); + } + }else { trashCode += "(" + thisTrashCode + ")"; } + } + //flip the reverse reads rSeq.reverseComplement(); if (thisfqualfile != "") { rQual->flipQScores(); } @@ -284,7 +341,7 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ if (thisfqualfile != "") { scores1 = fQual->getQualityScores(); scores2 = rQual->getQualityScores(); - delete fQual; delete rQual; + delete fQual; delete rQual; delete savedFQual; delete savedRQual; } int overlapStart = fSeq.getStartPos(); @@ -344,29 +401,17 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ if(trashCode.length() == 0){ bool ignore = false; if (pDataArray->createOligosGroup) { - if(pDataArray->barcodes.size() != 0){ - string thisGroup = pDataArray->barcodeNameVector[barcodeIndex]; - if (pDataArray->primers.size() != 0) { - if (pDataArray->primerNameVector[primerIndex] != "") { - if(thisGroup != "") { - thisGroup += "." + pDataArray->primerNameVector[primerIndex]; - }else { - thisGroup = pDataArray->primerNameVector[primerIndex]; - } - } - } - - if (pDataArray->m->debug) { pDataArray->m->mothurOut(", group= " + thisGroup + "\n"); } - - int pos = thisGroup.find("ignore"); - if (pos == string::npos) { - pDataArray->groupMap[fSeq.getName()] = thisGroup; + string thisGroup = oligos.getGroupName(barcodeIndex, primerIndex); + if (pDataArray->m->debug) { pDataArray->m->mothurOut(", group= " + thisGroup + "\n"); } + + int pos = thisGroup.find("ignore"); + if (pos == string::npos) { + pDataArray->groupMap[fSeq.getName()] = thisGroup; - map::iterator it = pDataArray->groupCounts.find(thisGroup); - if (it == pDataArray->groupCounts.end()) { pDataArray->groupCounts[thisGroup] = 1; } - else { pDataArray->groupCounts[it->first] ++; } - }else { ignore = true; } - } + map::iterator it = pDataArray->groupCounts.find(thisGroup); + if (it == pDataArray->groupCounts.end()) { pDataArray->groupCounts[thisGroup] = 1; } + else { pDataArray->groupCounts[it->first] ++; } + }else { ignore = true; } }else if (pDataArray->createFileGroup) { int pos = pDataArray->group.find("ignore"); if (pos == string::npos) { @@ -414,6 +459,7 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ inRQual.close(); } delete alignment; + if (pDataArray->reorient) { delete rtrimOligos; } pDataArray->done = true; if (pDataArray->m->control_pressed) { pDataArray->m->mothurRemove(pDataArray->outputFasta); pDataArray->m->mothurRemove(pDataArray->outputMisMatches); pDataArray->m->mothurRemove(pDataArray->outputScrapFasta); }