# Manyo Library Utsusemi module

# Find HDF5 library (HDF5_INCLUDE_DIRS can be used)
#include(FindHDF5)
find_package(HDF5 REQUIRED COMPONENTS CXX)

# Find and include swig
CMAKE_POLICY(SET CMP0086 NEW)
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
#include(FindSWIG)
#include(UseSWIG)

# Find OpenMP, GSL, Boost, zlib
find_package(OpenMP)
find_package(GSL REQUIRED)

if (POLICY CMP0167)
  cmake_policy (SET CMP0167 NEW)
endif ()
find_package(Boost 1.49.0 REQUIRED
             COMPONENTS serialization filesystem system)
find_package(ZLIB REQUIRED)

# Set compile options for Utsusemi
if (MACOS AND OpenMP_FOUND)
  set(UTSUSEMI_CXX_FLAGS ${CMAKE_CXX_FLAGS} -O3 -Xpreprocessor -Werror=return-type -Xclang -fopenmp)
elseif(MACOS)
  set(UTSUSEMI_CXX_FLAGS ${CMAKE_CXX_FLAGS} -O3 -Xpreprocessor -Werror=return-type)
elseif(UNIX)
  set(UTSUSEMI_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -O3 -shared)
endif()

# Add LibMany
add_library(Utsusemi SHARED)
target_sources(Utsusemi PRIVATE
    CaseInfoReaderBase.cc
    D4MatrixCalc.cc
    DetectorInfoEditorBase.cc
    DetectorInfoEditorNeunet.cc
    DetectorInfoEditorReadout2d.cc
    HistogramBinToPoint.cc
    NxspeFileIO.cc
    ShamotoDymPDF.cc
    T0TreatToolsNeunet.cc
    T0TreatToolsReadout.cc
    T0TreatToolsReadoutWLSF32.cc
    TofToEnergyChoppers.cc
    TofToEnergyTransfer.cc
    UtsusemiAnaEnvironReader.cc
    UtsusemiCalcContainers.cc
    UtsusemiCaseInfoReaderTrignet.cc
    UtsusemiCheckDataProcess.cc
    UtsusemiContainerTextConverter.cc
    UtsusemiD4Matrix2.cc
    UtsusemiD4Matrix.cc
    UtsusemiDetectorEfficiencyCorrection.cc
    UtsusemiDetectorInfoEditorBase.cc
    UtsusemiDetectorInfoEditorNeunet.cc
    UtsusemiEventCasesDecoderBase.cc
    UtsusemiEventCasesDecoderTemplate.cc
    UtsusemiEventDataConverterMWPC.cc
    UtsusemiEventDataConverterNeunet.cc
    UtsusemiEventDataConverterNeunetWithPH.cc
    UtsusemiEventDataConverterNeunetWithPHDep.cc
    UtsusemiEventDataConverterReadoutTemplate.cc
    UtsusemiEventDataConverterRPMT.cc
    UtsusemiEventDataConverterSample.cc
    UtsusemiEventDataConverterSimpleNeunet.cc
    UtsusemiEventDataConverterTemplate.cc
    UtsusemiEventDataConverterWLSF32.cc
    UtsusemiEventDataCreator.cc
    UtsusemiEventDataMonitorMWPC.cc
    UtsusemiEventDataMonitorNeunet.cc
    UtsusemiEventDataMonitorRPMT.cc
    UtsusemiFilterBase.cc
    UtsusemiFilterTrignet.cc
    UtsusemiGetNeunetHistogram.cc
    UtsusemiGetRPMTHistogram.cc
    UtsusemiHeader.cc
    UtsusemiNeunetEventDecoderBase.cc
    UtsusemiNeutronEventDecoderBase.cc
    UtsusemiOneTrignetStorage.cc
    UtsusemiReadoutEventDecoderTemplate.cc
    UtsusemiReadoutMWPCEventDecoder.cc
    UtsusemiReadoutRPMTEventDecoder.cc
    UtsusemiReadoutWLSF32EventDecoder.cc
    UtsusemiReductionCommon.cc
    UtsusemiReductionInEla.cc
    UtsusemiSetMask.cc
    UtsusemiSqeCalc2.cc
    UtsusemiSqeCalc.cc
    UtsusemiSqeCalcXtalParams.cc
    UtsusemiSubtractDarkBackground.cc
    UtsusemiTofOriginCorrection.cc
    UtsusemiTrignetDictionary.cc
    UtsusemiTrignetEventDecoderBase.cc
    UtsusemiUnitConverter.cc
    UtsusemiWiringInfoEditorBase.cc
    UtsusemiWiringInfoEditorNeunet.cc
    UtsusemiWiringInfoEditorTemplate.cc
    VanadiumToolsChoppers.cc
    WiringInfoConversionDictionary.cc
    WiringInfoDataBase.cc
    WiringInfoEditorBase.cc
    WiringInfoEditorNeunet.cc
    WiringInfoEditorReadout.cc
    )

