diff --git a/nnpdfcpp/data/theory.db b/nnpdfcpp/data/theory.db index ef273c399a6f8e70f058b0fc7bc1f6a2e77eb663..818407928f2edeb4dd48665456eebe6b4a91fd34 100644 Binary files a/nnpdfcpp/data/theory.db and b/nnpdfcpp/data/theory.db differ diff --git a/nnpdfcpp/src/common/inc/common.h b/nnpdfcpp/src/common/inc/common.h index a52a42a67e5d85695b641f4318a2b0e08f2b2f31..dfc252a0e325d047b849e47cc8a11d9d341f8398 100644 --- a/nnpdfcpp/src/common/inc/common.h +++ b/nnpdfcpp/src/common/inc/common.h @@ -45,7 +45,7 @@ enum basisType {BASIS_UNDEF, BASIS_NN23, BASIS_NN23QED, BASIS_EVOL, BASIS_EVOLQED,BASIS_EVOLS, BASIS_EVOLSQED, BASIS_NN30, BASIS_NN30QED, BASIS_FLVR, BASIS_FLVRQED, BASIS_NN30IC, BASIS_EVOLIC, BASIS_NN31IC, BASIS_LUX, BASIS_NN31ICQED, - BASIS_NSR, BASIS_DISEVOL}; + BASIS_NSR, BASIS_DISEVOL, BASIS_PDF4LHC20}; enum covType {COV_EXP = false, COV_T0 = true}; enum filterType {DATA_UNFILTERED = false,DATA_FILTERED = true}; diff --git a/nnpdfcpp/src/common/src/nnpdfsettings.cc b/nnpdfcpp/src/common/src/nnpdfsettings.cc index 1c4719304a3875240dbb083b9940031b85fc7a65..882800790fdddf932bcdda994b1ca799932d3648 100644 --- a/nnpdfcpp/src/common/src/nnpdfsettings.cc +++ b/nnpdfcpp/src/common/src/nnpdfsettings.cc @@ -20,9 +20,9 @@ static const string minString[6] = {"UNDEFINED", "GA", "NGA", "NGAFT","CMAES"}; static const string stopString[6] = {"UNDEFINED", "FIXEDLENGTH", "LOOKBACK"}; static const string paramString[6] = {"UNDEFINED", "NN", "SLN", "SLNPP"}; -static const string basisString[18]= {"UNDEFINED", "NN23", "NN23QED","EVOL", "EVOLQED","EVOLS", +static const string basisString[19]= {"UNDEFINED", "NN23", "NN23QED","EVOL", "EVOLQED","EVOLS", "EVOLSQED","NN30", "NN30QED","FLVR", "FLVRQED","NN30IC", - "EVOLIC","NN31IC","LUX", "NN31ICQED", "NSR", "DISEVOL"}; + "EVOLIC","NN31IC","LUX", "NN31ICQED", "NSR", "DISEVOL","PDF4LHC20"}; static const vector< vector<string> > basiselem = { {}, {"sng","g","v","t3","ds","sp","sm"}, //NN23 @@ -41,7 +41,8 @@ static const vector< vector<string> > basiselem = { {}, {"sng","g","v","v3","v8","t3","t8","cp"}, //LUX {"sng","g","v","v3","v8","t3","t8","cp","pht"},//NN31ICQED {"sng","g","v","v3","v8","t3","t8","cp"}, //NSR - {"sng","g","t8"} //DISEVOL (Isoscalar) + {"sng","g","t8"}, //DISEVOL (Isoscalar) + {"sng","g","v","v3","t3","t8"} //PDF4LHC20 }; /* Convert string to enum */ @@ -103,8 +104,9 @@ basisType NNPDFSettings::getFitBasisType(string const& method) if (method.compare("NN31IC") == 0) return BASIS_NN31IC; if (method.compare("LUX") == 0) return BASIS_LUX; if (method.compare("NN31ICQED")==0) return BASIS_NN31ICQED; - if (method.compare("NSR")==0) return BASIS_NSR; - if (method.compare("DISEVOL")==0) return BASIS_DISEVOL; + if (method.compare("NSR")==0) return BASIS_NSR; + if (method.compare("DISEVOL")==0) return BASIS_DISEVOL; + if (method.compare("PDF4LHC20")==0) return BASIS_PDF4LHC20; cerr << "getFitBasisType Error: Invalid parametrization type: "<<method; exit(EXIT_FAILURE); diff --git a/nnpdfcpp/src/nnfit/inc/fitbases.h b/nnpdfcpp/src/nnfit/inc/fitbases.h index c457075a6b75411868bcff096fdefc8be304e167..8af64b71635d0dcedd4da5ab5210934581eb1718 100644 --- a/nnpdfcpp/src/nnfit/inc/fitbases.h +++ b/nnpdfcpp/src/nnfit/inc/fitbases.h @@ -114,6 +114,31 @@ protected: bool fQED; }; +/** + * \class PDF4LHC20FitBasis + * \brief PDF4LHC20 basis for fitting + */ +class PDF4LHC20FitBasis: public FitBasis +{ +public: + PDF4LHC20FitBasis(NNPDFSettings const&); + + // Σ, g, V, V3, T3, T8, γ + + enum fitBasis {FIT_SNG, FIT_GLU, FIT_VAL, FIT_V3, FIT_T3, FIT_T8, FIT_GAM }; + + void BASIS2EVLN(real const* basis, real* evln) const; + void EVLN2BASIS(real const* evln, real* basis) const; + + real ComputeSumRules(sumRule, int mem, PDFSet*, bool&) const; + + // Preprocessing + void ComputeParam(PDFSet*, int mem, PreprocParam&, bool&) const; + +protected: + bool fQED; +}; + /** * \class DISEvolFitBasis * \brief DIS Evol basis for fitting @@ -298,4 +323,4 @@ public: // Preprocessing void ComputeParam(PDFSet*, int mem, PreprocParam&, bool&) const; -}; \ No newline at end of file +}; diff --git a/nnpdfcpp/src/nnfit/src/fitbases.cc b/nnpdfcpp/src/nnfit/src/fitbases.cc index 8abcbc6d599e6d4d0fed865886d70bd3843927f1..623a519c90556dad0359f99c56cf70ccf561fc67 100644 --- a/nnpdfcpp/src/nnfit/src/fitbases.cc +++ b/nnpdfcpp/src/nnfit/src/fitbases.cc @@ -34,6 +34,7 @@ FitBasis* getFitBasis(NNPDFSettings const& settings, basisType btype, const int cout << Colour::FG_BLUE << "Selecting FitBasis: EVOL" << Colour::FG_DEFAULT << endl; break; } + case BASIS_DISEVOL: { fitbasis = new DISEvolFitBasis(settings); @@ -100,6 +101,13 @@ FitBasis* getFitBasis(NNPDFSettings const& settings, basisType btype, const int break; } + case BASIS_PDF4LHC20: + { + fitbasis = new PDF4LHC20FitBasis(settings); + cout << Colour::FG_BLUE << "Selecting FitBasis: EVOL" << Colour::FG_DEFAULT << endl; + break; + } + default: cerr << Colour::FG_RED << "[getFitBasis] error: Invalid Fitting Basis" << Colour::FG_DEFAULT << endl; exit(-1); @@ -599,6 +607,193 @@ real EvolFitBasis::ComputeSumRules(sumRule rule, int mem, PDFSet *pdf, bool &sta } } +// ****************** PDF4LHC20 BASIS ************************* + + +/** + * Evolution Fit Basis + **/ +PDF4LHC20FitBasis::PDF4LHC20FitBasis(NNPDFSettings const& nnset): +FitBasis(nnset, "PDF4LHC20FitBasis", 6+nnset.IsQED()), +fQED(nnset.IsQED()) +{ + // PDF Names for plotting + fPDFNames[FIT_SNG] = "Singlet"; + fPDFNames[FIT_GLU] = "Gluon"; + fPDFNames[FIT_VAL] = "V"; + fPDFNames[FIT_V3] = "V3"; + fPDFNames[FIT_T3] = "T3"; + fPDFNames[FIT_T8] = "T8"; + if (fQED) + fPDFNames[FIT_GAM] = "Photon"; + + // Damping factor for arclengths + fArcDampFactor[FIT_SNG] = 1; + fArcDampFactor[FIT_GLU] = 1; + fArcDampFactor[FIT_VAL] = 0; + fArcDampFactor[FIT_V3] = 0; + fArcDampFactor[FIT_T3] = 1; + fArcDampFactor[FIT_T8] = 1; + if (fQED) + fArcDampFactor[FIT_GAM] = 1; + +} + +void PDF4LHC20FitBasis::ComputeParam(PDFSet* pdf, int mem, PreprocParam& param, bool &status) const +{ + // status + status = false; + + // Clear old normalisations + for (int i=0; i<fNPDF; i++) + { + param.fPDFNorm[i] = 1.0; + param.fPDFAux[i] = 0.0; + } + + // Normalisations pointer + real* norm = param.fPDFNorm; + + // Quantum number sum rules + norm[FIT_VAL] = 3.0f/pdf->IntegratePDF(mem,FIT_VAL,fQ2,PDFSet::FX,status,fGSLWork); // Total valence + norm[FIT_V3] = 1.0f/pdf->IntegratePDF(mem,FIT_V3,fQ2,PDFSet::FX,status,fGSLWork); // V3 + + // ************ QED dependent normalisations ************** + if (fQED) + { + norm[FIT_GLU] = (1-pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork) - pdf->IntegratePDF(mem,FIT_GAM,fQ2,PDFSet::XFX,status,fGSLWork)) + / pdf->IntegratePDF(mem,FIT_GLU,fQ2,PDFSet::XFX,status,fGSLWork); + } + else + { + norm[FIT_GLU] = (1-pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork))/ + pdf->IntegratePDF(mem,FIT_GLU,fQ2,PDFSet::XFX,status,fGSLWork); + } + + return; + +} + +/** + * @brief EvolFitBasis::BASIS2EVLN + * @param FIT + * @param EVLN + */ +void PDF4LHC20FitBasis::BASIS2EVLN(const real *FIT, real *EVLN) const +{ + if ( fQED ) + EVLN[EVLN_GAM] = FIT[FIT_GAM]; + else + EVLN[EVLN_GAM] = 0; + + EVLN[EVLN_SNG] = FIT[FIT_SNG]; //Singlet + EVLN[EVLN_GLU] = FIT[FIT_GLU]; //Gluon + EVLN[EVLN_VAL] = FIT[FIT_VAL]; //Valence + EVLN[EVLN_V3] = FIT[FIT_V3]; //V3 + EVLN[EVLN_V8] = FIT[FIT_VAL]; //V8 + EVLN[EVLN_V15] = FIT[FIT_VAL]; //V15 = V + EVLN[EVLN_V24] = FIT[FIT_VAL]; //V24 = V + EVLN[EVLN_V35] = FIT[FIT_VAL]; //V35 = V + EVLN[EVLN_T3] = FIT[FIT_T3]; //T3 + EVLN[EVLN_T8] = FIT[FIT_T8]; //T8 + EVLN[EVLN_T15] = FIT[FIT_SNG]; //T15 = S + EVLN[EVLN_T24] = FIT[FIT_SNG]; //T24 = S + EVLN[EVLN_T35] = FIT[FIT_SNG]; //T35 = S + + return; +} + +void PDF4LHC20FitBasis::EVLN2BASIS(const real *EVLN, real *FIT) const +{ + // Order in fitting basis + // S g V V3 V8 T3 T8 gam + + // Order in Evln bassi + // γ, Σ, g, V, V3, V8, V15, V24, V35, T3, T8, T15, T24, T35 + + FIT[FIT_SNG] = EVLN[EVLN_SNG]; //Singlet + FIT[FIT_GLU] = EVLN[EVLN_GLU]; //gluon + FIT[FIT_VAL] = EVLN[EVLN_VAL]; //valence + FIT[FIT_V3] = EVLN[EVLN_V3]; // V3 + FIT[FIT_T3] = EVLN[EVLN_T3]; // T3 + FIT[FIT_T8] = EVLN[EVLN_T8]; // T8 + + if (fQED) + FIT[FIT_GAM] = EVLN[0]; // photon + + return; +} + +real PDF4LHC20FitBasis::ComputeSumRules(sumRule rule, int mem, PDFSet *pdf, bool &status) const +{ + // status + status = false; + + // sum rule calculations + switch (rule) { + case SUM_MSR: + { + real xsng = pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork); + real xglu = pdf->IntegratePDF(mem,FIT_GLU,fQ2,PDFSet::XFX,status,fGSLWork); + real msr = xsng+xglu; + if (fQED) + { + real xgam = pdf->IntegratePDF(mem,FIT_GAM,fQ2,PDFSet::XFX,status,fGSLWork); + msr += xgam; + } + return msr; + } + break; + case SUM_UVL: + { + real val = pdf->IntegratePDF(mem,FIT_VAL,fQ2,PDFSet::FX,status,fGSLWork); + real v3 = pdf->IntegratePDF(mem,FIT_V3,fQ2,PDFSet::FX,status,fGSLWork); + return ( val + v3 )/2.0; + } + break; + case SUM_DVL: + { + real val = pdf->IntegratePDF(mem,FIT_VAL,fQ2,PDFSet::FX,status,fGSLWork); + real v3 = pdf->IntegratePDF(mem,FIT_V3,fQ2,PDFSet::FX,status,fGSLWork); + return ( val - v3 )/2.0; + } + break; + case SUM_SVL: + { + real val = pdf->IntegratePDF(mem,FIT_VAL,fQ2,PDFSet::FX,status,fGSLWork); + return ( val - val )/3.0; + } + break; + case SUM_USM: + { + real sng = pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork); + real t3 = pdf->IntegratePDF(mem,FIT_T3,fQ2,PDFSet::XFX,status,fGSLWork); + real t8 = pdf->IntegratePDF(mem,FIT_T8,fQ2,PDFSet::XFX,status,fGSLWork); + return ( 2.0*sng + 3.0*t3 + t8 )/6.0; + } + break; + case SUM_DSM: + { + real sng = pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork); + real t3 = pdf->IntegratePDF(mem,FIT_T3,fQ2,PDFSet::XFX,status,fGSLWork); + real t8 = pdf->IntegratePDF(mem,FIT_T8,fQ2,PDFSet::XFX,status,fGSLWork); + return ( 2.0*sng - 3.0*t3 + t8 )/6.0; + } + break; + case SUM_SSM: + { + real sng = pdf->IntegratePDF(mem,FIT_SNG,fQ2,PDFSet::XFX,status,fGSLWork); + real t8 = pdf->IntegratePDF(mem,FIT_T8,fQ2,PDFSet::XFX,status,fGSLWork); + return ( sng - t8 )/3.0; + } + break; + default: + cerr << "PDF4LHC20FitBasis::ComputeSumRules error: unknown sum rule"<<endl; + exit(-1); + break; + } +} + // ******************** DIS EVOLUTION BASIS (ISOSCALAR CASE)******* diff --git a/nnpdfcpp/src/validphys/src/plotdata.cc b/nnpdfcpp/src/validphys/src/plotdata.cc index d92f3dc382fb3fcd3a055c3ed9c832f29b41ee37..aac6c2098e921bd37d0bd0edf2a8d8a24a765da2 100644 --- a/nnpdfcpp/src/validphys/src/plotdata.cc +++ b/nnpdfcpp/src/validphys/src/plotdata.cc @@ -710,6 +710,9 @@ void PlotData::AddPreprocPlots(int i, LHAPDFSet *pdf) real (*evolf[])(real*) = {&fsinglet,&fgluon,&fV,&fV3,&fV8,&fT3,&fT8,&fphoton}; string evol[] = {"Singlet","Gluon","Valence","V3","V8","T3","T8","Photon"}; + real (*pdf4lhc20f[])(real*) = {&fsinglet,&fgluon,&fV,&fV3,&fT3,&fT8,&fphoton}; + string pdf4lhc20[] = {"Singlet","Gluon","Valence","V3","T3","T8","Photon"}; + real (*evolsf[])(real*) = {&fsinglet,&fgluon,&fV,&fV8,&fT3,&fT8,&fDelta,&fphoton}; string evols[] = {"Singlet","Gluon","Valence","V8","T3","T8","#Delta_{s}","Photon"}; @@ -2511,6 +2514,7 @@ void PlotData::AddCTEstimators(vector<LHAPDFSet*> pdf,vector<ExperimentResult *> real (*nn23f[])(real*) = {&fsinglet,&fgluon,&fV,&fT3,&fDelta,&fsplus,&fsminus,&fphoton}; real (*evolf[])(real*) = {&fsinglet,&fgluon,&fV,&fV3,&fV8,&fT3,&fT8,&fphoton}; + real (*pdf4lhc20f[])(real*) = {&fsinglet,&fgluon,&fV,&fV3,&fT3,&fT8,&fphoton}; real (*evolsf[])(real*) = {&fsinglet,&fgluon,&fV,&fV8,&fT3,&fT8,&fDelta,&fphoton}; real (*flvrf[])(real*) = {&fgluon,&fup,&fubar,&fdown,&fdbar,&fstrange,&fsbar}; real (*nn30icf[])(real*) = {&fsinglet,&fgluon,&fV,&fT3,&fDelta,&fsplus,&fsminus,&fcplus,&fcminus,&fphoton}; @@ -2524,6 +2528,8 @@ void PlotData::AddCTEstimators(vector<LHAPDFSet*> pdf,vector<ExperimentResult *> for (int t = 0; t < nfl; t++) functions[t] = nn23f[t]; else if (setbasis == BASIS_EVOL || setbasis == BASIS_EVOLQED) for (int t = 0; t < nfl; t++) functions[t] = evolf[t]; + else if (setbasis == BASIS_PDF4LHC20) + for (int t = 0; t < nfl; t++) functions[t] = pdf4lhc20f[t]; else if (setbasis == BASIS_EVOLS || setbasis == BASIS_EVOLSQED) for (int t = 0; t < nfl; t++) functions[t] = evolsf[t]; else if (setbasis == BASIS_FLVR || setbasis == BASIS_FLVRQED) diff --git a/validphys2/src/validphys/pdfbases.py b/validphys2/src/validphys/pdfbases.py index 5c4b6cedaac6e51e1cae3ad8535bfe3414a1f99e..0b73fdbbca530745d37e3609c045a5deca54b021 100644 --- a/validphys2/src/validphys/pdfbases.py +++ b/validphys2/src/validphys/pdfbases.py @@ -500,6 +500,25 @@ evolution = LinearBasis.from_mapping({ EVOL = evolution +PDF4LHC20 = LinearBasis.from_mapping({ + r'\Sigma': { + 'u': 1, 'ubar': 1, 'd': 1, 'dbar': 1, 's': 1, 'sbar': 1, + 'c': 1, 'cbar': 1, 'b': 1, 'bbar': 1, 't': 1, 'tbar': 1}, + 'g': {'g': 1}, + + 'V': { + 'u': 1, 'ubar': -1, 'd': 1, 'dbar': -1, 's': 1, 'sbar': -1, + 'c': 1, 'cbar': -1, 'b': 1, 'bbar': -1, 't': 1, 'tbar': -1}, + + 'V3': {'u': 1, 'ubar': -1, 'd': -1, 'dbar': 1}, + + 'T3': {'u': 1, 'ubar': 1, 'd': -1, 'dbar': -1}, + 'T8': {'u': 1, 'ubar': 1, 'd': 1, 'dbar': 1, 's': -2, 'sbar': -2}, + }, + aliases = {'gluon':'g', 'singlet': r'\Sigma', 'sng': r'\Sigma', 'sigma': r'\Sigma', + 'v': 'V', 'v3': 'V3', 't3': 'T3', 't8': 'T8'}, + default_elements=(r'\Sigma', 'gluon', 'V', 'V3', 'T3', 'T8', )) + NN31IC = LinearBasis.from_mapping( { r'\Sigma': { @@ -618,6 +637,16 @@ def fitbasis_to_NN31IC(flav_info, fitbasis): cp = {'sng': 0.25, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': -0.25, 'g': 0 } g = {'sng': 0, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 1 } + elif fitbasis == 'PDF4LHC20': + sng = {'sng': 1, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 0 } + v = {'sng': 0, 'v': 1, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 0 } + v3 = {'sng': 0, 'v': 0, 'v3': 1, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 0 } + v8 = {'sng': 0, 'v': 1, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 0 } + t3 = {'sng': 0, 'v': 0, 'v3': 0, 'v8': 0, 't3': 1, 't8': 0, 't15': 0, 'g': 0 } + t8 = {'sng': 0, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 1, 't15': 0, 'g': 0 } + cp = {'sng': 0.25, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': -0.25, 'g': 0 } + g = {'sng': 0, 'v': 0, 'v3': 0, 'v8': 0, 't3': 0, 't8': 0, 't15': 0, 'g': 1 } + flist = [sng, g, v, v3, v8, t3, t8, cp] evol_basis = False