def DataElement_from_raw(raw_data_element, encoding=None):
    """Return a DataElement from a RawDataElement"""
    from dicom.values import convert_value  # XXX buried here to avoid circular import filereader->Dataset->convert_value->filereader (for SQ parsing)
    raw = raw_data_element
    VR = raw.VR
    if VR is None:  # Can be if was implicit VR
        try:
            VR = dictionaryVR(raw.tag)
        except KeyError:
            if raw.tag.is_private:
                VR = 'OB'  # just read the bytes, no way to know what they mean
            elif raw.tag.element == 0:  # group length tag implied in versions < 3.0
                VR = 'UL'
            else:
                raise KeyError(
                    "Unknown DICOM tag {0:s} - can't look up VR".format(
                        str(raw.tag)))
    try:
        value = convert_value(VR, raw, encoding)
    except NotImplementedError as e:
        raise NotImplementedError("{0:s} in tag {1!r}".format(str(e), raw.tag))
    return DataElement(raw.tag,
                       VR,
                       value,
                       raw.value_tell,
                       raw.length == 0xFFFFFFFF,
                       already_converted=True)
Beispiel #2
0
 def testEmptyItem(self):
     """Read sequence with a single empty item..............................."""
     # This is fix for issue 27
     bytes = (
          "08 00 32 10"    # (0008, 1032) SQ "Procedure Code Sequence"
         " 08 00 00 00"    # length 8
         " fe ff 00 e0"    # (fffe, e000) Item Tag
         " 00 00 00 00"    # length = 0
         ) + (             # --------------- end of Sequence
         " 08 00 3e 10"    # (0008, 103e) LO "Series Description"
         " 0c 00 00 00"    # length
         " 52 20 41 44 44 20 56 49 45 57 53 20"  # value
         )
     # "\x08\x00\x32\x10\x08\x00\x00\x00\xfe\xff\x00\xe0\x00\x00\x00\x00" # from issue 27, procedure code sequence (0008,1032)
     # bytes += "\x08\x00\x3e\x10\x0c\x00\x00\x00\x52\x20\x41\x44\x44\x20\x56\x49\x45\x57\x53\x20" # data element following
     
     fp = StringIO(hex2str(bytes))
     gen = data_element_generator(fp, is_implicit_VR=True, is_little_endian=True)
     raw_seq = gen.next()
     seq = convert_value("SQ", raw_seq)
     
     self.assert_(isinstance(seq, Sequence), "Did not get Sequence, got type '%s'" % type(seq))
     self.assert_(len(seq)==1, "Expected Sequence with single (empty) item, got %d item(s)" % len(seq))
     self.assert_(len(seq[0])==0, "Expected the sequence item (dataset) to be empty")
     elem2 = gen.next()
     self.assertEqual(elem2.tag, 0x0008103e, "Expected a data element after empty sequence item")
Beispiel #3
0
    def testEmptyItem(self):
        """Read sequence with a single empty item..............................."""
        # This is fix for issue 27
        hexstr = (
            "08 00 32 10"    # (0008, 1032) SQ "Procedure Code Sequence"
            " 08 00 00 00"    # length 8
            " fe ff 00 e0"    # (fffe, e000) Item Tag
            " 00 00 00 00"    # length = 0
        ) + (             # --------------- end of Sequence
            " 08 00 3e 10"    # (0008, 103e) LO "Series Description"  nopep8
            " 0c 00 00 00"    # length     nopep8
            " 52 20 41 44 44 20 56 49 45 57 53 20"  # value     nopep8
        )
        # "\x08\x00\x32\x10\x08\x00\x00\x00\xfe\xff\x00\xe0\x00\x00\x00\x00" # from issue 27, procedure code sequence (0008,1032)
        # hexstr += "\x08\x00\x3e\x10\x0c\x00\x00\x00\x52\x20\x41\x44\x44\x20\x56\x49\x45\x57\x53\x20" # data element following

        fp = BytesIO(hex2bytes(hexstr))
        gen = data_element_generator(fp, is_implicit_VR=True, is_little_endian=True)
        raw_seq = next(gen)
        seq = convert_value("SQ", raw_seq)

        self.assertTrue(isinstance(seq, Sequence), "Did not get Sequence, got type {0}".format(str(type(seq))))
        self.assertTrue(len(seq) == 1, "Expected Sequence with single (empty) item, got {0:d} item(s)".format(len(seq)))
        self.assertTrue(len(seq[0]) == 0, "Expected the sequence item (dataset) to be empty")
        elem2 = next(gen)
        self.assertEqual(elem2.tag, 0x0008103e, "Expected a data element after empty sequence item")
