]> git.donarmstrong.com Git - mothur.git/blob - venncommand.cpp
added get.rabund and get.sabund command and fixed bug introduced by line by line...
[mothur.git] / venncommand.cpp
1 /*
2  *  venncommand.cpp
3  *  Mothur
4  *
5  *  Created by Sarah Westcott on 3/30/09.
6  *  Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
7  *
8  */
9
10 #include "venncommand.h"
11 #include "ace.h"
12 #include "sobs.h"
13 #include "chao1.h"
14 //#include "jackknife.h"
15 #include "sharedsobscollectsummary.h"
16 #include "sharedchao1.h"
17 #include "sharedace.h"
18
19
20 //**********************************************************************************************************************
21
22 VennCommand::VennCommand(){
23         try {
24                 globaldata = GlobalData::getInstance();
25                 format = globaldata->getFormat();
26                 validCalculator = new ValidCalculators();
27                 
28                 int i;
29                 
30                 if (format == "list") {
31                         for (i=0; i<globaldata->Estimators.size(); i++) {
32                                 if (validCalculator->isValidCalculator("vennsingle", globaldata->Estimators[i]) == true) { 
33                                         if (globaldata->Estimators[i] == "sobs") { 
34                                                 vennCalculators.push_back(new Sobs());
35                                         }else if (globaldata->Estimators[i] == "chao") { 
36                                                 vennCalculators.push_back(new Chao1());
37                                         }else if (globaldata->Estimators[i] == "ace") {
38                                                 convert(globaldata->getAbund(), abund);
39                                                 if(abund < 5)
40                                                         abund = 10;
41                                                 vennCalculators.push_back(new Ace(abund));
42                                         //}else if (globaldata->Estimators[i] == "jack") {      
43                                                 //vennCalculators.push_back(new Jackknife());
44                                         }
45                                 }
46                         }
47                 }else {
48                         for (i=0; i<globaldata->Estimators.size(); i++) {
49                                 if (validCalculator->isValidCalculator("vennshared", globaldata->Estimators[i]) == true) { 
50                                         if (globaldata->Estimators[i] == "sharedsobs") { 
51                                                 vennCalculators.push_back(new SharedSobsCS());
52                                         }else if (globaldata->Estimators[i] == "sharedchao") { 
53                                                 vennCalculators.push_back(new SharedChao1());
54                                         }else if (globaldata->Estimators[i] == "sharedace") { 
55                                                 vennCalculators.push_back(new SharedAce());
56                                         }
57                                 }
58                         }
59                 }
60                 
61                 venn = new Venn();
62                 
63                 //reset calc for next command
64                 globaldata->setCalc("");
65
66                 
67         }
68         catch(exception& e) {
69                 cout << "Standard Error: " << e.what() << " has occurred in the VennCommand class Function VennCommand. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
70                 exit(1);
71         }
72         catch(...) {
73                 cout << "An unknown error has occurred in the VennCommand class function VennCommand. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
74                 exit(1);
75         }       
76 }
77 //**********************************************************************************************************************
78
79 VennCommand::~VennCommand(){
80         delete input;
81         delete read;
82         delete venn;
83         for (int i = 0; i < vennCalculators.size(); i++) {      delete vennCalculators[i];      }
84 }
85
86 //**********************************************************************************************************************
87
88 int VennCommand::execute(){
89         try {
90                 int count = 1;
91                 SAbundVector* lastSAbund;
92                 vector<SharedRAbundVector*> lastLookup; 
93                 
94                 //if the users entered no valid calculators don't execute command
95                 if (vennCalculators.size() == 0) { return 0; }
96                 
97                 if (format == "sharedfile") {
98                         //you have groups
99                         read = new ReadOTUFile(globaldata->inputFileName);      
100                         read->read(&*globaldata); 
101                         
102                         input = globaldata->ginput;
103                         lookup = input->getSharedRAbundVectors();
104                         lastLookup = lookup;
105                 }else if (format == "list") {
106                         //you are using just a list file and have only one group
107                         read = new ReadOTUFile(globaldata->inputFileName);      
108                         read->read(&*globaldata); 
109                 
110                         sabund = globaldata->sabund;
111                         lastSAbund = globaldata->sabund;
112                         input = globaldata->ginput;
113                 }
114                 
115                 //if the users enters label "0.06" and there is no "0.06" in their file use the next lowest label.
116                 set<string> processedLabels;
117                 set<string> userLabels = globaldata->labels;
118                 set<int> userLines = globaldata->lines;
119                 
120                 if (format != "list") { 
121                         
122                         //as long as you are not at the end of the file or done wih the lines you want
123                         while((lookup[0] != NULL) && ((globaldata->allLines == 1) || (userLabels.size() != 0) || (userLines.size() != 0))) {
124                 
125                                 if(globaldata->allLines == 1 || globaldata->lines.count(count) == 1 || globaldata->labels.count(lookup[0]->getLabel()) == 1){                   
126                                         cout << lookup[0]->getLabel() << '\t' << count << endl;
127                                         processedLabels.insert(lookup[0]->getLabel());
128                                         userLabels.erase(lookup[0]->getLabel());
129                                         userLines.erase(count);
130                                         
131                                         if (lookup.size() > 4) {
132                                                 cout << "Error: Too many groups chosen.  You may use up to 4 groups with the venn command.  I will use the first four groups in your groupfile." << endl;
133                                                 for (int i = lookup.size(); i > 4; i--) { lookup.pop_back(); } //no memmory leak because pop_back calls destructor
134                                         }
135                                         venn->getPic(lookup, vennCalculators);
136                                 }
137                                 
138                                 if ((anyLabelsToProcess(lookup[0]->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLookup[0]->getLabel()) != 1)) {
139                                         cout << lastLookup[0]->getLabel() << '\t' << count << endl;
140                                         processedLabels.insert(lastLookup[0]->getLabel());
141                                         userLabels.erase(lastLookup[0]->getLabel());
142
143                                         if (lastLookup.size() > 4) {
144                                                 cout << "Error: Too many groups chosen.  You may use up to 4 groups with the venn command.  I will use the first four groups in your groupfile." << endl;
145                                                 for (int i = lastLookup.size(); i > 4; i--) { lastLookup.pop_back(); } //no memmory leak because pop_back calls destructor
146                                         }                               
147                                         venn->getPic(lastLookup, vennCalculators);
148                                 }
149                                 
150                                 //prevent memory leak
151                                 if (count != 1) { for (int i = 0; i < lastLookup.size(); i++) {  delete lastLookup[i];  } }
152                                 lastLookup = lookup;    
153                                                 
154                                 //get next line to process
155                                 lookup = input->getSharedRAbundVectors();
156                                 count++;
157                         }
158                         
159                         //output error messages about any remaining user labels
160                         set<string>::iterator it;
161                         bool needToRun = false;
162                         for (it = userLabels.begin(); it != userLabels.end(); it++) {  
163                                 cout << "Your file does not include the label "<< *it; 
164                                 if (processedLabels.count(lastLookup[0]->getLabel()) != 1) {
165                                         cout << ". I will use " << lastLookup[0]->getLabel() << "." << endl;
166                                         needToRun = true;
167                                 }else {
168                                         cout << ". Please refer to " << lastLookup[0]->getLabel() << "." << endl;
169                                 }
170                         }
171                 
172                         //run last line if you need to
173                         if (needToRun == true)  {
174                                 cout << lastLookup[0]->getLabel() << '\t' << count << endl;
175                                 if (lastLookup.size() > 4) {
176                                         cout << "Error: Too many groups chosen.  You may use up to 4 groups with the venn command.  I will use the first four groups in your groupfile." << endl;
177                                         for (int i = lastLookup.size(); i > 3; i--) { delete lastLookup[i]; lastLookup.pop_back(); }
178                                 }                               
179                                 venn->getPic(lastLookup, vennCalculators);
180                         }
181                 
182                         for (int i = 0; i < lastLookup.size(); i++) {  delete lastLookup[i];  }
183
184                         //reset groups parameter
185                         globaldata->Groups.clear();  
186                         
187                 }else{
188                 
189                         while((sabund != NULL) && ((globaldata->allLines == 1) || (userLabels.size() != 0) || (userLines.size() != 0))) {
190                 
191                                 if(globaldata->allLines == 1 || globaldata->lines.count(count) == 1 || globaldata->labels.count(sabund->getLabel()) == 1){                      
192         
193                                         cout << sabund->getLabel() << '\t' << count << endl;
194                                         venn->getPic(sabund, vennCalculators);
195                                         
196                                         processedLabels.insert(sabund->getLabel());
197                                         userLabels.erase(sabund->getLabel());
198                                         userLines.erase(count);
199                                 }
200                                 
201                                 if ((anyLabelsToProcess(sabund->getLabel(), userLabels, "") == true) && (processedLabels.count(lastSAbund->getLabel()) != 1)) {
202
203                                         cout << lastSAbund->getLabel() << '\t' << count << endl;
204                                         venn->getPic(lastSAbund, vennCalculators);
205                                         
206                                         processedLabels.insert(lastSAbund->getLabel());
207                                         userLabels.erase(lastSAbund->getLabel());
208                                 }               
209                                 
210                                 if (count != 1) { delete lastSAbund; }
211                                 lastSAbund = sabund;                    
212
213                                 sabund = input->getSAbundVector();
214                                 count++;
215                         }
216                         
217                         //output error messages about any remaining user labels
218                         set<string>::iterator it;
219                         bool needToRun = false;
220                         for (it = userLabels.begin(); it != userLabels.end(); it++) {  
221                                 cout << "Your file does not include the label "<< *it; 
222                                 if (processedLabels.count(lastSAbund->getLabel()) != 1) {
223                                         cout << ". I will use " << lastSAbund->getLabel() << "." << endl;
224                                         needToRun = true;
225                                 }else {
226                                         cout << ". Please refer to " << lastSAbund->getLabel() << "." << endl;
227                                 }
228                         }
229                 
230                         //run last line if you need to
231                         if (needToRun == true)  {
232                                 cout << lastSAbund->getLabel() << '\t' << count << endl;
233                                 venn->getPic(lastSAbund, vennCalculators);
234                         }
235                         delete lastSAbund;
236                 }
237                 
238                 
239                 globaldata->setGroups("");
240                 return 0;
241         }
242         catch(exception& e) {
243                 cout << "Standard Error: " << e.what() << " has occurred in the VennCommand class Function execute. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
244                 exit(1);
245         }
246         catch(...) {
247                 cout << "An unknown error has occurred in the VennCommand class function execute. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
248                 exit(1);
249         }               
250 }
251
252 //**********************************************************************************************************************