]> git.donarmstrong.com Git - mothur.git/blob - filterseqscommand.h
added unix to ifdefs. minor changes while testing 1.24.0.
[mothur.git] / filterseqscommand.h
1 #ifndef FILTERSEQSCOMMAND_H\r
2 #define FILTERSEQSCOMMAND_H\r
3 \r
4 /*\r
5  *  filterseqscommand.h\r
6  *  Mothur\r
7  *\r
8  *  Created by Thomas Ryabin on 5/4/09.\r
9  *  Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.\r
10  *\r
11  */\r
12 \r
13 #include "command.hpp"\r
14 #include "filters.h"\r
15 \r
16 class Sequence;\r
17 class FilterSeqsCommand : public Command {\r
18 \r
19 public:\r
20         FilterSeqsCommand(string);\r
21         FilterSeqsCommand();\r
22         ~FilterSeqsCommand() {};\r
23         \r
24         vector<string> setParameters();\r
25         string getCommandName()                 { return "filter.seqs";                 }\r
26         string getCommandCategory()             { return "Sequence Processing"; }\r
27         string getHelpString(); \r
28         string getCitation() { return "http://www.mothur.org/wiki/Filter.seqs"; }\r
29         string getDescription()         { return "removes columns from alignments based on a criteria defined by the user"; }\r
30         \r
31         int execute(); \r
32         void help() { m->mothurOut(getHelpString()); }  \r
33         \r
34 private:\r
35         struct linePair {\r
36                 unsigned long long start;\r
37                 unsigned long long end;\r
38                 linePair(unsigned long long i, unsigned long long j) : start(i), end(j) {}\r
39         };\r
40 \r
41         vector<linePair*> lines;\r
42         vector<int> processIDS;\r
43     map<int, vector<unsigned long long> > savedPositions;\r
44 \r
45         string vertical, filter, fasta, hard, outputDir, filterFileName;\r
46         vector<string> fastafileNames;  \r
47         int alignmentLength, processors;\r
48         vector<int> bufferSizes;\r
49         vector<string> outputNames;\r
50 \r
51         char trump;\r
52         bool abort;\r
53         float soft;\r
54         int numSeqs;\r
55         \r
56         string createFilter();\r
57         int filterSequences();\r
58         int createProcessesCreateFilter(Filters&, string);\r
59         int createProcessesRunFilter(string, string, string);\r
60         int driverRunFilter(string, string, string, linePair*);\r
61         int driverCreateFilter(Filters& F, string filename, linePair* line);\r
62         #ifdef USE_MPI\r
63         int driverMPIRun(int, int, MPI_File&, MPI_File&, vector<unsigned long long>&);\r
64         int MPICreateFilter(int, int, Filters&, MPI_File&, vector<unsigned long long>&);        \r
65         #endif\r
66         \r
67 };\r
68 \r
69 \r
70 /**************************************************************************************************/\r
71 //custom data structure for threads to use.\r
72 // This is passed by void pointer so it can be any data type\r
73 // that can be passed using a single void pointer (LPVOID).\r
74 struct filterData {\r
75         Filters F;\r
76     int count, tid, alignmentLength;\r
77     unsigned long long start, end;\r
78     MothurOut* m;\r
79     string filename, vertical, hard;\r
80     char trump;\r
81     float soft;\r
82         \r
83         filterData(){}\r
84         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
85         filename = fn;\r
86                 m = mout;\r
87                 start = st;\r
88                 end = en;\r
89         tid = t;\r
90         trump = tr;\r
91         alignmentLength = aLength;\r
92         vertical = vert;\r
93         soft = so;\r
94         hard = ha;\r
95                 count = 0;\r
96         }\r
97 };\r
98 /**************************************************************************************************/\r
99 //custom data structure for threads to use.\r
100 // This is passed by void pointer so it can be any data type\r
101 // that can be passed using a single void pointer (LPVOID).\r
102 struct filterRunData {\r
103     int count, tid, alignmentLength;\r
104     unsigned long long start, end;\r
105     MothurOut* m;\r
106     string filename;\r
107     string filter, outputFilename;\r
108         \r
109         filterRunData(){}\r
110         filterRunData(string f, string fn, string ofn, MothurOut* mout, unsigned long long st, unsigned long long en, int aLength, int t) {\r
111         filter = f;\r
112         outputFilename = ofn;\r
113         filename = fn;\r
114                 m = mout;\r
115                 start = st;\r
116                 end = en;\r
117         tid = t;\r
118         alignmentLength = aLength;\r
119                 count = 0;\r
120         }\r
121 };\r
122 \r
123 /**************************************************************************************************/\r
124 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)\r
125 #else\r
126 static DWORD WINAPI MyCreateFilterThreadFunction(LPVOID lpParam){ \r
127         filterData* pDataArray;\r
128         pDataArray = (filterData*)lpParam;\r
129         \r
130         try {\r
131 \r
132                 if (pDataArray->soft != 0)                      {  pDataArray->F.setSoft(pDataArray->soft);             }\r
133                 if (pDataArray->trump != '*')           {  pDataArray->F.setTrump(pDataArray->trump);   }\r
134                 \r
135                 pDataArray->F.setLength(pDataArray->alignmentLength);\r
136                 \r
137                 if(pDataArray->trump != '*' || pDataArray->m->isTrue(pDataArray->vertical) || pDataArray->soft != 0){\r
138                         pDataArray->F.initialize();\r
139                 }\r
140                 \r
141                 if(pDataArray->hard.compare("") != 0)   {       pDataArray->F.doHard(pDataArray->hard);         }\r
142                 else                                            {       pDataArray->F.setFilter(string(pDataArray->alignmentLength, '1'));      }\r
143         \r
144                 ifstream in;\r
145                 pDataArray->m->openInputFile(pDataArray->filename, in);\r
146         \r
147                 //print header if you are process 0\r
148                 if ((pDataArray->start == 0) || (pDataArray->start == 1)) {\r
149                         in.seekg(0);\r
150                 }else { //this accounts for the difference in line endings. \r
151                         in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); \r
152                 }\r
153                 \r
154                 pDataArray->count = pDataArray->end;\r
155                 for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process\r
156                         \r
157                         if (pDataArray->m->control_pressed) { in.close(); pDataArray->count = 1; return 1; }\r
158                         \r
159                         Sequence current(in); pDataArray->m->gobble(in); \r
160                         \r
161                         if (current.getName() != "") {\r
162                                 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
163                 \r
164                 if(pDataArray->trump != '*')                    {       pDataArray->F.doTrump(current);         }\r
165                 if(pDataArray->m->isTrue(pDataArray->vertical) || pDataArray->soft != 0)        {       pDataArray->F.getFreqs(current);        }\r
166                         }\r
167             \r
168             //report progress\r
169                         if((i) % 100 == 0){     pDataArray->m->mothurOut(toString(i)); pDataArray->m->mothurOutEndLine();               }\r
170                 }\r
171                 \r
172         if((pDataArray->count) % 100 != 0){     pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine();               }\r
173         \r
174                 in.close();\r
175                 \r
176                 return 0;\r
177                 \r
178         }\r
179         catch(exception& e) {\r
180                 pDataArray->m->errorOut(e, "FilterSeqsCommand", "MyCreateFilterThreadFunction");\r
181                 exit(1);\r
182         }\r
183\r
184 /**************************************************************************************************/\r
185 static DWORD WINAPI MyRunFilterThreadFunction(LPVOID lpParam){ \r
186         filterRunData* pDataArray;\r
187         pDataArray = (filterRunData*)lpParam;\r
188         \r
189         try {\r
190         \r
191         ofstream out;\r
192                 pDataArray->m->openOutputFile(pDataArray->outputFilename, out);\r
193 \r
194                 ifstream in;\r
195                 pDataArray->m->openInputFile(pDataArray->filename, in);\r
196         \r
197                 //print header if you are process 0\r
198                 if ((pDataArray->start == 0) || (pDataArray->start == 1)) {\r
199                         in.seekg(0);\r
200                 }else { //this accounts for the difference in line endings. \r
201                         in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); \r
202                 }\r
203                 \r
204                 pDataArray->count = pDataArray->end;\r
205                 for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process\r
206                         \r
207                         if (pDataArray->m->control_pressed) { in.close(); out.close(); pDataArray->count = 1; return 1; }\r
208                         \r
209                         Sequence seq(in); pDataArray->m->gobble(in);\r
210             if (seq.getName() != "") {\r
211                 string align = seq.getAligned();\r
212                 string filterSeq = "";\r
213                 \r
214                 for(int j=0;j<pDataArray->alignmentLength;j++){\r
215                     if(pDataArray->filter[j] == '1'){\r
216                         filterSeq += align[j];\r
217                     }\r
218                 }\r
219                 \r
220                 out << '>' << seq.getName() << endl << filterSeq << endl;\r
221             }\r
222             \r
223             //report progress\r
224                         if((i) % 100 == 0){     pDataArray->m->mothurOut(toString(i)); pDataArray->m->mothurOutEndLine();               }\r
225                 }\r
226                 \r
227         if((pDataArray->count) % 100 != 0){     pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine();               }\r
228         \r
229                 in.close();\r
230         out.close();\r
231                 \r
232                 return 0;\r
233                 \r
234         }\r
235         catch(exception& e) {\r
236                 pDataArray->m->errorOut(e, "FilterSeqsCommand", "MyRunFilterThreadFunction");\r
237                 exit(1);\r
238         }\r
239\r
240 /**************************************************************************************************/\r
241 #endif\r
242 \r
243 \r
244 #endif\r