target_compile_options(Utsusemi PUBLIC ${UTSUSEMI_CXX_FLAGS})

if (OpenMP_FOUND)
    target_compile_definitions(Utsusemi PUBLIC MULTH=${MANYO_MULTH} UTSUSEMIMANYOREVNUMBER=${UTSUSEMI_REVISION})
else()
    target_compile_definitions(Utsusemi PUBLIC UTSUSEMIMANYOREVNUMBER=${UTSUSEMI_REVISION})
endif()
#target_compile_features(Utsusemi PUBLIC cxx_std_11)

target_include_directories(Utsusemi PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${HDF5_INCLUDE_DIRS} ${MANYO_NEXUS_PATH}/include ${Python_INCLUDE_DIRS} ${CMAKE_INSTALL_PREFIX}/include ${CMAKE_INSTALL_PREFIX}/include/manyo ${CMAKE_INSTALL_PREFIX}/include/manyo/MLF)

target_link_directories(Utsusemi PUBLIC ${CMAKE_INSTALL_PREFIX}/${MANYO_LIB_PATH} ${ZLIB_INCLUDE_DIRS})

if (MACOS AND OpenMP_FOUND)
  target_link_libraries(Utsusemi Manyo MLF NeXus GSL::gsl Boost::serialization Boost::filesystem Boost::system Python::Python util dl omp HDF5::HDF5 ZLIB::ZLIB)
else()
  target_link_libraries(Utsusemi Manyo MLF GSL::gsl Boost::serialization Boost::filesystem Boost::system Python::Python util dl HDF5::HDF5 ZLIB::ZLIB)
endif()
target_link_options(Utsusemi PRIVATE ${CMAKE_CXX_FLAGS} ${UTSUSEMI_CXX_FLAGS})

# message("MULTH = " ${MANYO_MULTH})
# message("Library = " ${CMAKE_INSTALL_PREFIX}/lib)

# Set up swig
set_property(SOURCE Utsusemi.i PROPERTY CPLUSPLUS ON)
set_property(SOURCE Utsusemi.i PROPERTY INCLUDE_DIRECTORIES ${CMAKE_INSTALL_PREFIX}/include/manyo ${CMAKE_INSTALL_PREFIX}/include/manyo/MLF)

swig_add_library(ManyoUtsusemi
  TYPE MODULE
  LANGUAGE python
  OUTPUT_DIR ${PROJECT_BINARY_DIR}/
  SOURCES Utsusemi.i)
swig_link_libraries(ManyoUtsusemi Utsusemi)

