X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=heatmapcommand.cpp;h=892010839f519495744e0d68518124ffa1778fae;hb=e2fa4794a30265d840fd66ed2f24de0c4d96d393;hp=b57f3a02670de0711b01bca5c52a711d4aa70292;hpb=e4c80376cc4533f66c8dfc18f3e1a86a60ac17fe;p=mothur.git diff --git a/heatmapcommand.cpp b/heatmapcommand.cpp index b57f3a0..8920108 100644 --- a/heatmapcommand.cpp +++ b/heatmapcommand.cpp @@ -9,7 +9,54 @@ #include "heatmapcommand.h" - +//********************************************************************************************************************** +vector HeatMapCommand::getValidParameters(){ + try { + string Array[] = {"groups","label","sorted","scale","fontsize","numotu","outputdir","inputdir"}; + vector myArray (Array, Array+(sizeof(Array)/sizeof(string))); + return myArray; + } + catch(exception& e) { + m->errorOut(e, "HeatMapCommand", "getValidParameters"); + exit(1); + } +} +//********************************************************************************************************************** +HeatMapCommand::HeatMapCommand(){ + try { + abort = true; + //initialize outputTypes + vector tempOutNames; + outputTypes["svg"] = tempOutNames; + } + catch(exception& e) { + m->errorOut(e, "HeatMapCommand", "HeatMapCommand"); + exit(1); + } +} +//********************************************************************************************************************** +vector HeatMapCommand::getRequiredParameters(){ + try { + vector myArray; + return myArray; + } + catch(exception& e) { + m->errorOut(e, "HeatMapCommand", "getRequiredParameters"); + exit(1); + } +} +//********************************************************************************************************************** +vector HeatMapCommand::getRequiredFiles(){ + try { + string Array[] = {"list","sabund","rabund","shared","relabund","or"}; + vector myArray (Array, Array+(sizeof(Array)/sizeof(string))); + return myArray; + } + catch(exception& e) { + m->errorOut(e, "HeatMapCommand", "getRequiredFiles"); + exit(1); + } +} //********************************************************************************************************************** HeatMapCommand::HeatMapCommand(string option) { @@ -37,15 +84,19 @@ HeatMapCommand::HeatMapCommand(string option) { if (validParameter.isValidParameter(it->first, myArray, it->second) != true) { abort = true; } } + //initialize outputTypes + vector tempOutNames; + outputTypes["svg"] = tempOutNames; + //if the user changes the output directory command factory will send this info to us in the output parameter outputDir = validParameter.validFile(parameters, "outputdir", false); if (outputDir == "not found"){ outputDir = ""; - outputDir += hasPath(globaldata->inputFileName); //if user entered a file with a path then preserve it + outputDir += m->hasPath(globaldata->inputFileName); //if user entered a file with a path then preserve it } //make sure the user has already run the read.otu command - if ((globaldata->getListFile() == "") && (globaldata->getRabundFile() == "") && (globaldata->getSabundFile() == "") && (globaldata->getSharedFile() == "")) { - m->mothurOut("You must read a list, rabund, sabund, or a list and a group, or a shared before you can use the heatmap.bin command."); m->mothurOutEndLine(); abort = true; + if ((globaldata->getListFile() == "") && (globaldata->getRabundFile() == "") && (globaldata->getSabundFile() == "") && (globaldata->getSharedFile() == "") && (globaldata->getRelAbundFile() == "")) { + m->mothurOut("You must read a list, rabund, sabund, or a list and a group, shared, or relabund file before you can use the heatmap.bin command."); m->mothurOutEndLine(); abort = true; } //check for optional parameter and set defaults @@ -53,7 +104,7 @@ HeatMapCommand::HeatMapCommand(string option) { label = validParameter.validFile(parameters, "label", false); if (label == "not found") { label = ""; } else { - if(label != "all") { splitAtDash(label, labels); allLines = 0; } + if(label != "all") { m->splitAtDash(label, labels); allLines = 0; } else { allLines = 1; } } @@ -66,7 +117,7 @@ HeatMapCommand::HeatMapCommand(string option) { groups = validParameter.validFile(parameters, "groups", false); if (groups == "not found") { groups = ""; } else { - splitAtDash(groups, Groups); + m->splitAtDash(groups, Groups); globaldata->Groups = Groups; } @@ -109,7 +160,7 @@ void HeatMapCommand::help(){ m->mothurOut("The group names are separated by dashes. The label parameter allows you to select what distance levels you would like a heatmap created for, and are also separated by dashes.\n"); m->mothurOut("The fontsize parameter allows you to adjust the font size of the picture created, default=24.\n"); m->mothurOut("The heatmap.bin command should be in the following format: heatmap.bin(groups=yourGroups, sorted=yourSorted, label=yourLabels).\n"); - m->mothurOut("Example heatmap.bin(groups=A-B-C, sorted=F, scale=log10).\n"); + m->mothurOut("Example heatmap.bin(groups=A-B-C, sorted=none, scale=log10).\n"); m->mothurOut("The default value for groups is all the groups in your groupfile, and all labels in your inputfile will be used.\n"); m->mothurOut("The default value for scale is log10; your other options are log2 and linear.\n"); m->mothurOut("The heatmap.bin command outputs a .svg file for each label you specify.\n"); @@ -152,19 +203,23 @@ int HeatMapCommand::execute(){ //you are using just a list file and have only one group rabund = globaldata->rabund; lastLabel = rabund->getLabel(); + }else if (format == "relabund") { + //you have groups + lookupFloat = input->getSharedRAbundFloatVectors(); + lastLabel = lookupFloat[0]->getLabel(); } //if the users enters label "0.06" and there is no "0.06" in their file use the next lowest label. set processedLabels; set userLabels = labels; - if ((format != "list") && (format != "rabund") && (format != "sabund")) { + if (format == "sharedfile") { //as long as you are not at the end of the file or done wih the lines you want while((lookup[0] != NULL) && ((allLines == 1) || (userLabels.size() != 0))) { if (m->control_pressed) { for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } - for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } + for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } outputTypes.clear(); globaldata->Groups.clear(); delete read; delete heatmap; return 0; } @@ -172,20 +227,23 @@ int HeatMapCommand::execute(){ if(allLines == 1 || labels.count(lookup[0]->getLabel()) == 1){ m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); - outputNames.push_back(heatmap->getPic(lookup)); + string outputFileName = heatmap->getPic(lookup); + outputNames.push_back(outputFileName); outputTypes["svg"].push_back(outputFileName); processedLabels.insert(lookup[0]->getLabel()); userLabels.erase(lookup[0]->getLabel()); } - if ((anyLabelsToProcess(lookup[0]->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) { + if ((m->anyLabelsToProcess(lookup[0]->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) { string saveLabel = lookup[0]->getLabel(); - + for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } + lookup = input->getSharedRAbundVectors(lastLabel); m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); - outputNames.push_back(heatmap->getPic(lookup)); + string outputFileName = heatmap->getPic(lookup); + outputNames.push_back(outputFileName); outputTypes["svg"].push_back(outputFileName); processedLabels.insert(lookup[0]->getLabel()); userLabels.erase(lookup[0]->getLabel()); @@ -204,7 +262,7 @@ int HeatMapCommand::execute(){ if (m->control_pressed) { - for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } + for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } outputTypes.clear(); globaldata->Groups.clear(); delete read; delete heatmap; return 0; } @@ -228,38 +286,41 @@ int HeatMapCommand::execute(){ lookup = input->getSharedRAbundVectors(lastLabel); m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); - outputNames.push_back(heatmap->getPic(lookup)); + string outputFileName = heatmap->getPic(lookup); + outputNames.push_back(outputFileName); outputTypes["svg"].push_back(outputFileName); for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } } //reset groups parameter globaldata->Groups.clear(); - }else{ + }else if ((format == "list") || (format == "rabund") || (format == "sabund")) { while((rabund != NULL) && ((allLines == 1) || (userLabels.size() != 0))) { if (m->control_pressed) { - for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } + for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } outputTypes.clear(); delete rabund; delete read; delete heatmap; return 0; } if(allLines == 1 || labels.count(rabund->getLabel()) == 1){ m->mothurOut(rabund->getLabel()); m->mothurOutEndLine(); - outputNames.push_back(heatmap->getPic(rabund)); + string outputFileName = heatmap->getPic(rabund); + outputNames.push_back(outputFileName); outputTypes["svg"].push_back(outputFileName); processedLabels.insert(rabund->getLabel()); userLabels.erase(rabund->getLabel()); } - if ((anyLabelsToProcess(rabund->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) { + if ((m->anyLabelsToProcess(rabund->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) { string saveLabel = rabund->getLabel(); delete rabund; rabund = input->getRAbundVector(lastLabel); m->mothurOut(rabund->getLabel()); m->mothurOutEndLine(); - outputNames.push_back(heatmap->getPic(rabund)); + string outputFileName = heatmap->getPic(rabund); + outputNames.push_back(outputFileName); outputTypes["svg"].push_back(outputFileName); processedLabels.insert(rabund->getLabel()); userLabels.erase(rabund->getLabel()); @@ -276,7 +337,7 @@ int HeatMapCommand::execute(){ } if (m->control_pressed) { - for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } + for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } outputTypes.clear(); delete read; delete heatmap; return 0; } @@ -300,17 +361,98 @@ int HeatMapCommand::execute(){ rabund = input->getRAbundVector(lastLabel); m->mothurOut(rabund->getLabel()); m->mothurOutEndLine(); - outputNames.push_back(heatmap->getPic(rabund)); + string outputFileName = heatmap->getPic(rabund); + outputNames.push_back(outputFileName); outputTypes["svg"].push_back(outputFileName); delete rabund; globaldata->rabund = NULL; } + }else { + + //as long as you are not at the end of the file or done wih the lines you want + while((lookupFloat[0] != NULL) && ((allLines == 1) || (userLabels.size() != 0))) { + if (m->control_pressed) { + for (int i = 0; i < lookupFloat.size(); i++) { delete lookupFloat[i]; } + for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } outputTypes.clear(); + globaldata->Groups.clear(); + delete read; delete heatmap; return 0; + } + + if(allLines == 1 || labels.count(lookupFloat[0]->getLabel()) == 1){ + + m->mothurOut(lookupFloat[0]->getLabel()); m->mothurOutEndLine(); + string outputFileName = heatmap->getPic(lookupFloat); + outputNames.push_back(outputFileName); outputTypes["svg"].push_back(outputFileName); + + processedLabels.insert(lookupFloat[0]->getLabel()); + userLabels.erase(lookupFloat[0]->getLabel()); + } + + if ((m->anyLabelsToProcess(lookupFloat[0]->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) { + string saveLabel = lookupFloat[0]->getLabel(); + + for (int i = 0; i < lookupFloat.size(); i++) { delete lookupFloat[i]; } + lookupFloat = input->getSharedRAbundFloatVectors(lastLabel); + m->mothurOut(lookupFloat[0]->getLabel()); m->mothurOutEndLine(); + + string outputFileName = heatmap->getPic(lookupFloat); + outputNames.push_back(outputFileName); outputTypes["svg"].push_back(outputFileName); + + processedLabels.insert(lookupFloat[0]->getLabel()); + userLabels.erase(lookupFloat[0]->getLabel()); + + //restore real lastlabel to save below + lookupFloat[0]->setLabel(saveLabel); + } + + lastLabel = lookupFloat[0]->getLabel(); + //prevent memory leak + for (int i = 0; i < lookupFloat.size(); i++) { delete lookupFloat[i]; lookupFloat[i] = NULL; } + + //get next line to process + lookupFloat = input->getSharedRAbundFloatVectors(); + } + + + if (m->control_pressed) { + for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } outputTypes.clear(); + globaldata->Groups.clear(); + delete read; delete heatmap; return 0; + } + + //output error messages about any remaining user labels + set::iterator it; + bool needToRun = false; + for (it = userLabels.begin(); it != userLabels.end(); it++) { + m->mothurOut("Your file does not include the label " + *it); + if (processedLabels.count(lastLabel) != 1) { + m->mothurOut(". I will use " + lastLabel + "."); m->mothurOutEndLine(); + needToRun = true; + }else { + m->mothurOut(". Please refer to " + lastLabel + "."); m->mothurOutEndLine(); + } + } + + //run last label if you need to + if (needToRun == true) { + for (int i = 0; i < lookupFloat.size(); i++) { if (lookupFloat[i] != NULL) { delete lookupFloat[i]; } } + lookupFloat = input->getSharedRAbundFloatVectors(lastLabel); + + m->mothurOut(lookupFloat[0]->getLabel()); m->mothurOutEndLine(); + string outputFileName = heatmap->getPic(lookupFloat); + outputNames.push_back(outputFileName); outputTypes["svg"].push_back(outputFileName); + for (int i = 0; i < lookupFloat.size(); i++) { delete lookupFloat[i]; } + } + + //reset groups parameter + globaldata->Groups.clear(); + } globaldata->rabund = NULL; delete input; globaldata->ginput = NULL; if (m->control_pressed) { - for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } + for (int i = 0; i < outputNames.size(); i++) { if (outputNames[i] != "control") { remove(outputNames[i].c_str()); } } outputTypes.clear(); delete read; delete heatmap; return 0; } @@ -318,7 +460,7 @@ int HeatMapCommand::execute(){ m->mothurOut("Output File Names: "); m->mothurOutEndLine(); for (int i = 0; i < outputNames.size(); i++) { m->mothurOut(outputNames[i]); m->mothurOutEndLine(); } m->mothurOutEndLine(); - + delete read; delete heatmap;