--- /dev/null
+/*
+ * sharedSharedOrderVector.cpp
+ * Dotur
+ *
+ * Created by Sarah Westcott on 12/9/08.
+ * Copyright 2008 Schloss Lab UMASS Amherst. All rights reserved.
+ *
+ */
+
+#include "sharedordervector.h"
+#include "sharedutilities.h"
+
+/***********************************************************************/
+
+SharedOrderVector::SharedOrderVector() : DataVector(), maxRank(0), numBins(0), numSeqs(0) {}
+
+/***********************************************************************/
+
+SharedOrderVector::SharedOrderVector(string id, vector<individual> ov) :
+ DataVector(id), data(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() { //reads in a shared file
+ try {
+ maxRank = 0; numBins = 0; numSeqs = 0;
+
+ groupmap = new GroupMap();
+
+ int num, inputData, count;
+ count = 0; numSeqs = 0;
+ string holdLabel, nextLabel, groupN;
+ individual newguy;
+
+ //read in first row since you know there is at least 1 group.
+ //are we at the beginning of the file??
+ if (m->saveNextLabel == "") {
+ f >> label;
+
+ //is this a shared file that has headers
+ if (label == "label") {
+ //gets "group"
+ f >> label; m->gobble(f);
+
+ //gets "numOtus"
+ f >> label; m->gobble(f);
+
+ //eat rest of line
+ label = m->getline(f); m->gobble(f);
+
+ //parse labels to save
+ istringstream iStringStream(label);
+ m->binLabelsInFile.clear();
+ while(!iStringStream.eof()){
+ if (m->control_pressed) { break; }
+ string temp;
+ iStringStream >> temp; m->gobble(iStringStream);
+
+ m->binLabelsInFile.push_back(temp);
+ }
+
+ f >> label;
+ }
+ }else { label = m->saveNextLabel; }
+
+ //reset labels, currentLabels may have gotten changed as otus were eliminated because of group choices or sampling
+ m->currentBinLabels = m->binLabelsInFile;
+
+ //read in first row since you know there is at least 1 group.
+ f >> groupN >> num;
+
+ holdLabel = label;
+
+
+ vector<string> allGroups;
+ //save group in groupmap
+ allGroups.push_back(groupN);
+ groupmap->groupIndex[groupN] = 0;
+
+
+ for(int i=0;i<num;i++){
+ f >> inputData;
+
+ for (int j = 0; j < inputData; j++) {
+ push_back(i, i, groupN);
+ numSeqs++;
+ }
+ }
+
+ m->gobble(f);
+
+ if (!(f.eof())) { f >> nextLabel; }
+
+ //read the rest of the groups info in
+ while ((nextLabel == holdLabel) && (f.eof() != true)) {
+ f >> groupN >> num;
+ count++;
+
+
+ //save group in groupmap
+ allGroups.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++;
+ }
+ }
+
+ m->gobble(f);
+
+ if (f.eof() != true) { f >> nextLabel; }
+
+ }
+
+ m->saveNextLabel = nextLabel;
+
+ groupmap->setNamesOfGroups(allGroups);
+ m->setAllGroups(allGroups);
+
+ updateStats();
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SharedOrderVector", "SharedOrderVector");
+ exit(1);
+ }
+}
+/***********************************************************************/
+
+int SharedOrderVector::getNumBins(){
+ return numBins;
+}
+
+/***********************************************************************/
+
+int SharedOrderVector::getNumSeqs(){
+ return numSeqs;
+}
+
+/***********************************************************************/
+
+int SharedOrderVector::getMaxRank(){
+ return maxRank;
+}
+
+
+/***********************************************************************/
+
+
+
+void SharedOrderVector::set(int index, int binNumber, int abund, string groupName){
+
+ data[index].group = groupName;
+ data[index].bin = binNumber;
+ data[index].abundance = abund;
+ //if (abund > maxRank) { maxRank = abund; }
+ updateStats();
+}
+
+/***********************************************************************/
+
+individual SharedOrderVector::get(int index){
+ return data[index];
+}
+
+
+/***********************************************************************/
+//commented updateStats out to improve speed, but whoever calls this must remember to update when they are done with all the pushbacks they are doing
+void SharedOrderVector::push_back(int binNumber, int abund, string groupName){
+ individual newGuy;
+ newGuy.group = groupName;
+ newGuy.abundance = abund;
+ newGuy.bin = binNumber;
+ data.push_back(newGuy);
+ //numSeqs++;
+ //numBins++;
+ //if (abund > maxRank) { maxRank = abund; }
+
+ //updateStats();
+}
+
+/***********************************************************************/
+
+void SharedOrderVector::print(ostream& output){
+ try {
+ output << label << '\t' << numSeqs << '\t';
+
+ for(int i=0;i<data.size();i++){
+ output << data[i].bin << '\t';
+ }
+ output << endl;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SharedOrderVector", "print");
+ exit(1);
+ }
+}
+
+/***********************************************************************/
+
+void SharedOrderVector::clear(){
+ numBins = 0;
+ maxRank = 0;
+ numSeqs = 0;
+ data.clear();
+}
+/***********************************************************************/
+
+void SharedOrderVector::resize(int){
+ m->mothurOut("resize() did nothing in class SharedOrderVector");
+}
+
+/***********************************************************************/
+
+
+vector<individual>::iterator SharedOrderVector::begin(){
+ return data.begin();
+}
+
+/***********************************************************************/
+
+vector<individual>::iterator SharedOrderVector::end(){
+ return data.end();
+}
+
+/***********************************************************************/
+
+int SharedOrderVector::size(){
+ return data.size();
+}
+
+/***********************************************************************/
+
+RAbundVector SharedOrderVector::getRAbundVector(){
+ try {
+ RAbundVector rav(data.size());
+
+ for(int i=0;i<numSeqs;i++){
+ rav.set(data[i].bin, rav.get(data[i].bin) + 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, "SharedOrderVector", "getRAbundVector");
+ exit(1);
+ }
+}
+/***********************************************************************/
+
+OrderVector SharedOrderVector::getOrderVector(map<string,int>* nameMap = NULL) {
+ try {
+ OrderVector ov;
+
+ for (int i = 0; i < data.size(); i++) {
+ ov.push_back(data[i].bin);
+ }
+
+ random_shuffle(ov.begin(), ov.end());
+
+ ov.setLabel(label);
+ return ov;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SharedOrderVector", "getOrderVector");
+ exit(1);
+ }
+}
+
+
+/***********************************************************************/
+
+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) {
+ m->errorOut(e, "SharedOrderVector", "getSharedRAbundVector");
+ exit(1);
+ }
+}
+/***********************************************************************/
+vector<SharedRAbundVector*> SharedOrderVector::getSharedRAbundVector() {
+ try {
+ SharedUtil* util;
+ util = new SharedUtil();
+ vector<SharedRAbundVector*> lookup;
+
+ vector<string> Groups = m->getGroups();
+ vector<string> allGroups = m->getAllGroups();
+ util->setGroups(Groups, allGroups);
+ util->getSharedVectors(Groups, lookup, this);
+ m->setGroups(Groups);
+ m->setAllGroups(allGroups);
+
+ return lookup;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SharedOrderVector", "getSharedRAbundVector");
+ exit(1);
+ }
+}
+/***********************************************************************/
+SharedSAbundVector SharedOrderVector::getSharedSAbundVector(string group) {
+ try {
+
+ SharedRAbundVector sharedRav(this->getSharedRAbundVector(group));
+ return sharedRav.getSharedSAbundVector();
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SharedOrderVector", "getSharedSAbundVector");
+ exit(1);
+ }
+}
+
+/***********************************************************************/
+
+SharedOrderVector SharedOrderVector::getSharedOrderVector(){
+ random_shuffle(data.begin(), data.end());
+ return *this;
+}
+
+/***********************************************************************/
+
+void SharedOrderVector::updateStats(){
+ try {
+ needToUpdate = 0;
+ numSeqs = 0;
+ numBins = 0;
+ maxRank = 0;
+
+ numSeqs = data.size();
+
+ vector<int> hold(numSeqs, 0);
+ for(int i=0;i<numSeqs;i++){
+ hold[data[i].bin] = hold[data[i].bin]+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, "SharedOrderVector", "updateStats");
+ exit(1);
+ }
+}
+
+/***********************************************************************/
+
+