12 Commits

Author SHA1 Message Date
AndreaRigoni
8566ceb662 feat: add condaenv.yml for environment setup and update README.md with detailed build instructions. 2026-02-20 18:05:40 +00:00
AndreaRigoni
5ae2e106ab added conanfile 2026-02-20 17:27:30 +00:00
c526f61f8c Merge pull request #3 from OpenCMT/andrea-dev
fix mismatch Origin - Position
2025-09-25 17:38:45 +02:00
AndreaRigoni
54997fe0ac fix mismatch Origin - Position 2025-09-25 17:34:23 +02:00
94bad596ed Merge pull request #2 from OpenCMT/andrea-dev
fix export to Vti
2025-09-23 18:52:54 +02:00
AndreaRigoni
fc909da400 fix export to Vti 2025-09-23 18:21:11 +02:00
b0240dc807 Merge pull request #1 from OpenCMT/andrea-dev
Andrea dev
2025-09-18 13:12:12 +02:00
AndreaRigoni
591cc9d8bc add version 0.6 - make external build possible 2025-09-05 18:04:54 +02:00
AndreaRigoni
2e401f6fc5 add posibility to compile in build directory 2025-09-04 16:12:38 +02:00
AndreaRigoni
91abd56587 fix Root needs for C++17 2025-09-04 16:11:57 +02:00
AndreaRigoni
01ff8a0a0d update 2025-09-02 13:01:55 +02:00
AndreaRigoni
b86e27a9c4 add VTK save early 2025-09-02 12:42:46 +02:00
27 changed files with 464 additions and 78 deletions

View File

@@ -15,16 +15,16 @@ set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "build path for
mark_as_advanced(EXECUTABLE_OUTPUT_PATH) mark_as_advanced(EXECUTABLE_OUTPUT_PATH)
## Install directories ## ## Install directories ##
set(PACKAGE_INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables") set(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
set(PACKAGE_INSTALL_LIB_DIR lib/${PACKAGE_NAME} CACHE PATH "Installation directory for libraries") set(INSTALL_LIB_DIR lib/${PACKAGE_NAME} CACHE PATH "Installation directory for libraries")
set(PACKAGE_INSTALL_INC_DIR include/${PACKAGE_NAME} CACHE PATH "Installation directory for headers") set(INSTALL_INC_DIR include/${PACKAGE_NAME} CACHE PATH "Installation directory for headers")
set(PACKAGE_INSTALL_DATA_DIR share/${PACKAGE_NAME} CACHE PATH "Installation directory for data files") set(INSTALL_DATA_DIR share/${PACKAGE_NAME} CACHE PATH "Installation directory for data files")
if(WIN32 AND NOT CYGWIN) if(WIN32 AND NOT CYGWIN)
set(DEF_INSTALL_CMAKE_DIR CMake) set(DEF_INSTALL_CMAKE_DIR CMake)
else() else()
set(DEF_INSTALL_CMAKE_DIR lib/cmake/${PACKAGE_NAME}) set(DEF_INSTALL_CMAKE_DIR lib/cmake/${PACKAGE_NAME})
endif() endif()
set(PACKAGE_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files") set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")
# Make relative paths absolute (needed later on) # Make relative paths absolute (needed later on)
foreach(p LIB BIN INC DATA CMAKE) foreach(p LIB BIN INC DATA CMAKE)
@@ -58,7 +58,7 @@ endif()
set(CMAKE_CXX_WARNING_OPTION "" CACHE STRING "Warning level -WAll to verbose all warnings") set(CMAKE_CXX_WARNING_OPTION "" CACHE STRING "Warning level -WAll to verbose all warnings")
set(CMAKE_VERBOSE_MAKEFILE FALSE CACHE STRING "Verbose compile output switch") set(CMAKE_VERBOSE_MAKEFILE FALSE CACHE STRING "Verbose compile output switch")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x ${CMAKE_CXX_WARNING_OPTION}") # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x ${CMAKE_CXX_WARNING_OPTION}")

View File

@@ -41,15 +41,15 @@ macro(uLib_add_shared_library name)
install(TARGETS ${mname} install(TARGETS ${mname}
EXPORT "${PROJECT_NAME}Targets" EXPORT "${PROJECT_NAME}Targets"
RUNTIME DESTINATION ${PACKAGE_INSTALL_BIN_DIR} COMPONENT bin RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
LIBRARY DESTINATION ${PACKAGE_INSTALL_LIB_DIR} COMPONENT lib LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib
# PUBLIC_HEADER DESTINATION ${PACKAGE_INSTALL_INC_DIR} COMPONENT dev # PUBLIC_HEADER DESTINATION ${INSTALL_INC_DIR} COMPONENT dev
) )
endif(SOURCES) endif(SOURCES)
if(HEADERS) if(HEADERS)
foreach(header ${HEADERS}) foreach(header ${HEADERS})
install(FILES ${header} DESTINATION ${PACKAGE_INSTALL_INC_DIR}/${name}) install(FILES ${header} DESTINATION ${INSTALL_INC_DIR}/${name})
endforeach(header) endforeach(header)
endif(HEADERS) endif(HEADERS)
@@ -70,7 +70,7 @@ macro(uLib_add_target name)
install(TARGETS ${name} install(TARGETS ${name}
EXPORT "${PROJECT_NAME}Targets" EXPORT "${PROJECT_NAME}Targets"
RUNTIME DESTINATION ${PACKAGE_INSTALL_BIN_DIR} COMPONENT bin RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
) )
ENDMACRO(uLib_add_target) ENDMACRO(uLib_add_target)

