Worklists plugin¶
Warning
This page documents the new Worklists plugin that supersedes the
legacy Sample Modality Worklists plugin that is
provided as a sample project with the Orthanc source code since 1.0.0.
Contents
The worklists plugin turns Orthanc into a server of DICOM worklists. General information about how Orthanc supports DICOM worklists through plugins is explained in the FAQ.
The plugin serves the worklists stored in some folder on the filesystem or directly in the Orthanc database. It also provides a REST API to create and manage worklists.
The source code of this plugin is available on GitHub (AGPLv3+ license).
Basic configuration¶
First, generate the default configuration of Orthanc.
Then, modify the
Pluginsoption to point to the folder containing the shared library of the plugin.Finally, create a section “Worklists” in the configuration file to configure the worklist server.
A basic configuration would read as follows:
{
[...]
"Plugins" : [
"."
],
"Worklists" : {
"Enable": true,
"FilterIssuerAet": false, // Some modalities do not specify 'ScheduledStationAETitle (0040,0001)'
// in the C-Find and may receive worklists not related to them. This option
// adds an extra filtering based on the AET of the modality issuing the C-Find.
"LimitAnswers": 0, // Maximum number of answers to be returned (new in release 1.7.3)
"Directory": "./WorklistsDatabase", // The folder from which worklists are read or in which they are created.
"SaveInOrthancDatabase": false, // If set to true and if the Orthanc Database supports Key-Value stores
// (PostgreSQL or SQLite), the worklists must be created through the REST API
// and are stored in the Orthanc DB.
"SetStudyInstanceUidIfMissing": true, // Add a StudyInstanceUID to the worklist if none is provided in the REST API call to create it
"DeleteWorklistsOnStableStudy": true, // Delete the worklist as soon as a a stable study is found with the StudyInstanceUID
// provided in the worklist.
// Note that this check is performed in the Worklist Housekeeper thread. The plugin
// does not react synchronously on the Stable Study event.
// This process is only available if you are providing a StudyInstanceUID
// or if you have set the 'SetStudyInstanceUIDIfMissing' configuration to true
"HousekeepingInterval": 60, // Interval [in seconds] between 2 execution of the Worklist Housekeeper thread.
// New options only if SaveInOrthancDatabase is set to true.
"DeleteWorklistsDelay": 24 // Delay [in hours] after which the worklist is deleted.
// Note that this check is performed in the Worklist Housekeeper thread.
// The plugin only deletes worklists that have been created through the REST API.
// Set it to 0 if you don't want the plugin to delete worklists after a delay.
}
}
Tutorial¶
Download DCMTK utilities.
Enable the Worklists plugin in your configuration file by adding this section:
"Worklists" : { "Enable": true, "SaveInOrthancDatabase": true },
Add the plugin to the list of plugins to load (this is an example for Microsoft Windows):
"Plugins" : [ "StoneWebViewer.dll", "OrthancExplorer2.dll", "OrthancWorklists.dll" // On GNU/Linux, use libOrthancWorklists.so ],
The tests below will be done using the
findscucommand-line tool from the DCMTK utilities. Assumingfindscuand Orthanc runs on the same computer (i.e. on the127.0.0.1localhost), declare theFINDSCUAET to the list of know modalities:"DicomModalities" : { "horos" : [ "HOROS", "192.168.0.8", 11112 ], "findscu" : [ "FINDSCU", "127.0.0.1", 1234 ] },
Launch Orthanc as usual, making sure to give the proper configuration file (e.g. for Microsoft Windows):
Orthanc.exe config.json
Open the Orthanc Explorer 2 User interface and create a worklist for a
CT.In another command-line prompt, launch a
findscurequest to ask Orthanc to return all worklists forCTmodalities:findscu -W -k "ScheduledProcedureStepSequence[0].Modality=CT" 127.0.0.1 4242
The
-Woption makesfindscuissue a DICOM worklist query, the-koption specifies the query of interest,127.0.0.1corresponds to the localhost, and4242corresponds to the default DICOM TCP port of Orthanc.findscuwill display the matching worklists.
How to create a worklist using the REST API¶
The new worklsits plugin provides a REST API that can be used to create worklists. For example:
$ curl --request POST http://localhost:8042/worklists/create \
--data '{
"Tags" : {
"PatientID": "PID-45",
"PatientName": "Toto",
"ScheduledProcedureStepSequence" : [
{
"Modality": "US",
"ScheduledProcedureStepStartDate": "20251014",
"ScheduledProcedureStepDescription": "Description"
}
]
}
}'
In response, you’ll get something like:
{
"ID" : "5fdc7404-f9dc-4798-b6e1-8f715e2f9e71",
"Path" : "/worklists/5fdc7404-f9dc-4798-b6e1-8f715e2f9e71"
}
You can then check the content of the worklist by calling:
$ curl --request GET http://localhost:8042/worklists/5fdc7404-f9dc-4798-b6e1-8f715e2f9e71
To delete it, call:
$ curl --request DELETE http://localhost:8042/worklists/5fdc7404-f9dc-4798-b6e1-8f715e2f9e71
To browse all worklists, call:
$ curl --request GET http://localhost:8042/worklists/?format=Simplify
$ curl --request GET http://localhost:8042/worklists/?format=Short
$ curl --request GET http://localhost:8042/worklists/?format=Full
Troubleshooting C-Find queries¶
When trying to retrieve worklists from a modality, one usually don’t get debugging capabilities from the modality itself.
Therefore, it is usually convenient to mimic the modality with findscu (provided by DCMTK software).
First, you should make sure that you have configured the Worklist plugin correctly and that you have pushed at least a
.wlfile in the worklist database. For this, you should issue this kind of command:findscu -W 127.0.0.1 4242 -k 0008,0050="*"
This is the most generic C-Find request and should return all AccessionNumber of all the worklists in your database.
Note: you should make sure you have added a
findscuDICOM modality in your configuration file.findscushould output something like this:W: --------------------------- W: Find Response: 1 (Pending) W: W: # Dicom-Data-Set W: # Used TransferSyntax: Little Endian Explicit W: (0008,0005) CS [ISO_IR 100] # 10, 1 SpecificCharacterSet W: (0008,0050) SH [**********] # 10, 1 AccessionNumber W:
If you don’t get any output, you may add
-v -doptions to thefindscucommand line to get additional details.Everytime it receives a C-Find request, Orthanc displays the query parameters in its logs. With the previous C-Find command, you should expect this kind of output:
I0422 17:16:03.512449 CommandDispatcher.cpp:490] Association Received from AET FINDSCU on IP 127.0.0.1 I0422 17:16:03.514433 CommandDispatcher.cpp:688] Association Acknowledged (Max Send PDV: 16372) I0422 17:16:03.532062 main.cpp:118] No limit on the number of C-FIND results at the Patient, Study and Series levels I0422 17:16:03.535986 main.cpp:128] No limit on the number of C-FIND results at the Instance level I0422 17:16:03.536968 PluginsManager.cpp:171] Received worklist query from remote modality FINDSCU: { "0008,0050" : "*" } I0422 17:16:03.559539 CommandDispatcher.cpp:891] DUL Peer Requested Release I0422 17:16:03.560520 CommandDispatcher.cpp:898] Association Release
Now you may try to issue a C-Find request from your modality and check Orthanc logs. You should then have a better understanding of the query content and eventually understand why it does not match your worklists. You should also be able re-issue
findscurequests with additional arguments to mimic the requests issued by your modality.
Common problems¶
C-FIND requests can be modified by implementing the
IncomingWorklistRequestFilterLua callback since Orthanc 1.4.2. This can be useful to fix/sanitize worklist queries.According to the specification, modalities should not include their AET name in
ScheduledStationAETitleon user initiated queries. Therefore, they do receive worklists that do not concern them. This may be handled by theFilterIssuerAetconfiguration option. Note that the default behavior might in some cases be intended.