From 7786cd39a97788ed8c298e3904684573602dc670 Mon Sep 17 00:00:00 2001 From: Klaus Rabbertz <klaus.rabbertz@cern.ch> Date: Tue, 18 May 2021 11:01:45 +0200 Subject: [PATCH] Working version of writing & reading InfoBlocks with stat./numerical uncertainty --- doc/tableformat/fastNLOTableFormatv25.ods | Bin 0 -> 25543 bytes v2.3/toolkit/AUTHORS | 11 +- v2.3/toolkit/configure.ac | 8 +- v2.3/toolkit/data/modify/SteerModify.str | 49 ++- .../fastnlotoolkit/fastNLOCoeffAddBase.cc | 82 +++-- .../fastnlotoolkit/fastNLOCoeffAddFix.cc | 8 +- .../fastnlotoolkit/fastNLOCoeffAddFlex.cc | 8 +- .../fastnlotoolkit/fastNLOCoeffBase.cc | 115 +++++-- v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc | 33 +- v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc | 12 +- v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc | 44 ++- .../include/fastnlotk/fastNLOCoeffAddBase.h | 4 +- .../include/fastnlotk/fastNLOCoeffAddFix.h | 4 +- .../include/fastnlotk/fastNLOCoeffAddFlex.h | 4 +- .../include/fastnlotk/fastNLOCoeffBase.h | 14 +- .../include/fastnlotk/fastNLOTable.h | 2 +- .../include/fastnlotk/fastNLOTools.h | 2 + .../include/fastnlotk/speaker.h | 22 +- v2.3/toolkit/src/fnlo-tk-append.cc | 2 +- v2.3/toolkit/src/fnlo-tk-cat.cc | 2 +- v2.3/toolkit/src/fnlo-tk-cppread.cc | 33 +- v2.3/toolkit/src/fnlo-tk-example.cc | 2 +- v2.3/toolkit/src/fnlo-tk-merge.cc | 2 +- v2.3/toolkit/src/fnlo-tk-merge2.cc | 2 +- v2.3/toolkit/src/fnlo-tk-modify.cc | 324 +++++++++++++----- v2.3/toolkit/src/fnlo-tk-rootout.cc | 53 ++- v2.3/toolkit/src/fnlo-tk-statunc.cc | 18 +- v2.3/toolkit/src/fnlo-tk-yodaout.cc | 21 +- 28 files changed, 612 insertions(+), 269 deletions(-) create mode 100644 doc/tableformat/fastNLOTableFormatv25.ods diff --git a/doc/tableformat/fastNLOTableFormatv25.ods b/doc/tableformat/fastNLOTableFormatv25.ods new file mode 100644 index 0000000000000000000000000000000000000000..6cc3fa9ed593b2ccf1a8855c9e500902e665ab2c GIT binary patch literal 25543 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 literal 0 HcmV?d00001 diff --git a/v2.3/toolkit/AUTHORS b/v2.3/toolkit/AUTHORS index 4798eb21..f6ab37e9 100644 --- a/v2.3/toolkit/AUTHORS +++ b/v2.3/toolkit/AUTHORS @@ -1,8 +1,9 @@ fastNLO is written by ---------------------- +===================== Daniel Britzger [daniel.britzger@desy.de], -Thomas Kluge, Klaus Rabbertz [klaus.rabbertz@cern.ch], -Georg Sieber [g.sieber@cern.ch], -Fred Stober [stober@cern.ch], and -Markus Wobisch [wobisch@fnal.gov] +Markus Wobisch [wobisch@latech.edu] + +Former contributors are: +------------------------ +Thomas Kluge, Georg Sieber, Jakob Stark, Fred Stober diff --git a/v2.3/toolkit/configure.ac b/v2.3/toolkit/configure.ac index 7057fcce..c263bdf4 100644 --- a/v2.3/toolkit/configure.ac +++ b/v2.3/toolkit/configure.ac @@ -10,7 +10,7 @@ # Require minimal autoconf version, 2.69 is from 2012 AC_PREREQ([2.69]) # Define subproject fastNLO_toolkit -AC_INIT([fastNLO_toolkit], [2.3.1], [daniel.britzger@desy.de,klaus.rabbertz@cern.ch,g.sieber@cern.ch,stober@cern.ch,wobisch@fnal.gov]) +AC_INIT([fastNLO_toolkit], [2.5.0], [daniel.britzger@desy.de,klaus.rabbertz@cern.ch,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 @@ -733,9 +733,9 @@ AM_CONDITIONAL(DX_COND_pdf, [test "x$DOXYGEN" != "x"]) # Define project substitution variables (to be replaced e.g. in config files below) AC_SUBST([AUTHORS],["D. Britzger, T. Kluge, K. Rabbertz, F. Stober, G. Sieber, M. Wobisch"]) AC_SUBST([AUTHORSv14],["T. Kluge, K. Rabbertz, M. Wobisch"]) -AC_SUBST([AUTHORSv2],["D. Britzger, T. Kluge, K. Rabbertz, F. Stober, M. Wobisch"]) -AC_SUBST([QUOTEv14],["hep-ph/0609285"]) -AC_SUBST([QUOTEv2],["arXiv:1109.1310"]) +AC_SUBST([AUTHORSv2],["D. Britzger, K. Rabbertz, F. Stober, M. Wobisch"]) +AC_SUBST([QUOTEv14],["Proc. DIS 2006, 483 (2006), hep-ph/0609285."]) +AC_SUBST([QUOTEv2],["Proc. DIS 2012, 217 (2012), arXiv:1208.3641."]) AC_SUBST([SUBPROJECT],["toolkit"]) AC_SUBST([WEBPAGE],["http://projects.hepforge.org/fastnlo"]) AC_SUBST([YEARS],["2005-`date +%Y`"]) diff --git a/v2.3/toolkit/data/modify/SteerModify.str b/v2.3/toolkit/data/modify/SteerModify.str index b321e0c5..a059e7ff 100644 --- a/v2.3/toolkit/data/modify/SteerModify.str +++ b/v2.3/toolkit/data/modify/SteerModify.str @@ -24,7 +24,7 @@ # ScDescript { # "First line to add" # "Second line of add" -# "etc" +# "etc." # } # ################################################################################## @@ -38,6 +38,7 @@ OutTable ModifiedTable.tab #-------------------- # Info print out #-------------------- +Verbosity INFO # Set print out verbosity PrintSteeringCard true # Print steering provided on command line or within this file PrintInputA1 true # Print table header of input table PrintInputA2 true # Print table scenario of input table @@ -48,8 +49,8 @@ PrintOutputA2 true # Print table scenario of output table # Modify parameters of the table header # Leave value empty for no modification #------------------------------------------- -#Itabversion # Change table version (Expert option!) -#ScenName # Change scenario name +#Itabversion 25000 # Change table version (Expert option!) +#ScenName fnlabcd # Change scenario name # -------------------------------------------- # Modify parameters of the table scenario @@ -68,21 +69,25 @@ ScDescript { # Example of final scenario description for CMS inclu "RIVET_ID=CMS_2011_S9086218/D01-x01-y01,SPIRES_ID=9086218,INSPIRE_RECORD=902309" "THEORY_LABEL=NLOJet++" "provided by:" - "fastNLO_2.1.0" + "fastNLO_2.5.0" "If you use this table, please cite:" - " D. Britzger, T. Kluge, K. Rabbertz, F. Stober, M. Wobisch, arXiv:1109.1310" + " D. Britzger, K. Rabbertz, F. Stober, M. Wobisch, Proc. DIS 2012, 217 (2012), arXiv:1208.3641." } #------------------------------------------------------ -# Modify bin sizes +# Modify bin sizes set in table scenario # (Does not change differential cross sections, # which are stored already in differential form!) #------------------------------------------------------ -BinSizeFactor 1. # Overall factor for bin sizes +#BinSizeFactor 1. # Overall factor for bin sizes #BinSize { # Individual bin size factors for each observable bin; one no. per bin! # #} +# -------------------------------------------- +# Modify the table contributions +# -------------------------------------------- + #-------------------------------------------------------------------- # Modify tabulated coefficients # (Changes the differential cross sections, which can be adapted @@ -92,11 +97,41 @@ BinSizeFactor 1. # Overall factor for bin sizes # #} +#-------------------------------------------------------------------- +# Modify code description +# (Same description for all perturbative contributions!) +#-------------------------------------------------------------------- +#CodeDescript { +# "NNLOJET_rev5918, please cite: T. Gehrmann et al., PoS RADCOR2017, 074 (2018), arXiv:1801.06415." +# "APPLfast interface, please cite: D. Britzger et al., Eur. Phys. J. C79, 845 (2019), arXiv:1906.05303." +#} + +#-------------------------------------------------------------------- +# Add InfoBlocks with statistical/numerical uncertainty +# (For now only works with NNLOJET dat files!) +#-------------------------------------------------------------------- +#InfoBlockFiles { # NNLOJET dat files for each order separately +# 2jet.LO.fnl3832_yb0_ys0_ptavgj12.dat +# 2jet.NLO_only.fnl3832_yb0_ys0_ptavgj12.dat +# 2jet.NNLO_only.fnl3832_yb0_ys0_ptavgj12.dat +#} + +#InfoBlockDescr { # Same description for each contribution +# "Default statistical uncertainties from NNLOJET." +#} + +#InfoBlockOrders { # Attribution of dat files to respective orders +# "LO" +# "NLO" +# "NNLO" +#} + #------------------------------------------------------------------------- # Cut out unused observable bins or split table into multiples pieces # Specify bin numbers to be removed within curly brackets. # First bin is bin 1, last bin is NObsBin. # An ordered numbering with INCREASING bin numbers must be used! +# Do NOT erase bins while adding InfoBlocks or vice versa! #-------------------------------------------------------------------------- #RemoveBins { # Gaps are fine, BUT an increasing bin numbering must be used! # 1 2 3 diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc index 7132e52e..19aac254 100644 --- a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc +++ b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc @@ -36,10 +36,9 @@ bool fastNLOCoeffAddBase::CheckCoeffConstants(const fastNLOCoeffBase* c, bool qu return false; } else { // Unknown contribution - say::error["fastNLOCoeffAddBase::CheckCoeffConstants"] - << "Unknown contribution type, aborting! " - << "IAddMultFlag = " << c->GetIAddMultFlag() - << ", IDataFlag =" << c->GetIDataFlag() <<endl; + say::error["fastNLOCoeffAddBase::CheckCoeffConstants"] << "Unknown contribution type, aborting! " + << "IAddMultFlag = " << c->GetIAddMultFlag() + << ", IDataFlag =" << c->GetIDataFlag() <<endl; exit(1); } } @@ -53,13 +52,13 @@ fastNLOCoeffAddBase* fastNLOCoeffAddBase::Clone() const { ///________________________________________________________________________________________________________________ // void fastNLOCoeffAddBase::Read(istream& table, int ITabVersionRead){ - debug["ReadCoeffAddBase::Read"]<<"Start reading table ..."<<endl; + debug["Read"]<<"Start reading table ..."<<endl; fastNLOCoeffBase::ReadBase(table, ITabVersionRead); CheckCoeffConstants(this); ReadCoeffAddBase(table, ITabVersionRead); fastNLOCoeffBase::ReadCoeffInfoBlocks(table, ITabVersionRead); EndReadCoeff(table, ITabVersionRead); - debug["ReadCoeffAddBase::Read"]<<"Finished reading table ..."<<endl; + debug["Read"]<<"Finished reading table ..."<<endl; } @@ -292,7 +291,7 @@ void fastNLOCoeffAddBase::Write(ostream& table, int itabversion) { table << IPDFdef3 << sep; if(IPDFdef2==0){ // PDF linear combinations are stored herewith - cout<<"Writing PDF coefficients into table."<<endl; + info["Write"]<<"Writing PDF coefficients into table."<<endl; if ( IPDFdef3 != NSubproc ){ error["Write"]<<"IPDFdef3 must be equal to NSubproc. (IPDFdef3="<<IPDFdef3<<", NSubproc="<<NSubproc<<"). Exiting."<<endl; exit(1); @@ -788,44 +787,67 @@ void fastNLOCoeffAddBase::Print(int iprint) const { //________________________________________________________________________________________________________________ // // Erase observable bin -void fastNLOCoeffAddBase::EraseBin(unsigned int iObsIdx) { - debug["EraseBin"]<<"Erasing table entries in CoeffAddBase for bin index " << iObsIdx << endl; +void fastNLOCoeffAddBase::EraseBin(unsigned int iObsIdx, int ITabVersionRead) { + debug["EraseBin"]<<"Erasing observable bin in CoeffAddBase with bin index " << iObsIdx << endl; if ( XNode1.size() == 0 ) { error["EraseBin"]<<"All additive contribution bins deleted already. Aborted!" << endl; exit(1); } if ( XNode1.size() != 0 ) XNode1.erase(XNode1.begin()+iObsIdx); if ( NPDFDim==2 && XNode2.size() != 0 ) XNode2.erase(XNode2.begin()+iObsIdx); - for ( unsigned int ip = 0 ; ip<fWgt.WgtObsSumW2.size() ; ip++ ) { - fWgt.WgtObsSumW2[ip].erase(fWgt.WgtObsSumW2[ip].begin()+iObsIdx); - fWgt.SigObsSumW2[ip].erase(fWgt.SigObsSumW2[ip].begin()+iObsIdx); - fWgt.SigObsSum[ip]. erase(fWgt.SigObsSum [ip].begin()+iObsIdx); - fWgt.WgtObsNumEv[ip].erase(fWgt.WgtObsNumEv[ip].begin()+iObsIdx); + for ( unsigned int i = 0 ; i<fWgt.WgtObsSumW2.size() ; i++ ) { + fWgt.WgtObsSumW2[i].erase(fWgt.WgtObsSumW2[i].begin()+iObsIdx); + fWgt.SigObsSumW2[i].erase(fWgt.SigObsSumW2[i].begin()+iObsIdx); + fWgt.SigObsSum[i]. erase(fWgt.SigObsSum [i].begin()+iObsIdx); + fWgt.WgtObsNumEv[i].erase(fWgt.WgtObsNumEv[i].begin()+iObsIdx); + } + if ( ! ( ITabVersionRead < 25000 ) ) { + if ( NCoeffInfoBlocks > 0 ) { + debug["EraseBin"]<<"Found " << NCoeffInfoBlocks << " InfoBlocks with bins to be erased, too." << endl; + for ( int i=0; i < NCoeffInfoBlocks; i++ ) { + if ( ICoeffInfoBlockFlag1[i] == 0 && ICoeffInfoBlockFlag2[i] == 0 ) { + CoeffInfoBlockContent[i].erase(CoeffInfoBlockContent[i].begin()+iObsIdx); + NCoeffInfoBlockCont[i] = NCoeffInfoBlockCont[i] - 1; + } else { + error["EraseBin"]<<"Erase bin not yet implemented for InfoBlocks other than with flags 1,2 = 0, 0:" << + ICoeffInfoBlockFlag1[i] << ", " << ICoeffInfoBlockFlag2[i] << ", aborted!" << endl; + exit(567); + } + } + } } fastNLOCoeffBase::EraseBin(iObsIdx); } // Catenate observable bin -void fastNLOCoeffAddBase::CatBin(const fastNLOCoeffAddBase& other, unsigned int iObsIdx) { - debug["CatBin"]<<"Catenating observable bin in CoeffAddBase corresponding to bin index " << iObsIdx << endl; +void fastNLOCoeffAddBase::CatBin(const fastNLOCoeffAddBase& other, unsigned int iObsIdx, int ITabVersionRead) { + debug["CatBin"]<<"Catenating observable bin to CoeffAddBase with bin index " << iObsIdx << endl; if ( XNode1.size() == 0 ) { error["CatBin"]<<"Initial additive table is empty. Aborted!" << endl; exit(1); } - //unsigned int nold = XNode1.size(); - if ( XNode1.size() != 0 ) { - XNode1.push_back(other.XNode1[iObsIdx]); - // XNode1.resize(nold+1); - // XNode1[nold] = other.XNode1[iObsIdx]; - } - if ( NPDFDim==2 && XNode2.size() != 0 ) { - XNode2.push_back(other.XNode2[iObsIdx]); - } - for ( unsigned int ip = 0 ; ip<fWgt.WgtObsSumW2.size() ; ip++ ) { - fWgt.WgtObsSumW2[ip].push_back(other.fWgt.WgtObsSumW2[ip][iObsIdx]); - fWgt.SigObsSumW2[ip].push_back(other.fWgt.SigObsSumW2[ip][iObsIdx]); - fWgt.SigObsSum[ip]. push_back(other.fWgt.SigObsSum [ip][iObsIdx]); - fWgt.WgtObsNumEv[ip].push_back(other.fWgt.WgtObsNumEv[ip][iObsIdx]); + if ( XNode1.size() != 0 ) XNode1.push_back(other.XNode1[iObsIdx]); + if ( NPDFDim==2 && XNode2.size() != 0 ) XNode2.push_back(other.XNode2[iObsIdx]); + for ( unsigned int i = 0 ; i<fWgt.WgtObsSumW2.size() ; i++ ) { + fWgt.WgtObsSumW2[i].push_back(other.fWgt.WgtObsSumW2[i][iObsIdx]); + fWgt.SigObsSumW2[i].push_back(other.fWgt.SigObsSumW2[i][iObsIdx]); + fWgt.SigObsSum[i]. push_back(other.fWgt.SigObsSum [i][iObsIdx]); + fWgt.WgtObsNumEv[i].push_back(other.fWgt.WgtObsNumEv[i][iObsIdx]); + } + if ( ! ( ITabVersionRead < 25000 ) ) { + if ( NCoeffInfoBlocks > 0 ) { + debug["CatBin"]<<"Found " << NCoeffInfoBlocks << " InfoBlocks with bins to be catenated, too." << endl; + for ( int i=0; i < NCoeffInfoBlocks; i++ ) { + if ( ICoeffInfoBlockFlag1[i] == 0 && ICoeffInfoBlockFlag2[i] == 0 ) { + CoeffInfoBlockContent[i].push_back(other.CoeffInfoBlockContent[i][iObsIdx]); + NCoeffInfoBlockCont[i] = NCoeffInfoBlockCont[i] + 1; + } else { + error["CatBin"]<<"Catenate bins not yet implemented for InfoBlocks other than with flags 1,2 = 0, 0:" << + ICoeffInfoBlockFlag1[i] << ", " << ICoeffInfoBlockFlag2[i] << ", aborted!" << endl; + exit(678); + } + } + } } fastNLOCoeffBase::CatBin(other, iObsIdx); } diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFix.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFix.cc index 5f2b1399..bb92b490 100644 --- a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFix.cc +++ b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFix.cc @@ -428,7 +428,7 @@ void fastNLOCoeffAddFix::Print(int iprint) const { //________________________________________________________________________________________________________________ // -void fastNLOCoeffAddFix::EraseBin(unsigned int iObsIdx) { +void fastNLOCoeffAddFix::EraseBin(unsigned int iObsIdx, int ITabVersionRead) { //! Erase observable bin debug["fastNLOCoeffAddFix::EraseBin"]<<"Erasing table entries in CoeffAddFix for bin index " << iObsIdx << endl; if ( ScaleNode.size() == 0 ) { @@ -437,11 +437,11 @@ void fastNLOCoeffAddFix::EraseBin(unsigned int iObsIdx) { } if ( ScaleNode.size() != 0 ) ScaleNode.erase(ScaleNode.begin()+iObsIdx); if ( SigmaTilde.size() != 0 ) SigmaTilde.erase(SigmaTilde.begin()+iObsIdx); - fastNLOCoeffAddBase::EraseBin(iObsIdx); + fastNLOCoeffAddBase::EraseBin(iObsIdx,ITabVersionRead); } // Catenate observable bin -void fastNLOCoeffAddFix::CatBin(const fastNLOCoeffAddFix& other, unsigned int iObsIdx) { +void fastNLOCoeffAddFix::CatBin(const fastNLOCoeffAddFix& other, unsigned int iObsIdx, int ITabVersionRead) { debug["fastNLOCoeffAddFix::CatBin"]<<"Catenating observable bin in CoeffAddFix corresponding to bin index " << iObsIdx << endl; if ( ScaleNode.size() == 0 ) { say::error["CatBin"]<<"Initial fix-scale table is empty. Aborted!" << endl; @@ -456,5 +456,5 @@ void fastNLOCoeffAddFix::CatBin(const fastNLOCoeffAddFix& other, unsigned int iO SigmaTilde.resize(nold+1); SigmaTilde[nold] = other.SigmaTilde[iObsIdx]; } - fastNLOCoeffAddBase::CatBin(other, iObsIdx); + fastNLOCoeffAddBase::CatBin(other, iObsIdx, ITabVersionRead); } diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFlex.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFlex.cc index 69125707..758b8cb1 100644 --- a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFlex.cc +++ b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFlex.cc @@ -518,7 +518,7 @@ void fastNLOCoeffAddFlex::Print(int iprint) const { //________________________________________________________________________________________________________________ // // Erase observable bin -void fastNLOCoeffAddFlex::EraseBin(unsigned int iObsIdx) { +void fastNLOCoeffAddFlex::EraseBin(unsigned int iObsIdx, int ITabVersionRead) { debug["fastNLOCoeffAddFlex::EraseBin"]<<"Erasing table entries in CoeffAddFlex for bin index " << iObsIdx << endl; if ( ScaleNode1.size() == 0 ) { say::error["EraseBin"]<<"All bins deleted already. Aborted!" << endl; @@ -532,11 +532,11 @@ void fastNLOCoeffAddFlex::EraseBin(unsigned int iObsIdx) { if ( SigmaTildeMuRRDep.size() != 0 ) SigmaTildeMuRRDep.erase(SigmaTildeMuRRDep.begin()+iObsIdx); if ( SigmaTildeMuFFDep.size() != 0 ) SigmaTildeMuFFDep.erase(SigmaTildeMuFFDep.begin()+iObsIdx); if ( SigmaTildeMuRFDep.size() != 0 ) SigmaTildeMuRFDep.erase(SigmaTildeMuRFDep.begin()+iObsIdx); - fastNLOCoeffAddBase::EraseBin(iObsIdx); + fastNLOCoeffAddBase::EraseBin(iObsIdx,ITabVersionRead); } // Catenate observable bin -void fastNLOCoeffAddFlex::CatBin(const fastNLOCoeffAddFlex& other, unsigned int iObsIdx) { +void fastNLOCoeffAddFlex::CatBin(const fastNLOCoeffAddFlex& other, unsigned int iObsIdx, int ITabVersionRead) { debug["fastNLOCoeffAddFlex::CatBin"]<<"Catenating observable bin in CoeffAddFlex corresponding to bin index " << iObsIdx << endl; if ( ScaleNode1.size() == 0 ) { say::error["CatBin"]<<"Initial flex-scale table is empty. Aborted!" << endl; @@ -575,5 +575,5 @@ void fastNLOCoeffAddFlex::CatBin(const fastNLOCoeffAddFlex& other, unsigned int SigmaTildeMuRFDep.resize(nold+1); SigmaTildeMuRFDep[nold] = other.SigmaTildeMuRFDep[iObsIdx]; } - fastNLOCoeffAddBase::CatBin(other, iObsIdx); + fastNLOCoeffAddBase::CatBin(other, iObsIdx, ITabVersionRead); } diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffBase.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffBase.cc index 54b108a1..d7b54af5 100644 --- a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffBase.cc +++ b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffBase.cc @@ -26,17 +26,17 @@ fastNLOCoeffBase* fastNLOCoeffBase::Clone() const { void fastNLOCoeffBase::Read(istream& table, int ITabVersionRead){ // basic read function. // reads in only 'base'-variables. - debug["ReadCoeffBase::Read"]<<"Start reading table ..."<<endl; + debug["Read"]<<"Start reading table ..."<<endl; ReadBase(table, ITabVersionRead); ReadCoeffInfoBlocks(table, ITabVersionRead); EndReadCoeff(table, ITabVersionRead); - debug["ReadCoeffBase::Read"]<<"Finished reading table."<<endl; + debug["Read"]<<"Finished reading table."<<endl; } //________________________________________________________________________________________________________________ // void fastNLOCoeffBase::ReadBase(istream& table, int ITabVersionRead){ - debug["ReadCoeffBase::ReadBase"]<<"Start reading base coefficient table ..."<<endl; + debug["ReadBase"]<<"Start reading base coefficient table ..."<<endl; fastNLOTools::ReadMagicNo(table); table >> IXsectUnits; table >> IDataFlag; @@ -46,16 +46,16 @@ void fastNLOCoeffBase::ReadBase(istream& table, int ITabVersionRead){ table >> NScaleDep; fastNLOTools::ReadFlexibleVector(CtrbDescript,table); fastNLOTools::ReadFlexibleVector(CodeDescript,table); - debug["ReadCoeffBase::ReadBase"]<<"Finished reading base coefficient table."<<endl; + debug["ReadBase"]<<"Finished reading base coefficient table."<<endl; } //________________________________________________________________________________________________________________ // void fastNLOCoeffBase::EndReadCoeff(istream& table, int ITabVersionRead){ - debug["fastNLOCoeffBase::EndReadCoeff"]<<"Should have reached end of coefficient table for table version "<<ITabVersionRead<<endl; + debug["EndReadCoeff"]<<"Should have reached end of coefficient table for table version "<<ITabVersionRead<<endl; fastNLOTools::ReadMagicNo(table); fastNLOTools::PutBackMagicNo(table); - debug["fastNLOCoeffBase::EndReadCoeff"]<<"Finished reading coefficient table for table version "<<ITabVersionRead<<endl; + debug["EndReadCoeff"]<<"Finished reading coefficient table for table version "<<ITabVersionRead<<endl; } @@ -126,30 +126,36 @@ bool fastNLOCoeffBase::IsCompatible(const fastNLOCoeffBase& other) const { //________________________________________________________________________________________________________________ // bool fastNLOCoeffBase::IsCatenable(const fastNLOCoeffBase& other) const { - if( IXsectUnits != other.GetIXsectUnits() ){ + if ( IXsectUnits != other.GetIXsectUnits() ){ debug["IsCatenable"]<<"IXsectUnits != other.GetIXsectUnits(). Skipped."<<endl; return false; } - if( IDataFlag != other.GetIDataFlag() ){ + if ( IDataFlag != other.GetIDataFlag() ){ debug["IsCatenable"]<<"IDataFlag != other.GetIDataFlag(). Skipped."<<endl; return false; } - if( IAddMultFlag != other.GetIAddMultFlag() ){ + if ( IAddMultFlag != other.GetIAddMultFlag() ){ debug["IsCatenable"]<<"IAddMultFlag != other.GetIAddMultFlag(). Skipped."<<endl; return false; } - if( IContrFlag1 != other.GetIContrFlag1() ){ + if ( IContrFlag1 != other.GetIContrFlag1() ){ debug["IsCatenable"]<<"IContrFlag1 != other.GetIContrFlag1(). Skipped."<<endl; return false; } - if( IContrFlag2 != other.GetIContrFlag2() ){ + if ( IContrFlag2 != other.GetIContrFlag2() ){ debug["IsCatenable"]<<"IContrFlag2 != other.GetIContrFlag2(). Skipped."<<endl; return false; } - if( NScaleDep != other.GetNScaleDep() ){ - debug["IsCatenable"]<<"NScaleDep != other.GetNScaleDep(). Skipped."<<endl; + if ( NScaleDep != other.GetNScaleDep() ){ return false; } + if ( ! (fVersionRead < 25000) ) { + if ( (HasCoeffInfoBlock(0,0) && ! other.HasCoeffInfoBlock(0,0)) || + (! HasCoeffInfoBlock(0,0) && other.HasCoeffInfoBlock(0,0)) ) { + debug["IsCatenable"]<<"Missing InfoBlock in either of the two tables. Skipped."<<endl; + return false; + } + } info["IsCatenable"]<<"Base parameters of contribution allow catenation"<<endl; // check descripts here ?! //bool potentialcompatible = true; @@ -200,25 +206,25 @@ void fastNLOCoeffBase::Print(int iprint) const { // Erase observable bin void fastNLOCoeffBase::EraseBin(unsigned int iObsIdx) { - debug["fastNLOCoeffBase::EraseBin"]<<"Erasing table entries in CoeffBase for bin index " << iObsIdx << endl; + debug["EraseBin"]<<"Erasing table entries in CoeffBase for bin index " << iObsIdx << endl; SetNObsBin(GetNObsBin()-1); } // Catenate observable bin void fastNLOCoeffBase::CatBin(const fastNLOCoeffBase& other, unsigned int iObsIdx) { - debug["fastNLOCoeffBase::CatBin"]<<"Catenating observable bin in CoeffBase corresponding to bin index " << iObsIdx << endl; + debug["CatBin"]<<"Catenating observable bin in CoeffBase corresponding to bin index " << iObsIdx << endl; SetNObsBin(GetNObsBin()+1); } // Multiply observable bin void fastNLOCoeffBase::MultiplyBin(unsigned int iObsIdx, double nfact) { - debug["fastNLOCoeffBase::MultiplyBin"]<<"Multiplying table entries. Nothing to be done in CoeffBase." << endl; + debug["MultiplyBin"]<<"Multiplying table entries. Nothing to be done in CoeffBase." << endl; } // //________________________________________________________________________________________________________________ // Added to include CoeffInfoBlocks -bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1) { +bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1) const { bool result = false; for (int i=0; i<NCoeffInfoBlocks; i++) { if ( ICoeffInfoBlockFlag1[i] == fICoeffInfoBlockFlag1 ) result = true; @@ -226,7 +232,7 @@ bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1) { return result; } -bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1, int fICoeffInfoBlockFlag2) { +bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1, int fICoeffInfoBlockFlag2) const { bool result = false; for (int i=0; i<NCoeffInfoBlocks; i++) { if ( ICoeffInfoBlockFlag1[i] == fICoeffInfoBlockFlag1 && ICoeffInfoBlockFlag2[i] == fICoeffInfoBlockFlag2 ) result = true; @@ -248,41 +254,56 @@ int fastNLOCoeffBase::GetCoeffInfoBlockIndex(int fICoeffInfoBlockFlag1, int fICo return -1; } +void fastNLOCoeffBase::AddCoeffInfoBlock(int fICoeffInfoBlockFlag1, int fICoeffInfoBlockFlag2, + std::vector<std::string> Description, std::string datfile) { + info["AddCoeffInfoBlocks"]<<"Adding additional InfoBlock with flags "<<fICoeffInfoBlockFlag1<<" and "<<fICoeffInfoBlockFlag2<<" to table contribution."<<endl; + NCoeffInfoBlocks += 1; + ICoeffInfoBlockFlag1.push_back(fICoeffInfoBlockFlag1); + ICoeffInfoBlockFlag2.push_back(fICoeffInfoBlockFlag2); + NCoeffInfoBlockDescr.push_back(Description.size()); + CoeffInfoBlockDescript.push_back(Description); + std::vector<double> Uncertainty = fastNLOTools::ReadInfoBlockContent(datfile); + CoeffInfoBlockContent.push_back(Uncertainty); +} + void fastNLOCoeffBase::ReadCoeffInfoBlocks(istream& table, int ITabVersionRead) { if (ITabVersionRead < 25000) { - debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"No additional info blocks allowed for table versions < 25000"<<endl; + debug["ReadCoeffInfoBlocks"]<<"No additional info blocks allowed for table versions < 25000"<<endl; } else { table >> NCoeffInfoBlocks; - debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found "<<NCoeffInfoBlocks<<" additional info blocks for coefficient table."<<endl; + debug["ReadCoeffInfoBlocks"]<<"Found "<<NCoeffInfoBlocks<<" additional info blocks for coefficient table."<<endl; for (int i=0; i<NCoeffInfoBlocks; i++) { int iflag; table >> iflag; ICoeffInfoBlockFlag1.push_back(iflag); if (ICoeffInfoBlockFlag1[i] == 0) { - debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<endl; + debug["ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<endl; } else { - error["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of unknown type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<endl; + error["ReadCoeffInfoBlocks"]<<"Found info block of unknown type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<endl; exit(111); } table >> iflag; ICoeffInfoBlockFlag2.push_back(iflag); if (ICoeffInfoBlockFlag2[i] == 0) { - debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag2 = "<<ICoeffInfoBlockFlag2[i]<<endl; + debug["ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag2 = "<<ICoeffInfoBlockFlag2[i]<<endl; } else { - error["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of unknown type ICoeffInfoBlockFlag2 = "<<ICoeffInfoBlockFlag2[i]<<endl; + error["ReadCoeffInfoBlocks"]<<"Found info block of unknown type ICoeffInfoBlockFlag2 = "<<ICoeffInfoBlockFlag2[i]<<endl; exit(222); } std::vector < std::string > Description; - fastNLOTools::ReadFlexibleVector(Description,table); + NCoeffInfoBlockDescr.push_back(fastNLOTools::ReadFlexibleVector(Description,table)-1); CoeffInfoBlockDescript.push_back(Description); + for (unsigned int j=0; j<Description.size(); j++) { + debug["ReadCoeffInfoBlocks"]<<"Read info block description line "<<j<<" : "<< Description[j] <<endl; + } if ( ICoeffInfoBlockFlag1[i] == 0 ) { // Entry per ObsBin std::vector < double > Content; - int nlines = fastNLOTools::ReadFlexibleVector(Content,table); - if ( nlines-1 != fNObsBins ) { - error["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<" , but # of content lines = "<<nlines-1<<" differs from fNObsBins = "<<fNObsBins<<"! Aborted."<<endl; + NCoeffInfoBlockCont.push_back(fastNLOTools::ReadFlexibleVector(Content,table)); + if ( NCoeffInfoBlockCont[i]-1 != fNObsBins ) { + error["ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<" , but # of content lines = "<<NCoeffInfoBlockCont[i]-1<<" differs from fNObsBins = "<<fNObsBins<<"! Aborted."<<endl; exit(223); } else { - debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Read "<<nlines-1<<" lines into InfoBlock content vector."<<endl; + debug["ReadCoeffInfoBlocks"]<<"Read "<<NCoeffInfoBlockCont[i]-1<<" lines into InfoBlock content vector."<<endl; } CoeffInfoBlockContent.push_back(Content); } @@ -292,19 +313,39 @@ void fastNLOCoeffBase::ReadCoeffInfoBlocks(istream& table, int ITabVersionRead) void fastNLOCoeffBase::WriteCoeffInfoBlocks(ostream& table, int ITabVersionWrite) { if (ITabVersionWrite < 25000) { - debug["fastNLOCoeffBase::WriteCoeffInfoBlocks"]<<"No additional info blocks allowed for table versions < 25000"<<endl; + debug["WriteCoeffInfoBlocks"]<<"No additional InfoBlocks allowed for table versions < 25000"<<endl; } else { - // Test with zero InfoBlocks - debug["fastNLOCoeffBase::WriteCoeffInfoBlocks"]<<"Writing additional line "<<NCoeffInfoBlocks<<endl; + debug["WriteCoeffInfoBlocks"]<<"Writing additional InfoBlocks; NCoeffInfoBlocks = "<<NCoeffInfoBlocks<<endl; table << NCoeffInfoBlocks << sep; for (int i=0; i<NCoeffInfoBlocks; i++) { - table << ICoeffInfoBlockFlag1[i]; - table << ICoeffInfoBlockFlag2[i]; - table << NCoeffInfoBlockDescr[i]; - for (int j=0; j<NCoeffInfoBlockDescr[i];j++) { - table << CoeffInfoBlockDescript[i][j]; + debug["WriteCoeffInfoBlocks"]<<"ICoeffInfoBlockFlags1,2 = "<<ICoeffInfoBlockFlag1[i]<<", "<<ICoeffInfoBlockFlag1[i]<<endl; + table << ICoeffInfoBlockFlag1[i] << sep; + table << ICoeffInfoBlockFlag2[i] << sep; + table << NCoeffInfoBlockDescr[i] << sep; + for (int j=0; j<NCoeffInfoBlockDescr[i]; j++) { + debug["WriteCoeffInfoBlocks"]<<"CoeffInfoBlockDecsript[.][.] = "<<CoeffInfoBlockDescript[i][j]<<endl; + table << CoeffInfoBlockDescript[i][j] << sep; } int nlines = fastNLOTools::WriteFlexibleVector(CoeffInfoBlockContent[i],table); + debug["WriteCoeffInfoBlocks"]<<"Wrote "<<nlines-1<<" content lines to additional InfoBlock no. "<<i<<endl; } } } + +void fastNLOCoeffBase::SetContributionDescription(std::vector <std::string> CtrbDescr) { + debug["SetContributionDescription"]<<"Setting contribution description."<<endl; + size_t NCtrbDescript = CtrbDescr.size(); + fastNLOCoeffBase::CtrbDescript.resize(NCtrbDescript); + for (size_t i=0; i < NCtrbDescript; ++i) { + fastNLOCoeffBase::CtrbDescript[i] = CtrbDescr[i]; + } +} + +void fastNLOCoeffBase::SetCodeDescription(std::vector <std::string> CodeDescr) { + debug["SetCodeDescription"]<<"Setting code description."<<endl; + size_t NCodeDescript = CodeDescr.size(); + fastNLOCoeffBase::CodeDescript.resize(NCodeDescript); + for (size_t i=0; i < NCodeDescript; ++i) { + fastNLOCoeffBase::CodeDescript[i] = CodeDescr[i]; + } +} diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc index 20b2cc33..ba1e7aa6 100644 --- a/v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc +++ b/v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc @@ -1399,6 +1399,13 @@ void fastNLOReader::CalcCrossSection() { for (unsigned int i=0; i<NObsBin; i++) { QScale[i] = QScale[i]/XSection[i]; } + + // ---- Square root for statistical uncertainty combinaton ---- // + logger.debug["CalcCrossSection"]<<"Calculate stat. uncertainty from quadratic addition: sqrt(dXS)"<<endl; + for (unsigned int i=0; i<NObsBin; i++) { + dXSection[i] = sqrt(dXSection[i]); + } + logger.debug["CalcCrossSection"]<<"... leaving CalcCrossSection."<<endl; } @@ -1506,13 +1513,15 @@ void fastNLOReader::CalcCrossSectionv21(fastNLOCoeffAddFlex* c) { int xUnits = c->GetIXsectUnits(); logger.debug["CalcCrossSectionv21"]<<"Ipublunits = " << Ipublunits << ", xUnits = " << xUnits << endl; - // Check whether CoeffInfoBlock for relative stat. uncertainties (0,0) exists - logger.debug["CalcCrossSectionv21"]<<"Checking on presence of statistical uncertainties ..."<<endl; + // Check whether CoeffInfoBlock for relative statistical/numerical uncertainties (0,0) exists + logger.debug["CalcCrossSectionv21"]<<"Checking on presence of statistical/numerical uncertainties ..."<<endl; int iCIBIndex = c->GetCoeffInfoBlockIndex(0,0); std::vector < double > dCIBCont; if ( iCIBIndex > -1 ) { - logger.debug["CalcCrossSectionv21"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with statistical uncertainties."<<endl; + logger.debug["CalcCrossSectionv21"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with statistical/numerical uncertainties."<<endl; dCIBCont = c->GetCoeffInfoContent(iCIBIndex); + } else { + logger.info["CalcCrossSectionv21"]<<"No CoeffInfoBlock found; uncertainties are initialised to zero."<<endl; } for (unsigned int i=0; i<NObsBin; i++) { @@ -1566,7 +1575,10 @@ void fastNLOReader::CalcCrossSectionv21(fastNLOCoeffAddFlex* c) { if ( dCIBCont.empty() ) { dXS->at(i) += 0.; } else { - dXS->at(i) += fabs(XStmp)*dCIBCont[i]; // XStmp may be negative, but dCIBCont as statistical uncertainty should not! + // Quadratical addition of independent statistical uncertainties + dXS->at(i) += XStmp*XStmp*dCIBCont[i]*dCIBCont[i]; + // Linear absolut addition of uncertainties (useful?) + // dXS->at(i) += fabs(XStmp)*dCIBCont[i]; } } logger.debug["CalcCrossSectionv21"]<<"... leaving CalcCrossSectionv21."<<endl; @@ -1608,13 +1620,15 @@ void fastNLOReader::CalcCrossSectionv20(fastNLOCoeffAddFix* c) { int xUnits = c->GetIXsectUnits(); logger.debug["CalcCrossSectionv20"]<<"Ipublunits = " << Ipublunits << ", xUnits = " << xUnits << endl; - // Check whether CoeffInfoBlock for relative stat. uncertainties (0,0) exists - logger.debug["CalcCrossSectionv20"]<<"Checking on presence of statistical uncertainties ..."<<endl; + // Check whether CoeffInfoBlock for relative statistical/numerical uncertainties (0,0) exists + logger.debug["CalcCrossSectionv20"]<<"Checking on presence of statistical/numerical uncertainties ..."<<endl; int iCIBIndex = c->GetCoeffInfoBlockIndex(0,0); std::vector < double > dCIBCont; if ( iCIBIndex > -1 ) { - logger.debug["CalcCrossSectionv20"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with statistical uncertainties."<<endl; + logger.debug["CalcCrossSectionv20"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with statistical/numerical uncertainties."<<endl; dCIBCont = c->GetCoeffInfoContent(iCIBIndex); + } else { + logger.info["CalcCrossSectionv20"]<<"No CoeffInfoBlock found; uncertainties are initialised to zero."<<endl; } int scaleVar = c->GetNpow() == ILOord ? 0 : fScalevar; @@ -1642,7 +1656,10 @@ void fastNLOReader::CalcCrossSectionv20(fastNLOCoeffAddFix* c) { if ( dCIBCont.empty() ) { dXS->at(i) += 0.; } else { - dXS->at(i) += fabs(XStmp)*dCIBCont[i]; // XStmp may be negative, but dCIBCont as statistical uncertainty should not! + // Quadratical addition of independent statistical uncertainties + dXS->at(i) += XStmp*XStmp*dCIBCont[i]*dCIBCont[i]; + // Linear absolut addition of uncertainties (useful?) + // dXS->at(i) += fabs(XStmp)*dCIBCont[i]; } } logger.debug["CalcCrossSectionv20"]<<"... leaving CalcCrossSectionv20."<<endl; diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc index 49385591..0dc9e7ed 100644 --- a/v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc +++ b/v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc @@ -1758,10 +1758,6 @@ string fastNLOTable::GetXSDescr() const { return "Undefined"; } -vector <string> fastNLOTable::GetScDescr() const { - return ScDescript; -} - void fastNLOTable::SetScDescr(std::vector <std::string> ScDescr) { size_t NScDescript = ScDescr.size(); fastNLOTable::ScDescript.resize(NScDescript); @@ -2210,11 +2206,11 @@ void fastNLOTable::EraseBinFromTable(unsigned int iObsIdx) { } else if ( fastNLOCoeffAddFix::CheckCoeffConstants(ctmp,quiet) ) { logger.info["EraseBinFromTable"]<<"Found additive fix-table contribution. Now erasing index no. " << iObsIdx << endl; fastNLOCoeffAddFix* cfix = (fastNLOCoeffAddFix*)fCoeff[ic]; - cfix->EraseBin(iObsIdx); + cfix->EraseBin(iObsIdx,ITabVersionRead); } else if ( fastNLOCoeffAddFlex::CheckCoeffConstants(ctmp,quiet) ) { logger.info["EraseBinFromTable"]<<"Found additive flex-table contribution. Now erasing index no. " << iObsIdx << endl; fastNLOCoeffAddFlex* cflex = (fastNLOCoeffAddFlex*)fCoeff[ic]; - cflex->EraseBin(iObsIdx); + cflex->EraseBin(iObsIdx,ITabVersionRead); } else { logger.error["EraseBinFromTable"]<<"Could not identify contribution. Print and abort!" << endl; ctmp->Print(-1); @@ -2301,7 +2297,7 @@ void fastNLOTable::CatBinToTable(const fastNLOTable& other, unsigned int iObsIdx fastNLOCoeffAddFix* crhs = (fastNLOCoeffAddFix*)other.GetCoeffTable(ic); if ( clhs->IsCatenable(*crhs) ) { logger.info["CatBinToTable"]<<"Found fix-scale additive contribution. Now catenating index no. " << iObsIdx << endl; - clhs->CatBin(*crhs,iObsIdx); + clhs->CatBin(*crhs,iObsIdx,ITabVersionRead); continue; } } @@ -2310,7 +2306,7 @@ void fastNLOTable::CatBinToTable(const fastNLOTable& other, unsigned int iObsIdx fastNLOCoeffAddFlex* crhs = (fastNLOCoeffAddFlex*)other.GetCoeffTable(ic); if ( clhs->IsCatenable(*crhs) ) { logger.info["CatBinToTable"]<<"Found flex-scale additive contribution. Now catenating index no. " << iObsIdx << endl; - clhs->CatBin(*crhs,iObsIdx); + clhs->CatBin(*crhs,iObsIdx,ITabVersionRead); continue; } } diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc index 01721846..667b74f7 100644 --- a/v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc +++ b/v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc @@ -1,7 +1,10 @@ +#include <cfloat> #include <cstdlib> -#include <string> +#include <fstream> #include <iostream> #include <cmath> +#include <sstream> +#include <string> #include "fastnlotk/fastNLOTools.h" using namespace std; @@ -388,5 +391,44 @@ namespace fastNLOTools { return true; } + //______________________________________________________________________________ + std::vector <double> ReadInfoBlockContent(std::string filename) { + std::ifstream infile; + std::string line; + std::vector <double> Uncertainty; + info["ReadInfoBlockContent"]<<"Reading additional InfoBlock content from file: " << filename <<endl; + infile.open(filename); + if (infile.is_open()) { + int iline = 0; + // Read line-by-line + while(std::getline(infile, line)) { + // Put line into stringstream and read word-by-word + std::istringstream iss(line); + std::string word; + iss >> word; + // For now assume NNLOJET dat file format: + // - Skip all lines starting with comment symbol '#' + // - Read cross section and absolute statistical uncertainty from 4th and 5th columns + if ( word.at(0) != '#' ) { + // Skip first three words of each line + iss >> word; + iss >> word; + double xs, dxs; + iss >> xs; + iss >> dxs; + if ( fabs(xs) > DBL_MIN ) { + Uncertainty.push_back(dxs/xs); + } else { + Uncertainty.push_back(0.); + } + iline += 1; + } + } + } else { + error["ReadInfoBlockContent"]<<"Cannot read InfoBlock content, aborted! Filename is: " << filename <<endl; + exit(33); + } + return Uncertainty; + } } // end namespace fastNLO diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddBase.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddBase.h index cb9033ca..63543b94 100644 --- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddBase.h +++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddBase.h @@ -119,8 +119,8 @@ public: virtual void MultiplyCoefficientsByConstant(double fact) {};//!< Multiply all coefficients of all bins by a constant factor virtual void MultiplyBin(unsigned int iObsIdx, double fact) {}; //!< Multiply coefficients of one observable bin a factor virtual void MultiplyBinProc(unsigned int iObsIdx, unsigned int iProc, double fact) {}; //!< Multiply coefficients of one observable bin a factor (idx starting from 0) - virtual void EraseBin(unsigned int iObsIdx);//!< Erase observable bin from table - virtual void CatBin(const fastNLOCoeffAddBase& other, unsigned int iObsIdx); //!< Catenate observable to table + virtual void EraseBin(unsigned int iObsIdx, int ITabVersionRead);//!< Erase observable bin from table + virtual void CatBin(const fastNLOCoeffAddBase& other, unsigned int iObsIdx, int ITabVersionRead); //!< Catenate observable to table int GetIRef() const {return IRef;} void SetIRef(int iref=1) {IRef=iref;} diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFix.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFix.h index 282bf068..19b8e884 100644 --- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFix.h +++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFix.h @@ -32,9 +32,9 @@ public: virtual void MultiplyBin(unsigned int iObsIdx, double fact); //!< Multiply coefficients of one bin a factor virtual void MultiplyBinProc(unsigned int iObsIdx, unsigned int iProc, double fact); //!< Multiply coefficients of one bin and subprocess by a factor // Erase observable bin from table - virtual void EraseBin(unsigned int iObsIdx); + virtual void EraseBin(unsigned int iObsIdx, int ITabVersionRead); // Catenate observable to table - virtual void CatBin(const fastNLOCoeffAddFix& other, unsigned int iObsIdx); + virtual void CatBin(const fastNLOCoeffAddFix& other, unsigned int iObsIdx, int ITabVersionRead); int GetTotalScalevars() const ; int GetTotalScalenodes() const ; diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFlex.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFlex.h index e55b4b56..51f8cd6c 100644 --- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFlex.h +++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFlex.h @@ -31,8 +31,8 @@ public: virtual void MultiplyCoefficientsByConstant(double fact); //!< Multiply all coefficients of all bins by a constant factor virtual void MultiplyBin(unsigned int iObsIdx, double fact); //!< Multiply coefficients of one bin a factor (iObsIdx starting with index 0) virtual void MultiplyBinProc(unsigned int iObsIdx, unsigned int iProc, double fact); //!< Multiply coefficients of one bin and subprocess a factor - virtual void EraseBin(unsigned int iObsIdx); //!< Erase observable bin from table - virtual void CatBin(const fastNLOCoeffAddFlex& other, unsigned int iObsIdx); //!< Catenate observable to table + virtual void EraseBin(unsigned int iObsIdx, int ITabVersionRead); //!< Erase observable bin from table + virtual void CatBin(const fastNLOCoeffAddFlex& other, unsigned int iObsIdx, int ITabVersionRead); //!< Catenate observable to table unsigned int GetNScaleNode1(int iObsBin) const { return ScaleNode1[iObsBin].size(); }; unsigned int GetNScaleNode2(int iObsBin) const { return ScaleNode2[iObsBin].size(); }; diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffBase.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffBase.h index 91f9e718..9ac3f249 100644 --- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffBase.h +++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffBase.h @@ -38,6 +38,10 @@ public: void SetCoeffAddDefaults(); + /// ___________________________________________________________________________________________________ + /// Some info getters & setters for contribution modifications + /// ___________________________________________________________________________________________________ + int GetIDataFlag() const {return IDataFlag;} void SetIDataFlag(int n){IDataFlag = n;} @@ -61,9 +65,11 @@ public: bool GetIsFlexibleScale() const { return (NScaleDep>=3) && (IAddMultFlag==0); } + /// get/set contribution and code description std::vector<std::string > GetContributionDescription() const { return CtrbDescript; } - void SetContributionDescription(std::vector<std::string > descr ) { CtrbDescript = descr; }; //! Set contribution description + void SetContributionDescription(std::vector<std::string > descr ); std::vector<std::string > GetCodeDescription() const { return CodeDescript; } + void SetCodeDescription(std::vector<std::string > descr ); bool IsLO() const {return IContrFlag1==1 && IContrFlag2==1;} bool IsNLO() const {return IContrFlag1==1 && IContrFlag2==2;} @@ -75,12 +81,13 @@ public: // Added to include CoeffInfoBlocks bool HasCoeffInfoBlock() const {return NCoeffInfoBlocks>0;} - bool HasCoeffInfoBlock(int ICoeffInfoBlockFlag1); - bool HasCoeffInfoBlock(int ICoeffInfoBlockFlag1, int ICoeffInfoBlockFlag2); + bool HasCoeffInfoBlock(int ICoeffInfoBlockFlag1) const; + bool HasCoeffInfoBlock(int ICoeffInfoBlockFlag1, int ICoeffInfoBlockFlag2) const; int GetCoeffInfoBlockIndex(int ICoeffInfoBlockFlag1); int GetCoeffInfoBlockIndex(int ICoeffInfoBlockFlag1, int ICoeffInfoBlockFlag2); std::vector < double > GetCoeffInfoContent(int Index) const { return CoeffInfoBlockContent[Index]; }; int GetNCoeffInfoBlocks() const {return NCoeffInfoBlocks;} + void AddCoeffInfoBlock(int ICoeffInfoBlockFlag1, int ICoeffInfoBlockFlag2, std::vector<std::string> Description, std::string datfile); protected: void ReadBase(std::istream& table, int ITabVersionRead); @@ -108,6 +115,7 @@ protected: std::vector < int > ICoeffInfoBlockFlag2; std::vector < int > NCoeffInfoBlockDescr; std::vector < std::vector < std::string > > CoeffInfoBlockDescript; + std::vector < int > NCoeffInfoBlockCont; fastNLO::v2d CoeffInfoBlockContent; }; diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTable.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTable.h index 799320f3..bde76acd 100644 --- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTable.h +++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTable.h @@ -158,7 +158,7 @@ class fastNLOTable { /// ___________________________________________________________________________________________________ /// get/set scenario description - std::vector <std::string> GetScDescr() const; + std::vector <std::string> GetScDescr() const { return ScDescript; } void SetScDescr(std::vector <std::string> ScDescr); /// get/set cross section units of published results (pb = 12, fb = 15, ...) diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h index 99461c2c..39e528fd 100644 --- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h +++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h @@ -80,6 +80,8 @@ namespace fastNLOTools { bool ReadMagicNo(std::istream& table); //!< Read and check magic number from table. void PutBackMagicNo(std::istream& table); //!< Reset magic number, such that it can be recognized by other reading routines + std::vector <double> ReadInfoBlockContent(std::string filename); + }; diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/speaker.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/speaker.h index 8671927d..7fdea3a7 100644 --- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/speaker.h +++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/speaker.h @@ -10,6 +10,22 @@ namespace say { enum Verbosity {DEBUG=-1000, MANUAL=2, INFO=0, WARNING=1, ERROR=2, SILENT=1000}; + + // String to enum + struct toVerbosity : public std::map<std::string, Verbosity> + { + toVerbosity() + { + this->operator[]("DEBUG") = DEBUG; + this->operator[]("MANUAL") = MANUAL; + this->operator[]("INFO") = INFO; + this->operator[]("WARNING") = WARNING; + this->operator[]("ERROR") = ERROR; + this->operator[]("SILENT") = SILENT; + }; + ~toVerbosity(){} + }; + } class speaker { @@ -17,7 +33,6 @@ public: speaker(std::string prefix="",say::Verbosity volume=say::INFO,bool err=false,bool quiet=false); speaker(const speaker& spk); ~speaker(); - //speaker(const speaker& spk) : weg(0) {;}; const speaker& operator= (const speaker& other); std::ostream& operator[](const std::string& fct) const ; const speaker& operator+ (const std::string& fct) const { @@ -67,7 +82,6 @@ public: }; protected: - //std::ostream weg; static std::ostream* weg; bool fquiet; std::string pref; @@ -83,7 +97,7 @@ protected: namespace say { extern speaker debug; - extern speaker man; // + extern speaker man; extern speaker info; extern speaker warn; extern speaker error; @@ -95,7 +109,7 @@ namespace say { class PrimalScream { public: - PrimalScream(std::string classname);//,std::string prefix=""); + PrimalScream(std::string classname); void SetClassName(const std::string classname ); void SetVerbosity(say::Verbosity volume); speaker debug; diff --git a/v2.3/toolkit/src/fnlo-tk-append.cc b/v2.3/toolkit/src/fnlo-tk-append.cc index fa86db5d..9b000430 100644 --- a/v2.3/toolkit/src/fnlo-tk-append.cc +++ b/v2.3/toolkit/src/fnlo-tk-append.cc @@ -28,7 +28,7 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); //! --- Print program purpose diff --git a/v2.3/toolkit/src/fnlo-tk-cat.cc b/v2.3/toolkit/src/fnlo-tk-cat.cc index 514069c3..4216af82 100644 --- a/v2.3/toolkit/src/fnlo-tk-cat.cc +++ b/v2.3/toolkit/src/fnlo-tk-cat.cc @@ -26,7 +26,7 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); //! --- Print program purpose diff --git a/v2.3/toolkit/src/fnlo-tk-cppread.cc b/v2.3/toolkit/src/fnlo-tk-cppread.cc index b0ad40e2..a7fd626b 100644 --- a/v2.3/toolkit/src/fnlo-tk-cppread.cc +++ b/v2.3/toolkit/src/fnlo-tk-cppread.cc @@ -55,10 +55,10 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); - //! --- Parse command line + //! --- Parse command line char buffer[1024]; // TODO: Use PATH_MAX instead? string tablename; if (argc <= 1) { @@ -228,8 +228,7 @@ int main(int argc, char** argv) { } if (argc <= 4 || AsEvolCode == "_") { AsEvolCode = "GRV"; - shout["fnlo-tk-cppread"] << "No request given for alpha_s evolution code," << endl; - shout << " using GRV default." << endl; + shout["fnlo-tk-cppread"] << "No request given for alpha_s evolution code, using GRV default." << endl; } else { shout["fnlo-tk-cppread"] << "Using alpha_s evolution code: " << AsEvolCode << endl; } @@ -251,7 +250,7 @@ int main(int argc, char** argv) { chflex = (const char*) argv[6]; } if (argc <= 6 || chflex == "_") { - chflex = "scale1"; + chflex = "kScale1"; shout["fnlo-tk-cppread"] << "Using default mur=muf=scale 1." << endl; } else { shout["fnlo-tk-cppread"] << "Using scale definition "+chflex << endl; @@ -264,7 +263,7 @@ int main(int argc, char** argv) { } if (argc <= 7 || chtmp == "_") { shout["fnlo-tk-cppread"] << "No request given for no. of flavours," << endl; - shout << " using default value for LHAPDF or Nf = " << Nf << "." << endl; + shout << " using default value for LHAPDF or Nf = " << Nf << "." << endl; } else { Nf = atoi(argv[7]); if ( AsEvolCode == "LHAPDF" ) { @@ -287,7 +286,7 @@ int main(int argc, char** argv) { } if (argc <= 8 || chtmp == "_") { shout["fnlo-tk-cppread"] << "No request given for no. of loops," << endl; - shout << " using default value for LHAPDF or NLoop = " << NLoop << "." << endl; + shout << " using default value for LHAPDF or NLoop = " << NLoop << "." << endl; } else { NLoop = atoi(argv[8]); if ( AsEvolCode == "LHAPDF" ) { @@ -310,7 +309,7 @@ int main(int argc, char** argv) { } if (argc <= 9 || chtmp == "_") { shout["fnlo-tk-cppread"] << "No request given for value of alpha_s(M_Z)," << endl; - shout << " using default value for LHAPDF or asMz = " << asMz << "." << endl; + shout << " using default value for LHAPDF or asMz = " << asMz << "." << endl; } else { asMz = atof(argv[9]); if ( AsEvolCode == "LHAPDF" ) { @@ -333,7 +332,7 @@ int main(int argc, char** argv) { } if (argc <= 10 || chtmp == "_") { shout["fnlo-tk-cppread"] << "No request given for value of M_Z," << endl; - shout << " using default value for LHAPDF or Mz = " << Mz << "." << endl; + shout << " using default value for LHAPDF or Mz = " << Mz << "." << endl; } else { Mz = atof(argv[10]); if ( AsEvolCode == "LHAPDF" ) { @@ -356,8 +355,7 @@ int main(int argc, char** argv) { } if (argc <= 11 || VerbosityLevel == "_") { VerbosityLevel = "WARNING"; - shout["fnlo-tk-cppread"] << "No request given for verbosity level," << endl; - shout << " using WARNING default." << endl; + shout["fnlo-tk-cppread"] << "No request given for verbosity level, using WARNING default." << endl; } else { shout["fnlo-tk-cppread"] << "Using verbosity level: " << VerbosityLevel << endl; } @@ -370,17 +368,8 @@ int main(int argc, char** argv) { yell << _CSEPSC << endl; //--- End of parsing arguments - //! --- Reset verbosity level to warning only from here on - // TODO: KR: A string to enum map or similar could come in handy here - if ( VerbosityLevel == "DEBUG" ) { - SetGlobalVerbosity(DEBUG); - } else if ( VerbosityLevel == "INFO" ) { - SetGlobalVerbosity(INFO); - } else if ( VerbosityLevel == "ERROR" ) { - SetGlobalVerbosity(ERROR); - } else { - SetGlobalVerbosity(WARNING); - } + //! --- Reset verbosity level from here on + SetGlobalVerbosity(toVerbosity()[VerbosityLevel]); // ************************** fastNLO and example documentation starts here **************************** // --- fastNLO user: Hello! diff --git a/v2.3/toolkit/src/fnlo-tk-example.cc b/v2.3/toolkit/src/fnlo-tk-example.cc index 8ccb78f5..dd37b9eb 100644 --- a/v2.3/toolkit/src/fnlo-tk-example.cc +++ b/v2.3/toolkit/src/fnlo-tk-example.cc @@ -42,7 +42,7 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); //! --- Print program purpose diff --git a/v2.3/toolkit/src/fnlo-tk-merge.cc b/v2.3/toolkit/src/fnlo-tk-merge.cc index 45466cca..13104ab4 100644 --- a/v2.3/toolkit/src/fnlo-tk-merge.cc +++ b/v2.3/toolkit/src/fnlo-tk-merge.cc @@ -29,7 +29,7 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); //! --- Print program purpose diff --git a/v2.3/toolkit/src/fnlo-tk-merge2.cc b/v2.3/toolkit/src/fnlo-tk-merge2.cc index fcf87011..b0e54786 100644 --- a/v2.3/toolkit/src/fnlo-tk-merge2.cc +++ b/v2.3/toolkit/src/fnlo-tk-merge2.cc @@ -108,7 +108,7 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); //! --- Print program purpose diff --git a/v2.3/toolkit/src/fnlo-tk-modify.cc b/v2.3/toolkit/src/fnlo-tk-modify.cc index ae19d1ab..19699965 100644 --- a/v2.3/toolkit/src/fnlo-tk-modify.cc +++ b/v2.3/toolkit/src/fnlo-tk-modify.cc @@ -15,6 +15,7 @@ #include <iostream> #include <vector> #include "fastnlotk/fastNLOTable.h" +#include "fastnlotk/fastNLOTools.h" #include "fastnlotk/read_steer.h" #include "fastnlotk/speaker.h" @@ -26,46 +27,57 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); - //! --- Print program purpose - yell << _CSEPSC << endl; - info["fnlo-tk-modify"] << "Tool to manipulate a fastNLO table" << endl; - yell << _SSEPSC << endl; - info["fnlo-tk-modify"] << "For more explanations type:" << endl; - info["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl; - info["fnlo-tk-modify"] << "and consult the provided default steering file 'SteerModify.str'." << endl; - yell << _CSEPSC << endl; - - //! --- Parse commmand line - yell << "" << endl; - yell << _CSEPSC << endl; - shout["fnlo-tk-modify"] << "fastNLO Table Manipulator"<<endl; - yell << _SSEPSC << endl; - //! Test for default steering file "SteerModify.str" - string steername = "SteerModify.str"; + //! --- Parse command line + string steername = "SteerModify.str"; //! Default steering file "SteerModify.str" + string intable; + string outtable; + string testname; if (argc <= 1) { - ifstream ffile; - ffile.open(steername.c_str()); - if (!ffile) { - error["fnlo-tk-modify"] << "Neither mandatory parameters specified in command line " << endl; - error["fnlo-tk-modify"] << "nor default steering file 'SteerModify.str' found. Aborted!" << endl; - shout["fnlo-tk-modify"] << "For more explanations type:" << endl; - shout["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl; - yell << _CSEPSC << endl; - exit(1); - } + yell << "" << endl; + yell << _CSEPSC << endl; + shout["fnlo-tk-modify"] << "fastNLO Table Manipulator" << endl; + yell << _SSEPSC << endl; + shout["fnlo-tk-modify"] << "Since no argument is given, all settings must be provided via" << endl; + shout["fnlo-tk-modify"] << " the default steering file 'SteerModify.str'," << endl; + shout["fnlo-tk-modify"] << " which can be consulted for further information as well." << endl; + shout["fnlo-tk-modify"] << "For more explanations type:" << endl; + shout["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl; + shout["fnlo-tk-modify"] << "For version number printout type:" << endl; + shout["fnlo-tk-modify"] << "./fnlo-tk-modify -v" << endl; + yell << _CSEPSC << endl; } else { - steername = (const char*) argv[1]; + testname = (const char*) argv[1]; + if (testname == "-v") { + fastNLOTools::PrintFastnloVersion(); + return 0; + } + //! --- Print program purpose + yell << _CSEPSC << endl; + shout["fnlo-tk-modify"] << "Tool to manipulate a fastNLO table" << endl; + yell << _SSEPSC << endl; + shout["fnlo-tk-modify"] << "For more explanations type:" << endl; + shout["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl; + shout["fnlo-tk-modify"] << "and consult the default steering file 'SteerModify.str'." << endl; + shout["fnlo-tk-modify"] << "For version number printout type:" << endl; + shout["fnlo-tk-modify"] << "./fnlo-tk-modify -v" << endl; + yell << _CSEPSC << endl; + yell << "" << endl; //! --- Usage info - if (steername == "-h") { + if (testname == "-h") { + yell << _CSEPSC << endl; + shout["fnlo-tk-modify"] << "fastNLO Table Manipulator" << endl; + yell << _SSEPSC << endl; yell << " #" << endl; info["fnlo-tk-modify"] << "The purpose of this tool is to allow the user to perform a number of" << endl; info["fnlo-tk-modify"] << "modifications on a fastNLO table, e.g. the adaptation of the scenario description." << endl; info["fnlo-tk-modify"] << "Most importantly, superfluous observable bins can be removed or additional factors" << endl; - info["fnlo-tk-modify"] << "can be applied to each bin." << endl; - info["fnlo-tk-modify"] << "It is assumed that the desired changes are set up in a steering file." << endl; + info["fnlo-tk-modify"] << "can be applied to each bin. Moreover, additional uncertainties like from numerical" << endl; + info["fnlo-tk-modify"] << "integrations can be added to each perturbative contribution." << endl; + info["fnlo-tk-modify"] << "Because simple command line arguments or options would not be flexible enough," << endl; + info["fnlo-tk-modify"] << "it is assumed that the desired changes are set up in a steering file." << endl; info["fnlo-tk-modify"] << "By default the steering file is named 'SteerModify.str'." << endl; info["fnlo-tk-modify"] << "A template for such a file is contained in the release and" << endl; info["fnlo-tk-modify"] << "usually should have been installed under share/fastnlo_toolkit/Modify/." << endl; @@ -74,69 +86,101 @@ int main(int argc, char** argv) { info["fnlo-tk-modify"] << "e.g. fnlo-tk-modify steerfile=AnotherFileName.str" << endl; info["fnlo-tk-modify"] << endl; man << "" << endl; - man << "Usage: ./fnlo-tk-modify [steerfile=SteerFile.str] <InTable=fastNLOtableIn.tab> <OutTable=fastNLOtableOut.tab> [OptArg=option]" << endl; + man << "Usage: ./fnlo-tk-modify [steerfile=SteerFile.str] [InTable=fastNLOtableIn.tab.gz] [OutTable=fastNLOtableOut.tab.gz] [OptArg=option]" << endl; man << " Specification: <> mandatory; [] optional." << endl; - man << " All desired table modifications like" << endl; - man << " - changing the scenario name" << endl; - man << " - changing or complementing the scenario description" << endl; - man << " - adapting the cross section output units" << endl; - man << " - correcting the power of the LO process" << endl; - man << " - correcting the cms energy" << endl; - man << " - cutting out unused bins or" << endl; - man << " - multiplying bins by a set of factors" << endl; - man << " are assumed to be controlled via steering parameters " << endl; - man << " similar to the ones that may be used in table creation." << endl; - man << " By default it is expected that at least the mandatory ones are" << endl; - man << " specified in the steering file 'SteerModify.str' or" << endl; - man << " are given via command line arguments:" << endl; - man << "[steerfile=SteerFile.str]: Alternative steering filename" << endl; - man << "<InTable=fastNLOtableIn.tab>: Table input filename, if not specified in steering file" << endl; - man << "<OutTable=fastNLOtableOut.tab>: Table output filename, if not specified in steering file" << endl; - man << " For more steering options please check the default steering file delivered" << endl; - man << " by the fastNLO Tolkit (usually in $prefix/share/fastnlo_toolkit/steerfiles)." << endl; + man << "[steerfile=SteerFile.str]: Alternative steering filename." << endl; + man << "[InTable=fastNLOtableIn.tab.gz]: Table input filename, if not specified in steering file." << endl; + man << "[OutTable=fastNLOtableOut.tab.gz]: Table output filename, if not specified in steering file." << endl; + man << " All desired table modifications like" << endl; + man << " - changing the scenario name," << endl; + man << " - changing or complementing the scenario description," << endl; + man << " - cutting out unused bins," << endl; + man << " - multiplying bins by a set of factors," << endl; + man << " - adding uncertainty information," << endl; + man << " - adapting the cross section output units," << endl; + man << " - correcting the power of the LO process, or" << endl; + man << " - correcting the cms energy" << endl; + man << " are assumed to be controlled via steering parameters" << endl; + man << " similar to the ones that may be used in table creation." << endl; + man << " By default it is expected that at least the mandatory ones are" << endl; + man << " either given via command line arguments or are specified" << endl; + man << " in a steering file by default named 'SteerModify.str'." << endl; + man << " For more steering options please check the default steering file delivered" << endl; + man << " by the fastNLO Tolkit (usually in $prefix/share/fastnlo_toolkit/steerfiles)." << endl; yell << " #" << endl; yell << _CSEPSC << endl; return 0; - } else { - shout["fnlo-tk-modify"] << "Parsing requested modifications ..." << endl; } - } - - if ( !PARSE(argc,argv) ) { - if ( ! (EXIST(InTable) && EXIST(OutTable)) ) { - shout["fnlo-tk-modify"] << "Mandatory parameters not specified in command line," << endl; - shout["fnlo-tk-modify"] << "trying to read from default steering file 'SteerModify.str'" << endl; - int retcode = READ("SteerModify.str"); - if ( retcode != 0 ) { - error["fnlo-tk-modify"] << "Reading of mandatory parameters from default steering file 'SteerModify.str' unsuccessful. Aborted!" << endl; - exit(retcode); + yell << _CSEPSC << endl; + info["fnlo-tk-modify"] << "Parsing command line ..." << endl; + for ( int i = 1; i < argc; i++ ) { + std::string test = argv[i]; + size_t ipos = test.find("steerfile="); + if ( ipos == 0 ) { + ipos = test.find("="); + steername = test.substr(ipos+1,std::string::npos); + info["fnlo-tk-modify"] << "Found argument for steerfile: " << steername << endl; + } + ipos = test.find("InTable="); + if ( ipos == 0 ) { + ipos = test.find("="); + intable = test.substr(ipos+1,std::string::npos); + info["fnlo-tk-modify"] << "Found argument for InTable: " << intable << endl; } - if ( ! (EXIST(InTable) && EXIST(OutTable)) ) { - error["fnlo-tk-modify"] << "Mandatory parameters also not specified in default steering file 'SteerModify.str'. Aborted!" << endl; - shout["fnlo-tk-modify"] << "For more explanations type:" << endl; - shout["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl; - PRINTALL(); - exit(1); + ipos = test.find("OutTable="); + if ( ipos == 0 ) { + ipos = test.find("="); + outtable = test.substr(ipos+1,std::string::npos); + info["fnlo-tk-modify"] << "Found argument for OutTable: " << outtable << endl; } } - } else { - shout["fnlo-tk-modify"] << "Parsing alternative steering file ..." << endl; } - if ( ! (EXIST(InTable) && EXIST(OutTable)) ) { - error["fnlo-tk-modify"] << "Input and/or output table not specified. Aborted!" << endl; - PRINTALL(); - exit(1); + // Reading all settings from command line; success means provided steering file could be read! + if ( PARSE(argc,argv) ) { + info["fnlo-tk-modify"] << "Read all settings from command line and provided steering file." << endl; + if ( ! (EXIST(InTable) && EXIST(OutTable)) ) { + error["fnlo-tk-modify"] << "Mandatory parameters InTable and OutTable are not defined," << endl; + error["fnlo-tk-modify"] << "neither on command line nor in steering file. Aborted!" << endl; + error["fnlo-tk-modify"] << "For more explanations type:" << endl; + error["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl; + PRINTALL(); + exit(1); + } + } else { // Steering file could not be read, try default one! + info["fnlo-tk-modify"] << "Provided steering file, if any, could not be read." << endl; + info["fnlo-tk-modify"] << "Trying default steering file 'SteerModify.str' instead ..." << endl; + int retcode = READ("SteerModify.str"); + if ( retcode != 0 ) { + warn["fnlo-tk-modify"] << "No steering file found!" << endl; + warn["fnlo-tk-modify"] << "All manipulations must have been defined by" << endl; + warn["fnlo-tk-modify"] << "command line options!" << endl; + } + if ( ! (EXIST(InTable) && EXIST(OutTable)) ) { + error["fnlo-tk-modify"] << "Mandatory parameters InTable and OutTable not defined," << endl; + error["fnlo-tk-modify"] << "neither on command line nor in any steering file. Aborted!" << endl; + error["fnlo-tk-modify"] << "For more explanations type:" << endl; + error["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl; + PRINTALL(); + exit(1); + } } + //! --- If desired print all steering information if ( EXIST(PrintSteeringCard) ) { + info["fnlo-tk-modify"] << "Print all steering information ..." << endl; if ( BOOL(PrintSteeringCard) ) PRINTALL(); } - shout["fnlo-tk-modify"] << "Trying to read input table " << STRING(InTable) << endl; + //! --- Reset verbosity level + if ( EXIST(Verbosity) ) { + info["fnlo-tk-modify"] << "Resetting verbosity to: " << STRING(Verbosity) << endl; + SetGlobalVerbosity(toVerbosity()[STRING(Verbosity)]); + } + //! --- Print input table information + info["fnlo-tk-modify"] << "Trying to read input table " << STRING(InTable) << endl; fastNLOTable table(CHAR(InTable)); - table.ReadTable(); if ( EXIST(PrintInputA1) ) { if ( BOOL(PrintInputA1) ) table.PrintHeader(1); } @@ -144,7 +188,7 @@ int main(int argc, char** argv) { if ( BOOL(PrintInputA2) ) table.PrintScenario(1); } - // Block A1 + // Block A1: Table header if ( EXIST(Itabversion) ) { info["fnlo-tk-modify"]<<"Modifying table version: from "<< table.GetITabVersionRead() << " to " << INT(Itabversion) << endl; table.SetITabVersionWrite(INT(Itabversion)); @@ -153,7 +197,8 @@ int main(int argc, char** argv) { info["fnlo-tk-modify"]<<"Modifying scenario name: from "<< table.GetScenName() << " to " << STRING(ScenName) << endl; table.SetScenName(STRING(ScenName)); } - // Block A2 + + // Block A2: Table scenario if ( EXIST(Ipublunits) ) { info["fnlo-tk-modify"]<<"Modifying publication units: from "<< table.GetIpublunits() << " to " << INT(Ipublunits) << endl; table.SetIpublunits(INT(Ipublunits)); @@ -167,7 +212,7 @@ int main(int argc, char** argv) { shout << "Line no. " << i << ": " << ScDescr[i] << endl; } if ( BOOL(AttachScDescription) ){ - info["fnlo-tk-modify"]<<"Attaching lines:" << endl; + info["fnlo-tk-modify"]<<"Attaching to scenario description:" << endl; size_t NewNScSize = NScSize + STRING_ARR(ScDescript).size(); ScDescr.resize(NewNScSize); for ( size_t i = NScSize; i < NewNScSize; i++ ) { @@ -175,7 +220,7 @@ int main(int argc, char** argv) { shout << "Line no. " << i << ": " << ScDescr[i] << endl; } } else { - info["fnlo-tk-modify"]<<"Replacing lines with:" << endl; + info["fnlo-tk-modify"]<<"Replacing scenario description by:" << endl; size_t NewNScSize = STRING_ARR(ScDescript).size(); ScDescr.resize(NewNScSize); for ( size_t i = 0; i < NewNScSize; i++ ) { @@ -219,6 +264,7 @@ int main(int argc, char** argv) { } } + // Block B's: Scenario contributions if ( !DOUBLE_ARR(MultCoeff).empty() ) { vector<double> fac = DOUBLE_ARR(MultCoeff); info["fnlo-tk-modify"]<<"Multiplying by provided factors all coefficients of additive contributions to observable bins!"<<endl; @@ -233,6 +279,7 @@ int main(int argc, char** argv) { } } + //! Erase observable bins from table (Do NOT simultaneously to adding InfoBlocks!) if ( !INT_ARR(RemoveBins).empty() ) { info["fnlo-tk-modify"]<<"Removing observable bins from interpolation table!"<<endl; unsigned int nobs = table.GetNObsBin(); @@ -250,6 +297,121 @@ int main(int argc, char** argv) { } } + //! Replace CodeDescription in each perturbative contribution + if ( !STRING_ARR(CodeDescript).empty() ){ + int Ncontrib = table.GetNcontrib(); + size_t NCodeDescript = STRING_ARR(CodeDescript).size(); + std::vector<std::string> Description; + info["fnlo-tk-modify"]<<"Replacing code description by:" << endl; + for ( size_t i = 0; i < NCodeDescript; i++ ) { + info["fnlo-tk-modify"]<<"Line no. " << i << ": " << STRING_ARR(CodeDescript)[i] << endl; + Description.push_back(STRING_ARR(CodeDescript)[i]); + } + for ( int i = 0; i < Ncontrib; i++ ) { + fastNLOCoeffBase* c = table.GetCoeffTable(i); + if ( fastNLOCoeffAddBase::CheckCoeffConstants(c,true) ) { + c->SetCodeDescription(Description); + } + } + } + + //! Add InfoBlocks with statistical uncertainty from NNLOJET + if ( !STRING_ARR(InfoBlockFiles).empty() && + !STRING_ARR(InfoBlockDescr).empty() && + !STRING_ARR(InfoBlockOrders).empty()) { + 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 NFiles = STRING_ARR(InfoBlockFiles).size(); + unsigned int NDescr = STRING_ARR(InfoBlockDescr).size(); + unsigned int NOrders = STRING_ARR(InfoBlockOrders).size(); + for ( unsigned int i = 0; i < NFiles; i++ ){ + info["fnlo-tk-modify"]<<"InfoBlock file no. " << i << " is: " << STRING_ARR(InfoBlockFiles)[i] << endl; + } + for ( unsigned int i = 0; i < NDescr; i++ ){ + info["fnlo-tk-modify"]<<"InfoBlock description no. " << i << " is: " << STRING_ARR(InfoBlockDescr)[i] << endl; + } + for ( unsigned int i = 0; i < NOrders; i++ ){ + info["fnlo-tk-modify"]<<"InfoBlock order no. " << i << " is: " << STRING_ARR(InfoBlockOrders)[i] << endl; + } + int Ncontrib = table.GetNcontrib(); + int ic = 0; + std::string Default = "Please provide description!"; + for ( int i = 0; i < Ncontrib; i++ ) { + fastNLOCoeffBase* c = table.GetCoeffTable(i); + if ( fastNLOCoeffAddBase::CheckCoeffConstants(c,true) ) { + if ( c->IsLO() ) { + info["fnlo-tk-modify"]<<"Found LO contribution " << i << endl; + int ilo = 0; + if ( NOrders > 1 ) { + for ( unsigned int j = 0; j < NFiles; j++ ) { + if (STRING_ARR(InfoBlockOrders)[j] == "LO") { + ilo = j; + } + } + } + std::vector<std::string> Description; + if ( NDescr > 1 ) { + Description.push_back(STRING_ARR(InfoBlockDescr)[ilo]); + } else if ( NDescr > 0 ) { + Description.push_back(STRING_ARR(InfoBlockDescr)[0]); + } else { + Description.push_back(Default); + } + c->AddCoeffInfoBlock(0,0,Description,STRING_ARR(InfoBlockFiles)[ilo]); + ic += 1; + } else if ( c->IsNLO() ) { + info["fnlo-tk-modify"]<<"Found NLO contribution " << i << endl; + int inlo = 0; + if ( NOrders > 1 ) { + for ( unsigned int j = 0; j < NFiles; j++ ) { + if (STRING_ARR(InfoBlockOrders)[j] == "NLO") { + inlo = j; + } + } + } + std::vector <std:: string> Description; + if ( NDescr > 1 ) { + Description.push_back(STRING_ARR(InfoBlockDescr)[inlo]); + } else if ( NDescr > 0 ) { + Description.push_back(STRING_ARR(InfoBlockDescr)[0]); + } else { + Description.push_back(Default); + } + c->AddCoeffInfoBlock(0,0,Description,STRING_ARR(InfoBlockFiles)[inlo]); + ic += 1; + } else if ( c->IsNNLO() ) { + info["fnlo-tk-modify"]<<"Found NNLO contribution " << i << endl; + int innlo = 0; + if ( NOrders > 1 ) { + for ( unsigned int j = 0; j < NFiles; j++ ) { + if (STRING_ARR(InfoBlockOrders)[j] == "NNLO") { + innlo = j; + } + } + } + std::vector <std:: string> Description; + if ( NDescr > 1 ) { + Description.push_back(STRING_ARR(InfoBlockDescr)[innlo]); + } else if ( NDescr > 0 ) { + Description.push_back(STRING_ARR(InfoBlockDescr)[0]); + } else { + Description.push_back(Default); + } + c->AddCoeffInfoBlock(0,0,Description,STRING_ARR(InfoBlockFiles)[innlo]); + ic += 1; + } else { + info["fnlo-tk-modify"]<<"Unknown contribution " << i << endl; + info["fnlo-tk-modify"]<<"Nothing changed." << endl; + } + } + } + } + + //! --- Print output table information if ( EXIST(PrintOutputA1) ) { if ( BOOL(PrintOutputA1) ) table.PrintHeader(0); } @@ -258,7 +420,7 @@ int main(int argc, char** argv) { if ( BOOL(PrintOutputA2) ) table.PrintScenario(0); } - // writing modified table + //! Writing modified table table.SetFilename(CHAR(OutTable)); table.WriteTable(); diff --git a/v2.3/toolkit/src/fnlo-tk-rootout.cc b/v2.3/toolkit/src/fnlo-tk-rootout.cc index f74747f8..b29aad49 100644 --- a/v2.3/toolkit/src/fnlo-tk-rootout.cc +++ b/v2.3/toolkit/src/fnlo-tk-rootout.cc @@ -40,7 +40,7 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); //! --- Parse commmand line @@ -83,8 +83,8 @@ int main(int argc, char** argv) { yell << _SSEPSC << endl; yell << " #" << endl; info["fnlo-tk-rootout"] << "This program evaluates a fastNLO table and" << endl; - info["fnlo-tk-rootout"] << "writes histograms with cross sections and scale or" << endl; - info["fnlo-tk-rootout"] << "PDF uncertainties into ROOT." << endl; + info["fnlo-tk-rootout"] << "writes histograms with cross sections and PDF, statistical or" << endl; + info["fnlo-tk-rootout"] << "scale uncertainties into ROOT." << endl; info["fnlo-tk-rootout"] << "" << endl; info["fnlo-tk-rootout"] << "TODO: Provide more info on histogram numbering/labelling ..." << endl; man << "" << endl; @@ -119,6 +119,7 @@ int main(int argc, char** argv) { man << " \"scale21\", i.e. mur=scale2, muf=scale1," << endl; man << " \"kProd\", i.e. mur=muf=scale1*scale2," << endl; man << " \"kQuadraticSum\", i.e. mur=muf=sqrt(scale1^2+scale2^2)." << endl; + man << "[Verbosity]: Set verbosity level of table evaluation [DEBUG,INFO,WARNING,ERROR], def. = WARNING" << endl; yell << " #" << endl; man << "Use \"_\" to skip changing a default argument." << endl; yell << " #" << endl; @@ -142,8 +143,9 @@ int main(int argc, char** argv) { } //! --- Uncertainty choice - EScaleUncertaintyStyle eScaleUnc = kScaleNone; EPDFUncertaintyStyle ePDFUnc = kPDFNone; + EAddUncertaintyStyle eAddUnc = kAddNone; + EScaleUncertaintyStyle eScaleUnc = kScaleNone; string chunc = "none"; if (argc > 3) { chunc = (const char*) argv[3]; @@ -228,12 +230,28 @@ int main(int argc, char** argv) { shout["fnlo-tk-rootout"] << "Using scale definition "+chflex+"." << endl; } - //! --- Too many arguments + //--- Set verbosity level of table evaluation + string VerbosityLevel = "WARNING"; if (argc > 7) { + VerbosityLevel = (const char*) argv[7]; + } + if (argc <= 7 || VerbosityLevel == "_") { + VerbosityLevel = "WARNING"; + shout["fnlo-tk-rootout"] << "No request given for verbosity level, using WARNING default." << endl; + } else { + shout["fnlo-tk-rootout"] << "Using verbosity level: " << VerbosityLevel << endl; + } + + //! --- Too many arguments + if (argc > 8) { error["fnlo-tk-rootout"] << "Too many arguments, aborting!" << endl; exit(1); } yell << _CSEPSC << endl; + //--- End of parsing arguments + + //! --- Reset verbosity level from here on + SetGlobalVerbosity(toVerbosity()[VerbosityLevel]); //! --- Prepare loop over PDF sets const int nsets = 4; @@ -258,13 +276,17 @@ int main(int argc, char** argv) { //! --- fastNLO initialisation, attach table fastNLOTable table = fastNLOTable(tablename); + //! Print essential table information table.PrintContributionSummary(0); + table.Print(0); //! Initialise a fastNLO reader instance with interface to LHAPDF //! Note: This also initializes the cross section to the LO/NLO one! fastNLOLHAPDF* fnlo = NULL; fnlo = new fastNLOLHAPDF(table,PDFFiles[0],0); + //! Store table version number + int ITabVersion = fnlo->GetITabVersionRead(); //! Check on existence of LO (Id = -1 if not existing) int ilo = fnlo->ContrId(kFixedOrder, kLeading); @@ -441,9 +463,9 @@ int main(int argc, char** argv) { //! Re-calculate cross sections for new settings fnlo->CalcCrossSection(); - //! Do PDF and scale uncertainties - unsigned int iOffs[3] = {1,6,8}; - for (unsigned int iUnc = 0; iUnc<3; iUnc++) { + //! Do PDF, statistical/numerical, and scale uncertainties + unsigned int iOffs[4] = {1,3,6,8}; + for (unsigned int iUnc = 0; iUnc<4; iUnc++) { //! Get cross section & uncertainties (only for additive perturbative contributions) XsUncertainty XsUnc; @@ -458,8 +480,19 @@ int main(int argc, char** argv) { snprintf(titlel, sizeof(titlel), "-dsigma_%s/sigma",PDFFiles[iPDF].c_str()); snprintf(titleu, sizeof(titleu), "+dsigma_%s/sigma",PDFFiles[iPDF].c_str()); } - //! 2P scale uncertainties + //! Statistical/numerical uncertainties else if ( iUnc==1 ) { + if (ITabVersion < 25000) { + info["fnlo-tk-rootout"] << "Table version " << ITabVersion << "too small; statistical uncertainties not available." << endl; + } + eAddUnc = kAddStat; + XsUnc = fnlo->GetAddUncertainty(eAddUnc, lNorm); + snprintf(buffer, sizeof(buffer), " # Relative Statistical Uncertainties (%s %s)",sOrder.c_str(),PDFFiles[iPDF].c_str()); + snprintf(titlel, sizeof(titlel), "-dsigma_stat/sigma"); + snprintf(titleu, sizeof(titleu), "+dsigma_stat/sigma"); + } + //! 2P scale uncertainties + else if ( iUnc==2 ) { eScaleUnc = kSymmetricTwoPoint; XsUnc = fnlo->GetScaleUncertainty(eScaleUnc, lNorm); snprintf(buffer, sizeof(buffer), " # 2P Relative Scale Uncertainties (%s %s)",sOrder.c_str(),PDFFiles[iPDF].c_str()); @@ -467,7 +500,7 @@ int main(int argc, char** argv) { snprintf(titleu, sizeof(titleu), "+dsigma_2P/sigma"); } //! 6P scale uncertainties - else if ( iUnc==2 ) { + else if ( iUnc==3 ) { eScaleUnc = kAsymmetricSixPoint; XsUnc = fnlo->GetScaleUncertainty(eScaleUnc, lNorm); snprintf(buffer, sizeof(buffer), " # 6P Relative Scale Uncertainties (%s %s)",sOrder.c_str(),PDFFiles[iPDF].c_str()); diff --git a/v2.3/toolkit/src/fnlo-tk-statunc.cc b/v2.3/toolkit/src/fnlo-tk-statunc.cc index 7d74f178..77ea0523 100644 --- a/v2.3/toolkit/src/fnlo-tk-statunc.cc +++ b/v2.3/toolkit/src/fnlo-tk-statunc.cc @@ -42,7 +42,7 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); //! --- Parse command line @@ -212,8 +212,7 @@ int main(int argc, char** argv) { } if (argc <= 6 || VerbosityLevel == "_") { VerbosityLevel = "WARNING"; - shout["fnlo-tk-statunc"] << "No request given for verbosity level," << endl; - shout << " using WARNING default." << endl; + shout["fnlo-tk-statunc"] << "No request given for verbosity level, using WARNING default." << endl; } else { shout["fnlo-tk-statunc"] << "Using verbosity level: " << VerbosityLevel << endl; } @@ -226,17 +225,8 @@ int main(int argc, char** argv) { yell << _CSEPSC << endl; //--- End of parsing arguments - //! --- Reset verbosity level to warning only from here on - // TODO: KR: A string to enum map or similar could come in handy here - if ( VerbosityLevel == "DEBUG" ) { - SetGlobalVerbosity(DEBUG); - } else if ( VerbosityLevel == "INFO" ) { - SetGlobalVerbosity(INFO); - } else if ( VerbosityLevel == "ERROR" ) { - SetGlobalVerbosity(ERROR); - } else { - SetGlobalVerbosity(WARNING); - } + //! --- Reset verbosity level from here on + SetGlobalVerbosity(toVerbosity()[VerbosityLevel]); //! --- Loop over selected table sample //! Initialise fastNLO instances with interface to LHAPDF diff --git a/v2.3/toolkit/src/fnlo-tk-yodaout.cc b/v2.3/toolkit/src/fnlo-tk-yodaout.cc index 497af918..9aa8ac36 100644 --- a/v2.3/toolkit/src/fnlo-tk-yodaout.cc +++ b/v2.3/toolkit/src/fnlo-tk-yodaout.cc @@ -37,7 +37,7 @@ int main(int argc, char** argv) { using namespace say; //! namespace for 'speaker.h'-verbosity levels using namespace fastNLO; //! namespace for fastNLO constants - //! --- Set verbosity level + //! --- Set initial verbosity level SetGlobalVerbosity(INFO); //! --- Parse commmand line @@ -256,7 +256,6 @@ int main(int argc, char** argv) { chflex = (const char*) argv[6]; } if (argc <= 6 || chflex == "_") { - chflex = "scale1"; shout["fnlo-tk-yodaout"] << "Using default mur=muf=scale 1." << endl; } else { shout["fnlo-tk-yodaout"] << "Using scale definition "+chflex+"." << endl; @@ -281,8 +280,7 @@ int main(int argc, char** argv) { } if (argc <= 8 || VerbosityLevel == "_") { VerbosityLevel = "WARNING"; - shout["fnlo-tk-yodaout"] << "No request given for verbosity level," << endl; - shout << " using WARNING default." << endl; + shout["fnlo-tk-yodaout"] << "No request given for verbosity level, using WARNING default." << endl; } else { shout["fnlo-tk-yodaout"] << "Using verbosity level: " << VerbosityLevel << endl; } @@ -295,22 +293,15 @@ int main(int argc, char** argv) { yell << _CSEPSC << endl; //--- End of parsing arguments - //! --- Reset verbosity level to warning only from here on - // TODO: KR: A string to enum map or similar could come in handy here - if ( VerbosityLevel == "DEBUG" ) { - SetGlobalVerbosity(DEBUG); - } else if ( VerbosityLevel == "INFO" ) { - SetGlobalVerbosity(INFO); - } else if ( VerbosityLevel == "ERROR" ) { - SetGlobalVerbosity(ERROR); - } else { - SetGlobalVerbosity(WARNING); - } + //! --- Reset verbosity level from here on + SetGlobalVerbosity(toVerbosity()[VerbosityLevel]); //! --- fastNLO initialisation, attach table fastNLOTable table = fastNLOTable(tablename); + //! Print essential table information table.PrintContributionSummary(0); + table.Print(0); //! Initialise a fastNLO reader instance //! Note: This also initializes the cross section to the LO/NLO one! -- GitLab