View File

@@ -3,7 +3,7 @@
##### CMAKE LISTS ############################################################## ##### CMAKE LISTS ##############################################################
################################################################################ ################################################################################
cmake_minimum_required (VERSION 2.6) cmake_minimum_required (VERSION 3.26)
## -------------------------------------------------------------------------- ## ## -------------------------------------------------------------------------- ##
@@ -11,7 +11,7 @@ project(uLib)
# The version number. # The version number.
set(PROJECT_VERSION_MAJOR 0) set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 5) set(PROJECT_VERSION_MINOR 6)
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}")
set(PROJECT_SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") set(PROJECT_SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}")
@@ -33,19 +33,31 @@ message(STATUS "Module path = ${CMAKE_MODULE_PATH}")
## GLOBALS ------------------------------------------------------------------ ## ## GLOBALS ------------------------------------------------------------------ ##
set(PACKAGE_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/bin # -- move to GnuInstallDirs
CACHE PATH "Installation directory for executables") # ref: https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
set(PACKAGE_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/ include(GNUInstallDirs)
CACHE PATH "Installation directory for libraries") set(INSTALL_INC_DIR ${CMAKE_INSTALL_INCLUDEDIR}/${PACKAGE_NAME}
set(PACKAGE_INSTALL_INC_DIR ${CMAKE_INSTALL_PREFIX}/include/${PACKAGE_NAME} CACHE PATH "Location of header files (.../include)" )
CACHE PATH "Installation directory for headers") set(INSTALL_ETC_DIR ${CMAKE_INSTALL_SYSCONFDIR}/${PACKAGE_NAME}
set(PACKAGE_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/${PACKAGE_NAME} CACHE PATH "Location of configuration files (.../etc)" )
CACHE PATH "Installation directory for data files") set(INSTALL_BIN_DIR ${CMAKE_INSTALL_BINDIR}/${PACKAGE_NAME}
set(PACKAGE_INSTALL_CMAKE_DIR ${CMAKE_INSTALL_PREFIX}/lib/cmake/${PACKAGE_NAME} CACHE PATH "Location of executable files (.../bin)" )
CACHE PATH "Installation directory for CMake files") set(INSTALL_LIB_DIR ${CMAKE_INSTALL_LIBDIR}
CACHE PATH "Location of library files (.../lib)" )
set(INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PACKAGE_NAME}
CACHE PATH "Location of cmake files (.../lib/cmake)" )
set(INSTALL_DATA_DIR ${CMAKE_INSTALL_DATADIR}/${PACKAGE_NAME}
CACHE PATH "Location of data files (.../share)" )
set(SRC_DIR ${PROJECT_SOURCE_DIR}/src) set(SRC_DIR ${PROJECT_SOURCE_DIR}/src)
# this is used to be exported in build target
# ( to compile against build directory instead of install )
set(ULIB_SOURCE_DIR ${PROJECT_SOURCE_DIR})
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to 'Release' as none was specified.") message(STATUS "Setting build type to 'Release' as none was specified.")
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
@@ -60,25 +72,34 @@ set(CMAKE_CXX_WARNING_OPTION ""
set(CMAKE_VERBOSE_MAKEFILE FALSE set(CMAKE_VERBOSE_MAKEFILE FALSE
CACHE STRING "Verbose compile output switch") CACHE STRING "Verbose compile output switch")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x ${CMAKE_CXX_WARNING_OPTION}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_WARNING_OPTION}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -UULIB_SERIALIZATION_ON") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -UULIB_SERIALIZATION_ON")
#enable_testing() # CTEST framework
enable_testing()
## FIND PACKAGES ------------------------------------------------------------ ## ## FIND PACKAGES ------------------------------------------------------------ ##
set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON) set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF) set(Boost_USE_STATIC_RUNTIME OFF)
message(STATUS "CMAKE_PREFIX_PATH is ${CMAKE_PREFIX_PATH}")
find_package(Boost 1.45.0 COMPONENTS program_options REQUIRED) find_package(Boost 1.45.0 COMPONENTS program_options REQUIRED)
include_directories(${Boost_INCLUDE_DIRS}) include_directories(${Boost_INCLUDE_DIRS})
find_package(Eigen3 CONFIG REQUIRED) find_package(Eigen3 CONFIG REQUIRED)
include(${EIGEN3_USE_FILE}) get_target_property(EIGEN3_INCLUDE_DIRS Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES)
include_directories(${EIGEN3_INCLUDE_DIRS})
find_package(ROOT CONFIG REQUIRED) find_package(ROOT CONFIG REQUIRED)
include(${ROOT_USE_FILE}) include(${ROOT_USE_FILE})
find_package(VTK REQUIRED)
# include(${VTK_USE_FILE})
option(CENTOS_SUPPORT "VTK definitions for CentOS" OFF) option(CENTOS_SUPPORT "VTK definitions for CentOS" OFF)
if(CENTOS_SUPPORT) if(CENTOS_SUPPORT)
find_package(VTK CONFIG REQUIRED) find_package(VTK CONFIG REQUIRED)
@@ -142,7 +163,7 @@ configure_file("${PROJECT_SOURCE_DIR}/CMakeConfig.in.h"
"${PROJECT_BINARY_DIR}/config.h") "${PROJECT_BINARY_DIR}/config.h")
install(FILES "${PROJECT_BINARY_DIR}/config.h" install(FILES "${PROJECT_BINARY_DIR}/config.h"
DESTINATION ${PACKAGE_INSTALL_INC_DIR}) DESTINATION ${INSTALL_INC_DIR})
## ADD LIBRARIES SUBDIRECTORIES --------------------------------------------- ## ## ADD LIBRARIES SUBDIRECTORIES --------------------------------------------- ##
@@ -187,8 +208,8 @@ add_subdirectory(${SRC_DIR}/Vtk)
# Create the FooBarConfig.cmake and FooBarConfigVersion files # Create the FooBarConfig.cmake and FooBarConfigVersion files
file(RELATIVE_PATH REL_INCLUDE_DIR "${PACKAGE_INSTALL_CMAKE_DIR}" # file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}"
"${PACKAGE_INSTALL_INC_DIR}") # "${INSTALL_INC_DIR}")
# ... for the build tree # ... for the build tree
#set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src" "${PROJECT_BINARY_DIR}") #set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src" "${PROJECT_BINARY_DIR}")
@@ -197,21 +218,53 @@ file(RELATIVE_PATH REL_INCLUDE_DIR "${PACKAGE_INSTALL_CMAKE_DIR}"
# ... for the install tree # ... for the install tree
set(CONF_INCLUDE_DIRS "\${ULIB_CMAKE_DIR}/${REL_INCLUDE_DIR}") set(CONF_INCLUDE_DIRS "\${ULIB_CMAKE_DIR}/${REL_INCLUDE_DIR}")
configure_file(uLibConfig.cmake.in # [ removed for the configure_config_file ]
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/uLibConfig.cmake" # configure_file(uLibConfig.cmake.in
@ONLY) # "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/uLibConfig.cmake"
# @ONLY)
# ... for both # ... for both
configure_file(uLibConfigVersion.cmake.in configure_file(uLibConfigVersion.cmake.in
"${PROJECT_BINARY_DIR}/uLibConfigVersion.cmake" @ONLY) "${PROJECT_BINARY_DIR}/uLibConfigVersion.cmake" @ONLY)
install(FILES "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/uLibConfig.cmake"
# from CMake 3.x configure file shall be created using a dedicated function
# see: https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html
#
include(CMakePackageConfigHelpers)
configure_package_config_file(uLibConfig.cmake.in
"${PROJECT_BINARY_DIR}/uLibConfig.cmake"
INSTALL_DESTINATION ${INSTALL_CMAKE_DIR}
PATH_VARS
INSTALL_LIB_DIR
INSTALL_INC_DIR
INSTALL_BIN_DIR
INSTALL_CMAKE_DIR
INSTALL_ETC_DIR
INSTALL_DATA_DIR
ULIB_SOURCE_DIR
ULIB_SHARED_LIBRARIES
# NO_SET_AND_CHECK_MACRO
# NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
install(FILES "${PROJECT_BINARY_DIR}/uLibConfig.cmake"
"${PROJECT_BINARY_DIR}/uLibConfigVersion.cmake" "${PROJECT_BINARY_DIR}/uLibConfigVersion.cmake"
DESTINATION "${PACKAGE_INSTALL_CMAKE_DIR}" DESTINATION "${INSTALL_CMAKE_DIR}"
COMPONENT dev) COMPONENT dev)
# this is a special target file for the build tree
# it is used also to identify if we are using a build direcory
# to link a project against uLib. see: uLibConfig.cmake ( IF )
export (TARGETS ${ULIB_SHARED_LIBRARIES}
FILE "${PROJECT_BINARY_DIR}/uLibTargets-build.cmake"
# NAMESPACE "uLib::"
)
# Install the export set for use with the install-tree # Install the export set for use with the install-tree
install(EXPORT "${PROJECT_NAME}Targets" install(EXPORT "uLibTargets"
DESTINATION "${PACKAGE_INSTALL_CMAKE_DIR}" FILE "uLibTargets.cmake"
DESTINATION "${INSTALL_CMAKE_DIR}"
COMPONENT dev) COMPONENT dev)

9
CMakeUserPresets.json Normal file
View File

@@ -0,0 +1,9 @@
{
"version": 4,
"vendor": {
"conan": {}
},
"include": [
"build/CMakePresets.json"
]
}

View File

@@ -7,3 +7,57 @@ base toolkit library
CMT Cosmic Muon Tomography reconstruction, analysis and imaging software CMT Cosmic Muon Tomography reconstruction, analysis and imaging software
Developed by University of Padova and INFN Sezione di Padova Italy Developed by University of Padova and INFN Sezione di Padova Italy
## Build Instructions
This project relies on `conan` (v2) for dependency management (Eigen3, Boost) and `cmake` for configuration. VTK is provided through the micromamba/conda-forge environment.
### Prerequisites
This project requires a `conda` or `micromamba` environment containing the necessary global tools like **ROOT**, **VTK**, and **Conan** (v2). We provide a `condaenv.yml` file to quickly build this environment.
#### Installing Micromamba (Optional)
If you do not have `conda` installed, `micromamba` is a fast and lightweight alternative. You can install it on Linux via:
```bash
"${SHELL}" <(curl -L micro.mamba.pm/install.sh)
```
#### Creating the Environment
You can create and activate the environment using either `micromamba` or `conda`.
**Using Micromamba:**
```bash
micromamba env create -f condaenv.yml
micromamba activate mutom
```
**Using Conda:**
```bash
conda env create -f condaenv.yml
conda activate mutom
```
### Configure and Build
1. **Configure Conan profile (if you haven't yet on your machine):**
```bash
conan profile detect
```
2. **Install Conan dependencies:**
```bash
conan install . --output-folder=build --build=missing
```
3. **Configure the project with CMake:**
```bash
cmake --preset conan-release
```
*(Alternatively: `cd build && cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release`)*
4. **Build the project:**
```bash
cmake --build build -j10
```

7
conanfile.txt Normal file
View File

@@ -0,0 +1,7 @@
[requires]
eigen/3.4.0
boost/1.83.0
[generators]
CMakeDeps
CMakeToolchain

10
condaenv.yml Normal file
View File

@@ -0,0 +1,10 @@
name: mutom
channels:
- conda-forge
dependencies:
- compiler-rt
- make
- cmake
- conan
- root
- vtk

View File

@@ -18,10 +18,10 @@ target_link_libraries(${libname} ${LIBRARIES})
install(TARGETS ${libname} install(TARGETS ${libname}
EXPORT "${PROJECT_NAME}Targets" EXPORT "${PROJECT_NAME}Targets"
RUNTIME DESTINATION ${PACKAGE_INSTALL_BIN_DIR} COMPONENT bin RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
LIBRARY DESTINATION ${PACKAGE_INSTALL_LIB_DIR} COMPONENT lib) LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
install(FILES ${HEADERS} DESTINATION ${PACKAGE_INSTALL_INC_DIR}/Core) install(FILES ${HEADERS} DESTINATION ${INSTALL_INC_DIR}/Core)

View File

@@ -31,6 +31,9 @@
#include <boost/program_options.hpp> #include <boost/program_options.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
//class boost::program_options::error_with_option_name; //class boost::program_options::error_with_option_name;
//template<> boost::program_options::typed_value<int> boost::program_options::value<int>(); //template<> boost::program_options::typed_value<int> boost::program_options::value<int>();
@@ -74,6 +77,23 @@ void Options::parse_config_file(const char *fname)
} }
} }
void Options::save_config_file(const char *fname) {
std::ofstream os;
os.open(fname);
using boost::property_tree::ptree;
ptree root;
std::cout << m_configuration << "\n";
std::cout << m_global << "\n";
write_ini( std::cout, root );
}
bool Options::count(const char *str) const bool Options::count(const char *str) const
{ {
return (m_vm.count(str)); return (m_vm.count(str));

View File

@@ -160,6 +160,8 @@ public:
void parse_config_file(const char *fname); void parse_config_file(const char *fname);
void save_config_file(const char *fname);
template <typename T> template <typename T>
static inline boost::program_options::typed_value<T>* value(T *v, T dvalue) { static inline boost::program_options::typed_value<T>* value(T *v, T dvalue) {
boost::program_options::typed_value<T> *r = boost::program_options::value<T>(v); boost::program_options::typed_value<T> *r = boost::program_options::value<T>(v);

View File

@@ -2,5 +2,6 @@ set(HEADERS MuonScatter.h MuonError.h MuonEvent.h)
set(ULIB_SELECTED_MODULES ${ULIB_SELECTED_MODULES} Detectors PARENT_SCOPE) set(ULIB_SELECTED_MODULES ${ULIB_SELECTED_MODULES} Detectors PARENT_SCOPE)
install(FILES ${HEADERS} install(FILES ${HEADERS}
DESTINATION ${PACKAGE_INSTALL_INC_DIR}/Detectors) DESTINATION ${INSTALL_INC_DIR}/Detectors)

View File

@@ -27,6 +27,8 @@
#ifndef U_MATH_BITCODE_H #ifndef U_MATH_BITCODE_H
#define U_MATH_BITCODE_H #define U_MATH_BITCODE_H
#include <iostream>
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>
#include <boost/type_traits.hpp> #include <boost/type_traits.hpp>
#include <boost/mpl/vector_c.hpp> #include <boost/mpl/vector_c.hpp>
@@ -34,6 +36,7 @@
#include <Math/Dense.h> #include <Math/Dense.h>
namespace uLib { namespace uLib {

View File

@@ -1,3 +1,4 @@
set(HEADERS ContainerBox.h set(HEADERS ContainerBox.h
Dense.h Dense.h
Geometry.h Geometry.h
@@ -31,8 +32,9 @@ set(SOURCES VoxRaytracer.cpp
Structured2DGrid.cpp Structured2DGrid.cpp
Structured4DGrid.cpp) Structured4DGrid.cpp)
set(LIBRARIES ${Eigen_LIBRARY} set(LIBRARIES Eigen3::Eigen
${ROOT_LIBRARIES}) ${ROOT_LIBRARIES}
${VTK_LIBRARIES})
set(libname ${PACKAGE_LIBPREFIX}Math) set(libname ${PACKAGE_LIBPREFIX}Math)
set(ULIB_SHARED_LIBRARIES ${ULIB_SHARED_LIBRARIES} ${libname} PARENT_SCOPE) set(ULIB_SHARED_LIBRARIES ${ULIB_SHARED_LIBRARIES} ${libname} PARENT_SCOPE)
@@ -44,10 +46,15 @@ set_target_properties(${libname} PROPERTIES
SOVERSION ${PROJECT_SOVERSION}) SOVERSION ${PROJECT_SOVERSION})
target_link_libraries(${libname} ${LIBRARIES}) target_link_libraries(${libname} ${LIBRARIES})
install(TARGETS ${libname} install(TARGETS ${libname}
EXPORT "${PROJECT_NAME}Targets" EXPORT "${PROJECT_NAME}Targets"
RUNTIME DESTINATION ${PACKAGE_INSTALL_BIN_DIR} COMPONENT bin RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
LIBRARY DESTINATION ${PACKAGE_INSTALL_LIB_DIR} COMPONENT lib) LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
install(FILES ${HEADERS} DESTINATION ${PACKAGE_INSTALL_INC_DIR}/Math) install(FILES ${HEADERS} DESTINATION ${INSTALL_INC_DIR}/Math)
# TESTING
# include(uLibTargetMacros)
# add_subdirectory(testing)

View File

@@ -139,7 +139,6 @@ typedef Eigen::Vector4f Vector4f;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Vector String interaction /////////////////////////////////////////////////// // Vector String interaction ///////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@@ -110,6 +110,17 @@ public:
inline void Rotate(const Matrix3f &m) { this->m_T.rotate(m); } inline void Rotate(const Matrix3f &m) { this->m_T.rotate(m); }
inline void Rotate(const float angle, Vector3f axis)
{
axis.normalize(); // prehaps not necessary ( see eigens )
Eigen::AngleAxisf ax(angle,axis);
this->m_T.rotate(Eigen::Quaternion<float>(ax));
}
inline void Rotate(const Vector3f euler_axis) {
float angle = euler_axis.norm();
Rotate(angle,euler_axis);
}
inline void PreRotate(const Matrix3f &m) { this->m_T.prerotate(m); } inline void PreRotate(const Matrix3f &m) { this->m_T.prerotate(m); }

View File

@@ -30,6 +30,13 @@
#include "VoxImage.h" #include "VoxImage.h"
#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkXMLImageDataReader.h>
#include <vtkXMLImageDataWriter.h>
#include <vtkStringArray.h>
#include <vtkInformation.h>
#include <vtkInformationStringKey.h>
namespace uLib { namespace uLib {
@@ -83,7 +90,103 @@ void Abstract::VoxImage::ExportToVtk (const char *file, bool density_type)
printf("%s vtk file saved\n",file); printf("%s vtk file saved\n",file);
} }
int Abstract::VoxImage::ImportFromVtk(const char *file)
void Abstract::VoxImage::ExportToVti (const char *file, bool density_type, bool compressed)
{
Abstract::VoxImage *voxels = this;
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
image->SetDimensions(voxels->GetDims()(0), voxels->GetDims()(1), voxels->GetDims()(2));
image->SetSpacing(voxels->GetSpacing()(0), voxels->GetSpacing()(1), voxels->GetSpacing()(2));
image->SetOrigin(voxels->GetPosition()(0), voxels->GetPosition()(1), voxels->GetPosition()(2));
image->AllocateScalars(VTK_FLOAT, 1);
float norm;
if (density_type) {
norm = 1;
} else norm = 1.E6;
int nx = voxels->GetDims()(0);
int ny = voxels->GetDims()(1);
int nz = voxels->GetDims()(2);
size_t npoints = nx*ny*nz;
float *scalar = static_cast<float*>(image->GetScalarPointer());
StructuredData unwrap(*voxels);
unwrap.SetDataOrder(StructuredData::XYZ); // move to XYZ order (VTK)
for (size_t i = 0; i < npoints; i++) {
Vector3i idx = unwrap.UnMap(i);
scalar[i] = static_cast<float>(voxels->GetValue(idx) * norm);
}
// Create a custom string key
static vtkInformationStringKey* ConfigNote =
vtkInformationStringKey::MakeKey("cmt.config", "Config");
// Attach metadata
vtkInformation *info = image->GetInformation();
info->Set(ConfigNote,
"This image was generated with uLib\n"
"-----------------------------------\n"
"Author: Andrea Rigoni\n"
"Version: 0.1\n"
"Date: 2025\n"
);
// std::cout << info->Get(ConfigNote) << std::endl;
vtkSmartPointer<vtkXMLImageDataWriter> writer = vtkSmartPointer<vtkXMLImageDataWriter>::New();
writer->SetFileName(file);
writer->SetInputData(image);
if(compressed) {
writer->SetDataModeToBinary();
writer->SetCompressorTypeToZLib();
}
writer->Write();
}
int Abstract::VoxImage::ImportFromVti(const char *file, bool density_type) {
vtkSmartPointer<vtkXMLImageDataReader> reader = vtkSmartPointer<vtkXMLImageDataReader>::New();
reader->SetFileName(file);
reader->Update();
vtkImageData *image = reader->GetOutput();
if(!image) return false;
Abstract::VoxImage *voxels = this;
int nx = image->GetDimensions()[0];
int ny = image->GetDimensions()[1];
int nz = image->GetDimensions()[2];
voxels->SetDims(Vector3i(nx,ny,nz));
voxels->SetSpacing(Vector3f(image->GetSpacing()[0],image->GetSpacing()[1],image->GetSpacing()[2]));
voxels->SetPosition(Vector3f(image->GetOrigin()[0],image->GetOrigin()[1],image->GetOrigin()[2]));
float norm;
if (density_type) {
norm = 1;
} else norm = 1.E6;
size_t npoints = nx*ny*nz;
float *scalar = static_cast<float*>(image->GetScalarPointer());
StructuredData wrap(*voxels);
wrap.SetDataOrder(StructuredData::XYZ);
for (size_t i = 0; i < npoints; i++) {
Vector3i idx = wrap.UnMap(i);
voxels->SetValue(idx, scalar[i] / norm);
}
return true;
}
int Abstract::VoxImage::ImportFromVtk(const char *file, bool density_type)
{ {
FILE * vtk_file = fopen(file, "r"); FILE * vtk_file = fopen(file, "r");
if (!vtk_file) return false; if (!vtk_file) return false;
@@ -115,14 +218,18 @@ int Abstract::VoxImage::ImportFromVtk(const char *file)
this->SetSpacing(Vector3f(sx,sy,sz)); this->SetSpacing(Vector3f(sx,sy,sz));
this->SetPosition(Vector3f(ox,oy,oz)); this->SetPosition(Vector3f(ox,oy,oz));
float norm;
if (density_type) {
norm = 1;
} else norm = 1.E6;
for (int k = 0; k < dz; ++k) { for (int k = 0; k < dz; ++k) {
for (int j = 0; j < dy; ++j) { for (int j = 0; j < dy; ++j) {
for (int i = 0; i < dx; ++i) { for (int i = 0; i < dx; ++i) {
Vector3i idx(i, j, k); Vector3i idx(i, j, k);
float tmp_val; float tmp_val;
fscanf(vtk_file, "%f", &tmp_val); fscanf(vtk_file, "%f", &tmp_val);
//this->SetValue(idx,fabs(tmp_val)*1E-6); this->SetValue(idx,tmp_val / norm);
this->SetValue(idx,tmp_val*1E-6);
} }
} }
} }

View File

@@ -56,8 +56,18 @@ public:
virtual void SetDims(const Vector3i &size) = 0; virtual void SetDims(const Vector3i &size) = 0;
void ExportToVtk(const char *file, bool density_type = 0); void ExportToVtk(const char *file, bool density_type = 0);
// use this function to export to VTK binary format
void ExportToVti (const char *file, bool density_type = 0, bool compressed = 0);
// this function has been deprecated in favor of ExportToVti
// but it is kept for backward compatibility and because it
// does not depend on vtk library
void ExportToVtkXml(const char *file, bool density_type = 0); void ExportToVtkXml(const char *file, bool density_type = 0);
int ImportFromVtk(const char *file);
int ImportFromVtk(const char *file, bool density_type = 0);
int ImportFromVti(const char *file, bool density_type = 0);
protected: protected:

View File

@@ -19,4 +19,4 @@ set(LIBRARIES
${PACKAGE_LIBPREFIX}Math ${PACKAGE_LIBPREFIX}Math
) )
uLib_add_tests(${uLib-module}) uLib_add_tests(Math)

View File

@@ -92,6 +92,20 @@ int main() {
imgR.ExportToVtk("./read_and_saved.vtk"); imgR.ExportToVtk("./read_and_saved.vtk");
} }
{
VoxImage<TestVoxel> img(Vector3i(4,4,4));
img.InitVoxels({0,0});
for (int i=0; i<4; i++) {
for (int j=0; j<4; j++) {
for (int k=0; k<4; k++) {
img[Vector3i(i,j,k)] = {i+j+k,0};
}
}
}
img.ExportToVti("./vti_saved.vti",0,1);
// img.ImportFromVtkXml("./test_vox_image.vti");
}
{ {
VoxImage<TestVoxel> img1(Vector3i(5,5,5)); VoxImage<TestVoxel> img1(Vector3i(5,5,5));

View File

@@ -42,7 +42,7 @@ list(APPEND SOURCES ${rDictName}.cxx)
set(R_ARTIFACTS ${CMAKE_CURRENT_BINARY_DIR}/lib${rDictName}_rdict.pcm set(R_ARTIFACTS ${CMAKE_CURRENT_BINARY_DIR}/lib${rDictName}_rdict.pcm
${CMAKE_CURRENT_BINARY_DIR}/lib${rDictName}.rootmap) ${CMAKE_CURRENT_BINARY_DIR}/lib${rDictName}.rootmap)
install(FILES ${R_ARTIFACTS} install(FILES ${R_ARTIFACTS}
DESTINATION ${PACKAGE_INSTALL_LIB_DIR}) DESTINATION ${INSTALL_LIB_DIR})
set(libname ${PACKAGE_LIBPREFIX}Root) set(libname ${PACKAGE_LIBPREFIX}Root)
set(ULIB_SHARED_LIBRARIES ${ULIB_SHARED_LIBRARIES} ${libname} PARENT_SCOPE) set(ULIB_SHARED_LIBRARIES ${ULIB_SHARED_LIBRARIES} ${libname} PARENT_SCOPE)
@@ -51,14 +51,15 @@ set(ULIB_SELECTED_MODULES ${ULIB_SELECTED_MODULES} Root PARENT_SCOPE)
add_library(${libname} SHARED ${SOURCES}) add_library(${libname} SHARED ${SOURCES})
set_target_properties(${libname} PROPERTIES set_target_properties(${libname} PROPERTIES
VERSION ${PROJECT_VERSION} VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_SOVERSION}) SOVERSION ${PROJECT_SOVERSION}
CXX_STANDARD 17)
target_link_libraries(${libname} ${LIBRARIES}) target_link_libraries(${libname} ${LIBRARIES})
install(TARGETS ${libname} install(TARGETS ${libname}
EXPORT "${PROJECT_NAME}Targets" EXPORT "${PROJECT_NAME}Targets"
RUNTIME DESTINATION ${PACKAGE_INSTALL_BIN_DIR} COMPONENT bin RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
LIBRARY DESTINATION ${PACKAGE_INSTALL_LIB_DIR} COMPONENT lib) LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
install(FILES ${HEADERS} DESTINATION ${PACKAGE_INSTALL_INC_DIR}/Root) install(FILES ${HEADERS} DESTINATION ${INSTALL_INC_DIR}/Root)

View File

@@ -14,7 +14,7 @@ set(SOURCES uLibVtkInterface.cxx
vtkVoxRaytracerRepresentation.cpp vtkVoxRaytracerRepresentation.cpp
vtkVoxImage.cpp) vtkVoxImage.cpp)
set(LIBRARIES ${Eigen_LIBRARY} set(LIBRARIES Eigen3::Eigen
${ROOT_LIBRARIES} ${ROOT_LIBRARIES}
${VTK_LIBRARIES} ${VTK_LIBRARIES}
${PACKAGE_LIBPREFIX}Math) ${PACKAGE_LIBPREFIX}Math)
@@ -31,8 +31,8 @@ target_link_libraries(${libname} ${LIBRARIES})
install(TARGETS ${libname} install(TARGETS ${libname}
EXPORT "${PROJECT_NAME}Targets" EXPORT "${PROJECT_NAME}Targets"
RUNTIME DESTINATION ${PACKAGE_INSTALL_BIN_DIR} COMPONENT bin RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
LIBRARY DESTINATION ${PACKAGE_INSTALL_LIB_DIR} COMPONENT lib) LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)
install(FILES ${HEADERS} DESTINATION ${PACKAGE_INSTALL_INC_DIR}/Vtk) install(FILES ${HEADERS} DESTINATION ${INSTALL_INC_DIR}/Vtk)

View File

@@ -37,7 +37,7 @@
#endif #endif
#include <vtkConfigure.h> #include <vtkVersion.h>
#include <vtkProp.h> #include <vtkProp.h>
#include <vtkActor.h> #include <vtkActor.h>
#include <vtkSmartPointer.h> #include <vtkSmartPointer.h>

View File

@@ -65,6 +65,7 @@ vtkContainerBox::~vtkContainerBox()
vtkPolyData *vtkContainerBox::GetPolyData() const vtkPolyData *vtkContainerBox::GetPolyData() const
{ {
// TODO // TODO
return NULL;
} }
void vtkContainerBox::InstallPipe() void vtkContainerBox::InstallPipe()

View File

@@ -28,7 +28,7 @@
#ifndef VTKMUONSCATTER_H #ifndef VTKMUONSCATTER_H
#define VTKMUONSCATTER_H #define VTKMUONSCATTER_H
#include <vtkConfigure.h> #include <vtkVersion.h>
#include <vtkSmartPointer.h> #include <vtkSmartPointer.h>
#include <vtkSphereSource.h> #include <vtkSphereSource.h>
#include <vtkAppendPolyData.h> #include <vtkAppendPolyData.h>

View File

@@ -28,11 +28,11 @@
#ifndef U_VTKVOXIMAGE_H #ifndef U_VTKVOXIMAGE_H
#define U_VTKVOXIMAGE_H #define U_VTKVOXIMAGE_H
#include "vtk/vtkVolume.h" #include <vtkVolume.h>
#include "vtk/vtkImageData.h" #include <vtkImageData.h>
#include "vtk/vtkXMLImageDataReader.h" #include <vtkXMLImageDataReader.h>
#include "vtk/vtkXMLImageDataWriter.h" #include <vtkXMLImageDataWriter.h>
#include "vtk/vtkCubeSource.h" #include <vtkCubeSource.h>
#include <Math/VoxImage.h> #include <Math/VoxImage.h>

View File

@@ -1,15 +1,92 @@
# - Config file for the FooBar package # - Config file for the ULib package
# It defines the following variables # It defines the following variables
# FOOBAR_INCLUDE_DIRS - include directories for FooBar # ULIB_INCLUDE_DIRS - include directories for ULib
# FOOBAR_LIBRARIES - libraries to link against # ULIB_LIBRARIES - libraries to link against
# FOOBAR_EXECUTABLE - the bar executable # ULIB_EXECUTABLE - the bar executable
set(ULIB_VERSION @PROJECT_VERSION@)
@PACKAGE_INIT@
# Defines the include directories for the header files
# PACKAGE_INCLUDE_INSTALL_DIR is replaced by configure_package_config_file
# with the correct path for the installation.
set(ULIB_INCLUDE_DIRS "${PACKAGE_INCLUDE_INSTALL_DIR}")
# Compute paths
get_filename_component(ULIB_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) get_filename_component(ULIB_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
set(ULIB_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@")
# Our library dependencies (contains definitions for IMPORTED targets) # Search for the directory of exported build targets
include("${ULIB_CMAKE_DIR}/uLibTargets.cmake") set(uLib_BUILD_TARGETS_FILE
"${ULIB_CMAKE_DIR}/uLibTargets-build.cmake"
)
# Search for the directory of installed targets
set(uLib_INSTALL_TARGETS_FILE
"${ULIB_CMAKE_DIR}/uLibTargets.cmake"
)
# We use a logic based on the presence of the build target file
# to determine if we are in a local build.
if(EXISTS "${uLib_BUILD_TARGETS_FILE}")
message(STATUS " ++ Using uLib build targets")
include("${uLib_BUILD_TARGETS_FILE}")
set_and_check(ULIB_INCLUDE_DIRS "@ULIB_SOURCE_DIR@/src")
set_and_check(ULIB_LIBRARY_DIRS "${ULIB_CMAKE_DIR}")
set(ULIB_BUILD_DIR ${ULIB_CMAKE_DIR})
# Target that builds uLib inside its build directory
add_custom_target(uLib_dependency_target
COMMAND echo " --------------------------------- "
COMMAND echo " - Building uLib as a dependency - "
COMMAND echo " --------------------------------- "
COMMAND echo ""
COMMAND ${CMAKE_COMMAND} --build ${ULIB_BUILD_DIR}
COMMAND echo ""
WORKING_DIRECTORY ${ULIB_BUILD_DIR}
)
add_library(uLib_dependency INTERFACE)
add_dependencies(uLib_dependency uLib_dependency_target)
link_libraries(uLib_dependency)
else()
message(STATUS " ++ Using uLib installed targets")
include("${uLib_INSTALL_TARGETS_FILE}")
set_and_check(ULIB_INCLUDE_DIRS "@PACKAGE_INSTALL_INC_DIR@")
set(ULIB_SYSCONFIG_DIR "@PACKAGE_INSTALL_ETC_DIR@")
set_and_check(ULIB_CMAKE_DIR "@PACKAGE_INSTALL_CMAKE_DIR@")
set_and_check(ULIB_LIBRARY_DIRS "@PACKAGE_INSTALL_LIB_DIR@")
endif()
# --- Add required packages from uLib ---
# TODO: this should be selected if components are active
#
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS program_options filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
link_libraries(${Boost_LIBRARIES})
find_package(Eigen3 CONFIG REQUIRED)
include(${EIGEN3_USE_FILE})
find_package(ROOT CONFIG REQUIRED)
include(${ROOT_USE_FILE})
find_package(VTK REQUIRED)
# include(${VTK_USE_FILE})
link_directories("${ULIB_LIBRARY_DIRS}")
set(ULIB_LIBRARIES "@ULIB_SHARED_LIBRARIES@")
check_required_components(uLib)
# Set the variable to indicate that the package has been found.
set(uLib_FOUND TRUE)
# These are IMPORTED targets created by FooBarTargets.cmake
set(ULIB_LIBRARIES @ULIB_SHARED_LIBRARIES@)