#include "alignment.hpp"
#include "needlemanoverlap.hpp"
#include "counttable.h"
+#include "oligos.h"
class PcrSeqsCommand : public Command {
public:
};
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);
};
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;
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++;
///////////////////////////////////////////////////////////////
//process primers
- if (pDataArray->primers.size() != 0) {
+ if (numFPrimers != 0) {
int primerStart = 0; int primerEnd = 0;
bool good = trim.findForward(currSeq, primerStart, primerEnd);
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";
}
}
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";
}
}
}
//process reverse primers
- if (pDataArray->revPrimer.size() != 0) {
+ if (numRPrimers != 0) {
int primerStart = 0; int primerEnd = 0;
bool good = trim.findReverse(currSeq, primerStart, primerEnd);
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";
}
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";
}
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());
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;