88 lines
3.3 KiB
C++
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;
|
|
}
|
|
|
|
|