75de40f52b
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 7m27s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 8m20s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 7m35s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 5m59s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 7m25s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 8m30s
Build Packages / build:rpm (rocky8) (push) Successful in 7m39s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 8m16s
Build Packages / build:rpm (rocky9) (push) Successful in 9m35s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 8m6s
Build Packages / Generate python client (push) Successful in 12s
Build Packages / Build documentation (push) Successful in 31s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (durin plugin) (push) Successful in 7m6s
Build Packages / DIALS test (push) Successful in 12m3s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m11s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 5m50s
Build Packages / Unit tests (push) Successful in 57m33s
This is an UNSTABLE release. The release has significant modifications for data processing - in case of troubles go back to 1.0.0-rc.144. * jfjoch_viewer: Add reciprocal space viewer * jfjoch_process: Two pass algorithm that does spot finding/indexing + integration of full dataset * jfjoch_process: Improve logic for rotation indexer, to make execution more deterministic (still work in progress) Reviewed-on: #57 Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch> Co-committed-by: Filip Leonarski <filip.leonarski@psi.ch>
128 lines
5.1 KiB
C++
128 lines
5.1 KiB
C++
// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#include "JFJochReader.h"
|
|
#include <future>
|
|
|
|
JFJochReader &JFJochReader::Experiment(const DiffractionExperiment &experiment) {
|
|
std::unique_lock ul(m);
|
|
default_experiment = experiment;
|
|
return *this;
|
|
}
|
|
|
|
void JFJochReader::SummationThread(int64_t image0, int64_t n_image, int64_t image_jump, JFJochReaderImage &image) {
|
|
std::vector<uint8_t> buffer;
|
|
DataMessage msg;
|
|
for (int64_t i = image0; i < n_image; i += image_jump) {
|
|
bool ret = LoadImage_i(dataset, msg, buffer, i, false);
|
|
if (ret) {
|
|
auto image_sum = std::make_shared<JFJochReaderImage>(msg, dataset);
|
|
{
|
|
std::unique_lock ul(summation_mutex);
|
|
image.AddImage(*image_sum);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
std::shared_ptr<JFJochReaderImage> JFJochReader::LoadImage(int64_t image_number, int64_t summation_factor) {
|
|
// It would be a mess to load two images at the same time
|
|
// so loading is protected via mutex
|
|
// yet copying share_ptr pointer is atomic and needs no mutex protection
|
|
std::unique_lock ul(m);
|
|
|
|
std::vector<uint8_t> buffer;
|
|
DataMessage msg;
|
|
|
|
if (LoadImage_i(dataset, msg, buffer, image_number, true)) {
|
|
auto image = std::make_shared<JFJochReaderImage>(msg, dataset);
|
|
if (summation_factor > 4) {
|
|
int64_t nthread = std::min<int64_t>(summation_factor - 1, 8);
|
|
|
|
std::vector<std::future<void>> futures;
|
|
for (int i = 0; i < nthread; i++)
|
|
futures.emplace_back(std::async(std::launch::async,
|
|
&JFJochReader::SummationThread, this,
|
|
image_number + 1 + i,
|
|
image_number + summation_factor,
|
|
nthread,
|
|
std::ref(*image)));
|
|
for (auto &f: futures)
|
|
f.get();
|
|
} else if (summation_factor > 1) {
|
|
SummationThread(image_number + 1, image_number + summation_factor, 1, *image);
|
|
}
|
|
return image;
|
|
}
|
|
return {};
|
|
}
|
|
|
|
void JFJochReader::SetStartMessage(const std::shared_ptr<JFJochReaderDataset> &val) {
|
|
std::unique_lock ul(m);
|
|
dataset = val;
|
|
}
|
|
|
|
std::shared_ptr<const JFJochReaderDataset> JFJochReader::GetDataset() const {
|
|
std::unique_lock ul(m);
|
|
return dataset;
|
|
}
|
|
|
|
void JFJochReader::UpdateGeomMetadata(const DiffractionExperiment &experiment) {
|
|
std::unique_lock ul(m);
|
|
if (!dataset)
|
|
return;
|
|
|
|
auto new_dataset = std::make_shared<JFJochReaderDataset>(*dataset);
|
|
// At the moment subset of options is limited to safe ones...need to change it in the future
|
|
|
|
new_dataset->experiment.BeamX_pxl(experiment.GetBeamX_pxl());
|
|
new_dataset->experiment.BeamY_pxl(experiment.GetBeamY_pxl());
|
|
new_dataset->experiment.DetectorDistance_mm(experiment.GetDetectorDistance_mm());
|
|
new_dataset->experiment.IncidentEnergy_keV(experiment.GetIncidentEnergy_keV());
|
|
new_dataset->experiment.PoniRot1_rad(experiment.GetDatasetSettings().GetPoniRot1_rad());
|
|
new_dataset->experiment.PoniRot2_rad(experiment.GetDatasetSettings().GetPoniRot2_rad());
|
|
new_dataset->experiment.PoniRot3_rad(experiment.GetDatasetSettings().GetPoniRot3_rad());
|
|
new_dataset->experiment.SetUnitCell(experiment.GetUnitCell());
|
|
new_dataset->experiment.SpaceGroupNumber(experiment.GetSpaceGroupNumber());
|
|
new_dataset->experiment.ImportIndexingSettings(experiment.GetIndexingSettings());
|
|
new_dataset->experiment.ImportBraggIntegrationSettings(experiment.GetBraggIntegrationSettings());
|
|
new_dataset->experiment.DetectIceRings(experiment.IsDetectIceRings());
|
|
dataset = new_dataset;
|
|
}
|
|
|
|
void JFJochReader::UpdateUserMask(const std::vector<uint32_t> &mask) {
|
|
std::unique_lock ul(m);
|
|
if (!dataset)
|
|
return;
|
|
auto new_dataset = std::make_shared<JFJochReaderDataset>(*dataset);
|
|
new_dataset->pixel_mask.LoadUserMask(dataset->experiment, mask);
|
|
dataset = new_dataset;
|
|
}
|
|
|
|
std::shared_ptr<JFJochReaderSpots> JFJochReader::ReadAllSpots(int64_t start_image, int64_t end_image,
|
|
int64_t stride) const {
|
|
|
|
if (start_image < 0)
|
|
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
|
|
"Start image must be non-negative");
|
|
|
|
if (start_image > end_image)
|
|
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
|
|
"Start image number is greater than end image number");
|
|
|
|
if (stride == 0)
|
|
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
|
|
"Stride cannot be zero");
|
|
|
|
size_t nelems = (end_image - start_image) / stride + 1;
|
|
|
|
auto ret = std::make_shared<JFJochReaderSpots>();
|
|
ret->start_image = static_cast<int64_t>(start_image);
|
|
ret->stride = static_cast<int64_t>(stride);
|
|
ret->spots.reserve(nelems);
|
|
|
|
for (int i = 0; i < nelems; i++)
|
|
ret->spots.emplace_back(ReadSpots(start_image + i * stride));
|
|
return ret;
|
|
}
|