]> git.donarmstrong.com Git - mothur.git/blob - catchallcommand.cpp
b0e5eff6652a9defaa887eb7d21bb9bfe9e372a6
[mothur.git] / catchallcommand.cpp
1 /*
2  *  catchallcommand.cpp
3  *  Mothur
4  *
5  *  Created by westcott on 5/11/10.
6  *  Copyright 2010 Schloss Lab. All rights reserved.
7  *
8  */
9
10 #include "catchallcommand.h"
11 #include "globaldata.hpp"
12
13 //**********************************************************************************************************************
14 vector<string> CatchAllCommand::getValidParameters(){   
15         try {
16                 string AlignArray[] =  {"sabund","shared","label","inputdir","outputdir"};
17                 vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));
18                 return myArray;
19         }
20         catch(exception& e) {
21                 m->errorOut(e, "CatchAllCommand", "getValidParameters");
22                 exit(1);
23         }
24 }
25 //**********************************************************************************************************************
26 CatchAllCommand::CatchAllCommand(){     
27         try {
28                 //initialize outputTypes
29                 vector<string> tempOutNames;
30                 outputTypes["csv"] = tempOutNames;
31                 outputTypes["summary"] = tempOutNames;
32         }
33         catch(exception& e) {
34                 m->errorOut(e, "CatchAllCommand", "CatchAllCommand");
35                 exit(1);
36         }
37 }
38 //**********************************************************************************************************************
39 vector<string> CatchAllCommand::getRequiredParameters(){        
40         try {
41                 string AlignArray[] =  {"sabund","shared","or"};
42                 vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));
43                 return myArray;
44         }
45         catch(exception& e) {
46                 m->errorOut(e, "CatchAllCommand", "getRequiredParameters");
47                 exit(1);
48         }
49 }
50 //**********************************************************************************************************************
51 vector<string> CatchAllCommand::getRequiredFiles(){     
52         try {
53                 vector<string> myArray;
54                 return myArray;
55         }
56         catch(exception& e) {
57                 m->errorOut(e, "CatchAllCommand", "getRequiredFiles");
58                 exit(1);
59         }
60 }
61 /**************************************************************************************/
62 CatchAllCommand::CatchAllCommand(string option)  {      
63         try {
64                 globaldata = GlobalData::getInstance();
65                 abort = false;
66                 allLines = 1;
67                 
68                 //allow user to run help
69                 if(option == "help") { help(); abort = true; }
70                 
71                 else {
72                         //valid paramters for this command
73                         string Array[] =  {"shared","sabund","label","inputdir","outputdir"};
74                         vector<string> myArray (Array, Array+(sizeof(Array)/sizeof(string)));
75                         
76                         OptionParser parser(option);
77                         map<string,string> parameters = parser.getParameters();
78                         
79                         ValidParameters validParameter;
80                         map<string, string>::iterator it;
81                 
82                         //check to make sure all parameters are valid for command
83                         for (it = parameters.begin(); it != parameters.end(); it++) { 
84                                 if (validParameter.isValidParameter(it->first, myArray, it->second) != true) {  abort = true;  }
85                         }
86                         
87                         //initialize outputTypes
88                         vector<string> tempOutNames;
89                         outputTypes["csv"] = tempOutNames;
90                         outputTypes["summary"] = tempOutNames;
91                         
92                         //if the user changes the input directory command factory will send this info to us in the output parameter 
93                         string inputDir = validParameter.validFile(parameters, "inputdir", false);              
94                         if (inputDir == "not found"){   inputDir = "";          }
95                         else {
96                                 string path;
97                                 it = parameters.find("sabund");
98                                 //user has given a template file
99                                 if(it != parameters.end()){ 
100                                         path = m->hasPath(it->second);
101                                         //if the user has not given a path then, add inputdir. else leave path alone.
102                                         if (path == "") {       parameters["sabund"] = inputDir + it->second;           }
103                                 }
104                                 
105                                 it = parameters.find("shared");
106                                 //user has given a template file
107                                 if(it != parameters.end()){ 
108                                         path = m->hasPath(it->second);
109                                         //if the user has not given a path then, add inputdir. else leave path alone.
110                                         if (path == "") {       parameters["shared"] = inputDir + it->second;           }
111                                 }
112                         }
113
114                         //check for required parameters
115                         sabundfile = validParameter.validFile(parameters, "sabund", true);
116                         if (sabundfile == "not open") { sabundfile = ""; abort = true; }
117                         else if (sabundfile == "not found") { sabundfile = "";  }
118                         else { globaldata->setSabundFile(sabundfile); globaldata->setFormat("sabund"); }
119                         
120                         sharedfile = validParameter.validFile(parameters, "shared", true);
121                         if (sharedfile == "not open") { sharedfile = ""; abort = true; }
122                         else if (sharedfile == "not found") { sharedfile = "";   }
123                         
124                         //check for shared file loaded during read.otu
125                         if (sharedfile == "") {
126                                 if (globaldata->getSharedFile() != "") { sharedfile = globaldata->getSharedFile(); }
127                         }
128                         
129                         string label = validParameter.validFile(parameters, "label", false);                    
130                         if (label == "not found") { label = ""; }
131                         else { 
132                                 if(label != "all") {  m->splitAtDash(label, labels);  allLines = 0;  }
133                                 else { allLines = 1;  }
134                         }
135                 
136                         if ((sharedfile == "") && (sabundfile == "")) { m->mothurOut("You must provide a sabund or shared file for the catchall command."); m->mothurOutEndLine(); abort=true; }
137
138                         //if the user changes the output directory command factory will send this info to us in the output parameter 
139                         outputDir = validParameter.validFile(parameters, "outputdir", false);           
140                         if (outputDir == "not found"){  
141                                 if (sabundfile != "") {  outputDir = m->hasPath(sabundfile); }
142                                 else { outputDir = m->hasPath(sharedfile); }
143                         }
144                 }
145
146         }
147         catch(exception& e) {
148                 m->errorOut(e, "CatchAllCommand", "CatchAllCommand");
149                 exit(1);
150         }
151 }
152 //**********************************************************************************************************************
153
154 void CatchAllCommand::help(){
155         try {
156                 m->mothurOut("The catchall command interfaces mothur with the catchall program written by Linda Woodard, Sean Connolly and John Bunge.\n");
157                 m->mothurOut("For more information about catchall refer to http://www.northeastern.edu/catchall/index.html \n");
158                 m->mothurOut("The catchall executable must be in the same folder as your mothur executable. \n");
159                 m->mothurOut("If you are a MAC or Linux user you must also have installed mono, a link to mono is on the webpage. \n");
160                 m->mothurOut("The catchall command parameters are shared, sabund and label.  shared or sabund is required. \n");
161                 m->mothurOut("The label parameter is used to analyze specific labels in your input.\n");
162                 m->mothurOut("The catchall command should be in the following format: \n");
163                 m->mothurOut("catchall(sabund=yourSabundFile) \n");
164                 m->mothurOut("Example: catchall(sabund=abrecovery.fn.sabund) \n");      
165         }
166         catch(exception& e) {
167                 m->errorOut(e, "CatchAllCommand", "help");
168                 exit(1);
169         }
170 }
171
172 /**************************************************************************************/
173 int CatchAllCommand::execute() {        
174         try {
175                 
176                 if (abort == true) { return 0; }
177                 
178                 //prepare full output directory
179                 outputDir = m->getFullPathName(outputDir);
180                 
181                 //get location of catchall
182                 GlobalData* globaldata = GlobalData::getInstance();
183                 path = globaldata->argv;
184                 path = path.substr(0, (path.find_last_of('m')));
185                 path = m->getFullPathName(path);
186
187                 string catchAllCommandExe = ""; 
188                 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
189                         catchAllCommandExe += "mono " + path + "CatchAllcmdL.exe ";
190                 #else
191                         catchAllCommandExe += "\"" + path + "CatchAllcmdW.exe\"" + " ";
192                 #endif
193                 
194                 vector<string> inputFileNames;
195                 if (sharedfile != "") { inputFileNames = parseSharedFile(sharedfile);  globaldata->setFormat("sabund");  }
196                 else {  inputFileNames.push_back(sabundfile);  }                
197                 
198                 for (int p = 0; p < inputFileNames.size(); p++) {
199                         if (inputFileNames.size() > 1) {
200                                 m->mothurOutEndLine(); m->mothurOut("Processing group " + groups[p]); m->mothurOutEndLine(); m->mothurOutEndLine();
201                         }
202                         
203                         InputData* input = new InputData(inputFileNames[p], "sabund");
204                         SAbundVector* sabund = input->getSAbundVector();
205                         string lastLabel = sabund->getLabel();
206                                                         
207                         set<string> processedLabels;
208                         set<string> userLabels = labels;
209                         
210                         string summaryfilename = outputDir + m->getRootName(m->getSimpleName(inputFileNames[p])) + "catchall.summary";
211                         summaryfilename = m->getFullPathName(summaryfilename);
212                         
213                         ofstream out;
214                         m->openOutputFile(summaryfilename, out);        
215                         
216                         out << "label\tmodel\testimate\tlci\tuci" << endl;
217                         
218                         //for each label the user selected
219                         while((sabund != NULL) && ((allLines == 1) || (userLabels.size() != 0))) {
220
221                                                 
222                                 if(allLines == 1 || labels.count(sabund->getLabel()) == 1){
223                                                 m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();
224                                                 
225                                                 //create catchall input file from mothur's inputfile
226                                                 string filename = process(sabund, inputFileNames[p]);
227                                                 string outputPath = m->getPathName(filename);
228                                         
229                                                 //create system command
230                                                 string catchAllCommand = "";
231                                                 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
232                                                         catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1";
233                                                 #else
234                                                         if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); }
235                                                         catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \""  + outputPath + "\" 1";
236                                                         //wrap entire string in ""
237                                                         catchAllCommand = "\"" + catchAllCommand + "\"";
238                                                 #endif
239                                                                                 //run catchall
240                                                 system(catchAllCommand.c_str());
241                                         
242                                                 remove(filename.c_str());
243                                         
244                                                 filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .
245                                         
246                                                 outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");
247                                                 outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");
248                                                 outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");
249                                                 outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");
250                                         
251                                                 createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out);
252                                                                                         
253                                                 if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str());    }  delete input;  delete sabund;  return 0; }
254
255                                                 processedLabels.insert(sabund->getLabel());
256                                                 userLabels.erase(sabund->getLabel());
257                                 }
258                                 
259                                 if ((m->anyLabelsToProcess(sabund->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) {
260                                                 string saveLabel = sabund->getLabel();
261                                                 
262                                                 delete sabund;          
263                                                 sabund = (input->getSAbundVector(lastLabel));
264                                                 
265                                                 m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();
266                                                 
267
268                                                 //create catchall input file from mothur's inputfile
269                                                 string filename = process(sabund, inputFileNames[p]);
270                                                 string outputPath = m->getPathName(filename);
271                                                 
272                                                 //create system command
273                                                 string catchAllCommand = "";
274                                                 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
275                                                         catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1";
276                                                 #else
277                                                         if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); }
278                                                         catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \""  + outputPath + "\" 1";
279                                                         catchAllCommand = "\"" + catchAllCommand + "\"";
280                                                 #endif
281
282                                                 //run catchall
283                                                 system(catchAllCommand.c_str());
284                                         
285                                                 remove(filename.c_str());
286                                         
287                                                 filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .
288                                         
289                                                 outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");
290                                                 outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");
291                                                 outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");
292                                                 outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");
293                                         
294                                                 createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out);
295                                         
296                                                 if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str());    }  delete input;  delete sabund;  return 0; }
297
298                                                 processedLabels.insert(sabund->getLabel());
299                                                 userLabels.erase(sabund->getLabel());
300                                                 
301                                                 //restore real lastlabel to save below
302                                                 sabund->setLabel(saveLabel);
303                                 }
304                                 
305                                 
306                                 lastLabel = sabund->getLabel(); 
307                                 
308                                 delete sabund;          
309                                 sabund = (input->getSAbundVector());
310                         }
311                         
312                         //output error messages about any remaining user labels
313                         set<string>::iterator it;
314                         bool needToRun = false;
315                         for (it = userLabels.begin(); it != userLabels.end(); it++) {  
316                                 m->mothurOut("Your file does not include the label " + *it); 
317                                 if (processedLabels.count(lastLabel) != 1) {
318                                         m->mothurOut(". I will use " + lastLabel + ".");  m->mothurOutEndLine();
319                                         needToRun = true;
320                                 }else {
321                                         m->mothurOut(". Please refer to " + lastLabel + ".");  m->mothurOutEndLine();
322                                 }
323                         }
324                         
325                         //run last label if you need to
326                         if (needToRun == true)  {
327                                 if (sabund != NULL) {   delete sabund;  }
328                                 sabund = (input->getSAbundVector(lastLabel));
329                                 
330                                 m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();
331                                 
332                                 //create catchall input file from mothur's inputfile
333                                 string filename = process(sabund, inputFileNames[p]);
334                                 string outputPath = m->getPathName(filename);
335                                 
336                                 //create system command
337                                 string catchAllCommand = "";
338                                 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
339                                         catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1";
340                                 #else
341                                         if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); }
342                                         catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \""  + outputPath + "\" 1";
343                                         catchAllCommand = "\"" + catchAllCommand + "\"";
344                                 #endif
345                                 
346                                 //run catchall
347                                 system(catchAllCommand.c_str());
348                                 
349                                 remove(filename.c_str());
350                                 
351                                 filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .
352                                 
353                                 outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");
354                                 outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");
355                                 outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");
356                                 outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");        
357                                 
358                                 createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out);
359                                 
360                                 delete sabund;
361                         }
362                         
363                         out.close();
364                         delete input; 
365                         
366                         if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str()); } return 0; }
367                                 
368                 }
369                 
370                 if (sharedfile == "") {  
371                         string summaryfilename = outputDir + m->getRootName(m->getSimpleName(inputFileNames[0])) + "catchall.summary";
372                         summaryfilename = m->getFullPathName(summaryfilename);
373                         outputNames.push_back(summaryfilename); outputTypes["summary"].push_back(summaryfilename);
374                 }else { //combine summaries
375                         vector<string> sumNames;
376                         for (int i = 0; i < inputFileNames.size(); i++) {
377                                 sumNames.push_back(m->getFullPathName(outputDir + m->getRootName(m->getSimpleName(inputFileNames[i])) + "catchall.summary"));
378                         }
379                         string summaryfilename = combineSummmary(sumNames);
380                         outputNames.push_back(summaryfilename); outputTypes["summary"].push_back(summaryfilename);
381                 }
382                 
383                 m->mothurOutEndLine();
384                 m->mothurOut("Output File Names: "); m->mothurOutEndLine();
385                 for (int i = 0; i < outputNames.size(); i++) {  m->mothurOut(outputNames[i]); m->mothurOutEndLine();    }       
386                 m->mothurOutEndLine();
387                 
388
389                 return 0;
390         }
391         catch(exception& e) {
392                 m->errorOut(e, "CatchAllCommand", "execute");
393                 exit(1);
394         }
395 }
396 //**********************************************************************************************************************
397 string CatchAllCommand::process(SAbundVector* sabund, string file1) {
398         try {
399                 string filename = outputDir + m->getRootName(m->getSimpleName(file1)) + sabund->getLabel() + ".csv";
400                 filename = m->getFullPathName(filename);
401         
402                 ofstream out;
403                 m->openOutputFile(filename, out);
404                 
405                 for (int i = 1; i <= sabund->getMaxRank(); i++) {
406                         int temp = sabund->get(i);
407                         
408                         if (temp != 0) {
409                                 out << i << "," << temp << endl;
410                         }
411                 }
412                 out.close();
413                 
414                 return filename;
415         
416         }
417         catch(exception& e) {
418                 m->errorOut(e, "CatchAllCommand", "process");
419                 exit(1);
420         }
421 }
422 //*********************************************************************************************************************
423 string CatchAllCommand::combineSummmary(vector<string>& outputNames) {
424         try {
425                 
426                 ofstream out;
427                 string combineFileName = outputDir + m->getRootName(m->getSimpleName(sharedfile)) + "catchall.summary";
428                 
429                 //open combined file
430                 m->openOutputFile(combineFileName, out);
431                 
432                 out << "label\tgroup\tmodel\testimate\tlci\tuci" << endl;
433                 
434                 //open each groups summary file
435                 string newLabel = "";
436                 int numLines = 0;
437                 map<string, vector<string> > files;
438                 for (int i=0; i<outputNames.size(); i++) {
439                         vector<string> thisFilesLines;
440                         
441                         ifstream temp;
442                         m->openInputFile(outputNames[i], temp);
443                         
444                         //read through first line - labels
445                         m->getline(temp);                       
446                         m->gobble(temp);
447                         
448                         //for each label
449                         while (!temp.eof()) {
450                                 
451                                 string thisLine = "";
452                                 string tempLabel;
453                                 
454                                 for (int j = 0; j < 5; j++) {  
455                                         temp >> tempLabel; 
456                                         
457                                         //save for later
458                                         if (j == 1) { thisLine += groups[i] + "\t" + tempLabel + "\t";  }
459                                         else{  thisLine += tempLabel + "\t";    }
460                                 }
461                                 
462                                 thisLine += "\n";
463                                 
464                                 thisFilesLines.push_back(thisLine);
465                                 
466                                 m->gobble(temp);
467                         }
468                         
469                         files[outputNames[i]] = thisFilesLines;
470                         
471                         numLines = thisFilesLines.size();
472                         
473                         temp.close();
474                         remove(outputNames[i].c_str());
475                 }
476                 
477                 //for each label
478                 for (int k = 0; k < numLines; k++) {
479                         
480                         //grab summary data for each group
481                         for (int i=0; i<outputNames.size(); i++) {
482                                 out << files[outputNames[i]][k];
483                         }
484                 }       
485                 
486                 
487                 out.close();
488                 
489                 //return combine file name
490                 return combineFileName;
491                 
492         }
493         catch(exception& e) {
494                 m->errorOut(e, "CatchAllCommand", "combineSummmary");
495                 exit(1);
496         }
497 }
498 //**********************************************************************************************************************
499 int CatchAllCommand::createSummaryFile(string file1, string label, ofstream& out) {
500         try {
501                 
502                 ifstream in;
503                 int able = m->openInputFile(file1, in, "noerror");
504                 
505                 if (able == 1) {  m->mothurOut("[ERROR]: the catchall program did not run properly. Please check to make sure it is located in the same folder as your mothur executable.");m->mothurOutEndLine();  m->control_pressed = true; return 0; }
506                         
507                 if (!in.eof()) {
508                         
509                         string header = m->getline(in); m->gobble(in);
510                         
511                         int pos = header.find("Total Number of Observed Species =");
512                         string numString = "";
513                         
514                         
515                         if (pos == string::npos) { m->mothurOut("[ERROR]: cannot parse " + file1); m->mothurOutEndLine(); }
516                         else {
517                                 //pos will be the position of the T in total, so we want to count to the position of =
518                                 pos += 34;
519                                 char c=header[pos];
520                                 while (c != ','){
521                                         if (c != ' ') {
522                                                 numString += c;
523                                         }
524                                         pos++;
525                                         c=header[pos];
526                                         
527                                         //sanity check
528                                         if (pos > header.length()) { m->mothurOut("Cannot find number of OTUs in " + file1); m->mothurOutEndLine(); in.close(); return 0; }
529                                 }
530                         }
531                                                                                                                           
532                         string firstline = m->getline(in); m->gobble(in);
533                         vector<string> values;
534                         m->splitAtComma(firstline, values);
535                         
536                         values.pop_back(); //last value is always a blank string since the last character in the line is always a ','
537                         
538                         if (values.size() == 1) { //grab next line if firstline didn't have what you wanted
539                                 string secondline = m->getline(in); m->gobble(in);
540                                 values.clear();
541                                 m->splitAtComma(secondline, values);
542                                 
543                                 values.pop_back(); //last value is always a blank string since the last character in the line is always a ','
544                         }
545                         
546                         if (values.size() == 1) { //still not what we wanted fill values with numOTUs
547                                 values.resize(8, "");
548                                 values[1] = "Sobs";
549                                 values[4] = numString;
550                                 values[6] = numString;
551                                 values[7] = numString;
552                         }
553                         
554                         if (values.size() < 8) { values.resize(8, ""); }
555                         
556                         out << label << '\t' << values[1] << '\t' << values[4] << '\t' << values[6] << '\t' << values[7] << endl;
557                 }
558                 
559                 in.close();
560                 
561                 return 0;
562                 
563         }
564         catch(exception& e) {
565                 m->errorOut(e, "CatchAllCommand", "createSummaryFile");
566                 exit(1);
567         }
568 }
569 //**********************************************************************************************************************
570 vector<string> CatchAllCommand::parseSharedFile(string filename) {
571         try {
572                 vector<string> filenames;
573                 
574                 //read first line
575                 InputData* input = new InputData(filename, "sharedfile");
576                 vector<SharedRAbundVector*> lookup = input->getSharedRAbundVectors();
577                 
578                 string sharedFileRoot = outputDir + m->getRootName(m->getSimpleName(filename));
579                 
580                 //clears file before we start to write to it below
581                 for (int i=0; i<lookup.size(); i++) {
582                         remove((sharedFileRoot + lookup[i]->getGroup() + ".sabund").c_str());
583                         filenames.push_back((sharedFileRoot + lookup[i]->getGroup() + ".sabund"));
584                         groups.push_back(lookup[i]->getGroup());
585                 }
586                 
587                 while(lookup[0] != NULL) {
588                         
589                         for (int i = 0; i < lookup.size(); i++) {
590                                 SAbundVector sav = lookup[i]->getSAbundVector();
591                                 ofstream out;
592                                 m->openOutputFileAppend(sharedFileRoot + lookup[i]->getGroup() + ".sabund", out);
593                                 sav.print(out);
594                                 out.close();
595                         }
596                         
597                         for (int i = 0; i < lookup.size(); i++) {  delete lookup[i];  } 
598                         lookup = input->getSharedRAbundVectors();
599                 }
600                 
601                 delete input;
602                 
603                 return filenames;
604         }
605         catch(exception& e) {
606                 m->errorOut(e, "CatchAllCommand", "parseSharedFile");
607                 exit(1);
608         }
609 }
610 /**************************************************************************************/