Beispiel #4
0
def DataElement_from_raw(raw_data_element):
    """Return a DataElement from a RawDataElement"""
    from dicom.values import convert_value # XXX buried here to avoid circular import filereader->Dataset->convert_value->filereader (for SQ parsing)
    raw = raw_data_element
    VR = raw.VR
    if VR is None: # Can be if was implicit VR
        try:
            VR = dictionaryVR(raw.tag)
        except KeyError:
            if raw.tag.is_private:
                VR = 'OB'  # just read the bytes, no way to know what they mean
            elif raw.tag.element == 0:  # group length tag implied in versions < 3.0
                VR = 'UL'
            else:
                raise KeyError, "Unknown DICOM tag %s - can't look up VR" % str(tag)    
    try:
        value = convert_value(VR, raw)
    except NotImplementedError, e:
        raise NotImplementedError, "%s in tag %r" % (str(e), raw.tag)
Beispiel #5
0
def DataElement_from_raw(raw_data_element):
    """Return a DataElement from a RawDataElement"""
    from dicom.values import convert_value # XXX buried here to avoid circular import filereader->Dataset->convert_value->filereader (for SQ parsing)
    raw = raw_data_element
    VR = raw.VR
    if VR is None: # Can be if was implicit VR
        try:
            VR = dictionaryVR(raw.tag)
        except KeyError:
            if raw.tag.is_private:
                VR = 'OB'  # just read the bytes, no way to know what they mean
            elif raw.tag.element == 0:  # group length tag implied in versions < 3.0
                VR = 'UL'
            else:
                raise KeyError, "Unknown DICOM tag %s - can't look up VR" % str(raw.tag)    
    try:
        value = convert_value(VR, raw)
    except NotImplementedError, e:
        raise NotImplementedError, "%s in tag %r" % (str(e), raw.tag)
    def testImplVRBigEndian_ExplicitLengthSeq(self):
        """Raw read: ImplVR BigEndian SQ with explicit lengths.................."""
        # Create a fictional sequence with bytes directly,
        #    similar to PS 3.5-2008 Table 7.5-1 p42
        hexstr = (
            "30 0a 00 B0"  # (300a, 00b0) Beam Sequence
            " 00 00 00 40"  # length
            " ff fe e0 00"  # (fffe, e000) Item Tag
            " 00 00 00 18"  # Item (dataset) Length
            " 30 0a 00 c0"  # (300A, 00C0) Beam Number
            " 00 00 00 02"  # length
            " 31 20"  # value '1 '
            " 30 0a 00 c2"  # (300A, 00C2) Beam Name
            " 00 00 00 06"  # length
            " 42 65 61 6d 20 31"  # value 'Beam 1'
            # -------------
            " ff fe e0 00"  # (fffe, e000) Item Tag
            " 00 00 00 18"  # Item (dataset) Length
            " 30 0a 00 c0"  # (300A, 00C0) Beam Number
            " 00 00 00 02"  # length
            " 32 20"  # value '2 '
            " 30 0a 00 c2"  # (300A, 00C2) Beam Name
            " 00 00 00 06"  # length
            " 42 65 61 6d 20 32"  # value 'Beam 2'
        )

        infile = BytesIO(hex2bytes(hexstr))
        de_gen = data_element_generator(infile,
                                        is_implicit_VR=True,
                                        is_little_endian=False)
        raw_seq = next(de_gen)
        seq = convert_value("SQ", raw_seq)

        # The sequence is parsed, but only into raw data elements.
        # They will be converted when asked for. Check some:
        got = seq[0].BeamNumber
        self.assertTrue(got == 1,
                        "Expected Beam Number 1, got {0!r}".format(got))
        got = seq[1].BeamName
        self.assertTrue(got == 'Beam 2',
                        "Expected Beam Name 'Beam 2', got {0:s}".format(got))
