X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=rarefact.cpp;h=d04885f4333e3f224bddbfa99aa9614e9f171b4c;hb=6a0001cc8c2f8de157f4979fd0d97a6e911b58e8;hp=76f68296b209ec1eb8e2ff5a14668b32fd451b8b;hpb=5a86e9e5a5a9e061e17b3ae64fb8881f14e53b8a;p=mothur.git diff --git a/rarefact.cpp b/rarefact.cpp index 76f6829..d04885f 100644 --- a/rarefact.cpp +++ b/rarefact.cpp @@ -20,8 +20,49 @@ int Rarefact::getCurve(float percentFreq = 0.01, int nIters = 1000){ } //convert freq percentage to number - int increment = numSeqs * percentFreq; + int increment = 1; + if (percentFreq < 1.0) { increment = numSeqs * percentFreq; } + else { increment = percentFreq; } + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + if(processors == 1){ + driver(rcd, increment, nIters); + }else{ + vector procIters; + + int numItersPerProcessor = nIters / processors; + + //divide iters between processes + for (int i = 0; i < processors; i++) { + if(i == processors - 1){ + numItersPerProcessor = nIters - i * numItersPerProcessor; + } + procIters.push_back(numItersPerProcessor); + } + + createProcesses(procIters, rcd, increment); + } + + #else + driver(rcd, increment, nIters); + #endif + + for(int i=0;iclose(); + } + + delete rcd; + return 0; + } + catch(exception& e) { + m->errorOut(e, "Rarefact", "getCurve"); + exit(1); + } +} +/***********************************************************************/ +int Rarefact::driver(RarefactionCurveData* rcd, int increment, int nIters = 1000){ + try { + for(int iter=0;iterclose(); - } - delete rcd; return 0; } catch(exception& e) { - m->errorOut(e, "Rarefact", "getCurve"); + m->errorOut(e, "Rarefact", "driver"); exit(1); } } +/**************************************************************************************************/ +int Rarefact::createProcesses(vector& procIters, RarefactionCurveData* rcd, int increment) { + try { +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + int process = 1; + int num = 0; + vector processIDS; + + EstOutput results; + + //loop through and create all the processes you want + while (process != processors) { + int pid = fork(); + + if (pid > 0) { + processIDS.push_back(pid); //create map from line number to pid so you can append files in correct order later + process++; + }else if (pid == 0){ + driver(rcd, increment, procIters[process]); + + //pass numSeqs to parent + for(int i=0;ioutputTempFiles(tempFile); + } + exit(0); + }else { m->mothurOut("unable to spawn the necessary processes."); m->mothurOutEndLine(); exit(0); } + } + + driver(rcd, increment, procIters[0]); + + //force parent to wait until all the processes are done + for (int i=0;i<(processors-1);i++) { + int temp = processIDS[i]; + wait(&temp); + } + + //get data created by processes + for (int i=0;i<(processors-1);i++) { + for(int j=0;jinputTempFiles(s); + remove(s.c_str()); + } + } + + return 0; +#endif + } + catch(exception& e) { + m->errorOut(e, "Rarefact", "createProcesses"); + exit(1); + } +} /***********************************************************************/ int Rarefact::getSharedCurve(float percentFreq = 0.01, int nIters = 1000){ @@ -91,7 +182,9 @@ try { if (globaldata->jumble == false) { nIters = 1; } //convert freq percentage to number - int increment = numSeqs * percentFreq; + int increment = 1; + if (percentFreq < 1.0) { increment = numSeqs * percentFreq; } + else { increment = percentFreq; } for(int iter=0;iter