]> git.donarmstrong.com Git - mothur.git/blob - ordervector.cpp
changes while testing
[mothur.git] / ordervector.cpp
1 /*
2  *  order.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 #include "ordervector.hpp"
11
12
13 /***********************************************************************/
14
15 OrderVector::OrderVector() : DataVector() {}
16
17 /***********************************************************************/
18
19 //OrderVector::OrderVector(int ns) : DataVector(), data(ns, -1) {}
20
21 /***********************************************************************/
22
23 OrderVector::OrderVector(string id, vector<int> ov) : 
24                                                                                         DataVector(id), data(ov)
25 {
26         updateStats();  
27 }
28
29 /***********************************************************************/
30
31 OrderVector::OrderVector(ifstream& f) : DataVector() {
32         try {
33                 int hold;
34         
35                 f >> label;
36                 f >> hold;
37         
38                 data.assign(hold, -1);
39         
40                 int inputData;
41         
42                 for(int i=0;i<hold;i++){
43                         f >> inputData;
44                         set(i, inputData);
45                 }
46         
47                 updateStats();
48         }
49         catch(exception& e) {
50                 m->errorOut(e, "OrderVector", "OrderVector");
51                 exit(1);
52         }
53 }
54
55 /***********************************************************************/
56
57
58 int OrderVector::getNumBins(){
59         if(needToUpdate == 1){  updateStats();  }
60         return numBins;
61 }
62
63 /***********************************************************************/
64
65 int OrderVector::getNumSeqs(){
66         if(needToUpdate == 1){  updateStats();  }
67         return numSeqs;
68 }
69
70 /***********************************************************************/
71
72 int OrderVector::getMaxRank(){
73         if(needToUpdate == 1){  updateStats();  }
74         return maxRank;
75 }
76 /***********************************************************************/
77
78 void OrderVector::clear(){
79         numBins = 0;
80         maxRank = 0;
81         numSeqs = 0;
82         data.clear();
83 }
84 /***********************************************************************/
85
86
87
88 void OrderVector::set(int index, int binNumber){
89         
90         data[index] = binNumber;
91         needToUpdate = 1;
92         
93 }
94
95 /***********************************************************************/
96
97 int OrderVector::get(int index){
98         return data[index];                     
99 }
100
101 /***********************************************************************/
102
103 void OrderVector::push_back(int index){
104
105         data.push_back(index);
106         needToUpdate = 1;
107         
108 }
109
110 /***********************************************************************/
111
112 void OrderVector::print(ostream& output){
113         try {
114                 output << label << '\t' << numSeqs << '\t';
115         
116                 for(int i=0;i<data.size();i++){
117                         output << data[i] << '\t';
118                 }
119                 output << endl;
120         }
121         catch(exception& e) {
122                 m->errorOut(e, "OrderVector", "print");
123                 exit(1);
124         }
125 }
126
127 /***********************************************************************/
128
129 void OrderVector::print(string prefix, ostream& output){
130         try {
131                 output << prefix << '\t' << numSeqs << '\t';
132         
133                 for(int i=0;i<numSeqs;i++){
134                         output << data[i] << '\t';
135                 }
136                 output << endl;
137         }
138         catch(exception& e) {
139                 m->errorOut(e, "OrderVector", "print");
140                 exit(1);
141         }
142 }
143
144 /***********************************************************************/
145
146 void OrderVector::resize(int){
147         m->mothurOut("resize() did nothing in class OrderVector");
148 }
149
150 /***********************************************************************/
151
152 int OrderVector::size(){
153         return data.size();                                     
154 }
155
156 /***********************************************************************/
157
158 vector<int>::iterator OrderVector::begin(){
159         return data.begin();    
160 }
161
162 /***********************************************************************/
163
164 vector<int>::iterator OrderVector::end(){
165         return data.end();              
166 }
167
168 /***********************************************************************/
169
170 RAbundVector OrderVector::getRAbundVector(){
171         try {
172                 RAbundVector rav(data.size());
173         
174                 for(int i=0;i<numSeqs;i++){
175                         rav.set(data[i], rav.get(data[i]) + 1);
176                 }       
177                 sort(rav.rbegin(), rav.rend());
178                 for(int i=numSeqs-1;i>=0;i--){
179                         if(rav.get(i) == 0){    rav.pop_back(); }
180                         else{
181                                 break;
182                         }
183                 }
184                 rav.setLabel(label);
185
186                 return rav;
187         }
188         catch(exception& e) {
189                 m->errorOut(e, "OrderVector", "getRAbundVector");
190                 exit(1);
191         }
192 }
193
194 /***********************************************************************/
195
196 SAbundVector OrderVector::getSAbundVector(){
197         
198         RAbundVector rav(this->getRAbundVector());
199         return rav.getSAbundVector();
200
201 }
202
203 /***********************************************************************/
204
205 OrderVector OrderVector::getOrderVector(map<string,int>* hold = 0){
206         return *this;                   
207 }
208
209 /***********************************************************************/
210
211 void OrderVector::updateStats(){
212         try {
213                 needToUpdate = 0;
214         //      int maxBinVectorLength = 0;
215                 numSeqs = 0;
216                 numBins = 0;
217                 maxRank = 0;
218         
219                 for(int i=0;i<data.size();i++){
220                         if(data[i] != -1){
221                                 numSeqs++;
222                         }
223                 }
224         
225                 vector<int> hold(numSeqs);
226         
227                 for(int i=0;i<numSeqs;i++){
228                         if(data[i] != -1){
229                                 hold[data[i]] = hold[data[i]]+1;
230                         }
231                 }       
232                 for(int i=0;i<numSeqs;i++){
233                         if(hold[i] > 0)                 {       numBins++;                      }
234                         if(hold[i] > maxRank)   {       maxRank = hold[i];      }
235                 }
236         }
237         catch(exception& e) {
238                 m->errorOut(e, "OrderVector", "updateStats");
239                 exit(1);
240         }
241 }
242
243 /***********************************************************************/
244