PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::services::validation::mr_iod_validator Class Reference

#include <mr_iod_validator.h>

Collaboration diagram for kcenon::pacs::services::validation::mr_iod_validator:
Collaboration graph

Public Member Functions

 mr_iod_validator ()=default
 Construct validator with default options.
 
 mr_iod_validator (const mr_validation_options &options)
 Construct validator with custom options.
 
validation_result validate (const core::dicom_dataset &dataset) const
 Validate a DICOM dataset against MR IOD.
 
bool quick_check (const core::dicom_dataset &dataset) const
 Quick check if dataset has minimum required MR attributes.
 
const mr_validation_optionsoptions () const noexcept
 Get the validation options.
 
void set_options (const mr_validation_options &options)
 Set validation options.
 

Private Member Functions

void validate_patient_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_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_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
 
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 check_type1_attribute (const core::dicom_dataset &dataset, core::dicom_tag tag, std::string_view name, 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 check_modality (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
 

Private Attributes

mr_validation_options options_
 

Detailed Description

Definition at line 173 of file mr_iod_validator.h.

Constructor & Destructor Documentation

◆ mr_iod_validator() [1/2]

kcenon::pacs::services::validation::mr_iod_validator::mr_iod_validator ( )
default

◆ mr_iod_validator() [2/2]

kcenon::pacs::services::validation::mr_iod_validator::mr_iod_validator ( const mr_validation_options & options)
explicit

Construct validator with custom options.

Parameters
optionsValidation options

Definition at line 25 of file mr_iod_validator.cpp.

Member Function Documentation

◆ check_modality()

void kcenon::pacs::services::validation::mr_iod_validator::check_modality ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 395 of file mr_iod_validator.cpp.

397 {
398
399 if (!dataset.contains(tags::modality)) {
400 return; // Already reported as Type 1 missing
401 }
402
403 auto modality = dataset.get_string(tags::modality);
404 if (modality != "MR") {
405 findings.push_back(
407 "Modality must be 'MR' for MR images, found: " + modality,
408 "MR-ERR-002"});
409 }
410}
constexpr dicom_tag modality
Modality.

References kcenon::pacs::core::dicom_dataset::contains(), kcenon::pacs::services::validation::error, kcenon::pacs::core::dicom_dataset::get_string(), and kcenon::pacs::core::tags::modality.

Referenced by validate_general_series_module().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_pixel_data_consistency()

void kcenon::pacs::services::validation::mr_iod_validator::check_pixel_data_consistency ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 412 of file mr_iod_validator.cpp.

414 {
415
416 // Check BitsStored <= BitsAllocated
417 auto bits_allocated =
418 dataset.get_numeric<uint16_t>(tags::bits_allocated);
419 auto bits_stored = dataset.get_numeric<uint16_t>(tags::bits_stored);
420 auto high_bit = dataset.get_numeric<uint16_t>(tags::high_bit);
421
422 if (bits_allocated && bits_stored) {
423 if (*bits_stored > *bits_allocated) {
424 findings.push_back(
426 "BitsStored (" + std::to_string(*bits_stored) +
427 ") exceeds BitsAllocated (" +
428 std::to_string(*bits_allocated) + ")",
429 "MR-ERR-003"});
430 }
431 }
432
433 // Check HighBit == BitsStored - 1
434 if (bits_stored && high_bit) {
435 if (*high_bit != *bits_stored - 1) {
436 findings.push_back(
438 "HighBit (" + std::to_string(*high_bit) +
439 ") should typically be BitsStored - 1 (" +
440 std::to_string(*bits_stored - 1) + ")",
441 "MR-WARN-005"});
442 }
443 }
444
445 // MR images must be grayscale (MONOCHROME1 or MONOCHROME2)
446 if (dataset.contains(tags::photometric_interpretation)) {
447 auto photometric =
448 dataset.get_string(tags::photometric_interpretation);
449 if (!sop_classes::is_valid_mr_photometric(photometric)) {
450 findings.push_back(
453 "MR images must use MONOCHROME1 or MONOCHROME2, found: " +
454 photometric,
455 "MR-ERR-004"});
456 }
457 }
458
459 // MR images must have SamplesPerPixel = 1
460 auto samples = dataset.get_numeric<uint16_t>(tags::samples_per_pixel);
461 if (samples && *samples != 1) {
462 findings.push_back(
464 "MR images require SamplesPerPixel = 1, found: " +
465 std::to_string(*samples),
466 "MR-ERR-005"});
467 }
468}
constexpr dicom_tag high_bit
High Bit.
constexpr dicom_tag bits_allocated
Bits Allocated.
constexpr dicom_tag bits_stored
Bits Stored.
constexpr dicom_tag samples_per_pixel
Samples per Pixel.
constexpr dicom_tag photometric_interpretation
Photometric Interpretation.
bool is_valid_mr_photometric(std::string_view value) noexcept
Check if photometric interpretation is valid for MR.
@ warning
Non-critical - IOD may have issues.

