28 : options_(options) {}
58 for (
const auto& finding : result.
findings) {
83 if (modality !=
"OP" && modality !=
"OPT")
return false;
122 std::vector<validation_finding>& findings)
const {
131 "PatientBirthDate", findings);
139 std::vector<validation_finding>& findings)
const {
144 "StudyInstanceUID", findings);
154 "ReferringPhysicianName", findings);
157 "AccessionNumber", findings);
163 std::vector<validation_finding>& findings)
const {
169 "SeriesInstanceUID", findings);
184 std::vector<validation_finding>& findings)
const {
195 "ImageLaterality", findings);
207 "AnatomicRegionSequence (0008,2218) missing - anatomic "
208 "region unspecified",
218 "AcquisitionDeviceTypeCodeSequence (0022,0015) not present "
219 "- device type unavailable",
229 "HorizontalFieldOfView (0022,000C) not present - field of "
239 "PupilDilated (0022,000D) not present - pupil dilation "
248 std::vector<validation_finding>& findings)
const {
253 "SamplesPerPixel", findings);
255 "PhotometricInterpretation", findings);
264 "PixelRepresentation", findings);
275 std::vector<validation_finding>& findings)
const {
291 "NumberOfFrames (0028,0008) required for OCT multi-frame "
300 std::vector<validation_finding>& findings)
const {
307 "AcquisitionContextSequence (0040,0555) not present - "
308 "acquisition context unavailable",
315 std::vector<validation_finding>& findings)
const {
322 "SOPInstanceUID", findings);
331 "SOPClassUID is not a recognized Ophthalmic Storage SOP "
332 "Class: " + sop_class,
344 std::vector<validation_finding>& findings)
const {
349 std::string(
"Type 1 attribute missing: ") + std::string(
name) +
351 "OPHTH-TYPE1-MISSING"});
358 std::string(
"Type 1 attribute has empty value: ") +
360 "OPHTH-TYPE1-EMPTY"});
367 std::vector<validation_finding>& findings)
const {
373 std::string(
"Type 2 attribute missing: ") + std::string(
name) +
375 "OPHTH-TYPE2-MISSING"});
381 std::vector<validation_finding>& findings)
const {
388 if (modality !=
"OP" && modality !=
"OPT") {
391 "Modality must be 'OP' or 'OPT' for ophthalmic images, "
392 "found: " + modality,
399 std::vector<validation_finding>& findings)
const {
407 if (laterality !=
"R" && laterality !=
"L" && laterality !=
"B") {
411 "ImageLaterality must be 'R' (Right), 'L' (Left), or "
412 "'B' (Both), found: " + laterality,
419 std::vector<validation_finding>& findings)
const {
422 auto bits_allocated =
427 if (bits_allocated && bits_stored) {
428 if (*bits_stored > *bits_allocated) {
431 "BitsStored (" + std::to_string(*bits_stored) +
432 ") exceeds BitsAllocated (" +
433 std::to_string(*bits_allocated) +
")",
439 if (bits_stored && high_bit) {
440 if (*high_bit != *bits_stored - 1) {
443 "HighBit (" + std::to_string(*high_bit) +
444 ") should typically be BitsStored - 1 (" +
445 std::to_string(*bits_stored - 1) +
")",
458 "Ophthalmic images must use MONOCHROME1, MONOCHROME2, "
459 "RGB, YBR_FULL_422, or PALETTE COLOR, found: " + photometric,
466 if (samples && *samples != 1 && *samples != 3) {
469 "Ophthalmic images require SamplesPerPixel of 1 or 3, "
470 "found: " + std::to_string(*samples),
477 if (pixel_rep && *pixel_rep != 0) {
480 "Ophthalmic images typically use unsigned pixel representation "
481 "(PixelRepresentation = 0)",
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_acquisition_context_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_ophthalmic_image_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_image_pixel_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 ophthalmic attributes.
ophthalmic_validation_options options_
void set_options(const ophthalmic_validation_options &options)
Set validation options.
void check_pixel_data_consistency(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_general_study_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
const ophthalmic_validation_options & options() const noexcept
Get the validation options.
void validate_multiframe_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
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_type1_attribute(const core::dicom_dataset &dataset, core::dicom_tag tag, std::string_view name, std::vector< validation_finding > &findings) const
void check_laterality(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 Ophthalmic IOD.
void validate_general_series_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
ophthalmic_iod_validator()=default
Construct validator with default options.
Compile-time constants for commonly used DICOM tags.
constexpr std::string_view ophthalmic_oct_bscan_analysis_storage_uid
Ophthalmic Optical Coherence Tomography B-scan Volume Analysis Storage.
bool is_ophthalmic_storage_sop_class(std::string_view uid) noexcept
Check if a SOP Class UID is an Ophthalmic Storage SOP Class.
constexpr std::string_view ophthalmic_tomography_storage_uid
Ophthalmic Tomography Image Storage (OCT)
bool is_valid_ophthalmic_photometric(std::string_view value) noexcept
Check if photometric interpretation is valid for ophthalmic imaging.
validation_result validate_ophthalmic_iod(const core::dicom_dataset &dataset)
Validate an ophthalmic dataset with default options.
@ warning
Non-critical - IOD may have issues.
@ info
Informational - suggestion for improvement.
@ error
Critical - IOD is non-compliant.
bool is_valid_ophthalmic_dataset(const core::dicom_dataset &dataset)
Quick check if a dataset is a valid ophthalmic image.
Ophthalmic Photography and Tomography Image IOD Validator.
Ophthalmic Photography and Tomography Storage SOP Classes.
Options for Ophthalmic IOD validation.
bool validate_ophthalmic_params
Validate ophthalmic-specific image parameters.
bool check_conditional
Check Type 1C/2C (conditionally required) attributes.
bool validate_pixel_data
Validate pixel data consistency (rows, columns, bits)
bool strict_mode
Strict mode - treat warnings as errors.
bool check_type2
Check Type 2 (required, can be empty) attributes.
bool validate_laterality
Validate laterality (R/L/B)
bool check_type1
Check Type 1 (required) attributes.
Result of IOD validation.
std::vector< validation_finding > findings
All findings during validation.
bool is_valid
Overall validation status.