PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
mini_pacs.h
Go to the documentation of this file.
1
17#pragma once
18
31
32#include <atomic>
33#include <filesystem>
34#include <memory>
35#include <mutex>
36#include <string>
37#include <vector>
38
39namespace kcenon::pacs::samples {
40
41// =============================================================================
42// Configuration
43// =============================================================================
44
53 std::string ae_title{"MINI_PACS"};
54
56 uint16_t port{11112};
57
59 std::filesystem::path storage_path{"./pacs_data"};
60
62 size_t max_associations{50};
63
65 bool enable_worklist{true};
66
68 bool enable_mpps{true};
69
71 bool verbose_logging{false};
72};
73
74// =============================================================================
75// Statistics
76// =============================================================================
77
85 std::atomic<int> associations_total{0};
86
88 std::atomic<int> associations_active{0};
89
91 std::atomic<int> c_echo_count{0};
92
94 std::atomic<int> c_store_count{0};
95
97 std::atomic<int> c_find_count{0};
98
100 std::atomic<int> c_move_count{0};
101
103 std::atomic<int> c_get_count{0};
104
106 std::atomic<int> mwl_count{0};
107
109 std::atomic<int> mpps_create_count{0};
110
112 std::atomic<int> mpps_set_count{0};
113
115 std::atomic<size_t> bytes_received{0};
116};
117
118// =============================================================================
119// Worklist Item
120// =============================================================================
121
128 std::string patient_id;
129 std::string patient_name;
131 std::string patient_sex;
132 std::string study_uid;
133 std::string accession_number;
134 std::string modality;
136 std::string scheduled_date;
137 std::string scheduled_time;
138 std::string step_id;
141};
142
143// =============================================================================
144// MPPS Instance
145// =============================================================================
146
151 std::string sop_instance_uid;
152 std::string status; // "IN PROGRESS", "COMPLETED", "DISCONTINUED"
153 std::string station_ae;
155};
156
157// =============================================================================
158// Mini PACS Class
159// =============================================================================
160
212public:
213 // =========================================================================
214 // Construction
215 // =========================================================================
216
221 explicit mini_pacs(const mini_pacs_config& config);
222
226 ~mini_pacs();
227
228 // Non-copyable, non-movable
229 mini_pacs(const mini_pacs&) = delete;
230 mini_pacs& operator=(const mini_pacs&) = delete;
231 mini_pacs(mini_pacs&&) = delete;
233
234 // =========================================================================
235 // Lifecycle
236 // =========================================================================
237
242 [[nodiscard]] bool start();
243
247 void stop();
248
252 void wait();
253
258 [[nodiscard]] bool is_running() const noexcept;
259
260 // =========================================================================
261 // Statistics
262 // =========================================================================
263
268 [[nodiscard]] const mini_pacs_statistics& statistics() const noexcept;
269
270 // =========================================================================
271 // Worklist Management
272 // =========================================================================
273
278 void add_worklist_item(const worklist_entry& item);
279
283 void clear_worklist();
284
289 [[nodiscard]] std::vector<worklist_entry> get_worklist_items() const;
290
291 // =========================================================================
292 // Configuration Access
293 // =========================================================================
294
299 [[nodiscard]] const mini_pacs_config& config() const noexcept;
300
301private:
302 // =========================================================================
303 // Initialization
304 // =========================================================================
305
306 void initialize_storage();
307 void initialize_services();
308 void configure_server();
310
311 // =========================================================================
312 // Storage Handlers
313 // =========================================================================
314
315 services::storage_status handle_store(
316 const core::dicom_dataset& dataset,
317 const std::string& calling_ae,
318 const std::string& sop_class_uid,
319 const std::string& sop_instance_uid);
320
321 bool update_index(
322 const core::dicom_dataset& dataset,
323 const std::filesystem::path& file_path);
324
325 // =========================================================================
326 // Query Handlers
327 // =========================================================================
328
329 std::vector<core::dicom_dataset> handle_query(
330 services::query_level level,
331 const core::dicom_dataset& query_keys,
332 const std::string& calling_ae);
333
334 // =========================================================================
335 // Retrieve Handlers
336 // =========================================================================
337
338 std::vector<core::dicom_file> handle_retrieve(
339 const core::dicom_dataset& query_keys);
340
341 std::optional<std::pair<std::string, uint16_t>> resolve_destination(
342 const std::string& ae_title);
343
344 // =========================================================================
345 // Worklist Handlers
346 // =========================================================================
347
348 std::vector<core::dicom_dataset> handle_worklist_query(
349 const core::dicom_dataset& query_keys,
350 const std::string& calling_ae);
351
352 core::dicom_dataset create_worklist_response(const worklist_entry& item);
353
354 // =========================================================================
355 // MPPS Handlers
356 // =========================================================================
357
358 network::Result<std::monostate> handle_mpps_create(
359 const services::mpps_instance& instance);
360
361 network::Result<std::monostate> handle_mpps_set(
362 const std::string& sop_instance_uid,
363 const core::dicom_dataset& modifications,
364 services::mpps_status new_status);
365
366 // =========================================================================
367 // Member Variables
368 // =========================================================================
369
372
373 // Storage components
374 std::shared_ptr<storage::file_storage> file_storage_;
375 std::shared_ptr<storage::index_database> index_db_;
376
377 // Service providers
378 std::shared_ptr<services::verification_scp> verification_scp_;
379 std::shared_ptr<services::storage_scp> storage_scp_;
380 std::shared_ptr<services::query_scp> query_scp_;
381 std::shared_ptr<services::retrieve_scp> retrieve_scp_;
382 std::shared_ptr<services::worklist_scp> worklist_scp_;
383 std::shared_ptr<services::mpps_scp> mpps_scp_;
384
385 // Server
386 std::unique_ptr<network::dicom_server> server_;
387 std::atomic<bool> running_{false};
388
389 // Worklist items (in-memory for this sample)
390 mutable std::mutex worklist_mutex_;
391 std::vector<worklist_entry> worklist_items_;
392
393 // MPPS instances (in-memory for this sample)
394 mutable std::mutex mpps_mutex_;
395 std::vector<mpps_entry> mpps_instances_;
396};
397
398} // namespace kcenon::pacs::samples
Represents a DICOM Dataset (ordered collection of Data Elements)
std::unique_ptr< network::dicom_server > server_
Definition mini_pacs.h:386
std::shared_ptr< services::retrieve_scp > retrieve_scp_
Definition mini_pacs.h:381
std::shared_ptr< services::mpps_scp > mpps_scp_
Definition mini_pacs.h:383
std::atomic< bool > running_
Definition mini_pacs.h:387
std::shared_ptr< storage::file_storage > file_storage_
Definition mini_pacs.h:374
mini_pacs & operator=(const mini_pacs &)=delete
void stop()
Stop the PACS server.
Definition mini_pacs.cpp:55
std::vector< core::dicom_dataset > handle_worklist_query(const core::dicom_dataset &query_keys, const std::string &calling_ae)
std::shared_ptr< services::query_scp > query_scp_
Definition mini_pacs.h:380
std::shared_ptr< services::worklist_scp > worklist_scp_
Definition mini_pacs.h:382
mini_pacs(mini_pacs &&)=delete
std::vector< core::dicom_dataset > handle_query(services::query_level level, const core::dicom_dataset &query_keys, const std::string &calling_ae)
const mini_pacs_statistics & statistics() const noexcept
Get current statistics.
Definition mini_pacs.cpp:80
mini_pacs & operator=(mini_pacs &&)=delete
std::shared_ptr< services::storage_scp > storage_scp_
Definition mini_pacs.h:379
std::vector< worklist_entry > worklist_items_
Definition mini_pacs.h:391
core::dicom_dataset create_worklist_response(const worklist_entry &item)
mini_pacs(const mini_pacs &)=delete
~mini_pacs()
Destructor - ensures clean shutdown.
Definition mini_pacs.cpp:32
bool is_running() const noexcept
Check if server is running.
Definition mini_pacs.cpp:72
std::vector< mpps_entry > mpps_instances_
Definition mini_pacs.h:395
std::vector< worklist_entry > get_worklist_items() const
Get current worklist items.
Definition mini_pacs.cpp:98
bool start()
Start the PACS server.
Definition mini_pacs.cpp:40
services::storage_status handle_store(const core::dicom_dataset &dataset, const std::string &calling_ae, const std::string &sop_class_uid, const std::string &sop_instance_uid)
std::optional< std::pair< std::string, uint16_t > > resolve_destination(const std::string &ae_title)
network::Result< std::monostate > handle_mpps_set(const std::string &sop_instance_uid, const core::dicom_dataset &modifications, services::mpps_status new_status)
std::vector< core::dicom_file > handle_retrieve(const core::dicom_dataset &query_keys)
void wait()
Block until server shutdown.
Definition mini_pacs.cpp:66
const mini_pacs_config & config() const noexcept
Get the configuration.
std::shared_ptr< services::verification_scp > verification_scp_
Definition mini_pacs.h:378
std::shared_ptr< storage::index_database > index_db_
Definition mini_pacs.h:375
network::Result< std::monostate > handle_mpps_create(const services::mpps_instance &instance)
bool update_index(const core::dicom_dataset &dataset, const std::filesystem::path &file_path)
mini_pacs_statistics stats_
Definition mini_pacs.h:371
void clear_worklist()
Clear all worklist items.
Definition mini_pacs.cpp:93
void add_worklist_item(const worklist_entry &item)
Add a worklist item for MWL queries.
Definition mini_pacs.cpp:88
mini_pacs(const mini_pacs_config &config)
Construct Mini PACS with configuration.
Definition mini_pacs.cpp:24
DICOM Dataset - ordered collection of Data Elements.
DICOM Part 10 file handling for reading/writing DICOM files.
Multi-threaded DICOM server for handling multiple associations.
Filesystem-based DICOM storage with hierarchical organization.
PACS index database for metadata storage and retrieval.
DICOM MPPS (Modality Performed Procedure Step) SCP service.
DICOM Query SCP service (C-FIND handler)
DICOM Retrieve SCP service (C-MOVE/C-GET handler)
DICOM Server configuration structures.
DICOM Storage SCP service (C-STORE handler)
Configuration options for Mini PACS.
Definition mini_pacs.h:51
uint16_t port
TCP port to listen on.
Definition mini_pacs.h:56
std::string ae_title
Application Entity title (max 16 characters)
Definition mini_pacs.h:53
bool verbose_logging
Enable verbose logging.
Definition mini_pacs.h:71
bool enable_mpps
Enable MPPS service.
Definition mini_pacs.h:68
std::filesystem::path storage_path
Root path for DICOM file storage.
Definition mini_pacs.h:59
size_t max_associations
Maximum concurrent associations.
Definition mini_pacs.h:62
bool enable_worklist
Enable Modality Worklist service.
Definition mini_pacs.h:65
Runtime statistics for Mini PACS operations.
Definition mini_pacs.h:83
std::atomic< int > c_move_count
C-MOVE operations processed.
Definition mini_pacs.h:100
std::atomic< int > associations_total
Total associations established since start.
Definition mini_pacs.h:85
std::atomic< int > associations_active
Currently active associations.
Definition mini_pacs.h:88
std::atomic< int > c_store_count
C-STORE operations processed.
Definition mini_pacs.h:94
std::atomic< int > c_get_count
C-GET operations processed.
Definition mini_pacs.h:103
std::atomic< int > mwl_count
MWL queries processed.
Definition mini_pacs.h:106
std::atomic< int > c_find_count
C-FIND operations processed.
Definition mini_pacs.h:97
std::atomic< int > c_echo_count
C-ECHO operations processed.
Definition mini_pacs.h:91
std::atomic< size_t > bytes_received
Total bytes received.
Definition mini_pacs.h:115
std::atomic< int > mpps_create_count
MPPS N-CREATE processed.
Definition mini_pacs.h:109
std::atomic< int > mpps_set_count
MPPS N-SET processed.
Definition mini_pacs.h:112
MPPS instance for tracking procedure progress.
Definition mini_pacs.h:150
core::dicom_dataset data
Definition mini_pacs.h:154
std::string sop_instance_uid
Definition mini_pacs.h:151
std::string station_ae
Definition mini_pacs.h:153
std::string status
Definition mini_pacs.h:152
Worklist item for MWL queries.
Definition mini_pacs.h:127
std::string referring_physician
Definition mini_pacs.h:140
std::string patient_birth_date
Definition mini_pacs.h:130
std::string patient_sex
Definition mini_pacs.h:131
std::string patient_id
Definition mini_pacs.h:128
std::string scheduled_station_ae
Definition mini_pacs.h:135
std::string accession_number
Definition mini_pacs.h:133
std::string scheduled_time
Definition mini_pacs.h:137
std::string step_id
Definition mini_pacs.h:138
std::string patient_name
Definition mini_pacs.h:129
std::string procedure_description
Definition mini_pacs.h:139
std::string study_uid
Definition mini_pacs.h:132
std::string modality
Definition mini_pacs.h:134
std::string scheduled_date
Definition mini_pacs.h:136
DICOM Verification SCP service (C-ECHO handler)
DICOM Modality Worklist SCP service (MWL C-FIND handler)