int GetFF_SOG(const double aQ_FM, double* aGE, double *aGQ, double *aGM); double RINTERPQ(const double x0, double* x, double* y, const int N); int GetFF(double Q2_New, double *FC_New, double *FQ_New, double *FM_New); int GetFF_RInterPQ(double Q2_New, double *FC_New, double *FQ_New, double *FM_New); /*double Deut_Elastic( double E0, double Theta){{{*/ double Deut_Elastic( double E0,double Theta_Degree){ double TanThSQ,SinThSQ,TAO,Q2_FM,Ep, Q2; double A,B,FF,G_C,G_M,G_Q,GC2,GM2,GQ2; double Sig_Mott,REC; bool bCoulomb_Distort = kTRUE;//Add Coulomb Distortion when simualte "Exp" data //bool bCoulomb_Distort = kFALSE; //When comparing with model or extract, we need to correct it back. // int model = 0; cerr<<" Which model? (1->InterP, 2->SoG)"; cin >> model; int model = 2; //--------------------------------------------------------------------- // Calculate some kinematical quantities //--------------------------------------------------------------------- double Theta = Theta_Degree * PI/180.0; TanThSQ = tan(Theta/2.0); SinThSQ = pow(sin(Theta/2.0),2); Ep= E0/(1.+ 2.*E0/Deut_Mass*SinThSQ); //MeV Q2 = 4.0 * E0 * Ep * SinThSQ; //MeV2 TAO = Q2/(4.0 * Deut_Mass*Deut_Mass); //--------------------------------------------------------------------- // Get deuteron form factors //--------------------------------------------------------------------- Q2_FM = Q2/pow(HBARC,2); double Q_FM = sqrt(Q2_FM); int err = 0; if(model==2){ err = GetFF_SOG(Q_FM, &G_C, &G_Q, &G_M); // cerr<=0.01&&Q2_FM<=100.0) err = GetFF(Q2_FM, &G_C, &G_Q, &G_M); else err = GetFF_SOG(Q_FM, &G_C, &G_Q, &G_M); // cerr<1e-13 && aGQ[0]>1e-33 && aGM[0]>1e-33) return 1; else return -1; } /*}}}*/ /*Quadratic Interpolation Routine{{{*/ //----------------------------------------------------------------------------- // Quadratic Interpolation Routine: // // Calculates Y(Q2_New) given array Y(X) assuming a quadratic // dependence: Y = AX^2 + BX + C // // This routine assumes the X values are arranged in // ascending order but does not assume a uniform X spacing // of the array. //----------------------------------------------------------------------------- int GetFF(double Q2_New, double *FC_New, double *FQ_New, double *FM_New){ double FC[100],FQ[100],FM[100],Q2_FC[100],Q2_FM[100],Q2_FQ[100]; //cerr<<"--- What Deuteron FF model? (1->IA, 2->IAMEC, 3->RSC, 4->RSCMEC) "; //int Model; cin >> Model; int Model = 4; /* Obtain Form Factors{{{*/ for(int i=0;i<100;i++){ FC[i] = 0.0; FQ[i] = 0.0; FM[i] = 0.0; Q2_FC[i] = 0.0; Q2_FQ[i] = 0.0; Q2_FM[i] = 0.0; } ifstream FC_File; ifstream FQ_File; ifstream FM_File; /* IA{{{*/ if(Model==1){ FC_File.open("./DAT/ia.fc"); FQ_File.open("./DAT/ia.fq"); FM_File.open("./DAT/ia.fm"); } /*}}}*/ /* IAMEC{{{*/ if(Model==2){ FC_File.open("./DAT/iamec.fc"); FQ_File.open("./DAT/iamec.fq"); FM_File.open("./DAT/iamec.fm"); } /*}}}*/ /* RSC{{{*/ if(Model==3){ FC_File.open("./DAT/rsc.fc"); FQ_File.open("./DAT/rsc.fq"); FM_File.open("./DAT/rsc.fm"); } /*}}}*/ /* RSCMEC{{{*/ if(Model==4){ FC_File.open("./DAT/rscmec.fc"); FQ_File.open("./DAT/rscmec.fq"); FM_File.open("./DAT/rscmec.fm"); } /*}}}*/ int N_FC = 0; while(!(FC_File.eof())){ FC_File >> Q2_FC[N_FC] >> FC[N_FC]; //cerr<> Q2_FQ[N_FQ] >> FQ[N_FQ]; //cerr<> Q2_FM[N_FM] >> FM[N_FM]; //cerr< x[N-1]){ cerr<<"*** Extrapolating outside range for X = "<< x0<=x[N-2]){ i = N-2; j = N-1; k = N-0; } else{ for(int l=1;l<=N-2;l++){ if(x0<=x[l]){ i=l-1; j=l; k=l+1; break; } } } double Det = (x[j]-x[k])*(pow(x[i],2) - x[i]*(x[j]+x[k]) + x[j]*x[k]); double A = ( y[i]*(x[j]-x[k]) - x[i]*(y[j]-y[k]) + y[j]*x[k] - x[j]*y[k] )/Det; double B = ( pow(x[i],2)*(y[j]-y[k]) - y[i]*(pow(x[j],2)-pow(x[k],2)) + pow(x[j],2)*y[k] - pow(x[k],2)*y[j] )/Det; double C = ( pow(x[i],2)*(x[j]*y[k]-x[k]*y[j]) - x[i]*(pow(x[j],2)*y[k]-pow(x[k],2)*y[j]) + y[i]*(pow(x[j],2)*x[k]-pow(x[k],2)*x[j]) )/Det; double RINTERPQ = A*x0*x0 + B*x0 + C; return RINTERPQ; } } /*}}}*/ /*}}}*/ /*Old--Quadratic Interpolation Routine{{{*/ //----------------------------------------------------------------------------- // Quadratic Interpolation Routine: // // Calculates Y(Q2_New) given array Y(X) assuming a quadratic // dependence: Y = AX^2 + BX + C // // This routine assumes the X values are arranged in // ascending order but does not assume a uniform X spacing // of the array. //----------------------------------------------------------------------------- int GetFF_RInterPQ(double Q2_New, double *FC_New, double *FQ_New, double *FM_New){ double FC[100],FQ[100],FM[100],Q2_FC[100],Q2_FM[100],Q2_FQ[100]; //cerr<<"--- What Deuteron FF model? (1->IA, 2->IAMEC, 3->RSC, 4->RSCMEC) "; //int Model; cin >> Model; int Model = 4; /* Obtain Form Factors{{{*/ for(int i=0;i<100;i++){ FC[i] = 0.0; FQ[i] = 0.0; FM[i] = 0.0; Q2_FC[i] = 0.0; Q2_FQ[i] = 0.0; Q2_FM[i] = 0.0; } ifstream FC_File; ifstream FQ_File; ifstream FM_File; /* IA{{{*/ if(Model==1){ FC_File.open("./DAT/ia.fc"); FQ_File.open("./DAT/ia.fq"); FM_File.open("./DAT/ia.fm"); } /*}}}*/ /* IAMEC{{{*/ if(Model==2){ FC_File.open("./DAT/iamec.fc"); FQ_File.open("./DAT/iamec.fq"); FM_File.open("./DAT/iamec.fm"); } /*}}}*/ /* RSC{{{*/ if(Model==3){ FC_File.open("./DAT/rsc.fc"); FQ_File.open("./DAT/rsc.fq"); FM_File.open("./DAT/rsc.fm"); } /*}}}*/ /* RSCMEC{{{*/ if(Model==4){ FC_File.open("./DAT/rscmec.fc"); FQ_File.open("./DAT/rscmec.fq"); FM_File.open("./DAT/rscmec.fm"); } /*}}}*/ int N_FC = 0; while(!(FC_File.eof())){ FC_File >> Q2_FC[N_FC] >> FC[N_FC]; //cerr<> Q2_FQ[N_FQ] >> FQ[N_FQ]; //cerr<> Q2_FM[N_FM] >> FM[N_FM]; //cerr< Q2_FC[N_FC-1]){ cerr<<"*** Extrapolating outside range for FC: Q2 = "<< Q2_New<