PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
xa_iod_validator.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
26#ifndef PACS_SERVICES_VALIDATION_XA_IOD_VALIDATOR_HPP
27#define PACS_SERVICES_VALIDATION_XA_IOD_VALIDATOR_HPP
28
31#include "kcenon/pacs/services/validation/us_iod_validator.h" // Reuse validation types
32
33#include <optional>
34#include <string>
35#include <vector>
36
38
39// =============================================================================
40// XA-Specific DICOM Tags (not in core tag constants)
41// =============================================================================
42
43namespace xa_tags {
44
46inline constexpr core::dicom_tag number_of_frames{0x0028, 0x0008};
47
49inline constexpr core::dicom_tag frame_time{0x0018, 0x1063};
50
52inline constexpr core::dicom_tag frame_time_vector{0x0018, 0x1065};
53
55inline constexpr core::dicom_tag cine_rate{0x0018, 0x0040};
56
58inline constexpr core::dicom_tag recommended_display_frame_rate{0x0008, 0x2144};
59
61inline constexpr core::dicom_tag field_of_view_shape{0x0018, 0x1147};
62
64inline constexpr core::dicom_tag field_of_view_dimensions{0x0018, 0x1149};
65
67inline constexpr core::dicom_tag positioner_motion{0x0018, 0x1500};
68
70inline constexpr core::dicom_tag positioner_primary_angle{0x0018, 0x1510};
71
73inline constexpr core::dicom_tag positioner_secondary_angle{0x0018, 0x1511};
74
76inline constexpr core::dicom_tag positioner_primary_angle_increment{0x0018, 0x1520};
77
80
82inline constexpr core::dicom_tag imager_pixel_spacing{0x0018, 0x1164};
83
85inline constexpr core::dicom_tag distance_source_to_detector{0x0018, 0x1110};
86
88inline constexpr core::dicom_tag distance_source_to_patient{0x0018, 0x1111};
89
91inline constexpr core::dicom_tag intensifier_size{0x0018, 0x1162};
92
94inline constexpr core::dicom_tag grid{0x0018, 0x1166};
95
97inline constexpr core::dicom_tag kvp{0x0018, 0x0060};
98
100inline constexpr core::dicom_tag exposure_time{0x0018, 0x1150};
101
103inline constexpr core::dicom_tag xray_tube_current{0x0018, 0x1151};
104
105} // namespace xa_tags
106
107// =============================================================================
108// XA Validation Options
109// =============================================================================
110
116 bool check_type1 = true;
117
119 bool check_type2 = true;
120
122 bool check_conditional = true;
123
126
129
132
135
137 bool strict_mode = false;
138};
139
140// =============================================================================
141// XA IOD Validator
142// =============================================================================
143
182public:
186 xa_iod_validator() = default;
187
192 explicit xa_iod_validator(const xa_validation_options& options);
193
200 [[nodiscard]] validation_result validate(const core::dicom_dataset& dataset) const;
201
211 [[nodiscard]] validation_result
212 validate_multiframe(const core::dicom_dataset& dataset) const;
213
222 [[nodiscard]] bool quick_check(const core::dicom_dataset& dataset) const;
223
233 [[nodiscard]] validation_result
234 validate_calibration(const core::dicom_dataset& dataset) const;
235
239 [[nodiscard]] const xa_validation_options& options() const noexcept;
240
244 void set_options(const xa_validation_options& options);
245
246private:
247 // Module validation methods
249 const core::dicom_dataset& dataset,
250 std::vector<validation_finding>& findings) const;
251
253 const core::dicom_dataset& dataset,
254 std::vector<validation_finding>& findings) const;
255
257 const core::dicom_dataset& dataset,
258 std::vector<validation_finding>& findings) const;
259
261 const core::dicom_dataset& dataset,
262 std::vector<validation_finding>& findings) const;
263
265 const core::dicom_dataset& dataset,
266 std::vector<validation_finding>& findings) const;
267
269 const core::dicom_dataset& dataset,
270 std::vector<validation_finding>& findings) const;
271
273 const core::dicom_dataset& dataset,
274 std::vector<validation_finding>& findings) const;
275
277 const core::dicom_dataset& dataset,
278 std::vector<validation_finding>& findings) const;
279
281 const core::dicom_dataset& dataset,
282 std::vector<validation_finding>& findings) const;
283
284 // Attribute validation helpers
286 const core::dicom_dataset& dataset,
287 core::dicom_tag tag,
288 std::string_view name,
289 std::vector<validation_finding>& findings) const;
290
292 const core::dicom_dataset& dataset,
293 core::dicom_tag tag,
294 std::string_view name,
295 std::vector<validation_finding>& findings) const;
296
297 void check_modality(
298 const core::dicom_dataset& dataset,
299 std::vector<validation_finding>& findings) const;
300
302 const core::dicom_dataset& dataset,
303 std::vector<validation_finding>& findings) const;
304
306 const core::dicom_dataset& dataset,
307 std::vector<validation_finding>& findings) const;
308
310 const core::dicom_dataset& dataset,
311 std::vector<validation_finding>& findings) const;
312
314};
315
316// =============================================================================
317// Convenience Functions
318// =============================================================================
319
326[[nodiscard]] validation_result validate_xa_iod(const core::dicom_dataset& dataset);
327
334[[nodiscard]] bool is_valid_xa_dataset(const core::dicom_dataset& dataset);
335
342[[nodiscard]] bool has_qca_calibration(const core::dicom_dataset& dataset);
343
344} // namespace kcenon::pacs::services::validation
345
346#endif // PACS_SERVICES_VALIDATION_XA_IOD_VALIDATOR_HPP
void validate_calibration_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_multiframe_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void check_pixel_data_consistency(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
validation_result validate_calibration(const core::dicom_dataset &dataset) const
Validate calibration data for quantitative analysis.
void set_options(const xa_validation_options &options)
Set validation options.
validation_result validate_multiframe(const core::dicom_dataset &dataset) const
Validate a multi-frame XA dataset.
void validate_sop_common_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
const xa_validation_options & options() const noexcept
Get the validation options.
void check_type2_attribute(const core::dicom_dataset &dataset, core::dicom_tag tag, std::string_view name, std::vector< validation_finding > &findings) const
void check_modality(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void check_positioner_angles(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_xa_acquisition_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void check_xa_photometric(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
xa_iod_validator()=default
Construct validator with default options.
bool quick_check(const core::dicom_dataset &dataset) const
Quick check if dataset has minimum required XA attributes.
void validate_general_series_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_image_pixel_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_patient_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
validation_result validate(const core::dicom_dataset &dataset) const
Validate a DICOM dataset against XA IOD.
void check_type1_attribute(const core::dicom_dataset &dataset, core::dicom_tag tag, std::string_view name, std::vector< validation_finding > &findings) const
void validate_general_study_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_xa_image_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
DICOM Dataset - ordered collection of Data Elements.
DICOM Tag representation (Group, Element pairs)
constexpr core::dicom_tag distance_source_to_patient
Distance Source to Patient (0018,1111) - SOD.
constexpr core::dicom_tag xray_tube_current
X-Ray Tube Current (0018,1151) - in mA.
constexpr core::dicom_tag number_of_frames
Number of Frames (0028,0008) - for multi-frame.
constexpr core::dicom_tag positioner_secondary_angle
Positioner Secondary Angle (0018,1511) - Cranial/Caudal.
constexpr core::dicom_tag recommended_display_frame_rate
Recommended Display Frame Rate (0008,2144)
constexpr core::dicom_tag positioner_primary_angle_increment
Positioner Primary Angle Increment (0018,1520) - for rotational.
constexpr core::dicom_tag imager_pixel_spacing
Imager Pixel Spacing (0018,1164) - at detector plane.
constexpr core::dicom_tag grid
Grid (0018,1166) - anti-scatter grid presence.
constexpr core::dicom_tag positioner_primary_angle
Positioner Primary Angle (0018,1510) - LAO/RAO.
constexpr core::dicom_tag exposure_time
Exposure Time (0018,1150) - in ms.
constexpr core::dicom_tag field_of_view_shape
Field of View Shape (0018,1147)
constexpr core::dicom_tag positioner_motion
Positioner Motion (0018,1500)
constexpr core::dicom_tag kvp
KVP (0018,0060) - X-ray tube peak kilovoltage.
constexpr core::dicom_tag distance_source_to_detector
Distance Source to Detector (0018,1110) - SID.
constexpr core::dicom_tag frame_time
Frame Time (0018,1063) - time between frames in ms.
constexpr core::dicom_tag intensifier_size
Intensifier Size (0018,1162) - image intensifier diameter.
constexpr core::dicom_tag frame_time_vector
Frame Time Vector (0018,1065) - variable frame timing.
constexpr core::dicom_tag positioner_secondary_angle_increment
Positioner Secondary Angle Increment (0018,1521) - for rotational.
constexpr core::dicom_tag cine_rate
Cine Rate (0018,0040) - intended display rate.
constexpr core::dicom_tag field_of_view_dimensions
Field of View Dimensions (0018,1149)
bool is_valid_xa_dataset(const core::dicom_dataset &dataset)
Quick check if a dataset is a valid XA image.
bool has_qca_calibration(const core::dicom_dataset &dataset)
Check if dataset has valid QCA calibration data.
validation_result validate_xa_iod(const core::dicom_dataset &dataset)
Validate an XA dataset with default options.
bool strict_mode
Strict mode - treat warnings as errors.
bool validate_calibration
Validate calibration data for QCA.
bool check_conditional
Check Type 1C/2C (conditionally required) attributes.
bool check_type1
Check Type 1 (required) attributes.
bool validate_pixel_data
Validate pixel data consistency (rows, columns, bits)
bool check_type2
Check Type 2 (required, can be empty) attributes.
bool validate_multiframe_timing
Validate multi-frame timing information.
std::string_view name
Ultrasound Image IOD Validator.