3D Coordinates in DicomObjects
All 3D calculations in DicomObjects are almost entirely in “real world” coordinated (patient X,Y,Z in mm). We have implemented a few dedicated methods to help you manipulate your 3D object or the ones that are displayed. This includes the DicomImage.ImagePlane() (DicomImage.Projection.Plane in COM) which returns an Image’s plane in Plane3D form that can be used for other calculation (in real world units again), say the intersection of two Image planes, or to offset one of them by the slab thickness and to calculate that intersection, etc.
ActionUpdate only fires when Pending responses are received
The ActionUpdate event fires when “pending” responses are received during C-Move operations.
The event is therefore triggered by a response on the primary connection indicating how many images:
Have been sent successfully Have Been sent with a warning response Have failed Are still to be sent Such pending responses are however optional and the server may choose not to send any.
If this is the case you will find that ActionUpdate does not fire.
There are many different ways to activate a DicomObjects or XdsObjects licence:
- Licence manager
- Offline activation
- Application signing licence
Adding Sequence Items
A sequence in DICOM is represented by DicomDataSets Object in DicomObjects and a sequence item is represented by a DicomDataSet Object.
Adding additional attributes when using AddToDirectory
Only the mandatory elements (and one or two others we’ve been talked into adding) are put into the DICOMDIR by the AddToDirectory (.NET version) or AddToDirectory (COM version) method, but you can add others yourself very easily.
The AddToDirectory method returns a 4 item DicomDataSetCollection (.NET) or DicomDataSets collection(COM), and the 4 items are references to the 4 datasets referred to (existing or created as necessary) by that method call.
Adjusting WindowWidth And Level using ExplicitVOILUT property
.NET version Demo code to show the usage of the DicomImage property (ExplicitVOILUT) by generating and applying a LookupTable that has been calculated based on the standard DICOM windowing formula for calculating a Lookup table.
This example code assumes min and max as the range of values you need to handle in input data (anything beyond that is mapped to the first/last value) and for screen display it defaults to 8 bit output.
Alternative Licensing Models
We offer two main alternatives to the conventional licensing mechanism, which is tied to per PC based on its MachineID (unique identifier for every PC)
Concurrent licensing - Your application requests a license for a user defined period of time (say 8 hours to cover a day of work) and at the end of it, releases that licence for the next day or another instance of your application to claim it.
Anonymisation of DICOM Objects
DicomObjects is commonly and successfully used for Anonymisation and all the required data changes are easy using DicomObjects - the real problem is working out what needs changing! This subject is a real “Pandora’s box”, and whilst changing IDs, names etc. is easy, the more you look into it, the more “Hidden” patient information you find
dates and times of examinations and accession numbers buried within UIDs private data [who knows what’s in there?
An Application Entity (AE) is the name used in DICOM to represent a system or program running on a system which is the end-point of DICOM communications.
Each Application Entity has an Application Entity Title (AET) which only needs to be locally unique, but cannot exceed 16 characters.
Appropriate Compression For DICOM Files
As disk space usage has always been a priority when designing/implementing DICOM applications, “What is the best practice for writing DICOM files?” is becoming a very common question asked by our developers.
A sensible idea is to write uncompressed images in lossless-compressed format in order to reduce disk usage, and leave compressed images “as is”.
So check against the “original” transfer syntax of the image (either read from disk or received over network), if it’s one of those uncompressed formats then lossless compress it when you write on disk.
As association is the DICOM term for a network connection between two applications, one of which is the Service Class User (SCU - client) and the other is the Service Class Provider (SCP - server). It is basically a TCP connection, but with extensive negotiation between the two entities to agree which SOP Classes and options they both support.
Since a DICOM association is a network connection any number of independent operations may be made over it.
Where it appears In the DicomObjects log file
What caused Auto-Disconnection It’s caused by releasing the last remaining reference to a DicomConnection without first sending a status back to the remote end. This normally means:
The Developer forgot to send the status back before closing the connection, or An exception occurred but was not trapped, causing the SendStatus call itself or an operation which should trigger a subsequent ActionComplete (e.
Avoiding Accepting Private SOP classes
Many pieces of equipment will try to negotiate both a Private SOP class and an official DICOM SOP Class for the images they send to a PACS, on the basis that only a PACS from the same manufacturer will accept the private one, with everyone else accepting only the DICOM one. It is important that this behavior is maintained at the PACS in order to avoid accidentally accepting the private class(es).
Background Operations in DicomObjects
DicomObjects.NET version All functions in .NET (e.g SendImages) are synchronous methods and do not return until the operation has completed. So if for example you wish to send asynchronously, then it is necessary to create your own thread using the native .NET threading methods. Whilst this might seem a “move backwards” from the COM version, remember that the COM threading in DicomObjects was only to allow you to do these things despite the lack of native threading support in VB6 etc.
Basic DICOM Operations
DICOM services use a limited number of basic DICOM operations (officially called DIMSE operations), all of which are of course supported by DicomObjects.
Composite Operations These are “self-contained”, and the objects passed therefore contain enough information for the operation to exist independently, without reference to other operations on the same or different associations (though of course they are commonly used as part of more complex operations!)
C-STORE The most basic DICOM operation, otherwise known as “DICOM Push” allows an SCU to send a Composite Instance to an SCP.