00001
00002
00003
00005 #include "LHAPDF/LHAPDF.h"
00006 #include <iostream>
00007 #include <cmath>
00008 #include <cstdio>
00009 #include <cstdlib>
00010 using namespace std;
00011
00012 using namespace LHAPDF;
00013
00014
00015 double logdist_x(double xmin, double xmax, size_t ix, size_t nx) {
00016 const double log10xmin = log10(xmin);
00017 const double log10xmax = log10(xmax);
00018 const double log10x = log10xmin + (ix/static_cast<double>(nx-1))*(log10xmax-log10xmin);
00019 const double x = pow(10.0, log10x);
00020 return x;
00021 }
00022
00023
00024 int main() {
00025
00026 setVerbosity(LOWKEY);
00027
00028
00029
00030
00031
00032 const string NAME = "MRST2006nnlo";
00033 initPDFSetM(1, NAME, LHGRID);
00034 initPDFSetM(2, NAME, LHGRID);
00035 initPDFSetM(3, NAME, LHGRID);
00036
00037
00038 const int neigen = numberPDFM(1)/2;
00039 cout << "Number of eigensets in this fit = " << neigen << endl;
00040
00041 const double xmin = getXmin(0);
00042 const double xmax = getXmax(0);
00043 cout << "Valid x-range = [" << xmin << ", " << xmax << "]" << endl;
00044
00045 const int nx = 10;
00046
00047 double q = 10;
00048 int flav = 4;
00049
00050
00051 initPDFM(1, 0);
00052 vector<double> fc(nx), x(nx);
00053 for (int ix = 0; ix < nx; ++ix) {
00054 x[ix] = logdist_x(xmin, 0.9*xmax, ix, nx);
00055 fc[ix] = xfxM(1, x[ix], q, flav);
00056 }
00057
00058
00059 vector<double> summax(nx), summin(nx), sum(nx);
00060 #ifndef LHAPDF_LOWMEM
00061
00062
00063 cout << "Using efficient set looping" << endl;
00064 for (int ieigen = 1; ieigen <= neigen; ++ieigen) {
00065 initPDFM(2, 2*ieigen-1);
00066 initPDFM(3, 2*ieigen);
00067 for (int ix = 0; ix < nx; ++ix) {
00068
00069 const double fp = xfxM(2, x[ix], q, flav);
00070 const double fm = xfxM(3, x[ix], q, flav);
00071
00072 const double plus = max(max(fp-fc[ix], fm-fc[ix]),0.0);
00073 const double minus = min(min(fp-fc[ix], fm-fc[ix]),0.0);
00074 const double diff = fp-fm;
00075
00076 summax[ix] += plus*plus;
00077 summin[ix] += minus*minus;
00078 sum[ix] += diff*diff;
00079 }
00080 }
00081 #else
00082
00083
00084
00085
00086 cout << "Using low-mem mode set looping" << endl;
00087 for (int ieigen = 1; ieigen <= neigen; ++ieigen) {
00088 vector<double> fp(nx), fm(nx);
00089 initPDFM(2, 2*ieigen-1);
00090 for (int ix = 0; ix < nx; ++ix) {
00091 fp[ix] = xfxM(2, x[ix], q, flav);
00092 }
00093 initPDFM(3, 2*ieigen);
00094 for (int ix = 0; ix < nx; ++ix) {
00095 fm[ix] = xfxM(3, x[ix], q, flav);
00096 }
00097 for (int ix = 0; ix < nx; ++ix) {
00098
00099 const double plus = max(max(fp[ix]-fc[ix], fm[ix]-fc[ix]), 0.0);
00100 const double minus = min(min(fp[ix]-fc[ix], fm[ix]-fc[ix]), 0.0);
00101 const double diff = fp[ix]-fm[ix];
00102
00103 summax[ix] += plus*plus;
00104 summin[ix] += minus*minus;
00105 sum[ix] += diff*diff;
00106 }
00107 }
00108 #endif
00109
00110
00111 cout << "flavour = " << flav << " Asymmetric (%) Symmetric (%)" << endl;
00112 cout << " x Q**2 xf(x) plus minus +- " << endl;
00113 for (int ix = 0; ix < nx; ++ix) {
00114 printf("%0.7f %.0f %10.2E %8.2f %8.2f %8.2f \n",
00115 x[ix], q*q, fc[ix],
00116 sqrt(summax[ix])*100/fc[ix],
00117 sqrt(summin[ix])*100/fc[ix],
00118 0.5*sqrt(sum[ix])*100/fc[ix]);
00119 }
00120
00121 return EXIT_SUCCESS;
00122 }
00123
00124
00125
00126 #include "FortranWrappers.h"
00127 #ifdef FC_DUMMY_MAIN
00128 int FC_DUMMY_MAIN() { return 1; }
00129 #endif