PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
mpps_scu.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
19#ifndef PACS_SERVICES_MPPS_SCU_HPP
20#define PACS_SERVICES_MPPS_SCU_HPP
21
22#include "mpps_scp.h"
23
28
29#include <atomic>
30#include <chrono>
31#include <memory>
32#include <string>
33#include <vector>
34
35namespace kcenon::pacs::services {
36
37// =============================================================================
38// MPPS SCU Data Structures
39// =============================================================================
40
48 std::string series_uid;
49
51 std::string series_description;
52
54 std::string modality;
55
58
60 std::string operator_name;
61
63 std::vector<std::string> sop_instance_uids;
64
66 size_t num_instances{0};
67};
68
76 // Scheduled Step Reference
78 std::string study_instance_uid;
79 std::string accession_number;
80
81 // Patient Information
82 std::string patient_name;
83 std::string patient_id;
84 std::string patient_birth_date;
85 std::string patient_sex;
86
87 // Performed Procedure Step Information
91 std::string modality;
92 std::string station_ae_title;
93 std::string station_name;
95
96 // Performing Information
98 std::string operator_name;
99};
100
110
113
116
119
121 std::vector<performed_series_info> performed_series;
122
125};
126
135
137 uint16_t status{0};
138
140 std::string error_comment;
141
143 std::chrono::milliseconds elapsed{0};
144
146 [[nodiscard]] bool is_success() const noexcept {
147 return status == 0x0000;
148 }
149
151 [[nodiscard]] bool is_warning() const noexcept {
152 return (status & 0xF000) == 0xB000;
153 }
154
156 [[nodiscard]] bool is_error() const noexcept {
157 return !is_success() && !is_warning();
158 }
159};
160
166 std::chrono::milliseconds timeout{30000};
167
170};
171
172// =============================================================================
173// MPPS SCU Class
174// =============================================================================
175
254class mpps_scu {
255public:
256 // =========================================================================
257 // Construction
258 // =========================================================================
259
265 explicit mpps_scu(std::shared_ptr<di::ILogger> logger = nullptr);
266
273 explicit mpps_scu(const mpps_scu_config& config,
274 std::shared_ptr<di::ILogger> logger = nullptr);
275
276 ~mpps_scu() = default;
277
278 // Non-copyable, non-movable (due to atomic members)
279 mpps_scu(const mpps_scu&) = delete;
280 mpps_scu& operator=(const mpps_scu&) = delete;
281 mpps_scu(mpps_scu&&) = delete;
283
284 // =========================================================================
285 // N-CREATE Operation
286 // =========================================================================
287
300 const mpps_create_data& data);
301
302 // =========================================================================
303 // N-SET Operations
304 // =========================================================================
305
315 [[nodiscard]] network::Result<mpps_result> set(
317 const mpps_set_data& data);
318
332 std::string_view mpps_uid,
333 const std::vector<performed_series_info>& performed_series);
334
348 std::string_view mpps_uid,
349 std::string_view reason = "");
350
351 // =========================================================================
352 // Statistics
353 // =========================================================================
354
359 [[nodiscard]] size_t creates_performed() const noexcept;
360
365 [[nodiscard]] size_t sets_performed() const noexcept;
366
370 void reset_statistics() noexcept;
371
372private:
373 // =========================================================================
374 // Private Implementation
375 // =========================================================================
376
380 [[nodiscard]] core::dicom_dataset build_create_dataset(
381 const mpps_create_data& data) const;
382
386 [[nodiscard]] core::dicom_dataset build_set_dataset(
387 const mpps_set_data& data) const;
388
392 [[nodiscard]] std::string generate_mpps_uid() const;
393
397 [[nodiscard]] std::string get_current_date() const;
398
402 [[nodiscard]] std::string get_current_time() const;
403
407 [[nodiscard]] uint16_t next_message_id() noexcept;
408
409 // =========================================================================
410 // Private Members
411 // =========================================================================
412
414 std::shared_ptr<di::ILogger> logger_;
415
418
420 std::atomic<uint16_t> message_id_counter_{1};
421
423 std::atomic<size_t> creates_performed_{0};
424
426 std::atomic<size_t> sets_performed_{0};
427};
428
429// =============================================================================
430// Additional MPPS Tags (for SCU use)
431// =============================================================================
432
433namespace mpps_tags {
434
437
440
443
445inline constexpr core::dicom_tag performed_protocol_code_sequence{0x0040, 0x0260};
446
448inline constexpr core::dicom_tag retrieve_ae_title{0x0008, 0x0054};
449
451inline constexpr core::dicom_tag referenced_image_sequence{0x0008, 0x1140};
452
454inline constexpr core::dicom_tag performing_physicians_name{0x0008, 0x1050};
455
457inline constexpr core::dicom_tag operators_name{0x0008, 0x1070};
458
460inline constexpr core::dicom_tag series_description{0x0008, 0x103E};
461
464
465} // namespace mpps_tags
466
467} // namespace kcenon::pacs::services
468
469#endif // PACS_SERVICES_MPPS_SCU_HPP
DICOM Association management per PS3.8.
size_t sets_performed() const noexcept
Get the number of N-SET operations performed.
Definition mpps_scu.cpp:337
network::Result< mpps_result > create(network::association &assoc, const mpps_create_data &data)
Create a new MPPS instance (N-CREATE)
Definition mpps_scu.cpp:98
mpps_scu(const mpps_scu &)=delete
core::dicom_dataset build_create_dataset(const mpps_create_data &data) const
Build DICOM dataset for N-CREATE request.
Definition mpps_scu.cpp:350
void reset_statistics() noexcept
Reset statistics counters to zero.
Definition mpps_scu.cpp:341
std::shared_ptr< di::ILogger > logger_
Logger instance.
Definition mpps_scu.h:414
std::atomic< uint16_t > message_id_counter_
Message ID counter.
Definition mpps_scu.h:420
mpps_scu_config config_
Configuration.
Definition mpps_scu.h:417
size_t creates_performed() const noexcept
Get the number of N-CREATE operations performed.
Definition mpps_scu.cpp:333
network::Result< mpps_result > discontinue(network::association &assoc, std::string_view mpps_uid, std::string_view reason="")
Discontinue an MPPS instance (convenience method)
Definition mpps_scu.cpp:314
core::dicom_dataset build_set_dataset(const mpps_set_data &data) const
Build DICOM dataset for N-SET request.
Definition mpps_scu.cpp:425
mpps_scu(std::shared_ptr< di::ILogger > logger=nullptr)
Construct MPPS SCU with default configuration.
Definition mpps_scu.cpp:86
mpps_scu & operator=(mpps_scu &&)=delete
network::Result< mpps_result > set(network::association &assoc, const mpps_set_data &data)
Update an existing MPPS instance (N-SET)
Definition mpps_scu.cpp:197
std::string get_current_time() const
Get current time in DICOM TM format (HHMMSS)
Definition mpps_scu.cpp:504
std::atomic< size_t > creates_performed_
Statistics: N-CREATE operations performed.
Definition mpps_scu.h:423
std::atomic< size_t > sets_performed_
Statistics: N-SET operations performed.
Definition mpps_scu.h:426
mpps_scu(mpps_scu &&)=delete
mpps_scu & operator=(const mpps_scu &)=delete
std::string get_current_date() const
Get current date in DICOM DA format (YYYYMMDD)
Definition mpps_scu.cpp:491
uint16_t next_message_id() noexcept
Get the next message ID for DIMSE operations.
Definition mpps_scu.cpp:517
std::string generate_mpps_uid() const
Generate a unique MPPS SOP Instance UID.
Definition mpps_scu.cpp:479
network::Result< mpps_result > complete(network::association &assoc, std::string_view mpps_uid, const std::vector< performed_series_info > &performed_series)
Complete an MPPS instance (convenience method)
Definition mpps_scu.cpp:299
DICOM Dataset - ordered collection of Data Elements.
DIMSE message encoding and decoding.
Logger interface for dependency injection.
DICOM MPPS (Modality Performed Procedure Step) SCP service.
constexpr core::dicom_tag referenced_image_sequence
Referenced Image Sequence (0008,1140)
Definition mpps_scu.h:451
constexpr core::dicom_tag discontinuation_reason_code_sequence
Performed Procedure Step Discontinuation Reason Code Sequence (0040,0281)
Definition mpps_scu.h:463
constexpr core::dicom_tag retrieve_ae_title
Retrieve AE Title (0008,0054)
Definition mpps_scu.h:448
constexpr core::dicom_tag operators_name
Operators' Name (0008,1070)
Definition mpps_scu.h:457
constexpr core::dicom_tag performing_physicians_name
Performing Physician's Name (0008,1050)
Definition mpps_scu.h:454
constexpr core::dicom_tag performed_protocol_code_sequence
Performed Protocol Code Sequence (0040,0260)
Definition mpps_scu.h:445
constexpr core::dicom_tag performed_procedure_step_start_date
Performed Procedure Step Start Date (0040,0244)
Definition mpps_scu.h:436
constexpr core::dicom_tag performed_procedure_step_start_time
Performed Procedure Step Start Time (0040,0245)
Definition mpps_scu.h:439
constexpr core::dicom_tag series_description
Series Description (0008,103E)
Definition mpps_scu.h:460
constexpr core::dicom_tag performed_procedure_step_description
Performed Procedure Step Description (0040,0254)
Definition mpps_scu.h:442
mpps_status
MPPS status enumeration.
Definition mpps_scp.h:48
@ completed
Procedure completed successfully.
Data for N-CREATE operation (start procedure)
Definition mpps_scu.h:75
std::string procedure_step_start_date
DICOM DA format (YYYYMMDD)
Definition mpps_scu.h:89
std::string procedure_step_start_time
DICOM TM format (HHMMSS)
Definition mpps_scu.h:90
std::string mpps_sop_instance_uid
Generated if empty.
Definition mpps_scu.h:88
Result of an MPPS operation.
Definition mpps_scu.h:132
std::chrono::milliseconds elapsed
Time taken for the operation.
Definition mpps_scu.h:143
bool is_success() const noexcept
Check if the operation was successful.
Definition mpps_scu.h:146
bool is_error() const noexcept
Check if this was an error status.
Definition mpps_scu.h:156
uint16_t status
DIMSE status code (0x0000 = success)
Definition mpps_scu.h:137
std::string mpps_sop_instance_uid
MPPS SOP Instance UID.
Definition mpps_scu.h:134
std::string error_comment
Error comment from the SCP (if any)
Definition mpps_scu.h:140
bool is_warning() const noexcept
Check if this was a warning status.
Definition mpps_scu.h:151
Configuration for MPPS SCU service.
Definition mpps_scu.h:164
std::chrono::milliseconds timeout
Timeout for receiving DIMSE response.
Definition mpps_scu.h:166
bool auto_generate_uid
Auto-generate MPPS UID if not provided.
Definition mpps_scu.h:169
Data for N-SET operation (update/complete procedure)
Definition mpps_scu.h:107
mpps_status status
New status (COMPLETED or DISCONTINUED)
Definition mpps_scu.h:112
std::string procedure_step_end_date
Procedure Step End Date (required for COMPLETED/DISCONTINUED)
Definition mpps_scu.h:115
std::string discontinuation_reason
Discontinuation reason (for DISCONTINUED status)
Definition mpps_scu.h:124
std::vector< performed_series_info > performed_series
Performed Series Sequence (for COMPLETED status)
Definition mpps_scu.h:121
std::string procedure_step_end_time
Procedure Step End Time (required for COMPLETED/DISCONTINUED)
Definition mpps_scu.h:118
std::string mpps_sop_instance_uid
MPPS SOP Instance UID (required)
Definition mpps_scu.h:109
Information about a performed series for N-SET COMPLETED.
Definition mpps_scu.h:46
std::string series_description
Series Description.
Definition mpps_scu.h:51
std::vector< std::string > sop_instance_uids
List of SOP Instance UIDs in this series.
Definition mpps_scu.h:63
std::string performing_physician
Name of the performing physician.
Definition mpps_scu.h:57
std::string operator_name
Name of the operator.
Definition mpps_scu.h:60
size_t num_instances
Number of instances in the series.
Definition mpps_scu.h:66
std::string series_uid
Series Instance UID.
Definition mpps_scu.h:48
std::string modality
Modality type (CT, MR, US, etc.)
Definition mpps_scu.h:54