Module: DicomUID
- Defined in:
- lib/dicom_uid.rb
Overview
DICOM UID Generator according to the DICOM documentation dicom.nema.org/dicom/2013/output/chtml/part05/chapter_9.html
The UID looks like the following <org>.<suffix> UID is composed of two main components, org and suffix. Components are separated by a dot and are only composed of decimals. The UID must not be more than 64 characters, dots included.
Class Method Summary collapse
-
.random_component(length = 62, odd_byte_boundary = true) ⇒ Object
Generates random component with defined, maximum length The maximum length is 62.
-
.random_dicom_uid(org_root, fixed_size, odd_byte_boundary = true) ⇒ Object
set default values, with org_root if needed the size of the UID is randomized fixed_size is the size ogf the whole UID, with the org taken into account.
-
.random_uids(org_root, fixed_size, array_size, odd_byte_boundary = true) ⇒ Object
Return an array of UIDs, from a common org root.
Class Method Details
.random_component(length = 62, odd_byte_boundary = true) ⇒ Object
Generates random component with defined, maximum length The maximum length is 62. Why ? Because an UID has at least an org_root and a suffix, and they are separated by a dot, which makes 1 character minimum and 62 characters maximum
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/dicom_uid.rb', line 40 def self.random_component length = 62, odd_byte_boundary = true # exceptions raise TypeError unless length.is_a? Integer and odd_byte_boundary == !!odd_byte_boundary raise RangeError, "Length of a component cannot be negative or null" if length <= 0 raise OversizedUIDError if length > 62 # randing length of number length_component = 0 while (length_component == length - 1) or length_component == 0 srand length_component = rand 0..length end # randing the component: length component = '9' * (length - 1) while component.length == length - 1 component = (rand ('9' * length_component).to_i).to_s end if odd_byte_boundary and !odd_byte_rule component# if odd number component << '0' component = component[1..-1]# removing first int end component end |
.random_dicom_uid(org_root, fixed_size, odd_byte_boundary = true) ⇒ Object
set default values, with org_root if needed the size of the UID is randomized fixed_size is the size ogf the whole UID, with the org taken into account
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/dicom_uid.rb', line 12 def self.random_dicom_uid org_root, fixed_size, odd_byte_boundary = true raise TypeError, 'Org root must be a string or an Integer' unless org_root.is_a? String or org_root.is_a? Integer org_root = org_root.to_s if org_root.is_a? Integer raise TypeError unless fixed_size.is_a? Integer and odd_byte_boundary == !!odd_byte_boundary # building the org root org_root = self.random_component(62, odd_byte_boundary) if org_root.empty?# UID needs at least an org root raise LeadingZeroError if leading_zero? org_root raise OddByteError if !odd_byte_rule(org_root) and odd_byte_boundary # if the fixed size doesn't exist, a random one is created, but # it must be generated so that the UID musn't be above 64 chars fixed_size ||= rand(0..(64 - org_root.length - 1)) fixed_size -= 1 if add_missing_dot org_root raise OversizedUIDError if fixed_size > 64 raise RangeError, 'Size of Org root larger than size provided' if fixed_size < org_root.length raise RangeError, "Size of UID can't be negative" if fixed_size < 0 # building the suffix self.rand_duid org_root, (fixed_size - org_root.length), odd_byte_boundary end |
.random_uids(org_root, fixed_size, array_size, odd_byte_boundary = true) ⇒ Object
Return an array of UIDs, from a common org root
71 72 73 74 75 76 77 78 79 |
# File 'lib/dicom_uid.rb', line 71 def self.random_uids org_root, fixed_size, array_size, odd_byte_boundary = true uids = Array.new array_size array_size.times do |i| uids[i] = (self.random_dicom_uid org_root.dup, fixed_size, odd_byte_boundary) end uids end |