References kcenon::pacs::core::tags::bits_allocated, kcenon::pacs::core::tags::bits_stored, kcenon::pacs::core::dicom_dataset::contains(), kcenon::pacs::services::validation::error, kcenon::pacs::core::dicom_dataset::get_numeric(), kcenon::pacs::core::dicom_dataset::get_string(), kcenon::pacs::core::tags::high_bit, kcenon::pacs::services::sop_classes::is_valid_mr_photometric(), kcenon::pacs::core::tags::photometric_interpretation, kcenon::pacs::core::tags::samples_per_pixel, and kcenon::pacs::services::validation::warning.

Referenced by validate_image_pixel_module().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_type1_attribute()

void kcenon::pacs::services::validation::mr_iod_validator::check_type1_attribute ( const core::dicom_dataset & dataset,
core::dicom_tag tag,
std::string_view name,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 358 of file mr_iod_validator.cpp.

360 {
361
362 if (!dataset.contains(tag)) {
363 findings.push_back(
365 std::string("Type 1 attribute missing: ") + std::string(name) +
366 " (" + tag.to_string() + ")",
367 "MR-TYPE1-MISSING"});
368 } else {
369 // Type 1 must have a value (cannot be empty)
370 auto value = dataset.get_string(tag);
371 if (value.empty()) {
372 findings.push_back(
374 std::string("Type 1 attribute has empty value: ") +
375 std::string(name) + " (" + tag.to_string() + ")",
376 "MR-TYPE1-EMPTY"});
377 }
378 }
379}
std::string_view name

References kcenon::pacs::core::dicom_dataset::contains(), kcenon::pacs::services::validation::error, kcenon::pacs::core::dicom_dataset::get_string(), name, and kcenon::pacs::core::dicom_tag::to_string().

Referenced by validate_frame_of_reference_module(), validate_general_series_module(), validate_general_study_module(), validate_image_pixel_module(), validate_mr_image_module(), and validate_sop_common_module().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_type2_attribute()

void kcenon::pacs::services::validation::mr_iod_validator::check_type2_attribute ( const core::dicom_dataset & dataset,
core::dicom_tag tag,
std::string_view name,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 381 of file mr_iod_validator.cpp.

383 {
384
385 // Type 2 must be present but can be empty
386 if (!dataset.contains(tag)) {
387 findings.push_back(
389 std::string("Type 2 attribute missing: ") + std::string(name) +
390 " (" + tag.to_string() + ")",
391 "MR-TYPE2-MISSING"});
392 }
393}

References kcenon::pacs::core::dicom_dataset::contains(), name, kcenon::pacs::core::dicom_tag::to_string(), and kcenon::pacs::services::validation::warning.

Referenced by validate_frame_of_reference_module(), validate_general_equipment_module(), validate_general_series_module(), validate_general_study_module(), validate_mr_image_module(), and validate_patient_module().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ options()

const mr_validation_options & kcenon::pacs::services::validation::mr_iod_validator::options ( ) const
nodiscardnoexcept

Get the validation options.

Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 106 of file mr_iod_validator.cpp.

106 {
107 return options_;
108}

References options_.

Referenced by set_options().

Here is the caller graph for this function:

◆ quick_check()

bool kcenon::pacs::services::validation::mr_iod_validator::quick_check ( const core::dicom_dataset & dataset) const
nodiscard

Quick check if dataset has minimum required MR attributes.

