cout << lookup[0]->getLabel() << '\t' << count << endl;
heatmap->getPic(lookup);
}
-
+
+ //prevent memory leak
+ for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; }
+
//get next line to process
lookup = input->getSharedRAbundVectors();
count++;
heatmap->getPic(rabund);
}
+ delete rabund;
rabund = input->getRAbundVector();
count++;
}
void Rarefact::getSharedCurve(int increment = 1, int nIters = 1000){
try {
- globaldata = GlobalData::getInstance();
SharedRarefactionCurveData* rcd = new SharedRarefactionCurveData();
+ label = lookup[0]->getLabel();
+
//register the displays
for(int i=0;i<displays.size();i++){
rcd->registerDisplay(displays[i]);
}
-
+
for(int iter=0;iter<nIters;iter++){
- //clear out old values for new iter
- lookup.clear();
- //create and initialize vector of sharedvectors, one for each group
- for (int i = 0; i < globaldata->Groups.size(); i++) {
- SharedRAbundVector* temp = new SharedRAbundVector(sharedorder->getNumBins());
- temp->setLabel(sharedorder->getLabel());
- temp->setGroup(globaldata->Groups[i]);
- lookup.push_back(temp);
- }
-
for(int i=0;i<displays.size();i++){
displays[i]->init(label);
}
-
- //sample all the members
- for(int i=0;i<numSeqs;i++){
- //get first sample
- individual chosen = sharedorder->get(i);
- int abundance;
-
- //set info for sharedvector in chosens group
- for (int j = 0; j < lookup.size(); j++) {
- if (chosen.group == lookup[j]->getGroup()) {
- abundance = lookup[j]->getAbundance(chosen.bin);
- lookup[j]->set(chosen.bin, (abundance + 1), chosen.group);
- break;
- }
- }
- }
-
+
//randomize the groups
random_shuffle(lookup.begin(), lookup.end());
displays[i]->reset();
}
- for (int i = 0; i < lookup.size(); i++) {
- delete lookup[i];
- }
}
for(int i=0;i<displays.size();i++){
public:
Rarefact(OrderVector* o, vector<Display*> disp) :
numSeqs(o->getNumSeqs()), order(o), displays(disp), label(o->getLabel()) {};
- Rarefact(SharedOrderVector* sharedorder, vector<Display*> disp) :
- numSeqs(sharedorder->getNumSeqs()), sharedorder(sharedorder), displays(disp), label(sharedorder->getLabel()) {};
+ Rarefact(vector<SharedRAbundVector*> shared, vector<Display*> disp) :
+ lookup(shared), displays(disp) {};
~Rarefact(){};
void getCurve(int, int);
void getSharedCurve(int, int);
private:
- SharedOrderVector* sharedorder;
- GlobalData* globaldata;
OrderVector* order;
vector<Display*> displays;
int numSeqs, numGroupComb;
fileNameRoot = getRootName(globaldata->inputFileName);
format = globaldata->getFormat();
validCalculator = new ValidCalculators();
- util = new SharedUtil();
int i;
for (i=0; i<globaldata->Estimators.size(); i++) {
//**********************************************************************************************************************
RareFactSharedCommand::~RareFactSharedCommand(){
- delete order;
delete input;
delete rCurve;
delete read;
- delete util;
}
//**********************************************************************************************************************
read->read(&*globaldata);
input = globaldata->ginput;
- order = input->getSharedOrderVector();
-
- //set users groups
- util->setGroups(globaldata->Groups, globaldata->gGroupmap->namesOfGroups, "rarefact");
+ lookup = input->getSharedRAbundVectors();
+
+ if (lookup.size() < 2) {
+ cout << "I cannot run the command without at least 2 valid groups.";
+ for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; }
+ return 0;
+ }
+
- while(order != NULL){
+ while(lookup[0] != NULL){
- if(globaldata->allLines == 1 || globaldata->lines.count(count) == 1 || globaldata->labels.count(order->getLabel()) == 1){
+ if(globaldata->allLines == 1 || globaldata->lines.count(count) == 1 || globaldata->labels.count(lookup[0]->getLabel()) == 1){
//create collectors curve
- rCurve = new Rarefact(order, rDisplays);
+ rCurve = new Rarefact(lookup, rDisplays);
convert(globaldata->getFreq(), freq);
convert(globaldata->getIters(), nIters);
rCurve->getSharedCurve(freq, nIters);
delete rCurve;
- cout << order->getLabel() << '\t' << count << endl;
+ cout << lookup[0]->getLabel() << '\t' << count << endl;
}
+ //prevent memory leak
+ for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; }
+
//get next line to process
- delete order;
- order = input->getSharedOrderVector();
+ lookup = input->getSharedRAbundVectors();
count++;
}
*/
#include "command.hpp"
-#include "sharedordervector.h"
-#include "sharedlistvector.h"
#include "inputdata.h"
#include "rarefact.h"
#include "display.h"
#include "readotu.h"
#include "validcalculator.h"
-#include "sharedutilities.h"
/* The rarefaction.shared() command:
The rarefaction command generates a rarefaction curve from a given file representing several groups.
private:
GlobalData* globaldata;
- SharedUtil* util;
- SharedListVector* SharedList;
ReadOTUFile* read;
- SharedOrderVector* order;
+ vector<SharedRAbundVector*> lookup;
InputData* input;
ValidCalculators* validCalculator;
Rarefact* rCurve;
}
random_shuffle(order->begin(), order->end());
+ order->updateStats();
+
return order;
}
catch(exception& e) {
/***********************************************************************/
-
+//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;
//numSeqs++;
//numBins++;
//if (abund > maxRank) { maxRank = abund; }
- updateStats();
+
+ //updateStats();
}
/***********************************************************************/
numBins = 0;
maxRank = 0;
- for(int i=0;i<data.size();i++){
-
- if(data[i].bin != -1){
- numSeqs++;
- }
- }
- //vector<individual> hold(numSeqs, 0);
-
- //for(int i=0;i<numSeqs;i++){
- //if(data[i].bin != -1){
- //hold[data[i].bin].bin = hold[data[i].bin].bin+1;
- //}
- //}
-
+ numSeqs = data.size();
+
+ vector<int> hold(numSeqs, 0);
for(int i=0;i<numSeqs;i++){
- if(data[i].bin > numBins) { numBins = data[i].bin; }
- if(data[i].abundance > maxRank) { maxRank = data[i].abundance; }
+ 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]; }
}
- numBins++; //if you have 10 bins largest .bin is 9 since we start at 0.
+
}
catch(exception& e) {
cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function updateStats. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
SharedOrderVector(ifstream&);
~SharedOrderVector(){};
- void set(int, int, int, string); //index, OTU, abundance, group
+
individual get(int);
- void push_back(int, int, string); //OTU, abundance, group
void resize(int);
int size();
void print(ostream&);
vector<individual>::iterator begin();
vector<individual>::iterator end();
-
+ void push_back(int, int, string); //OTU, abundance, group MUST CALL UPDATE STATS AFTER PUSHBACK!!!
+ void updateStats();
int getNumBins();
int getNumSeqs();
int numBins;
int numSeqs;
bool needToUpdate;
- void updateStats();
+ void set(int, int, int, string); //index, OTU, abundance, group
+
};
#endif
random_shuffle(ov.begin(), ov.end());
ov.setLabel(label);
+ ov.updateStats();
+
return ov;
}
catch(exception& e) {
rav = this->getSharedRAbundVector();
ov = rav.getSharedOrderVector();
+ ov.updateStats();
+
return ov;
}
catch(exception& e) {
delete input;
delete read;
delete venn;
+ for (int i = 0; i < vennCalculators.size(); i++) { delete vennCalculators[i]; }
}
//**********************************************************************************************************************
//util->getSharedVectors(globaldata->Groups, lookup, order); //fills group vectors from order vector.
venn->getPic(lookup, vennCalculators);
}
-
+
+ //prevent memory leak
+ for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; }
+
//get next line to process
lookup = input->getSharedRAbundVectors();
count++;
venn->getPic(sabund, vennCalculators);
}
+ delete sabund;
sabund = input->getSAbundVector();
count++;
}