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