Package com.pixelmed.dicom

## Class ClinicalTrialsAttributes

- java.lang.Object
- - com.pixelmed.dicom.ClinicalTrialsAttributes

-     public abstract class ClinicalTrialsAttributes
      extends java.lang.Object

  An abstract class of static methods to support removing identifying attributes and adding Clinical Trials Patient, Study and Series Modules attributes.

  UID attributes are handled specially, in that they may be kept, removed or remapped. Remapping means that any UID that is not standard (e.g., not a SOP Class, etc.) will be replaced consistently with another generated UID, such that when that UID is encountered again, the same replacement value will be used. The replacement mapping persists within the invocation of the JVM until it is explciitly flushed. A different JVM invocation will replace the UIDs with different values. Therefore, multiple instances that need to be remapped consistently must be cleaned within the same invocation.

  Note that this map could grow quite large and consumes resources in memory, and hence in a server application should be flushed at appropriate intervals using the appropriate method.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class | Description
    --- | --- | ---
    `class` | `ClinicalTrialsAttributes.HandleDates` |
    `class` | `ClinicalTrialsAttributes.HandleUIDs` |

  - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `protected static java.lang.String` | `defaultValueForMissingNonZeroLengthStrings` |
    `protected static java.lang.String` | `defaultValueForMissingPossiblyZeroLengthStrings` |
    `protected static java.util.Map` | `mapOfOriginalToReplacementUIDs` |
    `protected static UIDGenerator` | `uidGenerator` |

  - ### Method Summary

    All Methods Static Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `static void` | `addAgeDerivedFromBirthDateAndStudyRelatedDate​(AttributeList list)` | Add the Patient's Age derived from the Patient's Birth Date and study-related date.

    `static void`

    `addClinicalTrialsAttributes​(AttributeList list, boolean replaceConventionalAttributes, java.lang.String clinicalTrialSponsorName, java.lang.String clinicalTrialProtocolID, java.lang.String clinicalTrialProtocolName, java.lang.String clinicalTrialSiteID, java.lang.String clinicalTrialSiteName, java.lang.String clinicalTrialSubjectID, java.lang.String clinicalTrialSubjectReadingID, java.lang.String clinicalTrialTimePointID, java.lang.String clinicalTrialTimePointDescription, java.lang.String clinicalTrialCoordinatingCenterName)`

    Add the attributes of the Clinical Trials Patient, Study and Series Modules, to a list of attributes.

    `static void`

    `addContributingEquipmentSequence​(AttributeList list, boolean retainExistingItems, CodedSequenceItem purposeOfReferenceCodeSequence, java.lang.String manufacturer, java.lang.String institutionName, java.lang.String institutionalDepartmentName, java.lang.String institutionAddress, java.lang.String stationName, java.lang.String manufacturerModelName, java.lang.String deviceSerialNumber, java.lang.String softwareVersion, java.lang.String contributionDescription)`

    Add the attributes of the Contributing Equipment Sequence to a list of attributes.

    `static void`

    `addContributingEquipmentSequence​(AttributeList list, boolean retainExistingItems, CodedSequenceItem purposeOfReferenceCodeSequence, java.lang.String manufacturer, java.lang.String institutionName, java.lang.String institutionalDepartmentName, java.lang.String institutionAddress, java.lang.String stationName, java.lang.String manufacturerModelName, java.lang.String deviceSerialNumber, java.lang.String softwareVersion, java.lang.String contributionDescription, java.lang.String contributionDateTime)`

    Add the attributes of the Contributing Equipment Sequence to a list of attributes.

    `static void`

    `addContributingEquipmentSequence​(AttributeList list, boolean retainExistingItems, CodedSequenceItem purposeOfReferenceCodeSequence, java.lang.String manufacturer, java.lang.String institutionName, java.lang.String institutionalDepartmentName, java.lang.String institutionAddress, java.lang.String stationName, java.lang.String manufacturerModelName, java.lang.String deviceSerialNumber, java.lang.String softwareVersion, java.lang.String contributionDescription, java.lang.String contributionDateTime, java.lang.String[] operatorNames, PersonIdentification[] operatorIdentifications)`

    Add the attributes of the Contributing Equipment Sequence to a list of attributes.

    `static void`

    `addContributingEquipmentSequence​(AttributeList list, java.lang.String manufacturer, java.lang.String institutionName, java.lang.String institutionalDepartmentName, java.lang.String institutionAddress, java.lang.String stationName, java.lang.String manufacturerModelName, java.lang.String deviceSerialNumber, java.lang.String softwareVersion)`

    Add the attributes of the Contributing Equipment Sequence to a list of attributes.

    `protected static void` | `addType1LongStringAttribute​(AttributeList list, AttributeTag t, java.lang.String value, SpecificCharacterSet specificCharacterSet)` |
    `protected static void` | `addType2LongStringAttribute​(AttributeList list, AttributeTag t, java.lang.String value, SpecificCharacterSet specificCharacterSet)` |
    `protected static void` | `addType3DateTimeAttribute​(AttributeList list, AttributeTag t, java.lang.String value)` |
    `protected static void` | `addType3LongStringAttribute​(AttributeList list, AttributeTag t, java.lang.String value, SpecificCharacterSet specificCharacterSet)` |
    `protected static void` | `addType3ShortStringAttribute​(AttributeList list, AttributeTag t, java.lang.String value, SpecificCharacterSet specificCharacterSet)` |
    `protected static void` | `addType3ShortTextAttribute​(AttributeList list, AttributeTag t, java.lang.String value, SpecificCharacterSet specificCharacterSet)` |
    `static java.util.Date` | `findEarliestDateTime​(AttributeList list)` | Get the earliest patient event related date and time.
    `protected static java.util.Date` | `findEarliestDateTime​(AttributeList list, java.util.Date earliestSoFar, java.lang.String dateToUseForUnaccompaniedTimes)` | Get the earliest patient event related date and time.
    `static void` | `flushMapOfUIDs()` | Flush (remove all entries in) the map of original UIDs to replacement UIDs.
    `protected static java.util.Date` | `getDateOffsetByEarliestMovedToEpoch​(java.util.Date existingDate, java.util.Date epochForDateModification, java.util.Date earliest)` |
    `protected static java.lang.String` | `getDateToUseForUnaccompaniedTimes​(AttributeList list)` | Get the date to use for time attributes that don't have a date sibling and which may be nested in sequences.
    `protected static AttributeTag` | `getTagOfTimeAttributeCorrespondingToDateAttribute​(AttributeTag dateTag)` |
    `static boolean` | `isSafePrivateAttribute​(AttributeTag tag, AttributeList list)` | Is a private tag safe.
    `static boolean` | `isSafePrivateAttribute​(java.lang.String creator, AttributeTag tag)` | Is a private tag safe.
    `static boolean` | `isSafePrivateSequenceAttribute​(java.lang.String creator, AttributeTag tag)` | Is a private tag a safe sequence VR that needs to be read as SQ if UN.
    `protected static boolean` | `isValidCandidateForEarliestDateTime​(java.util.Date candidate)` |
    `static void` | `main​(java.lang.String[] arg)` | For testing.
    `static void` | `remapUIDAttributes​(AttributeList list)` | Remap UID attributes in a list of attributes, recursively iterating through nested sequences.
    `static void` | `removeClinicalTrialsAttributes​(AttributeList list)` | Remove the attributes of the Clinical Trials Patient, Study and Series Modules, from a list of attributes.
    `static void` | `removeOrNullIdentifyingAttributes​(AttributeList list, boolean keepUIDs, boolean keepDescriptors)` | Deidentify a list of attributes.
    `static void` | `removeOrNullIdentifyingAttributes​(AttributeList list, boolean keepUIDs, boolean keepDescriptors, boolean keepPatientCharacteristics)` | Deidentify a list of attributes.
    `static void` | `removeOrNullIdentifyingAttributes​(AttributeList list, int handleUIDs, boolean keepDescriptors, boolean keepPatientCharacteristics)` | Deidentify a list of attributes.
    `static void` | `removeOrNullIdentifyingAttributes​(AttributeList list, int handleUIDs, boolean keepDescriptors, boolean keepSeriesDescriptors, boolean keepPatientCharacteristics, boolean keepDeviceIdentity, boolean keepInstitutionIdentity)` | Deidentify a list of attributes.
    `static void` | `removeOrNullIdentifyingAttributes​(AttributeList list, int handleUIDs, boolean keepDescriptors, boolean keepSeriesDescriptors, boolean keepProtocolName, boolean keepPatientCharacteristics, boolean keepDeviceIdentity, boolean keepInstitutionIdentity, int handleDates, java.util.Date epochForDateModification, java.util.Date earliestDateInSet)` | Deidentify a list of attributes.
    `static void` | `removeOrNullIdentifyingAttributes​(AttributeList list, int handleUIDs, boolean keepDescriptors, boolean keepSeriesDescriptors, boolean keepPatientCharacteristics, boolean keepDeviceIdentity, boolean keepInstitutionIdentity, int handleDates, java.util.Date epochForDateModification, java.util.Date earliestDateInSet)` | Deidentify a list of attributes.
    `protected static void` | `removeOrNullIdentifyingAttributesRecursively​(AttributeList list, int handleUIDs, boolean keepDescriptors, boolean keepSeriesDescriptors, boolean keepProtocolName, boolean keepPatientCharacteristics, boolean keepDeviceIdentity, boolean keepInstitutionIdentity)` | Deidentify a list of attributes, recursively iterating through nested sequences.
    `protected static void` | `removeOrRemapDateAndTimeAttributes​(AttributeList list, int handleDates, java.util.Date epochForDateModification, java.util.Date earliest, java.lang.String dateToUseForUnaccompaniedTimes)` | Remove or remap Date, Time and DateTime attributes (other than Patient Birth) in a list of attributes, recursively iterating through nested sequences.
    `protected static void` | `removeOrRemapUIDAttributes​(AttributeList list, int handleUIDs)` | Remove or remap UID attributes in a list of attributes, recursively iterating through nested sequences.
    `static void` | `removeUIDAttributes​(AttributeList list)` | Remove UID attributes in a list of attributes, recursively iterating through nested sequences.

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

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

