//**********************************************************************************************************************
-SharedCommand::SharedCommand(){
+SharedCommand::SharedCommand(string o) : outputDir(o) {
try {
globaldata = GlobalData::getInstance();
//getting output filename
filename = globaldata->inputFileName;
- filename = getRootName(filename);
+ if (outputDir == "") { outputDir += hasPath(filename); }
+
+ filename = outputDir + getRootName(getSimpleName(filename));
filename = filename + "shared";
+
openOutputFile(filename, out);
+ pickedGroups = false;
groupMap = globaldata->gGroupmap;
groups = groupMap->namesOfGroups;
}else{ //they have specified groups
groups = globaldata->Groups;
+ pickedGroups = true;
}
//fill filehandles with neccessary ofstreams
}
//set fileroot
- fileroot = getRootName(globaldata->getListFile());
+ fileroot = outputDir + getRootName(getSimpleName(globaldata->getListFile()));
//clears file before we start to write to it below
for (int i=0; i<groups.size(); i++) {
//lookup.clear();
string errorOff = "no error";
//errorOff = "";
-
+
//read in listfile
read = new ReadOTUFile(globaldata->inputFileName);
read->read(&*globaldata);
groups += globaldata->Groups[i] + ".";
}
- string newGroupFile = getRootName(globaldata->inputFileName) + groups + "groups";
+ string newGroupFile = outputDir + getRootName(getSimpleName(globaldata->inputFileName)) + groups + "groups";
ofstream outGroups;
openOutputFile(newGroupFile, outGroups);
//if the users enters label "0.06" and there is no "0.06" in their file use the next lowest label.
set<string> processedLabels;
set<string> userLabels = globaldata->labels;
-
+
while((SharedList != NULL) && ((globaldata->allLines == 1) || (userLabels.size() != 0))) {
-
+
if(globaldata->allLines == 1 || globaldata->labels.count(SharedList->getLabel()) == 1){
lookup = SharedList->getSharedRAbundVector();
+ if (pickedGroups) { //check for otus with no seqs in them
+ eliminateZeroOTUS(lookup);
+ }
mothurOut(lookup[0]->getLabel()); mothurOutEndLine();
printSharedData(lookup); //prints info to the .shared file
SharedList = input->getSharedListVector(lastLabel); //get new list vector to process
lookup = SharedList->getSharedRAbundVector();
+ if (pickedGroups) { //check for otus with no seqs in them
+ eliminateZeroOTUS(lookup);
+ }
mothurOut(lookup[0]->getLabel()); mothurOutEndLine();
printSharedData(lookup); //prints info to the .shared file
SharedList = input->getSharedListVector(lastLabel); //get new list vector to process
lookup = SharedList->getSharedRAbundVector();
+ if (pickedGroups) { //check for otus with no seqs in them
+ eliminateZeroOTUS(lookup);
+ }
mothurOut(lookup[0]->getLabel()); mothurOutEndLine();
printSharedData(lookup); //prints info to the .shared file
}
+ //change format to shared to speed up commands
+ globaldata->setFormat("sharedfile");
+ globaldata->setListFile("");
+ globaldata->setGroupFile("");
+ globaldata->setSharedFile(filename);
+
+
return 0;
}
catch(exception& e) {
}
}
//**********************************************************************************************************************
+void SharedCommand::eliminateZeroOTUS(vector<SharedRAbundVector*>& thislookup) {
+ try {
+
+ vector<SharedRAbundVector*> newLookup;
+ for (int i = 0; i < thislookup.size(); i++) {
+ SharedRAbundVector* temp = new SharedRAbundVector();
+ temp->setLabel(thislookup[i]->getLabel());
+ temp->setGroup(thislookup[i]->getGroup());
+ newLookup.push_back(temp);
+ }
+
+ //for each bin
+ for (int i = 0; i < thislookup[0]->getNumBins(); i++) {
+
+ //look at each sharedRabund and make sure they are not all zero
+ bool allZero = true;
+ for (int j = 0; j < thislookup.size(); j++) {
+ if (thislookup[j]->getAbundance(i) != 0) { allZero = false; break; }
+ }
+
+ //if they are not all zero add this bin
+ if (!allZero) {
+ for (int j = 0; j < thislookup.size(); j++) {
+ newLookup[j]->push_back(thislookup[j]->getAbundance(i), thislookup[j]->getGroup());
+ }
+ }
+ //else{ cout << "bin # " << i << " is all zeros" << endl; }
+ }
+
+ for (int j = 0; j < thislookup.size(); j++) { delete thislookup[j]; }
+ thislookup = newLookup;
+
+
+ }
+ catch(exception& e) {
+ errorOut(e, "SharedCommand", "eliminateZeroOTUS");
+ exit(1);
+ }
+}
+//**********************************************************************************************************************
void SharedCommand::createMisMatchFile() {
try {
ofstream outMisMatch;
- string outputMisMatchName = getRootName(globaldata->inputFileName);
+ string outputMisMatchName = outputDir + getRootName(getSimpleName(globaldata->inputFileName));
//you have sequences in your list file that are not in your group file
if (SharedList->getNumSeqs() > groupMap->getNumSeqs()) {
string name = names.substr(0,names.find_first_of(','));
names = names.substr(names.find_first_of(',')+1, names.length());
string group = groupMap->getGroup(name);
-
+
if(group == "not found") { outMisMatch << name << endl; }
}
-
+
//get last name
string group = groupMap->getGroup(names);
if(group == "not found") { outMisMatch << names << endl; }