diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 4912fde..25015e2 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -6,10 +6,10 @@ "${workspaceFolder}/**" ], "defines": [], - "compilerPath": "/usr/bin/clang", + "compilerPath": "/usr/bin/g++", "cStandard": "c17", "cppStandard": "c++17", - "intelliSenseMode": "linux-clang-x64", + "intelliSenseMode": "linux-gcc-x64", "configurationProvider": "ms-vscode.cmake-tools" } ], diff --git a/.vscode/settings.json b/.vscode/settings.json index 052b81c..c31a2ab 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -52,6 +52,25 @@ "streambuf": "cpp", "cinttypes": "cpp", "typeinfo": "cpp", - "filesystem": "cpp" - } + "filesystem": "cpp", + "csignal": "cpp", + "cstring": "cpp", + "any": "cpp", + "condition_variable": "cpp", + "forward_list": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "unordered_set": "cpp", + "fstream": "cpp", + "mutex": "cpp", + "ranges": "cpp", + "semaphore": "cpp", + "span": "cpp", + "stop_token": "cpp", + "thread": "cpp", + "valarray": "cpp", + "variant": "cpp" + }, + "C_Cpp.errorSquiggles": "enabled" } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index d60fe21..98ac888 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,12 +6,20 @@ project(aare HOMEPAGE_URL "https://github.com/slsdetectorgroup/aare" LANGUAGES C CXX ) -# cmake_policy(SET CMP0135 NEW) -# include(GNUInstallDirs) +cmake_policy(SET CMP0135 NEW) + + +include(FetchContent) + +FetchContent_Declare(json + GIT_REPOSITORY https://github.com/nlohmann/json + GIT_TAG v3.11.3 +) +FetchContent_MakeAvailable(json) + +find_package(fmt 6 REQUIRED) -# include(cmake/helpers.cmake) -# default_build_type("Debug")] set(CMAKE_BUILD_TYPE "Debug") @@ -24,17 +32,8 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(USE_SANITIZER "Sanitizers for debugging" ON) option(DISABLE_WARNINGS "Disbale compilation warnings" OFF) -# option(USE_TESTS "Unit tests" OFF) -# option(USE_PYTHON "Python bindings" OFF) -# option(TUNE_LOCAL "Tune to exact CPU architecture" OFF) -# option(BUILD_EXAMPLES "Build examples" OFF) -# option(DISABLE_LTO "Disable Link Time Optimizations" OFF) -# if(NOT APPLE) -# set(CMAKE_INSTALL_RPATH $ORIGIN) -# endif() - set(OPTIONAL_FLAGS "") if(DISABLE_WARNINGS) set(OPTIONAL_FLAGS "${OPTIONAL_FLAGS} -Wall -Wextra -pedantic -Wno-unused-parameter -Wshadow -Wformat=2 -Wold-style-cast -Wnon-virtual-dtor -Wfloat-equal -Wconversion -Wlogical-op -Wshift-overflow=2 -Woverloaded-virtual -Winline") @@ -58,7 +57,6 @@ endif() -#Enable LTO if available include(CheckIPOSupported) check_ipo_supported(RESULT LTO_AVAILABLE) if((CMAKE_BUILD_TYPE STREQUAL "Release") AND LTO_AVAILABLE) @@ -67,9 +65,26 @@ else() message(STATUS "Building without link time optimization") endif() +set(SUPPRESSED_WARNINGS "-Wno-return-type") + +set(CMAKE_CXX_FLAGS "${OPTIONAL_FLAGS} ${OPTIMIZATION_FLAGS} ${SUPPRESSED_WARNINGS}") + -set(CMAKE_CXX_FLAGS "${OPTIONAL_FLAGS} ${OPTIMIZATION_FLAGS}") add_executable(aare) +target_link_libraries( aare +PRIVATE + nlohmann_json::nlohmann_json +PUBLIC + fmt::fmt +) + + + + + add_subdirectory(src) + + + diff --git a/README.md b/README.md index b7ee44c..46b0ba7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ # aare Data analysis library for PSI hybrid detectors + + + + +## file_io class diagram +![file_io class diagram](./extra/uml/out/file_io/ClassDiagram.png) \ No newline at end of file diff --git a/extra/uml/file_io.pu b/extra/uml/file_io.pu new file mode 100644 index 0000000..db9b7ef --- /dev/null +++ b/extra/uml/file_io.pu @@ -0,0 +1,36 @@ +@startuml ClassDiagram +abstract class FileFactory{ + {static} +getFactory(path):FileFactory + {abstract} +loadFile(path):File +} +class JsonFileFactory{ + +loadFile(path):JsonFile +} +class RawFileFactory{ + +loadFile(path):RawFile +} +class NumpyFileFactory{ + +loadFile(path):NumpyFile +} + +abstract File{ +} + +class JsonFile{ +} +class RawFile{ +} +class NumpyFile{ +} + +FileFactory <|-- RawFileFactory +FileFactory <|-- NumpyFileFactory +FileFactory <|-- JsonFileFactory + +File <|-- JsonFile +File <|-- RawFile +File <|-- NumpyFile + +FileFactory ..> File + +@enduml \ No newline at end of file diff --git a/extra/uml/out/file_io/ClassDiagram.png b/extra/uml/out/file_io/ClassDiagram.png new file mode 100644 index 0000000..f293f85 Binary files /dev/null and b/extra/uml/out/file_io/ClassDiagram.png differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4c44806..bf41f40 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,7 @@ add_subdirectory(file_io) add_subdirectory(core) add_subdirectory(processing) +add_subdirectory(common) -target_include_directories(aare PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_sources(aare PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp) \ No newline at end of file +target_include_directories(aare PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_sources(aare PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt new file mode 100644 index 0000000..ec461e6 --- /dev/null +++ b/src/common/CMakeLists.txt @@ -0,0 +1,7 @@ +target_include_directories(aare PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) + +target_include_directories(aare PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + + + diff --git a/src/core/include/defs.hpp b/src/common/include/defs.hpp similarity index 71% rename from src/core/include/defs.hpp rename to src/common/include/defs.hpp index 14218ab..e782527 100644 --- a/src/core/include/defs.hpp +++ b/src/common/include/defs.hpp @@ -10,4 +10,5 @@ using dynamic_shape = std::vector; enum class DetectorType { Jungfrau, Eiger, Mythen3, Moench }; -enum class TimingMode {Auto, Trigger}; \ No newline at end of file +enum class TimingMode {Auto, Trigger}; +DetectorType StringTo(std::string_view name); \ No newline at end of file diff --git a/src/file_io/CMakeLists.txt b/src/file_io/CMakeLists.txt index 5fab7d8..f402919 100644 --- a/src/file_io/CMakeLists.txt +++ b/src/file_io/CMakeLists.txt @@ -1,5 +1,14 @@ -target_include_directories(aare PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -set(FILE_IO_SOURCES "File.cpp" "FileFactory.cpp" "RawFileFactory.cpp") +target_include_directories(aare PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/file") +target_include_directories(aare PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/file_factory") +target_include_directories(aare PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") + +set(FILE_IO_SOURCES "file/File.cpp" + "file/JsonFile.cpp" + "file_factory/FileFactory.cpp" + "file_factory/JsonFileFactory.cpp" + "file_factory/RawFileFactory.cpp" + "helpers.cpp" + ) # append ${CMAKE_CURRENT_SOURCE_DIR} to the list of sources using for loop foreach(FILE_IO_SOURCE ${FILE_IO_SOURCES}) list(APPEND FILE_IO_SOURCES_WITH_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${FILE_IO_SOURCE}") diff --git a/src/file_io/File.hpp b/src/file_io/File.hpp deleted file mode 100644 index 8bbaf5c..0000000 --- a/src/file_io/File.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include "defs.hpp" - -class File -{ -private: - // std::unique_ptr fp; -public: - // File(); - // ~File(); - size_t total_frames{}; - ssize_t rows{}; - ssize_t cols{}; - uint8_t bitdepth{}; - DetectorType type{}; - - inline size_t bytes_per_frame() const{ - //TODO: ask if this is correct - return rows*cols*bitdepth/8; - - } - inline size_t pixels() const{ - return rows*cols; - } - // size_t total_frames(); - -}; diff --git a/src/file_io/FileFactory.cpp b/src/file_io/FileFactory.cpp deleted file mode 100644 index bd0e8ef..0000000 --- a/src/file_io/FileFactory.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "FileFactory.hpp" -#include "File.hpp" -#include "RawFileFactory.hpp" -#include "JsonFileFactory.hpp" -#include - -File FileFactory::loadFile(std::filesystem::path fpath){ - // check if file exists - if(!std::filesystem::exists(fpath)){ - throw std::runtime_error("File does not exist"); - } - - File ret; - // check if extension is raw - if(fpath.extension() == ".raw"){ - std::cout<<"Loading raw file"< -#include "File.hpp" - -class FileFactory{ - // Class that will be used to create File objects - // follows the factory pattern -public: - // virtual File createFile() = 0; - // virtual int deleteFile() = 0; - File loadFile(std::filesystem::path); //TODO: add option to load all file to memory or keep it on disk -}; diff --git a/src/file_io/JsonFileFactory.hpp b/src/file_io/JsonFileFactory.hpp deleted file mode 100644 index d44bb13..0000000 --- a/src/file_io/JsonFileFactory.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "FileFactory.hpp" - -class JsonFileFactory: FileFactory -{ -private: - /* data */ -public: - -}; - diff --git a/src/file_io/File.cpp b/src/file_io/file/File.cpp similarity index 100% rename from src/file_io/File.cpp rename to src/file_io/file/File.cpp diff --git a/src/file_io/file/File.hpp b/src/file_io/file/File.hpp new file mode 100644 index 0000000..9680348 --- /dev/null +++ b/src/file_io/file/File.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include +#include "defs.hpp" +#include + +class File +{ +public: + std::filesystem::path base_path; + std::string base_name,ext; + int findex, n_subfiles; + size_t total_frames{}; + + std::string version; + DetectorType type; + TimingMode timing_mode; + int subfile_rows, subfile_cols; + + + + + ssize_t rows{}; + ssize_t cols{}; + uint8_t bitdepth{}; + DetectorType type{}; + // File(); + // ~File(); + + + inline size_t bytes_per_frame() const{ + return rows*cols*bitdepth/8; + + } + inline size_t pixels() const{ + return rows*cols; + } + inline std::filesystem::path master_fname() { + return base_path / fmt::format("{}_master_{}{}", base_name, findex, ext); + } + inline std::filesystem::path data_fname(int mod_id, int file_id) { + return base_path / fmt::format("{}_d{}_f{}_{}.raw", base_name, mod_id, file_id, findex); + } + // size_t total_frames(); + +}; diff --git a/src/file_io/RawFileFactory.cpp b/src/file_io/file/JsonFile.cpp similarity index 100% rename from src/file_io/RawFileFactory.cpp rename to src/file_io/file/JsonFile.cpp diff --git a/src/file_io/file/JsonFile.hpp b/src/file_io/file/JsonFile.hpp new file mode 100644 index 0000000..8a90306 --- /dev/null +++ b/src/file_io/file/JsonFile.hpp @@ -0,0 +1,6 @@ +#pragma once + +class JsonFile: public File +{ + +}; \ No newline at end of file diff --git a/src/file_io/file_factory/FileFactory.cpp b/src/file_io/file_factory/FileFactory.cpp new file mode 100644 index 0000000..b323ec0 --- /dev/null +++ b/src/file_io/file_factory/FileFactory.cpp @@ -0,0 +1,41 @@ +#include "FileFactory.hpp" +#include "File.hpp" +#include "RawFileFactory.hpp" +#include "JsonFileFactory.hpp" +#include + + + +FileFactory FileFactory::getFactory(std::filesystem::path fpath){ + // check if file exists + if(!std::filesystem::exists(fpath)){ + throw std::runtime_error("File does not exist"); + } + + if(fpath.extension() == ".raw"){ + std::cout<<"Loading raw file"< +#include "File.hpp" + +class FileFactory{ + // Class that will be used to create File objects + // follows the factory pattern + protected: + std::filesystem::path fpath; +public: + static FileFactory getFactory(std::filesystem::path); + // virtual int deleteFile() = 0; + virtual File loadFile(){};//TODO: add option to load all file to memory or keep it on disk + virtual void parse_metadata(File&){}; + + // inline fs::path master_fname() const { + // return base_path / fmt::format("{}_master_{}{}", base_name, findex, ext);} + + void parse_fname(File&); + +}; diff --git a/src/file_io/file_factory/JsonFileFactory.cpp b/src/file_io/file_factory/JsonFileFactory.cpp new file mode 100644 index 0000000..e62082f --- /dev/null +++ b/src/file_io/file_factory/JsonFileFactory.cpp @@ -0,0 +1,56 @@ +#include "JsonFileFactory.hpp" +#include "JsonFile.hpp" +#include "helpers.hpp" +#include +#include + +#include + +using json = nlohmann::json; + + + +JsonFileFactory::JsonFileFactory(std::filesystem::path fpath){ + if(not is_master_file(fpath)) + throw std::runtime_error("Json file is not a master file"); + this->fpath = fpath; +} + +void JsonFileFactory::parse_metadata(File& file){ + std::cout<<"Parsing metadata"<> j; + double v = j["Version"]; + file.version = fmt::format("{:.1f}", v); + file.type = StringTo(j["Detector Type"].get()); + file.timing_mode = StringTo(j["Timing Mode"].get()); + file.total_frames = j["Frames in File"]; + file.subfile_cols = j["Pixels"]["x"]; + file.subfile_rows = j["Pixels"]["y"]; + if (type_ == DetectorType::Moench) + bitdepth_ = 16; + else + bitdepth_ = j["Dynamic Range"]; + + // only Eiger had quad + if (type_ == DetectorType::Eiger) { + quad_ = (j["Quad"] == 1); + } + + + + +} + +File JsonFileFactory::loadFile(){ + std::cout<<"Loading json file"<parse_fname(file); + this->parse_metadata(file); + + + + + return file; +} \ No newline at end of file diff --git a/src/file_io/file_factory/JsonFileFactory.hpp b/src/file_io/file_factory/JsonFileFactory.hpp new file mode 100644 index 0000000..410db1c --- /dev/null +++ b/src/file_io/file_factory/JsonFileFactory.hpp @@ -0,0 +1,13 @@ +#include "FileFactory.hpp" + +class JsonFileFactory: public FileFactory +{ +private: + /* data */ +public: + File loadFile() override; + void parse_metadata(File&) override; + JsonFileFactory(std::filesystem::path fpath); + +}; + diff --git a/src/file_io/file_factory/RawFileFactory.cpp b/src/file_io/file_factory/RawFileFactory.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/file_io/RawFileFactory.hpp b/src/file_io/file_factory/RawFileFactory.hpp similarity index 100% rename from src/file_io/RawFileFactory.hpp rename to src/file_io/file_factory/RawFileFactory.hpp diff --git a/src/file_io/helpers.cpp b/src/file_io/helpers.cpp new file mode 100644 index 0000000..6b58ea3 --- /dev/null +++ b/src/file_io/helpers.cpp @@ -0,0 +1,11 @@ +#include "helpers.hpp" + + +bool is_master_file(std::filesystem::path fpath) { + std::string stem = fpath.stem(); + if (stem.find("_master_") != std::string::npos) + return true; + else + return false; +} + diff --git a/src/file_io/helpers.hpp b/src/file_io/helpers.hpp new file mode 100644 index 0000000..0dd86fa --- /dev/null +++ b/src/file_io/helpers.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include "File.hpp" +#include +#include + +bool is_master_file(std::filesystem::path fpath); + diff --git a/src/main.cpp b/src/main.cpp index 27c632b..e90319f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,10 +1,10 @@ // Your First C++ Program #include -#include "file_io/FileFactory.hpp" +#include "file_io/file_factory/FileFactory.hpp" int main() { - FileFactory fileFactory=FileFactory(); - std::filesystem::path p = std::filesystem::current_path(); - File f = fileFactory.loadFile(p/"test.raw"); + FileFactory fileFactory=FileFactory::getFactory(std::filesystem::current_path()/"test.json"); + + File f = fileFactory.loadFile(); }