Saturday, February 4, 2012
Documentation Update for version 2.0.1.9
The online documentation is now updated for version 2.0.1.9.
In the new documentation there's new page with information for DICOM conformance that is useful for writing the DICOM Conformance Statement.
Wednesday, February 1, 2012
RZDCX 2.0.1.9
A new release of ZRDCX, 2.0.1.9, was released today. This release fixes the following issues:
Issue 291 addresses a very popular feature request to enable creation of DICOMDIR even when the filenames are not according to the standard. For example filenames with the instance uid like 1.2.3.4.5.6.dcm are not valid reference file id's according to the standard. Nevertheless, sometimes you would like to create a DICOMDIR file for other purposes other than exporting data on a CD. The ScanAndCreate method of DCXDICOMDIR takes a "strict" parameter that when set to false, will generate a DICOMDIR regardless of the validity of it's content (as long of course that the files are DICOM files).
Issue 290 is a new feature of RZDCX that enable to run a complete C-MOVE SCP with a single command including the incomming association. More about this feature in the upcoming chapter of the DICOM Tutorial.
Here's a short example
This single command takes care of all the details of a C-MOVE transaction. Instead of running an accepter on another thread to wait for the C-MOVE results, we pass the accepter as a parameter to the MoveAndStore method of the requester. Note that there's a new set property in DCXACC that enables setting the directory to store the incoming files. All the callbacks of DCXACC and DCXREQ can be used as well just as before.
Issue 287 is a small log enhancement that maxes it easier to to diagnose association problems. The log now shows very clearly when a presentation context for a command was not negotiated.
Issue 291 addresses a very popular feature request to enable creation of DICOMDIR even when the filenames are not according to the standard. For example filenames with the instance uid like 1.2.3.4.5.6.dcm are not valid reference file id's according to the standard. Nevertheless, sometimes you would like to create a DICOMDIR file for other purposes other than exporting data on a CD. The ScanAndCreate method of DCXDICOMDIR takes a "strict" parameter that when set to false, will generate a DICOMDIR regardless of the validity of it's content (as long of course that the files are DICOM files).
Issue 290 is a new feature of RZDCX that enable to run a complete C-MOVE SCP with a single command including the incomming association. More about this feature in the upcoming chapter of the DICOM Tutorial.
Here's a short example
public void MoveAndStore()
{
// Create an object with the query
matching criteria (Identifier)
DCXOBJ query = new DCXOBJ();
DCXELM e = new DCXELM();
e.Init((int)DICOM_TAGS_ENUM.patientName);
e.Value = DOE^JOHN";
query.insertElement(e);
e.Init((int)DICOM_TAGS_ENUM.patientID);
e.Value = @"123456789";
query.insertElement(e);
// Create an accepter to handle the
incomming association
DCXACC accepter = new
DCXACC();
accepter.StoreDirectory = @".\MoveAndStore";
Directory.CreateDirectory(accepter.StoreDirectory);
// Create a requester and run the query
DCXREQ requester = new
DCXREQ();
requester.MoveAndStore(
MyAETitle, // The AE title
that issue the C-MOVE
IS_AE, // The PACS AE title
IS_Host, // The PACS IP address
IS_port, // The PACS listener port
MyAETitle, // The AE title
to send the
query, // The matching criteria
104, // The port to receive the results
accepter); // The accepter
to handle the results
}
Issue 287 is a small log enhancement that maxes it easier to to diagnose association problems. The log now shows very clearly when a presentation context for a command was not negotiated.
Monday, January 23, 2012
DICOM Query/Retrieve Part I
It all started when I was sitting in a cubicle with a customer, looking at the code of their workstation performing a Query/Retrieve cycle and though everything did look familiar and pretty much straight forward something bothered me.
Query/Retrieve, or Q/R for short, is the DICOM service for searching images on the PACS and getting a copy of them to the workstation where they can be displayed.
Q/R is a fundamental service and every workstation implements it. This sounds like a trivial task, just like downloading a zip file from a web site but there are a lot of details to take care of and while writing this post I realized that I will have to split it to a little sub-series. Today's post will be about the Query part and in the next post I'll get to the Retrieve.
To search the PACS we use the DICOM command C-FIND. This command takes as an argument a DICOM object that represent a query. The PACS transforms the object that we send to a query, probably to SQL, runs it and then transform every result record back into a DICOM object and send it back to us in a C-FIND response. The PACS sends one C-FIND response for every result record. While still running, the status field of the C-FIND response command is pending (0xFF00). The last response has a status success. It may of course fail and then RZDCX will throw an exception with the failure reason and status. It may also succeed but with no matches (empty results set).
To search the PACS we use the DICOM command C-FIND. This command takes as an argument a DICOM object that represent a query. The PACS transforms the object that we send to a query, probably to SQL, runs it and then transform every result record back into a DICOM object and send it back to us in a C-FIND response. The PACS sends one C-FIND response for every result record. While still running, the status field of the C-FIND response command is pending (0xFF00). The last response has a status success. It may of course fail and then RZDCX will throw an exception with the failure reason and status. It may also succeed but with no matches (empty results set).
Let's do some examples. This code constructs a query for searching patients:
// Fill the query object
DCXOBJ obj = new DCXOBJ();
DCXELM el = new DCXELM();
el.Init((int)DICOM_TAGS_ENUM.QueryRetrieveLevel);
el.Value = "PATIENT";
obj.insertElement(el);
el.Init(0x00100010);
el.Value = "R*";
obj.insertElement(el);
el.Init(0x00100020);
obj.insertElement(el);
el.Init((int)DICOM_TAGS_ENUM.PatientsSex);
obj.insertElement(el);
el.Init((int)DICOM_TAGS_ENUM.PatientsBirthDate);
obj.insertElement(el);
Monday, January 9, 2012
Introduction to DICOM - Chapter 6 - Transfer Syntax
Transfer syntax defines how DICOM objects are serialized. When holding an object in memory, the only thing that matters is that your application can use it. The internal representation of the object is your own business. However, when sharing objects with other applications, everyone should be able to use the same object. The common solution for such problems is serialization.
Serialization is the process of writing a data structure or object state to wire i.e in a format that can be stored in a file or memory buffer, or transmitted across a network so it can be read on the other side of the wire or later by the same or by another process.
There's no shared memory in DICOM but it can be easily made using the same mechanism that is utilized for networking and files alike i.e. serializing the object into memory according to the rules dictated by the standard i.e. using transfer syntax.
In this post I'll cover the following issues:
So, as I said, the serialization in DICOM is governed by a term called Transfer Syntax.
Transfer Syntax is defined at the object level and is the syntax for serializing a DICOM object. We have seen transfer syntaxes already in chapter 5 when dealing with association negotiation but did not discuss them. In order for an application to read a DICOM object from a network wire, it has to know the rules that were used to write the object into the wire. In the association request the calling AE sends a list of abstract syntaxes with SOP Class UID's. For every SOP Class, the calling AE sends a list of transfer syntax UID's. In the association response the called AE selects one of the transfer syntax UID's for every SOP class it accepts.
There's no shared memory in DICOM but it can be easily made using the same mechanism that is utilized for networking and files alike i.e. serializing the object into memory according to the rules dictated by the standard i.e. using transfer syntax.
In this post I'll cover the following issues:
- Present the term Transfer Syntax,
- Why Transfer Syntax is required
- What is Transfer Syntax used for
- How Transfer Syntax is set when using
- DICOM files
- DICOM network
Transfer Syntax is defined at the object level and is the syntax for serializing a DICOM object. We have seen transfer syntaxes already in chapter 5 when dealing with association negotiation but did not discuss them. In order for an application to read a DICOM object from a network wire, it has to know the rules that were used to write the object into the wire. In the association request the calling AE sends a list of abstract syntaxes with SOP Class UID's. For every SOP Class, the calling AE sends a list of transfer syntax UID's. In the association response the called AE selects one of the transfer syntax UID's for every SOP class it accepts.
Thursday, November 17, 2011
Special offer for the new HL7Kit Pro 1.5
The main new feature of the new release is the support of multiple protocol versions and multiple mapping rules for a single runtime service. The runtime service can be configured to use different message definition files and different mapping XML for every remote application. This feature was requested long ago by many customers and a workaround to allow this was introduced in version 1.2. Now this feature is fully integrated into the product. The new release can be downloaded here.
Friday, October 28, 2011
HL7Kit Video Tutorials
If one picture worth a thousand words, how much does a 20 minutes video tutorials worth?
The HL7Kit web site promise that "You are 20 minutes away from HL7 integration!" I checked that again, this time on film.
From download to runtime deployment, a series of five detailed videos showing step by step how to set up a ADT^A01 message interface using HL7Kit.
Here it is. Comments and questions are most welcome.
The HL7Kit web site promise that "You are 20 minutes away from HL7 integration!" I checked that again, this time on film.
From download to runtime deployment, a series of five detailed videos showing step by step how to set up a ADT^A01 message interface using HL7Kit.
Here it is. Comments and questions are most welcome.
Sunday, September 25, 2011
Open Source HL7 Sender
[update 24 March 2023: Latest releases of HRZ software can be found on HRZ website - www.hrzkit.com]
HL7 Sender source code is now available for free download.
The full source code of the HL7 editor / HL7 sender application can be obtained from the product web site
Subscribe to:
Posts (Atom)
