]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedordervector.cpp
changed heatmap and venn command to use vector of sharedrabunds instead of order...
[mothur.git] / sharedordervector.cpp
index fc81febade9a6287dbedb24ef6504adf9f2445c2..0a6f095a0345a9865553b2189585b85629bf4697 100644 (file)
@@ -3,7 +3,7 @@
  *  Dotur
  *
  *  Created by Sarah Westcott on 12/9/08.
- *  Copyright 2008 __MyCompanyName__. All rights reserved.
+ *  Copyright 2008 Schloss Lab UMASS Amherst. All rights reserved.
  *
  */
 
@@ -11,9 +11,7 @@ using namespace std;
 
 
 #include "sharedordervector.h"
-#include "datavector.hpp"
-#include "utilities.hpp"
-#include <exception>
+#include "sharedutilities.h"
 
 /***********************************************************************/
 
@@ -27,25 +25,80 @@ SharedOrderVector::SharedOrderVector(string id, vector<individual>  ov) :
                updateStats();
 }
 
-/***********************************************************************
+/***********************************************************************/
+//This function is used to read a .shared file for the collect.shared, rarefaction.shared and summary.shared commands
+//if you don't use a list and groupfile.  
 
-SharedOrderVector::SharedOrderVector(ifstream& f) : DataVector() {
+SharedOrderVector::SharedOrderVector(ifstream& f) : DataVector() {  //reads in a shared file
        try {
-               int hold;
-       
-               f >> label;
-               f >> hold;
-       
-               data.assign(hold, -1);
-       
-               int inputData;
-       
-               for(int i=0;i<hold;i++){
+               globaldata = GlobalData::getInstance();
+               maxRank = 0; numBins = 0; numSeqs = 0;
+               
+               if (globaldata->gGroupmap == NULL) {  groupmap = new GroupMap(); }
+               
+               int num, inputData, pos, count;
+               count = 0;  numSeqs = 0;
+               string holdLabel, nextLabel, groupN;
+               individual newguy;
+               
+               //read in first row since you know there is at least 1 group.
+               f >> label >> groupN >> num;
+               holdLabel = label;
+               
+               if (globaldata->gGroupmap == NULL) { 
+                       //save group in groupmap
+                       groupmap->namesOfGroups.push_back(groupN);
+                       groupmap->groupIndex[groupN] = 0;
+               }
+               
+               for(int i=0;i<num;i++){
                        f >> inputData;
-                       set(i, inputData);
+                       
+                       for (int j = 0; j < inputData; j++) {
+                               push_back(i, i, groupN);
+                               numSeqs++;
+                       }
                }
+               
+               //save position in file in case next line is a new label.
+               pos = f.tellg();
+               
+               if (f.eof() != true) { f >> nextLabel; }
+               
+               //read the rest of the groups info in
+               while ((nextLabel == holdLabel) && (f.eof() != true)) {
+                       f >> groupN >> num;
+                       count++;
+                       
+                       if (globaldata->gGroupmap == NULL) { 
+                               //save group in groupmap
+                               groupmap->namesOfGroups.push_back(groupN);
+                               groupmap->groupIndex[groupN] = count;
+                       }
+                       
+                       for(int i=0;i<num;i++){
+                               f >> inputData;
+                               
+                               for (int j = 0; j < inputData; j++) {
+                                       push_back(i, i, groupN);
+                                       numSeqs++;
+                               }
+                       }
+                       
+                       //save position in file in case next line is a new label.
+                       pos = f.tellg();
        
+                       if (f.eof() != true) { f >> nextLabel; }
+
+               }
+               
+               //put file pointer back since you are now at a new distance label
+               f.seekg(pos, ios::beg);
+       
+               if (globaldata->gGroupmap == NULL) { globaldata->gGroupmap = groupmap; }
+               
                updateStats();
+               
        }
        catch(exception& e) {
                cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function SharedOrderVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
@@ -56,26 +109,21 @@ SharedOrderVector::SharedOrderVector(ifstream& f) : DataVector() {
                exit(1);
        }
 }
-
 /***********************************************************************/
 
-
 int SharedOrderVector::getNumBins(){
-       if(needToUpdate == 1){  updateStats();  }
        return numBins;
 }
 
 /***********************************************************************/
 
 int SharedOrderVector::getNumSeqs(){
-       if(needToUpdate == 1){  updateStats();  }
        return numSeqs;
 }
 
 /***********************************************************************/
 
 int SharedOrderVector::getMaxRank(){
-       if(needToUpdate == 1){  updateStats();  }
        return maxRank;
 }
 
@@ -89,8 +137,8 @@ void SharedOrderVector::set(int index, int binNumber, int abund, string groupNam
        data[index].group = groupName;
        data[index].bin = binNumber;
        data[index].abundance = abund;
-       needToUpdate = 1;
-       
+       //if (abund > maxRank) { maxRank = abund; }
+       updateStats();
 }
 
 /***********************************************************************/
@@ -108,8 +156,10 @@ void SharedOrderVector::push_back(int binNumber, int abund, string groupName){
        newGuy.abundance = abund;
        newGuy.bin = binNumber;
        data.push_back(newGuy);
-       needToUpdate = 1;
-       
+       //numSeqs++;
+       //numBins++;
+       //if (abund > maxRank) { maxRank = abund; }
+       updateStats();
 }
 
 /***********************************************************************/
@@ -221,6 +271,71 @@ SAbundVector SharedOrderVector::getSAbundVector(){
        RAbundVector rav(this->getRAbundVector());
        return rav.getSAbundVector();
 
+}
+/***********************************************************************/
+SharedRAbundVector SharedOrderVector::getSharedRAbundVector(string group) {
+       try {
+               SharedRAbundVector sharedRav(data.size());
+               
+               sharedRav.setLabel(label);
+               sharedRav.setGroup(group);
+               
+               for (int i = 0; i < data.size(); i++) {
+                       if (data[i].group == group) {
+                               sharedRav.set(data[i].abundance, sharedRav.getAbundance(data[i].abundance) + 1, data[i].group);
+                       }
+               }
+               return sharedRav;
+       }
+       catch(exception& e) {
+               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       catch(...) {
+               cout << "An unknown error has occurred in the SharedOrderVector class function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       
+}
+/***********************************************************************/
+vector<SharedRAbundVector*> SharedOrderVector::getSharedRAbundVector() {
+       try {
+               SharedUtil* util;
+               util = new SharedUtil();
+               vector<SharedRAbundVector*> lookup;
+               
+               util->setGroups(globaldata->Groups, globaldata->gGroupmap->namesOfGroups);
+               util->getSharedVectors(globaldata->Groups, lookup, this);
+               
+               return lookup;
+       }
+       catch(exception& e) {
+               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       catch(...) {
+               cout << "An unknown error has occurred in the SharedOrderVector class function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       
+}
+/***********************************************************************/
+SharedSAbundVector SharedOrderVector::getSharedSAbundVector(string group) {
+       try {
+               
+               SharedRAbundVector sharedRav(this->getSharedRAbundVector(group));
+               return sharedRav.getSharedSAbundVector();
+                               
+       }
+       catch(exception& e) {
+               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       catch(...) {
+               cout << "An unknown error has occurred in the SharedOrderVector class function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       
 }
 
 /***********************************************************************/