# Install library
install(TARGETS Utsusemi
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION ${MANYO_LIB_PATH})
install(FILES CaseInfoReaderBase.hh
              D4MatrixCalc.hh
              DetectorInfoEditorBase.hh
              DetectorInfoEditorNeunet.hh
              DetectorInfoEditorReadout2d.hh
              HistogramBinToPoint.hh
              NxspeFileIO.hh
              ShamotoDymPDF.hh
              T0TreatToolsNeunet.hh
              T0TreatToolsReadout.hh
              T0TreatToolsReadoutWLSF32.hh
              TofToEnergyChoppers.hh
              TofToEnergyTransfer.hh
              UtsusemiAnaEnvironReader.hh
              UtsusemiCalcContainers.hh
              UtsusemiCaseInfoReaderTrignet.hh
              UtsusemiCheckDataProcess.hh
              UtsusemiContainerTextConverter.hh
              UtsusemiD4Matrix2.hh
              UtsusemiD4Matrix.hh
              UtsusemiDetectorEfficiencyCorrection.hh
              UtsusemiDetectorInfoEditorBase.hh
              UtsusemiDetectorInfoEditorNeunet.hh
              UtsusemiDetectorInfoEditorTemplate.hh
              UtsusemiEventCasesDecoderBase.hh
              UtsusemiEventCasesDecoderTemplate.hh
              UtsusemiEventDataConverterMWPC.hh
              UtsusemiEventDataConverterNeunet.hh
              UtsusemiEventDataConverterNeunetWithPHDep.hh
              UtsusemiEventDataConverterNeunetWithPH.hh
              UtsusemiEventDataConverterReadoutTemplate.hh
              UtsusemiEventDataConverterReadoutWLSF32Template.hh
              UtsusemiEventDataConverterRPMT.hh
              UtsusemiEventDataConverterSample.hh
              UtsusemiEventDataConverterSimpleNeunet.hh
              UtsusemiEventDataConverterTemplate.hh
              UtsusemiEventDataConverterTemplateWithPHDep.hh
              UtsusemiEventDataConverterTemplateWithPH.hh
              UtsusemiEventDataConverterWLSF32.hh
              UtsusemiEventDataCreator.hh
              UtsusemiEventDataMonitorMWPC.hh
              UtsusemiEventDataMonitorNeunet.hh
              UtsusemiEventDataMonitorRPMT.hh
              UtsusemiEventDataMonitorTemplate.hh
              UtsusemiFilterBase.hh
              UtsusemiFilterTrignet.hh
              UtsusemiGetHistogramTemplate.hh
              UtsusemiGetNeunetHistogram.hh
              UtsusemiGetRPMTHistogram.hh
              UtsusemiHeader.hh
              UtsusemiNeunetEventDecoderBase.hh
              UtsusemiNeutronEventDecoderBase.hh
              UtsusemiOneTrignetStorage.hh
              UtsusemiReadoutEventDecoderTemplate.hh
              UtsusemiReadoutMWPCEventDecoder.hh
              UtsusemiReadoutRPMTEventDecoder.hh
              UtsusemiReadoutWLSF32EventDecoder.hh
              UtsusemiReductionCommon.hh
              UtsusemiReductionInEla.hh
              UtsusemiSetMask.hh
              UtsusemiSqeCalc2.hh
              UtsusemiSqeCalc.hh
              UtsusemiSqeCalcXtalParams.hh
              UtsusemiSubtractDarkBackground.hh
              UtsusemiTofOriginCorrection.hh
              UtsusemiTrignetDictionary.hh
              UtsusemiTrignetEventDecoderBase.hh
              UtsusemiUnitConverter.hh
              UtsusemiWiringInfoEditorBase.hh
              UtsusemiWiringInfoEditorNeunet.hh
              UtsusemiWiringInfoEditorTemplate.hh
              UtsusemiWiringInfoEditorTemplate.cc
              VanadiumToolsChoppers.hh
              WiringInfoConversionDictionary.hh
              WiringInfoDataBase.hh
              WiringInfoEditorBase.hh
              WiringInfoEditorNeunet.hh
              WiringInfoEditorReadout.hh
              UtsusemiEventDataConverterTemplate.cc
              UtsusemiEventDataConverterReadoutTemplate.cc
              UtsusemiEventCasesDecoderTemplate.cc
              UtsusemiReadoutEventDecoderTemplate.cc
        DESTINATION include/manyo/Utsusemi)

# Install Manyo folder for Python
install(TARGETS ManyoUtsusemi LIBRARY DESTINATION ${MANYO_PATH}/Manyo/Utsusemi)
install(FILES ${PROJECT_BINARY_DIR}/Utsusemi.py DESTINATION ${MANYO_PATH}/Manyo/Utsusemi)
install(FILES __init__.py DESTINATION ${MANYO_PATH}/Manyo/Utsusemi)
install(FILES sample/sample.py DESTINATION share/Manyo/sample/Utsusemi)
