-#ifndef FILTERSEQSCOMMAND_H
-#define FILTERSEQSCOMMAND_H
-
-/*
- * filterseqscommand.h
- * Mothur
- *
- * Created by Thomas Ryabin on 5/4/09.
- * Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
- *
- */
-
-#include "command.hpp"
-#include "filters.h"
-#include "mpi.h"
-
-class Sequence;
-class FilterSeqsCommand : public Command {
-
-public:
- FilterSeqsCommand(string);
- ~FilterSeqsCommand() {};
- int execute();
- void help();
-
-private:
- struct linePair {
- int start;
- int numSeqs;
- linePair(long int i, int j) : start(i), numSeqs(j) {}
- };
- vector<linePair*> lines;
- vector<int> processIDS;
-
- string vertical, filter, fasta, hard, outputDir, filterFileName;
- vector<string> fastafileNames;
- int alignmentLength, processors;
- vector<int> bufferSizes;
- vector<string> outputNames;
-
- char trump;
- bool abort;
- float soft;
- int numSeqs;
-
- string createFilter();
- int filterSequences();
- int createProcessesCreateFilter(Filters&, string);
- int createProcessesRunFilter(string, string);
- int driverCreateFilter(Filters&, string, linePair*);
- int driverRunFilter(string, string, string, linePair*);
- int driverMPIRun(istringstream&, MPI_File&);
- int MPICreateFilter(Filters&, string);
- int setLines(string);
- int parseBuffer(string, vector<string>&);
-
-};
-
-#endif
+#ifndef FILTERSEQSCOMMAND_H\r
+#define FILTERSEQSCOMMAND_H\r
+\r
+/*\r
+ * filterseqscommand.h\r
+ * Mothur\r
+ *\r
+ * Created by Thomas Ryabin on 5/4/09.\r
+ * Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.\r
+ *\r
+ */\r
+\r
+#include "command.hpp"\r
+#include "filters.h"\r
+\r
+class Sequence;\r
+class FilterSeqsCommand : public Command {\r
+\r
+public:\r
+ FilterSeqsCommand(string);\r
+ FilterSeqsCommand();\r
+ ~FilterSeqsCommand() {};\r
+ \r
+ vector<string> setParameters();\r
+ string getCommandName() { return "filter.seqs"; }\r
+ string getCommandCategory() { return "Sequence Processing"; }\r
+ string getHelpString(); \r
+ string getCitation() { return "http://www.mothur.org/wiki/Filter.seqs"; }\r
+ string getDescription() { return "removes columns from alignments based on a criteria defined by the user"; }\r
+ \r
+ int execute(); \r
+ void help() { m->mothurOut(getHelpString()); } \r
+ \r
+private:\r
+ struct linePair {\r
+ unsigned long long start;\r
+ unsigned long long end;\r
+ linePair(unsigned long long i, unsigned long long j) : start(i), end(j) {}\r
+ };\r
+\r
+ vector<linePair*> lines;\r
+ vector<int> processIDS;\r
+ map<int, vector<unsigned long long> > savedPositions;\r
+\r
+ string vertical, filter, fasta, hard, outputDir, filterFileName;\r
+ vector<string> fastafileNames; \r
+ int alignmentLength, processors;\r
+ vector<int> bufferSizes;\r
+ vector<string> outputNames;\r
+\r
+ char trump;\r
+ bool abort;\r
+ float soft;\r
+ int numSeqs;\r
+ \r
+ string createFilter();\r
+ int filterSequences();\r
+ int createProcessesCreateFilter(Filters&, string);\r
+ int createProcessesRunFilter(string, string, string);\r
+ int driverRunFilter(string, string, string, linePair*);\r
+ int driverCreateFilter(Filters& F, string filename, linePair* line);\r
+ #ifdef USE_MPI\r
+ int driverMPIRun(int, int, MPI_File&, MPI_File&, vector<unsigned long long>&);\r
+ int MPICreateFilter(int, int, Filters&, MPI_File&, vector<unsigned long long>&); \r
+ #endif\r
+ \r
+};\r
+\r
+\r
+/**************************************************************************************************/\r
+//custom data structure for threads to use.\r
+// This is passed by void pointer so it can be any data type\r
+// that can be passed using a single void pointer (LPVOID).\r
+struct filterData {\r
+ Filters F;\r
+ int count, tid, alignmentLength;\r
+ unsigned long long start, end;\r
+ MothurOut* m;\r
+ string filename, vertical, hard;\r
+ char trump;\r
+ float soft;\r
+ \r
+ filterData(){}\r
+ filterData(string fn, MothurOut* mout, unsigned long long st, unsigned long long en, int aLength, char tr, string vert, float so, string ha, int t) {\r
+ filename = fn;\r
+ m = mout;\r
+ start = st;\r
+ end = en;\r
+ tid = t;\r
+ trump = tr;\r
+ alignmentLength = aLength;\r
+ vertical = vert;\r
+ soft = so;\r
+ hard = ha;\r
+ count = 0;\r
+ }\r
+};\r
+/**************************************************************************************************/\r
+//custom data structure for threads to use.\r
+// This is passed by void pointer so it can be any data type\r
+// that can be passed using a single void pointer (LPVOID).\r
+struct filterRunData {\r
+ int count, tid, alignmentLength;\r
+ unsigned long long start, end;\r
+ MothurOut* m;\r
+ string filename;\r
+ string filter, outputFilename;\r
+ \r
+ filterRunData(){}\r
+ filterRunData(string f, string fn, string ofn, MothurOut* mout, unsigned long long st, unsigned long long en, int aLength, int t) {\r
+ filter = f;\r
+ outputFilename = ofn;\r
+ filename = fn;\r
+ m = mout;\r
+ start = st;\r
+ end = en;\r
+ tid = t;\r
+ alignmentLength = aLength;\r
+ count = 0;\r
+ }\r
+};\r
+\r
+/**************************************************************************************************/\r
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)\r
+#else\r
+static DWORD WINAPI MyCreateFilterThreadFunction(LPVOID lpParam){ \r
+ filterData* pDataArray;\r
+ pDataArray = (filterData*)lpParam;\r
+ \r
+ try {\r
+\r
+ if (pDataArray->soft != 0) { pDataArray->F.setSoft(pDataArray->soft); }\r
+ if (pDataArray->trump != '*') { pDataArray->F.setTrump(pDataArray->trump); }\r
+ \r
+ pDataArray->F.setLength(pDataArray->alignmentLength);\r
+ \r
+ if(pDataArray->trump != '*' || pDataArray->m->isTrue(pDataArray->vertical) || pDataArray->soft != 0){\r
+ pDataArray->F.initialize();\r
+ }\r
+ \r
+ if(pDataArray->hard.compare("") != 0) { pDataArray->F.doHard(pDataArray->hard); }\r
+ else { pDataArray->F.setFilter(string(pDataArray->alignmentLength, '1')); }\r
+ \r
+ ifstream in;\r
+ pDataArray->m->openInputFile(pDataArray->filename, in);\r
+ \r
+ //print header if you are process 0\r
+ if ((pDataArray->start == 0) || (pDataArray->start == 1)) {\r
+ in.seekg(0);\r
+ }else { //this accounts for the difference in line endings. \r
+ in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); \r
+ }\r
+ \r
+ pDataArray->count = pDataArray->end;\r
+ for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process\r
+ \r
+ if (pDataArray->m->control_pressed) { in.close(); pDataArray->count = 1; return 1; }\r
+ \r
+ Sequence current(in); pDataArray->m->gobble(in); \r
+ \r
+ if (current.getName() != "") {\r
+ if (current.getAligned().length() != pDataArray->alignmentLength) { pDataArray->m->mothurOut("Sequences are not all the same length, please correct."); pDataArray->m->mothurOutEndLine(); pDataArray->m->control_pressed = true; }\r
+ \r
+ if(pDataArray->trump != '*') { pDataArray->F.doTrump(current); }\r
+ if(pDataArray->m->isTrue(pDataArray->vertical) || pDataArray->soft != 0) { pDataArray->F.getFreqs(current); }\r
+ }\r
+ \r
+ //report progress\r
+ if((i) % 100 == 0){ pDataArray->m->mothurOut(toString(i)); pDataArray->m->mothurOutEndLine(); }\r
+ }\r
+ \r
+ if((pDataArray->count) % 100 != 0){ pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); }\r
+ \r
+ in.close();\r
+ \r
+ return 0;\r
+ \r
+ }\r
+ catch(exception& e) {\r
+ pDataArray->m->errorOut(e, "FilterSeqsCommand", "MyCreateFilterThreadFunction");\r
+ exit(1);\r
+ }\r
+} \r
+/**************************************************************************************************/\r
+static DWORD WINAPI MyRunFilterThreadFunction(LPVOID lpParam){ \r
+ filterRunData* pDataArray;\r
+ pDataArray = (filterRunData*)lpParam;\r
+ \r
+ try {\r
+ \r
+ ofstream out;\r
+ pDataArray->m->openOutputFile(pDataArray->outputFilename, out);\r
+\r
+ ifstream in;\r
+ pDataArray->m->openInputFile(pDataArray->filename, in);\r
+ \r
+ //print header if you are process 0\r
+ if ((pDataArray->start == 0) || (pDataArray->start == 1)) {\r
+ in.seekg(0);\r
+ }else { //this accounts for the difference in line endings. \r
+ in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); \r
+ }\r
+ \r
+ pDataArray->count = pDataArray->end;\r
+ for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process\r
+ \r
+ if (pDataArray->m->control_pressed) { in.close(); out.close(); pDataArray->count = 1; return 1; }\r
+ \r
+ Sequence seq(in); pDataArray->m->gobble(in);\r
+ if (seq.getName() != "") {\r
+ string align = seq.getAligned();\r
+ string filterSeq = "";\r
+ \r
+ for(int j=0;j<pDataArray->alignmentLength;j++){\r
+ if(pDataArray->filter[j] == '1'){\r
+ filterSeq += align[j];\r
+ }\r
+ }\r
+ \r
+ out << '>' << seq.getName() << endl << filterSeq << endl;\r
+ }\r
+ \r
+ //report progress\r
+ if((i) % 100 == 0){ pDataArray->m->mothurOut(toString(i)); pDataArray->m->mothurOutEndLine(); }\r
+ }\r
+ \r
+ if((pDataArray->count) % 100 != 0){ pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); }\r
+ \r
+ in.close();\r
+ out.close();\r
+ \r
+ return 0;\r
+ \r
+ }\r
+ catch(exception& e) {\r
+ pDataArray->m->errorOut(e, "FilterSeqsCommand", "MyRunFilterThreadFunction");\r
+ exit(1);\r
+ }\r
+} \r
+/**************************************************************************************************/\r
+#endif\r
+\r
+\r
+#endif\r