Package com.pixelmed.dicom

# Class MoveDicomFilesIntoHierarchy

java.lang.Object
com.pixelmed.dicom.MoveDicomFilesIntoHierarchy

Direct Known Subclasses:
  `TestHierarchicalFileName.InstanceNumberMoveDicomFilesIntoHierarchy`

public class MoveDicomFilesIntoHierarchy extends Object

This class provides a main method that recursively searches the supplied paths for DICOM files and moves them into a folder hierarchy based on their attributes.

Various static utility methods that assist in this operation are also provided, such as to create the hierarchical path name from the attributes, etc., since these may be useful in their own right.

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`class`
`MoveDicomFilesIntoHierarchy.FolderNamingStrategy`
`protected static class`
`MoveDicomFilesIntoHierarchy.OurReadTerminationStrategy`

## Field Summary

Fields
Modifier and Type
Field
Description
`protected static String`
`defaultDuplicatesFolderNamePrefix`
`protected static String`
`defaultHierarchicalFolderName`
`protected static int`
`folderNamingStrategyToUseIfUnspecified`
`protected boolean`
`includeDateTimeInSeriesFolderName`
`protected boolean`
`includeInConcatenationNumberWithInstanceNumber`
`protected static final AttributeList.ReadTerminationStrategy`
`terminateAfterRelationshipGroup`

## Constructor Summary

Constructors
Constructor
Description
`MoveDicomFilesIntoHierarchy()`

## Method Summary

Modifier and Type
Method
Description
`static void`
`main(String[] arg)`
Recursively search the supplied paths for DICOM files and move them into a folder hierarchy based on their attributes.
`static String`
`makeHierarchicalPathFromAttributes(AttributeList list)`
Create a folder structure based on the DICOM attributes of the form:
`String`
`makeHierarchicalPathFromAttributes(AttributeList list, int folderNamingStrategy)`
Create a folder structure based on the DICOM attributes of the form:
`String`
`makeInstanceLabelFromAttributes(AttributeList list, int folderNamingStrategy)`
Create an instance label based on the DICOM attributes of the form:
`String`
`makePatientLabelFromAttributes(AttributeList list, int folderNamingStrategy)`
Create a patient label based on the DICOM attributes of the form:
`String`
`makeSeriesLabelFromAttributes(AttributeList list, int folderNamingStrategy)`
Create a series label based on the DICOM attributes of the form:
`String`
`makeStudyLabelFromAttributes(AttributeList list, int folderNamingStrategy)`
Create a study label based on the DICOM attributes of the form:
`protected static void`
`processFilesRecursively(File file, String suffix)`
`static String`
`renameFileWithHierarchicalPathFromAttributes(File file)`
Rename a DICOM file into a folder hierarchy based on its attributes.
`static String`
`renameFileWithHierarchicalPathFromAttributes(File file, AttributeList list, String hierarchicalFolderName, String duplicatesFolderNamePrefix)`
Rename a DICOM file into a folder hierarchy based on its attributes that are already available.
`String`
`renameFileWithHierarchicalPathFromAttributes(File file, AttributeList list, String hierarchicalFolderName, String duplicatesFolderNamePrefix, int folderNamingStrategy)`
Rename a DICOM file into a folder hierarchy based on its attributes that are already available.
`static String`
`renameFileWithHierarchicalPathFromAttributes(File file, String hierarchicalFolderName, String duplicatesFolderNamePrefix)`
Rename a DICOM file into a folder hierarchy based on its attributes.
`static String`
`renameFileWithHierarchicalPathFromAttributes(String fileName)`
Rename a DICOM file into a folder hierarchy based on its attributes.

### Methods inherited from class java.lang.Object

`clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### defaultHierarchicalFolderName

protected static String defaultHierarchicalFolderName

### defaultDuplicatesFolderNamePrefix

protected static String defaultDuplicatesFolderNamePrefix

### folderNamingStrategyToUseIfUnspecified

protected static int folderNamingStrategyToUseIfUnspecified

### includeDateTimeInSeriesFolderName

protected boolean includeDateTimeInSeriesFolderName

### includeInConcatenationNumberWithInstanceNumber

protected boolean includeInConcatenationNumberWithInstanceNumber

### terminateAfterRelationshipGroup

protected static final AttributeList.ReadTerminationStrategy terminateAfterRelationshipGroup

## Constructor Details

### MoveDicomFilesIntoHierarchy

public MoveDicomFilesIntoHierarchy()

## Method Details

### processFilesRecursively

protected static void processFilesRecursively(File file, String suffix) throws SecurityException, IOException, DicomException, NoSuchAlgorithmException

Throws:
  `SecurityException`
  `IOException`
  `DicomException`
  `NoSuchAlgorithmException`

### makePatientLabelFromAttributes

public String makePatientLabelFromAttributes(AttributeList list, int folderNamingStrategy)

Create a patient label based on the DICOM attributes of the form:

    PatientName [PatientID]

If missing values defaults to

    NONAME [NOID]

Non-static so that sub-classes can override it.

Parameters:
  `list` - list of attributes
  `folderNamingStrategy` -
Returns:
  the patient label

### makeStudyLabelFromAttributes

public String makeStudyLabelFromAttributes(AttributeList list, int folderNamingStrategy)

Create a study label based on the DICOM attributes of the form:

    StudyDate StudyTime [StudyID - StudyDescription]

Non-static so that sub-classes can override it.

Parameters:
  `list` - list of attributes
  `folderNamingStrategy` -
Returns:
  the study label

### makeSeriesLabelFromAttributes

public String makeSeriesLabelFromAttributes(AttributeList list, int folderNamingStrategy)

Create a series label based on the DICOM attributes of the form:

    Series SeriesNumber [Modality - SeriesDescription]

Non-static so that sub-classes can override it.

Parameters:
  `list` - list of attributes
  `folderNamingStrategy` -
Returns:
  the series label

### makeInstanceLabelFromAttributes

public String makeInstanceLabelFromAttributes(AttributeList list, int folderNamingStrategy)

Create an instance label based on the DICOM attributes of the form:

If no information to create an instance label (the SOPInstanceUID is missing), an empty String is returned.

    SOPInstanceUID.dcm

Non-static so that sub-classes can override it.

Parameters:
  `list` - list of attributes
  `folderNamingStrategy` -
Returns:
  the instance label or an empty string

### makeHierarchicalPathFromAttributes

public String makeHierarchicalPathFromAttributes(AttributeList list, int folderNamingStrategy)

Create a folder structure based on the DICOM attributes of the form:

    PatientName [PatientID]/StudyDate StudyTime [StudyID - StudyDescription]/Series SeriesNumber [Modality - SeriesDescription]/xxx.dcm

SeriesNumber is zero padded to three digits to better sort in browser.

The form of the instance level name is controlled by the folderNamingStrategy parameter.

If no information to create an instance label (the SOPInstanceUID is missing), an empty String is returned.

Non-static so that sub-classes can override it and callers can call this method rather than static version that will not use overridden subclasses.

Parameters:
  `list` - list of attributes
  `folderNamingStrategy` -
Returns:
  the folder structure as a path

### makeHierarchicalPathFromAttributes

public static String makeHierarchicalPathFromAttributes(AttributeList list)

Create a folder structure based on the DICOM attributes of the form:

    PatientName [PatientID]/StudyDate StudyTime [StudyID - StudyDescription]/Series SeriesNumber [Modality - SeriesDescription]/SOPInstanceUID.dcm

SeriesNumber is zero padded to three digits to better sort in browser.

If no information to create an instance label (the SOPInstanceUID is missing), an empty String is returned.

Static so will NOT use overridden label methods in sub-classes - use non-static `makeHierarchicalPathFromAttributes()` if necessary instead.

Parameters:
  `list` - list of attributes
Returns:
  the folder structure as a path

### renameFileWithHierarchicalPathFromAttributes

public String renameFileWithHierarchicalPathFromAttributes(File file, AttributeList list, String hierarchicalFolderName, String duplicatesFolderNamePrefix, int folderNamingStrategy) throws IOException, DicomException, NoSuchAlgorithmException

Rename a DICOM file into a folder hierarchy based on its attributes that are already available.

Creates a folder structure in the current working directory of the form:

    hierarchicalFolderName/PatientName [PatientID]/StudyDate StudyTime [StudyID - StudyDescription]/Series SeriesNumber [Modality - Series Description]/SOPInstanceUID.dcm

The form of the instance level name is controlled by the folderNamingStrategy parameter.

If the destination file already exists and is identical in content, the original is removed.

If the destination file already exists and is different in content, it is not overwritten, and the duplicate is moved into a separate duplicatesFolderNamePrefix_n folder.

Non-static so that sub-classes can override it and callers can call this method rather than static version that will not use overridden subclasses.

Parameters:
  `file` - the DICOM file
  `list` - the attributes of the file (already read in)
  `hierarchicalFolderName` - where to store the renamed file
  `duplicatesFolderNamePrefix` - where to store the renamed file if it is a non-identical duplicate of the existing file
  `folderNamingStrategy` -
Returns:
  the path to the new file if successful, null if not
Throws:
  `IOException` - if an error occurs renaming the files
  `DicomException` - if there is an error parsing the attribute list
  `NoSuchAlgorithmException` - if there is an error checking duplicate files contain identical content caused by absence of a hash algorithm

### renameFileWithHierarchicalPathFromAttributes

public static String renameFileWithHierarchicalPathFromAttributes(File file, AttributeList list, String hierarchicalFolderName, String duplicatesFolderNamePrefix) throws IOException, DicomException, NoSuchAlgorithmException

Rename a DICOM file into a folder hierarchy based on its attributes that are already available.

Creates a folder structure in the current working directory of the form:

    hierarchicalFolderName/PatientName [PatientID]/StudyDate StudyTime [StudyID - StudyDescription]/Series SeriesNumber [Modality - Series Description]/SOPInstanceUID.dcm

If the destination file already exists and is identical in content, the original is removed.

If the destination file already exists and is different in content, it is not overwritten, and the duplicate is moved into a separate duplicatesFolderNamePrefix_n folder.

Static so will NOT use overridden label methods in sub-classes - use non-static `renameFileWithHierarchicalPathFromAttributes()` if necessary instead.

Parameters:
  `file` - the DICOM file
  `list` - the attributes of the file (already read in)
  `hierarchicalFolderName` - where to store the renamed file
  `duplicatesFolderNamePrefix` - where to store the renamed file if it is a non-identical duplicate of the existing file
Returns:
  the path to the new file if successful, null if not
Throws:
  `IOException` - if an error occurs renaming the files
  `DicomException` - if there is an error parsing the attribute list
  `NoSuchAlgorithmException` - if there is an error checking duplicate files contain identical content caused by absence of a hash algorithm

### renameFileWithHierarchicalPathFromAttributes

public static String renameFileWithHierarchicalPathFromAttributes(File file, String hierarchicalFolderName, String duplicatesFolderNamePrefix) throws IOException, DicomException, NoSuchAlgorithmException

Rename a DICOM file into a folder hierarchy based on its attributes.

Creates a folder structure in the current working directory of the form:

    hierarchicalFolderName/PatientName [PatientID]/StudyDate StudyTime [StudyID - StudyDescription]/Series SeriesNumber [Modality - Series Description]/SOPInstanceUID.dcm

If the destination file already exists and is identical in content, the original is removed.

If the destination file already exists and is different in content, it is not overwritten, and the duplicate is moved into a separate duplicatesFolderNamePrefix_n folder.

Parameters:
  `file` - the DICOM file
  `hierarchicalFolderName` - where to store the renamed file
  `duplicatesFolderNamePrefix` - where to store the renamed file if it is a non-identical duplicate of the existing file
Returns:
  the path to the new file if successful, null if not (e.g., if not a DICOM file)
Throws:
  `IOException` - if an error occurs renaming the files
  `DicomException` - if there is an error parsing the attribute list
  `NoSuchAlgorithmException` - if there is an error checking duplicate files contain identical content caused by absence of a hash algorithm

### renameFileWithHierarchicalPathFromAttributes

public static String renameFileWithHierarchicalPathFromAttributes(File file) throws IOException, DicomException, NoSuchAlgorithmException

Rename a DICOM file into a folder hierarchy based on its attributes.

Creates a folder structure in the current working directory of the form:

    Sorted/PatientName [PatientID]/StudyDate StudyTime [StudyID - StudyDescription]/Series SeriesNumber [Modality - Series Description]/SOPInstanceUID.dcm

If the destination file already exists and is identical in content, the original is removed.

If the destination file already exists and is different in content, it is not overwritten, and the duplicate is moved into a separate Duplicates_n folder.

Parameters:
  `file` - the DICOM file
Returns:
  the path to the new file if successful, null if not (e.g., if not a DICOM file)
Throws:
  `IOException` - if an error occurs renaming the files
  `DicomException` - if there is an error parsing the attribute list
  `NoSuchAlgorithmException` - if there is an error checking duplicate files contain identical content caused by absence of a hash algorithm

### renameFileWithHierarchicalPathFromAttributes

public static String renameFileWithHierarchicalPathFromAttributes(String fileName) throws IOException, DicomException, NoSuchAlgorithmException

Rename a DICOM file into a folder hierarchy based on its attributes.

Creates a folder structure in the current working directory of the form:

    Sorted/PatientName [PatientID]/StudyDate StudyTime [StudyID - StudyDescription]/Series SeriesNumber [Modality - Series Description]/SOPInstanceUID.dcm

If the destination file already exists and is identical in content, the original is removed.

If the destination file already exists and is different in content, it is not overwritten, and the duplicate is moved into a separate Duplicates_n folder.

Parameters:
  `fileName` - the DICOM file
Returns:
  the path to the new file if successful, null if not (e.g., if not a DICOM file)
Throws:
  `IOException` - if an error occurs renaming the files
  `DicomException` - if there is an error parsing the attribute list
  `NoSuchAlgorithmException` - if there is an error checking duplicate files contain identical content caused by absence of a hash algorithm

### main

public static void main(String[] arg)

Recursively search the supplied paths for DICOM files and move them into a folder hierarchy based on their attributes.

Creates a folder structure in the current working directory of the form:

    Sorted/PatientName [PatientID]/StudyDate StudyTime [StudyID - StudyDescription]/Series SeriesNumber [Modality - Series Description]/SOPInstanceUID.dcm

If the destination file already exists and is identical in content, the original is removed.

If the destination file already exists and is different in content, it is not overwritten, and the duplicate is moved into a separate Duplicates_n folder.

Parameters:
  `arg` - array of one or more file or directory names