Parameters
datasetThe dataset to check
Returns
true if all Type 1 attributes are present
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 67 of file mr_iod_validator.cpp.

67 {
68 // Check only Type 1 required attributes for quick validation
69
70 // General Study Module Type 1
71 if (!dataset.contains(tags::study_instance_uid)) return false;
72
73 // General Series Module Type 1
74 if (!dataset.contains(tags::modality)) return false;
75 if (!dataset.contains(tags::series_instance_uid)) return false;
76
77 // Check modality is MR
78 auto modality = dataset.get_string(tags::modality);
79 if (modality != "MR") return false;
80
81 // Frame of Reference Module Type 1
82 if (!dataset.contains(tags::frame_of_reference_uid)) return false;
83
84 // MR Image Module Type 1
85 if (!dataset.contains(mr_tags::scanning_sequence)) return false;
86 if (!dataset.contains(mr_tags::sequence_variant)) return false;
87
88 // Image Pixel Module Type 1
89 if (!dataset.contains(tags::samples_per_pixel)) return false;
90 if (!dataset.contains(tags::photometric_interpretation)) return false;
91 if (!dataset.contains(tags::rows)) return false;
92 if (!dataset.contains(tags::columns)) return false;
93 if (!dataset.contains(tags::bits_allocated)) return false;
94 if (!dataset.contains(tags::bits_stored)) return false;
95 if (!dataset.contains(tags::high_bit)) return false;
96 if (!dataset.contains(tags::pixel_representation)) return false;
97 if (!dataset.contains(tags::pixel_data)) return false;
98
99 // SOP Common Module Type 1
100 if (!dataset.contains(tags::sop_class_uid)) return false;
101 if (!dataset.contains(tags::sop_instance_uid)) return false;
102
103 return true;
104}
constexpr dicom_tag rows
Rows.
constexpr dicom_tag columns
Columns.
constexpr dicom_tag frame_of_reference_uid
Frame of Reference UID.
constexpr dicom_tag sop_instance_uid
SOP Instance UID.
constexpr dicom_tag pixel_data
Pixel Data.
constexpr dicom_tag pixel_representation
Pixel Representation.
constexpr dicom_tag study_instance_uid
Study Instance UID.
constexpr dicom_tag sop_class_uid
SOP Class UID.
constexpr dicom_tag series_instance_uid
Series Instance UID.
constexpr core::dicom_tag sequence_variant
Sequence Variant (0018,0021) - Type 1 Variant of the scanning sequence: SK, MTC, SS,...
constexpr core::dicom_tag scanning_sequence
Scanning Sequence (0018,0020) - Type 1 Identifies the type of MR data acquisition sequence: SE,...

References kcenon::pacs::core::tags::bits_allocated, kcenon::pacs::core::tags::bits_stored, kcenon::pacs::core::tags::columns, kcenon::pacs::core::dicom_dataset::contains(), kcenon::pacs::core::tags::frame_of_reference_uid, kcenon::pacs::core::dicom_dataset::get_string(), kcenon::pacs::core::tags::high_bit, kcenon::pacs::core::tags::modality, kcenon::pacs::core::tags::photometric_interpretation, kcenon::pacs::core::tags::pixel_data, kcenon::pacs::core::tags::pixel_representation, kcenon::pacs::core::tags::rows, kcenon::pacs::core::tags::samples_per_pixel, kcenon::pacs::services::validation::mr_tags::scanning_sequence, kcenon::pacs::services::validation::mr_tags::sequence_variant, kcenon::pacs::core::tags::series_instance_uid, kcenon::pacs::core::tags::sop_class_uid, kcenon::pacs::core::tags::sop_instance_uid, and kcenon::pacs::core::tags::study_instance_uid.

Referenced by kcenon::pacs::services::validation::is_valid_mr_dataset().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_options()

void kcenon::pacs::services::validation::mr_iod_validator::set_options ( const mr_validation_options & options)

Set validation options.

Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 110 of file mr_iod_validator.cpp.

110 {
112}
const mr_validation_options & options() const noexcept
Get the validation options.

References options(), and options_.

Here is the call graph for this function:

◆ validate()

validation_result kcenon::pacs::services::validation::mr_iod_validator::validate ( const core::dicom_dataset & dataset) const
nodiscard