Beispiel #7
0
def DataElement_from_raw(raw_data_element, encoding=None):
    """Return a DataElement from a RawDataElement"""
    from dicom.values import convert_value  # XXX buried here to avoid circular import filereader->Dataset->convert_value->filereader (for SQ parsing)
    raw = raw_data_element
    VR = raw.VR
    if VR is None:  # Can be if was implicit VR
        try:
            VR = dictionaryVR(raw.tag)
        except KeyError:
            if raw.tag.is_private:
                VR = 'OB'  # just read the bytes, no way to know what they mean
            elif raw.tag.element == 0:  # group length tag implied in versions < 3.0
                VR = 'UL'
            else:
                raise KeyError("Unknown DICOM tag {0:s} - can't look up VR".format(str(raw.tag)))
    try:
        value = convert_value(VR, raw, encoding)
    except NotImplementedError as e:
        raise NotImplementedError("{0:s} in tag {1!r}".format(str(e), raw.tag))
    return DataElement(raw.tag, VR, value, raw.value_tell,
                       raw.length == 0xFFFFFFFF, already_converted=True)
Beispiel #8
0
    def testImplVRLittleEndian_ExplicitLengthSeq(self):
        """Raw read: ImplVR Little Endian SQ with explicit lengths.............."""
        # Create a fictional sequence with bytes directly,
        #    similar to PS 3.5-2008 Table 7.5-1 p42
        bytes = (
            "0a 30 B0 00"  # (300a, 00b0) Beam Sequence
            " 40 00 00 00"  # length
            " fe ff 00 e0"  # (fffe, e000) Item Tag
            " 18 00 00 00"  # Item (dataset) Length
            " 0a 30 c0 00"  # (300A, 00C0) Beam Number
            " 02 00 00 00"  # length
            " 31 20"  # value '1 '
            " 0a 30 c2 00"  # (300A, 00C2) Beam Name
            " 06 00 00 00"  # length
            " 42 65 61 6d 20 31"  # value 'Beam 1'
            # -------------
            " fe ff 00 e0"  # (fffe, e000) Item Tag
            " 18 00 00 00"  # Item (dataset) Length
            " 0a 30 c0 00"  # (300A, 00C0) Beam Number
            " 02 00 00 00"  # length
            " 32 20"  # value '2 '
            " 0a 30 c2 00"  # (300A, 00C2) Beam Name
            " 06 00 00 00"  # length
            " 42 65 61 6d 20 32"  # value 'Beam 2'                
        )

        infile = StringIO(hex2str(bytes))
        de_gen = data_element_generator(infile,
                                        is_implicit_VR=True,
                                        is_little_endian=True)
        raw_seq = de_gen.next()
        seq = convert_value("SQ", raw_seq)

        # The sequence is parsed, but only into raw data elements.
        # They will be converted when asked for. Check some:
        got = seq[0].BeamNumber
        self.assert_(got == 1, "Expected Beam Number 1, got %r" % got)
        got = seq[1].BeamName
        self.assert_(got == 'Beam 2',
                     "Expected Beam Name 'Beam 2', got %s" % got)
