26 : options_(options) {}
52 for (
const auto& finding : result.
findings) {
79 if (modality !=
"CT")
return false;
116 std::vector<validation_finding>& findings)
const {
125 "PatientBirthDate", findings);
133 std::vector<validation_finding>& findings)
const {
138 "StudyInstanceUID", findings);
148 "ReferringPhysicianName", findings);
151 "AccessionNumber", findings);
157 std::vector<validation_finding>& findings)
const {
163 "SeriesInstanceUID", findings);
178 std::vector<validation_finding>& findings)
const {
183 "FrameOfReferenceUID", findings);
188 constexpr dicom_tag position_reference_indicator{0x0020, 0x1040};
190 "PositionReferenceIndicator", findings);
196 std::vector<validation_finding>& findings)
const {
207 std::vector<validation_finding>& findings)
const {
221 "RescaleIntercept", findings);
231 "SliceThickness (0018,0050) not present - slice geometry "
232 "information unavailable",
239 "ConvolutionKernel (0018,1210) not present - reconstruction "
251 "ImagePositionPatient (0020,0032) missing - required when "
252 "Frame of Reference is present",
262 "ImageOrientationPatient (0020,0037) missing - required when "
263 "Frame of Reference is present",
271 std::vector<validation_finding>& findings)
const {
276 "SamplesPerPixel", findings);
278 "PhotometricInterpretation", findings);
287 "PixelRepresentation", findings);
300 std::vector<validation_finding>& findings)
const {
307 "SOPInstanceUID", findings);
316 "SOPClassUID is not a recognized CT Storage SOP Class: " +
329 std::vector<validation_finding>& findings)
const {
334 std::string(
"Type 1 attribute missing: ") + std::string(
name) +
336 "CT-TYPE1-MISSING"});
343 std::string(
"Type 1 attribute has empty value: ") +
352 std::vector<validation_finding>& findings)
const {
358 std::string(
"Type 2 attribute missing: ") + std::string(
name) +
360 "CT-TYPE2-MISSING"});
366 std::vector<validation_finding>& findings)
const {
373 if (modality !=
"CT") {
376 "Modality must be 'CT' for CT images, found: " + modality,
383 std::vector<validation_finding>& findings)
const {
386 auto bits_allocated =
391 if (bits_allocated && bits_stored) {
392 if (*bits_stored > *bits_allocated) {
395 "BitsStored (" + std::to_string(*bits_stored) +
396 ") exceeds BitsAllocated (" +
397 std::to_string(*bits_allocated) +
")",
403 if (bits_stored && high_bit) {
404 if (*high_bit != *bits_stored - 1) {
407 "HighBit (" + std::to_string(*high_bit) +
408 ") should typically be BitsStored - 1 (" +
409 std::to_string(*bits_stored - 1) +
")",
422 "CT images must use MONOCHROME1 or MONOCHROME2, found: " +
430 if (samples && *samples != 1) {
433 "CT images require SamplesPerPixel = 1, found: " +
434 std::to_string(*samples),
441 if (pixel_rep && *pixel_rep != 1) {
444 "CT images typically use signed pixel representation "
445 "(PixelRepresentation = 1) for Hounsfield Unit 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.
void validate_general_equipment_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
const ct_validation_options & options() const noexcept
Get the validation options.
void validate_ct_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
validation_result validate(const core::dicom_dataset &dataset) const
Validate a DICOM dataset against CT IOD.
void validate_patient_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
ct_iod_validator()=default
Construct validator with default options.
void check_modality(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void set_options(const ct_validation_options &options)
Set validation options.
void validate_general_series_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
void validate_general_study_module(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
void validate_image_pixel_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
bool quick_check(const core::dicom_dataset &dataset) const
Quick check if dataset has minimum required CT attributes.
ct_validation_options options_
void validate_sop_common_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
CT Image Storage SOP Classes.
Compile-time constants for commonly used DICOM tags.
bool is_ct_storage_sop_class(std::string_view uid) noexcept
Check if a SOP Class UID is a CT Storage SOP Class.
bool is_valid_ct_photometric(std::string_view value) noexcept
Check if photometric interpretation is valid for CT.
validation_result validate_ct_iod(const core::dicom_dataset &dataset)
Validate a CT 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_ct_dataset(const core::dicom_dataset &dataset)
Quick check if a dataset is a valid CT image.
Options for CT 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 check_type2
Check Type 2 (required, can be empty) attributes.
bool validate_ct_params
Validate CT-specific acquisition parameters.
bool strict_mode
Strict mode - treat warnings as errors.
Result of IOD validation.
std::vector< validation_finding > findings
All findings during validation.
bool is_valid
Overall validation status.