Class NIFTIImage

All Implemented Interfaces:
ReadableImage, WritableImage, InfoStorer, AutoCloseable, Cloneable
Direct Known Subclasses:
NIFTI2Image

public class NIFTIImage extends ANZImage implements InfoStorer, AutoCloseable
This class is a representation of a multi-dimensional image in the NIFTI-1 format (see The Neuroimaging Informatics Technology Initiative), an extension of the original Analyze 7.5 format (see The Biomedical Imaging Resource). A NIFTIImage Object can be created either from two data sources (one for the header, the other for the image data), one data source (a combined header/image source), or it can be created afresh.

Both big-endian and little-endian byte ordering are implemented and supported. When reading existing images, the byte order is auto detected. When existing images are copied or modified, the original byte order is retained. For images newly-created from scratch by this package, the byte ordering the native byte order.

N.B. The Analyze format requires that for BINARY images, individual slices must begin on a byte boundary. In this implementation, that restriction is removed. If you wish to maintain compatibility with Analyze and other programs that maintain this restriction, ensure that a multi-slice/multi-frame images have slices with a number of pixels that is a multiple of 8 (bits).

N.B. When the pixel values are returned by methods such as MultiSliceImage.getPix() and MultiSliceImage.getSlice(int), the intensities are scaled according to the intensity rescaling factors that are part of the NIFTI-1 standard.

  • Field Details

    • ONE_FILE_PROPERTY_KEY

      public static final String ONE_FILE_PROPERTY_KEY
      The property value key for setting whether NIFTI images should be stored in one file, or two.
      See Also:
    • COMPRESSED_PROPERTY_KEY

      public static final String COMPRESSED_PROPERTY_KEY
      The property value key for setting whether NIFTI images should be stored compressed, or uncompressed.
      See Also:
    • DEFAULT_NIFTI_ONE_FILE

      public static final boolean DEFAULT_NIFTI_ONE_FILE
      Whether to store NIFTI images in one file (.nii) by default.
      See Also:
    • DEFAULT_COMPRESSED

      public static final boolean DEFAULT_COMPRESSED
      Whether to store NIFTI images compressed by default.
      See Also:
    • EXTENSION

      public static final String EXTENSION
      The file extension for NIFTI image files.
      See Also:
    • UPPERCASE_EXTENSION

      public static final String UPPERCASE_EXTENSION
      The file extension for NIFTI image files in upper case form.
    • COMPRESSED_EXTENSION

      public static final String COMPRESSED_EXTENSION
      The file extension for compressed NIFTI image files.
      See Also:
    • UPPERCASE_COMPRESSED_EXTENSION

      public static final String UPPERCASE_COMPRESSED_EXTENSION
      The file extension for compressed NIFTI image files in upper case form.
  • Constructor Details

    • NIFTIImage

      public NIFTIImage()
      Creates an uninitialised instance of a NIFTIImage. Needed so that newInstance() method can be called on the class.
    • NIFTIImage

      public NIFTIImage(short nCols, short nRows, short nSlices, short nFrames, ANZPixFormat dataType) throws ANZException, IOException
      Creates a new in-memory NIFTIImage. This image exists in memory, and will only be written with an explicit write() method call.
      Parameters:
      nCols - the number of columns in the image x-direction.
      nRows - the number of rows in the image y-direction.
      nSlices - the number of slice in the image.
      nFrames - the number of frames (time points) in the image.
      dataType - the ANZPixFormat for the image.
      Throws:
      ANZException - if the image cannot be created.
      IOException - if an I/O error occurs.
    • NIFTIImage

      public NIFTIImage(ANZPixFormat dataType, Short... dims) throws ANZException, IOException
      Creates a new in-memory NIFTIImage. This image exists in memory, and will only be written with an explicit write() method call.
      Parameters:
      dims - the number of samples in each of the image dimensions. The number of arguments supplied determines the dimensionality of the image.
      dataType - an ANZPixFormat.
      Throws:
      ANZException - if the header cannot be created.
      IOException - if an I/O error occurs.
    • NIFTIImage

      public NIFTIImage(NIFTIHeader hdr) throws ANZException, IOException
      Creates a new in-memory NIFTIImage, using information from an existing NIFTIHeader. This image exists in memory, and will only be written with an explicit write() method call. The supplied NIFTIHeader object is cloned and can therefore be re-used.
      Parameters:
      hdr - the NIFTIHeader that will be used for dimensional information etc.
      Throws:
      ANZException - if the image cannot be created.
      IOException - if an I/O error occurs.
    • NIFTIImage

      public NIFTIImage(String fileName, short nCols, short nRows, short nSlices, short nFrames, ANZPixFormat dataType) throws IOException, ANZException
      Creates a new disk-based NIFTIImage. After manipulation, a call to the close() method is necessary for any changes to be reflected on disk.
      Parameters:
      fileName - the root of the Analyze file name (i.e. without the ".img" or ".hdr" extension). If the fileName does have an extension, then this will be handled.
      nCols - the number of columns in the image x-direction.
      nRows - the number of rows in the image y-direction.
      nSlices - the number of slice in the image.
      nFrames - the number of frames (time points) in the image.
      dataType - the ANZPixFormat for the image.
      Throws:
      ANZException - if the NIFTIImage cannot be instantiated.
      IOException - if an I/O error occurs.
    • NIFTIImage

      public NIFTIImage(String fileName, ANZPixFormat dataType, Short... dims) throws IOException, ANZException
      Creates a new disk-based NIFTIImage. After manipulation, a call to the close() method is necessary for any changes to be reflected on disk.
      Parameters:
      fileName - the root of the NIFTI file name (i.e. without any ".img" ".hdr", ".nii", ".img.gz", ".hdr.gz" or ".nii.gz" extension). If the fileName does have an extension, then this will be handled gracefully.
      dims - the number of samples in each of the image dimensions. The number of arguments supplied determines the dimensionality of the image.
      dataType - an ANZPixFormat.
      Throws:
      ANZException - if the header cannot be created.
      IOException - if an I/O error occurs.
    • NIFTIImage

      public NIFTIImage(File f, NIFTIHeader header) throws IOException, ANZException
      Creates a new disk-based NIFTIImage, using an existing header as a template for the new image. After manipulation, a call to the close() method is necessary for any changes to the header to be reflected on disk.
      Parameters:
      f - the File object that will form the root of the Analyze file name (i.e. without the ".hdr" extension). If f's name does have an extension, then this will be handled.
      header - the NIFTIHeader to use as the template.
      Throws:
      ANZException - if the new image cannot be created on disk.
      IOException - if an I/O error occurs.
    • NIFTIImage

      public NIFTIImage(String fileName, NIFTIHeader header) throws IOException, ANZException
      Creates a new disk-based NIFTIImage (either NIFTI-1 or NIFTI-2), using an existing header (NIFTIHeader or NIFTI2Header) as a template for the new image. After manipulation, a call to close() is necessary for any changes to the image to be reflected on disk.
      Parameters:
      fileName - the image file name (possibly without any ".hdr" or ".nii" extension). If the fileName has no extension, then the decision about whether to save the image in a NIFTI one-file format (.nii) and whether it will be compressed (.hdr.gz/.img.gz/.nii.gz) will be made according to the user preferences. If the fileName does have an extension, then this will override the user preferences, and will be handled as follows:
      • If the extension is a standard Analyze (.hdr/.img) extension, then the image will be saved in a two-file format.
      • If the extension is .nii, then then the image will be saved in a one-file format.
      • If the extension is ..hdr.gz, .img.gz or .nii.gz then then the image will be saved in a compressed two-file or one-file format.
      header - the NIFTIHeader or NIFTI2Header to use as the template.
      Throws:
      ANZException - if the new image cannot be created on disk.
      IOException - if an I/O error occurs.
    • NIFTIImage

      public NIFTIImage(String fileName, String mode) throws InvalidImageException, IOException, FileNotFoundException
      Opens an existing NIFTIImage, with pixel data remaining on disk until requested.
      Parameters:
      fileName - the name of the image file.
      mode - the open mode. Can be either "r" (read-only) or "rw" (read-write).
      Throws:
      InvalidImageException - if the image cannot be opened or loaded, or if mode is invalid.
      FileNotFoundException - if the image file doesn't exist.
      IOException - if an I/O error occurs.
  • Method Details

    • getPreferredNIFTIOneFile

      public static boolean getPreferredNIFTIOneFile()
      Returns the user's preference about whether NIFTI images should be stored in two separate files (.hdr and .hdr) or one (.nii).

      If the system property "nifti.onefile" exists, and the property value is either "true" or "false", then the user's preference is overridden by the property value.

      Returns:
      true if the user prefers to store NIFTI-compliant images in one .nii file; false otherwise.
    • savePreferredNIFTIOneFile

      public static void savePreferredNIFTIOneFile(boolean oneFile)
      Sets the user's preference about whether NIFTI images should be stored in two separate files (.hdr and .hdr) or one (.nii).
      Parameters:
      oneFile - true if the user prefers to store NIFTI-compliant images in one .nii file; false otherwise.
    • getPreferredCompressed

      public static boolean getPreferredCompressed()
      Returns the user's preference about whether NIFTI images should be stored compressed.

      If the system property "nifti.compressed" exists, and the property value is either "true" or "false", then the user's preference is overridden by the property value.

      Returns:
      true if the user prefers to store NIFTI-compliant images compressed; false otherwise.
    • savePreferredCompressed

      public static void savePreferredCompressed(boolean compressed)
      Sets the user's preference about whether NIFTI images should be stored compressed.
      Parameters:
      compressed - true if the user prefers to store NIFTI-compliant images compressed.
    • imageExists

      public static boolean imageExists(String fileName)
      Tests whether a NIFTIImage with the given name already exists on disk. File extensions are handled in a smart and case-insensitive way.
      Parameters:
      fileName - the name of the image file to test for existence.
      Returns:
      true if either:
      • a pair of NIFTIImages .img and .hdr with the specified name exist on disk;
      • a single NIFTIImage with extension .nii exists on disk.
      false otherwise.
    • getPreviewIcon

      public static PreviewIcon getPreviewIcon(File f, boolean withImageIcon)
      Returns the PreviewIcon for an NIFTIImage, or null if the supplied File does not represent a NIFTI image.
      Parameters:
      f - the File to be tested.
      withImageIcon - whether a image preview is to be generated. Generating an image preview will take longer than not generating one.
      Returns:
      PreviewIcon if the File produces an NIFTIImage; null otherwise.
    • write

      public String write(String root) throws IOException, InvalidImageException
      Writes this NIFTIImage to disk. This method will either:
      • write that header to a .hdr file, and the image data to a .img file, or
      • write the image data to the same file as the header information in a .nii file.
      The choice depends on the magic number set in the image header (i.e., a magic number the "n+1" for a .nii file, and "ni1" for separate .hdr and .img files).
      Specified by:
      write in interface WritableImage
      Overrides:
      write in class ANZImage
      Parameters:
      root - the root of the NIFTI fileName. Will be appended with ".hdr", ".img", ".nii", ".hdr.gz", ".img.gz" or ".nii.gz" as appropriate to create the full file name(s).
      Returns:
      the actual file name used to write the image, including any added extension.
      Throws:
      InvalidImageException - if the image cannot be written.
      IOException - if an I/O error occurs.
    • close

      public void close() throws IOException
      Closes a NIFTIImage and frees up resources. For in-memory NIFTIImages, this merely explicity frees resources so that the garbage collector can work more efficiently. However, for disk-based images it is essential to apply the close() method. If the close() method is not applied to a disk-based NIFTIImage, then any changes to the header or pixel data may be lost. Any further operations to a closed NIFTIImage are not possible, and may cause an exception to be thrown.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface ReadableImage
      Overrides:
      close in class ANZImage
      Throws:
      IOException - if an I/O error occurs.
    • getImagePositionPatient

      public org.jogamp.vecmath.Point3f getImagePositionPatient(int slice) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the coordinates of the center of the first pixel of the specified slice of this image, in mm, in patient coordinates.
      Specified by:
      getImagePositionPatient in interface ReadableImage
      Overrides:
      getImagePositionPatient in class ANZImage
      Parameters:
      slice - the slice number (indexed from 0) for which to return the pixel coordinates.
      Returns:
      the Left,Posterior,Superior (LPS) coordinates of the first pixel in the specified slice of this image. Returns null if the position cannot be retrieved from this image.
      Throws:
      IndexOutOfBoundsException - if the slice number is bad for this image.
    • setImagePositionPatient

      public void setImagePositionPatient(org.jogamp.vecmath.Point3f position, int slice)
      Description copied from interface: WritableImage
      Sets the coordinates of the center of the first pixel of the image, in mm, in patient (LPS) coordinates, for one slice of this image.
      Specified by:
      setImagePositionPatient in interface WritableImage
      Parameters:
      position - the Left,Posterior,Superior (LPS) coordinates of the first pixel of this specified slice in the image data matrix.
      slice - the slice for which to set the position.
    • getImageOrientationPatient

      public org.jogamp.vecmath.Vector3f[] getImageOrientationPatient(int slice) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the direction cosines of the row, column and slice directions (for increasing row, column and slice) of the image, in patient coordinates.
      Specified by:
      getImageOrientationPatient in interface ReadableImage
      Overrides:
      getImageOrientationPatient in class ANZImage
      Parameters:
      slice - the slice for which to return the image orientation.
      Returns:
      a Vector3f[], corresponding to the direction cosines of the image row, column and slice directions in Left,Posterior,Superior (LPS) coordinates. Returns null if the direction cosines cannot be retrieved from this image.
      Throws:
      IndexOutOfBoundsException - if the image does not have the right dimensionality or the slice number is inappropriate for this image.
    • setImageOrientationPatient

      public void setImageOrientationPatient(org.jogamp.vecmath.Vector3f[] orientation, int slice) throws IndexOutOfBoundsException
      Description copied from class: MultiSliceImage
      Sets the direction cosines of the row, column and slice directions (for increasing row, column and slice) of the image, in patient (LPS) coordinates.

      If the orientation cannot be set for this image, this method does nothing.

      Specified by:
      setImageOrientationPatient in interface WritableImage
      Specified by:
      setImageOrientationPatient in class MultiSliceImage
      Parameters:
      orientation - the direction cosines of the image row, column and (optionally) slice directions respectively in Left,Posterior,Superior (LPS) coordinates.
      slice - the slice for which to set the orientation.
      Throws:
      IndexOutOfBoundsException - if the cosines array does not have the correct dimensions.
    • supportsIntensityRescaling

      public boolean supportsIntensityRescaling()
      Returns true because NIFTI-1 images support intensity rescaling.
      Specified by:
      supportsIntensityRescaling in interface WritableImage
      Returns:
      true.
    • getIntensityRescale

      public float[] getIntensityRescale()
      Description copied from interface: ReadableImage
      Returns the values m and b in the relationship between pixel intensity (I) values and the output units specified in getRescaleUnits() in the expression:
      Output units = m*I + b.
      Specified by:
      getIntensityRescale in interface ReadableImage
      Returns:
      an array will be of length 2 where the first element is m and the second is b.
    • setIntensityRescale

      public void setIntensityRescale(float rescaleSlope, float rescaleIntercept) throws IOException
      Description copied from interface: WritableImage
      Sets the values m and b in the relationship between pixel intensity (I) values and the output units specified in WritableImage.setRescaleUnits(com.xinapse.dicom.RescaleUnits) in the expression:
      Output units = m*I + b.
      Specified by:
      setIntensityRescale in interface WritableImage
      Parameters:
      rescaleSlope - the value of m in the expression above.
      rescaleIntercept - the value of b in the expression above.
      Throws:
      IOException - if an I/O error occurs.
    • getRescaleUnits

      public com.xinapse.dicom.RescaleUnits getRescaleUnits()
      Returns RescaleUnits.US.
      Specified by:
      getRescaleUnits in interface ReadableImage
      Overrides:
      getRescaleUnits in class ANZImage
      Returns:
      com.xinapse.dicom.RescaleUnits.US.
    • setRescaleUnits

      public void setRescaleUnits(com.xinapse.dicom.RescaleUnits units) throws IOException
      Description copied from interface: WritableImage
      Sets the rescale units.
      Specified by:
      setRescaleUnits in interface WritableImage
      Parameters:
      units - the rescale units.
      Throws:
      IOException - if the rescale units cannot be set.
    • getCommonName

      public static String getCommonName()
      Returns the common name for this type of image.
      Returns:
      the String "NIFTI-1".
    • getImageTypeName

      public String getImageTypeName()
      Returns the human readable name for this type of image.
      Specified by:
      getImageTypeName in interface WritableImage
      Returns:
      a String like "NIFTI-1" or "NIFTI-2".
    • getQForm

      public NIFTIXForm getQForm()
      Returns the qForm in this NIFTIImage.
      Returns:
      the qForm set in this NIFTIImage.
    • setQForm

      public void setQForm(NIFTIXForm qForm) throws ANZException
      Sets the qForm code in this NIFTIImage.
      Parameters:
      qForm - the qForm to set in this NIFTIImage.
      Throws:
      ANZException - if the qForm cannot be set.
    • getSForm

      public NIFTIXForm getSForm()
      Returns the sForm in this NIFTIImage.
      Returns:
      the sForm in this NIFTIImage.
    • setSForm

      public void setSForm(NIFTIXForm sForm) throws ANZException
      Sets the sForm code in this NIFTIImage.
      Parameters:
      sForm - the sForm to set in this NIFTIImage.
      Throws:
      ANZException - if the sForm cannot be set.
    • getSFormAffineTransform

      public AffineTransform3D getSFormAffineTransform() throws ParameterNotSetException
      Returns the general (sForm) AffineTransform3D that will transform the pixel indices (colIdx, rowIdx, sliceIdx) to a position in space in a patient-centric coordinate system.
      N.B. Note: the patient-centric coordinate system is different from that defined in the NIFTI-1 standard. Jim's coordinate system is a left-handed system, with:
      • The first coordinate increasing to the patient left (L).
      • The second coordinate increasing to the patient posterior (P).
      • The third coordinate increasing to the patient superior (S).
      This is the standard radiological coordinate system, and is different from NIFTI's.
      Returns:
      the AffineTransform3D that will transform the pixel indices (colIdx, rowIdx, sliceIdx) to a position in space in the patient-centric coordinate system. The pixel indices can be transformed to the (L,P,S) coordinate by applying:
           // Create a point for the pixel indices.
           Point3f ijk = new Point3f(i, j, k);
           Point3f lps = new Point3f();
           // The lps coordinate of the point is returned.
           Point3f lps = header.getAffineTransform().transform(ijk, lps);
           
      Throws:
      ParameterNotSetException - if the AffineTransform cannot be retrieved.
    • getIntent

      public NIFTIIntent getIntent()
      Returns the NIFTIIntent in this NIFTIImage.
      Returns:
      the NIFTIIntent set in this NIFTIImage.
    • setIntent

      public void setIntent(NIFTIIntent intent) throws ANZException
      Sets the NIFTIIntent in this NIFTIImage.
      Parameters:
      intent - the NIFTIIntent to set in this NIFTIImage.
      Throws:
      ANZException - if the intent cannot be set.
    • getPatientPosition

      public PatientPosition getPatientPosition()
      Description copied from interface: ReadableImage
      Returns the position in which the patient is lying in the scanning equipment. For example, PatientPosition.HFS (head-first supine).
      Specified by:
      getPatientPosition in interface ReadableImage
      Returns:
      the position in which the patient is lying in the scanning equipment, or null if the patient position cannot be determined.
    • setPatientPosition

      public void setPatientPosition(PatientPosition position) throws IOException
      Description copied from interface: WritableImage
      Sets the position in which the patient is lying in the scanning equipment for this WritableImage.
      Specified by:
      setPatientPosition in interface WritableImage
      Parameters:
      position - the position in which the patient is lying in the scanning equipment. e.g. PatientPosition.HFS (head-first supine).
      Throws:
      IOException - if the patient position cannot be set for this image.
    • setScanDate

      public void setScanDate(Date scanDate) throws IOException
      Description copied from interface: WritableImage
      Sets the scan date/time for this image.
      N.B. For disk-based images, the changes in the scan date will not be reflected on disk unless the close() method is called.
      Specified by:
      setScanDate in interface WritableImage
      Parameters:
      scanDate - the new scan date/time to be assigned to this image.
      Throws:
      IOException - if the scan date cannot be set.
    • setPulseSequence

      public void setPulseSequence(String seqName) throws IOException
      Description copied from interface: WritableImage
      Sets the pulse sequence name for this image.
      N.B. For disk-based images, the changes in the scanning sequence will not be reflected on disk unless the close() method is called.
      Specified by:
      setPulseSequence in interface WritableImage
      Parameters:
      seqName - the new name of the pulse sequence to be assigned to this image.
      Throws:
      IOException - if the pulse sequence name cannot be set.
    • setScanningSequence

      public void setScanningSequence(PulseSequenceType seq) throws IOException
      Description copied from interface: WritableImage
      Sets the DICOM scanning sequence for this image.
      N.B. For disk-based images, the changes in the scanning sequence will not be reflected on disk unless the close() method is called.
      Specified by:
      setScanningSequence in interface WritableImage
      Parameters:
      seq - the new scanning sequence to be assigned to this image.
      Throws:
      IOException - if the scanning sequence cannot be set.
    • setSequenceVariant

      public void setSequenceVariant(PulseSequenceVariant seqVar) throws IOException
      Description copied from interface: WritableImage
      Sets the DICOM scanning sequence variant for this image.
      N.B. For disk-based images, the changes in the scanning sequence variant will not be reflected on disk unless the close() method is called.
      Specified by:
      setSequenceVariant in interface WritableImage
      Parameters:
      seqVar - the new scanning sequence variant to be assigned to this image.
      Throws:
      IOException - if the scanning sequence variant cannot be set.
    • setSeriesNumber

      public void setSeriesNumber(Integer seriesNumber) throws IOException
      Description copied from interface: WritableImage
      Sets the series number for this image.
      N.B. For disk-based images, the changes in the series number will not be reflected on disk unless the close() method is called.
      Specified by:
      setSeriesNumber in interface WritableImage
      Parameters:
      seriesNumber - the new series number to be assigned to this image.
      Throws:
      IOException - if the series number cannot be set.
    • setSeriesDescription

      public void setSeriesDescription(String description) throws IOException
      Description copied from interface: WritableImage
      Sets a short description of the series (scan).
      N.B. For disk-based images, the changes in the series description will not be reflected on disk unless the close() method is called.
      Specified by:
      setSeriesDescription in interface WritableImage
      Parameters:
      description - the new short description of the series, or null if none is available.
      Throws:
      IOException - if the description cannot be set.
    • getSliceThickness

      public Float getSliceThickness()
      Description copied from interface: ReadableImage
      Returns the slice thickness (in mm). This method is necessary because the slice thickness may not be the same as the inter-slice pixel spacing, if there is a gap between slices.
      Specified by:
      getSliceThickness in interface ReadableImage
      Returns:
      the slice thickness in mm, or null if the slice thickness is not set, or its value is corrupt.
    • setSliceThickness

      public void setSliceThickness(Float thickness) throws IOException
      Description copied from interface: WritableImage
      Sets the slice thickness (in mm). This method is necessary because the slice thickness may not be the same as the inter-slice pixel spacing, if there is a gap between slices.
      Specified by:
      setSliceThickness in interface WritableImage
      Parameters:
      thickness - the slice thickness in mm, or null to remove the slice thickness information.
      Throws:
      IOException - if the slice thickness cannot be set for this image.
    • getBodyPart

      public com.xinapse.dicom.BodyPart getBodyPart()
      Description copied from class: MultiSliceImage
      By default, body part recording is not supported, so this method always returns null.
      Specified by:
      getBodyPart in interface ReadableImage
      Overrides:
      getBodyPart in class MultiSliceImage
      Returns:
      null.
    • setBodyPart

      public void setBodyPart(com.xinapse.dicom.BodyPart bodyPart) throws IOException
      Description copied from class: MultiSliceImage
      By default, body part recording is not supported, so this method does nothing.
      Specified by:
      setBodyPart in interface WritableImage
      Overrides:
      setBodyPart in class MultiSliceImage
      Parameters:
      bodyPart - body the imaged body part.
      Throws:
      IOException - if body part cannot be set.
    • getLaterality

      public com.xinapse.dicom.Laterality getLaterality()
      Description copied from class: MultiSliceImage
      By default, laterality recording is not supported, so this method returns Laterality.BOTH.
      Specified by:
      getLaterality in interface ReadableImage
      Overrides:
      getLaterality in class MultiSliceImage
      Returns:
      Laterality.BOTH.
    • setLaterality

      public void setLaterality(com.xinapse.dicom.Laterality laterality) throws IOException
      Description copied from class: MultiSliceImage
      By default, laterality recording is not supported, so this method does nothing.
      Specified by:
      setLaterality in interface WritableImage
      Overrides:
      setLaterality in class MultiSliceImage
      Parameters:
      laterality - the image laterality.
      Throws:
      IOException - if laterality cannot be set.
    • getScanTR

      public Float getScanTR()
      Returns the scan repetition time for this image.
      Specified by:
      getScanTR in interface ReadableImage
      Returns:
      the scan TR for this image.
    • setScanTR

      public void setScanTR(Float TR) throws IOException
      Sets the scan repetition time for this image. N.B. For disk-based images, the changes in the scan TR will not be reflected on disk unless the close() method is called.
      Specified by:
      setScanTR in interface WritableImage
      Parameters:
      TR - the new scan TR to be assigned to this image.
      Throws:
      IOException - if the scan TR cannot be set.
    • getScanTI

      public Float getScanTI()
      Returns the scan inversion time for this image.
      Specified by:
      getScanTI in interface ReadableImage
      Returns:
      the scan TI for this image.
    • setScanTI

      public void setScanTI(Float TI) throws IOException
      Sets the scan inversion time for this image. N.B. For disk-based images, the changes in the scan TI will not be reflected on disk unless the close() method is called.
      Specified by:
      setScanTI in interface WritableImage
      Parameters:
      TI - the new scan TI to be assigned to this image.
      Throws:
      IOException - if the scan TI cannot be set.
    • getScanTE

      public Float getScanTE()
      Returns the scan echo time for this image if it has a single echo-time.
      Specified by:
      getScanTE in interface ReadableImage
      Returns:
      the scan TE for this image.
    • setScanTE

      public void setScanTE(Float TE) throws IOException
      Sets the scan echo time for this image, for single-echo-time images.
      N.B. For disk-based images, the changes in the scan TE will not be reflected on disk unless the close() method is called.
      Specified by:
      setScanTE in interface WritableImage
      Parameters:
      TE - the new scan TE to be assigned to this image.
      Throws:
      IOException - if an I/O error occurs.
    • getScanTE

      public Float getScanTE(int index) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the scan echo time for one dimension index of this image. For 3-D images, the dimension index is the slice dimension. For 4-D (or higher dimensionality) images, the dimension index is the frame dimension.
      Specified by:
      getScanTE in interface ReadableImage
      Parameters:
      index - the index for which to return the echo time.
      Returns:
      the scan TE for the specified index of this image, or null if not set for this image.
      Throws:
      IndexOutOfBoundsException - if the index is bad for this image.
    • setScanTE

      public void setScanTE(Float TE, int index) throws IOException
      Description copied from interface: WritableImage
      Sets the scan echo time for one dimension index of this image. For 3-D images, the dimension index is the slice dimension. For 4-D (or higher dimensionality) images, the dimension index is the frame dimension. No exception occurs if the image format does not support a scan TE recording.
      N.B. For disk-based images, the changes in the scan TE will not be reflected on disk unless the close() method is called.
      Specified by:
      setScanTE in interface WritableImage
      Parameters:
      TE - the new scan TE to be assigned to this image.
      index - the slice number for which to set the echo time.
      Throws:
      IOException - if the scan TE cannot be set because of an I/O error.
    • getSaturationFreqOffsetPPM

      public Float getSaturationFreqOffsetPPM()
      Returns the saturation pulse frequency offset for this image if it has a single saturation pulse frequency offset.
      Specified by:
      getSaturationFreqOffsetPPM in interface ReadableImage
      Returns:
      the saturation pulse frequency offset for this image, in PPM.
    • setSaturationFreqOffsetPPM

      public void setSaturationFreqOffsetPPM(Float freqOffset) throws IOException
      Sets the saturation pulse frequency offset for this image, for images with a single saturation pulse frequency offset.
      N.B. For disk-based images, the changes in the saturation pulse frequency offset will not be reflected on disk unless the close() method is called.
      Specified by:
      setSaturationFreqOffsetPPM in interface WritableImage
      Parameters:
      freqOffset - the new saturation pulse frequency offset to be assigned to this image.
      Throws:
      IOException - if an I/O error occurs.
    • getSaturationFreqOffsetPPM

      public Float getSaturationFreqOffsetPPM(int index) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the scan saturation frequency offset for one dimension index of this image in parts-per-million. For 3-D images, the dimension index is the slice dimension. For 4-D (or higher dimensionality) images, the dimension index is the frame dimension.
      Specified by:
      getSaturationFreqOffsetPPM in interface ReadableImage
      Parameters:
      index - the index for which to return the saturation frequency offset.
      Returns:
      the scan TE for the specified index of this image, or null if not set for this image.
      Throws:
      IndexOutOfBoundsException - if the index is bad for this image.
    • setSaturationFreqOffsetPPM

      public void setSaturationFreqOffsetPPM(Float freqOffset, int index) throws IOException
      Description copied from interface: WritableImage
      Sets the saturation frequency offset for one dimension index of this image. For 3-D images, the dimension index is the slice dimension. For 4-D (or higher dimensionality) images, the dimension index is the frame dimension. No exception occurs if the image format does not support saturation frequency offset recording.
      N.B. For disk-based images, the changes in the saturation frequency offset will not be reflected on disk unless the close() method is called.
      Specified by:
      setSaturationFreqOffsetPPM in interface WritableImage
      Parameters:
      freqOffset - the new saturation frequency offset to be assigned to this image.
      index - the slice number for which to set the saturation frequency offset.
      Throws:
      IOException - if the saturation frequency offset cannot be set because of an I/O error.
    • getEchoTrainLength

      public Integer getEchoTrainLength()
      Returns the echo train length for this image.
      Specified by:
      getEchoTrainLength in interface ReadableImage
      Returns:
      the echo train length for this image.
    • setEchoTrainLength

      public void setEchoTrainLength(Integer etl) throws IOException
      Sets the echo train length for this image. N.B. For disk-based images, the changes in the echo train length will not be reflected on disk unless the close() method is called.
      Specified by:
      setEchoTrainLength in interface WritableImage
      Parameters:
      etl - the new echo train length to be assigned to this image; null if the echo train length is to be unassigned.
      Throws:
      IOException - if the echo train length cannot be set because of an I/O error.
    • getFlipAngle

      public Float getFlipAngle()
      Returns the excitation pulse flip angle for this image.
      Specified by:
      getFlipAngle in interface ReadableImage
      Returns:
      the excitation pulse flip angle for this image.
    • setFlipAngle

      public void setFlipAngle(Float flipAngle) throws IOException
      Sets the excitation pulse flip angle for this image.
      N.B. For disk-based images, the changes in the scan flip angle will not be reflected on disk unless the close() method is called.
      Specified by:
      setFlipAngle in interface WritableImage
      Parameters:
      flipAngle - the new scan flip angle to be assigned to this image.
      Throws:
      IOException - if an I/O error occurs.
    • getSliceDWbValue

      public Float getSliceDWbValue(int slice) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the diffusion-weighting b-value for one slice of this image.
      Specified by:
      getSliceDWbValue in interface ReadableImage
      Parameters:
      slice - the slice number for which to return the b-value.
      Returns:
      the diffusion-weighting b-value for the specified slice of this image, or null if the b-value cannot be found, or if the modality used to collect the image doesn't have a b-value defined
      Throws:
      IndexOutOfBoundsException - if the slice number is bad for this image.
    • getFrameDWbValue

      public Float getFrameDWbValue(int frame) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the diffusion-weighting b-value for one frame of this 4-D image.
      Specified by:
      getFrameDWbValue in interface ReadableImage
      Parameters:
      frame - the frame number for which to return the b-value.
      Returns:
      the diffusion-weighting b-value for the specified frame of this image, or null if the b-value cannot be found, or if the modality used to collect the image doesn't have a b-value defined
      Throws:
      IndexOutOfBoundsException - if the frame number is bad for this image, or it isn't a 4-D image.
    • setSliceDWbValue

      public void setSliceDWbValue(float bValue, int slice) throws IOException
      Description copied from interface: WritableImage
      Sets the diffusion-weighting b-value for one slice of this image. No exception occurs if the image format does not support recording the b-value.
      N.B. For disk-based images, the changes in the b-value will not be reflected on disk unless the close() method is called.
      Specified by:
      setSliceDWbValue in interface WritableImage
      Parameters:
      bValue - the new b-value to be assigned to this image.
      slice - the slice number for which to set the b-value.
      Throws:
      IOException - if the scan b-value cannot be set.
    • setFrameDWbValue

      public void setFrameDWbValue(float bValue, int frame) throws IOException
      Description copied from interface: WritableImage
      Sets the diffusion-weighting b-value for one "frame" of this 4-D image. No exception occurs if the image format does not support recording the b-value.
      N.B. For disk-based images, the changes in the b-value will not be reflected on disk unless the close() method is called.
      Specified by:
      setFrameDWbValue in interface WritableImage
      Parameters:
      bValue - the new b-value to be assigned to this image.
      frame - the frame number for which to set the b-value.
      Throws:
      IOException - if the scan b-value cannot be set.
    • getSliceDWGradientVector

      public org.jogamp.vecmath.Vector3f getSliceDWGradientVector(int slice) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the diffusion-weighting gradient-vector for one slice of this image.
      Specified by:
      getSliceDWGradientVector in interface ReadableImage
      Parameters:
      slice - the slice number for which to return the gradient-vector.
      Returns:
      the diffusion-weighting gradient-vector for the specified slice of this image, or null if the gradient vector cannot be found, or if the modality used to collect the image doesn't have a gradient vector defined.
      Throws:
      IndexOutOfBoundsException - if the slice number is bad for this image.
    • getFrameDWGradientVector

      public org.jogamp.vecmath.Vector3f getFrameDWGradientVector(int frame) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the diffusion-weighting gradient-vector for one frame of this image 4-D image.
      Specified by:
      getFrameDWGradientVector in interface ReadableImage
      Parameters:
      frame - the frame number for which to return the gradient-vector.
      Returns:
      the diffusion-weighting gradient-vector for the specified frame of this image, or null if the gradient vector cannot be found, or if the modality used to collect the image doesn't have a gradient vector defined.
      Throws:
      IndexOutOfBoundsException - if the frame number is bad for this image, or it isn't a 4-D image.
    • setSliceDWGradientVector

      public void setSliceDWGradientVector(org.jogamp.vecmath.Vector3f gradVec, int slice) throws IOException
      Description copied from interface: WritableImage
      Sets the diffusion-weighting gradient vector for one slice of this image. No exception occurs if the image format does not support recording the gradient vector.
      N.B. For disk-based images, the changes in the gradient vector will not be reflected on disk unless the close() method is called.
      Specified by:
      setSliceDWGradientVector in interface WritableImage
      Parameters:
      gradVec - the new gradient vector to be assigned to this image.
      slice - the slice number for which to set the gradient vector.
      Throws:
      IOException - if the scan gradient vector cannot be set.
    • setFrameDWGradientVector

      public void setFrameDWGradientVector(org.jogamp.vecmath.Vector3f gradVec, int frame) throws IOException
      Description copied from interface: WritableImage
      Sets the diffusion-weighting gradient vector for one "frame" of this 4-D image. No exception occurs if the image format does not support recording the gradient vector.
      N.B. For disk-based images, the changes in the gradient vector will not be reflected on disk unless the close() method is called.
      Specified by:
      setFrameDWGradientVector in interface WritableImage
      Parameters:
      gradVec - the new gradient vector to be assigned to this image.
      frame - the frame number for which to set the gradient vector.
      Throws:
      IOException - if the scan gradient vector cannot be set.
    • getSliceDWBMatrix

      public float[] getSliceDWBMatrix(int slice) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the diffusion-weighting b-matrix for one slice of this image.
      Specified by:
      getSliceDWBMatrix in interface ReadableImage
      Parameters:
      slice - the slice number for which to get the b-matrix.
      Returns:
      the diffusion-weighting b-matrix for this image if it is a magnetic resonance image, or null if the B-matrix cannot be found, or if the modality used to collect the image doesn't have a B-matrix defined. The 6 unique matrix elements are returned as a float[] with elements in the order bXX, bXY, bXZ, bYY, bYZ, bZZ.
      Throws:
      IndexOutOfBoundsException - if the slice number is bad for this image.
    • getFrameDWBMatrix

      public float[] getFrameDWBMatrix(int frame) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the diffusion-weighting b-matrix for one frame of this image.
      Specified by:
      getFrameDWBMatrix in interface ReadableImage
      Parameters:
      frame - the frame number for which to get the b-matrix.
      Returns:
      the diffusion-weighting b-matrix for this image if it is a magnetic resonance image, or null if the B-matrix cannot be found, or if the modality used to collect the image doesn't have a B-matrix defined. The 6 unique matrix elements are returned as a float[] with elements in the order bXX, bXY, bXZ, bYY, bYZ, bZZ.
      Throws:
      IndexOutOfBoundsException - if the frame number is bad for this image, or it isn't a 4-D image.
    • setSliceDWBMatrix

      public void setSliceDWBMatrix(float[] bMatrix, int slice) throws IOException
      Description copied from interface: WritableImage
      Sets the diffusion-weighting B-matrix for one slice of this image. No exception occurs if the image format does not support recording the B-matrix.
      N.B. For disk-based images, the changes in the B-matrix will not be reflected on disk unless the close() method is called.
      Specified by:
      setSliceDWBMatrix in interface WritableImage
      Parameters:
      bMatrix - the new B-matrix to be assigned to this image.
      slice - the slice number for which to set the B-matrix.
      Throws:
      IOException - if the scan B-matrix cannot be set.
    • setFrameDWBMatrix

      public void setFrameDWBMatrix(float[] bMatrix, int frame) throws IOException
      Description copied from interface: WritableImage
      Sets the diffusion-weighting B-matrix for one "frame" of this 4-D image. No exception occurs if the image format does not support recording the B-matrix.
      N.B. For disk-based images, the changes in the B-matrix will not be reflected on disk unless the close() method is called.
      Specified by:
      setFrameDWBMatrix in interface WritableImage
      Parameters:
      bMatrix - the new B-matrix to be assigned to this image.
      frame - the frame number for which to set the B-matrix.
      Throws:
      IOException - if the scan B-matrix cannot be set.
    • getSliceTriggerDelayMS

      public Float getSliceTriggerDelayMS(int slice) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the trigger delay, in milliseconds, for one slice of this image.
      Specified by:
      getSliceTriggerDelayMS in interface ReadableImage
      Parameters:
      slice - the slice number for which to get the trigger delay.
      Returns:
      the trigger delay (in milliseconds) for this image, or null if the trigger delay cannot be found.
      Throws:
      IndexOutOfBoundsException - if the slice number is bad for this image, or it isn't a 4-D image.
    • getFrameTriggerDelayMS

      public Float getFrameTriggerDelayMS(int frame) throws IndexOutOfBoundsException
      Description copied from interface: ReadableImage
      Returns the trigger delay, in milliseconds, for one frame of this image.
      Specified by:
      getFrameTriggerDelayMS in interface ReadableImage
      Parameters:
      frame - the frame number for which to get the trigger delay.
      Returns:
      the trigger delay (in milliseconds) for this image, or null if the trigger delay cannot be found.
      Throws:
      IndexOutOfBoundsException - if the frame number is bad for this image, or it isn't a 4-D image.
    • setSliceTriggerDelayMS

      public void setSliceTriggerDelayMS(float delay, int slice) throws IOException
      Description copied from interface: WritableImage
      Sets the trigger delay (in milliseconds) for one slice of this image. No exception occurs if the image format does not support recording the trigger delay.
      N.B. For disk-based images, the changes in the trigger delay will not be reflected on disk unless the close() method is called.
      Specified by:
      setSliceTriggerDelayMS in interface WritableImage
      Parameters:
      delay - the new trigger delay (in milliseconds) to be assigned to this image slice.
      slice - the slice number for which to set the trigger delay.
      Throws:
      IOException - if the trigger delay cannot be set.
    • setFrameTriggerDelayMS

      public void setFrameTriggerDelayMS(float delay, int frame) throws IOException
      Description copied from interface: WritableImage
      Sets the trigger delay (in milliseconds) for one "frame" of this 4-D image. No exception occurs if the image format does not support recording the trigger delay.
      N.B. For disk-based images, the changes in the trigger delay will not be reflected on disk unless the close() method is called.
      Specified by:
      setFrameTriggerDelayMS in interface WritableImage
      Parameters:
      delay - the new trigger delay to be assigned to this image.
      frame - the frame number for which to set the trigger delay.
      Throws:
      IOException - if the trigger delay cannot be set.
    • getPatientName

      public String getPatientName()
      Returns the patient name for this image.
      Specified by:
      getPatientName in interface ReadableImage
      Returns:
      the patient name for this image, or null if the patient name can't be found.
    • setPatientName

      public void setPatientName(String patientName) throws IOException
      Description copied from interface: WritableImage
      Attempts to set the patient name for this image. If new patient name String is longer than is allowed by the image format, then it is truncated before being applied. No exception occurs if the image format does not support patient name recording.
      N.B. For disk-based images, the changes in the patient name will not be reflected on disk unless the close() method is called.
      Specified by:
      setPatientName in interface WritableImage
      Parameters:
      patientName - the new patient name to be assigned to this image.
      Throws:
      IOException - if the patient name cannot be set.
    • getPatientID

      public String getPatientID()
      Returns the patient ID for this image.
      Specified by:
      getPatientID in interface ReadableImage
      Returns:
      the patientID for this image, or null if the patientID can't be found.
    • setPatientID

      public void setPatientID(String patientID) throws IOException
      Description copied from interface: WritableImage
      Sets the patient ID for this image. If the new patient ID String is longer than is allowed by the image format, then it is truncated before being applied. No exception occurs if the image format does not support patient ID recording.
      N.B. For disk-based images, the changes in the patient ID will not be reflected on disk unless the close() method is called.
      Specified by:
      setPatientID in interface WritableImage
      Parameters:
      patientID - the new patient ID to be assigned to this image.
      Throws:
      IOException - if the patient ID cannot be set.
    • getPatientDoB

      public Date getPatientDoB()
      Description copied from interface: ReadableImage
      Returns the patient date of birth for this image.
      Specified by:
      getPatientDoB in interface ReadableImage
      Returns:
      the patient's date of birth for this image, or null if the patient's dob can't be found.
    • setPatientDoB

      public void setPatientDoB(Date patientDoB) throws IOException
      Description copied from interface: WritableImage
      Sets the patient's date of birth for this image. No exception occurs if the image format does not support patient date of birth recording.
      N.B. For disk-based images, the changes in the patient's birth date will not be reflected on disk unless the close() method is called.
      Specified by:
      setPatientDoB in interface WritableImage
      Parameters:
      patientDoB - the new patient date of birth to be assigned to this image.
      Throws:
      IOException - if the patient date of birth cannot be set.
    • getPatientSex

      public com.xinapse.dicom.Sex getPatientSex()
      Description copied from interface: ReadableImage
      Returns the patient sex for this image.
      Specified by:
      getPatientSex in interface ReadableImage
      Returns:
      the patient's sex image, or Sex.OTHER if the patient's sex can't be found.
    • setPatientSex

      public void setPatientSex(com.xinapse.dicom.Sex sex) throws IOException
      Description copied from interface: WritableImage
      Sets the patient sex for this image.
      Specified by:
      setPatientSex in interface WritableImage
      Parameters:
      sex - the patient sex to be assigned to this image.
      Throws:
      IOException - if the patient sex cannot be set.
    • getStudyID

      public String getStudyID()
      Description copied from interface: ReadableImage
      Returns the study ID for this ReadableImage.
      Specified by:
      getStudyID in interface ReadableImage
      Returns:
      the study ID. Returns null if the study ID can't be found.
    • setStudyID

      public void setStudyID(String studyID) throws IOException
      Description copied from interface: WritableImage
      Sets the study ID for this image.
      N.B. For disk-based images, the changes in the study ID will not be reflected on disk unless the close() method is called.
      Specified by:
      setStudyID in interface WritableImage
      Parameters:
      studyID - the new study ID to be assigned to this image.
      Throws:
      IOException - if the study ID cannot be set.
    • getScanDate

      public Date getScanDate()
      Returns the scan date for this image.
      Specified by:
      getScanDate in interface ReadableImage
      Returns:
      the date/time at which this scan was performed, or null if the scan date can't be found.
    • getPulseSequence

      public String getPulseSequence()
      Description copied from interface: ReadableImage
      Returns the name of the pulse sequence with which this image was collected.
      Specified by:
      getPulseSequence in interface ReadableImage
      Returns:
      the name of the pulse sequence used to collect this image.
    • getScanningSequence

      public PulseSequenceType getScanningSequence()
      Description copied from interface: ReadableImage
      Returns the DICOM Scanning Sequence with which this image was collected.
      Specified by:
      getScanningSequence in interface ReadableImage
      Returns:
      the DICOM Scanning Sequence used to collect this image, or null if the scanning sequence isn't available.
    • getSequenceVariant

      public PulseSequenceVariant getSequenceVariant()
      Description copied from interface: ReadableImage
      Returns the DICOM Scanning Sequence Variant with which this image was collected.
      Specified by:
      getSequenceVariant in interface ReadableImage
      Returns:
      the DICOM Scanning Sequence Variant used to collect this image, or null if the sequence variant isn't available.
    • getSeriesNumber

      public Integer getSeriesNumber()
      Description copied from interface: ReadableImage
      Returns the series number for this ReadableImage.
      Specified by:
      getSeriesNumber in interface ReadableImage
      Returns:
      the series number. Returns null if the series number can't be found.
    • getSeriesDescription

      public String getSeriesDescription()
      Description copied from interface: ReadableImage
      Returns a short description of the series (scan), such as is provided by the DICOM series description.
      Specified by:
      getSeriesDescription in interface ReadableImage
      Returns:
      a short description of the series, or null if none is available.
    • anonymise

      public void anonymise(String patientName, String patientID, Date birthDate, boolean patSex, String patAddr, String patInsurancePlanID, String accessionNumber, boolean patOther, String physicianName, String physicianAddr, String institutionName, String institutionAddr, String deptName, String stationName, String telNumber, boolean removePrivateElements) throws IOException
      Description copied from interface: WritableImage
      Anonymise this WritableImage.
      Specified by:
      anonymise in interface WritableImage
      Overrides:
      anonymise in class ANZImage
      Parameters:
      patientName - if non-null, the patient name to substitute.
      patientID - if non-null, the patient ID to substitute.
      birthDate - if non-null, the birth date to substitute.
      patSex - if true, set the sex to "OTHER".
      patAddr - if non-null, the address to substitute.
      patInsurancePlanID - if non-null, the insurance plan ID to substitute.
      accessionNumber - if non-null, the accession number to substitute.
      patOther - if true, other patient-related items will be anonymised.
      physicianName - if non-null, the physician name to substitute.
      physicianAddr - if non-null, the physician's address to substitute.
      institutionName - if non-null, the institution name to substitute.
      institutionAddr - if non-null, the institution address to substitute.
      deptName - if non-null, the department name to substitute.
      stationName - if non-null, the station name to substitute.
      telNumber - if non-null, the telephone number to substitute for all telephone numbers.
      removePrivateElements - if true, all private DICOM elements will be removed.
      Throws:
      IOException - if an I/O error occurs during anonymisation.
    • appendAuditInfo

      public void appendAuditInfo(String name, String value) throws IOException
      Appends audit trail information to this image.
      Specified by:
      appendAuditInfo in interface WritableImage
      Parameters:
      name - a String describing the name of the action that was performed on this image.
      value - a String describing the value of the action that was performed on this image.
      Throws:
      IOException - if an I/O error occurs.
    • putInfo

      public void putInfo(String name, int value) throws IOException
      Description copied from interface: InfoStorer
      Adds an item to the general file info.
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.
      Specified by:
      putInfo in interface InfoStorer
      Parameters:
      name - the name of the information field to put.
      value - an integer value to be associated with this name in the general file information.
      Throws:
      IOException - if the information cannot be added because of an I/O error.
    • putInfo

      public void putInfo(String name, float value) throws IOException
      Description copied from interface: InfoStorer
      Adds an item to the general file info. If an info item with the same name exists, then then value will be overwritten.
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.
      Specified by:
      putInfo in interface InfoStorer
      Parameters:
      name - the name of the information to put.
      value - a floating point value to be associated with this name in the general file information.
      Throws:
      IOException - if the information cannot be addded because of an I/O error.
    • putInfo

      public void putInfo(String name, String value) throws IOException
      Description copied from interface: InfoStorer
      Adds an item to the general file info. If an info item with the same name exists, then then value will be overwritten.
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.
      Specified by:
      putInfo in interface InfoStorer
      Parameters:
      name - the name of the information to put.
      value - a String to be associated with this name in the general file information.
      Throws:
      IOException - if the information cannot be addded because of an I/O error.
    • putInfo

      public void putInfo(String name, int value, int dim, int n) throws IOException
      Description copied from interface: InfoStorer
      Adds an item to the dimension-specific information. If an info item with the same name exists, then then value will be overwritten.
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.
      Specified by:
      putInfo in interface InfoStorer
      Parameters:
      name - the name of the information item to put.
      value - an integer value to be associated with this name in the general file information.
      dim - the dimension of this image to put the information item. For example in a 3-dimensional image you would put to dimension 0 for slice-specific info.
      n - the element to put to. For example in a 3-dimensional image you would put to slice n to info that applied only to slice n.
      Throws:
      IOException - if the information cannot be addded because of an I/O error.
    • putInfo

      public void putInfo(String name, float value, int dim, int n) throws IOException
      Description copied from interface: InfoStorer
      Adds an item to the dimension-specific information. If an info item with the same name exists, then then value will be overwritten.
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the close() method is called.
      Specified by:
      putInfo in interface InfoStorer
      Parameters:
      name - the name of the information item to put.
      value - an floating-point value to be associated with this name in the dimension-specific information.
      dim - the dimension of this image to put the information. For example in a 3-dimensional image you would put to dimension 0 for slice-specific info.
      n - the element to put to. For example in a 3-dimensional image you would put to slice n to info that applied only to slice n.
      Throws:
      IOException - if the information cannot be addded because of an I/O error.
    • putInfo

      public void putInfo(String name, String value, int dim, int n) throws IOException
      Description copied from interface: InfoStorer
      Adds an item to the dimension-specific information. If an info item with the same name exists, then then value will be overwritten.
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the close() method is called.
      Specified by:
      putInfo in interface InfoStorer
      Parameters:
      name - the name of the information item to put.
      value - a String value to be associated with this name in the dimension-specific information.
      dim - the dimension of this image to put the information. For example in a 3-dimensional image you would put to dimension 0 for slice-specific info.
      n - the element to put to. For example in a 3-dimensional image you would put to slice n to info that applied only to slice n.
      Throws:
      IOException - if the information cannot be addded because of an I/O error.
    • putSliceInfo

      public void putSliceInfo(InfoList infoList, int slice) throws IOException
      Description copied from interface: InfoStorer
      Adds all the items in an InfoList to the slice-specific information. If an info item with the same name exists, then then value will be overwritten.

      The slice number is referenced from 0 to (number of slices - 1).
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.

      Specified by:
      putSliceInfo in interface InfoStorer
      Parameters:
      infoList - the list of InfoItems to put.
      slice - the slice number.
      Throws:
      IOException - if the information cannot be added because of an I/O error.
    • putFrameInfo

      public void putFrameInfo(InfoList infoList, int frame) throws IOException
      Description copied from interface: InfoStorer
      Adds all the items in an InfoList to the frame-specific information. If an info item with the same name exists, then the value will be overwritten.

      The frame number is referenced from 0 to (number of frames - 1).
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.

      Specified by:
      putFrameInfo in interface InfoStorer
      Parameters:
      infoList - the list of InfoItems to put.
      frame - the frame number.
      Throws:
      IOException - if the information cannot be added because of an I/O error.
    • putSliceInfo

      public void putSliceInfo(String name, String value, int slice) throws IOException
      Description copied from interface: InfoStorer
      Adds an item to the slice-specific information. If an info item with the same name exists, then then value will be overwritten.

      The slice number is referenced from 0 to (number of slices - 1).
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.

      Specified by:
      putSliceInfo in interface InfoStorer
      Parameters:
      name - the name of the information item to put.
      value - a String to be associated with this name in the slice-specific info.
      slice - the slice number.
      Throws:
      IOException - if the information cannot be added because of an I/O error.
    • putFrameInfo

      public void putFrameInfo(String name, String value, int frame) throws IOException
      Description copied from interface: InfoStorer
      Adds an item to the frame-specific information. If an info item with the same name exists, then then value will be overwritten.

      The frame number is referenced from 0 to (number of frames).
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.

      Specified by:
      putFrameInfo in interface InfoStorer
      Parameters:
      name - the name of the information item to put.
      value - a String to be associated with this name in the frame-specific info.
      frame - the frame number.
      Throws:
      IOException - if the information cannot be added because of an I/O error.
    • getInfo

      public String getInfo(String name) throws InfoNotFoundException
      Description copied from interface: InfoStorer
      Returns a string representing the value of this information item in the general image information.

      For example, if there is a item with a name "pixel_x_size" and a value "0.91162" in the general info, and name "pixel_x_size" is supplied, then this method will return "0.91162".

      Specified by:
      getInfo in interface InfoStorer
      Parameters:
      name - the name of this information field.
      Returns:
      a String representation of the value of this information field.
      Throws:
      InfoNotFoundException - if the name is not found in the general info.
    • getInfo

      public String getInfo(String name, int dim, int n) throws InfoNotFoundException
      Description copied from interface: InfoStorer
      Returns a String representing the value of this information item in a particular dimension of this image. For example, if there is a item "pixel_x_size=0.91162" in the file info for this dimension, and a name "pixel_x_size" is supplied, then this method will return "0.91162".
      Specified by:
      getInfo in interface InfoStorer
      Parameters:
      name - the name of this information item.
      dim - the dimension of this image to look for the information. For example in a 3-dimensional image you would look in dimension 0 for slice-specific info.
      n - the element to look in. For example in a 3-dimensional image you would look in slice n to info that applied only to slice n.
      Returns:
      a String representation of the value of this information.
      Throws:
      InfoNotFoundException - if the name is not found in this dimension/element info.
    • getSliceInfo

      public String getSliceInfo(String name, int slice) throws InfoNotFoundException
      Description copied from interface: InfoStorer
      Returns a String representing the value of this information item in a particular slice of this image.

      The slice number is referenced from 0 to (number of slices - 1).

      Specified by:
      getSliceInfo in interface InfoStorer
      Parameters:
      name - the name of this information item.
      slice - the slice number.
      Returns:
      a String representation of the value of this information.
      Throws:
      InfoNotFoundException - if the name is not found for the specified slice.
    • getFrameInfo

      public String getFrameInfo(String name, int frame) throws InfoNotFoundException
      Description copied from interface: InfoStorer
      Returns a String representing the value of this information item in a particular frame of this image.

      The frame number is referenced from 0 to (number of frames - 1).

      Specified by:
      getFrameInfo in interface InfoStorer
      Parameters:
      name - the name of this information item.
      frame - the frame number.
      Returns:
      a String representation of the value of this information.
      Throws:
      InfoNotFoundException - if the name is not found for the specified frame.
    • removeInfo

      public void removeInfo(String name)
      Description copied from interface: InfoStorer
      Removes an item from the general file information. If an info item with the given name is not present in the general info, then this method does nothing.
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.
      Specified by:
      removeInfo in interface InfoStorer
      Parameters:
      name - the name of the information item to be removed.
    • removeInfo

      public void removeInfo(String name, int dim, int n)
      Description copied from interface: InfoStorer
      Removes an item from the dimension-specific information. If an info item with the given name is not present in the dimension-specific, then this method does nothing.
      N.B. For disk-based images, the changes in the info will not be reflected on disk unless the ReadableImage.close() method is called.
      Specified by:
      removeInfo in interface InfoStorer
      Parameters:
      name - the name of the information item to put.
      dim - the dimension of this image to from which to remove the information. For example in a 3-dimensional image you would put to dimension 0 for slice-specific info.
      n - the element to from which to remove the info item. For example in a 3-dimensional image you would put to slice n to info that applied only to slice n.
    • getInfoList

      public InfoList getInfoList()
      Description copied from interface: InfoStorer
      Returns an InfoList object which is the general info for this image.
      Specified by:
      getInfoList in interface InfoStorer
      Returns:
      an InfoList which is the general file info for this InfoStorer.
    • setInfoList

      public void setInfoList(InfoList infoList) throws IOException
      Description copied from interface: InfoStorer
      Sets a new InfoList to the general file info of this image.
      Specified by:
      setInfoList in interface InfoStorer
      Parameters:
      infoList - the InfoList object to set to the general file info for this image.
      Throws:
      IOException - if the InfoList cannot be set.
    • getInfoList

      public InfoList getInfoList(int dim, int n)
      Description copied from interface: InfoStorer
      Returns an InfoList object applying to a particular dimension/element for this image.
      Specified by:
      getInfoList in interface InfoStorer
      Parameters:
      dim - the dimension for which to get the information list.
      n - the element for which to get the information list.
      Returns:
      an InfoList object from a particular dimension of this InfoStorer.
    • getSliceInfoList

      public InfoList getSliceInfoList(int slice)
      Description copied from interface: InfoStorer
      Returns an InfoList object applying to a particular slice of this image.

      The slice number is referenced from 0 to (number of slices - 1).

      Specified by:
      getSliceInfoList in interface InfoStorer
      Parameters:
      slice - the slice number.
      Returns:
      an InfoList object from a particular slice of this InfoStorer.
    • getFrameInfoList

      public InfoList getFrameInfoList(int frame)
      Description copied from interface: InfoStorer
      Returns an InfoList object applying to a particular frame of this image.

      The frame number is referenced from 0 to (number of frames - 1).

      Specified by:
      getFrameInfoList in interface InfoStorer
      Parameters:
      frame - the frame number.
      Returns:
      an InfoList object from a particular frame of this InfoStorer.
    • setInfoList

      public void setInfoList(InfoList infoList, int dim, int n) throws IOException
      Description copied from interface: InfoStorer
      Sets a new InfoList a specific dimension of this image.
      Specified by:
      setInfoList in interface InfoStorer
      Parameters:
      infoList - the InfoList to associate with this image/dimension.
      dim - the dimension to which to set the information list.
      n - the element to which to set the information list.
      Throws:
      IOException - if the InfoList cannot be set.
    • setSliceInfoList

      public void setSliceInfoList(InfoList infoList, int slice) throws IOException
      Description copied from interface: InfoStorer
      Sets a new InfoList a specific slice of this image.
      Specified by:
      setSliceInfoList in interface InfoStorer
      Parameters:
      infoList - the InfoList to associate with this image/slice.
      slice - the slice for which to set the information list.
      Throws:
      IOException - if the InfoList cannot be set.
    • setFrameInfoList

      public void setFrameInfoList(InfoList infoList, int frame) throws IOException
      Description copied from interface: InfoStorer
      Sets a new InfoList a specific frame of this image.
      Specified by:
      setFrameInfoList in interface InfoStorer
      Parameters:
      infoList - the InfoList to associate with this image/frame.
      frame - the frame for which to set the information list.
      Throws:
      IOException - if the InfoList cannot be set.
    • appendInfoList

      public void appendInfoList(InfoList infoList) throws IOException
      Description copied from interface: InfoStorer
      Appends an InfoList to the existing general file info of this image.
      Specified by:
      appendInfoList in interface InfoStorer
      Parameters:
      infoList - the InfoList object to append to the general file info for this image.
      Throws:
      IOException - if the InfoList cannot be appended because of an I/O error.
    • appendInfoList

      public void appendInfoList(InfoList infoList, int dim, int n) throws InvalidImageException
      Appends an InfoList to that for a particular dimension of this image.
      Specified by:
      appendInfoList in interface InfoStorer
      Parameters:
      infoList - ths list to append.
      dim - the diemension for which the InfoList will be appended.
      n - the element of that dimension for which the InfoList will be appended.
      Throws:
      InvalidImageException - if the InfoList cannot be appended.
    • addExtendedData

      public void addExtendedData(com.xinapse.multisliceimage.Analyze.ExtendedData extendedData) throws ANZException
      Adds a block of ExtendedData to this NIFTIImage.
      Parameters:
      extendedData - the ExtendedData to add.
      Throws:
      ANZException - if the ExtendedData cannot be added.
    • getExtendedData

      public List<com.xinapse.multisliceimage.Analyze.ExtendedData> getExtendedData()
      Returns a List of ExtendedData for this NIFTIImage.
      Returns:
      a List of ExtendedData, or null if there is no ExtendedData.
    • removeExtendedData

      public void removeExtendedData(com.xinapse.multisliceimage.Analyze.ExtendedData extendedData) throws ANZException
      Removes a block of ExtendedData from this NIFTIImage. This method does nothing if the supplied ExtendedData is not present.
      Parameters:
      extendedData - the ExtendedData to remove.
      Throws:
      ANZException - if the extended data cannot be removed.
    • stripExtension

      public static String stripExtension(String fileName)
      Strips any ".img", ".img.gz", ".hdr", ".hdr.gz", ".nii", or ".nii.gz" extension (in upper or lowe case) from a file name.
      Parameters:
      fileName - the file name that may or may not have an extension.
      Returns:
      the stripped file name.
    • getHTMLDescription

      public String getHTMLDescription(int slice)
      Description copied from interface: ReadableImage
      Returns a String description of a slice of this image in HTML format.
      Specified by:
      getHTMLDescription in interface ReadableImage
      Overrides:
      getHTMLDescription in class ANZImage
      Parameters:
      slice - the slice number.
      Returns:
      a String describing this image slice.
    • main

      public static void main(String[] args)
      Run the self-test for the NIFTIImage class.
      Parameters:
      args - a list of images to try to open.