X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=metastatscommand.h;h=82a2cd463fab9762b38bb26dabdef11a7e7a4a0a;hp=9c9f455b4e8b4f45d309e5453da5c41fbba813d7;hb=d1c97b8c04bb75faca1e76ffad60b37a4d789d3d;hpb=d051154d778b77ba36dc603bbdb3c148a62a8e33 diff --git a/metastatscommand.h b/metastatscommand.h index 9c9f455..82a2cd4 100644 --- a/metastatscommand.h +++ b/metastatscommand.h @@ -12,36 +12,156 @@ #include "command.hpp" #include "inputdata.h" -#include "readotu.h" #include "sharedrabundvector.h" - -class GlobalData; +#include "mothurmetastats.h" class MetaStatsCommand : public Command { public: MetaStatsCommand(string); - ~MetaStatsCommand(); - int execute(); - void help(); + MetaStatsCommand(); + ~MetaStatsCommand() {} + + vector setParameters(); + string getCommandName() { return "metastats"; } + string getCommandCategory() { return "OTU-Based Approaches"; } + + string getHelpString(); + string getOutputPattern(string); + string getCitation() { return "White JR, Nagarajan N, Pop M (2009). Statistical methods for detecting differentially abundant features in clinical metagenomic samples. PLoS Comput Biol 5: e1000352. \nhttp://www.mothur.org/wiki/Metastats"; } + string getDescription() { return "detects differentially abundant features in clinical metagenomic samples"; } + + int execute(); + void help() { m->mothurOut(getHelpString()); } private: - GlobalData* globaldata; + struct linePair { + int start; + int num; + linePair(int i, int j) : start(i), num(j) {} + }; + vector lines; + GroupMap* designMap; - ReadOTUFile* read; InputData* input; vector lookup; - + bool abort, allLines, pickedGroups; set labels; //holds labels to be used - string groups, label, outputDir, inputDir, designfile; - vector Groups, outputNames; - int iters, g; + string groups, label, outputDir, inputDir, designfile, sets, sharedfile; + vector Groups, outputNames, Sets; + vector< vector > namesOfGroupCombos; + int iters, processors; float threshold; int process(vector&); - int eliminateZeroOTUS(vector&); + int driver(int, int, vector&); + int convertToShared(string filename); + int convertToInput(vector&, string); + bool convertSharedToInput; +}; + +/**************************************************************************************************/ +//custom data structure for threads to use. +// This is passed by void pointer so it can be any data type +// that can be passed using a single void pointer (LPVOID). +struct metastatsData { + vector thisLookUp; + vector< vector > namesOfGroupCombos; + vector designMapGroups; + vector outputNames; + int start; + int num, iters, count; + float threshold; + MothurOut* m; + string sharedfile; + string outputDir; + + metastatsData(){} + metastatsData(string sf, string oDir, MothurOut* mout, int st, int en, vector< vector > ns, vector lu, vector dg, int i, float thr) { + sharedfile = sf; + outputDir = oDir; + m = mout; + start = st; + num = en; + namesOfGroupCombos = ns; + thisLookUp = lu; + designMapGroups = dg; + iters = i; + threshold = thr; + count=0; + } }; +/**************************************************************************************************/ +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) +#else +static DWORD WINAPI MyMetastatsThreadFunction(LPVOID lpParam){ + metastatsData* pDataArray; + pDataArray = (metastatsData*)lpParam; + + try { + + //for each combo + for (int c = pDataArray->start; c < (pDataArray->start+pDataArray->num); c++) { + pDataArray->count++; + //get set names + string setA = pDataArray->namesOfGroupCombos[c][0]; + string setB = pDataArray->namesOfGroupCombos[c][1]; + + //get filename + string outputFileName = pDataArray->outputDir + pDataArray->m->getRootName(pDataArray->m->getSimpleName(pDataArray->sharedfile)) + pDataArray->thisLookUp[0]->getLabel() + "." + setA + "-" + setB + ".metastats"; + pDataArray->outputNames.push_back(outputFileName); + + vector< vector > data2; data2.resize(pDataArray->thisLookUp[0]->getNumBins()); + + vector subset; + int setACount = 0; + int setBCount = 0; + for (int i = 0; i < pDataArray->thisLookUp.size(); i++) { + //is this group for a set we want to compare?? + //sorting the sets by putting setB at the back and setA in the front + if (pDataArray->designMapGroups[i] == setB) { + subset.push_back(pDataArray->thisLookUp[i]); + setBCount++; + }else if (pDataArray->designMapGroups[i] == setA) { + subset.insert(subset.begin()+setACount, pDataArray->thisLookUp[i]); + setACount++; + } + } + + if ((setACount == 0) || (setBCount == 0)) { + pDataArray->m->mothurOut("Missing shared info for " + setA + " or " + setB + ". Skipping comparison."); pDataArray->m->mothurOutEndLine(); + pDataArray->outputNames.pop_back(); + }else { + //fill data + for (int j = 0; j < pDataArray->thisLookUp[0]->getNumBins(); j++) { + data2[j].resize(subset.size(), 0.0); + for (int i = 0; i < subset.size(); i++) { + data2[j][i] = (subset[i]->getAbundance(j)); + } + } + + pDataArray->m->mothurOut("Comparing " + setA + " and " + setB + "..."); pDataArray->m->mothurOutEndLine(); + + pDataArray->m->mothurOutEndLine(); + MothurMetastats mothurMeta(pDataArray->threshold, pDataArray->iters); + mothurMeta.runMetastats(outputFileName, data2, setACount); + pDataArray->m->mothurOutEndLine(); + pDataArray->m->mothurOutEndLine(); + } + } + + return 0; + + } + catch(exception& e) { + pDataArray->m->errorOut(e, "MetaStatsCommand", "MyMetastatsThreadFunction"); + exit(1); + } +} +#endif + + #endif