PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::ai::assessment_manager Class Reference

#include <aira_assessment_manager.h>

Collaboration diagram for kcenon::pacs::ai::assessment_manager:
Collaboration graph

Public Member Functions

 assessment_manager ()=default
 
bool store_assessment (const core::dicom_dataset &assessment_sr)
 Store an assessment SR document.
 
std::optional< core::dicom_datasetretrieve_assessment (const std::string &assessment_uid) const
 Retrieve an assessment SR dataset by its UID.
 
std::vector< assessment_infofind_by_ai_result (const std::string &ai_result_uid) const
 Find all assessments for a given AI result.
 
std::vector< assessment_infofind_by_assessor (const std::string &assessor_name) const
 Find all assessments by a specific assessor.
 
std::vector< assessment_infofind_by_type (assessment_type type) const
 Find all assessments of a specific type.
 
std::optional< assessment_infoget_info (const std::string &assessment_uid) const
 Get metadata for a specific assessment.
 
bool exists (const std::string &assessment_uid) const
 Check if an assessment exists.
 
bool remove (const std::string &assessment_uid)
 Remove an assessment.
 
size_t count () const noexcept
 Get total number of stored assessments.
 
std::map< assessment_type, size_t > get_statistics () const
 Get assessments grouped by type with counts.
 

Private Member Functions

assessment_info parse_assessment_info (const core::dicom_dataset &sr) const
 

Private Attributes

std::map< std::string, core::dicom_datasetdatasets_
 
std::map< std::string, assessment_infometadata_
 

Detailed Description

Definition at line 53 of file aira_assessment_manager.h.

Constructor & Destructor Documentation

◆ assessment_manager()

kcenon::pacs::ai::assessment_manager::assessment_manager ( )
default

Member Function Documentation

◆ count()

size_t kcenon::pacs::ai::assessment_manager::count ( ) const
nodiscardnoexcept

Get total number of stored assessments.

Returns
Count of assessments
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 126 of file aira_assessment_manager.cpp.

126 {
127 return datasets_.size();
128}
std::map< std::string, core::dicom_dataset > datasets_

References datasets_.

◆ exists()

bool kcenon::pacs::ai::assessment_manager::exists ( const std::string & assessment_uid) const
nodiscard

Check if an assessment exists.

Parameters
assessment_uidSOP Instance UID
Returns
true if the assessment exists
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 112 of file aira_assessment_manager.cpp.

112 {
113 return datasets_.find(assessment_uid) != datasets_.end();
114}

References datasets_.

◆ find_by_ai_result()

std::vector< assessment_info > kcenon::pacs::ai::assessment_manager::find_by_ai_result ( const std::string & ai_result_uid) const
nodiscard

Find all assessments for a given AI result.

Parameters
ai_result_uidSOP Instance UID of the AI result
Returns
List of assessment info records
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 66 of file aira_assessment_manager.cpp.

67 {
68
69 std::vector<assessment_info> results;
70 for (const auto& [uid, info] : metadata_) {
71 if (info.ai_result_uid == ai_result_uid) {
72 results.push_back(info);
73 }
74 }
75 return results;
76}
std::map< std::string, assessment_info > metadata_
std::string_view uid

References metadata_, and uid.

◆ find_by_assessor()

std::vector< assessment_info > kcenon::pacs::ai::assessment_manager::find_by_assessor ( const std::string & assessor_name) const
nodiscard

Find all assessments by a specific assessor.

Parameters
assessor_nameName of the assessor
Returns
List of assessment info records
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 78 of file aira_assessment_manager.cpp.

79 {
80
81 std::vector<assessment_info> results;
82 for (const auto& [uid, info] : metadata_) {
83 if (info.assessor_name == assessor_name) {
84 results.push_back(info);
85 }
86 }
87 return results;
88}

References metadata_, and uid.

◆ find_by_type()

