#include #include #include #include #include #include #include #include #include #include #include #include #include "Prof.h" #include "fitPar.h" #include #include using namespace std; Prof::Prof (int N, int M) { // set m_N and m_npar, create minuit, everything else initialized to zero. m_N = N; m_M = M; m_npar = 2*m_N + m_M; m_yVec.clear(); m_sigma_y_Vec.clear(); m_rVec.clear(); m_uVec.clear(); m_sVec.clear(); for (int i=0; i> y >> sigma_y >> s >> r; u = 0; // nominal values zero m_yVec.push_back(y); m_sigma_y_Vec.push_back(sigma_y); m_sVec.push_back(s); m_rVec.push_back(r); m_uVec.push_back(u); } } f.close(); m_N = m_yVec.size(); m_M = 1; // for average, only one param. of interest m_npar = 2*m_N + m_M; m_minuit = new TMinuit(m_npar); m_parVec.clear(); m_sigParVec.clear(); for (int i=0; i Prof::mu(vector theta){ vector muVec(m_N); int N = this->N(); int M = theta.size(); // could differ from nominal m_M if ( M == 0 || M == 1 ) { for (int i=0; i parVec, int M){ // y_i ~ Gauss (mu_i + b_i, sigma_y_i) // u_i ~ Gauss (b_i, sigma_u_i) // v_i ~ gamma (alpha_i, beta_i), // alpha_i = 1./4r_i^2, beta_i = alpha_i / sigma_u_i^2 // parVec[i] = mu_i, i = 0,...,M-1 parameters of interest // parVec[i+M] = b_i, i 0,...,M-1 bias parameters // parVec[N+i+1] = eta_i, where eta_i = 1/sigma_u_i^2 int N = m_N; vector theta(M); for (int i=0; i muVec = this->mu(theta); vector bVec(N); vector sigma_u_Vec(N); for (int i=0; iN(); this->setM(M); // sets m_npar vector freePar(m_npar); for (int i=0; iN(); int M = this->M(); int npar = this->npar(); m_startPar.resize(npar); m_stepSize.resize(npar); // use ordinary LS for start value of mu (for M = N use y_i) double wSum = 0.; vector w(N); for (int i=0; isigma_y(i); double su = this->s(i); w[i] = 1./(sy*sy + su*su); wSum += w[i]; } double sigmaMuHatLS = 1./sqrt(wSum); double muHatLS = 0.; for (int i=0; iy(i); } for (int i=0; iy(i); } } // use 0 for b_i, s_i for sigma_ui for (int i=0; is(i) ); } m_stepSize[0] = 0.1 * sigmaMuHatLS; for (int i=0; is(i); // for b_i m_stepSize[M+N+i] = 0.1; // for log sigma_u_i } } double Prof::q(){ int N = this->N(); int M = this->M(); int status = this->fit(M); // fills m_parVec double chi2_numer = -2.*this->lnL(m_parVec,M); // for chi2_denom, equivalent to fitting all mui double chi2_denom = 0.; for (int i=0; i fitParM = modelM.parVec(); int npm = modelM.npar(); // for (int i=0; iGaus(mu + b, sigma_y); double u = ran->Gaus(b, sigma_u); // cout << "alpha, beta = " << alpha << " " << beta << endl; double s = rgsl->Gamma(alpha, 1./beta); // gsl's convention for beta // cout << "i, y, u, s: " << i << " " << y << " " << u << " " << s << endl; m_yVec.push_back(y); m_uVec.push_back(u); m_sVec.push_back(s); } }