DICOM Capacitor is a store-and-forward DICOM router, and conditional routing is among the simplest of its many features.
Here, we show an example of a configuration that makes Capacitor:
To begin, collect information about our PACS’.
For this example, we have gathered the following:
AE Title | IP Address | Port | Preferred Transfer Syntax | ||
Primary PACS | IMAGEPACS | 192.168.1.200 | 104 | JPEG 2000 Lossless | |
Secondary PACS | REPORTPACS | 192.168.1.201 | 104 | Any |
We’re ready to install.
$ net start DICOMCapacitorService
$ net stop DICOMCapacitorService
Close DICOM Capacitor Control if it’s still open because all further steps will be performed outside the user interface.
All Capacitor configuration files live in the %ProgramData%\Flux Inc\DICOM Capacitor
folder.
Here are the three files we will be editing:
config.yml
in your YAML text editor — we recommend Atom, or Visual Studio Code.scpPort
:
scpPort: 1040
route
” the filters
setting:
filters: route
3. Finally, save and close config.yml.
Next, we define our destination nodes.
nodes.yml
in your YAML text editor.nodes.yml
with:# Primary PACS
- NodeRole: Storage
AeTitle: IMAGEPACS
HostName: 192.168.1.200
Impersonate: true
Port: 104
TransferSyntax: JPEG2000Lossless
MinimumLineSpeed: 500
# Secondary PACS
- NodeRole: Storage
AeTitle: REPORTPACS
HostName: 192.168.1.201
Impersonate: true
Port: 104
MinimumLineSpeed: 500
According to this node definition file, Capacitor will:
1 Capacitor will also respond to DCP_IMAGEPACS, and DCP_REPORTPACS in the same way.
All that remains is for us to configure our routing rules.
All route definitions live in a file called routings.yml
.
routings.yml
if it does not already exist, and open it in your YAML editor.---
- AeTitles:
- IMAGEPACS
Conditions:
- Tag: 0008,0016
MatchExpression: ^1\.2\.840\.10008\.5\.1\.4\.1\.1\.88\.[\d]{1,2}$
Actions:
- Description: Re-route to REPORTPACS
Type: add_destination
Target: REPORTPACS
RemoveOriginal: true
This definition tells Capacitor’s routing module to:
^1.2.840.10008.5.1.4.1.1.88.[\d]{1,2}$
, which matches all DICOM SR typesWe’re ready to test.
$ net start DICOMCapacitorService
%ProgramData%\Flux Inc\DICOM Capacitor\logs\capacitor_service.log
The last few lines in this log should confirm that Capacitor is running and accepting connections on behalf of our two nodes.
<DicomPrinterConfig>
<General> <CheckingInterval>1
</CheckingInterval> <SuspensionTime>1
</SuspensionTime> <Verbosity>20</Verbosity>
</General> <ActionsList>
<SetTag tag=“(1001,1000)” tagName=“Destination” name=“InitDestination” vr=“LO”/> <Run type=“Interactive” name=“ChooseDestination”>
<Command>plugins/ GeneralSelectPlugin.exe </Command>
<Timeout>60000</Timeout>
<Arguments>Select Report Destination|Primary PACS|Secondary PACS|Dry Imager</Arguments>
<Output tag=“(1001,1000)”/> </Run>
<ParseJobTextFile name=“ParseContents”>
<DcmTag tag=“(8,50)”>^(.*)\-.*$</DcmTag> <DcmTag tag=“(8,60)”>^.*\-(.*)$</DcmTag>
</ParseJobFileName>
<Query name=“Query” type=“Worklist”> <DcmTag tag=“(0008,0050)” />
<DcmTag tag=“(0008,0060)” /> <DcmTag tag=“(0010,0020)” />
<DcmTag tag=“(0020,000D)” />
<ConnectionParameters>
<MyAeTitle>DICOMPRINTER2
</MyAeTitle> <PeerAeTitle>DVT </PeerAeTitle>
<Host>localhost</Host>
<Port>104</Port>
</ConnectionParameters>
</Query> <Store name=“StoreToPrimary”>
<Compression type=“RLE” /> <ConnectionParameters>
<PeerAeTitle>CONQUESTSRV1 </PeerAeTitle>
<Host>192.168.0.41</Host> <Port>5678</Port>
</ConnectionParameters>
</Store> <Store name=“StoreToSecondary”>
<Compression type=“RLE” />
<ConnectionParameters>
<MyAeTitle>DICOM_PRINTER
</MyAeTitle>
<PeerAeTitle>CONQUESTSRV2 </PeerAeTitle>
<Host>192.168.0.42</Host> <Port>104</Port>
</ConnectionParameters>
</Store> <Print name=“Print”>
<PrintMode>Grayscale12 </PrintMode> <Resolution>254 x 254</Resolution>
<ConnectionParameters>
<MyAeTitle>DICOM_PRINTER
</MyAeTitle>
<PeerAeTitle>DRIPIX </PeerAeTitle>
<Host>192.168.0.43</Host>
<Port>5040</Port>
</ConnectionParameters>
</Print> </ActionsList>
</ActionsList> <Workflow>
<Perform action=“InitDestination”/>
<Perform action=“ChooseDestination”/ onError=“Discard”>
<If field=“TAG_VALUE( 1001, 1000 )” value=“\*Dry\*”>
<Statements> <Perform action=“Print” onError=“Ignore”/>
</Statements> </If> <If field=“TAG_VALUE( 1001, 1000 )” value=“\*PACS\*”>
<Statements> <Perform action=“ParseContents” onError=“Hold” />
<Perform action=“Query” onError=“Ignore” /> <If field=“QUERY_FOUND” value=“1”> <Statements>
<If field=“TAG_VALUE( 1001, 1000 )” value=“\*Primary\*”>
<Statements> <Perform action=“StoreToPrimary” onError=“Ignore”/>
</Statements> </If> <If field=“TAG_VALUE( 1001, 1000 )” value=“\*Secondary\*”>
<Statements> <Perform action=“StoreToSecondary” onError=“Ignore”/>
</Statements> </If>
</Statements> <Else>
<Suspend resumeAction=“Query”>
</Else> </If>
</Statements> </If>
</Workflow>
</DicomPrinterConfig>
© Copyright 2023 flux. All rights reserved.