:orphan: .. _ahelp_dicom_hinfo: *********** dicom_hinfo *********** .. contents:: :local: | Usage: dicom_hinfo [options] fname [...] ======================================== .. code-block:: none Prints selected information from the DICOM file 'fname' to stdout. Multiple files can be given on the command line; see the examples below for useful ideas. OPTIONS: ++++++++ .. code-block:: none -tag aaaa,bbbb = print the specified tag. -- multiple tags may follow the '-tag' option. -- a tag consists of 4 hexadecimal digits, followed by a comma, followed by 4 more hexadecimal digits -- any string that doesn't match this format will end the list of tags -namelast = Put the filename last on each output line, *OR* -last instead of first. -no_name = Omit any filename output. -full_entry = Output the full entry if it is more than one word or contains white space. If the entry is REALLY long, this may be truncated. -sepstr STR = use STR to separate fields, rather than space .. code-block:: none * The purpose of this program is to be used in scripts to figure out which DICOM files to process for various purposes -- see Example #2. * One line is output (to stdout) for each DICOM file that the program reads. * Files that can't be read as DICOM will be ignored (silently). * Tags that aren't found in a file will get their value printed as 'null'. * How do you know what hexadecimal tags you need? You can start with using dicom_hdr on a single file to get the full list of tags (with names) and then experiment to see which tags can be used to meet your whims. * Some tags that might be useful for figuring out which DICOM files belong together and which ones are from separate acquisitions: 0008,0030 = Study Time (might be the same for all images in one session) 0008,0031 = Series Time (will usually be different between imaging runs) 0008,0032 = Acquisition Time (might be different for EVERY file) 0018,0050 = Slice Thickness 0020,0011 = Series Number (if present, identifies different imaging runs) 0028,0010 = Number of Rows 0028,0011 = Number of Columns 0028,0030 = Pixel Spacing In the examples below, I use 0008,0031 as a way to distinguish between different acquisitions in the same imaging session. For the data used here, the value of this tag was different for each distinct scan -- localizers, structural, EPI -- so it worked as good way to find the break points between set of files that should go together. However, I have seen DICOM files that lacked this tag, so you might have to experiment (using dicom_hdr) to find a good tag for this purpose. EXAMPLES: ========= .. code-block:: none #1: The command below prints out the acquisition start time and the number of rows for each valid DICOM file in the directories below the current one: dicom_hinfo -tag 0008,0031 0028,0010 */*.dcm One sample output line would be TASK-A/image-00102-004243.dcm 141255.882508 256 #2: A more complicated example searches all the directories below the current one, then prints out a list of summaries of what look like unique acquisitions. This could be used to figure out what kind of data you have when someone gives you a bunch of DICOM files with no obvious structure to their filenames. find . -type f | xargs dicom_hinfo -tag 0008,0031 0028,0010 | uniq -f 1 -c The output from the above example was 9 ./A/A/A/Z01 154116 256 9 ./A/A/A/Z10 154210 256 38 ./A/A/A/Z19 154245 64 126 ./A/A/C/Z05 154326 256 6000 ./A/A/H/Z01 154854 64 2400 ./A/J/D/Z21 155617 64 126 ./A/M/S/Z03 160228 256 40 ./A/M/W/Z25 160304 64 40 ./A/M/Y/Z13 160332 64 126 ./A/N/A/Z01 160404 256 126 ./A/N/E/Z23 160411 256 126 ./A/N/J/Z19 160417 256 1 ./A/N/O/Z15 161252 960 1 ./A/N/O/Z16 161403 640 9 ./A/N/O/Z17 150935 256 9 ./A/N/P/Z00 151039 256 37 ./A/N/P/Z10 151122 64 120 ./A/N/Q/Z21 151203 256 6000 ./A/N/V/Z11 151624 64 2400 ./A/W/S/Z05 153010 64 My goal was the find the structural and FMRI collections of images mixed in with various localizers and other 'junk'. Based on the above, it seems: * the 126 files starting with ./A/A/C/Z05 are a structural set * the 6000 files starting with ./A/A/H/Z01 are an FMRI set * the 2400 files starting with ./A/J/D/Z21 are an FMRI set * the 126 files starting with ./A/M/S/Z03 are a structural set and so on. This information makes it possible to extract the desired files from the giant collection of un-informative filenames, create AFNI datasets (using program Dimon and its '-infile_list' option appropriately), and then look at them to make final decisions about what to keep. #3: Continuing the above example with actual creation of AFNI dataset from the collection of files, a script (in csh syntax): #!/bin/tcsh \rm -f qq*.out find . -type f \ | xargs dicom_hinfo -tag 0008,0031 0028,0010 0028,0011 \ | awk '$3 == $4' >> qqa.out uniq -f 1 -c qqa.out | awk '$1 > 99' > qqb.out foreach ddd ( `cat qqb.out | awk '{print $3}'` ) echo 'Organizing files with time stamp $ddd' grep $ddd qqa.out | awk '{print $1}' > qqc_${ddd}.out Dimon -infile_list qqc_${ddd}.out -dicom_org -GERT_Reco \ -gert_create_dataset -gert_to3d_prefix ACQT_${ddd} -quit end As before, the find command gets all the DICOM files under the current In this case, the awk command also filters out images that are not square. The output of 'find' is piped into xargs to prevent creating a gigantic command line, since there are over 17,000 files in this directory tree. The uniq command finds files with unique time stamps, and the awk command filters out those lines that don't have more than 99 such files. The foreach loop over variable ddd (the time stamp) creates a file list that matches the given value, then runs Dimon to create an AFNI dataset. [Not all of these datasets are actually useful, but it is easy to] [delete the ones that are not relevant to the research underway. ] Note the use of the '-dicom_org' option to Dimon to have it organize the files to be in the correct order -- otherwise, it would take the files in their filename alphabetical order, which is not always right. This ordering is done using various DICOM fields, including 0054,1330 = Image Index 0020,0013 = Instance Number This example solved a real problem with image files dumped from a PACS. You might have to change things around to solve your problem, but I hope that this sample script will give you an idea of how to start. --- RWCox - 15 Nov 2011 ---