]> git.donarmstrong.com Git - mothur.git/blobdiff - pcrseqscommand.h
added oligos class. added check orient parameter to trim.flows, sffinfo, fastq.info...
[mothur.git] / pcrseqscommand.h
index f4481ab9402f5a5362b6d864980bbc9b6e1e101f..ad69961b80fb43bad986000cabb2efae71fcfe92 100644 (file)
@@ -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<linePair> lines;
-       bool getOligos(vector<vector<string> >&, vector<vector<string> >&, vector<vector<string> >&);
-    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<string> revPrimer, outputNames;
-       map<string, int> primers;
+    vector<string> outputNames;
     
     int writeAccnos(set<string>);
     int readName(set<string>&);
     int readGroup(set<string>);
     int readTax(set<string>);
     int readCount(set<string>);
-    bool readOligos();
+    int readOligos();
     bool readEcoli();
-       int driverPcr(string, string, string, string, set<string>&, linePair, int&, int&, bool&);
+       int driverPcr(string, string, string, string, set<string>&, linePair, int&, bool&);
        int createProcesses(string, string, string, set<string>&);
     bool isAligned(string, map<int, int>&);
-    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<string, int> primers;
-    vector<string> revPrimer;
     set<string> badSeqNames;
     bool keepprimer, keepdots, fileAligned, adjustNeeded;
        
-       
        pcrData(){}
-       pcrData(string f, string gf, string bfn, string loc, MothurOut* mout, string ol, string ec, map<string, int> pr, vector<string> 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<int> lengths;
         //pdiffs, bdiffs, primers, barcodes, revPrimers
         map<string, int> faked;
-        vector< set<int> > locations; //locations[0] = beginning locations, locations[1] = ending locations
-        locations.resize(2);
-        TrimOligos trim(pDataArray->pdiffs, 0, pDataArray->primers, faked, pDataArray->revPrimer);
+        set<int> locations; //locations = beginning locations
+        
+        Oligos oligos(pDataArray->oligosfile);
+        int numFPrimers, numRPrimers;
+        map<string, int> primers;
+        map<string, int> barcodes; //not used
+        vector<string> revPrimer;
+        if (oligos.hasPairedBarcodes()) {
+            numFPrimers = oligos.getPairedPrimers().size();
+            map<int, oligosPair> primerPairs = oligos.getPairedPrimers();
+            for (map<int, oligosPair>::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<int>::iterator it = locations[0].begin();  pDataArray->pstart = *it;  }
-            if (pDataArray->revPrimer.size() != 0)  {   set<int>::reverse_iterator it2 = locations[1].rbegin();  pDataArray->pend = *it2; }
+            if (locations.size() > 1) { pDataArray->adjustNeeded = true; }
+            if (numFPrimers != 0)    {   set<int>::iterator it = locations.begin();  pDataArray->pstart = *it;  }
         }
         
         return 0;