- - ### Field Detail

    - #### defaultValueForMissingNonZeroLengthStrings

          protected static final java.lang.String defaultValueForMissingNonZeroLengthStrings

      See Also:
        Constant Field Values

    - #### defaultValueForMissingPossiblyZeroLengthStrings

          protected static final java.lang.String defaultValueForMissingPossiblyZeroLengthStrings

      See Also:
        Constant Field Values

    - #### mapOfOriginalToReplacementUIDs

          protected static java.util.Map mapOfOriginalToReplacementUIDs

    - #### uidGenerator

          protected static UIDGenerator uidGenerator

  - ### Method Detail

    - #### addType1LongStringAttribute

          protected static void addType1LongStringAttribute​(AttributeList list,
                                                            AttributeTag t,
                                                            java.lang.String value,
                                                            SpecificCharacterSet specificCharacterSet)
                                                     throws DicomException

      Throws:
        `DicomException`

    - #### addType2LongStringAttribute

          protected static void addType2LongStringAttribute​(AttributeList list,
                                                            AttributeTag t,
                                                            java.lang.String value,
                                                            SpecificCharacterSet specificCharacterSet)
                                                     throws DicomException

      Throws:
        `DicomException`

    - #### addType3ShortTextAttribute

          protected static void addType3ShortTextAttribute​(AttributeList list,
                                                           AttributeTag t,
                                                           java.lang.String value,
                                                           SpecificCharacterSet specificCharacterSet)
                                                    throws DicomException

      Throws:
        `DicomException`

    - #### addType3ShortStringAttribute

          protected static void addType3ShortStringAttribute​(AttributeList list,
                                                             AttributeTag t,
                                                             java.lang.String value,
                                                             SpecificCharacterSet specificCharacterSet)
                                                      throws DicomException

      Throws:
        `DicomException`

    - #### addType3LongStringAttribute

          protected static void addType3LongStringAttribute​(AttributeList list,
                                                            AttributeTag t,
                                                            java.lang.String value,
                                                            SpecificCharacterSet specificCharacterSet)
                                                     throws DicomException

      Throws:
        `DicomException`

    - #### addType3DateTimeAttribute

          protected static void addType3DateTimeAttribute​(AttributeList list,
                                                          AttributeTag t,
                                                          java.lang.String value)
                                                   throws DicomException

      Throws:
        `DicomException`

    - #### addAgeDerivedFromBirthDateAndStudyRelatedDate

          public static void addAgeDerivedFromBirthDateAndStudyRelatedDate​(AttributeList list)

      Add the Patient's Age derived from the Patient's Birth Date and study-related date.

      Does nothing if no value for Patient's Birth Date.

      Uses the Study, Series, Acquisition or Content Date in that order if present, else does nothing.

      Parameters:
        `list` - the list of attributes in which to find the dob and date and to which to add the age

    - #### addContributingEquipmentSequence

          public static void addContributingEquipmentSequence​(AttributeList list,
                                                              java.lang.String manufacturer,
                                                              java.lang.String institutionName,
                                                              java.lang.String institutionalDepartmentName,
                                                              java.lang.String institutionAddress,
                                                              java.lang.String stationName,
                                                              java.lang.String manufacturerModelName,
                                                              java.lang.String deviceSerialNumber,
                                                              java.lang.String softwareVersion)
                                                       throws DicomException

      Add the attributes of the Contributing Equipment Sequence to a list of attributes.

      Attributes are added if supplied string value are added if not null. May be zero length.

      Retains any existing items in Contributing Equipment Sequence.

      Uses `("109104","DCM","De-identifying Equipment")` for the Purpose of Reference.

      Uses `"Deidentified"` for the Contribution Description.

      Uses the current date and time for the Contribution DateTime.

      Parameters:
        `list` - the list of attributes to which to add the Contributing Equipment Sequence
        `manufacturer` - the manufacturer
        `institutionName` - the institution name
        `institutionalDepartmentName` - the institution department name
        `institutionAddress` - the institution address
        `stationName` - the station name
        `manufacturerModelName` - the manufacturer model name
        `deviceSerialNumber` - the device serial number
        `softwareVersion` - the software version
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### addContributingEquipmentSequence

          public static void addContributingEquipmentSequence​(AttributeList list,
                                                              boolean retainExistingItems,
                                                              CodedSequenceItem purposeOfReferenceCodeSequence,
                                                              java.lang.String manufacturer,
                                                              java.lang.String institutionName,
                                                              java.lang.String institutionalDepartmentName,
                                                              java.lang.String institutionAddress,
                                                              java.lang.String stationName,
                                                              java.lang.String manufacturerModelName,
                                                              java.lang.String deviceSerialNumber,
                                                              java.lang.String softwareVersion,
                                                              java.lang.String contributionDescription)
                                                       throws DicomException

      Add the attributes of the Contributing Equipment Sequence to a list of attributes.

      Attributes are added if supplied string value are added if not null. May be zero length.

      Parameters:
        `list` - the list of attributes to which to add the Contributing Equipment Sequence
        `retainExistingItems` - if true, retain any existing items in Contributing Equipment Sequence, otherwise remove them
        `purposeOfReferenceCodeSequence` - the purpose of reference
        `manufacturer` - the manufacturer
        `institutionName` - the institution name
        `institutionalDepartmentName` - the institution department name
        `institutionAddress` - the institution address
        `stationName` - the station name
        `manufacturerModelName` - the manufacturer model name
        `deviceSerialNumber` - the device serial number
        `softwareVersion` - the software version
        `contributionDescription` - the contribution description
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### addContributingEquipmentSequence

          public static void addContributingEquipmentSequence​(AttributeList list,
                                                              boolean retainExistingItems,
                                                              CodedSequenceItem purposeOfReferenceCodeSequence,
                                                              java.lang.String manufacturer,
                                                              java.lang.String institutionName,
                                                              java.lang.String institutionalDepartmentName,
                                                              java.lang.String institutionAddress,
                                                              java.lang.String stationName,
                                                              java.lang.String manufacturerModelName,
                                                              java.lang.String deviceSerialNumber,
                                                              java.lang.String softwareVersion,
                                                              java.lang.String contributionDescription,
                                                              java.lang.String contributionDateTime)
                                                       throws DicomException

      Add the attributes of the Contributing Equipment Sequence to a list of attributes.

      Attributes are added if supplied string value are added if not null. May be zero length.

      Parameters:
        `list` - the list of attributes to which to add the Contributing Equipment Sequence
        `retainExistingItems` - if true, retain any existing items in Contributing Equipment Sequence, otherwise remove them
        `purposeOfReferenceCodeSequence` - the purpose of reference
        `manufacturer` - the manufacturer
        `institutionName` - the institution name
        `institutionalDepartmentName` - the institution department name
        `institutionAddress` - the institution address
        `stationName` - the station name
        `manufacturerModelName` - the manufacturer model name
        `deviceSerialNumber` - the device serial number
        `softwareVersion` - the software version
        `contributionDescription` - the contribution description
        `contributionDateTime` - the contribution datetime
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### addContributingEquipmentSequence

          public static void addContributingEquipmentSequence​(AttributeList list,
                                                              boolean retainExistingItems,
                                                              CodedSequenceItem purposeOfReferenceCodeSequence,
                                                              java.lang.String manufacturer,
                                                              java.lang.String institutionName,
                                                              java.lang.String institutionalDepartmentName,
                                                              java.lang.String institutionAddress,
                                                              java.lang.String stationName,
                                                              java.lang.String manufacturerModelName,
                                                              java.lang.String deviceSerialNumber,
                                                              java.lang.String softwareVersion,
                                                              java.lang.String contributionDescription,
                                                              java.lang.String contributionDateTime,
                                                              java.lang.String[] operatorNames,
                                                              PersonIdentification[] operatorIdentifications)
                                                       throws DicomException

      Add the attributes of the Contributing Equipment Sequence to a list of attributes.

      Attributes are added if supplied string value are added if not null. May be zero length.

      Parameters:
        `list` - the list of attributes to which to add the Contributing Equipment Sequence
        `retainExistingItems` - if true, retain any existing items in Contributing Equipment Sequence, otherwise remove them
        `purposeOfReferenceCodeSequence` - the purpose of reference
        `manufacturer` - the manufacturer
        `institutionName` - the institution name
        `institutionalDepartmentName` - the institution department name
        `institutionAddress` - the institution address
        `stationName` - the station name
        `manufacturerModelName` - the manufacturer model name
        `deviceSerialNumber` - the device serial number
        `softwareVersion` - the software version
        `contributionDescription` - the contribution description
        `contributionDateTime` - the contribution datetime
        `operatorNames` - an array of Strings of one or more operator's names, or null if not to be added
        `operatorIdentifications` - an array of `PersonIdentification`, or null if not to be added
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeClinicalTrialsAttributes

          public static void removeClinicalTrialsAttributes​(AttributeList list)

      Remove the attributes of the Clinical Trials Patient, Study and Series Modules, from a list of attributes.

      Parameters:
        `list` - the list of attributes from which to remove the attributes

    - #### addClinicalTrialsAttributes

          public static void addClinicalTrialsAttributes​(AttributeList list,
                                                         boolean replaceConventionalAttributes,
                                                         java.lang.String clinicalTrialSponsorName,
                                                         java.lang.String clinicalTrialProtocolID,
                                                         java.lang.String clinicalTrialProtocolName,
                                                         java.lang.String clinicalTrialSiteID,
                                                         java.lang.String clinicalTrialSiteName,
                                                         java.lang.String clinicalTrialSubjectID,
                                                         java.lang.String clinicalTrialSubjectReadingID,
                                                         java.lang.String clinicalTrialTimePointID,
                                                         java.lang.String clinicalTrialTimePointDescription,
                                                         java.lang.String clinicalTrialCoordinatingCenterName)
                                                  throws DicomException

      Add the attributes of the Clinical Trials Patient, Study and Series Modules, to a list of attributes.

      Parameters:
        `list` - the list of attributes to which to add the attributes
        `replaceConventionalAttributes` - if true, use the supplied clinical trials attributes in place of the conventional ID attributes as well
        `clinicalTrialSponsorName` - the sponsor name
        `clinicalTrialProtocolID` - the protocol ID
        `clinicalTrialProtocolName` - the protocol name
        `clinicalTrialSiteID` - the site ID
        `clinicalTrialSiteName` - the site name
        `clinicalTrialSubjectID` - the subject ID
        `clinicalTrialSubjectReadingID` - the subject reading ID
        `clinicalTrialTimePointID` - the time point ID
        `clinicalTrialTimePointDescription` - the time point description
        `clinicalTrialCoordinatingCenterName` - the coordinating center name
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### isSafePrivateAttribute

          public static boolean isSafePrivateAttribute​(AttributeTag tag,
                                                       AttributeList list)

      Is a private tag safe.

      Safe private attributes are all those that are known not to contain individually identifiable information.

      Private creators are always considered safe.

      Parameters:
        `tag` - the tag in question
        `list` - the list in which the tag is contained from which the private creator can be extracted
      Returns:
        true if safe

    - #### isSafePrivateAttribute

          public static boolean isSafePrivateAttribute​(java.lang.String creator,
                                                       AttributeTag tag)

      Is a private tag safe.

      Safe private attributes are all those that are known not to contain individually identifiable information.

      Private creators are always considered safe, though there is no point in calling this method for private creator tags ... use AttributeTag.isPrivateCreator() instead.

      Parameters:
        `creator` - the private creator of the block containing the tag
        `tag` - the tag in question
      Returns:
        true if safe

    - #### isSafePrivateSequenceAttribute

          public static boolean isSafePrivateSequenceAttribute​(java.lang.String creator,
                                                               AttributeTag tag)

      Is a private tag a safe sequence VR that needs to be read as SQ if UN.

      Parameters:
        `creator` - the private creator of the block containing the tag
        `tag` - the tag in question
      Returns:
        true if a safe SQ private tag

    - #### flushMapOfUIDs

          public static void flushMapOfUIDs()

      Flush (remove all entries in) the map of original UIDs to replacement UIDs.

    - #### remapUIDAttributes

          public static void remapUIDAttributes​(AttributeList list)
                                         throws DicomException

      Remap UID attributes in a list of attributes, recursively iterating through nested sequences.

      Parameters:
        `list` - the list of attributes to be cleaned up
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeUIDAttributes

          public static void removeUIDAttributes​(AttributeList list)
                                          throws DicomException

      Remove UID attributes in a list of attributes, recursively iterating through nested sequences.

      Parameters:
        `list` - the list of attributes to be cleaned up
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeOrRemapUIDAttributes

          protected static void removeOrRemapUIDAttributes​(AttributeList list,
                                                           int handleUIDs)
                                                    throws DicomException

      Remove or remap UID attributes in a list of attributes, recursively iterating through nested sequences.

      Parameters:
        `list` - the list of attributes to be cleaned up
        `handleUIDs` - remove or remap the UIDs
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### getTagOfTimeAttributeCorrespondingToDateAttribute

          protected static AttributeTag getTagOfTimeAttributeCorrespondingToDateAttribute​(AttributeTag dateTag)

    - #### isValidCandidateForEarliestDateTime

          protected static boolean isValidCandidateForEarliestDateTime​(java.util.Date candidate)

    - #### findEarliestDateTime

          protected static java.util.Date findEarliestDateTime​(AttributeList list,
                                                               java.util.Date earliestSoFar,
                                                               java.lang.String dateToUseForUnaccompaniedTimes)

      Get the earliest patient event related date and time.

      Ignores equipment related dates like calibration, patient related dates like birth date, and non-patient instance related dates like effective and information issue.

      Parameters:
        `list` - the list of attributes from the top level data set
        `earliestSoFar` - for recursion
        `dateToUseForUnaccompaniedTimes` - the date to use for time attributes that don't have a date sibling
      Returns:
        the earliest date and time

    - #### findEarliestDateTime

          public static java.util.Date findEarliestDateTime​(AttributeList list)

      Get the earliest patient event related date and time.

      Ignores equipment related dates like calibration, patient related dates like birth date, and non-patient instance related dates like effective and information issue.

      Parameters:
        `list` - the list of attributes from the top level data set
      Returns:
        the earliest date and time

    - #### getDateOffsetByEarliestMovedToEpoch

          protected static java.util.Date getDateOffsetByEarliestMovedToEpoch​(java.util.Date existingDate,
                                                                              java.util.Date epochForDateModification,
                                                                              java.util.Date earliest)

    - #### getDateToUseForUnaccompaniedTimes

          protected static java.lang.String getDateToUseForUnaccompaniedTimes​(AttributeList list)

      Get the date to use for time attributes that don't have a date sibling and which may be nested in sequences.

      E.g., to use with RadiopharmaceuticalStartTime.

      Parameters:
        `list` - the list of attributes from the top level data set
      Returns:
        a date to use, or an empty string if none

    - #### removeOrRemapDateAndTimeAttributes

          protected static void removeOrRemapDateAndTimeAttributes​(AttributeList list,
                                                                   int handleDates,
                                                                   java.util.Date epochForDateModification,
                                                                   java.util.Date earliest,
                                                                   java.lang.String dateToUseForUnaccompaniedTimes)
                                                            throws DicomException

      Remove or remap Date, Time and DateTime attributes (other than Patient Birth) in a list of attributes, recursively iterating through nested sequences.

      Parameters:
        `list` - the list of attributes to be cleaned up
        `handleDates` - keep, remove or modify dates and times
        `epochForDateModification` - used if handleDates is modify dates, otherwise null
        `earliest` - used to determine the offset from the epoch to remove from all dates and times - MUST be the earliest date and time else unaccompanied time attributes may cross midnight
        `dateToUseForUnaccompaniedTimes` - used for time attributes that don't have a date sibling and which may be nested in sequences, e.g., RadiopharmaceuticalStartTime
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeOrNullIdentifyingAttributes

          public static void removeOrNullIdentifyingAttributes​(AttributeList list,
                                                               boolean keepUIDs,
                                                               boolean keepDescriptors)
                                                        throws DicomException

      Deidentify a list of attributes.

      De-identifies attributes within nested sequences, other than Context Sequence.

      Handles UIDs as requested, including within nested sequences, including Context Sequence.

      Leaves dates and times alone (other than Patient Birth).

      Also adds record that de-identification has been performed.

      Parameters:
        `list` - the list of attributes to be cleaned up
        `keepUIDs` - if true, keep the UIDs
        `keepDescriptors` - if true, keep the text description and comment attributes
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeOrNullIdentifyingAttributes

          public static void removeOrNullIdentifyingAttributes​(AttributeList list,
                                                               boolean keepUIDs,
                                                               boolean keepDescriptors,
                                                               boolean keepPatientCharacteristics)
                                                        throws DicomException

      Deidentify a list of attributes.

      De-identifies attributes within nested sequences, other than Context Sequence.

      Handles UIDs as requested, including within nested sequences, including Context Sequence.

      Leaves dates and times alone (other than Patient Birth).

      Also adds record that de-identification has been performed.

      Parameters:
        `list` - the list of attributes to be cleaned up
        `keepUIDs` - if true, keep the UIDs
        `keepDescriptors` - if true, keep the text description and comment attributes
        `keepPatientCharacteristics` - if true, keep patient characteristics (such as might be needed for PET SUV calculations)
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeOrNullIdentifyingAttributes

          public static void removeOrNullIdentifyingAttributes​(AttributeList list,
                                                               int handleUIDs,
                                                               boolean keepDescriptors,
                                                               boolean keepPatientCharacteristics)
                                                        throws DicomException

      Deidentify a list of attributes.

      De-identifies attributes within nested sequences, other than Context Sequence.

      Handles UIDs as requested, including within nested sequences, including Context Sequence.

      Leaves dates and times alone (other than Patient Birth).

      Also adds record that de-identification has been performed.

      Parameters:
        `list` - the list of attributes to be cleaned up
        `handleUIDs` - keep, remove or remap the UIDs
        `keepDescriptors` - if true, keep the text description and comment attributes
        `keepPatientCharacteristics` - if true, keep patient characteristics (such as might be needed for PET SUV calculations)
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeOrNullIdentifyingAttributes

          public static void removeOrNullIdentifyingAttributes​(AttributeList list,
                                                               int handleUIDs,
                                                               boolean keepDescriptors,
                                                               boolean keepSeriesDescriptors,
                                                               boolean keepPatientCharacteristics,
                                                               boolean keepDeviceIdentity,
                                                               boolean keepInstitutionIdentity)
                                                        throws DicomException

      Deidentify a list of attributes.

      De-identifies attributes within nested sequences, other than Context Sequence.

      Handles UIDs as requested, including within nested sequences, including Context Sequence.

      Leaves dates and times alone (other than Patient Birth).

      Also adds record that de-identification has been performed.

      Parameters:
        `list` - the list of attributes to be cleaned up
        `handleUIDs` - keep, remove or remap the UIDs
        `keepDescriptors` - if true, keep the text description and comment attributes
        `keepSeriesDescriptors` - if true, keep the series description even if all other descriptors are removed
        `keepPatientCharacteristics` - if true, keep patient characteristics (such as might be needed for PET SUV calculations)
        `keepDeviceIdentity` - if true, keep device identity
        `keepInstitutionIdentity` - if true, keep device identity
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeOrNullIdentifyingAttributes

          public static void removeOrNullIdentifyingAttributes​(AttributeList list,
                                                               int handleUIDs,
                                                               boolean keepDescriptors,
                                                               boolean keepSeriesDescriptors,
                                                               boolean keepPatientCharacteristics,
                                                               boolean keepDeviceIdentity,
                                                               boolean keepInstitutionIdentity,
                                                               int handleDates,
                                                               java.util.Date epochForDateModification,
                                                               java.util.Date earliestDateInSet)
                                                        throws DicomException

      Deidentify a list of attributes.

      De-identifies attributes within nested sequences, other than Context Sequence.

      Handles UIDs as requested, including within nested sequences, including Context Sequence.

      Handles dates and times as requested (other than Patient Birth), including within nested sequences, including Context Sequence.

      Also adds record that de-identification has been performed.

      Parameters:
        `list` - the list of attributes to be cleaned up
        `handleUIDs` - keep, remove or remap the UIDs
        `keepDescriptors` - if true, keep the text description and comment attributes
        `keepSeriesDescriptors` - if true, keep the series description even if all other descriptors are removed
        `keepPatientCharacteristics` - if true, keep patient characteristics (such as might be needed for PET SUV calculations)
        `keepDeviceIdentity` - if true, keep device identity
        `keepInstitutionIdentity` - if true, keep device identity
        `handleDates` - keep, remove or modify dates and times
        `epochForDateModification` - the epoch to which to move the earliest date, used if handleDates is modify dates, otherwise null
        `earliestDateInSet` - the known earliest date to move to the specified epoch, used if handleDates is modify dates, otherwise null; if null, the earliest in the supplied list is used; MUST be the earliest date and time else unaccompanied time attributes may cross midnight
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeOrNullIdentifyingAttributes

          public static void removeOrNullIdentifyingAttributes​(AttributeList list,
                                                               int handleUIDs,
                                                               boolean keepDescriptors,
                                                               boolean keepSeriesDescriptors,
                                                               boolean keepProtocolName,
                                                               boolean keepPatientCharacteristics,
                                                               boolean keepDeviceIdentity,
                                                               boolean keepInstitutionIdentity,
                                                               int handleDates,
                                                               java.util.Date epochForDateModification,
                                                               java.util.Date earliestDateInSet)
                                                        throws DicomException

      Deidentify a list of attributes.

      De-identifies attributes within nested sequences, other than Context Sequence.

      Handles UIDs as requested, including within nested sequences, including Context Sequence.

      Handles dates and times as requested (other than Patient Birth), including within nested sequences, including Context Sequence.

      Also adds record that de-identification has been performed.

      Parameters:
        `list` - the list of attributes to be cleaned up
        `handleUIDs` - keep, remove or remap the UIDs
        `keepDescriptors` - if true, keep the text description and comment attributes
        `keepSeriesDescriptors` - if true, keep the series description even if all other descriptors are removed
        `keepProtocolName` - if true, keep protocol name even if all other descriptors are removed
        `keepPatientCharacteristics` - if true, keep patient characteristics (such as might be needed for PET SUV calculations)
        `keepDeviceIdentity` - if true, keep device identity
        `keepInstitutionIdentity` - if true, keep device identity
        `handleDates` - keep, remove or modify dates and times
        `epochForDateModification` - the epoch to which to move the earliest date, used if handleDates is modify dates, otherwise null
        `earliestDateInSet` - the known earliest date to move to the specified epoch, used if handleDates is modify dates, otherwise null; if null, the earliest in the supplied list is used; MUST be the earliest date and time else unaccompanied time attributes may cross midnight
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### removeOrNullIdentifyingAttributesRecursively

          protected static void removeOrNullIdentifyingAttributesRecursively​(AttributeList list,
                                                                             int handleUIDs,
                                                                             boolean keepDescriptors,
                                                                             boolean keepSeriesDescriptors,
                                                                             boolean keepProtocolName,
                                                                             boolean keepPatientCharacteristics,
                                                                             boolean keepDeviceIdentity,
                                                                             boolean keepInstitutionIdentity)
                                                                      throws DicomException

      Deidentify a list of attributes, recursively iterating through nested sequences.

      Does not process UIDs, but does remove sequences that would be invalidated by removing UIDs, e.g., Source Image Sequence and Referenced Image Sequence. If necessary caller should use `removeOrRemapUIDAttributes()`.

      Does not process dates and times (other than Patient Birth). If necessary caller should use `removeOrRemapDateAndTimeAttributes()`.

      Parameters:
        `list` - the list of attributes to be cleaned up
        `handleUIDs` - keep, remove or remap the UIDs
        `keepDescriptors` - if true, keep the text description and comment attributes
        `keepSeriesDescriptors` - if true, keep the series description even if all other descriptors are removed
        `keepProtocolName` - if true, keep protocol name even if all other descriptors are removed
        `keepPatientCharacteristics` - if true, keep patient characteristics (such as might be needed for PET SUV calculations)
        `keepDeviceIdentity` - if true, keep device identity
        `keepInstitutionIdentity` - if true, keep device identity
      Throws:
        `DicomException` - if error in DICOM encoding

    - #### main

          public static void main​(java.lang.String[] arg)

      For testing.

      Read a DICOM object from the file specified on the command line, and remove identifying attributes, and add sample clinical trials attributes.

      Parameters:
        `arg` - two arguments, a DICOM input file and a DICOM output file