+/**************************************************************************************/
+string FilterSeqsCommand::createFilter() {
+ try {
+ string filterString = "";
+
+ Filters F;
+
+ if (soft != 0) { F.setSoft(soft); }
+ if (trump != '*') { F.setTrump(trump); }
+
+ F.setLength(alignmentLength);
+
+ if(soft != 0 || isTrue(vertical)){
+ F.initialize();
+ }
+
+ if(hard.compare("") != 0) { F.doHard(hard); }
+ else { F.setFilter(string(alignmentLength, '1')); }
+
+ numSeqs = 0;
+
+ if(trump != '*' || isTrue(vertical) || soft != 0){
+ for (int s = 0; s < fastafileNames.size(); s++) {
+
+ for (int i = 0; i < lines.size(); i++) { delete lines[i]; } lines.clear();
+
+ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+ if(processors == 1){
+ ifstream inFASTA;
+ openInputFile(fastafileNames[s], inFASTA);
+ int numFastaSeqs=count(istreambuf_iterator<char>(inFASTA),istreambuf_iterator<char>(), '>');
+ inFASTA.close();
+
+ numSeqs += numFastaSeqs;
+
+ lines.push_back(new linePair(0, numFastaSeqs));
+
+ driverCreateFilter(F, fastafileNames[s], lines[0]);
+ }else{
+ vector<int> positions;
+
+ ifstream inFASTA;
+ openInputFile(fastafileNames[s], inFASTA);
+
+ string input;
+ while(!inFASTA.eof()){
+ input = getline(inFASTA);
+ if (input.length() != 0) {
+ if(input[0] == '>'){ long int pos = inFASTA.tellg(); positions.push_back(pos - input.length() - 1); }
+ }
+ }
+ inFASTA.close();
+
+ int numFastaSeqs = positions.size();
+
+ numSeqs += numFastaSeqs;
+
+ int numSeqsPerProcessor = numFastaSeqs / processors;
+
+ for (int i = 0; i < processors; i++) {
+ long int startPos = positions[ i * numSeqsPerProcessor ];
+ if(i == processors - 1){
+ numSeqsPerProcessor = numFastaSeqs - i * numSeqsPerProcessor;
+ }
+ lines.push_back(new linePair(startPos, numSeqsPerProcessor));
+ }
+
+ createProcessesCreateFilter(F, fastafileNames[s]);
+ }
+ #else
+ ifstream inFASTA;
+ openInputFile(fastafileNames[s], inFASTA);
+ int numFastaSeqs=count(istreambuf_iterator<char>(inFASTA),istreambuf_iterator<char>(), '>');
+ inFASTA.close();
+
+ numSeqs += numFastaSeqs;
+
+ lines.push_back(new linePair(0, numFastaSeqs));
+
+ driverCreateFilter(F, lines[0], fastafileNames[s]);
+ #endif
+
+
+ }
+ }
+
+ F.setNumSeqs(numSeqs);
+
+ if(isTrue(vertical) == 1) { F.doVertical(); }
+ if(soft != 0) { F.doSoft(); }
+
+ filterString = F.getFilter();
+
+ return filterString;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FilterSeqsCommand", "createFilter");
+ exit(1);
+ }
+}
+/**************************************************************************************/
+int FilterSeqsCommand::driverCreateFilter(Filters& F, string filename, linePair* line) {
+ try {
+
+ ifstream in;
+ openInputFile(filename, in);
+
+ in.seekg(line->start);
+
+ for(int i=0;i<line->numSeqs;i++){
+
+ if (m->control_pressed) { in.close(); return 1; }
+
+ Sequence seq(in);
+ if (seq.getName() != "") {
+ if(trump != '*'){ F.doTrump(seq); }
+ if(isTrue(vertical) || soft != 0){ F.getFreqs(seq); }
+ cout.flush();
+ }
+ }
+
+ in.close();
+
+ return 0;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FilterSeqsCommand", "driverCreateFilter");
+ exit(1);
+ }
+}
+/**************************************************************************************************/