]> git.donarmstrong.com Git - mothur.git/blobdiff - ordervector.cpp
Revert to previous commit
[mothur.git] / ordervector.cpp
diff --git a/ordervector.cpp b/ordervector.cpp
new file mode 100644 (file)
index 0000000..a6dff32
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ *  order.cpp
+ *  
+ *
+ *  Created by Pat Schloss on 8/8/08.
+ *  Copyright 2008 Patrick D. Schloss. All rights reserved.
+ *
+ */
+
+#include "ordervector.hpp"
+
+
+/***********************************************************************/
+
+OrderVector::OrderVector() : DataVector() {}
+
+/***********************************************************************/
+
+//OrderVector::OrderVector(int ns) : DataVector(), data(ns, -1) {}
+
+/***********************************************************************/
+
+OrderVector::OrderVector(string id, vector<int> ov) : 
+                                                                                       DataVector(id), data(ov)
+{
+       updateStats();  
+}
+
+/***********************************************************************/
+
+OrderVector::OrderVector(ifstream& f) : DataVector() {
+       try {
+               int hold;
+       
+               f >> label;
+               f >> hold;
+       
+               data.assign(hold, -1);
+       
+               int inputData;
+       
+               for(int i=0;i<hold;i++){
+                       f >> inputData;
+                       set(i, inputData);
+               }
+       
+               updateStats();
+       }
+       catch(exception& e) {
+               m->errorOut(e, "OrderVector", "OrderVector");
+               exit(1);
+       }
+}
+
+/***********************************************************************/
+
+
+int OrderVector::getNumBins(){
+       if(needToUpdate == 1){  updateStats();  }
+       return numBins;
+}
+
+/***********************************************************************/
+
+int OrderVector::getNumSeqs(){
+       if(needToUpdate == 1){  updateStats();  }
+       return numSeqs;
+}
+
+/***********************************************************************/
+
+int OrderVector::getMaxRank(){
+       if(needToUpdate == 1){  updateStats();  }
+       return maxRank;
+}
+/***********************************************************************/
+
+void OrderVector::clear(){
+       numBins = 0;
+       maxRank = 0;
+       numSeqs = 0;
+       data.clear();
+}
+/***********************************************************************/
+
+
+
+void OrderVector::set(int index, int binNumber){
+       
+       data[index] = binNumber;
+       needToUpdate = 1;
+       
+}
+
+/***********************************************************************/
+
+int OrderVector::get(int index){
+       return data[index];                     
+}
+
+/***********************************************************************/
+
+void OrderVector::push_back(int index){
+
+       data.push_back(index);
+       needToUpdate = 1;
+       
+}
+
+/***********************************************************************/
+
+void OrderVector::print(ostream& output){
+       try {
+               output << label << '\t' << numSeqs << '\t';
+       
+               for(int i=0;i<data.size();i++){
+                       output << data[i] << '\t';
+               }
+               output << endl;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "OrderVector", "print");
+               exit(1);
+       }
+}
+
+/***********************************************************************/
+
+void OrderVector::print(string prefix, ostream& output){
+       try {
+               output << prefix << '\t' << numSeqs << '\t';
+       
+               for(int i=0;i<numSeqs;i++){
+                       output << data[i] << '\t';
+               }
+               output << endl;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "OrderVector", "print");
+               exit(1);
+       }
+}
+
+/***********************************************************************/
+
+void OrderVector::resize(int){
+       m->mothurOut("resize() did nothing in class OrderVector");
+}
+
+/***********************************************************************/
+
+int OrderVector::size(){
+       return data.size();                                     
+}
+
+/***********************************************************************/
+
+vector<int>::iterator OrderVector::begin(){
+       return data.begin();    
+}
+
+/***********************************************************************/
+
+vector<int>::iterator OrderVector::end(){
+       return data.end();              
+}
+
+/***********************************************************************/
+
+RAbundVector OrderVector::getRAbundVector(){
+       try {
+               RAbundVector rav(data.size());
+       
+               for(int i=0;i<numSeqs;i++){
+                       rav.set(data[i], rav.get(data[i]) + 1);
+               }       
+               sort(rav.rbegin(), rav.rend());
+               for(int i=numSeqs-1;i>=0;i--){
+                       if(rav.get(i) == 0){    rav.pop_back(); }
+                       else{
+                               break;
+                       }
+               }
+               rav.setLabel(label);
+
+               return rav;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "OrderVector", "getRAbundVector");
+               exit(1);
+       }
+}
+
+/***********************************************************************/
+
+SAbundVector OrderVector::getSAbundVector(){
+       
+       RAbundVector rav(this->getRAbundVector());
+       return rav.getSAbundVector();
+
+}
+
+/***********************************************************************/
+
+OrderVector OrderVector::getOrderVector(map<string,int>* hold = 0){
+       return *this;                   
+}
+
+/***********************************************************************/
+
+void OrderVector::updateStats(){
+       try {
+               needToUpdate = 0;
+       //      int maxBinVectorLength = 0;
+               numSeqs = 0;
+               numBins = 0;
+               maxRank = 0;
+       
+               for(int i=0;i<data.size();i++){
+                       if(data[i] != -1){
+                               numSeqs++;
+                       }
+               }
+       
+               vector<int> hold(numSeqs);
+       
+               for(int i=0;i<numSeqs;i++){
+                       if(data[i] != -1){
+                               hold[data[i]] = hold[data[i]]+1;
+                       }
+               }       
+               for(int i=0;i<numSeqs;i++){
+                       if(hold[i] > 0)                 {       numBins++;                      }
+                       if(hold[i] > maxRank)   {       maxRank = hold[i];      }
+               }
+       }
+       catch(exception& e) {
+               m->errorOut(e, "OrderVector", "updateStats");
+               exit(1);
+       }
+}
+
+/***********************************************************************/
+