+++ /dev/null
-#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