Validate a DICOM dataset against MR IOD.

Parameters
datasetThe dataset to validate
Returns
Validation result with all findings
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 28 of file mr_iod_validator.cpp.

29 {
30 validation_result result;
31 result.is_valid = true;
32
33 // Validate mandatory modules (PS3.3 Table A.4-1)
35 validate_patient_module(dataset, result.findings);
36 validate_general_study_module(dataset, result.findings);
37 validate_general_series_module(dataset, result.findings);
38 validate_frame_of_reference_module(dataset, result.findings);
39 validate_general_equipment_module(dataset, result.findings);
40 validate_sop_common_module(dataset, result.findings);
41 }
42
44 validate_mr_image_module(dataset, result.findings);
45 }
46
48 validate_image_pixel_module(dataset, result.findings);
49 }
50
51 // Determine overall validity
52 for (const auto& finding : result.findings) {
53 if (finding.severity == validation_severity::error) {
54 result.is_valid = false;
55 break;
56 }
58 finding.severity == validation_severity::warning) {
59 result.is_valid = false;
60 break;
61 }
62 }
63
64 return result;
65}
void validate_general_series_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 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
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
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.

References kcenon::pacs::services::validation::mr_validation_options::check_type1, kcenon::pacs::services::validation::mr_validation_options::check_type2, kcenon::pacs::services::validation::error, kcenon::pacs::services::validation::validation_result::findings, kcenon::pacs::services::validation::validation_result::is_valid, options_, kcenon::pacs::services::validation::mr_validation_options::strict_mode, validate_frame_of_reference_module(), validate_general_equipment_module(), validate_general_series_module(), validate_general_study_module(), validate_image_pixel_module(), validate_mr_image_module(), kcenon::pacs::services::validation::mr_validation_options::validate_mr_params, validate_patient_module(), kcenon::pacs::services::validation::mr_validation_options::validate_pixel_data, validate_sop_common_module(), and kcenon::pacs::services::validation::warning.

Referenced by kcenon::pacs::services::validation::validate_mr_iod().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_frame_of_reference_module()

void kcenon::pacs::services::validation::mr_iod_validator::validate_frame_of_reference_module ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 180 of file mr_iod_validator.cpp.

182 {
183
184 // Frame of Reference UID is Type 1 for MR
185 if (options_.check_type1) {
187 "FrameOfReferenceUID", findings);
188 }
189
190 // Position Reference Indicator is Type 2
191 if (options_.check_type2) {
192 constexpr dicom_tag position_reference_indicator{0x0020, 0x1040};
193 check_type2_attribute(dataset, position_reference_indicator,
194 "PositionReferenceIndicator", findings);
195 }
196}
void check_type2_attribute(const core::dicom_dataset &dataset, core::dicom_tag tag, std::string_view name, 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

References kcenon::pacs::services::validation::mr_validation_options::check_type1, check_type1_attribute(), kcenon::pacs::services::validation::mr_validation_options::check_type2, check_type2_attribute(), kcenon::pacs::core::tags::frame_of_reference_uid, and options_.

Referenced by validate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_general_equipment_module()

void kcenon::pacs::services::validation::mr_iod_validator::validate_general_equipment_module ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 198 of file mr_iod_validator.cpp.

200 {
201
202 // Manufacturer is Type 2
203 if (options_.check_type2) {
204 check_type2_attribute(dataset, tags::manufacturer, "Manufacturer",
205 findings);
206 }
207}
constexpr dicom_tag manufacturer
Manufacturer.

References kcenon::pacs::services::validation::mr_validation_options::check_type2, check_type2_attribute(), kcenon::pacs::core::tags::manufacturer, and options_.

Referenced by validate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_general_series_module()

void kcenon::pacs::services::validation::mr_iod_validator::validate_general_series_module ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 159 of file mr_iod_validator.cpp.

161 {
162
163 // Type 1
164 if (options_.check_type1) {
165 check_type1_attribute(dataset, tags::modality, "Modality", findings);
167 "SeriesInstanceUID", findings);
168
169 // Modality must be "MR"
170 check_modality(dataset, findings);
171 }
172
173 // Type 2
174 if (options_.check_type2) {
175 check_type2_attribute(dataset, tags::series_number, "SeriesNumber",
176 findings);
177 }
178}
void check_modality(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const
constexpr dicom_tag series_number
Series Number.

References check_modality(), kcenon::pacs::services::validation::mr_validation_options::check_type1, check_type1_attribute(), kcenon::pacs::services::validation::mr_validation_options::check_type2, check_type2_attribute(), kcenon::pacs::core::tags::modality, options_, kcenon::pacs::core::tags::series_instance_uid, and kcenon::pacs::core::tags::series_number.

Referenced by validate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_general_study_module()

void kcenon::pacs::services::validation::mr_iod_validator::validate_general_study_module ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 135 of file mr_iod_validator.cpp.

137 {
138
139 // Type 1
140 if (options_.check_type1) {
142 "StudyInstanceUID", findings);
143 }
144
145 // Type 2
146 if (options_.check_type2) {
147 check_type2_attribute(dataset, tags::study_date, "StudyDate",
148 findings);
149 check_type2_attribute(dataset, tags::study_time, "StudyTime",
150 findings);
152 "ReferringPhysicianName", findings);
153 check_type2_attribute(dataset, tags::study_id, "StudyID", findings);
155 "AccessionNumber", findings);
156 }
157}
constexpr dicom_tag referring_physician_name
Referring Physician's Name.
constexpr dicom_tag accession_number
Accession Number.
constexpr dicom_tag study_time
Study Time.
constexpr dicom_tag study_id
Study ID.
constexpr dicom_tag study_date
Study Date.

