I am developing a system which will be able to create structured report for PACS.
Obviously in order to create a DICOM instance (file containing Report data), I need three UIDs for Study, Series and Instance. StudyUID and SeriesUID must be the same as that of study and series that report is created for. But for SOPInstanceUID, I need to generate new UID.
I have seen getNewSOPInstanceUID
method in Pixelmed documentation, but I am not familiar with the Pixelmed source. I need an algorithm or Python source.
There are 2 ways in DICOM to create UIDs. One based on a registered UID root and one based on a UUID. The later method was added to the DICOM standard with CP-1156 in 2012. UIDs for things like Study UID, Series UID, SOP Instance UID can be created by converting a UUID to a DICOM UID.
Most programming languages have build in support to create a UUID. The sample code code below creates a valid DICOM UID in C# based on a GUID value.
public static string GuidToUidStringUsingStringAndParse(Guid value)
{
var guidBytes = string.Format("0{0:N}", value);
var bigInteger = BigInteger.Parse(guidBytes, NumberStyles.HexNumber);
return string.Format(CultureInfo.InvariantCulture, "2.25.{0}", bigInteger);
}
The following method does the same but is about 5 times faster:
public static string ConvertGuidToUuidInteger(ref Guid value)
{
// ISO/IEC 9834-8, paragraph 6.3 (referenced by DICOM PS 3.5, B.2) defines how
// to convert a UUID to a single integer value that can be converted back into a UUID.
// The Guid.ToByteArray Method returns the array in a strange order (see .NET docs),
// BigInteger expects the input array in little endian order.
// The last byte controls the sign, add an additional zero to ensure
// the array is parsed as a positive number.
var octets = value.ToByteArray();
var littleEndianOrder = new byte[]
{ octets[15], octets[14], octets[13], octets[12], octets[11], octets[10], octets[9], octets[8],
octets[6], octets[7], octets[4], octets[5], octets[0], octets[1], octets[2], octets[3], 0 };
return "2.25." + new BigInteger(littleEndianOrder).ToString(CultureInfo.InvariantCulture);
}
Refer this answer for more details about DICOM UID.
A] Increment the counters [Not Recommended]
One simple logic is to get your SeriesInstanceUID and increment it by 1. So say your SeriesInstanceUID is "1.1.1.1.1" then your SOPInstanceUID may be "1.1.1.1.2" or "1.1.1.1.1.1".
Problems:
B] Date Time [Not Recommended]
Other technique generally used is to append time stamp (with ticks) to organization root.
Problems:
C] More Complex [RECOMMENDED]
1.2.840.xxxxx.30.152.99999.235.20.100.yyyyMMddHHmmss.zzzzzz
Where:
1.2.840.xxxxx: Organization Root
30: Application ID
152: Application Version
99999: Installation/Location ID
235: Study ID
20: Series Number
100: Image Number
yyyyMMddHHmmss: Date Time
zzzzzz: Thread safe counter/Random Number
Problems:
D] UUID Derived UID [RECOMMENDED]
UID may be generated from the root "2.25." followed by a decimal representation of a Universally Unique Identifier (UUID).
Problems:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With