Files
Jungfraujoch/common/ScanResult.h
T
2026-09-08 07:55:31 +02:00

88 lines
3.3 KiB
C++

// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#include <cstdint>
#include <vector>
#include <optional>
#include <string>
#include "CrystalLattice.h"
#include "UnitCell.h"
#include "GridScanResult.h"
#include "../image_analysis/geom_refinement/PowderCalibration.h" // CalibrationResult
struct ScanResultElem {
int64_t number = -1;
float collection_efficiency = 0.0;
std::optional<int64_t> x;
std::optional<int64_t> y;
std::optional<float> angle_deg;
std::optional<int64_t> pixel_sum;
std::optional<int64_t> indexed_lattice_count;
std::optional<int64_t> min_viable_pixel;
std::optional<int64_t> max_viable_pixel;
std::optional<int64_t> err_pixels;
std::optional<int64_t> sat_pixels;
std::optional<float> bkg;
std::optional<float> spindle_blind;
std::optional<int64_t> spot_count;
std::optional<int64_t> spot_count_low_res;
std::optional<int64_t> spot_count_indexed;
std::optional<int64_t> spot_count_ice;
std::optional<float> spot_count_ice_control;
std::optional<int64_t> indexing_solution;
std::optional<float> profile_radius;
std::optional<float> b_factor;
std::optional<float> res;
std::optional<UnitCell> uc;
std::optional<uint64_t> xfel_pulse_id;
std::optional<float> mosaicity;
std::optional<int64_t> niggli_class;
std::optional<int64_t> integrated_reflections;
std::optional<float> image_scale_factor;
std::optional<float> image_scale_cc;
std::optional<float> ice_ring_ratio;
std::optional<float> protein_score;
std::optional<float> ice_score;
};
struct ScanResult {
std::string file_prefix;
std::vector<ScanResultElem> images;
std::optional<CrystalLattice> rotation_lattice;
// Bravais lattice type of the global rotation-indexing solution (from RotationIndexer).
std::optional<gemmi::CrystalSystem> rotation_crystal_system;
std::optional<char> rotation_centering;
// What the run produced beyond the per-image list, one member per analysis mode that has an
// answer of its own. Same idiom as the three rotation_* members above: the payload of a mode is a
// top-level optional, present when that mode ran and absent otherwise, so images stays required
// and every existing /result/scan client is untouched.
std::optional<GridScanResult> grid; // AnalysisMode::Grid
std::optional<CalibrationResult> calibration; // AnalysisMode::PowderCalibration
};
// Two-letter Bravais lattice symbol: crystal-system letter + centering, e.g. "tP", "oC", "cF", "hR".
inline std::string BravaisSymbol(gemmi::CrystalSystem system, char centering) {
char family;
switch (system) {
case gemmi::CrystalSystem::Triclinic: family = 'a'; break;
case gemmi::CrystalSystem::Monoclinic: family = 'm'; break;
case gemmi::CrystalSystem::Orthorhombic: family = 'o'; break;
case gemmi::CrystalSystem::Tetragonal: family = 't'; break;
case gemmi::CrystalSystem::Trigonal: family = 'h'; break;
case gemmi::CrystalSystem::Hexagonal: family = 'h'; break;
case gemmi::CrystalSystem::Cubic: family = 'c'; break;
default: family = 'a'; break;
}
return std::string{family} + centering;
}