X-Git-Url: http://git.treefish.org/~alex/phys/latlib.git/blobdiff_plain/d4e3cb0ebd372ab5e931490599fa0c72831bc23f..0c708ebeb7aec487326d89207d96b9e61bd541ad:/obs.hpp?ds=inline diff --git a/obs.hpp b/obs.hpp new file mode 100644 index 0000000..ae544e4 --- /dev/null +++ b/obs.hpp @@ -0,0 +1,100 @@ +#ifndef OBS_HPP +#define OBS_HPP + +#include +#include +#include +#include + +using namespace std; + +template +class obs +{ + struct result{ + double val; + double err; + }; + +public: + void addMeas(obstype val[], int valsize); + void addMeas(const obstype& val); + + void computeMean(const string& compid) { mean(compid, &measurements); } + void computeJack(const string& compid, double (*func)(list *vals, void *para), void *para=NULL); + + double getMean(const string& compid) { return computations[compid].val; } + double getErr(const string& compid) { return computations[compid].err; } + +private: + list measurements; + map computations; + + void mean(const string& compid, list *meas); +}; + +template +void obs::addMeas(obstype val[], int valsize) +{ + for(int i=0; i +void obs::addMeas(const obstype& val) +{ + measurements.push_back(val); +} + +template +void obs::mean(const string& compid, list *meas) +{ + computations[compid].val = 0; + computations[compid].err = 0; + + int nmeas = meas->size(); + + for(list::iterator measIt = meas->begin(); measIt != meas->end(); ++measIt) + computations[compid].val += *measIt; + computations[compid].val /= nmeas; + + for(list::iterator measIt = meas->begin(); measIt != meas->end(); ++measIt) + computations[compid].err += pow( *measIt - computations[compid].val, 2 ); + computations[compid].err /= nmeas*(nmeas-1); + computations[compid].err = sqrt( computations[compid].err ); +} + +template +void obs::computeJack(const string& compid, double (*func)(list *vals, void *para), void *para) +{ + int nmeas=measurements.size(); + double manymeans[nmeas]; + + computations[compid].val = 0; + computations[compid].err = 0; + + int imeas=0; + for(typename list::iterator removedIt = measurements.begin(); removedIt != measurements.end(); imeas++) + { + obstype removed = *removedIt; + + typename list::iterator nextAfterIt = removedIt; + ++nextAfterIt; + + measurements.erase(removedIt); + + manymeans[imeas] = func(&measurements, para); + computations[compid].val += manymeans[imeas]; + + measurements.insert(nextAfterIt, removed); + + removedIt = nextAfterIt; + } + computations[compid].val /= nmeas; + + for(int imean=0; imean