// Copyright (2019-2023) Paul Scherrer Institute #ifndef JUNGFRAUJOCH_RAWTOCONVERTEDGEOMETRY_H #define JUNGFRAUJOCH_RAWTOCONVERTEDGEOMETRY_H #include #include "RawToConvertedGeometryCore.h" #include "Coord.h" #include "DiffractionExperiment.h" // Input coord is column + 1024 * (line + 512 * module) // Copies result over multipixel - can be used for example for mask calculation template void RawToConvertedGeometry(const DiffractionExperiment &experiment, Td *destination, const Ts *source) { for (size_t module_number = 0; module_number < experiment.GetModulesNum(); module_number++) TransferModule(destination + experiment.GetPixel0OfModule(module_number), source + module_number * RAW_MODULE_SIZE, experiment.GetModuleSlowDirectionStep(module_number), experiment.GetModuleFastDirectionStep(module_number)); } inline std::pair RawToConvertedCoordinate(const DiffractionExperiment& experiment, uint32_t module_number, uint32_t pixel_within_module) { int64_t pixel0 = experiment.GetPixel0OfModule(module_number); int64_t line = pixel_within_module / RAW_MODULE_COLS; int64_t col = pixel_within_module % RAW_MODULE_COLS; line += (line / 256) * 2; col += (col / 256) * 2; int64_t pixel = pixel0 + col * experiment.GetModuleFastDirectionStep(module_number) + line * experiment.GetModuleSlowDirectionStep(module_number); return {pixel % experiment.GetXPixelsNum() , pixel / experiment.GetXPixelsNum()}; } template void ConvertedToRawGeometry(const DiffractionExperiment &experiment, T *destination, const T *source) { for (size_t module_number = 0; module_number < experiment.GetModulesNum(); module_number++) { for (size_t line = 0; line < RAW_MODULE_LINES; line++) { LineConvtToRaw(destination + module_number * RAW_MODULE_SIZE + RAW_MODULE_COLS * line, source + experiment.GetPixel0OfModule(module_number) + experiment.GetModuleSlowDirectionStep(module_number) * (line + ((line > 255) ? 2 : 0)) ); } } } // Input coord is column + 1024 * (line + 512 * module) template void RawToConvertedGeometryAdjustMultipixels(const DiffractionExperiment &experiment, Ts *destination, const Ts *source) { Ts min = experiment.GetUnderflow() + 1; if (min > 0) min = 0; Ts max = experiment.GetOverflow() - 1; for (size_t module_number = 0; module_number < experiment.GetModulesNum(); module_number++) { TransferModuleAdjustMultipixels(destination, source + module_number * RAW_MODULE_SIZE, experiment.GetModuleSlowDirectionStep(module_number), min, max, experiment.GetModuleFastDirectionStep(module_number), experiment.GetPixel0OfModule(module_number)); } } #endif