From 3462d46a3ece4f40a3572133e12e007239555ca4 Mon Sep 17 00:00:00 2001 From: Klaus Rabbertz <klaus.rabbertz@cern.ch> Date: Wed, 2 Oct 2024 19:14:03 +0200 Subject: [PATCH] Table version 2.6 now; additional InfoBlock contains reference x sections; fillable via fnlo-tk-modify; readable via fnlo-tk-yodaout --- doc/tableformat/fastNLOTableFormatv26.ods | Bin 0 -> 29697 bytes v2.5/toolkit/configure.ac | 2 +- .../fastnlotoolkit/fastNLOCoeffAddBase.cc | 72 ++++---------- v2.5/toolkit/fastnlotoolkit/fastNLOReader.cc | 88 ++++++++++-------- v2.5/toolkit/fastnlotoolkit/fastNLOTools.cc | 20 ++-- .../include/fastnlotk/fastNLOConstants.h.in | 4 +- .../include/fastnlotk/fastNLOTools.h | 6 +- v2.5/toolkit/src/fnlo-tk-modify.cc | 83 ++++++----------- v2.5/toolkit/src/fnlo-tk-rootout.cc | 4 +- v2.5/toolkit/src/fnlo-tk-yodaout.cc | 8 +- 10 files changed, 120 insertions(+), 167 deletions(-) create mode 100644 doc/tableformat/fastNLOTableFormatv26.ods diff --git a/doc/tableformat/fastNLOTableFormatv26.ods b/doc/tableformat/fastNLOTableFormatv26.ods new file mode 100644 index 0000000000000000000000000000000000000000..952fd1dc6a1c61300cebc9d697e8cdfcb6f374bd GIT binary patch literal 29697 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 JwEN@g{{Wj|asmJV literal 0 HcmV?d00001 diff --git a/v2.5/toolkit/configure.ac b/v2.5/toolkit/configure.ac index 70994eba..82493541 100644 --- a/v2.5/toolkit/configure.ac +++ b/v2.5/toolkit/configure.ac @@ -10,7 +10,7 @@ # Require minimal autoconf version, 2.71 is from 2021 AC_PREREQ([2.71]) # Define subproject fastNLO_toolkit -AC_INIT([fastNLO_toolkit],[2.5.1],[Daniel.Britzger@desy.de, Klaus.Rabbertz@kit.edu, Georg Sieber, Fred Stober, wobisch@latech.edu]) +AC_INIT([fastNLO_toolkit],[2.6.0],[Daniel.Britzger@desy.de, Klaus.Rabbertz@kit.edu, Georg Sieber, Fred Stober, wobisch@latech.edu]) #Suppress verbose output when compiling (use make V=99 for verbose output) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) # Properly include subprojects diff --git a/v2.5/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc b/v2.5/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc index e5830e1a..dfa4f3f1 100644 --- a/v2.5/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc +++ b/v2.5/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc @@ -70,41 +70,23 @@ void fastNLOCoeffAddBase::ReadCoeffAddBase(istream& table, int ITabVersionRead){ debug["ReadCoeffAddBase::ReadCoeffAddBase"]<<"Start reading coefficients for table version "<<ITabVersionRead<<endl; CheckCoeffConstants(this); char buffer[5257]; - // string stest; - // if ( fVersionRead>=24000 ) table >> stest; //"fastNLO_CoeffAddBase" - // if ( fVersionRead>=24000 ) fastNLOTools::ReadUnused(table); table >> IRef; table >> IScaleDep; - // if ( fVersionRead >= 24000 ) { - // table >> Nevt; - // table >> fWgt.WgtNevt; - // table >> fWgt.NumTable; - // table >> fWgt.WgtNumEv; - // table >> fWgt.WgtSumW2; - // table >> fWgt.SigSumW2; - // table >> fWgt.SigSum; - // fastNLOTools::ReadFlexibleVector ( fWgt.WgtObsSumW2, table ); - // fastNLOTools::ReadFlexibleVector ( fWgt.SigObsSumW2, table ); - // fastNLOTools::ReadFlexibleVector ( fWgt.SigObsSum, table ); - // fastNLOTools::ReadFlexibleVector ( fWgt.WgtObsNumEv, table ); - // } - // else { + table >> Nevt; + double readNevt = Nevt; + if ( Nevt <= 0 ) { // v2300 table >> Nevt; - double readNevt = Nevt; - if ( Nevt <= 0 ) { // v2300 - table >> Nevt; - table >> fWgt.WgtNevt; - if ( readNevt<=-2 ) table >> fWgt.NumTable; - table >> fWgt.WgtNumEv; - table >> fWgt.WgtSumW2; - table >> fWgt.SigSumW2; - table >> fWgt.SigSum; - fastNLOTools::ReadFlexibleVector ( fWgt.WgtObsSumW2, table ); - fastNLOTools::ReadFlexibleVector ( fWgt.SigObsSumW2, table ); - fastNLOTools::ReadFlexibleVector ( fWgt.SigObsSum, table ); - fastNLOTools::ReadFlexibleVector ( fWgt.WgtObsNumEv, table ); - } - // } + table >> fWgt.WgtNevt; + if ( readNevt<=-2 ) table >> fWgt.NumTable; + table >> fWgt.WgtNumEv; + table >> fWgt.WgtSumW2; + table >> fWgt.SigSumW2; + table >> fWgt.SigSum; + fastNLOTools::ReadFlexibleVector ( fWgt.WgtObsSumW2, table ); + fastNLOTools::ReadFlexibleVector ( fWgt.SigObsSumW2, table ); + fastNLOTools::ReadFlexibleVector ( fWgt.SigObsSum, table ); + fastNLOTools::ReadFlexibleVector ( fWgt.WgtObsNumEv, table ); + } table >> Npow; int NPDF; table >> NPDF; @@ -229,9 +211,6 @@ void fastNLOCoeffAddBase::ReadCoeffAddBase(istream& table, int ITabVersionRead){ // StripWhitespace(ScaleDescript[i][j]); } } - - // if ( fVersionRead>=24000 ) fastNLOTools::ReadUnused(table); - // if ( fVersionRead>=24000 ) fastNLOTools::ReadUnused(table); } @@ -240,11 +219,9 @@ void fastNLOCoeffAddBase::Write(ostream& table, int itabversion) { debug["Write"]<<"Calling fastNLOCoeffBase::Write()"<<endl; fastNLOCoeffBase::Write(table,itabversion); CheckCoeffConstants(this); - // if ( itabversion >= 24000 ) table << "fastNLO_CoeffAddBase" << sep; - // if ( itabversion >= 24000 ) table << 0 << sep; // v2.4, but yet unused table << IRef << sep; table << IScaleDep << sep; - if ( itabversion==23000 || itabversion==23500 || itabversion==23600 || itabversion==25000 ) { // detailed storage of weights + if ( itabversion==23000 || itabversion==23500 || itabversion==23600 || itabversion==25000 || itabversion==26000) { // detailed storage of weights if ( itabversion==23000 || itabversion==23500 ) table << -1 << sep; // -1: read the values below else table << -2 << sep; // -1: read the values below table << Nevt << sep; @@ -258,21 +235,7 @@ void fastNLOCoeffAddBase::Write(ostream& table, int itabversion) { fastNLOTools::WriteFlexibleVector ( fWgt.SigObsSumW2, table ); fastNLOTools::WriteFlexibleVector ( fWgt.SigObsSum, table ); fastNLOTools::WriteFlexibleVector ( fWgt.WgtObsNumEv, table ); - } - // else if ( itabversion>=24000 ) { // detailed storage of weights - // table << Nevt << sep; - // table << fWgt.WgtNevt << sep; - // table << fWgt.NumTable << sep; - // table << fWgt.WgtNumEv << sep; - // table << fWgt.WgtSumW2 << sep; - // table << fWgt.SigSumW2 << sep; - // table << fWgt.SigSum << sep; - // fastNLOTools::WriteFlexibleVector ( fWgt.WgtObsSumW2, table ); - // fastNLOTools::WriteFlexibleVector ( fWgt.SigObsSumW2, table ); - // fastNLOTools::WriteFlexibleVector ( fWgt.SigObsSum, table ); - // fastNLOTools::WriteFlexibleVector ( fWgt.WgtObsNumEv, table ); - // } - else { + } else { table << Nevt << sep; } table << Npow << sep; @@ -360,9 +323,6 @@ void fastNLOCoeffAddBase::Write(ostream& table, int itabversion) { table << ScaleDescript[i][j] << sep; } } - // if ( itabversion>=24000 ) table << 0 << sep; // v2.4, but yet unused - // if ( itabversion>=24000 ) table << 0 << sep; // v2.4, but yet unused - } diff --git a/v2.5/toolkit/fastnlotoolkit/fastNLOReader.cc b/v2.5/toolkit/fastnlotoolkit/fastNLOReader.cc index 0adbe39b..d80cbc9d 100644 --- a/v2.5/toolkit/fastnlotoolkit/fastNLOReader.cc +++ b/v2.5/toolkit/fastnlotoolkit/fastNLOReader.cc @@ -434,7 +434,7 @@ #include "fastnlotk/fastNLOTools.h" #include "fastnlotk/fastNLOCoeffAddFix.h" #include "fastnlotk/fastNLOCoeffAddFlex.h" -//#include "fastnlotk/fastNLOLHAPDF.h" +#include "fastnlotk/fastNLOLHAPDF.h" #ifdef WITH_HOPPET #include "fastnlotk/HoppetInterface.h" #endif @@ -1248,18 +1248,12 @@ void fastNLOReader::CalcReferenceCrossSection() { void fastNLOReader::CalcRefCrossSection() { //! //! Initialize the internal arrays for the reference cross - //! sections from the InfoBlocks of the fastNLO file (v2.7 upwards) + //! sections from the InfoBlocks of the fastNLO file (v2.6 upwards) //! logger.debug["CalcRefCrossSection"]<<"Starting CalcRefCrossSection ..."<<endl; XSectionRef.clear(); XSectionRef.resize(NObsBin); - XSectionRefMixed.clear(); - XSectionRef_s1.clear(); - XSectionRef_s2.clear(); - XSectionRefMixed.resize(NObsBin); - XSectionRef_s1.resize(NObsBin); - XSectionRef_s2.resize(NObsBin); if (!GetIsFlexibleScaleTable()) { fastNLOCoeffAddBase* Coeff_LO_Ref = GetReferenceTable(kLeading); @@ -3624,36 +3618,57 @@ XsUncertainty fastNLOReader::GetXsUncertainty(const ENumUncertaintyStyle eNumUnc // XsUncertainty XsUnc; vector < double > MyXSection; + vector < double > MyRefXSection; vector < double > MydXSection; unsigned int NObsBin = GetNObsBin(); - //! For approximation bias get reference PDF & member and cross section - std::vector < std::string > dCIBDescr; - std::vector < double > dCIBCont; - std::string PDFset; - std::string PDFmember; + //! For interpolation bias get reference PDF & member and values if (eNumUnc == kApproxBias) { + std::vector < std::string > dCIBDescr; + std::string PDFset; + std::string PDFmem; + std::vector < double > dCIBCont; + //! Loop over contributions and evaluate InfoBlocks with reference values for (unsigned int i=0; i<fCoeff.size() ; i++) { fastNLOCoeffBase* c = GetCoeffTable(i); - if ( ! c->HasCoeffInfoBlock(1) ) { - logger.error["GetNumUncertainty"]<<"ERROR! No InfoBlock found for reference cross sections, exiting."<<endl; - exit(35); - } - cout << "EEEEE i = " << i << ", Has 0, 1 (0,1), (1,0) = " << c->HasCoeffInfoBlock(0) << c->HasCoeffInfoBlock(1) << c->HasCoeffInfoBlock(0,1) << c->HasCoeffInfoBlock(1,0) << endl; - int iCIBIndex = c->GetCoeffInfoBlockIndex(1); - logger.debug["GetNumUncertainty"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with reference cross sections."<<endl; - dCIBDescr = c->GetCoeffInfoBlockDescription(iCIBIndex); - dCIBCont = c->GetCoeffInfoBlockContent(iCIBIndex); - } - if ( dCIBDescr.size() < 3 ) { - logger.error["GetNumUncertainty"]<<"ERROR! InfoBlock description too short for reference cross sections, exiting."<<endl; - logger.error["GetNumUncertainty"]<<" Line two and three should contain the used PDF set and member."<<endl; - exit(36); - } else { - PDFset = dCIBDescr[1]; - PDFmember = dCIBDescr[2]; + logger.debug["GetNumUncertainty"]<<"Check whether contribution " << i << " is enabled, " << c->IsEnabled() << ", and additive (0), " << c->GetIAddMultFlag() << endl; + if ( c->IsEnabled() && c->GetIAddMultFlag() == 0 ) { + logger.info["GetNumUncertainty"]<<"Checking contribution " << i << " for reference values in InfoBlock." << endl; + if ( ! c->HasCoeffInfoBlock(1) ) { + logger.error["GetNumUncertainty"]<<"ERROR! No InfoBlock found for reference values, exiting."<<endl; + exit(35); + } + int iCIBIndex = c->GetCoeffInfoBlockIndex(1); + logger.debug["GetNumUncertainty"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with reference cross sections."<<endl; + dCIBDescr = c->GetCoeffInfoBlockDescription(iCIBIndex); + dCIBCont = c->GetCoeffInfoBlockContent(iCIBIndex); + if ( dCIBDescr.size() < 3 ) { + logger.error["GetNumUncertainty"]<<"ERROR! InfoBlock description too short for reference cross sections, exiting."<<endl; + logger.error["GetNumUncertainty"]<<" Line two and three should contain the used PDF set and member."<<endl; + exit(36); + } else { + PDFset = dCIBDescr[1]; + PDFmem = dCIBDescr[2]; + } + if ( MyRefXSection.size() == 0 ) { + MyRefXSection = dCIBCont; + } else { + if ( MyRefXSection.size() != dCIBCont.size() ) { + logger.error["GetNumUncertainty"]<<"ERROR! Unequal number of reference values in contributions, exiting."<<endl; + exit(39); + } + for (unsigned int j=0; j<MyRefXSection.size(); j++ ) { + MyRefXSection[j] += dCIBCont[j]; + } + } + } + } + if ( PDFset.empty() || PDFmem.empty() ) { // Corresponds to values from last active contribution + logger.error["GetNumUncertainty"]<<"ERROR! PDF set and/or PDF member used for reference values not found, aborted!" << endl; + exit(37); } - cout << "PDF set: " << PDFset << ", PDF member = " << PDFmember << endl; + logger.warn["GetNumUncertainty"]<<"The reference calculation used member " << PDFmem << " from PDF set " << PDFset << "." << endl; + logger.warn["GetNumUncertainty"]<<"To test the interpolation quality exactly the same PDF set and member must be used!" << endl; } //! Cross section and absolute uncertainties @@ -3680,9 +3695,8 @@ XsUncertainty fastNLOReader::GetXsUncertainty(const ENumUncertaintyStyle eNumUnc logger.info["GetNumUncertainty"]<<"Interpolation bias selected."<<endl; for (unsigned int iobs = 0; iobs < NObsBin; iobs++) { XsUnc.xs.push_back(MyXSection[iobs]); - XsUnc.dxsu.push_back(dCIBCont[iobs]); - XsUnc.dxsl.push_back(MyXSection[iobs]-dCIBCont[iobs]); - cout << "XXX XS = " << MyXSection[iobs] << ", XSREF = " << dCIBCont[iobs] << ", delta = " << MyXSection[iobs]-dCIBCont[iobs] << endl; + XsUnc.dxsu.push_back(MyXSection[iobs]-MyRefXSection[iobs]); + XsUnc.dxsl.push_back(MyRefXSection[iobs]); } } else { logger.error["GetNumUncertainty"]<<"ERROR! No valid numerical uncertainty style selected, exiting."<<endl; @@ -3693,10 +3707,10 @@ XsUncertainty fastNLOReader::GetXsUncertainty(const ENumUncertaintyStyle eNumUnc //! Divide by cross section != 0 to give relative uncertainties for (unsigned int iobs = 0; iobs < NObsBin; iobs++) { if (eNumUnc == kApproxBias) { - if (fabs(dCIBCont[iobs]) > DBL_MIN) { - XsUnc.dxsl[iobs] = XsUnc.dxsl[iobs] / fabs(dCIBCont[iobs]); + if (fabs(MyRefXSection[iobs]) > DBL_MIN) { + XsUnc.dxsu[iobs] = XsUnc.dxsu[iobs] / fabs(MyRefXSection[iobs]); } else { - XsUnc.dxsl[iobs] = 0.; + XsUnc.dxsu[iobs] = 0.; } } else { if (fabs(XsUnc.xs[iobs]) > DBL_MIN) { diff --git a/v2.5/toolkit/fastnlotoolkit/fastNLOTools.cc b/v2.5/toolkit/fastnlotoolkit/fastNLOTools.cc index 07a7f16d..418b4488 100644 --- a/v2.5/toolkit/fastnlotoolkit/fastNLOTools.cc +++ b/v2.5/toolkit/fastnlotoolkit/fastNLOTools.cc @@ -621,21 +621,21 @@ namespace fastNLOTools { //______________________________________________________________________________ - void PrintXSUncertainty(XsUncertainty XsUnc, string UncName) { + void PrintXSUncertainty(XsUncertainty XsUnc, string UncName, string HeadLine) { // // Print evaluated cross section and relative uncertainty stored in // struct XsUncertainty of fastNLOReader.h // if ( XsUnc.xs.size() ) { - cout << _CSEPSC << endl; + cout << _CSEPSC << endl; cout << " # fastNLOReader: Evaluating uncertainties" << endl; - cout << _CSEPSC << endl; - cout << _DSEPSC << endl; - cout << UncName << endl; - cout << _SSEPSC << endl; - cout << " # bin cross_section lower_uncertainty upper_uncertainty" << endl; - cout << _TSEPSC << endl; + cout << _CSEPSC << endl; + cout << _DSEPSC << endl; + cout << UncName << endl; + cout << _SSEPSC << endl; + cout << HeadLine << endl; + cout << _TSEPSC << endl; for ( unsigned int iobs=0;iobs<XsUnc.xs.size();iobs++ ) { printf("%5.i %#18.11E %#18.11E %#18.11E\n",iobs+1,XsUnc.xs[iobs],XsUnc.dxsl[iobs],XsUnc.dxsu[iobs]); } @@ -645,7 +645,7 @@ namespace fastNLOTools { //______________________________________________________________________________ - void PrintXSUncertaintyVec(std::vector< std::vector<double> > xsUncVec, string UncName) { + void PrintXSUncertaintyVec(std::vector< std::vector<double> > xsUncVec, string UncName, string HeadLine) { // // Print evaluated cross section and relative uncertainty stored in // Tri-vector XsUncertaintyVec of fastNLOReader.h @@ -654,7 +654,7 @@ namespace fastNLOTools { xsUnc.xs = xsUncVec[0]; xsUnc.dxsu = xsUncVec[1]; xsUnc.dxsl = xsUncVec[2]; - PrintXSUncertainty(xsUnc, UncName); + PrintXSUncertainty(xsUnc, UncName, HeadLine); } } // end namespace fastNLO diff --git a/v2.5/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOConstants.h.in b/v2.5/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOConstants.h.in index 4a3496a2..5a1a9bea 100644 --- a/v2.5/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOConstants.h.in +++ b/v2.5/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOConstants.h.in @@ -52,8 +52,8 @@ namespace fastNLO { typedef std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<double > > > > > > > v7d; // ---- constants ---- // - static const std::set<int> CompatibleVersions{20000,21000,22000,23000,23500,23600,25000}; - const int tabversion = 23600; + static const std::set<int> CompatibleVersions{20000,21000,22000,23000,23500,23600,25000,26000}; + const int tabversion = 26000; const int tablemagicno = 1234567890; // separating character between entries in table const char sep[] = "\n"; diff --git a/v2.5/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h b/v2.5/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h index be0fc137..b66340e4 100644 --- a/v2.5/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h +++ b/v2.5/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h @@ -74,8 +74,10 @@ namespace fastNLOTools { template<typename T> void PrintVector( const std::vector<T>& v, std::string name, std::string prefix=""); //! - Printout of x section with uncertainty - void PrintXSUncertainty(XsUncertainty XsUnc, std::string UncName); - void PrintXSUncertaintyVec(std::vector< std::vector<double> > XsUncVec, std::string UncName); + void PrintXSUncertainty(XsUncertainty XsUnc, std::string UncName, + std::string HeadLine = " # bin cross_section lower_uncertainty upper_uncertainty"); + void PrintXSUncertaintyVec(std::vector< std::vector<double> > XsUncVec, std::string UncName, + std::string HeadLine = " # bin cross_section lower_uncertainty upper_uncertainty"); //! - useful i/o void PrintFastnloVersion(); //!< Print out fastNLO version diff --git a/v2.5/toolkit/src/fnlo-tk-modify.cc b/v2.5/toolkit/src/fnlo-tk-modify.cc index e20c56a4..ee6fff1c 100644 --- a/v2.5/toolkit/src/fnlo-tk-modify.cc +++ b/v2.5/toolkit/src/fnlo-tk-modify.cc @@ -205,14 +205,14 @@ int main(int argc, char** argv) { table.SetIpublunits(INT(Ipublunits)); } - if ( !STRING_ARR(ScDescript).empty() ){ + if ( EXIST(ScDescript) && !STRING_ARR(ScDescript).empty() ){ vector <string> ScDescr = table.GetScDescr(); size_t NScSize = ScDescr.size(); info["fnlo-tk-modify"]<<"Modifying existing scenario description:" << endl; for ( size_t i = 0; i < NScSize; i++ ) { shout << "Line no. " << i << ": " << ScDescr[i] << endl; } - if ( BOOL(AttachScDescription) ){ + if ( EXIST(AttachScDescription) && BOOL(AttachScDescription) ){ info["fnlo-tk-modify"]<<"Attaching to scenario description:" << endl; size_t NewNScSize = NScSize + STRING_ARR(ScDescript).size(); ScDescr.resize(NewNScSize); @@ -242,7 +242,7 @@ int main(int argc, char** argv) { table.SetLoOrder(INT(ILOord)); } - if ( !STRING_ARR(DimLabels).empty() ){ + if ( EXIST(DimLabels) && !STRING_ARR(DimLabels).empty() ){ unsigned int ndim = table.GetNumDiffBin(); if ( ndim != STRING_ARR(DimLabels).size() ) { error["fnlo-tk-modify"]<<"You need the same number of dimension labels than bin dimensions in the table, ndim = " << ndim << ". Aborted!" << endl; @@ -347,8 +347,7 @@ int main(int argc, char** argv) { } } - //! Add InfoBlocks with additional information from steering file - cout << "AAAAAAAAAA" << endl; + //! Add InfoBlocks //! Default description line std::string Default = "Please provide description!"; //! Default key @@ -368,54 +367,31 @@ int main(int argc, char** argv) { std::string KeyFiles = Key + "Files"; std::string KeyColumns = Key + "Columns"; std::string KeyFacs = Key + "Facs"; - cout << "AAAAAAAAAA: Key = " << Key << endl; if ( !read_steer::getexist(KeyFlag1) || !read_steer::getexist(KeyFlag2) ){ info["fnlo-tk-modify"]<<"No InfoBlock information found for key " << Key << " Skipped."<<endl; continue; } - // For adding a single value, array or table, the shorthand notations are respectively: - // ADD(K,Y); - // ADDARRAY(K,Y); - // ADDTABLE(K,H,Y); - // For instance to add a value "76" for the key "age" - // ADD("age",76); - // The full notation woule be: - // read_steer::Steering()->AddLabel("age",76); - // To access the arrays use e.g.: - // static vector<string> musicians = read_steer::getstringarray("FamousMusicians"); - // static vector<double> nums = read_steer::getdoublearray("Array1"); - // static vector<int> ints = read_steer::getintarray("Array1"); - // or equivalently - // static vector<string> musicians = STRING_ARR(FamousMusicians); - // static vector<double> nums = DOUBLE_ARR(Array1); - // static vector<int> ints = INT_ARR(Array1); - // - // read_steer::addvalue(KeyFlag1,7); - // read_steer::addvalue(KeyFlag2,13); - // read_steer::printall(); - // if ( read_steer::getexist(KeyFlag1) ) { - // int ikey = read_steer::getint(KeyFlag1); - // cout << "AAAAAAAAAA1: exists = " << ikey << endl; - // } else { - // cout << "Aetsch1" << endl; - // } - // if ( read_steer::getexist(KeyFlag2) ) { - // int ikey = read_steer::getint(KeyFlag2); - // cout << "AAAAAAAAAA2: exists = " << ikey << endl; - // } else { - // cout << "Aetsch2" << endl; - // } - // // - + //! Add InfoBlocks with additional information from steering file if ( read_steer::getexist(KeyValuesLO) ) { - cout << "BBBBBBBBBB" << endl; if ( !INT_ARR(RemoveBins).empty() ) { info["fnlo-tk-modify"]<<"Do NOT erase bins while adding InfoBlocks or vice versa! Aborted."<<endl; exit(25); } else { info["fnlo-tk-modify"]<<"Adding InfoBlocks to contributions."<<endl; } - unsigned int NDescr = read_steer::getstringarray(KeyDescr).size(); + unsigned int NDescr = read_steer::getstringarray(KeyDescr).size(); + unsigned int NValsLO = read_steer::getdoublearray(KeyValuesLO).size(); + unsigned int NValsNLO = read_steer::getdoublearray(KeyValuesNLO).size(); + unsigned int NValsNNLO = read_steer::getdoublearray(KeyValuesNNLO).size(); + unsigned int NFacs = read_steer::getdoublearray(KeyFacs).size(); + double relfac = 1.; + if ( NFacs == 0 ) { + } else if ( NFacs == 1 ) { + relfac = read_steer::getdoublearray(KeyFacs)[0]; + } else { + error["fnlo-tk-modify"]<<"Only one multiplicative factor allowed, but found more. Aborted! NFacs = " << NFacs <<endl; + exit(39); + } std::vector<std::string> Description; if ( NDescr > 0 ) { for ( unsigned int j = 0; j < NDescr; j++ ) { @@ -424,9 +400,12 @@ int main(int argc, char** argv) { } else { Description.push_back(Default); } - static vector<double> cont_LO = read_steer::getdoublecolumn(KeyValuesLO,"A"); - static vector<double> cont_NLO = read_steer::getdoublecolumn(KeyValuesNLO,"A"); - static vector<double> cont_NNLO = read_steer::getdoublecolumn(KeyValuesNNLO,"A"); + vector<double> cont_LO = read_steer::getdoublearray(KeyValuesLO); + vector<double> cont_NLO = read_steer::getdoublearray(KeyValuesNLO); + vector<double> cont_NNLO = read_steer::getdoublearray(KeyValuesNNLO); + for ( unsigned int i = 0; i < NValsLO; i++ ) cont_LO[i] = relfac*cont_LO[i]; + for ( unsigned int i = 0; i < NValsNLO; i++ ) cont_NLO[i] = relfac*cont_NLO[i]; + for ( unsigned int i = 0; i < NValsNNLO; i++ ) cont_NNLO[i] = relfac*cont_NNLO[i]; int Ncontrib = table.GetNcontrib(); int ic = 0; for ( int i = 0; i < Ncontrib; i++ ) { @@ -434,7 +413,7 @@ int main(int argc, char** argv) { if ( fastNLOCoeffAddBase::CheckCoeffConstants(c,true) ) { int iFlag1 = read_steer::getint(KeyFlag1); int iFlag2 = read_steer::getint(KeyFlag2); - if ( c->IsLO() ) { + if ( c->IsLO() && NValsLO > 0 ) { info["fnlo-tk-modify"]<<"Found LO contribution " << i << endl; if ( cont_LO.size() == 0 ) { warn["fnlo-tk-modify"]<<"Found LO contribution, but no additional values! Nothing added." << endl; @@ -446,9 +425,8 @@ int main(int argc, char** argv) { c->AddCoeffInfoBlock(iFlag1,iFlag2,Description,cont_LO); } ic += 1; - } else if ( c->IsNLO() ) { + } else if ( c->IsNLO() && NValsNLO > 0) { info["fnlo-tk-modify"]<<"Found NLO contribution " << i << endl; - std::vector <std:: string> Description; if ( cont_NLO.size() == 0 ) { warn["fnlo-tk-modify"]<<"Found NLO contribution, but no additional values! Nothing added." << endl; } else if ( cont_NLO.size() != nobs ) { @@ -459,9 +437,8 @@ int main(int argc, char** argv) { c->AddCoeffInfoBlock(iFlag1,iFlag2,Description,cont_NLO); } ic += 1; - } else if ( c->IsNNLO() ) { + } else if ( c->IsNNLO() && NValsNNLO > 0) { info["fnlo-tk-modify"]<<"Found NNLO contribution " << i << endl; - std::vector <std:: string> Description; if ( cont_NNLO.size() == 0 ) { warn["fnlo-tk-modify"]<<"Found NNLO contribution, but no additional values! Nothing added." << endl; } else if ( cont_NNLO.size() != nobs ) { @@ -480,7 +457,7 @@ int main(int argc, char** argv) { } } - //! Add InfoBlocks with statistical uncertainty from file (NNLOJET .dat, fnlo-tk-statunc .log, or .txt) + //! Add InfoBlocks with additonal information from file (NNLOJET .dat, fnlo-tk-statunc .log, or .txt) else if ( !read_steer::getstringarray(KeyFiles).empty() && !read_steer::getstringarray(KeyOrders).empty() ) { if ( !INT_ARR(RemoveBins).empty() ) { @@ -489,12 +466,11 @@ int main(int argc, char** argv) { } else { info["fnlo-tk-modify"]<<"Adding InfoBlocks to contributions."<<endl; } - cout << "CCCCCCCCCC" << endl; unsigned int NDescr = read_steer::getstringarray(KeyDescr).size(); unsigned int NOrders = read_steer::getstringarray(KeyOrders).size(); unsigned int NFiles = read_steer::getstringarray(KeyFiles).size(); unsigned int NCols = read_steer::getintarray(KeyColumns).size(); - unsigned int NFacs = read_steer::getintarray(KeyFacs).size(); + unsigned int NFacs = read_steer::getdoublearray(KeyFacs).size(); if ( NFiles != NOrders ) { error["fnlo-tk-modify"]<<"Need one order specification per file, aborted! Found NFiles = " << NFiles << ", and NOrders = " << NOrders <<endl; exit(37); @@ -511,7 +487,6 @@ int main(int argc, char** argv) { error["fnlo-tk-modify"]<<"Up to two column numbers allowed, but found more. Aborted! NCols = " << NCols <<endl; exit(38); } - cout << "ZZZZZZZZZZZ icola, icolb = " << icola << ", " << icolb << endl; double relfac = 1.; if ( NFacs == 0 ) { } else if ( NFacs == 1 ) { diff --git a/v2.5/toolkit/src/fnlo-tk-rootout.cc b/v2.5/toolkit/src/fnlo-tk-rootout.cc index fd19705b..17b2388b 100644 --- a/v2.5/toolkit/src/fnlo-tk-rootout.cc +++ b/v2.5/toolkit/src/fnlo-tk-rootout.cc @@ -108,7 +108,7 @@ int main(int argc, char** argv) { infosep << _SSEPSC << endl; infosep << " #" << endl; info["fnlo-tk-rootout"] << "This program evaluates a fastNLO table and" << endl; - info["fnlo-tk-rootout"] << "prints out cross sections with statistical (if available), " << endl; + info["fnlo-tk-rootout"] << "prints out cross sections with numerical (if available), " << endl; info["fnlo-tk-rootout"] << "scale, or PDF uncertainties in ROOT format." << endl; info["fnlo-tk-rootout"] << "" << endl; info["fnlo-tk-rootout"] << "TODO: Provide more info on ROOT histogram numbering/labelling ..." << endl; @@ -360,7 +360,7 @@ int main(int argc, char** argv) { if ( fnlo->IsNorm() ) { lNorm = true; } else { - error["fnlo-read"] << "Normalization requested but not defined for this table, aborted!" << endl; + error["fnlo-tk-rootout"] << "Normalization requested but not defined for this table, aborted!" << endl; exit(1); } } diff --git a/v2.5/toolkit/src/fnlo-tk-yodaout.cc b/v2.5/toolkit/src/fnlo-tk-yodaout.cc index cf0340c0..23b6d571 100644 --- a/v2.5/toolkit/src/fnlo-tk-yodaout.cc +++ b/v2.5/toolkit/src/fnlo-tk-yodaout.cc @@ -100,7 +100,7 @@ int main(int argc, char** argv) { infosep << _SSEPSC << endl; infosep << " #" << endl; info["fnlo-tk-yodaout"] << "This program evaluates a fastNLO table and" << endl; - info["fnlo-tk-yodaout"] << "prints out cross sections with statistical (if available), " << endl; + info["fnlo-tk-yodaout"] << "prints out cross sections with numerical (if available), " << endl; info["fnlo-tk-yodaout"] << "scale, or PDF uncertainties in YODA format for use with Rivet." << endl; info["fnlo-tk-yodaout"] << "For this to work, the scenario description must contain" << endl; info["fnlo-tk-yodaout"] << "the Rivet ID in the form 'RIVET_ID=EXP_YYYY_INSPIREID/Dii-xjj-ykk'," << endl; @@ -503,6 +503,7 @@ int main(int argc, char** argv) { XsUncertainty XsUnc; string LineName; string UncName; + string HeadLine = " # bin cross_section lower_uncertainty upper_uncertainty"; if ( chunc == "2P" || chunc == "6P" || chunc == "30") { XsUnc = fnlo->GetXsUncertainty(eScaleUnc, lNorm, sclfac); UncName = " # Relative scale uncertainties"; @@ -517,8 +518,9 @@ int main(int argc, char** argv) { LineName += "_dxst"; } else if ( chunc == "AB" ) { XsUnc = fnlo->GetXsUncertainty(eNumUnc, lNorm); - UncName = " # Relative approximation bias"; + UncName = " # Relative interpolation bias"; LineName += "_dxab"; + HeadLine = " # bin cross_section reference_value relative_deviation"; } else if ( chunc != "none" ) { XsUnc = fnlo->GetXsUncertainty(ePDFUnc, lNorm); UncName = " # Relative PDF uncertainties"; @@ -529,7 +531,7 @@ int main(int argc, char** argv) { LineName += "_dxnone"; } UncName = UncName + " (" + chunc + " " + PDFFile + " " + sOrder + ")"; - fastNLOTools::PrintXSUncertainty(XsUnc, UncName); + fastNLOTools::PrintXSUncertainty(XsUnc, UncName, HeadLine); //! --- Get RivetID //! For 2+-dimensions determine running number in Rivet plot name by spotting the capital letter in "RIVET_ID=" in the fnlo table -- GitLab