#include "otuhierarchycommand.h"
//**********************************************************************************************************************
-OtuHierarchyCommand::OtuHierarchyCommand(string option){
+OtuHierarchyCommand::OtuHierarchyCommand(string option) {
try {
abort = false;
+
//allow user to run help
if(option == "help") { help(); abort = true; }
else {
//valid paramters for this command
- string Array[] = {"list","label","outputdir","inputdir"};
+ string Array[] = {"list","label","output","outputdir","inputdir"};
vector<string> myArray (Array, Array+(sizeof(Array)/sizeof(string)));
OptionParser parser(option);
}
listFile = validParameter.validFile(parameters, "list", true);
- if (listFile == "not found") { mothurOut("list is a required parameter for the otu.hierarchy command."); mothurOutEndLine(); abort = true; }
+ if (listFile == "not found") { m->mothurOut("list is a required parameter for the otu.hierarchy command."); m->mothurOutEndLine(); abort = true; }
else if (listFile == "not open") { abort = true; }
//if the user changes the output directory command factory will send this info to us in the output parameter
//check for optional parameter and set defaults
// ...at some point should added some additional type checking...
label = validParameter.validFile(parameters, "label", false);
- if (label == "not found") { mothurOut("label is a required parameter for the otu.hierarchy command."); mothurOutEndLine(); abort = true; }
+ if (label == "not found") { m->mothurOut("label is a required parameter for the otu.hierarchy command."); m->mothurOutEndLine(); abort = true; }
else {
splitAtDash(label, labels);
- if (labels.size() != 2) { mothurOut("You must provide 2 labels."); mothurOutEndLine(); abort = true; }
- }
+ if (labels.size() != 2) { m->mothurOut("You must provide 2 labels."); m->mothurOutEndLine(); abort = true; }
+ }
+
+ output = validParameter.validFile(parameters, "output", false); if (output == "not found") { output = "name"; }
+
+ if ((output != "name") && (output != "number")) { m->mothurOut("output options are name and number. I will use name."); m->mothurOutEndLine(); output = "name"; }
}
}
catch(exception& e) {
- errorOut(e, "OtuHierarchyCommand", "OtuHierarchyCommand");
+ m->errorOut(e, "OtuHierarchyCommand", "OtuHierarchyCommand");
exit(1);
}
}
void OtuHierarchyCommand::help(){
try {
- mothurOut("The otu.hierarchy command is used to see how otus relate at two distances. \n");
- mothurOut("The otu.hierarchy command parameters are list and label. Both parameters are required. \n");
- mothurOut("The otu.hierarchy command should be in the following format: \n");
- mothurOut("otu.hierarchy(list=yourListFile, label=yourLabels).\n");
- mothurOut("Example otu.hierarchy(list=amazon.fn.list, label=0.01-0.03).\n");
- mothurOut("The otu.hierarchy command outputs a .otu.hierarchy file which is described on the wiki.\n");
- mothurOut("Note: No spaces between parameter labels (i.e. list), '=' and parameters (i.e.yourListFile).\n\n");
+ m->mothurOut("The otu.hierarchy command is used to see how otus relate at two distances. \n");
+ m->mothurOut("The otu.hierarchy command parameters are list, label and output. list and label parameters are required. \n");
+ m->mothurOut("The output parameter allows you to output the names of the sequence in the OTUs or the OTU numbers. Options are name and number, default is name. \n");
+ m->mothurOut("The otu.hierarchy command should be in the following format: \n");
+ m->mothurOut("otu.hierarchy(list=yourListFile, label=yourLabels).\n");
+ m->mothurOut("Example otu.hierarchy(list=amazon.fn.list, label=0.01-0.03).\n");
+ m->mothurOut("The otu.hierarchy command outputs a .otu.hierarchy file which is described on the wiki.\n");
+ m->mothurOut("Note: No spaces between parameter labels (i.e. list), '=' and parameters (i.e.yourListFile).\n\n");
}
catch(exception& e) {
- errorOut(e, "OtuHierarchyCommand", "help");
+ m->errorOut(e, "OtuHierarchyCommand", "help");
exit(1);
}
}
//get listvectors that correspond to labels requested, (or use smart distancing to get closest listvector)
vector<ListVector> lists = getListVectors();
+ if (m->control_pressed) { return 0; }
+
//determine which is little and which is big, putting little first
if (lists.size() == 2) {
//if big is first swap them
reverse(lists.begin(), lists.end());
}
}else{
- mothurOut("error getting listvectors, unable to read 2 different vectors, check your label inputs."); mothurOutEndLine(); return 0;
+ m->mothurOut("error getting listvectors, unable to read 2 different vectors, check your label inputs."); m->mothurOutEndLine(); return 0;
}
//map sequences to bin number in the "little" otu
map<string, int> littleBins;
for (int i = 0; i < lists[0].getNumBins(); i++) {
+
+ if (m->control_pressed) { return 0; }
+
string names = lists[0].get(i);
//parse bin
//go through each bin in "big" otu and output the bins in "little" otu which created it
for (int i = 0; i < lists[1].getNumBins(); i++) {
+ if (m->control_pressed) { out.close(); remove(outputFileName.c_str()); return 0; }
+
string names = lists[1].get(i);
//output column 1
- out << names << '\t';
+ if (output == "name") { out << names << '\t'; }
+ else { out << i << '\t'; }
map<int, int> bins; //bin numbers in little that are in this bin in big
map<int, int>::iterator it;
string col2 = "";
for (it = bins.begin(); it != bins.end(); it++) {
- col2 += lists[0].get(it->first) + "\t";
+ if (output == "name") { col2 += lists[0].get(it->first) + "\t"; }
+ else { col2 += toString(it->first) + "\t"; }
}
//output column 2
out.close();
+ if (m->control_pressed) { remove(outputFileName.c_str()); return 0; }
+
+ m->mothurOutEndLine();
+ m->mothurOut("Output File Name: "); m->mothurOutEndLine();
+ m->mothurOut(outputFileName); m->mothurOutEndLine();
+ m->mothurOutEndLine();
+
return 0;
}
catch(exception& e) {
- errorOut(e, "OtuHierarchyCommand", "execute");
+ m->errorOut(e, "OtuHierarchyCommand", "execute");
exit(1);
}
}
}
while ((list != NULL) && (userLabels.size() != 0)) {
+
+ if (m->control_pressed) { in.close(); delete list; return lists; }
//is this a listvector that we want?
if(labels.count(list->getLabel()) == 1){
}else { list = NULL; }
}
-
+ if (m->control_pressed) { in.close(); return lists; }
//output error messages about any remaining user labels
set<string>::iterator it;
bool needToRun = false;
for (it = userLabels.begin(); it != userLabels.end(); it++) {
- mothurOut("Your file does not include the label " + *it);
+ m->mothurOut("Your file does not include the label " + *it);
if (processedLabels.count(lastLabel) != 1) {
- mothurOut(". I will use " + lastLabel + "."); mothurOutEndLine();
+ m->mothurOut(". I will use " + lastLabel + "."); m->mothurOutEndLine();
needToRun = true;
}else {
- mothurOut(". Please refer to " + lastLabel + "."); mothurOutEndLine();
+ m->mothurOut(". Please refer to " + lastLabel + "."); m->mothurOutEndLine();
}
}
+ if (m->control_pressed) { in.close(); return lists; }
+
//run last label if you need to
if (needToRun == true) {
if (list != NULL) { delete list; }
}
}
-
+ in.close();
return lists;
}
catch(exception& e) {
- errorOut(e, "OtuHierarchyCommand", "getListVectors");
+ m->errorOut(e, "OtuHierarchyCommand", "getListVectors");
exit(1);
}
}