]> git.donarmstrong.com Git - mothur.git/blob - listvector.cpp
Revert to previous commit
[mothur.git] / listvector.cpp
1 /*
2  *  list.cpp
3  *  
4  *
5  *  Created by Pat Schloss on 8/8/08.
6  *  Copyright 2008 Patrick D. Schloss. All rights reserved.
7  *
8  */
9
10
11 #include "sabundvector.hpp"
12 #include "rabundvector.hpp"
13 #include "ordervector.hpp"
14 #include "listvector.hpp"
15
16
17 /***********************************************************************/
18
19 ListVector::ListVector() : DataVector(), maxRank(0), numBins(0), numSeqs(0){}
20
21 /***********************************************************************/
22
23 ListVector::ListVector(int n):  DataVector(), data(n, "") , maxRank(0), numBins(0), numSeqs(0){}
24
25 /***********************************************************************/
26
27 ListVector::ListVector(string id, vector<string> lv) : DataVector(id), data(lv){
28         try {
29                 for(int i=0;i<data.size();i++){
30                         if(data[i] != ""){
31                                 int binSize = m->getNumNames(data[i]);
32                                 numBins = i+1;
33                                 if(binSize > maxRank)   {       maxRank = binSize;      }
34                                 numSeqs += binSize;
35                         }
36                 }
37         }
38         catch(exception& e) {
39                 m->errorOut(e, "ListVector", "ListVector");
40                 exit(1);
41         }
42 }
43
44 /**********************************************************************/
45
46 ListVector::ListVector(ifstream& f) : DataVector(), maxRank(0), numBins(0), numSeqs(0) {
47         try {
48                 int hold;
49                 f >> label >> hold;
50         
51                 data.assign(hold, "");
52                 string inputData = "";
53         
54                 for(int i=0;i<hold;i++){
55                         f >> inputData;
56                         set(i, inputData);
57                 }
58                 m->gobble(f);
59         }
60         catch(exception& e) {
61                 m->errorOut(e, "ListVector", "ListVector");
62                 exit(1);
63         }
64 }
65
66 /***********************************************************************/
67
68 void ListVector::set(int binNumber, string seqNames){
69         try {
70                 int nNames_old = m->getNumNames(data[binNumber]);
71                 data[binNumber] = seqNames;
72                 int nNames_new = m->getNumNames(seqNames);
73         
74                 if(nNames_old == 0)                     {       numBins++;                              }
75                 if(nNames_new == 0)                     {       numBins--;                              }
76                 if(nNames_new > maxRank)        {       maxRank = nNames_new;   }
77         
78                 numSeqs += (nNames_new - nNames_old);
79         }
80         catch(exception& e) {
81                 m->errorOut(e, "ListVector", "set");
82                 exit(1);
83         }
84 }
85
86 /***********************************************************************/
87
88 string ListVector::get(int index){
89         return data[index];
90 }
91
92 /***********************************************************************/
93
94 void ListVector::push_back(string seqNames){
95         try {
96                 data.push_back(seqNames);
97                 int nNames = m->getNumNames(seqNames);
98         
99                 numBins++;
100         
101                 if(nNames > maxRank)    {       maxRank = nNames;       }
102         
103                 numSeqs += nNames;
104         }
105         catch(exception& e) {
106                 m->errorOut(e, "ListVector", "push_back");
107                 exit(1);
108         }
109 }
110
111 /***********************************************************************/
112
113 void ListVector::resize(int size){
114         data.resize(size);              
115 }
116
117 /***********************************************************************/
118
119 int ListVector::size(){
120         return data.size();
121 }
122 /***********************************************************************/
123
124 void ListVector::clear(){
125         numBins = 0;
126         maxRank = 0;
127         numSeqs = 0;
128         return data.clear();
129         
130 }
131
132 /***********************************************************************/
133
134 void ListVector::print(ostream& output){
135         try {
136                 output << label << '\t' << numBins << '\t';
137         
138                 for(int i=0;i<data.size();i++){
139                         if(data[i] != ""){
140                                 output << data[i] << '\t';
141                         }
142                 }
143                 output << endl;
144         }
145         catch(exception& e) {
146                 m->errorOut(e, "ListVector", "print");
147                 exit(1);
148         }
149 }
150
151
152 /***********************************************************************/
153
154 RAbundVector ListVector::getRAbundVector(){
155         try {
156                 RAbundVector rav;
157         
158                 for(int i=0;i<data.size();i++){
159                         int binSize = m->getNumNames(data[i]);
160                         rav.push_back(binSize);
161                 }
162         
163         //  This was here before to output data in a nice format, but it screws up the name mapping steps
164         //      sort(rav.rbegin(), rav.rend());
165         //      
166         //      for(int i=data.size()-1;i>=0;i--){
167         //              if(rav.get(i) == 0){    rav.pop_back(); }
168         //              else{
169         //                      break;
170         //              }
171         //      }
172                 rav.setLabel(label);
173         
174                 return rav;
175         }
176         catch(exception& e) {
177                 m->errorOut(e, "ListVector", "getRAbundVector");
178                 exit(1);
179         }
180 }
181
182 /***********************************************************************/
183
184 SAbundVector ListVector::getSAbundVector(){
185         try {
186                 SAbundVector sav(maxRank+1);
187         
188                 for(int i=0;i<data.size();i++){
189                         int binSize = m->getNumNames(data[i]);  
190                         sav.set(binSize, sav.get(binSize) + 1); 
191                 }
192                 sav.set(0, 0);
193                 sav.setLabel(label);
194         
195                 return sav;
196         }
197         catch(exception& e) {
198                 m->errorOut(e, "ListVector", "getSAbundVector");
199                 exit(1);
200         }
201 }
202
203 /***********************************************************************/
204
205 OrderVector ListVector::getOrderVector(map<string,int>* orderMap = NULL){
206         
207         try {
208                 if(orderMap == NULL){
209                         OrderVector ov;
210                 
211                         for(int i=0;i<data.size();i++){
212                                 int binSize = m->getNumNames(data[i]);          
213                                 for(int j=0;j<binSize;j++){
214                                         ov.push_back(i);
215                                 }
216                         }
217                         random_shuffle(ov.begin(), ov.end());
218                         ov.setLabel(label);
219                         ov.getNumBins();
220                 
221                         return ov;
222                 
223                 }
224                 else{
225                         OrderVector ov(numSeqs);
226                 
227                         for(int i=0;i<data.size();i++){
228                                 string listOTU = data[i];
229                                 int length = listOTU.size();
230                                 
231                                 string seqName="";
232                         
233                                 for(int j=0;j<length;j++){
234                                 
235                                         if(listOTU[j] != ','){
236                                                 seqName += listOTU[j];
237                                         }
238                                         else{
239                                                 if(orderMap->count(seqName) == 0){
240                                                         m->mothurOut(seqName + " not found, check *.names file\n");
241                                                         exit(1);
242                                                 }
243                                         
244                                                 ov.set((*orderMap)[seqName], i);
245                                                 seqName = "";
246                                         }                                               
247                                 }
248                         
249                                 if(orderMap->count(seqName) == 0){
250                                         m->mothurOut(seqName + " not found, check *.names file\n");
251                                         exit(1);
252                                 }
253                                 ov.set((*orderMap)[seqName], i);        
254                         }
255                 
256                         ov.setLabel(label);
257                         ov.getNumBins();
258                 
259                         return ov;              
260                 }
261         }
262         catch(exception& e) {
263                 m->errorOut(e, "ListVector", "getOrderVector");
264                 exit(1);
265         }
266 }
267
268 /***********************************************************************/