std::vector< assessment_info > kcenon::pacs::ai::assessment_manager::find_by_type ( assessment_type type) const
nodiscard

Find all assessments of a specific type.

Parameters
typeAssessment type to filter by
Returns
List of assessment info records
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 90 of file aira_assessment_manager.cpp.

91 {
92
93 std::vector<assessment_info> results;
94 for (const auto& [uid, info] : metadata_) {
95 if (info.type == type) {
96 results.push_back(info);
97 }
98 }
99 return results;
100}

References metadata_, and uid.

◆ get_info()

std::optional< assessment_info > kcenon::pacs::ai::assessment_manager::get_info ( const std::string & assessment_uid) const
nodiscard

Get metadata for a specific assessment.

Parameters
assessment_uidSOP Instance UID
Returns
Assessment info if found
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 102 of file aira_assessment_manager.cpp.

103 {
104
105 auto it = metadata_.find(assessment_uid);
106 if (it == metadata_.end()) {
107 return std::nullopt;
108 }
109 return it->second;
110}

References metadata_.

◆ get_statistics()

std::map< assessment_type, size_t > kcenon::pacs::ai::assessment_manager::get_statistics ( ) const
nodiscard

Get assessments grouped by type with counts.

Returns
Map of assessment_type to count
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 130 of file aira_assessment_manager.cpp.

130 {
131 std::map<assessment_type, size_t> stats;
132 stats[assessment_type::accept] = 0;
133 stats[assessment_type::modify] = 0;
134 stats[assessment_type::reject] = 0;
135
136 for (const auto& [uid, info] : metadata_) {
137 stats[info.type]++;
138 }
139 return stats;
140}
@ accept
Clinician accepts AI result as-is.
@ reject
Clinician rejects AI result with reason.
@ modify
Clinician modifies AI result (e.g., edits segmentation)

References kcenon::pacs::ai::accept, metadata_, kcenon::pacs::ai::modify, kcenon::pacs::ai::reject, and uid.

◆ parse_assessment_info()

assessment_info kcenon::pacs::ai::assessment_manager::parse_assessment_info ( const core::dicom_dataset & sr) const
private
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 146 of file aira_assessment_manager.cpp.

