diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,1407 +1,1411 @@ +2019-07-08 Andy Buckley + + * Actually delete the previous AlphaS object when calling PDF::setAlphaS(). + 2019-06-04 Graeme Watt * Modify lhapdf script to support Content-Length in HTTP header not given as a list so that file size is calculated correctly for CERN EOS. 2019-05-21 Andy Buckley * Add a couple of extra trim() calls to path strings given to the Fortran API. 2019-05-11 Andy Buckley * Apply lhapdf script improvement from Ivan Razumov / Genser. 2019-05-10 Andy Buckley * Version 6.2.2! 2019-05-08 Andy Buckley * Don't pop the final path entry off in the pathsPrepend and pathsAppend functions: the compile-time fallback may have been disabled. 2019-05-02 Andy Buckley * Add a 'show' option to the lhapdf script. * Adapt MPI file-reading patch from Stefan Hoeche. Enable with --enable-mpi to configure. * Rewrite the lhapdf data-manager script to use argparse, for compatibility with Python 3. 2019-03-29 Andy Buckley * Apply compiler optimisation bypass "volatile" hack to default data path insertion. Thanks to Zahari Kassabov. 2018-12-17 Andy Buckley * Add legend PDF name aliasing to plotpdfs 2018-11-01 Graeme Watt * Explicitly catch x > xMax error in ContinuationExtrapolator. 2018-10-24 Graeme Watt * Don't require the presence of Content-Length in HTTP header. 2018-10-19 Andy Buckley * Utils.h: Fix separator bug in join() function. Thanks to Dmitry Kalinkin. 2018-08-20 Andy Buckley * Remove 'const's from return-by-value types in KnotArray.h, to keep icpc happy. 2018-05-16 Andy Buckley * Add lhapdf_lambda4/5 functions in the Fortran interface. * Remove unwanted pid argument from the Fortran xfx*_stdpartons functions. 2018-01-25 Andy Buckley * Move Config::get() static function from header to .cc, since a singleton needs to only 'live' in one compilation unit. 2017-09-05 Andy Buckley * Version 6.2.1! 2017-09-04 Andy Buckley * Fix signed/unsigned comparison in Fortran interface. 2017-08-31 Andy Buckley * Fix ccstr_to_fstr function, and hence several problems in the LHAGlue Fortran interface. 2017-08-28 Andy Buckley * Use lhapdf Python module in lhapdf script, to avoid YAML-parsing problems. 2017-08-27 Andy Buckley * Extend Python xfxQ and xfxQ2 functions to allow multiple PID values and 2-arg versions which return all PIDs. 2017-08-25 Andy Buckley * Make alphaS, interpolator, and extrapolator setting eager rather than lazy. * Remove unique_ptr from the public PDF.h header for now, for C++98 API compatibility. 2017-08-10 Andy Buckley * Eliminate C++11 features from headers, and moving some oversized inlines into .cc files. 2017-07-13 Andy Buckley * Version 6.2.0 release. 2017-07-11 Andy Buckley * Add warning printouts and some verbosity control to the LHAGlue Fortran setlhaparm function. 2017-07-09 Andy Buckley * Provide lookupPDF and lookupLHAPDFID functions accepting a single setname/mem string. * Finally removed Boost multi_array... and it was sooooo easy. Sorry for the delay! Validated. 2016-08-17 Andy Buckley * All Boost usage removed except multi_array. * Propagate C++11 compiler definition to Cython build and lhapdf-config; add --cxx flag to lhapdf-config. 2016-08-16 Andy Buckley * Add normal and chi-squared quantile functions, and incomplete gamma functions, extracted and converted by Graeme Watt based on ROOT and Cephes code. * Require C++11, and starting to remove Boost. 2016-02-16 Andy Buckley * Add x-grouped xf vs Q plots to plotpdfs, and allow the user to control which plot groups to make. 2016-02-09 Andy Buckley * Improvements to plotpdfs script. * Move scripts for installation into a bin directory. 2016-02-08 Andy Buckley * Corrections in the lhapdf manager script for Python3 compatibility. Thanks to Frank Siegert. 2015-12-22 Andy Buckley * Version 6.1.6 release! 2015-12-21 Andy Buckley * Add canonical PDF.orderQCD property to Python PDF, to replace PDF.qcdOrder. * Add PDF::quarkMass and PDF::quarkThreshold methods to C++ and Python. * Fix quark integer ID mapping to Down/Up metadata keys in AlphaS factory routine. 2015-12-18 Andy Buckley * Add a cstr_to_fstr function to LHAGlue.cc, for improved C++ to Fortran string conversion (handling length limits, padding rather than zero-termination, etc.) 2015-12-17 Andy Buckley * Add PDF::print() protection against being unable to read the PDF set index file, so there isn't a crash for the trivial reason of on-screen printout formatting when the data path is restricted with trailing ::. 2015-12-16 Andy Buckley * Fixes to the lhapdf script. Thanks again to Dmitry Kalinkin for a patch. * Add missing getlam4 and getlam5 functions to Fortran interface. Thanks to Dmitry Kalinkin for the patch. * Update Cython and Python interfaces to support Python3 syntax. Thanks to Vitaly Yermolchyk for the patches! * Update to even newer boost.m4 2015-12-03 Andy Buckley * Don't append the install prefix to path searches if $LHAPDF_DATA_PATH ends with a double-colon, ::. * De-inline the availablePDFSets() function, and veto duplicate set names. 2015-09-23 Graeme Watt * Determine number of parameter variation members by counting number of "+" signs in ErrorType, e.g. "replicas+as+mc+mb+mt". * Added a new checkPdfType() member function to PDFSet class. 2015-07-17 Graeme Watt * Added support for combined PDF+alphaS sets via new ErrorType values, i.e. "replicas+as", "hessian+as" and "symmhessian+as". 2015-04-10 Andy Buckley * Updating AUTHORS notice to final EPJC paper reference, and adding a final citation reminder message via the Config destructor. 2015-03-20 Andy Buckley * src/Factories.cc: Adding a set of expandPDFsStr(), decodePDFStr and decodePDFsStr functions to be used for handling more general PDF strings of the sort that will be used in the CompositePDF factory system. * Adding a default constructor and knotarrays() accessor to GridPDF, as requested by Nathan Hartland. 2015-01-09 Graeme Watt * Remove abs(...) twice in function PDFSet::randomValueFromHessian to correct a mistake in Eq. (6.5) of arXiv:1205.4024v2. The correction is necessary to ensure that correlations are preserved when converting a Hessian PDF set to a Monte Carlo PDF set. 2014-12-23 Andy Buckley * 6.1.5 release. 2014-12-22 Andy Buckley * Better error handling in PDF index lookup, including clearer reporting of set-unmatched PDF IDs and member numbers which are out of range for a valid set. * Restoring original active set member in LHAGlue metadata get* functions which were previously switching focus as a result of calling loadMember() to get numerical grid data. * Making LHAGlue Fortran interface switch the current set slot more coherently (has_photon is the exception). * Attempt to use Threshold* metadata keys for Fortran getthresholdm_ and old C++ wrapper getThreshold. Not yet fully supported in the rest of the system but we may as well pre-empt it while editing LHAGlue.cc. * Add missing getdescm_ and getdesc_ Fortran functions. * Add missing Fortran getdatapath function, cf. LHAPDF5 but with colon separators between multiple paths if appropriate. * Add Fortran lhapdf_getpdfsetlist function, returning the list of available PDF sets as a space-separated string. Note the lhapdf_ prefix -- this is the intended 'namespace' form for a new Fortran interface at some point. 2014-12-18 Andy Buckley * Remove obsolete config flags from lhapdf.conf * examples/compatibility.cc: Simplify compatibility macro checking. 2014-10-29 Andy Buckley * Add parsing and use of the internal PID data line in GridPDF.cc, in preference to the PDF::flavors() method. This fixes a bug, since flavors() was sorting the list, meaning that data files without monotonically sorted PID columns would wrongly assign PDFs to PIDs. 2014-10-08 Graeme Watt * Added new ContinuationExtrapolator to provide same extrapolation as in the MSTW standalone code (and LHAPDF5 when using MSTW sets). 2014-10-03 Andy Buckley * Better code organisation and protection against out-of-bounds array accesses in log-bicubic interpolator. 2014-08-28 Graeme Watt * Fallback to bilinear interpolator if using bicubic interpolator with only 2 or 3 Q2 knots in a subgrid. 2014-08-26 Andy Buckley * Improve LHAGlue info messages to not specify that particular generators are being used. 2014-08-19 Andy Buckley * LHAPDF 6.1.4 release 2014-08-15 Andy Buckley * Adding multiset variants of the 5 getmin/max LHAGlue functions. * Adding the 'unofficial' getminmax Fortran function to LHAGlue.cc (thanks to Andrey Sapronov for the report and patch). 2014-07-18 Andy Buckley * Treat PID 0 as an alias for 21 in PDF::hasFlavor as well as the PDF::xf* functions. Thanks to Nathan Hartland for the report. 2014-07-10 Andy Buckley * Clarify in lhapdf script help that 'list' by default shows all available sets, not those installed on the user's system. 2014-07-09 Andy Buckley * Update CONFIGFLAGS docs to fix some errors w.r.t. actual flag usage. * Treat a DataVersion of 0 as unvalidated: valid numbers now start at 1. * Remove the LHAPDF ID from the warning printout about unvalidated PDFs, since in that case there will usually be no standard ID number and it just gets unhelpfully reported as -1. * Detect and report improperly terminated grid files (ones missing a --- final line). * Replace asserts with exceptions and improve subgrid error reporting in GridPDF. * Report the value of Q2 that causes a subgrid-finding failure. * Improve testgrid to use PDFNAME/MEMNUM arg syntax. 2014-07-7 David Grellscheid * Forbid compilation if the demon combination of Boost < 1.47 and GCC >= 4.6, with a serious bug in BOOST_FOREACH, is found: http://code-muse.com/2013/08/06/boostforeach-and-compiler-bugs 2014-06-18 Karl Nordstrom * Improved AlphaS ODE solver performance. 2014-06-17 Andy Buckley * 6.1.3 release! * tests/Makefile.am: Add appropriate programs to "make installcheck". 2014-06-17 David Grellscheid * wrappers/python/Makefile.am: 'make distcheck' and out-of-source builds should work now. 2014-06-16 Andy Buckley * Add CVMFS and AFS downloading (by preference) to the lhapdf script, as well as user-configurable download sources and tarball removal. * Fix bug in PDF::qcdOrder method, and deprecate that method in favour of orderQCD (to match AlphaS and the flag name). * Further improvements to error messages when trying to load an invalid PDF. * Tweak output of testalphas.cc * Adding first make check targets (requires CT10nlo to be installed). 2014-06-15 Andy Buckley * Flavour thresholds in alpha_s solvers, and threshold subgrids from ODE solver (by Karl Nordstrom) * Add accessors to a PDF's AlphaS object and to an AlphaS' QCD order. 2014-06-12 Andy Buckley * Bump version number for next release. * Add mapping of reweighting functions into Python. 2014-06-11 Andy Buckley * Fix compiler warnings re. unused variables in LHAGlue.h and AlphaS.h headers. 2014-06-09 David Grellscheid * Fix attempted use of non-existent std::vector::find method. 2014-05-29 Andy Buckley * Change source name of analyticpdf example. * Adding a mini-constructor to PDF to make sure that _forcePos is set to a sane default value. 2014-05-28 Andy Buckley * 6.1.2 release! 2014-05-28 James Ferrando * Fix HWLHAPDF behaviour in pdfset 2014-05-27 Andy Buckley * 6.1.1 release! 2014-05-26 James Ferrando * Modify printout in PDFLIB backwards compatibility routine to avoid confusion for some HERWIG use cases 2014-05-22 Andy Buckley * Adding warnings about mismatching alpha_s in reweighting, with a default tolerance of 5%. 2014-05-20 Andy Buckley * Add LHAPDF/Reweighting.h with a few handy functions for doing 'naive' PDF reweighting. 2014-05-19 Andy Buckley * Replace all internal uses of "foreach" with explicit BOOST_FOREACH until C++11. 2014-05-17 Andy Buckley * Remigrate all NNPDF sets to remove duplicate Qmax points. 2014-05-10 Andy Buckley * Adding initLHAPDF() and a few other do-nothing compatibility functions. 2014-04-25 Andy Buckley * 6.1.0 release! 2014-04-24 Andy Buckley * Return -1 for errorConfLevel on replica PDF sets. * Mapping uncertainty functions into Python. 2014-04-21 Andy Buckley * Derive LHAPDF_VERSION_CODE integer using a Mac-safe sed regex. 2014-04-17 Andy Buckley * Fix pdfsets.index parsing (column order) in lhapdf script. * Supporting the pkg-config type --cflags and --libs switches on lhapdf-config. 2014-04-16 Andy Buckley * Adding an LHAPDF5 compatibility mode flag, Pythia6LambdaV5Compat, which sets all LambdaQCD common block values to 0.192 as was historically the case for PYTHIA6's use of LHAPDF. This behaviour is definitely physically incorrect, as well as against the spirit of the PYTHIA6 steering flags, but it is the long-term behaviour of PYTHIA6+LHAPDF and many PYTHIA6 MC tunes have been built around this behaviour. This flag is set 'true' by default to minimise user surprise -- if you want LHAPDF to report correct (i.e. varying by PDF) values to PYTHIA6, then explicitly set this flag to be false in lhapdf.conf or similar. 2014-04-15 Andy Buckley * Adding a single-string "dir style" SETNAME/NMEM syntax for accessing a PDF set+member. 2014-04-14 Andy Buckley * Adding the namespace protection workaround for Boost described at http://www.boost.org/doc/libs/1_55_0/doc/html/foreach.html * Adding AlphaS_FlavorScheme and AlphaS_NumFlavors metadata flags as optional specific versions for use by the AlphaS system, particularly if the alpha_s QCD evolution doesn't match that of the PDF itself. 2014-04-13 Andy Buckley * Adding a lhapdf.pc file for use by pkg-config * Check for sizes of subgrids required by each interpolator algorithm (linear ipol requires >= 2 knots, cubic requires >= 4). * Renumberings of several MRST and MSTW sets's global IDs: MRST2004qed_proton 20461->20463 MRST2004qed_neutron 20462->20465 MSTW2008lo90cl 21041->21050 MSTW2008nlo90cl 21141->21150 MSTW2008nnlo90cl 21241->21250 MSTW2008lo90cl_nf3 23041->23050 MSTW2008lo90cl_nf4 23141->23150 MSTW2008nlo90cl_nf3 23241->23250 MSTW2008nlo90cl_nf4 23341->23350 MSTW2008nnlo90cl_nf3 23541->23550 MSTW2008nnlo90cl_nf4 23641->23650 * Updates to the CONFIGFLAGS documention, removing some unused flags and adding the new Note flag. * Printing out a Note metadata entry on set initialization, if one is found. * Removing the metadata() functions from Info, since they were unused and did not respect the cascading design. 2014-03-25 Andy Buckley * More tweaking of the uncertainty function behaviour. * Adding in_range, in_open_range, in_closed_range functions. 2014-03-24 Andy Buckley * Removing compatibility auto-cast of PDFUncertainty to vector, converting remaining functions to use the struct, rationalising the previously split uncertainty() implementation, and code tidying. * Converting the uncertainty functions to add a no-copy version and to return a new struct rather than a vector. 2014-03-23 Andy Buckley * Moving new uncertainty functions into a new PDFSet.cc file to keep header clean. * Removing now unnecessary cmake check from configure and the docs. 2014-03-19 Andy Buckley * Convert lhapdf-yaml-cpp building to use libtool, avoiding linking portability issues. Re-enable static library building since the necessary symbols now seem to be present (and the libtool warning has also disappeared). 2014-03-16 Andy Buckley * Disable static library build for now, until we can figure out how to portably pull symbols from yaml-cpp into both shared and static libs via libtool. 2014-03-15 Andy Buckley * Adding more compatibility functions: getDescription, getLam4,5, and getOrderPDF functions in old C++ wrapper. 2014-03-15 Graeme Watt * Adding new example programs testpdfunc and hessian2replicas, functions for PDF uncertainties in PDFSet.h, and backwards compatibility functions (+ getnset_, getnmem_) in LHAGlue.cc. 2014-03-13 Andy Buckley * Adding implementations of getnf_, setpdfpath_ and placeholder getnset_, getnmem_ LHAGLUE functions. 2014-03-07 Andy Buckley * Doc updates, and added script and current output to generate a PDF sets list Doxygen/HTML input from sets found on the developer system. * Add a third column to the pdfsets.index file for version comparison by the manager script. 2014-03-05 Andy Buckley * Protect LHAGlue initialisation from unset Lambda values. 2014-02-12 Andy Buckley * Adding mkindex script, to generate pdfsets.index automatically from metadata. * Adding lhapdfID (using SetIndex) to PDFSet and mapping it and dataversion into Python. 2014-01-29 Andy Buckley * Adding the SetIndex and Parent metadata fields, and updating the creategrids script, pdfsets.index and tomigrate files accordingly. * Removing the external yaml-cpp build option, and improving/clarifying the internal yaml-cpp build and linking. 2014-01-27 Andy Buckley * Tweaks for better variable-passing to cmake in the bundled yaml-cpp build. 2014-01-22 Andy Buckley * configure.ac: Remove opportunistic C++11 build, until this becomes mandatory (with removalof Boost). Anyone who wants C++11 can explicitly set the CXXFLAGS (and DYLDFLAGS for pre-Mavericks Macs) 2013-12-20 Andy Buckley * Version 6.0.5 release. * Internally rename libyaml-cpp.a to liblhapdf-yaml-cpp.a to definitely avoid picking up one from the system. * Adding comment and empty line support to PDF index parsing, and updating pdfsets.index with missing PDFs and assigning LHAPDF IDs to ABM12, new MRST QED and MSTW sets, new NNPDF23 QED sets, and the first ATLAS PDF sets. 2013-12-19 Andy Buckley * Changing the YAML functions to operate in a mangled namespace if using the LHAPDF bundled version (a bit of sed and preprocessor: not too evil!) * Merging in the first version of the lhapdf manager script by David Hall. Thanks! * Further tweaking of the grid numerics parsing, using a variation on Gavin Salam's FastIStringStream class. 2013-12-17 Andy Buckley * Replacing use of the tokenizing istringstream in GridPDF.cc with basic ifstream seetg and tellg calls for initialisation speed improvement: thanks to David Grellscheid for the suggestion and implementation help! 2013-12-14 Andy Buckley * Adding a --disable-lhaglue-cxx configure switch and machinery to use it (disables building of LHAPDF5 C++ compatibility routines.) * Adding requested xfxphoton and getqmass_ functions and various Fortran wrapper fixes. 2013-12-13 Andy Buckley * Adding a typedef of auto_ptr as unique_ptr if not in C++0x or later. * Adding -DNDEBUG to the CXXFLAGS if not in debug mode. * Use C++11 compilation if available. 2013-12-11 Andy Buckley * Removing checking for and linking against Boost filesystem and system libs! * Replacing use of boost::filesystem::path and functions with home-made versions. * Adding use of a built-in yaml-cpp (0.3.0) if --with-yaml-cpp (or similar configure flags) are not specified. * Using intermediate static libs to build the source files that depend on YAML and Boost path stuff separately from the others. 2013-11-07 Andy Buckley * Adding -Qunused-arguments to CPPFLAGS (to keep clang++ quiet). 2013-11-04 Andy Buckley * Removing OpenMP directives: the One Definition Rule makes this usage dangerous/illegal, and I think we've agreed among developers to leave decisions about how to multithread up to the user for their specific case. 2013-10-28 Andy Buckley * tests/: adding testing of all available PDF sets' central info systems. * Factories.*: mkPDFInfo now returns PDFInfo* rather than Info*. 2013-10-18 Andy Buckley * Adding OpenMP directives to all-flavour functions in PDF.h. I don't see a big speed difference in profiling, though: -Ofast gives a much bigger speed-up. 2013-10-10 Andy Buckley * Small improvements to the banner messages when loading a whole PDF set. 2013-10-09 Andy Buckley * Version 6.0.4 release. * Being a wee bit smart and dropping the verbosity level temporarily when loading a whole set, to avoid flooding the terminal. * Tweaking banner and PDF printouts. * Adding verbosity() and setVerbosity() functions. 2013-10-07 James Ferrando * Fixed handling of Fortran string-in-common-block objects in the initPDFSet routine * Added missing initPDFSet variants w.r.t. lhapdf5. 2013-10-07 Andy Buckley * Adding banner printout if Verbosity > 0, and extra arg on print() methods. * More Cython mapping improvements -- PDFs can now return their parent set or info objects. * Improving error messages when PDF data files are not found. * Fixing various aspects of Info, PDFSet, PDFInfo mapping to Python. * src/LHAGlue.cc: Removing erroneous if "protection" blocks which broke PDF set re-initialisation. 2013-09-30 Andy Buckley * Version 6.0.3 release. 2013-09-26 Andy Buckley * Fixing and extending Cython wrappers for Info and subclasses. * Adding print() and dataversion() functions on PDF and PDFSet. 2013-09-25 Andy Buckley * Adding machinery for migration of the MRST2004qed set to creategrids. * Many improvements to creategrids correctness, efficiency, etc. 2013-09-23 Andy Buckley * Add mkPDFs templated vector-filling functions and update the testpdfset example program. * Add the -avoid-version flag to libtool. 2013-09-22 Andy Buckley * Change implementation of forced positivity to use an int value to allow for better caching and distinguishing between forced-positive and forced-positive-definite. The flag has been renamed to ForcePositive, to indicate that it triggers an action rather than just being some manually provided information about the PDF in question. 2013-09-06 James Ferrando * Modified PDFLIB comaptibility function to handle format of input arrays from POWHEG. 2013-09-03 Andy Buckley * Fixed misnaming in the automatic rewriting of cteq6ll -> cteq6l1. 2013-08-30 Steve Lloyd * Added functionality for forcing a loaded GridPDF to return positive definite values through the flag "PositiveDefinite" in the set metadata. This is to prevent overshooting in to negative values when interpolating/extrapolating. Updated creategrids script with a --force-pos-def flag to reflect this change. 2013-08-30 Andy Buckley * Adding do-nothing overloadings of the 2-arg fallback version of get_entry() to PDFSet and PDFInfo: it turns out that inheritance and multiple dispatch of class methods don't automatically play as nicely as you might think! 2013-08-29 Andy Buckley * 6.0.2 patch release. * Updating the version for the latest patch, and being more pessimistic about Boost compatibility: assuming that Boost 1.49 is the oldest compatible release until we hear otherwise. * Reworking the validation system to use 0 rather than 21 for the gluon ID (a simplification due to v5/v6 compatibility) and to allow building of top PDF validation plots. * Removing builds of examples and tests directories from the top-level default make target. 2013-08-29 James Ferrando * Fix some reference-type arguments in 'Fortran' functions to be const. * LHAGlue.h, LHAGlue.cpp: Fortran backwards compatibility routines for FEWZ 3.1, and a fix to the C++ backwards compatibility routines for getting min and max x and Q2. 2013-08-28 Andy Buckley * Removing necessity of Cython for tarball builds. 2013-08-16 Karl Nordstrom * Adding log-Q gradient extrapolation in AlphaS_Ipol. 2013-08-16 Andy Buckley * 6.0.1 patch release. * Disabling installation of the not-to-be-used 'sets' directory. 2013-08-11 Andy Buckley * Fixing an off-by-one error in alpha_s subgrid array creation. 2013-08-08 James Ferrando * Added several backwards-compatibility updates for fortran and C++ interfaces based on 6.0.0 feedback from David Hall and Marek Schoenherr. 2013-08-07 Andy Buckley * 6.0.0 release! 2013-08-06 Andy Buckley * Various remaining build system tweaks and updating the version code to 6.0.0rc in anticipation of release! * Added the lhaglue_get_current_pdf(nset=1) function for C++ access to the currently-used PDF via LHAGlue (intended as a workaround for cases where the old LHAPDF banner was grepped to work out the PDF identities). 2013-08-05 Andy Buckley * Adding subgridded alpha_s interpolation. * Enhancing plotting and comparison scripts for alpha_s comparison. 2013-07-31 Andy Buckley * Changing the Q2Min,Max flags to QMin,Max for better readability, etc. PDF and creategrids updated. 2013-07-30 Andy Buckley * Adding a migration/cmpplotv5v6 batch script and improving the accuracy measure definition. 2013-07-29 Andy Buckley * Changing the data format to list PDF Q knot values rather than Q2, for readability. * Fixing creategrids to respect flavour thresholds and subgrids with a --subgrids flag. 2013-07-12 Andy Buckley * Version number bump and tag as 6.0.0b3. Nearly ready for stable release! * Renaming LambdaX config flags to AlphaS_LambdaX, since their use is alpha_s-specific. 2013-07-10 Andy Buckley * Adding --top flag to creategrids, for dumping the 13-flavour NNPDF grids. * Adding dumping of alpha_s values to dumpv5v6. Some apparent alpha_s ipol problems for CTEQ6L1. 2013-07-08 Andy Buckley * Adding factory methods for making AlphaS objects direct from set names / member numbers. * Adding/updating NumFlavors + FlavorScheme metadata flags and add TODOs to respect them. * Updated ipol alpha_s solver to operate in log space: smoother behaviour now. * Karl made ODE and interpolation alpha_s solvers work nicely. * Adding fallback/default-return variants of the Info get_entry and get_entry_as methods. 2013-07-05 Andy Buckley * Many improvements to the creategrids migration script. * Populating many of the for-migration PDF entries in pdfsets.index. * Changing .lha data file extension to .dat to avoid clashing with LHA archive format. 2013-07-04 Andy Buckley * Write out AlphaS_Ipol info from creategrids if possible. * Use a more accurate MZ in lhapdf.conf and creategrids. * Add handling of MinLHAPDFVersion and DataVersion flags if present. * Fix LHAPDF_VERSION_CODE to be an int rather than string. * Renaming Info::metadata() to Info::get_entry(), plus Info::get_entry_as(), etc. 2013-07-03 Andy Buckley * Adding two PDF-level Info factory functions. * Using the cached/precomputed log(x) and log(Q2) values in the log-bicubic interpolator. Looks like an immediate factor of 5 speed-up :-D * Adding log(x) and log(Q2) knot position accessors to KnotArray1F and KnotArrayNF. * Adding log(x) and log(Q2) knot position arrays to KnotArray1F. * Converting the KnotArrayNF typedef to be a fully-fledged class. 2013-06-19 Andy Buckley * 6.0.0b2 release. * TODO list updated. * Adding PDFSet.mkPDF(mem) to the Python wrapper. * Various build tweaks for lxplus6 compatibility. * Reworking the connection of AlphaS to the Factory and PDF system a bit, and tweaking the tests. 2013-06-15 Andy Buckley * Adding Config.h, the Config class, and improved singleton mechanism for getting the global configuration object. Plus some testing of the globalness and persistency of config settings in tests/testinfo.cc 2013-06-12 Andy Buckley * Mapping addition of PDFSet, more factory functions, and related changes into Python. 2013-06-11 Andy Buckley * Adding default values to PDF::xMin/Max and PDF::q2Min/Max. 2013-06-10 Andy Buckley * Bump version number for 6.0.0 beta2 (hopefully to be released soon). * Adding an availablePDFSets() function. 2013-06-09 Andy Buckley * Adding an LHAPDF_VERSION_CODE macro for version detection. * Moving contents of Config.h -> Version.h (leaving Config.h name free for potential Info subclass). * Adding PDFSet::mkPDF(int). * Renaming return-type specialisations of Info::metadata() to metadata_to(), to avoid nasty template/untemplated method resolution errors once inheritance got involved. * Removing various deprecated path constructors and general related API rehashing. * Adding Info::metadata_local(key) * Renaming config() to getConfig() and moving to Factories, to match getPDFSet(name). * Using a new info cascading system including PDFSet. * Adding singleton system for PDFSet, and a dedicated PDFInfo type for member info. 2013-06-07 Andy Buckley * Rename ImplicitFlavorAction config flag to UndefFlavorAction * More build system tweaks, including removal of yaml-cpp flags from build of example programs that link against libLHAPDF. * Moving broken -I/-L and -D flag settings from configure.ac to selected Makefile.am's * Adding PDFSet, and migrating examples/testpdfset.cc to use it. 2013-05-17 Andy Buckley * Treat a request for PID = 0 as if PID 21 (gluon) had been requested. Useful for backward compatibility, but also just for convenience since it's much easier to just loop from -6 to 6 than to have to skip 0 and add 21 as a special case. 2013-05-12 Andy Buckley * Adding x/Q2/Q min/max (virtual) functions to the PDF interface. Default implementations use metadata keys only. * Adding in-place filling functions for map and vector PDF value containers, on the PDF interface. 2013-05-11 Andy Buckley * configure.ac, src/Info.cc: Re-adding yaml-cpp 0.3.x support via version detection in the configure script. 2013-05-07 Andy Buckley * src/Info.cc: Converting the YAML reading to use the yaml-cpp v0.5.x API. * Tweaking and fixing tests and build config. 2013-04-17 Andy Buckley * Adding a PDF set usage example (uses C++11 for now, for fun!) 2013-04-11 Andy Buckley * Rename of wrapper dir from cython -> python (reflect the target, not the way of achieving it). * Python extension build env fix 2013-04-10 Andy Buckley * Improving creategrids to use xmin and qmin/max when dumping LHpdf files and to allow a manual override for LHgrid dumps. CTEQ6L1 looking *almost* publicly acceptable now. * examples/: Resurrecting old testpdf.cc as an example (used by Doxygen) * migration/: Using compatibility stuff to improve dumpv5v6.cc * Adding LHAPDF_MAJOR_VERSION macro and examples/compatibility.cc * AUTHORS list tweak since James added substantial code for Fortran compatibility. * Adding copyright etc. notices to each file header. * Adding LHAPDF.h convenience header. 2013-04-09 Andy Buckley * Fix ctypes handling in creategrids * Adding ignoring (and writing) of a 3rd grid block line, to specify "internal flavor" ID codes. Not actually parsed or used... yet. * Cleaning up LHAGlue compilation warnings * Config flag updates and clarifications, and adding API mechanisms for numMembers and LHAPDF ID lookup. 2013-04-08 Andy Buckley * Further improved creategrid, comparison, and plotting scripts. Better high-xipol knots -> much better agreement. Nearly done. 2013-04-08 James Ferrando * Fortran PDFLIB function mapping works now: good agreement with LHA5 via PYTHIA6. 2013-04-05 Andy Buckley * migration/plotv5v6 improvements with line styles and labels. * Improved/fixed migration/creategrid which excludes grid points at x=0 (which screwed up handing over to extrapolation) and fixes numpy array manipulation. Low-x behaviour is now good, high-x needs some inspection: getting close to acceptable at last! * Fixes to dumpv5v6.cc flavour ID and output filenames. 2013-04-04 Andy Buckley * Re-enabling the -Wno-long-long flag if possible, to avoid build warnings stemming from yaml-cpp. 2013-04-03 Andy Buckley * migration/: Many updates to comparison scripts, and adding a plotv5v6 script and new README instructions. * migration/: Combined dumpv5.cc and dumpv6.cc into a single dumpv5v6.cc, with the version selected by a preprocessor macro. 2013-04-02 Andy Buckley * Build system fixes... *finally* working on lxplus! :-) 2013-03-25 Andy Buckley * Re-wrangling dump, comparison, and migration scripts. * Fixing accidental shift of LHAGlue default member from 0 -> 1. The default index = 1 should only apply to the multiset index used by non-multiset functions. 2013-03-24 Andy Buckley * Removing uses of Boost range algorithms -- nice, but apparently introduces a bit too much sensitivity on Boost version for some Mac and SL systems. * Adding a NotImplementedError! * Adding main PDFLIB functions as implemented in PYTHIA6's pdfdummies.f. 2013-03-23 Andy Buckley * Adding non-multiset versions of LHAGlue.cc functions. * Use 1 rather than 0 as the lowest (and default) multi-set index in LHAGlue.cc. 2013-03-15 Andy Buckley * Using much cleverer Boost discovery macros (with a slight fix) from https://github.com/tsuna/boost.m4. Need to feed back the fix... * Adding --with-boost-lib, --with-boost-inc, and --with-yaml-cpp-lib, --with-yaml-cpp-inc configure flags, particularly for use on systems where Boost's install is a bit borked and there is no common prefix dir for which $prefix/lib and $prefix/include are valid dirs. 2013-03-05 Andy Buckley * Convert LHAGlue.cc to load the 0th member on set initialisation, plus some other tweaks (this matches the v5 behaviour _and_ makes it much harder to get into an inconsistent state). 2013-03-03 Andy Buckley * Remove -ansi from the compiler setup (the long long in some yaml-cpp versions is causing trouble, at least on Macs with gcc 4.2) 2013-03-02 Andy Buckley * Adding an example script for using the Python wrapper, and improving/fixing the mkPDF mapping. 2013-03-01 Andy Buckley * Some LHAGlue fixes and improvements. * Fixing environment variable updating for path handling. * Adding Cython docstrings and path/version functions. * Integrating the Cython extension build into the autotools build/install. * Path handling and PDF data file search error reporting fixes/improvements. * Add a fallback to use LHAPATH if LHAPDF_DATA_PATH is undefined. (pre-deprecated?) * Re-enabling Cython mapping (only the basic functionality subset). * Adding LHAPDF::version() function. * Adding configure testing for -mt versions of Boost (file)system libs. 2013-02-28 Andy Buckley * Adding name+member and LHAPDF ID constructors for Info. * Moving config() out of Info. 2013-02-27 Andy Buckley * Implemented PDF::setname() and PDF::memberid(). 2013-02-26 Andy Buckley * Adding a lhapdf-config build assistant script. * Adding hacky first implementations of log-space interpolators. Separation of x and Q2 ipol seems ever more likely. * Started work on new LaTeX manual/paper, based on previous contribution from Ben and Marek. * Cleaning up defunct wrappers directories. * Fixing a bug in handling of nearest knot lookup for underflow x/Q2 requests. 2013-02-15 Andy Buckley * Adding installation and usage instructions to the Doxy manual. 2013-02-13 Andy Buckley * Fixing install path data lookup to include the 'LHAPDF' part. * Fixed use of interpolation up to the last knot (in Q2, at least) by making KnotArray1F::x/q2below never return the last index. 2013-02-12 Andy Buckley * Now installing pdfsets.index into the share dir. * Now installing lhapdf.conf into the share dir. * Header dependence reduction and include statement clean-up. * Reworking Interpolator and GridPDF interfaces to centralise index finding. KnotArray1F and NF are now defined as non-inner classes in a separate KnotArray.h header. 2013-02-11 Andy Buckley * Adding a new implementation of NearestPointExtrapolator. 2013-02-04 Andy Buckley * Adding migration/testpdf.cc and corresponding README instructions. * Removed debug printout from GridPDF.cc and re-added xKnots() and q2Knots() methods. * Updated creategrids script to new format. * Creating the migration directory. 2013-01-29 Andy Buckley * Updates to TODOs, CONFIGFLAGS, DESIGN, etc. after first dev meeting. * More Doxygen: making the namespace and free functions documented, with grouping. 2013-01-28 Andy Buckley * Adding backward compatibility special case treatment for the "cteq6ll" misspelling from prehistory. * Adding setting of available AlphaS params in the PDF interface. * Adding search path set/append/prepend functions, using the LHAPDF_DATA_PATH env variable. * More methods, and public access to most data members on AlphaS. 2013-01-25 Andy Buckley * Adding sorting of the flavor array when reading from metadata (and use of Boost range sort) * Fixed clearing of temp double* array variable so subgrid loading now works. Interpolation across subgrid boundaries not tested! * Added two more ways to assign the grid data arrays, but the original way seems fine. Now defining the grid data x/Q2 loop order. * Fixed the AnalyticPDF example: now simpler _and_ it works :) * A bit of virtual function rethinking on PDF. 2013-01-23 Andy Buckley * Adding code to allow comments in the grid data blocks. * Some DESIGN doc cleanup. * Moving tests and their output data files into the tests/ dir. * Build system tweaks: adding --with args to configure for Boost and yaml-cpp, and a 'doxy' target. 2013-01-22 Andy Buckley * Removing defunct data and knot members from GridPDF. * Including general doc files in Doxygen output and finessing Doxygen comments. * Adding Doxyfile.in with basic Doxy config. * Adding initial CONFIGFLAGS and CODINGSTYLE doc files. * AlphaS_ODE reworking -- lots needed. 2013-01-21 Andy Buckley * Adding an empty AlphaS_Ipol and making AlphaS_Analytic work with a smooth Lambda4/5 transition. * First PDF interpolation test added to testgrid.cc. Looks like it works! * Refactoring of the bicubic interpolator. * Fixed multi_array reshaping in PDFGrid loading. * Removing PDFSet files. * Disabling PWD searching due to infinite loop in calls to paths(). 2013-01-20 Andy Buckley * More alpha_s calculator evolution, mainly file splitting and adding more data members. 2013-01-19 Andy Buckley * Making inter/extrapolator loading lazy (and neater as a consequence!) * Renaming PDFGrid -> GridPDF. 2013-01-13 Andy Buckley * Using std::auto_ptr to handle Interpolator/Extrapolator assignment to PDFGrid, and cleaning up the interface and implementation a bit. * Using boost::shared_ptr to implement the memory handling in LHAGLUE. NB. not std::auto_ptr, or boost::scoped_ptr, and although std::unique_ptr would be ideal it requires C++11. * Adding alpha_s(Q2) calculation mechanism to the PDF interface. AlphaS calculation is not yet properly implemented and tested, though, cf. grid interpolation! * Adding src/Factories.cc to hide the implementation details / dependencies for factory users. * Added Info::metadata template specialisation to handle true/false/on/off/yes/no as well as 0/1 strings. * Add src/Paths.cc to avoid circular header dependencies. * Add LHAPDF_{INSTALL,DATA}_PREFIX variables and PwdInSearchPath config flag, and use them in search path determination. 2013-01-11 Andy Buckley * Start of the AlphaS refactoring. * Metadata methods and flavour list caching added to PDF. * Renaming PDFInfo.h/.cc to just Info.h/.cc * Renaming LHAPDFConfig.h -> Config.h * DESIGN doc updates. * Factory renaming and adding factory functions for PDF construction. * PDF and PDFInfo extra constructors from LHAPDF ID code. * Moving PDFInfo YAML reading into a new PDFInfo.cc to avoid an API header dependency. * Refactoring PDF filename construction etc. to minimise code duplication. * Adding the PDFIndex.h header and index lookup functions. * Adding the start of the LHA Fortran wrapper, based on the Py8 wrapper by Steve and Martin. 2013-01-10 Andy Buckley * More PDFGrid data loading development: improvements to the API and the data parser now works. * Adding the error extrapolator to the extrapolator factory function. 2013-01-09 Andy Buckley * A few tweaks to the info/data loader system: PDF loading from set name + member ID with cascading info/set/config levels WORKS! * Adding more constructors for PDFGrid, calling the new ones on PDF to populate the Info class. * Adding the EXAMPLEPDF directory for testing. 2013-01-08 Andy Buckley * Adding example lhapdf.conf. * Inlining, clean-up and other tweaks. * Adding PDF base constructors with loading apparatus for info from member files + discovery and loading of set-level info. 2013-01-07 Andy Buckley * Adding to_str variants for both single objects and for vectors of objects which are convertible to string via lexical_cast. * Adding the YAML parser operation to the Info class (and its subclasses). * Removing Types.h in favour of split Utils.h and Exceptions.h * include/LHAPDF/Paths.h: Adding path searching machinery (using Boost.Filesystem). 2013-01-02 Andy Buckley * Adding some of the necessary infrastructure for subgrids, and rewriting the grid format parser to handle separated subgrid blocks. Boost.MultiArray being used for the internal storage in place of the dynamically allocated C arrays. Metadata methods are currently disabled for porting to the cascading Info system. 2013-01-01 Andy Buckley * Major restructuring of the API: lots of subtle problems with the first attempt, and room for improvement. Painful, but worth the reworking to get it right. Lots left to do... see the TODO and DESIGN files for the ideas and tasks. 2012-10-22 Andy Buckley * Start of autotools build system on top of initial summer student work by Martin and Steve. diff --git a/include/LHAPDF/PDF.h b/include/LHAPDF/PDF.h --- a/include/LHAPDF/PDF.h +++ b/include/LHAPDF/PDF.h @@ -1,522 +1,524 @@ // -*- C++ -*- // // This file is part of LHAPDF // Copyright (C) 2012-2019 The LHAPDF collaboration (see AUTHORS for details) // #pragma once #ifndef LHAPDF_PDF_H #define LHAPDF_PDF_H #include "LHAPDF/PDFInfo.h" #include "LHAPDF/PDFIndex.h" #include "LHAPDF/Factories.h" #include "LHAPDF/AlphaS.h" #include "LHAPDF/Utils.h" #include "LHAPDF/Paths.h" #include "LHAPDF/Exceptions.h" #include "LHAPDF/Version.h" #include "LHAPDF/Config.h" namespace LHAPDF { /// @brief PDF is the general interface for access to parton density information. /// /// The PDF interface declares the general form of all PDF types, such as Grid based or analytic. class PDF { protected: //< These constructors should only be called by subclasses /// Internal convenience typedef for the AlphaS object handle /// @todo Reinstate this unique_ptr when C++98 header compatibility is no longer an issue // typedef unique_ptr AlphaSPtr; typedef AlphaS* AlphaSPtr; /// Force initialization of the only non-class member. /// @todo Remove _alphas initialisation when it can be a smart ptr again PDF() : _alphas(0), _forcePos(0) { } public: /// Virtual destructor, to allow unfettered inheritance virtual ~PDF() { /// @todo Remove this delete when C++98 is gone, and unique_ptr can be reinstated delete _alphas; } //@} protected: /// @name Helper methods for info loading / path setting, used by derived types //@{ void _loadInfo(const std::string& mempath); void _loadInfo(const std::string& setname, int member) { const string searchpath = findpdfmempath(setname, member); if (searchpath.empty()) throw UserError("Can't find a valid PDF " + setname + "/" + to_str(member)); _loadInfo(searchpath); } void _loadInfo(int lhaid) { const pair setname_memid = lookupPDF(lhaid); if (setname_memid.second == -1) throw IndexError("Can't find a PDF with LHAPDF ID = " + to_str(lhaid)); _loadInfo(setname_memid.first, setname_memid.second); } //@} public: /// @name PDF values //@{ /// @brief Get the PDF xf(x) value at (x,q2) for the given PID. /// /// All grids are defined in Q2 rather than Q since the natural value /// in MC programs is squared, so we typically avoid an expensive sqrt() call. /// /// @param id PDG parton ID /// @param x Momentum fraction /// @param q2 Squared energy (renormalization) scale /// @return The value of xf(x,q2) double xfxQ2(int id, double x, double q2) const; /// @brief Get the PDF xf(x) value at (x,q) for the given PID. /// /// xfxQ will square the given q and return the value from xfxQ2. /// All grids are defined in q2 rather than q since the natural value /// in MC programs is squared, so we typically avoid an expensive sqrt() call. /// /// @param id PDG parton ID /// @param x Momentum fraction /// @param q Energy (renormalization) scale /// @return The value of xf(x,q2) double xfxQ(int id, double x, double q) const { return xfxQ2(id, x, q*q); } /// @brief Get the PDF xf(x) value at (x,q2) for all supported PIDs. /// /// This version fills a user-supplied map to avoid container construction /// costs on every call. /// /// @param x Momentum fraction /// @param q2 Squared energy (renormalization) scale /// @param rtn Map of PDF xf(x,q2) values, to be filled void xfxQ2(double x, double q2, std::map& rtn) const; /// @brief Get the PDF xf(x) value at (x,q) for all supported PIDs. /// /// This version fills a user-supplied map to avoid container construction /// costs on every call. /// /// @param x Momentum fraction /// @param q Energy (renormalization) scale /// @param rtn Map of PDF xf(x,q) values, to be filled void xfxQ(double x, double q, std::map& rtn) const { xfxQ2(x, q*q, rtn); } /// @brief Get the PDF xf(x) value at (x,q2) for "standard" PIDs. /// /// This version fills a user-supplied vector to avoid container /// construction costs on every call. /// /// The filled vector follows the LHAPDF5 convention, with 13 entries /// running in the PDF ID order [-6, -5, ..., -1, 21, 1, ... 5, 6], i.e. /// quark PDF values will be at vector index pid+6 and the gluon at index 6. /// /// @param x Momentum fraction /// @param q2 Squared energy (renormalization) scale /// @param rtn Vector of PDF xf(x,q2) values, to be filled void xfxQ2(double x, double q2, std::vector& rtn) const; /// @brief Get the PDF xf(x) value at (x,q) for "standard" PIDs. /// /// This version fills a user-supplied vector to avoid container /// construction costs on every call. /// /// The filled vector follows the LHAPDF5 convention, with 13 entries /// running in the PDF ID order [-6, -5, ..., -1, 21, 1, ... 5, 6], i.e. /// quark PDF values will be at vector index pid+6 and the gluon at index 6. /// /// @param x Momentum fraction /// @param q Energy (renormalization) scale /// @param rtn Vector of PDF xf(x,q) values, to be filled void xfxQ(double x, double q, std::vector& rtn) const { xfxQ2(x, q*q, rtn); } /// @brief Get the PDF xf(x) value at (x,q2) for all supported PIDs. /// /// This version creates a new map on every call: prefer to use the /// fill-in-place version with a user-supplied map for many calls. /// /// @param x Momentum fraction /// @param q2 Squared energy (renormalization) scale /// @return A map of PDF xf(x,q2) values std::map xfxQ2(double x, double q2) const; /// @brief Get the PDF xf(x) value at (x,q) for all supported PIDs. /// /// This version creates a new map on every call: prefer to use the /// fill-in-place version with a user-supplied map for many calls. /// /// xfxQ will square the given q and return the value from xfxQ2. /// All grids are defined in q2 rather than q since the natural value /// in MC programs is squared, so we typically avoid an expensive sqrt() call. /// /// @param x Momentum fraction /// @param q Energy (renormalization) scale /// @return A map of PDF xf(x,q) values std::map xfxQ(double x, double q) const { return xfxQ2(x, q*q); } protected: /// @brief Calculate the PDF xf(x) value at (x,q2) for the given PID. /// /// This is the key function to be overridden in concrete PDF types, since /// it actually does the calculation of xf(x,Q2) by analytic, interpolation, /// or other means. The user-called xfxQ2 method exists so that the physical /// range and PID checks need only be done in one place, rather than need to /// be re-implemented in each concrete implementation. /// /// @param id Parton ID in the PDG scheme /// @param x Momentum fraction /// @param q2 Squared energy (renormalization) scale /// @return the value of xf(x,q2) virtual double _xfxQ2(int id, double x, double q2) const = 0; //@} public: /// @name Ranges of validity //@{ /// Minimum valid x value for this PDF. virtual double xMin() { if (info().has_key("XMin")) return info().get_entry_as("XMin"); return numeric_limits::epsilon(); } /// Maximum valid x value for this PDF. virtual double xMax() { if (info().has_key("XMax")) return info().get_entry_as("XMax"); return 1.0; } /// Minimum valid Q value for this PDF (in GeV). /// @note This function calls sqrt(q2Min()). For better CPU efficiency and accuracy use q2Min() directly. virtual double qMin() { return info().get_entry_as("QMin", 0); } /// @brief Maximum valid Q value for this PDF (in GeV). /// @note This function calls sqrt(q2Max()). For better CPU efficiency and accuracy use q2Max() directly. virtual double qMax() { return info().get_entry_as("QMax", numeric_limits::max()); } /// Minimum valid Q2 value for this PDF (in GeV2). virtual double q2Min() { return sqr(this->qMin()); } /// Maximum valid Q2 value for this PDF (in GeV2). virtual double q2Max() { // Explicitly re-access this from the info, to avoid an overflow from squaring double_max return (info().has_key("QMax")) ? sqr(info().get_entry_as("QMax")) : numeric_limits::max(); } /// @brief Check whether PDF is set to only return positive (definite) values or not. /// /// This is to avoid overshooting in to negative values when /// interpolating/extrapolating PDFs that sharply decrease towards zero. /// 0 = unforced, 1 = forced positive, 2 = forced positive definite (>= 1e-10) int forcePositive() const { if (_forcePos < 0) //< Caching _forcePos = info().get_entry_as("ForcePositive", 0); return _forcePos; } /// @brief Check whether the given x is physically valid /// /// Returns false for x less than 0 or greater than 1, since it /// is a momentum fraction and not valid outside those values. bool inPhysicalRangeX(double x) const { return x >= 0.0 && x <= 1.0; } /// @brief Check whether the given Q2 is physically valid /// /// Returns false for Q2 less than 0 (Q must be real-valued). bool inPhysicalRangeQ2(double q2) const { return q2 >= 0.0; } /// @brief Check whether the given Q is physically valid /// /// Returns false for Q less than 0 (Q must be positive). bool inPhysicalRangeQ(double q) const { return inPhysicalRangeQ2(q*q); } /// Check whether the given (x,Q2) is physically valid bool inPhysicalRangeXQ2(double x, double q2) const { return inPhysicalRangeX(x) && inPhysicalRangeQ2(q2); } /// Check whether the given (x,Q) is physically valid bool inPhysicalRangeXQ(double x, double q) const { return inPhysicalRangeX(x) && inPhysicalRangeQ(q); } /// @brief Grid range check for Q /// /// Return true when given Q is in the coverage range of this PDF. /// It actually squares the given Q and returns value from inRangeQ2. /// /// @param q Energy scale /// @return Whether q is in range virtual bool inRangeQ(double q) const { return inRangeQ2(q*q); } /// @brief Grid range check for Q2 /// /// Return true when given Q2 is in the coverage range of this PDF. /// /// @param q2 Squared energy scale /// @return Whether q2 is in range virtual bool inRangeQ2(double q2) const = 0; /// @brief Grid range check for x /// /// Return true when given x is in the coverage range of this PDF. /// /// @param x Momentum fraction /// @return Whether x is in range virtual bool inRangeX(double x) const = 0; /// Combined range check for x and Q virtual bool inRangeXQ(double x, double q) const { return inRangeX(x) && inRangeQ(q); } /// Combined range check for x and Q2 bool inRangeXQ2(double x, double q2) const { return inRangeX(x) && inRangeQ2(q2); } //@} /// @name Generic member-level metadata (including cascaded metadata from set & config level) //@{ /// Get the info class that actually stores and handles the metadata PDFInfo& info() { return _info; } /// Get the info class that actually stores and handles the metadata (const version) const PDFInfo& info() const { return _info; } /// @brief Get the PDF set of which this is a member /// /// Obtained from the member file path, not Info-based metadata. PDFSet& set() const { return getPDFSet(_setname()); } //@} /// @name Member-level metadata //@{ /// @brief PDF member local ID number /// /// Obtained from the member file path, not Info-based metadata. int memberID() const { const string memname = file_stem(_mempath); assert(memname.length() > 5); // There must be more to the filename stem than just the _nnnn suffix const int memid = lexical_cast(memname.substr(memname.length()-4)); //< Last 4 chars should be the member number return memid; } /// @brief PDF member global LHAPDF ID number /// /// Obtained from the member ID and the set's LHAPDF ID index int lhapdfID() const; /// Description of this PDF member std::string description() const { return info().get_entry("PdfDesc", ""); } /// Version of this PDF's data file int dataversion() const { return info().get_entry_as("DataVersion", -1); } /// Get the type of PDF member that this object represents (central, error) std::string type() const { return to_lower(info().get_entry("PdfType")); } //@} /// Summary printout void print(std::ostream& os=std::cout, int verbosity=1) const; /// @name Parton content and QCD parameters //@{ /// @brief List of flavours defined by this PDF set. /// /// This list is stored locally after its initial read from the Info object /// to avoid unnecessary lookups and string decoding, since e.g. it is /// looked at by every call to the GridPDF's Interpolator and Extrapolator /// classes. /// /// @todo Make virtual for AnalyticPDF? Or allow manual setting of the Info? virtual const std::vector& flavors() const { if (_flavors.empty()) { _flavors = info().get_entry_as< vector >("Flavors"); sort(_flavors.begin(), _flavors.end()); } return _flavors; } /// Checks whether @a id is a valid parton for this PDF. bool hasFlavor(int id) const; /// @brief Order of QCD at which this PDF has been constructed /// /// "Order" is defined here and throughout LHAPDF as the maximum number of /// loops included in the matrix elements, in order to have an integer value /// for easy use in comparisons, as opposed to "LO", "NLO", etc. strings. int orderQCD() const { return info().get_entry_as("OrderQCD"); } /// @deprecated Use orderQCD instead int qcdOrder() const { return orderQCD(); } /// @brief Get a quark mass in GeV by PDG code (|PID| = 1-6 only) /// /// Convenience interface to the Mass* info keywords. /// Returns -1 for an undefined PID. double quarkMass(int id) const; /// @brief Get a flavor scale threshold in GeV by PDG code (|PID| = 1-6 only) /// Convenience interface to the Mass* and Threshold* info keywords. /// Returns -1 for an undefined PID. double quarkThreshold(int id) const; //@} /// @name QCD running coupling calculation //@{ /// @brief Set the AlphaS calculator by pointer /// /// The provided AlphaS must have been new'd, as it will not be copied /// and ownership passes to this GridPDF: delete will be called on this ptr /// when this PDF goes out of scope or another setAlphaS call is made. void setAlphaS(AlphaS* alphas) { // _alphas.reset(alphas); + if (hasAlphaS()) delete _alphas; + _alphas = alphas; } /// @brief Check if an AlphaS calculator is set bool hasAlphaS() const { return _alphas; } /// @brief Retrieve the AlphaS object for this PDF AlphaS& alphaS() { return *_alphas; } /// @brief Retrieve the AlphaS object for this PDF (const) const AlphaS& alphaS() const { return *_alphas; } /// @brief Value of alpha_s(Q2) used by this PDF /// /// Calculated numerically, analytically, or interpolated according to /// metadata, using the AlphaS classes. double alphasQ(double q) const { return alphasQ2(q*q); } /// @brief Value of alpha_s(Q2) used by this PDF /// /// Calculated numerically, analytically, or interpolated according to /// metadata, using the AlphaS classes. double alphasQ2(double q2) const { if (!hasAlphaS()) throw Exception("No AlphaS pointer has been set"); return _alphas->alphasQ2(q2); } //@} protected: void _loadAlphaS() { // _alphas.reset( mkAlphaS(info()) ); if (hasAlphaS()) delete _alphas; _alphas = mkAlphaS(info()); } /// Get the set name from the member data file path (for internal use only) std::string _setname() const { return basename(dirname(_mempath)); } /// Member data file path std::string _mempath; /// Metadata container PDFInfo _info; /// Locally cached list of supported PIDs mutable vector _flavors; /// Optionally loaded AlphaS object mutable AlphaSPtr _alphas; /// @brief Cached flag for whether to return only positive (or postive definite) PDF values /// /// A negative value indicates that the flag has not been set. 0 = no /// forcing, 1 = force positive (i.e. 0 is permitted, negative values are /// not), 2 = force positive definite (i.e. no values less than 1e-10). mutable int _forcePos; }; } #endif