26 : options_(options) {}
52 for (
const auto& finding : result.
findings) {
79 if (modality !=
"MR")
return false;
120 std::vector<validation_finding>& findings)
const {
129 "PatientBirthDate", findings);
137 std::vector<validation_finding>& findings)
const {
142 "StudyInstanceUID", findings);
152 "ReferringPhysicianName", findings);
155 "AccessionNumber", findings);
161 std::vector<validation_finding>& findings)
const {
167 "SeriesInstanceUID", findings);
182 std::vector<validation_finding>& findings)
const {
187 "FrameOfReferenceUID", findings);
192 constexpr dicom_tag position_reference_indicator{0x0020, 0x1040};
194 "PositionReferenceIndicator", findings);
200 std::vector<validation_finding>& findings)
const {
211 std::vector<validation_finding>& findings)
const {
220 "ScanningSequence", findings);
222 "SequenceVariant", findings);
230 "MRAcquisitionType", findings);
234 "EchoTrainLength", findings);
236 "MagneticFieldStrength", findings);
243 if (image_type.find(
"ORIGINAL") != std::string::npos &&
247 "RepetitionTime (0018,0080) missing - required when "
248 "ImageType Value 1 is ORIGINAL",
256 if (seq.find(
"IR") != std::string::npos &&
260 "InversionTime (0018,0082) missing - required when "
261 "ScanningSequence contains IR",
270 "SliceThickness (0018,0050) not present - slice geometry "
271 "information unavailable",
282 "ImagePositionPatient (0020,0032) missing - required when "
283 "Frame of Reference is present",
293 "ImageOrientationPatient (0020,0037) missing - required when "
294 "Frame of Reference is present",
302 std::vector<validation_finding>& findings)
const {
307 "SamplesPerPixel", findings);
309 "PhotometricInterpretation", findings);
318 "PixelRepresentation", findings);
331 std::vector<validation_finding>& findings)
const {
338 "SOPInstanceUID", findings);
347 "SOPClassUID is not a recognized MR Storage SOP Class: " +
360 std::vector<validation_finding>& findings)
const {
365 std::string(
"Type 1 attribute missing: ") + std::string(
name) +
367 "MR-TYPE1-MISSING"});
374 std::string(
"Type 1 attribute has empty value: ") +
383 std::vector<validation_finding>& findings)
const {
389 std::string(
"Type 2 attribute missing: ") + std::string(
name) +
391 "MR-TYPE2-MISSING"});
397 std::vector<validation_finding>& findings)
const {
404 if (modality !=
"MR") {
407 "Modality must be 'MR' for MR images, found: " + modality,
414 std::vector<validation_finding>& findings)
const {
417 auto bits_allocated =
422 if (bits_allocated && bits_stored) {
423 if (*bits_stored > *bits_allocated) {
426 "BitsStored (" + std::to_string(*bits_stored) +
427 ") exceeds BitsAllocated (" +
428 std::to_string(*bits_allocated) +
")",
434 if (bits_stored && high_bit) {
435 if (*high_bit != *bits_stored - 1) {
438 "HighBit (" + std::to_string(*high_bit) +
439 ") should typically be BitsStored - 1 (" +
440 std::to_string(*bits_stored - 1) +
")",
453 "MR images must use MONOCHROME1 or MONOCHROME2, found: " +
461 if (samples && *samples != 1) {
464 "MR images require SamplesPerPixel = 1, found: " +
465 std::to_string(*samples),
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 check_modality(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_general_series_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
mr_iod_validator()=default
Construct validator with default options.
void set_options(const mr_validation_options &options)
Set validation options.
void check_pixel_data_consistency(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
mr_validation_options 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 validate_image_pixel_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 MR attributes.
void validate_patient_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
void validate_general_equipment_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_mr_image_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 MR IOD.
void validate_general_study_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 validate_frame_of_reference_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
const mr_validation_options & options() const noexcept
Get the validation options.
Compile-time constants for commonly used DICOM tags.
MR Image Storage SOP Classes.
bool is_mr_storage_sop_class(std::string_view uid) noexcept
Check if a SOP Class UID is an MR Storage SOP Class.
bool is_valid_mr_photometric(std::string_view value) noexcept
Check if photometric interpretation is valid for MR.
bool is_valid_mr_dataset(const core::dicom_dataset &dataset)
Quick check if a dataset is a valid MR image.
@ warning
Non-critical - IOD may have issues.
@ info
Informational - suggestion for improvement.
@ error
Critical - IOD is non-compliant.
validation_result validate_mr_iod(const core::dicom_dataset &dataset)
Validate an MR dataset with default options.
Options for MR IOD validation.
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 strict_mode
Strict mode - treat warnings as errors.
bool check_type2
Check Type 2 (required, can be empty) attributes.
bool validate_mr_params
Validate MR-specific acquisition parameters.
Result of IOD validation.
std::vector< validation_finding > findings
All findings during validation.
bool is_valid
Overall validation status.