Beispiel #9
0
    def testImplVRBigEndian_ExplicitLengthSeq(self):
        """Raw read: ImplVR BigEndian SQ with explicit lengths.................."""
        # Create a fictional sequence with bytes directly,
        #    similar to PS 3.5-2008 Table 7.5-1 p42
        bytes = (
            "30 0a 00 B0"    # (300a, 00b0) Beam Sequence
            " 00 00 00 40"    # length
                " ff fe e0 00"    # (fffe, e000) Item Tag
                " 00 00 00 18"    # Item (dataset) Length
                " 30 0a 00 c0"    # (300A, 00C0) Beam Number
                " 00 00 00 02"    # length
                " 31 20"          # value '1 '
                " 30 0a 00 c2"    # (300A, 00C2) Beam Name
                " 00 00 00 06"    # length
                " 42 65 61 6d 20 31" # value 'Beam 1'
                # -------------
                " ff fe e0 00"    # (fffe, e000) Item Tag
                " 00 00 00 18"    # Item (dataset) Length
                " 30 0a 00 c0"    # (300A, 00C0) Beam Number
                " 00 00 00 02"    # length
                " 32 20"          # value '2 '
                " 30 0a 00 c2"    # (300A, 00C2) Beam Name
                " 00 00 00 06"    # length
                " 42 65 61 6d 20 32" # value 'Beam 2'                
                )
                
        infile = StringIO(hex2str(bytes))
        de_gen = data_element_generator(infile, is_implicit_VR=True, is_little_endian=False)
        raw_seq = de_gen.next()
        seq = convert_value("SQ", raw_seq)

        # The sequence is parsed, but only into raw data elements. 
        # They will be converted when asked for. Check some:
        got = seq[0].BeamNumber
        self.assert_(got == 1, "Expected Beam Number 1, got %r" % got)
        got = seq[1].BeamName
        self.assert_(got == 'Beam 2', "Expected Beam Name 'Beam 2', got %s" % got)
Beispiel #10
0
    def testImplVRLittleEndian_ExplicitLengthSeq(self):
        """Raw read: ImplVR Little Endian SQ with explicit lengths.............."""
        # Create a fictional sequence with bytes directly,
        #    similar to PS 3.5-2008 Table 7.5-1 p42
        hexstr = (
            "0a 30 B0 00"    # (300a, 00b0) Beam Sequence
            " 40 00 00 00"    # length
            " fe ff 00 e0"    # (fffe, e000) Item Tag
            " 18 00 00 00"    # Item (dataset) Length
            " 0a 30 c0 00"    # (300A, 00C0) Beam Number
            " 02 00 00 00"    # length
            " 31 20"          # value '1 '
            " 0a 30 c2 00"    # (300A, 00C2) Beam Name
            " 06 00 00 00"    # length
            " 42 65 61 6d 20 31"  # value 'Beam 1'
            # -------------
            " fe ff 00 e0"    # (fffe, e000) Item Tag
            " 18 00 00 00"    # Item (dataset) Length
            " 0a 30 c0 00"    # (300A, 00C0) Beam Number
            " 02 00 00 00"    # length
            " 32 20"          # value '2 '
            " 0a 30 c2 00"    # (300A, 00C2) Beam Name
            " 06 00 00 00"    # length
            " 42 65 61 6d 20 32"  # value 'Beam 2'
        )

        infile = BytesIO(hex2bytes(hexstr))
        de_gen = data_element_generator(infile, is_implicit_VR=True, is_little_endian=True)
        raw_seq = next(de_gen)
        seq = convert_value("SQ", raw_seq)

        # The sequence is parsed, but only into raw data elements.
        # They will be converted when asked for. Check some:
        got = seq[0].BeamNumber
        self.assertTrue(got == 1, "Expected Beam Number 1, got {0!r}".format(got))
        got = seq[1].BeamName
        self.assertTrue(got == 'Beam 2', "Expected Beam Name 'Beam 2', got {0:s}".format(got))