26 : options_(options) {}
60 for (
const auto& finding : result.
findings) {
87 if (modality !=
"RWV" && modality !=
"PMAP")
return false;
129 std::vector<validation_finding>& findings)
const {
133 "PatientName", findings);
135 "PatientID", findings);
137 "PatientBirthDate", findings);
139 "PatientSex", findings);
145 std::vector<validation_finding>& findings)
const {
149 "StudyInstanceUID", findings);
154 "StudyDate", findings);
156 "StudyTime", findings);
158 "ReferringPhysicianName", findings);
160 "StudyID", findings);
162 "AccessionNumber", findings);
168 std::vector<validation_finding>& findings)
const {
172 "Modality", findings);
174 "SeriesInstanceUID", findings);
180 "SeriesNumber", findings);
186 std::vector<validation_finding>& findings)
const {
190 "Manufacturer", findings);
196 std::vector<validation_finding>& findings)
const {
200 "Manufacturer", findings);
202 "ManufacturerModelName", findings);
204 "DeviceSerialNumber", findings);
206 "SoftwareVersions", findings);
212 std::vector<validation_finding>& findings)
const {
216 "SamplesPerPixel", findings);
218 "PhotometricInterpretation", findings);
222 "BitsAllocated", findings);
224 "BitsStored", findings);
226 "HighBit", findings);
228 "PixelRepresentation", findings);
237 std::vector<validation_finding>& findings)
const {
242 "ContentLabel", findings);
248 "ContentDescription", findings);
250 "ContentCreatorName", findings);
259 "RealWorldValueMappingSequence (0040,9096) is required for "
260 "Parametric Map objects",
269 std::vector<validation_finding>& findings)
const {
276 "NumberOfFrames (0028,0008) is required for Parametric Map objects "
277 "(always multi-frame)",
288 "SharedFunctionalGroupsSequence (5200,9229) should be present "
289 "for multi-frame Parametric Map objects",
299 "PerFrameFunctionalGroupsSequence (5200,9230) should be present "
300 "for multi-frame Parametric Map objects",
309 std::vector<validation_finding>& findings)
const {
317 "Type 1 attribute missing: DimensionOrganizationSequence "
326 "Type 1 attribute missing: DimensionIndexSequence "
336 std::vector<validation_finding>& findings)
const {
343 "ReferencedSeriesSequence (0008,1115) should be present for "
344 "source image references",
353 std::vector<validation_finding>& findings)
const {
357 "SOPClassUID", findings);
359 "SOPInstanceUID", findings);
369 "SOPClassUID is not a recognized Parametric Map Storage SOP "
370 "Class: " + sop_class,
384 std::string_view
name,
385 std::vector<validation_finding>& findings)
const {
391 std::string(
"Type 1 attribute missing: ") + std::string(
name) +
396 const auto* element = dataset.
get(tag);
397 if (element !=
nullptr) {
398 if (element->is_sequence()) {
399 if (element->sequence_items().empty()) {
403 std::string(
"Type 1 sequence has no items: ") +
414 std::string(
"Type 1 attribute has empty value: ") +
427 std::string_view
name,
428 std::vector<validation_finding>& findings)
const {
434 std::string(
"Type 2 attribute missing: ") + std::string(
name) +
443 std::vector<validation_finding>& findings)
const {
450 if (modality !=
"RWV" && modality !=
"PMAP") {
454 "Modality must be 'RWV' or 'PMAP' for Parametric Map objects, "
455 "found: " + modality,
463 std::vector<validation_finding>& findings)
const {
467 if (samples && *samples != 1) {
471 "SamplesPerPixel must be 1 for Parametric Map objects",
484 "PhotometricInterpretation must be MONOCHROME2 for Parametric "
485 "Map objects, found: " + photometric,
499 "BitsAllocated must be 32 or 64 for Parametric Map objects "
500 "(float or double), found: " +
501 std::to_string(*bits_allocated),
508 if (bits_allocated && bits_stored && *bits_stored > *bits_allocated) {
512 "BitsStored (" + std::to_string(*bits_stored) +
513 ") exceeds BitsAllocated (" +
514 std::to_string(*bits_allocated) +
")",
521 if (bits_stored && high_bit && *high_bit != (*bits_stored - 1)) {
525 "HighBit (" + std::to_string(*high_bit) +
526 ") does not match BitsStored-1 (" +
527 std::to_string(*bits_stored - 1) +
")",
auto get(dicom_tag tag) noexcept -> dicom_element *
Get a pointer to the element with the given tag.
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_patient_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void set_options(const pmap_validation_options &options)
Set 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 validate_general_series_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
parametric_map_iod_validator()=default
Construct validator with default options.
void validate_image_pixel_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
void validate_multiframe_functional_groups_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_multiframe_dimension_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_enhanced_general_equipment_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
validation_result validate(const core::dicom_dataset &dataset) const
Validate a DICOM dataset against Parametric Map IOD.
bool quick_check(const core::dicom_dataset &dataset) const
Quick check if dataset has minimum required parametric map attributes.
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_common_instance_reference_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_parametric_map_image_module(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 pmap_validation_options & options() const noexcept
Get the validation options.
pmap_validation_options options_
void check_modality(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
Compile-time constants for commonly used DICOM tags.
bool is_parametric_map_storage_sop_class(std::string_view uid) noexcept
Check if a SOP Class UID is Parametric Map Storage.
bool is_valid_parametric_map_bits_allocated(uint16_t bits_allocated) noexcept
Check if a BitsAllocated value is valid for parametric maps.
bool is_valid_parametric_map_photometric(std::string_view value) noexcept
Check if photometric interpretation is valid for parametric maps.
@ warning
Non-critical - IOD may have issues.
@ error
Critical - IOD is non-compliant.
bool is_valid_parametric_map_dataset(const core::dicom_dataset &dataset)
Quick check if a dataset is a valid Parametric Map object.
validation_result validate_parametric_map_iod(const core::dicom_dataset &dataset)
Validate a Parametric Map dataset with default options.
Parametric Map IOD Validator.
Parametric Map Storage SOP Class.
Options for Parametric Map IOD validation.
bool validate_rwvm
Validate Real World Value Mapping Sequence.
bool validate_multiframe
Validate multi-frame structure.
bool check_type1
Check Type 1 (required) attributes.
bool validate_pixel_data
Validate pixel data consistency (bits, photometric, float constraints)
bool strict_mode
Strict mode - treat warnings as errors.
bool check_conditional
Check Type 1C/2C (conditionally required) attributes.
bool validate_references
Validate referenced series/instances.
bool check_type2
Check Type 2 (required, can be empty) attributes.
Result of IOD validation.
std::vector< validation_finding > findings
All findings during validation.
bool is_valid
Overall validation status.