Files
Jungfraujoch/common/RawToConvertedGeometry.h

69 lines
3.2 KiB
C++

// Copyright (2019-2023) Paul Scherrer Institute
#ifndef JUNGFRAUJOCH_RAWTOCONVERTEDGEOMETRY_H
#define JUNGFRAUJOCH_RAWTOCONVERTEDGEOMETRY_H
#include <cmath>
#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<class Td, class Ts>
void RawToConvertedGeometry(const DiffractionExperiment &experiment, Td *destination, const Ts *source) {
for (size_t module_number = 0; module_number < experiment.GetModulesNum(); module_number++)
TransferModule<Td, Ts>(destination + experiment.GetPixel0OfModule(module_number),
source + module_number * RAW_MODULE_SIZE,
experiment.GetModuleSlowDirectionStep(module_number),
experiment.GetModuleFastDirectionStep(module_number));
}
inline std::pair<int64_t, int64_t> 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<class T>
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<T>(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<class Ts>
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<Ts, Ts>(destination,
source + module_number * RAW_MODULE_SIZE,
experiment.GetModuleSlowDirectionStep(module_number),
min, max,
experiment.GetModuleFastDirectionStep(module_number),
experiment.GetPixel0OfModule(module_number));
}
}
#endif