X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=pcrseqscommand.h;h=ad69961b80fb43bad986000cabb2efae71fcfe92;hp=f4481ab9402f5a5362b6d864980bbc9b6e1e101f;hb=fefd5ee1517abd3bc38b469cb2dffc85a1571c7e;hpb=1a968f34ae2d2680eaf189a197d1a21b8dfd6c03 diff --git a/pcrseqscommand.h b/pcrseqscommand.h index f4481ab..ad69961 100644 --- a/pcrseqscommand.h +++ b/pcrseqscommand.h @@ -16,6 +16,7 @@ #include "alignment.hpp" #include "needlemanoverlap.hpp" #include "counttable.h" +#include "oligos.h" class PcrSeqsCommand : public Command { public: @@ -45,25 +46,23 @@ private: }; vector lines; - bool getOligos(vector >&, vector >&, vector >&); - bool abort, keepprimer, keepdots, fileAligned; + bool abort, keepprimer, keepdots, fileAligned, pairedOligos; string fastafile, oligosfile, taxfile, groupfile, namefile, countfile, ecolifile, outputDir, nomatch; - int start, end, processors, length, pdiffs; + int start, end, processors, length, pdiffs, numFPrimers, numRPrimers; + Oligos oligos; - vector revPrimer, outputNames; - map primers; + vector outputNames; int writeAccnos(set); int readName(set&); int readGroup(set); int readTax(set); int readCount(set); - bool readOligos(); + int readOligos(); bool readEcoli(); - int driverPcr(string, string, string, string, set&, linePair, int&, int&, bool&); + int driverPcr(string, string, string, string, set&, linePair, int&, bool&); int createProcesses(string, string, string, set&); bool isAligned(string, map&); - string reverseOligo(string); int adjustDots(string, string, int, int); }; @@ -79,27 +78,22 @@ struct pcrData { unsigned long long fend; int count, start, end, length, pdiffs, pstart, pend; MothurOut* m; - map primers; - vector revPrimer; set badSeqNames; bool keepprimer, keepdots, fileAligned, adjustNeeded; - pcrData(){} - pcrData(string f, string gf, string bfn, string loc, MothurOut* mout, string ol, string ec, map pr, vector rpr, string nm, bool kp, bool kd, int st, int en, int l, int pd, unsigned long long fst, unsigned long long fen) { + pcrData(string f, string gf, string bfn, string loc, MothurOut* mout, string ol, string ec, string nm, bool kp, bool kd, int st, int en, int l, int pd, unsigned long long fst, unsigned long long fen) { filename = f; goodFasta = gf; badFasta = bfn; m = mout; oligosfile = ol; ecolifile = ec; - primers = pr; - revPrimer = rpr; nomatch = nm; keepprimer = kp; keepdots = kd; + end = en; start = st; - end = en; length = l; fstart = fst; fend = fen; @@ -142,9 +136,28 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ set lengths; //pdiffs, bdiffs, primers, barcodes, revPrimers map faked; - vector< set > locations; //locations[0] = beginning locations, locations[1] = ending locations - locations.resize(2); - TrimOligos trim(pDataArray->pdiffs, 0, pDataArray->primers, faked, pDataArray->revPrimer); + set locations; //locations = beginning locations + + Oligos oligos(pDataArray->oligosfile); + int numFPrimers, numRPrimers; + map primers; + map barcodes; //not used + vector revPrimer; + if (oligos.hasPairedBarcodes()) { + numFPrimers = oligos.getPairedPrimers().size(); + map primerPairs = oligos.getPairedPrimers(); + for (map::iterator it = primerPairs.begin(); it != primerPairs.end(); it++) { + primers[(it->second).forward] = it->first; + revPrimer.push_back((it->second).reverse); + } + }else { + numFPrimers = oligos.getPrimers().size(); + primers = oligos.getPrimers(); + revPrimer = oligos.getReversePrimers(); + } + numRPrimers = oligos.getReversePrimers().size(); + + TrimOligos trim(pDataArray->pdiffs, 0, primers, barcodes, revPrimer); for(int i = 0; i < pDataArray->fend; i++){ //end is the number of sequences to process pDataArray->count++; @@ -179,7 +192,7 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ /////////////////////////////////////////////////////////////// //process primers - if (pDataArray->primers.size() != 0) { + if (numFPrimers != 0) { int primerStart = 0; int primerEnd = 0; bool good = trim.findForward(currSeq, primerStart, primerEnd); @@ -192,7 +205,7 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ else { currSeq.setAligned(currSeq.getAligned().substr(mapAligned[primerEnd-1]+1)); if (pDataArray->fileAligned) { - thisPStart = mapAligned[primerEnd-1]+1; //locations[0].insert(mapAligned[primerEnd-1]+1); + thisPStart = mapAligned[primerEnd-1]+1; //locations.insert(mapAligned[primerEnd-1]+1); locationsString += currSeq.getName() + "\t" + toString(mapAligned[primerEnd-1]+1) + "\n"; } } @@ -202,7 +215,7 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ else { currSeq.setAligned(currSeq.getAligned().substr(mapAligned[primerStart])); if (pDataArray->fileAligned) { - thisPStart = mapAligned[primerStart]; //locations[0].insert(mapAligned[primerStart]); + thisPStart = mapAligned[primerStart]; //locations.insert(mapAligned[primerStart]); locationsString += currSeq.getName() + "\t" + toString(mapAligned[primerStart]) + "\n"; } } @@ -224,7 +237,7 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ } //process reverse primers - if (pDataArray->revPrimer.size() != 0) { + if (numRPrimers != 0) { int primerStart = 0; int primerEnd = 0; bool good = trim.findReverse(currSeq, primerStart, primerEnd); @@ -237,7 +250,7 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ else { currSeq.setAligned(currSeq.getAligned().substr(0, mapAligned[primerStart])); if (pDataArray->fileAligned) { - thisPEnd = mapAligned[primerStart]; //locations[1].insert(mapAligned[primerStart]); + thisPEnd = mapAligned[primerStart]; //locations.insert(mapAligned[primerStart]); locationsString += currSeq.getName() + "\t" + toString(mapAligned[primerStart]) + "\n"; } @@ -248,7 +261,7 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ else { currSeq.setAligned(currSeq.getAligned().substr(0, mapAligned[primerEnd-1]+1)); if (pDataArray->fileAligned) { - thisPEnd = mapAligned[primerEnd-1]+1; //locations[1].insert(mapAligned[primerEnd-1]+1); + thisPEnd = mapAligned[primerEnd-1]+1; //locations.insert(mapAligned[primerEnd-1]+1); locationsString += currSeq.getName() + "\t" + toString(mapAligned[primerEnd-1]+1) + "\n"; } @@ -303,8 +316,7 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ if(goodSeq == 1) { currSeq.printSequence(goodFile); if (locationsString != "") { locationsFile << locationsString; } - if (thisPStart != -1) { locations[0].insert(thisPStart); } - if (thisPEnd != -1) { locations[1].insert(thisPEnd); } + if (thisPStart != -1) { locations.insert(thisPStart); } } else { pDataArray->badSeqNames.insert(currSeq.getName()); @@ -327,9 +339,8 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ if (pDataArray->m->debug) { pDataArray->m->mothurOut("[DEBUG]: fileAligned = " + toString(pDataArray->fileAligned) +'\n'); } if (pDataArray->fileAligned && !pDataArray->keepdots) { //print out smallest start value and largest end value - if ((locations[0].size() > 1) || (locations[1].size() > 1)) { pDataArray->adjustNeeded = true; } - if (pDataArray->primers.size() != 0) { set::iterator it = locations[0].begin(); pDataArray->pstart = *it; } - if (pDataArray->revPrimer.size() != 0) { set::reverse_iterator it2 = locations[1].rbegin(); pDataArray->pend = *it2; } + if (locations.size() > 1) { pDataArray->adjustNeeded = true; } + if (numFPrimers != 0) { set::iterator it = locations.begin(); pDataArray->pstart = *it; } } return 0;