5 * Created by Pat Schloss on 8/8/08.
6 * Copyright 2008 Patrick D. Schloss. All rights reserved.
11 #include "sabundvector.hpp"
12 #include "rabundvector.hpp"
13 #include "ordervector.hpp"
14 #include "listvector.hpp"
17 /***********************************************************************/
19 ListVector::ListVector() : DataVector(), maxRank(0), numBins(0), numSeqs(0){}
21 /***********************************************************************/
23 ListVector::ListVector(int n): DataVector(), data(n, "") , maxRank(0), numBins(0), numSeqs(0){}
25 /***********************************************************************/
27 ListVector::ListVector(string id, vector<string> lv) : DataVector(id), data(lv){
29 for(int i=0;i<data.size();i++){
31 int binSize = m->getNumNames(data[i]);
33 if(binSize > maxRank) { maxRank = binSize; }
39 m->errorOut(e, "ListVector", "ListVector");
44 /**********************************************************************/
46 ListVector::ListVector(ifstream& f) : DataVector(), maxRank(0), numBins(0), numSeqs(0) {
51 data.assign(hold, "");
52 string inputData = "";
54 for(int i=0;i<hold;i++){
62 m->errorOut(e, "ListVector", "ListVector");
67 /***********************************************************************/
69 void ListVector::set(int binNumber, string seqNames){
71 int nNames_old = m->getNumNames(data[binNumber]);
72 data[binNumber] = seqNames;
73 int nNames_new = m->getNumNames(seqNames);
75 if(nNames_old == 0) { numBins++; }
76 if(nNames_new == 0) { numBins--; }
77 if(nNames_new > maxRank) { maxRank = nNames_new; }
79 numSeqs += (nNames_new - nNames_old);
82 m->errorOut(e, "ListVector", "set");
87 /***********************************************************************/
89 string ListVector::get(int index){
93 /***********************************************************************/
95 void ListVector::push_back(string seqNames){
97 data.push_back(seqNames);
98 int nNames = m->getNumNames(seqNames);
102 if(nNames > maxRank) { maxRank = nNames; }
106 catch(exception& e) {
107 m->errorOut(e, "ListVector", "push_back");
112 /***********************************************************************/
114 void ListVector::resize(int size){
118 /***********************************************************************/
120 int ListVector::size(){
123 /***********************************************************************/
125 void ListVector::clear(){
133 /***********************************************************************/
135 void ListVector::print(ostream& output){
137 output << label << '\t' << numBins << '\t';
139 for(int i=0;i<data.size();i++){
141 output << data[i] << '\t';
146 catch(exception& e) {
147 m->errorOut(e, "ListVector", "print");
153 /***********************************************************************/
155 RAbundVector ListVector::getRAbundVector(){
159 for(int i=0;i<data.size();i++){
160 int binSize = m->getNumNames(data[i]);
161 rav.push_back(binSize);
164 // This was here before to output data in a nice format, but it screws up the name mapping steps
165 // sort(rav.rbegin(), rav.rend());
167 // for(int i=data.size()-1;i>=0;i--){
168 // if(rav.get(i) == 0){ rav.pop_back(); }
177 catch(exception& e) {
178 m->errorOut(e, "ListVector", "getRAbundVector");
183 /***********************************************************************/
185 SAbundVector ListVector::getSAbundVector(){
187 SAbundVector sav(maxRank+1);
189 for(int i=0;i<data.size();i++){
190 int binSize = m->getNumNames(data[i]);
191 sav.set(binSize, sav.get(binSize) + 1);
198 catch(exception& e) {
199 m->errorOut(e, "ListVector", "getSAbundVector");
204 /***********************************************************************/
206 OrderVector ListVector::getOrderVector(map<string,int>* orderMap = NULL){
209 if(orderMap == NULL){
212 for(int i=0;i<data.size();i++){
213 int binSize = m->getNumNames(data[i]);
214 for(int j=0;j<binSize;j++){
218 random_shuffle(ov.begin(), ov.end());
226 OrderVector ov(numSeqs);
228 for(int i=0;i<data.size();i++){
229 string listOTU = data[i];
230 int length = listOTU.size();
234 for(int j=0;j<length;j++){
236 if(listOTU[j] != ','){
237 seqName += listOTU[j];
240 if(orderMap->count(seqName) == 0){
241 m->mothurOut(seqName + " not found, check *.names file\n");
245 ov.set((*orderMap)[seqName], i);
250 if(orderMap->count(seqName) == 0){
251 m->mothurOut(seqName + " not found, check *.names file\n");
254 ov.set((*orderMap)[seqName], i);
263 catch(exception& e) {
264 m->errorOut(e, "ListVector", "getOrderVector");
269 /***********************************************************************/