147 {
148
149 assessment_info info;
150 info.assessment_uid = sr.get_string(tags::sop_instance_uid);
151 info.assessment_time = std::chrono::system_clock::now();
152
153 // Parse completion flag to determine status
154 auto completion = sr.get_string(manager_tags::completion_flag);
155 if (completion == "COMPLETE") {
157 } else {
159 }
160
161 // Parse Content Sequence for assessment type and assessor
162 const auto* content_elem = sr.get(manager_tags::content_sequence);
163 if (content_elem && content_elem->is_sequence()) {
164 for (const auto& item : content_elem->sequence_items()) {
165 auto vt = item.get_string(manager_tags::value_type);
166
167 // Extract assessment type from CODE items
168 if (vt == "CODE") {
169 const auto* concept_name = item.get(
171 if (concept_name && concept_name->is_sequence() &&
172 !concept_name->sequence_items().empty()) {
173 auto code = concept_name->sequence_items()[0].get_string(
175 if (code == "AIRA-010") {
176 // Assessment Decision item
177 const auto* concept_code = item.get(
179 if (concept_code && concept_code->is_sequence() &&
180 !concept_code->sequence_items().empty()) {
181 auto type_code =
182 concept_code->sequence_items()[0].get_string(
184 if (type_code == "AIRA-ACCEPT") {
186 } else if (type_code == "AIRA-MODIFY") {
188 } else if (type_code == "AIRA-REJECT") {
190 }
191 }
192 }
193 }
194 }
195
196 // Extract assessor name from PNAME items
197 if (vt == "PNAME") {
198 auto name = item.get_string(manager_tags::person_name);
199 if (!name.empty()) {
200 info.assessor_name = name;
201 }
202 }
203 }
204 }
205
206 // Parse Referenced SOP Sequence for AI result UID
207 const auto* ref_elem = sr.get(manager_tags::referenced_sop_sequence);
208 if (ref_elem && ref_elem->is_sequence() &&
209 !ref_elem->sequence_items().empty()) {
210 info.ai_result_uid = ref_elem->sequence_items()[0].get_string(
212 }
213
214 return info;
215}
@ draft
Assessment in progress, not yet finalized.
@ final_
Assessment finalized and signed off.
constexpr dicom_tag sop_instance_uid
SOP Instance UID.
constexpr dicom_tag item
Item.
std::string_view code
std::string_view name

References kcenon::pacs::ai::accept, code, kcenon::pacs::ai::manager_tags::code_value, kcenon::pacs::ai::manager_tags::completion_flag, kcenon::pacs::ai::manager_tags::concept_code_sequence, kcenon::pacs::ai::manager_tags::concept_name_code_sequence, kcenon::pacs::ai::manager_tags::content_sequence, kcenon::pacs::ai::draft, kcenon::pacs::ai::final_, kcenon::pacs::ai::modify, name, kcenon::pacs::ai::manager_tags::person_name, kcenon::pacs::ai::manager_tags::referenced_sop_instance_uid, kcenon::pacs::ai::manager_tags::referenced_sop_sequence, kcenon::pacs::ai::reject, kcenon::pacs::core::tags::sop_instance_uid, and kcenon::pacs::ai::manager_tags::value_type.

Referenced by store_assessment().

Here is the caller graph for this function:

◆ remove()

bool kcenon::pacs::ai::assessment_manager::remove ( const std::string & assessment_uid)

Remove an assessment.

Parameters
assessment_uidSOP Instance UID
Returns
true if removed
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 116 of file aira_assessment_manager.cpp.

116 {
117 auto ds_it = datasets_.find(assessment_uid);
118 if (ds_it == datasets_.end()) {
119 return false;
120 }
121 datasets_.erase(ds_it);
122 metadata_.erase(assessment_uid);
123 return true;
124}

References datasets_, and metadata_.

◆ retrieve_assessment()

std::optional< core::dicom_dataset > kcenon::pacs::ai::assessment_manager::retrieve_assessment ( const std::string & assessment_uid) const
nodiscard

Retrieve an assessment SR dataset by its UID.

Parameters
assessment_uidSOP Instance UID of the assessment
Returns
The dataset if found
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 56 of file aira_assessment_manager.cpp.

57 {
58
59 auto it = datasets_.find(assessment_uid);
60 if (it == datasets_.end()) {
61 return std::nullopt;
62 }
63 return it->second;
64}

References datasets_.

◆ store_assessment()

bool kcenon::pacs::ai::assessment_manager::store_assessment ( const core::dicom_dataset & assessment_sr)
nodiscard

Store an assessment SR document.

Parses the SR dataset to extract assessment metadata and stores both the dataset and metadata for later retrieval.

Parameters
assessment_srThe assessment SR dataset
Returns
true if stored successfully
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/ai/aira_assessment_manager.h.

Definition at line 41 of file aira_assessment_manager.cpp.

42 {
43
44 auto uid = assessment_sr.get_string(tags::sop_instance_uid);
45 if (uid.empty()) {
46 return false;
47 }
48
49 auto info = parse_assessment_info(assessment_sr);
50 datasets_[uid] = assessment_sr;
51 metadata_[uid] = std::move(info);
52
53 return true;
54}
assessment_info parse_assessment_info(const core::dicom_dataset &sr) const

References datasets_, kcenon::pacs::core::dicom_dataset::get_string(), metadata_, parse_assessment_info(), kcenon::pacs::core::tags::sop_instance_uid, and uid.

Here is the call graph for this function:

Member Data Documentation

◆ datasets_

std::map<std::string, core::dicom_dataset> kcenon::pacs::ai::assessment_manager::datasets_
private

◆ metadata_


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