63 std::ostringstream oss;
64 oss <<
"Validation " << (
is_valid ?
"PASSED" :
"FAILED");
75 : options_(options) {}
95 for (
const auto& finding : result.
findings) {
118 for (
const auto& finding : result.findings) {
120 result.is_valid =
false;
143 if (modality !=
"US")
return false;
177 std::vector<validation_finding>& findings)
const {
190 std::vector<validation_finding>& findings)
const {
209 std::vector<validation_finding>& findings)
const {
228 std::vector<validation_finding>& findings)
const {
237 constexpr dicom_tag sequence_of_ultrasound_regions{0x0018, 0x6011};
238 if (!dataset.
contains(sequence_of_ultrasound_regions)) {
241 sequence_of_ultrasound_regions,
242 "SequenceOfUltrasoundRegions (0018,6011) not present - "
243 "no calibration information available",
252 std::vector<validation_finding>& findings)
const {
275 std::vector<validation_finding>& findings)
const {
278 constexpr dicom_tag frame_time{0x0018, 0x1063};
279 constexpr dicom_tag frame_time_vector{0x0018, 0x1065};
288 if (!dataset.
contains(frame_time) && !dataset.
contains(frame_time_vector)) {
292 "Neither FrameTime nor FrameTimeVector present - "
293 "frame timing information missing",
302 std::vector<validation_finding>& findings)
const {
317 "SOPClassUID is not a recognized US Storage SOP Class: " + sop_class,
331 std::string_view
name,
332 std::vector<validation_finding>& findings)
const {
338 std::string(
"Type 1 attribute missing: ") + std::string(
name) +
349 std::string(
"Type 1 attribute has empty value: ") +
360 std::string_view
name,
361 std::vector<validation_finding>& findings)
const {
368 std::string(
"Type 2 attribute missing: ") + std::string(
name) +
377 std::vector<validation_finding>& findings)
const {
384 if (modality !=
"US") {
388 "Modality must be 'US' for ultrasound images, found: " + modality,
396 std::vector<validation_finding>& findings)
const {
403 if (bits_allocated && bits_stored) {
404 if (*bits_stored > *bits_allocated) {
408 "BitsStored (" + std::to_string(*bits_stored) +
409 ") exceeds BitsAllocated (" + std::to_string(*bits_allocated) +
")",
416 if (bits_stored && high_bit) {
417 if (*high_bit != *bits_stored - 1) {
421 "HighBit (" + std::to_string(*high_bit) +
422 ") should typically be BitsStored - 1 (" +
423 std::to_string(*bits_stored - 1) +
")",
436 "Unusual photometric interpretation for US: " + photometric,
446 bool is_color = (photometric ==
"RGB" || photometric ==
"YBR_FULL" ||
447 photometric ==
"YBR_FULL_422" || photometric ==
"PALETTE COLOR");
449 if (is_color && *samples != 3) {
453 "Color photometric interpretation requires SamplesPerPixel = 3",
458 if (!is_color && *samples != 1) {
462 "Grayscale photometric interpretation requires SamplesPerPixel = 1",
auto get_numeric(dicom_tag tag) const -> std::optional< T >
Get the numeric value of an element.
auto contains(dicom_tag tag) const noexcept -> bool
Check if the dataset contains an element with the given tag.
auto get_string(dicom_tag tag, std::string_view default_value="") const -> std::string
Get the string value of an element.
auto to_string() const -> std::string
Convert to string representation.
void validate_general_study_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
us_iod_validator()=default
Construct validator with default options.
void validate_image_pixel_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
us_validation_options options_
void check_modality(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
void check_type2_attribute(const core::dicom_dataset &dataset, core::dicom_tag tag, std::string_view name, std::vector< validation_finding > &findings) const
void validate_us_image_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_sop_common_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
bool quick_check(const core::dicom_dataset &dataset) const
Quick check if dataset has minimum required attributes.
validation_result validate_multiframe(const core::dicom_dataset &dataset) const
Validate a multi-frame US dataset.
void validate_general_series_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
const us_validation_options & options() const noexcept
Get the validation options.
validation_result validate(const core::dicom_dataset &dataset) const
Validate a DICOM dataset against US IOD.
void check_pixel_data_consistency(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void set_options(const us_validation_options &options)
Set validation options.
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_multiframe_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
Compile-time constants for commonly used DICOM tags.
bool is_us_storage_sop_class(std::string_view uid) noexcept
Check if a SOP Class UID is a US Storage SOP Class.
bool is_valid_us_photometric(std::string_view value) noexcept
Check if photometric interpretation is valid for US.
@ warning
Non-critical - IOD may have issues.
@ info
Informational - suggestion for improvement.
@ error
Critical - IOD is non-compliant.
bool is_valid_us_dataset(const core::dicom_dataset &dataset)
Quick check if a dataset is a valid US image.
validation_result validate_us_iod(const core::dicom_dataset &dataset)
Validate a US dataset with default options.
Options for US IOD validation.
bool check_type2
Check Type 2 (required, can be empty) attributes.
bool validate_pixel_data
Validate pixel data consistency (rows, columns, bits)
bool check_type1
Check Type 1 (required) attributes.
bool strict_mode
Strict mode - treat warnings as errors.
bool check_conditional
Check Type 1C/2C (conditionally required) attributes.
Result of IOD validation.
std::vector< validation_finding > findings
All findings during validation.
std::string summary() const
Get a formatted summary string.
size_t error_count() const noexcept
Get count of errors.
bool is_valid
Overall validation status.
bool has_errors() const noexcept
Check if there are any errors.
size_t warning_count() const noexcept
Get count of warnings.
bool has_warnings() const noexcept
Check if there are any warnings.
constexpr dicom_tag number_of_frames
Ultrasound Image IOD Validator.
Ultrasound Image Storage SOP Classes.