References kcenon::pacs::core::tags::accession_number, kcenon::pacs::services::validation::mr_validation_options::check_type1, check_type1_attribute(), kcenon::pacs::services::validation::mr_validation_options::check_type2, check_type2_attribute(), options_, kcenon::pacs::core::tags::referring_physician_name, kcenon::pacs::core::tags::study_date, kcenon::pacs::core::tags::study_id, kcenon::pacs::core::tags::study_instance_uid, and kcenon::pacs::core::tags::study_time.

Referenced by validate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_image_pixel_module()

void kcenon::pacs::services::validation::mr_iod_validator::validate_image_pixel_module ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 300 of file mr_iod_validator.cpp.

302 {
303
304 // Type 1 attributes
305 if (options_.check_type1) {
307 "SamplesPerPixel", findings);
309 "PhotometricInterpretation", findings);
310 check_type1_attribute(dataset, tags::rows, "Rows", findings);
311 check_type1_attribute(dataset, tags::columns, "Columns", findings);
312 check_type1_attribute(dataset, tags::bits_allocated, "BitsAllocated",
313 findings);
314 check_type1_attribute(dataset, tags::bits_stored, "BitsStored",
315 findings);
316 check_type1_attribute(dataset, tags::high_bit, "HighBit", findings);
318 "PixelRepresentation", findings);
319 check_type1_attribute(dataset, tags::pixel_data, "PixelData",
320 findings);
321 }
322
323 // Validate pixel data consistency
325 check_pixel_data_consistency(dataset, findings);
326 }
327}
void check_pixel_data_consistency(const core::dicom_dataset &dataset, std::vector< validation_finding > &findings) const

References kcenon::pacs::core::tags::bits_allocated, kcenon::pacs::core::tags::bits_stored, check_pixel_data_consistency(), kcenon::pacs::services::validation::mr_validation_options::check_type1, check_type1_attribute(), kcenon::pacs::core::tags::columns, kcenon::pacs::core::tags::high_bit, options_, kcenon::pacs::core::tags::photometric_interpretation, kcenon::pacs::core::tags::pixel_data, kcenon::pacs::core::tags::pixel_representation, kcenon::pacs::core::tags::rows, kcenon::pacs::core::tags::samples_per_pixel, and kcenon::pacs::services::validation::mr_validation_options::validate_pixel_data.

Referenced by validate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_mr_image_module()

void kcenon::pacs::services::validation::mr_iod_validator::validate_mr_image_module ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 209 of file mr_iod_validator.cpp.

