X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=geom.cpp;fp=geom.cpp;h=5bd150ef7f8201254a392a52a7583b07b83e0b00;hb=0caf3fbabaa3ece404f8ce77f4c883dc5b1bf1dc;hp=0000000000000000000000000000000000000000;hpb=1b73ff67c83892a025e597dabd9df6fe7b58206a;p=mothur.git diff --git a/geom.cpp b/geom.cpp new file mode 100644 index 0000000..5bd150e --- /dev/null +++ b/geom.cpp @@ -0,0 +1,101 @@ +/* + * geom.cpp + * Mothur + * + * Created by Thomas Ryabin on 2/23/09. + * Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved. + * + */ + +#include "geom.h" + +/***********************************************************************/ + +double Geom::kEq(double k, double spec){ + return k/(1-k)*pow(1-k, spec)/(1-pow(1-k, spec)); +} + +RAbundVector Geom::getRAbundVector(SAbundVector* rank){ + vector rData; + int mr = 1; + int nb = 0; + int ns = 0; + + for(int i = rank->size()-1; i > 0; i--) { + int cur = rank->get(i); + if(mr == 1 && cur > 0) + mr = i; + nb += cur; + ns += i*cur; + for(int j = 0; j < cur; j++) + rData.push_back(i); + } + + RAbundVector rav = RAbundVector(rData, mr, nb, ns); + rav.setLabel(rank->getLabel()); + return rav; +} + +/***********************************************************************************/ + +/***********************************************************************************/ +EstOutput Geom::getValues(SAbundVector* rank){ + try { + data.resize(3,0); + + rdata = getRAbundVector(rank); + double numInd = rdata.getNumSeqs(); + double numSpec = rdata.getNumBins(); + double min = rdata.get(rdata.size()-1); + double k = .5; + double step = .49999; + + while(fabs(min - numInd*kEq(k, (double)numSpec)) > .0001) { //This uses a binary search to find the value of k. + if(numInd*kEq(k, numSpec) > min) + k += step; + else + k -= step; + step /= 2; + } + + double cK = 1/(1-pow(1-k, numSpec)); + double sumExp = 0; + double sumObs = 0; + double maxDiff = 0; + + for(int i = 0; i < numSpec; i++) + { + sumObs += rdata.get(i); + sumExp += numInd*cK*k*pow(1-k, i); + + double diff = fabs(sumObs-sumExp); + if(diff > maxDiff) { maxDiff = diff; } + + } + + + data[0] = maxDiff/numInd; + data[1] = 0.886/sqrt(numSpec); + data[2] = 1.031/sqrt(numSpec); + + + if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; } + if (isnan(data[1]) || isinf(data[1])) { data[1] = 0; } + if (isnan(data[2]) || isinf(data[2])) { data[2] = 0; } + + return data; + } + catch(exception& e) { + m->errorOut(e, "Geom", "getValues"); + exit(1); + } +} + +/***********************************************************************/ + + + + + + +