27 : options_(options) {}
53 for (
const auto& finding : result.
findings) {
79 if (modality !=
"CT")
return false;
124 std::vector<validation_finding>& findings)
const {
133 "PatientBirthDate", findings);
141 std::vector<validation_finding>& findings)
const {
146 "StudyInstanceUID", findings);
156 "ReferringPhysicianName", findings);
159 "AccessionNumber", findings);
165 std::vector<validation_finding>& findings)
const {
171 "SeriesInstanceUID", findings);
186 std::vector<validation_finding>& findings)
const {
191 "FrameOfReferenceUID", findings);
196 constexpr dicom_tag position_reference_indicator{0x0020, 0x1040};
198 "PositionReferenceIndicator", findings);
204 std::vector<validation_finding>& findings)
const {
215 std::vector<validation_finding>& findings)
const {
230 "RescaleIntercept", findings);
240 "SliceThickness (0018,0050) not present - slice geometry "
241 "information unavailable",
249 "ConvolutionKernel (0018,1210) not present - reconstruction "
260 "ImagePositionPatient (0020,0032) missing - required when "
261 "Frame of Reference is present",
271 "ImageOrientationPatient (0020,0037) missing - required when "
272 "Frame of Reference is present",
281 "DecompositionDescription (0018,9380) not present - material "
282 "decomposition type unavailable",
290 std::vector<validation_finding>& findings)
const {
295 "SamplesPerPixel", findings);
297 "PhotometricInterpretation", findings);
306 "PixelRepresentation", findings);
319 std::vector<validation_finding>& findings)
const {
326 "SOPInstanceUID", findings);
335 "SOPClassUID is not CT For Processing Image Storage: " +
348 std::vector<validation_finding>& findings)
const {
353 std::string(
"Type 1 attribute missing: ") + std::string(
name) +
355 "CTP-TYPE1-MISSING"});
362 std::string(
"Type 1 attribute has empty value: ") +
371 std::vector<validation_finding>& findings)
const {
377 std::string(
"Type 2 attribute missing: ") + std::string(
name) +
379 "CTP-TYPE2-MISSING"});
385 std::vector<validation_finding>& findings)
const {
392 if (modality !=
"CT") {
395 "Modality must be 'CT' for CT For Processing images, found: " +
403 std::vector<validation_finding>& findings)
const {
406 auto bits_allocated =
411 if (bits_allocated && bits_stored) {
412 if (*bits_stored > *bits_allocated) {
415 "BitsStored (" + std::to_string(*bits_stored) +
416 ") exceeds BitsAllocated (" +
417 std::to_string(*bits_allocated) +
")",
423 if (bits_stored && high_bit) {
424 if (*high_bit != *bits_stored - 1) {
427 "HighBit (" + std::to_string(*high_bit) +
428 ") should typically be BitsStored - 1 (" +
429 std::to_string(*bits_stored - 1) +
")",
442 "CT For Processing images must use MONOCHROME1 or "
443 "MONOCHROME2, found: " +
451 if (samples && *samples != 1) {
454 "CT For Processing images require SamplesPerPixel = 1, found: " +
455 std::to_string(*samples),
462 if (pixel_rep && *pixel_rep != 1) {
465 "CT For Processing images typically use signed pixel "
466 "representation (PixelRepresentation = 1) for quantitative values",
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.
bool quick_check(const core::dicom_dataset &dataset) const
Quick check if dataset has minimum required attributes.
void validate_general_series_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 CT For Processing 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 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
void validate_frame_of_reference_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
ct_processing_iod_validator()=default
Construct validator with default options.
void validate_general_equipment_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
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
void set_options(const ct_processing_validation_options &options)
Set validation options.
ct_processing_validation_options options_
void validate_ct_image_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
const ct_processing_validation_options & options() const noexcept
Get the validation options.
CT For Processing Image IOD Validator.
CT Image Storage SOP Classes.
Compile-time constants for commonly used DICOM tags.
constexpr std::string_view ct_for_processing_image_storage_uid
CT For Processing Image Storage SOP Class UID Multi-energy/spectral CT basis material decomposition i...
bool is_valid_ct_photometric(std::string_view value) noexcept
Check if photometric interpretation is valid for CT.
bool is_valid_ct_processing_dataset(const core::dicom_dataset &dataset)
Quick check if a dataset is a valid CT For Processing image.
@ warning
Non-critical - IOD may have issues.
@ info
Informational - suggestion for improvement.
@ error
Critical - IOD is non-compliant.
validation_result validate_ct_processing_iod(const core::dicom_dataset &dataset)
Validate a CT For Processing dataset with default options.
Options for CT For Processing IOD validation.
bool check_type2
Check Type 2 (required, can be empty) attributes.
bool check_conditional
Check Type 1C/2C (conditionally required) attributes.
bool validate_ct_processing_params
Validate CT processing-specific attributes.
bool strict_mode
Strict mode - treat warnings as errors.
bool validate_pixel_data
Validate pixel data consistency (rows, columns, bits)
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.