211 {
212
213 // MR Image Module (PS3.3 Section C.8.3.1)
214
215 // Type 1 attributes
216 if (options_.check_type1) {
217 check_type1_attribute(dataset, tags::image_type, "ImageType",
218 findings);
220 "ScanningSequence", findings);
222 "SequenceVariant", findings);
223 }
224
225 // Type 2 attributes specific to MR Image Module
226 if (options_.check_type2) {
227 check_type2_attribute(dataset, mr_tags::scan_options, "ScanOptions",
228 findings);
230 "MRAcquisitionType", findings);
231 check_type2_attribute(dataset, mr_tags::echo_time, "EchoTime",
232 findings);
234 "EchoTrainLength", findings);
236 "MagneticFieldStrength", findings);
237 }
238
239 // Type 2C - RepetitionTime is required if ImageType Value 1 is ORIGINAL
241 if (dataset.contains(tags::image_type)) {
242 auto image_type = dataset.get_string(tags::image_type);
243 if (image_type.find("ORIGINAL") != std::string::npos &&
244 !dataset.contains(mr_tags::repetition_time)) {
245 findings.push_back(
247 "RepetitionTime (0018,0080) missing - required when "
248 "ImageType Value 1 is ORIGINAL",
249 "MR-WARN-001"});
250 }
251 }
252
253 // InversionTime is Type 2C - required if ScanningSequence contains IR
254 if (dataset.contains(mr_tags::scanning_sequence)) {
255 auto seq = dataset.get_string(mr_tags::scanning_sequence);
256 if (seq.find("IR") != std::string::npos &&
257 !dataset.contains(mr_tags::inversion_time)) {
258 findings.push_back(
260 "InversionTime (0018,0082) missing - required when "
261 "ScanningSequence contains IR",
262 "MR-WARN-002"});
263 }
264 }
265
266 // SliceThickness informational check
267 if (!dataset.contains(mr_tags::slice_thickness)) {
268 findings.push_back(
270 "SliceThickness (0018,0050) not present - slice geometry "
271 "information unavailable",
272 "MR-INFO-001"});
273 }
274
275 // Image Position (Patient) is Type 1C - required if
276 // Frame of Reference Module is present
277 if (dataset.contains(tags::frame_of_reference_uid) &&
278 !dataset.contains(mr_tags::image_position_patient)) {
279 findings.push_back(
282 "ImagePositionPatient (0020,0032) missing - required when "
283 "Frame of Reference is present",
284 "MR-WARN-003"});
285 }
286
287 // Image Orientation (Patient) is Type 1C
288 if (dataset.contains(tags::frame_of_reference_uid) &&
289 !dataset.contains(mr_tags::image_orientation_patient)) {
290 findings.push_back(
293 "ImageOrientationPatient (0020,0037) missing - required when "
294 "Frame of Reference is present",
295 "MR-WARN-004"});
296 }
297 }
298}
constexpr dicom_tag image_type
Image Type.
constexpr core::dicom_tag echo_time
Echo Time (0018,0081) - Type 2 Time in ms between the middle of the excitation pulse and peak of echo...
constexpr core::dicom_tag slice_thickness
Slice Thickness (0018,0050) - Type 2.
constexpr core::dicom_tag mr_acquisition_type
MR Acquisition Type (0018,0023) - Type 2 Identifies the spatial data encoding scheme: 2D or 3D.
constexpr core::dicom_tag magnetic_field_strength
Magnetic Field Strength (0018,0087) - Type 2 Nominal field strength of MR magnet in Tesla.
constexpr core::dicom_tag echo_train_length
Echo Train Length (0018,0091) - Type 2 Number of echoes in a multi-echo acquisition.
constexpr core::dicom_tag repetition_time
Repetition Time (0018,0080) - Type 2C Time in ms between successive pulse sequences.
constexpr core::dicom_tag inversion_time
Inversion Time (0018,0082) - Type 2C Time in ms between the inversion and excitation pulses.
constexpr core::dicom_tag scan_options
Scan Options (0018,0022) - Type 2 Additional scan parameters: PER, RG, CG, PPG, FC,...
constexpr core::dicom_tag image_position_patient
Image Position (Patient) (0020,0032)
constexpr core::dicom_tag image_orientation_patient
Image Orientation (Patient) (0020,0037)
@ info
Informational - suggestion for improvement.
bool check_conditional
Check Type 1C/2C (conditionally required) attributes.

