]> git.treefish.org Git - phys/latlib.git/blobdiff - obstat.hpp
Removed precalcless jack function.
[phys/latlib.git] / obstat.hpp
index 6818792fc765335c0bbfcd6405391ebeae7564a5..6a2cf6e3c4a99a80ea31c00d91c1502e303de283 100644 (file)
@@ -17,9 +17,8 @@ public:
 
   int computeEasy(const int& ival=0) { return mean(&measurements, ival); }
 
 
   int computeEasy(const int& ival=0) { return mean(&measurements, ival); }
 
-  int computeJack(restype (*func)(vector< vector <meastype> > *vals, void *para), void *para=NULL);
   int computeJack(void (*preMeasFunc)(vector< vector <meastype> > *allVals, vector <meastype> *preCalculated, void *para), 
   int computeJack(void (*preMeasFunc)(vector< vector <meastype> > *allVals, vector <meastype> *preCalculated, void *para), 
-                 restype (*measFunc)(vector <meastype> *preCalculated, vector <meastype> *excludedmeas, void *para), void *para=NULL);
+                 restype (*measFunc)(vector <meastype> *preCalculated, vector <meastype> *excludedmeas, int nmeas, void *para), void *para=NULL);
 
   restype getMean(int compid) { return computations[compid].val; }
   restype getErr(int compid) { return computations[compid].err; }
 
   restype getMean(int compid) { return computations[compid].val; }
   restype getErr(int compid) { return computations[compid].err; }
@@ -83,48 +82,12 @@ int obstat<meastype,restype>::mean(vector< vector<meastype> > *meas, const int&
   return computations.size()-1;
 }
 
   return computations.size()-1;
 }
 
-template <typename meastype, typename restype>
-int obstat<meastype,restype>::computeJack(restype (*func)(vector< vector<meastype> > *vals, void *para), void *para)
-{
-  int nmeas=measurements.size();
-  restype manymeans[nmeas];
-  result jackres;
-
-  jackres.val = 0;
-  jackres.err = 0;
-
-  int imeas=0;
-  for(typename vector< vector<meastype> >::iterator removedIt = measurements.begin(); removedIt != measurements.end(); ++removedIt, imeas++)
-    {
-      vector<meastype> removed = *removedIt;
-      
-      *removedIt = measurements.back();
-      measurements.pop_back();
-
-      manymeans[imeas] = func(&measurements, para);
-      jackres.val += manymeans[imeas];
-      
-      measurements.push_back( *removedIt );
-      *removedIt = removed;
-    }
-  jackres.val /= nmeas;
-
-  for(int imean=0; imean<nmeas; imean++)
-    jackres.err += pow( manymeans[imean] - jackres.val, 2 );
-  jackres.err *= (double)(nmeas-1)/nmeas;
-  jackres.err = sqrt(jackres.err);
-
-  computations.push_back(jackres);
-
-  return computations.size()-1;
-}
-
 template <typename meastype, typename restype>
 int obstat<meastype,restype>::computeJack(void (*preMeasFunc)(vector< vector <meastype> > *allVals, vector<meastype> *preCalculated, void *para), 
 template <typename meastype, typename restype>
 int obstat<meastype,restype>::computeJack(void (*preMeasFunc)(vector< vector <meastype> > *allVals, vector<meastype> *preCalculated, void *para), 
-                                         restype (*measFunc)(vector<meastype> *preCalculated, vector<meastype> *excludedmeas, void *para), 
+                                         restype (*measFunc)(vector<meastype> *preCalculated, vector<meastype> *excludedmeas, int nmeas, void *para),
                                          void *para) {
   int nmeas=measurements.size();
                                          void *para) {
   int nmeas=measurements.size();
-  restype manymeans[nmeas];
+  restype *manymeans = new restype[nmeas];
   result jackres;
   vector<meastype> preCalculated;
 
   result jackres;
   vector<meastype> preCalculated;
 
@@ -135,7 +98,7 @@ int obstat<meastype,restype>::computeJack(void (*preMeasFunc)(vector< vector <me
 
   int imeas=0;
   for(typename vector< vector<meastype> >::iterator removedIt = measurements.begin(); removedIt != measurements.end(); ++removedIt, imeas++) {
 
   int imeas=0;
   for(typename vector< vector<meastype> >::iterator removedIt = measurements.begin(); removedIt != measurements.end(); ++removedIt, imeas++) {
-    manymeans[imeas] = measFunc(&preCalculated, &(*removedIt), para);
+    manymeans[imeas] = measFunc(&preCalculated, &(*removedIt), measurements.size(), para);
     jackres.val += manymeans[imeas]; 
   }
   jackres.val /= nmeas;
     jackres.val += manymeans[imeas]; 
   }
   jackres.val /= nmeas;
@@ -147,6 +110,8 @@ int obstat<meastype,restype>::computeJack(void (*preMeasFunc)(vector< vector <me
 
   computations.push_back(jackres);
 
 
   computations.push_back(jackres);
 
+  delete [] manymeans;
+
   return computations.size()-1;
 }
 
   return computations.size()-1;
 }