From f20505bcd9f07e0b5f967be0e8d414076d9a5678 Mon Sep 17 00:00:00 2001 From: westcott Date: Fri, 3 Apr 2009 13:36:40 +0000 Subject: [PATCH] venn command with up to 4 groups using sharedsobs, sharedchao and sharedace estimators for shared as well as sobs, chao, ace and jackknife for singles. --- globaldata.cpp | 8 + helpcommand.cpp | 11 ++ summarycommand.cpp | 3 +- validcalculator.cpp | 66 +++++++- validcalculator.h | 5 + validparameter.cpp | 2 +- venn.cpp | 380 +++++++++++++++++++++++++++++++------------- venn.h | 9 +- venncommand.cpp | 56 ++++++- venncommand.h | 4 + 10 files changed, 418 insertions(+), 126 deletions(-) diff --git a/globaldata.cpp b/globaldata.cpp index 64a7c93..da81879 100644 --- a/globaldata.cpp +++ b/globaldata.cpp @@ -190,6 +190,14 @@ void GlobalData::parseGlobalData(string commandString, string optionText){ Estimators.clear(); splitAtDash(calc, Estimators); } + if (commandName == "venn") { + if ((calc == "default") || (calc == "")) { + if (format == "list") { calc = "sobs"; } + else { calc = "sharedsobs"; } + } + Estimators.clear(); + splitAtDash(calc, Estimators); + } //if you have done a read.otu with a groupfile but don't want to use it anymore because you want to do single commands if ((commandName == "collect.single") || (commandName == "rarefaction.single") || (commandName == "summary.single")) { diff --git a/helpcommand.cpp b/helpcommand.cpp index c50f251..d695773 100644 --- a/helpcommand.cpp +++ b/helpcommand.cpp @@ -198,6 +198,17 @@ int HelpCommand::execute(){ cout << "The default value for sorted is 1 meaning you want the shared otus on top, you may change it to 0 meaning the exact representation of your input file." << "\n"; cout << "The heatmap command outputs a .svg file for each line or label you specify." << "\n"; cout << "Note: No spaces between parameter labels (i.e. groups), '=' and parameters (i.e.yourGroups)." << "\n" << "\n"; + }else if (globaldata->helpRequest == "venn") { + cout << "The venn command can only be executed after a successful read.otu command." << "\n"; + cout << "The venn command parameters are groups, calc, line and label. No parameters are required, but you may not use line and label at the same time." << "\n"; + cout << "The groups parameter allows you to specify which of the groups in your groupfile you would like included in your venn diagram, you may only use a maximum of 4 groups." << "\n"; + cout << "The group names are separated by dashes. The line and label allow you to select what distance levels you would like a venn diagram created for, and are also separated by dashes." << "\n"; + cout << "The venn command should be in the following format: venn(groups=yourGroups, calc=yourSorted, line=yourLines, label=yourLabels)." << "\n"; + cout << "Example venn(groups=A-B-C, line=1-3-5, calc=sharedsobs-sharedchao)." << "\n"; + cout << "The default value for groups is all the groups in your groupfile up to 4, and all lines in your inputfile will be used." << "\n"; + cout << "The default value for calc is sobs if you have only read a list file or if you have selected only one group, and sharedsobs if you have multiple groups." << "\n"; + cout << "The venn command outputs a .svg file for each calculator you specify at each distance you choose." << "\n"; + cout << "Note: No spaces between parameter labels (i.e. groups), '=' and parameters (i.e.yourGroups)." << "\n" << "\n"; }else if (globaldata->helpRequest == "quit") { cout << "The quit command will terminate Dotur and should be in the following format: " << "\n"; cout << "quit()" << "\n" << "\n"; diff --git a/summarycommand.cpp b/summarycommand.cpp index 8c8a2aa..05fc6e8 100644 --- a/summarycommand.cpp +++ b/summarycommand.cpp @@ -33,7 +33,6 @@ SummaryCommand::SummaryCommand(){ for (i=0; iEstimators.size(); i++) { if (validCalculator->isValidCalculator("summary", globaldata->Estimators[i]) == true) { - if(globaldata->Estimators[i] == "sobs"){ sumCalculators.push_back(new Sobs()); }else if(globaldata->Estimators[i] == "chao"){ @@ -128,7 +127,7 @@ int SummaryCommand::execute(){ for(int i=0;i data = sumCalculators[i]->getValues(sabund); outputFileHandle << '\t'; - //sumCalculators[i]->print(outputFileHandle); + sumCalculators[i]->print(outputFileHandle); } outputFileHandle << endl; diff --git a/validcalculator.cpp b/validcalculator.cpp index 4c01445..a875900 100644 --- a/validcalculator.cpp +++ b/validcalculator.cpp @@ -18,6 +18,8 @@ ValidCalculators::ValidCalculators() { initialSharedRarefact(); initialSummary(); initialSharedSummary(); + initialVennSingle(); + initialVennShared(); } catch(exception& e) { cout << "Standard Error: " << e.what() << " has occurred in the ValidCalculator class Function ValidCalculator. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; @@ -108,7 +110,29 @@ bool ValidCalculators::isValidCalculator(string parameter, string calculator) { } cout << endl; return false; } - //not a valid paramter + }else if (parameter == "vennsingle") { + //is it valid + if ((vennsingle.find(calculator)) != (vennsingle.end())) { + return true; + }else { + cout << calculator << " is not a valid estimator for the venn command in single mode and will be disregarded. Valid estimators are "; + for (it = vennsingle.begin(); it != vennsingle.end(); it++) { + cout << it->first << ", "; + } + cout << endl; + return false; } + }else if (parameter == "vennshared") { + //is it valid + if ((vennshared.find(calculator)) != (vennshared.end())) { + return true; + }else { + cout << calculator << " is not a valid estimator for the venn command in shared mode and will be disregarded. Valid estimators are "; + for (it = vennshared.begin(); it != vennshared.end(); it++) { + cout << it->first << ", "; + } + cout << endl; + return false; } + //not a valid parameter }else { return false; } } @@ -125,7 +149,6 @@ bool ValidCalculators::isValidCalculator(string parameter, string calculator) { /********************************************************************/ void ValidCalculators::initialSingle() { try { - single["sobs"] = "sobs"; single["chao"] = "chao"; single["ace"] = "ace"; @@ -141,7 +164,6 @@ void ValidCalculators::initialSingle() { single["bstick"] = "bstick"; single["nseqs"] = "nseqs"; single["default"] = "default"; - } catch(exception& e) { cout << "Standard Error: " << e.what() << " has occurred in the ValidCalculator class Function initialSingle. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; @@ -298,6 +320,44 @@ void ValidCalculators::initialSharedRarefact() { } } + +/********************************************************************/ +void ValidCalculators::initialVennSingle() { + try { + vennsingle["sobs"] = "sobs"; + vennsingle["chao"] = "chao"; + vennsingle["ace"] = "ace"; + vennsingle["jack"] = "jack"; + vennsingle["default"] = "default"; + } + catch(exception& e) { + cout << "Standard Error: " << e.what() << " has occurred in the ValidCalculator class Function initialSingle. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the ValidCalculator class function initialSingle. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } +} + +/********************************************************************/ +void ValidCalculators::initialVennShared() { + try { + vennshared["sharedsobs"] = "sharedsobs"; + vennshared["sharedchao"] = "sharedchao"; + vennshared["sharedace"] = "sharedace"; + vennshared["default"] = "default"; + } + catch(exception& e) { + cout << "Standard Error: " << e.what() << " has occurred in the ValidCalculator class Function initialSingle. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the ValidCalculator class function initialSingle. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } +} + /********************************************************************/ diff --git a/validcalculator.h b/validcalculator.h index 1534432..1c39d49 100644 --- a/validcalculator.h +++ b/validcalculator.h @@ -31,6 +31,8 @@ class ValidCalculators { map summary; map sharedrarefaction; map sharedsummary; + map vennsingle; + map vennshared; map::iterator it; void initialSingle(); @@ -39,6 +41,9 @@ class ValidCalculators { void initialSharedRarefact(); void initialSummary(); void initialSharedSummary(); + void initialVennSingle(); + void initialVennShared(); + }; #endif diff --git a/validparameter.cpp b/validparameter.cpp index 084068d..3806f50 100644 --- a/validparameter.cpp +++ b/validparameter.cpp @@ -286,7 +286,7 @@ void ValidParameters::initCommandParameters() { string heatmapArray[] = {"group","line","label","sorted"}; commandParameters["heatmap"] = addParameters(heatmapArray, sizeof(heatmapArray)/sizeof(string)); - string vennArray[] = {"groups","line","label"}; + string vennArray[] = {"groups","line","label","calc"}; commandParameters["venn"] = addParameters(vennArray, sizeof(vennArray)/sizeof(string)); string quitArray[] = {}; diff --git a/venn.cpp b/venn.cpp index 98c63a1..6da78bb 100644 --- a/venn.cpp +++ b/venn.cpp @@ -8,13 +8,16 @@ */ #include "venn.h" +#include "ace.h" +#include "sobs.h" +#include "chao1.h" + //********************************************************************************************************************** Venn::Venn(){ try { globaldata = GlobalData::getInstance(); format = globaldata->getFormat(); - } catch(exception& e) { cout << "Standard Error: " << e.what() << " has occurred in the Venn class Function Venn. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; @@ -26,27 +29,34 @@ Venn::Venn(){ } } //********************************************************************************************************************** -void Venn::getPic(OrderVector* order) { +void Venn::getPic(OrderVector* order, vector vCalcs) { try { + SAbundVector s; + s = order->getSAbundVector(); sabund = &s; - rabund = order->getRAbundVector(); - - string filenamesvg = globaldata->inputFileName + ".venn." + order->getLabel() + ".svg"; - - openOutputFile(filenamesvg, outsvg); - + for(int i=0;iinputFileName + ".venn." + order->getLabel() + vCalcs[i]->getName() + ".svg"; + openOutputFile(filenamesvg, outsvg); + + vector data = vCalcs[i]->getValues(sabund); - //svg image - outsvg << "\n"; - outsvg << "\n"; + //svg image + outsvg << "\n"; + outsvg << "\n"; - outsvg << ""; - outsvg << "Venn Diagram at distance " + order->getLabel() + "\n"; - outsvg << ""; - outsvg << "" + toString(rabund.getNumBins()) + "\n"; - outsvg << "\n\n"; - - outsvg.close(); + outsvg << ""; + outsvg << "Venn Diagram at distance " + order->getLabel() + "\n"; + outsvg << ""; + outsvg << "" + toString(data[0]) + "\n"; + + if (data.size() == 3) { + outsvg << "The lower bound of the confidence interval is " + toString(data[1]) + "\n"; + outsvg << "The upper bound of the confidence interval is " + toString(data[2]) + "\n"; + } + + outsvg << "\n\n"; + outsvg.close(); + } } catch(exception& e) { cout << "Standard Error: " << e.what() << " has occurred in the Venn class Function getPic. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; @@ -58,100 +68,238 @@ void Venn::getPic(OrderVector* order) { } } //********************************************************************************************************************** -void Venn::getPic(SharedOrderVector* sharedorder) { +void Venn::getPic(SharedOrderVector* sharedorder, vector vCalcs) { try { //fills vector of sharedsabunds - lookup getSharedVectors(sharedorder); - - string filenamesvg = globaldata->inputFileName + ".venn." + sharedorder->getLabel() + "." + groupComb + ".svg"; - openOutputFile(filenamesvg, outsvg); - //image window - outsvg << "\n"; - outsvg << "\n"; - + /******************* 1 Group **************************/ if (lookup.size() == 1) { - int numA = 0; - //for each bin - for (int i = 0; i < lookup[0]->size(); i++) { - //are they only in one - if (lookup[0]->getAbundance(i) != 0) { numA++; } + + SAbundVector s; + s = lookup[0]->getSAbundVector(); sabund = &s; + + //make a file for each calculator + for(int i=0;iinputFileName + ".venn." + sharedorder->getLabel() + vCalcs[i]->getName() + "." + groupComb + ".svg"; + openOutputFile(filenamesvg, outsvg); + + //in essence you want to run it like a single + if (vCalcs[i]->getName() == "SharedSobs") { + delete vCalcs[i]; + vCalcs[i] = new Sobs(); + }else if (vCalcs[i]->getName() == "SharedChao") { + delete vCalcs[i]; + vCalcs[i] = new Chao1(); + }else if (vCalcs[i]->getName() == "SharedAce") { + delete vCalcs[i]; + vCalcs[i] = new Ace(10); + } + + vector data = vCalcs[i]->getValues(sabund); + + //svg image + outsvg << "\n"; + outsvg << "\n"; + + outsvg << ""; + outsvg << "Venn Diagram at distance " + sharedorder->getLabel() + "\n"; + outsvg << ""; + outsvg << "" + toString(data[0]) + "\n"; + + if (data.size() == 3) { + outsvg << "The lower bound of the confidence interval is " + toString(data[1]) + "\n"; + outsvg << "The upper bound of the confidence interval is " + toString(data[2]) + "\n"; + } + + outsvg << "\n\n"; + outsvg.close(); } - - outsvg << ""; - outsvg << "Venn Diagram at distance " + sharedorder->getLabel() + "\n"; - outsvg << ""; - outsvg << "" + toString(numA) + "\n"; + /******************* 2 Groups **************************/ + }else if (lookup.size() == 2) { - //calc the shared otu - int shared = 0; - int numA = 0; - int numB = 0; + //get sabund vector pointers so you can use the single calculators + //one for each group + SAbundVector sA, sB; + SAbundVector* sabundA; SAbundVector* sabundB; + sA = lookup[0]->getSAbundVector(); sabundA = &sA; + sB = lookup[1]->getSAbundVector(); sabundB = &sB; - //for each bin - for (int i = 0; i < lookup[0]->size(); i++) { - //are they only in one - if ((lookup[0]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) == 0)) { numA++; } - if ((lookup[1]->getAbundance(i) != 0) && (lookup[0]->getAbundance(i) == 0)) { numB++; } - //are they shared - if ((lookup[0]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) != 0)) { shared++; } + //make a file for each calculator + for(int i=0;iinputFileName + ".venn." + sharedorder->getLabel() + vCalcs[i]->getName() + "." + groupComb + ".svg"; + openOutputFile(filenamesvg, outsvg); + + //get estimates for sharedAB + vector shared = vCalcs[i]->getValues(lookup[0], lookup[1]); + + //in essence you want to run it like a single + if (vCalcs[i]->getName() == "SharedSobs") { + delete vCalcs[i]; + vCalcs[i] = new Sobs(); + }else if (vCalcs[i]->getName() == "SharedChao") { + delete vCalcs[i]; + vCalcs[i] = new Chao1(); + }else if (vCalcs[i]->getName() == "SharedAce") { + delete vCalcs[i]; + vCalcs[i] = new Ace(10); + } + + //get estimates for numA + vector numA = vCalcs[i]->getValues(sabundA); + + //get estimates for numB + vector numB = vCalcs[i]->getValues(sabundB); + + + //image window + outsvg << "\n"; + outsvg << "\n"; + + //draw circles + outsvg << ""; + outsvg << "Venn Diagram at distance " + sharedorder->getLabel() + "\n"; + outsvg << ""; + outsvg << ""; + outsvg << "" + toString(numA[0] - shared[0]) + "\n"; + outsvg << "" + toString(numB[0] - shared[0]) + "\n"; + outsvg << "" + toString(shared[0]) + "\n"; + outsvg << "The number of species in group " + globaldata->Groups[0] + " is " + toString(numA[0]) + "\n"; + outsvg << "The number of species in group " + globaldata->Groups[1] + " is " + toString(numB[0]) + "\n"; + outsvg << "The number of sepecies shared between groups " + globaldata->Groups[0] + " and " + globaldata->Groups[1] + " is " + toString(shared[0]) + "\n"; + outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[1] + " is " + toString((shared[0] / (float)(numA[0] + numB[0] - shared[0]))) + "\n"; + + //close file + outsvg << "\n\n"; + outsvg.close(); + } - //draw circles - outsvg << ""; - outsvg << "Venn Diagram at distance " + sharedorder->getLabel() + "\n"; - outsvg << ""; - outsvg << ""; - outsvg << "" + toString(numA) + "\n"; - outsvg << "" + toString(numB) + "\n"; - outsvg << "" + toString(shared) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[1] + " is " + toString((shared / (float)(numA + numB + shared))) + "\n"; - + /******************* 3 Groups **************************/ + }else if (lookup.size() == 3) { - //calc the shared otu - int sharedABC = 0; - int numA = 0; int numB = 0; int numC = 0; - int sharedAB = 0; int sharedAC = 0; int sharedBC = 0; + //get sabund vector pointers so you can use the single calculators + //one for each group + SAbundVector sA, sB, sC; + SAbundVector* sabundA; SAbundVector* sabundB; SAbundVector* sabundC; + sA = lookup[0]->getSAbundVector(); sabundA = &sA; + sB = lookup[1]->getSAbundVector(); sabundB = &sB; + sC = lookup[2]->getSAbundVector(); sabundC = &sC; - //float scalerB; + //make a file for each calculator + for(int i=0;iinputFileName + ".venn." + sharedorder->getLabel() + vCalcs[i]->getName() + "." + groupComb + ".svg"; + openOutputFile(filenamesvg, outsvg); + + //get estimates for sharedAB, sharedAC and sharedBC + vector sharedAB = vCalcs[i]->getValues(lookup[0], lookup[1]); + vector sharedAC = vCalcs[i]->getValues(lookup[0], lookup[2]); + vector sharedBC = vCalcs[i]->getValues(lookup[1], lookup[2]); - //for each bin - for (int i = 0; i < lookup[0]->size(); i++) { - //are they only in one - if ((lookup[0]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) == 0) && (lookup[2]->getAbundance(i) == 0)) { numA++; } - if ((lookup[1]->getAbundance(i) != 0) && (lookup[0]->getAbundance(i) == 0) && (lookup[2]->getAbundance(i) == 0)) { numB++; } - if ((lookup[2]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) == 0) && (lookup[0]->getAbundance(i) == 0)) { numC++; } - //are they shared by 2 - if ((lookup[0]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) != 0) && (lookup[2]->getAbundance(i) == 0)) { sharedAB++; } - if ((lookup[0]->getAbundance(i) != 0) && (lookup[2]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) == 0)) { sharedAC++; } - if ((lookup[2]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) != 0) && (lookup[0]->getAbundance(i) == 0)) { sharedBC++; } + //merge BC and estimate with shared with A + SharedRAbundVector* merge = new SharedRAbundVector(); + for (int j = 0; j < lookup[1]->size(); j++) { + merge->push_back((lookup[1]->getAbundance(j) + lookup[2]->getAbundance(j)), j, ""); + } - //are they shared by all - if ((lookup[0]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) != 0) && (lookup[2]->getAbundance(i) != 0)) { sharedABC++; } - } - - //draw circles - outsvg << ""; - outsvg << "Venn Diagram at distance " + sharedorder->getLabel() + "\n"; - outsvg << ""; - outsvg << ""; - outsvg << ""; + vector sharedAwithBC = vCalcs[i]->getValues(lookup[0], merge); - //place labels within overlaps - outsvg << "" + toString(numA) + "\n"; - outsvg << "" + toString(sharedAB) + "\n"; - outsvg << "" + toString(numB) + "\n"; - outsvg << "" + toString(sharedAC) + "\n"; - outsvg << "" + toString(numC) + "\n"; - outsvg << "" + toString(sharedBC) + "\n"; - outsvg << "" + toString(sharedABC) + "\n"; + delete merge; + //merge AC and estimate with shared with B + merge = new SharedRAbundVector(); + for (int j = 0; j < lookup[0]->size(); j++) { + merge->push_back((lookup[0]->getAbundance(j) + lookup[2]->getAbundance(j)), j, ""); + } + + vector sharedBwithAC = vCalcs[i]->getValues(lookup[1], merge); - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[1] + " is " + toString(((sharedAB + sharedABC) / (float)(numA + numB + sharedAB + sharedABC))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[2] + " is " + toString(((sharedAC + sharedABC) / (float)(numA + numC + sharedAC + sharedABC))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[1] + " and " + globaldata->Groups[2] + " is " + toString(((sharedBC + sharedABC) / (float)(numB + numC + sharedBC + sharedABC))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + ", " + globaldata->Groups[1] + " and " + globaldata->Groups[2] + " is " + toString((sharedABC / (float)(numA + numB + numC + sharedAB + sharedAC + sharedBC + sharedABC))) + "\n"; + delete merge; + //merge AB and estimate with shared with C + merge = new SharedRAbundVector(); + for (int j = 0; j < lookup[0]->size(); j++) { + merge->push_back((lookup[0]->getAbundance(j) + lookup[1]->getAbundance(j)), j, ""); + } + + vector sharedCwithAB = vCalcs[i]->getValues(lookup[2], merge); + + + //in essence you want to run it like a single + if (vCalcs[i]->getName() == "SharedSobs") { + delete vCalcs[i]; + vCalcs[i] = new Sobs(); + }else if (vCalcs[i]->getName() == "SharedChao") { + delete vCalcs[i]; + vCalcs[i] = new Chao1(); + }else if (vCalcs[i]->getName() == "SharedAce") { + delete vCalcs[i]; + vCalcs[i] = new Ace(10); + } + + //get estimates for numA + vector numA = vCalcs[i]->getValues(sabundA); + + //get estimates for numB + vector numB = vCalcs[i]->getValues(sabundB); + + //get estimates for numC + vector numC = vCalcs[i]->getValues(sabundC); + + //find possible sharedABC values + float sharedABC1, sharedABC2, sharedABC3, sharedABC; + + sharedABC1 = sharedAB[0] + sharedAC[0] - sharedAwithBC[0]; + sharedABC2 = sharedAB[0] + sharedBC[0] - sharedBwithAC[0]; + sharedABC3 = sharedAC[0] + sharedBC[0] - sharedCwithAB[0]; + + //if any of the possible m's are - throw them out + if (sharedABC1 < 0.0) { sharedABC1 = 0; } + if (sharedABC2 < 0.0) { sharedABC2 = 0; } + if (sharedABC3 < 0.0) { sharedABC3 = 0; } + + //sharedABC is the minimum of the 3 possibilities + if ((sharedABC1 < sharedABC2) && (sharedABC1 < sharedABC3)) { sharedABC = sharedABC1; } + else if ((sharedABC2 < sharedABC1) && (sharedABC2 < sharedABC3)) { sharedABC = sharedABC2; } + else if ((sharedABC3 < sharedABC1) && (sharedABC3 < sharedABC2)) { sharedABC = sharedABC3; } + + //image window + outsvg << "\n"; + outsvg << "\n"; + + //draw circles + outsvg << ""; + outsvg << "Venn Diagram at distance " + sharedorder->getLabel() + "\n"; + outsvg << ""; + outsvg << ""; + outsvg << ""; + + //place labels within overlaps + outsvg << "" + toString(numA[0]-sharedAwithBC[0]) + "\n"; + outsvg << "" + toString(sharedAB[0] - sharedABC) + "\n"; + outsvg << "" + toString(numB[0]-sharedBwithAC[0]) + "\n"; + outsvg << "" + toString(sharedAC[0] - sharedABC) + "\n"; + outsvg << "" + toString(numC[0]-sharedCwithAB[0]) + "\n"; + outsvg << "" + toString(sharedBC[0] - sharedABC) + "\n"; + outsvg << "" + toString(sharedABC) + "\n"; + + outsvg << "The number of sepecies shared between groups " + globaldata->Groups[0] + " and " + globaldata->Groups[1] + " is " + toString(sharedAB[0]) + "\n"; + outsvg << "The number of sepecies shared between groups " + globaldata->Groups[0] + " and " + globaldata->Groups[2] + " is " + toString(sharedAC[0]) + "\n"; + outsvg << "The number of sepecies shared between groups " + globaldata->Groups[1] + " and " + globaldata->Groups[2] + " is " + toString(sharedBC[0]) + "\n"; + outsvg << "The number of sepecies shared between groups " + globaldata->Groups[0] + " and combined groups " + globaldata->Groups[1] + globaldata->Groups[2] + " is " + toString(sharedAwithBC[0]) + "\n"; + outsvg << "The number of sepecies shared between groups " + globaldata->Groups[1] + " and combined groups " + globaldata->Groups[0] + globaldata->Groups[2] + " is " + toString(sharedBwithAC[0]) + "\n"; + outsvg << "The number of sepecies shared between groups " + globaldata->Groups[2] + " and combined groups " + globaldata->Groups[0] + globaldata->Groups[1] + " is " + toString(sharedCwithAB[0]) + "\n"; + outsvg << "The number of species in group " + globaldata->Groups[0] + " is " + toString(numA[0]) + "\n"; + outsvg << "The number of species in group " + globaldata->Groups[1] + " is " + toString(numB[0]) + "\n"; + outsvg << "The number of species in group " + globaldata->Groups[2] + " is " + toString(numC[0]) + "\n"; + outsvg << "The total number of species in all groups is " + toString(numA[0] + numB[0] + numC[0] - sharedAB[0] - sharedAC[0] - sharedBC[0] + sharedABC) + "\n"; + + //close file + outsvg << "\n\n"; + outsvg.close(); + } + + /******************* 4 Groups **************************/ }else if (lookup.size() == 4) { //calc the shared otu @@ -162,7 +310,7 @@ void Venn::getPic(SharedOrderVector* sharedorder) { //A = red, B = green, C = blue, D = yellow - //float scalerB; + if ((vCalcs.size() > 1) || (vCalcs[0]->getName() != "SharedSobs")) { cout << "The only calculator able to be used with 4 groups is sharedsobs. I will run that for you. " << endl; } //for each bin for (int i = 0; i < lookup[0]->size(); i++) { @@ -186,7 +334,14 @@ void Venn::getPic(SharedOrderVector* sharedorder) { //are they shared by all if ((lookup[0]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) != 0) && (lookup[2]->getAbundance(i) != 0) && (lookup[3]->getAbundance(i) != 0)) { sharedABCD++; } } - + + string filenamesvg = globaldata->inputFileName + ".venn." + sharedorder->getLabel() + "." + groupComb + ".svg"; + openOutputFile(filenamesvg, outsvg); + + //image window + outsvg << "\n"; + outsvg << "\n"; + //draw circles outsvg << ""; outsvg << "Venn Diagram at distance " + sharedorder->getLabel() + "\n"; @@ -214,23 +369,25 @@ void Venn::getPic(SharedOrderVector* sharedorder) { outsvg << "" + toString(sharedABC) + "\n"; outsvg << "" + toString(sharedABCD) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[1] + " is " + toString(((sharedAB + sharedABD + sharedABC + sharedABCD) / (float)(numA + numB + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[2] + " is " + toString(((sharedAC + sharedACD + sharedABC + sharedABCD) / (float)(numA + numC + sharedAB + sharedAC + sharedAD + sharedBC + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[3] + " is " + toString(((sharedAD + sharedACD + sharedABD + sharedABCD) / (float)(numA + numD + sharedAB + sharedAC + sharedAD + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[1] + " and " + globaldata->Groups[2] + " is " + toString(((sharedBC + sharedABC + sharedBCD + sharedABCD) / (float)(numB + numC + sharedAB + sharedAC + sharedCD + sharedBD + sharedBC + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[1] + " and " + globaldata->Groups[3] + " is " + toString(((sharedBD + sharedABD + sharedBCD + sharedABCD) / (float)(numB + numD + sharedAB + sharedAD + sharedCD + sharedBD + sharedBC + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[2] + " and " + globaldata->Groups[3] + " is " + toString(((sharedCD + sharedBCD + sharedACD + sharedABCD) / (float)(numC + numD + sharedAC + sharedAD + sharedCD + sharedBD + sharedBC + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + ", " + globaldata->Groups[1] + " and " + globaldata->Groups[2] + " is " + toString(((sharedABC + sharedABCD) / (float)(numA + numB + numC + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + ", " + globaldata->Groups[1] + " and " + globaldata->Groups[3] + " is " + toString(((sharedABD + sharedABCD) / (float)(numA + numB + numD + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + ", " + globaldata->Groups[2] + " and " + globaldata->Groups[3] + " is " + toString(((sharedACD + sharedABCD) / (float)(numA + numC + numD + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[1] + ", " + globaldata->Groups[2] + " and " + globaldata->Groups[3] + " is " + toString(((sharedBCD + sharedABCD) / (float)(numB + numC + numD + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; - outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + ", " + globaldata->Groups[1] + ", " + globaldata->Groups[2] + " and " + globaldata->Groups[3] + " is " + toString((sharedABCD / (float)(numA + numB + numC + numD + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[1] + " is " + toString(((sharedAB + sharedABD + sharedABC + sharedABCD) / (float)(numA + numB + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[2] + " is " + toString(((sharedAC + sharedACD + sharedABC + sharedABCD) / (float)(numA + numC + sharedAB + sharedAC + sharedAD + sharedBC + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + " and " + globaldata->Groups[3] + " is " + toString(((sharedAD + sharedACD + sharedABD + sharedABCD) / (float)(numA + numD + sharedAB + sharedAC + sharedAD + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[1] + " and " + globaldata->Groups[2] + " is " + toString(((sharedBC + sharedABC + sharedBCD + sharedABCD) / (float)(numB + numC + sharedAB + sharedAC + sharedCD + sharedBD + sharedBC + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[1] + " and " + globaldata->Groups[3] + " is " + toString(((sharedBD + sharedABD + sharedBCD + sharedABCD) / (float)(numB + numD + sharedAB + sharedAD + sharedCD + sharedBD + sharedBC + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[2] + " and " + globaldata->Groups[3] + " is " + toString(((sharedCD + sharedBCD + sharedACD + sharedABCD) / (float)(numC + numD + sharedAC + sharedAD + sharedCD + sharedBD + sharedBC + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + ", " + globaldata->Groups[1] + " and " + globaldata->Groups[2] + " is " + toString(((sharedABC + sharedABCD) / (float)(numA + numB + numC + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + ", " + globaldata->Groups[1] + " and " + globaldata->Groups[3] + " is " + toString(((sharedABD + sharedABCD) / (float)(numA + numB + numD + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + ", " + globaldata->Groups[2] + " and " + globaldata->Groups[3] + " is " + toString(((sharedACD + sharedABCD) / (float)(numA + numC + numD + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[1] + ", " + globaldata->Groups[2] + " and " + globaldata->Groups[3] + " is " + toString(((sharedBCD + sharedABCD) / (float)(numB + numC + numD + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + //outsvg << "Percentage of species that are shared in groups " + globaldata->Groups[0] + ", " + globaldata->Groups[1] + ", " + globaldata->Groups[2] + " and " + globaldata->Groups[3] + " is " + toString((sharedABCD / (float)(numA + numB + numC + numD + sharedAB + sharedAC + sharedAD + sharedBC + sharedBD + sharedCD + sharedABC + sharedABD + sharedACD + sharedBCD + sharedABCD))) + "\n"; + + outsvg << "\n\n"; + outsvg.close(); + } - outsvg << "\n\n"; - outsvg.close(); - + } @@ -293,7 +450,4 @@ void Venn::getSharedVectors(SharedOrderVector* order){ } } -//********************************************************************************************************************** - - diff --git a/venn.h b/venn.h index fbb6cf1..ceb52fd 100644 --- a/venn.h +++ b/venn.h @@ -12,11 +12,12 @@ using namespace std; #include "ordervector.hpp" -#include "rabundvector.hpp" +#include "Sabundvector.hpp" #include "sharedrabundvector.h" #include "sharedordervector.h" #include "datavector.hpp" #include "globaldata.hpp" +#include "calculator.h" /***********************************************************************/ @@ -26,13 +27,13 @@ class Venn { Venn(); ~Venn(){}; - void getPic(OrderVector*); - void getPic(SharedOrderVector*); + void getPic(OrderVector*, vector); + void getPic(SharedOrderVector*, vector); private: void getSharedVectors(SharedOrderVector*); - RAbundVector rabund; + SAbundVector* sabund; GlobalData* globaldata; vector lookup; string format, groupComb; diff --git a/venncommand.cpp b/venncommand.cpp index 85dcd93..5628481 100644 --- a/venncommand.cpp +++ b/venncommand.cpp @@ -8,14 +8,61 @@ */ #include "venncommand.h" +#include "ace.h" +#include "sobs.h" +#include "chao1.h" +#include "jackknife.h" +#include "sharedsobscollectsummary.h" +#include "sharedchao1.h" +#include "sharedace.h" + //********************************************************************************************************************** VennCommand::VennCommand(){ try { globaldata = GlobalData::getInstance(); - venn = new Venn(); format = globaldata->getFormat(); + validCalculator = new ValidCalculators(); + + int i; + + if (format == "list") { + for (i=0; iEstimators.size(); i++) { + if (validCalculator->isValidCalculator("vennsingle", globaldata->Estimators[i]) == true) { + if (globaldata->Estimators[i] == "sobs") { + vennCalculators.push_back(new Sobs()); + }else if (globaldata->Estimators[i] == "chao") { + vennCalculators.push_back(new Chao1()); + }else if (globaldata->Estimators[i] == "ace") { + convert(globaldata->getAbund(), abund); + if(abund < 5) + abund = 10; + vennCalculators.push_back(new Ace(abund)); + }else if (globaldata->Estimators[i] == "jack") { + vennCalculators.push_back(new Jackknife()); + } + } + } + }else { + for (i=0; iEstimators.size(); i++) { + if (validCalculator->isValidCalculator("vennshared", globaldata->Estimators[i]) == true) { + if (globaldata->Estimators[i] == "sharedsobs") { + vennCalculators.push_back(new SharedSobsCS()); + }else if (globaldata->Estimators[i] == "sharedchao") { + vennCalculators.push_back(new SharedChao1()); + }else if (globaldata->Estimators[i] == "sharedace") { + vennCalculators.push_back(new SharedAce()); + } + } + } + } + + venn = new Venn(); + + //reset calc for next command + globaldata->setCalc(""); + } catch(exception& e) { @@ -41,6 +88,9 @@ int VennCommand::execute(){ try { int count = 1; + //if the users entered no valid calculators don't execute command + if (vennCalculators.size() == 0) { return 0; } + if (format == "sharedfile") { //you have groups read = new ReadPhilFile(globaldata->inputFileName); @@ -75,7 +125,7 @@ int VennCommand::execute(){ if(globaldata->allLines == 1 || globaldata->lines.count(count) == 1 || globaldata->labels.count(order->getLabel()) == 1){ cout << order->getLabel() << '\t' << count << endl; - venn->getPic(order); + venn->getPic(order, vennCalculators); } @@ -103,7 +153,7 @@ int VennCommand::execute(){ if(globaldata->allLines == 1 || globaldata->lines.count(count) == 1 || globaldata->labels.count(ordersingle->getLabel()) == 1){ cout << ordersingle->getLabel() << '\t' << count << endl; - venn->getPic(ordersingle); + venn->getPic(ordersingle, vennCalculators); } diff --git a/venncommand.h b/venncommand.h index f8151c1..d91aaef 100644 --- a/venncommand.h +++ b/venncommand.h @@ -14,6 +14,7 @@ #include "readmatrix.hpp" #include "sharedlistvector.h" #include "venn.h" +#include "validcalculator.h" class GlobalData; @@ -35,6 +36,9 @@ private: OrderVector* ordersingle; Venn* venn; string format; + vector vennCalculators; + ValidCalculators* validCalculator; + int abund; void setGroups(); -- 2.39.2