]> git.donarmstrong.com Git - mothur.git/blob - collectsharedcommand.cpp
broke up globaldata and moved error checking and help into commands
[mothur.git] / collectsharedcommand.cpp
1 /*
2  *  collectsharedcommand.cpp
3  *  Dotur
4  *
5  *  Created by Sarah Westcott on 1/2/09.
6  *  Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
7  *
8  */
9
10 #include "collectsharedcommand.h"
11 #include "sharedsobscollectsummary.h"
12 #include "sharedchao1.h"
13 #include "sharedace.h"
14 #include "sharedjabund.h"
15 #include "sharedsorabund.h"
16 #include "sharedjclass.h"
17 #include "sharedsorclass.h"
18 #include "sharedjest.h"
19 #include "sharedsorest.h"
20 #include "sharedthetayc.h"
21 #include "sharedthetan.h"
22 #include "sharedkstest.h"
23 #include "whittaker.h"
24 #include "sharednseqs.h"
25 #include "sharedochiai.h"
26 #include "sharedanderbergs.h"
27 #include "sharedkulczynski.h"
28 #include "sharedkulczynskicody.h"
29 #include "sharedlennon.h"
30 #include "sharedmorisitahorn.h"
31 #include "sharedbraycurtis.h"
32 #include "sharedjackknife.h"
33 #include "whittaker.h"
34
35
36
37 //**********************************************************************************************************************
38
39 CollectSharedCommand::CollectSharedCommand(string option){
40         try {
41                 globaldata = GlobalData::getInstance();
42                 abort = false;
43                 allLines = 1;
44                 lines.clear();
45                 labels.clear();
46                 Estimators.clear();
47                 
48                 //allow user to run help
49                 if(option == "help") { validCalculator = new ValidCalculators(); help(); abort = true; }
50                 
51                 else {
52                         //valid paramters for this command
53                         string Array[] =  {"freq","line","label","calc","groups"};
54                         vector<string> myArray (Array, Array+(sizeof(Array)/sizeof(string)));
55                         
56                         parser = new OptionParser();
57                         parser->parse(option, parameters);  delete parser;
58                         
59                         ValidParameters* validParameter = new ValidParameters();
60                 
61                         //check to make sure all parameters are valid for command
62                         for (it = parameters.begin(); it != parameters.end(); it++) { 
63                                 if (validParameter->isValidParameter(it->first, myArray, it->second) != true) {  abort = true;  }
64                         }
65                         
66                         //make sure the user has already run the read.otu command
67                         if (globaldata->getSharedFile() == "") {
68                                 if (globaldata->getListFile() == "") { cout << "You must read a list and a group, or a shared before you can use the collect.shared command." << endl; abort = true; }
69                                 else if (globaldata->getGroupFile() == "") { cout << "You must read a list and a group, or a shared before you can use the collect.shared command." << endl; abort = true; }
70                         }
71
72                         
73                         //check for optional parameter and set defaults
74                         // ...at some point should added some additional type checking...
75                         line = validParameter->validFile(parameters, "line", false);                            
76                         if (line == "not found") { line = "";  }
77                         else { 
78                                 if(line != "all") {  splitAtDash(line, lines);  allLines = 0;  }
79                                 else { allLines = 1;  }
80                         }
81                         
82                         label = validParameter->validFile(parameters, "label", false);                  
83                         if (label == "not found") { label = ""; }
84                         else { 
85                                 if(label != "all") {  splitAtDash(label, labels);  allLines = 0;  }
86                                 else { allLines = 1;  }
87                         }
88                         
89                         //make sure user did not use both the line and label parameters
90                         if ((line != "") && (label != "")) { cout << "You cannot use both the line and label parameters at the same time. " << endl; abort = true; }
91                         //if the user has not specified any line or labels use the ones from read.otu
92                         else if((line == "") && (label == "")) {  
93                                 allLines = globaldata->allLines; 
94                                 labels = globaldata->labels; 
95                                 lines = globaldata->lines;
96                         }
97                                 
98                         calc = validParameter->validFile(parameters, "calc", false);                    
99                         if (calc == "not found") { calc = "sharedsobs-sharedchao-sharedace-jabund-sorabund-jclass-sorclass-jest-sorest-thetayc-thetan";  }
100                         else { 
101                                  if (calc == "default")  {  calc = "sharedsobs-sharedchao-sharedace-jabund-sorabund-jclass-sorclass-jest-sorest-thetayc-thetan";  }
102                         }
103                         splitAtDash(calc, Estimators);
104                         
105                         groups = validParameter->validFile(parameters, "groups", false);                        
106                         if (groups == "not found") { groups = ""; }
107                         else { 
108                                 splitAtDash(groups, Groups);
109                                 globaldata->Groups = Groups;
110                         }
111                         
112                         string temp;
113                         temp = validParameter->validFile(parameters, "freq", false);                    if (temp == "not found") { temp = "100"; }
114                         convert(temp, freq); 
115                         
116                         delete validParameter;
117                         
118                         if (abort == false) {
119                         
120                                 string fileNameRoot = getRootName(globaldata->inputFileName);
121                                 format = globaldata->getFormat();
122                                 int i;
123                                 
124                                 validCalculator = new ValidCalculators();
125                                 util = new SharedUtil();
126                                 
127                                 for (i=0; i<Estimators.size(); i++) {
128                                         if (validCalculator->isValidCalculator("shared", Estimators[i]) == true) { 
129                                                 if (Estimators[i] == "sharedchao") { 
130                                                         cDisplays.push_back(new CollectDisplay(new SharedChao1(), new SharedOneColumnFile(fileNameRoot+"shared.chao")));
131                                                 }else if (Estimators[i] == "sharedsobs") { 
132                                                         cDisplays.push_back(new CollectDisplay(new SharedSobsCS(), new SharedOneColumnFile(fileNameRoot+"shared.sobs")));
133                                                 }else if (Estimators[i] == "sharedace") { 
134                                                         cDisplays.push_back(new CollectDisplay(new SharedAce(), new SharedOneColumnFile(fileNameRoot+"shared.ace")));
135                                                 }else if (Estimators[i] == "jabund") {  
136                                                         cDisplays.push_back(new CollectDisplay(new JAbund(), new SharedOneColumnFile(fileNameRoot+"jabund")));
137                                                 }else if (Estimators[i] == "sorabund") { 
138                                                         cDisplays.push_back(new CollectDisplay(new SorAbund(), new SharedOneColumnFile(fileNameRoot+"sorabund")));
139                                                 }else if (Estimators[i] == "jclass") { 
140                                                         cDisplays.push_back(new CollectDisplay(new Jclass(), new SharedOneColumnFile(fileNameRoot+"jclass")));
141                                                 }else if (Estimators[i] == "sorclass") { 
142                                                         cDisplays.push_back(new CollectDisplay(new SorClass(), new SharedOneColumnFile(fileNameRoot+"sorclass")));
143                                                 }else if (Estimators[i] == "jest") { 
144                                                         cDisplays.push_back(new CollectDisplay(new Jest(), new SharedOneColumnFile(fileNameRoot+"jest")));
145                                                 }else if (Estimators[i] == "sorest") { 
146                                                         cDisplays.push_back(new CollectDisplay(new SorEst(), new SharedOneColumnFile(fileNameRoot+"sorest")));
147                                                 }else if (Estimators[i] == "thetayc") { 
148                                                         cDisplays.push_back(new CollectDisplay(new ThetaYC(), new SharedOneColumnFile(fileNameRoot+"thetayc")));
149                                                 }else if (Estimators[i] == "thetan") { 
150                                                         cDisplays.push_back(new CollectDisplay(new ThetaN(), new SharedOneColumnFile(fileNameRoot+"thetan")));
151                                                 }else if (Estimators[i] == "kstest") { 
152                                                         cDisplays.push_back(new CollectDisplay(new KSTest(), new SharedOneColumnFile(fileNameRoot+"kstest")));
153                                                 }else if (Estimators[i] == "whittaker") { 
154                                                         cDisplays.push_back(new CollectDisplay(new Whittaker(), new SharedOneColumnFile(fileNameRoot+"whittaker")));
155                                                 }else if (Estimators[i] == "sharednseqs") { 
156                                                         cDisplays.push_back(new CollectDisplay(new SharedNSeqs(), new SharedOneColumnFile(fileNameRoot+"shared.nseqs")));
157                                                 }else if (Estimators[i] == "ochiai") { 
158                                                         cDisplays.push_back(new CollectDisplay(new Ochiai(), new SharedOneColumnFile(fileNameRoot+"ochiai")));
159                                                 }else if (Estimators[i] == "anderberg") { 
160                                                         cDisplays.push_back(new CollectDisplay(new Anderberg(), new SharedOneColumnFile(fileNameRoot+"anderberg")));
161                                                 }else if (Estimators[i] == "skulczynski") { 
162                                                         cDisplays.push_back(new CollectDisplay(new Kulczynski(), new SharedOneColumnFile(fileNameRoot+"kulczynski")));
163                                                 }else if (Estimators[i] == "kulczynskicody") { 
164                                                         cDisplays.push_back(new CollectDisplay(new KulczynskiCody(), new SharedOneColumnFile(fileNameRoot+"kulczynskicody")));
165                                                 }else if (Estimators[i] == "lennon") { 
166                                                         cDisplays.push_back(new CollectDisplay(new Lennon(), new SharedOneColumnFile(fileNameRoot+"lennon")));
167                                                 }else if (Estimators[i] == "morisitahorn") { 
168                                                         cDisplays.push_back(new CollectDisplay(new MorHorn(), new SharedOneColumnFile(fileNameRoot+"morisitahorn")));
169                                                 }else if (Estimators[i] == "braycurtis") { 
170                                                         cDisplays.push_back(new CollectDisplay(new BrayCurtis(), new SharedOneColumnFile(fileNameRoot+"braycurtis")));
171                                                 }
172                                         }
173                                 }       
174                         }
175                 }
176
177         }
178         catch(exception& e) {
179                 cout << "Standard Error: " << e.what() << " has occurred in the CollectSharedCommand class Function CollectSharedCommand. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
180                 exit(1);
181         }
182         catch(...) {
183                 cout << "An unknown error has occurred in the CollectSharedCommand class function CollectSharedCommand. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
184                 exit(1);
185         }       
186                         
187 }
188 //**********************************************************************************************************************
189
190 void CollectSharedCommand::help(){
191         try {
192                 cout << "The collect.shared command can only be executed after a successful read.otu command." << "\n";
193                 cout << "The collect.shared command parameters are label, line, freq, calc and groups.  No parameters are required, but you may not use " << "\n";
194                 cout << "both the line and label parameters at the same time. The collect.shared command should be in the following format: " << "\n";
195                 cout << "collect.shared(label=yourLabel, line=yourLines, freq=yourFreq, calc=yourEstimators, groups=yourGroups)." << "\n";
196                 cout << "Example collect.shared(label=unique-.01-.03, line=0-5-10, freq=10, groups=B-C, calc=sharedchao-sharedace-jabund-sorensonabund-jclass-sorclass-jest-sorest-thetayc-thetan)." << "\n";
197                 cout << "The default values for freq is 100 and calc are sharedsobs-sharedchao-sharedace-jabund-sorensonabund-jclass-sorclass-jest-sorest-thetayc-thetan." << "\n";
198                 cout << "The default value for groups is all the groups in your groupfile." << "\n";
199                 validCalculator->printCalc("shared", cout);
200                 cout << "The label and line parameters are used to analyze specific lines in your input." << "\n";
201                 cout << "The groups parameter allows you to specify which of the groups in your groupfile you would like analyzed.  You must enter at least 2 valid groups." << "\n";
202                 cout << "Note: No spaces between parameter labels (i.e. list), '=' and parameters (i.e.yourListfile)." << "\n" << "\n";
203                 
204         }
205         catch(exception& e) {
206                 cout << "Standard Error: " << e.what() << " has occurred in the CollectSharedCommand class Function help. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
207                 exit(1);
208         }
209         catch(...) {
210                 cout << "An unknown error has occurred in the CollectSharedCommand class function help. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
211                 exit(1);
212         }       
213 }
214
215 //**********************************************************************************************************************
216
217 CollectSharedCommand::~CollectSharedCommand(){
218         delete order;
219         delete input;
220         delete cCurve;
221         delete read;
222         delete util;
223         delete validCalculator;
224 }
225
226 //**********************************************************************************************************************
227
228 int CollectSharedCommand::execute(){
229         try {
230                 
231                 if (abort == true) {    return 0;       }
232                 
233                 int count = 1;
234                 
235                 //if the users entered no valid calculators don't execute command
236                 if (cDisplays.size() == 0) { return 0; }
237                 
238                 read = new ReadOTUFile(globaldata->inputFileName);      
239                 read->read(&*globaldata); 
240                         
241                 input = globaldata->ginput;
242                 order = input->getSharedOrderVector();
243                 SharedOrderVector* lastOrder = order;
244                 
245                 //if the users enters label "0.06" and there is no "0.06" in their file use the next lowest label.
246                 set<string> processedLabels;
247                 set<string> userLabels = globaldata->labels;
248                 set<int> userLines = globaldata->lines;
249                                 
250                 //set users groups
251                 util->setGroups(globaldata->Groups, globaldata->gGroupmap->namesOfGroups, "collect");
252                 util->updateGroupIndex(globaldata->Groups, globaldata->gGroupmap->groupIndex);
253
254                 while((order != NULL) && ((globaldata->allLines == 1) || (userLabels.size() != 0) || (userLines.size() != 0))) {
255
256                         if(globaldata->allLines == 1 || globaldata->lines.count(count) == 1 || globaldata->labels.count(order->getLabel()) == 1){
257                                 
258                                 //create collectors curve
259                                 cCurve = new Collect(order, cDisplays);
260                                 cCurve->getSharedCurve(freq);
261                                 delete cCurve;
262                         
263                                 cout << order->getLabel() << '\t' << count << endl;
264                                 processedLabels.insert(order->getLabel());
265                                 userLabels.erase(order->getLabel());
266                                 userLines.erase(count);
267
268                         //you have a label the user want that is smaller than this line and the last line has not already been processed 
269                         }
270                         
271                         if ((anyLabelsToProcess(order->getLabel(), userLabels, "") == true) && (processedLabels.count(lastOrder->getLabel()) != 1)) {
272                                 //create collectors curve
273                                 cCurve = new Collect(lastOrder, cDisplays);
274                                 cCurve->getSharedCurve(freq);
275                                 delete cCurve;
276                         
277                                 cout << lastOrder->getLabel() << '\t' << count << endl;
278                                 processedLabels.insert(lastOrder->getLabel());
279                                 userLabels.erase(lastOrder->getLabel());
280                         }
281                         
282                         if (count != 1) { delete lastOrder; }
283                         lastOrder = order;                      
284                         
285                         //get next line to process
286                         order = input->getSharedOrderVector();
287                         count++;
288                 }
289                 
290                 //output error messages about any remaining user labels
291                 set<string>::iterator it;
292                 bool needToRun = false;
293                 for (it = userLabels.begin(); it != userLabels.end(); it++) {  
294                         cout << "Your file does not include the label "<< *it; 
295                         if (processedLabels.count(lastOrder->getLabel()) != 1) {
296                                 cout << ". I will use " << lastOrder->getLabel() << "." << endl;
297                                 needToRun = true;
298                         }else {
299                                 cout << ". Please refer to " << lastOrder->getLabel() << "." << endl;
300                         }
301                 }
302                 
303                 //run last line if you need to
304                 if (needToRun == true)  {
305                         cCurve = new Collect(lastOrder, cDisplays);
306                         cCurve->getCurve(freq);
307                         delete cCurve;
308                         
309                         cout << lastOrder->getLabel() << '\t' << count << endl;
310                 }
311                 
312                 delete lastOrder;
313                 for(int i=0;i<cDisplays.size();i++){    delete cDisplays[i];    }       
314                 
315                 //reset groups parameter
316                 globaldata->Groups.clear(); 
317                 
318                 return 0;
319         }
320         catch(exception& e) {
321                 cout << "Standard Error: " << e.what() << " has occurred in the CollectSharedCommand class Function execute. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
322                 exit(1);
323         }
324         catch(...) {
325                 cout << "An unknown error has occurred in the CollectSharedCommand class function execute. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
326                 exit(1);
327         }       
328 }
329
330 /***********************************************************/
331