]> git.donarmstrong.com Git - mothur.git/blobdiff - filterseqscommand.h
added mothurOutJustToScreen function and changed all counter outputs to use it.
[mothur.git] / filterseqscommand.h
index 809c6eb69b427f8466cb97d60322e7a27b6d53ed..ed7cfd1f98ddb6f44c8c7f690447d8dea1d4f6f0 100644 (file)
@@ -24,21 +24,25 @@ public:
        vector<string> setParameters();\r
        string getCommandName()                 { return "filter.seqs";                 }\r
        string getCommandCategory()             { return "Sequence Processing"; }\r
+       \r
        string getHelpString(); \r
+    string getOutputPattern(string);   \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 int start;\r
-               unsigned long int end;\r
-               linePair(unsigned long int i, unsigned long int j) : start(i), end(j) {}\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
@@ -54,14 +58,189 @@ private:
        string createFilter();\r
        int filterSequences();\r
        int createProcessesCreateFilter(Filters&, string);\r
-       int createProcessesRunFilter(string, 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 int>&);\r
-       int MPICreateFilter(int, int, Filters&, MPI_File&, vector<unsigned long int>&); \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 = 0;\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
+            pDataArray->count++;\r
+            //report progress\r
+                       if((i) % 100 == 0){     pDataArray->m->mothurOutJustToScreen(toString(i)+"\n");                 }\r
+               }\r
+               \r
+        if((pDataArray->count) % 100 != 0){    pDataArray->m->mothurOutJustToScreen(toString(pDataArray->count)+"\n");                 }\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 = 0;\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
+            pDataArray->count++;\r
+            //report progress\r
+                       if((i) % 100 == 0){     pDataArray->m->mothurOutJustToScreen(toString(i)+"\n");                 }\r
+               }\r
+               \r
+        if((pDataArray->count) % 100 != 0){    pDataArray->m->mothurOutJustToScreen(toString(pDataArray->count)+"\n");                 }\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