pydicom codify
command¶
The pydicom codify
command takes a DICOM file and produces Python code to
recreate that file, or, optionally a subset within that file.
See Using Codify for full details of writing a complete file. Here we will review the command-line options in more detail than in that section, and show how to export a dataset within a DICOM file that has sequences.
Warning
The code produced by codify
will contain all the information in the original
file, which may include private health information or other sensitive
information.
A simple example¶
A simple example of using the codify
command would be:
$ pydicom codify pydicom::rtplan.dcm
# Coded version of DICOM file 'C:\git\pydicom\pydicom\data\test_files\rtplan.dcm'
# Produced by pydicom codify utility script
import pydicom
from pydicom.dataset import Dataset, FileMetaDataset
from pydicom.sequence import Sequence
# Main data elements
ds = Dataset()
ds.InstanceCreationDate = '20030903'
ds.InstanceCreationTime = '150031'
ds.SOPClassUID = '1.2.840.10008.5.1.4.1.1.481.5'
ds.SOPInstanceUID = '1.2.777.777.77.7.7777.7777.20030903150023'
ds.StudyDate = '20030716'
ds.StudyTime = '153557'
.
.
.
Note that prefixing the file specification with pydicom::
will read the file
from the pydicom test data files rather than from the file system.
Command options¶
In the above example, the output was directed to screen, because no output file
was specified. To see the available command options, use the help
command:
pydicom help codify
usage: pydicom codify [-h] [-e EXCLUDE_SIZE] [-p] [-s SAVE_AS] filespec [outfile]
Read a DICOM file and produce the *pydicom* (Python) code which can create that file
positional arguments:
filespec File specification, in format [pydicom::]filename[::element]. If `pydicom::`
prefix is used, then use the pydicom test file with that name. If `element`
is given, use only that data element within the file. Examples:
path/to/your_file.dcm, your_file.dcm::StudyDate,
pydicom::rtplan.dcm::BeamSequence[0],
yourplan.dcm::BeamSequence[0].BeamNumber
outfile Filename to write python code to. If not specified, code is written to
stdout
optional arguments:
-h, --help show this help message and exit
-e EXCLUDE_SIZE, --exclude-size EXCLUDE_SIZE
Exclude binary data larger than specified (bytes). Default is 100 bytes
-p, --include-private
Include private data elements (default is to exclude them)
-s SAVE_AS, --save-as SAVE_AS
Specify the filename for ds.save_as(save_filename); otherwise the input name
+ '_from_codify' will be used
Binary data (e.g. pixels) larger than --exclude-size (default 100 bytes) is not included. A dummy
line with a syntax error is produced. Private data elements are not included by default.
For example:
pydicom codify -s savename.dcm dicomfile.dcm pythoncode.py
would read the DICOM file “dicomfile.dcm” and write the Python code
to file “pythoncode.py”. In that code, near the end of the file
would be a ds.save_as("savename.dcm", ...)
line.
Note
By default, any private data elements within the file are not translated
to code. If you want to include them, use the -p
parameter.
Codifying a part of a DICOM file¶
Note that the filespec
argument to the codify
command, as for
the show command, allows you to specify a data element within the file,
rather than the whole file:
pydicom codify pydicom::rtplan.dcm::FractionGroupSequence[0]
# Coded version of non-file dataset
...
# Main data elements
ds = Dataset()
ds.FractionGroupNumber = "1"
ds.NumberOfFractionsPlanned = "30"
ds.NumberOfBeams = "1"
ds.NumberOfBrachyApplicationSetups = "0"
# Referenced Beam Sequence
refd_beam_sequence = Sequence()
ds.ReferencedBeamSequence = refd_beam_sequence
# Referenced Beam Sequence: Referenced Beam 1
refd_beam1 = Dataset()
refd_beam1.BeamDoseSpecificationPoint = [239.531250000000, 239.531250000000, -751.87000000000]
...
Currently, only a data element which is a Dataset
(an item within a Sequence
) is accepted.
The resulting code would not on its own produce a correct DICOM file,
but could be useful as a model when creating
more complete code. For example, issuing code for one item in a
Sequence
could be the starting point towards a loop
producing a number of sequence items.