]> git.donarmstrong.com Git - mothur.git/blob - sharedutilities.cpp
5776b3685c06b6eb7fe8e419c791b3ee6a4ecde6
[mothur.git] / sharedutilities.cpp
1 /*
2  *  sharedutilities.cpp
3  *  Mothur
4  *
5  *  Created by Sarah Westcott on 4/9/09.
6  *  Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
7  *
8  */
9
10 #include "sharedutilities.h"
11 #include "sharedrabundvector.h"
12 #include "sharedordervector.h"
13
14 /**************************************************************************************************/
15
16 void SharedUtil::getSharedVectors(vector<string> Groups, vector<SharedRAbundVector*>& lookup, SharedOrderVector* order) {
17         try {
18         
19                 //delete each sharedrabundvector in lookup
20                 for (int j = 0; j < lookup.size(); j++) {
21                         delete lookup[j];
22                 }
23                 
24                 lookup.clear();
25                 
26                 //create and initialize vector of sharedvectors, one for each group
27                 for (int i = 0; i < Groups.size(); i++) { 
28                         SharedRAbundVector* temp = new SharedRAbundVector(order->getNumBins());
29                         temp->setLabel(order->getLabel());
30                         temp->setGroup(Groups[i]);
31                         lookup.push_back(temp);
32                 }
33         
34                 int numSeqs = order->size();
35                 //sample all the members
36                 for(int i=0;i<numSeqs;i++){
37                         //get first sample
38                         individual chosen = order->get(i);
39                         int abundance; 
40                                         
41                         //set info for sharedvector in chosens group
42                         for (int j = 0; j < lookup.size(); j++) { 
43                                 if (chosen.group == lookup[j]->getGroup()) {
44                                          abundance = lookup[j]->getAbundance(chosen.bin);
45                                          lookup[j]->set(chosen.bin, (abundance + 1), chosen.group);
46                                          break;
47                                 }
48                         }
49                 }
50         }
51         catch(exception& e) {
52                 cout << "Standard Error: " << e.what() << " has occurred in the SharedUtil class Function getSharedVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
53                 exit(1);
54         }
55         catch(...) {
56                 cout << "An unknown error has occurred in the SharedUtil class function getSharedVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
57                 exit(1);
58         }
59 }
60 /**************************************************************************************************/
61
62 void SharedUtil::getSharedVectorswithReplacement(vector<string> Groups, vector<SharedRAbundVector*>& lookup, SharedOrderVector* order) {
63         try {
64         
65                 //delete each sharedrabundvector in lookup
66                 for (int j = 0; j < lookup.size(); j++) {
67                         delete lookup[j];
68                 }
69                 
70                 lookup.clear();
71                 
72                 //create and initialize vector of sharedvectors, one for each group
73                 for (int i = 0; i < Groups.size(); i++) { 
74                         SharedRAbundVector* temp = new SharedRAbundVector(order->getNumBins());
75                         temp->setLabel(order->getLabel());
76                         temp->setGroup(Groups[i]);
77                         lookup.push_back(temp);
78                 }
79         
80                 int numSeqs = order->size();
81                 
82                 //sample all the members
83                 for(int i=0;i<numSeqs;i++){
84                         //get random number
85                         int random = int((float)(i+1) * (float)(rand()) / ((float)RAND_MAX+1.0));
86                         individual chosen = order->get(random);
87
88                         int abundance; 
89                         //set info for sharedvector in chosens group
90                         for (int j = 0; j < lookup.size(); j++) { 
91                                 if (chosen.group == lookup[j]->getGroup()) {
92                                          abundance = lookup[j]->getAbundance(chosen.bin);
93                                          lookup[j]->set(chosen.bin, (abundance + 1), chosen.group);
94                                          break;
95                                 }
96                         }
97                 }
98                 
99         }
100         catch(exception& e) {
101                 cout << "Standard Error: " << e.what() << " has occurred in the SharedUtil class Function getSharedVectorswithReplacement. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
102                 exit(1);
103         }
104         catch(...) {
105                 cout << "An unknown error has occurred in the SharedUtil class function getSharedVectorswithReplacement. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
106                 exit(1);
107         }
108 }
109
110 /**************************************************************************************************/
111 //need to have mode because different commands require different number of valid groups
112 void SharedUtil::setGroups(vector<string>& userGroups, vector<string>& allGroups) {
113         try {
114 //cout << "groups size" << userGroups.size() << endl;
115                 if (userGroups.size() != 0) {
116                         if (userGroups[0] != "all") {
117                                 //check that groups are valid
118                                 for (int i = 0; i < userGroups.size(); i++) {
119                                         if (isValidGroup(userGroups[i], allGroups) != true) {
120                                                 cout << userGroups[i] << " is not a valid group, and will be disregarded." << endl;
121                                                 // erase the invalid group from userGroups
122                                                 userGroups.erase(userGroups.begin()+i);
123                                                 i--;
124                                         }
125                                 }
126                                 
127                                 //if the user only entered invalid groups
128                                 if (userGroups.size() == 0) { 
129                                         cout << "You provided no valid groups. I will run the command using all the groups in your groupfile." << endl; 
130                                         for (int i = 0; i < allGroups.size(); i++) {
131                                                 userGroups.push_back(allGroups[i]);
132                                         }
133                                 }
134
135                         }else{//user has enter "all" and wants the default groups
136                                 userGroups.clear();
137                                 for (int i = 0; i < allGroups.size(); i++) {
138                                         userGroups.push_back(allGroups[i]);
139                                 }
140                         }
141                 }else { //the user has not entered groups
142                         for (int i = 0; i < allGroups.size(); i++) {
143                                 userGroups.push_back(allGroups[i]);
144                         }
145                 }
146                         
147         }
148         catch(exception& e) {
149                 cout << "Standard Error: " << e.what() << " has occurred in the SharedUtil class Function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
150                 exit(1);
151         }
152         catch(...) {
153                 cout << "An unknown error has occurred in the SharedUtil class function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
154                 exit(1);
155         }
156
157 }
158 /**************************************************************************************************/
159 //need to have mode because different commands require different number of valid groups
160 void SharedUtil::setGroups(vector<string>& userGroups, vector<string>& allGroups, string mode) {
161         try {
162                 if (userGroups.size() != 0) {
163                         if (userGroups[0] != "all") {
164                                 //check that groups are valid
165                                 for (int i = 0; i < userGroups.size(); i++) {
166                                         if (isValidGroup(userGroups[i], allGroups) != true) {
167                                                 cout << userGroups[i] << " is not a valid group, and will be disregarded." << endl;
168                                                 // erase the invalid group from userGroups
169                                                 userGroups.erase(userGroups.begin()+i);
170                                                 i--;
171                                         }
172                                 }
173
174                         }else{//user has enter "all" and wants the default groups
175                                 userGroups.clear();
176                                 for (int i = 0; i < allGroups.size(); i++) {
177                                         userGroups.push_back(allGroups[i]);
178                                 }
179                         }
180                 }else { //the user has not entered groups
181                         for (int i = 0; i < allGroups.size(); i++) {
182                                 userGroups.push_back(allGroups[i]);
183                         }
184                 }
185                         
186                 if ((mode == "collect") || (mode == "rarefact") || (mode == "summary") || (mode == "treegroup")) {
187                                 //if the user only entered invalid groups
188                                 if ((userGroups.size() == 0) || (userGroups.size() == 1)) { 
189                                         cout << "When using the groups parameter you must have at least 2 valid groups. I will run the command using all the groups in your groupfile." << endl; 
190                                         for (int i = 0; i < allGroups.size(); i++) {
191                                                 userGroups.push_back(allGroups[i]);
192                                         }
193                                 }
194                 }
195         
196         }
197         catch(exception& e) {
198                 cout << "Standard Error: " << e.what() << " has occurred in the SharedUtil class Function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
199                 exit(1);
200         }
201         catch(...) {
202                 cout << "An unknown error has occurred in the SharedUtil class function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
203                 exit(1);
204         }
205
206 }
207
208
209 /**************************************************************************************/
210 //for parsimony and unifrac commands you set pairwise groups as well as an allgroups in calc
211 void SharedUtil::setGroups(vector<string>& userGroups, vector<string>& allGroups, string& label, int& numGroups, string mode){  //globaldata->Groups, your tree or group map, allgroups, mode
212         try {
213                 numGroups = 0;
214                 label = "";
215                 //if the user has not entered specific groups to analyze then do them all
216                 if (userGroups.size() != 0) {
217                         if (userGroups[0] != "all") {
218                                 //check that groups are valid
219                                 for (int i = 0; i < userGroups.size(); i++) {
220                                         if (isValidGroup(userGroups[i], allGroups) != true) {
221                                                 cout << userGroups[i] << " is not a valid group, and will be disregarded." << endl;
222                                                 // erase the invalid group from globaldata->Groups
223                                                 userGroups.erase(userGroups.begin()+i);
224                                                 i--;
225                                         }
226                                 }
227                         }else { //users wants all groups
228                                 userGroups.clear();
229                                 for (int i=0; i < allGroups.size(); i++) { 
230                                         if (allGroups[i] != "xxx") {
231                                                 userGroups.push_back(allGroups[i]);
232                                         }
233                                 }
234                         }
235                 }else { //the user has not entered groups
236                         for (int i=0; i < allGroups.size(); i++) { 
237                                 if (allGroups[i] != "xxx") {
238                                         if (mode == "weighted") {
239                                                 userGroups.push_back(allGroups[i]);
240                                         }else {
241                                                 numGroups = 1;
242                                                 label += allGroups[i] + "-";
243                                         }
244                                 }
245                         }
246                         //rip extra - off allgroups 
247                         label = label.substr(0, label.length()-1);
248                 }
249                 
250                 if (mode == "weighted") {
251                         //if the user only entered invalid groups
252                         if (userGroups.size() == 0) { 
253                                 for (int i=0; i < allGroups.size(); i++) { 
254                                         if (allGroups[i] != "xxx") {
255                                                 userGroups.push_back(allGroups[i]);
256                                         }
257                                 }
258                                 cout << "When using the groups parameter you must have at least 2 valid groups. I will run the command using all the groups in your groupfile." << endl; 
259                         }else if (userGroups.size() == 1) { 
260                                 cout << "When using the groups parameter you must have at least 2 valid groups. I will run the command using all the groups in your groupfile." << endl;
261                                 userGroups.clear();
262                                 for (int i=0; i < allGroups.size(); i++) { 
263                                         if (allGroups[i] != "xxx") {
264                                                 userGroups.push_back(allGroups[i]);
265                                         }
266                                 }
267                         }
268                         numGroups = userGroups.size();
269                         
270                 }else if ((mode == "unweighted") || (mode == "parsimony")) {
271                                 //if the user only entered invalid groups
272                                 if ((userGroups.size() == 0) && (numGroups == 0)) { 
273                                         cout << "When using the groups parameter you must have at least 1 valid group. I will run the command using all the groups in your groupfile." << endl; 
274                                         for (int i = 0; i < allGroups.size(); i++) {
275                                                 if (allGroups[i] != "xxx") {
276                                                         userGroups.push_back(allGroups[i]);
277                                                 }
278                                         }
279                                 }
280                                 
281                                 if (numGroups != 1) { numGroups = userGroups.size(); }
282                 }
283         }
284         catch(exception& e) {
285                 cout << "Standard Error: " << e.what() << " has occurred in the SharedUtil class Function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
286                 exit(1);
287         }
288         catch(...) {
289                 cout << "An unknown error has occurred in the SharedUtil class function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
290                 exit(1);
291         }
292 }
293 /**************************************************************************************/
294 void SharedUtil::getCombos(vector<string>& groupComb, vector<string> userGroups, int& numComp) { //groupcomb, globaldata->Groups, numcomb
295         try {
296                 //calculate number of comparisons i.e. with groups A,B,C = AB, AC, BC = 3;
297                 numComp = 0;
298                 for (int i=0; i< userGroups.size(); i++) { 
299                         numComp += i; 
300                         for (int l = i+1; l < userGroups.size(); l++) {
301                                 //set group comparison labels
302                                 groupComb.push_back(userGroups[i] + "-" + userGroups[l]);
303                         }
304                 } 
305         }
306         catch(exception& e) {
307                 cout << "Standard Error: " << e.what() << " has occurred in the SharedUtil class Function getCombos. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
308                 exit(1);
309         }
310         catch(...) {
311                 cout << "An unknown error has occurred in the SharedUtil class function getCombos. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
312                 exit(1);
313         }
314 }
315 /**************************************************************************************/
316 bool SharedUtil::isValidGroup(string groupname, vector<string> groups) {
317         try {
318                 for (int i = 0; i < groups.size(); i++) {
319                         if (groupname == groups[i]) { return true; }
320                 }
321                 
322                 return false;
323         }
324         catch(exception& e) {
325                 cout << "Standard Error: " << e.what() << " has occurred in the SharedUtil class Function isValidGroup. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
326                 exit(1);
327         }
328         catch(...) {
329                 cout << "An unknown error has occurred in the SharedUtil class function isValidGroup. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
330                 exit(1);
331         }
332 }
333
334 /**************************************************************************************/
335 void SharedUtil::updateGroupIndex(vector<string>& userGroups, map<string, int>& index) {
336         try {
337                 index.clear();
338                 for (int i = 0; i < userGroups.size(); i++) {
339                         index[userGroups[i]] = i;
340                 }
341         }
342         catch(exception& e) {
343                 cout << "Standard Error: " << e.what() << " has occurred in the SharedUtil class Function updateGroupIndex. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
344                 exit(1);
345         }
346         catch(...) {
347                 cout << "An unknown error has occurred in the SharedUtil class function updateGroupIndex. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
348                 exit(1);
349         }
350 }