2 // sffmultiplecommand.cpp
5 // Created by Sarah Westcott on 8/14/12.
6 // Copyright (c) 2012 Schloss Lab. All rights reserved.
9 #include "sffmultiplecommand.h"
13 //**********************************************************************************************************************
14 vector<string> SffMultipleCommand::setParameters(){
16 CommandParameter pfile("file", "InputTypes", "", "", "none", "none", "none","fasta-name",false,true,true); parameters.push_back(pfile);
19 CommandParameter ptrim("trim", "Boolean", "", "T", "", "", "","",false,false); parameters.push_back(ptrim);
22 CommandParameter pmaxhomop("maxhomop", "Number", "", "9", "", "", "","",false,false); parameters.push_back(pmaxhomop);
23 CommandParameter pmaxflows("maxflows", "Number", "", "450", "", "", "","",false,false); parameters.push_back(pmaxflows);
24 CommandParameter pminflows("minflows", "Number", "", "450", "", "", "","",false,false); parameters.push_back(pminflows);
25 CommandParameter ppdiffs("pdiffs", "Number", "", "0", "", "", "","",false,false,true); parameters.push_back(ppdiffs);
26 CommandParameter pbdiffs("bdiffs", "Number", "", "0", "", "", "","",false,false,true); parameters.push_back(pbdiffs);
27 CommandParameter pldiffs("ldiffs", "Number", "", "0", "", "", "","",false,false); parameters.push_back(pldiffs);
28 CommandParameter psdiffs("sdiffs", "Number", "", "0", "", "", "","",false,false); parameters.push_back(psdiffs);
29 CommandParameter ptdiffs("tdiffs", "Number", "", "0", "", "", "","",false,false); parameters.push_back(ptdiffs);
30 CommandParameter psignal("signal", "Number", "", "0.50", "", "", "","",false,false); parameters.push_back(psignal);
31 CommandParameter pnoise("noise", "Number", "", "0.70", "", "", "","",false,false); parameters.push_back(pnoise);
32 CommandParameter porder("order", "Multiple", "A-B-I", "A", "", "", "","",false,false, true); parameters.push_back(porder);
34 CommandParameter plookup("lookup", "InputTypes", "", "", "none", "none", "none","",false,false,true); parameters.push_back(plookup);
35 CommandParameter pcutoff("cutoff", "Number", "", "0.01", "", "", "","",false,false); parameters.push_back(pcutoff);
36 CommandParameter pmaxiter("maxiter", "Number", "", "1000", "", "", "","",false,false); parameters.push_back(pmaxiter);
37 CommandParameter plarge("large", "Number", "", "-1", "", "", "","",false,false); parameters.push_back(plarge);
38 CommandParameter psigma("sigma", "Number", "", "60", "", "", "","",false,false); parameters.push_back(psigma);
39 CommandParameter pmindelta("mindelta", "Number", "", "0.000001", "", "", "","",false,false); parameters.push_back(pmindelta);
41 //trim.seqs parameters
42 CommandParameter pallfiles("allfiles", "Boolean", "", "t", "", "", "","",false,false); parameters.push_back(pallfiles);
43 CommandParameter pflip("flip", "Boolean", "", "F", "", "", "","",false,false,true); parameters.push_back(pflip);
44 CommandParameter pmaxambig("maxambig", "Number", "", "-1", "", "", "","",false,false); parameters.push_back(pmaxambig);
45 CommandParameter pminlength("minlength", "Number", "", "0", "", "", "","",false,false); parameters.push_back(pminlength);
46 CommandParameter pmaxlength("maxlength", "Number", "", "0", "", "", "","",false,false); parameters.push_back(pmaxlength);
47 CommandParameter pkeepforward("keepforward", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pkeepforward);
48 CommandParameter pkeepfirst("keepfirst", "Number", "", "0", "", "", "","",false,false); parameters.push_back(pkeepfirst);
49 CommandParameter premovelast("removelast", "Number", "", "0", "", "", "","",false,false); parameters.push_back(premovelast);
52 CommandParameter pprocessors("processors", "Number", "", "1", "", "", "","",false,false,true); parameters.push_back(pprocessors);
53 CommandParameter pinputdir("inputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(pinputdir);
54 CommandParameter poutputdir("outputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(poutputdir);
56 vector<string> myArray;
57 for (int i = 0; i < parameters.size(); i++) { myArray.push_back(parameters[i].name); }
61 m->errorOut(e, "SffMultipleCommand", "setParameters");
65 //**********************************************************************************************************************
66 string SffMultipleCommand::getHelpString(){
68 string helpString = "";
69 helpString += "The sff.multiple command reads a file containing sff filenames and optional oligos filenames. It runs the files through sffinfo, trim.flows, shhh.flows and trim.seqs combining the results.\n";
70 helpString += "The sff.multiple command parameters are: ";
71 vector<string> parameters = setParameters();
72 for (int i = 0; i < parameters.size()-1; i++) {
73 helpString += parameters[i] + ", ";
75 helpString += parameters[parameters.size()-1] + ".\n";
76 helpString += "The file parameter allows you to enter the a file containing the list of sff files and optional oligos files.\n";
77 helpString += "The trim parameter allows you to indicate if you would like a sequences and quality scores generated by sffinfo trimmed to the clipQualLeft and clipQualRight values. Default=True. \n";
78 helpString += "The maxambig parameter allows you to set the maximum number of ambigious bases allowed. The default is -1.\n";
79 helpString += "The maxhomop parameter allows you to set a maximum homopolymer length. \n";
80 helpString += "The minlength parameter allows you to set and minimum sequence length. \n";
81 helpString += "The maxlength parameter allows you to set and maximum sequence length. \n";
82 helpString += "The tdiffs parameter is used to specify the total number of differences allowed in the sequence. The default is pdiffs + bdiffs + sdiffs + ldiffs.\n";
83 helpString += "The bdiffs parameter is used to specify the number of differences allowed in the barcode. The default is 0.\n";
84 helpString += "The pdiffs parameter is used to specify the number of differences allowed in the primer. The default is 0.\n";
85 helpString += "The ldiffs parameter is used to specify the number of differences allowed in the linker. The default is 0.\n";
86 helpString += "The sdiffs parameter is used to specify the number of differences allowed in the spacer. The default is 0.\n";
87 helpString += "The allfiles parameter will create separate group and fasta file for each grouping. The default is F.\n";
88 helpString += "The keepforward parameter allows you to indicate whether you want the forward primer removed or not. The default is F, meaning remove the forward primer.\n";
89 helpString += "The keepfirst parameter trims the sequence to the first keepfirst number of bases after the barcode or primers are removed, before the sequence is checked to see if it meets the other requirements. \n";
90 helpString += "The removelast removes the last removelast number of bases after the barcode or primers are removed, before the sequence is checked to see if it meets the other requirements.\n";
91 helpString += "The order parameter options are A, B or I. Default=A. A = TACG and B = TACGTACGTACGATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGATCTCAGTCAGCAGC and I = TACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGC.\n";
92 helpString += "Example sff.multiple(file=mySffOligosFile.txt, trim=F).\n";
93 helpString += "Note: No spaces between parameter labels (i.e. file), '=' and parameters (i.e.mySffOligosFile.txt).\n";
97 m->errorOut(e, "SffMultipleCommand", "getHelpString");
101 //**********************************************************************************************************************
102 string SffMultipleCommand::getOutputPattern(string type) {
106 if (type == "fasta") { pattern = "[filename],fasta"; }
107 else if (type == "name") { pattern = "[filename],names"; }
108 else if (type == "group") { pattern = "[filename],groups"; }
109 else { m->mothurOut("[ERROR]: No definition for type " + type + " output pattern.\n"); m->control_pressed = true; }
113 catch(exception& e) {
114 m->errorOut(e, "SffMultipleCommand", "getOutputPattern");
118 //**********************************************************************************************************************
119 SffMultipleCommand::SffMultipleCommand(){
121 abort = true; calledHelp = true;
123 vector<string> tempOutNames;
124 outputTypes["fasta"] = tempOutNames;
125 outputTypes["name"] = tempOutNames;
126 outputTypes["group"] = tempOutNames;
128 catch(exception& e) {
129 m->errorOut(e, "SffMultipleCommand", "SffMultipleCommand");
133 //**********************************************************************************************************************
135 SffMultipleCommand::SffMultipleCommand(string option) {
137 abort = false; calledHelp = false; append=false; makeGroup=false;
139 //allow user to run help
140 if(option == "help") { help(); abort = true; calledHelp = true; }
141 else if(option == "citation") { citation(); abort = true; calledHelp = true;}
144 //valid paramters for this command
145 vector<string> myArray = setParameters();
147 OptionParser parser(option);
148 map<string, string> parameters = parser.getParameters();
150 ValidParameters validParameter;
151 map<string,string>::iterator it;
153 //check to make sure all parameters are valid for command
154 for (it = parameters.begin(); it != parameters.end(); it++) {
155 if (validParameter.isValidParameter(it->first, myArray, it->second) != true) { abort = true; }
158 //initialize outputTypes
159 vector<string> tempOutNames;
160 outputTypes["fasta"] = tempOutNames;
161 outputTypes["name"] = tempOutNames;
162 outputTypes["group"] = tempOutNames;
165 //if the user changes the output directory command factory will send this info to us in the output parameter
166 outputDir = validParameter.validFile(parameters, "outputdir", false); if (outputDir == "not found"){ outputDir = ""; }
168 //if the user changes the input directory command factory will send this info to us in the output parameter
169 string inputDir = validParameter.validFile(parameters, "inputdir", false);
170 if (inputDir == "not found"){ inputDir = ""; }
173 it = parameters.find("file");
174 //user has given a template file
175 if(it != parameters.end()){
176 path = m->hasPath(it->second);
177 //if the user has not given a path then, add inputdir. else leave path alone.
178 if (path == "") { parameters["file"] = inputDir + it->second; }
181 it = parameters.find("lookup");
182 //user has given a template file
183 if(it != parameters.end()){
184 path = m->hasPath(it->second);
185 //if the user has not given a path then, add inputdir. else leave path alone.
186 if (path == "") { parameters["lookup"] = inputDir + it->second; }
190 filename = validParameter.validFile(parameters, "file", true);
191 if (filename == "not open") { filename = ""; abort = true; }
192 else if (filename == "not found") { filename = ""; }
195 temp = validParameter.validFile(parameters, "trim", false); if (temp == "not found"){ temp = "T"; }
196 trim = m->isTrue(temp);
198 temp = validParameter.validFile(parameters, "minflows", false); if (temp == "not found") { temp = "450"; }
199 m->mothurConvert(temp, minFlows);
201 temp = validParameter.validFile(parameters, "maxflows", false); if (temp == "not found") { temp = "450"; }
202 m->mothurConvert(temp, maxFlows);
204 temp = validParameter.validFile(parameters, "maxhomop", false); if (temp == "not found"){ temp = "9"; }
205 m->mothurConvert(temp, maxHomoP);
207 temp = validParameter.validFile(parameters, "signal", false); if (temp == "not found"){ temp = "0.50"; }
208 m->mothurConvert(temp, signal);
210 temp = validParameter.validFile(parameters, "noise", false); if (temp == "not found"){ temp = "0.70"; }
211 m->mothurConvert(temp, noise);
213 temp = validParameter.validFile(parameters, "bdiffs", false); if (temp == "not found"){ temp = "0"; }
214 m->mothurConvert(temp, bdiffs);
216 temp = validParameter.validFile(parameters, "pdiffs", false); if (temp == "not found"){ temp = "0"; }
217 m->mothurConvert(temp, pdiffs);
219 temp = validParameter.validFile(parameters, "ldiffs", false); if (temp == "not found") { temp = "0"; }
220 m->mothurConvert(temp, ldiffs);
222 temp = validParameter.validFile(parameters, "sdiffs", false); if (temp == "not found") { temp = "0"; }
223 m->mothurConvert(temp, sdiffs);
225 temp = validParameter.validFile(parameters, "tdiffs", false); if (temp == "not found") { int tempTotal = pdiffs + bdiffs + ldiffs + sdiffs; temp = toString(tempTotal); }
226 m->mothurConvert(temp, tdiffs);
228 if(tdiffs == 0){ tdiffs = bdiffs + pdiffs + ldiffs + sdiffs; }
231 temp = validParameter.validFile(parameters, "processors", false); if (temp == "not found"){ temp = m->getProcessors(); }
232 m->setProcessors(temp);
233 m->mothurConvert(temp, processors);
235 temp = validParameter.validFile(parameters, "order", false); if (temp == "not found"){ temp = "A"; }
236 if (temp.length() > 1) { m->mothurOut("[ERROR]: " + temp + " is not a valid option for order. order options are A, B, or I. A = TACG, B = TACGTACGTACGATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGATCTCAGTCAGCAGC, and I = TACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGC.\n"); abort=true;
239 if (toupper(temp[0]) == 'A') { flowOrder = "A"; }
240 else if(toupper(temp[0]) == 'B'){
242 else if(toupper(temp[0]) == 'I'){
245 m->mothurOut("[ERROR]: " + temp + " is not a valid option for order. order options are A, B, or I. A = TACG, B = TACGTACGTACGATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATAGATCGCATGACGATCGCATATCGTCAGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGTAGTCGAGCATCATCTGACGCAGTACGTGCATGATCTCAGTCAGCAGCTATGTCAGTGCATGCATAGATCGCATGACGATCGCATATCGTCAGTGCAGTGACTGATCGTCATCAGCTAGCATCGACTGCATGATCTCAGTCAGCAGC, and I = TACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGCTACGTACGTCTGAGCATCGATCGATGTACAGC.\n"); abort=true;
250 temp = validParameter.validFile(parameters, "cutoff", false); if (temp == "not found"){ temp = "0.01"; }
251 m->mothurConvert(temp, cutoff);
253 temp = validParameter.validFile(parameters, "mindelta", false); if (temp == "not found"){ temp = "0.000001"; }
256 temp = validParameter.validFile(parameters, "maxiter", false); if (temp == "not found"){ temp = "1000"; }
257 m->mothurConvert(temp, maxIters);
259 temp = validParameter.validFile(parameters, "large", false); if (temp == "not found"){ temp = "0"; }
260 m->mothurConvert(temp, largeSize);
261 if (largeSize != 0) { large = true; }
262 else { large = false; }
263 if (largeSize < 0) { m->mothurOut("The value of the large cannot be negative.\n"); }
265 temp = validParameter.validFile(parameters, "sigma", false);if (temp == "not found") { temp = "60"; }
266 m->mothurConvert(temp, sigma);
268 temp = validParameter.validFile(parameters, "flip", false);
269 if (temp == "not found") { flip = 0; }
270 else { flip = m->isTrue(temp); }
272 temp = validParameter.validFile(parameters, "maxambig", false); if (temp == "not found") { temp = "-1"; }
273 m->mothurConvert(temp, maxAmbig);
275 temp = validParameter.validFile(parameters, "minlength", false); if (temp == "not found") { temp = "0"; }
276 m->mothurConvert(temp, minLength);
278 temp = validParameter.validFile(parameters, "maxlength", false); if (temp == "not found") { temp = "0"; }
279 m->mothurConvert(temp, maxLength);
281 temp = validParameter.validFile(parameters, "keepfirst", false); if (temp == "not found") { temp = "0"; }
282 convert(temp, keepFirst);
284 temp = validParameter.validFile(parameters, "removelast", false); if (temp == "not found") { temp = "0"; }
285 convert(temp, removeLast);
287 temp = validParameter.validFile(parameters, "allfiles", false); if (temp == "not found") { temp = "F"; }
288 allFiles = m->isTrue(temp);
290 temp = validParameter.validFile(parameters, "keepforward", false); if (temp == "not found") { temp = "F"; }
291 keepforward = m->isTrue(temp);
293 temp = validParameter.validFile(parameters, "lookup", true);
294 if (temp == "not found") {
295 string path = m->argv;
296 string tempPath = path;
297 for (int i = 0; i < path.length(); i++) { tempPath[i] = tolower(path[i]); }
298 path = path.substr(0, (tempPath.find_last_of('m')));
300 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
301 path += "lookupFiles/";
303 path += "lookupFiles\\";
305 lookupFileName = m->getFullPathName(path) + "LookUp_Titanium.pat";
309 ableToOpen = m->openInputFile(lookupFileName, in, "noerror");
312 //if you can't open it, try input location
313 if (ableToOpen == 1) {
314 if (inputDir != "") { //default path is set
315 string tryPath = inputDir + m->getSimpleName(lookupFileName);
316 m->mothurOut("Unable to open " + lookupFileName + ". Trying input directory " + tryPath); m->mothurOutEndLine();
318 ableToOpen = m->openInputFile(tryPath, in2, "noerror");
320 lookupFileName = tryPath;
324 //if you can't open it, try default location
325 if (ableToOpen == 1) {
326 if (m->getDefaultPath() != "") { //default path is set
327 string tryPath = m->getDefaultPath() + m->getSimpleName(lookupFileName);
328 m->mothurOut("Unable to open " + lookupFileName + ". Trying default " + tryPath); m->mothurOutEndLine();
330 ableToOpen = m->openInputFile(tryPath, in2, "noerror");
332 lookupFileName = tryPath;
336 //if you can't open it its not in current working directory or inputDir, try mothur excutable location
337 if (ableToOpen == 1) {
338 string exepath = m->argv;
339 string tempPath = exepath;
340 for (int i = 0; i < exepath.length(); i++) { tempPath[i] = tolower(exepath[i]); }
341 exepath = exepath.substr(0, (tempPath.find_last_of('m')));
343 string tryPath = m->getFullPathName(exepath) + m->getSimpleName(lookupFileName);
344 m->mothurOut("Unable to open " + lookupFileName + ". Trying mothur's executable location " + tryPath); m->mothurOutEndLine();
346 ableToOpen = m->openInputFile(tryPath, in2, "noerror");
348 lookupFileName = tryPath;
351 if (ableToOpen == 1) { m->mothurOut("Unable to open " + lookupFileName + "."); m->mothurOutEndLine(); abort=true; }
353 else if(temp == "not open") {
355 lookupFileName = validParameter.validFile(parameters, "lookup", false);
357 //if you can't open it its not inputDir, try mothur excutable location
358 string exepath = m->argv;
359 string tempPath = exepath;
360 for (int i = 0; i < exepath.length(); i++) { tempPath[i] = tolower(exepath[i]); }
361 exepath = exepath.substr(0, (tempPath.find_last_of('m')));
363 string tryPath = m->getFullPathName(exepath) + m->getSimpleName(lookupFileName);
364 m->mothurOut("Unable to open " + lookupFileName + ". Trying mothur's executable location " + tryPath); m->mothurOutEndLine();
366 int ableToOpen = m->openInputFile(tryPath, in2, "noerror");
368 lookupFileName = tryPath;
370 if (ableToOpen == 1) { m->mothurOut("Unable to open " + lookupFileName + "."); m->mothurOutEndLine(); abort=true; }
371 }else { lookupFileName = temp; }
374 catch(exception& e) {
375 m->errorOut(e, "SffMultipleCommand", "SffMultipleCommand");
379 //**********************************************************************************************************************
380 int SffMultipleCommand::execute(){
382 if (abort == true) { if (calledHelp) { return 0; } return 2; }
384 vector<string> sffFiles, oligosFiles;
385 readFile(sffFiles, oligosFiles);
387 outputDir = m->hasPath(filename);
388 string fileroot = outputDir + m->getRootName(m->getSimpleName(filename));
389 map<string, string> variables;
390 variables["[filename]"] = fileroot;
391 string fasta = getOutputFileName("fasta",variables);
392 string name = getOutputFileName("name",variables);
393 string group = getOutputFileName("group",variables);
395 if (m->control_pressed) { return 0; }
397 if (sffFiles.size() < processors) { processors = sffFiles.size(); }
399 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
401 //trim.flows, shhh.flows cannot handle multiple processors for windows.
402 processors = 1; m->mothurOut("This command can only use 1 processor on Windows platforms, using 1 processors.\n\n");
404 if (processors == 1) { driver(sffFiles, oligosFiles, 0, sffFiles.size(), fasta, name, group); }
405 else { createProcesses(sffFiles, oligosFiles, fasta, name, group); }
407 if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) { m->mothurRemove(outputNames[i]); } return 0; }
410 outputNames.push_back(fasta); outputTypes["fasta"].push_back(fasta);
411 m->setFastaFile(fasta);
412 outputNames.push_back(name); outputTypes["name"].push_back(name);
413 m->setNameFile(name);
414 if (makeGroup) { outputNames.push_back(group); outputTypes["group"].push_back(group); m->setGroupFile(group); }
417 //report output filenames
418 m->mothurOutEndLine();
419 m->mothurOut("Output File Names: "); m->mothurOutEndLine();
420 for (int i = 0; i < outputNames.size(); i++) { m->mothurOut(outputNames[i]); m->mothurOutEndLine(); }
421 m->mothurOutEndLine();
425 catch(exception& e) {
426 m->errorOut(e, "SffMultipleCommand", "execute");
430 //**********************************************************************************************************************
431 int SffMultipleCommand::readFile(vector<string>& sffFiles, vector<string>& oligosFiles){
435 m->openInputFile(filename, in);
436 bool allBlank = true;
442 if (m->control_pressed) { break; }
446 sff = m->getFullPathName(sff);
448 //ignore file pairing
449 if(sff[0] == '#'){ while (!in.eof()) { char c = in.get(); if (c == 10 || c == 13){ break; } } m->gobble(in); }
450 else { //check for oligos file
453 // get rest of line in case there is a oligos filename
456 if (c == 10 || c == 13 || c == -1){ break; }
457 else if (c == 32 || c == 9){;} //space or tab
458 else { oligos += c; }
460 sffFiles.push_back(sff);
461 if (oligos != "") { oligos = m->getFullPathName(oligos); allBlank = false; }
462 if (oligos == "") { allFull = false; }
463 oligosFiles.push_back(oligos); //will push a blank if there is not an oligos for this sff file
469 if (allBlank || allFull) { append = true; }
470 if (allFull) { makeGroup = true; }
474 catch(exception& e) {
475 m->errorOut(e, "SffMultipleCommand", "readFile");
479 //**********************************************************************************************************************
480 //runs sffinfo, summary.seqs, trim.flows, shhh.flows, trim.seqs, summary.seqs for each sff file.
481 int SffMultipleCommand::driver(vector<string> sffFiles, vector<string> oligosFiles, int start, int end, string fasta, string name, string group){
483 m->mothurRemove(fasta); m->mothurRemove(name); m->mothurRemove(group);
485 for (int s = start; s < end; s++) {
487 string sff = sffFiles[s];
488 string oligos = oligosFiles[s];
490 m->mothurOut("\n>>>>>\tProcessing " + sff + " (file " + toString(s+1) + " of " + toString(sffFiles.size()) + ")\t<<<<<\n");
493 string inputString = "sff=" + sff + ", flow=T";
494 if (trim) { inputString += ", trim=T"; }
495 m->mothurOut("/******************************************/"); m->mothurOutEndLine();
496 m->mothurOut("Running command: sffinfo(" + inputString + ")"); m->mothurOutEndLine();
497 m->mothurCalling = true;
499 Command* sffCommand = new SffInfoCommand(inputString);
500 sffCommand->execute();
502 if (m->control_pressed){ break; }
504 map<string, vector<string> > filenames = sffCommand->getOutputFiles();
507 m->mothurCalling = false;
508 m->mothurOutEndLine();
510 //run summary.seqs on the fasta file
511 string fastaFile = "";
512 map<string, vector<string> >::iterator it = filenames.find("fasta");
513 if (it != filenames.end()) { if ((it->second).size() != 0) { fastaFile = (it->second)[0]; } }
514 else { m->mothurOut("[ERROR]: sffinfo did not create a fasta file, quitting.\n"); m->control_pressed = true; break; }
516 inputString = "fasta=" + fastaFile + ", processors=1";
517 m->mothurOutEndLine();
518 m->mothurOut("Running command: summary.seqs(" + inputString + ")"); m->mothurOutEndLine();
519 m->mothurCalling = true;
521 Command* summarySeqsCommand = new SeqSummaryCommand(inputString);
522 summarySeqsCommand->execute();
524 if (m->control_pressed){ break; }
526 map<string, vector<string> > temp = summarySeqsCommand->getOutputFiles();
527 mergeOutputFileList(filenames, temp);
529 delete summarySeqsCommand;
530 m->mothurCalling = false;
532 m->mothurOutEndLine();
534 //run trim.flows on the fasta file
535 string flowFile = "";
536 it = filenames.find("flow");
537 if (it != filenames.end()) { if ((it->second).size() != 0) { flowFile = (it->second)[0]; } }
538 else { m->mothurOut("[ERROR]: sffinfo did not create a flow file, quitting.\n"); m->control_pressed = true; break; }
540 inputString = "flow=" + flowFile;
541 if (oligos != "") { inputString += ", oligos=" + oligos; }
542 inputString += ", maxhomop=" + toString(maxHomoP) + ", maxflows=" + toString(maxFlows) + ", minflows=" + toString(minFlows);
543 inputString += ", pdiffs=" + toString(pdiffs) + ", bdiffs=" + toString(bdiffs) + ", ldiffs=" + toString(ldiffs) + ", sdiffs=" + toString(sdiffs);
544 inputString += ", tdiffs=" + toString(tdiffs) + ", signal=" + toString(signal) + ", noise=" + toString(noise) + ", order=" + flowOrder + ", processors=1";
546 m->mothurOutEndLine();
547 m->mothurOut("Running command: trim.flows(" + inputString + ")"); m->mothurOutEndLine();
548 m->mothurCalling = true;
550 Command* trimFlowCommand = new TrimFlowsCommand(inputString);
551 trimFlowCommand->execute();
553 if (m->control_pressed){ break; }
555 temp = trimFlowCommand->getOutputFiles();
556 mergeOutputFileList(filenames, temp);
558 delete trimFlowCommand;
559 m->mothurCalling = false;
562 string fileFileName = "";
565 it = temp.find("file");
566 if (it != temp.end()) { if ((it->second).size() != 0) { fileFileName = (it->second)[0]; } }
567 else { m->mothurOut("[ERROR]: trim.flows did not create a file file, quitting.\n"); m->control_pressed = true; break; }
569 vector<string> flowFiles;
570 it = temp.find("flow");
571 if (it != temp.end()) { if ((it->second).size() != 0) { flowFiles = (it->second); } }
572 else { m->mothurOut("[ERROR]: trim.flows did not create a flow file, quitting.\n"); m->control_pressed = true; break; }
574 for (int i = 0; i < flowFiles.size(); i++) {
575 string end = flowFiles[i].substr(flowFiles[i].length()-9);
576 if (end == "trim.flow") {
577 flowFile = flowFiles[i]; i+=flowFiles.size(); //if we found the trim.flow file stop looking
582 if ((fileFileName == "") && (flowFile == "")) { m->mothurOut("[ERROR]: trim.flows did not create a file file or a trim.flow file, quitting.\n"); m->control_pressed = true; break; }
584 if (fileFileName != "") { inputString = "file=" + fileFileName; }
585 else { inputString = "flow=" + flowFile; }
587 inputString += ", lookup=" + lookupFileName + ", cutoff=" + toString(cutoff); + ", maxiters=" + toString(maxIters);
588 if (large) { inputString += ", large=" + toString(largeSize); }
589 inputString += ", sigma=" +toString(sigma);
590 inputString += ", mindelta=" + toString(minDelta);
591 inputString += ", order=" + flowOrder + ", processors=1";
594 m->mothurOutEndLine();
595 m->mothurOut("Running command: shhh.flows(" + inputString + ")"); m->mothurOutEndLine();
596 m->mothurCalling = true;
598 Command* shhhFlowCommand = new ShhherCommand(inputString);
599 shhhFlowCommand->execute();
601 if (m->control_pressed){ break; }
603 temp = shhhFlowCommand->getOutputFiles();
604 mergeOutputFileList(filenames, temp);
606 delete shhhFlowCommand;
607 m->mothurCalling = false;
609 vector<string> fastaFiles;
610 vector<string> nameFiles;
611 it = temp.find("fasta");
612 if (it != temp.end()) { if ((it->second).size() != 0) { fastaFiles = (it->second); } }
613 else { m->mothurOut("[ERROR]: shhh.flows did not create a fasta file, quitting.\n"); m->control_pressed = true; break; }
615 it = temp.find("name");
616 if (it != temp.end()) { if ((it->second).size() != 0) { nameFiles = (it->second); } }
617 else { m->mothurOut("[ERROR]: shhh.flows did not create a name file, quitting.\n"); m->control_pressed = true; break; }
619 //find fasta and name files with the shortest name. This is because if there is a composite name it will be the shortest.
620 fastaFile = fastaFiles[0];
621 for (int i = 1; i < fastaFiles.size(); i++) { if (fastaFiles[i].length() < fastaFile.length()) { fastaFile = fastaFiles[i]; } }
622 string nameFile = nameFiles[0];
623 for (int i = 1; i < nameFiles.size(); i++) { if (nameFiles[i].length() < nameFile.length()) { nameFile = nameFiles[i]; } }
625 inputString = "fasta=" + fastaFile + ", name=" + nameFile;
626 if (oligos != "") { inputString += ", oligos=" + oligos; }
627 if (allFiles) { inputString += ", allfiles=t"; }
628 else { inputString += ", allfiles=f"; }
629 if (flip) { inputString += ", flip=t"; }
630 else { inputString += ", flip=f"; }
631 if (keepforward) { inputString += ", keepforward=t"; }
632 else { inputString += ", keepforward=f"; }
635 inputString += ", pdiffs=" + toString(pdiffs) + ", bdiffs=" + toString(bdiffs) + ", ldiffs=" + toString(ldiffs) + ", sdiffs=" + toString(sdiffs);
636 inputString += ", tdiffs=" + toString(tdiffs) + ", maxambig=" + toString(maxAmbig) + ", minlength=" + toString(minLength) + ", maxlength=" + toString(maxLength);
637 if (keepFirst != 0) { inputString += ", keepfirst=" + toString(keepFirst); }
638 if (removeLast != 0) { inputString += ", removelast=" + toString(removeLast); }
639 inputString += ", processors=1";
642 m->mothurOutEndLine();
643 m->mothurOut("Running command: trim.seqs(" + inputString + ")"); m->mothurOutEndLine();
644 m->mothurCalling = true;
646 Command* trimseqsCommand = new TrimSeqsCommand(inputString);
647 trimseqsCommand->execute();
649 if (m->control_pressed){ break; }
651 temp = trimseqsCommand->getOutputFiles();
652 mergeOutputFileList(filenames, temp);
654 delete trimseqsCommand;
655 m->mothurCalling = false;
657 it = temp.find("fasta");
658 if (it != temp.end()) { if ((it->second).size() != 0) { fastaFiles = (it->second); } }
659 else { m->mothurOut("[ERROR]: trim.seqs did not create a fasta file, quitting.\n"); m->control_pressed = true; break; }
661 for (int i = 0; i < fastaFiles.size(); i++) {
662 string end = fastaFiles[i].substr(fastaFiles[i].length()-10);
663 if (end == "trim.fasta") {
664 fastaFile = fastaFiles[i]; i+=fastaFiles.size(); //if we found the trim.fasta file stop looking
668 it = temp.find("name");
669 if (it != temp.end()) { if ((it->second).size() != 0) { nameFiles = (it->second); } }
670 else { m->mothurOut("[ERROR]: trim.seqs did not create a name file, quitting.\n"); m->control_pressed = true; break; }
672 for (int i = 0; i < nameFiles.size(); i++) {
673 string end = nameFiles[i].substr(nameFiles[i].length()-10);
674 if (end == "trim.names") {
675 nameFile = nameFiles[i]; i+=nameFiles.size(); //if we found the trim.names file stop looking
679 vector<string> groupFiles;
680 string groupFile = "";
682 it = temp.find("group");
683 if (it != temp.end()) { if ((it->second).size() != 0) { groupFiles = (it->second); } }
685 //find group file with the shortest name. This is because if there is a composite group file it will be the shortest.
686 groupFile = groupFiles[0];
687 for (int i = 1; i < groupFiles.size(); i++) { if (groupFiles[i].length() < groupFile.length()) { groupFile = groupFiles[i]; } }
690 inputString = "fasta=" + fastaFile + ", processors=1, name=" + nameFile;
691 m->mothurOutEndLine();
692 m->mothurOut("Running command: summary.seqs(" + inputString + ")"); m->mothurOutEndLine();
693 m->mothurCalling = true;
695 summarySeqsCommand = new SeqSummaryCommand(inputString);
696 summarySeqsCommand->execute();
698 if (m->control_pressed){ break; }
700 temp = summarySeqsCommand->getOutputFiles();
701 mergeOutputFileList(filenames, temp);
703 delete summarySeqsCommand;
704 m->mothurCalling = false;
706 m->mothurOutEndLine();
707 m->mothurOut("/******************************************/"); m->mothurOutEndLine();
710 m->appendFiles(fastaFile, fasta);
711 m->appendFiles(nameFile, name);
712 if (makeGroup) { m->appendFiles(groupFile, group); }
716 for (it = filenames.begin(); it != filenames.end(); it++) {
717 for (int i = 0; i < (it->second).size(); i++) {
718 outputNames.push_back((it->second)[i]); outputTypes[it->first].push_back((it->second)[i]);
725 catch(exception& e) {
726 m->errorOut(e, "SffMultipleCommand", "driver");
730 //**********************************************************************************************************************
731 int SffMultipleCommand::mergeOutputFileList(map<string, vector<string> >& files, map<string, vector<string> >& temp){
733 map<string, vector<string> >::iterator it;
734 for (it = temp.begin(); it != temp.end(); it++) {
735 map<string, vector<string> >::iterator it2 = files.find(it->first);
736 if (it2 == files.end()) { //we do not already have this type so just add it
737 files[it->first] = it->second;
739 for (int i = 0; i < (it->second).size(); i++) {
740 files[it->first].push_back((it->second)[i]);
747 catch(exception& e) {
748 m->errorOut(e, "SffMultipleCommand", "mergeOutputFileList");
752 //**********************************************************************************************************************
753 int SffMultipleCommand::createProcesses(vector<string> sffFiles, vector<string> oligosFiles, string fasta, string name, string group){
755 vector<int> processIDS;
759 //divide the groups between the processors
760 vector<linePair> lines;
761 vector<int> numFilesToComplete;
762 int numFilesPerProcessor = sffFiles.size() / processors;
763 for (int i = 0; i < processors; i++) {
764 int startIndex = i * numFilesPerProcessor;
765 int endIndex = (i+1) * numFilesPerProcessor;
766 if(i == (processors - 1)){ endIndex = sffFiles.size(); }
767 lines.push_back(linePair(startIndex, endIndex));
768 numFilesToComplete.push_back((endIndex-startIndex));
771 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
773 //loop through and create all the processes you want
774 while (process != processors) {
778 processIDS.push_back(pid); //create map from line number to pid so you can append files in correct order later
781 num = driver(sffFiles, oligosFiles, lines[process].start, lines[process].end, fasta + toString(getpid()) + ".temp", name + toString(getpid()) + ".temp", group + toString(getpid()) + ".temp");
783 //pass numSeqs to parent
785 string tempFile = toString(getpid()) + ".num.temp";
786 m->openOutputFile(tempFile, out);
787 out << num << '\t' << outputNames.size() << endl;
788 for (int i = 0; i < outputNames.size(); i++) { out << outputNames[i] << endl; }
793 m->mothurOut("[ERROR]: unable to spawn the necessary processes."); m->mothurOutEndLine();
794 for (int i = 0; i < processIDS.size(); i++) { kill (processIDS[i], SIGINT); }
800 num = driver(sffFiles, oligosFiles, lines[0].start, lines[0].end, fasta, name, group);
802 //force parent to wait until all the processes are done
803 for (int i=0;i<processIDS.size();i++) {
804 int temp = processIDS[i];
808 for (int i=0;i<processIDS.size();i++) {
810 string tempFile = toString(processIDS[i]) + ".num.temp";
811 m->openInputFile(tempFile, in);
813 int tempNum = 0; int outputNamesSize = 0;
814 in >> tempNum >> outputNamesSize; m->gobble(in);
815 for (int j = 0; j < outputNamesSize; j++) {
817 in >> tempName; m->gobble(in);
818 outputNames.push_back(tempName);
820 if (tempNum != numFilesToComplete[i+1]) {
821 m->mothurOut("[ERROR]: main process expected " + toString(processIDS[i]) + " to complete " + toString(numFilesToComplete[i+1]) + " files, and it only reported completing " + toString(tempNum) + ". This will cause file mismatches. The flow files may be too large to process with multiple processors. \n");
824 in.close(); m->mothurRemove(tempFile);
827 m->appendFiles(fasta+toString(processIDS[i])+".temp", fasta); m->mothurRemove(fasta+toString(processIDS[i])+".temp");
828 m->appendFiles(name+toString(processIDS[i])+".temp", name); m->mothurRemove(name+toString(processIDS[i])+".temp");
829 if (makeGroup) { m->appendFiles(group+toString(processIDS[i])+".temp", group); m->mothurRemove(group+toString(processIDS[i])+".temp"); }
836 catch(exception& e) {
837 m->errorOut(e, "ShhherCommand", "createProcesses");
841 //**********************************************************************************************************************