X-Git-Url: http://git.treefish.org/~alex/phys/u1casc.git/blobdiff_plain/7a5913c428ac75aa2de2330fa926e8deb3457112..7664dbeaba693ea47d5fd405c20f5db109d4da13:/u1casc-flux/obs_phi2.hpp?ds=sidebyside diff --git a/u1casc-flux/obs_phi2.hpp b/u1casc-flux/obs_phi2.hpp new file mode 100644 index 0000000..dc499c4 --- /dev/null +++ b/u1casc-flux/obs_phi2.hpp @@ -0,0 +1,118 @@ +#ifndef OBS_PHI2_HPP +#define OBS_PHI2_HPP + +#include "latlib/o815/o815.h" + +#include "latlib/writeout.h" + +#include "latlib/obstat.hpp" + +#include + +using namespace std; + +class obs_phi2 : public o815::obs { + +public: + struct obsmem { + double A[2]; + double B[2]; + double C[2]; + }; + obs_phi2(o815 *_O815); + +private: + void _start(); + void _meas(bool loadedobs, const int& nthmeas); + void _finish(); + + obsmem* OM; + + void phi2Compute(); + + static void prePhi2Sus(vector< vector > *allVals, vector *preCalculated, void *para); + static double phi2Sus(vector *preCalculated, vector *excludedMeas, int nmeas, void *para); + + sim *Sim; + obstat oPhi2[2]; +}; + +obs_phi2::obs_phi2(o815 *_O815) : o815::obs("phi2", + _O815->paraQ->getParaNames() + + "phi2one:phi2one_err:phi2onesus:phi2onesus_err" + ":phi2two:phi2two_err:phi2twosus:phi2twosus_err", + _O815, sizeof(obsmem) ) { + OM = (obsmem*)obsMem; + Sim = (sim*)O815->Sim; +} + +void obs_phi2::_start() { + //*out << "OBS_test: start" << endl; +}; + +void obs_phi2::_meas(bool loadedobs, const int& nthmeas) { + if (!loadedobs) + phi2Compute(); + + for (int iflav=0; iflav<2; iflav++) { + double tmpMeas[3] = {OM->A[iflav], OM->B[iflav], OM->C[iflav]}; + oPhi2[iflav].addMeas(tmpMeas, 3); + } +}; + +void obs_phi2::_finish() { + *out << O815->paraQ->getParaVals(); + + int compid_phi2[2], compid_phi2sus[2]; + + for (int iflav=0; iflav<2; iflav++) { + compid_phi2[iflav] = oPhi2[iflav].computeEasy(); + compid_phi2sus[iflav] = oPhi2[iflav].computeJack(obs_phi2::prePhi2Sus, obs_phi2::phi2Sus, &(Sim->lsize4)); + + *out << "\t" << oPhi2[iflav].getMean(compid_phi2[iflav]) / Sim->lsize4 << "\t" << oPhi2[iflav].getErr(compid_phi2[iflav]) / Sim->lsize4; + *out << "\t" << oPhi2[iflav].getMean(compid_phi2sus[iflav]) << "\t" << oPhi2[iflav].getErr(compid_phi2sus[iflav]); + + oPhi2[iflav].reset(); + } + + *out << endl; +}; + +void obs_phi2::phi2Compute() +{ + for(int i=0; i<2; i++) { + OM->A[i] = 0; + OM->B[i] = 0; + OM->C[i] = 0; + + for (int x = 0; x < Sim->lsize4; x++) { + double wp2w; + + wp2w = Sim->WF( Sim->wArg(x,i) + 2, Sim->wArg(x,i), i ); + + OM->A[i] += wp2w; + OM->B[i] += Sim->WF( Sim->wArg(x,i) + 4, Sim->wArg(x,i), i ); + OM->C[i] += pow(wp2w, 2); + } + } +} + +void obs_phi2::prePhi2Sus(vector< vector > *allVals, vector *preCalculated, void *para) +{ + preCalculated->push_back(0); + preCalculated->push_back(0); + + for(vector< vector >::iterator valIt = allVals->begin(); valIt != allVals->end(); ++valIt) + { + (*preCalculated)[0] += pow( (*valIt)[0], 2 ) + (*valIt)[1] - (*valIt)[2]; + (*preCalculated)[1] += (*valIt)[0]; + } +} + +double obs_phi2::phi2Sus(vector *preCalculated, vector *excludedMeas, int nmeas, void *para) { + return (( (*preCalculated)[0] - pow((*excludedMeas)[0], 2) - (*excludedMeas)[1] + (*excludedMeas)[2] ) / (nmeas-1) + - pow( ( (*preCalculated)[1] - (*excludedMeas)[0] ) / (nmeas-1), 2 )) + / *(int*)para; +} + +#endif