References kcenon::pacs::services::validation::mr_validation_options::check_conditional, kcenon::pacs::services::validation::mr_validation_options::check_type1, check_type1_attribute(), kcenon::pacs::services::validation::mr_validation_options::check_type2, check_type2_attribute(), kcenon::pacs::core::dicom_dataset::contains(), kcenon::pacs::services::validation::mr_tags::echo_time, kcenon::pacs::services::validation::mr_tags::echo_train_length, kcenon::pacs::core::tags::frame_of_reference_uid, kcenon::pacs::core::dicom_dataset::get_string(), kcenon::pacs::services::validation::mr_tags::image_orientation_patient, kcenon::pacs::services::validation::mr_tags::image_position_patient, kcenon::pacs::core::tags::image_type, kcenon::pacs::services::validation::info, kcenon::pacs::services::validation::mr_tags::inversion_time, kcenon::pacs::services::validation::mr_tags::magnetic_field_strength, kcenon::pacs::services::validation::mr_tags::mr_acquisition_type, options_, kcenon::pacs::services::validation::mr_tags::repetition_time, kcenon::pacs::services::validation::mr_tags::scan_options, kcenon::pacs::services::validation::mr_tags::scanning_sequence, kcenon::pacs::services::validation::mr_tags::sequence_variant, kcenon::pacs::services::validation::mr_tags::slice_thickness, and kcenon::pacs::services::validation::warning.

Referenced by validate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_patient_module()

void kcenon::pacs::services::validation::mr_iod_validator::validate_patient_module ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 118 of file mr_iod_validator.cpp.

120 {
121
122 // Patient Module - All attributes are Type 2
123 if (options_.check_type2) {
124 check_type2_attribute(dataset, tags::patient_name, "PatientName",
125 findings);
126 check_type2_attribute(dataset, tags::patient_id, "PatientID",
127 findings);
129 "PatientBirthDate", findings);
130 check_type2_attribute(dataset, tags::patient_sex, "PatientSex",
131 findings);
132 }
133}
constexpr dicom_tag patient_id
Patient ID.
constexpr dicom_tag patient_birth_date
Patient's Birth Date.
constexpr dicom_tag patient_sex
Patient's Sex.
constexpr dicom_tag patient_name
Patient's Name.

References kcenon::pacs::services::validation::mr_validation_options::check_type2, check_type2_attribute(), options_, kcenon::pacs::core::tags::patient_birth_date, kcenon::pacs::core::tags::patient_id, kcenon::pacs::core::tags::patient_name, and kcenon::pacs::core::tags::patient_sex.

Referenced by validate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_sop_common_module()

void kcenon::pacs::services::validation::mr_iod_validator::validate_sop_common_module ( const core::dicom_dataset & dataset,
std::vector< validation_finding > & findings ) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/services/validation/mr_iod_validator.h.

Definition at line 329 of file mr_iod_validator.cpp.

331 {
332
333 // Type 1
334 if (options_.check_type1) {
335 check_type1_attribute(dataset, tags::sop_class_uid, "SOPClassUID",
336 findings);
338 "SOPInstanceUID", findings);
339 }
340
341 // Validate SOP Class UID is an MR storage class
342 if (dataset.contains(tags::sop_class_uid)) {
343 auto sop_class = dataset.get_string(tags::sop_class_uid);
344 if (!sop_classes::is_mr_storage_sop_class(sop_class)) {
345 findings.push_back(
347 "SOPClassUID is not a recognized MR Storage SOP Class: " +
348 sop_class,
349 "MR-ERR-001"});
350 }
351 }
352}
bool is_mr_storage_sop_class(std::string_view uid) noexcept
Check if a SOP Class UID is an MR Storage SOP Class.

References kcenon::pacs::services::validation::mr_validation_options::check_type1, check_type1_attribute(), kcenon::pacs::core::dicom_dataset::contains(), kcenon::pacs::services::validation::error, kcenon::pacs::core::dicom_dataset::get_string(), kcenon::pacs::services::sop_classes::is_mr_storage_sop_class(), options_, kcenon::pacs::core::tags::sop_class_uid, and kcenon::pacs::core::tags::sop_instance_uid.

Referenced by validate().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ options_


The documentation for this class was generated from the following files: