-
Notifications
You must be signed in to change notification settings - Fork 0
/
TODO
317 lines (253 loc) · 11.8 KB
/
TODO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
=======================
=== Orthanc Roadmap ===
=======================
For higher-level ideas in the roadmap, please first read the
"Contributing to Orthanc" section of the Orthanc Book:
https://book.orthanc-server.com/contributing.html
Some features are being funded by an OpenCollective one-time donations.
selected features are marked with priorities ((1) - higher, (2) - medium, (3) - nice to have)
=======
General
=======
* Configure an user-defined site UID root if generating DICOM UIDs
("FromDcmtkBridge::GenerateUuid()")
* Improve handling of errors in the command queue:
https://groups.google.com/d/msg/orthanc-users/--njEbqcDDI/rBu8XL-Mm-cJ
* Support partial file retrieval in Orthanc::HttpClient
* Support retry counter in Orthanc::HttpClient
* Option to enable DNS lookups in DICOM:
https://hg.orthanc-server.com/orthanc/file/Orthanc-1.9.3/OrthancFramework/Sources/OrthancFramework.cpp#l88
* Toolbox::ComputeMD5() fails on files larger than 4GB
* Add an option to run Orthanc in read-only mode both for DICOM and for Rest API.
* Logging: add some information like Thread-Id to contextualize the logs
* (1) Accept extra DICOM tags dictionaries in the DCMTK format '.dic' (easier to use than declare
them in the Orthanc configuration file). Even the standard dictionaries could be
overriden by these custom dictionaries.
* Provide more flexibility wrt Dicom TLS ciphers and TLS version:
https://groups.google.com/g/orthanc-users/c/X4IhmXCSr7I/m/EirawAFcBwAJ
Can maybe be achieved by adding a configuration to select the TLS Security Profile:
https://github.com/DCMTK/dcmtk/blob/master/dcmtls/include/dcmtk/dcmtls/tlsciphr.h#L83
(e.g: TSP_Profile_BCP195_ND instead of TSP_Profile_BCP195)
* Add configurations to enable/disable warnings:
- Modifying an instance while keeping its original SOPInstanceUID: This should be avoided!
- Modifying a study while keeping its original StudyInstanceUID: This should be avoided!
============================
Documentation (Orthanc Book)
============================
* Write a getting started guide (step by step) for each platform to replace
https://book.orthanc-server.com/users/cookbook.html :
- Ubuntu/Debian
- Windows
- OSX
- Docker on Linux
Each step by step guide should contain:
- get binaries
- launch
- open explorer
- edit configuration file
- restart and observe changes
* Explain how log rotation can be achieved (no built-in support in Orthanc)
* Explain how to interface with Mirth/NextGen Connect
https://en.wikipedia.org/wiki/NextGen_Connect
* How to reproduce issues by replacing Orthanc with storescp or wlmscpfs
* How to capture TCP traffic of DICOM protocol using tcpdump and Wireshark
* Add more configurations of viewers (Weasis, Slicer...):
https://book.orthanc-server.com/integrations.html
* Discuss HL7 in a dedicated page:
https://groups.google.com/d/msg/orthanc-users/4dt4992O0lQ/opTjTFU2BgAJ
https://groups.google.com/g/orthanc-users/c/Spjtcj9vSPo/m/ktUArWxUDQAJ
================
Orthanc Explorer
================
* Option to tune the number of results for a local lookup:
https://groups.google.com/g/orthanc-users/c/LF39musq02Y/
========
REST API
========
----------
Short-term
----------
--------
Mid-term
--------
* (1) Archive jobs: Resume downloads using "range requests":
https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
* (3) Create DICOM from DICOMweb JSON ("application/dicom+json")
with "/tools/create-dicom"
* (2) Create multi-frame images with /tools/create-dicom (by adding a
"MultiFrame" flag to avoid creating a series), or modify PixelData
of a multi-frame image:
https://groups.google.com/g/orthanc-users/c/y3-xa_GcdLM/m/m0Kr5G5UPAAJ
* (1) Specify the transfer syntax in /tools/create-dicom
https://groups.google.com/g/orthanc-users/c/o15Dekecgds/m/xmPE2y3bAwAJ
* (1) In the /studies/{id}/anonymize route, add an option to remove
secondary captures. They usually contains Patient info in the
image. The SOPClassUID might be used to identify such secondary
captures.
* Support "/preview" and "/matlab" for LUT color images
* Try to transcode files if a simple decoding fails:
https://groups.google.com/g/orthanc-users/c/b8168-NkAhA/m/Df3j-CO9CgAJ
* (2) Ranges of DICOM tags for "Keep" and "Remove" in ".../modify" and ".../anonymize":
https://groups.google.com/g/orthanc-users/c/6dETktKo9v8/m/b0LUvSfwAgAJ
* return error code/reason in HTTP response if resubmit/cancel/pause fails ...
* filter /changes by type e.g: /changes?filter=StablePatient
https://groups.google.com/g/orthanc-users/c/r20kDb0axms/m/2tzbQzYJAgAJ
* save more details in jobs e.g: the resources being sent/exported ...
https://groups.google.com/g/orthanc-users/c/rDDusFG5Lco/m/TzTUjWXLAQAJ
---------
Long-term
---------
* Stick to the JSONapi or JAREST guidelines for a "v2" of the API:
https://groups.google.com/forum/#!msg/orthanc-users/Bag-SwEE9ZI/-w7QXI6p7-oJ
http://www.admiraalit.nl/jarest/
=====
DICOM
=====
--------
Mid-term
--------
* Support C-GET SCU (note that C-GET SCP was introduced in Orthanc 1.7.0)
* Support "Retrieve AE Title" (0008,0054) in C-FIND:
- On SCP side: done by https://hg.orthanc-server.com/orthanc/rev/1ec3e1e18f50
- On SCU side:
https://groups.google.com/d/msg/orthanc-users/wPl0g5mqZco/5X1Z8tEzBgAJ
* Check Big Endian transfer syntax in ParsedDicomFile::EmbedImage and
DicomImageDecoder
* Strict hierarchical C-FIND:
https://groups.google.com/d/msg/orthanc-users/VBHpeGVSNKM/tkaVvjWFBwAJ
* report DIMSE error codes in Rest API and job status for /store /query /move /retrieve
* Log outgoing C-Find queries
---------
Long-term
---------
* Support extended association (e.g. for C-Find relational queries):
https://groups.google.com/d/msg/orthanc-users/xD4d3mpc6ms/srF7E2goAAAJ
* Support C-MOVE-CANCEL:
https://groups.google.com/d/msg/orthanc-users/KnduYBFd06A/o86cl5SeCAAJ
--------------------
Internationalization
--------------------
* Support multiple specific character sets (cf. "SCSH32" in orthanc-tests)
- http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.12.html#sect_C.12.1.1.2
- Japanese test: http://dicom.nema.org/MEDICAL/dicom/2017c/output/chtml/part05/sect_H.3.2.html
* Support Supplementary Kanji set (ISO 2022 IR 159)
* Create DICOM files with multibyte encodings (Korean, JapaneseKanji, SimplifiedChinese)
===========
Performance
===========
* (3) ServerContext::DicomCacheLocker => give access to the raw buffer,
useful in ServerContext::DecodeDicomInstance()
* (2) DicomMap: create a cache to the main DICOM tags index
* (3) Check out rapidjson: https://github.com/miloyip/nativejson-benchmark
* For C-Find results: we could store the computed tags
in metadata on some events like NewSeries + DeletedSeries (same for other computer tags).
OtherTags that could be saved in Metadata as well:
- ModalitiesInStudy
- all computed counters at series/study/patient level
- RequestAttributesSequence (sequence that must be included in all DicomWeb QIDO-RS for series)
* Long-shot & not sure it is even feasible at all: try to reduce memory usage by implementing streaming
when receiving DICOM instances from the Rest API or from DICOM and store files directly to disk as they
are received. Note that this would likely require rewriting large parts of Orthanc. Note sure that
would be compatible with Transcoding.
Use case: receiving 10 1GB instances in parallel can consume up to 20 GB
Alternative option 1: write an "external application/plugin" that would take care of these receptions, write the
file at the right place and send a signal to Orthanc to "adopt" the file.
Alternative option 2: declare a memory resource (X GB) that is available for reception. Every time
Orthanc starts receiving a file, it reserves the memory or twice the memory (through a Semaphore)
if no memory is available, it waits and possibly timeouts returning a 503 or DIMSE A700 (out of resources).
This would at least protect from "out of memory" crashes.
Alternative option 3: Configure DCMTK to "stream" DICOM files on a temporary file on disk. Pass the file handle
to Orthanc and/or the Storage plugin (instead of passing a memory buffer) -> the object-storage plugin could
"stream" the file to the storage. The HTTP server could also "stream" its response from file handles.
Transcoding should be "file based" too.
========
Database
========
* Integration test searching for "\" and "%" in PatientName, PatientID...
=======
Plugins
=======
---
SDK
---
* Implement PluginsJob::GetOutput() to allow user-defined jobs to provide output:
https://groups.google.com/g/orthanc-users/c/GZ7u0bTTVoo/m/Z7iTNTi2BgAJ
* Add plugins for normalized operations (notably so as to support
Print SCU/SCP, cf. "dcmprscp"):
https://web.archive.org/web/20170923150432/https://www.medicalconnections.co.uk/kb/DICOM_Print_Service
* Provide access to the Orthanc::DicomUserConnection class in plugins:
https://groups.google.com/d/msg/orthanc-users/ycDA1xPuTRY/nsT2_GOtEgAJ
* Provide a C++ callback similar to "ReceivedInstanceFilter()" in Lua
https://book.orthanc-server.com/users/lua.html#filtering-incoming-dicom-instances
https://groups.google.com/d/msg/orthanc-users/BtvLTE5Ni8A/vIMhmMgfBAAJ
* In "OrthancPluginLog[Error|Warning|Info]()", prefix the log line with
the name of the plugin, as retrieved by "OrthancPluginGetName()"
* Update the SDK to handle buffer sizes > 4GB (all sizes are currently coded in uint32_t)
----------------
Ideas of plugins
----------------
* DICOM-RT primitives (RT-STRUCT, RT-PLAN, RT-DOSE)
* Converter to/from NIfTI
* Decode JPEG2k with grok: https://github.com/GrokImageCompression/grok
* Generate dynamic HTTP content using Lua:
https://groups.google.com/d/msg/orthanc-users/KompazkxRSs/5Rh03mzgDAAJ
* More generally, expose more callbacks of the plugin SDK in Lua:
https://groups.google.com/d/msg/orthanc-users/_FbiRHuXPGM/J-OAv7zaCAAJ
* Configuration interface plugin
===
Lua
===
* Configure HTTP headers from Lua (in RestApiPost(), RestApiPut()
and RestApiDelete().
https://groups.google.com/forum/#!msg/orthanc-users/WNnW187OILM/6XX_bm96BwAJ
================
Code refactoring
================
* Use Semaphore::Locker everywhere (instead of explicit
Release() and Acquire())
* Avoid direct calls to FromDcmtkBridge (make most of its
methods private), go through ParsedDicomFile wherever possible
=================
Platform-specific
=================
---------
Packaging
---------
* RHEL through EPEL (as of 2021, CentOS seems to be over):
http://fedoraproject.org/wiki/EPEL_Package_Maintainers
* Fedora: Are DICOM dictionaries correctly located?
https://groups.google.com/g/orthanc-users/c/YB_LTBuUQNA/m/3H1xsrZJDgAJ
------------------------
Big-endian architectures
------------------------
* Check the generated 16bpp PNG images
-----------------
Microsoft Windows
-----------------
* Add compatibility with non-ASCII paths (Orthanc expresses its paths
as UTF-8 strings, but Windows expects them to be translated to the
system locale)
* Fix error message when stopping the service:
https://groups.google.com/g/orthanc-users/c/NyrwUJ9N6Ec/m/sTZIcWvaAgAJ
====
Misc
====
-----------------
Maintenance tools
-----------------
* Standalone tool to detect corrupted files:
https://groups.google.com/g/orthanc-users/c/KASEJ9Gx3vQ/m/MIJFJdRhAwAJ
* Standalone tool to detect orphan files in OrthancStorage
----------------------------------
Code quality and integration tests
----------------------------------
* Have a look at openQA (cf. GNU Health)
* Add integration tests for LUT
* Add more complex testing scenarios like data-migration, change of
configuration files, multiple orthanc interacting togethers with various
config. This should probably look like the python toolbox tests ...
---------------------
External applications
---------------------
* Create REST bindings with Slicer
* Create REST bindings with Horos/OsiriX