23namespace manager_tags {
57 const std::string& assessment_uid)
const {
67 const std::string& ai_result_uid)
const {
69 std::vector<assessment_info> results;
71 if (info.ai_result_uid == ai_result_uid) {
72 results.push_back(info);
79 const std::string& assessor_name)
const {
81 std::vector<assessment_info> results;
83 if (info.assessor_name == assessor_name) {
84 results.push_back(info);
93 std::vector<assessment_info> results;
95 if (info.type == type) {
96 results.push_back(info);
103 const std::string& assessment_uid)
const {
105 auto it =
metadata_.find(assessment_uid);
117 auto ds_it =
datasets_.find(assessment_uid);
131 std::map<assessment_type, size_t> stats;
151 info.assessment_time = std::chrono::system_clock::now();
155 if (completion ==
"COMPLETE") {
163 if (content_elem && content_elem->is_sequence()) {
164 for (
const auto& item : content_elem->sequence_items()) {
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") {
177 const auto* concept_code = item.get(
179 if (concept_code && concept_code->is_sequence() &&
180 !concept_code->sequence_items().empty()) {
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") {
200 info.assessor_name =
name;
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(
IHE AIRA Assessment Manager Actor.
bool store_assessment(const core::dicom_dataset &assessment_sr)
Store an assessment SR document.
std::map< std::string, assessment_info > metadata_
std::optional< core::dicom_dataset > retrieve_assessment(const std::string &assessment_uid) const
Retrieve an assessment SR dataset by its UID.
bool exists(const std::string &assessment_uid) const
Check if an assessment exists.
std::vector< assessment_info > find_by_assessor(const std::string &assessor_name) const
Find all assessments by a specific assessor.
assessment_info parse_assessment_info(const core::dicom_dataset &sr) const
bool remove(const std::string &assessment_uid)
Remove an assessment.
std::vector< assessment_info > find_by_type(assessment_type type) const
Find all assessments of a specific type.
std::map< std::string, core::dicom_dataset > datasets_
std::map< assessment_type, size_t > get_statistics() const
Get assessments grouped by type with counts.
size_t count() const noexcept
Get total number of stored assessments.
std::optional< assessment_info > get_info(const std::string &assessment_uid) const
Get metadata for a specific assessment.
std::vector< assessment_info > find_by_ai_result(const std::string &ai_result_uid) const
Find all assessments for a given AI result.
auto get_string(dicom_tag tag, std::string_view default_value="") const -> std::string
Get the string value of an element.
Compile-time constants for commonly used DICOM tags.
assessment_type
Assessment decision made by a clinician on an AI result.
@ accept
Clinician accepts AI result as-is.
@ reject
Clinician rejects AI result with reason.
@ modify
Clinician modifies AI result (e.g., edits segmentation)
@ draft
Assessment in progress, not yet finalized.
@ final_
Assessment finalized and signed off.
Information about a stored assessment.