diff --git a/cmake/NOvARwgtSetup.cmake b/cmake/NOvARwgtSetup.cmake new file mode 100644 index 0000000..eb67270 --- /dev/null +++ b/cmake/NOvARwgtSetup.cmake @@ -0,0 +1,14 @@ +if(NOVARWGT STREQUAL "") + cmessage(FATAL_ERROR "Variable NOVARWGT is not defined. " + "The location of a pre-built NOVARWGT install must be defined either as" + " $ cmake -DNOVARWGT=/path/to/NOVARWGT or as an environment variable" + " $ export NOVARWGT=/path/to/NOVARWGT") +endif() + +LIST(APPEND EXTRA_CXX_FLAGS -D__NOVA_ENABLED__) + +LIST(APPEND RWENGINE_INCLUDE_DIRECTORIES ${NOVARWGT}/inc) + +LIST(APPEND EXTRA_LINK_DIRS ${NOVARWGT}/lib) + +LIST(APPEND EXTRA_LIBS NOvARwgt) diff --git a/cmake/ReweightEnginesSetup.cmake b/cmake/ReweightEnginesSetup.cmake index 753c11a..4a84f0e 100644 --- a/cmake/ReweightEnginesSetup.cmake +++ b/cmake/ReweightEnginesSetup.cmake @@ -1,86 +1,93 @@ # Copyright 2016 L. Pickering, P Stowell, R. Terri, C. Wilkinson, C. Wret ################################################################################ # This file is part of NUISANCE. # # NUISANCE is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # NUISANCE is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with NUISANCE. If not, see . ################################################################################ ################################## T2K ###################################### if(USE_T2K) include(${CMAKE_SOURCE_DIR}/cmake/T2KSetup.cmake) cmessage(STATUS "Using T2K Reweight engine.") set(USE_T2K TRUE CACHE BOOL "Whether to enable T2KReWeight support. Requires external libraries. " FORCE) endif() ################################## NIWG ###################################### if(USE_NIWG) include(${CMAKE_SOURCE_DIR}/cmake/NIWGSetup.cmake) cmessage(STATUS "Using NIWG Reweight engine.") set(USE_NIWG TRUE CACHE BOOL "Whether to enable (T2K) NIWG ReWeight support. Requires external libraries. " FORCE) endif() ################################## MINERvA ###################################### if(USE_MINERvA_RW) include(${CMAKE_SOURCE_DIR}/cmake/MINERvASetup.cmake) cmessage(STATUS "Using MINERvA Reweight engine.") set(USE_MINERvA_RW TRUE CACHE BOOL "Whether to enable MINERvA ReWeight support. " FORCE) endif() ################################## NEUT ###################################### if(USE_NEUT) include(${CMAKE_SOURCE_DIR}/cmake/NEUTSetup.cmake) cmessage(STATUS "Using NEUT Reweight engine.") set(USE_NEUT TRUE CACHE BOOL "Whether to enable NEUT (reweight) support. Requires external libraries. " FORCE) endif() ################################# NuWro ###################################### if(USE_NuWro) include(${CMAKE_SOURCE_DIR}/cmake/NuWroSetup.cmake) cmessage(STATUS "Using NuWro Reweight engine.") set(USE_NuWro TRUE CACHE BOOL "Whether to enable NuWro support. " FORCE) endif() ################################## GENIE ##################################### if(USE_GENIE) include(${CMAKE_SOURCE_DIR}/cmake/GENIESetup.cmake) cmessage(STATUS "Using GENIE Reweight engine.") set(USE_GENIE TRUE CACHE BOOL "Whether to enable GENIE (reweight) support. Requires external libraries. " FORCE) endif() ################################################################################ +################################ NOvARwgt #################################### +if(USE_NOvARwgt) + include(${CMAKE_SOURCE_DIR}/cmake/NOvARwgtSetup.cmake) + cmessage(STATUS "Using NOvARwgt Reweight engine.") + set(USE_NOvARwgt TRUE CACHE BOOL "Whether to enable NOvARwgt (reweight) support. Requires external libraries. " FORCE) +endif() + +################################################################################ ################################ Prob3++ #################################### include(${CMAKE_SOURCE_DIR}/cmake/Prob3++Setup.cmake) ################################################################################ - cmessage(STATUS "Reweight engine include directories: ${RWENGINE_INCLUDE_DIRECTORIES}") if(NEED_ROOTEVEGEN) cmessage(STATUS "Require ROOT eve generation libraries") LIST(REVERSE ROOT_LIBS) LIST(APPEND ROOT_LIBS Gui Ged Geom TreePlayer EG Eve) LIST(REVERSE ROOT_LIBS) endif() if(NEED_ROOTPYTHIA6) cmessage(STATUS "Require ROOT Pythia6 libraries") LIST(APPEND ROOT_LIBS EGPythia6) endif() LIST(APPEND EXTRA_LIBS ${ROOT_LIBS}) diff --git a/cmake/cacheVariables.cmake b/cmake/cacheVariables.cmake index 52d5ea1..70e0763 100644 --- a/cmake/cacheVariables.cmake +++ b/cmake/cacheVariables.cmake @@ -1,220 +1,225 @@ # Copyright 2016 L. Pickering, P Stowell, R. Terri, C. Wilkinson, C. Wret ################################################################################ # This file is part of NUISANCE. # # NUISANCE is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # NUISANCE is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with NUISANCE. If not, see . ################################################################################ function(CheckAndSetDefaultEnv VARNAME DEFAULT CACHETYPE DOCSTRING ENVNAME) #cmessage(DEBUG "Trying to assign variable ${VARNAME} into the cache.") if(NOT DEFINED ${VARNAME}) if(DEFINED ENV{${ENVNAME}} AND NOT $ENV{${ENVNAME}} STREQUAL "") set(${VARNAME} $ENV{${ENVNAME}} CACHE ${CACHETYPE} ${DOCSTRING}) cmessage(DEBUG " Read ${VARNAME} from ENVVAR ${ENVNAME} as $ENV{${ENVNAME}}.") else() set(${VARNAME} ${DEFAULT} CACHE ${CACHETYPE} ${DOCSTRING}) endif() else() set(${VARNAME} ${${VARNAME}} CACHE ${CACHETYPE} ${DOCSTRING}) unset(${VARNAME}) endif() cmessage(CACHE "--Set cache variable: \"${VARNAME}\" to \"${${VARNAME}}\", in cache ${CACHETYPE}.") endfunction() function(CheckAndSetDefaultCache VARNAME DEFAULT CACHETYPE DOCSTRING) # cmessage(DEBUG "Trying to assign variable ${VARNAME} into the cache.") if(NOT DEFINED ${VARNAME}) set(${VARNAME} ${DEFAULT} CACHE ${CACHETYPE} ${DOCSTRING}) else() set(${VARNAME} ${${VARNAME}} CACHE ${CACHETYPE} ${DOCSTRING}) unset(${VARNAME}) endif() cmessage(CACHE "--Set cache variable: \"${VARNAME}\" to \"${${VARNAME}}\", in cache ${CACHETYPE}.") endfunction() function(CheckAndSetDefault VARNAME DEFAULT) # cmessage(DEBUG "Trying to assign variable ${VARNAME}.") if(NOT DEFINED ${VARNAME}) set(${VARNAME} ${DEFAULT} PARENT_SCOPE) set(${VARNAME} ${DEFAULT}) endif() cmessage(CACHE "--Set variable: \"${VARNAME}\" to \"${${VARNAME}}\".") endfunction() CheckAndSetDefaultCache(VERBOSE TRUE BOOL "Whether to configure loudly.") set (CMAKE_SKIP_BUILD_RPATH TRUE) #Changes default install path to be a subdirectory of the build dir. #Can set build dir at configure time with -DCMAKE_INSTALL_PREFIX=/install/path if(CMAKE_INSTALL_PREFIX STREQUAL "" OR CMAKE_INSTALL_PREFIX STREQUAL "/usr/local") set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}") elseif(NOT DEFINED CMAKE_INSTALL_PREFIX) set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}") endif() if(CMAKE_BUILD_TYPE STREQUAL "") set(CMAKE_BUILD_TYPE DEBUG) elseif(NOT DEFINED CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE DEBUG) endif() CheckAndSetDefaultCache(EXTRA_SETUP_SCRIPT "" PATH "The path to an extra script to inject into the NUISANCE setup script. <>") CheckAndSetDefaultCache(USE_MINIMIZER TRUE INTERNAL "Whether we are using the ROOT minimization libraries. ") CheckAndSetDefaultCache(USE_ROOT6 FALSE INTERNAL "Whether we are using the ROOT 6. ") CheckAndSetDefaultCache(USE_HEPMC FALSE BOOL "Whether to enable HepMC input support. ") CheckAndSetDefaultEnv(HEPMC "" PATH "Path to HepMC source tree root directory. Overrides environment variable \$HEPMC <>" HEPMC) CheckAndSetDefaultCache(HEPMC_MOMUNIT "GEV" STRING "HepMC momentum units [MEV|GEV]. ") CheckAndSetDefaultCache(HEPMC_LENUNIT "CM" STRING "HepMC momentum units [MM|CM]. ") CheckAndSetDefaultCache(HEPMC_USED_EP FALSE INTERNAL "Whether we built HepMC or not. ") CheckAndSetDefaultCache(USE_NEUT FALSE BOOL "Whether to enable NEUT (reweight) support. Requires external libraries. ") CheckAndSetDefaultEnv(NEUT_VERSION FALSE STRING "NEUT version string, e.g. 5.4.0. <5.4.0>" NEUT_VERSION) CheckAndSetDefaultEnv(NEUT_ROOT "" PATH "Path to NEUT source tree root directory. Overrides environment variable \$NEUT_ROOT <>" NEUT_ROOT) CheckAndSetDefaultEnv(CERN "" PATH "Path to CERNLIB source tree root directory that NEUT was built against. Overrides environment variable \$CERN <>" CERN) CheckAndSetDefaultEnv(CERN_LEVEL "" STRING "CERNLIB Library version. Overrides environment variable \$CERN_LEVEL <>" CERN_LEVEL) CheckAndSetDefaultCache(USE_NuWro FALSE BOOL "Whether to enable NuWro support. ") CheckAndSetDefaultEnv(NUWRO "" PATH "Path to NuWro source tree root directory. Overrides environment variable \$NUWRO <>" NUWRO) CheckAndSetDefaultEnv(NUWRO_INC "" PATH "Path to NuWro installed includes directory, needs to contain \"params_all.h\". Overrides environment variable \$NUWRO_INC <>" NUWRO_INC) CheckAndSetDefaultCache(NUWRO_INPUT_FILE "" FILEPATH "Path to an input NuWro event vector, which can be used to build NuWro i/o libraries. <>") CheckAndSetDefaultCache(NUWRO_BUILT_FROM_FILE FALSE INTERNAL "Whether the NuWro libraries were built by NUISANCE. ") CheckAndSetDefaultCache(USE_NuWro_RW FALSE BOOL "Whether to try and build support for NuWro reweighting. ") CheckAndSetDefaultCache(USE_NuWro_SRW_Event FALSE BOOL "Whether to use cut down NuWro reweight event format. Requires NuWro reweight. ") CheckAndSetDefaultCache(USE_GENIE FALSE BOOL "Whether to enable GENIE (reweight) support. Requires external libraries. ") CheckAndSetDefaultCache(GENIE_VERSION "AUTO" STRING "GENIE Version ") CheckAndSetDefaultEnv(GENIE "" PATH "Path to GENIE source tree root directory. Overrides environment variable \$GENIE <>" GENIE) CheckAndSetDefaultEnv(GENIE_REWEIGHT "" PATH "Path to GENIE ReWeight directory. Only relevant for GENIE v3+. Overrides environment variable \$GENIE_REWEIGHT <>" GENIE_REWEIGHT) CheckAndSetDefaultCache(GENIE_EMPMEC_REWEIGHT FALSE BOOL "Whether to use GENIE EMP MEC reweight (requires custom GENIE) ") CheckAndSetDefaultEnv(LHAPDF_LIB "" PATH "Path to pre-built LHAPDF libraries. Overrides environment variable \$LHAPDF_LIB. <>" LHAPDF_LIB) CheckAndSetDefaultEnv(LHAPDF_INC "" PATH "Path to installed LHAPDF headers. Overrides environment variable \$LHAPDF_INC. <>" LHAPDF_INC) CheckAndSetDefaultEnv(LHAPATH "" PATH "Path to LHA PDF inputs. Overrides environment variable \$LHAPATH. <>" LHAPATH) CheckAndSetDefaultEnv(LIBXML2_LIB "" PATH "Path to pre-built LIBXML2 libraries. Overrides environment variable \$LIBXML2_LIB. <>" LIBXML2_LIB) CheckAndSetDefaultEnv(LIBXML2_INC "" PATH "Path to installed LIBXML2 headers. Overrides environment variable \$LIBXML2_INC. <>" LIBXML2_INC) CheckAndSetDefaultEnv(LOG4CPP_LIB "" PATH "Path to pre-built LOG4CPP libraries. Overrides environment variable \$LOG4CPP_LIB. <>" LOG4CPP_LIB) CheckAndSetDefaultEnv(LOG4CPP_INC "" PATH "Path to installed LOG4CPP headers. Overrides environment variable \$LOG4CPP_INC. <>" LOG4CPP_INC) CheckAndSetDefaultEnv(GSL_LIB "" PATH "Path to pre-built gsl libraries. Overrides environment variable \$GSL_LIB. <>" GSL_LIB) CheckAndSetDefaultEnv(GSL_INC "" PATH "Path to installed gsl headers. Overrides environment variable \$GSL_INC. <>" GSL_INC) CheckAndSetDefaultCache(BUILD_GEVGEN FALSE BOOL "Whether to build nuisance_gevgen app.") CheckAndSetDefaultCache(USE_T2K FALSE BOOL "Whether to enable T2KReWeight support. Requires external libraries. ") CheckAndSetDefaultEnv(T2KREWEIGHT "" PATH "Path to installed T2KREWEIGHTReWeight. Overrides environment variable \$T2KREWEIGHT. <>" T2KREWEIGHT) CheckAndSetDefaultCache(USE_NIWG FALSE BOOL "Whether to enable (T2K) NIWG ReWeight support. Requires external libraries. ") CheckAndSetDefaultEnv(NIWG_ROOT "" PATH "Path to installed NIWGReWeight. Overrides environment variable \$NIWG. <>" NIWG) CheckAndSetDefaultCache(USE_MINERvA_RW FALSE BOOL "Whether to enable MINERvA ReWeight support. ") +CheckAndSetDefaultCache(USE_NOvARwgt FALSE BOOL "Whether to enable MINERvA ReWeight support. ") + +CheckAndSetDefaultEnv(NOVARWGT "" PATH "Path to directory containing libPythia6.so. Overrides environment variable \$NOVARWGT <>" NOVARWGT) + + CheckAndSetDefaultEnv(PYTHIA6 "" PATH "Path to directory containing libPythia6.so. Overrides environment variable \$PYTHIA6 <>" PYTHIA6) CheckAndSetDefaultEnv(PYTHIA8 "" PATH "Path to directory containing libPythia8.so. Overrides environment variable \$PYTHIA8 <>" PYTHIA8) CheckAndSetDefaultCache(USE_PYTHIA8 FALSE BOOL "Whether to enable PYTHIA8 event support. ") CheckAndSetDefaultCache(USE_GiBUU TRUE BOOL "Whether to enable GiBUU event support. ") CheckAndSetDefaultCache(BUILD_GiBUU FALSE BOOL "Whether to build supporting GiBUU event tools along with a patched version of GiBUU. ") CheckAndSetDefaultCache(USE_NUANCE TRUE BOOL "Whether to enable NUANCE event support. ") CheckAndSetDefaultCache(USE_PROB3PP FALSE BOOL "Whether to download and compile in Prob3++ support. ") CheckAndSetDefaultCache(NO_EXTERNAL_UPDATE FALSE BOOL "Whether to perform the update target for external dependencies. Note this may produce errors for CMake < 3.8 where a bug was fixed for the feature that this option invokes. ") CheckAndSetDefaultCache(USE_GPERFTOOLS FALSE BOOL "Whether to compile in google performance tools. ") CheckAndSetDefault(NEED_PYTHIA6 FALSE) CheckAndSetDefault(NEED_PYTHIA8 FALSE) CheckAndSetDefault(NEED_ROOTEVEGEN FALSE) CheckAndSetDefault(NEED_ROOTPYTHIA6 FALSE) CheckAndSetDefaultCache(USE_OMP FALSE BOOL "Whether to enable multicore features (there currently are none...). ") CheckAndSetDefaultCache(USE_DYNSAMPLES TRUE BOOL "Whether to enable the dynamic sample loader. ") CheckAndSetDefault(NO_EXPERIMENTS FALSE) cmessage(STATUS "NO_EXPERIMENTS: ${NO_EXPERIMENTS}") CheckAndSetDefaultCache(NO_ANL ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build ANL samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_ArgoNeuT ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build ArgoNeuT samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_BEBC ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build BEBC samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_BNL ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build BNL samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_FNAL ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build FNAL samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_GGM ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build GGM samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_K2K ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build K2K samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_MINERvA ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build MINERvA samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_MiniBooNE ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build MiniBooNE samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_T2K ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build T2K samples. <-DNO_EXPERIMENTS=FALSE>") CheckAndSetDefaultCache(NO_SciBooNE ${NO_EXPERIMENTS} BOOL "Whether to *NOT* build SciBooNE samples. <-DNO_EXPERIMENTS=FALSE>") function(SAYVARS) LIST(APPEND VARS USE_HEPMC HEPMC HEPMC_MOMUNIT HEPMC_LENUNIT HEPMC_USED_EP USE_NEUT NEUT_ROOT CERN CERN_LEVEL USE_NuWro NUWRO NUWRO_INC NUWRO_INPUT_FILE NUWRO_BUILT_FROM_FILE USE_GENIE GENIE LHAPDF_LIB LHAPDF_INC LIBXML2_LIB LIBXML2_INC LOG4CPP_LIB GENIE_LOG4CPP_INC BUILD_GEVGEN USE_T2K USE_NIWG USE_GiBUU BUILD_GiBUU USE_NUANCE NO_EXTERNAL_UPDATE USE_GPERFTOOLS NO_ANL NO_ArgoNeuT NO_BEBC NO_BNL NO_FNAL NO_GGM NO_K2K NO_MINERvA NO_MiniBooNE NO_T2K NO_SciBooNE) foreach(v ${VARS}) if(DEFINED ${v}) cmessage(DEBUG "VARIABLE: \"${v}\" = \"${${v}}\"") endif() endforeach(v) endfunction() diff --git a/cmake/setup.sh.in b/cmake/setup.sh.in index 9956d8a..caf39bd 100644 --- a/cmake/setup.sh.in +++ b/cmake/setup.sh.in @@ -1,160 +1,165 @@ # Copyright 2016 L. Pickering, P Stowell, R. Terri, C. Wilkinson, C. Wret ################################################################################ # This file is part of NUISANCE. # # NUISANCE is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # NUISANCE is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with NUISANCE. If not, see . ################################################################################ #!/bin/sh ### Adapted from https://unix.stackexchange.com/questions/4965/keep-duplicates-out-of-path-on-source function add_to_PATH () { for d; do d=$(cd -- "$d" && { pwd -P || pwd; }) 2>/dev/null # canonicalize symbolic links if [ -z "$d" ]; then continue; fi # skip nonexistent directory if [ "$d" == "/usr/bin" ] || [ "$d" == "/usr/bin64" ] || [ "$d" == "/usr/local/bin" ] || [ "$d" == "/usr/local/bin64" ]; then case ":$PATH:" in *":$d:"*) :;; *) export PATH=$PATH:$d;; esac else case ":$PATH:" in *":$d:"*) :;; *) export PATH=$d:$PATH;; esac fi done } function add_to_LD_LIBRARY_PATH () { for d; do d=$(cd -- "$d" && { pwd -P || pwd; }) 2>/dev/null # canonicalize symbolic links if [ -z "$d" ]; then continue; fi # skip nonexistent directory if [ "$d" == "/usr/lib" ] || [ "$d" == "/usr/lib64" ] || [ "$d" == "/usr/local/lib" ] || [ "$d" == "/usr/local/lib64" ]; then case ":$LD_LIBRARY_PATH:" in *":$d:"*) :;; *) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$d;; esac else case ":$LD_LIBRARY_PATH:" in *":$d:"*) :;; *) export LD_LIBRARY_PATH=$d:$LD_LIBRARY_PATH;; esac fi done } if [ "@EXTRA_SETUP_SCRIPT@" ]; then if [ ! -e @EXTRA_SETUP_SCRIPT@ ]; then echo "[WARN]: Extra setup script \"@EXTRA_SETUP_SCRIPT@\" requested, but could not be found. Skipping..." else echo "[INFO]: Sourcing extra setup from \"@EXTRA_SETUP_SCRIPT@\"." . @EXTRA_SETUP_SCRIPT@ fi fi add_to_PATH "@CMAKE_INSTALL_PREFIX@/bin" add_to_LD_LIBRARY_PATH "@CMAKE_INSTALL_PREFIX@/lib" if [ ! "${ROOTSYS}" ]; then echo "[INFO]: Sourcing ROOT from: @CMAKE_ROOTSYS@" source "@CMAKE_ROOTSYS@/bin/thisroot.sh" fi if [ "@USE_T2K@" != "FALSE" ]; then echo "[INFO]: Adding T2K paths to the environment." export T2KREWEIGHT=@T2KREWEIGHT@ add_to_LD_LIBRARY_PATH "@T2KREWEIGHT@/lib" fi if [ "@USE_NIWG@" != "FALSE" ]; then echo "[INFO]: Adding NIWG paths to the environment." export NIWG=@NIWG_ROOT@ export NIWGREWEIGHT_INPUTS=@NIWG_ROOT@/inputs add_to_LD_LIBRARY_PATH "@NIWG_ROOT@" fi if [ "@USE_NEUT@" != "FALSE" ]; then echo "[INFO]: Adding NEUT library paths to the environment." export NEUT_ROOT=@NEUT_ROOT@ export CERN=@CERN@ export CERN_LEVEL=@CERN_LEVEL@ add_to_LD_LIBRARY_PATH "${NEUT_LIB_DIR}" "${NEUT_ROOT}/src/reweight" fi if [ "@USE_NuWro@" != "FALSE" ]; then if [ "@NUWRO_BUILT_FROM_FILE@" == "FALSE" ]; then echo "[INFO]: Adding NuWro library paths to the environment." export NUWRO="@NUWRO@" add_to_PATH "@NUWRO@/bin" add_to_LD_LIBRARY_PATH "@NUWRO@/build/@CMAKE_SYSTEM_NAME@/lib" if [ "@NUWRO_INC@" ]; then export NUWRO_INC=@NUWRO_INC@ fi else echo "[INFO]: NuWro support included from input event file." fi fi if [ "@NEED_PYTHIA6@" != "FALSE" ]; then echo "[INFO]: Adding PYTHIA6 library paths to the environment." export PYTHIA6="@PYTHIA6@" add_to_LD_LIBRARY_PATH "@PYTHIA6@" fi if [ "@USE_GENIE@" != "FALSE" ]; then echo "[INFO]: Adding GENIE paths to the environment." export GENIE="@GENIE@" export LHAPDF_LIB="@LHAPDF_LIB@" export LHAPDF_INC="@LHAPDF_INC@" export LIBXML2_LIB="@LIBXML2_LIB@" export LIBXML2_INC="@LIBXML2_INC@" export LOG4CPP_LIB="@LOG4CPP_LIB@" export LOG4CPP_INC="@LOG4CPP_INC@" if [ "@LHAPATH@" ]; then export LHAPATH="@LHAPATH@" fi add_to_PATH "@GENIE@/bin" add_to_LD_LIBRARY_PATH "@GENIE@/lib" "@LHAPDF_LIB@" "@LIBXML2_LIB@" "@LOG4CPP_LIB@" if [ "@GENIE_REWEIGHT@" ]; then export GENIE_REWEIGHT="@GENIE_REWEIGHT@" add_to_LD_LIBRARY_PATH "@GENIE_REWEIGHT@/lib" fi fi if [ "@BUILD_GiBUU@" != "FALSE" ]; then echo "[INFO]: Sourcing GiBUU tools." source @CMAKE_BINARY_DIR@/GiBUUTools/src/GiBUUTools-build/Linux/setup.sh fi +if [ "@USE_NOvARwgt@" != "FALSE" ]; then + export NOVARWGT=@NOVARWGT@ + add_to_LD_LIBRARY_PATH @NOVARWGT@/lib +fi + export NUISANCE="@CMAKE_SOURCE_DIR@" diff --git a/src/Reweight/CMakeLists.txt b/src/Reweight/CMakeLists.txt index 55b9fef..5ca22b8 100644 --- a/src/Reweight/CMakeLists.txt +++ b/src/Reweight/CMakeLists.txt @@ -1,83 +1,91 @@ # Copyright 2016 L. Pickering, P Stowell, R. Terri, C. Wilkinson, C. Wret ################################################################################ # This file is part of NUISANCE. # # NUISANCE is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # NUISANCE is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with NUISANCE. If not, see . ################################################################################ set(IMPLFILES GlobalDialList.cxx FitWeight.cxx WeightEngineBase.cxx NEUTWeightEngine.cxx NuWroWeightEngine.cxx GENIEWeightEngine.cxx WeightUtils.cxx SampleNormEngine.cxx LikelihoodWeightEngine.cxx SplineWeightEngine.cxx NUISANCESyst.cxx T2KWeightEngine.cxx NUISANCEWeightEngine.cxx NUISANCEWeightCalcs.cxx NIWGWeightEngine.cxx OscWeightEngine.cxx MINERvAWeightCalcs.cxx weightRPA.h ) +if(USE_NOvARwgt) + LIST(APPEND IMPLFILES NOvARwgtEngine.cxx) +endif() + set(HEADERFILES GlobalDialList.h FitWeight.h WeightEngineBase.h NEUTWeightEngine.h NuWroWeightEngine.h GENIEWeightEngine.h WeightUtils.h SampleNormEngine.h LikelihoodWeightEngine.h SplineWeightEngine.h NUISANCESyst.h T2KWeightEngine.h NUISANCEWeightEngine.h NUISANCEWeightCalcs.h NIWGWeightEngine.h OscWeightEngine.h MINERvAWeightCalcs.h weightRPA.h ) +if(USE_NOvARwgt) + LIST(APPEND HEADERFILES NOvARwgtEngine.h) +endif() + set(LIBNAME Reweight) if(CMAKE_BUILD_TYPE MATCHES DEBUG) add_library(${LIBNAME} STATIC ${IMPLFILES}) else(CMAKE_BUILD_TYPE MATCHES RELEASE) add_library(${LIBNAME} SHARED ${IMPLFILES}) endif() include_directories(${MINIMUM_INCLUDE_DIRECTORIES}) set_target_properties(${LIBNAME} PROPERTIES VERSION "${ExtFit_VERSION_MAJOR}.${ExtFit_VERSION_MINOR}.${ExtFit_VERSION_REVISION}") #set_target_properties(${LIBNAME} PROPERTIES LINK_FLAGS ${ROOT_LD_FLAGS}) if(DEFINED PROJECTWIDE_EXTRA_DEPENDENCIES) add_dependencies(${LIBNAME} ${PROJECTWIDE_EXTRA_DEPENDENCIES}) endif() install(TARGETS ${LIBNAME} DESTINATION lib) #Can uncomment this to install the headers... but is it really neccessary? install(FILES ${HEADERFILES} DESTINATION include) set(MODULETargets ${MODULETargets} ${LIBNAME} PARENT_SCOPE) diff --git a/src/Reweight/FitWeight.cxx b/src/Reweight/FitWeight.cxx index 36964a8..863d143 100644 --- a/src/Reweight/FitWeight.cxx +++ b/src/Reweight/FitWeight.cxx @@ -1,275 +1,284 @@ #include "FitWeight.h" #include "GENIEWeightEngine.h" #include "LikelihoodWeightEngine.h" #include "ModeNormEngine.h" #include "NEUTWeightEngine.h" #include "NIWGWeightEngine.h" #include "NUISANCEWeightEngine.h" #include "NuWroWeightEngine.h" #include "OscWeightEngine.h" #include "SampleNormEngine.h" #include "SplineWeightEngine.h" #include "T2KWeightEngine.h" +#ifdef __NOVA_ENABLED__ +#include "NOvARwgtEngine.h" +#endif + void FitWeight::AddRWEngine(int type) { LOG(FIT) << "Adding reweight engine " << type << std::endl; switch (type) { - case kNEUT: - fAllRW[type] = new NEUTWeightEngine("neutrw"); - break; - - case kNUWRO: - fAllRW[type] = new NuWroWeightEngine("nuwrorw"); - break; - - case kGENIE: - fAllRW[type] = new GENIEWeightEngine("genierw"); - break; - - case kNORM: - fAllRW[type] = new SampleNormEngine("normrw"); - break; - - case kLIKEWEIGHT: - fAllRW[type] = new LikelihoodWeightEngine("likerw"); - break; - - case kT2K: - fAllRW[type] = new T2KWeightEngine("t2krw"); - break; - - case kCUSTOM: - fAllRW[type] = new NUISANCEWeightEngine("nuisrw"); - break; - - case kSPLINEPARAMETER: - fAllRW[type] = new SplineWeightEngine("splinerw"); - break; - - case kNIWG: - fAllRW[type] = new NIWGWeightEngine("niwgrw"); - break; - case kOSCILLATION: - fAllRW[type] = new OscWeightEngine(); - break; - case kMODENORM: - fAllRW[type] = new ModeNormEngine(); - break; - default: - THROW("CANNOT ADD RW Engine for unknown dial type: " << type); - break; + case kNEUT: + fAllRW[type] = new NEUTWeightEngine("neutrw"); + break; + + case kNUWRO: + fAllRW[type] = new NuWroWeightEngine("nuwrorw"); + break; + + case kGENIE: + fAllRW[type] = new GENIEWeightEngine("genierw"); + break; + + case kNORM: + fAllRW[type] = new SampleNormEngine("normrw"); + break; + + case kLIKEWEIGHT: + fAllRW[type] = new LikelihoodWeightEngine("likerw"); + break; + + case kT2K: + fAllRW[type] = new T2KWeightEngine("t2krw"); + break; + + case kCUSTOM: + fAllRW[type] = new NUISANCEWeightEngine("nuisrw"); + break; + + case kSPLINEPARAMETER: + fAllRW[type] = new SplineWeightEngine("splinerw"); + break; + + case kNIWG: + fAllRW[type] = new NIWGWeightEngine("niwgrw"); + break; + case kOSCILLATION: + fAllRW[type] = new OscWeightEngine(); + break; + case kMODENORM: + fAllRW[type] = new ModeNormEngine(); + break; + case kNOvARWGT: + fAllRW[type] = new NOvARwgtEngine(); + break; + default: + THROW("CANNOT ADD RW Engine for unknown dial type: " << type); + break; } } -WeightEngineBase* FitWeight::GetRWEngine(int type) { +WeightEngineBase *FitWeight::GetRWEngine(int type) { if (HasRWEngine(type)) { return fAllRW[type]; } THROW("CANNOT get RW Engine for dial type: " << type); } bool FitWeight::HasRWEngine(int type) { switch (type) { - case kNEUT: - case kNUWRO: - case kGENIE: - case kNORM: - case kLIKEWEIGHT: - case kT2K: - case kCUSTOM: - case kSPLINEPARAMETER: - case kNIWG: - case kOSCILLATION: { - return fAllRW.count(type); - } - default: { THROW("CANNOT get RW Engine for dial type: " << type); } + case kNEUT: + case kNUWRO: + case kGENIE: + case kNORM: + case kLIKEWEIGHT: + case kT2K: + case kCUSTOM: + case kSPLINEPARAMETER: + case kNIWG: + case kOSCILLATION: + case kNOvARWGT: { + return fAllRW.count(type); + } + default: { THROW("CANNOT get RW Engine for dial type: " << type); } } } void FitWeight::IncludeDial(std::string name, std::string type, double val) { // Should register the dial here. int typeenum = Reweight::ConvDialType(type); IncludeDial(name, typeenum, val); } void FitWeight::IncludeDial(std::string name, int dialtype, double val) { // Get the dial enum int nuisenum = Reweight::ConvDial(name, dialtype); if (nuisenum == -1) { THROW("NUISENUM == " << nuisenum << " for " << name); } // Setup RW Engine Pointer if (fAllRW.find(dialtype) == fAllRW.end()) { AddRWEngine(dialtype); } - WeightEngineBase* rw = fAllRW[dialtype]; + WeightEngineBase *rw = fAllRW[dialtype]; // Include the dial rw->IncludeDial(name, val); // Set Dial Value if (val != -9999.9) { rw->SetDialValue(name, val); } // Sort Maps fAllEnums[name] = nuisenum; fAllValues[nuisenum] = val; // Sort Lists fNameList.push_back(name); fEnumList.push_back(nuisenum); fValueList.push_back(val); } void FitWeight::Reconfigure(bool silent) { // Reconfigure all added RW engines - for (std::map::iterator iter = fAllRW.begin(); + for (std::map::iterator iter = fAllRW.begin(); iter != fAllRW.end(); iter++) { (*iter).second->Reconfigure(silent); } } void FitWeight::SetDialValue(std::string name, double val) { // Add extra check, if name not found look for one with name in it. int nuisenum = fAllEnums[name]; SetDialValue(nuisenum, val); } // Allow for name aswell using GlobalList to determine sample name. void FitWeight::SetDialValue(int nuisenum, double val) { // Conv dial type int dialtype = Reweight::GetDialType(nuisenum); if (fAllRW.find(dialtype) == fAllRW.end()) { THROW("Cannot find RW Engine for dialtype = " << dialtype << ", " << Reweight::RemoveDialType(nuisenum)); } // Get RW Engine for this dial fAllRW[dialtype]->SetDialValue(nuisenum, val); fAllValues[nuisenum] = val; // Update ValueList for (size_t i = 0; i < fEnumList.size(); i++) { if (fEnumList[i] == nuisenum) { fValueList[i] = val; } } } -void FitWeight::SetAllDials(const double* x, int n) { +void FitWeight::SetAllDials(const double *x, int n) { for (size_t i = 0; i < (UInt_t)n; i++) { int rwenum = fEnumList[i]; SetDialValue(rwenum, x[i]); } Reconfigure(); } double FitWeight::GetDialValue(std::string name) { // Add extra check, if name not found look for one with name in it. int nuisenum = fAllEnums[name]; return GetDialValue(nuisenum); } double FitWeight::GetDialValue(int nuisenum) { return fAllValues[nuisenum]; } int FitWeight::GetDialPos(std::string name) { int rwenum = fAllEnums[name]; return GetDialPos(rwenum); } int FitWeight::GetDialPos(int nuisenum) { for (size_t i = 0; i < fEnumList.size(); i++) { if (fEnumList[i] == nuisenum) { return i; } } ERR(FTL) << "No Dial Found! " << std::endl; throw; return -1; } bool FitWeight::DialIncluded(std::string name) { return (fAllEnums.find(name) != fAllEnums.end()); } bool FitWeight::DialIncluded(int rwenum) { return (fAllValues.find(rwenum) != fAllValues.end()); } -double FitWeight::CalcWeight(BaseFitEvt* evt) { +double FitWeight::CalcWeight(BaseFitEvt *evt) { double rwweight = 1.0; - for (std::map::iterator iter = fAllRW.begin(); + for (std::map::iterator iter = fAllRW.begin(); iter != fAllRW.end(); iter++) { double w = (*iter).second->CalcWeight(evt); rwweight *= w; } return rwweight; } -void FitWeight::UpdateWeightEngine(const double* x) { +void FitWeight::UpdateWeightEngine(const double *x) { size_t count = 0; for (std::vector::iterator iter = fEnumList.begin(); iter != fEnumList.end(); iter++) { SetDialValue((*iter), x[count]); count++; } } -void FitWeight::GetAllDials(double* x, int n) { +void FitWeight::GetAllDials(double *x, int n) { for (int i = 0; i < n; i++) { x[i] = GetDialValue(fEnumList[i]); } } // bool FitWeight::NeedsEventReWeight(const double* x) { // bool haschange = false; // size_t count = 0; // // Compare old to new and decide if RW needed. // for (std::vector::iterator iter = fEnumList.begin(); // iter != fEnumList.end(); iter++) { // int nuisenum = (*iter); // int type = (nuisenum / 1000) - (nuisenum % 1000); // // Compare old to new // double oldval = GetDialValue(nuisenum); // double newval = x[count]; // if (oldval != newval) { // if (fAllRW[type]->NeedsEventReWeight()) { // haschange = true; // } // } // count++; // } // return haschange; // } double FitWeight::GetSampleNorm(std::string name) { - if (name.empty()) return 1.0; + if (name.empty()) + return 1.0; // Find norm dial if (fAllEnums.find(name + "_norm") != fAllEnums.end()) { if (fAllValues.find(fAllEnums[name + "_norm"]) != fAllValues.end()) { return fAllValues[fAllEnums[name + "_norm"]]; } else { return 1.0; } } else { return 1.0; } } void FitWeight::Print() { LOG(REC) << "Fit Weight State: " << std::endl; for (size_t i = 0; i < fNameList.size(); i++) { LOG(REC) << " -> Par " << i << ". " << fNameList[i] << " " << fValueList[i] << std::endl; } } diff --git a/src/Reweight/NOvARwgtEngine.cxx b/src/Reweight/NOvARwgtEngine.cxx new file mode 100644 index 0000000..31c2afd --- /dev/null +++ b/src/Reweight/NOvARwgtEngine.cxx @@ -0,0 +1,252 @@ +#include "NOvARwgtEngine.h" + +#include "NOvARwgt/interfaces/GenieInterface.h" + +#include "NOvARwgt/rwgt/genie/QE/MAQEWgts.h" +#include "NOvARwgt/rwgt/genie/QE/RPAWeights.h" + +#include "NOvARwgt/rwgt/genie/MEC/EmpiricalMECOtherTunes.h" +#include "NOvARwgt/rwgt/genie/MEC/EmpiricalMECTune2017.h" +#include "NOvARwgt/rwgt/genie/MEC/EmpiricalMECTune2018.h" +#include "NOvARwgt/rwgt/genie/MEC/EmpiricalMECTuneSA.h" + +#include "NOvARwgt/rwgt/genie/DIS/HighWDISWeight.h" +#include "NOvARwgt/rwgt/genie/DIS/Nonres1piWeights.h" + +#include "NOvARwgt/rwgt/EventRecord.h" +#include "NOvARwgt/rwgt/IWeightGenerator.h" + +static size_t const kRPAWeightCCQESA = 0; +static size_t const kRPAWeightCCQE_2017 = 1; +static size_t const kRPAWeightQ2_2017 = 2; +static size_t const kMAQEWeight_2018 = 3; +static size_t const kTufts2p2hWgtSA = 4; +static size_t const kEmpiricalMEC_to_Valencia_Wgt = 5; +static size_t const kEmpiricalMECWgt2018 = 6; +static size_t const kMECEnuShapeWgt = 7; +static size_t const kMECInitStateNPFracWgt = 8; +static size_t const kEmpiricalMECWgt2017 = 9; +static size_t const kEmpiricalMEC_to_GENIEQE_Wgt = 10; +static size_t const kEmpiricalMEC_to_GENIERES_Wgt = 11; +static size_t const kEmpiricalMECWgt2018RPAFix = 12; +static size_t const kMEC2018_QElike_Wgt = 13; +static size_t const kMEC2018_RESlike_Wgt = 14; +static size_t const kMEC2018RPAFix_QElike_Wgt = 15; +static size_t const kMEC2018RPAFix_RESlike_Wgt = 16; +static size_t const kNonres1PiWgt = 17; +static size_t const kHighWDISWgt_2018 = 18; +static size_t const kNoSuchWeightEngine = std::numeric_limits::max(); + +size_t NOvARwgtEngine::GetWeightGeneratorIndex(std::string const &strname) { + + if (strname == "RPAWeightCCQESA") { + return kRPAWeightCCQESA; + } else if (strname == "RPAWeightCCQE_2017") { + return kRPAWeightCCQE_2017; + } else if (strname == "RPAWeightQ2_2017") { + return kRPAWeightQ2_2017; + } else if (strname == "MAQEWeight_2018") { + return kMAQEWeight_2018; + } else if (strname == "Tufts2p2hWgtSA") { + return kTufts2p2hWgtSA; + } else if (strname == "EmpiricalMEC_to_Valencia_Wgt") { + return kEmpiricalMEC_to_Valencia_Wgt; + } else if (strname == "EmpiricalMECWgt2018") { + return kEmpiricalMECWgt2018; + } else if (strname == "MECEnuShapeWgt") { + return kMECEnuShapeWgt; + } else if (strname == "MECInitStateNPFracWgt") { + return kMECInitStateNPFracWgt; + } else if (strname == "EmpiricalMECWgt2017") { + return kEmpiricalMECWgt2017; + } else if (strname == "EmpiricalMEC_to_GENIEQE_Wgt") { + return kEmpiricalMEC_to_GENIEQE_Wgt; + } else if (strname == "EmpiricalMEC_to_GENIERES_Wgt") { + return kEmpiricalMEC_to_GENIERES_Wgt; + } else if (strname == "EmpiricalMECWgt2018RPAFix") { + return kEmpiricalMECWgt2018RPAFix; + } else if (strname == "MEC2018_QElike_Wgt") { + return kMEC2018_QElike_Wgt; + } else if (strname == "MEC2018_RESlike_Wgt") { + return kMEC2018_RESlike_Wgt; + } else if (strname == "MEC2018RPAFix_QElike_Wgt") { + return kMEC2018RPAFix_QElike_Wgt; + } else if (strname == "MEC2018RPAFix_RESlike_Wgt") { + return kMEC2018RPAFix_RESlike_Wgt; + } else if (strname == "Nonres1PiWgt") { + return kNonres1PiWgt; + } else if (strname == "HighWDISWgt_2018") { + return kHighWDISWgt_2018; + } + return kNoSuchWeightEngine; +} + +novarwgt::IWeightGenerator *IWeightGeneratorFactory(size_t e) { + switch (e) { + case kRPAWeightCCQESA: { + return new novarwgt::RPAWeightCCQESA(); + } + case kRPAWeightCCQE_2017: { + return new novarwgt::RPAWeightCCQE_2017("CV"); + } + case kRPAWeightQ2_2017: { + return new novarwgt::RPAWeightQ2_2017(); + } + case kMAQEWeight_2018: { + return new novarwgt::MAQEWeight_2018(); + } + case kTufts2p2hWgtSA: { + return new novarwgt::Tufts2p2hWgtSA(); + } + case kEmpiricalMEC_to_Valencia_Wgt: { + return new novarwgt::EmpiricalMEC_to_Valencia_Wgt(); + } + case kEmpiricalMECWgt2018: { + return new novarwgt::EmpiricalMECWgt2018(); + } + case kMECEnuShapeWgt: { + return new novarwgt::MECEnuShapeWgt(); + } + case kMECInitStateNPFracWgt: { + return new novarwgt::MECInitStateNPFracWgt(); + } + case kEmpiricalMECWgt2017: { + return new novarwgt::EmpiricalMECWgt2017(); + } + case kEmpiricalMEC_to_GENIEQE_Wgt: { + return new novarwgt::EmpiricalMEC_to_GENIEQE_Wgt(); + } + case kEmpiricalMEC_to_GENIERES_Wgt: { + return new novarwgt::EmpiricalMEC_to_GENIERES_Wgt(); + } + case kEmpiricalMECWgt2018RPAFix: { + return new novarwgt::EmpiricalMECWgt2018RPAFix(); + } + case kMEC2018_QElike_Wgt: { + return new novarwgt::MEC2018_QElike_Wgt(); + } + case kMEC2018_RESlike_Wgt: { + return new novarwgt::MEC2018_RESlike_Wgt(); + } + case kMEC2018RPAFix_QElike_Wgt: { + return new novarwgt::MEC2018RPAFix_QElike_Wgt(); + } + case kMEC2018RPAFix_RESlike_Wgt: { + return new novarwgt::MEC2018RPAFix_RESlike_Wgt(); + } + case kNonres1PiWgt: { + return new novarwgt::Nonres1PiWgt(); + } + case kHighWDISWgt_2018: { + return new novarwgt::HighWDISWgt_2018(); + } + default: { return nullptr; } + } +} + +void NOvARwgtEngine::IncludeDial(std::string name, double startval) { + size_t e = GetWeightGeneratorIndex(name); + if (e == kNoSuchWeightEngine) { + THROW("[ERROR]: Invalid NOvARwgt Engine name: " << name); + } + if (fWeightEngineEnums.find(e) != fWeightEngineEnums.end()) { + THROW("[ERROR]: NOvARwgt Engine name: " << name << " already included."); + } + fWeightEngineEnums[e] = fWeightEngines.size(); + fWeightEngines.push_back(IWeightGeneratorFactory(e)); + fWeightEngineValues.push_back(startval); +}; + +void NOvARwgtEngine::SetDialValue(int nuisenum, double val) { + size_t we_indx = (nuisenum % 1000); + if (!fWeightEngineEnums.count(we_indx)) { + THROW("[ERROR]: SetDialValue for NOvARwgt dial: " + << we_indx << " but that engine hasn't been included yet."); + } + size_t engine_index = fWeightEngineEnums[we_indx]; + + fWeightEngineValues[engine_index] = val; +} + +void NOvARwgtEngine::SetDialValue(std::string name, double val) { + size_t we_indx = GetWeightGeneratorIndex(name); + if (we_indx == kNoSuchWeightEngine) { + THROW("[ERROR]: Invalid NOvARwgt Engine name: " << name); + } + if (!fWeightEngineEnums.count(we_indx)) { + THROW("[ERROR]: SetDialValue for NOvARwgt dial: " + << we_indx << " but that engine hasn't been included yet."); + } + size_t engine_index = fWeightEngineEnums[we_indx]; + + fWeightEngineValues[engine_index] = val; +} + +bool NOvARwgtEngine::IsDialIncluded(std::string name) { + size_t we_indx = GetWeightGeneratorIndex(name); + if (we_indx == kNoSuchWeightEngine) { + THROW("[ERROR]: Invalid NOvARwgt Engine name: " << name); + } + return fWeightEngineEnums.count(we_indx); +} +bool NOvARwgtEngine::IsDialIncluded(int nuisenum) { + size_t we_indx = (nuisenum % 1000); + return fWeightEngineEnums.count(we_indx); +} + +double NOvARwgtEngine::GetDialValue(std::string name) { + size_t we_indx = GetWeightGeneratorIndex(name); + if (we_indx == kNoSuchWeightEngine) { + THROW("[ERROR]: Invalid NOvARwgt Engine name: " << name); + } + if (!fWeightEngineEnums.count(we_indx)) { + THROW("[ERROR]: SetDialValue for NOvARwgt dial: " + << we_indx << " but that engine hasn't been included yet."); + } + return fWeightEngineValues[fWeightEngineEnums[we_indx]]; +} +double NOvARwgtEngine::GetDialValue(int nuisenum) { + size_t we_indx = (nuisenum % 1000); + if (!fWeightEngineEnums.count(we_indx)) { + THROW("[ERROR]: SetDialValue for NOvARwgt dial: " + << we_indx << " but that engine hasn't been included yet."); + } + return fWeightEngineValues[fWeightEngineEnums[we_indx]]; +} + +double NOvARwgtEngine::CalcWeight(BaseFitEvt *evt) { + double rw_weight = 1.0; + + // Make nom weight + if (!evt) { + THROW("evt not found : " << evt); + } + + // Skip Non GENIE + if (evt->fType != kGENIE) + return 1.0; + + if (!(evt->genie_event)) { + THROW("evt->genie_event not found!" << evt->genie_event); + } + + if (!(evt->genie_event->event)) { + THROW("evt->genie_event->event GHepRecord not found!" + << (evt->genie_event->event)); + } + + novarwgt::EventRecord rcd = + novarwgt::ConvertGenieEvent(evt->genie_event->event); + + static novarwgt::InputVals const dummyparams; + + for (size_t w_it = 0; w_it < fWeightEngines.size(); ++w_it) { + if (fWeightEngineValues[w_it] == + 0) { // if a dial is set to 0, don't include its weight + continue; + } + rw_weight *= fWeightEngines[w_it]->GetWeight(rcd, dummyparams); + } + + return rw_weight; +} diff --git a/src/Reweight/NOvARwgtEngine.h b/src/Reweight/NOvARwgtEngine.h new file mode 100644 index 0000000..ef2bf09 --- /dev/null +++ b/src/Reweight/NOvARwgtEngine.h @@ -0,0 +1,36 @@ +#pragma once + +#include "WeightEngineBase.h" + +namespace novarwgt { +class IWeightGenerator; +} + +class NOvARwgtEngine : public WeightEngineBase { +public: + NOvARwgtEngine(){}; + virtual ~NOvARwgtEngine(){}; + + static size_t GetWeightGeneratorIndex(std::string const &); + + // Functions requiring Override + void IncludeDial(std::string name, double startval); + + void SetDialValue(int nuisenum, double val); + void SetDialValue(std::string name, double val); + + bool IsDialIncluded(std::string name); + bool IsDialIncluded(int nuisenum); + + double GetDialValue(std::string name); + double GetDialValue(int nuisenum); + + void Reconfigure(bool silent){}; + + double CalcWeight(BaseFitEvt *evt); + bool NeedsEventReWeight() { return true; } + + std::map fWeightEngineEnums; + std::vector fWeightEngines; + std::vector fWeightEngineValues; +}; diff --git a/src/Reweight/WeightUtils.cxx b/src/Reweight/WeightUtils.cxx index 6beb1dc..b4d0d81 100644 --- a/src/Reweight/WeightUtils.cxx +++ b/src/Reweight/WeightUtils.cxx @@ -1,637 +1,665 @@ #include "WeightUtils.h" #include "FitLogger.h" #ifdef __T2KREW_ENABLED__ #include "T2KGenieReWeight.h" #include "T2KNIWGReWeight.h" #include "T2KNIWGUtils.h" #include "T2KNeutReWeight.h" #include "T2KNeutUtils.h" #include "T2KReWeight.h" using namespace t2krew; #endif #ifdef __NIWG_ENABLED__ #include "NIWGReWeight.h" #include "NIWGReWeight1piAngle.h" #include "NIWGReWeight2010a.h" #include "NIWGReWeight2012a.h" #include "NIWGReWeight2014a.h" #include "NIWGReWeightDeltaMass.h" #include "NIWGReWeightEffectiveRPA.h" #include "NIWGReWeightHadronMultSwitch.h" #include "NIWGReWeightMEC.h" #include "NIWGReWeightPiMult.h" #include "NIWGReWeightProtonFSIbug.h" #include "NIWGReWeightRPA.h" #include "NIWGReWeightSpectralFunc.h" #include "NIWGReWeightSplineEnu.h" #include "NIWGSyst.h" #include "NIWGSystUncertainty.h" #endif #ifdef __NEUT_ENABLED__ #include "NReWeight.h" #include "NReWeightCasc.h" #include "NReWeightNuXSecCCQE.h" #include "NReWeightNuXSecCCRES.h" #include "NReWeightNuXSecCOH.h" #include "NReWeightNuXSecDIS.h" #include "NReWeightNuXSecNC.h" #include "NReWeightNuXSecNCEL.h" #include "NReWeightNuXSecNCRES.h" #include "NReWeightNuXSecRES.h" #include "NReWeightNuclPiless.h" #include "NSyst.h" #include "NSystUncertainty.h" #include "neutpart.h" #include "neutvect.h" #endif #ifdef __NUWRO_ENABLED__ #include "event1.h" #endif #ifdef __NUWRO_REWEIGHT_ENABLED__ #include "NuwroReWeight.h" #include "NuwroReWeight_FlagNorm.h" #include "NuwroReWeight_QEL.h" #include "NuwroReWeight_SPP.h" #include "NuwroSyst.h" #include "NuwroSystUncertainty.h" #endif #ifdef __GENIE_ENABLED__ #ifdef GENIE_PRE_R3 #include "EVGCore/EventRecord.h" #include "GHEP/GHepRecord.h" -#include "ReWeight/GSyst.h" -#include "ReWeight/GSystUncertainty.h" #include "Ntuple/NtpMCEventRecord.h" #include "ReWeight/GReWeight.h" #include "ReWeight/GReWeightAGKY.h" #include "ReWeight/GReWeightDISNuclMod.h" #include "ReWeight/GReWeightFGM.h" #include "ReWeight/GReWeightFZone.h" #include "ReWeight/GReWeightINuke.h" #include "ReWeight/GReWeightNonResonanceBkg.h" #include "ReWeight/GReWeightNuXSecCCQE.h" #include "ReWeight/GReWeightNuXSecCCQEvec.h" #include "ReWeight/GReWeightNuXSecCCRES.h" #include "ReWeight/GReWeightNuXSecCOH.h" #include "ReWeight/GReWeightNuXSecDIS.h" #include "ReWeight/GReWeightNuXSecNC.h" #include "ReWeight/GReWeightNuXSecNCEL.h" #include "ReWeight/GReWeightNuXSecNCRES.h" #include "ReWeight/GReWeightResonanceDecay.h" +#include "ReWeight/GSyst.h" +#include "ReWeight/GSystUncertainty.h" #else #include "Framework/EventGen/EventRecord.h" #include "Framework/GHEP/GHepRecord.h" -#include "RwFramework/GSyst.h" -#include "RwFramework/GSystUncertainty.h" #include "Framework/Ntuple/NtpMCEventRecord.h" -#include "RwFramework/GReWeight.h" #include "RwCalculators/GReWeightAGKY.h" #include "RwCalculators/GReWeightDISNuclMod.h" #include "RwCalculators/GReWeightFGM.h" #include "RwCalculators/GReWeightFZone.h" #include "RwCalculators/GReWeightINuke.h" #include "RwCalculators/GReWeightNonResonanceBkg.h" #include "RwCalculators/GReWeightNuXSecCCQE.h" #include "RwCalculators/GReWeightNuXSecCCQEvec.h" #include "RwCalculators/GReWeightNuXSecCCRES.h" #include "RwCalculators/GReWeightNuXSecCOH.h" #include "RwCalculators/GReWeightNuXSecDIS.h" #include "RwCalculators/GReWeightNuXSecNC.h" #include "RwCalculators/GReWeightNuXSecNCEL.h" #include "RwCalculators/GReWeightNuXSecNCRES.h" #include "RwCalculators/GReWeightResonanceDecay.h" +#include "RwFramework/GReWeight.h" +#include "RwFramework/GSyst.h" +#include "RwFramework/GSystUncertainty.h" #endif using namespace genie; using namespace genie::rew; #endif +#ifdef __NOVA_ENABLED__ +#include "NOvARwgtEngine.h" +#endif + #include "GlobalDialList.h" #include "ModeNormEngine.h" #include "NUISANCESyst.h" #include "OscWeightEngine.h" //******************************************************************** TF1 FitBase::GetRWConvFunction(std::string const &type, std::string const &name) { //******************************************************************** std::string dialfunc = "x"; std::string parType = type; double low = -10000.0; double high = 10000.0; - if (parType.find("parameter") == std::string::npos) parType += "_parameter"; + if (parType.find("parameter") == std::string::npos) + parType += "_parameter"; std::string line; std::ifstream card( (GeneralUtils::GetTopLevelDir() + "/parameters/dial_conversion.card") .c_str(), std::ifstream::in); while (std::getline(card >> std::ws, line, '\n')) { std::vector inputlist = GeneralUtils::ParseToStr(line, " "); // Check the line length - if (inputlist.size() < 4) continue; + if (inputlist.size() < 4) + continue; // Check whether this is a comment - if (inputlist[0].c_str()[0] == '#') continue; + if (inputlist[0].c_str()[0] == '#') + continue; // Check whether this is the correct parameter type - if (inputlist[0].compare(parType) != 0) continue; + if (inputlist[0].compare(parType) != 0) + continue; // Check the parameter name - if (inputlist[1].compare(name) != 0) continue; + if (inputlist[1].compare(name) != 0) + continue; // inputlist[2] should be the units... ignore for now dialfunc = inputlist[3]; // High and low are optional, check whether they exist - if (inputlist.size() > 4) low = GeneralUtils::StrToDbl(inputlist[4]); - if (inputlist.size() > 5) high = GeneralUtils::StrToDbl(inputlist[5]); + if (inputlist.size() > 4) + low = GeneralUtils::StrToDbl(inputlist[4]); + if (inputlist.size() > 5) + high = GeneralUtils::StrToDbl(inputlist[5]); } TF1 convfunc = TF1((name + "_convfunc").c_str(), dialfunc.c_str(), low, high); return convfunc; } //******************************************************************** std::string FitBase::GetRWUnits(std::string const &type, std::string const &name) { //******************************************************************** std::string unit = "sig."; std::string parType = type; if (parType.find("parameter") == std::string::npos) { parType += "_parameter"; } std::string line; std::ifstream card( (GeneralUtils::GetTopLevelDir() + "/parameters/dial_conversion.card") .c_str(), std::ifstream::in); while (std::getline(card >> std::ws, line, '\n')) { std::vector inputlist = GeneralUtils::ParseToStr(line, " "); // Check the line length - if (inputlist.size() < 3) continue; + if (inputlist.size() < 3) + continue; // Check whether this is a comment - if (inputlist[0].c_str()[0] == '#') continue; + if (inputlist[0].c_str()[0] == '#') + continue; // Check whether this is the correct parameter type - if (inputlist[0].compare(parType) != 0) continue; + if (inputlist[0].compare(parType) != 0) + continue; // Check the parameter name - if (inputlist[1].compare(name) != 0) continue; + if (inputlist[1].compare(name) != 0) + continue; unit = inputlist[2]; break; } return unit; } //******************************************************************** double FitBase::RWAbsToSigma(std::string const &type, std::string const &name, double val) { //******************************************************************** TF1 f1 = GetRWConvFunction(type, name); double conv_val = f1.GetX(val); - if (fabs(conv_val) < 1E-10) conv_val = 0.0; + if (fabs(conv_val) < 1E-10) + conv_val = 0.0; QLOG(FIT, "AbsToSigma(" << name << ") = " << val << " -> " << conv_val); return conv_val; } //******************************************************************** double FitBase::RWSigmaToAbs(std::string const &type, std::string const &name, double val) { //******************************************************************** TF1 f1 = GetRWConvFunction(type, name); double conv_val = f1.Eval(val); return conv_val; } //******************************************************************** double FitBase::RWFracToSigma(std::string const &type, std::string const &name, double val) { //******************************************************************** TF1 f1 = GetRWConvFunction(type, name); double conv_val = f1.GetX((val * f1.Eval(0.0))); - if (fabs(conv_val) < 1E-10) conv_val = 0.0; + if (fabs(conv_val) < 1E-10) + conv_val = 0.0; return conv_val; } //******************************************************************** double FitBase::RWSigmaToFrac(std::string const &type, std::string const &name, double val) { //******************************************************************** TF1 f1 = GetRWConvFunction(type, name); double conv_val = f1.Eval(val) / f1.Eval(0.0); return conv_val; } int FitBase::ConvDialType(std::string const &type) { if (!type.compare("neut_parameter")) return kNEUT; else if (!type.compare("niwg_parameter")) return kNIWG; else if (!type.compare("nuwro_parameter")) return kNUWRO; else if (!type.compare("t2k_parameter")) return kT2K; else if (!type.compare("genie_parameter")) return kGENIE; else if (!type.compare("custom_parameter")) return kCUSTOM; else if (!type.compare("norm_parameter")) return kNORM; else if (!type.compare("likeweight_parameter")) return kLIKEWEIGHT; else if (!type.compare("spline_parameter")) return kSPLINEPARAMETER; else if (!type.compare("osc_parameter")) return kOSCILLATION; else if (!type.compare("modenorm_parameter")) return kMODENORM; + else if (!type.compare("nova_parameter")) + return kNOvARWGT; else return kUNKNOWN; } std::string FitBase::ConvDialType(int type) { switch (type) { - case kNEUT: { - return "neut_parameter"; - } - case kNIWG: { - return "niwg_parameter"; - } - case kNUWRO: { - return "nuwro_parameter"; - } - case kT2K: { - return "t2k_parameter"; - } - case kGENIE: { - return "genie_parameter"; - } - case kNORM: { - return "norm_parameter"; - } - case kCUSTOM: { - return "custom_parameter"; - } - case kLIKEWEIGHT: { - return "likeweight_parameter"; - } - case kSPLINEPARAMETER: { - return "spline_parameter"; - } - case kOSCILLATION: { - return "osc_parameter"; - } - case kMODENORM: { - return "modenorm_parameter"; - } - default: - return "unknown_parameter"; + case kNEUT: { + return "neut_parameter"; + } + case kNIWG: { + return "niwg_parameter"; + } + case kNUWRO: { + return "nuwro_parameter"; + } + case kT2K: { + return "t2k_parameter"; + } + case kGENIE: { + return "genie_parameter"; + } + case kNORM: { + return "norm_parameter"; + } + case kCUSTOM: { + return "custom_parameter"; + } + case kLIKEWEIGHT: { + return "likeweight_parameter"; + } + case kSPLINEPARAMETER: { + return "spline_parameter"; + } + case kOSCILLATION: { + return "osc_parameter"; + } + case kMODENORM: { + return "modenorm_parameter"; + } + case kNOvARWGT: { + return "nova_parameter"; + } + default: + return "unknown_parameter"; } } int FitBase::GetDialEnum(std::string const &type, std::string const &name) { return FitBase::GetDialEnum(FitBase::ConvDialType(type), name); } int FitBase::GetDialEnum(int type, std::string const &name) { int offset = type * 1000; - int this_enum = Reweight::kNoDialFound; // Not Found + int this_enum = Reweight::kNoDialFound; // Not Found QLOG(DEB, "Getting dial enum " << type << " " << name); // Select Types switch (type) { - // NEUT DIAL TYPE - case kNEUT: { + // NEUT DIAL TYPE + case kNEUT: { #ifdef __NEUT_ENABLED__ - int neut_enum = (int)neut::rew::NSyst::FromString(name); - if (neut_enum != 0) { - this_enum = neut_enum + offset; - } + int neut_enum = (int)neut::rew::NSyst::FromString(name); + if (neut_enum != 0) { + this_enum = neut_enum + offset; + } #else - this_enum = Reweight::kNoTypeFound; // Not enabled + this_enum = Reweight::kNoTypeFound; // Not enabled #endif - break; - } + break; + } - // NIWG DIAL TYPE - case kNIWG: { + // NIWG DIAL TYPE + case kNIWG: { #ifdef __NIWG_ENABLED__ - int niwg_enum = (int)niwg::rew::NIWGSyst::FromString(name); - if (niwg_enum != 0) { - this_enum = niwg_enum + offset; - } + int niwg_enum = (int)niwg::rew::NIWGSyst::FromString(name); + if (niwg_enum != 0) { + this_enum = niwg_enum + offset; + } #else - this_enum = Reweight::kNoTypeFound; + this_enum = Reweight::kNoTypeFound; #endif - break; - } + break; + } - // NUWRO DIAL TYPE - case kNUWRO: { + // NUWRO DIAL TYPE + case kNUWRO: { #ifdef __NUWRO_REWEIGHT_ENABLED__ - int nuwro_enum = (int)nuwro::rew::NuwroSyst::FromString(name); - if (nuwro_enum > 0) { - this_enum = nuwro_enum + offset; - } + int nuwro_enum = (int)nuwro::rew::NuwroSyst::FromString(name); + if (nuwro_enum > 0) { + this_enum = nuwro_enum + offset; + } #else - this_enum = Reweight::kNoTypeFound; + this_enum = Reweight::kNoTypeFound; #endif - } + } - // GENIE DIAL TYPE - case kGENIE: { + // GENIE DIAL TYPE + case kGENIE: { #ifdef __GENIE_ENABLED__ - int genie_enum = (int)genie::rew::GSyst::FromString(name); - if (genie_enum > 0) { - this_enum = genie_enum + offset; - } + int genie_enum = (int)genie::rew::GSyst::FromString(name); + if (genie_enum > 0) { + this_enum = genie_enum + offset; + } #else - this_enum = Reweight::kNoTypeFound; + this_enum = Reweight::kNoTypeFound; #endif - break; - } + break; + } - case kCUSTOM: { - int custom_enum = 0; // PLACEHOLDER - this_enum = custom_enum + offset; - break; - } + case kCUSTOM: { + int custom_enum = 0; // PLACEHOLDER + this_enum = custom_enum + offset; + break; + } - // T2K DIAL TYPE - case kT2K: { + // T2K DIAL TYPE + case kT2K: { #ifdef __T2KREW_ENABLED__ - int t2k_enum = (int)t2krew::T2KSyst::FromString(name); - if (t2k_enum > 0) { - this_enum = t2k_enum + offset; - } + int t2k_enum = (int)t2krew::T2KSyst::FromString(name); + if (t2k_enum > 0) { + this_enum = t2k_enum + offset; + } #else - this_enum = Reweight::kNoTypeFound; + this_enum = Reweight::kNoTypeFound; #endif - break; - } + break; + } - case kNORM: { - if (gNormEnums.find(name) == gNormEnums.end()) { - gNormEnums[name] = gNormEnums.size() + 1 + offset; - } - this_enum = gNormEnums[name]; - break; + case kNORM: { + if (gNormEnums.find(name) == gNormEnums.end()) { + gNormEnums[name] = gNormEnums.size() + 1 + offset; } + this_enum = gNormEnums[name]; + break; + } - case kLIKEWEIGHT: { - if (gLikeWeightEnums.find(name) == gLikeWeightEnums.end()) { - gLikeWeightEnums[name] = gLikeWeightEnums.size() + 1 + offset; - } - this_enum = gLikeWeightEnums[name]; - break; + case kLIKEWEIGHT: { + if (gLikeWeightEnums.find(name) == gLikeWeightEnums.end()) { + gLikeWeightEnums[name] = gLikeWeightEnums.size() + 1 + offset; } + this_enum = gLikeWeightEnums[name]; + break; + } - case kSPLINEPARAMETER: { - if (gSplineParameterEnums.find(name) == gSplineParameterEnums.end()) { - gSplineParameterEnums[name] = gSplineParameterEnums.size() + 1 + offset; - } - this_enum = gSplineParameterEnums[name]; - break; + case kSPLINEPARAMETER: { + if (gSplineParameterEnums.find(name) == gSplineParameterEnums.end()) { + gSplineParameterEnums[name] = gSplineParameterEnums.size() + 1 + offset; } - case kOSCILLATION: { + this_enum = gSplineParameterEnums[name]; + break; + } + case kOSCILLATION: { #ifdef __PROB3PP_ENABLED__ - int oscEnum = OscWeightEngine::SystEnumFromString(name); - if (oscEnum != 0) { - this_enum = oscEnum + offset; - } + int oscEnum = OscWeightEngine::SystEnumFromString(name); + if (oscEnum != 0) { + this_enum = oscEnum + offset; + } #else - this_enum = Reweight::kNoTypeFound; // Not enabled + this_enum = Reweight::kNoTypeFound; // Not enabled #endif + } + case kMODENORM: { + size_t us_pos = name.find_first_of('_'); + std::string numstr = name.substr(us_pos + 1); + int mode_num = std::atoi(numstr.c_str()); + LOG(FTL) << "Getting mode num " << mode_num << std::endl; + if (!mode_num) { + ERR(FTL) << "Attempting to parse dial name: \"" << name + << "\" as a mode norm dial but failed." << std::endl; + throw; } - case kMODENORM: { - size_t us_pos = name.find_first_of('_'); - std::string numstr = name.substr(us_pos + 1); - int mode_num = std::atoi(numstr.c_str()); - LOG(FTL) << "Getting mode num " << mode_num << std::endl; - if (!mode_num) { - ERR(FTL) << "Attempting to parse dial name: \"" << name - << "\" as a mode norm dial but failed." << std::endl; - throw; - } - this_enum = 60 + mode_num + offset; - break; - } + this_enum = 60 + mode_num + offset; + break; + } } // If Not Enabled if (this_enum == Reweight::kNoTypeFound) { ERR(FTL) << "RW Engine not supported for " << FitBase::ConvDialType(type) << std::endl; ERR(FTL) << "Check dial " << name << std::endl; } // If Not Found if (this_enum == Reweight::kNoDialFound) { ERR(FTL) << "Dial " << name << " not found." << std::endl; } return this_enum; } int Reweight::ConvDialType(std::string const &type) { return FitBase::ConvDialType(type); } std::string Reweight::ConvDialType(int type) { return FitBase::ConvDialType(type); } int Reweight::GetDialType(int type) { int t = (type / 1000); return t > kMODENORM ? Reweight::kNoDialFound : t; } int Reweight::RemoveDialType(int type) { return (type % 1000); } int Reweight::NEUTEnumFromName(std::string const &name) { #ifdef __NEUT_ENABLED__ int neutenum = (int)neut::rew::NSyst::FromString(name); return (neutenum > 0) ? neutenum : Reweight::kNoDialFound; #else return Reweight::kGeneratorNotBuilt; #endif } int Reweight::NIWGEnumFromName(std::string const &name) { #ifdef __NIWG_ENABLED__ int niwgenum = (int)niwg::rew::NIWGSyst::FromString(name); return (niwgenum != 0) ? niwgenum : Reweight::kNoDialFound; #else return Reweight::kGeneratorNotBuilt; #endif } int Reweight::NUWROEnumFromName(std::string const &name) { #ifdef __NUWRO_REWEIGHT_ENABLED__ int nuwroenum = (int)nuwro::rew::NuwroSyst::FromString(name); return (nuwroenum > 0) ? nuwroenum : Reweight::kNoDialFound; #else return Reweight::kGeneratorNotBuilt; #endif } int Reweight::GENIEEnumFromName(std::string const &name) { #ifdef __GENIE_ENABLED__ int genieenum = (int)genie::rew::GSyst::FromString(name); return (genieenum > 0) ? genieenum : Reweight::kNoDialFound; #else return Reweight::kGeneratorNotBuilt; #endif } int Reweight::T2KEnumFromName(std::string const &name) { #ifdef __T2KREW_ENABLED__ int t2kenum = (int)t2krew::T2KSyst::FromString(name); return (t2kenum > 0) ? t2kenum : Reweight::kNoDialFound; #else return Reweight::kGeneratorNotBuilt; #endif } int Reweight::OscillationEnumFromName(std::string const &name) { #ifdef __PROB3PP_ENABLED__ int oscEnum = OscWeightEngine::SystEnumFromString(name); return (oscEnum > 0) ? oscEnum : Reweight::kNoDialFound; #else return Reweight::kGeneratorNotBuilt; #endif } int Reweight::NUISANCEEnumFromName(std::string const &name, int type) { int nuisenum = Reweight::DialList().EnumFromNameAndType(name, type); return nuisenum; } int Reweight::CustomEnumFromName(std::string const &name) { int custenum = Reweight::ConvertNUISANCEDial(name); return custenum; } int Reweight::ConvDial(std::string const &name, std::string const &type, bool exceptions) { return Reweight::ConvDial(name, Reweight::ConvDialType(type), exceptions); } int Reweight::ConvDial(std::string const &fullname, int type, bool exceptions) { std::string name = - GeneralUtils::ParseToStr(fullname, ",")[0]; // Only use first dial given + GeneralUtils::ParseToStr(fullname, ",")[0]; // Only use first dial given // Produce offset seperating each type. int offset = type * 1000; int genenum = Reweight::kNoDialFound; switch (type) { - case kNEUT: - genenum = NEUTEnumFromName(name); - break; - - case kNIWG: - genenum = NIWGEnumFromName(name); - break; - - case kNUWRO: - genenum = NUWROEnumFromName(name); - break; - - case kGENIE: - genenum = GENIEEnumFromName(name); - break; - - case kT2K: - genenum = T2KEnumFromName(name); - break; - - case kCUSTOM: - genenum = CustomEnumFromName(name); - break; - - case kNORM: - case kLIKEWEIGHT: - case kSPLINEPARAMETER: - case kNEWSPLINE: - genenum = NUISANCEEnumFromName(name, type); - break; - - case kOSCILLATION: - genenum = OscillationEnumFromName(name); - break; - - case kMODENORM: - genenum = ModeNormEngine::SystEnumFromString(name); - break; - - default: - genenum = Reweight::kNoTypeFound; - break; + case kNEUT: + genenum = NEUTEnumFromName(name); + break; + + case kNIWG: + genenum = NIWGEnumFromName(name); + break; + + case kNUWRO: + genenum = NUWROEnumFromName(name); + break; + + case kGENIE: + genenum = GENIEEnumFromName(name); + break; + + case kT2K: + genenum = T2KEnumFromName(name); + break; + + case kCUSTOM: + genenum = CustomEnumFromName(name); + break; + + case kNORM: + case kLIKEWEIGHT: + case kSPLINEPARAMETER: + case kNEWSPLINE: + genenum = NUISANCEEnumFromName(name, type); + break; + + case kOSCILLATION: + genenum = OscillationEnumFromName(name); + break; + + case kMODENORM: + genenum = ModeNormEngine::SystEnumFromString(name); + break; + +#ifdef __NOVA_ENABLED__ + case kNOvARWGT: + genenum = NOvARwgtEngine::GetWeightGeneratorIndex(name); + break; +#endif + + default: + genenum = Reweight::kNoTypeFound; + break; } // Throw if required. if (exceptions) { // If Not Enabled if (genenum == Reweight::kGeneratorNotBuilt) { ERR(FTL) << "RW Engine not supported for " << FitBase::ConvDialType(type) << std::endl; ERR(FTL) << "Check dial " << name << std::endl; throw; } // If no type enabled if (genenum == Reweight::kNoTypeFound) { ERR(FTL) << "Type mismatch inside ConvDialEnum" << std::endl; throw; } // If Not Found if (genenum == Reweight::kNoDialFound) { ERR(FTL) << "Dial " << name << " not found." << std::endl; throw; } } // Add offset if no issue int nuisenum = genenum; if ((genenum != Reweight::kGeneratorNotBuilt) && (genenum != Reweight::kNoTypeFound) && (genenum != Reweight::kNoDialFound)) { nuisenum += offset; } // Now register dial Reweight::DialList().RegisterDialEnum(name, type, nuisenum); return nuisenum; } std::string Reweight::ConvDial(int nuisenum) { for (size_t i = 0; i < Reweight::DialList().fAllDialEnums.size(); i++) { if (Reweight::DialList().fAllDialEnums[i] == nuisenum) { return Reweight::DialList().fAllDialNames[i]; } } LOG(FIT) << "Cannot find dial with enum = " << nuisenum << std::endl; return ""; } diff --git a/src/Reweight/WeightUtils.h b/src/Reweight/WeightUtils.h index c7b044f..4af1a2d 100644 --- a/src/Reweight/WeightUtils.h +++ b/src/Reweight/WeightUtils.h @@ -1,63 +1,64 @@ #ifndef WEIGHTUTILS_H #define WEIGHTUTILS_H #include "FitEvent.h" #include "TF1.h" enum extra_reweight_types { kOSCILLATION = kLast_generator_event_type, - kMODENORM + kMODENORM, + kNOvARWGT }; namespace FitBase { TF1 GetRWConvFunction(std::string const &type, std::string const &name); std::string GetRWUnits(std::string const &type, std::string const &name); double RWSigmaToFrac(std::string const &type, std::string const &name, double val); double RWSigmaToAbs(std::string const &type, std::string const &name, double val); double RWAbsToSigma(std::string const &type, std::string const &name, double val); double RWFracToSigma(std::string const &type, std::string const &name, double val); int ConvDialType(std::string const &type); std::string ConvDialType(int type); int GetDialEnum(std::string const &type, std::string const &name); int GetDialEnum(int type, std::string const &name); static std::map gNormEnums; static std::map gLikeWeightEnums; static std::map gSplineParameterEnums; } namespace Reweight { int ConvDial(std::string const &name, std::string const &type, bool exceptions = false); int ConvDial(std::string const &name, int type, bool exceptions = false); std::string ConvDial(int nuisenum); int ConvDialType(std::string const &type); std::string ConvDialType(int type); int GetDialType(int type); int RemoveDialType(int type); int NEUTEnumFromName(std::string const &name); int NIWGEnumFromName(std::string const &name); int NUWROEnumFromName(std::string const &name); int T2KEnumFromName(std::string const &name); int GENIEEnumFromName(std::string const &name); int CustomEnumFromName(std::string const &name); int NUISANCEEnumFromName(std::string const &name, int type); int OscillationEnumFromName(std::string const &name); static const int kNoDialFound = -1; static const int kNoTypeFound = -2; static const int kGeneratorNotBuilt = -3; } #endif