diff --git a/.gitignore b/.gitignore index 06edde60b07e819b2d877afe567cf4256cc235a6..08ecc3688a6ee92e92c47442fe06d32aa5fa904c 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,4 @@ examples/cache # Working directories work build* +build/ diff --git a/README.md b/README.md index 48d0a947ff761d7a8f94d82ce840aff88e62911f..b557e9fb942a37c9b8c5f15cb2c8a33f4f2b0e75 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,80 @@ Instructions for downloading hcana can be found in the Compiling --------- + +CMake is the preferred build tool. See below for builds with scons/make which +are slightly different. + +### Compiling with CMAKE + +CMake build will do a **proper** build and install. +Here we are using the install prefix `$HOME/my_exp_soft` which is like the +standard `/usr/local`. To use it make sure you your environment is setup (e.g., +towards the end of your `.bashrc`): +``` +export PATH=$HOME/my_exp_soft/bin:$PATH +export LD_LIBRARY_PATH=$HOME/my_exp_soft/lib:$HOME/my_exp_soft/lib64:$LD_LIBRARY_PATH +``` + (ノಠ益ಠ)ノ彡┻â”â”» **Do not install into the source directories**. + +(ノ^_^)ノ┻â”â”» ┬─┬ ノ( ^_^ノ) +First you should build evio followed by podd. Here are all the steps: + + +#### Build EVIO with cmake + +``` +git clone https://github.com/whit2333/hallac_evio.git +cd hallac_evio +mkdir build && cd build +cmake ../. -DCMAKE_INSTALL_PREFIX=$HOME/my_exp_soft +make -j4 install +``` + +#### Build analyzer (PODD) + +``` +git clone https://github.com/whit2333/analyzer.git +cd analyzer +mkdir build && cd build +cmake ../. -DCMAKE_INSTALL_PREFIX=$HOME/my_exp_soft +make -j4 install +``` + +#### Build hcana + +``` +git clone https://github.com/whit2333/hcana.git +cd hcana +mkdir build && cd build +cmake ../. -DCMAKE_INSTALL_PREFIX=$HOME/my_exp_soft +make -j4 install +``` + +All done. Now you can run `hcana` and you're off to analyze. + +#### Loading the libraries into ROOT + +``` +// .rootlogon.C +{ + gSystem->AddIncludePath(" -Iinclude/podd" ); + gSystem->AddIncludePath(" -Iinclude/hcana"); + gSystem->AddIncludePath(" -Iinclude/evio" ); + gInterpreter->AddIncludePath("include/podd" ); + gInterpreter->AddIncludePath("include/hcana"); + gInterpreter->AddIncludePath("include/evio" ); + + gSystem->Load("libevioxx.so"); + gSystem->Load("libHallA.so"); + gSystem->Load("libdc.so"); + gSystem->Load("libHallC.so"); +} +``` + + +### Other builds + hcana may be compiled with either make or scons. Switching between these two build systems make require some cleanup of dependency files, binary files and other autogenerated files. diff --git a/cmake/HCANAConfig.cmake.in b/cmake/HCANAConfig.cmake.in new file mode 100644 index 0000000000000000000000000000000000000000..57b242a892bb56cb74876ab27c928a6054f5427a --- /dev/null +++ b/cmake/HCANAConfig.cmake.in @@ -0,0 +1,27 @@ +@PACKAGE_INIT@ + +include("@PACKAGE_TARGETS_INSTALL_PATH@") + +check_required_components(HCANA) + +find_package(PODD REQUIRED) +message(STATUS "Found HCANA") + +#get_filename_component(HCANA_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +#include(CMakeFindDependencyMacro) +# +#list(APPEND CMAKE_MODULE_PATH ${HCANA_CMAKE_DIR}) +# +## NOTE Had to use find_package because find_dependency does not support COMPONENTS or MODULE until 3.8.0 +# +##find_dependency(Boost 1.55 REQUIRED COMPONENTS regex) +##find_dependency(RapidJSON 1.0 REQUIRED MODULE) +##find_package(Boost 1.55 REQUIRED COMPONENTS regex) +##find_package(RapidJSON 1.0 REQUIRED MODULE) +#list(REMOVE_AT CMAKE_MODULE_PATH -1) +# +#if(NOT TARGET HCANA::PODD) +# include("${HCANA_CMAKE_DIR}/PODDTargets.cmake") +#endif() +# +#set(HCANA_LIBRARIES PODD::PODD) diff --git a/cmake/modules/CompileTimeInfo.cmake b/cmake/modules/CompileTimeInfo.cmake new file mode 100644 index 0000000000000000000000000000000000000000..3b181c05fc5b3d2b69df6ba5f8a14d7b324c912f --- /dev/null +++ b/cmake/modules/CompileTimeInfo.cmake @@ -0,0 +1,67 @@ +cmake_minimum_required(VERSION 2.8) + +# Return the date (yyyy-mm-dd) +macro(DATE RESULT) + if(WIN32) + execute_process(COMMAND "cmd" " /C date /T" OUTPUT_VARIABLE ${RESULT}) + string(REGEX REPLACE "(..)/(..)/(....).*" "\\3-\\2-\\1" ${RESULT} ${${RESULT}}) + elseif(UNIX) + execute_process(COMMAND "date" "+%Y-%m-%d" OUTPUT_VARIABLE ${RESULT}) + else() + message(SEND_ERROR "Unable to detect date") + set(${RESULT} UNKNOWN) + endif() +endmacro() + +# Return the time (hh:mm:ss) +macro(TIME RESULT) + if(WIN32) + execute_process(COMMAND "cmd" " /C echo %TIME%" OUTPUT_VARIABLE ${RESULT}) + string(REGEX REPLACE "(..:..:..),(..)" "\\1" ${RESULT} ${${RESULT}}) + elseif(UNIX) + execute_process(COMMAND "date" "+%H:%M:%S" OUTPUT_VARIABLE ${RESULT}) + else() + message(SEND_ERROR "Unable to detect time") + set(${RESULT} UNKNOWN) + endif() +endmacro() + + +execute_process(COMMAND "date" "+%b:%d:%Y" + OUTPUT_VARIABLE HCANA_BUILD_DATE + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process(COMMAND "date" "+%a %b %d %H:%M:%S %Z %Y" + OUTPUT_VARIABLE HCANA_BUILD_DATETIME + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process(COMMAND "bash" "-c" "echo $(uname -s)-$(uname -r)-$(uname -m)" + OUTPUT_VARIABLE HCANA_PLATFORM + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process(COMMAND "uname" "-n" + OUTPUT_VARIABLE HCANA_NODE + OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process(COMMAND "pwd" + OUTPUT_VARIABLE HCANA_BUILD_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process(COMMAND "whoami" + OUTPUT_VARIABLE HCANA_BUILD_USER + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process(COMMAND "bash" "-c" "echo $(git rev-parse HEAD 2>/dev/null | cut -c1-7)" + OUTPUT_VARIABLE HCANA_GIT_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process(COMMAND "bash" "-c" "echo $(${CMAKE_CXX_COMPILER} --version 2>/dev/null | head -1)" + OUTPUT_VARIABLE HCANA_CXX_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process(COMMAND "bash" "-c" "echo $(root-config --version)" + OUTPUT_VARIABLE HCANA_ROOT_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + +execute_process(COMMAND "bash" "-c" "printf '%02d%02d%02d' ${PROJECT_VERSION_MAJOR} ${PROJECT_VERSION_MINOR} ${PROJECT_VERSION_PATCH}" + OUTPUT_VARIABLE HCANA_VERCODE + OUTPUT_STRIP_TRAILING_WHITESPACE) + diff --git a/cmake/modules/FindLZ4.cmake b/cmake/modules/FindLZ4.cmake new file mode 100644 index 0000000000000000000000000000000000000000..4658a35bfa1af203da324982aa78eb53c411e409 --- /dev/null +++ b/cmake/modules/FindLZ4.cmake @@ -0,0 +1,39 @@ +# Finds liblz4. +# +# This module defines: +# LZ4_FOUND +# LZ4_INCLUDE_DIR +# LZ4_LIBRARY +# + +find_path(LZ4_INCLUDE_DIR NAMES lz4.h) +find_library(LZ4_LIBRARY NAMES lz4) + +# We require LZ4_compress_default() which was added in v1.7.0 +if (LZ4_LIBRARY) + include(CheckCSourceRuns) + set(CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIR}) + set(CMAKE_REQUIRED_LIBRARIES ${LZ4_LIBRARY}) + check_c_source_runs(" +#include <lz4.h> +int main() { + int good = (LZ4_VERSION_MAJOR > 1) || + ((LZ4_VERSION_MAJOR == 1) && (LZ4_VERSION_MINOR >= 7)); +return !good; +}" LZ4_GOOD_VERSION) + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_LIBRARIES) +endif() + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS( + LZ4 DEFAULT_MSG + LZ4_LIBRARY LZ4_INCLUDE_DIR LZ4_GOOD_VERSION) + +if (NOT LZ4_FOUND) + message(STATUS "Using third-party bundled LZ4") +else() + message(STATUS "Found LZ4: ${LZ4_LIBRARY}") +endif (NOT LZ4_FOUND) + +mark_as_advanced(LZ4_INCLUDE_DIR LZ4_LIBRARY) diff --git a/cmake/os.cmake b/cmake/os.cmake new file mode 100644 index 0000000000000000000000000000000000000000..14fc6762b7e6c94d656edc079d4b733399d9e8d5 --- /dev/null +++ b/cmake/os.cmake @@ -0,0 +1,10 @@ +## OSX/homebrew version of root6 installs its cmake macros in a non-standard +## location. This might be an issue on other systems as well. +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} $ENV{ROOTSYS}/etc/root/cmake) +endif() + +## Get rid of rpath warning on OSX +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(CMAKE_MACOSX_RPATH 1) +endif() diff --git a/cmake/root.cmake b/cmake/root.cmake new file mode 100644 index 0000000000000000000000000000000000000000..e64cbaa8cba8af5cc1f53f7420db21bf0b2304e2 --- /dev/null +++ b/cmake/root.cmake @@ -0,0 +1,20 @@ +## Override root's ROOT_GENERATE_DICTIONARY macro to be less error-prone. This +## is done by only allowing for explicitly speficied header locations/include +## directories, instead of using the full search path for this module. +function(ROOT_GENERATE_DICTIONARY dictionary) + CMAKE_PARSE_ARGUMENTS(ARG "" "" "INCLUDEDIRS;LINKDEF;OPTIONS" "" ${ARGN}) + ## Get all include directories + get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) + set(dirs ${dirs} ${ARG_INCLUDEDIRS}) + set(extra_includes "") + foreach(dir ${dirs}) + set(extra_includes ${extra_includes} "-I${dir}") + endforeach() + ## find and call ROOTCLING + find_program(ROOTCLING rootcling) + add_custom_command( + OUTPUT ${dictionary}.cxx ${dictionary}_rdict.pcm + COMMAND ${ROOTCLING} -f ${dictionary}.cxx -s ${dictionary}.pcm + ${ARG_OPTIONS} ${extra_includes} ${ARG_UNPARSED_ARGUMENTS} ${ARG_LINKDEF} + DEPENDS ${includes} ${linkdefs}) +endfunction() diff --git a/docs/libHallC_in_root.png b/docs/libHallC_in_root.png new file mode 100644 index 0000000000000000000000000000000000000000..0956db8783434e6faef684fe9aaa1cd33211bb1b Binary files /dev/null and b/docs/libHallC_in_root.png differ diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..8e22c5bae4ac780d66a9957a61e66ec24f0b9bfa --- /dev/null +++ b/external/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.1) + +#message(STATUS "Subproject: PODD...") +# Download and unpack gflags at configure time +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/PODD.CMakeLists.txt + ${CMAKE_BINARY_DIR}/PODD-download/CMakeLists.txt) + +execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/PODD-download) +if(result) + message(FATAL_ERROR "CMake step for PODD failed: ${result}") +endif() +execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/PODD-download) +if(result) + message(FATAL_ERROR "Download step for exteranl PODD build failed: ${result}") +endif() + +add_subdirectory( + ${CMAKE_BINARY_DIR}/hallac_PODD-src + ${CMAKE_BINARY_DIR}/hallac_PODD-build) + +#execute_process(COMMAND "rm -r *" +# RESULT_VARIABLE result +# WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/PODD-download) + +message(STATUS "Subproject: PODD...DONE") + diff --git a/external/PODD.CMakeLists.txt b/external/PODD.CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..990247c5df8b8a9a7bb5a22690737ff370820b8d --- /dev/null +++ b/external/PODD.CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.5) + +# simplify variable expansion +#cmake_policy(SET CMP0053 NEW) +#cmake_policy(SET CMP0010 NEW) + +project(PODD-download NONE) + +include(ExternalProject) + +ExternalProject_Add(PODD_project + GIT_REPOSITORY https://github.com/whit2333/analyzer.git + GIT_TAG origin/master + SOURCE_DIR "${CMAKE_BINARY_DIR}/hallac_PODD-src" + BINARY_DIR "${CMAKE_BINARY_DIR}/hallac_PODD-build" + CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=@CMAKE_INSTALL_PREFIX@" "-DCMAKE_PREFIX_PATH=@CMAKE_INSTALL_PREFIX@" + BUILD_COMMAND ${CMAKE_COMMAND} --build . -- -j4 + USES_TERMINAL_BUILD ON + TEST_COMMAND "" + LOG_DOWNLOAD ON + ) +ExternalProject_Add_StepTargets(PODD_project install) + diff --git a/hc_compiledata.h.in b/hc_compiledata.h.in new file mode 100644 index 0000000000000000000000000000000000000000..b11ee5958e9ad9cdfb3c0d7d02c3e8152cc96fb9 --- /dev/null +++ b/hc_compiledata.h.in @@ -0,0 +1,39 @@ +#ifndef HCANA_COMPILEDATA_H +#define HCANA_COMPILEDATA_H + +#define HC_INCLUDEPATH "@CMAKE_INSTALL_PREFIX@/include" +#define HC_VERSION "@PROJECT_VERSION@" +#define HC_DATE "@HCANA_BUILD_DATE@" +#define HC_DATETIME "@HCANA_BUILD_DATETIME@" +#define HC_PLATFORM "@HCANA_PLATFORM@" +#define HC_BUILDNODE "@HCANA_NODE@" +#define HC_BUILDDIR "@HCANA_BUILD_DIR@" +#define HC_BUILDUSER "@HCANA_BUILD_USER@" +#define HC_GITVERS "@HCANA_GIT_VERSION@" +#define HC_CXXVERS "@HCANA_CXX_VERSION@" +#define HC_ROOTVERS "@HCANA_ROOT_VERSION@" + +#define HCANA_VERSION_CODE @HCANA_VERCODE@ +#define HCANA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) +#endif + + +// Example: +//#ifndef ANALYZER_COMPILEDATA_H +//#define ANALYZER_COMPILEDATA_H +// +//#define HA_INCLUDEPATH "/mnt/old_home/whit/projects/hall_AC_projects/hcana/HCANA/src /mnt/old_home/whit/projects/hall_AC_projects/hcana/HCANA/hana_decode" +//#define HA_VERSION "1.6.0" +//#define HA_DATE "Jun 26 2018" +//#define HA_DATETIME "Tue Jun 26 2018" +//#define HA_PLATFORM "Linux-4.13.0-45-generic-x86_64-with-Ubuntu-17.10-artful" +//#define HA_BUILDNODE "wpad" +//#define HA_BUILDDIR "/mnt/old_home/whit/projects/hall_AC_projects/hcana/HCANA" +//#define HA_BUILDUSER "whit" +//#define HA_GITVERS "5b48832" +//#define HA_CXXVERS "c++ (GCC) 8.1.0" +//#define HA_ROOTVERS "6.15/01" +//#define ANALYZER_VERSION_CODE 67072 +//#define ANALYZER_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) +// +//#endif diff --git a/src/include/HallC_LinkDef.h b/src/include/HallC_LinkDef.h index 245129dc6cbef21424b5a2508a348975b3096ac2..7f17257d4ba14f5862896564be5bfaf89faf6a2f 100644 --- a/src/include/HallC_LinkDef.h +++ b/src/include/HallC_LinkDef.h @@ -6,7 +6,6 @@ #pragma link off all classes; #pragma link off all functions; - #pragma link C++ nestedclass; #pragma link C++ nestedtypedef; @@ -56,7 +55,6 @@ #pragma link C++ class THcRawHit+; #pragma link C++ class THcRawHodoHit+; #pragma link C++ class THcRawShowerHit+; -#pragma link C++ class THcRawShowerHit+; #pragma link C++ class THcRawTdcHit+; #pragma link C++ class THcReactionPoint+; #pragma link C++ class THcRun+;